1 | /******/ (function(modules) { // webpackBootstrap
|
2 | /******/ // The module cache
|
3 | /******/ var installedModules = {};
|
4 |
|
5 | /******/ // The require function
|
6 | /******/ function __webpack_require__(moduleId) {
|
7 |
|
8 | /******/ // Check if module is in cache
|
9 | /******/ if(installedModules[moduleId])
|
10 | /******/ return installedModules[moduleId].exports;
|
11 |
|
12 | /******/ // Create a new module (and put it into the cache)
|
13 | /******/ var module = installedModules[moduleId] = {
|
14 | /******/ exports: {},
|
15 | /******/ id: moduleId,
|
16 | /******/ loaded: false
|
17 | /******/ };
|
18 |
|
19 | /******/ // Execute the module function
|
20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
21 |
|
22 | /******/ // Flag the module as loaded
|
23 | /******/ module.loaded = true;
|
24 |
|
25 | /******/ // Return the exports of the module
|
26 | /******/ return module.exports;
|
27 | /******/ }
|
28 |
|
29 |
|
30 | /******/ // expose the modules object (__webpack_modules__)
|
31 | /******/ __webpack_require__.m = modules;
|
32 |
|
33 | /******/ // expose the module cache
|
34 | /******/ __webpack_require__.c = installedModules;
|
35 |
|
36 | /******/ // __webpack_public_path__
|
37 | /******/ __webpack_require__.p = "";
|
38 |
|
39 | /******/ // Load entry module and return exports
|
40 | /******/ return __webpack_require__(0);
|
41 | /******/ })
|
42 | /************************************************************************/
|
43 | /******/ ([
|
44 | /* 0 */
|
45 | /***/ function(module, exports, __webpack_require__) {
|
46 |
|
47 | ;
|
48 |
|
49 | var _beeLayout = __webpack_require__(1);
|
50 |
|
51 | var _beePanel = __webpack_require__(7);
|
52 |
|
53 | var _beeButton = __webpack_require__(60);
|
54 |
|
55 | var _beeButton2 = _interopRequireDefault(_beeButton);
|
56 |
|
57 | var _react = __webpack_require__(4);
|
58 |
|
59 | var _react2 = _interopRequireDefault(_react);
|
60 |
|
61 | var _reactDom = __webpack_require__(11);
|
62 |
|
63 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
64 |
|
65 | var _beeFormGroup = __webpack_require__(62);
|
66 |
|
67 | var _beeFormGroup2 = _interopRequireDefault(_beeFormGroup);
|
68 |
|
69 | var _beeFormControl = __webpack_require__(64);
|
70 |
|
71 | var _beeFormControl2 = _interopRequireDefault(_beeFormControl);
|
72 |
|
73 | var _src = __webpack_require__(66);
|
74 |
|
75 | var _src2 = _interopRequireDefault(_src);
|
76 |
|
77 | var _beeDropdown = __webpack_require__(72);
|
78 |
|
79 | var _beeDropdown2 = _interopRequireDefault(_beeDropdown);
|
80 |
|
81 | var _beeMenu = __webpack_require__(87);
|
82 |
|
83 | var _beeMenu2 = _interopRequireDefault(_beeMenu);
|
84 |
|
85 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
86 |
|
87 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
88 |
|
89 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
90 |
|
91 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
92 |
|
93 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
94 |
|
95 | var CARET = _react2['default'].createElement('i', { className: 'uf uf-chevronarrowdown' });
|
96 |
|
97 | var CARETUP = _react2['default'].createElement('i', { className: 'uf uf-chevronarrowup' });
|
98 |
|
99 | /**
|
100 | * @title InputGroup 两边是可选Addon
|
101 | * @description
|
102 | */
|
103 |
|
104 | var Demo1 = function (_Component) {
|
105 | _inherits(Demo1, _Component);
|
106 |
|
107 | function Demo1() {
|
108 | _classCallCheck(this, Demo1);
|
109 |
|
110 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
111 | }
|
112 |
|
113 | Demo1.prototype.render = function render() {
|
114 | return _react2['default'].createElement(
|
115 | 'div',
|
116 | { className: 'demo-input-group' },
|
117 | _react2['default'].createElement(
|
118 | _beeFormGroup2['default'],
|
119 | null,
|
120 | _react2['default'].createElement(
|
121 | _src2['default'],
|
122 | null,
|
123 | _react2['default'].createElement(
|
124 | _src2['default'].Addon,
|
125 | null,
|
126 | '.00'
|
127 | ),
|
128 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' }),
|
129 | _react2['default'].createElement(
|
130 | _src2['default'].Addon,
|
131 | null,
|
132 | '.00'
|
133 | )
|
134 | ),
|
135 | _react2['default'].createElement(
|
136 | _src2['default'],
|
137 | null,
|
138 | _react2['default'].createElement(
|
139 | _src2['default'].Addon,
|
140 | null,
|
141 | '.00'
|
142 | ),
|
143 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' })
|
144 | ),
|
145 | _react2['default'].createElement(
|
146 | _src2['default'],
|
147 | null,
|
148 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' }),
|
149 | _react2['default'].createElement(
|
150 | _src2['default'].Addon,
|
151 | null,
|
152 | '.00'
|
153 | )
|
154 | )
|
155 | )
|
156 | );
|
157 | };
|
158 |
|
159 | return Demo1;
|
160 | }(_react.Component); /**
|
161 | * @title InputGroup 两边是可选Button
|
162 | * @description
|
163 | */
|
164 |
|
165 | function onSelect(_ref) {
|
166 | var key = _ref.key;
|
167 |
|
168 | console.log(key + ' selected');
|
169 | }
|
170 |
|
171 | function onVisibleChange(visible) {
|
172 | console.log(visible);
|
173 | }
|
174 |
|
175 | var menu1 = _react2['default'].createElement(
|
176 | _beeMenu2['default'],
|
177 | {
|
178 | multiple: true,
|
179 | onSelect: onSelect },
|
180 | _react2['default'].createElement(
|
181 | _beeMenu.Item,
|
182 | { key: '1' },
|
183 | '\u501F\u6B3E\u5408\u540C'
|
184 | ),
|
185 | _react2['default'].createElement(
|
186 | _beeMenu.Item,
|
187 | { key: '2' },
|
188 | '\u62B5/\u8D28\u62BC\u5408\u540C'
|
189 | ),
|
190 | _react2['default'].createElement(
|
191 | _beeMenu.Item,
|
192 | { key: '3' },
|
193 | '\u62C5\u4FDD\u5408\u540C'
|
194 | ),
|
195 | _react2['default'].createElement(
|
196 | _beeMenu.Item,
|
197 | { key: '4' },
|
198 | '\u8054\u4FDD\u5408\u540C'
|
199 | ),
|
200 | _react2['default'].createElement(_beeMenu.Divider, null),
|
201 | _react2['default'].createElement(
|
202 | _beeMenu.Item,
|
203 | { key: '5' },
|
204 | '\u5408\u540C\u5BA1\u6279'
|
205 | ),
|
206 | _react2['default'].createElement(
|
207 | _beeMenu.Item,
|
208 | { key: '6' },
|
209 | '\u62B5/\u8D28\u62BC\u5408\u540C\u8DDF\u8E2A'
|
210 | )
|
211 | );
|
212 |
|
213 | var Demo2 = function (_Component2) {
|
214 | _inherits(Demo2, _Component2);
|
215 |
|
216 | function Demo2() {
|
217 | _classCallCheck(this, Demo2);
|
218 |
|
219 | return _possibleConstructorReturn(this, _Component2.apply(this, arguments));
|
220 | }
|
221 |
|
222 | Demo2.prototype.render = function render() {
|
223 | return _react2['default'].createElement(
|
224 | 'div',
|
225 | { className: 'demo-input-group' },
|
226 | _react2['default'].createElement(
|
227 | _beeFormGroup2['default'],
|
228 | null,
|
229 | _react2['default'].createElement(
|
230 | _src2['default'],
|
231 | null,
|
232 | _react2['default'].createElement(
|
233 | _src2['default'].Button,
|
234 | null,
|
235 | _react2['default'].createElement(
|
236 | _beeButton2['default'],
|
237 | null,
|
238 | 'test'
|
239 | )
|
240 | ),
|
241 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' })
|
242 | ),
|
243 | _react2['default'].createElement(
|
244 | _src2['default'],
|
245 | null,
|
246 | _react2['default'].createElement(
|
247 | _src2['default'].Button,
|
248 | { shape: 'border' },
|
249 | _react2['default'].createElement(
|
250 | _beeDropdown2['default'],
|
251 | {
|
252 | trigger: ['click'],
|
253 | overlay: menu1,
|
254 | animation: 'slide-up',
|
255 | onVisibleChange: onVisibleChange
|
256 | },
|
257 | _react2['default'].createElement(
|
258 | _beeButton2['default'],
|
259 | { shape: 'border' },
|
260 | '\u5E26\u6709\u5206\u5272\u7EBF\u7684\u4E0B\u62C9 ',
|
261 | _react2['default'].createElement(
|
262 | 'span',
|
263 | { className: 'uf uf-arrow-down' },
|
264 | ' '
|
265 | )
|
266 | )
|
267 | )
|
268 | ),
|
269 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' }),
|
270 | _react2['default'].createElement(
|
271 | _src2['default'].Button,
|
272 | null,
|
273 | _react2['default'].createElement(
|
274 | _beeButton2['default'],
|
275 | null,
|
276 | _react2['default'].createElement(
|
277 | 'span',
|
278 | { className: 'uf uf-search' },
|
279 | ' '
|
280 | )
|
281 | )
|
282 | )
|
283 | ),
|
284 | _react2['default'].createElement(
|
285 | _src2['default'],
|
286 | { simple: true },
|
287 | _react2['default'].createElement(_beeFormControl2['default'], { style: { width: 300 }, type: 'text' }),
|
288 | _react2['default'].createElement(
|
289 | _src2['default'].Button,
|
290 | { shape: 'border' },
|
291 | _react2['default'].createElement(
|
292 | 'span',
|
293 | { className: 'uf uf-search' },
|
294 | ' '
|
295 | )
|
296 | )
|
297 | ),
|
298 | _react2['default'].createElement(
|
299 | _src2['default'],
|
300 | null,
|
301 | _react2['default'].createElement(
|
302 | _src2['default'].Button,
|
303 | null,
|
304 | _react2['default'].createElement(
|
305 | _beeButton2['default'],
|
306 | null,
|
307 | 'test'
|
308 | )
|
309 | ),
|
310 | _react2['default'].createElement(_beeFormControl2['default'], { type: 'text' }),
|
311 | _react2['default'].createElement(
|
312 | _src2['default'].Button,
|
313 | null,
|
314 | _react2['default'].createElement(
|
315 | _beeButton2['default'],
|
316 | null,
|
317 | 'test'
|
318 | )
|
319 | )
|
320 | )
|
321 | )
|
322 | );
|
323 | };
|
324 |
|
325 | return Demo2;
|
326 | }(_react.Component);
|
327 |
|
328 | var DemoArray = [{ "example": _react2['default'].createElement(Demo1, null), "title": " InputGroup 两边是可选Add", "code": "/**\n * @title InputGroup 两边是可选Addon\n * @description \n */\nclass Demo1 extends Component {\n\trender () {\n\t\treturn (\n\t\t\t<div className=\"demo-input-group\">\n\t \t<FormGroup>\n\t \t\t<InputGroup>\n\t\t\t\t \t\t<InputGroup.Addon>.00</InputGroup.Addon>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t <InputGroup.Addon>.00</InputGroup.Addon>\n\t\t\t\t </InputGroup>\n\n\t\t\t\t <InputGroup>\n\t\t\t\t \t\t<InputGroup.Addon>.00</InputGroup.Addon>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t </InputGroup>\n\n\t\t\t\t <InputGroup>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t <InputGroup.Addon>.00</InputGroup.Addon>\n\t\t\t\t </InputGroup>\n\t \t</FormGroup>\t\t\n\t </div>\n\t\t)\n\t}\n}", "desc": " " }, { "example": _react2['default'].createElement(Demo2, null), "title": " InputGroup 两边是可选But", "code": "/**\n * @title InputGroup 两边是可选Button\n * @description \n */\n\nfunction onSelect({ key }) {\n\tconsole.log(`${key} selected`);\n\n}\n\nfunction onVisibleChange(visible) {\n\tconsole.log(visible);\n}\n\nconst menu1 = (\n <Menu\n multiple\n onSelect={onSelect}>\n <MenuItem key=\"1\">借款合同</MenuItem>\n <MenuItem key=\"2\">抵/质押合同</MenuItem>\n <MenuItem key=\"3\">担保合同</MenuItem>\n <MenuItem key=\"4\">联保合同</MenuItem>\n <Divider />\n <MenuItem key=\"5\">合同审批</MenuItem>\n <MenuItem key=\"6\">抵/质押合同跟踪</MenuItem>\n </Menu>\n);\nclass Demo2 extends Component {\n\trender(){\n\t\treturn (\n\t\t\t<div className=\"demo-input-group\">\n\t \t<FormGroup>\n\t\t\t\t <InputGroup>\n\t\t\t\t \t\t<InputGroup.Button>\n\t\t\t\t \t\t\t<Button>test</Button>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t </InputGroup>\n\n\t\t\t\t <InputGroup>\n\t\t\t\t \t<InputGroup.Button shape=\"border\">\n\t\t\t\t \t\t\t<Dropdown\n\t\t\t trigger={['click']}\n\t\t\t overlay={menu1}\n\t\t\t animation=\"slide-up\"\n\t\t\t onVisibleChange={onVisibleChange}\n\t\t\t >\n\t\t\t <Button shape=\"border\">带有分割线的下拉 <span className=\"uf uf-arrow-down\"> </span></Button>\n\t\t\t </Dropdown>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t <InputGroup.Button>\n\t\t\t\t \t\t\t<Button><span className=\"uf uf-search\"> </span></Button>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t </InputGroup>\n\n\t\t\t\t <InputGroup simple>\n\t\t\t\t <FormControl style={{width:300}} type=\"text\" />\n\t\t\t\t <InputGroup.Button shape=\"border\">\n\t\t\t\t \t\t\t<span className=\"uf uf-search\"> </span>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t </InputGroup>\n\n\t\t\t\t <InputGroup>\n\t\t\t\t \t<InputGroup.Button>\n\t\t\t\t \t\t\t<Button>test</Button>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t <FormControl type=\"text\" />\n\t\t\t\t <InputGroup.Button>\n\t\t\t\t \t\t\t<Button>test</Button>\n\t\t\t\t \t\t</InputGroup.Button>\n\t\t\t\t </InputGroup>\n\t \t</FormGroup>\t\t\n\t </div>\n\t\t)\n\t}\n}", "desc": " " }];
|
329 |
|
330 | var Demo = function (_Component3) {
|
331 | _inherits(Demo, _Component3);
|
332 |
|
333 | function Demo(props) {
|
334 | _classCallCheck(this, Demo);
|
335 |
|
336 | var _this3 = _possibleConstructorReturn(this, _Component3.call(this, props));
|
337 |
|
338 | _this3.state = {
|
339 | open: false
|
340 | };
|
341 | _this3.handleClick = _this3.handleClick.bind(_this3);
|
342 | return _this3;
|
343 | }
|
344 |
|
345 | Demo.prototype.handleClick = function handleClick() {
|
346 | this.setState({ open: !this.state.open });
|
347 | };
|
348 |
|
349 | Demo.prototype.render = function render() {
|
350 | var _props = this.props,
|
351 | title = _props.title,
|
352 | example = _props.example,
|
353 | code = _props.code,
|
354 | desc = _props.desc;
|
355 |
|
356 | var caret = this.state.open ? CARETUP : CARET;
|
357 | var text = this.state.open ? "隐藏代码" : "查看代码";
|
358 |
|
359 | var footer = _react2['default'].createElement(
|
360 | _beeButton2['default'],
|
361 | { shape: 'block', onClick: this.handleClick },
|
362 | caret,
|
363 | text
|
364 | );
|
365 | return _react2['default'].createElement(
|
366 | _beeLayout.Col,
|
367 | { md: 12 },
|
368 | _react2['default'].createElement(
|
369 | 'h3',
|
370 | null,
|
371 | title
|
372 | ),
|
373 | _react2['default'].createElement(
|
374 | 'p',
|
375 | null,
|
376 | desc
|
377 | ),
|
378 | _react2['default'].createElement(
|
379 | _beePanel.Panel,
|
380 | { collapsible: true, expanded: this.state.open, colors: 'bordered', header: example, footer: footer, footerStyle: { padding: 0, borderColor: "transparent" } },
|
381 | _react2['default'].createElement(
|
382 | 'pre',
|
383 | null,
|
384 | _react2['default'].createElement(
|
385 | 'code',
|
386 | { className: 'hljs javascript' },
|
387 | code
|
388 | )
|
389 | )
|
390 | )
|
391 | );
|
392 | };
|
393 |
|
394 | return Demo;
|
395 | }(_react.Component);
|
396 |
|
397 | var DemoGroup = function (_Component4) {
|
398 | _inherits(DemoGroup, _Component4);
|
399 |
|
400 | function DemoGroup(props) {
|
401 | _classCallCheck(this, DemoGroup);
|
402 |
|
403 | return _possibleConstructorReturn(this, _Component4.call(this, props));
|
404 | }
|
405 |
|
406 | DemoGroup.prototype.render = function render() {
|
407 | return _react2['default'].createElement(
|
408 | _beeLayout.Row,
|
409 | null,
|
410 | DemoArray.map(function (child, index) {
|
411 |
|
412 | return _react2['default'].createElement(Demo, { example: child.example, title: child.title, code: child.code, desc: child.desc, key: index });
|
413 | })
|
414 | );
|
415 | };
|
416 |
|
417 | return DemoGroup;
|
418 | }(_react.Component);
|
419 |
|
420 | _reactDom2['default'].render(_react2['default'].createElement(DemoGroup, null), document.getElementById('tinperBeeDemo'));
|
421 |
|
422 | /***/ },
|
423 | /* 1 */
|
424 | /***/ function(module, exports, __webpack_require__) {
|
425 |
|
426 | ;
|
427 |
|
428 | Object.defineProperty(exports, "__esModule", {
|
429 | value: true
|
430 | });
|
431 | exports.Con = exports.Row = exports.Col = undefined;
|
432 |
|
433 | var _Col2 = __webpack_require__(2);
|
434 |
|
435 | var _Col3 = _interopRequireDefault(_Col2);
|
436 |
|
437 | var _Row2 = __webpack_require__(5);
|
438 |
|
439 | var _Row3 = _interopRequireDefault(_Row2);
|
440 |
|
441 | var _Layout = __webpack_require__(6);
|
442 |
|
443 | var _Layout2 = _interopRequireDefault(_Layout);
|
444 |
|
445 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
446 |
|
447 | exports.Col = _Col3["default"];
|
448 | exports.Row = _Row3["default"];
|
449 | exports.Con = _Layout2["default"];
|
450 |
|
451 | /***/ },
|
452 | /* 2 */
|
453 | /***/ function(module, exports, __webpack_require__) {
|
454 |
|
455 | ;
|
456 |
|
457 | Object.defineProperty(exports, "__esModule", {
|
458 | value: true
|
459 | });
|
460 |
|
461 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
462 |
|
463 | var _classnames = __webpack_require__(3);
|
464 |
|
465 | var _classnames2 = _interopRequireDefault(_classnames);
|
466 |
|
467 | var _react = __webpack_require__(4);
|
468 |
|
469 | var _react2 = _interopRequireDefault(_react);
|
470 |
|
471 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
472 |
|
473 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
474 |
|
475 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
476 |
|
477 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
478 |
|
479 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
480 |
|
481 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
482 |
|
483 | var propTypes = {
|
484 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string]),
|
485 |
|
486 | /**
|
487 | * xs显示列数
|
488 | */
|
489 | xs: _react.PropTypes.number,
|
490 | /**
|
491 | * sm显示列数
|
492 | */
|
493 | sm: _react.PropTypes.number,
|
494 | /**
|
495 | * md显示列数
|
496 | */
|
497 | md: _react.PropTypes.number,
|
498 | /**
|
499 | * lg显示列数
|
500 | */
|
501 | lg: _react.PropTypes.number,
|
502 | /**
|
503 | * xs偏移列数
|
504 | */
|
505 | xsOffset: _react.PropTypes.number,
|
506 | /**
|
507 | * sm偏移列数
|
508 | */
|
509 | smOffset: _react.PropTypes.number,
|
510 | /**
|
511 | * md偏移列数
|
512 | */
|
513 | mdOffset: _react.PropTypes.number,
|
514 | /**
|
515 | * lg偏移列数
|
516 | */
|
517 | lgOffset: _react.PropTypes.number,
|
518 | /**
|
519 | * xs右偏移列数
|
520 | */
|
521 | xsPush: _react.PropTypes.number,
|
522 | /**
|
523 | * sm右偏移列数
|
524 | */
|
525 | smPush: _react.PropTypes.number,
|
526 | /**
|
527 | * md右偏移列数
|
528 | */
|
529 | mdPush: _react.PropTypes.number,
|
530 | /**
|
531 | * lg右偏移列数
|
532 | */
|
533 | lgPush: _react.PropTypes.number,
|
534 | /**
|
535 | * xs左偏移列数
|
536 | */
|
537 | xsPull: _react.PropTypes.number,
|
538 | /**
|
539 | * sm左偏移列数
|
540 | */
|
541 | smPull: _react.PropTypes.number,
|
542 | /**
|
543 | * md左偏移列数
|
544 | */
|
545 | mdPull: _react.PropTypes.number,
|
546 | /**
|
547 | * lg左偏移列数
|
548 | */
|
549 | lgPull: _react.PropTypes.number
|
550 | };
|
551 |
|
552 | var defaultProps = {
|
553 | componentClass: 'div'
|
554 | };
|
555 |
|
556 | var clsPrefix = 'u-col';
|
557 |
|
558 | var DEVICE_SIZES = ['lg', 'md', 'sm', 'xs'];
|
559 |
|
560 | var Col = function (_Component) {
|
561 | _inherits(Col, _Component);
|
562 |
|
563 | function Col() {
|
564 | _classCallCheck(this, Col);
|
565 |
|
566 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
567 | }
|
568 |
|
569 | Col.prototype.render = function render() {
|
570 | var _props = this.props,
|
571 | Component = _props.componentClass,
|
572 | className = _props.className,
|
573 | others = _objectWithoutProperties(_props, ['componentClass', 'className']);
|
574 |
|
575 | var tbClass = [];
|
576 | /**
|
577 | * 对传入props做样式转化
|
578 | * @type {[type]}
|
579 | */
|
580 | DEVICE_SIZES.forEach(function (size) {
|
581 | function popProp(propSuffix, modifier) {
|
582 | var propName = '' + size + propSuffix;
|
583 | var propValue = others[propName];
|
584 |
|
585 | if (propValue != undefined && propValue != null) {
|
586 | tbClass.push(clsPrefix + '-' + size + modifier + '-' + propValue);
|
587 | }
|
588 |
|
589 | delete others[propName];
|
590 | }
|
591 |
|
592 | popProp('', '');
|
593 | popProp('Offset', '-offset');
|
594 | popProp('Push', '-push');
|
595 | popProp('Pull', '-pull');
|
596 | });
|
597 |
|
598 | return _react2["default"].createElement(
|
599 | Component,
|
600 | _extends({
|
601 | className: (0, _classnames2["default"])(tbClass, className)
|
602 | }, others),
|
603 | this.props.children
|
604 | );
|
605 | };
|
606 |
|
607 | return Col;
|
608 | }(_react.Component);
|
609 |
|
610 | Col.propTypes = propTypes;
|
611 | Col.defaultProps = defaultProps;
|
612 |
|
613 | exports["default"] = Col;
|
614 | module.exports = exports['default'];
|
615 |
|
616 | /***/ },
|
617 | /* 3 */
|
618 | /***/ function(module, exports, __webpack_require__) {
|
619 |
|
620 | var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
|
621 | Copyright (c) 2016 Jed Watson.
|
622 | Licensed under the MIT License (MIT), see
|
623 | http://jedwatson.github.io/classnames
|
624 | */
|
625 | /* global define */
|
626 |
|
627 | (function () {
|
628 | ;
|
629 |
|
630 | var hasOwn = {}.hasOwnProperty;
|
631 |
|
632 | function classNames () {
|
633 | var classes = [];
|
634 |
|
635 | for (var i = 0; i < arguments.length; i++) {
|
636 | var arg = arguments[i];
|
637 | if (!arg) continue;
|
638 |
|
639 | var argType = typeof arg;
|
640 |
|
641 | if (argType === 'string' || argType === 'number') {
|
642 | classes.push(arg);
|
643 | } else if (Array.isArray(arg)) {
|
644 | classes.push(classNames.apply(null, arg));
|
645 | } else if (argType === 'object') {
|
646 | for (var key in arg) {
|
647 | if (hasOwn.call(arg, key) && arg[key]) {
|
648 | classes.push(key);
|
649 | }
|
650 | }
|
651 | }
|
652 | }
|
653 |
|
654 | return classes.join(' ');
|
655 | }
|
656 |
|
657 | if (typeof module !== 'undefined' && module.exports) {
|
658 | module.exports = classNames;
|
659 | } else if (true) {
|
660 | // register as 'classnames', consistent with npm package name
|
661 | !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
|
662 | return classNames;
|
663 | }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
664 | } else {
|
665 | window.classNames = classNames;
|
666 | }
|
667 | }());
|
668 |
|
669 |
|
670 | /***/ },
|
671 | /* 4 */
|
672 | /***/ function(module, exports) {
|
673 |
|
674 | module.exports = React;
|
675 |
|
676 | /***/ },
|
677 | /* 5 */
|
678 | /***/ function(module, exports, __webpack_require__) {
|
679 |
|
680 | ;
|
681 |
|
682 | Object.defineProperty(exports, "__esModule", {
|
683 | value: true
|
684 | });
|
685 |
|
686 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
687 |
|
688 | var _classnames = __webpack_require__(3);
|
689 |
|
690 | var _classnames2 = _interopRequireDefault(_classnames);
|
691 |
|
692 | var _react = __webpack_require__(4);
|
693 |
|
694 | var _react2 = _interopRequireDefault(_react);
|
695 |
|
696 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
697 |
|
698 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
699 |
|
700 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
701 |
|
702 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
703 |
|
704 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
705 |
|
706 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
707 |
|
708 | var propTypes = {
|
709 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string])
|
710 | };
|
711 |
|
712 | var defaultProps = {
|
713 | componentClass: 'div'
|
714 | };
|
715 |
|
716 | var clsPrefix = 'u-row';
|
717 |
|
718 | var Row = function (_Component) {
|
719 | _inherits(Row, _Component);
|
720 |
|
721 | function Row() {
|
722 | _classCallCheck(this, Row);
|
723 |
|
724 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
725 | }
|
726 |
|
727 | Row.prototype.render = function render() {
|
728 | var _props = this.props,
|
729 | Component = _props.componentClass,
|
730 | className = _props.className,
|
731 | others = _objectWithoutProperties(_props, ['componentClass', 'className']);
|
732 |
|
733 | var bsclass = '' + clsPrefix;
|
734 |
|
735 | return _react2["default"].createElement(
|
736 | Component,
|
737 | _extends({}, others, {
|
738 | className: (0, _classnames2["default"])(bsclass, className)
|
739 | }),
|
740 | this.props.children
|
741 | );
|
742 | };
|
743 |
|
744 | return Row;
|
745 | }(_react.Component);
|
746 |
|
747 | Row.propTypes = propTypes;
|
748 | Row.defaultProps = defaultProps;
|
749 |
|
750 | exports["default"] = Row;
|
751 | module.exports = exports['default'];
|
752 |
|
753 | /***/ },
|
754 | /* 6 */
|
755 | /***/ function(module, exports, __webpack_require__) {
|
756 |
|
757 | ;
|
758 |
|
759 | Object.defineProperty(exports, "__esModule", {
|
760 | value: true
|
761 | });
|
762 |
|
763 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
764 |
|
765 | var _classnames = __webpack_require__(3);
|
766 |
|
767 | var _classnames2 = _interopRequireDefault(_classnames);
|
768 |
|
769 | var _react = __webpack_require__(4);
|
770 |
|
771 | var _react2 = _interopRequireDefault(_react);
|
772 |
|
773 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
774 |
|
775 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
776 |
|
777 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
778 |
|
779 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
780 |
|
781 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
782 |
|
783 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
784 |
|
785 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
786 |
|
787 | var propTypes = {
|
788 | /**
|
789 | * Adds `container-fluid` class.
|
790 | */
|
791 | fluid: _react.PropTypes.bool,
|
792 | /**
|
793 | * You can use a custom element for this component
|
794 | */
|
795 | componentClass: _react.PropTypes.oneOfType([_react2["default"].PropTypes.element, _react2["default"].PropTypes.string])
|
796 | };
|
797 |
|
798 | var defaultProps = {
|
799 | componentClass: 'div',
|
800 | fluid: false
|
801 | };
|
802 |
|
803 | var clsPrefix = 'u-container';
|
804 |
|
805 | var Con = function (_React$Component) {
|
806 | _inherits(Con, _React$Component);
|
807 |
|
808 | function Con() {
|
809 | _classCallCheck(this, Con);
|
810 |
|
811 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
812 | }
|
813 |
|
814 | Con.prototype.render = function render() {
|
815 | var _tbclass;
|
816 |
|
817 | var _props = this.props,
|
818 | fluid = _props.fluid,
|
819 | Component = _props.componentClass,
|
820 | className = _props.className,
|
821 | others = _objectWithoutProperties(_props, ['fluid', 'componentClass', 'className']);
|
822 |
|
823 | var tbclass = (_tbclass = {}, _defineProperty(_tbclass, '' + clsPrefix, !fluid), _defineProperty(_tbclass, clsPrefix + '-fluid', fluid), _tbclass);
|
824 |
|
825 | return _react2["default"].createElement(
|
826 | Component,
|
827 | _extends({}, others, {
|
828 | className: (0, _classnames2["default"])(tbclass, className)
|
829 | }),
|
830 | this.props.children
|
831 | );
|
832 | };
|
833 |
|
834 | return Con;
|
835 | }(_react2["default"].Component);
|
836 |
|
837 | Con.propTypes = propTypes;
|
838 | Con.defaultProps = defaultProps;
|
839 |
|
840 | exports["default"] = Con;
|
841 | module.exports = exports['default'];
|
842 |
|
843 | /***/ },
|
844 | /* 7 */
|
845 | /***/ function(module, exports, __webpack_require__) {
|
846 |
|
847 | ;
|
848 |
|
849 | Object.defineProperty(exports, "__esModule", {
|
850 | value: true
|
851 | });
|
852 | exports.PanelGroup = exports.Panel = undefined;
|
853 |
|
854 | var _Panel2 = __webpack_require__(8);
|
855 |
|
856 | var _Panel3 = _interopRequireDefault(_Panel2);
|
857 |
|
858 | var _PanelGroup2 = __webpack_require__(59);
|
859 |
|
860 | var _PanelGroup3 = _interopRequireDefault(_PanelGroup2);
|
861 |
|
862 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
863 |
|
864 | exports.Panel = _Panel3["default"];
|
865 | exports.PanelGroup = _PanelGroup3["default"];
|
866 |
|
867 | /***/ },
|
868 | /* 8 */
|
869 | /***/ function(module, exports, __webpack_require__) {
|
870 |
|
871 | ;
|
872 |
|
873 | Object.defineProperty(exports, "__esModule", {
|
874 | value: true
|
875 | });
|
876 |
|
877 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
878 |
|
879 | var _classnames = __webpack_require__(3);
|
880 |
|
881 | var _classnames2 = _interopRequireDefault(_classnames);
|
882 |
|
883 | var _react = __webpack_require__(4);
|
884 |
|
885 | var _react2 = _interopRequireDefault(_react);
|
886 |
|
887 | var _beeTransition = __webpack_require__(9);
|
888 |
|
889 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
890 |
|
891 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
892 |
|
893 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
894 |
|
895 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
896 |
|
897 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
898 |
|
899 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
900 |
|
901 | var propTypes = {
|
902 | //是否添加折叠
|
903 | collapsible: _react2["default"].PropTypes.bool,
|
904 | onSelect: _react2["default"].PropTypes.func,
|
905 | //头部组件
|
906 | header: _react2["default"].PropTypes.node,
|
907 | headerStyle: _react2["default"].PropTypes.object,
|
908 | id: _react2["default"].PropTypes.oneOfType([_react2["default"].PropTypes.string, _react2["default"].PropTypes.number]),
|
909 | headerContent: _react2["default"].PropTypes.bool,
|
910 | //footer组件
|
911 | footer: _react2["default"].PropTypes.node,
|
912 | footerStyle: _react2["default"].PropTypes.object,
|
913 | //默认是否打开
|
914 | defaultExpanded: _react2["default"].PropTypes.bool,
|
915 | //是否打开
|
916 | expanded: _react2["default"].PropTypes.bool,
|
917 | //每个panel的标记
|
918 | eventKey: _react2["default"].PropTypes.any,
|
919 | headerRole: _react2["default"].PropTypes.string,
|
920 | panelRole: _react2["default"].PropTypes.string,
|
921 | //颜色
|
922 | colors: _react2["default"].PropTypes.oneOf(['primary', 'accent', 'success', 'info', 'warning', 'danger', 'default', 'bordered']),
|
923 |
|
924 | // From Collapse.的扩展动画
|
925 | onEnter: _react2["default"].PropTypes.func,
|
926 | onEntering: _react2["default"].PropTypes.func,
|
927 | onEntered: _react2["default"].PropTypes.func,
|
928 | onExit: _react2["default"].PropTypes.func,
|
929 | onExiting: _react2["default"].PropTypes.func,
|
930 | onExited: _react2["default"].PropTypes.func
|
931 | };
|
932 |
|
933 | var defaultProps = {
|
934 | defaultExpanded: false,
|
935 | clsPrefix: "u-panel",
|
936 | colors: "default"
|
937 | };
|
938 |
|
939 | var Panel = function (_React$Component) {
|
940 | _inherits(Panel, _React$Component);
|
941 |
|
942 | function Panel(props, context) {
|
943 | _classCallCheck(this, Panel);
|
944 |
|
945 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
946 |
|
947 | _this.handleClickTitle = _this.handleClickTitle.bind(_this);
|
948 |
|
949 | _this.state = {
|
950 | expanded: _this.props.defaultExpanded
|
951 | };
|
952 | return _this;
|
953 | }
|
954 |
|
955 | //头部点击事件
|
956 |
|
957 |
|
958 | Panel.prototype.handleClickTitle = function handleClickTitle(e) {
|
959 | // 不让事件进入事件池
|
960 | e.persist();
|
961 | e.selected = true;
|
962 |
|
963 | if (this.props.onSelect) {
|
964 | this.props.onSelect(this.props.eventKey, e);
|
965 | } else {
|
966 | e.preventDefault();
|
967 | }
|
968 |
|
969 | if (e.selected) {
|
970 | this.setState({ expanded: !this.state.expanded });
|
971 | }
|
972 | };
|
973 |
|
974 | //渲染panelheader
|
975 |
|
976 |
|
977 | Panel.prototype.renderHeader = function renderHeader(collapsible, header, id, role, expanded, clsPrefix) {
|
978 | var titleClassName = clsPrefix + '-title';
|
979 |
|
980 | if (!collapsible) {
|
981 | if (!_react2["default"].isValidElement(header)) {
|
982 | return header;
|
983 | }
|
984 |
|
985 | return (0, _react.cloneElement)(header, {
|
986 | className: (0, _classnames2["default"])(header.props.className, titleClassName)
|
987 | });
|
988 | }
|
989 |
|
990 | if (!_react2["default"].isValidElement(header)) {
|
991 | return _react2["default"].createElement(
|
992 | 'h4',
|
993 | { role: 'presentation', className: titleClassName },
|
994 | this.renderAnchor(header, id, role, expanded)
|
995 | );
|
996 | }
|
997 | if (this.props.headerContent) {
|
998 | return (0, _react.cloneElement)(header, {
|
999 | className: (0, _classnames2["default"])(header.props.className, titleClassName)
|
1000 | });
|
1001 | }
|
1002 |
|
1003 | return (0, _react.cloneElement)(header, {
|
1004 | className: (0, _classnames2["default"])(header.props.className, titleClassName),
|
1005 | children: this.renderAnchor(header.props.children, id, role, expanded)
|
1006 | });
|
1007 | };
|
1008 |
|
1009 | //如果使用链接,渲染为a标签
|
1010 |
|
1011 |
|
1012 | Panel.prototype.renderAnchor = function renderAnchor(header, id, role, expanded) {
|
1013 | return _react2["default"].createElement(
|
1014 | 'a',
|
1015 | {
|
1016 | role: role,
|
1017 | href: id && '#' + id,
|
1018 | onClick: this.handleClickTitle,
|
1019 | 'aria-controls': id,
|
1020 | 'aria-expanded': expanded,
|
1021 | 'aria-selected': expanded,
|
1022 | className: expanded ? null : 'collapsed'
|
1023 | },
|
1024 | header
|
1025 | );
|
1026 | };
|
1027 |
|
1028 | //如果有折叠动画,渲染折叠动画
|
1029 |
|
1030 |
|
1031 | Panel.prototype.renderCollapsibleBody = function renderCollapsibleBody(id, expanded, role, children, clsPrefix, animationHooks) {
|
1032 | return _react2["default"].createElement(
|
1033 | _beeTransition.Collapse,
|
1034 | _extends({ 'in': expanded }, animationHooks),
|
1035 | _react2["default"].createElement(
|
1036 | 'div',
|
1037 | {
|
1038 | id: id,
|
1039 | role: role,
|
1040 | className: clsPrefix + '-collapse',
|
1041 | 'aria-hidden': !expanded
|
1042 | },
|
1043 | this.renderBody(children, clsPrefix)
|
1044 | )
|
1045 | );
|
1046 | };
|
1047 |
|
1048 | //渲染panelbody
|
1049 |
|
1050 |
|
1051 | Panel.prototype.renderBody = function renderBody(rawChildren, clsPrefix) {
|
1052 | var children = [];
|
1053 | var bodyChildren = [];
|
1054 |
|
1055 | var bodyClassName = clsPrefix + '-body';
|
1056 |
|
1057 | //添加到body的children中
|
1058 | function maybeAddBody() {
|
1059 | if (!bodyChildren.length) {
|
1060 | return;
|
1061 | }
|
1062 |
|
1063 | // 给子组件添加key,为了之后触发事件时使用
|
1064 | children.push(_react2["default"].createElement(
|
1065 | 'div',
|
1066 | { key: children.length, className: bodyClassName },
|
1067 | bodyChildren
|
1068 | ));
|
1069 |
|
1070 | bodyChildren = [];
|
1071 | }
|
1072 |
|
1073 | //转换为数组,方便复用
|
1074 | _react2["default"].Children.toArray(rawChildren).forEach(function (child) {
|
1075 | if (_react2["default"].isValidElement(child) && child.props.fill) {
|
1076 | maybeAddBody();
|
1077 |
|
1078 | //将标示fill设置为undefined
|
1079 | children.push((0, _react.cloneElement)(child, { fill: undefined }));
|
1080 |
|
1081 | return;
|
1082 | }
|
1083 |
|
1084 | bodyChildren.push(child);
|
1085 | });
|
1086 |
|
1087 | maybeAddBody();
|
1088 |
|
1089 | return children;
|
1090 | };
|
1091 |
|
1092 | Panel.prototype.render = function render() {
|
1093 | var _props = this.props,
|
1094 | collapsible = _props.collapsible,
|
1095 | header = _props.header,
|
1096 | id = _props.id,
|
1097 | footer = _props.footer,
|
1098 | propsExpanded = _props.expanded,
|
1099 | footerStyle = _props.footerStyle,
|
1100 | headerStyle = _props.headerStyle,
|
1101 | headerRole = _props.headerRole,
|
1102 | panelRole = _props.panelRole,
|
1103 | className = _props.className,
|
1104 | colors = _props.colors,
|
1105 | children = _props.children,
|
1106 | onEnter = _props.onEnter,
|
1107 | onEntering = _props.onEntering,
|
1108 | onEntered = _props.onEntered,
|
1109 | clsPrefix = _props.clsPrefix,
|
1110 | onExit = _props.onExit,
|
1111 | onExiting = _props.onExiting,
|
1112 | onExited = _props.onExited,
|
1113 | defaultExpanded = _props.defaultExpanded,
|
1114 | eventKey = _props.eventKey,
|
1115 | onSelect = _props.onSelect,
|
1116 | props = _objectWithoutProperties(_props, ['collapsible', 'header', 'id', 'footer', 'expanded', 'footerStyle', 'headerStyle', 'headerRole', 'panelRole', 'className', 'colors', 'children', 'onEnter', 'onEntering', 'onEntered', 'clsPrefix', 'onExit', 'onExiting', 'onExited', 'defaultExpanded', 'eventKey', 'onSelect']);
|
1117 |
|
1118 | var expanded = propsExpanded != null ? propsExpanded : this.state.expanded;
|
1119 |
|
1120 | var classes = {};
|
1121 | classes['' + clsPrefix] = true;
|
1122 | classes[clsPrefix + '-' + colors] = true;
|
1123 |
|
1124 | return _react2["default"].createElement(
|
1125 | 'div',
|
1126 | _extends({}, props, {
|
1127 | className: (0, _classnames2["default"])(className, classes),
|
1128 | id: collapsible ? null : id
|
1129 | }),
|
1130 | header && _react2["default"].createElement(
|
1131 | 'div',
|
1132 | { className: clsPrefix + '-heading', style: headerStyle },
|
1133 | this.renderHeader(collapsible, header, id, headerRole, expanded, clsPrefix)
|
1134 | ),
|
1135 | collapsible ? this.renderCollapsibleBody(id, expanded, panelRole, children, clsPrefix, { onEnter: onEnter, onEntering: onEntering, onEntered: onEntered, onExit: onExit, onExiting: onExiting, onExited: onExited }) : this.renderBody(children, clsPrefix),
|
1136 | footer && _react2["default"].createElement(
|
1137 | 'div',
|
1138 | { className: clsPrefix + '-footer', style: footerStyle },
|
1139 | footer
|
1140 | )
|
1141 | );
|
1142 | };
|
1143 |
|
1144 | return Panel;
|
1145 | }(_react2["default"].Component);
|
1146 |
|
1147 | Panel.propTypes = propTypes;
|
1148 | Panel.defaultProps = defaultProps;
|
1149 |
|
1150 | exports["default"] = Panel;
|
1151 | module.exports = exports['default'];
|
1152 |
|
1153 | /***/ },
|
1154 | /* 9 */
|
1155 | /***/ function(module, exports, __webpack_require__) {
|
1156 |
|
1157 | ;
|
1158 |
|
1159 | Object.defineProperty(exports, "__esModule", {
|
1160 | value: true
|
1161 | });
|
1162 | exports.Fade = exports.Collapse = exports.Transition = undefined;
|
1163 |
|
1164 | var _Transition2 = __webpack_require__(10);
|
1165 |
|
1166 | var _Transition3 = _interopRequireDefault(_Transition2);
|
1167 |
|
1168 | var _Collapse2 = __webpack_require__(15);
|
1169 |
|
1170 | var _Collapse3 = _interopRequireDefault(_Collapse2);
|
1171 |
|
1172 | var _Fade2 = __webpack_require__(58);
|
1173 |
|
1174 | var _Fade3 = _interopRequireDefault(_Fade2);
|
1175 |
|
1176 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
1177 |
|
1178 | exports.Transition = _Transition3["default"];
|
1179 | exports.Collapse = _Collapse3["default"];
|
1180 | exports.Fade = _Fade3["default"];
|
1181 |
|
1182 | /***/ },
|
1183 | /* 10 */
|
1184 | /***/ function(module, exports, __webpack_require__) {
|
1185 |
|
1186 | ;
|
1187 |
|
1188 | Object.defineProperty(exports, "__esModule", {
|
1189 | value: true
|
1190 | });
|
1191 | exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = undefined;
|
1192 |
|
1193 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
1194 |
|
1195 | var _react = __webpack_require__(4);
|
1196 |
|
1197 | var _react2 = _interopRequireDefault(_react);
|
1198 |
|
1199 | var _reactDom = __webpack_require__(11);
|
1200 |
|
1201 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
1202 |
|
1203 | var _properties = __webpack_require__(12);
|
1204 |
|
1205 | var _properties2 = _interopRequireDefault(_properties);
|
1206 |
|
1207 | var _on = __webpack_require__(14);
|
1208 |
|
1209 | var _on2 = _interopRequireDefault(_on);
|
1210 |
|
1211 | var _classnames = __webpack_require__(3);
|
1212 |
|
1213 | var _classnames2 = _interopRequireDefault(_classnames);
|
1214 |
|
1215 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
1216 |
|
1217 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
1218 |
|
1219 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
1220 |
|
1221 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
1222 |
|
1223 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
1224 |
|
1225 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
1226 |
|
1227 | var transitionEndEvent = _properties2["default"].end;
|
1228 |
|
1229 | //设置状态码
|
1230 | var UNMOUNTED = exports.UNMOUNTED = 0;
|
1231 | var EXITED = exports.EXITED = 1;
|
1232 | var ENTERING = exports.ENTERING = 2;
|
1233 | var ENTERED = exports.ENTERED = 3;
|
1234 | var EXITING = exports.EXITING = 4;
|
1235 |
|
1236 | var propTypes = {
|
1237 | /**
|
1238 | * 是否触发动画
|
1239 | */
|
1240 | "in": _react.PropTypes.bool,
|
1241 |
|
1242 | /**
|
1243 | * 不显示的时候是否移除组件
|
1244 | */
|
1245 | unmountOnExit: _react.PropTypes.bool,
|
1246 |
|
1247 | /**
|
1248 | * 如果设置为默认显示,挂载时显示动画
|
1249 | */
|
1250 | transitionAppear: _react.PropTypes.bool,
|
1251 |
|
1252 | /**
|
1253 | * 设置超时时间,防止出现问题,可设置为>=动画时间
|
1254 | */
|
1255 | timeout: _react.PropTypes.number,
|
1256 |
|
1257 | /**
|
1258 | * 退出组件时添加的class
|
1259 | */
|
1260 | exitedClassName: _react.PropTypes.string,
|
1261 | /**
|
1262 | * 退出组件中添加的class
|
1263 | */
|
1264 | exitingClassName: _react.PropTypes.string,
|
1265 | /**
|
1266 | * 进入动画后添加的class
|
1267 | */
|
1268 | enteredClassName: _react.PropTypes.string,
|
1269 | /**
|
1270 | * 进入动画时添加的class
|
1271 | */
|
1272 | enteringClassName: _react.PropTypes.string,
|
1273 |
|
1274 | /**
|
1275 | * 进入动画开始时的钩子函数
|
1276 | */
|
1277 | onEnter: _react.PropTypes.func,
|
1278 | /**
|
1279 | * 进入动画中的钩子函数
|
1280 | */
|
1281 | onEntering: _react.PropTypes.func,
|
1282 | /**
|
1283 | * 进入动画后的钩子函数
|
1284 | */
|
1285 | onEntered: _react.PropTypes.func,
|
1286 | /**
|
1287 | * 退出动画开始时的钩子函数
|
1288 | */
|
1289 | onExit: _react.PropTypes.func,
|
1290 | /**
|
1291 | * 退出动画中的钩子函数
|
1292 | */
|
1293 | onExiting: _react.PropTypes.func,
|
1294 | /**
|
1295 | * 退出动画后的钩子函数
|
1296 | */
|
1297 | onExited: _react.PropTypes.func
|
1298 | };
|
1299 |
|
1300 | function noop() {}
|
1301 |
|
1302 | var defaultProps = {
|
1303 | "in": false,
|
1304 | unmountOnExit: false,
|
1305 | transitionAppear: false,
|
1306 | timeout: 5000,
|
1307 | onEnter: noop,
|
1308 | onEntering: noop,
|
1309 | onEntered: noop,
|
1310 | onExit: noop,
|
1311 | onExiting: noop,
|
1312 | onExited: noop
|
1313 | };
|
1314 |
|
1315 | /**
|
1316 | * 动画组件
|
1317 | */
|
1318 |
|
1319 | var Transition = function (_Component) {
|
1320 | _inherits(Transition, _Component);
|
1321 |
|
1322 | function Transition(props, context) {
|
1323 | _classCallCheck(this, Transition);
|
1324 |
|
1325 | var _this = _possibleConstructorReturn(this, _Component.call(this, props, context));
|
1326 |
|
1327 | var initialStatus = void 0;
|
1328 | if (props["in"]) {
|
1329 | // 在componentdidmount时开始执行动画
|
1330 | initialStatus = props.transitionAppear ? EXITED : ENTERED;
|
1331 | } else {
|
1332 | initialStatus = props.unmountOnExit ? UNMOUNTED : EXITED;
|
1333 | }
|
1334 | _this.state = { status: initialStatus };
|
1335 |
|
1336 | _this.nextCallback = null;
|
1337 | return _this;
|
1338 | }
|
1339 |
|
1340 | Transition.prototype.componentDidMount = function componentDidMount() {
|
1341 | if (this.props.transitionAppear && this.props["in"]) {
|
1342 | this.performEnter(this.props);
|
1343 | }
|
1344 | };
|
1345 |
|
1346 | Transition.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
1347 | if (nextProps["in"] && this.props.unmountOnExit) {
|
1348 | if (this.state.status === UNMOUNTED) {
|
1349 | // 在componentDidUpdate执行动画.
|
1350 | this.setState({ status: EXITED });
|
1351 | }
|
1352 | } else {
|
1353 | this._needsUpdate = true;
|
1354 | }
|
1355 | };
|
1356 |
|
1357 | Transition.prototype.componentDidUpdate = function componentDidUpdate() {
|
1358 | var status = this.state.status;
|
1359 |
|
1360 | if (this.props.unmountOnExit && status === EXITED) {
|
1361 | // 当使用unmountOnExit时,exited为exiting和unmont的过渡状态
|
1362 | if (this.props["in"]) {
|
1363 | this.performEnter(this.props);
|
1364 | } else {
|
1365 | this.setState({ status: UNMOUNTED });
|
1366 | }
|
1367 |
|
1368 | return;
|
1369 | }
|
1370 |
|
1371 | // 确保只响应prop变化
|
1372 | if (this._needsUpdate) {
|
1373 | this._needsUpdate = false;
|
1374 |
|
1375 | if (this.props["in"]) {
|
1376 | if (status === EXITING) {
|
1377 | this.performEnter(this.props);
|
1378 | } else if (status === EXITED) {
|
1379 | this.performEnter(this.props);
|
1380 | }
|
1381 | // 其他,当我们已经输入或输出
|
1382 | } else {
|
1383 | if (status === ENTERING || status === ENTERED) {
|
1384 | this.performExit(this.props);
|
1385 | }
|
1386 | // 我们已经输入或输出完成
|
1387 | }
|
1388 | }
|
1389 | };
|
1390 |
|
1391 | Transition.prototype.componentWillUnmount = function componentWillUnmount() {
|
1392 | this.cancelNextCallback();
|
1393 | };
|
1394 |
|
1395 | Transition.prototype.performEnter = function performEnter(props) {
|
1396 | var _this2 = this;
|
1397 |
|
1398 | this.cancelNextCallback();
|
1399 | var node = _reactDom2["default"].findDOMNode(this);
|
1400 |
|
1401 | // 这里接收新props
|
1402 | props.onEnter(node);
|
1403 |
|
1404 | this.safeSetState({ status: ENTERING }, function () {
|
1405 | _this2.props.onEntering(node);
|
1406 |
|
1407 | _this2.onTransitionEnd(node, function () {
|
1408 | _this2.safeSetState({ status: ENTERED }, function () {
|
1409 | _this2.props.onEntered(node);
|
1410 | });
|
1411 | });
|
1412 | });
|
1413 | };
|
1414 |
|
1415 | Transition.prototype.performExit = function performExit(props) {
|
1416 | var _this3 = this;
|
1417 |
|
1418 | this.cancelNextCallback();
|
1419 | var node = _reactDom2["default"].findDOMNode(this);
|
1420 |
|
1421 | props.onExit(node);
|
1422 |
|
1423 | this.safeSetState({ status: EXITING }, function () {
|
1424 | _this3.props.onExiting(node);
|
1425 |
|
1426 | _this3.onTransitionEnd(node, function () {
|
1427 | _this3.safeSetState({ status: EXITED }, function () {
|
1428 | _this3.props.onExited(node);
|
1429 | });
|
1430 | });
|
1431 | });
|
1432 | };
|
1433 |
|
1434 | Transition.prototype.cancelNextCallback = function cancelNextCallback() {
|
1435 | if (this.nextCallback !== null) {
|
1436 | this.nextCallback.cancel();
|
1437 | this.nextCallback = null;
|
1438 | }
|
1439 | };
|
1440 |
|
1441 | Transition.prototype.safeSetState = function safeSetState(nextState, callback) {
|
1442 | // 确保在组件销毁后挂起的setState被消除
|
1443 | this.setState(nextState, this.setNextCallback(callback));
|
1444 | };
|
1445 |
|
1446 | Transition.prototype.setNextCallback = function setNextCallback(callback) {
|
1447 | var _this4 = this;
|
1448 |
|
1449 | var active = true;
|
1450 |
|
1451 | this.nextCallback = function (event) {
|
1452 | if (active) {
|
1453 | active = false;
|
1454 | _this4.nextCallback = null;
|
1455 |
|
1456 | callback(event);
|
1457 | }
|
1458 | };
|
1459 |
|
1460 | this.nextCallback.cancel = function () {
|
1461 | active = false;
|
1462 | };
|
1463 |
|
1464 | return this.nextCallback;
|
1465 | };
|
1466 |
|
1467 | Transition.prototype.onTransitionEnd = function onTransitionEnd(node, handler) {
|
1468 | this.setNextCallback(handler);
|
1469 |
|
1470 | if (node) {
|
1471 | (0, _on2["default"])(node, transitionEndEvent, this.nextCallback);
|
1472 | setTimeout(this.nextCallback, this.props.timeout);
|
1473 | } else {
|
1474 | setTimeout(this.nextCallback, 0);
|
1475 | }
|
1476 | };
|
1477 |
|
1478 | Transition.prototype.render = function render() {
|
1479 | var status = this.state.status;
|
1480 | if (status === UNMOUNTED) {
|
1481 | return null;
|
1482 | }
|
1483 |
|
1484 | var _props = this.props;
|
1485 | var children = _props.children;
|
1486 | var className = _props.className;
|
1487 |
|
1488 | var childProps = _objectWithoutProperties(_props, ['children', 'className']);
|
1489 |
|
1490 | Object.keys(Transition.propTypes).forEach(function (key) {
|
1491 | return delete childProps[key];
|
1492 | });
|
1493 |
|
1494 | var transitionClassName = void 0;
|
1495 | if (status === EXITED) {
|
1496 | transitionClassName = this.props.exitedClassName;
|
1497 | } else if (status === ENTERING) {
|
1498 | transitionClassName = this.props.enteringClassName;
|
1499 | } else if (status === ENTERED) {
|
1500 | transitionClassName = this.props.enteredClassName;
|
1501 | } else if (status === EXITING) {
|
1502 | transitionClassName = this.props.exitingClassName;
|
1503 | }
|
1504 |
|
1505 | var child = _react2["default"].Children.only(children);
|
1506 | return _react2["default"].cloneElement(child, _extends({}, childProps, {
|
1507 | className: (0, _classnames2["default"])(child.props.className, className, transitionClassName)
|
1508 | }));
|
1509 | };
|
1510 |
|
1511 | return Transition;
|
1512 | }(_react.Component);
|
1513 |
|
1514 | Transition.propTypes = propTypes;
|
1515 |
|
1516 | Transition.defaultProps = defaultProps;
|
1517 |
|
1518 | exports["default"] = Transition;
|
1519 |
|
1520 | /***/ },
|
1521 | /* 11 */
|
1522 | /***/ function(module, exports) {
|
1523 |
|
1524 | module.exports = ReactDOM;
|
1525 |
|
1526 | /***/ },
|
1527 | /* 12 */
|
1528 | /***/ function(module, exports, __webpack_require__) {
|
1529 |
|
1530 | ;
|
1531 |
|
1532 | Object.defineProperty(exports, "__esModule", {
|
1533 | value: true
|
1534 | });
|
1535 | exports.animationEnd = exports.animationDelay = exports.animationTiming = exports.animationDuration = exports.animationName = exports.transitionEnd = exports.transitionDuration = exports.transitionDelay = exports.transitionTiming = exports.transitionProperty = exports.transform = undefined;
|
1536 |
|
1537 | var _inDOM = __webpack_require__(13);
|
1538 |
|
1539 | var _inDOM2 = _interopRequireDefault(_inDOM);
|
1540 |
|
1541 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1542 |
|
1543 | var transform = 'transform';
|
1544 | var prefix = void 0,
|
1545 | transitionEnd = void 0,
|
1546 | animationEnd = void 0;
|
1547 | var transitionProperty = void 0,
|
1548 | transitionDuration = void 0,
|
1549 | transitionTiming = void 0,
|
1550 | transitionDelay = void 0;
|
1551 | var animationName = void 0,
|
1552 | animationDuration = void 0,
|
1553 | animationTiming = void 0,
|
1554 | animationDelay = void 0;
|
1555 |
|
1556 | if (_inDOM2.default) {
|
1557 | var _getTransitionPropert = getTransitionProperties();
|
1558 |
|
1559 | prefix = _getTransitionPropert.prefix;
|
1560 | exports.transitionEnd = transitionEnd = _getTransitionPropert.transitionEnd;
|
1561 | exports.animationEnd = animationEnd = _getTransitionPropert.animationEnd;
|
1562 |
|
1563 |
|
1564 | exports.transform = transform = prefix + '-' + transform;
|
1565 | exports.transitionProperty = transitionProperty = prefix + '-transition-property';
|
1566 | exports.transitionDuration = transitionDuration = prefix + '-transition-duration';
|
1567 | exports.transitionDelay = transitionDelay = prefix + '-transition-delay';
|
1568 | exports.transitionTiming = transitionTiming = prefix + '-transition-timing-function';
|
1569 |
|
1570 | exports.animationName = animationName = prefix + '-animation-name';
|
1571 | exports.animationDuration = animationDuration = prefix + '-animation-duration';
|
1572 | exports.animationTiming = animationTiming = prefix + '-animation-delay';
|
1573 | exports.animationDelay = animationDelay = prefix + '-animation-timing-function';
|
1574 | }
|
1575 |
|
1576 | exports.transform = transform;
|
1577 | exports.transitionProperty = transitionProperty;
|
1578 | exports.transitionTiming = transitionTiming;
|
1579 | exports.transitionDelay = transitionDelay;
|
1580 | exports.transitionDuration = transitionDuration;
|
1581 | exports.transitionEnd = transitionEnd;
|
1582 | exports.animationName = animationName;
|
1583 | exports.animationDuration = animationDuration;
|
1584 | exports.animationTiming = animationTiming;
|
1585 | exports.animationDelay = animationDelay;
|
1586 | exports.animationEnd = animationEnd;
|
1587 | exports.default = {
|
1588 | transform: transform,
|
1589 | end: transitionEnd,
|
1590 | property: transitionProperty,
|
1591 | timing: transitionTiming,
|
1592 | delay: transitionDelay,
|
1593 | duration: transitionDuration
|
1594 | };
|
1595 |
|
1596 |
|
1597 | function getTransitionProperties() {
|
1598 | var style = document.createElement('div').style;
|
1599 |
|
1600 | var vendorMap = {
|
1601 | O: function O(e) {
|
1602 | return 'o' + e.toLowerCase();
|
1603 | },
|
1604 | Moz: function Moz(e) {
|
1605 | return 'moz' + e;
|
1606 | },
|
1607 | Webkit: function Webkit(e) {
|
1608 | return 'webkit' + e;
|
1609 | },
|
1610 | ms: function ms(e) {
|
1611 | return 'MS' + e;
|
1612 | }
|
1613 | };
|
1614 |
|
1615 | var vendors = Object.keys(vendorMap);
|
1616 |
|
1617 | var transitionEnd = void 0,
|
1618 | animationEnd = void 0;
|
1619 | var prefix = '';
|
1620 |
|
1621 | for (var i = 0; i < vendors.length; i++) {
|
1622 | var vendor = vendors[i];
|
1623 |
|
1624 | if (vendor + 'TransitionProperty' in style) {
|
1625 | prefix = '-' + vendor.toLowerCase();
|
1626 | transitionEnd = vendorMap[vendor]('TransitionEnd');
|
1627 | animationEnd = vendorMap[vendor]('AnimationEnd');
|
1628 | break;
|
1629 | }
|
1630 | }
|
1631 |
|
1632 | if (!transitionEnd && 'transitionProperty' in style) transitionEnd = 'transitionend';
|
1633 |
|
1634 | if (!animationEnd && 'animationName' in style) transitionEnd = 'animationend';
|
1635 |
|
1636 | style = null;
|
1637 |
|
1638 | return { animationEnd: animationEnd, transitionEnd: transitionEnd, prefix: prefix };
|
1639 | }
|
1640 |
|
1641 | /***/ },
|
1642 | /* 13 */
|
1643 | /***/ function(module, exports) {
|
1644 |
|
1645 | ;
|
1646 |
|
1647 | Object.defineProperty(exports, "__esModule", {
|
1648 | value: true
|
1649 | });
|
1650 | exports.default = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
1651 | module.exports = exports['default'];
|
1652 |
|
1653 | /***/ },
|
1654 | /* 14 */
|
1655 | /***/ function(module, exports, __webpack_require__) {
|
1656 |
|
1657 | ;
|
1658 |
|
1659 | Object.defineProperty(exports, "__esModule", {
|
1660 | value: true
|
1661 | });
|
1662 |
|
1663 | var _inDOM = __webpack_require__(13);
|
1664 |
|
1665 | var _inDOM2 = _interopRequireDefault(_inDOM);
|
1666 |
|
1667 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1668 |
|
1669 | var on = function on() {};
|
1670 | if (_inDOM2.default) {
|
1671 | on = function () {
|
1672 |
|
1673 | if (document.addEventListener) return function (node, eventName, handler, capture) {
|
1674 | return node.addEventListener(eventName, handler, capture || false);
|
1675 | };else if (document.attachEvent) return function (node, eventName, handler) {
|
1676 | return node.attachEvent('on' + eventName, function (e) {
|
1677 | e = e || window.event;
|
1678 | e.target = e.target || e.srcElement;
|
1679 | e.currentTarget = node;
|
1680 | handler.call(node, e);
|
1681 | });
|
1682 | };
|
1683 | }();
|
1684 | }
|
1685 |
|
1686 | exports.default = on;
|
1687 | module.exports = exports['default'];
|
1688 |
|
1689 | /***/ },
|
1690 | /* 15 */
|
1691 | /***/ function(module, exports, __webpack_require__) {
|
1692 |
|
1693 | ;
|
1694 |
|
1695 | Object.defineProperty(exports, "__esModule", {
|
1696 | value: true
|
1697 | });
|
1698 |
|
1699 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
1700 |
|
1701 | var _classnames = __webpack_require__(3);
|
1702 |
|
1703 | var _classnames2 = _interopRequireDefault(_classnames);
|
1704 |
|
1705 | var _style = __webpack_require__(16);
|
1706 |
|
1707 | var _style2 = _interopRequireDefault(_style);
|
1708 |
|
1709 | var _react = __webpack_require__(4);
|
1710 |
|
1711 | var _react2 = _interopRequireDefault(_react);
|
1712 |
|
1713 | var _Transition = __webpack_require__(10);
|
1714 |
|
1715 | var _Transition2 = _interopRequireDefault(_Transition);
|
1716 |
|
1717 | var _capitalize = __webpack_require__(24);
|
1718 |
|
1719 | var _capitalize2 = _interopRequireDefault(_capitalize);
|
1720 |
|
1721 | var _tinperBeeCore = __webpack_require__(25);
|
1722 |
|
1723 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
1724 |
|
1725 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
1726 |
|
1727 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
1728 |
|
1729 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
1730 |
|
1731 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
1732 |
|
1733 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
1734 |
|
1735 | var MARGINS = {
|
1736 | height: ['marginTop', 'marginBottom'],
|
1737 | width: ['marginLeft', 'marginRight']
|
1738 | };
|
1739 |
|
1740 | // reading a dimension prop will cause the browser to recalculate,
|
1741 | // which will let our animations work
|
1742 | function triggerBrowserReflow(node) {
|
1743 | node.offsetHeight; // eslint-disable-line no-unused-expressions
|
1744 | }
|
1745 |
|
1746 | function getDimensionValue(dimension, elem) {
|
1747 | var value = elem['offset' + (0, _capitalize2["default"])(dimension)];
|
1748 | var margins = MARGINS[dimension];
|
1749 |
|
1750 | return value + parseInt((0, _style2["default"])(elem, margins[0]), 10) + parseInt((0, _style2["default"])(elem, margins[1]), 10);
|
1751 | }
|
1752 |
|
1753 | var propTypes = {
|
1754 | /**
|
1755 | * Show the component; triggers the expand or collapse animation
|
1756 | */
|
1757 | "in": _react2["default"].PropTypes.bool,
|
1758 |
|
1759 | /**
|
1760 | * Unmount the component (remove it from the DOM) when it is collapsed
|
1761 | */
|
1762 | unmountOnExit: _react2["default"].PropTypes.bool,
|
1763 |
|
1764 | /**
|
1765 | * Run the expand animation when the component mounts, if it is initially
|
1766 | * shown
|
1767 | */
|
1768 | transitionAppear: _react2["default"].PropTypes.bool,
|
1769 |
|
1770 | /**
|
1771 | * Duration of the collapse animation in milliseconds, to ensure that
|
1772 | * finishing callbacks are fired even if the original browser transition end
|
1773 | * events are canceled
|
1774 | */
|
1775 | timeout: _react2["default"].PropTypes.number,
|
1776 |
|
1777 | /**
|
1778 | * Callback fired before the component expands
|
1779 | */
|
1780 | onEnter: _react2["default"].PropTypes.func,
|
1781 | /**
|
1782 | * Callback fired after the component starts to expand
|
1783 | */
|
1784 | onEntering: _react2["default"].PropTypes.func,
|
1785 | /**
|
1786 | * Callback fired after the component has expanded
|
1787 | */
|
1788 | onEntered: _react2["default"].PropTypes.func,
|
1789 | /**
|
1790 | * Callback fired before the component collapses
|
1791 | */
|
1792 | onExit: _react2["default"].PropTypes.func,
|
1793 | /**
|
1794 | * Callback fired after the component starts to collapse
|
1795 | */
|
1796 | onExiting: _react2["default"].PropTypes.func,
|
1797 | /**
|
1798 | * Callback fired after the component has collapsed
|
1799 | */
|
1800 | onExited: _react2["default"].PropTypes.func,
|
1801 |
|
1802 | /**
|
1803 | * The dimension used when collapsing, or a function that returns the
|
1804 | * dimension
|
1805 | *
|
1806 | * _Note: Bootstrap only partially supports 'width'!
|
1807 | * You will need to supply your own CSS animation for the `.width` CSS class._
|
1808 | */
|
1809 | dimension: _react2["default"].PropTypes.oneOfType([_react2["default"].PropTypes.oneOf(['height', 'width']), _react2["default"].PropTypes.func]),
|
1810 |
|
1811 | /**
|
1812 | * Function that returns the height or width of the animating DOM node
|
1813 | *
|
1814 | * Allows for providing some custom logic for how much the Collapse component
|
1815 | * should animate in its specified dimension. Called with the current
|
1816 | * dimension prop value and the DOM node.
|
1817 | */
|
1818 | getDimensionValue: _react2["default"].PropTypes.func,
|
1819 |
|
1820 | /**
|
1821 | * ARIA role of collapsible element
|
1822 | */
|
1823 | role: _react2["default"].PropTypes.string
|
1824 | };
|
1825 |
|
1826 | var defaultProps = {
|
1827 | "in": false,
|
1828 | timeout: 300,
|
1829 | unmountOnExit: false,
|
1830 | transitionAppear: false,
|
1831 |
|
1832 | dimension: 'height',
|
1833 | getDimensionValue: getDimensionValue
|
1834 | };
|
1835 |
|
1836 | var Collapse = function (_React$Component) {
|
1837 | _inherits(Collapse, _React$Component);
|
1838 |
|
1839 | function Collapse(props, context) {
|
1840 | _classCallCheck(this, Collapse);
|
1841 |
|
1842 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
1843 |
|
1844 | _this.handleEnter = _this.handleEnter.bind(_this);
|
1845 | _this.handleEntering = _this.handleEntering.bind(_this);
|
1846 | _this.handleEntered = _this.handleEntered.bind(_this);
|
1847 | _this.handleExit = _this.handleExit.bind(_this);
|
1848 | _this.handleExiting = _this.handleExiting.bind(_this);
|
1849 | return _this;
|
1850 | }
|
1851 |
|
1852 | /* -- Expanding -- */
|
1853 |
|
1854 |
|
1855 | Collapse.prototype.handleEnter = function handleEnter(elem) {
|
1856 | var dimension = this._dimension();
|
1857 | elem.style[dimension] = '0';
|
1858 | };
|
1859 |
|
1860 | Collapse.prototype.handleEntering = function handleEntering(elem) {
|
1861 | var dimension = this._dimension();
|
1862 | elem.style[dimension] = this._getScrollDimensionValue(elem, dimension);
|
1863 | };
|
1864 |
|
1865 | Collapse.prototype.handleEntered = function handleEntered(elem) {
|
1866 | var dimension = this._dimension();
|
1867 | elem.style[dimension] = null;
|
1868 | };
|
1869 |
|
1870 | /* -- Collapsing -- */
|
1871 |
|
1872 |
|
1873 | Collapse.prototype.handleExit = function handleExit(elem) {
|
1874 | var dimension = this._dimension();
|
1875 | elem.style[dimension] = this.props.getDimensionValue(dimension, elem) + 'px';
|
1876 | triggerBrowserReflow(elem);
|
1877 | };
|
1878 |
|
1879 | Collapse.prototype.handleExiting = function handleExiting(elem) {
|
1880 | var dimension = this._dimension();
|
1881 | elem.style[dimension] = '0';
|
1882 | };
|
1883 |
|
1884 | Collapse.prototype._dimension = function _dimension() {
|
1885 | return typeof this.props.dimension === 'function' ? this.props.dimension() : this.props.dimension;
|
1886 | };
|
1887 |
|
1888 | // for testing
|
1889 |
|
1890 |
|
1891 | Collapse.prototype._getScrollDimensionValue = function _getScrollDimensionValue(elem, dimension) {
|
1892 | return elem['scroll' + (0, _capitalize2["default"])(dimension)] + 'px';
|
1893 | };
|
1894 |
|
1895 | Collapse.prototype.render = function render() {
|
1896 | var _props = this.props;
|
1897 | var onEnter = _props.onEnter;
|
1898 | var onEntering = _props.onEntering;
|
1899 | var onEntered = _props.onEntered;
|
1900 | var onExit = _props.onExit;
|
1901 | var onExiting = _props.onExiting;
|
1902 | var className = _props.className;
|
1903 |
|
1904 | var props = _objectWithoutProperties(_props, ['onEnter', 'onEntering', 'onEntered', 'onExit', 'onExiting', 'className']);
|
1905 |
|
1906 | delete props.dimension;
|
1907 | delete props.getDimensionValue;
|
1908 |
|
1909 | var handleEnter = (0, _tinperBeeCore.createChainedFunction)(this.handleEnter, onEnter);
|
1910 | var handleEntering = (0, _tinperBeeCore.createChainedFunction)(this.handleEntering, onEntering);
|
1911 | var handleEntered = (0, _tinperBeeCore.createChainedFunction)(this.handleEntered, onEntered);
|
1912 | var handleExit = (0, _tinperBeeCore.createChainedFunction)(this.handleExit, onExit);
|
1913 | var handleExiting = (0, _tinperBeeCore.createChainedFunction)(this.handleExiting, onExiting);
|
1914 |
|
1915 | var classes = {
|
1916 | width: this._dimension() === 'width'
|
1917 | };
|
1918 |
|
1919 | return _react2["default"].createElement(_Transition2["default"], _extends({}, props, {
|
1920 | 'aria-expanded': props.role ? props["in"] : null,
|
1921 | className: (0, _classnames2["default"])(className, classes),
|
1922 | exitedClassName: 'collapse',
|
1923 | exitingClassName: 'collapsing',
|
1924 | enteredClassName: 'collapse in',
|
1925 | enteringClassName: 'collapsing',
|
1926 | onEnter: handleEnter,
|
1927 | onEntering: handleEntering,
|
1928 | onEntered: handleEntered,
|
1929 | onExit: handleExit,
|
1930 | onExiting: handleExiting
|
1931 | }));
|
1932 | };
|
1933 |
|
1934 | return Collapse;
|
1935 | }(_react2["default"].Component);
|
1936 |
|
1937 | Collapse.propTypes = propTypes;
|
1938 | Collapse.defaultProps = defaultProps;
|
1939 |
|
1940 | exports["default"] = Collapse;
|
1941 | module.exports = exports['default'];
|
1942 |
|
1943 | /***/ },
|
1944 | /* 16 */
|
1945 | /***/ function(module, exports, __webpack_require__) {
|
1946 |
|
1947 | ;
|
1948 |
|
1949 | Object.defineProperty(exports, "__esModule", {
|
1950 | value: true
|
1951 | });
|
1952 | exports.default = style;
|
1953 |
|
1954 | var _camelizeStyle = __webpack_require__(17);
|
1955 |
|
1956 | var _camelizeStyle2 = _interopRequireDefault(_camelizeStyle);
|
1957 |
|
1958 | var _hyphenateStyle = __webpack_require__(19);
|
1959 |
|
1960 | var _hyphenateStyle2 = _interopRequireDefault(_hyphenateStyle);
|
1961 |
|
1962 | var _getComputedStyle2 = __webpack_require__(21);
|
1963 |
|
1964 | var _getComputedStyle3 = _interopRequireDefault(_getComputedStyle2);
|
1965 |
|
1966 | var _removeStyle = __webpack_require__(22);
|
1967 |
|
1968 | var _removeStyle2 = _interopRequireDefault(_removeStyle);
|
1969 |
|
1970 | var _properties = __webpack_require__(12);
|
1971 |
|
1972 | var _isTransform = __webpack_require__(23);
|
1973 |
|
1974 | var _isTransform2 = _interopRequireDefault(_isTransform);
|
1975 |
|
1976 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
1977 |
|
1978 | function style(node, property, value) {
|
1979 | var css = '';
|
1980 | var transforms = '';
|
1981 | var props = property;
|
1982 |
|
1983 | if (typeof property === 'string') {
|
1984 | if (value === undefined) {
|
1985 | return node.style[(0, _camelizeStyle2.default)(property)] || (0, _getComputedStyle3.default)(node).getPropertyValue((0, _hyphenateStyle2.default)(property));
|
1986 | } else {
|
1987 | (props = {})[property] = value;
|
1988 | }
|
1989 | }
|
1990 |
|
1991 | Object.keys(props).forEach(function (key) {
|
1992 | var value = props[key];
|
1993 | if (!value && value !== 0) {
|
1994 | (0, _removeStyle2.default)(node, (0, _hyphenateStyle2.default)(key));
|
1995 | } else if ((0, _isTransform2.default)(key)) {
|
1996 | transforms += key + '(' + value + ') ';
|
1997 | } else {
|
1998 | css += (0, _hyphenateStyle2.default)(key) + ': ' + value + ';';
|
1999 | }
|
2000 | });
|
2001 |
|
2002 | if (transforms) {
|
2003 | css += _properties.transform + ': ' + transforms + ';';
|
2004 | }
|
2005 |
|
2006 | node.style.cssText += ';' + css;
|
2007 | }
|
2008 | module.exports = exports['default'];
|
2009 |
|
2010 | /***/ },
|
2011 | /* 17 */
|
2012 | /***/ function(module, exports, __webpack_require__) {
|
2013 |
|
2014 | ;
|
2015 |
|
2016 | Object.defineProperty(exports, "__esModule", {
|
2017 | value: true
|
2018 | });
|
2019 | exports.default = camelizeStyleName;
|
2020 |
|
2021 | var _camelize = __webpack_require__(18);
|
2022 |
|
2023 | var _camelize2 = _interopRequireDefault(_camelize);
|
2024 |
|
2025 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2026 |
|
2027 | var msPattern = /^-ms-/; /**
|
2028 | * Copyright 2014-2015, Facebook, Inc.
|
2029 | * All rights reserved.
|
2030 | * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/camelizeStyleName.js
|
2031 | */
|
2032 | function camelizeStyleName(string) {
|
2033 | return (0, _camelize2.default)(string.replace(msPattern, 'ms-'));
|
2034 | }
|
2035 | module.exports = exports['default'];
|
2036 |
|
2037 | /***/ },
|
2038 | /* 18 */
|
2039 | /***/ function(module, exports) {
|
2040 |
|
2041 | ;
|
2042 |
|
2043 | Object.defineProperty(exports, "__esModule", {
|
2044 | value: true
|
2045 | });
|
2046 | exports.default = camelize;
|
2047 | var rHyphen = /-(.)/g;
|
2048 |
|
2049 | function camelize(string) {
|
2050 | return string.replace(rHyphen, function (_, chr) {
|
2051 | return chr.toUpperCase();
|
2052 | });
|
2053 | }
|
2054 | module.exports = exports["default"];
|
2055 |
|
2056 | /***/ },
|
2057 | /* 19 */
|
2058 | /***/ function(module, exports, __webpack_require__) {
|
2059 |
|
2060 | ;
|
2061 |
|
2062 | Object.defineProperty(exports, "__esModule", {
|
2063 | value: true
|
2064 | });
|
2065 | exports.default = hyphenateStyleName;
|
2066 |
|
2067 | var _hyphenate = __webpack_require__(20);
|
2068 |
|
2069 | var _hyphenate2 = _interopRequireDefault(_hyphenate);
|
2070 |
|
2071 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2072 |
|
2073 | var msPattern = /^ms-/; /**
|
2074 | * Copyright 2013-2014, Facebook, Inc.
|
2075 | * All rights reserved.
|
2076 | * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js
|
2077 | */
|
2078 |
|
2079 | function hyphenateStyleName(string) {
|
2080 | return (0, _hyphenate2.default)(string).replace(msPattern, '-ms-');
|
2081 | }
|
2082 | module.exports = exports['default'];
|
2083 |
|
2084 | /***/ },
|
2085 | /* 20 */
|
2086 | /***/ function(module, exports) {
|
2087 |
|
2088 | ;
|
2089 |
|
2090 | Object.defineProperty(exports, "__esModule", {
|
2091 | value: true
|
2092 | });
|
2093 | exports.default = hyphenate;
|
2094 |
|
2095 | var rUpper = /([A-Z])/g;
|
2096 |
|
2097 | function hyphenate(string) {
|
2098 | return string.replace(rUpper, '-$1').toLowerCase();
|
2099 | }
|
2100 | module.exports = exports['default'];
|
2101 |
|
2102 | /***/ },
|
2103 | /* 21 */
|
2104 | /***/ function(module, exports, __webpack_require__) {
|
2105 |
|
2106 | ;
|
2107 |
|
2108 | Object.defineProperty(exports, "__esModule", {
|
2109 | value: true
|
2110 | });
|
2111 | exports.default = _getComputedStyle;
|
2112 |
|
2113 | var _camelizeStyle = __webpack_require__(17);
|
2114 |
|
2115 | var _camelizeStyle2 = _interopRequireDefault(_camelizeStyle);
|
2116 |
|
2117 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2118 |
|
2119 | var rposition = /^(top|right|bottom|left)$/;
|
2120 | var rnumnonpx = /^([+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/i;
|
2121 |
|
2122 | function _getComputedStyle(node) {
|
2123 | if (!node) throw new TypeError('No Element passed to `getComputedStyle()`');
|
2124 | var doc = node.ownerDocument;
|
2125 |
|
2126 | return 'defaultView' in doc ? doc.defaultView.opener ? node.ownerDocument.defaultView.getComputedStyle(node, null) : window.getComputedStyle(node, null) : {
|
2127 | //ie 8 "magic" from: https://github.com/jquery/jquery/blob/1.11-stable/src/css/curCSS.js#L72
|
2128 | getPropertyValue: function getPropertyValue(prop) {
|
2129 | var style = node.style;
|
2130 |
|
2131 | prop = (0, _camelizeStyle2.default)(prop);
|
2132 |
|
2133 | if (prop == 'float') prop = 'styleFloat';
|
2134 |
|
2135 | var current = node.currentStyle[prop] || null;
|
2136 |
|
2137 | if (current == null && style && style[prop]) current = style[prop];
|
2138 |
|
2139 | if (rnumnonpx.test(current) && !rposition.test(prop)) {
|
2140 | // Remember the original values
|
2141 | var left = style.left;
|
2142 | var runStyle = node.runtimeStyle;
|
2143 | var rsLeft = runStyle && runStyle.left;
|
2144 |
|
2145 | // Put in the new values to get a computed value out
|
2146 | if (rsLeft) runStyle.left = node.currentStyle.left;
|
2147 |
|
2148 | style.left = prop === 'fontSize' ? '1em' : current;
|
2149 | current = style.pixelLeft + 'px';
|
2150 |
|
2151 | // Revert the changed values
|
2152 | style.left = left;
|
2153 | if (rsLeft) runStyle.left = rsLeft;
|
2154 | }
|
2155 |
|
2156 | return current;
|
2157 | }
|
2158 | };
|
2159 | }
|
2160 | module.exports = exports['default'];
|
2161 |
|
2162 | /***/ },
|
2163 | /* 22 */
|
2164 | /***/ function(module, exports) {
|
2165 |
|
2166 | ;
|
2167 |
|
2168 | Object.defineProperty(exports, "__esModule", {
|
2169 | value: true
|
2170 | });
|
2171 | exports.default = removeStyle;
|
2172 | function removeStyle(node, key) {
|
2173 | return 'removeProperty' in node.style ? node.style.removeProperty(key) : node.style.removeAttribute(key);
|
2174 | }
|
2175 | module.exports = exports['default'];
|
2176 |
|
2177 | /***/ },
|
2178 | /* 23 */
|
2179 | /***/ function(module, exports) {
|
2180 |
|
2181 | ;
|
2182 |
|
2183 | Object.defineProperty(exports, "__esModule", {
|
2184 | value: true
|
2185 | });
|
2186 | exports.default = isTransform;
|
2187 | var supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;
|
2188 |
|
2189 | function isTransform(property) {
|
2190 | return !!(property && supportedTransforms.test(property));
|
2191 | }
|
2192 | module.exports = exports["default"];
|
2193 |
|
2194 | /***/ },
|
2195 | /* 24 */
|
2196 | /***/ function(module, exports) {
|
2197 |
|
2198 | ;
|
2199 |
|
2200 | Object.defineProperty(exports, "__esModule", {
|
2201 | value: true
|
2202 | });
|
2203 | exports["default"] = capitalize;
|
2204 | function capitalize(string) {
|
2205 | return "" + string.charAt(0).toUpperCase() + string.slice(1);
|
2206 | }
|
2207 | module.exports = exports["default"];
|
2208 |
|
2209 | /***/ },
|
2210 | /* 25 */
|
2211 | /***/ function(module, exports, __webpack_require__) {
|
2212 |
|
2213 | ;
|
2214 |
|
2215 | exports.__esModule = true;
|
2216 | exports.Align = exports.toArray = exports.cssAnimation = exports.addEventListener = exports.contains = exports.KeyCode = exports.createChainedFunction = exports.splitComponent = exports.isRequiredForA11y = exports.elementType = exports.deprecated = exports.componentOrElement = exports.all = undefined;
|
2217 |
|
2218 | var _all2 = __webpack_require__(26);
|
2219 |
|
2220 | var _all3 = _interopRequireDefault(_all2);
|
2221 |
|
2222 | var _componentOrElement2 = __webpack_require__(28);
|
2223 |
|
2224 | var _componentOrElement3 = _interopRequireDefault(_componentOrElement2);
|
2225 |
|
2226 | var _deprecated2 = __webpack_require__(29);
|
2227 |
|
2228 | var _deprecated3 = _interopRequireDefault(_deprecated2);
|
2229 |
|
2230 | var _elementType2 = __webpack_require__(32);
|
2231 |
|
2232 | var _elementType3 = _interopRequireDefault(_elementType2);
|
2233 |
|
2234 | var _isRequiredForA11y2 = __webpack_require__(33);
|
2235 |
|
2236 | var _isRequiredForA11y3 = _interopRequireDefault(_isRequiredForA11y2);
|
2237 |
|
2238 | var _splitComponent2 = __webpack_require__(34);
|
2239 |
|
2240 | var _splitComponent3 = _interopRequireDefault(_splitComponent2);
|
2241 |
|
2242 | var _createChainedFunction2 = __webpack_require__(35);
|
2243 |
|
2244 | var _createChainedFunction3 = _interopRequireDefault(_createChainedFunction2);
|
2245 |
|
2246 | var _keyCode = __webpack_require__(36);
|
2247 |
|
2248 | var _keyCode2 = _interopRequireDefault(_keyCode);
|
2249 |
|
2250 | var _contains2 = __webpack_require__(37);
|
2251 |
|
2252 | var _contains3 = _interopRequireDefault(_contains2);
|
2253 |
|
2254 | var _addEventListener2 = __webpack_require__(38);
|
2255 |
|
2256 | var _addEventListener3 = _interopRequireDefault(_addEventListener2);
|
2257 |
|
2258 | var _cssAnimation2 = __webpack_require__(43);
|
2259 |
|
2260 | var _cssAnimation3 = _interopRequireDefault(_cssAnimation2);
|
2261 |
|
2262 | var _toArray2 = __webpack_require__(47);
|
2263 |
|
2264 | var _toArray3 = _interopRequireDefault(_toArray2);
|
2265 |
|
2266 | var _Align2 = __webpack_require__(48);
|
2267 |
|
2268 | var _Align3 = _interopRequireDefault(_Align2);
|
2269 |
|
2270 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2271 |
|
2272 | exports.all = _all3.default;
|
2273 | exports.componentOrElement = _componentOrElement3.default;
|
2274 | exports.deprecated = _deprecated3.default;
|
2275 | exports.elementType = _elementType3.default;
|
2276 | exports.isRequiredForA11y = _isRequiredForA11y3.default;
|
2277 | exports.splitComponent = _splitComponent3.default;
|
2278 | exports.createChainedFunction = _createChainedFunction3.default;
|
2279 | exports.KeyCode = _keyCode2.default;
|
2280 | exports.contains = _contains3.default;
|
2281 | exports.addEventListener = _addEventListener3.default;
|
2282 | exports.cssAnimation = _cssAnimation3.default;
|
2283 | exports.toArray = _toArray3.default;
|
2284 | //export getContainerRenderMixin from './getContainerRenderMixin';
|
2285 |
|
2286 | exports.Align = _Align3.default;
|
2287 |
|
2288 | /***/ },
|
2289 | /* 26 */
|
2290 | /***/ function(module, exports, __webpack_require__) {
|
2291 |
|
2292 | ;
|
2293 |
|
2294 | exports.__esModule = true;
|
2295 | exports.default = all;
|
2296 |
|
2297 | var _createChainableTypeChecker = __webpack_require__(27);
|
2298 |
|
2299 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2300 |
|
2301 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2302 |
|
2303 | function all() {
|
2304 | for (var _len = arguments.length, validators = Array(_len), _key = 0; _key < _len; _key++) {
|
2305 | validators[_key] = arguments[_key];
|
2306 | }
|
2307 |
|
2308 | function allPropTypes() {
|
2309 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
2310 | args[_key2] = arguments[_key2];
|
2311 | }
|
2312 |
|
2313 | var error = null;
|
2314 |
|
2315 | validators.forEach(function (validator) {
|
2316 | if (error != null) {
|
2317 | return;
|
2318 | }
|
2319 |
|
2320 | var result = validator.apply(undefined, args);
|
2321 | if (result != null) {
|
2322 | error = result;
|
2323 | }
|
2324 | });
|
2325 |
|
2326 | return error;
|
2327 | }
|
2328 |
|
2329 | return (0, _createChainableTypeChecker2.default)(allPropTypes);
|
2330 | }
|
2331 |
|
2332 | /***/ },
|
2333 | /* 27 */
|
2334 | /***/ function(module, exports) {
|
2335 |
|
2336 | ;
|
2337 |
|
2338 | exports.__esModule = true;
|
2339 | exports.default = createChainableTypeChecker;
|
2340 | /**
|
2341 | * Copyright 2013-present, Facebook, Inc.
|
2342 | * All rights reserved.
|
2343 | *
|
2344 | * This source code is licensed under the BSD-style license found in the
|
2345 | * LICENSE file in the root directory of this source tree. An additional grant
|
2346 | * of patent rights can be found in the PATENTS file in the same directory.
|
2347 | */
|
2348 |
|
2349 | // Mostly taken from ReactPropTypes.
|
2350 |
|
2351 | function createChainableTypeChecker(validate) {
|
2352 | function checkType(isRequired, props, propName, componentName, location, propFullName) {
|
2353 | var componentNameSafe = componentName || '<<anonymous>>';
|
2354 | var propFullNameSafe = propFullName || propName;
|
2355 |
|
2356 | if (props[propName] == null) {
|
2357 | if (isRequired) {
|
2358 | return new Error('Required ' + location + ' `' + propFullNameSafe + '` was not specified ' + ('in `' + componentNameSafe + '`.'));
|
2359 | }
|
2360 |
|
2361 | return null;
|
2362 | }
|
2363 |
|
2364 | for (var _len = arguments.length, args = Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {
|
2365 | args[_key - 6] = arguments[_key];
|
2366 | }
|
2367 |
|
2368 | return validate.apply(undefined, [props, propName, componentNameSafe, location, propFullNameSafe].concat(args));
|
2369 | }
|
2370 |
|
2371 | var chainedCheckType = checkType.bind(null, false);
|
2372 | chainedCheckType.isRequired = checkType.bind(null, true);
|
2373 |
|
2374 | return chainedCheckType;
|
2375 | }
|
2376 |
|
2377 | /***/ },
|
2378 | /* 28 */
|
2379 | /***/ function(module, exports, __webpack_require__) {
|
2380 |
|
2381 | ;
|
2382 |
|
2383 | exports.__esModule = true;
|
2384 |
|
2385 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
2386 |
|
2387 | var _react = __webpack_require__(4);
|
2388 |
|
2389 | var _react2 = _interopRequireDefault(_react);
|
2390 |
|
2391 | var _createChainableTypeChecker = __webpack_require__(27);
|
2392 |
|
2393 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2394 |
|
2395 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2396 |
|
2397 | function validate(props, propName, componentName, location, propFullName) {
|
2398 | var propValue = props[propName];
|
2399 | var propType = typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue);
|
2400 |
|
2401 | if (_react2.default.isValidElement(propValue)) {
|
2402 | return new Error('Invalid ' + location + ' `' + propFullName + '` of type ReactElement ' + ('supplied to `' + componentName + '`, expected a ReactComponent or a ') + 'DOMElement. You can usually obtain a ReactComponent or DOMElement ' + 'from a ReactElement by attaching a ref to it.');
|
2403 | }
|
2404 |
|
2405 | if ((propType !== 'object' || typeof propValue.render !== 'function') && propValue.nodeType !== 1) {
|
2406 | return new Error('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected a ReactComponent or a ') + 'DOMElement.');
|
2407 | }
|
2408 |
|
2409 | return null;
|
2410 | }
|
2411 |
|
2412 | exports.default = (0, _createChainableTypeChecker2.default)(validate);
|
2413 |
|
2414 | /***/ },
|
2415 | /* 29 */
|
2416 | /***/ function(module, exports, __webpack_require__) {
|
2417 |
|
2418 | ;
|
2419 |
|
2420 | exports.__esModule = true;
|
2421 | exports.default = deprecated;
|
2422 |
|
2423 | var _warning = __webpack_require__(30);
|
2424 |
|
2425 | var _warning2 = _interopRequireDefault(_warning);
|
2426 |
|
2427 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2428 |
|
2429 | var warned = {};
|
2430 |
|
2431 | function deprecated(validator, reason) {
|
2432 | return function validate(props, propName, componentName, location, propFullName) {
|
2433 | var componentNameSafe = componentName || '<<anonymous>>';
|
2434 | var propFullNameSafe = propFullName || propName;
|
2435 |
|
2436 | if (props[propName] != null) {
|
2437 | var messageKey = componentName + '.' + propName;
|
2438 |
|
2439 | (0, _warning2.default)(warned[messageKey], 'The ' + location + ' `' + propFullNameSafe + '` of ' + ('`' + componentNameSafe + '` is deprecated. ' + reason + '.'));
|
2440 |
|
2441 | warned[messageKey] = true;
|
2442 | }
|
2443 |
|
2444 | for (var _len = arguments.length, args = Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
|
2445 | args[_key - 5] = arguments[_key];
|
2446 | }
|
2447 |
|
2448 | return validator.apply(undefined, [props, propName, componentName, location, propFullName].concat(args));
|
2449 | };
|
2450 | }
|
2451 |
|
2452 | /* eslint-disable no-underscore-dangle */
|
2453 | function _resetWarned() {
|
2454 | warned = {};
|
2455 | }
|
2456 |
|
2457 | deprecated._resetWarned = _resetWarned;
|
2458 | /* eslint-enable no-underscore-dangle */
|
2459 |
|
2460 | /***/ },
|
2461 | /* 30 */
|
2462 | /***/ function(module, exports, __webpack_require__) {
|
2463 |
|
2464 | /* WEBPACK VAR INJECTION */(function(process) {/**
|
2465 | * Copyright 2014-2015, Facebook, Inc.
|
2466 | * All rights reserved.
|
2467 | *
|
2468 | * This source code is licensed under the BSD-style license found in the
|
2469 | * LICENSE file in the root directory of this source tree. An additional grant
|
2470 | * of patent rights can be found in the PATENTS file in the same directory.
|
2471 | */
|
2472 |
|
2473 | ;
|
2474 |
|
2475 | /**
|
2476 | * Similar to invariant but only logs a warning if the condition is not met.
|
2477 | * This can be used to log issues in development environments in critical
|
2478 | * paths. Removing the logging code for production environments will keep the
|
2479 | * same logic and follow the same code paths.
|
2480 | */
|
2481 |
|
2482 | var warning = function() {};
|
2483 |
|
2484 | if (process.env.NODE_ENV !== 'production') {
|
2485 | warning = function(condition, format, args) {
|
2486 | var len = arguments.length;
|
2487 | args = new Array(len > 2 ? len - 2 : 0);
|
2488 | for (var key = 2; key < len; key++) {
|
2489 | args[key - 2] = arguments[key];
|
2490 | }
|
2491 | if (format === undefined) {
|
2492 | throw new Error(
|
2493 | '`warning(condition, format, ...args)` requires a warning ' +
|
2494 | 'message argument'
|
2495 | );
|
2496 | }
|
2497 |
|
2498 | if (format.length < 10 || (/^[s\W]*$/).test(format)) {
|
2499 | throw new Error(
|
2500 | 'The warning format should be able to uniquely identify this ' +
|
2501 | 'warning. Please, use a more descriptive format than: ' + format
|
2502 | );
|
2503 | }
|
2504 |
|
2505 | if (!condition) {
|
2506 | var argIndex = 0;
|
2507 | var message = 'Warning: ' +
|
2508 | format.replace(/%s/g, function() {
|
2509 | return args[argIndex++];
|
2510 | });
|
2511 | if (typeof console !== 'undefined') {
|
2512 | console.error(message);
|
2513 | }
|
2514 | try {
|
2515 | // This error was thrown as a convenience so that you can use this stack
|
2516 | // to find the callsite that caused this warning to fire.
|
2517 | throw new Error(message);
|
2518 | } catch(x) {}
|
2519 | }
|
2520 | };
|
2521 | }
|
2522 |
|
2523 | module.exports = warning;
|
2524 |
|
2525 | /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(31)))
|
2526 |
|
2527 | /***/ },
|
2528 | /* 31 */
|
2529 | /***/ function(module, exports) {
|
2530 |
|
2531 | // shim for using process in browser
|
2532 | var process = module.exports = {};
|
2533 |
|
2534 | // cached from whatever global is present so that test runners that stub it
|
2535 | // don't break things. But we need to wrap it in a try catch in case it is
|
2536 | // wrapped in strict mode code which doesn't define any globals. It's inside a
|
2537 | // function because try/catches deoptimize in certain engines.
|
2538 |
|
2539 | var cachedSetTimeout;
|
2540 | var cachedClearTimeout;
|
2541 |
|
2542 | function defaultSetTimout() {
|
2543 | throw new Error('setTimeout has not been defined');
|
2544 | }
|
2545 | function defaultClearTimeout () {
|
2546 | throw new Error('clearTimeout has not been defined');
|
2547 | }
|
2548 | (function () {
|
2549 | try {
|
2550 | if (typeof setTimeout === 'function') {
|
2551 | cachedSetTimeout = setTimeout;
|
2552 | } else {
|
2553 | cachedSetTimeout = defaultSetTimout;
|
2554 | }
|
2555 | } catch (e) {
|
2556 | cachedSetTimeout = defaultSetTimout;
|
2557 | }
|
2558 | try {
|
2559 | if (typeof clearTimeout === 'function') {
|
2560 | cachedClearTimeout = clearTimeout;
|
2561 | } else {
|
2562 | cachedClearTimeout = defaultClearTimeout;
|
2563 | }
|
2564 | } catch (e) {
|
2565 | cachedClearTimeout = defaultClearTimeout;
|
2566 | }
|
2567 | } ())
|
2568 | function runTimeout(fun) {
|
2569 | if (cachedSetTimeout === setTimeout) {
|
2570 | //normal enviroments in sane situations
|
2571 | return setTimeout(fun, 0);
|
2572 | }
|
2573 | // if setTimeout wasn't available but was latter defined
|
2574 | if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
2575 | cachedSetTimeout = setTimeout;
|
2576 | return setTimeout(fun, 0);
|
2577 | }
|
2578 | try {
|
2579 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
2580 | return cachedSetTimeout(fun, 0);
|
2581 | } catch(e){
|
2582 | try {
|
2583 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
2584 | return cachedSetTimeout.call(null, fun, 0);
|
2585 | } catch(e){
|
2586 | // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
|
2587 | return cachedSetTimeout.call(this, fun, 0);
|
2588 | }
|
2589 | }
|
2590 |
|
2591 |
|
2592 | }
|
2593 | function runClearTimeout(marker) {
|
2594 | if (cachedClearTimeout === clearTimeout) {
|
2595 | //normal enviroments in sane situations
|
2596 | return clearTimeout(marker);
|
2597 | }
|
2598 | // if clearTimeout wasn't available but was latter defined
|
2599 | if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
2600 | cachedClearTimeout = clearTimeout;
|
2601 | return clearTimeout(marker);
|
2602 | }
|
2603 | try {
|
2604 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
2605 | return cachedClearTimeout(marker);
|
2606 | } catch (e){
|
2607 | try {
|
2608 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
2609 | return cachedClearTimeout.call(null, marker);
|
2610 | } catch (e){
|
2611 | // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
|
2612 | // Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
2613 | return cachedClearTimeout.call(this, marker);
|
2614 | }
|
2615 | }
|
2616 |
|
2617 |
|
2618 |
|
2619 | }
|
2620 | var queue = [];
|
2621 | var draining = false;
|
2622 | var currentQueue;
|
2623 | var queueIndex = -1;
|
2624 |
|
2625 | function cleanUpNextTick() {
|
2626 | if (!draining || !currentQueue) {
|
2627 | return;
|
2628 | }
|
2629 | draining = false;
|
2630 | if (currentQueue.length) {
|
2631 | queue = currentQueue.concat(queue);
|
2632 | } else {
|
2633 | queueIndex = -1;
|
2634 | }
|
2635 | if (queue.length) {
|
2636 | drainQueue();
|
2637 | }
|
2638 | }
|
2639 |
|
2640 | function drainQueue() {
|
2641 | if (draining) {
|
2642 | return;
|
2643 | }
|
2644 | var timeout = runTimeout(cleanUpNextTick);
|
2645 | draining = true;
|
2646 |
|
2647 | var len = queue.length;
|
2648 | while(len) {
|
2649 | currentQueue = queue;
|
2650 | queue = [];
|
2651 | while (++queueIndex < len) {
|
2652 | if (currentQueue) {
|
2653 | currentQueue[queueIndex].run();
|
2654 | }
|
2655 | }
|
2656 | queueIndex = -1;
|
2657 | len = queue.length;
|
2658 | }
|
2659 | currentQueue = null;
|
2660 | draining = false;
|
2661 | runClearTimeout(timeout);
|
2662 | }
|
2663 |
|
2664 | process.nextTick = function (fun) {
|
2665 | var args = new Array(arguments.length - 1);
|
2666 | if (arguments.length > 1) {
|
2667 | for (var i = 1; i < arguments.length; i++) {
|
2668 | args[i - 1] = arguments[i];
|
2669 | }
|
2670 | }
|
2671 | queue.push(new Item(fun, args));
|
2672 | if (queue.length === 1 && !draining) {
|
2673 | runTimeout(drainQueue);
|
2674 | }
|
2675 | };
|
2676 |
|
2677 | // v8 likes predictible objects
|
2678 | function Item(fun, array) {
|
2679 | this.fun = fun;
|
2680 | this.array = array;
|
2681 | }
|
2682 | Item.prototype.run = function () {
|
2683 | this.fun.apply(null, this.array);
|
2684 | };
|
2685 | process.title = 'browser';
|
2686 | process.browser = true;
|
2687 | process.env = {};
|
2688 | process.argv = [];
|
2689 | process.version = ''; // empty string to avoid regexp issues
|
2690 | process.versions = {};
|
2691 |
|
2692 | function noop() {}
|
2693 |
|
2694 | process.on = noop;
|
2695 | process.addListener = noop;
|
2696 | process.once = noop;
|
2697 | process.off = noop;
|
2698 | process.removeListener = noop;
|
2699 | process.removeAllListeners = noop;
|
2700 | process.emit = noop;
|
2701 |
|
2702 | process.binding = function (name) {
|
2703 | throw new Error('process.binding is not supported');
|
2704 | };
|
2705 |
|
2706 | process.cwd = function () { return '/' };
|
2707 | process.chdir = function (dir) {
|
2708 | throw new Error('process.chdir is not supported');
|
2709 | };
|
2710 | process.umask = function() { return 0; };
|
2711 |
|
2712 |
|
2713 | /***/ },
|
2714 | /* 32 */
|
2715 | /***/ function(module, exports, __webpack_require__) {
|
2716 |
|
2717 | ;
|
2718 |
|
2719 | exports.__esModule = true;
|
2720 |
|
2721 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
2722 |
|
2723 | var _react = __webpack_require__(4);
|
2724 |
|
2725 | var _react2 = _interopRequireDefault(_react);
|
2726 |
|
2727 | var _createChainableTypeChecker = __webpack_require__(27);
|
2728 |
|
2729 | var _createChainableTypeChecker2 = _interopRequireDefault(_createChainableTypeChecker);
|
2730 |
|
2731 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
2732 |
|
2733 | function elementType(props, propName, componentName, location, propFullName) {
|
2734 | var propValue = props[propName];
|
2735 | var propType = typeof propValue === 'undefined' ? 'undefined' : _typeof(propValue);
|
2736 |
|
2737 | if (_react2.default.isValidElement(propValue)) {
|
2738 | return new Error('Invalid ' + location + ' `' + propFullName + '` of type ReactElement ' + ('supplied to `' + componentName + '`, expected an element type (a string ') + 'or a ReactClass).');
|
2739 | }
|
2740 |
|
2741 | if (propType !== 'function' && propType !== 'string') {
|
2742 | return new Error('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected an element type (a string ') + 'or a ReactClass).');
|
2743 | }
|
2744 |
|
2745 | return null;
|
2746 | }
|
2747 |
|
2748 | exports.default = (0, _createChainableTypeChecker2.default)(elementType);
|
2749 |
|
2750 | /***/ },
|
2751 | /* 33 */
|
2752 | /***/ function(module, exports) {
|
2753 |
|
2754 | ;
|
2755 |
|
2756 | exports.__esModule = true;
|
2757 | exports.default = isRequiredForA11y;
|
2758 | function isRequiredForA11y(validator) {
|
2759 | return function validate(props, propName, componentName, location, propFullName) {
|
2760 | var componentNameSafe = componentName || '<<anonymous>>';
|
2761 | var propFullNameSafe = propFullName || propName;
|
2762 |
|
2763 | if (props[propName] == null) {
|
2764 | return new Error('The ' + location + ' `' + propFullNameSafe + '` is required to make ' + ('`' + componentNameSafe + '` accessible for users of assistive ') + 'technologies such as screen readers.');
|
2765 | }
|
2766 |
|
2767 | for (var _len = arguments.length, args = Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
|
2768 | args[_key - 5] = arguments[_key];
|
2769 | }
|
2770 |
|
2771 | return validator.apply(undefined, [props, propName, componentName, location, propFullName].concat(args));
|
2772 | };
|
2773 | }
|
2774 |
|
2775 | /***/ },
|
2776 | /* 34 */
|
2777 | /***/ function(module, exports) {
|
2778 |
|
2779 | ;
|
2780 |
|
2781 | exports.__esModule = true;
|
2782 | exports.default = splitComponentProps;
|
2783 | /**
|
2784 | * 分割要传入父元素和子元素的props
|
2785 | * @param {[object]} props 传入的属性
|
2786 | * @param {[reactElement]} Component 组件
|
2787 | * @return {[array]} 返回数组,第一个元素为父元素props对象,第二个子元素props对象
|
2788 | */
|
2789 | function splitComponentProps(props, Component) {
|
2790 | var componentPropTypes = Component.propTypes;
|
2791 |
|
2792 | var parentProps = {};
|
2793 | var childProps = {};
|
2794 |
|
2795 | Object.entries(props).forEach(function (_ref) {
|
2796 | var propName = _ref[0],
|
2797 | propValue = _ref[1];
|
2798 |
|
2799 | if (componentPropTypes[propName]) {
|
2800 | parentProps[propName] = propValue;
|
2801 | } else {
|
2802 | childProps[propName] = propValue;
|
2803 | }
|
2804 | });
|
2805 |
|
2806 | return [parentProps, childProps];
|
2807 | }
|
2808 |
|
2809 | /***/ },
|
2810 | /* 35 */
|
2811 | /***/ function(module, exports) {
|
2812 |
|
2813 | ;
|
2814 |
|
2815 | exports.__esModule = true;
|
2816 | function createChainedFunction() {
|
2817 | for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
|
2818 | funcs[_key] = arguments[_key];
|
2819 | }
|
2820 |
|
2821 | return funcs.filter(function (f) {
|
2822 | return f != null;
|
2823 | }).reduce(function (acc, f) {
|
2824 | if (typeof f !== 'function') {
|
2825 | throw new Error('Invalid Argument Type, must only provide functions, undefined, or null.');
|
2826 | }
|
2827 |
|
2828 | if (acc === null) {
|
2829 | return f;
|
2830 | }
|
2831 |
|
2832 | return function chainedFunction() {
|
2833 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
2834 | args[_key2] = arguments[_key2];
|
2835 | }
|
2836 |
|
2837 | acc.apply(this, args);
|
2838 | f.apply(this, args);
|
2839 | };
|
2840 | }, null);
|
2841 | }
|
2842 | exports.default = createChainedFunction;
|
2843 |
|
2844 | /***/ },
|
2845 | /* 36 */
|
2846 | /***/ function(module, exports) {
|
2847 |
|
2848 | ;
|
2849 |
|
2850 | /**
|
2851 | * @ignore
|
2852 | * some key-codes definition and utils from closure-library
|
2853 | * @author yiminghe@gmail.com
|
2854 | */
|
2855 |
|
2856 | var KeyCode = {
|
2857 | /**
|
2858 | * MAC_ENTER
|
2859 | */
|
2860 | MAC_ENTER: 3,
|
2861 | /**
|
2862 | * BACKSPACE
|
2863 | */
|
2864 | BACKSPACE: 8,
|
2865 | /**
|
2866 | * TAB
|
2867 | */
|
2868 | TAB: 9,
|
2869 | /**
|
2870 | * NUMLOCK on FF/Safari Mac
|
2871 | */
|
2872 | NUM_CENTER: 12, // NUMLOCK on FF/Safari Mac
|
2873 | /**
|
2874 | * ENTER
|
2875 | */
|
2876 | ENTER: 13,
|
2877 | /**
|
2878 | * SHIFT
|
2879 | */
|
2880 | SHIFT: 16,
|
2881 | /**
|
2882 | * CTRL
|
2883 | */
|
2884 | CTRL: 17,
|
2885 | /**
|
2886 | * ALT
|
2887 | */
|
2888 | ALT: 18,
|
2889 | /**
|
2890 | * PAUSE
|
2891 | */
|
2892 | PAUSE: 19,
|
2893 | /**
|
2894 | * CAPS_LOCK
|
2895 | */
|
2896 | CAPS_LOCK: 20,
|
2897 | /**
|
2898 | * ESC
|
2899 | */
|
2900 | ESC: 27,
|
2901 | /**
|
2902 | * SPACE
|
2903 | */
|
2904 | SPACE: 32,
|
2905 | /**
|
2906 | * PAGE_UP
|
2907 | */
|
2908 | PAGE_UP: 33, // also NUM_NORTH_EAST
|
2909 | /**
|
2910 | * PAGE_DOWN
|
2911 | */
|
2912 | PAGE_DOWN: 34, // also NUM_SOUTH_EAST
|
2913 | /**
|
2914 | * END
|
2915 | */
|
2916 | END: 35, // also NUM_SOUTH_WEST
|
2917 | /**
|
2918 | * HOME
|
2919 | */
|
2920 | HOME: 36, // also NUM_NORTH_WEST
|
2921 | /**
|
2922 | * LEFT
|
2923 | */
|
2924 | LEFT: 37, // also NUM_WEST
|
2925 | /**
|
2926 | * UP
|
2927 | */
|
2928 | UP: 38, // also NUM_NORTH
|
2929 | /**
|
2930 | * RIGHT
|
2931 | */
|
2932 | RIGHT: 39, // also NUM_EAST
|
2933 | /**
|
2934 | * DOWN
|
2935 | */
|
2936 | DOWN: 40, // also NUM_SOUTH
|
2937 | /**
|
2938 | * PRINT_SCREEN
|
2939 | */
|
2940 | PRINT_SCREEN: 44,
|
2941 | /**
|
2942 | * INSERT
|
2943 | */
|
2944 | INSERT: 45, // also NUM_INSERT
|
2945 | /**
|
2946 | * DELETE
|
2947 | */
|
2948 | DELETE: 46, // also NUM_DELETE
|
2949 | /**
|
2950 | * ZERO
|
2951 | */
|
2952 | ZERO: 48,
|
2953 | /**
|
2954 | * ONE
|
2955 | */
|
2956 | ONE: 49,
|
2957 | /**
|
2958 | * TWO
|
2959 | */
|
2960 | TWO: 50,
|
2961 | /**
|
2962 | * THREE
|
2963 | */
|
2964 | THREE: 51,
|
2965 | /**
|
2966 | * FOUR
|
2967 | */
|
2968 | FOUR: 52,
|
2969 | /**
|
2970 | * FIVE
|
2971 | */
|
2972 | FIVE: 53,
|
2973 | /**
|
2974 | * SIX
|
2975 | */
|
2976 | SIX: 54,
|
2977 | /**
|
2978 | * SEVEN
|
2979 | */
|
2980 | SEVEN: 55,
|
2981 | /**
|
2982 | * EIGHT
|
2983 | */
|
2984 | EIGHT: 56,
|
2985 | /**
|
2986 | * NINE
|
2987 | */
|
2988 | NINE: 57,
|
2989 | /**
|
2990 | * QUESTION_MARK
|
2991 | */
|
2992 | QUESTION_MARK: 63, // needs localization
|
2993 | /**
|
2994 | * A
|
2995 | */
|
2996 | A: 65,
|
2997 | /**
|
2998 | * B
|
2999 | */
|
3000 | B: 66,
|
3001 | /**
|
3002 | * C
|
3003 | */
|
3004 | C: 67,
|
3005 | /**
|
3006 | * D
|
3007 | */
|
3008 | D: 68,
|
3009 | /**
|
3010 | * E
|
3011 | */
|
3012 | E: 69,
|
3013 | /**
|
3014 | * F
|
3015 | */
|
3016 | F: 70,
|
3017 | /**
|
3018 | * G
|
3019 | */
|
3020 | G: 71,
|
3021 | /**
|
3022 | * H
|
3023 | */
|
3024 | H: 72,
|
3025 | /**
|
3026 | * I
|
3027 | */
|
3028 | I: 73,
|
3029 | /**
|
3030 | * J
|
3031 | */
|
3032 | J: 74,
|
3033 | /**
|
3034 | * K
|
3035 | */
|
3036 | K: 75,
|
3037 | /**
|
3038 | * L
|
3039 | */
|
3040 | L: 76,
|
3041 | /**
|
3042 | * M
|
3043 | */
|
3044 | M: 77,
|
3045 | /**
|
3046 | * N
|
3047 | */
|
3048 | N: 78,
|
3049 | /**
|
3050 | * O
|
3051 | */
|
3052 | O: 79,
|
3053 | /**
|
3054 | * P
|
3055 | */
|
3056 | P: 80,
|
3057 | /**
|
3058 | * Q
|
3059 | */
|
3060 | Q: 81,
|
3061 | /**
|
3062 | * R
|
3063 | */
|
3064 | R: 82,
|
3065 | /**
|
3066 | * S
|
3067 | */
|
3068 | S: 83,
|
3069 | /**
|
3070 | * T
|
3071 | */
|
3072 | T: 84,
|
3073 | /**
|
3074 | * U
|
3075 | */
|
3076 | U: 85,
|
3077 | /**
|
3078 | * V
|
3079 | */
|
3080 | V: 86,
|
3081 | /**
|
3082 | * W
|
3083 | */
|
3084 | W: 87,
|
3085 | /**
|
3086 | * X
|
3087 | */
|
3088 | X: 88,
|
3089 | /**
|
3090 | * Y
|
3091 | */
|
3092 | Y: 89,
|
3093 | /**
|
3094 | * Z
|
3095 | */
|
3096 | Z: 90,
|
3097 | /**
|
3098 | * META
|
3099 | */
|
3100 | META: 91, // WIN_KEY_LEFT
|
3101 | /**
|
3102 | * WIN_KEY_RIGHT
|
3103 | */
|
3104 | WIN_KEY_RIGHT: 92,
|
3105 | /**
|
3106 | * CONTEXT_MENU
|
3107 | */
|
3108 | CONTEXT_MENU: 93,
|
3109 | /**
|
3110 | * NUM_ZERO
|
3111 | */
|
3112 | NUM_ZERO: 96,
|
3113 | /**
|
3114 | * NUM_ONE
|
3115 | */
|
3116 | NUM_ONE: 97,
|
3117 | /**
|
3118 | * NUM_TWO
|
3119 | */
|
3120 | NUM_TWO: 98,
|
3121 | /**
|
3122 | * NUM_THREE
|
3123 | */
|
3124 | NUM_THREE: 99,
|
3125 | /**
|
3126 | * NUM_FOUR
|
3127 | */
|
3128 | NUM_FOUR: 100,
|
3129 | /**
|
3130 | * NUM_FIVE
|
3131 | */
|
3132 | NUM_FIVE: 101,
|
3133 | /**
|
3134 | * NUM_SIX
|
3135 | */
|
3136 | NUM_SIX: 102,
|
3137 | /**
|
3138 | * NUM_SEVEN
|
3139 | */
|
3140 | NUM_SEVEN: 103,
|
3141 | /**
|
3142 | * NUM_EIGHT
|
3143 | */
|
3144 | NUM_EIGHT: 104,
|
3145 | /**
|
3146 | * NUM_NINE
|
3147 | */
|
3148 | NUM_NINE: 105,
|
3149 | /**
|
3150 | * NUM_MULTIPLY
|
3151 | */
|
3152 | NUM_MULTIPLY: 106,
|
3153 | /**
|
3154 | * NUM_PLUS
|
3155 | */
|
3156 | NUM_PLUS: 107,
|
3157 | /**
|
3158 | * NUM_MINUS
|
3159 | */
|
3160 | NUM_MINUS: 109,
|
3161 | /**
|
3162 | * NUM_PERIOD
|
3163 | */
|
3164 | NUM_PERIOD: 110,
|
3165 | /**
|
3166 | * NUM_DIVISION
|
3167 | */
|
3168 | NUM_DIVISION: 111,
|
3169 | /**
|
3170 | * F1
|
3171 | */
|
3172 | F1: 112,
|
3173 | /**
|
3174 | * F2
|
3175 | */
|
3176 | F2: 113,
|
3177 | /**
|
3178 | * F3
|
3179 | */
|
3180 | F3: 114,
|
3181 | /**
|
3182 | * F4
|
3183 | */
|
3184 | F4: 115,
|
3185 | /**
|
3186 | * F5
|
3187 | */
|
3188 | F5: 116,
|
3189 | /**
|
3190 | * F6
|
3191 | */
|
3192 | F6: 117,
|
3193 | /**
|
3194 | * F7
|
3195 | */
|
3196 | F7: 118,
|
3197 | /**
|
3198 | * F8
|
3199 | */
|
3200 | F8: 119,
|
3201 | /**
|
3202 | * F9
|
3203 | */
|
3204 | F9: 120,
|
3205 | /**
|
3206 | * F10
|
3207 | */
|
3208 | F10: 121,
|
3209 | /**
|
3210 | * F11
|
3211 | */
|
3212 | F11: 122,
|
3213 | /**
|
3214 | * F12
|
3215 | */
|
3216 | F12: 123,
|
3217 | /**
|
3218 | * NUMLOCK
|
3219 | */
|
3220 | NUMLOCK: 144,
|
3221 | /**
|
3222 | * SEMICOLON
|
3223 | */
|
3224 | SEMICOLON: 186, // needs localization
|
3225 | /**
|
3226 | * DASH
|
3227 | */
|
3228 | DASH: 189, // needs localization
|
3229 | /**
|
3230 | * EQUALS
|
3231 | */
|
3232 | EQUALS: 187, // needs localization
|
3233 | /**
|
3234 | * COMMA
|
3235 | */
|
3236 | COMMA: 188, // needs localization
|
3237 | /**
|
3238 | * PERIOD
|
3239 | */
|
3240 | PERIOD: 190, // needs localization
|
3241 | /**
|
3242 | * SLASH
|
3243 | */
|
3244 | SLASH: 191, // needs localization
|
3245 | /**
|
3246 | * APOSTROPHE
|
3247 | */
|
3248 | APOSTROPHE: 192, // needs localization
|
3249 | /**
|
3250 | * SINGLE_QUOTE
|
3251 | */
|
3252 | SINGLE_QUOTE: 222, // needs localization
|
3253 | /**
|
3254 | * OPEN_SQUARE_BRACKET
|
3255 | */
|
3256 | OPEN_SQUARE_BRACKET: 219, // needs localization
|
3257 | /**
|
3258 | * BACKSLASH
|
3259 | */
|
3260 | BACKSLASH: 220, // needs localization
|
3261 | /**
|
3262 | * CLOSE_SQUARE_BRACKET
|
3263 | */
|
3264 | CLOSE_SQUARE_BRACKET: 221, // needs localization
|
3265 | /**
|
3266 | * WIN_KEY
|
3267 | */
|
3268 | WIN_KEY: 224,
|
3269 | /**
|
3270 | * MAC_FF_META
|
3271 | */
|
3272 | MAC_FF_META: 224, // Firefox (Gecko) fires this for the meta key instead of 91
|
3273 | /**
|
3274 | * WIN_IME
|
3275 | */
|
3276 | WIN_IME: 229
|
3277 | };
|
3278 |
|
3279 | /*
|
3280 | whether text and modified key is entered at the same time.
|
3281 | */
|
3282 | KeyCode.isTextModifyingKeyEvent = function isTextModifyingKeyEvent(e) {
|
3283 | var keyCode = e.keyCode;
|
3284 | if (e.altKey && !e.ctrlKey || e.metaKey ||
|
3285 | // Function keys don't generate text
|
3286 | keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {
|
3287 | return false;
|
3288 | }
|
3289 |
|
3290 | // The following keys are quite harmless, even in combination with
|
3291 | // CTRL, ALT or SHIFT.
|
3292 | switch (keyCode) {
|
3293 | case KeyCode.ALT:
|
3294 | case KeyCode.CAPS_LOCK:
|
3295 | case KeyCode.CONTEXT_MENU:
|
3296 | case KeyCode.CTRL:
|
3297 | case KeyCode.DOWN:
|
3298 | case KeyCode.END:
|
3299 | case KeyCode.ESC:
|
3300 | case KeyCode.HOME:
|
3301 | case KeyCode.INSERT:
|
3302 | case KeyCode.LEFT:
|
3303 | case KeyCode.MAC_FF_META:
|
3304 | case KeyCode.META:
|
3305 | case KeyCode.NUMLOCK:
|
3306 | case KeyCode.NUM_CENTER:
|
3307 | case KeyCode.PAGE_DOWN:
|
3308 | case KeyCode.PAGE_UP:
|
3309 | case KeyCode.PAUSE:
|
3310 | case KeyCode.PRINT_SCREEN:
|
3311 | case KeyCode.RIGHT:
|
3312 | case KeyCode.SHIFT:
|
3313 | case KeyCode.UP:
|
3314 | case KeyCode.WIN_KEY:
|
3315 | case KeyCode.WIN_KEY_RIGHT:
|
3316 | return false;
|
3317 | default:
|
3318 | return true;
|
3319 | }
|
3320 | };
|
3321 |
|
3322 | /*
|
3323 | whether character is entered.
|
3324 | */
|
3325 | KeyCode.isCharacterKey = function isCharacterKey(keyCode) {
|
3326 | if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {
|
3327 | return true;
|
3328 | }
|
3329 |
|
3330 | if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {
|
3331 | return true;
|
3332 | }
|
3333 |
|
3334 | if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {
|
3335 | return true;
|
3336 | }
|
3337 |
|
3338 | // Safari sends zero key code for non-latin characters.
|
3339 | if (window.navigation.userAgent.indexOf('WebKit') !== -1 && keyCode === 0) {
|
3340 | return true;
|
3341 | }
|
3342 |
|
3343 | switch (keyCode) {
|
3344 | case KeyCode.SPACE:
|
3345 | case KeyCode.QUESTION_MARK:
|
3346 | case KeyCode.NUM_PLUS:
|
3347 | case KeyCode.NUM_MINUS:
|
3348 | case KeyCode.NUM_PERIOD:
|
3349 | case KeyCode.NUM_DIVISION:
|
3350 | case KeyCode.SEMICOLON:
|
3351 | case KeyCode.DASH:
|
3352 | case KeyCode.EQUALS:
|
3353 | case KeyCode.COMMA:
|
3354 | case KeyCode.PERIOD:
|
3355 | case KeyCode.SLASH:
|
3356 | case KeyCode.APOSTROPHE:
|
3357 | case KeyCode.SINGLE_QUOTE:
|
3358 | case KeyCode.OPEN_SQUARE_BRACKET:
|
3359 | case KeyCode.BACKSLASH:
|
3360 | case KeyCode.CLOSE_SQUARE_BRACKET:
|
3361 | return true;
|
3362 | default:
|
3363 | return false;
|
3364 | }
|
3365 | };
|
3366 |
|
3367 | module.exports = KeyCode;
|
3368 |
|
3369 | /***/ },
|
3370 | /* 37 */
|
3371 | /***/ function(module, exports) {
|
3372 |
|
3373 | ;
|
3374 |
|
3375 | exports.__esModule = true;
|
3376 | exports.default = contains;
|
3377 | function contains(root, n) {
|
3378 | var node = n;
|
3379 | while (node) {
|
3380 | if (node === root) {
|
3381 | return true;
|
3382 | }
|
3383 | node = node.parentNode;
|
3384 | }
|
3385 |
|
3386 | return false;
|
3387 | }
|
3388 |
|
3389 | /***/ },
|
3390 | /* 38 */
|
3391 | /***/ function(module, exports, __webpack_require__) {
|
3392 |
|
3393 | ;
|
3394 |
|
3395 | exports.__esModule = true;
|
3396 | exports.default = addEventListenerWrap;
|
3397 |
|
3398 | var _addDomEventListener = __webpack_require__(39);
|
3399 |
|
3400 | var _addDomEventListener2 = _interopRequireDefault(_addDomEventListener);
|
3401 |
|
3402 | var _reactDom = __webpack_require__(11);
|
3403 |
|
3404 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
3405 |
|
3406 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
3407 |
|
3408 | function addEventListenerWrap(target, eventType, cb) {
|
3409 | /* eslint camelcase: 2 */
|
3410 | var callback = _reactDom2.default.unstable_batchedUpdates ? function run(e) {
|
3411 | _reactDom2.default.unstable_batchedUpdates(cb, e);
|
3412 | } : cb;
|
3413 | return (0, _addDomEventListener2.default)(target, eventType, callback);
|
3414 | }
|
3415 |
|
3416 | /***/ },
|
3417 | /* 39 */
|
3418 | /***/ function(module, exports, __webpack_require__) {
|
3419 |
|
3420 | ;
|
3421 |
|
3422 | Object.defineProperty(exports, '__esModule', {
|
3423 | value: true
|
3424 | });
|
3425 | exports['default'] = addEventListener;
|
3426 |
|
3427 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
3428 |
|
3429 | var _EventObject = __webpack_require__(40);
|
3430 |
|
3431 | var _EventObject2 = _interopRequireDefault(_EventObject);
|
3432 |
|
3433 | function addEventListener(target, eventType, callback) {
|
3434 | function wrapCallback(e) {
|
3435 | var ne = new _EventObject2['default'](e);
|
3436 | callback.call(target, ne);
|
3437 | }
|
3438 |
|
3439 | if (target.addEventListener) {
|
3440 | target.addEventListener(eventType, wrapCallback, false);
|
3441 | return {
|
3442 | remove: function remove() {
|
3443 | target.removeEventListener(eventType, wrapCallback, false);
|
3444 | }
|
3445 | };
|
3446 | } else if (target.attachEvent) {
|
3447 | target.attachEvent('on' + eventType, wrapCallback);
|
3448 | return {
|
3449 | remove: function remove() {
|
3450 | target.detachEvent('on' + eventType, wrapCallback);
|
3451 | }
|
3452 | };
|
3453 | }
|
3454 | }
|
3455 |
|
3456 | module.exports = exports['default'];
|
3457 |
|
3458 | /***/ },
|
3459 | /* 40 */
|
3460 | /***/ function(module, exports, __webpack_require__) {
|
3461 |
|
3462 | /**
|
3463 | * @ignore
|
3464 | * event object for dom
|
3465 | * @author yiminghe@gmail.com
|
3466 | */
|
3467 |
|
3468 | ;
|
3469 |
|
3470 | Object.defineProperty(exports, '__esModule', {
|
3471 | value: true
|
3472 | });
|
3473 |
|
3474 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
3475 |
|
3476 | var _EventBaseObject = __webpack_require__(41);
|
3477 |
|
3478 | var _EventBaseObject2 = _interopRequireDefault(_EventBaseObject);
|
3479 |
|
3480 | var _objectAssign = __webpack_require__(42);
|
3481 |
|
3482 | var _objectAssign2 = _interopRequireDefault(_objectAssign);
|
3483 |
|
3484 | var TRUE = true;
|
3485 | var FALSE = false;
|
3486 | var commonProps = ['altKey', 'bubbles', 'cancelable', 'ctrlKey', 'currentTarget', 'eventPhase', 'metaKey', 'shiftKey', 'target', 'timeStamp', 'view', 'type'];
|
3487 |
|
3488 | function isNullOrUndefined(w) {
|
3489 | return w === null || w === undefined;
|
3490 | }
|
3491 |
|
3492 | var eventNormalizers = [{
|
3493 | reg: /^key/,
|
3494 | props: ['char', 'charCode', 'key', 'keyCode', 'which'],
|
3495 | fix: function fix(event, nativeEvent) {
|
3496 | if (isNullOrUndefined(event.which)) {
|
3497 | event.which = !isNullOrUndefined(nativeEvent.charCode) ? nativeEvent.charCode : nativeEvent.keyCode;
|
3498 | }
|
3499 |
|
3500 | // add metaKey to non-Mac browsers (use ctrl for PC 's and Meta for Macs)
|
3501 | if (event.metaKey === undefined) {
|
3502 | event.metaKey = event.ctrlKey;
|
3503 | }
|
3504 | }
|
3505 | }, {
|
3506 | reg: /^touch/,
|
3507 | props: ['touches', 'changedTouches', 'targetTouches']
|
3508 | }, {
|
3509 | reg: /^hashchange$/,
|
3510 | props: ['newURL', 'oldURL']
|
3511 | }, {
|
3512 | reg: /^gesturechange$/i,
|
3513 | props: ['rotation', 'scale']
|
3514 | }, {
|
3515 | reg: /^(mousewheel|DOMMouseScroll)$/,
|
3516 | props: [],
|
3517 | fix: function fix(event, nativeEvent) {
|
3518 | var deltaX = undefined;
|
3519 | var deltaY = undefined;
|
3520 | var delta = undefined;
|
3521 | var wheelDelta = nativeEvent.wheelDelta;
|
3522 | var axis = nativeEvent.axis;
|
3523 | var wheelDeltaY = nativeEvent.wheelDeltaY;
|
3524 | var wheelDeltaX = nativeEvent.wheelDeltaX;
|
3525 | var detail = nativeEvent.detail;
|
3526 |
|
3527 | // ie/webkit
|
3528 | if (wheelDelta) {
|
3529 | delta = wheelDelta / 120;
|
3530 | }
|
3531 |
|
3532 | // gecko
|
3533 | if (detail) {
|
3534 | // press control e.detail == 1 else e.detail == 3
|
3535 | delta = 0 - (detail % 3 === 0 ? detail / 3 : detail);
|
3536 | }
|
3537 |
|
3538 | // Gecko
|
3539 | if (axis !== undefined) {
|
3540 | if (axis === event.HORIZONTAL_AXIS) {
|
3541 | deltaY = 0;
|
3542 | deltaX = 0 - delta;
|
3543 | } else if (axis === event.VERTICAL_AXIS) {
|
3544 | deltaX = 0;
|
3545 | deltaY = delta;
|
3546 | }
|
3547 | }
|
3548 |
|
3549 | // Webkit
|
3550 | if (wheelDeltaY !== undefined) {
|
3551 | deltaY = wheelDeltaY / 120;
|
3552 | }
|
3553 | if (wheelDeltaX !== undefined) {
|
3554 | deltaX = -1 * wheelDeltaX / 120;
|
3555 | }
|
3556 |
|
3557 | // 默认 deltaY (ie)
|
3558 | if (!deltaX && !deltaY) {
|
3559 | deltaY = delta;
|
3560 | }
|
3561 |
|
3562 | if (deltaX !== undefined) {
|
3563 | /**
|
3564 | * deltaX of mousewheel event
|
3565 | * @property deltaX
|
3566 | * @member Event.DomEvent.Object
|
3567 | */
|
3568 | event.deltaX = deltaX;
|
3569 | }
|
3570 |
|
3571 | if (deltaY !== undefined) {
|
3572 | /**
|
3573 | * deltaY of mousewheel event
|
3574 | * @property deltaY
|
3575 | * @member Event.DomEvent.Object
|
3576 | */
|
3577 | event.deltaY = deltaY;
|
3578 | }
|
3579 |
|
3580 | if (delta !== undefined) {
|
3581 | /**
|
3582 | * delta of mousewheel event
|
3583 | * @property delta
|
3584 | * @member Event.DomEvent.Object
|
3585 | */
|
3586 | event.delta = delta;
|
3587 | }
|
3588 | }
|
3589 | }, {
|
3590 | reg: /^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,
|
3591 | props: ['buttons', 'clientX', 'clientY', 'button', 'offsetX', 'relatedTarget', 'which', 'fromElement', 'toElement', 'offsetY', 'pageX', 'pageY', 'screenX', 'screenY'],
|
3592 | fix: function fix(event, nativeEvent) {
|
3593 | var eventDoc = undefined;
|
3594 | var doc = undefined;
|
3595 | var body = undefined;
|
3596 | var target = event.target;
|
3597 | var button = nativeEvent.button;
|
3598 |
|
3599 | // Calculate pageX/Y if missing and clientX/Y available
|
3600 | if (target && isNullOrUndefined(event.pageX) && !isNullOrUndefined(nativeEvent.clientX)) {
|
3601 | eventDoc = target.ownerDocument || document;
|
3602 | doc = eventDoc.documentElement;
|
3603 | body = eventDoc.body;
|
3604 | event.pageX = nativeEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
|
3605 | event.pageY = nativeEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
|
3606 | }
|
3607 |
|
3608 | // which for click: 1 === left; 2 === middle; 3 === right
|
3609 | // do not use button
|
3610 | if (!event.which && button !== undefined) {
|
3611 | if (button & 1) {
|
3612 | event.which = 1;
|
3613 | } else if (button & 2) {
|
3614 | event.which = 3;
|
3615 | } else if (button & 4) {
|
3616 | event.which = 2;
|
3617 | } else {
|
3618 | event.which = 0;
|
3619 | }
|
3620 | }
|
3621 |
|
3622 | // add relatedTarget, if necessary
|
3623 | if (!event.relatedTarget && event.fromElement) {
|
3624 | event.relatedTarget = event.fromElement === target ? event.toElement : event.fromElement;
|
3625 | }
|
3626 |
|
3627 | return event;
|
3628 | }
|
3629 | }];
|
3630 |
|
3631 | function retTrue() {
|
3632 | return TRUE;
|
3633 | }
|
3634 |
|
3635 | function retFalse() {
|
3636 | return FALSE;
|
3637 | }
|
3638 |
|
3639 | function DomEventObject(nativeEvent) {
|
3640 | var type = nativeEvent.type;
|
3641 |
|
3642 | var isNative = typeof nativeEvent.stopPropagation === 'function' || typeof nativeEvent.cancelBubble === 'boolean';
|
3643 |
|
3644 | _EventBaseObject2['default'].call(this);
|
3645 |
|
3646 | this.nativeEvent = nativeEvent;
|
3647 |
|
3648 | // in case dom event has been mark as default prevented by lower dom node
|
3649 | var isDefaultPrevented = retFalse;
|
3650 | if ('defaultPrevented' in nativeEvent) {
|
3651 | isDefaultPrevented = nativeEvent.defaultPrevented ? retTrue : retFalse;
|
3652 | } else if ('getPreventDefault' in nativeEvent) {
|
3653 | // https://bugzilla.mozilla.org/show_bug.cgi?id=691151
|
3654 | isDefaultPrevented = nativeEvent.getPreventDefault() ? retTrue : retFalse;
|
3655 | } else if ('returnValue' in nativeEvent) {
|
3656 | isDefaultPrevented = nativeEvent.returnValue === FALSE ? retTrue : retFalse;
|
3657 | }
|
3658 |
|
3659 | this.isDefaultPrevented = isDefaultPrevented;
|
3660 |
|
3661 | var fixFns = [];
|
3662 | var fixFn = undefined;
|
3663 | var l = undefined;
|
3664 | var prop = undefined;
|
3665 | var props = commonProps.concat();
|
3666 |
|
3667 | eventNormalizers.forEach(function (normalizer) {
|
3668 | if (type.match(normalizer.reg)) {
|
3669 | props = props.concat(normalizer.props);
|
3670 | if (normalizer.fix) {
|
3671 | fixFns.push(normalizer.fix);
|
3672 | }
|
3673 | }
|
3674 | });
|
3675 |
|
3676 | l = props.length;
|
3677 |
|
3678 | // clone properties of the original event object
|
3679 | while (l) {
|
3680 | prop = props[--l];
|
3681 | this[prop] = nativeEvent[prop];
|
3682 | }
|
3683 |
|
3684 | // fix target property, if necessary
|
3685 | if (!this.target && isNative) {
|
3686 | this.target = nativeEvent.srcElement || document; // srcElement might not be defined either
|
3687 | }
|
3688 |
|
3689 | // check if target is a text node (safari)
|
3690 | if (this.target && this.target.nodeType === 3) {
|
3691 | this.target = this.target.parentNode;
|
3692 | }
|
3693 |
|
3694 | l = fixFns.length;
|
3695 |
|
3696 | while (l) {
|
3697 | fixFn = fixFns[--l];
|
3698 | fixFn(this, nativeEvent);
|
3699 | }
|
3700 |
|
3701 | this.timeStamp = nativeEvent.timeStamp || Date.now();
|
3702 | }
|
3703 |
|
3704 | var EventBaseObjectProto = _EventBaseObject2['default'].prototype;
|
3705 |
|
3706 | (0, _objectAssign2['default'])(DomEventObject.prototype, EventBaseObjectProto, {
|
3707 | constructor: DomEventObject,
|
3708 |
|
3709 | preventDefault: function preventDefault() {
|
3710 | var e = this.nativeEvent;
|
3711 |
|
3712 | // if preventDefault exists run it on the original event
|
3713 | if (e.preventDefault) {
|
3714 | e.preventDefault();
|
3715 | } else {
|
3716 | // otherwise set the returnValue property of the original event to FALSE (IE)
|
3717 | e.returnValue = FALSE;
|
3718 | }
|
3719 |
|
3720 | EventBaseObjectProto.preventDefault.call(this);
|
3721 | },
|
3722 |
|
3723 | stopPropagation: function stopPropagation() {
|
3724 | var e = this.nativeEvent;
|
3725 |
|
3726 | // if stopPropagation exists run it on the original event
|
3727 | if (e.stopPropagation) {
|
3728 | e.stopPropagation();
|
3729 | } else {
|
3730 | // otherwise set the cancelBubble property of the original event to TRUE (IE)
|
3731 | e.cancelBubble = TRUE;
|
3732 | }
|
3733 |
|
3734 | EventBaseObjectProto.stopPropagation.call(this);
|
3735 | }
|
3736 | });
|
3737 |
|
3738 | exports['default'] = DomEventObject;
|
3739 | module.exports = exports['default'];
|
3740 |
|
3741 | /***/ },
|
3742 | /* 41 */
|
3743 | /***/ function(module, exports) {
|
3744 |
|
3745 | /**
|
3746 | * @ignore
|
3747 | * base event object for custom and dom event.
|
3748 | * @author yiminghe@gmail.com
|
3749 | */
|
3750 |
|
3751 | ;
|
3752 |
|
3753 | Object.defineProperty(exports, "__esModule", {
|
3754 | value: true
|
3755 | });
|
3756 | function returnFalse() {
|
3757 | return false;
|
3758 | }
|
3759 |
|
3760 | function returnTrue() {
|
3761 | return true;
|
3762 | }
|
3763 |
|
3764 | function EventBaseObject() {
|
3765 | this.timeStamp = Date.now();
|
3766 | this.target = undefined;
|
3767 | this.currentTarget = undefined;
|
3768 | }
|
3769 |
|
3770 | EventBaseObject.prototype = {
|
3771 | isEventObject: 1,
|
3772 |
|
3773 | constructor: EventBaseObject,
|
3774 |
|
3775 | isDefaultPrevented: returnFalse,
|
3776 |
|
3777 | isPropagationStopped: returnFalse,
|
3778 |
|
3779 | isImmediatePropagationStopped: returnFalse,
|
3780 |
|
3781 | preventDefault: function preventDefault() {
|
3782 | this.isDefaultPrevented = returnTrue;
|
3783 | },
|
3784 |
|
3785 | stopPropagation: function stopPropagation() {
|
3786 | this.isPropagationStopped = returnTrue;
|
3787 | },
|
3788 |
|
3789 | stopImmediatePropagation: function stopImmediatePropagation() {
|
3790 | this.isImmediatePropagationStopped = returnTrue;
|
3791 | // fixed 1.2
|
3792 | // call stopPropagation implicitly
|
3793 | this.stopPropagation();
|
3794 | },
|
3795 |
|
3796 | halt: function halt(immediate) {
|
3797 | if (immediate) {
|
3798 | this.stopImmediatePropagation();
|
3799 | } else {
|
3800 | this.stopPropagation();
|
3801 | }
|
3802 | this.preventDefault();
|
3803 | }
|
3804 | };
|
3805 |
|
3806 | exports["default"] = EventBaseObject;
|
3807 | module.exports = exports["default"];
|
3808 |
|
3809 | /***/ },
|
3810 | /* 42 */
|
3811 | /***/ function(module, exports) {
|
3812 |
|
3813 | ;
|
3814 |
|
3815 | function ToObject(val) {
|
3816 | if (val == null) {
|
3817 | throw new TypeError('Object.assign cannot be called with null or undefined');
|
3818 | }
|
3819 |
|
3820 | return Object(val);
|
3821 | }
|
3822 |
|
3823 | module.exports = Object.assign || function (target, source) {
|
3824 | var from;
|
3825 | var keys;
|
3826 | var to = ToObject(target);
|
3827 |
|
3828 | for (var s = 1; s < arguments.length; s++) {
|
3829 | from = arguments[s];
|
3830 | keys = Object.keys(Object(from));
|
3831 |
|
3832 | for (var i = 0; i < keys.length; i++) {
|
3833 | to[keys[i]] = from[keys[i]];
|
3834 | }
|
3835 | }
|
3836 |
|
3837 | return to;
|
3838 | };
|
3839 |
|
3840 |
|
3841 | /***/ },
|
3842 | /* 43 */
|
3843 | /***/ function(module, exports, __webpack_require__) {
|
3844 |
|
3845 | ;
|
3846 |
|
3847 | exports.__esModule = true;
|
3848 |
|
3849 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
3850 |
|
3851 | var _Event = __webpack_require__(44);
|
3852 |
|
3853 | var _Event2 = _interopRequireDefault(_Event);
|
3854 |
|
3855 | var _componentClasses = __webpack_require__(45);
|
3856 |
|
3857 | var _componentClasses2 = _interopRequireDefault(_componentClasses);
|
3858 |
|
3859 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
3860 |
|
3861 | var isCssAnimationSupported = _Event2.default.endEvents.length !== 0;
|
3862 |
|
3863 |
|
3864 | var capitalPrefixes = ['Webkit', 'Moz', 'O',
|
3865 | // ms is special .... !
|
3866 | 'ms'];
|
3867 | var prefixes = ['-webkit-', '-moz-', '-o-', 'ms-', ''];
|
3868 |
|
3869 | function getStyleProperty(node, name) {
|
3870 | var style = window.getComputedStyle(node);
|
3871 |
|
3872 | var ret = '';
|
3873 | for (var i = 0; i < prefixes.length; i++) {
|
3874 | ret = style.getPropertyValue(prefixes[i] + name);
|
3875 | if (ret) {
|
3876 | break;
|
3877 | }
|
3878 | }
|
3879 | return ret;
|
3880 | }
|
3881 |
|
3882 | function fixBrowserByTimeout(node) {
|
3883 | if (isCssAnimationSupported) {
|
3884 | var transitionDelay = parseFloat(getStyleProperty(node, 'transition-delay')) || 0;
|
3885 | var transitionDuration = parseFloat(getStyleProperty(node, 'transition-duration')) || 0;
|
3886 | var animationDelay = parseFloat(getStyleProperty(node, 'animation-delay')) || 0;
|
3887 | var animationDuration = parseFloat(getStyleProperty(node, 'animation-duration')) || 0;
|
3888 | var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);
|
3889 | // sometimes, browser bug
|
3890 | node.rcEndAnimTimeout = setTimeout(function () {
|
3891 | node.rcEndAnimTimeout = null;
|
3892 | if (node.rcEndListener) {
|
3893 | node.rcEndListener();
|
3894 | }
|
3895 | }, time * 1000 + 200);
|
3896 | }
|
3897 | }
|
3898 |
|
3899 | function clearBrowserBugTimeout(node) {
|
3900 | if (node.rcEndAnimTimeout) {
|
3901 | clearTimeout(node.rcEndAnimTimeout);
|
3902 | node.rcEndAnimTimeout = null;
|
3903 | }
|
3904 | }
|
3905 |
|
3906 | var cssAnimation = function cssAnimation(node, transitionName, endCallback) {
|
3907 | var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object';
|
3908 | var className = nameIsObj ? transitionName.name : transitionName;
|
3909 | var activeClassName = nameIsObj ? transitionName.active : transitionName + '-active';
|
3910 | var end = endCallback;
|
3911 | var start = void 0;
|
3912 | var active = void 0;
|
3913 | var nodeClasses = (0, _componentClasses2.default)(node);
|
3914 |
|
3915 | if (endCallback && Object.prototype.toString.call(endCallback) === '[object Object]') {
|
3916 | end = endCallback.end;
|
3917 | start = endCallback.start;
|
3918 | active = endCallback.active;
|
3919 | }
|
3920 |
|
3921 | if (node.rcEndListener) {
|
3922 | node.rcEndListener();
|
3923 | }
|
3924 |
|
3925 | node.rcEndListener = function (e) {
|
3926 | if (e && e.target !== node) {
|
3927 | return;
|
3928 | }
|
3929 |
|
3930 | if (node.rcAnimTimeout) {
|
3931 | clearTimeout(node.rcAnimTimeout);
|
3932 | node.rcAnimTimeout = null;
|
3933 | }
|
3934 |
|
3935 | clearBrowserBugTimeout(node);
|
3936 |
|
3937 | nodeClasses.remove(className);
|
3938 | nodeClasses.remove(activeClassName);
|
3939 |
|
3940 | _Event2.default.removeEndEventListener(node, node.rcEndListener);
|
3941 | node.rcEndListener = null;
|
3942 |
|
3943 | // Usually this optional end is used for informing an owner of
|
3944 | // a leave animation and telling it to remove the child.
|
3945 | if (end) {
|
3946 | end();
|
3947 | }
|
3948 | };
|
3949 |
|
3950 | _Event2.default.addEndEventListener(node, node.rcEndListener);
|
3951 |
|
3952 | if (start) {
|
3953 | start();
|
3954 | }
|
3955 | nodeClasses.add(className);
|
3956 |
|
3957 | node.rcAnimTimeout = setTimeout(function () {
|
3958 | node.rcAnimTimeout = null;
|
3959 | nodeClasses.add(activeClassName);
|
3960 | if (active) {
|
3961 | setTimeout(active, 0);
|
3962 | }
|
3963 | fixBrowserByTimeout(node);
|
3964 | // 30ms for firefox
|
3965 | }, 30);
|
3966 |
|
3967 | return {
|
3968 | stop: function stop() {
|
3969 | if (node.rcEndListener) {
|
3970 | node.rcEndListener();
|
3971 | }
|
3972 | }
|
3973 | };
|
3974 | };
|
3975 |
|
3976 | cssAnimation.style = function (node, style, callback) {
|
3977 | if (node.rcEndListener) {
|
3978 | node.rcEndListener();
|
3979 | }
|
3980 |
|
3981 | node.rcEndListener = function (e) {
|
3982 | if (e && e.target !== node) {
|
3983 | return;
|
3984 | }
|
3985 |
|
3986 | if (node.rcAnimTimeout) {
|
3987 | clearTimeout(node.rcAnimTimeout);
|
3988 | node.rcAnimTimeout = null;
|
3989 | }
|
3990 |
|
3991 | clearBrowserBugTimeout(node);
|
3992 |
|
3993 | _Event2.default.removeEndEventListener(node, node.rcEndListener);
|
3994 | node.rcEndListener = null;
|
3995 |
|
3996 | // Usually this optional callback is used for informing an owner of
|
3997 | // a leave animation and telling it to remove the child.
|
3998 | if (callback) {
|
3999 | callback();
|
4000 | }
|
4001 | };
|
4002 |
|
4003 | _Event2.default.addEndEventListener(node, node.rcEndListener);
|
4004 |
|
4005 | node.rcAnimTimeout = setTimeout(function () {
|
4006 | for (var s in style) {
|
4007 | if (style.hasOwnProperty(s)) {
|
4008 | node.style[s] = style[s];
|
4009 | }
|
4010 | }
|
4011 | node.rcAnimTimeout = null;
|
4012 | fixBrowserByTimeout(node);
|
4013 | }, 0);
|
4014 | };
|
4015 |
|
4016 | cssAnimation.setTransition = function (node, p, value) {
|
4017 | var property = p;
|
4018 | var v = value;
|
4019 | if (value === undefined) {
|
4020 | v = property;
|
4021 | property = '';
|
4022 | }
|
4023 | property = property || '';
|
4024 | capitalPrefixes.forEach(function (prefix) {
|
4025 | node.style[prefix + 'Transition' + property] = v;
|
4026 | });
|
4027 | };
|
4028 |
|
4029 | cssAnimation.isCssAnimationSupported = isCssAnimationSupported;
|
4030 |
|
4031 | exports.default = cssAnimation;
|
4032 |
|
4033 | /***/ },
|
4034 | /* 44 */
|
4035 | /***/ function(module, exports) {
|
4036 |
|
4037 | ;
|
4038 |
|
4039 | exports.__esModule = true;
|
4040 | var EVENT_NAME_MAP = {
|
4041 | transitionend: {
|
4042 | transition: 'transitionend',
|
4043 | WebkitTransition: 'webkitTransitionEnd',
|
4044 | MozTransition: 'mozTransitionEnd',
|
4045 | OTransition: 'oTransitionEnd',
|
4046 | msTransition: 'MSTransitionEnd'
|
4047 | },
|
4048 |
|
4049 | animationend: {
|
4050 | animation: 'animationend',
|
4051 | WebkitAnimation: 'webkitAnimationEnd',
|
4052 | MozAnimation: 'mozAnimationEnd',
|
4053 | OAnimation: 'oAnimationEnd',
|
4054 | msAnimation: 'MSAnimationEnd'
|
4055 | }
|
4056 | };
|
4057 |
|
4058 | var endEvents = [];
|
4059 |
|
4060 | function detectEvents() {
|
4061 | var testEl = document.createElement('div');
|
4062 | var style = testEl.style;
|
4063 |
|
4064 | if (!('AnimationEvent' in window)) {
|
4065 | delete EVENT_NAME_MAP.animationend.animation;
|
4066 | }
|
4067 |
|
4068 | if (!('TransitionEvent' in window)) {
|
4069 | delete EVENT_NAME_MAP.transitionend.transition;
|
4070 | }
|
4071 |
|
4072 | for (var baseEventName in EVENT_NAME_MAP) {
|
4073 | if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {
|
4074 | var baseEvents = EVENT_NAME_MAP[baseEventName];
|
4075 | for (var styleName in baseEvents) {
|
4076 | if (styleName in style) {
|
4077 | endEvents.push(baseEvents[styleName]);
|
4078 | break;
|
4079 | }
|
4080 | }
|
4081 | }
|
4082 | }
|
4083 | }
|
4084 |
|
4085 | if (typeof window !== 'undefined' && typeof document !== 'undefined') {
|
4086 | detectEvents();
|
4087 | }
|
4088 |
|
4089 | function addEventListener(node, eventName, eventListener) {
|
4090 | node.addEventListener(eventName, eventListener, false);
|
4091 | }
|
4092 |
|
4093 | function removeEventListener(node, eventName, eventListener) {
|
4094 | node.removeEventListener(eventName, eventListener, false);
|
4095 | }
|
4096 |
|
4097 | var TransitionEvents = {
|
4098 | addEndEventListener: function addEndEventListener(node, eventListener) {
|
4099 | if (endEvents.length === 0) {
|
4100 | window.setTimeout(eventListener, 0);
|
4101 | return;
|
4102 | }
|
4103 | endEvents.forEach(function (endEvent) {
|
4104 | addEventListener(node, endEvent, eventListener);
|
4105 | });
|
4106 | },
|
4107 |
|
4108 |
|
4109 | endEvents: endEvents,
|
4110 |
|
4111 | removeEndEventListener: function removeEndEventListener(node, eventListener) {
|
4112 | if (endEvents.length === 0) {
|
4113 | return;
|
4114 | }
|
4115 | endEvents.forEach(function (endEvent) {
|
4116 | removeEventListener(node, endEvent, eventListener);
|
4117 | });
|
4118 | }
|
4119 | };
|
4120 |
|
4121 | exports.default = TransitionEvents;
|
4122 |
|
4123 | /***/ },
|
4124 | /* 45 */
|
4125 | /***/ function(module, exports, __webpack_require__) {
|
4126 |
|
4127 | /**
|
4128 | * Module dependencies.
|
4129 | */
|
4130 |
|
4131 | try {
|
4132 | var index = __webpack_require__(46);
|
4133 | } catch (err) {
|
4134 | var index = __webpack_require__(46);
|
4135 | }
|
4136 |
|
4137 | /**
|
4138 | * Whitespace regexp.
|
4139 | */
|
4140 |
|
4141 | var re = /\s+/;
|
4142 |
|
4143 | /**
|
4144 | * toString reference.
|
4145 | */
|
4146 |
|
4147 | var toString = Object.prototype.toString;
|
4148 |
|
4149 | /**
|
4150 | * Wrap `el` in a `ClassList`.
|
4151 | *
|
4152 | * @param {Element} el
|
4153 | * @return {ClassList}
|
4154 | * @api public
|
4155 | */
|
4156 |
|
4157 | module.exports = function(el){
|
4158 | return new ClassList(el);
|
4159 | };
|
4160 |
|
4161 | /**
|
4162 | * Initialize a new ClassList for `el`.
|
4163 | *
|
4164 | * @param {Element} el
|
4165 | * @api private
|
4166 | */
|
4167 |
|
4168 | function ClassList(el) {
|
4169 | if (!el || !el.nodeType) {
|
4170 | throw new Error('A DOM element reference is required');
|
4171 | }
|
4172 | this.el = el;
|
4173 | this.list = el.classList;
|
4174 | }
|
4175 |
|
4176 | /**
|
4177 | * Add class `name` if not already present.
|
4178 | *
|
4179 | * @param {String} name
|
4180 | * @return {ClassList}
|
4181 | * @api public
|
4182 | */
|
4183 |
|
4184 | ClassList.prototype.add = function(name){
|
4185 | // classList
|
4186 | if (this.list) {
|
4187 | this.list.add(name);
|
4188 | return this;
|
4189 | }
|
4190 |
|
4191 | // fallback
|
4192 | var arr = this.array();
|
4193 | var i = index(arr, name);
|
4194 | if (!~i) arr.push(name);
|
4195 | this.el.className = arr.join(' ');
|
4196 | return this;
|
4197 | };
|
4198 |
|
4199 | /**
|
4200 | * Remove class `name` when present, or
|
4201 | * pass a regular expression to remove
|
4202 | * any which match.
|
4203 | *
|
4204 | * @param {String|RegExp} name
|
4205 | * @return {ClassList}
|
4206 | * @api public
|
4207 | */
|
4208 |
|
4209 | ClassList.prototype.remove = function(name){
|
4210 | if ('[object RegExp]' == toString.call(name)) {
|
4211 | return this.removeMatching(name);
|
4212 | }
|
4213 |
|
4214 | // classList
|
4215 | if (this.list) {
|
4216 | this.list.remove(name);
|
4217 | return this;
|
4218 | }
|
4219 |
|
4220 | // fallback
|
4221 | var arr = this.array();
|
4222 | var i = index(arr, name);
|
4223 | if (~i) arr.splice(i, 1);
|
4224 | this.el.className = arr.join(' ');
|
4225 | return this;
|
4226 | };
|
4227 |
|
4228 | /**
|
4229 | * Remove all classes matching `re`.
|
4230 | *
|
4231 | * @param {RegExp} re
|
4232 | * @return {ClassList}
|
4233 | * @api private
|
4234 | */
|
4235 |
|
4236 | ClassList.prototype.removeMatching = function(re){
|
4237 | var arr = this.array();
|
4238 | for (var i = 0; i < arr.length; i++) {
|
4239 | if (re.test(arr[i])) {
|
4240 | this.remove(arr[i]);
|
4241 | }
|
4242 | }
|
4243 | return this;
|
4244 | };
|
4245 |
|
4246 | /**
|
4247 | * Toggle class `name`, can force state via `force`.
|
4248 | *
|
4249 | * For browsers that support classList, but do not support `force` yet,
|
4250 | * the mistake will be detected and corrected.
|
4251 | *
|
4252 | * @param {String} name
|
4253 | * @param {Boolean} force
|
4254 | * @return {ClassList}
|
4255 | * @api public
|
4256 | */
|
4257 |
|
4258 | ClassList.prototype.toggle = function(name, force){
|
4259 | // classList
|
4260 | if (this.list) {
|
4261 | if ("undefined" !== typeof force) {
|
4262 | if (force !== this.list.toggle(name, force)) {
|
4263 | this.list.toggle(name); // toggle again to correct
|
4264 | }
|
4265 | } else {
|
4266 | this.list.toggle(name);
|
4267 | }
|
4268 | return this;
|
4269 | }
|
4270 |
|
4271 | // fallback
|
4272 | if ("undefined" !== typeof force) {
|
4273 | if (!force) {
|
4274 | this.remove(name);
|
4275 | } else {
|
4276 | this.add(name);
|
4277 | }
|
4278 | } else {
|
4279 | if (this.has(name)) {
|
4280 | this.remove(name);
|
4281 | } else {
|
4282 | this.add(name);
|
4283 | }
|
4284 | }
|
4285 |
|
4286 | return this;
|
4287 | };
|
4288 |
|
4289 | /**
|
4290 | * Return an array of classes.
|
4291 | *
|
4292 | * @return {Array}
|
4293 | * @api public
|
4294 | */
|
4295 |
|
4296 | ClassList.prototype.array = function(){
|
4297 | var className = this.el.getAttribute('class') || '';
|
4298 | var str = className.replace(/^\s+|\s+$/g, '');
|
4299 | var arr = str.split(re);
|
4300 | if ('' === arr[0]) arr.shift();
|
4301 | return arr;
|
4302 | };
|
4303 |
|
4304 | /**
|
4305 | * Check if class `name` is present.
|
4306 | *
|
4307 | * @param {String} name
|
4308 | * @return {ClassList}
|
4309 | * @api public
|
4310 | */
|
4311 |
|
4312 | ClassList.prototype.has =
|
4313 | ClassList.prototype.contains = function(name){
|
4314 | return this.list
|
4315 | ? this.list.contains(name)
|
4316 | : !! ~index(this.array(), name);
|
4317 | };
|
4318 |
|
4319 |
|
4320 | /***/ },
|
4321 | /* 46 */
|
4322 | /***/ function(module, exports) {
|
4323 |
|
4324 | module.exports = function(arr, obj){
|
4325 | if (arr.indexOf) return arr.indexOf(obj);
|
4326 | for (var i = 0; i < arr.length; ++i) {
|
4327 | if (arr[i] === obj) return i;
|
4328 | }
|
4329 | return -1;
|
4330 | };
|
4331 |
|
4332 | /***/ },
|
4333 | /* 47 */
|
4334 | /***/ function(module, exports, __webpack_require__) {
|
4335 |
|
4336 | ;
|
4337 |
|
4338 | exports.__esModule = true;
|
4339 | exports.default = toArray;
|
4340 |
|
4341 | var _react = __webpack_require__(4);
|
4342 |
|
4343 | var _react2 = _interopRequireDefault(_react);
|
4344 |
|
4345 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
4346 |
|
4347 | function toArray(children) {
|
4348 | var ret = [];
|
4349 | _react2.default.Children.forEach(children, function (c) {
|
4350 | ret.push(c);
|
4351 | });
|
4352 | return ret;
|
4353 | }
|
4354 |
|
4355 | /***/ },
|
4356 | /* 48 */
|
4357 | /***/ function(module, exports, __webpack_require__) {
|
4358 |
|
4359 | ;
|
4360 |
|
4361 | exports.__esModule = true;
|
4362 |
|
4363 | var _react = __webpack_require__(4);
|
4364 |
|
4365 | var _react2 = _interopRequireDefault(_react);
|
4366 |
|
4367 | var _reactDom = __webpack_require__(11);
|
4368 |
|
4369 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
4370 |
|
4371 | var _domAlign = __webpack_require__(49);
|
4372 |
|
4373 | var _domAlign2 = _interopRequireDefault(_domAlign);
|
4374 |
|
4375 | var _addEventListener = __webpack_require__(38);
|
4376 |
|
4377 | var _addEventListener2 = _interopRequireDefault(_addEventListener);
|
4378 |
|
4379 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
4380 |
|
4381 | //import isWindow from './isWindow';
|
4382 |
|
4383 | function isWindow(obj) {
|
4384 | /* eslint no-eq-null: 0 */
|
4385 | /* eslint eqeqeq: 0 */
|
4386 | return obj != null && obj == obj.window;
|
4387 | }
|
4388 |
|
4389 | function buffer(fn, ms) {
|
4390 | var timer = void 0;
|
4391 |
|
4392 | function clear() {
|
4393 | if (timer) {
|
4394 | clearTimeout(timer);
|
4395 | timer = null;
|
4396 | }
|
4397 | }
|
4398 |
|
4399 | function bufferFn() {
|
4400 | clear();
|
4401 | timer = setTimeout(fn, ms);
|
4402 | }
|
4403 |
|
4404 | bufferFn.clear = clear;
|
4405 |
|
4406 | return bufferFn;
|
4407 | }
|
4408 |
|
4409 | var Align = _react2.default.createClass({
|
4410 | propTypes: {
|
4411 | childrenProps: _react.PropTypes.object,
|
4412 | align: _react.PropTypes.object.isRequired,
|
4413 | target: _react.PropTypes.func,
|
4414 | onAlign: _react.PropTypes.func,
|
4415 | monitorBufferTime: _react.PropTypes.number,
|
4416 | monitorWindowResize: _react.PropTypes.bool,
|
4417 | disabled: _react.PropTypes.bool,
|
4418 | children: _react.PropTypes.any
|
4419 | },
|
4420 |
|
4421 | getDefaultProps: function getDefaultProps() {
|
4422 | return {
|
4423 | target: function target() {
|
4424 | return window;
|
4425 | },
|
4426 | onAlign: function onAlign() {},
|
4427 |
|
4428 | monitorBufferTime: 50,
|
4429 | monitorWindowResize: false,
|
4430 | disabled: false
|
4431 | };
|
4432 | },
|
4433 | componentDidMount: function componentDidMount() {
|
4434 | var props = this.props;
|
4435 | // if parent ref not attached .... use document.getElementById
|
4436 | this.forceAlign();
|
4437 | if (!props.disabled && props.monitorWindowResize) {
|
4438 | this.startMonitorWindowResize();
|
4439 | }
|
4440 | },
|
4441 | componentDidUpdate: function componentDidUpdate(prevProps) {
|
4442 | var reAlign = false;
|
4443 | var props = this.props;
|
4444 |
|
4445 | if (!props.disabled) {
|
4446 | if (prevProps.disabled || prevProps.align !== props.align) {
|
4447 | reAlign = true;
|
4448 | } else {
|
4449 | var lastTarget = prevProps.target();
|
4450 | var currentTarget = props.target();
|
4451 | if (isWindow(lastTarget) && isWindow(currentTarget)) {
|
4452 | reAlign = false;
|
4453 | } else if (lastTarget !== currentTarget) {
|
4454 | reAlign = true;
|
4455 | }
|
4456 | }
|
4457 | }
|
4458 |
|
4459 | if (reAlign) {
|
4460 | this.forceAlign();
|
4461 | }
|
4462 |
|
4463 | if (props.monitorWindowResize && !props.disabled) {
|
4464 | this.startMonitorWindowResize();
|
4465 | } else {
|
4466 | this.stopMonitorWindowResize();
|
4467 | }
|
4468 | },
|
4469 | componentWillUnmount: function componentWillUnmount() {
|
4470 | this.stopMonitorWindowResize();
|
4471 | },
|
4472 | startMonitorWindowResize: function startMonitorWindowResize() {
|
4473 | if (!this.resizeHandler) {
|
4474 | this.bufferMonitor = buffer(this.forceAlign, this.props.monitorBufferTime);
|
4475 | this.resizeHandler = (0, _addEventListener2.default)(window, 'resize', this.bufferMonitor);
|
4476 | }
|
4477 | },
|
4478 | stopMonitorWindowResize: function stopMonitorWindowResize() {
|
4479 | if (this.resizeHandler) {
|
4480 | this.bufferMonitor.clear();
|
4481 | this.resizeHandler.remove();
|
4482 | this.resizeHandler = null;
|
4483 | }
|
4484 | },
|
4485 | forceAlign: function forceAlign() {
|
4486 | var props = this.props;
|
4487 | if (!props.disabled) {
|
4488 | var source = _reactDom2.default.findDOMNode(this);
|
4489 | props.onAlign(source, (0, _domAlign2.default)(source, props.target(), props.align));
|
4490 | }
|
4491 | },
|
4492 | render: function render() {
|
4493 | var _props = this.props,
|
4494 | childrenProps = _props.childrenProps,
|
4495 | children = _props.children;
|
4496 |
|
4497 | var child = _react2.default.Children.only(children);
|
4498 | if (childrenProps) {
|
4499 | var newProps = {};
|
4500 | for (var prop in childrenProps) {
|
4501 | if (childrenProps.hasOwnProperty(prop)) {
|
4502 | newProps[prop] = this.props[childrenProps[prop]];
|
4503 | }
|
4504 | }
|
4505 | return _react2.default.cloneElement(child, newProps);
|
4506 | }
|
4507 | return child;
|
4508 | }
|
4509 | });
|
4510 |
|
4511 | exports.default = Align;
|
4512 |
|
4513 | /***/ },
|
4514 | /* 49 */
|
4515 | /***/ function(module, exports, __webpack_require__) {
|
4516 |
|
4517 | ;
|
4518 |
|
4519 | Object.defineProperty(exports, "__esModule", {
|
4520 | value: true
|
4521 | });
|
4522 |
|
4523 | var _utils = __webpack_require__(50);
|
4524 |
|
4525 | var _utils2 = _interopRequireDefault(_utils);
|
4526 |
|
4527 | var _getOffsetParent = __webpack_require__(52);
|
4528 |
|
4529 | var _getOffsetParent2 = _interopRequireDefault(_getOffsetParent);
|
4530 |
|
4531 | var _getVisibleRectForElement = __webpack_require__(53);
|
4532 |
|
4533 | var _getVisibleRectForElement2 = _interopRequireDefault(_getVisibleRectForElement);
|
4534 |
|
4535 | var _adjustForViewport = __webpack_require__(54);
|
4536 |
|
4537 | var _adjustForViewport2 = _interopRequireDefault(_adjustForViewport);
|
4538 |
|
4539 | var _getRegion = __webpack_require__(55);
|
4540 |
|
4541 | var _getRegion2 = _interopRequireDefault(_getRegion);
|
4542 |
|
4543 | var _getElFuturePos = __webpack_require__(56);
|
4544 |
|
4545 | var _getElFuturePos2 = _interopRequireDefault(_getElFuturePos);
|
4546 |
|
4547 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
4548 |
|
4549 | // http://yiminghe.iteye.com/blog/1124720
|
4550 |
|
4551 | /**
|
4552 | * align dom node flexibly
|
4553 | * @author yiminghe@gmail.com
|
4554 | */
|
4555 |
|
4556 | function isFailX(elFuturePos, elRegion, visibleRect) {
|
4557 | return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;
|
4558 | }
|
4559 |
|
4560 | function isFailY(elFuturePos, elRegion, visibleRect) {
|
4561 | return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;
|
4562 | }
|
4563 |
|
4564 | function isCompleteFailX(elFuturePos, elRegion, visibleRect) {
|
4565 | return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;
|
4566 | }
|
4567 |
|
4568 | function isCompleteFailY(elFuturePos, elRegion, visibleRect) {
|
4569 | return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;
|
4570 | }
|
4571 |
|
4572 | function flip(points, reg, map) {
|
4573 | var ret = [];
|
4574 | _utils2["default"].each(points, function (p) {
|
4575 | ret.push(p.replace(reg, function (m) {
|
4576 | return map[m];
|
4577 | }));
|
4578 | });
|
4579 | return ret;
|
4580 | }
|
4581 |
|
4582 | function flipOffset(offset, index) {
|
4583 | offset[index] = -offset[index];
|
4584 | return offset;
|
4585 | }
|
4586 |
|
4587 | function convertOffset(str, offsetLen) {
|
4588 | var n = void 0;
|
4589 | if (/%$/.test(str)) {
|
4590 | n = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;
|
4591 | } else {
|
4592 | n = parseInt(str, 10);
|
4593 | }
|
4594 | return n || 0;
|
4595 | }
|
4596 |
|
4597 | function normalizeOffset(offset, el) {
|
4598 | offset[0] = convertOffset(offset[0], el.width);
|
4599 | offset[1] = convertOffset(offset[1], el.height);
|
4600 | }
|
4601 |
|
4602 | function domAlign(el, refNode, align) {
|
4603 | var points = align.points;
|
4604 | var offset = align.offset || [0, 0];
|
4605 | var targetOffset = align.targetOffset || [0, 0];
|
4606 | var overflow = align.overflow;
|
4607 | var target = align.target || refNode;
|
4608 | var source = align.source || el;
|
4609 | offset = [].concat(offset);
|
4610 | targetOffset = [].concat(targetOffset);
|
4611 | overflow = overflow || {};
|
4612 | var newOverflowCfg = {};
|
4613 |
|
4614 | var fail = 0;
|
4615 | // 当前节点可以被放置的显示区域
|
4616 | var visibleRect = (0, _getVisibleRectForElement2["default"])(source);
|
4617 | // 当前节点所占的区域, left/top/width/height
|
4618 | var elRegion = (0, _getRegion2["default"])(source);
|
4619 | // 参照节点所占的区域, left/top/width/height
|
4620 | var refNodeRegion = (0, _getRegion2["default"])(target);
|
4621 | // 将 offset 转换成数值,支持百分比
|
4622 | normalizeOffset(offset, elRegion);
|
4623 | normalizeOffset(targetOffset, refNodeRegion);
|
4624 | // 当前节点将要被放置的位置
|
4625 | var elFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, points, offset, targetOffset);
|
4626 | // 当前节点将要所处的区域
|
4627 | var newElRegion = _utils2["default"].merge(elRegion, elFuturePos);
|
4628 |
|
4629 | // 如果可视区域不能完全放置当前节点时允许调整
|
4630 | if (visibleRect && (overflow.adjustX || overflow.adjustY)) {
|
4631 | if (overflow.adjustX) {
|
4632 | // 如果横向不能放下
|
4633 | if (isFailX(elFuturePos, elRegion, visibleRect)) {
|
4634 | // 对齐位置反下
|
4635 | var newPoints = flip(points, /[lr]/ig, {
|
4636 | l: 'r',
|
4637 | r: 'l'
|
4638 | });
|
4639 | // 偏移量也反下
|
4640 | var newOffset = flipOffset(offset, 0);
|
4641 | var newTargetOffset = flipOffset(targetOffset, 0);
|
4642 | var newElFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, newPoints, newOffset, newTargetOffset);
|
4643 | if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {
|
4644 | fail = 1;
|
4645 | points = newPoints;
|
4646 | offset = newOffset;
|
4647 | targetOffset = newTargetOffset;
|
4648 | }
|
4649 | }
|
4650 | }
|
4651 |
|
4652 | if (overflow.adjustY) {
|
4653 | // 如果纵向不能放下
|
4654 | if (isFailY(elFuturePos, elRegion, visibleRect)) {
|
4655 | // 对齐位置反下
|
4656 | var _newPoints = flip(points, /[tb]/ig, {
|
4657 | t: 'b',
|
4658 | b: 't'
|
4659 | });
|
4660 | // 偏移量也反下
|
4661 | var _newOffset = flipOffset(offset, 1);
|
4662 | var _newTargetOffset = flipOffset(targetOffset, 1);
|
4663 | var _newElFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, _newPoints, _newOffset, _newTargetOffset);
|
4664 | if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {
|
4665 | fail = 1;
|
4666 | points = _newPoints;
|
4667 | offset = _newOffset;
|
4668 | targetOffset = _newTargetOffset;
|
4669 | }
|
4670 | }
|
4671 | }
|
4672 |
|
4673 | // 如果失败,重新计算当前节点将要被放置的位置
|
4674 | if (fail) {
|
4675 | elFuturePos = (0, _getElFuturePos2["default"])(elRegion, refNodeRegion, points, offset, targetOffset);
|
4676 | _utils2["default"].mix(newElRegion, elFuturePos);
|
4677 | }
|
4678 |
|
4679 | // 检查反下后的位置是否可以放下了
|
4680 | // 如果仍然放不下只有指定了可以调整当前方向才调整
|
4681 | newOverflowCfg.adjustX = overflow.adjustX && isFailX(elFuturePos, elRegion, visibleRect);
|
4682 |
|
4683 | newOverflowCfg.adjustY = overflow.adjustY && isFailY(elFuturePos, elRegion, visibleRect);
|
4684 |
|
4685 | // 确实要调整,甚至可能会调整高度宽度
|
4686 | if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {
|
4687 | newElRegion = (0, _adjustForViewport2["default"])(elFuturePos, elRegion, visibleRect, newOverflowCfg);
|
4688 | }
|
4689 | }
|
4690 |
|
4691 | // need judge to in case set fixed with in css on height auto element
|
4692 | if (newElRegion.width !== elRegion.width) {
|
4693 | _utils2["default"].css(source, 'width', _utils2["default"].width(source) + newElRegion.width - elRegion.width);
|
4694 | }
|
4695 |
|
4696 | if (newElRegion.height !== elRegion.height) {
|
4697 | _utils2["default"].css(source, 'height', _utils2["default"].height(source) + newElRegion.height - elRegion.height);
|
4698 | }
|
4699 |
|
4700 | // https://github.com/kissyteam/kissy/issues/190
|
4701 | // 相对于屏幕位置没变,而 left/top 变了
|
4702 | // 例如 <div 'relative'><el absolute></div>
|
4703 | _utils2["default"].offset(source, {
|
4704 | left: newElRegion.left,
|
4705 | top: newElRegion.top
|
4706 | }, {
|
4707 | useCssRight: align.useCssRight,
|
4708 | useCssBottom: align.useCssBottom,
|
4709 | useCssTransform: align.useCssTransform
|
4710 | });
|
4711 |
|
4712 | return {
|
4713 | points: points,
|
4714 | offset: offset,
|
4715 | targetOffset: targetOffset,
|
4716 | overflow: newOverflowCfg
|
4717 | };
|
4718 | }
|
4719 |
|
4720 | domAlign.__getOffsetParent = _getOffsetParent2["default"];
|
4721 |
|
4722 | domAlign.__getVisibleRectForElement = _getVisibleRectForElement2["default"];
|
4723 |
|
4724 | exports["default"] = domAlign;
|
4725 | /**
|
4726 | * 2012-04-26 yiminghe@gmail.com
|
4727 | * - 优化智能对齐算法
|
4728 | * - 慎用 resizeXX
|
4729 | *
|
4730 | * 2011-07-13 yiminghe@gmail.com note:
|
4731 | * - 增加智能对齐,以及大小调整选项
|
4732 | **/
|
4733 |
|
4734 | module.exports = exports['default'];
|
4735 |
|
4736 | /***/ },
|
4737 | /* 50 */
|
4738 | /***/ function(module, exports, __webpack_require__) {
|
4739 |
|
4740 | ;
|
4741 |
|
4742 | Object.defineProperty(exports, "__esModule", {
|
4743 | value: true
|
4744 | });
|
4745 |
|
4746 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
|
4747 |
|
4748 | var _propertyUtils = __webpack_require__(51);
|
4749 |
|
4750 | var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source;
|
4751 |
|
4752 | var getComputedStyleX = void 0;
|
4753 |
|
4754 | function force(x, y) {
|
4755 | return x + y;
|
4756 | }
|
4757 |
|
4758 | function css(el, name, v) {
|
4759 | var value = v;
|
4760 | if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {
|
4761 | for (var i in name) {
|
4762 | if (name.hasOwnProperty(i)) {
|
4763 | css(el, i, name[i]);
|
4764 | }
|
4765 | }
|
4766 | return undefined;
|
4767 | }
|
4768 | if (typeof value !== 'undefined') {
|
4769 | if (typeof value === 'number') {
|
4770 | value = value + 'px';
|
4771 | }
|
4772 | el.style[name] = value;
|
4773 | return undefined;
|
4774 | }
|
4775 | return getComputedStyleX(el, name);
|
4776 | }
|
4777 |
|
4778 | function getClientPosition(elem) {
|
4779 | var box = void 0;
|
4780 | var x = void 0;
|
4781 | var y = void 0;
|
4782 | var doc = elem.ownerDocument;
|
4783 | var body = doc.body;
|
4784 | var docElem = doc && doc.documentElement;
|
4785 | // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式
|
4786 | box = elem.getBoundingClientRect();
|
4787 |
|
4788 | // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop
|
4789 | // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确
|
4790 | // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin
|
4791 |
|
4792 | x = box.left;
|
4793 | y = box.top;
|
4794 |
|
4795 | // In IE, most of the time, 2 extra pixels are added to the top and left
|
4796 | // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and
|
4797 | // IE6 standards mode, this border can be overridden by setting the
|
4798 | // document element's border to zero -- thus, we cannot rely on the
|
4799 | // offset always being 2 pixels.
|
4800 |
|
4801 | // In quirks mode, the offset can be determined by querying the body's
|
4802 | // clientLeft/clientTop, but in standards mode, it is found by querying
|
4803 | // the document element's clientLeft/clientTop. Since we already called
|
4804 | // getClientBoundingRect we have already forced a reflow, so it is not
|
4805 | // too expensive just to query them all.
|
4806 |
|
4807 | // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的
|
4808 | // 窗口边框标准是设 documentElement ,quirks 时设置 body
|
4809 | // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去
|
4810 | // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置
|
4811 | // 标准 ie 下 docElem.clientTop 就是 border-top
|
4812 | // ie7 html 即窗口边框改变不了。永远为 2
|
4813 | // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0
|
4814 |
|
4815 | x -= docElem.clientLeft || body.clientLeft || 0;
|
4816 | y -= docElem.clientTop || body.clientTop || 0;
|
4817 |
|
4818 | return {
|
4819 | left: x,
|
4820 | top: y
|
4821 | };
|
4822 | }
|
4823 |
|
4824 | function getScroll(w, top) {
|
4825 | var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];
|
4826 | var method = 'scroll' + (top ? 'Top' : 'Left');
|
4827 | if (typeof ret !== 'number') {
|
4828 | var d = w.document;
|
4829 | // ie6,7,8 standard mode
|
4830 | ret = d.documentElement[method];
|
4831 | if (typeof ret !== 'number') {
|
4832 | // quirks mode
|
4833 | ret = d.body[method];
|
4834 | }
|
4835 | }
|
4836 | return ret;
|
4837 | }
|
4838 |
|
4839 | function getScrollLeft(w) {
|
4840 | return getScroll(w);
|
4841 | }
|
4842 |
|
4843 | function getScrollTop(w) {
|
4844 | return getScroll(w, true);
|
4845 | }
|
4846 |
|
4847 | function getOffset(el) {
|
4848 | var pos = getClientPosition(el);
|
4849 | var doc = el.ownerDocument;
|
4850 | var w = doc.defaultView || doc.parentWindow;
|
4851 | pos.left += getScrollLeft(w);
|
4852 | pos.top += getScrollTop(w);
|
4853 | return pos;
|
4854 | }
|
4855 | function _getComputedStyle(elem, name, cs) {
|
4856 | var computedStyle = cs;
|
4857 | var val = '';
|
4858 | var d = elem.ownerDocument;
|
4859 | computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null);
|
4860 |
|
4861 | // https://github.com/kissyteam/kissy/issues/61
|
4862 | if (computedStyle) {
|
4863 | val = computedStyle.getPropertyValue(name) || computedStyle[name];
|
4864 | }
|
4865 |
|
4866 | return val;
|
4867 | }
|
4868 |
|
4869 | var _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');
|
4870 | var RE_POS = /^(top|right|bottom|left)$/;
|
4871 | var CURRENT_STYLE = 'currentStyle';
|
4872 | var RUNTIME_STYLE = 'runtimeStyle';
|
4873 | var LEFT = 'left';
|
4874 | var PX = 'px';
|
4875 |
|
4876 | function _getComputedStyleIE(elem, name) {
|
4877 | // currentStyle maybe null
|
4878 | // http://msdn.microsoft.com/en-us/library/ms535231.aspx
|
4879 | var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];
|
4880 |
|
4881 | // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值
|
4882 | // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19
|
4883 | // 在 ie 下不对,需要直接用 offset 方式
|
4884 | // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了
|
4885 |
|
4886 | // From the awesome hack by Dean Edwards
|
4887 | // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
4888 | // If we're not dealing with a regular pixel number
|
4889 | // but a number that has a weird ending, we need to convert it to pixels
|
4890 | // exclude left right for relativity
|
4891 | if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {
|
4892 | // Remember the original values
|
4893 | var style = elem.style;
|
4894 | var left = style[LEFT];
|
4895 | var rsLeft = elem[RUNTIME_STYLE][LEFT];
|
4896 |
|
4897 | // prevent flashing of content
|
4898 | elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];
|
4899 |
|
4900 | // Put in the new values to get a computed value out
|
4901 | style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;
|
4902 | ret = style.pixelLeft + PX;
|
4903 |
|
4904 | // Revert the changed values
|
4905 | style[LEFT] = left;
|
4906 |
|
4907 | elem[RUNTIME_STYLE][LEFT] = rsLeft;
|
4908 | }
|
4909 | return ret === '' ? 'auto' : ret;
|
4910 | }
|
4911 |
|
4912 | if (typeof window !== 'undefined') {
|
4913 | getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
|
4914 | }
|
4915 |
|
4916 | function getOffsetDirection(dir, option) {
|
4917 | if (dir === 'left') {
|
4918 | return option.useCssRight ? 'right' : dir;
|
4919 | }
|
4920 | return option.useCssBottom ? 'bottom' : dir;
|
4921 | }
|
4922 |
|
4923 | function oppositeOffsetDirection(dir) {
|
4924 | if (dir === 'left') {
|
4925 | return 'right';
|
4926 | } else if (dir === 'right') {
|
4927 | return 'left';
|
4928 | } else if (dir === 'top') {
|
4929 | return 'bottom';
|
4930 | } else if (dir === 'bottom') {
|
4931 | return 'top';
|
4932 | }
|
4933 | }
|
4934 |
|
4935 | // 设置 elem 相对 elem.ownerDocument 的坐标
|
4936 | function setLeftTop(elem, offset, option) {
|
4937 | // set position first, in-case top/left are set even on static elem
|
4938 | if (css(elem, 'position') === 'static') {
|
4939 | elem.style.position = 'relative';
|
4940 | }
|
4941 | var presetH = -999;
|
4942 | var presetV = -999;
|
4943 | var horizontalProperty = getOffsetDirection('left', option);
|
4944 | var verticalProperty = getOffsetDirection('top', option);
|
4945 | var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);
|
4946 | var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);
|
4947 |
|
4948 | if (horizontalProperty !== 'left') {
|
4949 | presetH = 999;
|
4950 | }
|
4951 |
|
4952 | if (verticalProperty !== 'top') {
|
4953 | presetV = 999;
|
4954 | }
|
4955 | var originalTransition = '';
|
4956 | var originalOffset = getOffset(elem);
|
4957 | if ('left' in offset || 'top' in offset) {
|
4958 | originalTransition = (0, _propertyUtils.getTransitionProperty)(elem) || '';
|
4959 | (0, _propertyUtils.setTransitionProperty)(elem, 'none');
|
4960 | }
|
4961 | if ('left' in offset) {
|
4962 | elem.style[oppositeHorizontalProperty] = '';
|
4963 | elem.style[horizontalProperty] = presetH + 'px';
|
4964 | }
|
4965 | if ('top' in offset) {
|
4966 | elem.style[oppositeVerticalProperty] = '';
|
4967 | elem.style[verticalProperty] = presetV + 'px';
|
4968 | }
|
4969 | var old = getOffset(elem);
|
4970 | var originalStyle = {};
|
4971 | for (var key in offset) {
|
4972 | if (offset.hasOwnProperty(key)) {
|
4973 | var dir = getOffsetDirection(key, option);
|
4974 | var preset = key === 'left' ? presetH : presetV;
|
4975 | var off = originalOffset[key] - old[key];
|
4976 | if (dir === key) {
|
4977 | originalStyle[dir] = preset + off;
|
4978 | } else {
|
4979 | originalStyle[dir] = preset - off;
|
4980 | }
|
4981 | }
|
4982 | }
|
4983 | css(elem, originalStyle);
|
4984 | // force relayout
|
4985 | force(elem.offsetTop, elem.offsetLeft);
|
4986 | if ('left' in offset || 'top' in offset) {
|
4987 | (0, _propertyUtils.setTransitionProperty)(elem, originalTransition);
|
4988 | }
|
4989 | var ret = {};
|
4990 | for (var _key in offset) {
|
4991 | if (offset.hasOwnProperty(_key)) {
|
4992 | var _dir = getOffsetDirection(_key, option);
|
4993 | var _off = offset[_key] - originalOffset[_key];
|
4994 | if (_key === _dir) {
|
4995 | ret[_dir] = originalStyle[_dir] + _off;
|
4996 | } else {
|
4997 | ret[_dir] = originalStyle[_dir] - _off;
|
4998 | }
|
4999 | }
|
5000 | }
|
5001 | css(elem, ret);
|
5002 | }
|
5003 |
|
5004 | function setTransform(elem, offset) {
|
5005 | var originalOffset = getOffset(elem);
|
5006 | var originalXY = (0, _propertyUtils.getTransformXY)(elem);
|
5007 | var resultXY = { x: originalXY.x, y: originalXY.y };
|
5008 | if ('left' in offset) {
|
5009 | resultXY.x = originalXY.x + offset.left - originalOffset.left;
|
5010 | }
|
5011 | if ('top' in offset) {
|
5012 | resultXY.y = originalXY.y + offset.top - originalOffset.top;
|
5013 | }
|
5014 | (0, _propertyUtils.setTransformXY)(elem, resultXY);
|
5015 | }
|
5016 |
|
5017 | function setOffset(elem, offset, option) {
|
5018 | if (option.useCssRight || option.useCssBottom) {
|
5019 | setLeftTop(elem, offset, option);
|
5020 | } else if (option.useCssTransform && (0, _propertyUtils.getTransformName)() in document.body.style) {
|
5021 | setTransform(elem, offset, option);
|
5022 | } else {
|
5023 | setLeftTop(elem, offset, option);
|
5024 | }
|
5025 | }
|
5026 |
|
5027 | function each(arr, fn) {
|
5028 | for (var i = 0; i < arr.length; i++) {
|
5029 | fn(arr[i]);
|
5030 | }
|
5031 | }
|
5032 |
|
5033 | function isBorderBoxFn(elem) {
|
5034 | return getComputedStyleX(elem, 'boxSizing') === 'border-box';
|
5035 | }
|
5036 |
|
5037 | var BOX_MODELS = ['margin', 'border', 'padding'];
|
5038 | var CONTENT_INDEX = -1;
|
5039 | var PADDING_INDEX = 2;
|
5040 | var BORDER_INDEX = 1;
|
5041 | var MARGIN_INDEX = 0;
|
5042 |
|
5043 | function swap(elem, options, callback) {
|
5044 | var old = {};
|
5045 | var style = elem.style;
|
5046 | var name = void 0;
|
5047 |
|
5048 | // Remember the old values, and insert the new ones
|
5049 | for (name in options) {
|
5050 | if (options.hasOwnProperty(name)) {
|
5051 | old[name] = style[name];
|
5052 | style[name] = options[name];
|
5053 | }
|
5054 | }
|
5055 |
|
5056 | callback.call(elem);
|
5057 |
|
5058 | // Revert the old values
|
5059 | for (name in options) {
|
5060 | if (options.hasOwnProperty(name)) {
|
5061 | style[name] = old[name];
|
5062 | }
|
5063 | }
|
5064 | }
|
5065 |
|
5066 | function getPBMWidth(elem, props, which) {
|
5067 | var value = 0;
|
5068 | var prop = void 0;
|
5069 | var j = void 0;
|
5070 | var i = void 0;
|
5071 | for (j = 0; j < props.length; j++) {
|
5072 | prop = props[j];
|
5073 | if (prop) {
|
5074 | for (i = 0; i < which.length; i++) {
|
5075 | var cssProp = void 0;
|
5076 | if (prop === 'border') {
|
5077 | cssProp = '' + prop + which[i] + 'Width';
|
5078 | } else {
|
5079 | cssProp = prop + which[i];
|
5080 | }
|
5081 | value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;
|
5082 | }
|
5083 | }
|
5084 | }
|
5085 | return value;
|
5086 | }
|
5087 |
|
5088 | /**
|
5089 | * A crude way of determining if an object is a window
|
5090 | * @member util
|
5091 | */
|
5092 | function isWindow(obj) {
|
5093 | // must use == for ie8
|
5094 | /* eslint eqeqeq:0 */
|
5095 | return obj !== null && obj !== undefined && obj == obj.window;
|
5096 | }
|
5097 |
|
5098 | var domUtils = {};
|
5099 |
|
5100 | each(['Width', 'Height'], function (name) {
|
5101 | domUtils['doc' + name] = function (refWin) {
|
5102 | var d = refWin.document;
|
5103 | return Math.max(
|
5104 | // firefox chrome documentElement.scrollHeight< body.scrollHeight
|
5105 | // ie standard mode : documentElement.scrollHeight> body.scrollHeight
|
5106 | d.documentElement['scroll' + name],
|
5107 | // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?
|
5108 | d.body['scroll' + name], domUtils['viewport' + name](d));
|
5109 | };
|
5110 |
|
5111 | domUtils['viewport' + name] = function (win) {
|
5112 | // pc browser includes scrollbar in window.innerWidth
|
5113 | var prop = 'client' + name;
|
5114 | var doc = win.document;
|
5115 | var body = doc.body;
|
5116 | var documentElement = doc.documentElement;
|
5117 | var documentElementProp = documentElement[prop];
|
5118 | // 标准模式取 documentElement
|
5119 | // backcompat 取 body
|
5120 | return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;
|
5121 | };
|
5122 | });
|
5123 |
|
5124 | /*
|
5125 | 得到元素的大小信息
|
5126 | @param elem
|
5127 | @param name
|
5128 | @param {String} [extra] 'padding' : (css width) + padding
|
5129 | 'border' : (css width) + padding + border
|
5130 | 'margin' : (css width) + padding + border + margin
|
5131 | */
|
5132 | function getWH(elem, name, ex) {
|
5133 | var extra = ex;
|
5134 | if (isWindow(elem)) {
|
5135 | return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);
|
5136 | } else if (elem.nodeType === 9) {
|
5137 | return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);
|
5138 | }
|
5139 | var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
|
5140 | var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;
|
5141 | var computedStyle = getComputedStyleX(elem);
|
5142 | var isBorderBox = isBorderBoxFn(elem, computedStyle);
|
5143 | var cssBoxValue = 0;
|
5144 | if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) {
|
5145 | borderBoxValue = undefined;
|
5146 | // Fall back to computed then un computed css if necessary
|
5147 | cssBoxValue = getComputedStyleX(elem, name);
|
5148 | if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) {
|
5149 | cssBoxValue = elem.style[name] || 0;
|
5150 | }
|
5151 | // Normalize '', auto, and prepare for extra
|
5152 | cssBoxValue = parseFloat(cssBoxValue) || 0;
|
5153 | }
|
5154 | if (extra === undefined) {
|
5155 | extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;
|
5156 | }
|
5157 | var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;
|
5158 | var val = borderBoxValue || cssBoxValue;
|
5159 | if (extra === CONTENT_INDEX) {
|
5160 | if (borderBoxValueOrIsBorderBox) {
|
5161 | return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);
|
5162 | }
|
5163 | return cssBoxValue;
|
5164 | } else if (borderBoxValueOrIsBorderBox) {
|
5165 | if (extra === BORDER_INDEX) {
|
5166 | return val;
|
5167 | }
|
5168 | return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle));
|
5169 | }
|
5170 | return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);
|
5171 | }
|
5172 |
|
5173 | var cssShow = {
|
5174 | position: 'absolute',
|
5175 | visibility: 'hidden',
|
5176 | display: 'block'
|
5177 | };
|
5178 |
|
5179 | // fix #119 : https://github.com/kissyteam/kissy/issues/119
|
5180 | function getWHIgnoreDisplay() {
|
5181 | for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) {
|
5182 | args[_key2] = arguments[_key2];
|
5183 | }
|
5184 |
|
5185 | var val = void 0;
|
5186 | var elem = args[0];
|
5187 | // in case elem is window
|
5188 | // elem.offsetWidth === undefined
|
5189 | if (elem.offsetWidth !== 0) {
|
5190 | val = getWH.apply(undefined, args);
|
5191 | } else {
|
5192 | swap(elem, cssShow, function () {
|
5193 | val = getWH.apply(undefined, args);
|
5194 | });
|
5195 | }
|
5196 | return val;
|
5197 | }
|
5198 |
|
5199 | each(['width', 'height'], function (name) {
|
5200 | var first = name.charAt(0).toUpperCase() + name.slice(1);
|
5201 | domUtils['outer' + first] = function (el, includeMargin) {
|
5202 | return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
|
5203 | };
|
5204 | var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];
|
5205 |
|
5206 | domUtils[name] = function (elem, v) {
|
5207 | var val = v;
|
5208 | if (val !== undefined) {
|
5209 | if (elem) {
|
5210 | var computedStyle = getComputedStyleX(elem);
|
5211 | var isBorderBox = isBorderBoxFn(elem);
|
5212 | if (isBorderBox) {
|
5213 | val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);
|
5214 | }
|
5215 | return css(elem, name, val);
|
5216 | }
|
5217 | return undefined;
|
5218 | }
|
5219 | return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);
|
5220 | };
|
5221 | });
|
5222 |
|
5223 | function mix(to, from) {
|
5224 | for (var i in from) {
|
5225 | if (from.hasOwnProperty(i)) {
|
5226 | to[i] = from[i];
|
5227 | }
|
5228 | }
|
5229 | return to;
|
5230 | }
|
5231 |
|
5232 | var utils = {
|
5233 | getWindow: function getWindow(node) {
|
5234 | if (node && node.document && node.setTimeout) {
|
5235 | return node;
|
5236 | }
|
5237 | var doc = node.ownerDocument || node;
|
5238 | return doc.defaultView || doc.parentWindow;
|
5239 | },
|
5240 | offset: function offset(el, value, option) {
|
5241 | if (typeof value !== 'undefined') {
|
5242 | setOffset(el, value, option || {});
|
5243 | } else {
|
5244 | return getOffset(el);
|
5245 | }
|
5246 | },
|
5247 |
|
5248 | isWindow: isWindow,
|
5249 | each: each,
|
5250 | css: css,
|
5251 | clone: function clone(obj) {
|
5252 | var i = void 0;
|
5253 | var ret = {};
|
5254 | for (i in obj) {
|
5255 | if (obj.hasOwnProperty(i)) {
|
5256 | ret[i] = obj[i];
|
5257 | }
|
5258 | }
|
5259 | var overflow = obj.overflow;
|
5260 | if (overflow) {
|
5261 | for (i in obj) {
|
5262 | if (obj.hasOwnProperty(i)) {
|
5263 | ret.overflow[i] = obj.overflow[i];
|
5264 | }
|
5265 | }
|
5266 | }
|
5267 | return ret;
|
5268 | },
|
5269 |
|
5270 | mix: mix,
|
5271 | getWindowScrollLeft: function getWindowScrollLeft(w) {
|
5272 | return getScrollLeft(w);
|
5273 | },
|
5274 | getWindowScrollTop: function getWindowScrollTop(w) {
|
5275 | return getScrollTop(w);
|
5276 | },
|
5277 | merge: function merge() {
|
5278 | var ret = {};
|
5279 |
|
5280 | for (var _len2 = arguments.length, args = Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
|
5281 | args[_key3] = arguments[_key3];
|
5282 | }
|
5283 |
|
5284 | for (var i = 0; i < args.length; i++) {
|
5285 | utils.mix(ret, args[i]);
|
5286 | }
|
5287 | return ret;
|
5288 | },
|
5289 |
|
5290 | viewportWidth: 0,
|
5291 | viewportHeight: 0
|
5292 | };
|
5293 |
|
5294 | mix(utils, domUtils);
|
5295 |
|
5296 | exports["default"] = utils;
|
5297 | module.exports = exports['default'];
|
5298 |
|
5299 | /***/ },
|
5300 | /* 51 */
|
5301 | /***/ function(module, exports) {
|
5302 |
|
5303 | ;
|
5304 |
|
5305 | Object.defineProperty(exports, "__esModule", {
|
5306 | value: true
|
5307 | });
|
5308 | exports.getTransformName = getTransformName;
|
5309 | exports.setTransitionProperty = setTransitionProperty;
|
5310 | exports.getTransitionProperty = getTransitionProperty;
|
5311 | exports.getTransformXY = getTransformXY;
|
5312 | exports.setTransformXY = setTransformXY;
|
5313 | var vendorPrefix = void 0;
|
5314 |
|
5315 | var jsCssMap = {
|
5316 | Webkit: '-webkit-',
|
5317 | Moz: '-moz-',
|
5318 | // IE did it wrong again ...
|
5319 | ms: '-ms-',
|
5320 | O: '-o-'
|
5321 | };
|
5322 |
|
5323 | function getVendorPrefix() {
|
5324 | if (vendorPrefix !== undefined) {
|
5325 | return vendorPrefix;
|
5326 | }
|
5327 | vendorPrefix = '';
|
5328 | var style = document.createElement('p').style;
|
5329 | var testProp = 'Transform';
|
5330 | for (var key in jsCssMap) {
|
5331 | if (key + testProp in style) {
|
5332 | vendorPrefix = key;
|
5333 | }
|
5334 | }
|
5335 | return vendorPrefix;
|
5336 | }
|
5337 |
|
5338 | function getTransitionName() {
|
5339 | return getVendorPrefix() ? getVendorPrefix() + 'TransitionProperty' : 'transitionProperty';
|
5340 | }
|
5341 |
|
5342 | function getTransformName() {
|
5343 | return getVendorPrefix() ? getVendorPrefix() + 'Transform' : 'transform';
|
5344 | }
|
5345 |
|
5346 | function setTransitionProperty(node, value) {
|
5347 | var name = getTransitionName();
|
5348 | if (name) {
|
5349 | node.style[name] = value;
|
5350 | if (name !== 'transitionProperty') {
|
5351 | node.style.transitionProperty = value;
|
5352 | }
|
5353 | }
|
5354 | }
|
5355 |
|
5356 | function setTransform(node, value) {
|
5357 | var name = getTransformName();
|
5358 | if (name) {
|
5359 | node.style[name] = value;
|
5360 | if (name !== 'transform') {
|
5361 | node.style.transform = value;
|
5362 | }
|
5363 | }
|
5364 | }
|
5365 |
|
5366 | function getTransitionProperty(node) {
|
5367 | return node.style.transitionProperty || node.style[getTransitionName()];
|
5368 | }
|
5369 |
|
5370 | function getTransformXY(node) {
|
5371 | var style = window.getComputedStyle(node, null);
|
5372 | var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());
|
5373 | if (transform && transform !== 'none') {
|
5374 | var matrix = transform.replace(/[^0-9\-.,]/g, '').split(',');
|
5375 | return { x: parseFloat(matrix[12] || matrix[4], 0), y: parseFloat(matrix[13] || matrix[5], 0) };
|
5376 | }
|
5377 | return {
|
5378 | x: 0,
|
5379 | y: 0
|
5380 | };
|
5381 | }
|
5382 |
|
5383 | var matrix2d = /matrix\((.*)\)/;
|
5384 | var matrix3d = /matrix3d\((.*)\)/;
|
5385 |
|
5386 | function setTransformXY(node, xy) {
|
5387 | var style = window.getComputedStyle(node, null);
|
5388 | var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());
|
5389 | if (transform && transform !== 'none') {
|
5390 | var arr = void 0;
|
5391 | var match2d = transform.match(matrix2d);
|
5392 | if (match2d) {
|
5393 | match2d = match2d[1];
|
5394 | arr = match2d.split(',').map(function (item) {
|
5395 | return parseFloat(item, 10);
|
5396 | });
|
5397 | arr[4] = xy.x;
|
5398 | arr[5] = xy.y;
|
5399 | setTransform(node, 'matrix(' + arr.join(',') + ')');
|
5400 | } else {
|
5401 | var match3d = transform.match(matrix3d)[1];
|
5402 | arr = match3d.split(',').map(function (item) {
|
5403 | return parseFloat(item, 10);
|
5404 | });
|
5405 | arr[12] = xy.x;
|
5406 | arr[13] = xy.y;
|
5407 | setTransform(node, 'matrix3d(' + arr.join(',') + ')');
|
5408 | }
|
5409 | } else {
|
5410 | setTransform(node, 'translateX(' + xy.x + 'px) translateY(' + xy.y + 'px) translateZ(0)');
|
5411 | }
|
5412 | }
|
5413 |
|
5414 | /***/ },
|
5415 | /* 52 */
|
5416 | /***/ function(module, exports, __webpack_require__) {
|
5417 |
|
5418 | ;
|
5419 |
|
5420 | Object.defineProperty(exports, "__esModule", {
|
5421 | value: true
|
5422 | });
|
5423 |
|
5424 | var _utils = __webpack_require__(50);
|
5425 |
|
5426 | var _utils2 = _interopRequireDefault(_utils);
|
5427 |
|
5428 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5429 |
|
5430 | /**
|
5431 | * 得到会导致元素显示不全的祖先元素
|
5432 | */
|
5433 |
|
5434 | function getOffsetParent(element) {
|
5435 | // ie 这个也不是完全可行
|
5436 | /*
|
5437 | <div style="width: 50px;height: 100px;overflow: hidden">
|
5438 | <div style="width: 50px;height: 100px;position: relative;" id="d6">
|
5439 | 元素 6 高 100px 宽 50px<br/>
|
5440 | </div>
|
5441 | </div>
|
5442 | */
|
5443 | // element.offsetParent does the right thing in ie7 and below. Return parent with layout!
|
5444 | // In other browsers it only includes elements with position absolute, relative or
|
5445 | // fixed, not elements with overflow set to auto or scroll.
|
5446 | // if (UA.ie && ieMode < 8) {
|
5447 | // return element.offsetParent;
|
5448 | // }
|
5449 | // 统一的 offsetParent 方法
|
5450 | var doc = element.ownerDocument;
|
5451 | var body = doc.body;
|
5452 | var parent = void 0;
|
5453 | var positionStyle = _utils2["default"].css(element, 'position');
|
5454 | var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute';
|
5455 |
|
5456 | if (!skipStatic) {
|
5457 | return element.nodeName.toLowerCase() === 'html' ? null : element.parentNode;
|
5458 | }
|
5459 |
|
5460 | for (parent = element.parentNode; parent && parent !== body; parent = parent.parentNode) {
|
5461 | positionStyle = _utils2["default"].css(parent, 'position');
|
5462 | if (positionStyle !== 'static') {
|
5463 | return parent;
|
5464 | }
|
5465 | }
|
5466 | return null;
|
5467 | }
|
5468 |
|
5469 | exports["default"] = getOffsetParent;
|
5470 | module.exports = exports['default'];
|
5471 |
|
5472 | /***/ },
|
5473 | /* 53 */
|
5474 | /***/ function(module, exports, __webpack_require__) {
|
5475 |
|
5476 | ;
|
5477 |
|
5478 | Object.defineProperty(exports, "__esModule", {
|
5479 | value: true
|
5480 | });
|
5481 |
|
5482 | var _utils = __webpack_require__(50);
|
5483 |
|
5484 | var _utils2 = _interopRequireDefault(_utils);
|
5485 |
|
5486 | var _getOffsetParent = __webpack_require__(52);
|
5487 |
|
5488 | var _getOffsetParent2 = _interopRequireDefault(_getOffsetParent);
|
5489 |
|
5490 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5491 |
|
5492 | /**
|
5493 | * 获得元素的显示部分的区域
|
5494 | */
|
5495 | function getVisibleRectForElement(element) {
|
5496 | var visibleRect = {
|
5497 | left: 0,
|
5498 | right: Infinity,
|
5499 | top: 0,
|
5500 | bottom: Infinity
|
5501 | };
|
5502 | var el = (0, _getOffsetParent2["default"])(element);
|
5503 | var scrollX = void 0;
|
5504 | var scrollY = void 0;
|
5505 | var winSize = void 0;
|
5506 | var doc = element.ownerDocument;
|
5507 | var win = doc.defaultView || doc.parentWindow;
|
5508 | var body = doc.body;
|
5509 | var documentElement = doc.documentElement;
|
5510 |
|
5511 | // Determine the size of the visible rect by climbing the dom accounting for
|
5512 | // all scrollable containers.
|
5513 | while (el) {
|
5514 | // clientWidth is zero for inline block elements in ie.
|
5515 | if ((navigator.userAgent.indexOf('MSIE') === -1 || el.clientWidth !== 0) &&
|
5516 | // body may have overflow set on it, yet we still get the entire
|
5517 | // viewport. In some browsers, el.offsetParent may be
|
5518 | // document.documentElement, so check for that too.
|
5519 | el !== body && el !== documentElement && _utils2["default"].css(el, 'overflow') !== 'visible') {
|
5520 | var pos = _utils2["default"].offset(el);
|
5521 | // add border
|
5522 | pos.left += el.clientLeft;
|
5523 | pos.top += el.clientTop;
|
5524 | visibleRect.top = Math.max(visibleRect.top, pos.top);
|
5525 | visibleRect.right = Math.min(visibleRect.right,
|
5526 | // consider area without scrollBar
|
5527 | pos.left + el.clientWidth);
|
5528 | visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);
|
5529 | visibleRect.left = Math.max(visibleRect.left, pos.left);
|
5530 | } else if (el === body || el === documentElement) {
|
5531 | break;
|
5532 | }
|
5533 | el = (0, _getOffsetParent2["default"])(el);
|
5534 | }
|
5535 |
|
5536 | // Clip by window's viewport.
|
5537 | scrollX = _utils2["default"].getWindowScrollLeft(win);
|
5538 | scrollY = _utils2["default"].getWindowScrollTop(win);
|
5539 | visibleRect.left = Math.max(visibleRect.left, scrollX);
|
5540 | visibleRect.top = Math.max(visibleRect.top, scrollY);
|
5541 | winSize = {
|
5542 | width: _utils2["default"].viewportWidth(win),
|
5543 | height: _utils2["default"].viewportHeight(win)
|
5544 | };
|
5545 | visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width);
|
5546 | visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height);
|
5547 | return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;
|
5548 | }
|
5549 |
|
5550 | exports["default"] = getVisibleRectForElement;
|
5551 | module.exports = exports['default'];
|
5552 |
|
5553 | /***/ },
|
5554 | /* 54 */
|
5555 | /***/ function(module, exports, __webpack_require__) {
|
5556 |
|
5557 | ;
|
5558 |
|
5559 | Object.defineProperty(exports, "__esModule", {
|
5560 | value: true
|
5561 | });
|
5562 |
|
5563 | var _utils = __webpack_require__(50);
|
5564 |
|
5565 | var _utils2 = _interopRequireDefault(_utils);
|
5566 |
|
5567 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5568 |
|
5569 | function adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {
|
5570 | var pos = _utils2["default"].clone(elFuturePos);
|
5571 | var size = {
|
5572 | width: elRegion.width,
|
5573 | height: elRegion.height
|
5574 | };
|
5575 |
|
5576 | if (overflow.adjustX && pos.left < visibleRect.left) {
|
5577 | pos.left = visibleRect.left;
|
5578 | }
|
5579 |
|
5580 | // Left edge inside and right edge outside viewport, try to resize it.
|
5581 | if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {
|
5582 | size.width -= pos.left + size.width - visibleRect.right;
|
5583 | }
|
5584 |
|
5585 | // Right edge outside viewport, try to move it.
|
5586 | if (overflow.adjustX && pos.left + size.width > visibleRect.right) {
|
5587 | // 保证左边界和可视区域左边界对齐
|
5588 | pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);
|
5589 | }
|
5590 |
|
5591 | // Top edge outside viewport, try to move it.
|
5592 | if (overflow.adjustY && pos.top < visibleRect.top) {
|
5593 | pos.top = visibleRect.top;
|
5594 | }
|
5595 |
|
5596 | // Top edge inside and bottom edge outside viewport, try to resize it.
|
5597 | if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {
|
5598 | size.height -= pos.top + size.height - visibleRect.bottom;
|
5599 | }
|
5600 |
|
5601 | // Bottom edge outside viewport, try to move it.
|
5602 | if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {
|
5603 | // 保证上边界和可视区域上边界对齐
|
5604 | pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);
|
5605 | }
|
5606 |
|
5607 | return _utils2["default"].mix(pos, size);
|
5608 | }
|
5609 |
|
5610 | exports["default"] = adjustForViewport;
|
5611 | module.exports = exports['default'];
|
5612 |
|
5613 | /***/ },
|
5614 | /* 55 */
|
5615 | /***/ function(module, exports, __webpack_require__) {
|
5616 |
|
5617 | ;
|
5618 |
|
5619 | Object.defineProperty(exports, "__esModule", {
|
5620 | value: true
|
5621 | });
|
5622 |
|
5623 | var _utils = __webpack_require__(50);
|
5624 |
|
5625 | var _utils2 = _interopRequireDefault(_utils);
|
5626 |
|
5627 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5628 |
|
5629 | function getRegion(node) {
|
5630 | var offset = void 0;
|
5631 | var w = void 0;
|
5632 | var h = void 0;
|
5633 | if (!_utils2["default"].isWindow(node) && node.nodeType !== 9) {
|
5634 | offset = _utils2["default"].offset(node);
|
5635 | w = _utils2["default"].outerWidth(node);
|
5636 | h = _utils2["default"].outerHeight(node);
|
5637 | } else {
|
5638 | var win = _utils2["default"].getWindow(node);
|
5639 | offset = {
|
5640 | left: _utils2["default"].getWindowScrollLeft(win),
|
5641 | top: _utils2["default"].getWindowScrollTop(win)
|
5642 | };
|
5643 | w = _utils2["default"].viewportWidth(win);
|
5644 | h = _utils2["default"].viewportHeight(win);
|
5645 | }
|
5646 | offset.width = w;
|
5647 | offset.height = h;
|
5648 | return offset;
|
5649 | }
|
5650 |
|
5651 | exports["default"] = getRegion;
|
5652 | module.exports = exports['default'];
|
5653 |
|
5654 | /***/ },
|
5655 | /* 56 */
|
5656 | /***/ function(module, exports, __webpack_require__) {
|
5657 |
|
5658 | ;
|
5659 |
|
5660 | Object.defineProperty(exports, "__esModule", {
|
5661 | value: true
|
5662 | });
|
5663 |
|
5664 | var _getAlignOffset = __webpack_require__(57);
|
5665 |
|
5666 | var _getAlignOffset2 = _interopRequireDefault(_getAlignOffset);
|
5667 |
|
5668 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5669 |
|
5670 | function getElFuturePos(elRegion, refNodeRegion, points, offset, targetOffset) {
|
5671 | var xy = void 0;
|
5672 | var diff = void 0;
|
5673 | var p1 = void 0;
|
5674 | var p2 = void 0;
|
5675 |
|
5676 | xy = {
|
5677 | left: elRegion.left,
|
5678 | top: elRegion.top
|
5679 | };
|
5680 |
|
5681 | p1 = (0, _getAlignOffset2["default"])(refNodeRegion, points[1]);
|
5682 | p2 = (0, _getAlignOffset2["default"])(elRegion, points[0]);
|
5683 |
|
5684 | diff = [p2.left - p1.left, p2.top - p1.top];
|
5685 |
|
5686 | return {
|
5687 | left: xy.left - diff[0] + offset[0] - targetOffset[0],
|
5688 | top: xy.top - diff[1] + offset[1] - targetOffset[1]
|
5689 | };
|
5690 | }
|
5691 |
|
5692 | exports["default"] = getElFuturePos;
|
5693 | module.exports = exports['default'];
|
5694 |
|
5695 | /***/ },
|
5696 | /* 57 */
|
5697 | /***/ function(module, exports) {
|
5698 |
|
5699 | ;
|
5700 |
|
5701 | Object.defineProperty(exports, "__esModule", {
|
5702 | value: true
|
5703 | });
|
5704 | /**
|
5705 | * 获取 node 上的 align 对齐点 相对于页面的坐标
|
5706 | */
|
5707 |
|
5708 | function getAlignOffset(region, align) {
|
5709 | var V = align.charAt(0);
|
5710 | var H = align.charAt(1);
|
5711 | var w = region.width;
|
5712 | var h = region.height;
|
5713 | var x = void 0;
|
5714 | var y = void 0;
|
5715 |
|
5716 | x = region.left;
|
5717 | y = region.top;
|
5718 |
|
5719 | if (V === 'c') {
|
5720 | y += h / 2;
|
5721 | } else if (V === 'b') {
|
5722 | y += h;
|
5723 | }
|
5724 |
|
5725 | if (H === 'c') {
|
5726 | x += w / 2;
|
5727 | } else if (H === 'r') {
|
5728 | x += w;
|
5729 | }
|
5730 |
|
5731 | return {
|
5732 | left: x,
|
5733 | top: y
|
5734 | };
|
5735 | }
|
5736 |
|
5737 | exports["default"] = getAlignOffset;
|
5738 | module.exports = exports['default'];
|
5739 |
|
5740 | /***/ },
|
5741 | /* 58 */
|
5742 | /***/ function(module, exports, __webpack_require__) {
|
5743 |
|
5744 | ;
|
5745 |
|
5746 | Object.defineProperty(exports, "__esModule", {
|
5747 | value: true
|
5748 | });
|
5749 |
|
5750 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
5751 |
|
5752 | var _classnames = __webpack_require__(3);
|
5753 |
|
5754 | var _classnames2 = _interopRequireDefault(_classnames);
|
5755 |
|
5756 | var _react = __webpack_require__(4);
|
5757 |
|
5758 | var _react2 = _interopRequireDefault(_react);
|
5759 |
|
5760 | var _Transition = __webpack_require__(10);
|
5761 |
|
5762 | var _Transition2 = _interopRequireDefault(_Transition);
|
5763 |
|
5764 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5765 |
|
5766 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
5767 |
|
5768 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
5769 |
|
5770 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
5771 |
|
5772 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
5773 |
|
5774 | var propTypes = {
|
5775 | /**
|
5776 | * Show the component; triggers the fade in or fade out animation
|
5777 | */
|
5778 | "in": _react2["default"].PropTypes.bool,
|
5779 |
|
5780 | /**
|
5781 | * Unmount the component (remove it from the DOM) when it is faded out
|
5782 | */
|
5783 | unmountOnExit: _react2["default"].PropTypes.bool,
|
5784 |
|
5785 | /**
|
5786 | * Run the fade in animation when the component mounts, if it is initially
|
5787 | * shown
|
5788 | */
|
5789 | transitionAppear: _react2["default"].PropTypes.bool,
|
5790 |
|
5791 | /**
|
5792 | * Duration of the fade animation in milliseconds, to ensure that finishing
|
5793 | * callbacks are fired even if the original browser transition end events are
|
5794 | * canceled
|
5795 | */
|
5796 | timeout: _react2["default"].PropTypes.number,
|
5797 |
|
5798 | /**
|
5799 | * Callback fired before the component fades in
|
5800 | */
|
5801 | onEnter: _react2["default"].PropTypes.func,
|
5802 | /**
|
5803 | * Callback fired after the component starts to fade in
|
5804 | */
|
5805 | onEntering: _react2["default"].PropTypes.func,
|
5806 | /**
|
5807 | * Callback fired after the has component faded in
|
5808 | */
|
5809 | onEntered: _react2["default"].PropTypes.func,
|
5810 | /**
|
5811 | * Callback fired before the component fades out
|
5812 | */
|
5813 | onExit: _react2["default"].PropTypes.func,
|
5814 | /**
|
5815 | * Callback fired after the component starts to fade out
|
5816 | */
|
5817 | onExiting: _react2["default"].PropTypes.func,
|
5818 | /**
|
5819 | * Callback fired after the component has faded out
|
5820 | */
|
5821 | onExited: _react2["default"].PropTypes.func
|
5822 | };
|
5823 |
|
5824 | var defaultProps = {
|
5825 | "in": false,
|
5826 | timeout: 300,
|
5827 | unmountOnExit: false,
|
5828 | transitionAppear: false
|
5829 | };
|
5830 |
|
5831 | var Fade = function (_React$Component) {
|
5832 | _inherits(Fade, _React$Component);
|
5833 |
|
5834 | function Fade() {
|
5835 | _classCallCheck(this, Fade);
|
5836 |
|
5837 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
5838 | }
|
5839 |
|
5840 | Fade.prototype.render = function render() {
|
5841 | return _react2["default"].createElement(_Transition2["default"], _extends({}, this.props, {
|
5842 | className: (0, _classnames2["default"])(this.props.className, 'fade'),
|
5843 | enteredClassName: 'in',
|
5844 | enteringClassName: 'in'
|
5845 | }));
|
5846 | };
|
5847 |
|
5848 | return Fade;
|
5849 | }(_react2["default"].Component);
|
5850 |
|
5851 | Fade.propTypes = propTypes;
|
5852 | Fade.defaultProps = defaultProps;
|
5853 |
|
5854 | exports["default"] = Fade;
|
5855 | module.exports = exports['default'];
|
5856 |
|
5857 | /***/ },
|
5858 | /* 59 */
|
5859 | /***/ function(module, exports, __webpack_require__) {
|
5860 |
|
5861 | ;
|
5862 |
|
5863 | Object.defineProperty(exports, "__esModule", {
|
5864 | value: true
|
5865 | });
|
5866 |
|
5867 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
5868 |
|
5869 | var _classnames = __webpack_require__(3);
|
5870 |
|
5871 | var _classnames2 = _interopRequireDefault(_classnames);
|
5872 |
|
5873 | var _react = __webpack_require__(4);
|
5874 |
|
5875 | var _react2 = _interopRequireDefault(_react);
|
5876 |
|
5877 | var _tinperBeeCore = __webpack_require__(25);
|
5878 |
|
5879 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
5880 |
|
5881 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
5882 |
|
5883 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
5884 |
|
5885 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
5886 |
|
5887 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
5888 |
|
5889 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
5890 |
|
5891 | var propTypes = {
|
5892 | //是否是手风琴效果
|
5893 | accordion: _react2["default"].PropTypes.bool,
|
5894 | //激活的项
|
5895 | activeKey: _react2["default"].PropTypes.any,
|
5896 | //默认的激活的项
|
5897 | defaultActiveKey: _react2["default"].PropTypes.any,
|
5898 | //选中函数
|
5899 | onSelect: _react2["default"].PropTypes.func,
|
5900 | role: _react2["default"].PropTypes.string
|
5901 | };
|
5902 |
|
5903 | var defaultProps = {
|
5904 | accordion: false,
|
5905 | clsPrefix: 'u-panel-group'
|
5906 | };
|
5907 |
|
5908 | // TODO: Use uncontrollable.
|
5909 |
|
5910 | var PanelGroup = function (_React$Component) {
|
5911 | _inherits(PanelGroup, _React$Component);
|
5912 |
|
5913 | function PanelGroup(props, context) {
|
5914 | _classCallCheck(this, PanelGroup);
|
5915 |
|
5916 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));
|
5917 |
|
5918 | _this.handleSelect = _this.handleSelect.bind(_this);
|
5919 |
|
5920 | _this.state = {
|
5921 | activeKey: props.defaultActiveKey
|
5922 | };
|
5923 | return _this;
|
5924 | }
|
5925 |
|
5926 | PanelGroup.prototype.handleSelect = function handleSelect(key, e) {
|
5927 | e.preventDefault();
|
5928 |
|
5929 | if (this.props.onSelect) {
|
5930 | this.props.onSelect(key, e);
|
5931 | }
|
5932 |
|
5933 | if (this.state.activeKey === key) {
|
5934 | key = null;
|
5935 | }
|
5936 |
|
5937 | this.setState({ activeKey: key });
|
5938 | };
|
5939 |
|
5940 | PanelGroup.prototype.render = function render() {
|
5941 | var _this2 = this;
|
5942 |
|
5943 | var _props = this.props,
|
5944 | accordion = _props.accordion,
|
5945 | propsActiveKey = _props.activeKey,
|
5946 | className = _props.className,
|
5947 | children = _props.children,
|
5948 | defaultActiveKey = _props.defaultActiveKey,
|
5949 | onSelect = _props.onSelect,
|
5950 | style = _props.style,
|
5951 | clsPrefix = _props.clsPrefix,
|
5952 | others = _objectWithoutProperties(_props, ['accordion', 'activeKey', 'className', 'children', 'defaultActiveKey', 'onSelect', 'style', 'clsPrefix']);
|
5953 |
|
5954 | var activeKey = void 0;
|
5955 | if (accordion) {
|
5956 | activeKey = propsActiveKey != null ? propsActiveKey : this.state.activeKey;
|
5957 | others.role = others.role || 'tablist';
|
5958 | }
|
5959 |
|
5960 | var classes = {};
|
5961 | classes['' + clsPrefix] = true;
|
5962 |
|
5963 | return _react2["default"].createElement(
|
5964 | 'div',
|
5965 | _extends({}, others, {
|
5966 | className: (0, _classnames2["default"])(className, classes)
|
5967 | }),
|
5968 | _react2["default"].Children.map(children, function (child) {
|
5969 | if (!_react2["default"].isValidElement(child)) {
|
5970 | return child;
|
5971 | }
|
5972 | var childProps = {
|
5973 | style: child.props.style
|
5974 | };
|
5975 |
|
5976 | if (accordion) {
|
5977 | Object.assign(childProps, {
|
5978 | headerRole: 'tab',
|
5979 | panelRole: 'tabpanel',
|
5980 | collapsible: true,
|
5981 | expanded: child.props.eventKey === activeKey,
|
5982 | onSelect: (0, _tinperBeeCore.createChainedFunction)(_this2.handleSelect, child.props.onSelect)
|
5983 | });
|
5984 | }
|
5985 |
|
5986 | return (0, _react.cloneElement)(child, childProps);
|
5987 | })
|
5988 | );
|
5989 | };
|
5990 |
|
5991 | return PanelGroup;
|
5992 | }(_react2["default"].Component);
|
5993 |
|
5994 | PanelGroup.propTypes = propTypes;
|
5995 | PanelGroup.defaultProps = defaultProps;
|
5996 |
|
5997 | exports["default"] = PanelGroup;
|
5998 | module.exports = exports['default'];
|
5999 |
|
6000 | /***/ },
|
6001 | /* 60 */
|
6002 | /***/ function(module, exports, __webpack_require__) {
|
6003 |
|
6004 | ;
|
6005 |
|
6006 | Object.defineProperty(exports, "__esModule", {
|
6007 | value: true
|
6008 | });
|
6009 |
|
6010 | var _Button = __webpack_require__(61);
|
6011 |
|
6012 | var _Button2 = _interopRequireDefault(_Button);
|
6013 |
|
6014 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6015 |
|
6016 | exports["default"] = _Button2["default"];
|
6017 | module.exports = exports['default'];
|
6018 |
|
6019 | /***/ },
|
6020 | /* 61 */
|
6021 | /***/ function(module, exports, __webpack_require__) {
|
6022 |
|
6023 | ;
|
6024 |
|
6025 | Object.defineProperty(exports, "__esModule", {
|
6026 | value: true
|
6027 | });
|
6028 |
|
6029 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6030 |
|
6031 | var _react = __webpack_require__(4);
|
6032 |
|
6033 | var _react2 = _interopRequireDefault(_react);
|
6034 |
|
6035 | var _reactDom = __webpack_require__(11);
|
6036 |
|
6037 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6038 |
|
6039 | var _classnames = __webpack_require__(3);
|
6040 |
|
6041 | var _classnames2 = _interopRequireDefault(_classnames);
|
6042 |
|
6043 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6044 |
|
6045 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6046 |
|
6047 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6048 |
|
6049 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6050 |
|
6051 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6052 |
|
6053 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6054 |
|
6055 | var propTypes = {
|
6056 | /**
|
6057 | * @title 尺寸
|
6058 | */
|
6059 | size: _react.PropTypes.oneOf(['sm', 'xg', 'lg']),
|
6060 | /**
|
6061 | * @title 样式
|
6062 | */
|
6063 | style: _react.PropTypes.object,
|
6064 | /**
|
6065 | * @title 形状
|
6066 | */
|
6067 | shape: _react.PropTypes.oneOf(['block', 'round', 'squared', 'floating', 'pillRight', 'pillLeft', 'border', 'icon']),
|
6068 | /**
|
6069 | * @title 类型
|
6070 | */
|
6071 | colors: _react.PropTypes.oneOf(['primary', 'accent', 'success', 'info', 'warning', 'danger', 'default']),
|
6072 | /**
|
6073 | * @title 是否禁用
|
6074 | * @veIgnore
|
6075 | */
|
6076 | disabled: _react.PropTypes.bool,
|
6077 | /**
|
6078 | * @title 类名
|
6079 | * @veIgnore
|
6080 | */
|
6081 | className: _react.PropTypes.string,
|
6082 |
|
6083 | /**
|
6084 | * @title <button> 的 type
|
6085 | * @veIgnore
|
6086 | */
|
6087 | htmlType: _react.PropTypes.oneOf(['submit', 'button', 'reset'])
|
6088 | };
|
6089 |
|
6090 | var defaultProps = {
|
6091 | disabled: false,
|
6092 | htmlType: 'button',
|
6093 | clsPrefix: 'u-button'
|
6094 |
|
6095 | };
|
6096 |
|
6097 | var sizeMap = {
|
6098 | sm: 'sm',
|
6099 | xg: 'xg',
|
6100 | lg: 'lg'
|
6101 | },
|
6102 | colorsMap = {
|
6103 | primary: 'primary',
|
6104 | accent: 'accent',
|
6105 | success: 'success',
|
6106 | info: 'info',
|
6107 | warning: 'warning',
|
6108 | danger: 'danger'
|
6109 | },
|
6110 | shapeMap = {
|
6111 | block: 'block',
|
6112 | round: 'round',
|
6113 | border: 'border',
|
6114 | squared: 'squared',
|
6115 | floating: 'floating',
|
6116 | pillRight: 'pill-right',
|
6117 | pillLeft: 'pill-left',
|
6118 | icon: 'icon'
|
6119 | };
|
6120 |
|
6121 | var Button = function (_Component) {
|
6122 | _inherits(Button, _Component);
|
6123 |
|
6124 | function Button(props) {
|
6125 | _classCallCheck(this, Button);
|
6126 |
|
6127 | return _possibleConstructorReturn(this, _Component.call(this, props));
|
6128 | }
|
6129 |
|
6130 | Button.prototype.render = function render() {
|
6131 | var _props = this.props,
|
6132 | colors = _props.colors,
|
6133 | shape = _props.shape,
|
6134 | disabled = _props.disabled,
|
6135 | className = _props.className,
|
6136 | size = _props.size,
|
6137 | children = _props.children,
|
6138 | htmlType = _props.htmlType,
|
6139 | clsPrefix = _props.clsPrefix,
|
6140 | others = _objectWithoutProperties(_props, ['colors', 'shape', 'disabled', 'className', 'size', 'children', 'htmlType', 'clsPrefix']);
|
6141 |
|
6142 | var clsObj = {};
|
6143 | if (className) {
|
6144 | clsObj[className] = true;
|
6145 | }
|
6146 | if (sizeMap[size]) {
|
6147 | clsObj[clsPrefix + '-' + sizeMap[size]] = true;
|
6148 | }
|
6149 | if (shapeMap[shape]) {
|
6150 | clsObj[clsPrefix + '-' + shapeMap[shape]] = true;
|
6151 | }
|
6152 | if (colorsMap[colors]) {
|
6153 | clsObj[clsPrefix + '-' + colorsMap[colors]] = true;
|
6154 | }
|
6155 | var classes = (0, _classnames2["default"])(clsPrefix, clsObj);
|
6156 | return _react2["default"].createElement(
|
6157 | 'button',
|
6158 | _extends({
|
6159 | type: htmlType,
|
6160 | className: classes,
|
6161 | disabled: disabled
|
6162 | }, others),
|
6163 | this.props.children
|
6164 | );
|
6165 | };
|
6166 |
|
6167 | return Button;
|
6168 | }(_react.Component);
|
6169 |
|
6170 | Button.propTypes = propTypes;
|
6171 | Button.defaultProps = defaultProps;
|
6172 |
|
6173 | exports["default"] = Button;
|
6174 | module.exports = exports['default'];
|
6175 |
|
6176 | /***/ },
|
6177 | /* 62 */
|
6178 | /***/ function(module, exports, __webpack_require__) {
|
6179 |
|
6180 | ;
|
6181 |
|
6182 | Object.defineProperty(exports, "__esModule", {
|
6183 | value: true
|
6184 | });
|
6185 |
|
6186 | var _FormGroup = __webpack_require__(63);
|
6187 |
|
6188 | var _FormGroup2 = _interopRequireDefault(_FormGroup);
|
6189 |
|
6190 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6191 |
|
6192 | exports["default"] = _FormGroup2["default"];
|
6193 | module.exports = exports['default'];
|
6194 |
|
6195 | /***/ },
|
6196 | /* 63 */
|
6197 | /***/ function(module, exports, __webpack_require__) {
|
6198 |
|
6199 | ;
|
6200 |
|
6201 | Object.defineProperty(exports, "__esModule", {
|
6202 | value: true
|
6203 | });
|
6204 |
|
6205 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6206 |
|
6207 | var _classnames = __webpack_require__(3);
|
6208 |
|
6209 | var _classnames2 = _interopRequireDefault(_classnames);
|
6210 |
|
6211 | var _react = __webpack_require__(4);
|
6212 |
|
6213 | var _react2 = _interopRequireDefault(_react);
|
6214 |
|
6215 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6216 |
|
6217 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6218 |
|
6219 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6220 |
|
6221 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6222 |
|
6223 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6224 |
|
6225 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6226 |
|
6227 | var propTypes = {
|
6228 | validationState: _react.PropTypes.oneOf(['success', 'warning', 'error'])
|
6229 | };
|
6230 | var defaultProps = {
|
6231 | clsPrefix: 'u-form-group'
|
6232 | };
|
6233 |
|
6234 | var FormGroup = function (_React$Component) {
|
6235 | _inherits(FormGroup, _React$Component);
|
6236 |
|
6237 | function FormGroup(props) {
|
6238 | _classCallCheck(this, FormGroup);
|
6239 |
|
6240 | return _possibleConstructorReturn(this, _React$Component.call(this, props));
|
6241 | }
|
6242 |
|
6243 | FormGroup.prototype.render = function render() {
|
6244 | var _props = this.props,
|
6245 | validationState = _props.validationState,
|
6246 | className = _props.className,
|
6247 | children = _props.children,
|
6248 | clsPrefix = _props.clsPrefix,
|
6249 | others = _objectWithoutProperties(_props, ['validationState', 'className', 'children', 'clsPrefix']);
|
6250 |
|
6251 | var classes = {};
|
6252 |
|
6253 | if (validationState) {
|
6254 | classes['has-' + validationState] = true;
|
6255 | }
|
6256 |
|
6257 | var classNames = (0, _classnames2["default"])(clsPrefix, classes);
|
6258 |
|
6259 | return _react2["default"].createElement(
|
6260 | 'div',
|
6261 | _extends({}, others, {
|
6262 | className: (0, _classnames2["default"])(className, classNames)
|
6263 | }),
|
6264 | children
|
6265 | );
|
6266 | };
|
6267 |
|
6268 | return FormGroup;
|
6269 | }(_react2["default"].Component);
|
6270 |
|
6271 | FormGroup.propTypes = propTypes;
|
6272 | FormGroup.defaultProps = defaultProps;
|
6273 |
|
6274 | exports["default"] = FormGroup;
|
6275 | module.exports = exports['default'];
|
6276 |
|
6277 | /***/ },
|
6278 | /* 64 */
|
6279 | /***/ function(module, exports, __webpack_require__) {
|
6280 |
|
6281 | ;
|
6282 |
|
6283 | Object.defineProperty(exports, "__esModule", {
|
6284 | value: true
|
6285 | });
|
6286 |
|
6287 | var _FormControl = __webpack_require__(65);
|
6288 |
|
6289 | var _FormControl2 = _interopRequireDefault(_FormControl);
|
6290 |
|
6291 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6292 |
|
6293 | exports["default"] = _FormControl2["default"];
|
6294 | module.exports = exports['default'];
|
6295 |
|
6296 | /***/ },
|
6297 | /* 65 */
|
6298 | /***/ function(module, exports, __webpack_require__) {
|
6299 |
|
6300 | ;
|
6301 |
|
6302 | Object.defineProperty(exports, "__esModule", {
|
6303 | value: true
|
6304 | });
|
6305 |
|
6306 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6307 |
|
6308 | var _react = __webpack_require__(4);
|
6309 |
|
6310 | var _react2 = _interopRequireDefault(_react);
|
6311 |
|
6312 | var _reactDom = __webpack_require__(11);
|
6313 |
|
6314 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6315 |
|
6316 | var _classnames = __webpack_require__(3);
|
6317 |
|
6318 | var _classnames2 = _interopRequireDefault(_classnames);
|
6319 |
|
6320 | var _warning = __webpack_require__(30);
|
6321 |
|
6322 | var _warning2 = _interopRequireDefault(_warning);
|
6323 |
|
6324 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6325 |
|
6326 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6327 |
|
6328 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6329 |
|
6330 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6331 |
|
6332 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6333 |
|
6334 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6335 |
|
6336 | var propTypes = {
|
6337 | componentClass: _react.PropTypes.oneOfType([_react.PropTypes.element, _react.PropTypes.string]),
|
6338 | type: _react.PropTypes.string,
|
6339 | size: _react.PropTypes.oneOf(['sm', 'md', 'lg']),
|
6340 | id: _react.PropTypes.string
|
6341 | };
|
6342 |
|
6343 | var defaultProps = {
|
6344 | componentClass: 'input',
|
6345 | clsPrefix: 'u-form-control',
|
6346 | type: 'text',
|
6347 | size: 'md'
|
6348 | };
|
6349 |
|
6350 | var FormControl = function (_React$Component) {
|
6351 | _inherits(FormControl, _React$Component);
|
6352 |
|
6353 | function FormControl() {
|
6354 | _classCallCheck(this, FormControl);
|
6355 |
|
6356 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
6357 | }
|
6358 |
|
6359 | FormControl.prototype.render = function render() {
|
6360 | var formGroup = this.context.$bs_formGroup;
|
6361 | var controlId = formGroup && formGroup.controlId;
|
6362 |
|
6363 | var _props = this.props,
|
6364 | Component = _props.componentClass,
|
6365 | type = _props.type,
|
6366 | _props$id = _props.id,
|
6367 | id = _props$id === undefined ? controlId : _props$id,
|
6368 | className = _props.className,
|
6369 | size = _props.size,
|
6370 | clsPrefix = _props.clsPrefix,
|
6371 | others = _objectWithoutProperties(_props, ['componentClass', 'type', 'id', 'className', 'size', 'clsPrefix']);
|
6372 |
|
6373 | (0, _warning2["default"])(controlId == null || id === controlId, '`controlId` is ignored on `<FormControl>` when `id` is specified.');
|
6374 |
|
6375 | // input[type="file"] 不应该有类名 .form-control.
|
6376 | var classes = {};
|
6377 | if (size) {
|
6378 | classes['' + size] = true;
|
6379 | }
|
6380 |
|
6381 | var classNames = void 0;
|
6382 | if (type !== 'file') {
|
6383 | classNames = (0, _classnames2["default"])(clsPrefix, classes);
|
6384 | }
|
6385 |
|
6386 | return _react2["default"].createElement(Component, _extends({}, others, {
|
6387 | type: type,
|
6388 | id: id,
|
6389 | className: (0, _classnames2["default"])(className, classNames)
|
6390 | }));
|
6391 | };
|
6392 |
|
6393 | return FormControl;
|
6394 | }(_react2["default"].Component);
|
6395 |
|
6396 | FormControl.propTypes = propTypes;
|
6397 | FormControl.defaultProps = defaultProps;
|
6398 |
|
6399 | exports["default"] = FormControl;
|
6400 | module.exports = exports['default'];
|
6401 |
|
6402 | /***/ },
|
6403 | /* 66 */
|
6404 | /***/ function(module, exports, __webpack_require__) {
|
6405 |
|
6406 | ;
|
6407 |
|
6408 | module.exports = __webpack_require__(67);
|
6409 |
|
6410 | /***/ },
|
6411 | /* 67 */
|
6412 | /***/ function(module, exports, __webpack_require__) {
|
6413 |
|
6414 | ;
|
6415 |
|
6416 | Object.defineProperty(exports, "__esModule", {
|
6417 | value: true
|
6418 | });
|
6419 |
|
6420 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6421 |
|
6422 | var _classnames = __webpack_require__(3);
|
6423 |
|
6424 | var _classnames2 = _interopRequireDefault(_classnames);
|
6425 |
|
6426 | var _react = __webpack_require__(4);
|
6427 |
|
6428 | var _react2 = _interopRequireDefault(_react);
|
6429 |
|
6430 | var _beeInputGroupAddon = __webpack_require__(68);
|
6431 |
|
6432 | var _beeInputGroupAddon2 = _interopRequireDefault(_beeInputGroupAddon);
|
6433 |
|
6434 | var _beeInputGroupButton = __webpack_require__(70);
|
6435 |
|
6436 | var _beeInputGroupButton2 = _interopRequireDefault(_beeInputGroupButton);
|
6437 |
|
6438 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
6439 |
|
6440 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6441 |
|
6442 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6443 |
|
6444 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6445 |
|
6446 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6447 |
|
6448 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6449 |
|
6450 | var defaultProps = {
|
6451 | clsPrefix: 'u-input-group',
|
6452 | simple: false
|
6453 | };
|
6454 |
|
6455 | var InputGroup = function (_React$Component) {
|
6456 | _inherits(InputGroup, _React$Component);
|
6457 |
|
6458 | function InputGroup() {
|
6459 | _classCallCheck(this, InputGroup);
|
6460 |
|
6461 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
6462 | }
|
6463 |
|
6464 | InputGroup.prototype.render = function render() {
|
6465 | var _props = this.props,
|
6466 | className = _props.className,
|
6467 | clsPrefix = _props.clsPrefix,
|
6468 | simple = _props.simple,
|
6469 | others = _objectWithoutProperties(_props, ['className', 'clsPrefix', 'simple']);
|
6470 |
|
6471 | return _react2['default'].createElement('span', _extends({}, others, {
|
6472 | className: (0, _classnames2['default'])(className, clsPrefix, simple && 'simple')
|
6473 | }));
|
6474 | };
|
6475 |
|
6476 | return InputGroup;
|
6477 | }(_react2['default'].Component);
|
6478 |
|
6479 | /**
|
6480 | * 将InputGroupAddon与InputGroupButton组件作为InputGroup的附属组件
|
6481 | */
|
6482 |
|
6483 |
|
6484 | InputGroup.Addon = _beeInputGroupAddon2['default'];
|
6485 | InputGroup.Button = _beeInputGroupButton2['default'];
|
6486 | InputGroup.defaultProps = defaultProps;
|
6487 | exports['default'] = InputGroup;
|
6488 | module.exports = exports['default'];
|
6489 |
|
6490 | /***/ },
|
6491 | /* 68 */
|
6492 | /***/ function(module, exports, __webpack_require__) {
|
6493 |
|
6494 | ;
|
6495 |
|
6496 | Object.defineProperty(exports, "__esModule", {
|
6497 | value: true
|
6498 | });
|
6499 |
|
6500 | var _InputGroupAddon = __webpack_require__(69);
|
6501 |
|
6502 | var _InputGroupAddon2 = _interopRequireDefault(_InputGroupAddon);
|
6503 |
|
6504 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6505 |
|
6506 | exports["default"] = _InputGroupAddon2["default"];
|
6507 | module.exports = exports['default'];
|
6508 |
|
6509 | /***/ },
|
6510 | /* 69 */
|
6511 | /***/ function(module, exports, __webpack_require__) {
|
6512 |
|
6513 | ;
|
6514 |
|
6515 | Object.defineProperty(exports, "__esModule", {
|
6516 | value: true
|
6517 | });
|
6518 |
|
6519 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6520 |
|
6521 | var _classnames = __webpack_require__(3);
|
6522 |
|
6523 | var _classnames2 = _interopRequireDefault(_classnames);
|
6524 |
|
6525 | var _react = __webpack_require__(4);
|
6526 |
|
6527 | var _react2 = _interopRequireDefault(_react);
|
6528 |
|
6529 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6530 |
|
6531 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6532 |
|
6533 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6534 |
|
6535 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6536 |
|
6537 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6538 |
|
6539 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6540 |
|
6541 | var defaultProps = {
|
6542 | clsPrefix: 'u-input-group-addon'
|
6543 | };
|
6544 |
|
6545 | var InputGroupAddon = function (_React$Component) {
|
6546 | _inherits(InputGroupAddon, _React$Component);
|
6547 |
|
6548 | function InputGroupAddon() {
|
6549 | _classCallCheck(this, InputGroupAddon);
|
6550 |
|
6551 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
6552 | }
|
6553 |
|
6554 | InputGroupAddon.prototype.render = function render() {
|
6555 | var _props = this.props;
|
6556 | var className = _props.className;
|
6557 | var clsPrefix = _props.clsPrefix;
|
6558 |
|
6559 | var others = _objectWithoutProperties(_props, ['className', 'clsPrefix']);
|
6560 |
|
6561 | return _react2["default"].createElement('span', _extends({}, others, {
|
6562 | className: (0, _classnames2["default"])(className, clsPrefix)
|
6563 | }));
|
6564 | };
|
6565 |
|
6566 | return InputGroupAddon;
|
6567 | }(_react2["default"].Component);
|
6568 |
|
6569 | InputGroupAddon.defaultProps = defaultProps;
|
6570 | exports["default"] = InputGroupAddon;
|
6571 | module.exports = exports['default'];
|
6572 |
|
6573 | /***/ },
|
6574 | /* 70 */
|
6575 | /***/ function(module, exports, __webpack_require__) {
|
6576 |
|
6577 | ;
|
6578 |
|
6579 | Object.defineProperty(exports, "__esModule", {
|
6580 | value: true
|
6581 | });
|
6582 |
|
6583 | var _InputGroupButton = __webpack_require__(71);
|
6584 |
|
6585 | var _InputGroupButton2 = _interopRequireDefault(_InputGroupButton);
|
6586 |
|
6587 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6588 |
|
6589 | exports["default"] = _InputGroupButton2["default"];
|
6590 | module.exports = exports['default'];
|
6591 |
|
6592 | /***/ },
|
6593 | /* 71 */
|
6594 | /***/ function(module, exports, __webpack_require__) {
|
6595 |
|
6596 | ;
|
6597 |
|
6598 | Object.defineProperty(exports, "__esModule", {
|
6599 | value: true
|
6600 | });
|
6601 |
|
6602 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6603 |
|
6604 | var _classnames = __webpack_require__(3);
|
6605 |
|
6606 | var _classnames2 = _interopRequireDefault(_classnames);
|
6607 |
|
6608 | var _react = __webpack_require__(4);
|
6609 |
|
6610 | var _react2 = _interopRequireDefault(_react);
|
6611 |
|
6612 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6613 |
|
6614 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6615 |
|
6616 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6617 |
|
6618 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6619 |
|
6620 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6621 |
|
6622 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6623 |
|
6624 | var defaultProps = {
|
6625 | clsPrefix: 'u-input-group-btn'
|
6626 | };
|
6627 |
|
6628 | var InputGroupButton = function (_React$Component) {
|
6629 | _inherits(InputGroupButton, _React$Component);
|
6630 |
|
6631 | function InputGroupButton() {
|
6632 | _classCallCheck(this, InputGroupButton);
|
6633 |
|
6634 | return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));
|
6635 | }
|
6636 |
|
6637 | InputGroupButton.prototype.render = function render() {
|
6638 | var _props = this.props;
|
6639 | var className = _props.className;
|
6640 | var clsPrefix = _props.clsPrefix;
|
6641 |
|
6642 | var others = _objectWithoutProperties(_props, ['className', 'clsPrefix']);
|
6643 |
|
6644 | return _react2["default"].createElement('span', _extends({}, others, {
|
6645 | className: (0, _classnames2["default"])(className, clsPrefix)
|
6646 | }));
|
6647 | };
|
6648 |
|
6649 | return InputGroupButton;
|
6650 | }(_react2["default"].Component);
|
6651 |
|
6652 | InputGroupButton.defaultProps = defaultProps;
|
6653 | exports["default"] = InputGroupButton;
|
6654 | module.exports = exports['default'];
|
6655 |
|
6656 | /***/ },
|
6657 | /* 72 */
|
6658 | /***/ function(module, exports, __webpack_require__) {
|
6659 |
|
6660 | ;
|
6661 |
|
6662 | Object.defineProperty(exports, "__esModule", {
|
6663 | value: true
|
6664 | });
|
6665 |
|
6666 | var _Dropdown = __webpack_require__(73);
|
6667 |
|
6668 | var _Dropdown2 = _interopRequireDefault(_Dropdown);
|
6669 |
|
6670 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6671 |
|
6672 | exports["default"] = _Dropdown2["default"];
|
6673 | module.exports = exports['default'];
|
6674 |
|
6675 | /***/ },
|
6676 | /* 73 */
|
6677 | /***/ function(module, exports, __webpack_require__) {
|
6678 |
|
6679 | ;
|
6680 |
|
6681 | Object.defineProperty(exports, "__esModule", {
|
6682 | value: true
|
6683 | });
|
6684 |
|
6685 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6686 |
|
6687 | var _react = __webpack_require__(4);
|
6688 |
|
6689 | var _react2 = _interopRequireDefault(_react);
|
6690 |
|
6691 | var _reactDom = __webpack_require__(11);
|
6692 |
|
6693 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6694 |
|
6695 | var _trigger = __webpack_require__(74);
|
6696 |
|
6697 | var _trigger2 = _interopRequireDefault(_trigger);
|
6698 |
|
6699 | var _placement = __webpack_require__(86);
|
6700 |
|
6701 | var _placement2 = _interopRequireDefault(_placement);
|
6702 |
|
6703 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6704 |
|
6705 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6706 |
|
6707 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
6708 |
|
6709 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6710 |
|
6711 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6712 |
|
6713 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6714 |
|
6715 | var propTypes = {
|
6716 | minOverlayWidthMatchTrigger: _react.PropTypes.bool,
|
6717 | onVisibleChange: _react.PropTypes.func,
|
6718 | clsPrefix: _react.PropTypes.string,
|
6719 | children: _react.PropTypes.any,
|
6720 | transitionName: _react.PropTypes.string,
|
6721 | overlayClassName: _react.PropTypes.string,
|
6722 | animation: _react.PropTypes.any,
|
6723 | align: _react.PropTypes.object,
|
6724 | overlayStyle: _react.PropTypes.object,
|
6725 | placement: _react.PropTypes.string,
|
6726 | trigger: _react.PropTypes.array,
|
6727 | showAction: _react.PropTypes.array,
|
6728 | hideAction: _react.PropTypes.array,
|
6729 | getPopupContainer: _react.PropTypes.func
|
6730 | };
|
6731 |
|
6732 | var defaultProps = {
|
6733 | minOverlayWidthMatchTrigger: true,
|
6734 | clsPrefix: 'u-dropdown',
|
6735 | trigger: ['hover'],
|
6736 | showAction: [],
|
6737 | hideAction: [],
|
6738 | overlayClassName: '',
|
6739 | overlayStyle: {},
|
6740 | defaultVisible: false,
|
6741 | onVisibleChange: function onVisibleChange() {},
|
6742 |
|
6743 | placement: 'bottomLeft'
|
6744 | };
|
6745 |
|
6746 | var jadgeState = function jadgeState(props) {
|
6747 | if ('visible' in props) {
|
6748 | return props.visible;
|
6749 | }
|
6750 | return props.defaultVisible;
|
6751 | };
|
6752 |
|
6753 | var Dropdown = function (_React$Component) {
|
6754 | _inherits(Dropdown, _React$Component);
|
6755 |
|
6756 | function Dropdown(props) {
|
6757 | _classCallCheck(this, Dropdown);
|
6758 |
|
6759 | var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
|
6760 |
|
6761 | _this.state = {
|
6762 | visible: jadgeState(_this.props)
|
6763 | };
|
6764 | _this.onClick = _this.onClick.bind(_this);
|
6765 | _this.onVisibleChange = _this.onVisibleChange.bind(_this);
|
6766 | _this.getMenuElement = _this.getMenuElement.bind(_this);
|
6767 | _this.getPopupDomNode = _this.getPopupDomNode.bind(_this);
|
6768 | _this.afterVisibleChange = _this.afterVisibleChange.bind(_this);
|
6769 |
|
6770 | return _this;
|
6771 | }
|
6772 |
|
6773 | Dropdown.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref) {
|
6774 | var visible = _ref.visible;
|
6775 |
|
6776 | if (visible !== undefined) {
|
6777 | this.setState({
|
6778 | visible: visible
|
6779 | });
|
6780 | }
|
6781 | };
|
6782 |
|
6783 | Dropdown.prototype.onClick = function onClick(e) {
|
6784 | var props = this.props;
|
6785 | var overlayProps = props.overlay.props;
|
6786 | // do no call onVisibleChange, if you need click to hide, use onClick and control visible
|
6787 | if (!('visible' in props)) {
|
6788 | this.setState({
|
6789 | visible: false
|
6790 | });
|
6791 | }
|
6792 | if (overlayProps.onClick) {
|
6793 | overlayProps.onClick(e);
|
6794 | }
|
6795 | };
|
6796 |
|
6797 | Dropdown.prototype.onVisibleChange = function onVisibleChange(visible) {
|
6798 | var props = this.props;
|
6799 | if (!('visible' in props)) {
|
6800 | this.setState({
|
6801 | visible: visible
|
6802 | });
|
6803 | }
|
6804 | props.onVisibleChange(visible);
|
6805 | };
|
6806 |
|
6807 | Dropdown.prototype.getMenuElement = function getMenuElement() {
|
6808 | var _props = this.props,
|
6809 | overlay = _props.overlay,
|
6810 | clsPrefix = _props.clsPrefix;
|
6811 |
|
6812 |
|
6813 | return _react2["default"].cloneElement(overlay, {
|
6814 | clsPrefix: clsPrefix + '-menu',
|
6815 | onClick: this.onClick
|
6816 | });
|
6817 | };
|
6818 |
|
6819 | Dropdown.prototype.getPopupDomNode = function getPopupDomNode() {
|
6820 | return this.refs.trigger.getPopupDomNode();
|
6821 | };
|
6822 |
|
6823 | Dropdown.prototype.afterVisibleChange = function afterVisibleChange(visible) {
|
6824 | if (visible && this.props.minOverlayWidthMatchTrigger) {
|
6825 | var overlayNode = this.getPopupDomNode();
|
6826 | var rootNode = _reactDom2["default"].findDOMNode(this);
|
6827 | if (rootNode.offsetWidth > overlayNode.offsetWidth) {
|
6828 | overlayNode.style.width = rootNode.offsetWidth + 'px';
|
6829 | }
|
6830 | }
|
6831 | };
|
6832 |
|
6833 | Dropdown.prototype.render = function render() {
|
6834 | var _props2 = this.props,
|
6835 | clsPrefix = _props2.clsPrefix,
|
6836 | children = _props2.children,
|
6837 | transitionName = _props2.transitionName,
|
6838 | animation = _props2.animation,
|
6839 | align = _props2.align,
|
6840 | placement = _props2.placement,
|
6841 | getPopupContainer = _props2.getPopupContainer,
|
6842 | showAction = _props2.showAction,
|
6843 | hideAction = _props2.hideAction,
|
6844 | overlayClassName = _props2.overlayClassName,
|
6845 | overlayStyle = _props2.overlayStyle,
|
6846 | trigger = _props2.trigger,
|
6847 | props = _objectWithoutProperties(_props2, ['clsPrefix', 'children', 'transitionName', 'animation', 'align', 'placement', 'getPopupContainer', 'showAction', 'hideAction', 'overlayClassName', 'overlayStyle', 'trigger']);
|
6848 |
|
6849 | return _react2["default"].createElement(
|
6850 | _trigger2["default"],
|
6851 | _extends({}, props, {
|
6852 | clsPrefix: clsPrefix,
|
6853 | ref: 'trigger',
|
6854 | popupClassName: overlayClassName,
|
6855 | popupStyle: overlayStyle,
|
6856 | builtinPlacements: _placement2["default"],
|
6857 | action: trigger,
|
6858 | showAction: showAction,
|
6859 | hideAction: hideAction,
|
6860 | popupPlacement: placement,
|
6861 | popupAlign: align,
|
6862 | popupTransitionName: transitionName,
|
6863 | popupAnimation: animation,
|
6864 | popupVisible: this.state.visible,
|
6865 | afterPopupVisibleChange: this.afterVisibleChange,
|
6866 | popup: this.getMenuElement(),
|
6867 | onPopupVisibleChange: this.onVisibleChange,
|
6868 | getPopupContainer: getPopupContainer
|
6869 | }),
|
6870 | children
|
6871 | );
|
6872 | };
|
6873 |
|
6874 | return Dropdown;
|
6875 | }(_react2["default"].Component);
|
6876 |
|
6877 | ;
|
6878 |
|
6879 | Dropdown.propTypes = propTypes;
|
6880 | Dropdown.defaultProps = defaultProps;
|
6881 |
|
6882 | exports["default"] = Dropdown;
|
6883 | module.exports = exports['default'];
|
6884 |
|
6885 | /***/ },
|
6886 | /* 74 */
|
6887 | /***/ function(module, exports, __webpack_require__) {
|
6888 |
|
6889 | ;
|
6890 |
|
6891 | module.exports = __webpack_require__(75);
|
6892 |
|
6893 | /***/ },
|
6894 | /* 75 */
|
6895 | /***/ function(module, exports, __webpack_require__) {
|
6896 |
|
6897 | ;
|
6898 |
|
6899 | Object.defineProperty(exports, "__esModule", {
|
6900 | value: true
|
6901 | });
|
6902 |
|
6903 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
6904 |
|
6905 | var _react = __webpack_require__(4);
|
6906 |
|
6907 | var _react2 = _interopRequireDefault(_react);
|
6908 |
|
6909 | var _reactDom = __webpack_require__(11);
|
6910 |
|
6911 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
6912 |
|
6913 | var _contains = __webpack_require__(76);
|
6914 |
|
6915 | var _contains2 = _interopRequireDefault(_contains);
|
6916 |
|
6917 | var _tinperBeeCore = __webpack_require__(25);
|
6918 |
|
6919 | var _Popup = __webpack_require__(77);
|
6920 |
|
6921 | var _Popup2 = _interopRequireDefault(_Popup);
|
6922 |
|
6923 | var _utils = __webpack_require__(85);
|
6924 |
|
6925 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
6926 |
|
6927 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
6928 |
|
6929 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
6930 |
|
6931 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
6932 |
|
6933 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
6934 |
|
6935 | //import getContainerRenderMixin from './getContainerRenderMixin';
|
6936 |
|
6937 | function noop() {}
|
6938 |
|
6939 | function returnEmptyString() {
|
6940 | return '';
|
6941 | }
|
6942 |
|
6943 | var ALL_HANDLERS = ['onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur'];
|
6944 |
|
6945 | var propTypes = {
|
6946 | children: _react.PropTypes.any,
|
6947 | action: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.arrayOf(_react.PropTypes.string)]),
|
6948 | showAction: _react.PropTypes.any,
|
6949 | hideAction: _react.PropTypes.any,
|
6950 | getPopupClassNameFromAlign: _react.PropTypes.any,
|
6951 | onPopupVisibleChange: _react.PropTypes.func,
|
6952 | afterPopupVisibleChange: _react.PropTypes.func,
|
6953 | popup: _react.PropTypes.oneOfType([_react.PropTypes.node, _react.PropTypes.func]).isRequired,
|
6954 | popupStyle: _react.PropTypes.object,
|
6955 | clsPrefix: _react.PropTypes.string,
|
6956 | popupClassName: _react.PropTypes.string,
|
6957 | popupPlacement: _react.PropTypes.string,
|
6958 | builtinPlacements: _react.PropTypes.object,
|
6959 | popupTransitionName: _react.PropTypes.string,
|
6960 | popupAnimation: _react.PropTypes.any,
|
6961 | mouseEnterDelay: _react.PropTypes.number,
|
6962 | mouseLeaveDelay: _react.PropTypes.number,
|
6963 | zIndex: _react.PropTypes.number,
|
6964 | focusDelay: _react.PropTypes.number,
|
6965 | blurDelay: _react.PropTypes.number,
|
6966 | getPopupContainer: _react.PropTypes.func,
|
6967 | destroyPopupOnHide: _react.PropTypes.bool,
|
6968 | mask: _react.PropTypes.bool,
|
6969 | maskClosable: _react.PropTypes.bool,
|
6970 | onPopupAlign: _react.PropTypes.func,
|
6971 | popupAlign: _react.PropTypes.object,
|
6972 | popupVisible: _react.PropTypes.bool,
|
6973 | maskTransitionName: _react.PropTypes.string,
|
6974 | maskAnimation: _react.PropTypes.string
|
6975 | };
|
6976 |
|
6977 | var defaultProps = {
|
6978 | clsPrefix: 'rc-trigger-popup',
|
6979 | getPopupClassNameFromAlign: returnEmptyString,
|
6980 | onPopupVisibleChange: noop,
|
6981 | afterPopupVisibleChange: noop,
|
6982 | onPopupAlign: noop,
|
6983 | popupClassName: '',
|
6984 | mouseEnterDelay: 0,
|
6985 | mouseLeaveDelay: 0.1,
|
6986 | focusDelay: 0,
|
6987 | blurDelay: 0.15,
|
6988 | popupStyle: {},
|
6989 | destroyPopupOnHide: false,
|
6990 | popupAlign: {},
|
6991 | defaultPopupVisible: false,
|
6992 | mask: false,
|
6993 | maskClosable: true,
|
6994 | action: [],
|
6995 | showAction: [],
|
6996 | hideAction: []
|
6997 | };
|
6998 |
|
6999 | var Trigger = function (_Component) {
|
7000 | _inherits(Trigger, _Component);
|
7001 |
|
7002 | function Trigger(props) {
|
7003 | _classCallCheck(this, Trigger);
|
7004 |
|
7005 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
7006 |
|
7007 | _this.state = {
|
7008 | popupVisible: !!_this.props.popupVisible || _this.props.defaultPopupVisible
|
7009 | };
|
7010 | //this.removeContainer = this.removeContainer.bind(this);
|
7011 | _this.getContainer = _this.getContainer.bind(_this);
|
7012 | _this.renderComponent = _this.renderComponent.bind(_this);
|
7013 | _this.isVisible = _this.isVisible.bind(_this);
|
7014 |
|
7015 | _this.onMouseEnter = _this.onMouseEnter.bind(_this);
|
7016 | _this.onMouseLeave = _this.onMouseLeave.bind(_this);
|
7017 | _this.onPopupMouseEnter = _this.onPopupMouseEnter.bind(_this);
|
7018 | _this.onPopupMouseLeave = _this.onPopupMouseLeave.bind(_this);
|
7019 | _this.onFocus = _this.onFocus.bind(_this);
|
7020 |
|
7021 | _this.onMouseDown = _this.onMouseDown.bind(_this);
|
7022 | _this.onTouchStart = _this.onTouchStart.bind(_this);
|
7023 | _this.onBlur = _this.onBlur.bind(_this);
|
7024 | _this.onDocumentClick = _this.onDocumentClick.bind(_this);
|
7025 | _this.getPopupDomNode = _this.getPopupDomNode.bind(_this);
|
7026 |
|
7027 | _this.getRootDomNode = _this.getRootDomNode.bind(_this);
|
7028 | _this.getPopupClassNameFromAlign = _this.getPopupClassNameFromAlign.bind(_this);
|
7029 | _this.getPopupAlign = _this.getPopupAlign.bind(_this);
|
7030 | _this.getComponent = _this.getComponent.bind(_this);
|
7031 | _this.setPopupVisible = _this.setPopupVisible.bind(_this);
|
7032 |
|
7033 | _this.delaySetPopupVisible = _this.delaySetPopupVisible.bind(_this);
|
7034 | _this.clearDelayTimer = _this.clearDelayTimer.bind(_this);
|
7035 | _this.createTwoChains = _this.createTwoChains.bind(_this);
|
7036 | _this.isClickToShow = _this.isClickToShow.bind(_this);
|
7037 | _this.isClickToHide = _this.isClickToHide.bind(_this);
|
7038 |
|
7039 | _this.isMouseEnterToShow = _this.isMouseEnterToShow.bind(_this);
|
7040 | _this.isMouseLeaveToHide = _this.isMouseLeaveToHide.bind(_this);
|
7041 | _this.isFocusToShow = _this.isFocusToShow.bind(_this);
|
7042 | _this.isBlurToHide = _this.isBlurToHide.bind(_this);
|
7043 | _this.forcePopupAlign = _this.forcePopupAlign.bind(_this);
|
7044 |
|
7045 | _this.fireEvents = _this.fireEvents.bind(_this);
|
7046 | _this.close = _this.close.bind(_this);
|
7047 | _this.onClick = _this.onClick.bind(_this);
|
7048 | return _this;
|
7049 | }
|
7050 |
|
7051 | Trigger.prototype.isVisible = function isVisible(instance) {
|
7052 | return instance.state.popupVisible;
|
7053 | };
|
7054 |
|
7055 | Trigger.prototype.getContainer = function getContainer(instance) {
|
7056 | var popupContainer = document.createElement('div');
|
7057 | var mountNode = instance.props.getPopupContainer ? instance.props.getPopupContainer((0, _reactDom.findDOMNode)(instance)) : document.body;
|
7058 | mountNode.appendChild(popupContainer);
|
7059 | return popupContainer;
|
7060 | };
|
7061 |
|
7062 | Trigger.prototype.renderComponent = function renderComponent(instance, componentArg, ready) {
|
7063 | if (instance._component || this.isVisible(instance)) {
|
7064 | if (!instance._container) {
|
7065 | instance._container = this.getContainer(instance);
|
7066 | }
|
7067 | var component = instance.getComponent(componentArg);
|
7068 | _reactDom2["default"].unstable_renderSubtreeIntoContainer(instance, component, instance._container, function callback() {
|
7069 | instance._component = this;
|
7070 | if (ready) {
|
7071 | ready.call(this);
|
7072 | }
|
7073 | });
|
7074 | }
|
7075 | };
|
7076 |
|
7077 | Trigger.prototype.componentWillMount = function componentWillMount() {
|
7078 | var _this2 = this;
|
7079 |
|
7080 | this.mounted = false;
|
7081 | ALL_HANDLERS.forEach(function (h) {
|
7082 | _this2['fire' + h] = function (e) {
|
7083 | _this2.fireEvents(h, e);
|
7084 | };
|
7085 | });
|
7086 | };
|
7087 |
|
7088 | Trigger.prototype.componentDidMount = function componentDidMount() {
|
7089 | this.mounted = true;
|
7090 | this.componentDidUpdate({}, {
|
7091 | popupVisible: this.state.popupVisible
|
7092 | });
|
7093 | };
|
7094 |
|
7095 | Trigger.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref) {
|
7096 | var popupVisible = _ref.popupVisible;
|
7097 |
|
7098 | if (popupVisible !== undefined) {
|
7099 | this.setState({
|
7100 | popupVisible: popupVisible
|
7101 | });
|
7102 | }
|
7103 | };
|
7104 |
|
7105 | Trigger.prototype.componentDidUpdate = function componentDidUpdate(_, prevState) {
|
7106 | var props = this.props;
|
7107 | var state = this.state;
|
7108 | this.renderComponent(this, null, function () {
|
7109 | if (prevState.popupVisible !== state.popupVisible) {
|
7110 | props.afterPopupVisibleChange(state.popupVisible);
|
7111 | }
|
7112 | });
|
7113 | if (this.isClickToHide()) {
|
7114 | if (state.popupVisible) {
|
7115 | if (!this.clickOutsideHandler) {
|
7116 | this.clickOutsideHandler = (0, _tinperBeeCore.addEventListener)(document, 'mousedown', this.onDocumentClick);
|
7117 | this.touchOutsideHandler = (0, _tinperBeeCore.addEventListener)(document, 'touchstart', this.onDocumentClick);
|
7118 | }
|
7119 | return;
|
7120 | }
|
7121 | }
|
7122 | if (this.clickOutsideHandler) {
|
7123 | this.clickOutsideHandler.remove();
|
7124 | this.touchOutsideHandler.remove();
|
7125 | this.clickOutsideHandler = null;
|
7126 | this.touchOutsideHandler = null;
|
7127 | }
|
7128 | };
|
7129 |
|
7130 | Trigger.prototype.componentWillUnmount = function componentWillUnmount() {
|
7131 | this.clearDelayTimer();
|
7132 | if (this.clickOutsideHandler) {
|
7133 | this.clickOutsideHandler.remove();
|
7134 | this.touchOutsideHandler.remove();
|
7135 | this.clickOutsideHandler = null;
|
7136 | this.touchOutsideHandler = null;
|
7137 | }
|
7138 | //this.removeContainer();
|
7139 | };
|
7140 |
|
7141 | Trigger.prototype.onMouseEnter = function onMouseEnter(e) {
|
7142 | this.fireEvents('onMouseEnter', e);
|
7143 | this.delaySetPopupVisible(true, this.props.mouseEnterDelay);
|
7144 | };
|
7145 |
|
7146 | Trigger.prototype.onMouseLeave = function onMouseLeave(e) {
|
7147 | this.fireEvents('onMouseLeave', e);
|
7148 | this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
|
7149 | };
|
7150 |
|
7151 | Trigger.prototype.onPopupMouseEnter = function onPopupMouseEnter() {
|
7152 | this.clearDelayTimer();
|
7153 | };
|
7154 |
|
7155 | Trigger.prototype.onPopupMouseLeave = function onPopupMouseLeave(e) {
|
7156 | // https://github.com/react-component/trigger/pull/13
|
7157 | // react bug?
|
7158 | if (e.relatedTarget && !e.relatedTarget.setTimeout && this._component && (0, _contains2["default"])(this._component.getPopupDomNode(), e.relatedTarget)) {
|
7159 | return;
|
7160 | }
|
7161 | this.delaySetPopupVisible(false, this.props.mouseLeaveDelay);
|
7162 | };
|
7163 |
|
7164 | Trigger.prototype.onFocus = function onFocus(e) {
|
7165 | this.fireEvents('onFocus', e);
|
7166 | // incase focusin and focusout
|
7167 | this.clearDelayTimer();
|
7168 | if (this.isFocusToShow()) {
|
7169 | this.focusTime = Date.now();
|
7170 | this.delaySetPopupVisible(true, this.props.focusDelay);
|
7171 | }
|
7172 | };
|
7173 |
|
7174 | Trigger.prototype.onMouseDown = function onMouseDown(e) {
|
7175 | this.fireEvents('onMouseDown', e);
|
7176 | this.preClickTime = Date.now();
|
7177 | };
|
7178 |
|
7179 | Trigger.prototype.onTouchStart = function onTouchStart(e) {
|
7180 | this.fireEvents('onTouchStart', e);
|
7181 | this.preTouchTime = Date.now();
|
7182 | };
|
7183 |
|
7184 | Trigger.prototype.onBlur = function onBlur(e) {
|
7185 | this.fireEvents('onBlur', e);
|
7186 | this.clearDelayTimer();
|
7187 | if (this.isBlurToHide()) {
|
7188 | this.delaySetPopupVisible(false, this.props.blurDelay);
|
7189 | }
|
7190 | };
|
7191 |
|
7192 | Trigger.prototype.onClick = function onClick(event) {
|
7193 | this.fireEvents('onClick', event);
|
7194 | // focus will trigger click
|
7195 | if (this.focusTime) {
|
7196 | var preTime = void 0;
|
7197 | if (this.preClickTime && this.preTouchTime) {
|
7198 | preTime = Math.min(this.preClickTime, this.preTouchTime);
|
7199 | } else if (this.preClickTime) {
|
7200 | preTime = this.preClickTime;
|
7201 | } else if (this.preTouchTime) {
|
7202 | preTime = this.preTouchTime;
|
7203 | }
|
7204 | if (Math.abs(preTime - this.focusTime) < 20) {
|
7205 | return;
|
7206 | }
|
7207 | this.focusTime = 0;
|
7208 | }
|
7209 | this.preClickTime = 0;
|
7210 | this.preTouchTime = 0;
|
7211 | event.preventDefault();
|
7212 | var nextVisible = !this.state.popupVisible;
|
7213 | if (this.isClickToHide() && !nextVisible || nextVisible && this.isClickToShow()) {
|
7214 | this.setPopupVisible(!this.state.popupVisible);
|
7215 | }
|
7216 | };
|
7217 |
|
7218 | Trigger.prototype.onDocumentClick = function onDocumentClick(event) {
|
7219 | if (this.props.mask && !this.props.maskClosable) {
|
7220 | return;
|
7221 | }
|
7222 | var target = event.target;
|
7223 | var root = (0, _reactDom.findDOMNode)(this);
|
7224 | var popupNode = this.getPopupDomNode();
|
7225 | if (!(0, _contains2["default"])(root, target) && !(0, _contains2["default"])(popupNode, target)) {
|
7226 | this.close();
|
7227 | }
|
7228 | };
|
7229 |
|
7230 | Trigger.prototype.getPopupDomNode = function getPopupDomNode() {
|
7231 | // for test
|
7232 | if (this._component) {
|
7233 | return this.mounted ? this._component.getPopupDomNode() : null;
|
7234 | }
|
7235 | return null;
|
7236 | };
|
7237 |
|
7238 | Trigger.prototype.getRootDomNode = function getRootDomNode() {
|
7239 | return _reactDom2["default"].findDOMNode(this);
|
7240 | };
|
7241 |
|
7242 | Trigger.prototype.getPopupClassNameFromAlign = function getPopupClassNameFromAlign(align) {
|
7243 | var className = [];
|
7244 | var props = this.props;
|
7245 | var popupPlacement = props.popupPlacement,
|
7246 | builtinPlacements = props.builtinPlacements,
|
7247 | clsPrefix = props.clsPrefix;
|
7248 |
|
7249 | if (popupPlacement && builtinPlacements) {
|
7250 | className.push((0, _utils.getPopupClassNameFromAlign)(builtinPlacements, clsPrefix, align));
|
7251 | }
|
7252 | if (props.getPopupClassNameFromAlign) {
|
7253 | className.push(props.getPopupClassNameFromAlign(align));
|
7254 | }
|
7255 | return className.join(' ');
|
7256 | };
|
7257 |
|
7258 | Trigger.prototype.getPopupAlign = function getPopupAlign() {
|
7259 | var props = this.props;
|
7260 | var popupPlacement = props.popupPlacement,
|
7261 | popupAlign = props.popupAlign,
|
7262 | builtinPlacements = props.builtinPlacements;
|
7263 |
|
7264 | if (popupPlacement && builtinPlacements) {
|
7265 | return (0, _utils.getAlignFromPlacement)(builtinPlacements, popupPlacement, popupAlign);
|
7266 | }
|
7267 | return popupAlign;
|
7268 | };
|
7269 |
|
7270 | Trigger.prototype.getComponent = function getComponent() {
|
7271 | var props = this.props,
|
7272 | state = this.state;
|
7273 |
|
7274 | var mouseProps = {};
|
7275 | if (this.isMouseEnterToShow()) {
|
7276 | mouseProps.onMouseEnter = this.onPopupMouseEnter;
|
7277 | }
|
7278 | if (this.isMouseLeaveToHide()) {
|
7279 | mouseProps.onMouseLeave = this.onPopupMouseLeave;
|
7280 | }
|
7281 | return _react2["default"].createElement(
|
7282 | _Popup2["default"],
|
7283 | _extends({
|
7284 | clsPrefix: props.clsPrefix,
|
7285 | destroyPopupOnHide: props.destroyPopupOnHide,
|
7286 | visible: state.popupVisible,
|
7287 | className: props.popupClassName,
|
7288 | action: props.action,
|
7289 | align: this.getPopupAlign(),
|
7290 | onAlign: props.onPopupAlign,
|
7291 | animation: props.popupAnimation,
|
7292 | getClassNameFromAlign: this.getPopupClassNameFromAlign
|
7293 | }, mouseProps, {
|
7294 | getRootDomNode: this.getRootDomNode,
|
7295 | style: props.popupStyle,
|
7296 | mask: props.mask,
|
7297 | zIndex: props.zIndex,
|
7298 | transitionName: props.popupTransitionName,
|
7299 | maskAnimation: props.maskAnimation,
|
7300 | maskTransitionName: props.maskTransitionName
|
7301 | }),
|
7302 | typeof props.popup === 'function' ? props.popup() : props.popup
|
7303 | );
|
7304 | };
|
7305 |
|
7306 | Trigger.prototype.setPopupVisible = function setPopupVisible(popupVisible) {
|
7307 | this.clearDelayTimer();
|
7308 | if (this.state.popupVisible !== popupVisible) {
|
7309 | if (!('popupVisible' in this.props)) {
|
7310 | this.setState({
|
7311 | popupVisible: popupVisible
|
7312 | });
|
7313 | }
|
7314 | this.props.onPopupVisibleChange(popupVisible);
|
7315 | }
|
7316 | };
|
7317 |
|
7318 | Trigger.prototype.delaySetPopupVisible = function delaySetPopupVisible(visible, delayS) {
|
7319 | var _this3 = this;
|
7320 |
|
7321 | var delay = delayS * 1000;
|
7322 | this.clearDelayTimer();
|
7323 | if (delay) {
|
7324 | this.delayTimer = setTimeout(function () {
|
7325 | _this3.setPopupVisible(visible);
|
7326 | _this3.clearDelayTimer();
|
7327 | }, delay);
|
7328 | } else {
|
7329 | this.setPopupVisible(visible);
|
7330 | }
|
7331 | };
|
7332 |
|
7333 | Trigger.prototype.clearDelayTimer = function clearDelayTimer() {
|
7334 | if (this.delayTimer) {
|
7335 | clearTimeout(this.delayTimer);
|
7336 | this.delayTimer = null;
|
7337 | }
|
7338 | };
|
7339 |
|
7340 | Trigger.prototype.createTwoChains = function createTwoChains(event) {
|
7341 | var childPros = this.props.children.props;
|
7342 | var props = this.props;
|
7343 | if (childPros[event] && props[event]) {
|
7344 | return this['fire' + event];
|
7345 | }
|
7346 | return childPros[event] || props[event];
|
7347 | };
|
7348 |
|
7349 | Trigger.prototype.isClickToShow = function isClickToShow() {
|
7350 | var _props = this.props,
|
7351 | action = _props.action,
|
7352 | showAction = _props.showAction;
|
7353 |
|
7354 | return action.indexOf('click') !== -1 || showAction.indexOf('click') !== -1;
|
7355 | };
|
7356 |
|
7357 | Trigger.prototype.isClickToHide = function isClickToHide() {
|
7358 | var _props2 = this.props,
|
7359 | action = _props2.action,
|
7360 | hideAction = _props2.hideAction;
|
7361 |
|
7362 | return action.indexOf('click') !== -1 || hideAction.indexOf('click') !== -1;
|
7363 | };
|
7364 |
|
7365 | Trigger.prototype.isMouseEnterToShow = function isMouseEnterToShow() {
|
7366 | var _props3 = this.props,
|
7367 | action = _props3.action,
|
7368 | showAction = _props3.showAction;
|
7369 |
|
7370 | return action.indexOf('hover') !== -1 || showAction.indexOf('mouseEnter') !== -1;
|
7371 | };
|
7372 |
|
7373 | Trigger.prototype.isMouseLeaveToHide = function isMouseLeaveToHide() {
|
7374 | var _props4 = this.props,
|
7375 | action = _props4.action,
|
7376 | hideAction = _props4.hideAction;
|
7377 |
|
7378 | return action.indexOf('hover') !== -1 || hideAction.indexOf('mouseLeave') !== -1;
|
7379 | };
|
7380 |
|
7381 | Trigger.prototype.isFocusToShow = function isFocusToShow() {
|
7382 | var _props5 = this.props,
|
7383 | action = _props5.action,
|
7384 | showAction = _props5.showAction;
|
7385 |
|
7386 | return action.indexOf('focus') !== -1 || showAction.indexOf('focus') !== -1;
|
7387 | };
|
7388 |
|
7389 | Trigger.prototype.isBlurToHide = function isBlurToHide() {
|
7390 | var _props6 = this.props,
|
7391 | action = _props6.action,
|
7392 | hideAction = _props6.hideAction;
|
7393 |
|
7394 | return action.indexOf('focus') !== -1 || hideAction.indexOf('blur') !== -1;
|
7395 | };
|
7396 |
|
7397 | Trigger.prototype.forcePopupAlign = function forcePopupAlign() {
|
7398 | if (this.state.popupVisible && this.popupInstance && this.popupInstance.alignInstance) {
|
7399 | this.popupInstance.alignInstance.forceAlign();
|
7400 | }
|
7401 | };
|
7402 |
|
7403 | Trigger.prototype.fireEvents = function fireEvents(type, e) {
|
7404 | var childCallback = this.props.children.props[type];
|
7405 | if (childCallback) {
|
7406 | childCallback(e);
|
7407 | }
|
7408 | var callback = this.props[type];
|
7409 | if (callback) {
|
7410 | callback(e);
|
7411 | }
|
7412 | };
|
7413 |
|
7414 | Trigger.prototype.close = function close() {
|
7415 | this.setPopupVisible(false);
|
7416 | };
|
7417 |
|
7418 | Trigger.prototype.render = function render() {
|
7419 | var props = this.props;
|
7420 | var children = props.children;
|
7421 | var child = _react2["default"].Children.only(children);
|
7422 | var newChildProps = {};
|
7423 |
|
7424 | if (this.isClickToHide() || this.isClickToShow()) {
|
7425 | newChildProps.onClick = this.onClick;
|
7426 | newChildProps.onMouseDown = this.onMouseDown;
|
7427 | newChildProps.onTouchStart = this.onTouchStart;
|
7428 | } else {
|
7429 | newChildProps.onClick = this.createTwoChains('onClick');
|
7430 | newChildProps.onMouseDown = this.createTwoChains('onMouseDown');
|
7431 | newChildProps.onTouchStart = this.createTwoChains('onTouchStart');
|
7432 | }
|
7433 | if (this.isMouseEnterToShow()) {
|
7434 | newChildProps.onMouseEnter = this.onMouseEnter;
|
7435 | } else {
|
7436 | newChildProps.onMouseEnter = this.createTwoChains('onMouseEnter');
|
7437 | }
|
7438 | if (this.isMouseLeaveToHide()) {
|
7439 | newChildProps.onMouseLeave = this.onMouseLeave;
|
7440 | } else {
|
7441 | newChildProps.onMouseLeave = this.createTwoChains('onMouseLeave');
|
7442 | }
|
7443 | if (this.isFocusToShow() || this.isBlurToHide()) {
|
7444 | newChildProps.onFocus = this.onFocus;
|
7445 | newChildProps.onBlur = this.onBlur;
|
7446 | } else {
|
7447 | newChildProps.onFocus = this.createTwoChains('onFocus');
|
7448 | newChildProps.onBlur = this.createTwoChains('onBlur');
|
7449 | }
|
7450 |
|
7451 | return _react2["default"].cloneElement(child, newChildProps);
|
7452 | };
|
7453 |
|
7454 | return Trigger;
|
7455 | }(_react.Component);
|
7456 |
|
7457 | ;
|
7458 |
|
7459 | Trigger.propTypes = propTypes;
|
7460 | Trigger.defaultProps = defaultProps;
|
7461 | exports["default"] = Trigger;
|
7462 | module.exports = exports['default'];
|
7463 |
|
7464 | /***/ },
|
7465 | /* 76 */
|
7466 | /***/ function(module, exports, __webpack_require__) {
|
7467 |
|
7468 | ;
|
7469 |
|
7470 | Object.defineProperty(exports, "__esModule", {
|
7471 | value: true
|
7472 | });
|
7473 |
|
7474 | var _inDOM = __webpack_require__(13);
|
7475 |
|
7476 | var _inDOM2 = _interopRequireDefault(_inDOM);
|
7477 |
|
7478 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
7479 |
|
7480 | exports.default = function () {
|
7481 | // HTML DOM and SVG DOM may have different support levels,
|
7482 | // so we need to check on context instead of a document root element.
|
7483 | return _inDOM2.default ? function (context, node) {
|
7484 | if (context.contains) {
|
7485 | return context.contains(node);
|
7486 | } else if (context.compareDocumentPosition) {
|
7487 | return context === node || !!(context.compareDocumentPosition(node) & 16);
|
7488 | } else {
|
7489 | return fallback(context, node);
|
7490 | }
|
7491 | } : fallback;
|
7492 | }();
|
7493 |
|
7494 | function fallback(context, node) {
|
7495 | if (node) do {
|
7496 | if (node === context) return true;
|
7497 | } while (node = node.parentNode);
|
7498 |
|
7499 | return false;
|
7500 | }
|
7501 | module.exports = exports['default'];
|
7502 |
|
7503 | /***/ },
|
7504 | /* 77 */
|
7505 | /***/ function(module, exports, __webpack_require__) {
|
7506 |
|
7507 | ;
|
7508 |
|
7509 | Object.defineProperty(exports, "__esModule", {
|
7510 | value: true
|
7511 | });
|
7512 |
|
7513 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
7514 |
|
7515 | var _react = __webpack_require__(4);
|
7516 |
|
7517 | var _react2 = _interopRequireDefault(_react);
|
7518 |
|
7519 | var _reactDom = __webpack_require__(11);
|
7520 |
|
7521 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
7522 |
|
7523 | var _Align = __webpack_require__(48);
|
7524 |
|
7525 | var _Align2 = _interopRequireDefault(_Align);
|
7526 |
|
7527 | var _beeAnimate = __webpack_require__(78);
|
7528 |
|
7529 | var _beeAnimate2 = _interopRequireDefault(_beeAnimate);
|
7530 |
|
7531 | var _PopupInner = __webpack_require__(83);
|
7532 |
|
7533 | var _PopupInner2 = _interopRequireDefault(_PopupInner);
|
7534 |
|
7535 | var _LazyRenderBox = __webpack_require__(84);
|
7536 |
|
7537 | var _LazyRenderBox2 = _interopRequireDefault(_LazyRenderBox);
|
7538 |
|
7539 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7540 |
|
7541 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7542 |
|
7543 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7544 |
|
7545 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7546 |
|
7547 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
7548 |
|
7549 | var propTypes = {
|
7550 | visible: _react.PropTypes.bool,
|
7551 | style: _react.PropTypes.object,
|
7552 | getClassNameFromAlign: _react.PropTypes.func,
|
7553 | onAlign: _react.PropTypes.func,
|
7554 | getRootDomNode: _react.PropTypes.func,
|
7555 | onMouseEnter: _react.PropTypes.func,
|
7556 | align: _react.PropTypes.any,
|
7557 | destroyPopupOnHide: _react.PropTypes.bool,
|
7558 | className: _react.PropTypes.string,
|
7559 | clsPrefix: _react.PropTypes.string,
|
7560 | onMouseLeave: _react.PropTypes.func
|
7561 | };
|
7562 |
|
7563 | var Popup = function (_Component) {
|
7564 | _inherits(Popup, _Component);
|
7565 |
|
7566 | function Popup() {
|
7567 | _classCallCheck(this, Popup);
|
7568 |
|
7569 | var _this = _possibleConstructorReturn(this, _Component.call(this));
|
7570 |
|
7571 | _this.onAlign = _this.onAlign.bind(_this);
|
7572 | _this.getPopupDomNode = _this.getPopupDomNode.bind(_this);
|
7573 | _this.getTarget = _this.getTarget.bind(_this);
|
7574 | _this.getMaskTransitionName = _this.getMaskTransitionName.bind(_this);
|
7575 | _this.getTransitionName = _this.getTransitionName.bind(_this);
|
7576 | _this.getClassName = _this.getClassName.bind(_this);
|
7577 | _this.getPopupElement = _this.getPopupElement.bind(_this);
|
7578 | _this.getZIndexStyle = _this.getZIndexStyle.bind(_this);
|
7579 | _this.getMaskElement = _this.getMaskElement.bind(_this);
|
7580 | _this.saveAlign = _this.saveAlign.bind(_this);
|
7581 | return _this;
|
7582 | }
|
7583 |
|
7584 | Popup.prototype.componentDidMount = function componentDidMount() {
|
7585 | this.rootNode = this.getPopupDomNode();
|
7586 | };
|
7587 |
|
7588 | Popup.prototype.onAlign = function onAlign(popupDomNode, align) {
|
7589 | var props = this.props;
|
7590 | var alignClassName = props.getClassNameFromAlign(props.align);
|
7591 | var currentAlignClassName = props.getClassNameFromAlign(align);
|
7592 | if (alignClassName !== currentAlignClassName) {
|
7593 | this.currentAlignClassName = currentAlignClassName;
|
7594 | popupDomNode.className = this.getClassName(currentAlignClassName);
|
7595 | }
|
7596 | props.onAlign(popupDomNode, align);
|
7597 | };
|
7598 |
|
7599 | Popup.prototype.getPopupDomNode = function getPopupDomNode() {
|
7600 | return _reactDom2["default"].findDOMNode(this.refs.popup);
|
7601 | };
|
7602 |
|
7603 | Popup.prototype.getTarget = function getTarget() {
|
7604 | return this.props.getRootDomNode();
|
7605 | };
|
7606 |
|
7607 | Popup.prototype.getMaskTransitionName = function getMaskTransitionName() {
|
7608 | var props = this.props;
|
7609 | var transitionName = props.maskTransitionName;
|
7610 | var animation = props.maskAnimation;
|
7611 | if (!transitionName && animation) {
|
7612 | transitionName = props.clsPrefix + '-' + animation;
|
7613 | }
|
7614 | return transitionName;
|
7615 | };
|
7616 |
|
7617 | Popup.prototype.getTransitionName = function getTransitionName() {
|
7618 | var props = this.props;
|
7619 | var transitionName = props.transitionName;
|
7620 | if (!transitionName && props.animation) {
|
7621 | transitionName = props.clsPrefix + '-' + props.animation;
|
7622 | }
|
7623 | return transitionName;
|
7624 | };
|
7625 |
|
7626 | Popup.prototype.getClassName = function getClassName(currentAlignClassName) {
|
7627 | return this.props.clsPrefix + ' ' + this.props.className + ' ' + currentAlignClassName;
|
7628 | };
|
7629 |
|
7630 | Popup.prototype.getPopupElement = function getPopupElement() {
|
7631 | var props = this.props;
|
7632 | var align = props.align,
|
7633 | style = props.style,
|
7634 | visible = props.visible,
|
7635 | clsPrefix = props.clsPrefix,
|
7636 | destroyPopupOnHide = props.destroyPopupOnHide;
|
7637 |
|
7638 | var className = this.getClassName(this.currentAlignClassName || props.getClassNameFromAlign(align));
|
7639 | var hiddenClassName = clsPrefix + '-hidden';
|
7640 | if (!visible) {
|
7641 | this.currentAlignClassName = null;
|
7642 | }
|
7643 | var newStyle = _extends({}, style, this.getZIndexStyle());
|
7644 | var popupInnerProps = {
|
7645 | className: className,
|
7646 | clsPrefix: clsPrefix,
|
7647 | ref: 'popup',
|
7648 | onMouseEnter: props.onMouseEnter,
|
7649 | onMouseLeave: props.onMouseLeave,
|
7650 | style: newStyle
|
7651 | };
|
7652 | if (destroyPopupOnHide) {
|
7653 | return _react2["default"].createElement(
|
7654 | _beeAnimate2["default"],
|
7655 | {
|
7656 | component: '',
|
7657 | exclusive: true,
|
7658 | transitionAppear: true,
|
7659 | transitionName: this.getTransitionName()
|
7660 | },
|
7661 | visible ? _react2["default"].createElement(
|
7662 | _Align2["default"],
|
7663 | {
|
7664 | target: this.getTarget,
|
7665 | key: 'popup',
|
7666 | ref: this.saveAlign,
|
7667 | monitorWindowResize: true,
|
7668 | align: align,
|
7669 | onAlign: this.onAlign
|
7670 | },
|
7671 | _react2["default"].createElement(
|
7672 | _PopupInner2["default"],
|
7673 | _extends({
|
7674 | visible: true
|
7675 | }, popupInnerProps),
|
7676 | props.children
|
7677 | )
|
7678 | ) : null
|
7679 | );
|
7680 | }
|
7681 | return _react2["default"].createElement(
|
7682 | _beeAnimate2["default"],
|
7683 | {
|
7684 | component: '',
|
7685 | exclusive: true,
|
7686 | transitionAppear: true,
|
7687 | transitionName: this.getTransitionName(),
|
7688 | showProp: 'xVisible'
|
7689 | },
|
7690 | _react2["default"].createElement(
|
7691 | _Align2["default"],
|
7692 | {
|
7693 | target: this.getTarget,
|
7694 | key: 'popup',
|
7695 | ref: this.saveAlign,
|
7696 | monitorWindowResize: true,
|
7697 | xVisible: visible,
|
7698 | childrenProps: { visible: 'xVisible' },
|
7699 | disabled: !visible,
|
7700 | align: align,
|
7701 | onAlign: this.onAlign
|
7702 | },
|
7703 | _react2["default"].createElement(
|
7704 | _PopupInner2["default"],
|
7705 | _extends({
|
7706 | hiddenClassName: hiddenClassName
|
7707 | }, popupInnerProps),
|
7708 | props.children
|
7709 | )
|
7710 | )
|
7711 | );
|
7712 | };
|
7713 |
|
7714 | Popup.prototype.getZIndexStyle = function getZIndexStyle() {
|
7715 | var style = {};
|
7716 | var props = this.props;
|
7717 | if (props.zIndex !== undefined) {
|
7718 | style.zIndex = props.zIndex;
|
7719 | }
|
7720 | return style;
|
7721 | };
|
7722 |
|
7723 | Popup.prototype.getMaskElement = function getMaskElement() {
|
7724 | var props = this.props;
|
7725 | var maskElement = void 0;
|
7726 | if (props.mask) {
|
7727 | var maskTransition = this.getMaskTransitionName();
|
7728 | maskElement = _react2["default"].createElement(_LazyRenderBox2["default"], {
|
7729 | style: this.getZIndexStyle(),
|
7730 | key: 'mask',
|
7731 | className: props.clsPrefix + '-mask',
|
7732 | hiddenClassName: props.clsPrefix + '-mask-hidden',
|
7733 | visible: props.visible
|
7734 | });
|
7735 | if (maskTransition) {
|
7736 | maskElement = _react2["default"].createElement(
|
7737 | _beeAnimate2["default"],
|
7738 | {
|
7739 | key: 'mask',
|
7740 | showProp: 'visible',
|
7741 | transitionAppear: true,
|
7742 | component: '',
|
7743 | transitionName: maskTransition
|
7744 | },
|
7745 | maskElement
|
7746 | );
|
7747 | }
|
7748 | }
|
7749 | return maskElement;
|
7750 | };
|
7751 |
|
7752 | Popup.prototype.saveAlign = function saveAlign(align) {
|
7753 | this.alignInstance = align;
|
7754 | };
|
7755 |
|
7756 | Popup.prototype.render = function render() {
|
7757 | return _react2["default"].createElement(
|
7758 | 'div',
|
7759 | null,
|
7760 | this.getMaskElement(),
|
7761 | this.getPopupElement()
|
7762 | );
|
7763 | };
|
7764 |
|
7765 | return Popup;
|
7766 | }(_react.Component);
|
7767 |
|
7768 | ;
|
7769 |
|
7770 | Popup.propTypes = propTypes;
|
7771 | exports["default"] = Popup;
|
7772 | module.exports = exports['default'];
|
7773 |
|
7774 | /***/ },
|
7775 | /* 78 */
|
7776 | /***/ function(module, exports, __webpack_require__) {
|
7777 |
|
7778 | ;
|
7779 |
|
7780 | Object.defineProperty(exports, "__esModule", {
|
7781 | value: true
|
7782 | });
|
7783 |
|
7784 | var _Animate = __webpack_require__(79);
|
7785 |
|
7786 | var _Animate2 = _interopRequireDefault(_Animate);
|
7787 |
|
7788 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7789 |
|
7790 | exports["default"] = _Animate2["default"];
|
7791 | module.exports = exports['default'];
|
7792 |
|
7793 | /***/ },
|
7794 | /* 79 */
|
7795 | /***/ function(module, exports, __webpack_require__) {
|
7796 |
|
7797 | ;
|
7798 |
|
7799 | Object.defineProperty(exports, "__esModule", {
|
7800 | value: true
|
7801 | });
|
7802 |
|
7803 | var _react = __webpack_require__(4);
|
7804 |
|
7805 | var _react2 = _interopRequireDefault(_react);
|
7806 |
|
7807 | var _ChildrenUtils = __webpack_require__(80);
|
7808 |
|
7809 | var _AnimateChild = __webpack_require__(81);
|
7810 |
|
7811 | var _AnimateChild2 = _interopRequireDefault(_AnimateChild);
|
7812 |
|
7813 | var _util = __webpack_require__(82);
|
7814 |
|
7815 | var _util2 = _interopRequireDefault(_util);
|
7816 |
|
7817 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
7818 |
|
7819 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
7820 |
|
7821 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
7822 |
|
7823 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
7824 |
|
7825 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
7826 |
|
7827 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
7828 |
|
7829 | var defaultKey = 'u_animate_' + Date.now();
|
7830 |
|
7831 |
|
7832 | function getChildrenFromProps(props) {
|
7833 | var children = props.children;
|
7834 | if (_react2["default"].isValidElement(children)) {
|
7835 | if (!children.key) {
|
7836 | return _react2["default"].cloneElement(children, {
|
7837 | key: defaultKey
|
7838 | });
|
7839 | }
|
7840 | }
|
7841 | return children;
|
7842 | }
|
7843 |
|
7844 | function noop() {}
|
7845 |
|
7846 | var propTypes = {
|
7847 | component: _react.PropTypes.any,
|
7848 | animation: _react.PropTypes.object,
|
7849 | transitionName: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object]),
|
7850 | transitionEnter: _react.PropTypes.bool,
|
7851 | transitionAppear: _react.PropTypes.bool,
|
7852 | exclusive: _react.PropTypes.bool,
|
7853 | transitionLeave: _react.PropTypes.bool,
|
7854 | onEnd: _react.PropTypes.func,
|
7855 | onEnter: _react.PropTypes.func,
|
7856 | onLeave: _react.PropTypes.func,
|
7857 | onAppear: _react.PropTypes.func,
|
7858 | showProp: _react.PropTypes.string
|
7859 | };
|
7860 |
|
7861 | var defaultProps = {
|
7862 | animation: {},
|
7863 | component: 'span',
|
7864 | transitionEnter: true,
|
7865 | transitionLeave: true,
|
7866 | transitionAppear: false,
|
7867 | onEnd: noop,
|
7868 | onEnter: noop,
|
7869 | onLeave: noop,
|
7870 | onAppear: noop
|
7871 | };
|
7872 |
|
7873 | var Animate = function (_Component) {
|
7874 | _inherits(Animate, _Component);
|
7875 |
|
7876 | function Animate(props) {
|
7877 | _classCallCheck(this, Animate);
|
7878 |
|
7879 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
7880 |
|
7881 | _this.currentlyAnimatingKeys = {};
|
7882 | _this.keysToEnter = [];
|
7883 | _this.keysToLeave = [];
|
7884 | _this.state = {
|
7885 | children: (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(_this.props))
|
7886 | };
|
7887 |
|
7888 | _this.performEnter = _this.performEnter.bind(_this);
|
7889 | _this.performAppear = _this.performAppear.bind(_this);
|
7890 | _this.handleDoneAdding = _this.handleDoneAdding.bind(_this);
|
7891 | _this.performLeave = _this.performLeave.bind(_this);
|
7892 |
|
7893 | _this.performLeave = _this.performLeave.bind(_this);
|
7894 | _this.handleDoneLeaving = _this.handleDoneLeaving.bind(_this);
|
7895 | _this.isValidChildByKey = _this.isValidChildByKey.bind(_this);
|
7896 | _this.stop = _this.stop.bind(_this);
|
7897 | return _this;
|
7898 | }
|
7899 |
|
7900 | Animate.prototype.componentDidMount = function componentDidMount() {
|
7901 | var _this2 = this;
|
7902 |
|
7903 | this.mounted = true;
|
7904 | var showProp = this.props.showProp;
|
7905 | var children = this.state.children;
|
7906 | if (showProp) {
|
7907 | children = children.filter(function (child) {
|
7908 | return !!child.props[showProp];
|
7909 | });
|
7910 | }
|
7911 | children.forEach(function (child) {
|
7912 | if (child) {
|
7913 | _this2.performAppear(child.key);
|
7914 | }
|
7915 | });
|
7916 | };
|
7917 |
|
7918 | Animate.prototype.componentWillUnmount = function componentWillUnmount() {
|
7919 | this.mounted = false;
|
7920 | };
|
7921 |
|
7922 | Animate.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
7923 | var _this3 = this;
|
7924 |
|
7925 | this.nextProps = nextProps;
|
7926 | var nextChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(nextProps));
|
7927 | var props = this.props;
|
7928 | // exclusive needs immediate response
|
7929 | if (props.exclusive) {
|
7930 | Object.keys(this.currentlyAnimatingKeys).forEach(function (key) {
|
7931 | _this3.stop(key);
|
7932 | });
|
7933 | }
|
7934 | var showProp = props.showProp;
|
7935 | var currentlyAnimatingKeys = this.currentlyAnimatingKeys;
|
7936 | // last props children if exclusive
|
7937 | var currentChildren = props.exclusive ? (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props)) : this.state.children;
|
7938 | // in case destroy in showProp mode
|
7939 | var newChildren = [];
|
7940 | if (showProp) {
|
7941 | currentChildren.forEach(function (currentChild) {
|
7942 | var nextChild = currentChild && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, currentChild.key);
|
7943 | var newChild = void 0;
|
7944 | if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) {
|
7945 | newChild = _react2["default"].cloneElement(nextChild || currentChild, _defineProperty({}, showProp, true));
|
7946 | } else {
|
7947 | newChild = nextChild;
|
7948 | }
|
7949 | if (newChild) {
|
7950 | newChildren.push(newChild);
|
7951 | }
|
7952 | });
|
7953 | nextChildren.forEach(function (nextChild) {
|
7954 | if (!nextChild || !(0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, nextChild.key)) {
|
7955 | newChildren.push(nextChild);
|
7956 | }
|
7957 | });
|
7958 | } else {
|
7959 | newChildren = (0, _ChildrenUtils.mergeChildren)(currentChildren, nextChildren);
|
7960 | }
|
7961 |
|
7962 | // need render to avoid update
|
7963 | this.setState({
|
7964 | children: newChildren
|
7965 | });
|
7966 |
|
7967 | nextChildren.forEach(function (child) {
|
7968 | var key = child && child.key;
|
7969 | if (child && currentlyAnimatingKeys[key]) {
|
7970 | return;
|
7971 | }
|
7972 | var hasPrev = child && (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key);
|
7973 | if (showProp) {
|
7974 | var showInNext = child.props[showProp];
|
7975 | if (hasPrev) {
|
7976 | var showInNow = (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp);
|
7977 | if (!showInNow && showInNext) {
|
7978 | _this3.keysToEnter.push(key);
|
7979 | }
|
7980 | } else if (showInNext) {
|
7981 | _this3.keysToEnter.push(key);
|
7982 | }
|
7983 | } else if (!hasPrev) {
|
7984 | _this3.keysToEnter.push(key);
|
7985 | }
|
7986 | });
|
7987 |
|
7988 | currentChildren.forEach(function (child) {
|
7989 | var key = child && child.key;
|
7990 | if (child && currentlyAnimatingKeys[key]) {
|
7991 | return;
|
7992 | }
|
7993 | var hasNext = child && (0, _ChildrenUtils.findChildInChildrenByKey)(nextChildren, key);
|
7994 | if (showProp) {
|
7995 | var showInNow = child.props[showProp];
|
7996 | if (hasNext) {
|
7997 | var showInNext = (0, _ChildrenUtils.findShownChildInChildrenByKey)(nextChildren, key, showProp);
|
7998 | if (!showInNext && showInNow) {
|
7999 | _this3.keysToLeave.push(key);
|
8000 | }
|
8001 | } else if (showInNow) {
|
8002 | _this3.keysToLeave.push(key);
|
8003 | }
|
8004 | } else if (!hasNext) {
|
8005 | _this3.keysToLeave.push(key);
|
8006 | }
|
8007 | });
|
8008 | };
|
8009 |
|
8010 | Animate.prototype.componentDidUpdate = function componentDidUpdate() {
|
8011 | var keysToEnter = this.keysToEnter;
|
8012 | this.keysToEnter = [];
|
8013 | keysToEnter.forEach(this.performEnter);
|
8014 | var keysToLeave = this.keysToLeave;
|
8015 | this.keysToLeave = [];
|
8016 | keysToLeave.forEach(this.performLeave);
|
8017 | };
|
8018 |
|
8019 | Animate.prototype.performEnter = function performEnter(key) {
|
8020 | // may already remove by exclusive
|
8021 | if (this.refs[key]) {
|
8022 | this.currentlyAnimatingKeys[key] = true;
|
8023 | this.refs[key].componentWillEnter(this.handleDoneAdding.bind(this, key, 'enter'));
|
8024 | }
|
8025 | };
|
8026 |
|
8027 | Animate.prototype.performAppear = function performAppear(key) {
|
8028 | if (this.refs[key]) {
|
8029 | this.currentlyAnimatingKeys[key] = true;
|
8030 | this.refs[key].componentWillAppear(this.handleDoneAdding.bind(this, key, 'appear'));
|
8031 | }
|
8032 | };
|
8033 |
|
8034 | Animate.prototype.handleDoneAdding = function handleDoneAdding(key, type) {
|
8035 | var props = this.props;
|
8036 | delete this.currentlyAnimatingKeys[key];
|
8037 | // if update on exclusive mode, skip check
|
8038 | if (props.exclusive && props !== this.nextProps) {
|
8039 | return;
|
8040 | }
|
8041 | var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props));
|
8042 | if (!this.isValidChildByKey(currentChildren, key)) {
|
8043 | // exclusive will not need this
|
8044 | this.performLeave(key);
|
8045 | } else {
|
8046 | if (type === 'appear') {
|
8047 | if (_util2["default"].allowAppearCallback(props)) {
|
8048 | props.onAppear(key);
|
8049 | props.onEnd(key, true);
|
8050 | }
|
8051 | } else {
|
8052 | if (_util2["default"].allowEnterCallback(props)) {
|
8053 | props.onEnter(key);
|
8054 | props.onEnd(key, true);
|
8055 | }
|
8056 | }
|
8057 | }
|
8058 | };
|
8059 |
|
8060 | Animate.prototype.performLeave = function performLeave(key) {
|
8061 | // may already remove by exclusive
|
8062 | if (this.refs[key]) {
|
8063 | this.currentlyAnimatingKeys[key] = true;
|
8064 | this.refs[key].componentWillLeave(this.handleDoneLeaving.bind(this, key));
|
8065 | }
|
8066 | };
|
8067 |
|
8068 | Animate.prototype.handleDoneLeaving = function handleDoneLeaving(key) {
|
8069 | var props = this.props;
|
8070 | delete this.currentlyAnimatingKeys[key];
|
8071 | // if update on exclusive mode, skip check
|
8072 | if (props.exclusive && props !== this.nextProps) {
|
8073 | return;
|
8074 | }
|
8075 | var currentChildren = (0, _ChildrenUtils.toArrayChildren)(getChildrenFromProps(props));
|
8076 | // in case state change is too fast
|
8077 | if (this.isValidChildByKey(currentChildren, key)) {
|
8078 | this.performEnter(key);
|
8079 | } else {
|
8080 | var end = function end() {
|
8081 | if (_util2["default"].allowLeaveCallback(props)) {
|
8082 | props.onLeave(key);
|
8083 | props.onEnd(key, false);
|
8084 | }
|
8085 | };
|
8086 | /* eslint react/no-is-mounted:0 */
|
8087 | if (this.mounted && !(0, _ChildrenUtils.isSameChildren)(this.state.children, currentChildren, props.showProp)) {
|
8088 | this.setState({
|
8089 | children: currentChildren
|
8090 | }, end);
|
8091 | } else {
|
8092 | end();
|
8093 | }
|
8094 | }
|
8095 | };
|
8096 |
|
8097 | Animate.prototype.isValidChildByKey = function isValidChildByKey(currentChildren, key) {
|
8098 | var showProp = this.props.showProp;
|
8099 | if (showProp) {
|
8100 | return (0, _ChildrenUtils.findShownChildInChildrenByKey)(currentChildren, key, showProp);
|
8101 | }
|
8102 | return (0, _ChildrenUtils.findChildInChildrenByKey)(currentChildren, key);
|
8103 | };
|
8104 |
|
8105 | Animate.prototype.stop = function stop(key) {
|
8106 | delete this.currentlyAnimatingKeys[key];
|
8107 | var component = this.refs[key];
|
8108 | if (component) {
|
8109 | component.stop();
|
8110 | }
|
8111 | };
|
8112 |
|
8113 | Animate.prototype.render = function render() {
|
8114 | var props = this.props;
|
8115 | this.nextProps = props;
|
8116 | var stateChildren = this.state.children;
|
8117 | var children = null;
|
8118 | if (stateChildren) {
|
8119 | children = stateChildren.map(function (child) {
|
8120 | if (child === null || child === undefined) {
|
8121 | return child;
|
8122 | }
|
8123 | if (!child.key) {
|
8124 | throw new Error('must set key for <rc-animate> children');
|
8125 | }
|
8126 | return _react2["default"].createElement(
|
8127 | _AnimateChild2["default"],
|
8128 | {
|
8129 | key: child.key,
|
8130 | ref: child.key,
|
8131 | animation: props.animation,
|
8132 | transitionName: props.transitionName,
|
8133 | transitionEnter: props.transitionEnter,
|
8134 | transitionAppear: props.transitionAppear,
|
8135 | transitionLeave: props.transitionLeave
|
8136 | },
|
8137 | child
|
8138 | );
|
8139 | });
|
8140 | }
|
8141 | var Component = props.component;
|
8142 | if (Component) {
|
8143 | var passedProps = props;
|
8144 | if (typeof Component === 'string') {
|
8145 | passedProps = {
|
8146 | className: props.className,
|
8147 | style: props.style
|
8148 | };
|
8149 | }
|
8150 | return _react2["default"].createElement(
|
8151 | Component,
|
8152 | passedProps,
|
8153 | children
|
8154 | );
|
8155 | }
|
8156 | return children[0] || null;
|
8157 | };
|
8158 |
|
8159 | return Animate;
|
8160 | }(_react.Component);
|
8161 |
|
8162 | ;
|
8163 | Animate.defaultProps = defaultProps;
|
8164 | Animate.propTypes = Animate.propTypes;
|
8165 |
|
8166 | exports["default"] = Animate;
|
8167 | module.exports = exports['default'];
|
8168 |
|
8169 | /***/ },
|
8170 | /* 80 */
|
8171 | /***/ function(module, exports, __webpack_require__) {
|
8172 |
|
8173 | ;
|
8174 |
|
8175 | Object.defineProperty(exports, "__esModule", {
|
8176 | value: true
|
8177 | });
|
8178 | exports.toArrayChildren = toArrayChildren;
|
8179 | exports.findChildInChildrenByKey = findChildInChildrenByKey;
|
8180 | exports.findShownChildInChildrenByKey = findShownChildInChildrenByKey;
|
8181 | exports.findHiddenChildInChildrenByKey = findHiddenChildInChildrenByKey;
|
8182 | exports.isSameChildren = isSameChildren;
|
8183 | exports.mergeChildren = mergeChildren;
|
8184 |
|
8185 | var _react = __webpack_require__(4);
|
8186 |
|
8187 | var _react2 = _interopRequireDefault(_react);
|
8188 |
|
8189 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8190 |
|
8191 | function toArrayChildren(children) {
|
8192 | var ret = [];
|
8193 | _react2["default"].Children.forEach(children, function (child) {
|
8194 | ret.push(child);
|
8195 | });
|
8196 | return ret;
|
8197 | }
|
8198 |
|
8199 | function findChildInChildrenByKey(children, key) {
|
8200 | var ret = null;
|
8201 | if (children) {
|
8202 | children.forEach(function (child) {
|
8203 | if (ret) {
|
8204 | return;
|
8205 | }
|
8206 | if (child && child.key === key) {
|
8207 | ret = child;
|
8208 | }
|
8209 | });
|
8210 | }
|
8211 | return ret;
|
8212 | }
|
8213 |
|
8214 | function findShownChildInChildrenByKey(children, key, showProp) {
|
8215 | var ret = null;
|
8216 | if (children) {
|
8217 | children.forEach(function (child) {
|
8218 | if (child && child.key === key && child.props[showProp]) {
|
8219 | if (ret) {
|
8220 | throw new Error('two child with same key for <rc-animate> children');
|
8221 | }
|
8222 | ret = child;
|
8223 | }
|
8224 | });
|
8225 | }
|
8226 | return ret;
|
8227 | }
|
8228 |
|
8229 | function findHiddenChildInChildrenByKey(children, key, showProp) {
|
8230 | var found = 0;
|
8231 | if (children) {
|
8232 | children.forEach(function (child) {
|
8233 | if (found) {
|
8234 | return;
|
8235 | }
|
8236 | found = child && child.key === key && !child.props[showProp];
|
8237 | });
|
8238 | }
|
8239 | return found;
|
8240 | }
|
8241 |
|
8242 | function isSameChildren(c1, c2, showProp) {
|
8243 | var same = c1.length === c2.length;
|
8244 | if (same) {
|
8245 | c1.forEach(function (child, index) {
|
8246 | var child2 = c2[index];
|
8247 | if (child && child2) {
|
8248 | if (child && !child2 || !child && child2) {
|
8249 | same = false;
|
8250 | } else if (child.key !== child2.key) {
|
8251 | same = false;
|
8252 | } else if (showProp && child.props[showProp] !== child2.props[showProp]) {
|
8253 | same = false;
|
8254 | }
|
8255 | }
|
8256 | });
|
8257 | }
|
8258 | return same;
|
8259 | }
|
8260 |
|
8261 | function mergeChildren(prev, next) {
|
8262 | var ret = [];
|
8263 |
|
8264 | // For each key of `next`, the list of keys to insert before that key in
|
8265 | // the combined list
|
8266 | var nextChildrenPending = {};
|
8267 | var pendingChildren = [];
|
8268 | prev.forEach(function (child) {
|
8269 | if (child && findChildInChildrenByKey(next, child.key)) {
|
8270 | if (pendingChildren.length) {
|
8271 | nextChildrenPending[child.key] = pendingChildren;
|
8272 | pendingChildren = [];
|
8273 | }
|
8274 | } else {
|
8275 | pendingChildren.push(child);
|
8276 | }
|
8277 | });
|
8278 |
|
8279 | next.forEach(function (child) {
|
8280 | if (child && nextChildrenPending.hasOwnProperty(child.key)) {
|
8281 | ret = ret.concat(nextChildrenPending[child.key]);
|
8282 | }
|
8283 | ret.push(child);
|
8284 | });
|
8285 |
|
8286 | ret = ret.concat(pendingChildren);
|
8287 |
|
8288 | return ret;
|
8289 | }
|
8290 |
|
8291 | /***/ },
|
8292 | /* 81 */
|
8293 | /***/ function(module, exports, __webpack_require__) {
|
8294 |
|
8295 | ;
|
8296 |
|
8297 | Object.defineProperty(exports, "__esModule", {
|
8298 | value: true
|
8299 | });
|
8300 |
|
8301 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
8302 |
|
8303 | var _react = __webpack_require__(4);
|
8304 |
|
8305 | var _react2 = _interopRequireDefault(_react);
|
8306 |
|
8307 | var _reactDom = __webpack_require__(11);
|
8308 |
|
8309 | var _reactDom2 = _interopRequireDefault(_reactDom);
|
8310 |
|
8311 | var _tinperBeeCore = __webpack_require__(25);
|
8312 |
|
8313 | var _util = __webpack_require__(82);
|
8314 |
|
8315 | var _util2 = _interopRequireDefault(_util);
|
8316 |
|
8317 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8318 |
|
8319 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8320 |
|
8321 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8322 |
|
8323 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8324 |
|
8325 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
8326 |
|
8327 | var transitionMap = {
|
8328 | enter: 'transitionEnter',
|
8329 | appear: 'transitionAppear',
|
8330 | leave: 'transitionLeave'
|
8331 | };
|
8332 |
|
8333 | var propTypes = {
|
8334 | children: _react.PropTypes.any
|
8335 | };
|
8336 |
|
8337 | var AnimateChild = function (_Component) {
|
8338 | _inherits(AnimateChild, _Component);
|
8339 |
|
8340 | function AnimateChild(props) {
|
8341 | _classCallCheck(this, AnimateChild);
|
8342 |
|
8343 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
8344 |
|
8345 | _this.transition = _this.transition.bind(_this);
|
8346 | _this.stop = _this.stop.bind(_this);
|
8347 | return _this;
|
8348 | }
|
8349 |
|
8350 | AnimateChild.prototype.componentWillUnmount = function componentWillUnmount() {
|
8351 | this.stop();
|
8352 | };
|
8353 |
|
8354 | AnimateChild.prototype.componentWillEnter = function componentWillEnter(done) {
|
8355 | if (_util2["default"].isEnterSupported(this.props)) {
|
8356 | this.transition('enter', done);
|
8357 | } else {
|
8358 | done();
|
8359 | }
|
8360 | };
|
8361 |
|
8362 | AnimateChild.prototype.componentWillAppear = function componentWillAppear(done) {
|
8363 | if (_util2["default"].isAppearSupported(this.props)) {
|
8364 | this.transition('appear', done);
|
8365 | } else {
|
8366 | done();
|
8367 | }
|
8368 | };
|
8369 |
|
8370 | AnimateChild.prototype.componentWillLeave = function componentWillLeave(done) {
|
8371 | if (_util2["default"].isLeaveSupported(this.props)) {
|
8372 | this.transition('leave', done);
|
8373 | } else {
|
8374 | // always sync, do not interupt with react component life cycle
|
8375 | // update hidden -> animate hidden ->
|
8376 | // didUpdate -> animate leave -> unmount (if animate is none)
|
8377 | done();
|
8378 | }
|
8379 | };
|
8380 |
|
8381 | AnimateChild.prototype.transition = function transition(animationType, finishCallback) {
|
8382 | var _this2 = this;
|
8383 |
|
8384 | var node = _reactDom2["default"].findDOMNode(this);
|
8385 | var props = this.props;
|
8386 | var transitionName = props.transitionName;
|
8387 | var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object';
|
8388 | this.stop();
|
8389 | var end = function end() {
|
8390 | _this2.stopper = null;
|
8391 | finishCallback();
|
8392 | };
|
8393 | if ((_tinperBeeCore.cssAnimation.isCssAnimationSupported || !props.animation[animationType]) && transitionName && props[transitionMap[animationType]]) {
|
8394 | var name = nameIsObj ? transitionName[animationType] : transitionName + '-' + animationType;
|
8395 | var activeName = name + '-active';
|
8396 | if (nameIsObj && transitionName[animationType + 'Active']) {
|
8397 | activeName = transitionName[animationType + 'Active'];
|
8398 | }
|
8399 | this.stopper = (0, _tinperBeeCore.cssAnimation)(node, {
|
8400 | name: name,
|
8401 | active: activeName
|
8402 | }, end);
|
8403 | } else {
|
8404 | this.stopper = props.animation[animationType](node, end);
|
8405 | }
|
8406 | };
|
8407 |
|
8408 | AnimateChild.prototype.stop = function stop() {
|
8409 | var stopper = this.stopper;
|
8410 | if (stopper) {
|
8411 | this.stopper = null;
|
8412 | stopper.stop();
|
8413 | }
|
8414 | };
|
8415 |
|
8416 | AnimateChild.prototype.render = function render() {
|
8417 | return this.props.children;
|
8418 | };
|
8419 |
|
8420 | return AnimateChild;
|
8421 | }(_react.Component);
|
8422 |
|
8423 | ;
|
8424 |
|
8425 | AnimateChild.propTypes = propTypes;
|
8426 |
|
8427 | exports["default"] = AnimateChild;
|
8428 | module.exports = exports['default'];
|
8429 |
|
8430 | /***/ },
|
8431 | /* 82 */
|
8432 | /***/ function(module, exports) {
|
8433 |
|
8434 | ;
|
8435 |
|
8436 | Object.defineProperty(exports, "__esModule", {
|
8437 | value: true
|
8438 | });
|
8439 | var util = {
|
8440 | isAppearSupported: function isAppearSupported(props) {
|
8441 | return props.transitionName && props.transitionAppear || props.animation.appear;
|
8442 | },
|
8443 | isEnterSupported: function isEnterSupported(props) {
|
8444 | return props.transitionName && props.transitionEnter || props.animation.enter;
|
8445 | },
|
8446 | isLeaveSupported: function isLeaveSupported(props) {
|
8447 | return props.transitionName && props.transitionLeave || props.animation.leave;
|
8448 | },
|
8449 | allowAppearCallback: function allowAppearCallback(props) {
|
8450 | return props.transitionAppear || props.animation.appear;
|
8451 | },
|
8452 | allowEnterCallback: function allowEnterCallback(props) {
|
8453 | return props.transitionEnter || props.animation.enter;
|
8454 | },
|
8455 | allowLeaveCallback: function allowLeaveCallback(props) {
|
8456 | return props.transitionLeave || props.animation.leave;
|
8457 | }
|
8458 | };
|
8459 | exports["default"] = util;
|
8460 | module.exports = exports["default"];
|
8461 |
|
8462 | /***/ },
|
8463 | /* 83 */
|
8464 | /***/ function(module, exports, __webpack_require__) {
|
8465 |
|
8466 | ;
|
8467 |
|
8468 | Object.defineProperty(exports, "__esModule", {
|
8469 | value: true
|
8470 | });
|
8471 |
|
8472 | var _react = __webpack_require__(4);
|
8473 |
|
8474 | var _react2 = _interopRequireDefault(_react);
|
8475 |
|
8476 | var _LazyRenderBox = __webpack_require__(84);
|
8477 |
|
8478 | var _LazyRenderBox2 = _interopRequireDefault(_LazyRenderBox);
|
8479 |
|
8480 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8481 |
|
8482 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8483 |
|
8484 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8485 |
|
8486 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8487 |
|
8488 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
8489 |
|
8490 | var propTypes = {
|
8491 | hiddenClassName: _react.PropTypes.string,
|
8492 | className: _react.PropTypes.string,
|
8493 | clsPrefix: _react.PropTypes.string,
|
8494 | onMouseEnter: _react.PropTypes.func,
|
8495 | onMouseLeave: _react.PropTypes.func,
|
8496 | children: _react.PropTypes.any
|
8497 | };
|
8498 |
|
8499 | var PopupInner = function (_Component) {
|
8500 | _inherits(PopupInner, _Component);
|
8501 |
|
8502 | function PopupInner() {
|
8503 | _classCallCheck(this, PopupInner);
|
8504 |
|
8505 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
8506 | }
|
8507 |
|
8508 | PopupInner.prototype.render = function render() {
|
8509 | var props = this.props;
|
8510 | var className = props.className;
|
8511 | if (!props.visible) {
|
8512 | className += ' ' + props.hiddenClassName;
|
8513 | }
|
8514 | return _react2["default"].createElement(
|
8515 | 'div',
|
8516 | {
|
8517 | className: className,
|
8518 | onMouseEnter: props.onMouseEnter,
|
8519 | onMouseLeave: props.onMouseLeave,
|
8520 | style: props.style
|
8521 | },
|
8522 | _react2["default"].createElement(
|
8523 | _LazyRenderBox2["default"],
|
8524 | { className: props.clsPrefix + '-content', visible: props.visible },
|
8525 | props.children
|
8526 | )
|
8527 | );
|
8528 | };
|
8529 |
|
8530 | return PopupInner;
|
8531 | }(_react.Component);
|
8532 |
|
8533 | ;
|
8534 |
|
8535 | PopupInner.propTypes = propTypes;
|
8536 | exports["default"] = PopupInner;
|
8537 | module.exports = exports['default'];
|
8538 |
|
8539 | /***/ },
|
8540 | /* 84 */
|
8541 | /***/ function(module, exports, __webpack_require__) {
|
8542 |
|
8543 | ;
|
8544 |
|
8545 | Object.defineProperty(exports, "__esModule", {
|
8546 | value: true
|
8547 | });
|
8548 |
|
8549 | var _react = __webpack_require__(4);
|
8550 |
|
8551 | var _react2 = _interopRequireDefault(_react);
|
8552 |
|
8553 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8554 |
|
8555 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8556 |
|
8557 | function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
|
8558 |
|
8559 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8560 |
|
8561 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8562 |
|
8563 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
8564 |
|
8565 | var propTypes = {
|
8566 | children: _react.PropTypes.any,
|
8567 | className: _react.PropTypes.string,
|
8568 | visible: _react.PropTypes.bool,
|
8569 | hiddenClassName: _react.PropTypes.string
|
8570 | };
|
8571 |
|
8572 | var LazyRenderBox = function (_Component) {
|
8573 | _inherits(LazyRenderBox, _Component);
|
8574 |
|
8575 | function LazyRenderBox() {
|
8576 | _classCallCheck(this, LazyRenderBox);
|
8577 |
|
8578 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
8579 | }
|
8580 |
|
8581 | LazyRenderBox.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {
|
8582 | return nextProps.hiddenClassName || nextProps.visible;
|
8583 | };
|
8584 |
|
8585 | LazyRenderBox.prototype.render = function render() {
|
8586 | var _props = this.props,
|
8587 | hiddenClassName = _props.hiddenClassName,
|
8588 | visible = _props.visible,
|
8589 | props = _objectWithoutProperties(_props, ['hiddenClassName', 'visible']);
|
8590 |
|
8591 | if (hiddenClassName || _react2["default"].Children.count(props.children) > 1) {
|
8592 | if (!visible && hiddenClassName) {
|
8593 | props.className += ' ' + hiddenClassName;
|
8594 | }
|
8595 | return _react2["default"].createElement('div', props);
|
8596 | }
|
8597 |
|
8598 | return _react2["default"].Children.only(props.children);
|
8599 | };
|
8600 |
|
8601 | return LazyRenderBox;
|
8602 | }(_react.Component);
|
8603 |
|
8604 | ;
|
8605 | LazyRenderBox.propTypes = propTypes;
|
8606 |
|
8607 | exports["default"] = LazyRenderBox;
|
8608 | module.exports = exports['default'];
|
8609 |
|
8610 | /***/ },
|
8611 | /* 85 */
|
8612 | /***/ function(module, exports) {
|
8613 |
|
8614 | ;
|
8615 |
|
8616 | Object.defineProperty(exports, "__esModule", {
|
8617 | value: true
|
8618 | });
|
8619 |
|
8620 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
8621 |
|
8622 | exports.getAlignFromPlacement = getAlignFromPlacement;
|
8623 | exports.getPopupClassNameFromAlign = getPopupClassNameFromAlign;
|
8624 | function isPointsEq(a1, a2) {
|
8625 | return a1[0] === a2[0] && a1[1] === a2[1];
|
8626 | }
|
8627 |
|
8628 | function getAlignFromPlacement(builtinPlacements, placementStr, align) {
|
8629 | var baseAlign = builtinPlacements[placementStr] || {};
|
8630 | return _extends({}, baseAlign, align);
|
8631 | }
|
8632 |
|
8633 | function getPopupClassNameFromAlign(builtinPlacements, clsPrefix, align) {
|
8634 | var points = align.points;
|
8635 | for (var placement in builtinPlacements) {
|
8636 | if (builtinPlacements.hasOwnProperty(placement)) {
|
8637 | if (isPointsEq(builtinPlacements[placement].points, points)) {
|
8638 | return clsPrefix + '-placement-' + placement;
|
8639 | }
|
8640 | }
|
8641 | }
|
8642 | return '';
|
8643 | }
|
8644 |
|
8645 | /***/ },
|
8646 | /* 86 */
|
8647 | /***/ function(module, exports) {
|
8648 |
|
8649 | ;
|
8650 |
|
8651 | Object.defineProperty(exports, "__esModule", {
|
8652 | value: true
|
8653 | });
|
8654 | var autoAdjustOverflow = {
|
8655 | adjustX: 1,
|
8656 | adjustY: 1
|
8657 | };
|
8658 |
|
8659 | var targetOffset = [0, 0];
|
8660 |
|
8661 | var placements = exports.placements = {
|
8662 | topLeft: {
|
8663 | points: ['bl', 'tl'],
|
8664 | overflow: autoAdjustOverflow,
|
8665 | offset: [0, -4],
|
8666 | targetOffset: targetOffset
|
8667 | },
|
8668 | topCenter: {
|
8669 | points: ['bc', 'tc'],
|
8670 | overflow: autoAdjustOverflow,
|
8671 | offset: [0, -4],
|
8672 | targetOffset: targetOffset
|
8673 | },
|
8674 | topRight: {
|
8675 | points: ['br', 'tr'],
|
8676 | overflow: autoAdjustOverflow,
|
8677 | offset: [0, -4],
|
8678 | targetOffset: targetOffset
|
8679 | },
|
8680 | bottomLeft: {
|
8681 | points: ['tl', 'bl'],
|
8682 | overflow: autoAdjustOverflow,
|
8683 | offset: [0, 4],
|
8684 | targetOffset: targetOffset
|
8685 | },
|
8686 | bottomCenter: {
|
8687 | points: ['tc', 'bc'],
|
8688 | overflow: autoAdjustOverflow,
|
8689 | offset: [0, 4],
|
8690 | targetOffset: targetOffset
|
8691 | },
|
8692 | bottomRight: {
|
8693 | points: ['tr', 'br'],
|
8694 | overflow: autoAdjustOverflow,
|
8695 | offset: [0, 4],
|
8696 | targetOffset: targetOffset
|
8697 | }
|
8698 | };
|
8699 |
|
8700 | exports["default"] = placements;
|
8701 |
|
8702 | /***/ },
|
8703 | /* 87 */
|
8704 | /***/ function(module, exports, __webpack_require__) {
|
8705 |
|
8706 | ;
|
8707 |
|
8708 | Object.defineProperty(exports, "__esModule", {
|
8709 | value: true
|
8710 | });
|
8711 | exports.Divider = exports.ItemGroup = exports.MenuItemGroup = exports.MenuItem = exports.Item = exports.SubMenu = undefined;
|
8712 |
|
8713 | var _Menu = __webpack_require__(88);
|
8714 |
|
8715 | var _Menu2 = _interopRequireDefault(_Menu);
|
8716 |
|
8717 | var _SubMenu = __webpack_require__(91);
|
8718 |
|
8719 | var _SubMenu2 = _interopRequireDefault(_SubMenu);
|
8720 |
|
8721 | var _MenuItem = __webpack_require__(93);
|
8722 |
|
8723 | var _MenuItem2 = _interopRequireDefault(_MenuItem);
|
8724 |
|
8725 | var _MenuItemGroup = __webpack_require__(94);
|
8726 |
|
8727 | var _MenuItemGroup2 = _interopRequireDefault(_MenuItemGroup);
|
8728 |
|
8729 | var _Divider = __webpack_require__(95);
|
8730 |
|
8731 | var _Divider2 = _interopRequireDefault(_Divider);
|
8732 |
|
8733 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8734 |
|
8735 | exports.SubMenu = _SubMenu2["default"];
|
8736 | exports.Item = _MenuItem2["default"];
|
8737 | exports.MenuItem = _MenuItem2["default"];
|
8738 | exports.MenuItemGroup = _MenuItemGroup2["default"];
|
8739 | exports.ItemGroup = _MenuItemGroup2["default"];
|
8740 | exports.Divider = _Divider2["default"];
|
8741 | exports["default"] = _Menu2["default"];
|
8742 |
|
8743 | /***/ },
|
8744 | /* 88 */
|
8745 | /***/ function(module, exports, __webpack_require__) {
|
8746 |
|
8747 | ;
|
8748 |
|
8749 | Object.defineProperty(exports, "__esModule", {
|
8750 | value: true
|
8751 | });
|
8752 |
|
8753 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
8754 |
|
8755 | var _react = __webpack_require__(4);
|
8756 |
|
8757 | var _react2 = _interopRequireDefault(_react);
|
8758 |
|
8759 | var _util = __webpack_require__(89);
|
8760 |
|
8761 | var _classnames = __webpack_require__(3);
|
8762 |
|
8763 | var _classnames2 = _interopRequireDefault(_classnames);
|
8764 |
|
8765 | var _DOMWrap = __webpack_require__(90);
|
8766 |
|
8767 | var _DOMWrap2 = _interopRequireDefault(_DOMWrap);
|
8768 |
|
8769 | var _tinperBeeCore = __webpack_require__(25);
|
8770 |
|
8771 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
8772 |
|
8773 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
8774 |
|
8775 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
8776 |
|
8777 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
8778 |
|
8779 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
8780 |
|
8781 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
8782 |
|
8783 | function saveRef(index, subIndex, c) {
|
8784 | if (c) {
|
8785 | if (subIndex !== undefined) {
|
8786 | this.instanceArray[index] = this.instanceArray[index] || [];
|
8787 | this.instanceArray[index][subIndex] = c;
|
8788 | } else {
|
8789 | this.instanceArray[index] = c;
|
8790 | }
|
8791 | }
|
8792 | }
|
8793 | function allDisabled(arr) {
|
8794 | if (!arr.length) {
|
8795 | return true;
|
8796 | }
|
8797 | return arr.every(function (c) {
|
8798 | return !!c.props.disabled;
|
8799 | });
|
8800 | }
|
8801 |
|
8802 | function getActiveKey(props, originalActiveKey) {
|
8803 | var activeKey = originalActiveKey;
|
8804 | var children = props.children,
|
8805 | eventKey = props.eventKey;
|
8806 |
|
8807 | if (activeKey) {
|
8808 | var found = void 0;
|
8809 | (0, _util.loopMenuItem)(children, function (c, i) {
|
8810 | if (c && !c.props.disabled && activeKey === (0, _util.getKeyFromChildrenIndex)(c, eventKey, i)) {
|
8811 | found = true;
|
8812 | }
|
8813 | });
|
8814 | if (found) {
|
8815 | return activeKey;
|
8816 | }
|
8817 | }
|
8818 | activeKey = null;
|
8819 | if (props.defaultActiveFirst) {
|
8820 | (0, _util.loopMenuItem)(children, function (c, i) {
|
8821 | if (!activeKey && c && !c.props.disabled) {
|
8822 | activeKey = (0, _util.getKeyFromChildrenIndex)(c, eventKey, i);
|
8823 | }
|
8824 | });
|
8825 | return activeKey;
|
8826 | }
|
8827 | return activeKey;
|
8828 | }
|
8829 |
|
8830 | var propTypes = {
|
8831 |
|
8832 | openSubMenuOnMouseEnter: _react.PropTypes.bool,
|
8833 | closeSubMenuOnMouseLeave: _react.PropTypes.bool,
|
8834 | selectedKeys: _react.PropTypes.oneOfType([_react.PropTypes.arrayOf(_react.PropTypes.string), _react.PropTypes.arrayOf(_react.PropTypes.number)]),
|
8835 | defaultSelectedKeys: _react.PropTypes.arrayOf(_react.PropTypes.string),
|
8836 | defaultOpenKeys: _react.PropTypes.arrayOf(_react.PropTypes.string),
|
8837 | openKeys: _react.PropTypes.arrayOf(_react.PropTypes.string),
|
8838 | mode: _react.PropTypes.string,
|
8839 | onClick: _react.PropTypes.func,
|
8840 | onSelect: _react.PropTypes.func,
|
8841 | onDeselect: _react.PropTypes.func,
|
8842 | onDestroy: _react.PropTypes.func,
|
8843 | openTransitionName: _react.PropTypes.string,
|
8844 | openAnimation: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object]),
|
8845 | level: _react.PropTypes.number,
|
8846 | eventKey: _react.PropTypes.string,
|
8847 | selectable: _react.PropTypes.bool,
|
8848 | children: _react.PropTypes.any,
|
8849 |
|
8850 | focusable: _react.PropTypes.bool,
|
8851 | multiple: _react.PropTypes.bool,
|
8852 | style: _react.PropTypes.object,
|
8853 | defaultActiveFirst: _react.PropTypes.bool,
|
8854 | visible: _react.PropTypes.bool,
|
8855 | activeKey: _react.PropTypes.string
|
8856 |
|
8857 | };
|
8858 | var defaultProps = {
|
8859 | openSubMenuOnMouseEnter: true,
|
8860 | closeSubMenuOnMouseLeave: true,
|
8861 | selectable: true,
|
8862 | onClick: _util.noop,
|
8863 | onSelect: _util.noop,
|
8864 | onOpenChange: _util.noop,
|
8865 | onDeselect: _util.noop,
|
8866 | defaultSelectedKeys: [],
|
8867 | defaultOpenKeys: [],
|
8868 |
|
8869 | clsPrefix: 'u-menu',
|
8870 | className: '',
|
8871 | mode: 'vertical',
|
8872 | level: 1,
|
8873 | inlineIndent: 24,
|
8874 | visible: true,
|
8875 | focusable: true,
|
8876 | style: {}
|
8877 | };
|
8878 |
|
8879 | var Menu = function (_Component) {
|
8880 | _inherits(Menu, _Component);
|
8881 |
|
8882 | function Menu(props) {
|
8883 | _classCallCheck(this, Menu);
|
8884 |
|
8885 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
8886 |
|
8887 | var selectedKeys = _this.props.defaultSelectedKeys;
|
8888 | var openKeys = _this.props.defaultOpenKeys;
|
8889 | if ('selectedKeys' in _this.props) {
|
8890 | selectedKeys = _this.props.selectedKeys || [];
|
8891 | }
|
8892 | if ('openKeys' in props) {
|
8893 | openKeys = _this.props.openKeys || [];
|
8894 | }
|
8895 |
|
8896 | _this.state = {
|
8897 | selectedKeys: selectedKeys,
|
8898 | openKeys: openKeys,
|
8899 | activeKey: getActiveKey(_this.props, _this.props.activeKey)
|
8900 | //activeKey: getActiveKey(this.props, this.props.activeKey),
|
8901 | };
|
8902 | _this.renderMenuItem = _this.renderMenuItem.bind(_this);
|
8903 | _this.onDestroy = _this.onDestroy.bind(_this);
|
8904 | _this.onItemHover = _this.onItemHover.bind(_this);
|
8905 | _this.onSelect = _this.onSelect.bind(_this);
|
8906 | _this.onOpenChange = _this.onOpenChange.bind(_this);
|
8907 | _this.onClick = _this.onClick.bind(_this);
|
8908 | _this.onDeselect = _this.onDeselect.bind(_this);
|
8909 | _this.getOpenTransitionName = _this.getOpenTransitionName.bind(_this);
|
8910 | _this.isInlineMode = _this.isInlineMode.bind(_this);
|
8911 | _this.lastOpenSubMenu = _this.lastOpenSubMenu.bind(_this);
|
8912 | _this.renderMenuItem = _this.renderMenuItem.bind(_this);
|
8913 |
|
8914 | _this.renderCommonMenuItem = _this.renderCommonMenuItem.bind(_this);
|
8915 | _this.renderRoot = _this.renderRoot.bind(_this);
|
8916 | _this.getOpenChangesOnItemHover = _this.getOpenChangesOnItemHover.bind(_this);
|
8917 | _this.getFlatInstanceArray = _this.getFlatInstanceArray.bind(_this);
|
8918 | _this.onKeyDown = _this.onKeyDown.bind(_this);
|
8919 | _this.step = _this.step.bind(_this);
|
8920 |
|
8921 | return _this;
|
8922 | }
|
8923 |
|
8924 | Menu.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
8925 | var props = {};
|
8926 | if ('selectedKeys' in nextProps) {
|
8927 | props.selectedKeys = nextProps.selectedKeys;
|
8928 | }
|
8929 | if ('openKeys' in nextProps) {
|
8930 | props.openKeys = nextProps.openKeys;
|
8931 | }
|
8932 |
|
8933 | if ('activeKey' in nextProps) {
|
8934 | props.activeKey = getActiveKey(nextProps, nextProps.activeKey);
|
8935 | } else {
|
8936 | var originalActiveKey = this.state.activeKey;
|
8937 | var activeKey = getActiveKey(nextProps, originalActiveKey);
|
8938 | // fix: this.setState(), parent.render(),
|
8939 | if (activeKey !== originalActiveKey) {
|
8940 | props.activeKey = activeKey;
|
8941 | }
|
8942 | }
|
8943 |
|
8944 | this.setState(props);
|
8945 | };
|
8946 |
|
8947 | Menu.prototype.componentWillMount = function componentWillMount() {
|
8948 | this.instanceArray = [];
|
8949 | };
|
8950 |
|
8951 | Menu.prototype.onDestroy = function onDestroy(key) {
|
8952 | var state = this.state;
|
8953 | var props = this.props;
|
8954 | var selectedKeys = state.selectedKeys;
|
8955 | var openKeys = state.openKeys;
|
8956 | var index = selectedKeys.indexOf(key);
|
8957 | if (!('selectedKeys' in props) && index !== -1) {
|
8958 | selectedKeys.splice(index, 1);
|
8959 | }
|
8960 | index = openKeys.indexOf(key);
|
8961 | if (!('openKeys' in props) && index !== -1) {
|
8962 | openKeys.splice(index, 1);
|
8963 | }
|
8964 | };
|
8965 |
|
8966 | Menu.prototype.onItemHover = function onItemHover(e) {
|
8967 | var _this2 = this;
|
8968 |
|
8969 | var item = e.item;
|
8970 | var _props = this.props,
|
8971 | mode = _props.mode,
|
8972 | closeSubMenuOnMouseLeave = _props.closeSubMenuOnMouseLeave;
|
8973 | var _e$openChanges = e.openChanges,
|
8974 | openChanges = _e$openChanges === undefined ? [] : _e$openChanges;
|
8975 | // special for top sub menu
|
8976 |
|
8977 | if (mode !== 'inline' && !closeSubMenuOnMouseLeave && item.isSubMenu) {
|
8978 | (function () {
|
8979 | var activeKey = _this2.state.activeKey;
|
8980 | var activeItem = _this2.getFlatInstanceArray().filter(function (c) {
|
8981 | return c && c.props.eventKey === activeKey;
|
8982 | })[0];
|
8983 | if (activeItem && activeItem.props.open) {
|
8984 | openChanges = openChanges.concat({
|
8985 | key: item.props.eventKey,
|
8986 | item: item,
|
8987 | originalEvent: e,
|
8988 | open: true
|
8989 | });
|
8990 | }
|
8991 | })();
|
8992 | }
|
8993 | openChanges = openChanges.concat(this.getOpenChangesOnItemHover(e));
|
8994 | if (openChanges.length) {
|
8995 | this.onOpenChange(openChanges);
|
8996 | }
|
8997 | };
|
8998 |
|
8999 | Menu.prototype.onSelect = function onSelect(selectInfo) {
|
9000 | var props = this.props;
|
9001 | if (props.selectable) {
|
9002 | // root menu
|
9003 | var selectedKeys = this.state.selectedKeys;
|
9004 | var selectedKey = selectInfo.key;
|
9005 | if (props.multiple) {
|
9006 | selectedKeys = selectedKeys.concat([selectedKey]);
|
9007 | } else {
|
9008 | selectedKeys = [selectedKey];
|
9009 | }
|
9010 | if (!('selectedKeys' in props)) {
|
9011 | this.setState({
|
9012 | selectedKeys: selectedKeys
|
9013 | });
|
9014 | }
|
9015 | props.onSelect(_extends({}, selectInfo, {
|
9016 | selectedKeys: selectedKeys
|
9017 | }));
|
9018 | }
|
9019 | };
|
9020 |
|
9021 | Menu.prototype.onClick = function onClick(e) {
|
9022 | this.props.onClick(e);
|
9023 | };
|
9024 |
|
9025 | Menu.prototype.onOpenChange = function onOpenChange(e_) {
|
9026 | var props = this.props;
|
9027 | var openKeys = this.state.openKeys.concat();
|
9028 | var changed = false;
|
9029 | var processSingle = function processSingle(e) {
|
9030 | var oneChanged = false;
|
9031 | if (e.open) {
|
9032 | oneChanged = openKeys.indexOf(e.key) === -1;
|
9033 | if (oneChanged) {
|
9034 | openKeys.push(e.key);
|
9035 | }
|
9036 | } else {
|
9037 | var index = openKeys.indexOf(e.key);
|
9038 | oneChanged = index !== -1;
|
9039 | if (oneChanged) {
|
9040 | openKeys.splice(index, 1);
|
9041 | }
|
9042 | }
|
9043 | changed = changed || oneChanged;
|
9044 | };
|
9045 | if (Array.isArray(e_)) {
|
9046 | // batch change call
|
9047 | e_.forEach(processSingle);
|
9048 | } else {
|
9049 | processSingle(e_);
|
9050 | }
|
9051 | if (changed) {
|
9052 | if (!('openKeys' in this.props)) {
|
9053 | this.setState({ openKeys: openKeys });
|
9054 | }
|
9055 | props.onOpenChange(openKeys);
|
9056 | }
|
9057 | };
|
9058 |
|
9059 | Menu.prototype.onDeselect = function onDeselect(selectInfo) {
|
9060 | var props = this.props;
|
9061 | if (props.selectable) {
|
9062 | var selectedKeys = this.state.selectedKeys.concat();
|
9063 | var selectedKey = selectInfo.key;
|
9064 | var index = selectedKeys.indexOf(selectedKey);
|
9065 | if (index !== -1) {
|
9066 | selectedKeys.splice(index, 1);
|
9067 | }
|
9068 | if (!('selectedKeys' in props)) {
|
9069 | this.setState({
|
9070 | selectedKeys: selectedKeys
|
9071 | });
|
9072 | }
|
9073 | props.onDeselect(_extends({}, selectInfo, {
|
9074 | selectedKeys: selectedKeys
|
9075 | }));
|
9076 | }
|
9077 | };
|
9078 |
|
9079 | Menu.prototype.getOpenTransitionName = function getOpenTransitionName() {
|
9080 | var props = this.props;
|
9081 | var transitionName = props.openTransitionName;
|
9082 | var animationName = props.openAnimation;
|
9083 | if (!transitionName && typeof animationName === 'string') {
|
9084 | transitionName = props.clsPrefix + '-open-' + animationName;
|
9085 | }
|
9086 | return transitionName;
|
9087 | };
|
9088 |
|
9089 | Menu.prototype.isInlineMode = function isInlineMode() {
|
9090 | return this.props.mode === 'inline';
|
9091 | };
|
9092 |
|
9093 | Menu.prototype.lastOpenSubMenu = function lastOpenSubMenu() {
|
9094 | var lastOpen = [];
|
9095 | var openKeys = this.state.openKeys;
|
9096 |
|
9097 | if (openKeys.length) {
|
9098 | lastOpen = this.getFlatInstanceArray().filter(function (c) {
|
9099 | return c && openKeys.indexOf(c.props.eventKey) !== -1;
|
9100 | });
|
9101 | }
|
9102 | return lastOpen[0];
|
9103 | };
|
9104 |
|
9105 | Menu.prototype.renderMenuItem = function renderMenuItem(c, i, subIndex) {
|
9106 | if (!c) {
|
9107 | return null;
|
9108 | }
|
9109 | var state = this.state;
|
9110 | var extraProps = {
|
9111 | openKeys: state.openKeys,
|
9112 | selectedKeys: state.selectedKeys,
|
9113 | openSubMenuOnMouseEnter: this.props.openSubMenuOnMouseEnter
|
9114 | };
|
9115 | return this.renderCommonMenuItem(c, i, subIndex, extraProps);
|
9116 | };
|
9117 |
|
9118 | Menu.prototype.renderCommonMenuItem = function renderCommonMenuItem(child, i, subIndex, extraProps) {
|
9119 | var state = this.state;
|
9120 | var props = this.props;
|
9121 | var key = (0, _util.getKeyFromChildrenIndex)(child, props.eventKey, i);
|
9122 | var childProps = child.props;
|
9123 | var isActive = key === state.activeKey;
|
9124 | var newChildProps = _extends({
|
9125 | mode: props.mode,
|
9126 | level: props.level,
|
9127 | inlineIndent: props.inlineIndent,
|
9128 | renderMenuItem: this.renderMenuItem,
|
9129 | rootPrefixCls: props.clsPrefix,
|
9130 | index: i,
|
9131 | parentMenu: this,
|
9132 | ref: childProps.disabled ? undefined : (0, _tinperBeeCore.createChainedFunction)(child.ref, saveRef.bind(this, i, subIndex)),
|
9133 | eventKey: key,
|
9134 | closeSubMenuOnMouseLeave: props.closeSubMenuOnMouseLeave,
|
9135 | onItemHover: this.onItemHover,
|
9136 | active: !childProps.disabled && isActive,
|
9137 | multiple: props.multiple,
|
9138 | onClick: this.onClick,
|
9139 | openTransitionName: this.getOpenTransitionName(),
|
9140 | openAnimation: props.openAnimation,
|
9141 | onOpenChange: this.onOpenChange,
|
9142 | onDeselect: this.onDeselect,
|
9143 | onDestroy: this.onDestroy,
|
9144 | onSelect: this.onSelect
|
9145 | }, extraProps);
|
9146 | if (props.mode === 'inline') {
|
9147 | newChildProps.closeSubMenuOnMouseLeave = newChildProps.openSubMenuOnMouseEnter = false;
|
9148 | }
|
9149 | return _react2["default"].cloneElement(child, newChildProps);
|
9150 | };
|
9151 |
|
9152 | Menu.prototype.getOpenChangesOnItemHover = function getOpenChangesOnItemHover(e) {
|
9153 | var mode = this.props.mode;
|
9154 | var key = e.key,
|
9155 | hover = e.hover,
|
9156 | trigger = e.trigger;
|
9157 |
|
9158 | var activeKey = this.state.activeKey;
|
9159 | if (!trigger || hover || this.props.closeSubMenuOnMouseLeave || !e.item.isSubMenu || mode === 'inline') {
|
9160 | this.setState({
|
9161 | activeKey: hover ? key : null
|
9162 | });
|
9163 | } else {}
|
9164 | // keep active for sub menu for click active
|
9165 | // empty
|
9166 |
|
9167 | // clear last open status
|
9168 | if (hover && mode !== 'inline') {
|
9169 | var activeItem = this.getFlatInstanceArray().filter(function (c) {
|
9170 | return c && c.props.eventKey === activeKey;
|
9171 | })[0];
|
9172 | if (activeItem && activeItem.isSubMenu && activeItem.props.eventKey !== key) {
|
9173 | return {
|
9174 | item: activeItem,
|
9175 | originalEvent: e,
|
9176 | key: activeItem.props.eventKey,
|
9177 | open: false
|
9178 | };
|
9179 | }
|
9180 | }
|
9181 | return [];
|
9182 | };
|
9183 |
|
9184 | Menu.prototype.getFlatInstanceArray = function getFlatInstanceArray() {
|
9185 | var instanceArray = this.instanceArray;
|
9186 | var hasInnerArray = instanceArray.some(function (a) {
|
9187 | return Array.isArray(a);
|
9188 | });
|
9189 | if (hasInnerArray) {
|
9190 | instanceArray = [];
|
9191 | this.instanceArray.forEach(function (a) {
|
9192 | if (Array.isArray(a)) {
|
9193 | instanceArray.push.apply(instanceArray, a);
|
9194 | } else {
|
9195 | instanceArray.push(a);
|
9196 | }
|
9197 | });
|
9198 | this.instanceArray = instanceArray;
|
9199 | }
|
9200 | return instanceArray;
|
9201 | };
|
9202 |
|
9203 | Menu.prototype.step = function step(direction) {
|
9204 | var children = this.getFlatInstanceArray();
|
9205 | var activeKey = this.state.activeKey;
|
9206 | var len = children.length;
|
9207 | if (!len) {
|
9208 | return null;
|
9209 | }
|
9210 | if (direction < 0) {
|
9211 | children = children.concat().reverse();
|
9212 | }
|
9213 | // find current activeIndex
|
9214 | var activeIndex = -1;
|
9215 | children.every(function (c, ci) {
|
9216 | if (c && c.props.eventKey === activeKey) {
|
9217 | activeIndex = ci;
|
9218 | return false;
|
9219 | }
|
9220 | return true;
|
9221 | });
|
9222 | if (!this.props.defaultActiveFirst && activeIndex !== -1) {
|
9223 | if (allDisabled(children.slice(activeIndex, len - 1))) {
|
9224 | return undefined;
|
9225 | }
|
9226 | }
|
9227 | var start = (activeIndex + 1) % len;
|
9228 | var i = start;
|
9229 | for (;;) {
|
9230 | var child = children[i];
|
9231 | if (!child || child.props.disabled) {
|
9232 | i = (i + 1 + len) % len;
|
9233 | // complete a loop
|
9234 | if (i === start) {
|
9235 | return null;
|
9236 | }
|
9237 | } else {
|
9238 | return child;
|
9239 | }
|
9240 | }
|
9241 | };
|
9242 |
|
9243 | Menu.prototype.onKeyDown = function onKeyDown(e) {
|
9244 | var _this3 = this;
|
9245 |
|
9246 | var keyCode = e.keyCode;
|
9247 | var handled = void 0;
|
9248 | this.getFlatInstanceArray().forEach(function (obj) {
|
9249 | if (obj && obj.props.active) {
|
9250 | handled = obj.onKeyDown(e);
|
9251 | }
|
9252 | });
|
9253 | if (handled) {
|
9254 | return 1;
|
9255 | }
|
9256 | var activeItem = null;
|
9257 | if (keyCode === _tinperBeeCore.KeyCode.UP || keyCode === _tinperBeeCore.KeyCode.DOWN) {
|
9258 | activeItem = this.step(keyCode === _tinperBeeCore.KeyCode.UP ? -1 : 1);
|
9259 | }
|
9260 | if (activeItem) {
|
9261 | e.preventDefault();
|
9262 | this.setState({
|
9263 | activeKey: activeItem.props.eventKey
|
9264 | }, function () {
|
9265 | scrollIntoView(ReactDOM.findDOMNode(activeItem), ReactDOM.findDOMNode(_this3), {
|
9266 | onlyScrollIfNeeded: true
|
9267 | });
|
9268 | });
|
9269 | return 1;
|
9270 | } else if (activeItem === undefined) {
|
9271 | e.preventDefault();
|
9272 | this.setState({
|
9273 | activeKey: null
|
9274 | });
|
9275 | return 1;
|
9276 | }
|
9277 | };
|
9278 |
|
9279 | Menu.prototype.renderRoot = function renderRoot(props) {
|
9280 | var _classes;
|
9281 |
|
9282 | this.instanceArray = [];
|
9283 | var classes = (_classes = {}, _defineProperty(_classes, props.clsPrefix, 1), _defineProperty(_classes, props.clsPrefix + '-' + props.mode, 1), _defineProperty(_classes, props.className, !!props.className), _classes);
|
9284 | var domProps = {
|
9285 | className: (0, _classnames2["default"])(classes),
|
9286 | role: 'menu',
|
9287 | 'aria-activedescendant': ''
|
9288 | };
|
9289 | if (props.id) {
|
9290 | domProps.id = props.id;
|
9291 | }
|
9292 | if (props.focusable) {
|
9293 | domProps.tabIndex = '0';
|
9294 | domProps.onKeyDown = this.onKeyDown;
|
9295 | }
|
9296 | return (
|
9297 | // ESLint is not smart enough to know that the type of `children` was checked.
|
9298 | /* eslint-disable */
|
9299 | _react2["default"].createElement(
|
9300 | _DOMWrap2["default"],
|
9301 | _extends({
|
9302 | style: props.style,
|
9303 | tag: 'ul',
|
9304 | hiddenClassName: props.clsPrefix + '-hidden',
|
9305 | visible: props.visible
|
9306 | }, domProps),
|
9307 | _react2["default"].Children.map(props.children, this.renderMenuItem.bind(this))
|
9308 | )
|
9309 | /*eslint-enable */
|
9310 |
|
9311 | );
|
9312 | };
|
9313 |
|
9314 | Menu.prototype.render = function render() {
|
9315 | var props = _extends({}, this.props);
|
9316 | props.className += ' ' + props.clsPrefix + '-root';
|
9317 | return this.renderRoot(props);
|
9318 | };
|
9319 |
|
9320 | return Menu;
|
9321 | }(_react.Component);
|
9322 |
|
9323 | ;
|
9324 |
|
9325 | Menu.propTypes = propTypes;
|
9326 | Menu.defaultProps = defaultProps;
|
9327 |
|
9328 | exports["default"] = Menu;
|
9329 | module.exports = exports['default'];
|
9330 |
|
9331 | /***/ },
|
9332 | /* 89 */
|
9333 | /***/ function(module, exports, __webpack_require__) {
|
9334 |
|
9335 | ;
|
9336 |
|
9337 | Object.defineProperty(exports, "__esModule", {
|
9338 | value: true
|
9339 | });
|
9340 | exports.noop = noop;
|
9341 | exports.getKeyFromChildrenIndex = getKeyFromChildrenIndex;
|
9342 | exports.loopMenuItem = loopMenuItem;
|
9343 | exports.loopMenuItemRecusively = loopMenuItemRecusively;
|
9344 |
|
9345 | var _react = __webpack_require__(4);
|
9346 |
|
9347 | var _react2 = _interopRequireDefault(_react);
|
9348 |
|
9349 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
9350 |
|
9351 | function noop() {}
|
9352 |
|
9353 | function getKeyFromChildrenIndex(child, menuEventKey, index) {
|
9354 | var prefix = menuEventKey || '';
|
9355 | return child.key || prefix + 'item_' + index;
|
9356 | }
|
9357 |
|
9358 | function loopMenuItem(children, cb) {
|
9359 | var index = -1;
|
9360 | _react2["default"].Children.forEach(children, function (c) {
|
9361 | index++;
|
9362 | if (c && c.type && c.type.isMenuItemGroup) {
|
9363 | _react2["default"].Children.forEach(c.props.children, function (c2) {
|
9364 | index++;
|
9365 | cb(c2, index);
|
9366 | });
|
9367 | } else {
|
9368 | cb(c, index);
|
9369 | }
|
9370 | });
|
9371 | }
|
9372 |
|
9373 | function loopMenuItemRecusively(children, keys, ret) {
|
9374 | if (!children || ret.find) {
|
9375 | return;
|
9376 | }
|
9377 | _react2["default"].Children.forEach(children, function (c) {
|
9378 | if (ret.find) {
|
9379 | return;
|
9380 | }
|
9381 | if (c) {
|
9382 | var construt = c.type;
|
9383 | if (!construt || !(construt.isSubMenu || construt.isMenuItem || construt.isMenuItemGroup)) {
|
9384 | return;
|
9385 | }
|
9386 | if (keys.indexOf(c.key) !== -1) {
|
9387 | ret.find = true;
|
9388 | } else if (c.props.children) {
|
9389 | loopMenuItemRecusively(c.props.children, keys, ret);
|
9390 | }
|
9391 | }
|
9392 | });
|
9393 | }
|
9394 |
|
9395 | /***/ },
|
9396 | /* 90 */
|
9397 | /***/ function(module, exports, __webpack_require__) {
|
9398 |
|
9399 | ;
|
9400 |
|
9401 | Object.defineProperty(exports, "__esModule", {
|
9402 | value: true
|
9403 | });
|
9404 |
|
9405 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
9406 |
|
9407 | var _react = __webpack_require__(4);
|
9408 |
|
9409 | var _react2 = _interopRequireDefault(_react);
|
9410 |
|
9411 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
9412 |
|
9413 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
9414 |
|
9415 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
9416 |
|
9417 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
9418 |
|
9419 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
9420 |
|
9421 | var propTypes = {
|
9422 | tag: _react.PropTypes.string,
|
9423 | hiddenClassName: _react.PropTypes.string,
|
9424 | visible: _react.PropTypes.bool
|
9425 | };
|
9426 | var defaultProps = {
|
9427 | tag: 'div'
|
9428 | };
|
9429 |
|
9430 | var DOMWrap = function (_Component) {
|
9431 | _inherits(DOMWrap, _Component);
|
9432 |
|
9433 | function DOMWrap() {
|
9434 | _classCallCheck(this, DOMWrap);
|
9435 |
|
9436 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
9437 | }
|
9438 |
|
9439 | DOMWrap.prototype.render = function render() {
|
9440 | var props = _extends({}, this.props);
|
9441 | if (!props.visible) {
|
9442 | props.className = props.className || '';
|
9443 | props.className += ' ' + props.hiddenClassName;
|
9444 | }
|
9445 | var Tag = props.tag;
|
9446 | delete props.tag;
|
9447 | delete props.hiddenClassName;
|
9448 | delete props.visible;
|
9449 | return _react2["default"].createElement(Tag, props);
|
9450 | };
|
9451 |
|
9452 | return DOMWrap;
|
9453 | }(_react.Component);
|
9454 |
|
9455 | ;
|
9456 |
|
9457 | DOMWrap.propTypes = propTypes;
|
9458 | DOMWrap.defaultProps = defaultProps;
|
9459 |
|
9460 | exports["default"] = DOMWrap;
|
9461 | module.exports = exports['default'];
|
9462 |
|
9463 | /***/ },
|
9464 | /* 91 */
|
9465 | /***/ function(module, exports, __webpack_require__) {
|
9466 |
|
9467 | ;
|
9468 |
|
9469 | Object.defineProperty(exports, "__esModule", {
|
9470 | value: true
|
9471 | });
|
9472 |
|
9473 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
9474 |
|
9475 | var _SubPopupMenu = __webpack_require__(92);
|
9476 |
|
9477 | var _SubPopupMenu2 = _interopRequireDefault(_SubPopupMenu);
|
9478 |
|
9479 | var _react = __webpack_require__(4);
|
9480 |
|
9481 | var _react2 = _interopRequireDefault(_react);
|
9482 |
|
9483 | var _tinperBeeCore = __webpack_require__(25);
|
9484 |
|
9485 | var _classnames = __webpack_require__(3);
|
9486 |
|
9487 | var _classnames2 = _interopRequireDefault(_classnames);
|
9488 |
|
9489 | var _util = __webpack_require__(89);
|
9490 |
|
9491 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
9492 |
|
9493 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
9494 |
|
9495 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
9496 |
|
9497 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
9498 |
|
9499 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
9500 |
|
9501 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
9502 |
|
9503 | var guid = 0;
|
9504 |
|
9505 | var propTypes = {
|
9506 | parentMenu: _react.PropTypes.object,
|
9507 | title: _react.PropTypes.node,
|
9508 | children: _react.PropTypes.any,
|
9509 | selectedKeys: _react.PropTypes.array,
|
9510 | openKeys: _react.PropTypes.array,
|
9511 | onClick: _react.PropTypes.func,
|
9512 | onOpenChange: _react.PropTypes.func,
|
9513 | rootPrefixCls: _react.PropTypes.string,
|
9514 | eventKey: _react.PropTypes.string,
|
9515 | multiple: _react.PropTypes.bool,
|
9516 | active: _react.PropTypes.bool,
|
9517 | onSelect: _react.PropTypes.func,
|
9518 | closeSubMenuOnMouseLeave: _react.PropTypes.bool,
|
9519 | openSubMenuOnMouseEnter: _react.PropTypes.bool,
|
9520 | onDeselect: _react.PropTypes.func,
|
9521 | onDestroy: _react.PropTypes.func,
|
9522 | onItemHover: _react.PropTypes.func,
|
9523 | onMouseEnter: _react.PropTypes.func,
|
9524 | onMouseLeave: _react.PropTypes.func,
|
9525 | onTitleMouseEnter: _react.PropTypes.func,
|
9526 | onTitleMouseLeave: _react.PropTypes.func,
|
9527 | onTitleClick: _react.PropTypes.func
|
9528 | };
|
9529 | var defaultProps = {
|
9530 | onMouseEnter: _util.noop,
|
9531 | onMouseLeave: _util.noop,
|
9532 | onTitleMouseEnter: _util.noop,
|
9533 | onTitleMouseLeave: _util.noop,
|
9534 | onTitleClick: _util.noop,
|
9535 | title: ''
|
9536 | };
|
9537 |
|
9538 | var SubMenu = function (_Component) {
|
9539 | _inherits(SubMenu, _Component);
|
9540 |
|
9541 | function SubMenu(props) {
|
9542 | _classCallCheck(this, SubMenu);
|
9543 |
|
9544 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
9545 |
|
9546 | _this.isSubMenu = 1;
|
9547 | _this.state = {
|
9548 | defaultActiveFirst: false
|
9549 | };
|
9550 |
|
9551 | _this.onDestroy = _this.onDestroy.bind(_this);
|
9552 | _this.onKeyDown = _this.onKeyDown.bind(_this);
|
9553 | _this.onOpenChange = _this.onOpenChange.bind(_this);
|
9554 | _this.onMouseEnter = _this.onMouseEnter.bind(_this);
|
9555 | _this.onTitleMouseEnter = _this.onTitleMouseEnter.bind(_this);
|
9556 |
|
9557 | _this.onTitleMouseLeave = _this.onTitleMouseLeave.bind(_this);
|
9558 | _this.onMouseLeave = _this.onMouseLeave.bind(_this);
|
9559 | _this.onTitleClick = _this.onTitleClick.bind(_this);
|
9560 | _this.onSubMenuClick = _this.onSubMenuClick.bind(_this);
|
9561 | _this.onSelect = _this.onSelect.bind(_this);
|
9562 | _this.onDeselect = _this.onDeselect.bind(_this);
|
9563 |
|
9564 | _this.getPrefixCls = _this.getPrefixCls.bind(_this);
|
9565 | _this.getActiveClassName = _this.getActiveClassName.bind(_this);
|
9566 | _this.getSelectedClassName = _this.getSelectedClassName.bind(_this);
|
9567 |
|
9568 | _this.getDisabledClassName = _this.getDisabledClassName.bind(_this);
|
9569 | _this.getOpenClassName = _this.getOpenClassName.bind(_this);
|
9570 | _this.saveMenuInstance = _this.saveMenuInstance.bind(_this);
|
9571 | _this.addKeyPath = _this.addKeyPath.bind(_this);
|
9572 | _this.triggerOpenChange = _this.triggerOpenChange.bind(_this);
|
9573 | _this.clearSubMenuTimers = _this.clearSubMenuTimers.bind(_this);
|
9574 |
|
9575 | _this.clearSubMenuLeaveTimer = _this.clearSubMenuLeaveTimer.bind(_this);
|
9576 | _this.clearSubMenuTitleLeaveTimer = _this.clearSubMenuTitleLeaveTimer.bind(_this);
|
9577 | _this.isChildrenSelected = _this.isChildrenSelected.bind(_this);
|
9578 | _this.isOpen = _this.isOpen.bind(_this);
|
9579 | _this.renderChildren = _this.renderChildren.bind(_this);
|
9580 | return _this;
|
9581 | }
|
9582 |
|
9583 | SubMenu.prototype.componentWillUnmount = function componentWillUnmount() {
|
9584 | var _props = this.props,
|
9585 | onDestroy = _props.onDestroy,
|
9586 | eventKey = _props.eventKey,
|
9587 | parentMenu = _props.parentMenu;
|
9588 |
|
9589 | this.mounted = true;
|
9590 | if (onDestroy) {
|
9591 | onDestroy(eventKey);
|
9592 | }
|
9593 | if (parentMenu.subMenuInstance === this) {
|
9594 | this.clearSubMenuTimers();
|
9595 | }
|
9596 | };
|
9597 |
|
9598 | SubMenu.prototype.componentDidMount = function componentDidMount() {
|
9599 | this.mounted = true;
|
9600 | };
|
9601 |
|
9602 | SubMenu.prototype.onDestroy = function onDestroy(key) {
|
9603 | this.props.onDestroy(key);
|
9604 | };
|
9605 |
|
9606 | SubMenu.prototype.onKeyDown = function onKeyDown(e) {
|
9607 | var keyCode = e.keyCode;
|
9608 | var menu = this.menuInstance;
|
9609 | var isOpen = this.isOpen();
|
9610 |
|
9611 | if (keyCode === _tinperBeeCore.KeyCode.ENTER) {
|
9612 | this.onTitleClick(e);
|
9613 | this.setState({
|
9614 | defaultActiveFirst: true
|
9615 | });
|
9616 | return true;
|
9617 | }
|
9618 |
|
9619 | if (keyCode === _tinperBeeCore.KeyCode.RIGHT) {
|
9620 | if (isOpen) {
|
9621 | menu.onKeyDown(e);
|
9622 | } else {
|
9623 | this.triggerOpenChange(true);
|
9624 | this.setState({
|
9625 | defaultActiveFirst: true
|
9626 | });
|
9627 | }
|
9628 | return true;
|
9629 | }
|
9630 | if (keyCode === _tinperBeeCore.KeyCode.LEFT) {
|
9631 | var handled = void 0;
|
9632 | if (isOpen) {
|
9633 | handled = menu.onKeyDown(e);
|
9634 | } else {
|
9635 | return undefined;
|
9636 | }
|
9637 | if (!handled) {
|
9638 | this.triggerOpenChange(false);
|
9639 | handled = true;
|
9640 | }
|
9641 | return handled;
|
9642 | }
|
9643 |
|
9644 | if (isOpen && (keyCode === _tinperBeeCore.KeyCode.UP || keyCode === _tinperBeeCore.KeyCode.DOWN)) {
|
9645 | return menu.onKeyDown(e);
|
9646 | }
|
9647 | };
|
9648 |
|
9649 | SubMenu.prototype.onOpenChange = function onOpenChange(e) {
|
9650 | this.props.onOpenChange(e);
|
9651 | };
|
9652 |
|
9653 | SubMenu.prototype.onMouseEnter = function onMouseEnter(e) {
|
9654 | var props = this.props;
|
9655 | this.clearSubMenuLeaveTimer(props.parentMenu.subMenuInstance !== this);
|
9656 | props.onMouseEnter({
|
9657 | key: props.eventKey,
|
9658 | domEvent: e
|
9659 | });
|
9660 | };
|
9661 |
|
9662 | SubMenu.prototype.onTitleMouseEnter = function onTitleMouseEnter(domEvent) {
|
9663 | var props = this.props;
|
9664 | var parentMenu = props.parentMenu,
|
9665 | key = props.eventKey;
|
9666 |
|
9667 | var item = this;
|
9668 | this.clearSubMenuTitleLeaveTimer(parentMenu.subMenuInstance !== item);
|
9669 | if (parentMenu.menuItemInstance) {
|
9670 | parentMenu.menuItemInstance.clearMenuItemMouseLeaveTimer(true);
|
9671 | }
|
9672 | var openChanges = [];
|
9673 | if (props.openSubMenuOnMouseEnter) {
|
9674 | openChanges.push({
|
9675 | key: key,
|
9676 | item: item,
|
9677 | trigger: 'mouseenter',
|
9678 | open: true
|
9679 | });
|
9680 | }
|
9681 | props.onItemHover({
|
9682 | key: key,
|
9683 | item: item,
|
9684 | hover: true,
|
9685 | trigger: 'mouseenter',
|
9686 | openChanges: openChanges
|
9687 | });
|
9688 | this.setState({
|
9689 | defaultActiveFirst: false
|
9690 | });
|
9691 | props.onTitleMouseEnter({
|
9692 | key: key,
|
9693 | domEvent: domEvent
|
9694 | });
|
9695 | };
|
9696 |
|
9697 | SubMenu.prototype.onTitleMouseLeave = function onTitleMouseLeave(e) {
|
9698 | var _this2 = this;
|
9699 |
|
9700 | var props = this.props;
|
9701 | var parentMenu = props.parentMenu,
|
9702 | eventKey = props.eventKey;
|
9703 |
|
9704 | parentMenu.subMenuInstance = this;
|
9705 | parentMenu.subMenuTitleLeaveFn = function () {
|
9706 | if (_this2.mounted) {
|
9707 | // leave whole sub tree
|
9708 | // still active
|
9709 | if (props.mode === 'inline' && props.active) {
|
9710 | props.onItemHover({
|
9711 | key: eventKey,
|
9712 | item: _this2,
|
9713 | hover: false,
|
9714 | trigger: 'mouseleave'
|
9715 | });
|
9716 | }
|
9717 | props.onTitleMouseLeave({
|
9718 | key: props.eventKey,
|
9719 | domEvent: e
|
9720 | });
|
9721 | }
|
9722 | };
|
9723 | parentMenu.subMenuTitleLeaveTimer = setTimeout(parentMenu.subMenuTitleLeaveFn, 100);
|
9724 | };
|
9725 |
|
9726 | SubMenu.prototype.onMouseLeave = function onMouseLeave(e) {
|
9727 | var _this3 = this;
|
9728 |
|
9729 | var props = this.props;
|
9730 | var parentMenu = props.parentMenu,
|
9731 | eventKey = props.eventKey;
|
9732 |
|
9733 | parentMenu.subMenuInstance = this;
|
9734 | parentMenu.subMenuLeaveFn = function () {
|
9735 | if (_this3.mounted) {
|
9736 | // leave whole sub tree
|
9737 | // still active
|
9738 | if (props.mode !== 'inline') {
|
9739 | var isOpen = _this3.isOpen();
|
9740 | if (isOpen && props.closeSubMenuOnMouseLeave && props.active) {
|
9741 | props.onItemHover({
|
9742 | key: eventKey,
|
9743 | item: _this3,
|
9744 | hover: false,
|
9745 | trigger: 'mouseleave',
|
9746 | openChanges: [{
|
9747 | key: eventKey,
|
9748 | item: _this3,
|
9749 | trigger: 'mouseleave',
|
9750 | open: false
|
9751 | }]
|
9752 | });
|
9753 | } else {
|
9754 | if (props.active) {
|
9755 | props.onItemHover({
|
9756 | key: eventKey,
|
9757 | item: _this3,
|
9758 | hover: false,
|
9759 | trigger: 'mouseleave'
|
9760 | });
|
9761 | }
|
9762 | if (isOpen && props.closeSubMenuOnMouseLeave) {
|
9763 | _this3.triggerOpenChange(false);
|
9764 | }
|
9765 | }
|
9766 | }
|
9767 | // trigger mouseleave
|
9768 | props.onMouseLeave({
|
9769 | key: eventKey,
|
9770 | domEvent: e
|
9771 | });
|
9772 | }
|
9773 | };
|
9774 | // prevent popup menu and submenu gap
|
9775 | parentMenu.subMenuLeaveTimer = setTimeout(parentMenu.subMenuLeaveFn, 100);
|
9776 | };
|
9777 |
|
9778 | SubMenu.prototype.onTitleClick = function onTitleClick(e) {
|
9779 | var props = this.props;
|
9780 |
|
9781 | props.onTitleClick({
|
9782 | key: props.eventKey,
|
9783 | domEvent: e
|
9784 | });
|
9785 | if (props.openSubMenuOnMouseEnter) {
|
9786 | return;
|
9787 | }
|
9788 | this.triggerOpenChange(!this.isOpen(), 'click');
|
9789 | this.setState({
|
9790 | defaultActiveFirst: false
|
9791 | });
|
9792 | };
|
9793 |
|
9794 | SubMenu.prototype.onSubMenuClick = function onSubMenuClick(info) {
|
9795 | this.props.onClick(this.addKeyPath(info));
|
9796 | };
|
9797 |
|
9798 | SubMenu.prototype.onSelect = function onSelect(info) {
|
9799 | this.props.onSelect(info);
|
9800 | };
|
9801 |
|
9802 | SubMenu.prototype.onDeselect = function onDeselect(info) {
|
9803 | this.props.onDeselect(info);
|
9804 | };
|
9805 |
|
9806 | SubMenu.prototype.getPrefixCls = function getPrefixCls() {
|
9807 | return this.props.rootPrefixCls + '-submenu';
|
9808 | };
|
9809 |
|
9810 | SubMenu.prototype.getActiveClassName = function getActiveClassName() {
|
9811 | return this.getPrefixCls() + '-active';
|
9812 | };
|
9813 |
|
9814 | SubMenu.prototype.getDisabledClassName = function getDisabledClassName() {
|
9815 | return this.getPrefixCls() + '-disabled';
|
9816 | };
|
9817 |
|
9818 | SubMenu.prototype.getSelectedClassName = function getSelectedClassName() {
|
9819 | return this.getPrefixCls() + '-selected';
|
9820 | };
|
9821 |
|
9822 | SubMenu.prototype.getOpenClassName = function getOpenClassName() {
|
9823 | return this.props.rootPrefixCls + '-submenu-open';
|
9824 | };
|
9825 |
|
9826 | SubMenu.prototype.saveMenuInstance = function saveMenuInstance(c) {
|
9827 | this.menuInstance = c;
|
9828 | };
|
9829 |
|
9830 | SubMenu.prototype.addKeyPath = function addKeyPath(info) {
|
9831 | return _extends({}, info, {
|
9832 | keyPath: (info.keyPath || []).concat(this.props.eventKey)
|
9833 | });
|
9834 | };
|
9835 |
|
9836 | SubMenu.prototype.triggerOpenChange = function triggerOpenChange(open, type) {
|
9837 | var key = this.props.eventKey;
|
9838 | this.onOpenChange({
|
9839 | key: key,
|
9840 | item: this,
|
9841 | trigger: type,
|
9842 | open: open
|
9843 | });
|
9844 | };
|
9845 |
|
9846 | SubMenu.prototype.clearSubMenuTimers = function clearSubMenuTimers() {
|
9847 | var callFn = void 0;
|
9848 | this.clearSubMenuLeaveTimer(callFn);
|
9849 | this.clearSubMenuTitleLeaveTimer(callFn);
|
9850 | };
|
9851 |
|
9852 | SubMenu.prototype.clearSubMenuTitleLeaveTimer = function clearSubMenuTitleLeaveTimer() {
|
9853 | var callFn = void 0;
|
9854 | var parentMenu = this.props.parentMenu;
|
9855 | if (parentMenu.subMenuTitleLeaveTimer) {
|
9856 | clearTimeout(parentMenu.subMenuTitleLeaveTimer);
|
9857 | parentMenu.subMenuTitleLeaveTimer = null;
|
9858 | if (callFn && parentMenu.subMenuTitleLeaveFn) {
|
9859 | parentMenu.subMenuTitleLeaveFn();
|
9860 | }
|
9861 | parentMenu.subMenuTitleLeaveFn = null;
|
9862 | }
|
9863 | };
|
9864 |
|
9865 | SubMenu.prototype.clearSubMenuLeaveTimer = function clearSubMenuLeaveTimer() {
|
9866 | var callFn = void 0;
|
9867 | var parentMenu = this.props.parentMenu;
|
9868 | if (parentMenu.subMenuLeaveTimer) {
|
9869 | clearTimeout(parentMenu.subMenuLeaveTimer);
|
9870 | parentMenu.subMenuLeaveTimer = null;
|
9871 | if (callFn && parentMenu.subMenuLeaveFn) {
|
9872 | parentMenu.subMenuLeaveFn();
|
9873 | }
|
9874 | parentMenu.subMenuLeaveFn = null;
|
9875 | }
|
9876 | };
|
9877 |
|
9878 | SubMenu.prototype.isChildrenSelected = function isChildrenSelected() {
|
9879 | var ret = { find: false };
|
9880 | (0, _util.loopMenuItemRecusively)(this.props.children, this.props.selectedKeys, ret);
|
9881 | return ret.find;
|
9882 | };
|
9883 |
|
9884 | SubMenu.prototype.isOpen = function isOpen() {
|
9885 | return this.props.openKeys.indexOf(this.props.eventKey) !== -1;
|
9886 | };
|
9887 |
|
9888 | SubMenu.prototype.renderChildren = function renderChildren(children) {
|
9889 | var props = this.props;
|
9890 | var baseProps = {
|
9891 | mode: props.mode === 'horizontal' ? 'vertical' : props.mode,
|
9892 | visible: this.isOpen(),
|
9893 | level: props.level + 1,
|
9894 | inlineIndent: props.inlineIndent,
|
9895 | focusable: false,
|
9896 | onClick: this.onSubMenuClick,
|
9897 | onSelect: this.onSelect,
|
9898 | onDeselect: this.onDeselect,
|
9899 | onDestroy: this.onDestroy,
|
9900 | selectedKeys: props.selectedKeys,
|
9901 | eventKey: props.eventKey + '-menu-',
|
9902 | openKeys: props.openKeys,
|
9903 | openTransitionName: props.openTransitionName,
|
9904 | openAnimation: props.openAnimation,
|
9905 | onOpenChange: this.onOpenChange,
|
9906 | closeSubMenuOnMouseLeave: props.closeSubMenuOnMouseLeave,
|
9907 | defaultActiveFirst: this.state.defaultActiveFirst,
|
9908 | multiple: props.multiple,
|
9909 | prefixCls: props.rootPrefixCls,
|
9910 | id: this._menuId,
|
9911 | ref: this.saveMenuInstance
|
9912 | };
|
9913 | return _react2["default"].createElement(
|
9914 | _SubPopupMenu2["default"],
|
9915 | baseProps,
|
9916 | children
|
9917 | );
|
9918 | };
|
9919 |
|
9920 | SubMenu.prototype.render = function render() {
|
9921 | var _classes;
|
9922 |
|
9923 | var isOpen = this.isOpen();
|
9924 | this.haveOpen = this.haveOpen || isOpen;
|
9925 | var props = this.props;
|
9926 | var prefixCls = this.getPrefixCls();
|
9927 | var classes = (_classes = {}, _defineProperty(_classes, props.className, !!props.className), _defineProperty(_classes, prefixCls + '-' + props.mode, 1), _classes);
|
9928 |
|
9929 | classes[this.getOpenClassName()] = isOpen;
|
9930 | classes[this.getActiveClassName()] = props.active;
|
9931 | classes[this.getDisabledClassName()] = props.disabled;
|
9932 | classes[this.getSelectedClassName()] = this.isChildrenSelected();
|
9933 |
|
9934 | if (!this._menuId) {
|
9935 | if (props.eventKey) {
|
9936 | this._menuId = props.eventKey + '$Menu';
|
9937 | } else {
|
9938 | this._menuId = '$__$' + ++guid + '$Menu';
|
9939 | }
|
9940 | }
|
9941 |
|
9942 | classes[prefixCls] = true;
|
9943 | classes[prefixCls + '-' + props.mode] = 1;
|
9944 | var titleClickEvents = {};
|
9945 | var mouseEvents = {};
|
9946 | var titleMouseEvents = {};
|
9947 | if (!props.disabled) {
|
9948 | titleClickEvents = {
|
9949 | onClick: this.onTitleClick
|
9950 | };
|
9951 | mouseEvents = {
|
9952 | onMouseLeave: this.onMouseLeave,
|
9953 | onMouseEnter: this.onMouseEnter
|
9954 | };
|
9955 | // only works in title, not outer li
|
9956 | titleMouseEvents = {
|
9957 | onMouseEnter: this.onTitleMouseEnter,
|
9958 | onMouseLeave: this.onTitleMouseLeave
|
9959 | };
|
9960 | }
|
9961 | var style = {};
|
9962 | if (props.mode === 'inline') {
|
9963 | style.paddingLeft = props.inlineIndent * props.level;
|
9964 | }
|
9965 | return _react2["default"].createElement(
|
9966 | 'li',
|
9967 | _extends({ className: (0, _classnames2["default"])(classes) }, mouseEvents),
|
9968 | _react2["default"].createElement(
|
9969 | 'div',
|
9970 | _extends({
|
9971 | style: style,
|
9972 | className: prefixCls + '-title'
|
9973 | }, titleMouseEvents, titleClickEvents, {
|
9974 | 'aria-expanded': isOpen,
|
9975 | 'aria-owns': this._menuId,
|
9976 | 'aria-haspopup': 'true'
|
9977 | }),
|
9978 | props.title
|
9979 | ),
|
9980 | this.renderChildren(props.children)
|
9981 | );
|
9982 | };
|
9983 |
|
9984 | return SubMenu;
|
9985 | }(_react.Component);
|
9986 |
|
9987 | ;
|
9988 |
|
9989 | SubMenu.propTypes = propTypes;
|
9990 | SubMenu.defaultProps = defaultProps;
|
9991 | SubMenu.isSubMenu = 1;
|
9992 |
|
9993 | exports["default"] = SubMenu;
|
9994 | module.exports = exports['default'];
|
9995 |
|
9996 | /***/ },
|
9997 | /* 92 */
|
9998 | /***/ function(module, exports, __webpack_require__) {
|
9999 |
|
10000 | ;
|
10001 |
|
10002 | Object.defineProperty(exports, "__esModule", {
|
10003 | value: true
|
10004 | });
|
10005 |
|
10006 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
10007 |
|
10008 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
10009 |
|
10010 | var _react = __webpack_require__(4);
|
10011 |
|
10012 | var _react2 = _interopRequireDefault(_react);
|
10013 |
|
10014 | var _beeAnimate = __webpack_require__(78);
|
10015 |
|
10016 | var _beeAnimate2 = _interopRequireDefault(_beeAnimate);
|
10017 |
|
10018 | var _classnames = __webpack_require__(3);
|
10019 |
|
10020 | var _classnames2 = _interopRequireDefault(_classnames);
|
10021 |
|
10022 | var _tinperBeeCore = __webpack_require__(25);
|
10023 |
|
10024 | var _util = __webpack_require__(89);
|
10025 |
|
10026 | var _DOMWrap = __webpack_require__(90);
|
10027 |
|
10028 | var _DOMWrap2 = _interopRequireDefault(_DOMWrap);
|
10029 |
|
10030 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
10031 |
|
10032 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
10033 |
|
10034 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
10035 |
|
10036 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
10037 |
|
10038 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
10039 |
|
10040 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
10041 |
|
10042 | function allDisabled(arr) {
|
10043 | if (!arr.length) {
|
10044 | return true;
|
10045 | }
|
10046 | return arr.every(function (c) {
|
10047 | return !!c.props.disabled;
|
10048 | });
|
10049 | }
|
10050 |
|
10051 | function getActiveKey(props, originalActiveKey) {
|
10052 | var activeKey = originalActiveKey;
|
10053 | var children = props.children,
|
10054 | eventKey = props.eventKey;
|
10055 |
|
10056 | if (activeKey) {
|
10057 | var found = void 0;
|
10058 | (0, _util.loopMenuItem)(children, function (c, i) {
|
10059 | if (c && !c.props.disabled && activeKey === (0, _util.getKeyFromChildrenIndex)(c, eventKey, i)) {
|
10060 | found = true;
|
10061 | }
|
10062 | });
|
10063 | if (found) {
|
10064 | return activeKey;
|
10065 | }
|
10066 | }
|
10067 | activeKey = null;
|
10068 | if (props.defaultActiveFirst) {
|
10069 | (0, _util.loopMenuItem)(children, function (c, i) {
|
10070 | if (!activeKey && c && !c.props.disabled) {
|
10071 | activeKey = (0, _util.getKeyFromChildrenIndex)(c, eventKey, i);
|
10072 | }
|
10073 | });
|
10074 | return activeKey;
|
10075 | }
|
10076 | return activeKey;
|
10077 | }
|
10078 |
|
10079 | function saveRef(index, subIndex, c) {
|
10080 | if (c) {
|
10081 | if (subIndex !== undefined) {
|
10082 | this.instanceArray[index] = this.instanceArray[index] || [];
|
10083 | this.instanceArray[index][subIndex] = c;
|
10084 | } else {
|
10085 | this.instanceArray[index] = c;
|
10086 | }
|
10087 | }
|
10088 | }
|
10089 |
|
10090 | //import Animate from 'bee-transition';
|
10091 | var propTypes = {
|
10092 | onSelect: _react.PropTypes.func,
|
10093 | onClick: _react.PropTypes.func,
|
10094 | onDeselect: _react.PropTypes.func,
|
10095 | onOpenChange: _react.PropTypes.func,
|
10096 | onDestroy: _react.PropTypes.func,
|
10097 | openTransitionName: _react.PropTypes.string,
|
10098 | openAnimation: _react.PropTypes.oneOfType([_react.PropTypes.string, _react.PropTypes.object]),
|
10099 | openKeys: _react.PropTypes.arrayOf(_react.PropTypes.string),
|
10100 | closeSubMenuOnMouseLeave: _react.PropTypes.bool,
|
10101 | visible: _react.PropTypes.bool,
|
10102 | children: _react.PropTypes.any
|
10103 | };
|
10104 |
|
10105 | var SubPopupMenu = function (_Component) {
|
10106 | _inherits(SubPopupMenu, _Component);
|
10107 |
|
10108 | function SubPopupMenu(props) {
|
10109 | _classCallCheck(this, SubPopupMenu);
|
10110 |
|
10111 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
10112 |
|
10113 | _this.state = {
|
10114 | activeKey: getActiveKey(_this.props, _this.props.activeKey)
|
10115 | };
|
10116 | _this.getOpenChangesOnItemHover = _this.getOpenChangesOnItemHover.bind(_this);
|
10117 | _this.onDeselect = _this.onDeselect.bind(_this);
|
10118 | _this.onClick = _this.onClick.bind(_this);
|
10119 | _this.onOpenChange = _this.onOpenChange.bind(_this);
|
10120 | _this.onDestroy = _this.onDestroy.bind(_this);
|
10121 | _this.onSelect = _this.onSelect.bind(_this);
|
10122 |
|
10123 | _this.onItemHover = _this.onItemHover.bind(_this);
|
10124 | _this.getOpenTransitionName = _this.getOpenTransitionName.bind(_this);
|
10125 | _this.renderMenuItem = _this.renderMenuItem.bind(_this);
|
10126 |
|
10127 | _this.getFlatInstanceArray = _this.getFlatInstanceArray.bind(_this);
|
10128 | _this.renderCommonMenuItem = _this.renderCommonMenuItem.bind(_this);
|
10129 | _this.renderRoot = _this.renderRoot.bind(_this);
|
10130 |
|
10131 | return _this;
|
10132 | }
|
10133 |
|
10134 | SubPopupMenu.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
|
10135 | var props = void 0;
|
10136 | if ('activeKey' in nextProps) {
|
10137 | props = {
|
10138 | activeKey: getActiveKey(nextProps, nextProps.activeKey)
|
10139 | };
|
10140 | } else {
|
10141 | var originalActiveKey = this.state.activeKey;
|
10142 | var activeKey = getActiveKey(nextProps, originalActiveKey);
|
10143 | // fix: this.setState(), parent.render(),
|
10144 | if (activeKey !== originalActiveKey) {
|
10145 | props = {
|
10146 | activeKey: activeKey
|
10147 | };
|
10148 | }
|
10149 | }
|
10150 | if (props) {
|
10151 | this.setState(props);
|
10152 | }
|
10153 | };
|
10154 |
|
10155 | SubPopupMenu.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {
|
10156 | return this.props.visible || nextProps.visible;
|
10157 | };
|
10158 |
|
10159 | SubPopupMenu.prototype.onDeselect = function onDeselect(selectInfo) {
|
10160 | this.props.onDeselect(selectInfo);
|
10161 | };
|
10162 |
|
10163 | SubPopupMenu.prototype.onSelect = function onSelect(selectInfo) {
|
10164 | this.props.onSelect(selectInfo);
|
10165 | };
|
10166 |
|
10167 | SubPopupMenu.prototype.onClick = function onClick(e) {
|
10168 | this.props.onClick(e);
|
10169 | };
|
10170 |
|
10171 | SubPopupMenu.prototype.onOpenChange = function onOpenChange(e) {
|
10172 | this.props.onOpenChange(e);
|
10173 | };
|
10174 |
|
10175 | SubPopupMenu.prototype.onDestroy = function onDestroy(key) {
|
10176 | this.props.onDestroy(key);
|
10177 | };
|
10178 |
|
10179 | SubPopupMenu.prototype.onItemHover = function onItemHover(e) {
|
10180 | var _e$openChanges = e.openChanges,
|
10181 | openChanges = _e$openChanges === undefined ? [] : _e$openChanges;
|
10182 |
|
10183 | openChanges = openChanges.concat(this.getOpenChangesOnItemHover(e));
|
10184 | if (openChanges.length) {
|
10185 | this.onOpenChange(openChanges);
|
10186 | }
|
10187 | };
|
10188 |
|
10189 | SubPopupMenu.prototype.getOpenTransitionName = function getOpenTransitionName() {
|
10190 | return this.props.openTransitionName;
|
10191 | };
|
10192 |
|
10193 | SubPopupMenu.prototype.renderMenuItem = function renderMenuItem(c, i, subIndex) {
|
10194 | var props = this.props;
|
10195 | var extraProps = {
|
10196 | openKeys: props.openKeys,
|
10197 | selectedKeys: props.selectedKeys,
|
10198 | openSubMenuOnMouseEnter: true
|
10199 | };
|
10200 | return this.renderCommonMenuItem(c, i, subIndex, extraProps);
|
10201 | };
|
10202 |
|
10203 | SubPopupMenu.prototype.getOpenChangesOnItemHover = function getOpenChangesOnItemHover(e) {
|
10204 | var mode = this.props.mode;
|
10205 | var key = e.key,
|
10206 | hover = e.hover,
|
10207 | trigger = e.trigger;
|
10208 |
|
10209 | var activeKey = this.state.activeKey;
|
10210 | if (!trigger || hover || this.props.closeSubMenuOnMouseLeave || !e.item.isSubMenu || mode === 'inline') {
|
10211 | this.setState({
|
10212 | activeKey: hover ? key : null
|
10213 | });
|
10214 | } else {}
|
10215 | // keep active for sub menu for click active
|
10216 | // empty
|
10217 |
|
10218 | // clear last open status
|
10219 | if (hover && mode !== 'inline') {
|
10220 | var activeItem = this.getFlatInstanceArray().filter(function (c) {
|
10221 | return c && c.props.eventKey === activeKey;
|
10222 | })[0];
|
10223 | if (activeItem && activeItem.isSubMenu && activeItem.props.eventKey !== key) {
|
10224 | return {
|
10225 | item: activeItem,
|
10226 | originalEvent: e,
|
10227 | key: activeItem.props.eventKey,
|
10228 | open: false
|
10229 | };
|
10230 | }
|
10231 | }
|
10232 | return [];
|
10233 | };
|
10234 |
|
10235 | SubPopupMenu.prototype.renderCommonMenuItem = function renderCommonMenuItem(child, i, subIndex, extraProps) {
|
10236 | var state = this.state;
|
10237 | var props = this.props;
|
10238 | var key = (0, _util.getKeyFromChildrenIndex)(child, props.eventKey, i);
|
10239 | var childProps = child.props;
|
10240 | var isActive = key === state.activeKey;
|
10241 | var newChildProps = _extends({
|
10242 | mode: props.mode,
|
10243 | level: props.level,
|
10244 | inlineIndent: props.inlineIndent,
|
10245 | renderMenuItem: this.renderMenuItem,
|
10246 | rootPrefixCls: props.prefixCls,
|
10247 | index: i,
|
10248 | parentMenu: this,
|
10249 | ref: childProps.disabled ? undefined : (0, _tinperBeeCore.createChainedFunction)(child.ref, saveRef.bind(this, i, subIndex)),
|
10250 | eventKey: key,
|
10251 | closeSubMenuOnMouseLeave: props.closeSubMenuOnMouseLeave,
|
10252 | onItemHover: this.onItemHover,
|
10253 | active: !childProps.disabled && isActive,
|
10254 | multiple: props.multiple,
|
10255 | onClick: this.onClick,
|
10256 | openTransitionName: this.getOpenTransitionName(),
|
10257 | openAnimation: props.openAnimation,
|
10258 | onOpenChange: this.onOpenChange,
|
10259 | onDeselect: this.onDeselect,
|
10260 | onDestroy: this.onDestroy,
|
10261 | onSelect: this.onSelect
|
10262 | }, extraProps);
|
10263 | if (props.mode === 'inline') {
|
10264 | newChildProps.closeSubMenuOnMouseLeave = newChildProps.openSubMenuOnMouseEnter = false;
|
10265 | }
|
10266 | return _react2["default"].cloneElement(child, newChildProps);
|
10267 | };
|
10268 |
|
10269 | SubPopupMenu.prototype.getFlatInstanceArray = function getFlatInstanceArray() {
|
10270 | var instanceArray = this.instanceArray;
|
10271 | var hasInnerArray = instanceArray.some(function (a) {
|
10272 | return Array.isArray(a);
|
10273 | });
|
10274 | if (hasInnerArray) {
|
10275 | instanceArray = [];
|
10276 | this.instanceArray.forEach(function (a) {
|
10277 | if (Array.isArray(a)) {
|
10278 | instanceArray.push.apply(instanceArray, a);
|
10279 | } else {
|
10280 | instanceArray.push(a);
|
10281 | }
|
10282 | });
|
10283 | this.instanceArray = instanceArray;
|
10284 | }
|
10285 | return instanceArray;
|
10286 | };
|
10287 |
|
10288 | SubPopupMenu.prototype.renderRoot = function renderRoot(props) {
|
10289 | var _classes;
|
10290 |
|
10291 | this.instanceArray = [];
|
10292 | var classes = (_classes = {}, _defineProperty(_classes, props.prefixCls, 1), _defineProperty(_classes, props.prefixCls + '-' + props.mode, 1), _defineProperty(_classes, props.className, !!props.className), _classes);
|
10293 | var domProps = {
|
10294 | className: (0, _classnames2["default"])(classes),
|
10295 | role: 'menu',
|
10296 | 'aria-activedescendant': ''
|
10297 | };
|
10298 | if (props.id) {
|
10299 | domProps.id = props.id;
|
10300 | }
|
10301 | if (props.focusable) {
|
10302 | domProps.tabIndex = '0';
|
10303 | domProps.onKeyDown = this.onKeyDown;
|
10304 | }
|
10305 | return (
|
10306 | // ESLint is not smart enough to know that the type of `children` was checked.
|
10307 | /* eslint-disable */
|
10308 | _react2["default"].createElement(
|
10309 | _DOMWrap2["default"],
|
10310 | _extends({
|
10311 | style: props.style,
|
10312 | tag: 'ul',
|
10313 | hiddenClassName: props.prefixCls + '-hidden',
|
10314 | visible: props.visible
|
10315 | }, domProps),
|
10316 | _react2["default"].Children.map(props.children, this.renderMenuItem.bind(this))
|
10317 | )
|
10318 | /*eslint-enable */
|
10319 |
|
10320 | );
|
10321 | };
|
10322 |
|
10323 | SubPopupMenu.prototype.render = function render() {
|
10324 | var renderFirst = this.renderFirst;
|
10325 | this.renderFirst = 1;
|
10326 | this.haveOpened = this.haveOpened || this.props.visible;
|
10327 | if (!this.haveOpened) {
|
10328 | return null;
|
10329 | }
|
10330 | var transitionAppear = true;
|
10331 | if (!renderFirst && this.props.visible) {
|
10332 | transitionAppear = false;
|
10333 | }
|
10334 | var props = _extends({}, this.props);
|
10335 | props.className += ' ' + props.prefixCls + '-sub';
|
10336 | var animProps = {};
|
10337 | if (props.openTransitionName) {
|
10338 | animProps.transitionName = props.openTransitionName;
|
10339 | } else if (_typeof(props.openAnimation) === 'object') {
|
10340 | animProps.animation = _extends({}, props.openAnimation);
|
10341 | if (!transitionAppear) {
|
10342 | delete animProps.animation.appear;
|
10343 | }
|
10344 | }
|
10345 | return _react2["default"].createElement(
|
10346 | _beeAnimate2["default"],
|
10347 | _extends({}, animProps, {
|
10348 | showProp: 'visible',
|
10349 | component: '',
|
10350 | transitionAppear: transitionAppear
|
10351 | }),
|
10352 | this.renderRoot(props)
|
10353 | );
|
10354 | };
|
10355 |
|
10356 | return SubPopupMenu;
|
10357 | }(_react.Component);
|
10358 |
|
10359 | ;
|
10360 | SubPopupMenu.propTypes = propTypes;
|
10361 | exports["default"] = SubPopupMenu;
|
10362 | module.exports = exports['default'];
|
10363 |
|
10364 | /***/ },
|
10365 | /* 93 */
|
10366 | /***/ function(module, exports, __webpack_require__) {
|
10367 |
|
10368 | ;
|
10369 |
|
10370 | Object.defineProperty(exports, "__esModule", {
|
10371 | value: true
|
10372 | });
|
10373 |
|
10374 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
10375 |
|
10376 | var _react = __webpack_require__(4);
|
10377 |
|
10378 | var _react2 = _interopRequireDefault(_react);
|
10379 |
|
10380 | var _tinperBeeCore = __webpack_require__(25);
|
10381 |
|
10382 | var _classnames = __webpack_require__(3);
|
10383 |
|
10384 | var _classnames2 = _interopRequireDefault(_classnames);
|
10385 |
|
10386 | var _util = __webpack_require__(89);
|
10387 |
|
10388 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
10389 |
|
10390 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
10391 |
|
10392 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
10393 |
|
10394 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
10395 |
|
10396 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
10397 |
|
10398 | /* eslint react/no-is-mounted:0 */
|
10399 | var propTypes = {
|
10400 | rootPrefixCls: _react.PropTypes.string,
|
10401 | eventKey: _react.PropTypes.string,
|
10402 | active: _react.PropTypes.bool,
|
10403 | children: _react.PropTypes.any,
|
10404 | selectedKeys: _react.PropTypes.array,
|
10405 | disabled: _react.PropTypes.bool,
|
10406 | title: _react.PropTypes.string,
|
10407 | onSelect: _react.PropTypes.func,
|
10408 | onClick: _react.PropTypes.func,
|
10409 | onDeselect: _react.PropTypes.func,
|
10410 | parentMenu: _react.PropTypes.object,
|
10411 | onItemHover: _react.PropTypes.func,
|
10412 | onDestroy: _react.PropTypes.func,
|
10413 | onMouseEnter: _react.PropTypes.func,
|
10414 | onMouseLeave: _react.PropTypes.func
|
10415 | };
|
10416 |
|
10417 | var defaultProps = {
|
10418 | onSelect: _util.noop,
|
10419 | onMouseEnter: _util.noop,
|
10420 | onMouseLeave: _util.noop
|
10421 | };
|
10422 |
|
10423 | var MenuItem = function (_Component) {
|
10424 | _inherits(MenuItem, _Component);
|
10425 |
|
10426 | function MenuItem(props) {
|
10427 | _classCallCheck(this, MenuItem);
|
10428 |
|
10429 | var _this = _possibleConstructorReturn(this, _Component.call(this, props));
|
10430 |
|
10431 | _this.onMouseLeave = _this.onMouseLeave.bind(_this);
|
10432 | _this.onMouseEnter = _this.onMouseEnter.bind(_this);
|
10433 | _this.onKeyDown = _this.onKeyDown.bind(_this);
|
10434 | _this.onClick = _this.onClick.bind(_this);
|
10435 | _this.getPrefixCls = _this.getPrefixCls.bind(_this);
|
10436 | _this.getActiveClassName = _this.getActiveClassName.bind(_this);
|
10437 | _this.getDisabledClassName = _this.getDisabledClassName.bind(_this);
|
10438 | _this.getSelectedClassName = _this.getSelectedClassName.bind(_this);
|
10439 | _this.clearMenuItemMouseLeaveTimer = _this.clearMenuItemMouseLeaveTimer.bind(_this);
|
10440 | _this.isSelected = _this.isSelected.bind(_this);
|
10441 | return _this;
|
10442 | }
|
10443 |
|
10444 | MenuItem.prototype.componentWillUnmount = function componentWillUnmount() {
|
10445 | var props = this.props;
|
10446 | this.mounted = false;
|
10447 | if (props.onDestroy) {
|
10448 | props.onDestroy(props.eventKey);
|
10449 | }
|
10450 | if (props.parentMenu.menuItemInstance === this) {
|
10451 | this.clearMenuItemMouseLeaveTimer();
|
10452 | }
|
10453 | };
|
10454 |
|
10455 | MenuItem.prototype.componentDidMount = function componentDidMount() {
|
10456 | this.mounted = true;
|
10457 | };
|
10458 |
|
10459 | MenuItem.prototype.onKeyDown = function onKeyDown(e) {
|
10460 | var keyCode = e.keyCode;
|
10461 | if (keyCode === _tinperBeeCore.KeyCode.ENTER) {
|
10462 | this.onClick(e);
|
10463 | return true;
|
10464 | }
|
10465 | };
|
10466 |
|
10467 | MenuItem.prototype.onMouseLeave = function onMouseLeave(e) {
|
10468 | var _this2 = this;
|
10469 |
|
10470 | var props = this.props;
|
10471 | var eventKey = props.eventKey,
|
10472 | parentMenu = props.parentMenu;
|
10473 |
|
10474 | parentMenu.menuItemInstance = this;
|
10475 | parentMenu.menuItemMouseLeaveFn = function () {
|
10476 | if (_this2.mounted && props.active) {
|
10477 | props.onItemHover({
|
10478 | key: eventKey,
|
10479 | item: _this2,
|
10480 | hover: false,
|
10481 | domEvent: e,
|
10482 | trigger: 'mouseleave'
|
10483 | });
|
10484 | }
|
10485 | };
|
10486 | parentMenu.menuItemMouseLeaveTimer = setTimeout(parentMenu.menuItemMouseLeaveFn, 30);
|
10487 | props.onMouseLeave({
|
10488 | key: eventKey,
|
10489 | domEvent: e
|
10490 | });
|
10491 | };
|
10492 |
|
10493 | MenuItem.prototype.onMouseEnter = function onMouseEnter(e) {
|
10494 | var props = this.props;
|
10495 | var eventKey = props.eventKey,
|
10496 | parentMenu = props.parentMenu;
|
10497 |
|
10498 | this.clearMenuItemMouseLeaveTimer(parentMenu.menuItemInstance !== this);
|
10499 | if (parentMenu.subMenuInstance) {
|
10500 | parentMenu.subMenuInstance.clearSubMenuTimers();
|
10501 | }
|
10502 | props.onItemHover({
|
10503 | key: eventKey,
|
10504 | item: this,
|
10505 | hover: true,
|
10506 | domEvent: e,
|
10507 | trigger: 'mouseenter'
|
10508 | });
|
10509 | props.onMouseEnter({
|
10510 | key: eventKey,
|
10511 | domEvent: e
|
10512 | });
|
10513 | };
|
10514 |
|
10515 | MenuItem.prototype.onClick = function onClick(e) {
|
10516 | var props = this.props;
|
10517 | var selected = this.isSelected();
|
10518 | var eventKey = props.eventKey;
|
10519 | var info = {
|
10520 | key: eventKey,
|
10521 | keyPath: [eventKey],
|
10522 | item: this,
|
10523 | domEvent: e
|
10524 | };
|
10525 | props.onClick(info);
|
10526 | if (props.multiple) {
|
10527 | if (selected) {
|
10528 | props.onDeselect(info);
|
10529 | } else {
|
10530 | props.onSelect(info);
|
10531 | }
|
10532 | } else if (!selected) {
|
10533 | props.onSelect(info);
|
10534 | }
|
10535 | };
|
10536 |
|
10537 | MenuItem.prototype.getPrefixCls = function getPrefixCls() {
|
10538 | return this.props.rootPrefixCls + '-item';
|
10539 | };
|
10540 |
|
10541 | MenuItem.prototype.getActiveClassName = function getActiveClassName() {
|
10542 | return this.getPrefixCls() + '-active';
|
10543 | };
|
10544 |
|
10545 | MenuItem.prototype.getSelectedClassName = function getSelectedClassName() {
|
10546 | return this.getPrefixCls() + '-selected';
|
10547 | };
|
10548 |
|
10549 | MenuItem.prototype.getDisabledClassName = function getDisabledClassName() {
|
10550 | return this.getPrefixCls() + '-disabled';
|
10551 | };
|
10552 |
|
10553 | MenuItem.prototype.clearMenuItemMouseLeaveTimer = function clearMenuItemMouseLeaveTimer() {
|
10554 | var props = this.props;
|
10555 | var callFn = void 0;
|
10556 | var parentMenu = props.parentMenu;
|
10557 | if (parentMenu.menuItemMouseLeaveTimer) {
|
10558 | clearTimeout(parentMenu.menuItemMouseLeaveTimer);
|
10559 | parentMenu.menuItemMouseLeaveTimer = null;
|
10560 | if (callFn && parentMenu.menuItemMouseLeaveFn) {
|
10561 | parentMenu.menuItemMouseLeaveFn();
|
10562 | }
|
10563 | parentMenu.menuItemMouseLeaveFn = null;
|
10564 | }
|
10565 | };
|
10566 |
|
10567 | MenuItem.prototype.isSelected = function isSelected() {
|
10568 | return this.props.selectedKeys.indexOf(this.props.eventKey) !== -1;
|
10569 | };
|
10570 |
|
10571 | MenuItem.prototype.render = function render() {
|
10572 | var props = this.props;
|
10573 | var selected = this.isSelected();
|
10574 | var classes = {};
|
10575 | classes[this.getActiveClassName()] = !props.disabled && props.active;
|
10576 | classes[this.getSelectedClassName()] = selected;
|
10577 | classes[this.getDisabledClassName()] = props.disabled;
|
10578 | classes[this.getPrefixCls()] = true;
|
10579 | classes[props.className] = !!props.className;
|
10580 | var attrs = _extends({}, props.attribute, {
|
10581 | title: props.title,
|
10582 | className: (0, _classnames2["default"])(classes),
|
10583 | role: 'menuitem',
|
10584 | 'aria-selected': selected,
|
10585 | 'aria-disabled': props.disabled
|
10586 | });
|
10587 | var mouseEvent = {};
|
10588 | if (!props.disabled) {
|
10589 | mouseEvent = {
|
10590 | onClick: this.onClick,
|
10591 | onMouseLeave: this.onMouseLeave,
|
10592 | onMouseEnter: this.onMouseEnter
|
10593 | };
|
10594 | }
|
10595 | var style = _extends({}, props.style);
|
10596 | if (props.mode === 'inline') {
|
10597 | style.paddingLeft = props.inlineIndent * props.level;
|
10598 | }
|
10599 | return _react2["default"].createElement(
|
10600 | 'li',
|
10601 | _extends({
|
10602 | style: style
|
10603 | }, attrs, mouseEvent),
|
10604 | props.children
|
10605 | );
|
10606 | };
|
10607 |
|
10608 | return MenuItem;
|
10609 | }(_react.Component);
|
10610 |
|
10611 | ;
|
10612 |
|
10613 | MenuItem.isMenuItem = 1;
|
10614 |
|
10615 | MenuItem.defaultProps = defaultProps;
|
10616 | MenuItem.propTypes = propTypes;
|
10617 |
|
10618 | exports["default"] = MenuItem;
|
10619 | module.exports = exports['default'];
|
10620 |
|
10621 | /***/ },
|
10622 | /* 94 */
|
10623 | /***/ function(module, exports, __webpack_require__) {
|
10624 |
|
10625 | ;
|
10626 |
|
10627 | Object.defineProperty(exports, "__esModule", {
|
10628 | value: true
|
10629 | });
|
10630 |
|
10631 | var _react = __webpack_require__(4);
|
10632 |
|
10633 | var _react2 = _interopRequireDefault(_react);
|
10634 |
|
10635 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
10636 |
|
10637 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
10638 |
|
10639 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
10640 |
|
10641 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
10642 |
|
10643 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
10644 |
|
10645 | var propTypes = {
|
10646 | renderMenuItem: _react.PropTypes.func,
|
10647 | index: _react.PropTypes.number,
|
10648 | className: _react.PropTypes.string,
|
10649 | rootPrefixCls: _react.PropTypes.string
|
10650 | };
|
10651 |
|
10652 | var defaultProps = {
|
10653 | disabled: true
|
10654 | };
|
10655 |
|
10656 | var MenuItemGroup = function (_Component) {
|
10657 | _inherits(MenuItemGroup, _Component);
|
10658 |
|
10659 | function MenuItemGroup() {
|
10660 | _classCallCheck(this, MenuItemGroup);
|
10661 |
|
10662 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
10663 | }
|
10664 |
|
10665 | MenuItemGroup.prototype.renderInnerMenuItem = function renderInnerMenuItem(item, subIndex) {
|
10666 | var _props = this.props,
|
10667 | renderMenuItem = _props.renderMenuItem,
|
10668 | index = _props.index;
|
10669 |
|
10670 | return renderMenuItem(item, index, subIndex);
|
10671 | };
|
10672 |
|
10673 | MenuItemGroup.prototype.render = function render() {
|
10674 | var _props2 = this.props,
|
10675 | _props2$className = _props2.className,
|
10676 | className = _props2$className === undefined ? '' : _props2$className,
|
10677 | title = _props2.title,
|
10678 | children = _props2.children,
|
10679 | rootPrefixCls = _props2.rootPrefixCls;
|
10680 |
|
10681 | var titleClassName = rootPrefixCls + '-item-group-title';
|
10682 | var listClassName = rootPrefixCls + '-item-group-list';
|
10683 |
|
10684 | return _react2["default"].createElement(
|
10685 | 'li',
|
10686 | { className: className + ' ' + rootPrefixCls + '-item-group' },
|
10687 | _react2["default"].createElement(
|
10688 | 'div',
|
10689 | { className: titleClassName },
|
10690 | title
|
10691 | ),
|
10692 | _react2["default"].createElement(
|
10693 | 'ul',
|
10694 | { className: listClassName },
|
10695 | _react2["default"].Children.map(children, this.renderInnerMenuItem.bind(this))
|
10696 | )
|
10697 | );
|
10698 | };
|
10699 |
|
10700 | return MenuItemGroup;
|
10701 | }(_react.Component);
|
10702 |
|
10703 | ;
|
10704 |
|
10705 | MenuItemGroup.isMenuItemGroup = true;
|
10706 | MenuItemGroup.propTypes = propTypes;
|
10707 | MenuItemGroup.defaultProps = defaultProps;
|
10708 |
|
10709 | exports["default"] = MenuItemGroup;
|
10710 | module.exports = exports['default'];
|
10711 |
|
10712 | /***/ },
|
10713 | /* 95 */
|
10714 | /***/ function(module, exports, __webpack_require__) {
|
10715 |
|
10716 | ;
|
10717 |
|
10718 | Object.defineProperty(exports, "__esModule", {
|
10719 | value: true
|
10720 | });
|
10721 |
|
10722 | var _react = __webpack_require__(4);
|
10723 |
|
10724 | var _react2 = _interopRequireDefault(_react);
|
10725 |
|
10726 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
10727 |
|
10728 | function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
|
10729 |
|
10730 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
10731 |
|
10732 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
10733 |
|
10734 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); }
|
10735 |
|
10736 | var propTypes = {
|
10737 | className: _react.PropTypes.string,
|
10738 | rootPrefixCls: _react.PropTypes.string
|
10739 | };
|
10740 |
|
10741 | var Divider = function (_Component) {
|
10742 | _inherits(Divider, _Component);
|
10743 |
|
10744 | function Divider() {
|
10745 | _classCallCheck(this, Divider);
|
10746 |
|
10747 | return _possibleConstructorReturn(this, _Component.apply(this, arguments));
|
10748 | }
|
10749 |
|
10750 | Divider.prototype.render = function render() {
|
10751 | var _props = this.props,
|
10752 | className = _props.className,
|
10753 | rootPrefixCls = _props.rootPrefixCls;
|
10754 |
|
10755 | return _react2["default"].createElement('li', { className: className + ' ' + rootPrefixCls + '-item-divider' });
|
10756 | };
|
10757 |
|
10758 | return Divider;
|
10759 | }(_react.Component);
|
10760 |
|
10761 | ;
|
10762 |
|
10763 | Divider.propTypes = propTypes;
|
10764 |
|
10765 | exports["default"] = Divider;
|
10766 | module.exports = exports['default'];
|
10767 |
|
10768 | /***/ }
|
10769 | /******/ ]);
|
10770 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtby5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmYmI0MGVhNDM1MzQxMTljMTc0YSIsIndlYnBhY2s6Ly8vZGVtby9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1sYXlvdXQvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbGF5b3V0L2J1aWxkL0NvbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RcIiIsIndlYnBhY2s6Ly8vLi9+L2JlZS1sYXlvdXQvYnVpbGQvUm93LmpzIiwid2VicGFjazovLy8uL34vYmVlLWxheW91dC9idWlsZC9MYXlvdXQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtcGFuZWwvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtcGFuZWwvYnVpbGQvUGFuZWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL1RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3V0aWwvaW5ET00uanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy9ldmVudHMvb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9Db2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3N0eWxlL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZVN0eWxlLmpzIiwid2VicGFjazovLy8uL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3V0aWwvaHlwaGVuYXRlU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3N0eWxlL2dldENvbXB1dGVkU3R5bGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20taGVscGVycy9zdHlsZS9yZW1vdmVTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vaXNUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC91dGlsL2NhcGl0YWxpemUuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9hbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jb21wb25lbnRPckVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2RlcHJlY2F0ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi93YXJuaW5nL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy91c3IvbG9jYWwvbGliL34vYmVlLXRvb2xzL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9lbGVtZW50VHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIvaXNSZXF1aXJlZEZvckExMXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL3NwbGl0Q29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jcmVhdGVDaGFpbmVkRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2tleUNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2NvbnRhaW5zLmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9hZGRFdmVudExpc3RlbmVyLmpzIiwid2VicGFjazovLy8uL34vYWRkLWRvbS1ldmVudC1saXN0ZW5lci9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9hZGQtZG9tLWV2ZW50LWxpc3RlbmVyL2xpYi9FdmVudE9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2FkZC1kb20tZXZlbnQtbGlzdGVuZXIvbGliL0V2ZW50QmFzZU9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi90aW5wZXItYmVlLWNvcmUvbGliL2Nzc0FuaW1hdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbnBlci1iZWUtY29yZS9saWIvRXZlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb21wb25lbnQtY2xhc3Nlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvbXBvbmVudC1pbmRleG9mL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi90b0FycmF5LmpzIiwid2VicGFjazovLy8uL34vdGlucGVyLWJlZS1jb3JlL2xpYi9BbGlnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uL34vZG9tLWFsaWduL2xpYi9wcm9wZXJ0eVV0aWxzLmpzIiwid2VicGFjazovLy8uL34vZG9tLWFsaWduL2xpYi9nZXRPZmZzZXRQYXJlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL2dldFZpc2libGVSZWN0Rm9yRWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvYWRqdXN0Rm9yVmlld3BvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL2dldFJlZ2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1hbGlnbi9saWIvZ2V0RWxGdXR1cmVQb3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9kb20tYWxpZ24vbGliL2dldEFsaWduT2Zmc2V0LmpzIiwid2VicGFjazovLy8uL34vYmVlLXRyYW5zaXRpb24vYnVpbGQvRmFkZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1wYW5lbC9idWlsZC9QYW5lbEdyb3VwLmpzIiwid2VicGFjazovLy8uL34vYmVlLWJ1dHRvbi9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1idXR0b24vYnVpbGQvQnV0dG9uLmpzIiwid2VicGFjazovLy8uL34vYmVlLWZvcm0tZ3JvdXAvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtZm9ybS1ncm91cC9idWlsZC9Gb3JtR3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtZm9ybS1jb250cm9sL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWZvcm0tY29udHJvbC9idWlsZC9Gb3JtQ29udHJvbC5qcyIsIndlYnBhY2s6Ly8vc3JjL2luZGV4LmpzIiwid2VicGFjazovLy9zcmMvSW5wdXRHcm91cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1pbnB1dC1ncm91cC1hZGRvbi9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1pbnB1dC1ncm91cC1hZGRvbi9idWlsZC9JbnB1dEdyb3VwQWRkb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtaW5wdXQtZ3JvdXAtYnV0dG9uL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWlucHV0LWdyb3VwLWJ1dHRvbi9idWlsZC9JbnB1dEdyb3VwQnV0dG9uLmpzIiwid2VicGFjazovLy8uL34vYmVlLWRyb3Bkb3duL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWRyb3Bkb3duL2J1aWxkL0Ryb3Bkb3duLmpzIiwid2VicGFjazovLy8uL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1vdmVybGF5L2J1aWxkL3RyaWdnZXIvVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9+L2RvbS1oZWxwZXJzL3F1ZXJ5L2NvbnRhaW5zLmpzIiwid2VicGFjazovLy8uL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9Qb3B1cC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1hbmltYXRlL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vYmVlLWFuaW1hdGUvYnVpbGQvQW5pbWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1hbmltYXRlL2J1aWxkL0NoaWxkcmVuVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtYW5pbWF0ZS9idWlsZC9BbmltYXRlQ2hpbGQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtYW5pbWF0ZS9idWlsZC91dGlsLmpzIiwid2VicGFjazovLy8uL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9Qb3B1cElubmVyLmpzIiwid2VicGFjazovLy8uL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9MYXp5UmVuZGVyQm94LmpzIiwid2VicGFjazovLy8uL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1kcm9wZG93bi9idWlsZC9wbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbWVudS9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1tZW51L2J1aWxkL01lbnUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbWVudS9idWlsZC91dGlsLmpzIiwid2VicGFjazovLy8uL34vYmVlLW1lbnUvYnVpbGQvRE9NV3JhcC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1tZW51L2J1aWxkL1N1Yk1lbnUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbWVudS9idWlsZC9TdWJQb3B1cE1lbnUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbWVudS9idWlsZC9NZW51SXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JlZS1tZW51L2J1aWxkL01lbnVJdGVtR3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iZWUtbWVudS9idWlsZC9EaXZpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRpZDogbW9kdWxlSWQsXG4gXHRcdFx0bG9hZGVkOiBmYWxzZVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGZiYjQwZWE0MzUzNDExOWMxNzRhIiwiXG5pbXBvcnQgeyBDb24sIFJvdywgQ29sIH0gZnJvbSAnYmVlLWxheW91dCc7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gJ2JlZS1wYW5lbCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ2JlZS1idXR0b24nO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICdiZWUtZm9ybS1ncm91cCc7XG5pbXBvcnQgRm9ybUNvbnRyb2wgZnJvbSAnYmVlLWZvcm0tY29udHJvbCc7XG5pbXBvcnQgSW5wdXRHcm91cCBmcm9tICcuLi9zcmMnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJ2JlZS1kcm9wZG93bic7XG5pbXBvcnQgTWVudSwgeyBJdGVtIGFzIE1lbnVJdGVtLCBEaXZpZGVyLCBTdWJNZW51LCBNZW51SXRlbUdyb3VwIH0gZnJvbSAnYmVlLW1lbnUnO1xuXG5jb25zdCBDQVJFVCA9IDxpIGNsYXNzTmFtZT1cInVmIHVmLWNoZXZyb25hcnJvd2Rvd25cIj48L2k+O1xuXG5jb25zdCBDQVJFVFVQID0gPGkgY2xhc3NOYW1lPVwidWYgdWYtY2hldnJvbmFycm93dXBcIj48L2k+O1xuXG5cbi8qKlxuICogQHRpdGxlIElucHV0R3JvdXAg5Lik6L655piv5Y+v6YCJQWRkb25cbiAqIEBkZXNjcmlwdGlvbiBcbiAqL1xuY2xhc3MgRGVtbzEgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRyZW5kZXIgKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cImRlbW8taW5wdXQtZ3JvdXBcIj5cblx0ICAgICAgICBcdDxGb3JtR3JvdXA+XG5cdCAgICAgICAgXHRcdDxJbnB1dEdyb3VwPlxuXHRcdFx0XHQgXHRcdDxJbnB1dEdyb3VwLkFkZG9uPi4wMDwvSW5wdXRHcm91cC5BZGRvbj5cblx0XHRcdFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgdHlwZT1cInRleHRcIiAvPlxuXHRcdFx0XHQgICAgICAgIDxJbnB1dEdyb3VwLkFkZG9uPi4wMDwvSW5wdXRHcm91cC5BZGRvbj5cblx0XHRcdFx0ICAgIDwvSW5wdXRHcm91cD5cblxuXHRcdFx0XHQgICAgPElucHV0R3JvdXA+XG5cdFx0XHRcdCBcdFx0PElucHV0R3JvdXAuQWRkb24+LjAwPC9JbnB1dEdyb3VwLkFkZG9uPlxuXHRcdFx0XHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVwidGV4dFwiIC8+XG5cdFx0XHRcdCAgICA8L0lucHV0R3JvdXA+XG5cblx0XHRcdFx0ICAgIDxJbnB1dEdyb3VwPlxuXHRcdFx0XHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVwidGV4dFwiIC8+XG5cdFx0XHRcdCAgICAgICAgPElucHV0R3JvdXAuQWRkb24+LjAwPC9JbnB1dEdyb3VwLkFkZG9uPlxuXHRcdFx0XHQgICAgPC9JbnB1dEdyb3VwPlxuXHQgICAgICAgIFx0PC9Gb3JtR3JvdXA+XHRcdFxuXHQgICAgICAgIDwvZGl2PlxuXHRcdClcblx0fVxufS8qKlxuICogQHRpdGxlIElucHV0R3JvdXAg5Lik6L655piv5Y+v6YCJQnV0dG9uXG4gKiBAZGVzY3JpcHRpb24gXG4gKi9cblxuZnVuY3Rpb24gb25TZWxlY3QoeyBrZXkgfSkge1xuXHRjb25zb2xlLmxvZyhgJHtrZXl9IHNlbGVjdGVkYCk7XG5cbn1cblxuZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKHZpc2libGUpIHtcblx0Y29uc29sZS5sb2codmlzaWJsZSk7XG59XG5cbmNvbnN0IG1lbnUxID0gKFxuIDxNZW51XG4gICBtdWx0aXBsZVxuICAgb25TZWxlY3Q9e29uU2VsZWN0fT5cbiAgIDxNZW51SXRlbSBrZXk9XCIxXCI+5YCf5qy+5ZCI5ZCMPC9NZW51SXRlbT5cbiAgIDxNZW51SXRlbSBrZXk9XCIyXCI+5oq1L+i0qOaKvOWQiOWQjDwvTWVudUl0ZW0+XG4gICA8TWVudUl0ZW0ga2V5PVwiM1wiPuaLheS/neWQiOWQjDwvTWVudUl0ZW0+XG4gICA8TWVudUl0ZW0ga2V5PVwiNFwiPuiBlOS/neWQiOWQjDwvTWVudUl0ZW0+XG4gICA8RGl2aWRlciAvPlxuICAgPE1lbnVJdGVtIGtleT1cIjVcIj7lkIjlkIzlrqHmibk8L01lbnVJdGVtPlxuICAgPE1lbnVJdGVtIGtleT1cIjZcIj7mirUv6LSo5oq85ZCI5ZCM6Lef6LiqPC9NZW51SXRlbT5cbiA8L01lbnU+XG4pO1xuY2xhc3MgRGVtbzIgZXh0ZW5kcyBDb21wb25lbnQge1xuXHRyZW5kZXIoKXtcblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdiBjbGFzc05hbWU9XCJkZW1vLWlucHV0LWdyb3VwXCI+XG5cdCAgICAgICAgXHQ8Rm9ybUdyb3VwPlxuXHRcdFx0XHQgICAgPElucHV0R3JvdXA+XG5cdFx0XHRcdCBcdFx0PElucHV0R3JvdXAuQnV0dG9uPlxuXHRcdFx0XHQgXHRcdFx0PEJ1dHRvbj50ZXN0PC9CdXR0b24+XG5cdFx0XHRcdCBcdFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cblx0XHRcdFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgdHlwZT1cInRleHRcIiAvPlxuXHRcdFx0XHQgICAgPC9JbnB1dEdyb3VwPlxuXG5cdFx0XHRcdCAgICA8SW5wdXRHcm91cD5cblx0XHRcdFx0ICAgIFx0PElucHV0R3JvdXAuQnV0dG9uIHNoYXBlPVwiYm9yZGVyXCI+XG5cdFx0XHRcdCBcdFx0XHQ8RHJvcGRvd25cblx0XHRcdCAgICAgICAgICAgICAgICAgICB0cmlnZ2VyPXtbJ2NsaWNrJ119XG5cdFx0XHQgICAgICAgICAgICAgICAgICAgb3ZlcmxheT17bWVudTF9XG5cdFx0XHQgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uPVwic2xpZGUtdXBcIlxuXHRcdFx0ICAgICAgICAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZT17b25WaXNpYmxlQ2hhbmdlfVxuXHRcdFx0ICAgICAgICAgICAgICAgICA+XG5cdFx0XHQgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBzaGFwZT1cImJvcmRlclwiPuW4puacieWIhuWJsue6v+eahOS4i+aLiSA8c3BhbiBjbGFzc05hbWU9XCJ1ZiB1Zi1hcnJvdy1kb3duXCI+IDwvc3Bhbj48L0J1dHRvbj5cblx0XHRcdCAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bj5cblx0XHRcdFx0IFx0XHQ8L0lucHV0R3JvdXAuQnV0dG9uPlxuXHRcdFx0XHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVwidGV4dFwiIC8+XG5cdFx0XHRcdCAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uPlxuXHRcdFx0XHQgXHRcdFx0PEJ1dHRvbj48c3BhbiBjbGFzc05hbWU9XCJ1ZiB1Zi1zZWFyY2hcIj4gPC9zcGFuPjwvQnV0dG9uPlxuXHRcdFx0XHQgXHRcdDwvSW5wdXRHcm91cC5CdXR0b24+XG5cdFx0XHRcdCAgICA8L0lucHV0R3JvdXA+XG5cblx0XHRcdFx0ICAgIDxJbnB1dEdyb3VwIHNpbXBsZT5cblx0XHRcdFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgc3R5bGU9e3t3aWR0aDozMDB9fSB0eXBlPVwidGV4dFwiIC8+XG5cdFx0XHRcdCAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uIHNoYXBlPVwiYm9yZGVyXCI+XG5cdFx0XHRcdCBcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJ1ZiB1Zi1zZWFyY2hcIj4gPC9zcGFuPlxuXHRcdFx0XHQgXHRcdDwvSW5wdXRHcm91cC5CdXR0b24+XG5cdFx0XHRcdCAgICA8L0lucHV0R3JvdXA+XG5cblx0XHRcdFx0ICAgIDxJbnB1dEdyb3VwPlxuXHRcdFx0XHQgICAgXHQ8SW5wdXRHcm91cC5CdXR0b24+XG5cdFx0XHRcdCBcdFx0XHQ8QnV0dG9uPnRlc3Q8L0J1dHRvbj5cblx0XHRcdFx0IFx0XHQ8L0lucHV0R3JvdXAuQnV0dG9uPlxuXHRcdFx0XHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVwidGV4dFwiIC8+XG5cdFx0XHRcdCAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uPlxuXHRcdFx0XHQgXHRcdFx0PEJ1dHRvbj50ZXN0PC9CdXR0b24+XG5cdFx0XHRcdCBcdFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cblx0XHRcdFx0ICAgIDwvSW5wdXRHcm91cD5cblx0ICAgICAgICBcdDwvRm9ybUdyb3VwPlx0XHRcblx0ICAgICAgICA8L2Rpdj5cblx0XHQpXG5cdH1cbn12YXIgRGVtb0FycmF5ID0gW3tcImV4YW1wbGVcIjo8RGVtbzEgLz4sXCJ0aXRsZVwiOlwiIElucHV0R3JvdXAg5Lik6L655piv5Y+v6YCJQWRkXCIsXCJjb2RlXCI6XCIvKipcXG4gKiBAdGl0bGUgSW5wdXRHcm91cCDkuKTovrnmmK/lj6/pgIlBZGRvblxcbiAqIEBkZXNjcmlwdGlvbiBcXG4gKi9cXG5jbGFzcyBEZW1vMSBleHRlbmRzIENvbXBvbmVudCB7XFxuXFx0cmVuZGVyICgpIHtcXG5cXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdDxkaXYgY2xhc3NOYW1lPVxcXCJkZW1vLWlucHV0LWdyb3VwXFxcIj5cXG5cXHQgICAgICAgIFxcdDxGb3JtR3JvdXA+XFxuXFx0ICAgICAgICBcXHRcXHQ8SW5wdXRHcm91cD5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0PElucHV0R3JvdXAuQWRkb24+LjAwPC9JbnB1dEdyb3VwLkFkZG9uPlxcblxcdFxcdFxcdFxcdCAgICAgICAgPEZvcm1Db250cm9sIHR5cGU9XFxcInRleHRcXFwiIC8+XFxuXFx0XFx0XFx0XFx0ICAgICAgICA8SW5wdXRHcm91cC5BZGRvbj4uMDA8L0lucHV0R3JvdXAuQWRkb24+XFxuXFx0XFx0XFx0XFx0ICAgIDwvSW5wdXRHcm91cD5cXG5cXG5cXHRcXHRcXHRcXHQgICAgPElucHV0R3JvdXA+XFxuXFx0XFx0XFx0XFx0IFxcdFxcdDxJbnB1dEdyb3VwLkFkZG9uPi4wMDwvSW5wdXRHcm91cC5BZGRvbj5cXG5cXHRcXHRcXHRcXHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVxcXCJ0ZXh0XFxcIiAvPlxcblxcdFxcdFxcdFxcdCAgICA8L0lucHV0R3JvdXA+XFxuXFxuXFx0XFx0XFx0XFx0ICAgIDxJbnB1dEdyb3VwPlxcblxcdFxcdFxcdFxcdCAgICAgICAgPEZvcm1Db250cm9sIHR5cGU9XFxcInRleHRcXFwiIC8+XFxuXFx0XFx0XFx0XFx0ICAgICAgICA8SW5wdXRHcm91cC5BZGRvbj4uMDA8L0lucHV0R3JvdXAuQWRkb24+XFxuXFx0XFx0XFx0XFx0ICAgIDwvSW5wdXRHcm91cD5cXG5cXHQgICAgICAgIFxcdDwvRm9ybUdyb3VwPlxcdFxcdFxcblxcdCAgICAgICAgPC9kaXY+XFxuXFx0XFx0KVxcblxcdH1cXG59XCIsXCJkZXNjXCI6XCIgXCJ9LHtcImV4YW1wbGVcIjo8RGVtbzIgLz4sXCJ0aXRsZVwiOlwiIElucHV0R3JvdXAg5Lik6L655piv5Y+v6YCJQnV0XCIsXCJjb2RlXCI6XCIvKipcXG4gKiBAdGl0bGUgSW5wdXRHcm91cCDkuKTovrnmmK/lj6/pgIlCdXR0b25cXG4gKiBAZGVzY3JpcHRpb24gXFxuICovXFxuXFxuZnVuY3Rpb24gb25TZWxlY3QoeyBrZXkgfSkge1xcblxcdGNvbnNvbGUubG9nKGAke2tleX0gc2VsZWN0ZWRgKTtcXG5cXG59XFxuXFxuZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKHZpc2libGUpIHtcXG5cXHRjb25zb2xlLmxvZyh2aXNpYmxlKTtcXG59XFxuXFxuY29uc3QgbWVudTEgPSAoXFxuIDxNZW51XFxuICAgbXVsdGlwbGVcXG4gICBvblNlbGVjdD17b25TZWxlY3R9PlxcbiAgIDxNZW51SXRlbSBrZXk9XFxcIjFcXFwiPuWAn+asvuWQiOWQjDwvTWVudUl0ZW0+XFxuICAgPE1lbnVJdGVtIGtleT1cXFwiMlxcXCI+5oq1L+i0qOaKvOWQiOWQjDwvTWVudUl0ZW0+XFxuICAgPE1lbnVJdGVtIGtleT1cXFwiM1xcXCI+5ouF5L+d5ZCI5ZCMPC9NZW51SXRlbT5cXG4gICA8TWVudUl0ZW0ga2V5PVxcXCI0XFxcIj7ogZTkv53lkIjlkIw8L01lbnVJdGVtPlxcbiAgIDxEaXZpZGVyIC8+XFxuICAgPE1lbnVJdGVtIGtleT1cXFwiNVxcXCI+5ZCI5ZCM5a6h5om5PC9NZW51SXRlbT5cXG4gICA8TWVudUl0ZW0ga2V5PVxcXCI2XFxcIj7mirUv6LSo5oq85ZCI5ZCM6Lef6LiqPC9NZW51SXRlbT5cXG4gPC9NZW51Plxcbik7XFxuY2xhc3MgRGVtbzIgZXh0ZW5kcyBDb21wb25lbnQge1xcblxcdHJlbmRlcigpe1xcblxcdFxcdHJldHVybiAoXFxuXFx0XFx0XFx0PGRpdiBjbGFzc05hbWU9XFxcImRlbW8taW5wdXQtZ3JvdXBcXFwiPlxcblxcdCAgICAgICAgXFx0PEZvcm1Hcm91cD5cXG5cXHRcXHRcXHRcXHQgICAgPElucHV0R3JvdXA+XFxuXFx0XFx0XFx0XFx0IFxcdFxcdDxJbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0XFx0PEJ1dHRvbj50ZXN0PC9CdXR0b24+XFxuXFx0XFx0XFx0XFx0IFxcdFxcdDwvSW5wdXRHcm91cC5CdXR0b24+XFxuXFx0XFx0XFx0XFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgdHlwZT1cXFwidGV4dFxcXCIgLz5cXG5cXHRcXHRcXHRcXHQgICAgPC9JbnB1dEdyb3VwPlxcblxcblxcdFxcdFxcdFxcdCAgICA8SW5wdXRHcm91cD5cXG5cXHRcXHRcXHRcXHQgICAgXFx0PElucHV0R3JvdXAuQnV0dG9uIHNoYXBlPVxcXCJib3JkZXJcXFwiPlxcblxcdFxcdFxcdFxcdCBcXHRcXHRcXHQ8RHJvcGRvd25cXG5cXHRcXHRcXHQgICAgICAgICAgICAgICAgICAgdHJpZ2dlcj17WydjbGljayddfVxcblxcdFxcdFxcdCAgICAgICAgICAgICAgICAgICBvdmVybGF5PXttZW51MX1cXG5cXHRcXHRcXHQgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uPVxcXCJzbGlkZS11cFxcXCJcXG5cXHRcXHRcXHQgICAgICAgICAgICAgICAgICAgb25WaXNpYmxlQ2hhbmdlPXtvblZpc2libGVDaGFuZ2V9XFxuXFx0XFx0XFx0ICAgICAgICAgICAgICAgICA+XFxuXFx0XFx0XFx0ICAgICAgICAgICAgICAgICAgIDxCdXR0b24gc2hhcGU9XFxcImJvcmRlclxcXCI+5bim5pyJ5YiG5Ymy57q/55qE5LiL5ouJIDxzcGFuIGNsYXNzTmFtZT1cXFwidWYgdWYtYXJyb3ctZG93blxcXCI+IDwvc3Bhbj48L0J1dHRvbj5cXG5cXHRcXHRcXHQgICAgICAgICAgICAgICAgIDwvRHJvcGRvd24+XFxuXFx0XFx0XFx0XFx0IFxcdFxcdDwvSW5wdXRHcm91cC5CdXR0b24+XFxuXFx0XFx0XFx0XFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgdHlwZT1cXFwidGV4dFxcXCIgLz5cXG5cXHRcXHRcXHRcXHQgICAgICAgIDxJbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0XFx0PEJ1dHRvbj48c3BhbiBjbGFzc05hbWU9XFxcInVmIHVmLXNlYXJjaFxcXCI+IDwvc3Bhbj48L0J1dHRvbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgICAgPC9JbnB1dEdyb3VwPlxcblxcblxcdFxcdFxcdFxcdCAgICA8SW5wdXRHcm91cCBzaW1wbGU+XFxuXFx0XFx0XFx0XFx0ICAgICAgICA8Rm9ybUNvbnRyb2wgc3R5bGU9e3t3aWR0aDozMDB9fSB0eXBlPVxcXCJ0ZXh0XFxcIiAvPlxcblxcdFxcdFxcdFxcdCAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uIHNoYXBlPVxcXCJib3JkZXJcXFwiPlxcblxcdFxcdFxcdFxcdCBcXHRcXHRcXHQ8c3BhbiBjbGFzc05hbWU9XFxcInVmIHVmLXNlYXJjaFxcXCI+IDwvc3Bhbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgICAgPC9JbnB1dEdyb3VwPlxcblxcblxcdFxcdFxcdFxcdCAgICA8SW5wdXRHcm91cD5cXG5cXHRcXHRcXHRcXHQgICAgXFx0PElucHV0R3JvdXAuQnV0dG9uPlxcblxcdFxcdFxcdFxcdCBcXHRcXHRcXHQ8QnV0dG9uPnRlc3Q8L0J1dHRvbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgICAgICAgIDxGb3JtQ29udHJvbCB0eXBlPVxcXCJ0ZXh0XFxcIiAvPlxcblxcdFxcdFxcdFxcdCAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uPlxcblxcdFxcdFxcdFxcdCBcXHRcXHRcXHQ8QnV0dG9uPnRlc3Q8L0J1dHRvbj5cXG5cXHRcXHRcXHRcXHQgXFx0XFx0PC9JbnB1dEdyb3VwLkJ1dHRvbj5cXG5cXHRcXHRcXHRcXHQgICAgPC9JbnB1dEdyb3VwPlxcblxcdCAgICAgICAgXFx0PC9Gb3JtR3JvdXA+XFx0XFx0XFxuXFx0ICAgICAgICA8L2Rpdj5cXG5cXHRcXHQpXFxuXFx0fVxcbn1cIixcImRlc2NcIjpcIiBcIn1dXG5cblxuY2xhc3MgRGVtbyBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGhhbmRsZUNsaWNrKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbjogIXRoaXMuc3RhdGUub3BlbiB9KVxuICAgIH1cblxuICAgIHJlbmRlciAoKSB7XG4gICAgICAgIGNvbnN0IHsgdGl0bGUsIGV4YW1wbGUsIGNvZGUsIGRlc2MgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgY2FyZXQgPSB0aGlzLnN0YXRlLm9wZW4gPyBDQVJFVFVQIDogQ0FSRVQ7XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5zdGF0ZS5vcGVuID8gXCLpmpDol4/ku6PnoIFcIiA6IFwi5p+l55yL5Luj56CBXCI7XG5cbiAgICAgICAgY29uc3QgZm9vdGVyID0gKFxuICAgICAgICAgICAgPEJ1dHRvbiBzaGFwZT1cImJsb2NrXCIgb25DbGljaz17IHRoaXMuaGFuZGxlQ2xpY2sgfT5cbiAgICAgICAgICAgICAgICB7IGNhcmV0IH1cbiAgICAgICAgICAgICAgICB7IHRleHQgfVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Q29sIG1kPXsxMn0+XG4gICAgICAgICAgICAgICAgPGgzPnsgdGl0bGUgfTwvaDM+XG4gICAgICAgICAgICAgICAgPHA+eyBkZXNjIH08L3A+XG4gICAgICAgICAgICAgICAgPFBhbmVsIGNvbGxhcHNpYmxlIGV4cGFuZGVkPXsgdGhpcy5zdGF0ZS5vcGVuIH0gY29sb3JzPSdib3JkZXJlZCcgaGVhZGVyPXsgZXhhbXBsZSB9IGZvb3Rlcj17Zm9vdGVyfSBmb290ZXJTdHlsZSA9IHt7cGFkZGluZzogMCxib3JkZXJDb2xvcjogXCJ0cmFuc3BhcmVudFwifX0gPlxuICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIGNsYXNzTmFtZT1cImhsanMgamF2YXNjcmlwdFwiPnsgY29kZSB9PC9jb2RlPjwvcHJlPlxuICAgICAgICAgICAgICAgIDwvUGFuZWw+XG4gICAgICAgICAgICA8L0NvbD5cbiAgICAgICAgKVxuICAgIH1cbn1cblxuY2xhc3MgRGVtb0dyb3VwIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgIH1cbiAgICByZW5kZXIgKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxSb3c+XG4gICAgICAgICAgICAgICAgICAgIHtEZW1vQXJyYXkubWFwKChjaGlsZCxpbmRleCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEZW1vIGV4YW1wbGU9IHtjaGlsZC5leGFtcGxlfSB0aXRsZT0ge2NoaWxkLnRpdGxlfSBjb2RlPSB7Y2hpbGQuY29kZX0gZGVzYz0ge2NoaWxkLmRlc2N9IGtleT0ge2luZGV4fS8+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9Sb3c+XG4gICAgICAgIClcbiAgICB9XG59XG5cblJlYWN0RE9NLnJlbmRlcig8RGVtb0dyb3VwLz4sIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW5wZXJCZWVEZW1vJykpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGRlbW8vaW5kZXguanMiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkNvbiA9IGV4cG9ydHMuUm93ID0gZXhwb3J0cy5Db2wgPSB1bmRlZmluZWQ7XG5cbnZhciBfQ29sMiA9IHJlcXVpcmUoJy4vQ29sJyk7XG5cbnZhciBfQ29sMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbDIpO1xuXG52YXIgX1JvdzIgPSByZXF1aXJlKCcuL1JvdycpO1xuXG52YXIgX1JvdzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Sb3cyKTtcblxudmFyIF9MYXlvdXQgPSByZXF1aXJlKCcuL0xheW91dCcpO1xuXG52YXIgX0xheW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9MYXlvdXQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0cy5Db2wgPSBfQ29sM1tcImRlZmF1bHRcIl07XG5leHBvcnRzLlJvdyA9IF9Sb3czW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuQ29uID0gX0xheW91dDJbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbGF5b3V0L2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmVsZW1lbnQsIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogeHPmmL7npLrliJfmlbBcbiAgICovXG4gIHhzOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHNt5pi+56S65YiX5pWwXG4gICAqL1xuICBzbTogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBtZOaYvuekuuWIl+aVsFxuICAgKi9cbiAgbWQ6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbGfmmL7npLrliJfmlbBcbiAgICovXG4gIGxnOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHhz5YGP56e75YiX5pWwXG4gICAqL1xuICB4c09mZnNldDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBzbeWBj+enu+WIl+aVsFxuICAgKi9cbiAgc21PZmZzZXQ6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbWTlgY/np7vliJfmlbBcbiAgICovXG4gIG1kT2Zmc2V0OiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIGxn5YGP56e75YiX5pWwXG4gICAqL1xuICBsZ09mZnNldDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiB4c+WPs+WBj+enu+WIl+aVsFxuICAgKi9cbiAgeHNQdXNoOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHNt5Y+z5YGP56e75YiX5pWwXG4gICAqL1xuICBzbVB1c2g6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogbWTlj7PlgY/np7vliJfmlbBcbiAgICovXG4gIG1kUHVzaDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBsZ+WPs+WBj+enu+WIl+aVsFxuICAgKi9cbiAgbGdQdXNoOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIHhz5bem5YGP56e75YiX5pWwXG4gICAqL1xuICB4c1B1bGw6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogc23lt6blgY/np7vliJfmlbBcbiAgICovXG4gIHNtUHVsbDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBtZOW3puWBj+enu+WIl+aVsFxuICAgKi9cbiAgbWRQdWxsOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIGxn5bem5YGP56e75YiX5pWwXG4gICAqL1xuICBsZ1B1bGw6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBjbHNQcmVmaXggPSAndS1jb2wnO1xuXG52YXIgREVWSUNFX1NJWkVTID0gWydsZycsICdtZCcsICdzbScsICd4cyddO1xuXG52YXIgQ29sID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKENvbCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29sKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2wpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBDb2wucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciB0YkNsYXNzID0gW107XG4gICAgLyoqXG4gICAgICog5a+55Lyg5YWlcHJvcHPlgZrmoLflvI/ovazljJZcbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIERFVklDRV9TSVpFUy5mb3JFYWNoKGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICBmdW5jdGlvbiBwb3BQcm9wKHByb3BTdWZmaXgsIG1vZGlmaWVyKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9ICcnICsgc2l6ZSArIHByb3BTdWZmaXg7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBvdGhlcnNbcHJvcE5hbWVdO1xuXG4gICAgICAgIGlmIChwcm9wVmFsdWUgIT0gdW5kZWZpbmVkICYmIHByb3BWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGJDbGFzcy5wdXNoKGNsc1ByZWZpeCArICctJyArIHNpemUgKyBtb2RpZmllciArICctJyArIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgb3RoZXJzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgcG9wUHJvcCgnJywgJycpO1xuICAgICAgcG9wUHJvcCgnT2Zmc2V0JywgJy1vZmZzZXQnKTtcbiAgICAgIHBvcFByb3AoJ1B1c2gnLCAnLXB1c2gnKTtcbiAgICAgIHBvcFByb3AoJ1B1bGwnLCAnLXB1bGwnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgX2V4dGVuZHMoe1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKSh0YkNsYXNzLCBjbGFzc05hbWUpXG4gICAgICB9LCBvdGhlcnMpLFxuICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIENvbDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbkNvbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Db2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbGF5b3V0L2J1aWxkL0NvbC5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE2IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcyAoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZykpO1xuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jbGFzc25hbWVzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gUmVhY3Q7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJSZWFjdFwiXG4vLyBtb2R1bGUgaWQgPSA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmVsZW1lbnQsIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmddKVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgY2xzUHJlZml4ID0gJ3Utcm93JztcblxudmFyIFJvdyA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb3csIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvdygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm93KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUm93LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgYnNjbGFzcyA9ICcnICsgY2xzUHJlZml4O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICBfZXh0ZW5kcyh7fSwgb3RoZXJzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGJzY2xhc3MsIGNsYXNzTmFtZSlcbiAgICAgIH0pLFxuICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFJvdztcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cblJvdy5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Sb3cuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFJvdztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbGF5b3V0L2J1aWxkL1Jvdy5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcclxuICAgKiBBZGRzIGBjb250YWluZXItZmx1aWRgIGNsYXNzLlxyXG4gICAqL1xuICBmbHVpZDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICAvKipcclxuICAgKiBZb3UgY2FuIHVzZSBhIGN1c3RvbSBlbGVtZW50IGZvciB0aGlzIGNvbXBvbmVudFxyXG4gICAqL1xuICBjb21wb25lbnRDbGFzczogX3JlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5lbGVtZW50LCBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuc3RyaW5nXSlcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2JyxcbiAgZmx1aWQ6IGZhbHNlXG59O1xuXG52YXIgY2xzUHJlZml4ID0gJ3UtY29udGFpbmVyJztcblxudmFyIENvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ29uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90YmNsYXNzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGZsdWlkID0gX3Byb3BzLmZsdWlkLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnZmx1aWQnLCAnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIHRiY2xhc3MgPSAoX3RiY2xhc3MgPSB7fSwgX2RlZmluZVByb3BlcnR5KF90YmNsYXNzLCAnJyArIGNsc1ByZWZpeCwgIWZsdWlkKSwgX2RlZmluZVByb3BlcnR5KF90YmNsYXNzLCBjbHNQcmVmaXggKyAnLWZsdWlkJywgZmx1aWQpLCBfdGJjbGFzcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkodGJjbGFzcywgY2xhc3NOYW1lKVxuICAgICAgfSksXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQ29uO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5Db24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ29uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWxheW91dC9idWlsZC9MYXlvdXQuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QYW5lbEdyb3VwID0gZXhwb3J0cy5QYW5lbCA9IHVuZGVmaW5lZDtcblxudmFyIF9QYW5lbDIgPSByZXF1aXJlKCcuL1BhbmVsJyk7XG5cbnZhciBfUGFuZWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwyKTtcblxudmFyIF9QYW5lbEdyb3VwMiA9IHJlcXVpcmUoJy4vUGFuZWxHcm91cCcpO1xuXG52YXIgX1BhbmVsR3JvdXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWxHcm91cDIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0cy5QYW5lbCA9IF9QYW5lbDNbXCJkZWZhdWx0XCJdO1xuZXhwb3J0cy5QYW5lbEdyb3VwID0gX1BhbmVsR3JvdXAzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXBhbmVsL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9iZWVUcmFuc2l0aW9uID0gcmVxdWlyZSgnYmVlLXRyYW5zaXRpb24nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8v5piv5ZCm5re75Yqg5oqY5Y+gXG4gIGNvbGxhcHNpYmxlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuYm9vbCxcbiAgb25TZWxlY3Q6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvL+WktOmDqOe7hOS7tlxuICBoZWFkZXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ub2RlLFxuICBoZWFkZXJTdHlsZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm9iamVjdCxcbiAgaWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcsIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5udW1iZXJdKSxcbiAgaGVhZGVyQ29udGVudDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG4gIC8vZm9vdGVy57uE5Lu2XG4gIGZvb3RlcjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm5vZGUsXG4gIGZvb3RlclN0eWxlOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub2JqZWN0LFxuICAvL+m7mOiupOaYr+WQpuaJk+W8gFxuICBkZWZhdWx0RXhwYW5kZWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuICAvL+aYr+WQpuaJk+W8gFxuICBleHBhbmRlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG4gIC8v5q+P5LiqcGFuZWznmoTmoIforrBcbiAgZXZlbnRLZXk6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5hbnksXG4gIGhlYWRlclJvbGU6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5zdHJpbmcsXG4gIHBhbmVsUm9sZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZyxcbiAgLy/popzoibJcbiAgY29sb3JzOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub25lT2YoWydwcmltYXJ5JywgJ2FjY2VudCcsICdzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdkYW5nZXInLCAnZGVmYXVsdCcsICdib3JkZXJlZCddKSxcblxuICAvLyBGcm9tIENvbGxhcHNlLueahOaJqeWxleWKqOeUu1xuICBvbkVudGVyOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgb25FbnRlcmluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW50ZXJlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdGluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXhpdGVkOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdEV4cGFuZGVkOiBmYWxzZSxcbiAgY2xzUHJlZml4OiBcInUtcGFuZWxcIixcbiAgY29sb3JzOiBcImRlZmF1bHRcIlxufTtcblxudmFyIFBhbmVsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBhbmVsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5lbChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYW5lbCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrVGl0bGUgPSBfdGhpcy5oYW5kbGVDbGlja1RpdGxlLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogX3RoaXMucHJvcHMuZGVmYXVsdEV4cGFuZGVkXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvL+WktOmDqOeCueWHu+S6i+S7tlxuXG5cbiAgUGFuZWwucHJvdG90eXBlLmhhbmRsZUNsaWNrVGl0bGUgPSBmdW5jdGlvbiBoYW5kbGVDbGlja1RpdGxlKGUpIHtcbiAgICAvLyDkuI3orqnkuovku7bov5vlhaXkuovku7bmsaBcbiAgICBlLnBlcnNpc3QoKTtcbiAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRoaXMucHJvcHMuZXZlbnRLZXksIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGUuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBleHBhbmRlZDogIXRoaXMuc3RhdGUuZXhwYW5kZWQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8v5riy5p+TcGFuZWxoZWFkZXJcblxuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoY29sbGFwc2libGUsIGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkLCBjbHNQcmVmaXgpIHtcbiAgICB2YXIgdGl0bGVDbGFzc05hbWUgPSBjbHNQcmVmaXggKyAnLXRpdGxlJztcblxuICAgIGlmICghY29sbGFwc2libGUpIHtcbiAgICAgIGlmICghX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdoNCcsXG4gICAgICAgIHsgcm9sZTogJ3ByZXNlbnRhdGlvbicsIGNsYXNzTmFtZTogdGl0bGVDbGFzc05hbWUgfSxcbiAgICAgICAgdGhpcy5yZW5kZXJBbmNob3IoaGVhZGVyLCBpZCwgcm9sZSwgZXhwYW5kZWQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5oZWFkZXJDb250ZW50KSB7XG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoaGVhZGVyLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShoZWFkZXIucHJvcHMuY2xhc3NOYW1lLCB0aXRsZUNsYXNzTmFtZSksXG4gICAgICBjaGlsZHJlbjogdGhpcy5yZW5kZXJBbmNob3IoaGVhZGVyLnByb3BzLmNoaWxkcmVuLCBpZCwgcm9sZSwgZXhwYW5kZWQpXG4gICAgfSk7XG4gIH07XG5cbiAgLy/lpoLmnpzkvb/nlKjpk77mjqXvvIzmuLLmn5PkuLph5qCH562+XG5cblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQW5jaG9yID0gZnVuY3Rpb24gcmVuZGVyQW5jaG9yKGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnYScsXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgIGhyZWY6IGlkICYmICcjJyArIGlkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrVGl0bGUsXG4gICAgICAgICdhcmlhLWNvbnRyb2xzJzogaWQsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogZXhwYW5kZWQsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogZXhwYW5kZWQsXG4gICAgICAgIGNsYXNzTmFtZTogZXhwYW5kZWQgPyBudWxsIDogJ2NvbGxhcHNlZCdcbiAgICAgIH0sXG4gICAgICBoZWFkZXJcbiAgICApO1xuICB9O1xuXG4gIC8v5aaC5p6c5pyJ5oqY5Y+g5Yqo55S777yM5riy5p+T5oqY5Y+g5Yqo55S7XG5cblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQ29sbGFwc2libGVCb2R5ID0gZnVuY3Rpb24gcmVuZGVyQ29sbGFwc2libGVCb2R5KGlkLCBleHBhbmRlZCwgcm9sZSwgY2hpbGRyZW4sIGNsc1ByZWZpeCwgYW5pbWF0aW9uSG9va3MpIHtcbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgIF9iZWVUcmFuc2l0aW9uLkNvbGxhcHNlLFxuICAgICAgX2V4dGVuZHMoeyAnaW4nOiBleHBhbmRlZCB9LCBhbmltYXRpb25Ib29rcyksXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICByb2xlOiByb2xlLFxuICAgICAgICAgIGNsYXNzTmFtZTogY2xzUHJlZml4ICsgJy1jb2xsYXBzZScsXG4gICAgICAgICAgJ2FyaWEtaGlkZGVuJzogIWV4cGFuZGVkXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMucmVuZGVyQm9keShjaGlsZHJlbiwgY2xzUHJlZml4KVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgLy/muLLmn5NwYW5lbGJvZHlcblxuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJCb2R5ID0gZnVuY3Rpb24gcmVuZGVyQm9keShyYXdDaGlsZHJlbiwgY2xzUHJlZml4KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgdmFyIGJvZHlDaGlsZHJlbiA9IFtdO1xuXG4gICAgdmFyIGJvZHlDbGFzc05hbWUgPSBjbHNQcmVmaXggKyAnLWJvZHknO1xuXG4gICAgLy/mt7vliqDliLBib2R555qEY2hpbGRyZW7kuK1cbiAgICBmdW5jdGlvbiBtYXliZUFkZEJvZHkoKSB7XG4gICAgICBpZiAoIWJvZHlDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDnu5nlrZDnu4Tku7bmt7vliqBrZXnvvIzkuLrkuobkuYvlkI7op6blj5Hkuovku7bml7bkvb/nlKhcbiAgICAgIGNoaWxkcmVuLnB1c2goX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsga2V5OiBjaGlsZHJlbi5sZW5ndGgsIGNsYXNzTmFtZTogYm9keUNsYXNzTmFtZSB9LFxuICAgICAgICBib2R5Q2hpbGRyZW5cbiAgICAgICkpO1xuXG4gICAgICBib2R5Q2hpbGRyZW4gPSBbXTtcbiAgICB9XG5cbiAgICAvL+i9rOaNouS4uuaVsOe7hO+8jOaWueS+v+WkjeeUqFxuICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLnRvQXJyYXkocmF3Q2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnByb3BzLmZpbGwpIHtcbiAgICAgICAgbWF5YmVBZGRCb2R5KCk7XG5cbiAgICAgICAgLy/lsIbmoIfnpLpmaWxs6K6+572u5Li6dW5kZWZpbmVkXG4gICAgICAgIGNoaWxkcmVuLnB1c2goKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7IGZpbGw6IHVuZGVmaW5lZCB9KSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBib2R5Q2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfSk7XG5cbiAgICBtYXliZUFkZEJvZHkoKTtcblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjb2xsYXBzaWJsZSA9IF9wcm9wcy5jb2xsYXBzaWJsZSxcbiAgICAgICAgaGVhZGVyID0gX3Byb3BzLmhlYWRlcixcbiAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgIGZvb3RlciA9IF9wcm9wcy5mb290ZXIsXG4gICAgICAgIHByb3BzRXhwYW5kZWQgPSBfcHJvcHMuZXhwYW5kZWQsXG4gICAgICAgIGZvb3RlclN0eWxlID0gX3Byb3BzLmZvb3RlclN0eWxlLFxuICAgICAgICBoZWFkZXJTdHlsZSA9IF9wcm9wcy5oZWFkZXJTdHlsZSxcbiAgICAgICAgaGVhZGVyUm9sZSA9IF9wcm9wcy5oZWFkZXJSb2xlLFxuICAgICAgICBwYW5lbFJvbGUgPSBfcHJvcHMucGFuZWxSb2xlLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvcnMgPSBfcHJvcHMuY29sb3JzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgb25FbnRlciA9IF9wcm9wcy5vbkVudGVyLFxuICAgICAgICBvbkVudGVyaW5nID0gX3Byb3BzLm9uRW50ZXJpbmcsXG4gICAgICAgIG9uRW50ZXJlZCA9IF9wcm9wcy5vbkVudGVyZWQsXG4gICAgICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXgsXG4gICAgICAgIG9uRXhpdCA9IF9wcm9wcy5vbkV4aXQsXG4gICAgICAgIG9uRXhpdGluZyA9IF9wcm9wcy5vbkV4aXRpbmcsXG4gICAgICAgIG9uRXhpdGVkID0gX3Byb3BzLm9uRXhpdGVkLFxuICAgICAgICBkZWZhdWx0RXhwYW5kZWQgPSBfcHJvcHMuZGVmYXVsdEV4cGFuZGVkLFxuICAgICAgICBldmVudEtleSA9IF9wcm9wcy5ldmVudEtleSxcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydjb2xsYXBzaWJsZScsICdoZWFkZXInLCAnaWQnLCAnZm9vdGVyJywgJ2V4cGFuZGVkJywgJ2Zvb3RlclN0eWxlJywgJ2hlYWRlclN0eWxlJywgJ2hlYWRlclJvbGUnLCAncGFuZWxSb2xlJywgJ2NsYXNzTmFtZScsICdjb2xvcnMnLCAnY2hpbGRyZW4nLCAnb25FbnRlcicsICdvbkVudGVyaW5nJywgJ29uRW50ZXJlZCcsICdjbHNQcmVmaXgnLCAnb25FeGl0JywgJ29uRXhpdGluZycsICdvbkV4aXRlZCcsICdkZWZhdWx0RXhwYW5kZWQnLCAnZXZlbnRLZXknLCAnb25TZWxlY3QnXSk7XG5cbiAgICB2YXIgZXhwYW5kZWQgPSBwcm9wc0V4cGFuZGVkICE9IG51bGwgPyBwcm9wc0V4cGFuZGVkIDogdGhpcy5zdGF0ZS5leHBhbmRlZDtcblxuICAgIHZhciBjbGFzc2VzID0ge307XG4gICAgY2xhc3Nlc1snJyArIGNsc1ByZWZpeF0gPSB0cnVlO1xuICAgIGNsYXNzZXNbY2xzUHJlZml4ICsgJy0nICsgY29sb3JzXSA9IHRydWU7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIGlkOiBjb2xsYXBzaWJsZSA/IG51bGwgOiBpZFxuICAgICAgfSksXG4gICAgICBoZWFkZXIgJiYgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBjbHNQcmVmaXggKyAnLWhlYWRpbmcnLCBzdHlsZTogaGVhZGVyU3R5bGUgfSxcbiAgICAgICAgdGhpcy5yZW5kZXJIZWFkZXIoY29sbGFwc2libGUsIGhlYWRlciwgaWQsIGhlYWRlclJvbGUsIGV4cGFuZGVkLCBjbHNQcmVmaXgpXG4gICAgICApLFxuICAgICAgY29sbGFwc2libGUgPyB0aGlzLnJlbmRlckNvbGxhcHNpYmxlQm9keShpZCwgZXhwYW5kZWQsIHBhbmVsUm9sZSwgY2hpbGRyZW4sIGNsc1ByZWZpeCwgeyBvbkVudGVyOiBvbkVudGVyLCBvbkVudGVyaW5nOiBvbkVudGVyaW5nLCBvbkVudGVyZWQ6IG9uRW50ZXJlZCwgb25FeGl0OiBvbkV4aXQsIG9uRXhpdGluZzogb25FeGl0aW5nLCBvbkV4aXRlZDogb25FeGl0ZWQgfSkgOiB0aGlzLnJlbmRlckJvZHkoY2hpbGRyZW4sIGNsc1ByZWZpeCksXG4gICAgICBmb290ZXIgJiYgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBjbHNQcmVmaXggKyAnLWZvb3RlcicsIHN0eWxlOiBmb290ZXJTdHlsZSB9LFxuICAgICAgICBmb290ZXJcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYW5lbDtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuUGFuZWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFuZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFBhbmVsO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1wYW5lbC9idWlsZC9QYW5lbC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkZhZGUgPSBleHBvcnRzLkNvbGxhcHNlID0gZXhwb3J0cy5UcmFuc2l0aW9uID0gdW5kZWZpbmVkO1xuXG52YXIgX1RyYW5zaXRpb24yID0gcmVxdWlyZSgnLi9UcmFuc2l0aW9uJyk7XG5cbnZhciBfVHJhbnNpdGlvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UcmFuc2l0aW9uMik7XG5cbnZhciBfQ29sbGFwc2UyID0gcmVxdWlyZSgnLi9Db2xsYXBzZScpO1xuXG52YXIgX0NvbGxhcHNlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbGxhcHNlMik7XG5cbnZhciBfRmFkZTIgPSByZXF1aXJlKCcuL0ZhZGUnKTtcblxudmFyIF9GYWRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZhZGUyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmV4cG9ydHMuVHJhbnNpdGlvbiA9IF9UcmFuc2l0aW9uM1tcImRlZmF1bHRcIl07XG5leHBvcnRzLkNvbGxhcHNlID0gX0NvbGxhcHNlM1tcImRlZmF1bHRcIl07XG5leHBvcnRzLkZhZGUgPSBfRmFkZTNbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtdHJhbnNpdGlvbi9idWlsZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkVYSVRJTkcgPSBleHBvcnRzLkVOVEVSRUQgPSBleHBvcnRzLkVOVEVSSU5HID0gZXhwb3J0cy5FWElURUQgPSBleHBvcnRzLlVOTU9VTlRFRCA9IHVuZGVmaW5lZDtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX3Byb3BlcnRpZXMgPSByZXF1aXJlKCdkb20taGVscGVycy90cmFuc2l0aW9uL3Byb3BlcnRpZXMnKTtcblxudmFyIF9wcm9wZXJ0aWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BlcnRpZXMpO1xuXG52YXIgX29uID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvZXZlbnRzL29uJyk7XG5cbnZhciBfb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb24pO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSBfcHJvcGVydGllczJbXCJkZWZhdWx0XCJdLmVuZDtcblxuLy/orr7nva7nirbmgIHnoIFcbnZhciBVTk1PVU5URUQgPSBleHBvcnRzLlVOTU9VTlRFRCA9IDA7XG52YXIgRVhJVEVEID0gZXhwb3J0cy5FWElURUQgPSAxO1xudmFyIEVOVEVSSU5HID0gZXhwb3J0cy5FTlRFUklORyA9IDI7XG52YXIgRU5URVJFRCA9IGV4cG9ydHMuRU5URVJFRCA9IDM7XG52YXIgRVhJVElORyA9IGV4cG9ydHMuRVhJVElORyA9IDQ7XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiDmmK/lkKbop6blj5HliqjnlLtcbiAgICovXG4gIFwiaW5cIjogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiDkuI3mmL7npLrnmoTml7blgJnmmK/lkKbnp7vpmaTnu4Tku7ZcbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICog5aaC5p6c6K6+572u5Li66buY6K6k5pi+56S677yM5oyC6L295pe25pi+56S65Yqo55S7XG4gICAqL1xuICB0cmFuc2l0aW9uQXBwZWFyOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIOiuvue9rui2heaXtuaXtumXtO+8jOmYsuatouWHuueOsOmXrumimO+8jOWPr+iuvue9ruS4uj495Yqo55S75pe26Ze0XG4gICAqL1xuICB0aW1lb3V0OiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICog6YCA5Ye657uE5Lu25pe25re75Yqg55qEY2xhc3NcbiAgICovXG4gIGV4aXRlZENsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDpgIDlh7rnu4Tku7bkuK3mt7vliqDnmoRjbGFzc1xuICAgKi9cbiAgZXhpdGluZ0NsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDov5vlhaXliqjnlLvlkI7mt7vliqDnmoRjbGFzc1xuICAgKi9cbiAgZW50ZXJlZENsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDov5vlhaXliqjnlLvml7bmt7vliqDnmoRjbGFzc1xuICAgKi9cbiAgZW50ZXJpbmdDbGFzc05hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiDov5vlhaXliqjnlLvlvIDlp4vml7bnmoTpkqnlrZDlh73mlbBcbiAgICovXG4gIG9uRW50ZXI6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOi/m+WFpeWKqOeUu+S4reeahOmSqeWtkOWHveaVsFxuICAgKi9cbiAgb25FbnRlcmluZzogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6L+b5YWl5Yqo55S75ZCO55qE6ZKp5a2Q5Ye95pWwXG4gICAqL1xuICBvbkVudGVyZWQ6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOmAgOWHuuWKqOeUu+W8gOWni+aXtueahOmSqeWtkOWHveaVsFxuICAgKi9cbiAgb25FeGl0OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDpgIDlh7rliqjnlLvkuK3nmoTpkqnlrZDlh73mlbBcbiAgICovXG4gIG9uRXhpdGluZzogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6YCA5Ye65Yqo55S75ZCO55qE6ZKp5a2Q5Ye95pWwXG4gICAqL1xuICBvbkV4aXRlZDogX3JlYWN0LlByb3BUeXBlcy5mdW5jXG59O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgXCJpblwiOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2UsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLFxuICB0aW1lb3V0OiA1MDAwLFxuICBvbkVudGVyOiBub29wLFxuICBvbkVudGVyaW5nOiBub29wLFxuICBvbkVudGVyZWQ6IG5vb3AsXG4gIG9uRXhpdDogbm9vcCxcbiAgb25FeGl0aW5nOiBub29wLFxuICBvbkV4aXRlZDogbm9vcFxufTtcblxuLyoqXG4gKiDliqjnlLvnu4Tku7ZcbiAqL1xuXG52YXIgVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhUcmFuc2l0aW9uLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zaXRpb24pO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICB2YXIgaW5pdGlhbFN0YXR1cyA9IHZvaWQgMDtcbiAgICBpZiAocHJvcHNbXCJpblwiXSkge1xuICAgICAgLy8g5ZyoY29tcG9uZW50ZGlkbW91bnTml7blvIDlp4vmiafooYzliqjnlLtcbiAgICAgIGluaXRpYWxTdGF0dXMgPSBwcm9wcy50cmFuc2l0aW9uQXBwZWFyID8gRVhJVEVEIDogRU5URVJFRDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdGlhbFN0YXR1cyA9IHByb3BzLnVubW91bnRPbkV4aXQgPyBVTk1PVU5URUQgOiBFWElURUQ7XG4gICAgfVxuICAgIF90aGlzLnN0YXRlID0geyBzdGF0dXM6IGluaXRpYWxTdGF0dXMgfTtcblxuICAgIF90aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy50cmFuc2l0aW9uQXBwZWFyICYmIHRoaXMucHJvcHNbXCJpblwiXSkge1xuICAgICAgdGhpcy5wZXJmb3JtRW50ZXIodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHNbXCJpblwiXSAmJiB0aGlzLnByb3BzLnVubW91bnRPbkV4aXQpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnN0YXR1cyA9PT0gVU5NT1VOVEVEKSB7XG4gICAgICAgIC8vIOWcqGNvbXBvbmVudERpZFVwZGF0ZeaJp+ihjOWKqOeUuy5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN0YXR1czogRVhJVEVEIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB2YXIgc3RhdHVzID0gdGhpcy5zdGF0ZS5zdGF0dXM7XG5cbiAgICBpZiAodGhpcy5wcm9wcy51bm1vdW50T25FeGl0ICYmIHN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICAvLyDlvZPkvb/nlKh1bm1vdW50T25FeGl05pe277yMZXhpdGVk5Li6ZXhpdGluZ+WSjHVubW9udOeahOi/h+a4oeeKtuaAgVxuICAgICAgaWYgKHRoaXMucHJvcHNbXCJpblwiXSkge1xuICAgICAgICB0aGlzLnBlcmZvcm1FbnRlcih0aGlzLnByb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdGF0dXM6IFVOTU9VTlRFRCB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOehruS/neWPquWTjeW6lHByb3Dlj5jljJZcbiAgICBpZiAodGhpcy5fbmVlZHNVcGRhdGUpIHtcbiAgICAgIHRoaXMuX25lZWRzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLnByb3BzW1wiaW5cIl0pIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gRVhJVElORykge1xuICAgICAgICAgIHRoaXMucGVyZm9ybUVudGVyKHRoaXMucHJvcHMpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICAgICAgdGhpcy5wZXJmb3JtRW50ZXIodGhpcy5wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YW25LuW77yM5b2T5oiR5Lus5bey57uP6L6T5YWl5oiW6L6T5Ye6XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBFTlRFUklORyB8fCBzdGF0dXMgPT09IEVOVEVSRUQpIHtcbiAgICAgICAgICB0aGlzLnBlcmZvcm1FeGl0KHRoaXMucHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOaIkeS7rOW3sue7j+i+k+WFpeaIlui+k+WHuuWujOaIkFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUucGVyZm9ybUVudGVyID0gZnVuY3Rpb24gcGVyZm9ybUVudGVyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLmNhbmNlbE5leHRDYWxsYmFjaygpO1xuICAgIHZhciBub2RlID0gX3JlYWN0RG9tMltcImRlZmF1bHRcIl0uZmluZERPTU5vZGUodGhpcyk7XG5cbiAgICAvLyDov5nph4zmjqXmlLbmlrBwcm9wc1xuICAgIHByb3BzLm9uRW50ZXIobm9kZSk7XG5cbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7IHN0YXR1czogRU5URVJJTkcgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJpbmcobm9kZSk7XG5cbiAgICAgIF90aGlzMi5vblRyYW5zaXRpb25FbmQobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFTlRFUkVEIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucHJvcHMub25FbnRlcmVkKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLnBlcmZvcm1FeGl0ID0gZnVuY3Rpb24gcGVyZm9ybUV4aXQocHJvcHMpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG4gICAgdmFyIG5vZGUgPSBfcmVhY3REb20yW1wiZGVmYXVsdFwiXS5maW5kRE9NTm9kZSh0aGlzKTtcblxuICAgIHByb3BzLm9uRXhpdChub2RlKTtcblxuICAgIHRoaXMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFWElUSU5HIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRpbmcobm9kZSk7XG5cbiAgICAgIF90aGlzMy5vblRyYW5zaXRpb25FbmQobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFWElURUQgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRlZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5jYW5jZWxOZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiBjYW5jZWxOZXh0Q2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMubmV4dENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm5leHRDYWxsYmFjay5jYW5jZWwoKTtcbiAgICAgIHRoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgVHJhbnNpdGlvbi5wcm90b3R5cGUuc2FmZVNldFN0YXRlID0gZnVuY3Rpb24gc2FmZVNldFN0YXRlKG5leHRTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAvLyDnoa7kv53lnKjnu4Tku7bplIDmr4HlkI7mjILotbfnmoRzZXRTdGF0Zeiiq+a2iOmZpFxuICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCB0aGlzLnNldE5leHRDYWxsYmFjayhjYWxsYmFjaykpO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLnNldE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIHNldE5leHRDYWxsYmFjayhjYWxsYmFjaykge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIGFjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLm5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgX3RoaXM0Lm5leHRDYWxsYmFjayA9IG51bGw7XG5cbiAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm5leHRDYWxsYmFjay5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubmV4dENhbGxiYWNrO1xuICB9O1xuXG4gIFRyYW5zaXRpb24ucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZChub2RlLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5zZXROZXh0Q2FsbGJhY2soaGFuZGxlcik7XG5cbiAgICBpZiAobm9kZSkge1xuICAgICAgKDAsIF9vbjJbXCJkZWZhdWx0XCJdKShub2RlLCB0cmFuc2l0aW9uRW5kRXZlbnQsIHRoaXMubmV4dENhbGxiYWNrKTtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIHRoaXMucHJvcHMudGltZW91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIDApO1xuICAgIH1cbiAgfTtcblxuICBUcmFuc2l0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdGUuc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgdmFyIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NoaWxkcmVuJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIE9iamVjdC5rZXlzKFRyYW5zaXRpb24ucHJvcFR5cGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBkZWxldGUgY2hpbGRQcm9wc1trZXldO1xuICAgIH0pO1xuXG4gICAgdmFyIHRyYW5zaXRpb25DbGFzc05hbWUgPSB2b2lkIDA7XG4gICAgaWYgKHN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5leGl0ZWRDbGFzc05hbWU7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IEVOVEVSSU5HKSB7XG4gICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5lbnRlcmluZ0NsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZW50ZXJlZENsYXNzTmFtZTtcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRVhJVElORykge1xuICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZXhpdGluZ0NsYXNzTmFtZTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkLCBfZXh0ZW5kcyh7fSwgY2hpbGRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2hpbGQucHJvcHMuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHRyYW5zaXRpb25DbGFzc05hbWUpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFRyYW5zaXRpb247XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL1RyYW5zaXRpb24uanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJSZWFjdERPTVwiXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmFuaW1hdGlvbkVuZCA9IGV4cG9ydHMuYW5pbWF0aW9uRGVsYXkgPSBleHBvcnRzLmFuaW1hdGlvblRpbWluZyA9IGV4cG9ydHMuYW5pbWF0aW9uRHVyYXRpb24gPSBleHBvcnRzLmFuaW1hdGlvbk5hbWUgPSBleHBvcnRzLnRyYW5zaXRpb25FbmQgPSBleHBvcnRzLnRyYW5zaXRpb25EdXJhdGlvbiA9IGV4cG9ydHMudHJhbnNpdGlvbkRlbGF5ID0gZXhwb3J0cy50cmFuc2l0aW9uVGltaW5nID0gZXhwb3J0cy50cmFuc2l0aW9uUHJvcGVydHkgPSBleHBvcnRzLnRyYW5zZm9ybSA9IHVuZGVmaW5lZDtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4uL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciB0cmFuc2Zvcm0gPSAndHJhbnNmb3JtJztcbnZhciBwcmVmaXggPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvbkVuZCA9IHZvaWQgMCxcbiAgICBhbmltYXRpb25FbmQgPSB2b2lkIDA7XG52YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gdm9pZCAwLFxuICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IHZvaWQgMCxcbiAgICB0cmFuc2l0aW9uVGltaW5nID0gdm9pZCAwLFxuICAgIHRyYW5zaXRpb25EZWxheSA9IHZvaWQgMDtcbnZhciBhbmltYXRpb25OYW1lID0gdm9pZCAwLFxuICAgIGFuaW1hdGlvbkR1cmF0aW9uID0gdm9pZCAwLFxuICAgIGFuaW1hdGlvblRpbWluZyA9IHZvaWQgMCxcbiAgICBhbmltYXRpb25EZWxheSA9IHZvaWQgMDtcblxuaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICB2YXIgX2dldFRyYW5zaXRpb25Qcm9wZXJ0ID0gZ2V0VHJhbnNpdGlvblByb3BlcnRpZXMoKTtcblxuICBwcmVmaXggPSBfZ2V0VHJhbnNpdGlvblByb3BlcnQucHJlZml4O1xuICBleHBvcnRzLnRyYW5zaXRpb25FbmQgPSB0cmFuc2l0aW9uRW5kID0gX2dldFRyYW5zaXRpb25Qcm9wZXJ0LnRyYW5zaXRpb25FbmQ7XG4gIGV4cG9ydHMuYW5pbWF0aW9uRW5kID0gYW5pbWF0aW9uRW5kID0gX2dldFRyYW5zaXRpb25Qcm9wZXJ0LmFuaW1hdGlvbkVuZDtcblxuXG4gIGV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtID0gcHJlZml4ICsgJy0nICsgdHJhbnNmb3JtO1xuICBleHBvcnRzLnRyYW5zaXRpb25Qcm9wZXJ0eSA9IHRyYW5zaXRpb25Qcm9wZXJ0eSA9IHByZWZpeCArICctdHJhbnNpdGlvbi1wcm9wZXJ0eSc7XG4gIGV4cG9ydHMudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLWR1cmF0aW9uJztcbiAgZXhwb3J0cy50cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkgPSBwcmVmaXggKyAnLXRyYW5zaXRpb24tZGVsYXknO1xuICBleHBvcnRzLnRyYW5zaXRpb25UaW1pbmcgPSB0cmFuc2l0aW9uVGltaW5nID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic7XG5cbiAgZXhwb3J0cy5hbmltYXRpb25OYW1lID0gYW5pbWF0aW9uTmFtZSA9IHByZWZpeCArICctYW5pbWF0aW9uLW5hbWUnO1xuICBleHBvcnRzLmFuaW1hdGlvbkR1cmF0aW9uID0gYW5pbWF0aW9uRHVyYXRpb24gPSBwcmVmaXggKyAnLWFuaW1hdGlvbi1kdXJhdGlvbic7XG4gIGV4cG9ydHMuYW5pbWF0aW9uVGltaW5nID0gYW5pbWF0aW9uVGltaW5nID0gcHJlZml4ICsgJy1hbmltYXRpb24tZGVsYXknO1xuICBleHBvcnRzLmFuaW1hdGlvbkRlbGF5ID0gYW5pbWF0aW9uRGVsYXkgPSBwcmVmaXggKyAnLWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb24nO1xufVxuXG5leHBvcnRzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbmV4cG9ydHMudHJhbnNpdGlvblByb3BlcnR5ID0gdHJhbnNpdGlvblByb3BlcnR5O1xuZXhwb3J0cy50cmFuc2l0aW9uVGltaW5nID0gdHJhbnNpdGlvblRpbWluZztcbmV4cG9ydHMudHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5O1xuZXhwb3J0cy50cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb247XG5leHBvcnRzLnRyYW5zaXRpb25FbmQgPSB0cmFuc2l0aW9uRW5kO1xuZXhwb3J0cy5hbmltYXRpb25OYW1lID0gYW5pbWF0aW9uTmFtZTtcbmV4cG9ydHMuYW5pbWF0aW9uRHVyYXRpb24gPSBhbmltYXRpb25EdXJhdGlvbjtcbmV4cG9ydHMuYW5pbWF0aW9uVGltaW5nID0gYW5pbWF0aW9uVGltaW5nO1xuZXhwb3J0cy5hbmltYXRpb25EZWxheSA9IGFuaW1hdGlvbkRlbGF5O1xuZXhwb3J0cy5hbmltYXRpb25FbmQgPSBhbmltYXRpb25FbmQ7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICBlbmQ6IHRyYW5zaXRpb25FbmQsXG4gIHByb3BlcnR5OiB0cmFuc2l0aW9uUHJvcGVydHksXG4gIHRpbWluZzogdHJhbnNpdGlvblRpbWluZyxcbiAgZGVsYXk6IHRyYW5zaXRpb25EZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25EdXJhdGlvblxufTtcblxuXG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUHJvcGVydGllcygpIHtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgdmFyIHZlbmRvck1hcCA9IHtcbiAgICBPOiBmdW5jdGlvbiBPKGUpIHtcbiAgICAgIHJldHVybiAnbycgKyBlLnRvTG93ZXJDYXNlKCk7XG4gICAgfSxcbiAgICBNb3o6IGZ1bmN0aW9uIE1veihlKSB7XG4gICAgICByZXR1cm4gJ21veicgKyBlO1xuICAgIH0sXG4gICAgV2Via2l0OiBmdW5jdGlvbiBXZWJraXQoZSkge1xuICAgICAgcmV0dXJuICd3ZWJraXQnICsgZTtcbiAgICB9LFxuICAgIG1zOiBmdW5jdGlvbiBtcyhlKSB7XG4gICAgICByZXR1cm4gJ01TJyArIGU7XG4gICAgfVxuICB9O1xuXG4gIHZhciB2ZW5kb3JzID0gT2JqZWN0LmtleXModmVuZG9yTWFwKTtcblxuICB2YXIgdHJhbnNpdGlvbkVuZCA9IHZvaWQgMCxcbiAgICAgIGFuaW1hdGlvbkVuZCA9IHZvaWQgMDtcbiAgdmFyIHByZWZpeCA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2ZW5kb3IgPSB2ZW5kb3JzW2ldO1xuXG4gICAgaWYgKHZlbmRvciArICdUcmFuc2l0aW9uUHJvcGVydHknIGluIHN0eWxlKSB7XG4gICAgICBwcmVmaXggPSAnLScgKyB2ZW5kb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRyYW5zaXRpb25FbmQgPSB2ZW5kb3JNYXBbdmVuZG9yXSgnVHJhbnNpdGlvbkVuZCcpO1xuICAgICAgYW5pbWF0aW9uRW5kID0gdmVuZG9yTWFwW3ZlbmRvcl0oJ0FuaW1hdGlvbkVuZCcpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0cmFuc2l0aW9uRW5kICYmICd0cmFuc2l0aW9uUHJvcGVydHknIGluIHN0eWxlKSB0cmFuc2l0aW9uRW5kID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4gIGlmICghYW5pbWF0aW9uRW5kICYmICdhbmltYXRpb25OYW1lJyBpbiBzdHlsZSkgdHJhbnNpdGlvbkVuZCA9ICdhbmltYXRpb25lbmQnO1xuXG4gIHN0eWxlID0gbnVsbDtcblxuICByZXR1cm4geyBhbmltYXRpb25FbmQ6IGFuaW1hdGlvbkVuZCwgdHJhbnNpdGlvbkVuZDogdHJhbnNpdGlvbkVuZCwgcHJlZml4OiBwcmVmaXggfTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdHJhbnNpdGlvbi9wcm9wZXJ0aWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1oZWxwZXJzL3V0aWwvaW5ET00uanNcbi8vIG1vZHVsZSBpZCA9IDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4uL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBvbiA9IGZ1bmN0aW9uIG9uKCkge307XG5pZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gIG9uID0gZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybiBmdW5jdGlvbiAobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKSB7XG4gICAgICByZXR1cm4gbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSB8fCBmYWxzZSk7XG4gICAgfTtlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgcmV0dXJuIGZ1bmN0aW9uIChub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudE5hbWUsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgZS50YXJnZXQgPSBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7XG4gICAgICAgIGUuY3VycmVudFRhcmdldCA9IG5vZGU7XG4gICAgICAgIGhhbmRsZXIuY2FsbChub2RlLCBlKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0oKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvZXZlbnRzL29uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3N0eWxlID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvc3R5bGUnKTtcblxudmFyIF9zdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdHlsZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9UcmFuc2l0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2l0aW9uJyk7XG5cbnZhciBfVHJhbnNpdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UcmFuc2l0aW9uKTtcblxudmFyIF9jYXBpdGFsaXplID0gcmVxdWlyZSgnLi91dGlsL2NhcGl0YWxpemUnKTtcblxudmFyIF9jYXBpdGFsaXplMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhcGl0YWxpemUpO1xuXG52YXIgX3RpbnBlckJlZUNvcmUgPSByZXF1aXJlKCd0aW5wZXItYmVlLWNvcmUnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBNQVJHSU5TID0ge1xuICBoZWlnaHQ6IFsnbWFyZ2luVG9wJywgJ21hcmdpbkJvdHRvbSddLFxuICB3aWR0aDogWydtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0J11cbn07XG5cbi8vIHJlYWRpbmcgYSBkaW1lbnNpb24gcHJvcCB3aWxsIGNhdXNlIHRoZSBicm93c2VyIHRvIHJlY2FsY3VsYXRlLFxuLy8gd2hpY2ggd2lsbCBsZXQgb3VyIGFuaW1hdGlvbnMgd29ya1xuZnVuY3Rpb24gdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSkge1xuICBub2RlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbn1cblxuZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWUoZGltZW5zaW9uLCBlbGVtKSB7XG4gIHZhciB2YWx1ZSA9IGVsZW1bJ29mZnNldCcgKyAoMCwgX2NhcGl0YWxpemUyW1wiZGVmYXVsdFwiXSkoZGltZW5zaW9uKV07XG4gIHZhciBtYXJnaW5zID0gTUFSR0lOU1tkaW1lbnNpb25dO1xuXG4gIHJldHVybiB2YWx1ZSArIHBhcnNlSW50KCgwLCBfc3R5bGUyW1wiZGVmYXVsdFwiXSkoZWxlbSwgbWFyZ2luc1swXSksIDEwKSArIHBhcnNlSW50KCgwLCBfc3R5bGUyW1wiZGVmYXVsdFwiXSkoZWxlbSwgbWFyZ2luc1sxXSksIDEwKTtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXHJcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZXhwYW5kIG9yIGNvbGxhcHNlIGFuaW1hdGlvblxyXG4gICAqL1xuICBcImluXCI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxyXG4gICAqIFVubW91bnQgdGhlIGNvbXBvbmVudCAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBjb2xsYXBzZWRcclxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXHJcbiAgICogUnVuIHRoZSBleHBhbmQgYW5pbWF0aW9uIHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMsIGlmIGl0IGlzIGluaXRpYWxseVxyXG4gICAqIHNob3duXHJcbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxyXG4gICAqIER1cmF0aW9uIG9mIHRoZSBjb2xsYXBzZSBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLCB0byBlbnN1cmUgdGhhdFxyXG4gICAqIGZpbmlzaGluZyBjYWxsYmFja3MgYXJlIGZpcmVkIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIGJyb3dzZXIgdHJhbnNpdGlvbiBlbmRcclxuICAgKiBldmVudHMgYXJlIGNhbmNlbGVkXHJcbiAgICovXG4gIHRpbWVvdXQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgZXhwYW5kc1xyXG4gICAqL1xuICBvbkVudGVyOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gZXhwYW5kXHJcbiAgICovXG4gIG9uRW50ZXJpbmc6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBleHBhbmRlZFxyXG4gICAqL1xuICBvbkVudGVyZWQ6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jLFxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBjb2xsYXBzZXNcclxuICAgKi9cbiAgb25FeGl0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gY29sbGFwc2VcclxuICAgKi9cbiAgb25FeGl0aW5nOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgY29sbGFwc2VkXHJcbiAgICovXG4gIG9uRXhpdGVkOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcblxuICAvKipcclxuICAgKiBUaGUgZGltZW5zaW9uIHVzZWQgd2hlbiBjb2xsYXBzaW5nLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcclxuICAgKiBkaW1lbnNpb25cclxuICAgKlxyXG4gICAqIF9Ob3RlOiBCb290c3RyYXAgb25seSBwYXJ0aWFsbHkgc3VwcG9ydHMgJ3dpZHRoJyFcclxuICAgKiBZb3Ugd2lsbCBuZWVkIHRvIHN1cHBseSB5b3VyIG93biBDU1MgYW5pbWF0aW9uIGZvciB0aGUgYC53aWR0aGAgQ1NTIGNsYXNzLl9cclxuICAgKi9cbiAgZGltZW5zaW9uOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMub25lT2YoWydoZWlnaHQnLCAnd2lkdGgnXSksIF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5mdW5jXSksXG5cbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBoZWlnaHQgb3Igd2lkdGggb2YgdGhlIGFuaW1hdGluZyBET00gbm9kZVxyXG4gICAqXHJcbiAgICogQWxsb3dzIGZvciBwcm92aWRpbmcgc29tZSBjdXN0b20gbG9naWMgZm9yIGhvdyBtdWNoIHRoZSBDb2xsYXBzZSBjb21wb25lbnRcclxuICAgKiBzaG91bGQgYW5pbWF0ZSBpbiBpdHMgc3BlY2lmaWVkIGRpbWVuc2lvbi4gQ2FsbGVkIHdpdGggdGhlIGN1cnJlbnRcclxuICAgKiBkaW1lbnNpb24gcHJvcCB2YWx1ZSBhbmQgdGhlIERPTSBub2RlLlxyXG4gICAqL1xuICBnZXREaW1lbnNpb25WYWx1ZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXHJcbiAgICogQVJJQSByb2xlIG9mIGNvbGxhcHNpYmxlIGVsZW1lbnRcclxuICAgKi9cbiAgcm9sZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgXCJpblwiOiBmYWxzZSxcbiAgdGltZW91dDogMzAwLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgdHJhbnNpdGlvbkFwcGVhcjogZmFsc2UsXG5cbiAgZGltZW5zaW9uOiAnaGVpZ2h0JyxcbiAgZ2V0RGltZW5zaW9uVmFsdWU6IGdldERpbWVuc2lvblZhbHVlXG59O1xuXG52YXIgQ29sbGFwc2UgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQ29sbGFwc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbGxhcHNlKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbGxhcHNlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlRW50ZXIgPSBfdGhpcy5oYW5kbGVFbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFbnRlcmluZyA9IF90aGlzLmhhbmRsZUVudGVyaW5nLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUVudGVyZWQgPSBfdGhpcy5oYW5kbGVFbnRlcmVkLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUV4aXQgPSBfdGhpcy5oYW5kbGVFeGl0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUV4aXRpbmcgPSBfdGhpcy5oYW5kbGVFeGl0aW5nLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8qIC0tIEV4cGFuZGluZyAtLSAqL1xuXG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUVudGVyID0gZnVuY3Rpb24gaGFuZGxlRW50ZXIoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSAnMCc7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUVudGVyaW5nID0gZnVuY3Rpb24gaGFuZGxlRW50ZXJpbmcoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLl9nZXRTY3JvbGxEaW1lbnNpb25WYWx1ZShlbGVtLCBkaW1lbnNpb24pO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFbnRlcmVkID0gZnVuY3Rpb24gaGFuZGxlRW50ZXJlZChlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9IG51bGw7XG4gIH07XG5cbiAgLyogLS0gQ29sbGFwc2luZyAtLSAqL1xuXG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUV4aXQgPSBmdW5jdGlvbiBoYW5kbGVFeGl0KGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5wcm9wcy5nZXREaW1lbnNpb25WYWx1ZShkaW1lbnNpb24sIGVsZW0pICsgJ3B4JztcbiAgICB0cmlnZ2VyQnJvd3NlclJlZmxvdyhlbGVtKTtcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRXhpdGluZyA9IGZ1bmN0aW9uIGhhbmRsZUV4aXRpbmcoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSAnMCc7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLl9kaW1lbnNpb24gPSBmdW5jdGlvbiBfZGltZW5zaW9uKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5wcm9wcy5kaW1lbnNpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLnByb3BzLmRpbWVuc2lvbigpIDogdGhpcy5wcm9wcy5kaW1lbnNpb247XG4gIH07XG5cbiAgLy8gZm9yIHRlc3RpbmdcblxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5fZ2V0U2Nyb2xsRGltZW5zaW9uVmFsdWUgPSBmdW5jdGlvbiBfZ2V0U2Nyb2xsRGltZW5zaW9uVmFsdWUoZWxlbSwgZGltZW5zaW9uKSB7XG4gICAgcmV0dXJuIGVsZW1bJ3Njcm9sbCcgKyAoMCwgX2NhcGl0YWxpemUyW1wiZGVmYXVsdFwiXSkoZGltZW5zaW9uKV0gKyAncHgnO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcjtcbiAgICB2YXIgb25FbnRlcmluZyA9IF9wcm9wcy5vbkVudGVyaW5nO1xuICAgIHZhciBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkO1xuICAgIHZhciBvbkV4aXQgPSBfcHJvcHMub25FeGl0O1xuICAgIHZhciBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nO1xuICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgdmFyIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWydvbkVudGVyJywgJ29uRW50ZXJpbmcnLCAnb25FbnRlcmVkJywgJ29uRXhpdCcsICdvbkV4aXRpbmcnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgZGVsZXRlIHByb3BzLmRpbWVuc2lvbjtcbiAgICBkZWxldGUgcHJvcHMuZ2V0RGltZW5zaW9uVmFsdWU7XG5cbiAgICB2YXIgaGFuZGxlRW50ZXIgPSAoMCwgX3RpbnBlckJlZUNvcmUuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKSh0aGlzLmhhbmRsZUVudGVyLCBvbkVudGVyKTtcbiAgICB2YXIgaGFuZGxlRW50ZXJpbmcgPSAoMCwgX3RpbnBlckJlZUNvcmUuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKSh0aGlzLmhhbmRsZUVudGVyaW5nLCBvbkVudGVyaW5nKTtcbiAgICB2YXIgaGFuZGxlRW50ZXJlZCA9ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKHRoaXMuaGFuZGxlRW50ZXJlZCwgb25FbnRlcmVkKTtcbiAgICB2YXIgaGFuZGxlRXhpdCA9ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKHRoaXMuaGFuZGxlRXhpdCwgb25FeGl0KTtcbiAgICB2YXIgaGFuZGxlRXhpdGluZyA9ICgwLCBfdGlucGVyQmVlQ29yZS5jcmVhdGVDaGFpbmVkRnVuY3Rpb24pKHRoaXMuaGFuZGxlRXhpdGluZywgb25FeGl0aW5nKTtcblxuICAgIHZhciBjbGFzc2VzID0ge1xuICAgICAgd2lkdGg6IHRoaXMuX2RpbWVuc2lvbigpID09PSAnd2lkdGgnXG4gICAgfTtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9UcmFuc2l0aW9uMltcImRlZmF1bHRcIl0sIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBwcm9wcy5yb2xlID8gcHJvcHNbXCJpblwiXSA6IG51bGwsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUsIGNsYXNzZXMpLFxuICAgICAgZXhpdGVkQ2xhc3NOYW1lOiAnY29sbGFwc2UnLFxuICAgICAgZXhpdGluZ0NsYXNzTmFtZTogJ2NvbGxhcHNpbmcnLFxuICAgICAgZW50ZXJlZENsYXNzTmFtZTogJ2NvbGxhcHNlIGluJyxcbiAgICAgIGVudGVyaW5nQ2xhc3NOYW1lOiAnY29sbGFwc2luZycsXG4gICAgICBvbkVudGVyOiBoYW5kbGVFbnRlcixcbiAgICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgICAgb25FeGl0OiBoYW5kbGVFeGl0LFxuICAgICAgb25FeGl0aW5nOiBoYW5kbGVFeGl0aW5nXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDb2xsYXBzZTtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuQ29sbGFwc2UucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ29sbGFwc2UuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbGxhcHNlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL0NvbGxhcHNlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzdHlsZTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlID0gcmVxdWlyZSgnLi4vdXRpbC9jYW1lbGl6ZVN0eWxlJyk7XG5cbnZhciBfY2FtZWxpemVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYW1lbGl6ZVN0eWxlKTtcblxudmFyIF9oeXBoZW5hdGVTdHlsZSA9IHJlcXVpcmUoJy4uL3V0aWwvaHlwaGVuYXRlU3R5bGUnKTtcblxudmFyIF9oeXBoZW5hdGVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oeXBoZW5hdGVTdHlsZSk7XG5cbnZhciBfZ2V0Q29tcHV0ZWRTdHlsZTIgPSByZXF1aXJlKCcuL2dldENvbXB1dGVkU3R5bGUnKTtcblxudmFyIF9nZXRDb21wdXRlZFN0eWxlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldENvbXB1dGVkU3R5bGUyKTtcblxudmFyIF9yZW1vdmVTdHlsZSA9IHJlcXVpcmUoJy4vcmVtb3ZlU3R5bGUnKTtcblxudmFyIF9yZW1vdmVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW1vdmVTdHlsZSk7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3RyYW5zaXRpb24vcHJvcGVydGllcycpO1xuXG52YXIgX2lzVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vdHJhbnNpdGlvbi9pc1RyYW5zZm9ybScpO1xuXG52YXIgX2lzVHJhbnNmb3JtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc3R5bGUobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHZhciBjc3MgPSAnJztcbiAgdmFyIHRyYW5zZm9ybXMgPSAnJztcbiAgdmFyIHByb3BzID0gcHJvcGVydHk7XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5vZGUuc3R5bGVbKDAsIF9jYW1lbGl6ZVN0eWxlMi5kZWZhdWx0KShwcm9wZXJ0eSldIHx8ICgwLCBfZ2V0Q29tcHV0ZWRTdHlsZTMuZGVmYXVsdCkobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZSgoMCwgX2h5cGhlbmF0ZVN0eWxlMi5kZWZhdWx0KShwcm9wZXJ0eSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAocHJvcHMgPSB7fSlbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgICAgKDAsIF9yZW1vdmVTdHlsZTIuZGVmYXVsdCkobm9kZSwgKDAsIF9oeXBoZW5hdGVTdHlsZTIuZGVmYXVsdCkoa2V5KSk7XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzVHJhbnNmb3JtMi5kZWZhdWx0KShrZXkpKSB7XG4gICAgICB0cmFuc2Zvcm1zICs9IGtleSArICcoJyArIHZhbHVlICsgJykgJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3NzICs9ICgwLCBfaHlwaGVuYXRlU3R5bGUyLmRlZmF1bHQpKGtleSkgKyAnOiAnICsgdmFsdWUgKyAnOyc7XG4gICAgfVxuICB9KTtcblxuICBpZiAodHJhbnNmb3Jtcykge1xuICAgIGNzcyArPSBfcHJvcGVydGllcy50cmFuc2Zvcm0gKyAnOiAnICsgdHJhbnNmb3JtcyArICc7JztcbiAgfVxuXG4gIG5vZGUuc3R5bGUuY3NzVGV4dCArPSAnOycgKyBjc3M7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvc3R5bGUvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhbWVsaXplU3R5bGVOYW1lO1xuXG52YXIgX2NhbWVsaXplID0gcmVxdWlyZSgnLi9jYW1lbGl6ZScpO1xuXG52YXIgX2NhbWVsaXplMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhbWVsaXplKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG1zUGF0dGVybiA9IC9eLW1zLS87IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi8yYWViOGEyYTZiZWIwMDYxN2E0MjE3ZjdmODI4NDkyNGZhMmFkODE5L3NyYy92ZW5kb3IvY29yZS9jYW1lbGl6ZVN0eWxlTmFtZS5qc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZnVuY3Rpb24gY2FtZWxpemVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiAoMCwgX2NhbWVsaXplMi5kZWZhdWx0KShzdHJpbmcucmVwbGFjZShtc1BhdHRlcm4sICdtcy0nKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZVN0eWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhbWVsaXplO1xudmFyIHJIeXBoZW4gPSAvLSguKS9nO1xuXG5mdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJIeXBoZW4sIGZ1bmN0aW9uIChfLCBjaHIpIHtcbiAgICByZXR1cm4gY2hyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdXRpbC9jYW1lbGl6ZS5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaHlwaGVuYXRlU3R5bGVOYW1lO1xuXG52YXIgX2h5cGhlbmF0ZSA9IHJlcXVpcmUoJy4vaHlwaGVuYXRlJyk7XG5cbnZhciBfaHlwaGVuYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h5cGhlbmF0ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weXJpZ2h0IDIwMTMtMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi8yYWViOGEyYTZiZWIwMDYxN2E0MjE3ZjdmODI4NDkyNGZhMmFkODE5L3NyYy92ZW5kb3IvY29yZS9oeXBoZW5hdGVTdHlsZU5hbWUuanNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiAoMCwgX2h5cGhlbmF0ZTIuZGVmYXVsdCkoc3RyaW5nKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZVN0eWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBoeXBoZW5hdGU7XG5cbnZhciByVXBwZXIgPSAvKFtBLVpdKS9nO1xuXG5mdW5jdGlvbiBoeXBoZW5hdGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShyVXBwZXIsICctJDEnKS50b0xvd2VyQ2FzZSgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1oZWxwZXJzL3V0aWwvaHlwaGVuYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlID0gcmVxdWlyZSgnLi4vdXRpbC9jYW1lbGl6ZVN0eWxlJyk7XG5cbnZhciBfY2FtZWxpemVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYW1lbGl6ZVN0eWxlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLztcbnZhciBybnVtbm9ucHggPSAvXihbKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkpKD8hcHgpW2EteiVdKyQvaTtcblxuZnVuY3Rpb24gX2dldENvbXB1dGVkU3R5bGUobm9kZSkge1xuICBpZiAoIW5vZGUpIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIEVsZW1lbnQgcGFzc2VkIHRvIGBnZXRDb21wdXRlZFN0eWxlKClgJyk7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG5cbiAgcmV0dXJuICdkZWZhdWx0VmlldycgaW4gZG9jID8gZG9jLmRlZmF1bHRWaWV3Lm9wZW5lciA/IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpIDogd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkgOiB7XG4gICAgLy9pZSA4IFwibWFnaWNcIiBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iLzEuMTEtc3RhYmxlL3NyYy9jc3MvY3VyQ1NTLmpzI0w3MlxuICAgIGdldFByb3BlcnR5VmFsdWU6IGZ1bmN0aW9uIGdldFByb3BlcnR5VmFsdWUocHJvcCkge1xuICAgICAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICAgICAgcHJvcCA9ICgwLCBfY2FtZWxpemVTdHlsZTIuZGVmYXVsdCkocHJvcCk7XG5cbiAgICAgIGlmIChwcm9wID09ICdmbG9hdCcpIHByb3AgPSAnc3R5bGVGbG9hdCc7XG5cbiAgICAgIHZhciBjdXJyZW50ID0gbm9kZS5jdXJyZW50U3R5bGVbcHJvcF0gfHwgbnVsbDtcblxuICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVtwcm9wXSkgY3VycmVudCA9IHN0eWxlW3Byb3BdO1xuXG4gICAgICBpZiAocm51bW5vbnB4LnRlc3QoY3VycmVudCkgJiYgIXJwb3NpdGlvbi50ZXN0KHByb3ApKSB7XG4gICAgICAgIC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgdmFyIGxlZnQgPSBzdHlsZS5sZWZ0O1xuICAgICAgICB2YXIgcnVuU3R5bGUgPSBub2RlLnJ1bnRpbWVTdHlsZTtcbiAgICAgICAgdmFyIHJzTGVmdCA9IHJ1blN0eWxlICYmIHJ1blN0eWxlLmxlZnQ7XG5cbiAgICAgICAgLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuICAgICAgICBpZiAocnNMZWZ0KSBydW5TdHlsZS5sZWZ0ID0gbm9kZS5jdXJyZW50U3R5bGUubGVmdDtcblxuICAgICAgICBzdHlsZS5sZWZ0ID0gcHJvcCA9PT0gJ2ZvbnRTaXplJyA/ICcxZW0nIDogY3VycmVudDtcbiAgICAgICAgY3VycmVudCA9IHN0eWxlLnBpeGVsTGVmdCArICdweCc7XG5cbiAgICAgICAgLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuICAgICAgICBzdHlsZS5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHJzTGVmdCkgcnVuU3R5bGUubGVmdCA9IHJzTGVmdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1oZWxwZXJzL3N0eWxlL2dldENvbXB1dGVkU3R5bGUuanNcbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHJlbW92ZVN0eWxlO1xuZnVuY3Rpb24gcmVtb3ZlU3R5bGUobm9kZSwga2V5KSB7XG4gIHJldHVybiAncmVtb3ZlUHJvcGVydHknIGluIG5vZGUuc3R5bGUgPyBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KGtleSkgOiBub2RlLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2RvbS1oZWxwZXJzL3N0eWxlL3JlbW92ZVN0eWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzVHJhbnNmb3JtO1xudmFyIHN1cHBvcnRlZFRyYW5zZm9ybXMgPSAvXigodHJhbnNsYXRlfHJvdGF0ZXxzY2FsZSkoWHxZfFp8M2QpP3xtYXRyaXgoM2QpP3xwZXJzcGVjdGl2ZXxza2V3KFh8WSk/KSQvaTtcblxuZnVuY3Rpb24gaXNUcmFuc2Zvcm0ocHJvcGVydHkpIHtcbiAgcmV0dXJuICEhKHByb3BlcnR5ICYmIHN1cHBvcnRlZFRyYW5zZm9ybXMudGVzdChwcm9wZXJ0eSkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWhlbHBlcnMvdHJhbnNpdGlvbi9pc1RyYW5zZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNhcGl0YWxpemU7XG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICByZXR1cm4gXCJcIiArIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL3V0aWwvY2FwaXRhbGl6ZS5qc1xuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5BbGlnbiA9IGV4cG9ydHMudG9BcnJheSA9IGV4cG9ydHMuY3NzQW5pbWF0aW9uID0gZXhwb3J0cy5hZGRFdmVudExpc3RlbmVyID0gZXhwb3J0cy5jb250YWlucyA9IGV4cG9ydHMuS2V5Q29kZSA9IGV4cG9ydHMuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gZXhwb3J0cy5zcGxpdENvbXBvbmVudCA9IGV4cG9ydHMuaXNSZXF1aXJlZEZvckExMXkgPSBleHBvcnRzLmVsZW1lbnRUeXBlID0gZXhwb3J0cy5kZXByZWNhdGVkID0gZXhwb3J0cy5jb21wb25lbnRPckVsZW1lbnQgPSBleHBvcnRzLmFsbCA9IHVuZGVmaW5lZDtcblxudmFyIF9hbGwyID0gcmVxdWlyZSgnLi9hbGwnKTtcblxudmFyIF9hbGwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWxsMik7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50MiA9IHJlcXVpcmUoJy4vY29tcG9uZW50T3JFbGVtZW50Jyk7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudE9yRWxlbWVudDIpO1xuXG52YXIgX2RlcHJlY2F0ZWQyID0gcmVxdWlyZSgnLi9kZXByZWNhdGVkJyk7XG5cbnZhciBfZGVwcmVjYXRlZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGVkMik7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gcmVxdWlyZSgnLi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlMik7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkyID0gcmVxdWlyZSgnLi9pc1JlcXVpcmVkRm9yQTExeScpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUmVxdWlyZWRGb3JBMTF5Mik7XG5cbnZhciBfc3BsaXRDb21wb25lbnQyID0gcmVxdWlyZSgnLi9zcGxpdENvbXBvbmVudCcpO1xuXG52YXIgX3NwbGl0Q29tcG9uZW50MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwbGl0Q29tcG9uZW50Mik7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IHJlcXVpcmUoJy4vY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIpO1xuXG52YXIgX2tleUNvZGUgPSByZXF1aXJlKCcuL2tleUNvZGUnKTtcblxudmFyIF9rZXlDb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleUNvZGUpO1xuXG52YXIgX2NvbnRhaW5zMiA9IHJlcXVpcmUoJy4vY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWluczIpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIyID0gcmVxdWlyZSgnLi9hZGRFdmVudExpc3RlbmVyJyk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGRFdmVudExpc3RlbmVyMik7XG5cbnZhciBfY3NzQW5pbWF0aW9uMiA9IHJlcXVpcmUoJy4vY3NzQW5pbWF0aW9uJyk7XG5cbnZhciBfY3NzQW5pbWF0aW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nzc0FuaW1hdGlvbjIpO1xuXG52YXIgX3RvQXJyYXkyID0gcmVxdWlyZSgnLi90b0FycmF5Jyk7XG5cbnZhciBfdG9BcnJheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90b0FycmF5Mik7XG5cbnZhciBfQWxpZ24yID0gcmVxdWlyZSgnLi9BbGlnbicpO1xuXG52YXIgX0FsaWduMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsaWduMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuYWxsID0gX2FsbDMuZGVmYXVsdDtcbmV4cG9ydHMuY29tcG9uZW50T3JFbGVtZW50ID0gX2NvbXBvbmVudE9yRWxlbWVudDMuZGVmYXVsdDtcbmV4cG9ydHMuZGVwcmVjYXRlZCA9IF9kZXByZWNhdGVkMy5kZWZhdWx0O1xuZXhwb3J0cy5lbGVtZW50VHlwZSA9IF9lbGVtZW50VHlwZTMuZGVmYXVsdDtcbmV4cG9ydHMuaXNSZXF1aXJlZEZvckExMXkgPSBfaXNSZXF1aXJlZEZvckExMXkzLmRlZmF1bHQ7XG5leHBvcnRzLnNwbGl0Q29tcG9uZW50ID0gX3NwbGl0Q29tcG9uZW50My5kZWZhdWx0O1xuZXhwb3J0cy5jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMy5kZWZhdWx0O1xuZXhwb3J0cy5LZXlDb2RlID0gX2tleUNvZGUyLmRlZmF1bHQ7XG5leHBvcnRzLmNvbnRhaW5zID0gX2NvbnRhaW5zMy5kZWZhdWx0O1xuZXhwb3J0cy5hZGRFdmVudExpc3RlbmVyID0gX2FkZEV2ZW50TGlzdGVuZXIzLmRlZmF1bHQ7XG5leHBvcnRzLmNzc0FuaW1hdGlvbiA9IF9jc3NBbmltYXRpb24zLmRlZmF1bHQ7XG5leHBvcnRzLnRvQXJyYXkgPSBfdG9BcnJheTMuZGVmYXVsdDtcbi8vZXhwb3J0IGdldENvbnRhaW5lclJlbmRlck1peGluIGZyb20gJy4vZ2V0Q29udGFpbmVyUmVuZGVyTWl4aW4nO1xuXG5leHBvcnRzLkFsaWduID0gX0FsaWduMy5kZWZhdWx0O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBhbGw7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIgPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhbGwoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB2YWxpZGF0b3JzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgdmFsaWRhdG9yc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbFByb3BUeXBlcygpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IG51bGw7XG5cbiAgICB2YWxpZGF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbGlkYXRvcikge1xuICAgICAgaWYgKGVycm9yICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzdWx0ID0gdmFsaWRhdG9yLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICByZXR1cm4gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkoYWxsUHJvcFR5cGVzKTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9hbGwuanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyO1xuLyoqXHJcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXHJcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxyXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcclxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXHJcbiAqL1xuXG4vLyBNb3N0bHkgdGFrZW4gZnJvbSBSZWFjdFByb3BUeXBlcy5cblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBjb21wb25lbnROYW1lU2FmZSA9IGNvbXBvbmVudE5hbWUgfHwgJzw8YW5vbnltb3VzPj4nO1xuICAgIHZhciBwcm9wRnVsbE5hbWVTYWZlID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdSZXF1aXJlZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lU2FmZSArICdgIHdhcyBub3Qgc3BlY2lmaWVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZVNhZmUgKyAnYC4nKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDYgPyBfbGVuIC0gNiA6IDApLCBfa2V5ID0gNjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gNl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZVNhZmUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWVTYWZlXS5jb25jYXQoYXJncykpO1xuICB9XG5cbiAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByb3BWYWx1ZSk7XG5cbiAgaWYgKF9yZWFjdDIuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBSZWFjdEVsZW1lbnQgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3RDb21wb25lbnQgb3IgYSAnKSArICdET01FbGVtZW50LiBZb3UgY2FuIHVzdWFsbHkgb2J0YWluIGEgUmVhY3RDb21wb25lbnQgb3IgRE9NRWxlbWVudCAnICsgJ2Zyb20gYSBSZWFjdEVsZW1lbnQgYnkgYXR0YWNoaW5nIGEgcmVmIHRvIGl0LicpO1xuICB9XG5cbiAgaWYgKChwcm9wVHlwZSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHByb3BWYWx1ZS5yZW5kZXIgIT09ICdmdW5jdGlvbicpICYmIHByb3BWYWx1ZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgcHJvcFZhbHVlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3RDb21wb25lbnQgb3IgYSAnKSArICdET01FbGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9ICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKHZhbGlkYXRlKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jb21wb25lbnRPckVsZW1lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGRlcHJlY2F0ZWQ7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgd2FybmVkID0ge307XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQodmFsaWRhdG9yLCByZWFzb24pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBjb21wb25lbnROYW1lU2FmZSA9IGNvbXBvbmVudE5hbWUgfHwgJzw8YW5vbnltb3VzPj4nO1xuICAgIHZhciBwcm9wRnVsbE5hbWVTYWZlID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSAhPSBudWxsKSB7XG4gICAgICB2YXIgbWVzc2FnZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnLicgKyBwcm9wTmFtZTtcblxuICAgICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KSh3YXJuZWRbbWVzc2FnZUtleV0sICdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZVNhZmUgKyAnYCBvZiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWVTYWZlICsgJ2AgaXMgZGVwcmVjYXRlZC4gJyArIHJlYXNvbiArICcuJykpO1xuXG4gICAgICB3YXJuZWRbbWVzc2FnZUtleV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDUgPyBfbGVuIC0gNSA6IDApLCBfa2V5ID0gNTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gNV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvci5hcHBseSh1bmRlZmluZWQsIFtwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWVdLmNvbmNhdChhcmdzKSk7XG4gIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5mdW5jdGlvbiBfcmVzZXRXYXJuZWQoKSB7XG4gIHdhcm5lZCA9IHt9O1xufVxuXG5kZXByZWNhdGVkLl9yZXNldFdhcm5lZCA9IF9yZXNldFdhcm5lZDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9kZXByZWNhdGVkLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXQubGVuZ3RoIDwgMTAgfHwgKC9eW3NcXFddKiQvKS50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB3YXJuaW5nIGZvcm1hdCBzaG91bGQgYmUgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzICcgK1xuICAgICAgICAnd2FybmluZy4gUGxlYXNlLCB1c2UgYSBtb3JlIGRlc2NyaXB0aXZlIGZvcm1hdCB0aGFuOiAnICsgZm9ybWF0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2goeCkge31cbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi93YXJuaW5nL2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDMwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAvdXNyL2xvY2FsL2xpYi9+L2JlZS10b29scy9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGVsZW1lbnRUeXBlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwcm9wVmFsdWUpO1xuXG4gIGlmIChfcmVhY3QyLmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgUmVhY3RFbGVtZW50ICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBlbGVtZW50IHR5cGUgKGEgc3RyaW5nICcpICsgJ29yIGEgUmVhY3RDbGFzcykuJyk7XG4gIH1cblxuICBpZiAocHJvcFR5cGUgIT09ICdmdW5jdGlvbicgJiYgcHJvcFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gZWxlbWVudCB0eXBlIChhIHN0cmluZyAnKSArICdvciBhIFJlYWN0Q2xhc3MpLicpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9ICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKGVsZW1lbnRUeXBlKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9lbGVtZW50VHlwZS5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gaXNSZXF1aXJlZEZvckExMXk7XG5mdW5jdGlvbiBpc1JlcXVpcmVkRm9yQTExeSh2YWxpZGF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBjb21wb25lbnROYW1lU2FmZSA9IGNvbXBvbmVudE5hbWUgfHwgJzw8YW5vbnltb3VzPj4nO1xuICAgIHZhciBwcm9wRnVsbE5hbWVTYWZlID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZVNhZmUgKyAnYCBpcyByZXF1aXJlZCB0byBtYWtlICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZVNhZmUgKyAnYCBhY2Nlc3NpYmxlIGZvciB1c2VycyBvZiBhc3Npc3RpdmUgJykgKyAndGVjaG5vbG9naWVzIHN1Y2ggYXMgc2NyZWVuIHJlYWRlcnMuJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNSA/IF9sZW4gLSA1IDogMCksIF9rZXkgPSA1OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA1XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yLmFwcGx5KHVuZGVmaW5lZCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZV0uY29uY2F0KGFyZ3MpKTtcbiAgfTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9pc1JlcXVpcmVkRm9yQTExeS5qc1xuLy8gbW9kdWxlIGlkID0gMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBzcGxpdENvbXBvbmVudFByb3BzO1xuLyoqXHJcbiAqIOWIhuWJsuimgeS8oOWFpeeItuWFg+e0oOWSjOWtkOWFg+e0oOeahHByb3BzXHJcbiAqIEBwYXJhbSAge1tvYmplY3RdfSBwcm9wcyAgICAg5Lyg5YWl55qE5bGe5oCnXHJcbiAqIEBwYXJhbSAge1tyZWFjdEVsZW1lbnRdfSBDb21wb25lbnQg57uE5Lu2XHJcbiAqIEByZXR1cm4ge1thcnJheV19ICAgICAgICAgICDov5Tlm57mlbDnu4TvvIznrKzkuIDkuKrlhYPntKDkuLrniLblhYPntKBwcm9wc+Wvueixoe+8jOesrOS6jOS4quWtkOWFg+e0oHByb3Bz5a+56LGhXHJcbiAqL1xuZnVuY3Rpb24gc3BsaXRDb21wb25lbnRQcm9wcyhwcm9wcywgQ29tcG9uZW50KSB7XG4gIHZhciBjb21wb25lbnRQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gIHZhciBwYXJlbnRQcm9wcyA9IHt9O1xuICB2YXIgY2hpbGRQcm9wcyA9IHt9O1xuXG4gIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHByb3BOYW1lID0gX3JlZlswXSxcbiAgICAgICAgcHJvcFZhbHVlID0gX3JlZlsxXTtcblxuICAgIGlmIChjb21wb25lbnRQcm9wVHlwZXNbcHJvcE5hbWVdKSB7XG4gICAgICBwYXJlbnRQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkUHJvcHNbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIFtwYXJlbnRQcm9wcywgY2hpbGRQcm9wc107XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIvc3BsaXRDb21wb25lbnQuanNcbi8vIG1vZHVsZSBpZCA9IDM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRGdW5jdGlvbigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3MuZmlsdGVyKGZ1bmN0aW9uIChmKSB7XG4gICAgcmV0dXJuIGYgIT0gbnVsbDtcbiAgfSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGYpIHtcbiAgICBpZiAodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBcmd1bWVudCBUeXBlLCBtdXN0IG9ubHkgcHJvdmlkZSBmdW5jdGlvbnMsIHVuZGVmaW5lZCwgb3IgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYWNjID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZjtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gY2hhaW5lZEZ1bmN0aW9uKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBhY2MuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICBmLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH0sIG51bGwpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcclxuICogQGlnbm9yZVxyXG4gKiBzb21lIGtleS1jb2RlcyBkZWZpbml0aW9uIGFuZCB1dGlscyBmcm9tIGNsb3N1cmUtbGlicmFyeVxyXG4gKiBAYXV0aG9yIHlpbWluZ2hlQGdtYWlsLmNvbVxyXG4gKi9cblxudmFyIEtleUNvZGUgPSB7XG4gIC8qKlxyXG4gICAqIE1BQ19FTlRFUlxyXG4gICAqL1xuICBNQUNfRU5URVI6IDMsXG4gIC8qKlxyXG4gICAqIEJBQ0tTUEFDRVxyXG4gICAqL1xuICBCQUNLU1BBQ0U6IDgsXG4gIC8qKlxyXG4gICAqIFRBQlxyXG4gICAqL1xuICBUQUI6IDksXG4gIC8qKlxyXG4gICAqIE5VTUxPQ0sgb24gRkYvU2FmYXJpIE1hY1xyXG4gICAqL1xuICBOVU1fQ0VOVEVSOiAxMiwgLy8gTlVNTE9DSyBvbiBGRi9TYWZhcmkgTWFjXG4gIC8qKlxyXG4gICAqIEVOVEVSXHJcbiAgICovXG4gIEVOVEVSOiAxMyxcbiAgLyoqXHJcbiAgICogU0hJRlRcclxuICAgKi9cbiAgU0hJRlQ6IDE2LFxuICAvKipcclxuICAgKiBDVFJMXHJcbiAgICovXG4gIENUUkw6IDE3LFxuICAvKipcclxuICAgKiBBTFRcclxuICAgKi9cbiAgQUxUOiAxOCxcbiAgLyoqXHJcbiAgICogUEFVU0VcclxuICAgKi9cbiAgUEFVU0U6IDE5LFxuICAvKipcclxuICAgKiBDQVBTX0xPQ0tcclxuICAgKi9cbiAgQ0FQU19MT0NLOiAyMCxcbiAgLyoqXHJcbiAgICogRVNDXHJcbiAgICovXG4gIEVTQzogMjcsXG4gIC8qKlxyXG4gICAqIFNQQUNFXHJcbiAgICovXG4gIFNQQUNFOiAzMixcbiAgLyoqXHJcbiAgICogUEFHRV9VUFxyXG4gICAqL1xuICBQQUdFX1VQOiAzMywgLy8gYWxzbyBOVU1fTk9SVEhfRUFTVFxuICAvKipcclxuICAgKiBQQUdFX0RPV05cclxuICAgKi9cbiAgUEFHRV9ET1dOOiAzNCwgLy8gYWxzbyBOVU1fU09VVEhfRUFTVFxuICAvKipcclxuICAgKiBFTkRcclxuICAgKi9cbiAgRU5EOiAzNSwgLy8gYWxzbyBOVU1fU09VVEhfV0VTVFxuICAvKipcclxuICAgKiBIT01FXHJcbiAgICovXG4gIEhPTUU6IDM2LCAvLyBhbHNvIE5VTV9OT1JUSF9XRVNUXG4gIC8qKlxyXG4gICAqIExFRlRcclxuICAgKi9cbiAgTEVGVDogMzcsIC8vIGFsc28gTlVNX1dFU1RcbiAgLyoqXHJcbiAgICogVVBcclxuICAgKi9cbiAgVVA6IDM4LCAvLyBhbHNvIE5VTV9OT1JUSFxuICAvKipcclxuICAgKiBSSUdIVFxyXG4gICAqL1xuICBSSUdIVDogMzksIC8vIGFsc28gTlVNX0VBU1RcbiAgLyoqXHJcbiAgICogRE9XTlxyXG4gICAqL1xuICBET1dOOiA0MCwgLy8gYWxzbyBOVU1fU09VVEhcbiAgLyoqXHJcbiAgICogUFJJTlRfU0NSRUVOXHJcbiAgICovXG4gIFBSSU5UX1NDUkVFTjogNDQsXG4gIC8qKlxyXG4gICAqIElOU0VSVFxyXG4gICAqL1xuICBJTlNFUlQ6IDQ1LCAvLyBhbHNvIE5VTV9JTlNFUlRcbiAgLyoqXHJcbiAgICogREVMRVRFXHJcbiAgICovXG4gIERFTEVURTogNDYsIC8vIGFsc28gTlVNX0RFTEVURVxuICAvKipcclxuICAgKiBaRVJPXHJcbiAgICovXG4gIFpFUk86IDQ4LFxuICAvKipcclxuICAgKiBPTkVcclxuICAgKi9cbiAgT05FOiA0OSxcbiAgLyoqXHJcbiAgICogVFdPXHJcbiAgICovXG4gIFRXTzogNTAsXG4gIC8qKlxyXG4gICAqIFRIUkVFXHJcbiAgICovXG4gIFRIUkVFOiA1MSxcbiAgLyoqXHJcbiAgICogRk9VUlxyXG4gICAqL1xuICBGT1VSOiA1MixcbiAgLyoqXHJcbiAgICogRklWRVxyXG4gICAqL1xuICBGSVZFOiA1MyxcbiAgLyoqXHJcbiAgICogU0lYXHJcbiAgICovXG4gIFNJWDogNTQsXG4gIC8qKlxyXG4gICAqIFNFVkVOXHJcbiAgICovXG4gIFNFVkVOOiA1NSxcbiAgLyoqXHJcbiAgICogRUlHSFRcclxuICAgKi9cbiAgRUlHSFQ6IDU2LFxuICAvKipcclxuICAgKiBOSU5FXHJcbiAgICovXG4gIE5JTkU6IDU3LFxuICAvKipcclxuICAgKiBRVUVTVElPTl9NQVJLXHJcbiAgICovXG4gIFFVRVNUSU9OX01BUks6IDYzLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogQVxyXG4gICAqL1xuICBBOiA2NSxcbiAgLyoqXHJcbiAgICogQlxyXG4gICAqL1xuICBCOiA2NixcbiAgLyoqXHJcbiAgICogQ1xyXG4gICAqL1xuICBDOiA2NyxcbiAgLyoqXHJcbiAgICogRFxyXG4gICAqL1xuICBEOiA2OCxcbiAgLyoqXHJcbiAgICogRVxyXG4gICAqL1xuICBFOiA2OSxcbiAgLyoqXHJcbiAgICogRlxyXG4gICAqL1xuICBGOiA3MCxcbiAgLyoqXHJcbiAgICogR1xyXG4gICAqL1xuICBHOiA3MSxcbiAgLyoqXHJcbiAgICogSFxyXG4gICAqL1xuICBIOiA3MixcbiAgLyoqXHJcbiAgICogSVxyXG4gICAqL1xuICBJOiA3MyxcbiAgLyoqXHJcbiAgICogSlxyXG4gICAqL1xuICBKOiA3NCxcbiAgLyoqXHJcbiAgICogS1xyXG4gICAqL1xuICBLOiA3NSxcbiAgLyoqXHJcbiAgICogTFxyXG4gICAqL1xuICBMOiA3NixcbiAgLyoqXHJcbiAgICogTVxyXG4gICAqL1xuICBNOiA3NyxcbiAgLyoqXHJcbiAgICogTlxyXG4gICAqL1xuICBOOiA3OCxcbiAgLyoqXHJcbiAgICogT1xyXG4gICAqL1xuICBPOiA3OSxcbiAgLyoqXHJcbiAgICogUFxyXG4gICAqL1xuICBQOiA4MCxcbiAgLyoqXHJcbiAgICogUVxyXG4gICAqL1xuICBROiA4MSxcbiAgLyoqXHJcbiAgICogUlxyXG4gICAqL1xuICBSOiA4MixcbiAgLyoqXHJcbiAgICogU1xyXG4gICAqL1xuICBTOiA4MyxcbiAgLyoqXHJcbiAgICogVFxyXG4gICAqL1xuICBUOiA4NCxcbiAgLyoqXHJcbiAgICogVVxyXG4gICAqL1xuICBVOiA4NSxcbiAgLyoqXHJcbiAgICogVlxyXG4gICAqL1xuICBWOiA4NixcbiAgLyoqXHJcbiAgICogV1xyXG4gICAqL1xuICBXOiA4NyxcbiAgLyoqXHJcbiAgICogWFxyXG4gICAqL1xuICBYOiA4OCxcbiAgLyoqXHJcbiAgICogWVxyXG4gICAqL1xuICBZOiA4OSxcbiAgLyoqXHJcbiAgICogWlxyXG4gICAqL1xuICBaOiA5MCxcbiAgLyoqXHJcbiAgICogTUVUQVxyXG4gICAqL1xuICBNRVRBOiA5MSwgLy8gV0lOX0tFWV9MRUZUXG4gIC8qKlxyXG4gICAqIFdJTl9LRVlfUklHSFRcclxuICAgKi9cbiAgV0lOX0tFWV9SSUdIVDogOTIsXG4gIC8qKlxyXG4gICAqIENPTlRFWFRfTUVOVVxyXG4gICAqL1xuICBDT05URVhUX01FTlU6IDkzLFxuICAvKipcclxuICAgKiBOVU1fWkVST1xyXG4gICAqL1xuICBOVU1fWkVSTzogOTYsXG4gIC8qKlxyXG4gICAqIE5VTV9PTkVcclxuICAgKi9cbiAgTlVNX09ORTogOTcsXG4gIC8qKlxyXG4gICAqIE5VTV9UV09cclxuICAgKi9cbiAgTlVNX1RXTzogOTgsXG4gIC8qKlxyXG4gICAqIE5VTV9USFJFRVxyXG4gICAqL1xuICBOVU1fVEhSRUU6IDk5LFxuICAvKipcclxuICAgKiBOVU1fRk9VUlxyXG4gICAqL1xuICBOVU1fRk9VUjogMTAwLFxuICAvKipcclxuICAgKiBOVU1fRklWRVxyXG4gICAqL1xuICBOVU1fRklWRTogMTAxLFxuICAvKipcclxuICAgKiBOVU1fU0lYXHJcbiAgICovXG4gIE5VTV9TSVg6IDEwMixcbiAgLyoqXHJcbiAgICogTlVNX1NFVkVOXHJcbiAgICovXG4gIE5VTV9TRVZFTjogMTAzLFxuICAvKipcclxuICAgKiBOVU1fRUlHSFRcclxuICAgKi9cbiAgTlVNX0VJR0hUOiAxMDQsXG4gIC8qKlxyXG4gICAqIE5VTV9OSU5FXHJcbiAgICovXG4gIE5VTV9OSU5FOiAxMDUsXG4gIC8qKlxyXG4gICAqIE5VTV9NVUxUSVBMWVxyXG4gICAqL1xuICBOVU1fTVVMVElQTFk6IDEwNixcbiAgLyoqXHJcbiAgICogTlVNX1BMVVNcclxuICAgKi9cbiAgTlVNX1BMVVM6IDEwNyxcbiAgLyoqXHJcbiAgICogTlVNX01JTlVTXHJcbiAgICovXG4gIE5VTV9NSU5VUzogMTA5LFxuICAvKipcclxuICAgKiBOVU1fUEVSSU9EXHJcbiAgICovXG4gIE5VTV9QRVJJT0Q6IDExMCxcbiAgLyoqXHJcbiAgICogTlVNX0RJVklTSU9OXHJcbiAgICovXG4gIE5VTV9ESVZJU0lPTjogMTExLFxuICAvKipcclxuICAgKiBGMVxyXG4gICAqL1xuICBGMTogMTEyLFxuICAvKipcclxuICAgKiBGMlxyXG4gICAqL1xuICBGMjogMTEzLFxuICAvKipcclxuICAgKiBGM1xyXG4gICAqL1xuICBGMzogMTE0LFxuICAvKipcclxuICAgKiBGNFxyXG4gICAqL1xuICBGNDogMTE1LFxuICAvKipcclxuICAgKiBGNVxyXG4gICAqL1xuICBGNTogMTE2LFxuICAvKipcclxuICAgKiBGNlxyXG4gICAqL1xuICBGNjogMTE3LFxuICAvKipcclxuICAgKiBGN1xyXG4gICAqL1xuICBGNzogMTE4LFxuICAvKipcclxuICAgKiBGOFxyXG4gICAqL1xuICBGODogMTE5LFxuICAvKipcclxuICAgKiBGOVxyXG4gICAqL1xuICBGOTogMTIwLFxuICAvKipcclxuICAgKiBGMTBcclxuICAgKi9cbiAgRjEwOiAxMjEsXG4gIC8qKlxyXG4gICAqIEYxMVxyXG4gICAqL1xuICBGMTE6IDEyMixcbiAgLyoqXHJcbiAgICogRjEyXHJcbiAgICovXG4gIEYxMjogMTIzLFxuICAvKipcclxuICAgKiBOVU1MT0NLXHJcbiAgICovXG4gIE5VTUxPQ0s6IDE0NCxcbiAgLyoqXHJcbiAgICogU0VNSUNPTE9OXHJcbiAgICovXG4gIFNFTUlDT0xPTjogMTg2LCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogREFTSFxyXG4gICAqL1xuICBEQVNIOiAxODksIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBFUVVBTFNcclxuICAgKi9cbiAgRVFVQUxTOiAxODcsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBDT01NQVxyXG4gICAqL1xuICBDT01NQTogMTg4LCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogUEVSSU9EXHJcbiAgICovXG4gIFBFUklPRDogMTkwLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogU0xBU0hcclxuICAgKi9cbiAgU0xBU0g6IDE5MSwgLy8gbmVlZHMgbG9jYWxpemF0aW9uXG4gIC8qKlxyXG4gICAqIEFQT1NUUk9QSEVcclxuICAgKi9cbiAgQVBPU1RST1BIRTogMTkyLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogU0lOR0xFX1FVT1RFXHJcbiAgICovXG4gIFNJTkdMRV9RVU9URTogMjIyLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogT1BFTl9TUVVBUkVfQlJBQ0tFVFxyXG4gICAqL1xuICBPUEVOX1NRVUFSRV9CUkFDS0VUOiAyMTksIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBCQUNLU0xBU0hcclxuICAgKi9cbiAgQkFDS1NMQVNIOiAyMjAsIC8vIG5lZWRzIGxvY2FsaXphdGlvblxuICAvKipcclxuICAgKiBDTE9TRV9TUVVBUkVfQlJBQ0tFVFxyXG4gICAqL1xuICBDTE9TRV9TUVVBUkVfQlJBQ0tFVDogMjIxLCAvLyBuZWVkcyBsb2NhbGl6YXRpb25cbiAgLyoqXHJcbiAgICogV0lOX0tFWVxyXG4gICAqL1xuICBXSU5fS0VZOiAyMjQsXG4gIC8qKlxyXG4gICAqIE1BQ19GRl9NRVRBXHJcbiAgICovXG4gIE1BQ19GRl9NRVRBOiAyMjQsIC8vIEZpcmVmb3ggKEdlY2tvKSBmaXJlcyB0aGlzIGZvciB0aGUgbWV0YSBrZXkgaW5zdGVhZCBvZiA5MVxuICAvKipcclxuICAgKiBXSU5fSU1FXHJcbiAgICovXG4gIFdJTl9JTUU6IDIyOVxufTtcblxuLypcclxuIHdoZXRoZXIgdGV4dCBhbmQgbW9kaWZpZWQga2V5IGlzIGVudGVyZWQgYXQgdGhlIHNhbWUgdGltZS5cclxuICovXG5LZXlDb2RlLmlzVGV4dE1vZGlmeWluZ0tleUV2ZW50ID0gZnVuY3Rpb24gaXNUZXh0TW9kaWZ5aW5nS2V5RXZlbnQoZSkge1xuICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgaWYgKGUuYWx0S2V5ICYmICFlLmN0cmxLZXkgfHwgZS5tZXRhS2V5IHx8XG4gIC8vIEZ1bmN0aW9uIGtleXMgZG9uJ3QgZ2VuZXJhdGUgdGV4dFxuICBrZXlDb2RlID49IEtleUNvZGUuRjEgJiYga2V5Q29kZSA8PSBLZXlDb2RlLkYxMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgcXVpdGUgaGFybWxlc3MsIGV2ZW4gaW4gY29tYmluYXRpb24gd2l0aFxuICAvLyBDVFJMLCBBTFQgb3IgU0hJRlQuXG4gIHN3aXRjaCAoa2V5Q29kZSkge1xuICAgIGNhc2UgS2V5Q29kZS5BTFQ6XG4gICAgY2FzZSBLZXlDb2RlLkNBUFNfTE9DSzpcbiAgICBjYXNlIEtleUNvZGUuQ09OVEVYVF9NRU5VOlxuICAgIGNhc2UgS2V5Q29kZS5DVFJMOlxuICAgIGNhc2UgS2V5Q29kZS5ET1dOOlxuICAgIGNhc2UgS2V5Q29kZS5FTkQ6XG4gICAgY2FzZSBLZXlDb2RlLkVTQzpcbiAgICBjYXNlIEtleUNvZGUuSE9NRTpcbiAgICBjYXNlIEtleUNvZGUuSU5TRVJUOlxuICAgIGNhc2UgS2V5Q29kZS5MRUZUOlxuICAgIGNhc2UgS2V5Q29kZS5NQUNfRkZfTUVUQTpcbiAgICBjYXNlIEtleUNvZGUuTUVUQTpcbiAgICBjYXNlIEtleUNvZGUuTlVNTE9DSzpcbiAgICBjYXNlIEtleUNvZGUuTlVNX0NFTlRFUjpcbiAgICBjYXNlIEtleUNvZGUuUEFHRV9ET1dOOlxuICAgIGNhc2UgS2V5Q29kZS5QQUdFX1VQOlxuICAgIGNhc2UgS2V5Q29kZS5QQVVTRTpcbiAgICBjYXNlIEtleUNvZGUuUFJJTlRfU0NSRUVOOlxuICAgIGNhc2UgS2V5Q29kZS5SSUdIVDpcbiAgICBjYXNlIEtleUNvZGUuU0hJRlQ6XG4gICAgY2FzZSBLZXlDb2RlLlVQOlxuICAgIGNhc2UgS2V5Q29kZS5XSU5fS0VZOlxuICAgIGNhc2UgS2V5Q29kZS5XSU5fS0VZX1JJR0hUOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLypcclxuIHdoZXRoZXIgY2hhcmFjdGVyIGlzIGVudGVyZWQuXHJcbiAqL1xuS2V5Q29kZS5pc0NoYXJhY3RlcktleSA9IGZ1bmN0aW9uIGlzQ2hhcmFjdGVyS2V5KGtleUNvZGUpIHtcbiAgaWYgKGtleUNvZGUgPj0gS2V5Q29kZS5aRVJPICYmIGtleUNvZGUgPD0gS2V5Q29kZS5OSU5FKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoa2V5Q29kZSA+PSBLZXlDb2RlLk5VTV9aRVJPICYmIGtleUNvZGUgPD0gS2V5Q29kZS5OVU1fTVVMVElQTFkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChrZXlDb2RlID49IEtleUNvZGUuQSAmJiBrZXlDb2RlIDw9IEtleUNvZGUuWikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2FmYXJpIHNlbmRzIHplcm8ga2V5IGNvZGUgZm9yIG5vbi1sYXRpbiBjaGFyYWN0ZXJzLlxuICBpZiAod2luZG93Lm5hdmlnYXRpb24udXNlckFnZW50LmluZGV4T2YoJ1dlYktpdCcpICE9PSAtMSAmJiBrZXlDb2RlID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICBjYXNlIEtleUNvZGUuU1BBQ0U6XG4gICAgY2FzZSBLZXlDb2RlLlFVRVNUSU9OX01BUks6XG4gICAgY2FzZSBLZXlDb2RlLk5VTV9QTFVTOlxuICAgIGNhc2UgS2V5Q29kZS5OVU1fTUlOVVM6XG4gICAgY2FzZSBLZXlDb2RlLk5VTV9QRVJJT0Q6XG4gICAgY2FzZSBLZXlDb2RlLk5VTV9ESVZJU0lPTjpcbiAgICBjYXNlIEtleUNvZGUuU0VNSUNPTE9OOlxuICAgIGNhc2UgS2V5Q29kZS5EQVNIOlxuICAgIGNhc2UgS2V5Q29kZS5FUVVBTFM6XG4gICAgY2FzZSBLZXlDb2RlLkNPTU1BOlxuICAgIGNhc2UgS2V5Q29kZS5QRVJJT0Q6XG4gICAgY2FzZSBLZXlDb2RlLlNMQVNIOlxuICAgIGNhc2UgS2V5Q29kZS5BUE9TVFJPUEhFOlxuICAgIGNhc2UgS2V5Q29kZS5TSU5HTEVfUVVPVEU6XG4gICAgY2FzZSBLZXlDb2RlLk9QRU5fU1FVQVJFX0JSQUNLRVQ6XG4gICAgY2FzZSBLZXlDb2RlLkJBQ0tTTEFTSDpcbiAgICBjYXNlIEtleUNvZGUuQ0xPU0VfU1FVQVJFX0JSQUNLRVQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleUNvZGU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbnBlci1iZWUtY29yZS9saWIva2V5Q29kZS5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBjb250YWlucztcbmZ1bmN0aW9uIGNvbnRhaW5zKHJvb3QsIG4pIHtcbiAgdmFyIG5vZGUgPSBuO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9jb250YWlucy5qc1xuLy8gbW9kdWxlIGlkID0gMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gYWRkRXZlbnRMaXN0ZW5lcldyYXA7XG5cbnZhciBfYWRkRG9tRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ2FkZC1kb20tZXZlbnQtbGlzdGVuZXInKTtcblxudmFyIF9hZGREb21FdmVudExpc3RlbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZERvbUV2ZW50TGlzdGVuZXIpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV3JhcCh0YXJnZXQsIGV2ZW50VHlwZSwgY2IpIHtcbiAgLyogZXNsaW50IGNhbWVsY2FzZTogMiAqL1xuICB2YXIgY2FsbGJhY2sgPSBfcmVhY3REb20yLmRlZmF1bHQudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPyBmdW5jdGlvbiBydW4oZSkge1xuICAgIF9yZWFjdERvbTIuZGVmYXVsdC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhjYiwgZSk7XG4gIH0gOiBjYjtcbiAgcmV0dXJuICgwLCBfYWRkRG9tRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkodGFyZ2V0LCBldmVudFR5cGUsIGNhbGxiYWNrKTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9hZGRFdmVudExpc3RlbmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1snZGVmYXVsdCddID0gYWRkRXZlbnRMaXN0ZW5lcjtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX0V2ZW50T2JqZWN0ID0gcmVxdWlyZSgnLi9FdmVudE9iamVjdCcpO1xuXG52YXIgX0V2ZW50T2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0V2ZW50T2JqZWN0KTtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgZnVuY3Rpb24gd3JhcENhbGxiYWNrKGUpIHtcbiAgICB2YXIgbmUgPSBuZXcgX0V2ZW50T2JqZWN0MlsnZGVmYXVsdCddKGUpO1xuICAgIGNhbGxiYWNrLmNhbGwodGFyZ2V0LCBuZSk7XG4gIH1cblxuICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIHdyYXBDYWxsYmFjaywgZmFsc2UpO1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgIHRhcmdldC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCB3cmFwQ2FsbGJhY2spO1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgdGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIHdyYXBDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYWRkLWRvbS1ldmVudC1saXN0ZW5lci9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQGlnbm9yZVxuICogZXZlbnQgb2JqZWN0IGZvciBkb21cbiAqIEBhdXRob3IgeWltaW5naGVAZ21haWwuY29tXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX0V2ZW50QmFzZU9iamVjdCA9IHJlcXVpcmUoJy4vRXZlbnRCYXNlT2JqZWN0Jyk7XG5cbnZhciBfRXZlbnRCYXNlT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0V2ZW50QmFzZU9iamVjdCk7XG5cbnZhciBfb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgX29iamVjdEFzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RBc3NpZ24pO1xuXG52YXIgVFJVRSA9IHRydWU7XG52YXIgRkFMU0UgPSBmYWxzZTtcbnZhciBjb21tb25Qcm9wcyA9IFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsYWJsZScsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZXZlbnRQaGFzZScsICdtZXRhS2V5JywgJ3NoaWZ0S2V5JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndmlldycsICd0eXBlJ107XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKHcpIHtcbiAgcmV0dXJuIHcgPT09IG51bGwgfHwgdyA9PT0gdW5kZWZpbmVkO1xufVxuXG52YXIgZXZlbnROb3JtYWxpemVycyA9IFt7XG4gIHJlZzogL15rZXkvLFxuICBwcm9wczogWydjaGFyJywgJ2NoYXJDb2RlJywgJ2tleScsICdrZXlDb2RlJywgJ3doaWNoJ10sXG4gIGZpeDogZnVuY3Rpb24gZml4KGV2ZW50LCBuYXRpdmVFdmVudCkge1xuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChldmVudC53aGljaCkpIHtcbiAgICAgIGV2ZW50LndoaWNoID0gIWlzTnVsbE9yVW5kZWZpbmVkKG5hdGl2ZUV2ZW50LmNoYXJDb2RlKSA/IG5hdGl2ZUV2ZW50LmNoYXJDb2RlIDogbmF0aXZlRXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICAvLyBhZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMgJ3MgYW5kIE1ldGEgZm9yIE1hY3MpXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7XG4gICAgfVxuICB9XG59LCB7XG4gIHJlZzogL150b3VjaC8sXG4gIHByb3BzOiBbJ3RvdWNoZXMnLCAnY2hhbmdlZFRvdWNoZXMnLCAndGFyZ2V0VG91Y2hlcyddXG59LCB7XG4gIHJlZzogL15oYXNoY2hhbmdlJC8sXG4gIHByb3BzOiBbJ25ld1VSTCcsICdvbGRVUkwnXVxufSwge1xuICByZWc6IC9eZ2VzdHVyZWNoYW5nZSQvaSxcbiAgcHJvcHM6IFsncm90YXRpb24nLCAnc2NhbGUnXVxufSwge1xuICByZWc6IC9eKG1vdXNld2hlZWx8RE9NTW91c2VTY3JvbGwpJC8sXG4gIHByb3BzOiBbXSxcbiAgZml4OiBmdW5jdGlvbiBmaXgoZXZlbnQsIG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIGRlbHRhWCA9IHVuZGVmaW5lZDtcbiAgICB2YXIgZGVsdGFZID0gdW5kZWZpbmVkO1xuICAgIHZhciBkZWx0YSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgd2hlZWxEZWx0YSA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGE7XG4gICAgdmFyIGF4aXMgPSBuYXRpdmVFdmVudC5heGlzO1xuICAgIHZhciB3aGVlbERlbHRhWSA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGFZO1xuICAgIHZhciB3aGVlbERlbHRhWCA9IG5hdGl2ZUV2ZW50LndoZWVsRGVsdGFYO1xuICAgIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgICAvLyBpZS93ZWJraXRcbiAgICBpZiAod2hlZWxEZWx0YSkge1xuICAgICAgZGVsdGEgPSB3aGVlbERlbHRhIC8gMTIwO1xuICAgIH1cblxuICAgIC8vIGdlY2tvXG4gICAgaWYgKGRldGFpbCkge1xuICAgICAgLy8gcHJlc3MgY29udHJvbCBlLmRldGFpbCA9PSAxIGVsc2UgZS5kZXRhaWwgPT0gM1xuICAgICAgZGVsdGEgPSAwIC0gKGRldGFpbCAlIDMgPT09IDAgPyBkZXRhaWwgLyAzIDogZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvLyBHZWNrb1xuICAgIGlmIChheGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChheGlzID09PSBldmVudC5IT1JJWk9OVEFMX0FYSVMpIHtcbiAgICAgICAgZGVsdGFZID0gMDtcbiAgICAgICAgZGVsdGFYID0gMCAtIGRlbHRhO1xuICAgICAgfSBlbHNlIGlmIChheGlzID09PSBldmVudC5WRVJUSUNBTF9BWElTKSB7XG4gICAgICAgIGRlbHRhWCA9IDA7XG4gICAgICAgIGRlbHRhWSA9IGRlbHRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlYmtpdFxuICAgIGlmICh3aGVlbERlbHRhWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWx0YVkgPSB3aGVlbERlbHRhWSAvIDEyMDtcbiAgICB9XG4gICAgaWYgKHdoZWVsRGVsdGFYICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbHRhWCA9IC0xICogd2hlZWxEZWx0YVggLyAxMjA7XG4gICAgfVxuXG4gICAgLy8g6buY6K6kIGRlbHRhWSAoaWUpXG4gICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkge1xuICAgICAgZGVsdGFZID0gZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhWCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIGRlbHRhWCBvZiBtb3VzZXdoZWVsIGV2ZW50XG4gICAgICAgKiBAcHJvcGVydHkgZGVsdGFYXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YVggPSBkZWx0YVg7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIGRlbHRhWSBvZiBtb3VzZXdoZWVsIGV2ZW50XG4gICAgICAgKiBAcHJvcGVydHkgZGVsdGFZXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YVkgPSBkZWx0YVk7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogZGVsdGEgb2YgbW91c2V3aGVlbCBldmVudFxuICAgICAgICogQHByb3BlcnR5IGRlbHRhXG4gICAgICAgKiBAbWVtYmVyIEV2ZW50LkRvbUV2ZW50Lk9iamVjdFxuICAgICAgICovXG4gICAgICBldmVudC5kZWx0YSA9IGRlbHRhO1xuICAgIH1cbiAgfVxufSwge1xuICByZWc6IC9ebW91c2V8Y29udGV4dG1lbnV8Y2xpY2t8bXNwb2ludGVyfCheRE9NTW91c2VTY3JvbGwkKS9pLFxuICBwcm9wczogWydidXR0b25zJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdidXR0b24nLCAnb2Zmc2V0WCcsICdyZWxhdGVkVGFyZ2V0JywgJ3doaWNoJywgJ2Zyb21FbGVtZW50JywgJ3RvRWxlbWVudCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3NjcmVlblgnLCAnc2NyZWVuWSddLFxuICBmaXg6IGZ1bmN0aW9uIGZpeChldmVudCwgbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgZXZlbnREb2MgPSB1bmRlZmluZWQ7XG4gICAgdmFyIGRvYyA9IHVuZGVmaW5lZDtcbiAgICB2YXIgYm9keSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBidXR0b24gPSBuYXRpdmVFdmVudC5idXR0b247XG5cbiAgICAvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlXG4gICAgaWYgKHRhcmdldCAmJiBpc051bGxPclVuZGVmaW5lZChldmVudC5wYWdlWCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKG5hdGl2ZUV2ZW50LmNsaWVudFgpKSB7XG4gICAgICBldmVudERvYyA9IHRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICAgICAgZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgYm9keSA9IGV2ZW50RG9jLmJvZHk7XG4gICAgICBldmVudC5wYWdlWCA9IG5hdGl2ZUV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwKTtcbiAgICAgIGV2ZW50LnBhZ2VZID0gbmF0aXZlRXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wIHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50VG9wIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgfHwgMCk7XG4gICAgfVxuXG4gICAgLy8gd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG4gICAgLy8gZG8gbm90IHVzZSBidXR0b25cbiAgICBpZiAoIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoYnV0dG9uICYgMSkge1xuICAgICAgICBldmVudC53aGljaCA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGJ1dHRvbiAmIDIpIHtcbiAgICAgICAgZXZlbnQud2hpY2ggPSAzO1xuICAgICAgfSBlbHNlIGlmIChidXR0b24gJiA0KSB7XG4gICAgICAgIGV2ZW50LndoaWNoID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50LndoaWNoID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGV2ZW50LmZyb21FbGVtZW50KSB7XG4gICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT09IHRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbiAgfVxufV07XG5cbmZ1bmN0aW9uIHJldFRydWUoKSB7XG4gIHJldHVybiBUUlVFO1xufVxuXG5mdW5jdGlvbiByZXRGYWxzZSgpIHtcbiAgcmV0dXJuIEZBTFNFO1xufVxuXG5mdW5jdGlvbiBEb21FdmVudE9iamVjdChuYXRpdmVFdmVudCkge1xuICB2YXIgdHlwZSA9IG5hdGl2ZUV2ZW50LnR5cGU7XG5cbiAgdmFyIGlzTmF0aXZlID0gdHlwZW9mIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbmF0aXZlRXZlbnQuY2FuY2VsQnViYmxlID09PSAnYm9vbGVhbic7XG5cbiAgX0V2ZW50QmFzZU9iamVjdDJbJ2RlZmF1bHQnXS5jYWxsKHRoaXMpO1xuXG4gIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcblxuICAvLyBpbiBjYXNlIGRvbSBldmVudCBoYXMgYmVlbiBtYXJrIGFzIGRlZmF1bHQgcHJldmVudGVkIGJ5IGxvd2VyIGRvbSBub2RlXG4gIHZhciBpc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXRGYWxzZTtcbiAgaWYgKCdkZWZhdWx0UHJldmVudGVkJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGlzRGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPyByZXRUcnVlIDogcmV0RmFsc2U7XG4gIH0gZWxzZSBpZiAoJ2dldFByZXZlbnREZWZhdWx0JyBpbiBuYXRpdmVFdmVudCkge1xuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5MTE1MVxuICAgIGlzRGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmdldFByZXZlbnREZWZhdWx0KCkgPyByZXRUcnVlIDogcmV0RmFsc2U7XG4gIH0gZWxzZSBpZiAoJ3JldHVyblZhbHVlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGlzRGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBGQUxTRSA/IHJldFRydWUgOiByZXRGYWxzZTtcbiAgfVxuXG4gIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gaXNEZWZhdWx0UHJldmVudGVkO1xuXG4gIHZhciBmaXhGbnMgPSBbXTtcbiAgdmFyIGZpeEZuID0gdW5kZWZpbmVkO1xuICB2YXIgbCA9IHVuZGVmaW5lZDtcbiAgdmFyIHByb3AgPSB1bmRlZmluZWQ7XG4gIHZhciBwcm9wcyA9IGNvbW1vblByb3BzLmNvbmNhdCgpO1xuXG4gIGV2ZW50Tm9ybWFsaXplcnMuZm9yRWFjaChmdW5jdGlvbiAobm9ybWFsaXplcikge1xuICAgIGlmICh0eXBlLm1hdGNoKG5vcm1hbGl6ZXIucmVnKSkge1xuICAgICAgcHJvcHMgPSBwcm9wcy5jb25jYXQobm9ybWFsaXplci5wcm9wcyk7XG4gICAgICBpZiAobm9ybWFsaXplci5maXgpIHtcbiAgICAgICAgZml4Rm5zLnB1c2gobm9ybWFsaXplci5maXgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgbCA9IHByb3BzLmxlbmd0aDtcblxuICAvLyBjbG9uZSBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3RcbiAgd2hpbGUgKGwpIHtcbiAgICBwcm9wID0gcHJvcHNbLS1sXTtcbiAgICB0aGlzW3Byb3BdID0gbmF0aXZlRXZlbnRbcHJvcF07XG4gIH1cblxuICAvLyBmaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnlcbiAgaWYgKCF0aGlzLnRhcmdldCAmJiBpc05hdGl2ZSkge1xuICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsgLy8gc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRoZXJcbiAgfVxuXG4gIC8vIGNoZWNrIGlmIHRhcmdldCBpcyBhIHRleHQgbm9kZSAoc2FmYXJpKVxuICBpZiAodGhpcy50YXJnZXQgJiYgdGhpcy50YXJnZXQubm9kZVR5cGUgPT09IDMpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRoaXMudGFyZ2V0LnBhcmVudE5vZGU7XG4gIH1cblxuICBsID0gZml4Rm5zLmxlbmd0aDtcblxuICB3aGlsZSAobCkge1xuICAgIGZpeEZuID0gZml4Rm5zWy0tbF07XG4gICAgZml4Rm4odGhpcywgbmF0aXZlRXZlbnQpO1xuICB9XG5cbiAgdGhpcy50aW1lU3RhbXAgPSBuYXRpdmVFdmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTtcbn1cblxudmFyIEV2ZW50QmFzZU9iamVjdFByb3RvID0gX0V2ZW50QmFzZU9iamVjdDJbJ2RlZmF1bHQnXS5wcm90b3R5cGU7XG5cbigwLCBfb2JqZWN0QXNzaWduMlsnZGVmYXVsdCddKShEb21FdmVudE9iamVjdC5wcm90b3R5cGUsIEV2ZW50QmFzZU9iamVjdFByb3RvLCB7XG4gIGNvbnN0cnVjdG9yOiBEb21FdmVudE9iamVjdCxcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdmFyIGUgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gRkFMU0UgKElFKVxuICAgICAgZS5yZXR1cm5WYWx1ZSA9IEZBTFNFO1xuICAgIH1cblxuICAgIEV2ZW50QmFzZU9iamVjdFByb3RvLnByZXZlbnREZWZhdWx0LmNhbGwodGhpcyk7XG4gIH0sXG5cbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdmFyIGUgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIFRSVUUgKElFKVxuICAgICAgZS5jYW5jZWxCdWJibGUgPSBUUlVFO1xuICAgIH1cblxuICAgIEV2ZW50QmFzZU9iamVjdFByb3RvLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO1xuICB9XG59KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRG9tRXZlbnRPYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYWRkLWRvbS1ldmVudC1saXN0ZW5lci9saWIvRXZlbnRPYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQGlnbm9yZVxuICogYmFzZSBldmVudCBvYmplY3QgZm9yIGN1c3RvbSBhbmQgZG9tIGV2ZW50LlxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEJhc2VPYmplY3QoKSB7XG4gIHRoaXMudGltZVN0YW1wID0gRGF0ZS5ub3coKTtcbiAgdGhpcy50YXJnZXQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY3VycmVudFRhcmdldCA9IHVuZGVmaW5lZDtcbn1cblxuRXZlbnRCYXNlT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgaXNFdmVudE9iamVjdDogMSxcblxuICBjb25zdHJ1Y3RvcjogRXZlbnRCYXNlT2JqZWN0LFxuXG4gIGlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsXG5cbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXG4gIGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlO1xuICB9LFxuXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuICB9LFxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuICAgIC8vIGZpeGVkIDEuMlxuICAgIC8vIGNhbGwgc3RvcFByb3BhZ2F0aW9uIGltcGxpY2l0bHlcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9LFxuXG4gIGhhbHQ6IGZ1bmN0aW9uIGhhbHQoaW1tZWRpYXRlKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgdGhpcy5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50QmFzZU9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2FkZC1kb20tZXZlbnQtbGlzdGVuZXIvbGliL0V2ZW50QmFzZU9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBUb09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIGtleXM7XG5cdHZhciB0byA9IFRvT2JqZWN0KHRhcmdldCk7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gYXJndW1lbnRzW3NdO1xuXHRcdGtleXMgPSBPYmplY3Qua2V5cyhPYmplY3QoZnJvbSkpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0b1trZXlzW2ldXSA9IGZyb21ba2V5c1tpXV07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9vYmplY3QtYXNzaWduL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9FdmVudCA9IHJlcXVpcmUoJy4vRXZlbnQnKTtcblxudmFyIF9FdmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9FdmVudCk7XG5cbnZhciBfY29tcG9uZW50Q2xhc3NlcyA9IHJlcXVpcmUoJ2NvbXBvbmVudC1jbGFzc2VzJyk7XG5cbnZhciBfY29tcG9uZW50Q2xhc3NlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnRDbGFzc2VzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlzQ3NzQW5pbWF0aW9uU3VwcG9ydGVkID0gX0V2ZW50Mi5kZWZhdWx0LmVuZEV2ZW50cy5sZW5ndGggIT09IDA7XG5cblxudmFyIGNhcGl0YWxQcmVmaXhlcyA9IFsnV2Via2l0JywgJ01veicsICdPJyxcbi8vIG1zIGlzIHNwZWNpYWwgLi4uLiAhXG4nbXMnXTtcbnZhciBwcmVmaXhlcyA9IFsnLXdlYmtpdC0nLCAnLW1vei0nLCAnLW8tJywgJ21zLScsICcnXTtcblxuZnVuY3Rpb24gZ2V0U3R5bGVQcm9wZXJ0eShub2RlLCBuYW1lKSB7XG4gIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuXG4gIHZhciByZXQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIHJldCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJlZml4ZXNbaV0gKyBuYW1lKTtcbiAgICBpZiAocmV0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZml4QnJvd3NlckJ5VGltZW91dChub2RlKSB7XG4gIGlmIChpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCkge1xuICAgIHZhciB0cmFuc2l0aW9uRGVsYXkgPSBwYXJzZUZsb2F0KGdldFN0eWxlUHJvcGVydHkobm9kZSwgJ3RyYW5zaXRpb24tZGVsYXknKSkgfHwgMDtcbiAgICB2YXIgdHJhbnNpdGlvbkR1cmF0aW9uID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICd0cmFuc2l0aW9uLWR1cmF0aW9uJykpIHx8IDA7XG4gICAgdmFyIGFuaW1hdGlvbkRlbGF5ID0gcGFyc2VGbG9hdChnZXRTdHlsZVByb3BlcnR5KG5vZGUsICdhbmltYXRpb24tZGVsYXknKSkgfHwgMDtcbiAgICB2YXIgYW5pbWF0aW9uRHVyYXRpb24gPSBwYXJzZUZsb2F0KGdldFN0eWxlUHJvcGVydHkobm9kZSwgJ2FuaW1hdGlvbi1kdXJhdGlvbicpKSB8fCAwO1xuICAgIHZhciB0aW1lID0gTWF0aC5tYXgodHJhbnNpdGlvbkR1cmF0aW9uICsgdHJhbnNpdGlvbkRlbGF5LCBhbmltYXRpb25EdXJhdGlvbiArIGFuaW1hdGlvbkRlbGF5KTtcbiAgICAvLyBzb21ldGltZXMsIGJyb3dzZXIgYnVnXG4gICAgbm9kZS5yY0VuZEFuaW1UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLnJjRW5kQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgICAgaWYgKG5vZGUucmNFbmRMaXN0ZW5lcikge1xuICAgICAgICBub2RlLnJjRW5kTGlzdGVuZXIoKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lICogMTAwMCArIDIwMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJCcm93c2VyQnVnVGltZW91dChub2RlKSB7XG4gIGlmIChub2RlLnJjRW5kQW5pbVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQobm9kZS5yY0VuZEFuaW1UaW1lb3V0KTtcbiAgICBub2RlLnJjRW5kQW5pbVRpbWVvdXQgPSBudWxsO1xuICB9XG59XG5cbnZhciBjc3NBbmltYXRpb24gPSBmdW5jdGlvbiBjc3NBbmltYXRpb24obm9kZSwgdHJhbnNpdGlvbk5hbWUsIGVuZENhbGxiYWNrKSB7XG4gIHZhciBuYW1lSXNPYmogPSAodHlwZW9mIHRyYW5zaXRpb25OYW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih0cmFuc2l0aW9uTmFtZSkpID09PSAnb2JqZWN0JztcbiAgdmFyIGNsYXNzTmFtZSA9IG5hbWVJc09iaiA/IHRyYW5zaXRpb25OYW1lLm5hbWUgOiB0cmFuc2l0aW9uTmFtZTtcbiAgdmFyIGFjdGl2ZUNsYXNzTmFtZSA9IG5hbWVJc09iaiA/IHRyYW5zaXRpb25OYW1lLmFjdGl2ZSA6IHRyYW5zaXRpb25OYW1lICsgJy1hY3RpdmUnO1xuICB2YXIgZW5kID0gZW5kQ2FsbGJhY2s7XG4gIHZhciBzdGFydCA9IHZvaWQgMDtcbiAgdmFyIGFjdGl2ZSA9IHZvaWQgMDtcbiAgdmFyIG5vZGVDbGFzc2VzID0gKDAsIF9jb21wb25lbnRDbGFzc2VzMi5kZWZhdWx0KShub2RlKTtcblxuICBpZiAoZW5kQ2FsbGJhY2sgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVuZENhbGxiYWNrKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICBlbmQgPSBlbmRDYWxsYmFjay5lbmQ7XG4gICAgc3RhcnQgPSBlbmRDYWxsYmFjay5zdGFydDtcbiAgICBhY3RpdmUgPSBlbmRDYWxsYmFjay5hY3RpdmU7XG4gIH1cblxuICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gIH1cblxuICBub2RlLnJjRW5kTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUucmNBbmltVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KG5vZGUucmNBbmltVGltZW91dCk7XG4gICAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGNsZWFyQnJvd3NlckJ1Z1RpbWVvdXQobm9kZSk7XG5cbiAgICBub2RlQ2xhc3Nlcy5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICBub2RlQ2xhc3Nlcy5yZW1vdmUoYWN0aXZlQ2xhc3NOYW1lKTtcblxuICAgIF9FdmVudDIuZGVmYXVsdC5yZW1vdmVFbmRFdmVudExpc3RlbmVyKG5vZGUsIG5vZGUucmNFbmRMaXN0ZW5lcik7XG4gICAgbm9kZS5yY0VuZExpc3RlbmVyID0gbnVsbDtcblxuICAgIC8vIFVzdWFsbHkgdGhpcyBvcHRpb25hbCBlbmQgaXMgdXNlZCBmb3IgaW5mb3JtaW5nIGFuIG93bmVyIG9mXG4gICAgLy8gYSBsZWF2ZSBhbmltYXRpb24gYW5kIHRlbGxpbmcgaXQgdG8gcmVtb3ZlIHRoZSBjaGlsZC5cbiAgICBpZiAoZW5kKSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH07XG5cbiAgX0V2ZW50Mi5kZWZhdWx0LmFkZEVuZEV2ZW50TGlzdGVuZXIobm9kZSwgbm9kZS5yY0VuZExpc3RlbmVyKTtcblxuICBpZiAoc3RhcnQpIHtcbiAgICBzdGFydCgpO1xuICB9XG4gIG5vZGVDbGFzc2VzLmFkZChjbGFzc05hbWUpO1xuXG4gIG5vZGUucmNBbmltVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIG5vZGUucmNBbmltVGltZW91dCA9IG51bGw7XG4gICAgbm9kZUNsYXNzZXMuYWRkKGFjdGl2ZUNsYXNzTmFtZSk7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgc2V0VGltZW91dChhY3RpdmUsIDApO1xuICAgIH1cbiAgICBmaXhCcm93c2VyQnlUaW1lb3V0KG5vZGUpO1xuICAgIC8vIDMwbXMgZm9yIGZpcmVmb3hcbiAgfSwgMzApO1xuXG4gIHJldHVybiB7XG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmIChub2RlLnJjRW5kTGlzdGVuZXIpIHtcbiAgICAgICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuY3NzQW5pbWF0aW9uLnN0eWxlID0gZnVuY3Rpb24gKG5vZGUsIHN0eWxlLCBjYWxsYmFjaykge1xuICBpZiAobm9kZS5yY0VuZExpc3RlbmVyKSB7XG4gICAgbm9kZS5yY0VuZExpc3RlbmVyKCk7XG4gIH1cblxuICBub2RlLnJjRW5kTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUucmNBbmltVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KG5vZGUucmNBbmltVGltZW91dCk7XG4gICAgICBub2RlLnJjQW5pbVRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIGNsZWFyQnJvd3NlckJ1Z1RpbWVvdXQobm9kZSk7XG5cbiAgICBfRXZlbnQyLmRlZmF1bHQucmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBub2RlLnJjRW5kTGlzdGVuZXIpO1xuICAgIG5vZGUucmNFbmRMaXN0ZW5lciA9IG51bGw7XG5cbiAgICAvLyBVc3VhbGx5IHRoaXMgb3B0aW9uYWwgY2FsbGJhY2sgaXMgdXNlZCBmb3IgaW5mb3JtaW5nIGFuIG93bmVyIG9mXG4gICAgLy8gYSBsZWF2ZSBhbmltYXRpb24gYW5kIHRlbGxpbmcgaXQgdG8gcmVtb3ZlIHRoZSBjaGlsZC5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuXG4gIF9FdmVudDIuZGVmYXVsdC5hZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIG5vZGUucmNFbmRMaXN0ZW5lcik7XG5cbiAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyBpbiBzdHlsZSkge1xuICAgICAgaWYgKHN0eWxlLmhhc093blByb3BlcnR5KHMpKSB7XG4gICAgICAgIG5vZGUuc3R5bGVbc10gPSBzdHlsZVtzXTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5yY0FuaW1UaW1lb3V0ID0gbnVsbDtcbiAgICBmaXhCcm93c2VyQnlUaW1lb3V0KG5vZGUpO1xuICB9LCAwKTtcbn07XG5cbmNzc0FuaW1hdGlvbi5zZXRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKG5vZGUsIHAsIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eSA9IHA7XG4gIHZhciB2ID0gdmFsdWU7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdiA9IHByb3BlcnR5O1xuICAgIHByb3BlcnR5ID0gJyc7XG4gIH1cbiAgcHJvcGVydHkgPSBwcm9wZXJ0eSB8fCAnJztcbiAgY2FwaXRhbFByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIG5vZGUuc3R5bGVbcHJlZml4ICsgJ1RyYW5zaXRpb24nICsgcHJvcGVydHldID0gdjtcbiAgfSk7XG59O1xuXG5jc3NBbmltYXRpb24uaXNDc3NBbmltYXRpb25TdXBwb3J0ZWQgPSBpc0Nzc0FuaW1hdGlvblN1cHBvcnRlZDtcblxuZXhwb3J0cy5kZWZhdWx0ID0gY3NzQW5pbWF0aW9uO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL2Nzc0FuaW1hdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEVWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uZW5kOiB7XG4gICAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnLFxuICAgIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICBNb3pUcmFuc2l0aW9uOiAnbW96VHJhbnNpdGlvbkVuZCcsXG4gICAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgbXNUcmFuc2l0aW9uOiAnTVNUcmFuc2l0aW9uRW5kJ1xuICB9LFxuXG4gIGFuaW1hdGlvbmVuZDoge1xuICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcsXG4gICAgV2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICBNb3pBbmltYXRpb246ICdtb3pBbmltYXRpb25FbmQnLFxuICAgIE9BbmltYXRpb246ICdvQW5pbWF0aW9uRW5kJyxcbiAgICBtc0FuaW1hdGlvbjogJ01TQW5pbWF0aW9uRW5kJ1xuICB9XG59O1xuXG52YXIgZW5kRXZlbnRzID0gW107XG5cbmZ1bmN0aW9uIGRldGVjdEV2ZW50cygpIHtcbiAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB2YXIgc3R5bGUgPSB0ZXN0RWwuc3R5bGU7XG5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIEVWRU5UX05BTUVfTUFQLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gIH1cblxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIEVWRU5UX05BTUVfTUFQLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxuXG4gIGZvciAodmFyIGJhc2VFdmVudE5hbWUgaW4gRVZFTlRfTkFNRV9NQVApIHtcbiAgICBpZiAoRVZFTlRfTkFNRV9NQVAuaGFzT3duUHJvcGVydHkoYmFzZUV2ZW50TmFtZSkpIHtcbiAgICAgIHZhciBiYXNlRXZlbnRzID0gRVZFTlRfTkFNRV9NQVBbYmFzZUV2ZW50TmFtZV07XG4gICAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gYmFzZUV2ZW50cykge1xuICAgICAgICBpZiAoc3R5bGVOYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgZW5kRXZlbnRzLnB1c2goYmFzZUV2ZW50c1tzdHlsZU5hbWVdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICBkZXRlY3RFdmVudHMoKTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcikge1xuICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudExpc3RlbmVyLCBmYWxzZSk7XG59XG5cbnZhciBUcmFuc2l0aW9uRXZlbnRzID0ge1xuICBhZGRFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoZXZlbnRMaXN0ZW5lciwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbmRFdmVudCkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBlbmRFdmVudCwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfSk7XG4gIH0sXG5cblxuICBlbmRFdmVudHM6IGVuZEV2ZW50cyxcblxuICByZW1vdmVFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFbmRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW5kRXZlbnQpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZW5kRXZlbnQsIGV2ZW50TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBUcmFuc2l0aW9uRXZlbnRzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL0V2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSA0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudHJ5IHtcbiAgdmFyIGluZGV4ID0gcmVxdWlyZSgnaW5kZXhvZicpO1xufSBjYXRjaCAoZXJyKSB7XG4gIHZhciBpbmRleCA9IHJlcXVpcmUoJ2NvbXBvbmVudC1pbmRleG9mJyk7XG59XG5cbi8qKlxuICogV2hpdGVzcGFjZSByZWdleHAuXG4gKi9cblxudmFyIHJlID0gL1xccysvO1xuXG4vKipcbiAqIHRvU3RyaW5nIHJlZmVyZW5jZS5cbiAqL1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIFdyYXAgYGVsYCBpbiBhIGBDbGFzc0xpc3RgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihlbCl7XG4gIHJldHVybiBuZXcgQ2xhc3NMaXN0KGVsKTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBDbGFzc0xpc3QgZm9yIGBlbGAuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KGVsKSB7XG4gIGlmICghZWwgfHwgIWVsLm5vZGVUeXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIERPTSBlbGVtZW50IHJlZmVyZW5jZSBpcyByZXF1aXJlZCcpO1xuICB9XG4gIHRoaXMuZWwgPSBlbDtcbiAgdGhpcy5saXN0ID0gZWwuY2xhc3NMaXN0O1xufVxuXG4vKipcbiAqIEFkZCBjbGFzcyBgbmFtZWAgaWYgbm90IGFscmVhZHkgcHJlc2VudC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKG5hbWUpe1xuICAvLyBjbGFzc0xpc3RcbiAgaWYgKHRoaXMubGlzdCkge1xuICAgIHRoaXMubGlzdC5hZGQobmFtZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBmYWxsYmFja1xuICB2YXIgYXJyID0gdGhpcy5hcnJheSgpO1xuICB2YXIgaSA9IGluZGV4KGFyciwgbmFtZSk7XG4gIGlmICghfmkpIGFyci5wdXNoKG5hbWUpO1xuICB0aGlzLmVsLmNsYXNzTmFtZSA9IGFyci5qb2luKCcgJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgY2xhc3MgYG5hbWVgIHdoZW4gcHJlc2VudCwgb3JcbiAqIHBhc3MgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmVtb3ZlXG4gKiBhbnkgd2hpY2ggbWF0Y2guXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBuYW1lXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNsYXNzTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24obmFtZSl7XG4gIGlmICgnW29iamVjdCBSZWdFeHBdJyA9PSB0b1N0cmluZy5jYWxsKG5hbWUpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTWF0Y2hpbmcobmFtZSk7XG4gIH1cblxuICAvLyBjbGFzc0xpc3RcbiAgaWYgKHRoaXMubGlzdCkge1xuICAgIHRoaXMubGlzdC5yZW1vdmUobmFtZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBmYWxsYmFja1xuICB2YXIgYXJyID0gdGhpcy5hcnJheSgpO1xuICB2YXIgaSA9IGluZGV4KGFyciwgbmFtZSk7XG4gIGlmICh+aSkgYXJyLnNwbGljZShpLCAxKTtcbiAgdGhpcy5lbC5jbGFzc05hbWUgPSBhcnIuam9pbignICcpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBjbGFzc2VzIG1hdGNoaW5nIGByZWAuXG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IHJlXG4gKiBAcmV0dXJuIHtDbGFzc0xpc3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLnJlbW92ZU1hdGNoaW5nID0gZnVuY3Rpb24ocmUpe1xuICB2YXIgYXJyID0gdGhpcy5hcnJheSgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZS50ZXN0KGFycltpXSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlKGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgY2xhc3MgYG5hbWVgLCBjYW4gZm9yY2Ugc3RhdGUgdmlhIGBmb3JjZWAuXG4gKlxuICogRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjbGFzc0xpc3QsIGJ1dCBkbyBub3Qgc3VwcG9ydCBgZm9yY2VgIHlldCxcbiAqIHRoZSBtaXN0YWtlIHdpbGwgYmUgZGV0ZWN0ZWQgYW5kIGNvcnJlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBmb3JjZVxuICogQHJldHVybiB7Q2xhc3NMaXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKG5hbWUsIGZvcmNlKXtcbiAgLy8gY2xhc3NMaXN0XG4gIGlmICh0aGlzLmxpc3QpIHtcbiAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGZvcmNlKSB7XG4gICAgICBpZiAoZm9yY2UgIT09IHRoaXMubGlzdC50b2dnbGUobmFtZSwgZm9yY2UpKSB7XG4gICAgICAgIHRoaXMubGlzdC50b2dnbGUobmFtZSk7IC8vIHRvZ2dsZSBhZ2FpbiB0byBjb3JyZWN0XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlzdC50b2dnbGUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZmFsbGJhY2tcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBmb3JjZSkge1xuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZChuYW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuaGFzKG5hbWUpKSB7XG4gICAgICB0aGlzLnJlbW92ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGQobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiBjbGFzc2VzLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5DbGFzc0xpc3QucHJvdG90eXBlLmFycmF5ID0gZnVuY3Rpb24oKXtcbiAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnO1xuICB2YXIgc3RyID0gY2xhc3NOYW1lLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgdmFyIGFyciA9IHN0ci5zcGxpdChyZSk7XG4gIGlmICgnJyA9PT0gYXJyWzBdKSBhcnIuc2hpZnQoKTtcbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgY2xhc3MgYG5hbWVgIGlzIHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0NsYXNzTGlzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ2xhc3NMaXN0LnByb3RvdHlwZS5oYXMgPVxuQ2xhc3NMaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gdGhpcy5saXN0XG4gICAgPyB0aGlzLmxpc3QuY29udGFpbnMobmFtZSlcbiAgICA6ICEhIH5pbmRleCh0aGlzLmFycmF5KCksIG5hbWUpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21wb25lbnQtY2xhc3Nlcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhcnIsIG9iail7XG4gIGlmIChhcnIuaW5kZXhPZikgcmV0dXJuIGFyci5pbmRleE9mKG9iaik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGFycltpXSA9PT0gb2JqKSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb21wb25lbnQtaW5kZXhvZi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdG9BcnJheTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0LnB1c2goYyk7XG4gIH0pO1xuICByZXR1cm4gcmV0O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW5wZXItYmVlLWNvcmUvbGliL3RvQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX2RvbUFsaWduID0gcmVxdWlyZSgnZG9tLWFsaWduJyk7XG5cbnZhciBfZG9tQWxpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZG9tQWxpZ24pO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCcuL2FkZEV2ZW50TGlzdGVuZXInKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZEV2ZW50TGlzdGVuZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vL2ltcG9ydCBpc1dpbmRvdyBmcm9tICcuL2lzV2luZG93JztcblxuZnVuY3Rpb24gaXNXaW5kb3cob2JqKSB7XG4gIC8qIGVzbGludCBuby1lcS1udWxsOiAwICovXG4gIC8qIGVzbGludCBlcWVxZXE6IDAgKi9cbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93O1xufVxuXG5mdW5jdGlvbiBidWZmZXIoZm4sIG1zKSB7XG4gIHZhciB0aW1lciA9IHZvaWQgMDtcblxuICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYnVmZmVyRm4oKSB7XG4gICAgY2xlYXIoKTtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZm4sIG1zKTtcbiAgfVxuXG4gIGJ1ZmZlckZuLmNsZWFyID0gY2xlYXI7XG5cbiAgcmV0dXJuIGJ1ZmZlckZuO1xufVxuXG52YXIgQWxpZ24gPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlQ2xhc3Moe1xuICBwcm9wVHlwZXM6IHtcbiAgICBjaGlsZHJlblByb3BzOiBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdCxcbiAgICBhbGlnbjogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB0YXJnZXQ6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgICBvbkFsaWduOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gICAgbW9uaXRvckJ1ZmZlclRpbWU6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgIG1vbml0b3JXaW5kb3dSZXNpemU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlZDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICAgIGNoaWxkcmVuOiBfcmVhY3QuUHJvcFR5cGVzLmFueVxuICB9LFxuXG4gIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGZ1bmN0aW9uIHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgIH0sXG4gICAgICBvbkFsaWduOiBmdW5jdGlvbiBvbkFsaWduKCkge30sXG5cbiAgICAgIG1vbml0b3JCdWZmZXJUaW1lOiA1MCxcbiAgICAgIG1vbml0b3JXaW5kb3dSZXNpemU6IGZhbHNlLFxuICAgICAgZGlzYWJsZWQ6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgLy8gaWYgcGFyZW50IHJlZiBub3QgYXR0YWNoZWQgLi4uLiB1c2UgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWRcbiAgICB0aGlzLmZvcmNlQWxpZ24oKTtcbiAgICBpZiAoIXByb3BzLmRpc2FibGVkICYmIHByb3BzLm1vbml0b3JXaW5kb3dSZXNpemUpIHtcbiAgICAgIHRoaXMuc3RhcnRNb25pdG9yV2luZG93UmVzaXplKCk7XG4gICAgfVxuICB9LFxuICBjb21wb25lbnREaWRVcGRhdGU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgcmVBbGlnbiA9IGZhbHNlO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAoIXByb3BzLmRpc2FibGVkKSB7XG4gICAgICBpZiAocHJldlByb3BzLmRpc2FibGVkIHx8IHByZXZQcm9wcy5hbGlnbiAhPT0gcHJvcHMuYWxpZ24pIHtcbiAgICAgICAgcmVBbGlnbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbGFzdFRhcmdldCA9IHByZXZQcm9wcy50YXJnZXQoKTtcbiAgICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBwcm9wcy50YXJnZXQoKTtcbiAgICAgICAgaWYgKGlzV2luZG93KGxhc3RUYXJnZXQpICYmIGlzV2luZG93KGN1cnJlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgcmVBbGlnbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RUYXJnZXQgIT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICByZUFsaWduID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZUFsaWduKSB7XG4gICAgICB0aGlzLmZvcmNlQWxpZ24oKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubW9uaXRvcldpbmRvd1Jlc2l6ZSAmJiAhcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc3RhcnRNb25pdG9yV2luZG93UmVzaXplKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcE1vbml0b3JXaW5kb3dSZXNpemUoKTtcbiAgICB9XG4gIH0sXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnN0b3BNb25pdG9yV2luZG93UmVzaXplKCk7XG4gIH0sXG4gIHN0YXJ0TW9uaXRvcldpbmRvd1Jlc2l6ZTogZnVuY3Rpb24gc3RhcnRNb25pdG9yV2luZG93UmVzaXplKCkge1xuICAgIGlmICghdGhpcy5yZXNpemVIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlck1vbml0b3IgPSBidWZmZXIodGhpcy5mb3JjZUFsaWduLCB0aGlzLnByb3BzLm1vbml0b3JCdWZmZXJUaW1lKTtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkod2luZG93LCAncmVzaXplJywgdGhpcy5idWZmZXJNb25pdG9yKTtcbiAgICB9XG4gIH0sXG4gIHN0b3BNb25pdG9yV2luZG93UmVzaXplOiBmdW5jdGlvbiBzdG9wTW9uaXRvcldpbmRvd1Jlc2l6ZSgpIHtcbiAgICBpZiAodGhpcy5yZXNpemVIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlck1vbml0b3IuY2xlYXIoKTtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlci5yZW1vdmUoKTtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9LFxuICBmb3JjZUFsaWduOiBmdW5jdGlvbiBmb3JjZUFsaWduKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgdmFyIHNvdXJjZSA9IF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICAgIHByb3BzLm9uQWxpZ24oc291cmNlLCAoMCwgX2RvbUFsaWduMi5kZWZhdWx0KShzb3VyY2UsIHByb3BzLnRhcmdldCgpLCBwcm9wcy5hbGlnbikpO1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuUHJvcHMgPSBfcHJvcHMuY2hpbGRyZW5Qcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QyLmRlZmF1bHQuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgaWYgKGNoaWxkcmVuUHJvcHMpIHtcbiAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBjaGlsZHJlblByb3BzKSB7XG4gICAgICAgIGlmIChjaGlsZHJlblByb3BzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgbmV3UHJvcHNbcHJvcF0gPSB0aGlzLnByb3BzW2NoaWxkcmVuUHJvcHNbcHJvcF1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNsb25lRWxlbWVudChjaGlsZCwgbmV3UHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBBbGlnbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdGlucGVyLWJlZS1jb3JlL2xpYi9BbGlnbi5qc1xuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX3V0aWxzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxzKTtcblxudmFyIF9nZXRPZmZzZXRQYXJlbnQgPSByZXF1aXJlKCcuL2dldE9mZnNldFBhcmVudCcpO1xuXG52YXIgX2dldE9mZnNldFBhcmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRPZmZzZXRQYXJlbnQpO1xuXG52YXIgX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCA9IHJlcXVpcmUoJy4vZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50Jyk7XG5cbnZhciBfZ2V0VmlzaWJsZVJlY3RGb3JFbGVtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCk7XG5cbnZhciBfYWRqdXN0Rm9yVmlld3BvcnQgPSByZXF1aXJlKCcuL2FkanVzdEZvclZpZXdwb3J0Jyk7XG5cbnZhciBfYWRqdXN0Rm9yVmlld3BvcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRqdXN0Rm9yVmlld3BvcnQpO1xuXG52YXIgX2dldFJlZ2lvbiA9IHJlcXVpcmUoJy4vZ2V0UmVnaW9uJyk7XG5cbnZhciBfZ2V0UmVnaW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldFJlZ2lvbik7XG5cbnZhciBfZ2V0RWxGdXR1cmVQb3MgPSByZXF1aXJlKCcuL2dldEVsRnV0dXJlUG9zJyk7XG5cbnZhciBfZ2V0RWxGdXR1cmVQb3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0RWxGdXR1cmVQb3MpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLy8gaHR0cDovL3lpbWluZ2hlLml0ZXllLmNvbS9ibG9nLzExMjQ3MjBcblxuLyoqXG4gKiBhbGlnbiBkb20gbm9kZSBmbGV4aWJseVxuICogQGF1dGhvciB5aW1pbmdoZUBnbWFpbC5jb21cbiAqL1xuXG5mdW5jdGlvbiBpc0ZhaWxYKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpIHtcbiAgcmV0dXJuIGVsRnV0dXJlUG9zLmxlZnQgPCB2aXNpYmxlUmVjdC5sZWZ0IHx8IGVsRnV0dXJlUG9zLmxlZnQgKyBlbFJlZ2lvbi53aWR0aCA+IHZpc2libGVSZWN0LnJpZ2h0O1xufVxuXG5mdW5jdGlvbiBpc0ZhaWxZKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpIHtcbiAgcmV0dXJuIGVsRnV0dXJlUG9zLnRvcCA8IHZpc2libGVSZWN0LnRvcCB8fCBlbEZ1dHVyZVBvcy50b3AgKyBlbFJlZ2lvbi5oZWlnaHQgPiB2aXNpYmxlUmVjdC5ib3R0b207XG59XG5cbmZ1bmN0aW9uIGlzQ29tcGxldGVGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSB7XG4gIHJldHVybiBlbEZ1dHVyZVBvcy5sZWZ0ID4gdmlzaWJsZVJlY3QucmlnaHQgfHwgZWxGdXR1cmVQb3MubGVmdCArIGVsUmVnaW9uLndpZHRoIDwgdmlzaWJsZVJlY3QubGVmdDtcbn1cblxuZnVuY3Rpb24gaXNDb21wbGV0ZUZhaWxZKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpIHtcbiAgcmV0dXJuIGVsRnV0dXJlUG9zLnRvcCA+IHZpc2libGVSZWN0LmJvdHRvbSB8fCBlbEZ1dHVyZVBvcy50b3AgKyBlbFJlZ2lvbi5oZWlnaHQgPCB2aXNpYmxlUmVjdC50b3A7XG59XG5cbmZ1bmN0aW9uIGZsaXAocG9pbnRzLCByZWcsIG1hcCkge1xuICB2YXIgcmV0ID0gW107XG4gIF91dGlsczJbXCJkZWZhdWx0XCJdLmVhY2gocG9pbnRzLCBmdW5jdGlvbiAocCkge1xuICAgIHJldC5wdXNoKHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gbWFwW21dO1xuICAgIH0pKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZsaXBPZmZzZXQob2Zmc2V0LCBpbmRleCkge1xuICBvZmZzZXRbaW5kZXhdID0gLW9mZnNldFtpbmRleF07XG4gIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRPZmZzZXQoc3RyLCBvZmZzZXRMZW4pIHtcbiAgdmFyIG4gPSB2b2lkIDA7XG4gIGlmICgvJSQvLnRlc3Qoc3RyKSkge1xuICAgIG4gPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGggLSAxKSwgMTApIC8gMTAwICogb2Zmc2V0TGVuO1xuICB9IGVsc2Uge1xuICAgIG4gPSBwYXJzZUludChzdHIsIDEwKTtcbiAgfVxuICByZXR1cm4gbiB8fCAwO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPZmZzZXQob2Zmc2V0LCBlbCkge1xuICBvZmZzZXRbMF0gPSBjb252ZXJ0T2Zmc2V0KG9mZnNldFswXSwgZWwud2lkdGgpO1xuICBvZmZzZXRbMV0gPSBjb252ZXJ0T2Zmc2V0KG9mZnNldFsxXSwgZWwuaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gZG9tQWxpZ24oZWwsIHJlZk5vZGUsIGFsaWduKSB7XG4gIHZhciBwb2ludHMgPSBhbGlnbi5wb2ludHM7XG4gIHZhciBvZmZzZXQgPSBhbGlnbi5vZmZzZXQgfHwgWzAsIDBdO1xuICB2YXIgdGFyZ2V0T2Zmc2V0ID0gYWxpZ24udGFyZ2V0T2Zmc2V0IHx8IFswLCAwXTtcbiAgdmFyIG92ZXJmbG93ID0gYWxpZ24ub3ZlcmZsb3c7XG4gIHZhciB0YXJnZXQgPSBhbGlnbi50YXJnZXQgfHwgcmVmTm9kZTtcbiAgdmFyIHNvdXJjZSA9IGFsaWduLnNvdXJjZSB8fCBlbDtcbiAgb2Zmc2V0ID0gW10uY29uY2F0KG9mZnNldCk7XG4gIHRhcmdldE9mZnNldCA9IFtdLmNvbmNhdCh0YXJnZXRPZmZzZXQpO1xuICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8IHt9O1xuICB2YXIgbmV3T3ZlcmZsb3dDZmcgPSB7fTtcblxuICB2YXIgZmFpbCA9IDA7XG4gIC8vIOW9k+WJjeiKgueCueWPr+S7peiiq+aUvue9rueahOaYvuekuuWMuuWfn1xuICB2YXIgdmlzaWJsZVJlY3QgPSAoMCwgX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudDJbXCJkZWZhdWx0XCJdKShzb3VyY2UpO1xuICAvLyDlvZPliY3oioLngrnmiYDljaDnmoTljLrln58sIGxlZnQvdG9wL3dpZHRoL2hlaWdodFxuICB2YXIgZWxSZWdpb24gPSAoMCwgX2dldFJlZ2lvbjJbXCJkZWZhdWx0XCJdKShzb3VyY2UpO1xuICAvLyDlj4LnhafoioLngrnmiYDljaDnmoTljLrln58sIGxlZnQvdG9wL3dpZHRoL2hlaWdodFxuICB2YXIgcmVmTm9kZVJlZ2lvbiA9ICgwLCBfZ2V0UmVnaW9uMltcImRlZmF1bHRcIl0pKHRhcmdldCk7XG4gIC8vIOWwhiBvZmZzZXQg6L2s5o2i5oiQ5pWw5YC877yM5pSv5oyB55m+5YiG5q+UXG4gIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQsIGVsUmVnaW9uKTtcbiAgbm9ybWFsaXplT2Zmc2V0KHRhcmdldE9mZnNldCwgcmVmTm9kZVJlZ2lvbik7XG4gIC8vIOW9k+WJjeiKgueCueWwhuimgeiiq+aUvue9rueahOS9jee9rlxuICB2YXIgZWxGdXR1cmVQb3MgPSAoMCwgX2dldEVsRnV0dXJlUG9zMltcImRlZmF1bHRcIl0pKGVsUmVnaW9uLCByZWZOb2RlUmVnaW9uLCBwb2ludHMsIG9mZnNldCwgdGFyZ2V0T2Zmc2V0KTtcbiAgLy8g5b2T5YmN6IqC54K55bCG6KaB5omA5aSE55qE5Yy65Z+fXG4gIHZhciBuZXdFbFJlZ2lvbiA9IF91dGlsczJbXCJkZWZhdWx0XCJdLm1lcmdlKGVsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7XG5cbiAgLy8g5aaC5p6c5Y+v6KeG5Yy65Z+f5LiN6IO95a6M5YWo5pS+572u5b2T5YmN6IqC54K55pe25YWB6K646LCD5pW0XG4gIGlmICh2aXNpYmxlUmVjdCAmJiAob3ZlcmZsb3cuYWRqdXN0WCB8fCBvdmVyZmxvdy5hZGp1c3RZKSkge1xuICAgIGlmIChvdmVyZmxvdy5hZGp1c3RYKSB7XG4gICAgICAvLyDlpoLmnpzmqKrlkJHkuI3og73mlL7kuItcbiAgICAgIGlmIChpc0ZhaWxYKGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QpKSB7XG4gICAgICAgIC8vIOWvuem9kOS9jee9ruWPjeS4i1xuICAgICAgICB2YXIgbmV3UG9pbnRzID0gZmxpcChwb2ludHMsIC9bbHJdL2lnLCB7XG4gICAgICAgICAgbDogJ3InLFxuICAgICAgICAgIHI6ICdsJ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8g5YGP56e76YeP5Lmf5Y+N5LiLXG4gICAgICAgIHZhciBuZXdPZmZzZXQgPSBmbGlwT2Zmc2V0KG9mZnNldCwgMCk7XG4gICAgICAgIHZhciBuZXdUYXJnZXRPZmZzZXQgPSBmbGlwT2Zmc2V0KHRhcmdldE9mZnNldCwgMCk7XG4gICAgICAgIHZhciBuZXdFbEZ1dHVyZVBvcyA9ICgwLCBfZ2V0RWxGdXR1cmVQb3MyW1wiZGVmYXVsdFwiXSkoZWxSZWdpb24sIHJlZk5vZGVSZWdpb24sIG5ld1BvaW50cywgbmV3T2Zmc2V0LCBuZXdUYXJnZXRPZmZzZXQpO1xuICAgICAgICBpZiAoIWlzQ29tcGxldGVGYWlsWChuZXdFbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KSkge1xuICAgICAgICAgIGZhaWwgPSAxO1xuICAgICAgICAgIHBvaW50cyA9IG5ld1BvaW50cztcbiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7XG4gICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gbmV3VGFyZ2V0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG92ZXJmbG93LmFkanVzdFkpIHtcbiAgICAgIC8vIOWmguaenOe6teWQkeS4jeiDveaUvuS4i1xuICAgICAgaWYgKGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgLy8g5a+56b2Q5L2N572u5Y+N5LiLXG4gICAgICAgIHZhciBfbmV3UG9pbnRzID0gZmxpcChwb2ludHMsIC9bdGJdL2lnLCB7XG4gICAgICAgICAgdDogJ2InLFxuICAgICAgICAgIGI6ICd0J1xuICAgICAgICB9KTtcbiAgICAgICAgLy8g5YGP56e76YeP5Lmf5Y+N5LiLXG4gICAgICAgIHZhciBfbmV3T2Zmc2V0ID0gZmxpcE9mZnNldChvZmZzZXQsIDEpO1xuICAgICAgICB2YXIgX25ld1RhcmdldE9mZnNldCA9IGZsaXBPZmZzZXQodGFyZ2V0T2Zmc2V0LCAxKTtcbiAgICAgICAgdmFyIF9uZXdFbEZ1dHVyZVBvcyA9ICgwLCBfZ2V0RWxGdXR1cmVQb3MyW1wiZGVmYXVsdFwiXSkoZWxSZWdpb24sIHJlZk5vZGVSZWdpb24sIF9uZXdQb2ludHMsIF9uZXdPZmZzZXQsIF9uZXdUYXJnZXRPZmZzZXQpO1xuICAgICAgICBpZiAoIWlzQ29tcGxldGVGYWlsWShfbmV3RWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCkpIHtcbiAgICAgICAgICBmYWlsID0gMTtcbiAgICAgICAgICBwb2ludHMgPSBfbmV3UG9pbnRzO1xuICAgICAgICAgIG9mZnNldCA9IF9uZXdPZmZzZXQ7XG4gICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gX25ld1RhcmdldE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOWmguaenOWksei0pe+8jOmHjeaWsOiuoeeul+W9k+WJjeiKgueCueWwhuimgeiiq+aUvue9rueahOS9jee9rlxuICAgIGlmIChmYWlsKSB7XG4gICAgICBlbEZ1dHVyZVBvcyA9ICgwLCBfZ2V0RWxGdXR1cmVQb3MyW1wiZGVmYXVsdFwiXSkoZWxSZWdpb24sIHJlZk5vZGVSZWdpb24sIHBvaW50cywgb2Zmc2V0LCB0YXJnZXRPZmZzZXQpO1xuICAgICAgX3V0aWxzMltcImRlZmF1bHRcIl0ubWl4KG5ld0VsUmVnaW9uLCBlbEZ1dHVyZVBvcyk7XG4gICAgfVxuXG4gICAgLy8g5qOA5p+l5Y+N5LiL5ZCO55qE5L2N572u5piv5ZCm5Y+v5Lul5pS+5LiL5LqGXG4gICAgLy8g5aaC5p6c5LuN54S25pS+5LiN5LiL5Y+q5pyJ5oyH5a6a5LqG5Y+v5Lul6LCD5pW05b2T5YmN5pa55ZCR5omN6LCD5pW0XG4gICAgbmV3T3ZlcmZsb3dDZmcuYWRqdXN0WCA9IG92ZXJmbG93LmFkanVzdFggJiYgaXNGYWlsWChlbEZ1dHVyZVBvcywgZWxSZWdpb24sIHZpc2libGVSZWN0KTtcblxuICAgIG5ld092ZXJmbG93Q2ZnLmFkanVzdFkgPSBvdmVyZmxvdy5hZGp1c3RZICYmIGlzRmFpbFkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCk7XG5cbiAgICAvLyDnoa7lrp7opoHosIPmlbTvvIznlJroh7Plj6/og73kvJrosIPmlbTpq5jluqblrr3luqZcbiAgICBpZiAobmV3T3ZlcmZsb3dDZmcuYWRqdXN0WCB8fCBuZXdPdmVyZmxvd0NmZy5hZGp1c3RZKSB7XG4gICAgICBuZXdFbFJlZ2lvbiA9ICgwLCBfYWRqdXN0Rm9yVmlld3BvcnQyW1wiZGVmYXVsdFwiXSkoZWxGdXR1cmVQb3MsIGVsUmVnaW9uLCB2aXNpYmxlUmVjdCwgbmV3T3ZlcmZsb3dDZmcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG5lZWQganVkZ2UgdG8gaW4gY2FzZSBzZXQgZml4ZWQgd2l0aCBpbiBjc3Mgb24gaGVpZ2h0IGF1dG8gZWxlbWVudFxuICBpZiAobmV3RWxSZWdpb24ud2lkdGggIT09IGVsUmVnaW9uLndpZHRoKSB7XG4gICAgX3V0aWxzMltcImRlZmF1bHRcIl0uY3NzKHNvdXJjZSwgJ3dpZHRoJywgX3V0aWxzMltcImRlZmF1bHRcIl0ud2lkdGgoc291cmNlKSArIG5ld0VsUmVnaW9uLndpZHRoIC0gZWxSZWdpb24ud2lkdGgpO1xuICB9XG5cbiAgaWYgKG5ld0VsUmVnaW9uLmhlaWdodCAhPT0gZWxSZWdpb24uaGVpZ2h0KSB7XG4gICAgX3V0aWxzMltcImRlZmF1bHRcIl0uY3NzKHNvdXJjZSwgJ2hlaWdodCcsIF91dGlsczJbXCJkZWZhdWx0XCJdLmhlaWdodChzb3VyY2UpICsgbmV3RWxSZWdpb24uaGVpZ2h0IC0gZWxSZWdpb24uaGVpZ2h0KTtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9raXNzeXRlYW0va2lzc3kvaXNzdWVzLzE5MFxuICAvLyDnm7jlr7nkuo7lsY/luZXkvY3nva7msqHlj5jvvIzogIwgbGVmdC90b3Ag5Y+Y5LqGXG4gIC8vIOS+i+WmgiA8ZGl2ICdyZWxhdGl2ZSc+PGVsIGFic29sdXRlPjwvZGl2PlxuICBfdXRpbHMyW1wiZGVmYXVsdFwiXS5vZmZzZXQoc291cmNlLCB7XG4gICAgbGVmdDogbmV3RWxSZWdpb24ubGVmdCxcbiAgICB0b3A6IG5ld0VsUmVnaW9uLnRvcFxuICB9LCB7XG4gICAgdXNlQ3NzUmlnaHQ6IGFsaWduLnVzZUNzc1JpZ2h0LFxuICAgIHVzZUNzc0JvdHRvbTogYWxpZ24udXNlQ3NzQm90dG9tLFxuICAgIHVzZUNzc1RyYW5zZm9ybTogYWxpZ24udXNlQ3NzVHJhbnNmb3JtXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXQsXG4gICAgb3ZlcmZsb3c6IG5ld092ZXJmbG93Q2ZnXG4gIH07XG59XG5cbmRvbUFsaWduLl9fZ2V0T2Zmc2V0UGFyZW50ID0gX2dldE9mZnNldFBhcmVudDJbXCJkZWZhdWx0XCJdO1xuXG5kb21BbGlnbi5fX2dldFZpc2libGVSZWN0Rm9yRWxlbWVudCA9IF9nZXRWaXNpYmxlUmVjdEZvckVsZW1lbnQyW1wiZGVmYXVsdFwiXTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBkb21BbGlnbjtcbi8qKlxuICogIDIwMTItMDQtMjYgeWltaW5naGVAZ21haWwuY29tXG4gKiAgIC0g5LyY5YyW5pm66IO95a+56b2Q566X5rOVXG4gKiAgIC0g5oWO55SoIHJlc2l6ZVhYXG4gKlxuICogIDIwMTEtMDctMTMgeWltaW5naGVAZ21haWwuY29tIG5vdGU6XG4gKiAgIC0g5aKe5Yqg5pm66IO95a+56b2Q77yM5Lul5Y+K5aSn5bCP6LCD5pW06YCJ6aG5XG4gKiovXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3Byb3BlcnR5VXRpbHMgPSByZXF1aXJlKCcuL3Byb3BlcnR5VXRpbHMnKTtcblxudmFyIFJFX05VTSA9IC9bXFwtK10/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bXFwtK10/XFxkK3wpLy5zb3VyY2U7XG5cbnZhciBnZXRDb21wdXRlZFN0eWxlWCA9IHZvaWQgMDtcblxuZnVuY3Rpb24gZm9yY2UoeCwgeSkge1xuICByZXR1cm4geCArIHk7XG59XG5cbmZ1bmN0aW9uIGNzcyhlbCwgbmFtZSwgdikge1xuICB2YXIgdmFsdWUgPSB2O1xuICBpZiAoKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihuYW1lKSkgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yICh2YXIgaSBpbiBuYW1lKSB7XG4gICAgICBpZiAobmFtZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBjc3MoZWwsIGksIG5hbWVbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgKyAncHgnO1xuICAgIH1cbiAgICBlbC5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVYKGVsLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UG9zaXRpb24oZWxlbSkge1xuICB2YXIgYm94ID0gdm9pZCAwO1xuICB2YXIgeCA9IHZvaWQgMDtcbiAgdmFyIHkgPSB2b2lkIDA7XG4gIHZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIHZhciBkb2NFbGVtID0gZG9jICYmIGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gIC8vIOagueaNriBHQlMg5pyA5paw5pWw5o2u77yMQS1HcmFkZSBCcm93c2VycyDpg73lt7LmlK/mjIEgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IOaWueazle+8jOS4jeeUqOWGjeiAg+iZkeS8oOe7n+eahOWunueOsOaWueW8j1xuICBib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIC8vIOazqO+8mmpRdWVyeSDov5jogIPomZHlh4/ljrsgZG9jRWxlbS5jbGllbnRMZWZ0L2NsaWVudFRvcFxuICAvLyDkvYbmtYvor5Xlj5HnjrDvvIzov5nmoLflj43ogIzkvJrlr7zoh7TlvZMgaHRtbCDlkowgYm9keSDmnInovrnot50v6L655qGG5qC35byP5pe277yM6I635Y+W55qE5YC85LiN5q2j56GuXG4gIC8vIOatpOWklu+8jGllNiDkvJrlv73nlaUgaHRtbCDnmoQgbWFyZ2luIOWAvO+8jOW5uOi/kOWcsOaYr+ayoeacieiwgeS8muWOu+iuvue9riBodG1sIOeahCBtYXJnaW5cblxuICB4ID0gYm94LmxlZnQ7XG4gIHkgPSBib3gudG9wO1xuXG4gIC8vIEluIElFLCBtb3N0IG9mIHRoZSB0aW1lLCAyIGV4dHJhIHBpeGVscyBhcmUgYWRkZWQgdG8gdGhlIHRvcCBhbmQgbGVmdFxuICAvLyBkdWUgdG8gdGhlIGltcGxpY2l0IDItcGl4ZWwgaW5zZXQgYm9yZGVyLiAgSW4gSUU2LzcgcXVpcmtzIG1vZGUgYW5kXG4gIC8vIElFNiBzdGFuZGFyZHMgbW9kZSwgdGhpcyBib3JkZXIgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGVcbiAgLy8gZG9jdW1lbnQgZWxlbWVudCdzIGJvcmRlciB0byB6ZXJvIC0tIHRodXMsIHdlIGNhbm5vdCByZWx5IG9uIHRoZVxuICAvLyBvZmZzZXQgYWx3YXlzIGJlaW5nIDIgcGl4ZWxzLlxuXG4gIC8vIEluIHF1aXJrcyBtb2RlLCB0aGUgb2Zmc2V0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHF1ZXJ5aW5nIHRoZSBib2R5J3NcbiAgLy8gY2xpZW50TGVmdC9jbGllbnRUb3AsIGJ1dCBpbiBzdGFuZGFyZHMgbW9kZSwgaXQgaXMgZm91bmQgYnkgcXVlcnlpbmdcbiAgLy8gdGhlIGRvY3VtZW50IGVsZW1lbnQncyBjbGllbnRMZWZ0L2NsaWVudFRvcC4gIFNpbmNlIHdlIGFscmVhZHkgY2FsbGVkXG4gIC8vIGdldENsaWVudEJvdW5kaW5nUmVjdCB3ZSBoYXZlIGFscmVhZHkgZm9yY2VkIGEgcmVmbG93LCBzbyBpdCBpcyBub3RcbiAgLy8gdG9vIGV4cGVuc2l2ZSBqdXN0IHRvIHF1ZXJ5IHRoZW0gYWxsLlxuXG4gIC8vIGllIOS4i+W6lOivpeWHj+WOu+eql+WPo+eahOi+ueahhuWQp++8jOavleern+m7mOiupCBhYnNvbHV0ZSDpg73mmK/nm7jlr7nnqpflj6PlrprkvY3nmoRcbiAgLy8g56qX5Y+j6L655qGG5qCH5YeG5piv6K6+IGRvY3VtZW50RWxlbWVudCAscXVpcmtzIOaXtuiuvue9riBib2R5XG4gIC8vIOacgOWlveemgeatouWcqCBib2R5IOWSjCBodG1sIOS4iui+ueahhiDvvIzkvYYgaWUgPCA5IGh0bWwg6buY6K6k5pyJIDJweCDvvIzlh4/ljrtcbiAgLy8g5L2G5piv6Z2eIGllIOS4jeWPr+iDveiuvue9rueql+WPo+i+ueahhu+8jGJvZHkgaHRtbCDkuZ/kuI3mmK/nqpflj6MgLGllIOWPr+S7pemAmui/hyBodG1sLGJvZHkg6K6+572uXG4gIC8vIOagh+WHhiBpZSDkuIsgZG9jRWxlbS5jbGllbnRUb3Ag5bCx5pivIGJvcmRlci10b3BcbiAgLy8gaWU3IGh0bWwg5Y2z56qX5Y+j6L655qGG5pS55Y+Y5LiN5LqG44CC5rC46L+c5Li6IDJcbiAgLy8g5L2G5qCH5YeGIGZpcmVmb3gvY2hyb21lL2llOSDkuIsgZG9jRWxlbS5jbGllbnRUb3Ag5piv56qX5Y+j6L655qGG77yM5Y2z5L2/6K6+5LqGIGJvcmRlci10b3Ag5Lmf5Li6IDBcblxuICB4IC09IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcbiAgeSAtPSBkb2NFbGVtLmNsaWVudFRvcCB8fCBib2R5LmNsaWVudFRvcCB8fCAwO1xuXG4gIHJldHVybiB7XG4gICAgbGVmdDogeCxcbiAgICB0b3A6IHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsKHcsIHRvcCkge1xuICB2YXIgcmV0ID0gd1sncGFnZScgKyAodG9wID8gJ1knIDogJ1gnKSArICdPZmZzZXQnXTtcbiAgdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgKHRvcCA/ICdUb3AnIDogJ0xlZnQnKTtcbiAgaWYgKHR5cGVvZiByZXQgIT09ICdudW1iZXInKSB7XG4gICAgdmFyIGQgPSB3LmRvY3VtZW50O1xuICAgIC8vIGllNiw3LDggc3RhbmRhcmQgbW9kZVxuICAgIHJldCA9IGQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiByZXQgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBxdWlya3MgbW9kZVxuICAgICAgcmV0ID0gZC5ib2R5W21ldGhvZF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbExlZnQodykge1xuICByZXR1cm4gZ2V0U2Nyb2xsKHcpO1xufVxuXG5mdW5jdGlvbiBnZXRTY3JvbGxUb3Aodykge1xuICByZXR1cm4gZ2V0U2Nyb2xsKHcsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXQoZWwpIHtcbiAgdmFyIHBvcyA9IGdldENsaWVudFBvc2l0aW9uKGVsKTtcbiAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3ID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIHBvcy5sZWZ0ICs9IGdldFNjcm9sbExlZnQodyk7XG4gIHBvcy50b3AgKz0gZ2V0U2Nyb2xsVG9wKHcpO1xuICByZXR1cm4gcG9zO1xufVxuZnVuY3Rpb24gX2dldENvbXB1dGVkU3R5bGUoZWxlbSwgbmFtZSwgY3MpIHtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBjcztcbiAgdmFyIHZhbCA9ICcnO1xuICB2YXIgZCA9IGVsZW0ub3duZXJEb2N1bWVudDtcbiAgY29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGUgfHwgZC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpO1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9raXNzeXRlYW0va2lzc3kvaXNzdWVzLzYxXG4gIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgdmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpIHx8IGNvbXB1dGVkU3R5bGVbbmFtZV07XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG52YXIgX1JFX05VTV9OT19QWCA9IG5ldyBSZWdFeHAoJ14oJyArIFJFX05VTSArICcpKD8hcHgpW2EteiVdKyQnLCAnaScpO1xudmFyIFJFX1BPUyA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLztcbnZhciBDVVJSRU5UX1NUWUxFID0gJ2N1cnJlbnRTdHlsZSc7XG52YXIgUlVOVElNRV9TVFlMRSA9ICdydW50aW1lU3R5bGUnO1xudmFyIExFRlQgPSAnbGVmdCc7XG52YXIgUFggPSAncHgnO1xuXG5mdW5jdGlvbiBfZ2V0Q29tcHV0ZWRTdHlsZUlFKGVsZW0sIG5hbWUpIHtcbiAgLy8gY3VycmVudFN0eWxlIG1heWJlIG51bGxcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM1MjMxLmFzcHhcbiAgdmFyIHJldCA9IGVsZW1bQ1VSUkVOVF9TVFlMRV0gJiYgZWxlbVtDVVJSRU5UX1NUWUxFXVtuYW1lXTtcblxuICAvLyDlvZMgd2lkdGgvaGVpZ2h0IOiuvue9ruS4uueZvuWIhuavlOaXtu+8jOmAmui/hyBwaXhlbExlZnQg5pa55byP6L2s5o2i55qEIHdpZHRoL2hlaWdodCDlgLxcbiAgLy8g5LiA5byA5aeL5bCx5aSE55CG5LqGISBDVVNUT01fU1RZTEUuaGVpZ2h0LENVU1RPTV9TVFlMRS53aWR0aCAsY3NzSG9vayDop6PlhrNAMjAxMS0wOC0xOVxuICAvLyDlnKggaWUg5LiL5LiN5a+577yM6ZyA6KaB55u05o6l55SoIG9mZnNldCDmlrnlvI9cbiAgLy8gYm9yZGVyV2lkdGgg562J5YC85Lmf5pyJ6Zeu6aKY77yM5L2G6ICD6JmR5YiwIGJvcmRlcldpZHRoIOiuvuS4uueZvuWIhuavlOeahOamgueOh+W+iOWwj++8jOi/memHjOWwseS4jeiAg+iZkeS6hlxuXG4gIC8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcbiAgLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MVxuICAvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXJcbiAgLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzXG4gIC8vIGV4Y2x1ZGUgbGVmdCByaWdodCBmb3IgcmVsYXRpdml0eVxuICBpZiAoX1JFX05VTV9OT19QWC50ZXN0KHJldCkgJiYgIVJFX1BPUy50ZXN0KG5hbWUpKSB7XG4gICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuICAgIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7XG4gICAgdmFyIGxlZnQgPSBzdHlsZVtMRUZUXTtcbiAgICB2YXIgcnNMZWZ0ID0gZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXTtcblxuICAgIC8vIHByZXZlbnQgZmxhc2hpbmcgb2YgY29udGVudFxuICAgIGVsZW1bUlVOVElNRV9TVFlMRV1bTEVGVF0gPSBlbGVtW0NVUlJFTlRfU1RZTEVdW0xFRlRdO1xuXG4gICAgLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuICAgIHN0eWxlW0xFRlRdID0gbmFtZSA9PT0gJ2ZvbnRTaXplJyA/ICcxZW0nIDogcmV0IHx8IDA7XG4gICAgcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgUFg7XG5cbiAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG4gICAgc3R5bGVbTEVGVF0gPSBsZWZ0O1xuXG4gICAgZWxlbVtSVU5USU1FX1NUWUxFXVtMRUZUXSA9IHJzTGVmdDtcbiAgfVxuICByZXR1cm4gcmV0ID09PSAnJyA/ICdhdXRvJyA6IHJldDtcbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIGdldENvbXB1dGVkU3R5bGVYID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyBfZ2V0Q29tcHV0ZWRTdHlsZSA6IF9nZXRDb21wdXRlZFN0eWxlSUU7XG59XG5cbmZ1bmN0aW9uIGdldE9mZnNldERpcmVjdGlvbihkaXIsIG9wdGlvbikge1xuICBpZiAoZGlyID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gb3B0aW9uLnVzZUNzc1JpZ2h0ID8gJ3JpZ2h0JyA6IGRpcjtcbiAgfVxuICByZXR1cm4gb3B0aW9uLnVzZUNzc0JvdHRvbSA/ICdib3R0b20nIDogZGlyO1xufVxuXG5mdW5jdGlvbiBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbihkaXIpIHtcbiAgaWYgKGRpciA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuICdyaWdodCc7XG4gIH0gZWxzZSBpZiAoZGlyID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICdsZWZ0JztcbiAgfSBlbHNlIGlmIChkaXIgPT09ICd0b3AnKSB7XG4gICAgcmV0dXJuICdib3R0b20nO1xuICB9IGVsc2UgaWYgKGRpciA9PT0gJ2JvdHRvbScpIHtcbiAgICByZXR1cm4gJ3RvcCc7XG4gIH1cbn1cblxuLy8g6K6+572uIGVsZW0g55u45a+5IGVsZW0ub3duZXJEb2N1bWVudCDnmoTlnZDmoIdcbmZ1bmN0aW9uIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pIHtcbiAgLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuICBpZiAoY3NzKGVsZW0sICdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgIGVsZW0uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICB9XG4gIHZhciBwcmVzZXRIID0gLTk5OTtcbiAgdmFyIHByZXNldFYgPSAtOTk5O1xuICB2YXIgaG9yaXpvbnRhbFByb3BlcnR5ID0gZ2V0T2Zmc2V0RGlyZWN0aW9uKCdsZWZ0Jywgb3B0aW9uKTtcbiAgdmFyIHZlcnRpY2FsUHJvcGVydHkgPSBnZXRPZmZzZXREaXJlY3Rpb24oJ3RvcCcsIG9wdGlvbik7XG4gIHZhciBvcHBvc2l0ZUhvcml6b250YWxQcm9wZXJ0eSA9IG9wcG9zaXRlT2Zmc2V0RGlyZWN0aW9uKGhvcml6b250YWxQcm9wZXJ0eSk7XG4gIHZhciBvcHBvc2l0ZVZlcnRpY2FsUHJvcGVydHkgPSBvcHBvc2l0ZU9mZnNldERpcmVjdGlvbih2ZXJ0aWNhbFByb3BlcnR5KTtcblxuICBpZiAoaG9yaXpvbnRhbFByb3BlcnR5ICE9PSAnbGVmdCcpIHtcbiAgICBwcmVzZXRIID0gOTk5O1xuICB9XG5cbiAgaWYgKHZlcnRpY2FsUHJvcGVydHkgIT09ICd0b3AnKSB7XG4gICAgcHJlc2V0ViA9IDk5OTtcbiAgfVxuICB2YXIgb3JpZ2luYWxUcmFuc2l0aW9uID0gJyc7XG4gIHZhciBvcmlnaW5hbE9mZnNldCA9IGdldE9mZnNldChlbGVtKTtcbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQgfHwgJ3RvcCcgaW4gb2Zmc2V0KSB7XG4gICAgb3JpZ2luYWxUcmFuc2l0aW9uID0gKDAsIF9wcm9wZXJ0eVV0aWxzLmdldFRyYW5zaXRpb25Qcm9wZXJ0eSkoZWxlbSkgfHwgJyc7XG4gICAgKDAsIF9wcm9wZXJ0eVV0aWxzLnNldFRyYW5zaXRpb25Qcm9wZXJ0eSkoZWxlbSwgJ25vbmUnKTtcbiAgfVxuICBpZiAoJ2xlZnQnIGluIG9mZnNldCkge1xuICAgIGVsZW0uc3R5bGVbb3Bwb3NpdGVIb3Jpem9udGFsUHJvcGVydHldID0gJyc7XG4gICAgZWxlbS5zdHlsZVtob3Jpem9udGFsUHJvcGVydHldID0gcHJlc2V0SCArICdweCc7XG4gIH1cbiAgaWYgKCd0b3AnIGluIG9mZnNldCkge1xuICAgIGVsZW0uc3R5bGVbb3Bwb3NpdGVWZXJ0aWNhbFByb3BlcnR5XSA9ICcnO1xuICAgIGVsZW0uc3R5bGVbdmVydGljYWxQcm9wZXJ0eV0gPSBwcmVzZXRWICsgJ3B4JztcbiAgfVxuICB2YXIgb2xkID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICB2YXIgb3JpZ2luYWxTdHlsZSA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gb2Zmc2V0KSB7XG4gICAgaWYgKG9mZnNldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICB2YXIgZGlyID0gZ2V0T2Zmc2V0RGlyZWN0aW9uKGtleSwgb3B0aW9uKTtcbiAgICAgIHZhciBwcmVzZXQgPSBrZXkgPT09ICdsZWZ0JyA/IHByZXNldEggOiBwcmVzZXRWO1xuICAgICAgdmFyIG9mZiA9IG9yaWdpbmFsT2Zmc2V0W2tleV0gLSBvbGRba2V5XTtcbiAgICAgIGlmIChkaXIgPT09IGtleSkge1xuICAgICAgICBvcmlnaW5hbFN0eWxlW2Rpcl0gPSBwcmVzZXQgKyBvZmY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFN0eWxlW2Rpcl0gPSBwcmVzZXQgLSBvZmY7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNzcyhlbGVtLCBvcmlnaW5hbFN0eWxlKTtcbiAgLy8gZm9yY2UgcmVsYXlvdXRcbiAgZm9yY2UoZWxlbS5vZmZzZXRUb3AsIGVsZW0ub2Zmc2V0TGVmdCk7XG4gIGlmICgnbGVmdCcgaW4gb2Zmc2V0IHx8ICd0b3AnIGluIG9mZnNldCkge1xuICAgICgwLCBfcHJvcGVydHlVdGlscy5zZXRUcmFuc2l0aW9uUHJvcGVydHkpKGVsZW0sIG9yaWdpbmFsVHJhbnNpdGlvbik7XG4gIH1cbiAgdmFyIHJldCA9IHt9O1xuICBmb3IgKHZhciBfa2V5IGluIG9mZnNldCkge1xuICAgIGlmIChvZmZzZXQuaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgIHZhciBfZGlyID0gZ2V0T2Zmc2V0RGlyZWN0aW9uKF9rZXksIG9wdGlvbik7XG4gICAgICB2YXIgX29mZiA9IG9mZnNldFtfa2V5XSAtIG9yaWdpbmFsT2Zmc2V0W19rZXldO1xuICAgICAgaWYgKF9rZXkgPT09IF9kaXIpIHtcbiAgICAgICAgcmV0W19kaXJdID0gb3JpZ2luYWxTdHlsZVtfZGlyXSArIF9vZmY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRbX2Rpcl0gPSBvcmlnaW5hbFN0eWxlW19kaXJdIC0gX29mZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3NzKGVsZW0sIHJldCk7XG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybShlbGVtLCBvZmZzZXQpIHtcbiAgdmFyIG9yaWdpbmFsT2Zmc2V0ID0gZ2V0T2Zmc2V0KGVsZW0pO1xuICB2YXIgb3JpZ2luYWxYWSA9ICgwLCBfcHJvcGVydHlVdGlscy5nZXRUcmFuc2Zvcm1YWSkoZWxlbSk7XG4gIHZhciByZXN1bHRYWSA9IHsgeDogb3JpZ2luYWxYWS54LCB5OiBvcmlnaW5hbFhZLnkgfTtcbiAgaWYgKCdsZWZ0JyBpbiBvZmZzZXQpIHtcbiAgICByZXN1bHRYWS54ID0gb3JpZ2luYWxYWS54ICsgb2Zmc2V0LmxlZnQgLSBvcmlnaW5hbE9mZnNldC5sZWZ0O1xuICB9XG4gIGlmICgndG9wJyBpbiBvZmZzZXQpIHtcbiAgICByZXN1bHRYWS55ID0gb3JpZ2luYWxYWS55ICsgb2Zmc2V0LnRvcCAtIG9yaWdpbmFsT2Zmc2V0LnRvcDtcbiAgfVxuICAoMCwgX3Byb3BlcnR5VXRpbHMuc2V0VHJhbnNmb3JtWFkpKGVsZW0sIHJlc3VsdFhZKTtcbn1cblxuZnVuY3Rpb24gc2V0T2Zmc2V0KGVsZW0sIG9mZnNldCwgb3B0aW9uKSB7XG4gIGlmIChvcHRpb24udXNlQ3NzUmlnaHQgfHwgb3B0aW9uLnVzZUNzc0JvdHRvbSkge1xuICAgIHNldExlZnRUb3AoZWxlbSwgb2Zmc2V0LCBvcHRpb24pO1xuICB9IGVsc2UgaWYgKG9wdGlvbi51c2VDc3NUcmFuc2Zvcm0gJiYgKDAsIF9wcm9wZXJ0eVV0aWxzLmdldFRyYW5zZm9ybU5hbWUpKCkgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgIHNldFRyYW5zZm9ybShlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgc2V0TGVmdFRvcChlbGVtLCBvZmZzZXQsIG9wdGlvbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZWFjaChhcnIsIGZuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4oYXJyW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JvcmRlckJveEZuKGVsZW0pIHtcbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVYKGVsZW0sICdib3hTaXppbmcnKSA9PT0gJ2JvcmRlci1ib3gnO1xufVxuXG52YXIgQk9YX01PREVMUyA9IFsnbWFyZ2luJywgJ2JvcmRlcicsICdwYWRkaW5nJ107XG52YXIgQ09OVEVOVF9JTkRFWCA9IC0xO1xudmFyIFBBRERJTkdfSU5ERVggPSAyO1xudmFyIEJPUkRFUl9JTkRFWCA9IDE7XG52YXIgTUFSR0lOX0lOREVYID0gMDtcblxuZnVuY3Rpb24gc3dhcChlbGVtLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgb2xkID0ge307XG4gIHZhciBzdHlsZSA9IGVsZW0uc3R5bGU7XG4gIHZhciBuYW1lID0gdm9pZCAwO1xuXG4gIC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuICBmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBvbGRbbmFtZV0gPSBzdHlsZVtuYW1lXTtcbiAgICAgIHN0eWxlW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjay5jYWxsKGVsZW0pO1xuXG4gIC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuICBmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBzdHlsZVtuYW1lXSA9IG9sZFtuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UEJNV2lkdGgoZWxlbSwgcHJvcHMsIHdoaWNoKSB7XG4gIHZhciB2YWx1ZSA9IDA7XG4gIHZhciBwcm9wID0gdm9pZCAwO1xuICB2YXIgaiA9IHZvaWQgMDtcbiAgdmFyIGkgPSB2b2lkIDA7XG4gIGZvciAoaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgIHByb3AgPSBwcm9wc1tqXTtcbiAgICBpZiAocHJvcCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHdoaWNoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjc3NQcm9wID0gdm9pZCAwO1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2JvcmRlcicpIHtcbiAgICAgICAgICBjc3NQcm9wID0gJycgKyBwcm9wICsgd2hpY2hbaV0gKyAnV2lkdGgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzc1Byb3AgPSBwcm9wICsgd2hpY2hbaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgKz0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlWChlbGVtLCBjc3NQcm9wKSkgfHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEEgY3J1ZGUgd2F5IG9mIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBpcyBhIHdpbmRvd1xuICogQG1lbWJlciB1dGlsXG4gKi9cbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICAvLyBtdXN0IHVzZSA9PSBmb3IgaWU4XG4gIC8qIGVzbGludCBlcWVxZXE6MCAqL1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiA9PSBvYmoud2luZG93O1xufVxuXG52YXIgZG9tVXRpbHMgPSB7fTtcblxuZWFjaChbJ1dpZHRoJywgJ0hlaWdodCddLCBmdW5jdGlvbiAobmFtZSkge1xuICBkb21VdGlsc1snZG9jJyArIG5hbWVdID0gZnVuY3Rpb24gKHJlZldpbikge1xuICAgIHZhciBkID0gcmVmV2luLmRvY3VtZW50O1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAvLyBmaXJlZm94IGNocm9tZSBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PCBib2R5LnNjcm9sbEhlaWdodFxuICAgIC8vIGllIHN0YW5kYXJkIG1vZGUgOiBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0PiBib2R5LnNjcm9sbEhlaWdodFxuICAgIGQuZG9jdW1lbnRFbGVtZW50WydzY3JvbGwnICsgbmFtZV0sXG4gICAgLy8gcXVpcmtzIDogZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCDmnIDlpKfnrYnkuo7lj6/op4bnqpflj6PlpJrkuIDngrnvvJ9cbiAgICBkLmJvZHlbJ3Njcm9sbCcgKyBuYW1lXSwgZG9tVXRpbHNbJ3ZpZXdwb3J0JyArIG5hbWVdKGQpKTtcbiAgfTtcblxuICBkb21VdGlsc1sndmlld3BvcnQnICsgbmFtZV0gPSBmdW5jdGlvbiAod2luKSB7XG4gICAgLy8gcGMgYnJvd3NlciBpbmNsdWRlcyBzY3JvbGxiYXIgaW4gd2luZG93LmlubmVyV2lkdGhcbiAgICB2YXIgcHJvcCA9ICdjbGllbnQnICsgbmFtZTtcbiAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50O1xuICAgIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIGRvY3VtZW50RWxlbWVudFByb3AgPSBkb2N1bWVudEVsZW1lbnRbcHJvcF07XG4gICAgLy8g5qCH5YeG5qih5byP5Y+WIGRvY3VtZW50RWxlbWVudFxuICAgIC8vIGJhY2tjb21wYXQg5Y+WIGJvZHlcbiAgICByZXR1cm4gZG9jLmNvbXBhdE1vZGUgPT09ICdDU1MxQ29tcGF0JyAmJiBkb2N1bWVudEVsZW1lbnRQcm9wIHx8IGJvZHkgJiYgYm9keVtwcm9wXSB8fCBkb2N1bWVudEVsZW1lbnRQcm9wO1xuICB9O1xufSk7XG5cbi8qXG4g5b6X5Yiw5YWD57Sg55qE5aSn5bCP5L+h5oGvXG4gQHBhcmFtIGVsZW1cbiBAcGFyYW0gbmFtZVxuIEBwYXJhbSB7U3RyaW5nfSBbZXh0cmFdICAncGFkZGluZycgOiAoY3NzIHdpZHRoKSArIHBhZGRpbmdcbiAnYm9yZGVyJyA6IChjc3Mgd2lkdGgpICsgcGFkZGluZyArIGJvcmRlclxuICdtYXJnaW4nIDogKGNzcyB3aWR0aCkgKyBwYWRkaW5nICsgYm9yZGVyICsgbWFyZ2luXG4gKi9cbmZ1bmN0aW9uIGdldFdIKGVsZW0sIG5hbWUsIGV4KSB7XG4gIHZhciBleHRyYSA9IGV4O1xuICBpZiAoaXNXaW5kb3coZWxlbSkpIHtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ3dpZHRoJyA/IGRvbVV0aWxzLnZpZXdwb3J0V2lkdGgoZWxlbSkgOiBkb21VdGlscy52aWV3cG9ydEhlaWdodChlbGVtKTtcbiAgfSBlbHNlIGlmIChlbGVtLm5vZGVUeXBlID09PSA5KSB7XG4gICAgcmV0dXJuIG5hbWUgPT09ICd3aWR0aCcgPyBkb21VdGlscy5kb2NXaWR0aChlbGVtKSA6IGRvbVV0aWxzLmRvY0hlaWdodChlbGVtKTtcbiAgfVxuICB2YXIgd2hpY2ggPSBuYW1lID09PSAnd2lkdGgnID8gWydMZWZ0JywgJ1JpZ2h0J10gOiBbJ1RvcCcsICdCb3R0b20nXTtcbiAgdmFyIGJvcmRlckJveFZhbHVlID0gbmFtZSA9PT0gJ3dpZHRoJyA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodDtcbiAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlWChlbGVtKTtcbiAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtLCBjb21wdXRlZFN0eWxlKTtcbiAgdmFyIGNzc0JveFZhbHVlID0gMDtcbiAgaWYgKGJvcmRlckJveFZhbHVlID09PSBudWxsIHx8IGJvcmRlckJveFZhbHVlID09PSB1bmRlZmluZWQgfHwgYm9yZGVyQm94VmFsdWUgPD0gMCkge1xuICAgIGJvcmRlckJveFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIC8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuIGNvbXB1dGVkIGNzcyBpZiBuZWNlc3NhcnlcbiAgICBjc3NCb3hWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGVYKGVsZW0sIG5hbWUpO1xuICAgIGlmIChjc3NCb3hWYWx1ZSA9PT0gbnVsbCB8fCBjc3NCb3hWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IE51bWJlcihjc3NCb3hWYWx1ZSkgPCAwKSB7XG4gICAgICBjc3NCb3hWYWx1ZSA9IGVsZW0uc3R5bGVbbmFtZV0gfHwgMDtcbiAgICB9XG4gICAgLy8gTm9ybWFsaXplICcnLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcbiAgICBjc3NCb3hWYWx1ZSA9IHBhcnNlRmxvYXQoY3NzQm94VmFsdWUpIHx8IDA7XG4gIH1cbiAgaWYgKGV4dHJhID09PSB1bmRlZmluZWQpIHtcbiAgICBleHRyYSA9IGlzQm9yZGVyQm94ID8gQk9SREVSX0lOREVYIDogQ09OVEVOVF9JTkRFWDtcbiAgfVxuICB2YXIgYm9yZGVyQm94VmFsdWVPcklzQm9yZGVyQm94ID0gYm9yZGVyQm94VmFsdWUgIT09IHVuZGVmaW5lZCB8fCBpc0JvcmRlckJveDtcbiAgdmFyIHZhbCA9IGJvcmRlckJveFZhbHVlIHx8IGNzc0JveFZhbHVlO1xuICBpZiAoZXh0cmEgPT09IENPTlRFTlRfSU5ERVgpIHtcbiAgICBpZiAoYm9yZGVyQm94VmFsdWVPcklzQm9yZGVyQm94KSB7XG4gICAgICByZXR1cm4gdmFsIC0gZ2V0UEJNV2lkdGgoZWxlbSwgWydib3JkZXInLCAncGFkZGluZyddLCB3aGljaCwgY29tcHV0ZWRTdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiBjc3NCb3hWYWx1ZTtcbiAgfSBlbHNlIGlmIChib3JkZXJCb3hWYWx1ZU9ySXNCb3JkZXJCb3gpIHtcbiAgICBpZiAoZXh0cmEgPT09IEJPUkRFUl9JTkRFWCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbCArIChleHRyYSA9PT0gUEFERElOR19JTkRFWCA/IC1nZXRQQk1XaWR0aChlbGVtLCBbJ2JvcmRlciddLCB3aGljaCwgY29tcHV0ZWRTdHlsZSkgOiBnZXRQQk1XaWR0aChlbGVtLCBbJ21hcmdpbiddLCB3aGljaCwgY29tcHV0ZWRTdHlsZSkpO1xuICB9XG4gIHJldHVybiBjc3NCb3hWYWx1ZSArIGdldFBCTVdpZHRoKGVsZW0sIEJPWF9NT0RFTFMuc2xpY2UoZXh0cmEpLCB3aGljaCwgY29tcHV0ZWRTdHlsZSk7XG59XG5cbnZhciBjc3NTaG93ID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gIGRpc3BsYXk6ICdibG9jaydcbn07XG5cbi8vIGZpeCAjMTE5IDogaHR0cHM6Ly9naXRodWIuY29tL2tpc3N5dGVhbS9raXNzeS9pc3N1ZXMvMTE5XG5mdW5jdGlvbiBnZXRXSElnbm9yZURpc3BsYXkoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgdmFyIHZhbCA9IHZvaWQgMDtcbiAgdmFyIGVsZW0gPSBhcmdzWzBdO1xuICAvLyBpbiBjYXNlIGVsZW0gaXMgd2luZG93XG4gIC8vIGVsZW0ub2Zmc2V0V2lkdGggPT09IHVuZGVmaW5lZFxuICBpZiAoZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCkge1xuICAgIHZhbCA9IGdldFdILmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgc3dhcChlbGVtLCBjc3NTaG93LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWwgPSBnZXRXSC5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG5cbmVhY2goWyd3aWR0aCcsICdoZWlnaHQnXSwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIGZpcnN0ID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIGRvbVV0aWxzWydvdXRlcicgKyBmaXJzdF0gPSBmdW5jdGlvbiAoZWwsIGluY2x1ZGVNYXJnaW4pIHtcbiAgICByZXR1cm4gZWwgJiYgZ2V0V0hJZ25vcmVEaXNwbGF5KGVsLCBuYW1lLCBpbmNsdWRlTWFyZ2luID8gTUFSR0lOX0lOREVYIDogQk9SREVSX0lOREVYKTtcbiAgfTtcbiAgdmFyIHdoaWNoID0gbmFtZSA9PT0gJ3dpZHRoJyA/IFsnTGVmdCcsICdSaWdodCddIDogWydUb3AnLCAnQm90dG9tJ107XG5cbiAgZG9tVXRpbHNbbmFtZV0gPSBmdW5jdGlvbiAoZWxlbSwgdikge1xuICAgIHZhciB2YWwgPSB2O1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlWChlbGVtKTtcbiAgICAgICAgdmFyIGlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3hGbihlbGVtKTtcbiAgICAgICAgaWYgKGlzQm9yZGVyQm94KSB7XG4gICAgICAgICAgdmFsICs9IGdldFBCTVdpZHRoKGVsZW0sIFsncGFkZGluZycsICdib3JkZXInXSwgd2hpY2gsIGNvbXB1dGVkU3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjc3MoZWxlbSwgbmFtZSwgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBlbGVtICYmIGdldFdISWdub3JlRGlzcGxheShlbGVtLCBuYW1lLCBDT05URU5UX0lOREVYKTtcbiAgfTtcbn0pO1xuXG5mdW5jdGlvbiBtaXgodG8sIGZyb20pIHtcbiAgZm9yICh2YXIgaSBpbiBmcm9tKSB7XG4gICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIHRvW2ldID0gZnJvbVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuXG52YXIgdXRpbHMgPSB7XG4gIGdldFdpbmRvdzogZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiBub2RlLmRvY3VtZW50ICYmIG5vZGUuc2V0VGltZW91dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZTtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gIH0sXG4gIG9mZnNldDogZnVuY3Rpb24gb2Zmc2V0KGVsLCB2YWx1ZSwgb3B0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNldE9mZnNldChlbCwgdmFsdWUsIG9wdGlvbiB8fCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXRPZmZzZXQoZWwpO1xuICAgIH1cbiAgfSxcblxuICBpc1dpbmRvdzogaXNXaW5kb3csXG4gIGVhY2g6IGVhY2gsXG4gIGNzczogY3NzLFxuICBjbG9uZTogZnVuY3Rpb24gY2xvbmUob2JqKSB7XG4gICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgdmFyIHJldCA9IHt9O1xuICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgcmV0W2ldID0gb2JqW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgb3ZlcmZsb3cgPSBvYmoub3ZlcmZsb3c7XG4gICAgaWYgKG92ZXJmbG93KSB7XG4gICAgICBmb3IgKGkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICByZXQub3ZlcmZsb3dbaV0gPSBvYmoub3ZlcmZsb3dbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBtaXg6IG1peCxcbiAgZ2V0V2luZG93U2Nyb2xsTGVmdDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsTGVmdCh3KSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbExlZnQodyk7XG4gIH0sXG4gIGdldFdpbmRvd1Njcm9sbFRvcDogZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsVG9wKHcpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsVG9wKHcpO1xuICB9LFxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIHJldCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjI7IF9rZXkzKyspIHtcbiAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHV0aWxzLm1peChyZXQsIGFyZ3NbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIHZpZXdwb3J0V2lkdGg6IDAsXG4gIHZpZXdwb3J0SGVpZ2h0OiAwXG59O1xuXG5taXgodXRpbHMsIGRvbVV0aWxzKTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB1dGlscztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFRyYW5zZm9ybU5hbWUgPSBnZXRUcmFuc2Zvcm1OYW1lO1xuZXhwb3J0cy5zZXRUcmFuc2l0aW9uUHJvcGVydHkgPSBzZXRUcmFuc2l0aW9uUHJvcGVydHk7XG5leHBvcnRzLmdldFRyYW5zaXRpb25Qcm9wZXJ0eSA9IGdldFRyYW5zaXRpb25Qcm9wZXJ0eTtcbmV4cG9ydHMuZ2V0VHJhbnNmb3JtWFkgPSBnZXRUcmFuc2Zvcm1YWTtcbmV4cG9ydHMuc2V0VHJhbnNmb3JtWFkgPSBzZXRUcmFuc2Zvcm1YWTtcbnZhciB2ZW5kb3JQcmVmaXggPSB2b2lkIDA7XG5cbnZhciBqc0Nzc01hcCA9IHtcbiAgV2Via2l0OiAnLXdlYmtpdC0nLFxuICBNb3o6ICctbW96LScsXG4gIC8vIElFIGRpZCBpdCB3cm9uZyBhZ2FpbiAuLi5cbiAgbXM6ICctbXMtJyxcbiAgTzogJy1vLSdcbn07XG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeCgpIHtcbiAgaWYgKHZlbmRvclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZlbmRvclByZWZpeDtcbiAgfVxuICB2ZW5kb3JQcmVmaXggPSAnJztcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpLnN0eWxlO1xuICB2YXIgdGVzdFByb3AgPSAnVHJhbnNmb3JtJztcbiAgZm9yICh2YXIga2V5IGluIGpzQ3NzTWFwKSB7XG4gICAgaWYgKGtleSArIHRlc3RQcm9wIGluIHN0eWxlKSB7XG4gICAgICB2ZW5kb3JQcmVmaXggPSBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZW5kb3JQcmVmaXg7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25OYW1lKCkge1xuICByZXR1cm4gZ2V0VmVuZG9yUHJlZml4KCkgPyBnZXRWZW5kb3JQcmVmaXgoKSArICdUcmFuc2l0aW9uUHJvcGVydHknIDogJ3RyYW5zaXRpb25Qcm9wZXJ0eSc7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybU5hbWUoKSB7XG4gIHJldHVybiBnZXRWZW5kb3JQcmVmaXgoKSA/IGdldFZlbmRvclByZWZpeCgpICsgJ1RyYW5zZm9ybScgOiAndHJhbnNmb3JtJztcbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvblByb3BlcnR5KG5vZGUsIHZhbHVlKSB7XG4gIHZhciBuYW1lID0gZ2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgaWYgKG5hbWUpIHtcbiAgICBub2RlLnN0eWxlW25hbWVdID0gdmFsdWU7XG4gICAgaWYgKG5hbWUgIT09ICd0cmFuc2l0aW9uUHJvcGVydHknKSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eSA9IHZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRUcmFuc2Zvcm0obm9kZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWUgPSBnZXRUcmFuc2Zvcm1OYW1lKCk7XG4gIGlmIChuYW1lKSB7XG4gICAgbm9kZS5zdHlsZVtuYW1lXSA9IHZhbHVlO1xuICAgIGlmIChuYW1lICE9PSAndHJhbnNmb3JtJykge1xuICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvblByb3BlcnR5KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5IHx8IG5vZGUuc3R5bGVbZ2V0VHJhbnNpdGlvbk5hbWUoKV07XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybVhZKG5vZGUpIHtcbiAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gIHZhciB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKSB8fCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGdldFRyYW5zZm9ybU5hbWUoKSk7XG4gIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICB2YXIgbWF0cml4ID0gdHJhbnNmb3JtLnJlcGxhY2UoL1teMC05XFwtLixdL2csICcnKS5zcGxpdCgnLCcpO1xuICAgIHJldHVybiB7IHg6IHBhcnNlRmxvYXQobWF0cml4WzEyXSB8fCBtYXRyaXhbNF0sIDApLCB5OiBwYXJzZUZsb2F0KG1hdHJpeFsxM10gfHwgbWF0cml4WzVdLCAwKSB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59XG5cbnZhciBtYXRyaXgyZCA9IC9tYXRyaXhcXCgoLiopXFwpLztcbnZhciBtYXRyaXgzZCA9IC9tYXRyaXgzZFxcKCguKilcXCkvO1xuXG5mdW5jdGlvbiBzZXRUcmFuc2Zvcm1YWShub2RlLCB4eSkge1xuICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTtcbiAgdmFyIHRyYW5zZm9ybSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zZm9ybScpIHx8IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZ2V0VHJhbnNmb3JtTmFtZSgpKTtcbiAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgIHZhciBhcnIgPSB2b2lkIDA7XG4gICAgdmFyIG1hdGNoMmQgPSB0cmFuc2Zvcm0ubWF0Y2gobWF0cml4MmQpO1xuICAgIGlmIChtYXRjaDJkKSB7XG4gICAgICBtYXRjaDJkID0gbWF0Y2gyZFsxXTtcbiAgICAgIGFyciA9IG1hdGNoMmQuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoaXRlbSwgMTApO1xuICAgICAgfSk7XG4gICAgICBhcnJbNF0gPSB4eS54O1xuICAgICAgYXJyWzVdID0geHkueTtcbiAgICAgIHNldFRyYW5zZm9ybShub2RlLCAnbWF0cml4KCcgKyBhcnIuam9pbignLCcpICsgJyknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1hdGNoM2QgPSB0cmFuc2Zvcm0ubWF0Y2gobWF0cml4M2QpWzFdO1xuICAgICAgYXJyID0gbWF0Y2gzZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChpdGVtLCAxMCk7XG4gICAgICB9KTtcbiAgICAgIGFyclsxMl0gPSB4eS54O1xuICAgICAgYXJyWzEzXSA9IHh5Lnk7XG4gICAgICBzZXRUcmFuc2Zvcm0obm9kZSwgJ21hdHJpeDNkKCcgKyBhcnIuam9pbignLCcpICsgJyknKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2V0VHJhbnNmb3JtKG5vZGUsICd0cmFuc2xhdGVYKCcgKyB4eS54ICsgJ3B4KSB0cmFuc2xhdGVZKCcgKyB4eS55ICsgJ3B4KSB0cmFuc2xhdGVaKDApJyk7XG4gIH1cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9wcm9wZXJ0eVV0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBfdXRpbHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuLyoqXG4gKiDlvpfliLDkvJrlr7zoh7TlhYPntKDmmL7npLrkuI3lhajnmoTnpZblhYjlhYPntKBcbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICAvLyBpZSDov5nkuKrkuZ/kuI3mmK/lrozlhajlj6/ooYxcbiAgLypcbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O292ZXJmbG93OiBoaWRkZW5cIj5cbiAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtoZWlnaHQ6IDEwMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiBpZD1cImQ2XCI+XG4gICDlhYPntKAgNiDpq5ggMTAwcHgg5a69IDUwcHg8YnIvPlxuICAgPC9kaXY+XG4gICA8L2Rpdj5cbiAgICovXG4gIC8vIGVsZW1lbnQub2Zmc2V0UGFyZW50IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGluIGllNyBhbmQgYmVsb3cuIFJldHVybiBwYXJlbnQgd2l0aCBsYXlvdXQhXG4gIC8vICBJbiBvdGhlciBicm93c2VycyBpdCBvbmx5IGluY2x1ZGVzIGVsZW1lbnRzIHdpdGggcG9zaXRpb24gYWJzb2x1dGUsIHJlbGF0aXZlIG9yXG4gIC8vIGZpeGVkLCBub3QgZWxlbWVudHMgd2l0aCBvdmVyZmxvdyBzZXQgdG8gYXV0byBvciBzY3JvbGwuXG4gIC8vICAgICAgICBpZiAoVUEuaWUgJiYgaWVNb2RlIDwgOCkge1xuICAvLyAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgLy8gICAgICAgIH1cbiAgLy8g57uf5LiA55qEIG9mZnNldFBhcmVudCDmlrnms5VcbiAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgdmFyIHBhcmVudCA9IHZvaWQgMDtcbiAgdmFyIHBvc2l0aW9uU3R5bGUgPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5jc3MoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7XG4gIHZhciBza2lwU3RhdGljID0gcG9zaXRpb25TdHlsZSA9PT0gJ2ZpeGVkJyB8fCBwb3NpdGlvblN0eWxlID09PSAnYWJzb2x1dGUnO1xuXG4gIGlmICghc2tpcFN0YXRpYykge1xuICAgIHJldHVybiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdodG1sJyA/IG51bGwgOiBlbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICBmb3IgKHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsgcGFyZW50ICYmIHBhcmVudCAhPT0gYm9keTsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHtcbiAgICBwb3NpdGlvblN0eWxlID0gX3V0aWxzMltcImRlZmF1bHRcIl0uY3NzKHBhcmVudCwgJ3Bvc2l0aW9uJyk7XG4gICAgaWYgKHBvc2l0aW9uU3R5bGUgIT09ICdzdGF0aWMnKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRPZmZzZXRQYXJlbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9nZXRPZmZzZXRQYXJlbnQuanNcbi8vIG1vZHVsZSBpZCA9IDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIF91dGlsczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlscyk7XG5cbnZhciBfZ2V0T2Zmc2V0UGFyZW50ID0gcmVxdWlyZSgnLi9nZXRPZmZzZXRQYXJlbnQnKTtcblxudmFyIF9nZXRPZmZzZXRQYXJlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T2Zmc2V0UGFyZW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbi8qKlxuICog6I635b6X5YWD57Sg55qE5pi+56S66YOo5YiG55qE5Yy65Z+fXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVSZWN0Rm9yRWxlbWVudChlbGVtZW50KSB7XG4gIHZhciB2aXNpYmxlUmVjdCA9IHtcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiBJbmZpbml0eSxcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiBJbmZpbml0eVxuICB9O1xuICB2YXIgZWwgPSAoMCwgX2dldE9mZnNldFBhcmVudDJbXCJkZWZhdWx0XCJdKShlbGVtZW50KTtcbiAgdmFyIHNjcm9sbFggPSB2b2lkIDA7XG4gIHZhciBzY3JvbGxZID0gdm9pZCAwO1xuICB2YXIgd2luU2l6ZSA9IHZvaWQgMDtcbiAgdmFyIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jLmRvY3VtZW50RWxlbWVudDtcblxuICAvLyBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHZpc2libGUgcmVjdCBieSBjbGltYmluZyB0aGUgZG9tIGFjY291bnRpbmcgZm9yXG4gIC8vIGFsbCBzY3JvbGxhYmxlIGNvbnRhaW5lcnMuXG4gIHdoaWxlIChlbCkge1xuICAgIC8vIGNsaWVudFdpZHRoIGlzIHplcm8gZm9yIGlubGluZSBibG9jayBlbGVtZW50cyBpbiBpZS5cbiAgICBpZiAoKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpID09PSAtMSB8fCBlbC5jbGllbnRXaWR0aCAhPT0gMCkgJiZcbiAgICAvLyBib2R5IG1heSBoYXZlIG92ZXJmbG93IHNldCBvbiBpdCwgeWV0IHdlIHN0aWxsIGdldCB0aGUgZW50aXJlXG4gICAgLy8gdmlld3BvcnQuIEluIHNvbWUgYnJvd3NlcnMsIGVsLm9mZnNldFBhcmVudCBtYXkgYmVcbiAgICAvLyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHNvIGNoZWNrIGZvciB0aGF0IHRvby5cbiAgICBlbCAhPT0gYm9keSAmJiBlbCAhPT0gZG9jdW1lbnRFbGVtZW50ICYmIF91dGlsczJbXCJkZWZhdWx0XCJdLmNzcyhlbCwgJ292ZXJmbG93JykgIT09ICd2aXNpYmxlJykge1xuICAgICAgdmFyIHBvcyA9IF91dGlsczJbXCJkZWZhdWx0XCJdLm9mZnNldChlbCk7XG4gICAgICAvLyBhZGQgYm9yZGVyXG4gICAgICBwb3MubGVmdCArPSBlbC5jbGllbnRMZWZ0O1xuICAgICAgcG9zLnRvcCArPSBlbC5jbGllbnRUb3A7XG4gICAgICB2aXNpYmxlUmVjdC50b3AgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC50b3AsIHBvcy50b3ApO1xuICAgICAgdmlzaWJsZVJlY3QucmlnaHQgPSBNYXRoLm1pbih2aXNpYmxlUmVjdC5yaWdodCxcbiAgICAgIC8vIGNvbnNpZGVyIGFyZWEgd2l0aG91dCBzY3JvbGxCYXJcbiAgICAgIHBvcy5sZWZ0ICsgZWwuY2xpZW50V2lkdGgpO1xuICAgICAgdmlzaWJsZVJlY3QuYm90dG9tID0gTWF0aC5taW4odmlzaWJsZVJlY3QuYm90dG9tLCBwb3MudG9wICsgZWwuY2xpZW50SGVpZ2h0KTtcbiAgICAgIHZpc2libGVSZWN0LmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5sZWZ0LCBwb3MubGVmdCk7XG4gICAgfSBlbHNlIGlmIChlbCA9PT0gYm9keSB8fCBlbCA9PT0gZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZWwgPSAoMCwgX2dldE9mZnNldFBhcmVudDJbXCJkZWZhdWx0XCJdKShlbCk7XG4gIH1cblxuICAvLyBDbGlwIGJ5IHdpbmRvdydzIHZpZXdwb3J0LlxuICBzY3JvbGxYID0gX3V0aWxzMltcImRlZmF1bHRcIl0uZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pO1xuICBzY3JvbGxZID0gX3V0aWxzMltcImRlZmF1bHRcIl0uZ2V0V2luZG93U2Nyb2xsVG9wKHdpbik7XG4gIHZpc2libGVSZWN0LmxlZnQgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5sZWZ0LCBzY3JvbGxYKTtcbiAgdmlzaWJsZVJlY3QudG9wID0gTWF0aC5tYXgodmlzaWJsZVJlY3QudG9wLCBzY3JvbGxZKTtcbiAgd2luU2l6ZSA9IHtcbiAgICB3aWR0aDogX3V0aWxzMltcImRlZmF1bHRcIl0udmlld3BvcnRXaWR0aCh3aW4pLFxuICAgIGhlaWdodDogX3V0aWxzMltcImRlZmF1bHRcIl0udmlld3BvcnRIZWlnaHQod2luKVxuICB9O1xuICB2aXNpYmxlUmVjdC5yaWdodCA9IE1hdGgubWluKHZpc2libGVSZWN0LnJpZ2h0LCBzY3JvbGxYICsgd2luU2l6ZS53aWR0aCk7XG4gIHZpc2libGVSZWN0LmJvdHRvbSA9IE1hdGgubWluKHZpc2libGVSZWN0LmJvdHRvbSwgc2Nyb2xsWSArIHdpblNpemUuaGVpZ2h0KTtcbiAgcmV0dXJuIHZpc2libGVSZWN0LnRvcCA+PSAwICYmIHZpc2libGVSZWN0LmxlZnQgPj0gMCAmJiB2aXNpYmxlUmVjdC5ib3R0b20gPiB2aXNpYmxlUmVjdC50b3AgJiYgdmlzaWJsZVJlY3QucmlnaHQgPiB2aXNpYmxlUmVjdC5sZWZ0ID8gdmlzaWJsZVJlY3QgOiBudWxsO1xufVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGdldFZpc2libGVSZWN0Rm9yRWxlbWVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2dldFZpc2libGVSZWN0Rm9yRWxlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX3V0aWxzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFkanVzdEZvclZpZXdwb3J0KGVsRnV0dXJlUG9zLCBlbFJlZ2lvbiwgdmlzaWJsZVJlY3QsIG92ZXJmbG93KSB7XG4gIHZhciBwb3MgPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5jbG9uZShlbEZ1dHVyZVBvcyk7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiBlbFJlZ2lvbi53aWR0aCxcbiAgICBoZWlnaHQ6IGVsUmVnaW9uLmhlaWdodFxuICB9O1xuXG4gIGlmIChvdmVyZmxvdy5hZGp1c3RYICYmIHBvcy5sZWZ0IDwgdmlzaWJsZVJlY3QubGVmdCkge1xuICAgIHBvcy5sZWZ0ID0gdmlzaWJsZVJlY3QubGVmdDtcbiAgfVxuXG4gIC8vIExlZnQgZWRnZSBpbnNpZGUgYW5kIHJpZ2h0IGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIHJlc2l6ZSBpdC5cbiAgaWYgKG92ZXJmbG93LnJlc2l6ZVdpZHRoICYmIHBvcy5sZWZ0ID49IHZpc2libGVSZWN0LmxlZnQgJiYgcG9zLmxlZnQgKyBzaXplLndpZHRoID4gdmlzaWJsZVJlY3QucmlnaHQpIHtcbiAgICBzaXplLndpZHRoIC09IHBvcy5sZWZ0ICsgc2l6ZS53aWR0aCAtIHZpc2libGVSZWN0LnJpZ2h0O1xuICB9XG5cbiAgLy8gUmlnaHQgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFggJiYgcG9zLmxlZnQgKyBzaXplLndpZHRoID4gdmlzaWJsZVJlY3QucmlnaHQpIHtcbiAgICAvLyDkv53or4Hlt6bovrnnlYzlkozlj6/op4bljLrln5/lt6bovrnnlYzlr7npvZBcbiAgICBwb3MubGVmdCA9IE1hdGgubWF4KHZpc2libGVSZWN0LnJpZ2h0IC0gc2l6ZS53aWR0aCwgdmlzaWJsZVJlY3QubGVmdCk7XG4gIH1cblxuICAvLyBUb3AgZWRnZSBvdXRzaWRlIHZpZXdwb3J0LCB0cnkgdG8gbW92ZSBpdC5cbiAgaWYgKG92ZXJmbG93LmFkanVzdFkgJiYgcG9zLnRvcCA8IHZpc2libGVSZWN0LnRvcCkge1xuICAgIHBvcy50b3AgPSB2aXNpYmxlUmVjdC50b3A7XG4gIH1cblxuICAvLyBUb3AgZWRnZSBpbnNpZGUgYW5kIGJvdHRvbSBlZGdlIG91dHNpZGUgdmlld3BvcnQsIHRyeSB0byByZXNpemUgaXQuXG4gIGlmIChvdmVyZmxvdy5yZXNpemVIZWlnaHQgJiYgcG9zLnRvcCA+PSB2aXNpYmxlUmVjdC50b3AgJiYgcG9zLnRvcCArIHNpemUuaGVpZ2h0ID4gdmlzaWJsZVJlY3QuYm90dG9tKSB7XG4gICAgc2l6ZS5oZWlnaHQgLT0gcG9zLnRvcCArIHNpemUuaGVpZ2h0IC0gdmlzaWJsZVJlY3QuYm90dG9tO1xuICB9XG5cbiAgLy8gQm90dG9tIGVkZ2Ugb3V0c2lkZSB2aWV3cG9ydCwgdHJ5IHRvIG1vdmUgaXQuXG4gIGlmIChvdmVyZmxvdy5hZGp1c3RZICYmIHBvcy50b3AgKyBzaXplLmhlaWdodCA+IHZpc2libGVSZWN0LmJvdHRvbSkge1xuICAgIC8vIOS/neivgeS4iui+ueeVjOWSjOWPr+inhuWMuuWfn+S4iui+ueeVjOWvuem9kFxuICAgIHBvcy50b3AgPSBNYXRoLm1heCh2aXNpYmxlUmVjdC5ib3R0b20gLSBzaXplLmhlaWdodCwgdmlzaWJsZVJlY3QudG9wKTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbHMyW1wiZGVmYXVsdFwiXS5taXgocG9zLCBzaXplKTtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBhZGp1c3RGb3JWaWV3cG9ydDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20tYWxpZ24vbGliL2FkanVzdEZvclZpZXdwb3J0LmpzXG4vLyBtb2R1bGUgaWQgPSA1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBfdXRpbHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gZ2V0UmVnaW9uKG5vZGUpIHtcbiAgdmFyIG9mZnNldCA9IHZvaWQgMDtcbiAgdmFyIHcgPSB2b2lkIDA7XG4gIHZhciBoID0gdm9pZCAwO1xuICBpZiAoIV91dGlsczJbXCJkZWZhdWx0XCJdLmlzV2luZG93KG5vZGUpICYmIG5vZGUubm9kZVR5cGUgIT09IDkpIHtcbiAgICBvZmZzZXQgPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5vZmZzZXQobm9kZSk7XG4gICAgdyA9IF91dGlsczJbXCJkZWZhdWx0XCJdLm91dGVyV2lkdGgobm9kZSk7XG4gICAgaCA9IF91dGlsczJbXCJkZWZhdWx0XCJdLm91dGVySGVpZ2h0KG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB3aW4gPSBfdXRpbHMyW1wiZGVmYXVsdFwiXS5nZXRXaW5kb3cobm9kZSk7XG4gICAgb2Zmc2V0ID0ge1xuICAgICAgbGVmdDogX3V0aWxzMltcImRlZmF1bHRcIl0uZ2V0V2luZG93U2Nyb2xsTGVmdCh3aW4pLFxuICAgICAgdG9wOiBfdXRpbHMyW1wiZGVmYXVsdFwiXS5nZXRXaW5kb3dTY3JvbGxUb3Aod2luKVxuICAgIH07XG4gICAgdyA9IF91dGlsczJbXCJkZWZhdWx0XCJdLnZpZXdwb3J0V2lkdGgod2luKTtcbiAgICBoID0gX3V0aWxzMltcImRlZmF1bHRcIl0udmlld3BvcnRIZWlnaHQod2luKTtcbiAgfVxuICBvZmZzZXQud2lkdGggPSB3O1xuICBvZmZzZXQuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBnZXRSZWdpb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9nZXRSZWdpb24uanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXRBbGlnbk9mZnNldCA9IHJlcXVpcmUoJy4vZ2V0QWxpZ25PZmZzZXQnKTtcblxudmFyIF9nZXRBbGlnbk9mZnNldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRBbGlnbk9mZnNldCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBnZXRFbEZ1dHVyZVBvcyhlbFJlZ2lvbiwgcmVmTm9kZVJlZ2lvbiwgcG9pbnRzLCBvZmZzZXQsIHRhcmdldE9mZnNldCkge1xuICB2YXIgeHkgPSB2b2lkIDA7XG4gIHZhciBkaWZmID0gdm9pZCAwO1xuICB2YXIgcDEgPSB2b2lkIDA7XG4gIHZhciBwMiA9IHZvaWQgMDtcblxuICB4eSA9IHtcbiAgICBsZWZ0OiBlbFJlZ2lvbi5sZWZ0LFxuICAgIHRvcDogZWxSZWdpb24udG9wXG4gIH07XG5cbiAgcDEgPSAoMCwgX2dldEFsaWduT2Zmc2V0MltcImRlZmF1bHRcIl0pKHJlZk5vZGVSZWdpb24sIHBvaW50c1sxXSk7XG4gIHAyID0gKDAsIF9nZXRBbGlnbk9mZnNldDJbXCJkZWZhdWx0XCJdKShlbFJlZ2lvbiwgcG9pbnRzWzBdKTtcblxuICBkaWZmID0gW3AyLmxlZnQgLSBwMS5sZWZ0LCBwMi50b3AgLSBwMS50b3BdO1xuXG4gIHJldHVybiB7XG4gICAgbGVmdDogeHkubGVmdCAtIGRpZmZbMF0gKyBvZmZzZXRbMF0gLSB0YXJnZXRPZmZzZXRbMF0sXG4gICAgdG9wOiB4eS50b3AgLSBkaWZmWzFdICsgb2Zmc2V0WzFdIC0gdGFyZ2V0T2Zmc2V0WzFdXG4gIH07XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0RWxGdXR1cmVQb3M7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9nZXRFbEZ1dHVyZVBvcy5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLyoqXG4gKiDojrflj5Ygbm9kZSDkuIrnmoQgYWxpZ24g5a+56b2Q54K5IOebuOWvueS6jumhtemdoueahOWdkOagh1xuICovXG5cbmZ1bmN0aW9uIGdldEFsaWduT2Zmc2V0KHJlZ2lvbiwgYWxpZ24pIHtcbiAgdmFyIFYgPSBhbGlnbi5jaGFyQXQoMCk7XG4gIHZhciBIID0gYWxpZ24uY2hhckF0KDEpO1xuICB2YXIgdyA9IHJlZ2lvbi53aWR0aDtcbiAgdmFyIGggPSByZWdpb24uaGVpZ2h0O1xuICB2YXIgeCA9IHZvaWQgMDtcbiAgdmFyIHkgPSB2b2lkIDA7XG5cbiAgeCA9IHJlZ2lvbi5sZWZ0O1xuICB5ID0gcmVnaW9uLnRvcDtcblxuICBpZiAoViA9PT0gJ2MnKSB7XG4gICAgeSArPSBoIC8gMjtcbiAgfSBlbHNlIGlmIChWID09PSAnYicpIHtcbiAgICB5ICs9IGg7XG4gIH1cblxuICBpZiAoSCA9PT0gJ2MnKSB7XG4gICAgeCArPSB3IC8gMjtcbiAgfSBlbHNlIGlmIChIID09PSAncicpIHtcbiAgICB4ICs9IHc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxlZnQ6IHgsXG4gICAgdG9wOiB5XG4gIH07XG59XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZ2V0QWxpZ25PZmZzZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vZG9tLWFsaWduL2xpYi9nZXRBbGlnbk9mZnNldC5qc1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX1RyYW5zaXRpb24gPSByZXF1aXJlKCcuL1RyYW5zaXRpb24nKTtcblxudmFyIF9UcmFuc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxyXG4gICAqIFNob3cgdGhlIGNvbXBvbmVudDsgdHJpZ2dlcnMgdGhlIGZhZGUgaW4gb3IgZmFkZSBvdXQgYW5pbWF0aW9uXHJcbiAgICovXG4gIFwiaW5cIjogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXHJcbiAgICogVW5tb3VudCB0aGUgY29tcG9uZW50IChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIGl0IGlzIGZhZGVkIG91dFxyXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuYm9vbCxcblxuICAvKipcclxuICAgKiBSdW4gdGhlIGZhZGUgaW4gYW5pbWF0aW9uIHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMsIGlmIGl0IGlzIGluaXRpYWxseVxyXG4gICAqIHNob3duXHJcbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxyXG4gICAqIER1cmF0aW9uIG9mIHRoZSBmYWRlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMsIHRvIGVuc3VyZSB0aGF0IGZpbmlzaGluZ1xyXG4gICAqIGNhbGxiYWNrcyBhcmUgZmlyZWQgZXZlbiBpZiB0aGUgb3JpZ2luYWwgYnJvd3NlciB0cmFuc2l0aW9uIGVuZCBldmVudHMgYXJlXHJcbiAgICogY2FuY2VsZWRcclxuICAgKi9cbiAgdGltZW91dDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcclxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBmYWRlcyBpblxyXG4gICAqL1xuICBvbkVudGVyOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gZmFkZSBpblxyXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGhhcyBjb21wb25lbnQgZmFkZWQgaW5cclxuICAgKi9cbiAgb25FbnRlcmVkOiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgLyoqXHJcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgZmFkZXMgb3V0XHJcbiAgICovXG4gIG9uRXhpdDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgc3RhcnRzIHRvIGZhZGUgb3V0XHJcbiAgICovXG4gIG9uRXhpdGluZzogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGZhZGVkIG91dFxyXG4gICAqL1xuICBvbkV4aXRlZDogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIFwiaW5cIjogZmFsc2UsXG4gIHRpbWVvdXQ6IDMwMCxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2UsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlXG59O1xuXG52YXIgRmFkZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhGYWRlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBGYWRlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGYWRlKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRmFkZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9UcmFuc2l0aW9uMltcImRlZmF1bHRcIl0sIF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKSh0aGlzLnByb3BzLmNsYXNzTmFtZSwgJ2ZhZGUnKSxcbiAgICAgIGVudGVyZWRDbGFzc05hbWU6ICdpbicsXG4gICAgICBlbnRlcmluZ0NsYXNzTmFtZTogJ2luJ1xuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gRmFkZTtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuRmFkZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5GYWRlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBGYWRlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS10cmFuc2l0aW9uL2J1aWxkL0ZhZGUuanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF90aW5wZXJCZWVDb3JlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvL+aYr+WQpuaYr+aJi+mjjueQtOaViOaenFxuICBhY2NvcmRpb246IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5ib29sLFxuICAvL+a/gOa0u+eahOmhuVxuICBhY3RpdmVLZXk6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5hbnksXG4gIC8v6buY6K6k55qE5r+A5rS755qE6aG5XG4gIGRlZmF1bHRBY3RpdmVLZXk6IF9yZWFjdDJbXCJkZWZhdWx0XCJdLlByb3BUeXBlcy5hbnksXG4gIC8v6YCJ5Lit5Ye95pWwXG4gIG9uU2VsZWN0OiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5Qcm9wVHlwZXMuZnVuYyxcbiAgcm9sZTogX3JlYWN0MltcImRlZmF1bHRcIl0uUHJvcFR5cGVzLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYWNjb3JkaW9uOiBmYWxzZSxcbiAgY2xzUHJlZml4OiAndS1wYW5lbC1ncm91cCdcbn07XG5cbi8vIFRPRE86IFVzZSB1bmNvbnRyb2xsYWJsZS5cblxudmFyIFBhbmVsR3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGFuZWxHcm91cCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFuZWxHcm91cChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYW5lbEdyb3VwKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlU2VsZWN0ID0gX3RoaXMuaGFuZGxlU2VsZWN0LmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmVLZXk6IHByb3BzLmRlZmF1bHRBY3RpdmVLZXlcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhbmVsR3JvdXAucHJvdG90eXBlLmhhbmRsZVNlbGVjdCA9IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdChrZXksIGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChrZXksIGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUtleSA9PT0ga2V5KSB7XG4gICAgICBrZXkgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVLZXk6IGtleSB9KTtcbiAgfTtcblxuICBQYW5lbEdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWNjb3JkaW9uID0gX3Byb3BzLmFjY29yZGlvbixcbiAgICAgICAgcHJvcHNBY3RpdmVLZXkgPSBfcHJvcHMuYWN0aXZlS2V5LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGVmYXVsdEFjdGl2ZUtleSA9IF9wcm9wcy5kZWZhdWx0QWN0aXZlS2V5LFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXgsXG4gICAgICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnYWNjb3JkaW9uJywgJ2FjdGl2ZUtleScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nLCAnZGVmYXVsdEFjdGl2ZUtleScsICdvblNlbGVjdCcsICdzdHlsZScsICdjbHNQcmVmaXgnXSk7XG5cbiAgICB2YXIgYWN0aXZlS2V5ID0gdm9pZCAwO1xuICAgIGlmIChhY2NvcmRpb24pIHtcbiAgICAgIGFjdGl2ZUtleSA9IHByb3BzQWN0aXZlS2V5ICE9IG51bGwgPyBwcm9wc0FjdGl2ZUtleSA6IHRoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgICAgb3RoZXJzLnJvbGUgPSBvdGhlcnMucm9sZSB8fCAndGFibGlzdCc7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSB7fTtcbiAgICBjbGFzc2VzWycnICsgY2xzUHJlZml4XSA9IHRydWU7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgX2V4dGVuZHMoe30sIG90aGVycywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmICghX3JlYWN0MltcImRlZmF1bHRcIl0uaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZFByb3BzID0ge1xuICAgICAgICAgIHN0eWxlOiBjaGlsZC5wcm9wcy5zdHlsZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhY2NvcmRpb24pIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGNoaWxkUHJvcHMsIHtcbiAgICAgICAgICAgIGhlYWRlclJvbGU6ICd0YWInLFxuICAgICAgICAgICAgcGFuZWxSb2xlOiAndGFicGFuZWwnLFxuICAgICAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgICAgICBleHBhbmRlZDogY2hpbGQucHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSxcbiAgICAgICAgICAgIG9uU2VsZWN0OiAoMCwgX3RpbnBlckJlZUNvcmUuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKShfdGhpczIuaGFuZGxlU2VsZWN0LCBjaGlsZC5wcm9wcy5vblNlbGVjdClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIGNoaWxkUHJvcHMpO1xuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYW5lbEdyb3VwO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5QYW5lbEdyb3VwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblBhbmVsR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFBhbmVsR3JvdXA7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLXBhbmVsL2J1aWxkL1BhbmVsR3JvdXAuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9CdXR0b24gPSByZXF1aXJlKCcuL0J1dHRvbicpO1xuXG52YXIgX0J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfQnV0dG9uMltcImRlZmF1bHRcIl07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWJ1dHRvbi9idWlsZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIOWwuuWvuFxyXG4gICAgICovXG4gICAgc2l6ZTogX3JlYWN0LlByb3BUeXBlcy5vbmVPZihbJ3NtJywgJ3hnJywgJ2xnJ10pLFxuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIOagt+W8j1xyXG4gICAgICovXG4gICAgc3R5bGU6IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIOW9oueKtlxyXG4gICAgICovXG4gICAgc2hhcGU6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2YoWydibG9jaycsICdyb3VuZCcsICdzcXVhcmVkJywgJ2Zsb2F0aW5nJywgJ3BpbGxSaWdodCcsICdwaWxsTGVmdCcsICdib3JkZXInLCAnaWNvbiddKSxcbiAgICAvKipcclxuICAgICogQHRpdGxlIOexu+Wei1xyXG4gICAgKi9cbiAgICBjb2xvcnM6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2YoWydwcmltYXJ5JywgJ2FjY2VudCcsICdzdWNjZXNzJywgJ2luZm8nLCAnd2FybmluZycsICdkYW5nZXInLCAnZGVmYXVsdCddKSxcbiAgICAvKipcclxuICAgICAqIEB0aXRsZSDmmK/lkKbnpoHnlKhcclxuICAgICAqIEB2ZUlnbm9yZVxyXG4gICAgICovXG4gICAgZGlzYWJsZWQ6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcclxuICAgICAqIEB0aXRsZSDnsbvlkI1cclxuICAgICAqIEB2ZUlnbm9yZVxyXG4gICAgICovXG4gICAgY2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qKlxyXG4gICAgICogQHRpdGxlIDxidXR0b24+IOeahCB0eXBlXHJcbiAgICAgKiBAdmVJZ25vcmVcclxuICAgICAqL1xuICAgIGh0bWxUeXBlOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mKFsnc3VibWl0JywgJ2J1dHRvbicsICdyZXNldCddKVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgaHRtbFR5cGU6ICdidXR0b24nLFxuICAgIGNsc1ByZWZpeDogJ3UtYnV0dG9uJ1xuXG59O1xuXG52YXIgc2l6ZU1hcCA9IHtcbiAgICBzbTogJ3NtJyxcbiAgICB4ZzogJ3hnJyxcbiAgICBsZzogJ2xnJ1xufSxcbiAgICBjb2xvcnNNYXAgPSB7XG4gICAgcHJpbWFyeTogJ3ByaW1hcnknLFxuICAgIGFjY2VudDogJ2FjY2VudCcsXG4gICAgc3VjY2VzczogJ3N1Y2Nlc3MnLFxuICAgIGluZm86ICdpbmZvJyxcbiAgICB3YXJuaW5nOiAnd2FybmluZycsXG4gICAgZGFuZ2VyOiAnZGFuZ2VyJ1xufSxcbiAgICBzaGFwZU1hcCA9IHtcbiAgICBibG9jazogJ2Jsb2NrJyxcbiAgICByb3VuZDogJ3JvdW5kJyxcbiAgICBib3JkZXI6ICdib3JkZXInLFxuICAgIHNxdWFyZWQ6ICdzcXVhcmVkJyxcbiAgICBmbG9hdGluZzogJ2Zsb2F0aW5nJyxcbiAgICBwaWxsUmlnaHQ6ICdwaWxsLXJpZ2h0JyxcbiAgICBwaWxsTGVmdDogJ3BpbGwtbGVmdCcsXG4gICAgaWNvbjogJ2ljb24nXG59O1xuXG52YXIgQnV0dG9uID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoQnV0dG9uLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEJ1dHRvbihwcm9wcykge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnV0dG9uKTtcblxuICAgICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgfVxuXG4gICAgQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgY29sb3JzID0gX3Byb3BzLmNvbG9ycyxcbiAgICAgICAgICAgIHNoYXBlID0gX3Byb3BzLnNoYXBlLFxuICAgICAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgc2l6ZSA9IF9wcm9wcy5zaXplLFxuICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICBodG1sVHlwZSA9IF9wcm9wcy5odG1sVHlwZSxcbiAgICAgICAgICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXgsXG4gICAgICAgICAgICBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NvbG9ycycsICdzaGFwZScsICdkaXNhYmxlZCcsICdjbGFzc05hbWUnLCAnc2l6ZScsICdjaGlsZHJlbicsICdodG1sVHlwZScsICdjbHNQcmVmaXgnXSk7XG5cbiAgICAgICAgdmFyIGNsc09iaiA9IHt9O1xuICAgICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBjbHNPYmpbY2xhc3NOYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemVNYXBbc2l6ZV0pIHtcbiAgICAgICAgICAgIGNsc09ialtjbHNQcmVmaXggKyAnLScgKyBzaXplTWFwW3NpemVdXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlTWFwW3NoYXBlXSkge1xuICAgICAgICAgICAgY2xzT2JqW2Nsc1ByZWZpeCArICctJyArIHNoYXBlTWFwW3NoYXBlXV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xvcnNNYXBbY29sb3JzXSkge1xuICAgICAgICAgICAgY2xzT2JqW2Nsc1ByZWZpeCArICctJyArIGNvbG9yc01hcFtjb2xvcnNdXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsYXNzZXMgPSAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2xzUHJlZml4LCBjbHNPYmopO1xuICAgICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdidXR0b24nLFxuICAgICAgICAgICAgX2V4dGVuZHMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IGh0bWxUeXBlLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICAgICAgICAgIH0sIG90aGVycyksXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHJldHVybiBCdXR0b247XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5CdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBCdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWJ1dHRvbi9idWlsZC9CdXR0b24uanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9Gb3JtR3JvdXAgPSByZXF1aXJlKCcuL0Zvcm1Hcm91cCcpO1xuXG52YXIgX0Zvcm1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXApO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfRm9ybUdyb3VwMltcImRlZmF1bHRcIl07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWZvcm0tZ3JvdXAvYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdFx0XHRcdHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG5cdFx0XHRcdHZhbGlkYXRpb25TdGF0ZTogX3JlYWN0LlByb3BUeXBlcy5vbmVPZihbJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdlcnJvciddKVxufTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG5cdFx0XHRcdGNsc1ByZWZpeDogJ3UtZm9ybS1ncm91cCdcbn07XG5cbnZhciBGb3JtR3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuXHRcdFx0XHRfaW5oZXJpdHMoRm9ybUdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuXHRcdFx0XHRmdW5jdGlvbiBGb3JtR3JvdXAocHJvcHMpIHtcblx0XHRcdFx0XHRcdFx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybUdyb3VwKTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdEZvcm1Hcm91cC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuXHRcdFx0XHRcdFx0XHRcdCAgICB2YWxpZGF0aW9uU3RhdGUgPSBfcHJvcHMudmFsaWRhdGlvblN0YXRlLFxuXHRcdFx0XHRcdFx0XHRcdCAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuXHRcdFx0XHRcdFx0XHRcdCAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcblx0XHRcdFx0XHRcdFx0XHQgICAgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeCxcblx0XHRcdFx0XHRcdFx0XHQgICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wcywgWyd2YWxpZGF0aW9uU3RhdGUnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJywgJ2Nsc1ByZWZpeCddKTtcblxuXHRcdFx0XHRcdFx0XHRcdHZhciBjbGFzc2VzID0ge307XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodmFsaWRhdGlvblN0YXRlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc2VzWydoYXMtJyArIHZhbGlkYXRpb25TdGF0ZV0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHZhciBjbGFzc05hbWVzID0gKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsc1ByZWZpeCwgY2xhc3Nlcyk7XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2V4dGVuZHMoe30sIG90aGVycywge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUsIGNsYXNzTmFtZXMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkcmVuXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRyZXR1cm4gRm9ybUdyb3VwO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5Gb3JtR3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRm9ybUdyb3VwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBGb3JtR3JvdXA7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWZvcm0tZ3JvdXAvYnVpbGQvRm9ybUdyb3VwLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfRm9ybUNvbnRyb2wgPSByZXF1aXJlKCcuL0Zvcm1Db250cm9sJyk7XG5cbnZhciBfRm9ybUNvbnRyb2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybUNvbnRyb2wpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfRm9ybUNvbnRyb2wyW1wiZGVmYXVsdFwiXTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtZm9ybS1jb250cm9sL2J1aWxkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9yZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtfcmVhY3QuUHJvcFR5cGVzLmVsZW1lbnQsIF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXSksXG4gIHR5cGU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBzaXplOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mKFsnc20nLCAnbWQnLCAnbGcnXSksXG4gIGlkOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdpbnB1dCcsXG4gIGNsc1ByZWZpeDogJ3UtZm9ybS1jb250cm9sJyxcbiAgdHlwZTogJ3RleHQnLFxuICBzaXplOiAnbWQnXG59O1xuXG52YXIgRm9ybUNvbnRyb2wgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRm9ybUNvbnRyb2wsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm1Db250cm9sKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtQ29udHJvbCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEZvcm1Db250cm9sLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIGZvcm1Hcm91cCA9IHRoaXMuY29udGV4dC4kYnNfZm9ybUdyb3VwO1xuICAgIHZhciBjb250cm9sSWQgPSBmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmNvbnRyb2xJZDtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIHR5cGUgPSBfcHJvcHMudHlwZSxcbiAgICAgICAgX3Byb3BzJGlkID0gX3Byb3BzLmlkLFxuICAgICAgICBpZCA9IF9wcm9wcyRpZCA9PT0gdW5kZWZpbmVkID8gY29udHJvbElkIDogX3Byb3BzJGlkLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzaXplID0gX3Byb3BzLnNpemUsXG4gICAgICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXgsXG4gICAgICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAndHlwZScsICdpZCcsICdjbGFzc05hbWUnLCAnc2l6ZScsICdjbHNQcmVmaXgnXSk7XG5cbiAgICAoMCwgX3dhcm5pbmcyW1wiZGVmYXVsdFwiXSkoY29udHJvbElkID09IG51bGwgfHwgaWQgPT09IGNvbnRyb2xJZCwgJ2Bjb250cm9sSWRgIGlzIGlnbm9yZWQgb24gYDxGb3JtQ29udHJvbD5gIHdoZW4gYGlkYCBpcyBzcGVjaWZpZWQuJyk7XG5cbiAgICAvLyBpbnB1dFt0eXBlPVwiZmlsZVwiXSDkuI3lupTor6XmnInnsbvlkI0gLmZvcm0tY29udHJvbC5cbiAgICB2YXIgY2xhc3NlcyA9IHt9O1xuICAgIGlmIChzaXplKSB7XG4gICAgICBjbGFzc2VzWycnICsgc2l6ZV0gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBjbGFzc05hbWVzID0gdm9pZCAwO1xuICAgIGlmICh0eXBlICE9PSAnZmlsZScpIHtcbiAgICAgIGNsYXNzTmFtZXMgPSAoMCwgX2NsYXNzbmFtZXMyW1wiZGVmYXVsdFwiXSkoY2xzUHJlZml4LCBjbGFzc2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBpZDogaWQsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc05hbWUsIGNsYXNzTmFtZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBGb3JtQ29udHJvbDtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuRm9ybUNvbnRyb2wucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRm9ybUNvbnRyb2wuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZvcm1Db250cm9sO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1mb3JtLWNvbnRyb2wvYnVpbGQvRm9ybUNvbnRyb2wuanNcbi8vIG1vZHVsZSBpZCA9IDY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9JbnB1dEdyb3VwJyk7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBzcmMvaW5kZXguanMiLCJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBJbnB1dEdyb3VwQWRkb24gZnJvbSAnYmVlLWlucHV0LWdyb3VwLWFkZG9uJztcbmltcG9ydCBJbnB1dEdyb3VwQnV0dG9uIGZyb20gJ2JlZS1pbnB1dC1ncm91cC1idXR0b24nO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsc1ByZWZpeDogJ3UtaW5wdXQtZ3JvdXAnLFxuICBzaW1wbGU6IGZhbHNlXG59XG5cbmNsYXNzIElucHV0R3JvdXAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjbGFzc05hbWUsY2xzUHJlZml4LCBzaW1wbGUsLi4ub3RoZXJzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuXG4gICAgICAgIHsuLi5vdGhlcnN9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyhjbGFzc05hbWUsIGNsc1ByZWZpeCwgc2ltcGxlJiYnc2ltcGxlJyl9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gICog5bCGSW5wdXRHcm91cEFkZG9u5LiOSW5wdXRHcm91cEJ1dHRvbue7hOS7tuS9nOS4uklucHV0R3JvdXDnmoTpmYTlsZ7nu4Tku7ZcbiAgKi9cbklucHV0R3JvdXAuQWRkb24gPSBJbnB1dEdyb3VwQWRkb247XG5JbnB1dEdyb3VwLkJ1dHRvbiA9IElucHV0R3JvdXBCdXR0b247XG5JbnB1dEdyb3VwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IElucHV0R3JvdXA7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHNyYy9JbnB1dEdyb3VwLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX0lucHV0R3JvdXBBZGRvbiA9IHJlcXVpcmUoJy4vSW5wdXRHcm91cEFkZG9uJyk7XG5cbnZhciBfSW5wdXRHcm91cEFkZG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0lucHV0R3JvdXBBZGRvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9JbnB1dEdyb3VwQWRkb24yW1wiZGVmYXVsdFwiXTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtaW5wdXQtZ3JvdXAtYWRkb24vYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsc1ByZWZpeDogJ3UtaW5wdXQtZ3JvdXAtYWRkb24nXG59O1xuXG52YXIgSW5wdXRHcm91cEFkZG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKElucHV0R3JvdXBBZGRvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSW5wdXRHcm91cEFkZG9uKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnB1dEdyb3VwQWRkb24pO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbnB1dEdyb3VwQWRkb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeDtcblxuICAgIHZhciBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NsYXNzTmFtZScsICdjbHNQcmVmaXgnXSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnc3BhbicsIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzTmFtZSwgY2xzUHJlZml4KVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXRHcm91cEFkZG9uO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG5JbnB1dEdyb3VwQWRkb24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBJbnB1dEdyb3VwQWRkb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWlucHV0LWdyb3VwLWFkZG9uL2J1aWxkL0lucHV0R3JvdXBBZGRvbi5qc1xuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX0lucHV0R3JvdXBCdXR0b24gPSByZXF1aXJlKCcuL0lucHV0R3JvdXBCdXR0b24nKTtcblxudmFyIF9JbnB1dEdyb3VwQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0lucHV0R3JvdXBCdXR0b24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfSW5wdXRHcm91cEJ1dHRvbjJbXCJkZWZhdWx0XCJdO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1pbnB1dC1ncm91cC1idXR0b24vYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsc1ByZWZpeDogJ3UtaW5wdXQtZ3JvdXAtYnRuJ1xufTtcblxudmFyIElucHV0R3JvdXBCdXR0b24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSW5wdXRHcm91cEJ1dHRvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSW5wdXRHcm91cEJ1dHRvbigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5wdXRHcm91cEJ1dHRvbik7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIElucHV0R3JvdXBCdXR0b24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgY2xzUHJlZml4ID0gX3Byb3BzLmNsc1ByZWZpeDtcblxuICAgIHZhciBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NsYXNzTmFtZScsICdjbHNQcmVmaXgnXSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudCgnc3BhbicsIF9leHRlbmRzKHt9LCBvdGhlcnMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzTmFtZSwgY2xzUHJlZml4KVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXRHcm91cEJ1dHRvbjtcbn0oX3JlYWN0MltcImRlZmF1bHRcIl0uQ29tcG9uZW50KTtcblxuSW5wdXRHcm91cEJ1dHRvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IElucHV0R3JvdXBCdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWlucHV0LWdyb3VwLWJ1dHRvbi9idWlsZC9JbnB1dEdyb3VwQnV0dG9uLmpzXG4vLyBtb2R1bGUgaWQgPSA3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfRHJvcGRvd24gPSByZXF1aXJlKCcuL0Ryb3Bkb3duJyk7XG5cbnZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfRHJvcGRvd24yW1wiZGVmYXVsdFwiXTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtZHJvcGRvd24vYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX3RyaWdnZXIgPSByZXF1aXJlKCdiZWUtb3ZlcmxheS9idWlsZC90cmlnZ2VyJyk7XG5cbnZhciBfdHJpZ2dlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90cmlnZ2VyKTtcblxudmFyIF9wbGFjZW1lbnQgPSByZXF1aXJlKCcuL3BsYWNlbWVudCcpO1xuXG52YXIgX3BsYWNlbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wbGFjZW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgbWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9uVmlzaWJsZUNoYW5nZTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBjbHNQcmVmaXg6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIHRyYW5zaXRpb25OYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb3ZlcmxheUNsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFuaW1hdGlvbjogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIGFsaWduOiBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdCxcbiAgb3ZlcmxheVN0eWxlOiBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdCxcbiAgcGxhY2VtZW50OiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgdHJpZ2dlcjogX3JlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgc2hvd0FjdGlvbjogX3JlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgaGlkZUFjdGlvbjogX3JlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgZ2V0UG9wdXBDb250YWluZXI6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgbWluT3ZlcmxheVdpZHRoTWF0Y2hUcmlnZ2VyOiB0cnVlLFxuICBjbHNQcmVmaXg6ICd1LWRyb3Bkb3duJyxcbiAgdHJpZ2dlcjogWydob3ZlciddLFxuICBzaG93QWN0aW9uOiBbXSxcbiAgaGlkZUFjdGlvbjogW10sXG4gIG92ZXJsYXlDbGFzc05hbWU6ICcnLFxuICBvdmVybGF5U3R5bGU6IHt9LFxuICBkZWZhdWx0VmlzaWJsZTogZmFsc2UsXG4gIG9uVmlzaWJsZUNoYW5nZTogZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKCkge30sXG5cbiAgcGxhY2VtZW50OiAnYm90dG9tTGVmdCdcbn07XG5cbnZhciBqYWRnZVN0YXRlID0gZnVuY3Rpb24gamFkZ2VTdGF0ZShwcm9wcykge1xuICBpZiAoJ3Zpc2libGUnIGluIHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnZpc2libGU7XG4gIH1cbiAgcmV0dXJuIHByb3BzLmRlZmF1bHRWaXNpYmxlO1xufTtcblxudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERyb3Bkb3duLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bihwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEcm9wZG93bik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgdmlzaWJsZTogamFkZ2VTdGF0ZShfdGhpcy5wcm9wcylcbiAgICB9O1xuICAgIF90aGlzLm9uQ2xpY2sgPSBfdGhpcy5vbkNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uVmlzaWJsZUNoYW5nZSA9IF90aGlzLm9uVmlzaWJsZUNoYW5nZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRNZW51RWxlbWVudCA9IF90aGlzLmdldE1lbnVFbGVtZW50LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFBvcHVwRG9tTm9kZSA9IF90aGlzLmdldFBvcHVwRG9tTm9kZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5hZnRlclZpc2libGVDaGFuZ2UgPSBfdGhpcy5hZnRlclZpc2libGVDaGFuZ2UuYmluZChfdGhpcyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBEcm9wZG93bi5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoX3JlZikge1xuICAgIHZhciB2aXNpYmxlID0gX3JlZi52aXNpYmxlO1xuXG4gICAgaWYgKHZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIG92ZXJsYXlQcm9wcyA9IHByb3BzLm92ZXJsYXkucHJvcHM7XG4gICAgLy8gZG8gbm8gY2FsbCBvblZpc2libGVDaGFuZ2UsIGlmIHlvdSBuZWVkIGNsaWNrIHRvIGhpZGUsIHVzZSBvbkNsaWNrIGFuZCBjb250cm9sIHZpc2libGVcbiAgICBpZiAoISgndmlzaWJsZScgaW4gcHJvcHMpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAob3ZlcmxheVByb3BzLm9uQ2xpY2spIHtcbiAgICAgIG92ZXJsYXlQcm9wcy5vbkNsaWNrKGUpO1xuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUub25WaXNpYmxlQ2hhbmdlID0gZnVuY3Rpb24gb25WaXNpYmxlQ2hhbmdlKHZpc2libGUpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIGlmICghKCd2aXNpYmxlJyBpbiBwcm9wcykpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2aXNpYmxlOiB2aXNpYmxlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJvcHMub25WaXNpYmxlQ2hhbmdlKHZpc2libGUpO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5nZXRNZW51RWxlbWVudCA9IGZ1bmN0aW9uIGdldE1lbnVFbGVtZW50KCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvdmVybGF5ID0gX3Byb3BzLm92ZXJsYXksXG4gICAgICAgIGNsc1ByZWZpeCA9IF9wcm9wcy5jbHNQcmVmaXg7XG5cblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQob3ZlcmxheSwge1xuICAgICAgY2xzUHJlZml4OiBjbHNQcmVmaXggKyAnLW1lbnUnLFxuICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrXG4gICAgfSk7XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmdldFBvcHVwRG9tTm9kZSA9IGZ1bmN0aW9uIGdldFBvcHVwRG9tTm9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZzLnRyaWdnZXIuZ2V0UG9wdXBEb21Ob2RlKCk7XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmFmdGVyVmlzaWJsZUNoYW5nZSA9IGZ1bmN0aW9uIGFmdGVyVmlzaWJsZUNoYW5nZSh2aXNpYmxlKSB7XG4gICAgaWYgKHZpc2libGUgJiYgdGhpcy5wcm9wcy5taW5PdmVybGF5V2lkdGhNYXRjaFRyaWdnZXIpIHtcbiAgICAgIHZhciBvdmVybGF5Tm9kZSA9IHRoaXMuZ2V0UG9wdXBEb21Ob2RlKCk7XG4gICAgICB2YXIgcm9vdE5vZGUgPSBfcmVhY3REb20yW1wiZGVmYXVsdFwiXS5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICAgIGlmIChyb290Tm9kZS5vZmZzZXRXaWR0aCA+IG92ZXJsYXlOb2RlLm9mZnNldFdpZHRoKSB7XG4gICAgICAgIG92ZXJsYXlOb2RlLnN0eWxlLndpZHRoID0gcm9vdE5vZGUub2Zmc2V0V2lkdGggKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xzUHJlZml4ID0gX3Byb3BzMi5jbHNQcmVmaXgsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzMi5jaGlsZHJlbixcbiAgICAgICAgdHJhbnNpdGlvbk5hbWUgPSBfcHJvcHMyLnRyYW5zaXRpb25OYW1lLFxuICAgICAgICBhbmltYXRpb24gPSBfcHJvcHMyLmFuaW1hdGlvbixcbiAgICAgICAgYWxpZ24gPSBfcHJvcHMyLmFsaWduLFxuICAgICAgICBwbGFjZW1lbnQgPSBfcHJvcHMyLnBsYWNlbWVudCxcbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXIgPSBfcHJvcHMyLmdldFBvcHVwQ29udGFpbmVyLFxuICAgICAgICBzaG93QWN0aW9uID0gX3Byb3BzMi5zaG93QWN0aW9uLFxuICAgICAgICBoaWRlQWN0aW9uID0gX3Byb3BzMi5oaWRlQWN0aW9uLFxuICAgICAgICBvdmVybGF5Q2xhc3NOYW1lID0gX3Byb3BzMi5vdmVybGF5Q2xhc3NOYW1lLFxuICAgICAgICBvdmVybGF5U3R5bGUgPSBfcHJvcHMyLm92ZXJsYXlTdHlsZSxcbiAgICAgICAgdHJpZ2dlciA9IF9wcm9wczIudHJpZ2dlcixcbiAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzMiwgWydjbHNQcmVmaXgnLCAnY2hpbGRyZW4nLCAndHJhbnNpdGlvbk5hbWUnLCAnYW5pbWF0aW9uJywgJ2FsaWduJywgJ3BsYWNlbWVudCcsICdnZXRQb3B1cENvbnRhaW5lcicsICdzaG93QWN0aW9uJywgJ2hpZGVBY3Rpb24nLCAnb3ZlcmxheUNsYXNzTmFtZScsICdvdmVybGF5U3R5bGUnLCAndHJpZ2dlciddKTtcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX3RyaWdnZXIyW1wiZGVmYXVsdFwiXSxcbiAgICAgIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBjbHNQcmVmaXg6IGNsc1ByZWZpeCxcbiAgICAgICAgcmVmOiAndHJpZ2dlcicsXG4gICAgICAgIHBvcHVwQ2xhc3NOYW1lOiBvdmVybGF5Q2xhc3NOYW1lLFxuICAgICAgICBwb3B1cFN0eWxlOiBvdmVybGF5U3R5bGUsXG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzOiBfcGxhY2VtZW50MltcImRlZmF1bHRcIl0sXG4gICAgICAgIGFjdGlvbjogdHJpZ2dlcixcbiAgICAgICAgc2hvd0FjdGlvbjogc2hvd0FjdGlvbixcbiAgICAgICAgaGlkZUFjdGlvbjogaGlkZUFjdGlvbixcbiAgICAgICAgcG9wdXBQbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgICAgcG9wdXBBbGlnbjogYWxpZ24sXG4gICAgICAgIHBvcHVwVHJhbnNpdGlvbk5hbWU6IHRyYW5zaXRpb25OYW1lLFxuICAgICAgICBwb3B1cEFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgICAgICBwb3B1cFZpc2libGU6IHRoaXMuc3RhdGUudmlzaWJsZSxcbiAgICAgICAgYWZ0ZXJQb3B1cFZpc2libGVDaGFuZ2U6IHRoaXMuYWZ0ZXJWaXNpYmxlQ2hhbmdlLFxuICAgICAgICBwb3B1cDogdGhpcy5nZXRNZW51RWxlbWVudCgpLFxuICAgICAgICBvblBvcHVwVmlzaWJsZUNoYW5nZTogdGhpcy5vblZpc2libGVDaGFuZ2UsXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duO1xufShfcmVhY3QyW1wiZGVmYXVsdFwiXS5Db21wb25lbnQpO1xuXG47XG5cbkRyb3Bkb3duLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkRyb3Bkb3duLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEcm9wZG93bjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtZHJvcGRvd24vYnVpbGQvRHJvcGRvd24uanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL1RyaWdnZXInKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfY29udGFpbnMgPSByZXF1aXJlKCdkb20taGVscGVycy9xdWVyeS9jb250YWlucycpO1xuXG52YXIgX2NvbnRhaW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnRhaW5zKTtcblxudmFyIF90aW5wZXJCZWVDb3JlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlJyk7XG5cbnZhciBfUG9wdXAgPSByZXF1aXJlKCcuL1BvcHVwJyk7XG5cbnZhciBfUG9wdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wdXApO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbi8vaW1wb3J0IGdldENvbnRhaW5lclJlbmRlck1peGluIGZyb20gJy4vZ2V0Q29udGFpbmVyUmVuZGVyTWl4aW4nO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gcmV0dXJuRW1wdHlTdHJpbmcoKSB7XG4gIHJldHVybiAnJztcbn1cblxudmFyIEFMTF9IQU5ETEVSUyA9IFsnb25DbGljaycsICdvbk1vdXNlRG93bicsICdvblRvdWNoU3RhcnQnLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbkZvY3VzJywgJ29uQmx1ciddO1xuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIGFjdGlvbjogX3JlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLCBfcmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcpXSksXG4gIHNob3dBY3Rpb246IF9yZWFjdC5Qcm9wVHlwZXMuYW55LFxuICBoaWRlQWN0aW9uOiBfcmVhY3QuUHJvcFR5cGVzLmFueSxcbiAgZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ246IF9yZWFjdC5Qcm9wVHlwZXMuYW55LFxuICBvblBvcHVwVmlzaWJsZUNoYW5nZTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBwb3B1cDogX3JlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW19yZWFjdC5Qcm9wVHlwZXMubm9kZSwgX3JlYWN0LlByb3BUeXBlcy5mdW5jXSkuaXNSZXF1aXJlZCxcbiAgcG9wdXBTdHlsZTogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gIGNsc1ByZWZpeDogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHBvcHVwQ2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcG9wdXBQbGFjZW1lbnQ6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBidWlsdGluUGxhY2VtZW50czogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gIHBvcHVwVHJhbnNpdGlvbk5hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBwb3B1cEFuaW1hdGlvbjogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIG1vdXNlRW50ZXJEZWxheTogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIG1vdXNlTGVhdmVEZWxheTogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIHpJbmRleDogX3JlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGZvY3VzRGVsYXk6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBibHVyRGVsYXk6IF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBnZXRQb3B1cENvbnRhaW5lcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBkZXN0cm95UG9wdXBPbkhpZGU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbWFzazogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBtYXNrQ2xvc2FibGU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgb25Qb3B1cEFsaWduOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHBvcHVwQWxpZ246IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICBwb3B1cFZpc2libGU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgbWFza0FuaW1hdGlvbjogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsc1ByZWZpeDogJ3JjLXRyaWdnZXItcG9wdXAnLFxuICBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbjogcmV0dXJuRW1wdHlTdHJpbmcsXG4gIG9uUG9wdXBWaXNpYmxlQ2hhbmdlOiBub29wLFxuICBhZnRlclBvcHVwVmlzaWJsZUNoYW5nZTogbm9vcCxcbiAgb25Qb3B1cEFsaWduOiBub29wLFxuICBwb3B1cENsYXNzTmFtZTogJycsXG4gIG1vdXNlRW50ZXJEZWxheTogMCxcbiAgbW91c2VMZWF2ZURlbGF5OiAwLjEsXG4gIGZvY3VzRGVsYXk6IDAsXG4gIGJsdXJEZWxheTogMC4xNSxcbiAgcG9wdXBTdHlsZToge30sXG4gIGRlc3Ryb3lQb3B1cE9uSGlkZTogZmFsc2UsXG4gIHBvcHVwQWxpZ246IHt9LFxuICBkZWZhdWx0UG9wdXBWaXNpYmxlOiBmYWxzZSxcbiAgbWFzazogZmFsc2UsXG4gIG1hc2tDbG9zYWJsZTogdHJ1ZSxcbiAgYWN0aW9uOiBbXSxcbiAgc2hvd0FjdGlvbjogW10sXG4gIGhpZGVBY3Rpb246IFtdXG59O1xuXG52YXIgVHJpZ2dlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhUcmlnZ2VyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmlnZ2VyKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyaWdnZXIpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHBvcHVwVmlzaWJsZTogISFfdGhpcy5wcm9wcy5wb3B1cFZpc2libGUgfHwgX3RoaXMucHJvcHMuZGVmYXVsdFBvcHVwVmlzaWJsZVxuICAgIH07XG4gICAgLy90aGlzLnJlbW92ZUNvbnRhaW5lciA9IHRoaXMucmVtb3ZlQ29udGFpbmVyLmJpbmQodGhpcyk7XG4gICAgX3RoaXMuZ2V0Q29udGFpbmVyID0gX3RoaXMuZ2V0Q29udGFpbmVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnJlbmRlckNvbXBvbmVudCA9IF90aGlzLnJlbmRlckNvbXBvbmVudC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5pc1Zpc2libGUgPSBfdGhpcy5pc1Zpc2libGUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5vbk1vdXNlRW50ZXIgPSBfdGhpcy5vbk1vdXNlRW50ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25Nb3VzZUxlYXZlID0gX3RoaXMub25Nb3VzZUxlYXZlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uUG9wdXBNb3VzZUVudGVyID0gX3RoaXMub25Qb3B1cE1vdXNlRW50ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25Qb3B1cE1vdXNlTGVhdmUgPSBfdGhpcy5vblBvcHVwTW91c2VMZWF2ZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkZvY3VzID0gX3RoaXMub25Gb2N1cy5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLm9uTW91c2VEb3duID0gX3RoaXMub25Nb3VzZURvd24uYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25Ub3VjaFN0YXJ0ID0gX3RoaXMub25Ub3VjaFN0YXJ0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQmx1ciA9IF90aGlzLm9uQmx1ci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbkRvY3VtZW50Q2xpY2sgPSBfdGhpcy5vbkRvY3VtZW50Q2xpY2suYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0UG9wdXBEb21Ob2RlID0gX3RoaXMuZ2V0UG9wdXBEb21Ob2RlLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuZ2V0Um9vdERvbU5vZGUgPSBfdGhpcy5nZXRSb290RG9tTm9kZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbiA9IF90aGlzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFBvcHVwQWxpZ24gPSBfdGhpcy5nZXRQb3B1cEFsaWduLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldENvbXBvbmVudCA9IF90aGlzLmdldENvbXBvbmVudC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5zZXRQb3B1cFZpc2libGUgPSBfdGhpcy5zZXRQb3B1cFZpc2libGUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZSA9IF90aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmNsZWFyRGVsYXlUaW1lciA9IF90aGlzLmNsZWFyRGVsYXlUaW1lci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5jcmVhdGVUd29DaGFpbnMgPSBfdGhpcy5jcmVhdGVUd29DaGFpbnMuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaXNDbGlja1RvU2hvdyA9IF90aGlzLmlzQ2xpY2tUb1Nob3cuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaXNDbGlja1RvSGlkZSA9IF90aGlzLmlzQ2xpY2tUb0hpZGUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5pc01vdXNlRW50ZXJUb1Nob3cgPSBfdGhpcy5pc01vdXNlRW50ZXJUb1Nob3cuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaXNNb3VzZUxlYXZlVG9IaWRlID0gX3RoaXMuaXNNb3VzZUxlYXZlVG9IaWRlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmlzRm9jdXNUb1Nob3cgPSBfdGhpcy5pc0ZvY3VzVG9TaG93LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmlzQmx1clRvSGlkZSA9IF90aGlzLmlzQmx1clRvSGlkZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5mb3JjZVBvcHVwQWxpZ24gPSBfdGhpcy5mb3JjZVBvcHVwQWxpZ24uYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5maXJlRXZlbnRzID0gX3RoaXMuZmlyZUV2ZW50cy5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5jbG9zZSA9IF90aGlzLmNsb3NlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uQ2xpY2sgPSBfdGhpcy5vbkNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRyaWdnZXIucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uIGlzVmlzaWJsZShpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZS5wb3B1cFZpc2libGU7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gZ2V0Q29udGFpbmVyKGluc3RhbmNlKSB7XG4gICAgdmFyIHBvcHVwQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIG1vdW50Tm9kZSA9IGluc3RhbmNlLnByb3BzLmdldFBvcHVwQ29udGFpbmVyID8gaW5zdGFuY2UucHJvcHMuZ2V0UG9wdXBDb250YWluZXIoKDAsIF9yZWFjdERvbS5maW5kRE9NTm9kZSkoaW5zdGFuY2UpKSA6IGRvY3VtZW50LmJvZHk7XG4gICAgbW91bnROb2RlLmFwcGVuZENoaWxkKHBvcHVwQ29udGFpbmVyKTtcbiAgICByZXR1cm4gcG9wdXBDb250YWluZXI7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUucmVuZGVyQ29tcG9uZW50ID0gZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KGluc3RhbmNlLCBjb21wb25lbnRBcmcsIHJlYWR5KSB7XG4gICAgaWYgKGluc3RhbmNlLl9jb21wb25lbnQgfHwgdGhpcy5pc1Zpc2libGUoaW5zdGFuY2UpKSB7XG4gICAgICBpZiAoIWluc3RhbmNlLl9jb250YWluZXIpIHtcbiAgICAgICAgaW5zdGFuY2UuX2NvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb21wb25lbnQgPSBpbnN0YW5jZS5nZXRDb21wb25lbnQoY29tcG9uZW50QXJnKTtcbiAgICAgIF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKGluc3RhbmNlLCBjb21wb25lbnQsIGluc3RhbmNlLl9jb250YWluZXIsIGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICBpbnN0YW5jZS5fY29tcG9uZW50ID0gdGhpcztcbiAgICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgICAgcmVhZHkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIEFMTF9IQU5ETEVSUy5mb3JFYWNoKGZ1bmN0aW9uIChoKSB7XG4gICAgICBfdGhpczJbJ2ZpcmUnICsgaF0gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpczIuZmlyZUV2ZW50cyhoLCBlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlKHt9LCB7XG4gICAgICBwb3B1cFZpc2libGU6IHRoaXMuc3RhdGUucG9wdXBWaXNpYmxlXG4gICAgfSk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoX3JlZikge1xuICAgIHZhciBwb3B1cFZpc2libGUgPSBfcmVmLnBvcHVwVmlzaWJsZTtcblxuICAgIGlmIChwb3B1cFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHBvcHVwVmlzaWJsZTogcG9wdXBWaXNpYmxlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF8sIHByZXZTdGF0ZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICB0aGlzLnJlbmRlckNvbXBvbmVudCh0aGlzLCBudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAocHJldlN0YXRlLnBvcHVwVmlzaWJsZSAhPT0gc3RhdGUucG9wdXBWaXNpYmxlKSB7XG4gICAgICAgIHByb3BzLmFmdGVyUG9wdXBWaXNpYmxlQ2hhbmdlKHN0YXRlLnBvcHVwVmlzaWJsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXNDbGlja1RvSGlkZSgpKSB7XG4gICAgICBpZiAoc3RhdGUucG9wdXBWaXNpYmxlKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGlja091dHNpZGVIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy5jbGlja091dHNpZGVIYW5kbGVyID0gKDAsIF90aW5wZXJCZWVDb3JlLmFkZEV2ZW50TGlzdGVuZXIpKGRvY3VtZW50LCAnbW91c2Vkb3duJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xuICAgICAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlciA9ICgwLCBfdGlucGVyQmVlQ29yZS5hZGRFdmVudExpc3RlbmVyKShkb2N1bWVudCwgJ3RvdWNoc3RhcnQnLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jbGlja091dHNpZGVIYW5kbGVyKSB7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy50b3VjaE91dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgIGlmICh0aGlzLmNsaWNrT3V0c2lkZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlci5yZW1vdmUoKTtcbiAgICAgIHRoaXMudG91Y2hPdXRzaWRlSGFuZGxlci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuY2xpY2tPdXRzaWRlSGFuZGxlciA9IG51bGw7XG4gICAgICB0aGlzLnRvdWNoT3V0c2lkZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgICAvL3RoaXMucmVtb3ZlQ29udGFpbmVyKCk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gb25Nb3VzZUVudGVyKGUpIHtcbiAgICB0aGlzLmZpcmVFdmVudHMoJ29uTW91c2VFbnRlcicsIGUpO1xuICAgIHRoaXMuZGVsYXlTZXRQb3B1cFZpc2libGUodHJ1ZSwgdGhpcy5wcm9wcy5tb3VzZUVudGVyRGVsYXkpO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLm9uTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIG9uTW91c2VMZWF2ZShlKSB7XG4gICAgdGhpcy5maXJlRXZlbnRzKCdvbk1vdXNlTGVhdmUnLCBlKTtcbiAgICB0aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCB0aGlzLnByb3BzLm1vdXNlTGVhdmVEZWxheSk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUub25Qb3B1cE1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvblBvcHVwTW91c2VFbnRlcigpIHtcbiAgICB0aGlzLmNsZWFyRGVsYXlUaW1lcigpO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLm9uUG9wdXBNb3VzZUxlYXZlID0gZnVuY3Rpb24gb25Qb3B1cE1vdXNlTGVhdmUoZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvdHJpZ2dlci9wdWxsLzEzXG4gICAgLy8gcmVhY3QgYnVnP1xuICAgIGlmIChlLnJlbGF0ZWRUYXJnZXQgJiYgIWUucmVsYXRlZFRhcmdldC5zZXRUaW1lb3V0ICYmIHRoaXMuX2NvbXBvbmVudCAmJiAoMCwgX2NvbnRhaW5zMltcImRlZmF1bHRcIl0pKHRoaXMuX2NvbXBvbmVudC5nZXRQb3B1cERvbU5vZGUoKSwgZS5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKGZhbHNlLCB0aGlzLnByb3BzLm1vdXNlTGVhdmVEZWxheSk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUub25Gb2N1cyA9IGZ1bmN0aW9uIG9uRm9jdXMoZSkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25Gb2N1cycsIGUpO1xuICAgIC8vIGluY2FzZSBmb2N1c2luIGFuZCBmb2N1c291dFxuICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgaWYgKHRoaXMuaXNGb2N1c1RvU2hvdygpKSB7XG4gICAgICB0aGlzLmZvY3VzVGltZSA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLmRlbGF5U2V0UG9wdXBWaXNpYmxlKHRydWUsIHRoaXMucHJvcHMuZm9jdXNEZWxheSk7XG4gICAgfVxuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLm9uTW91c2VEb3duID0gZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25Nb3VzZURvd24nLCBlKTtcbiAgICB0aGlzLnByZUNsaWNrVGltZSA9IERhdGUubm93KCk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLmZpcmVFdmVudHMoJ29uVG91Y2hTdGFydCcsIGUpO1xuICAgIHRoaXMucHJlVG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgfTtcblxuICBUcmlnZ2VyLnByb3RvdHlwZS5vbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoZSkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25CbHVyJywgZSk7XG4gICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgICBpZiAodGhpcy5pc0JsdXJUb0hpZGUoKSkge1xuICAgICAgdGhpcy5kZWxheVNldFBvcHVwVmlzaWJsZShmYWxzZSwgdGhpcy5wcm9wcy5ibHVyRGVsYXkpO1xuICAgIH1cbiAgfTtcblxuICBUcmlnZ2VyLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhldmVudCkge1xuICAgIHRoaXMuZmlyZUV2ZW50cygnb25DbGljaycsIGV2ZW50KTtcbiAgICAvLyBmb2N1cyB3aWxsIHRyaWdnZXIgY2xpY2tcbiAgICBpZiAodGhpcy5mb2N1c1RpbWUpIHtcbiAgICAgIHZhciBwcmVUaW1lID0gdm9pZCAwO1xuICAgICAgaWYgKHRoaXMucHJlQ2xpY2tUaW1lICYmIHRoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgIHByZVRpbWUgPSBNYXRoLm1pbih0aGlzLnByZUNsaWNrVGltZSwgdGhpcy5wcmVUb3VjaFRpbWUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByZUNsaWNrVGltZSkge1xuICAgICAgICBwcmVUaW1lID0gdGhpcy5wcmVDbGlja1RpbWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJlVG91Y2hUaW1lKSB7XG4gICAgICAgIHByZVRpbWUgPSB0aGlzLnByZVRvdWNoVGltZTtcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyhwcmVUaW1lIC0gdGhpcy5mb2N1c1RpbWUpIDwgMjApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c1RpbWUgPSAwO1xuICAgIH1cbiAgICB0aGlzLnByZUNsaWNrVGltZSA9IDA7XG4gICAgdGhpcy5wcmVUb3VjaFRpbWUgPSAwO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIG5leHRWaXNpYmxlID0gIXRoaXMuc3RhdGUucG9wdXBWaXNpYmxlO1xuICAgIGlmICh0aGlzLmlzQ2xpY2tUb0hpZGUoKSAmJiAhbmV4dFZpc2libGUgfHwgbmV4dFZpc2libGUgJiYgdGhpcy5pc0NsaWNrVG9TaG93KCkpIHtcbiAgICAgIHRoaXMuc2V0UG9wdXBWaXNpYmxlKCF0aGlzLnN0YXRlLnBvcHVwVmlzaWJsZSk7XG4gICAgfVxuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLm9uRG9jdW1lbnRDbGljayA9IGZ1bmN0aW9uIG9uRG9jdW1lbnRDbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLnByb3BzLm1hc2sgJiYgIXRoaXMucHJvcHMubWFza0Nsb3NhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIHJvb3QgPSAoMCwgX3JlYWN0RG9tLmZpbmRET01Ob2RlKSh0aGlzKTtcbiAgICB2YXIgcG9wdXBOb2RlID0gdGhpcy5nZXRQb3B1cERvbU5vZGUoKTtcbiAgICBpZiAoISgwLCBfY29udGFpbnMyW1wiZGVmYXVsdFwiXSkocm9vdCwgdGFyZ2V0KSAmJiAhKDAsIF9jb250YWluczJbXCJkZWZhdWx0XCJdKShwb3B1cE5vZGUsIHRhcmdldCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuZ2V0UG9wdXBEb21Ob2RlID0gZnVuY3Rpb24gZ2V0UG9wdXBEb21Ob2RlKCkge1xuICAgIC8vIGZvciB0ZXN0XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMubW91bnRlZCA/IHRoaXMuX2NvbXBvbmVudC5nZXRQb3B1cERvbU5vZGUoKSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmdldFJvb3REb21Ob2RlID0gZnVuY3Rpb24gZ2V0Um9vdERvbU5vZGUoKSB7XG4gICAgcmV0dXJuIF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLmZpbmRET01Ob2RlKHRoaXMpO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduID0gZnVuY3Rpb24gZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24oYWxpZ24pIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gW107XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgcG9wdXBQbGFjZW1lbnQgPSBwcm9wcy5wb3B1cFBsYWNlbWVudCxcbiAgICAgICAgYnVpbHRpblBsYWNlbWVudHMgPSBwcm9wcy5idWlsdGluUGxhY2VtZW50cyxcbiAgICAgICAgY2xzUHJlZml4ID0gcHJvcHMuY2xzUHJlZml4O1xuXG4gICAgaWYgKHBvcHVwUGxhY2VtZW50ICYmIGJ1aWx0aW5QbGFjZW1lbnRzKSB7XG4gICAgICBjbGFzc05hbWUucHVzaCgoMCwgX3V0aWxzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKShidWlsdGluUGxhY2VtZW50cywgY2xzUHJlZml4LCBhbGlnbikpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ24pIHtcbiAgICAgIGNsYXNzTmFtZS5wdXNoKHByb3BzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduKGFsaWduKSk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWUuam9pbignICcpO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmdldFBvcHVwQWxpZ24gPSBmdW5jdGlvbiBnZXRQb3B1cEFsaWduKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHBvcHVwUGxhY2VtZW50ID0gcHJvcHMucG9wdXBQbGFjZW1lbnQsXG4gICAgICAgIHBvcHVwQWxpZ24gPSBwcm9wcy5wb3B1cEFsaWduLFxuICAgICAgICBidWlsdGluUGxhY2VtZW50cyA9IHByb3BzLmJ1aWx0aW5QbGFjZW1lbnRzO1xuXG4gICAgaWYgKHBvcHVwUGxhY2VtZW50ICYmIGJ1aWx0aW5QbGFjZW1lbnRzKSB7XG4gICAgICByZXR1cm4gKDAsIF91dGlscy5nZXRBbGlnbkZyb21QbGFjZW1lbnQpKGJ1aWx0aW5QbGFjZW1lbnRzLCBwb3B1cFBsYWNlbWVudCwgcG9wdXBBbGlnbik7XG4gICAgfVxuICAgIHJldHVybiBwb3B1cEFsaWduO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmdldENvbXBvbmVudCA9IGZ1bmN0aW9uIGdldENvbXBvbmVudCgpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICB2YXIgbW91c2VQcm9wcyA9IHt9O1xuICAgIGlmICh0aGlzLmlzTW91c2VFbnRlclRvU2hvdygpKSB7XG4gICAgICBtb3VzZVByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMub25Qb3B1cE1vdXNlRW50ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTW91c2VMZWF2ZVRvSGlkZSgpKSB7XG4gICAgICBtb3VzZVByb3BzLm9uTW91c2VMZWF2ZSA9IHRoaXMub25Qb3B1cE1vdXNlTGVhdmU7XG4gICAgfVxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX1BvcHVwMltcImRlZmF1bHRcIl0sXG4gICAgICBfZXh0ZW5kcyh7XG4gICAgICAgIGNsc1ByZWZpeDogcHJvcHMuY2xzUHJlZml4LFxuICAgICAgICBkZXN0cm95UG9wdXBPbkhpZGU6IHByb3BzLmRlc3Ryb3lQb3B1cE9uSGlkZSxcbiAgICAgICAgdmlzaWJsZTogc3RhdGUucG9wdXBWaXNpYmxlLFxuICAgICAgICBjbGFzc05hbWU6IHByb3BzLnBvcHVwQ2xhc3NOYW1lLFxuICAgICAgICBhY3Rpb246IHByb3BzLmFjdGlvbixcbiAgICAgICAgYWxpZ246IHRoaXMuZ2V0UG9wdXBBbGlnbigpLFxuICAgICAgICBvbkFsaWduOiBwcm9wcy5vblBvcHVwQWxpZ24sXG4gICAgICAgIGFuaW1hdGlvbjogcHJvcHMucG9wdXBBbmltYXRpb24sXG4gICAgICAgIGdldENsYXNzTmFtZUZyb21BbGlnbjogdGhpcy5nZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnblxuICAgICAgfSwgbW91c2VQcm9wcywge1xuICAgICAgICBnZXRSb290RG9tTm9kZTogdGhpcy5nZXRSb290RG9tTm9kZSxcbiAgICAgICAgc3R5bGU6IHByb3BzLnBvcHVwU3R5bGUsXG4gICAgICAgIG1hc2s6IHByb3BzLm1hc2ssXG4gICAgICAgIHpJbmRleDogcHJvcHMuekluZGV4LFxuICAgICAgICB0cmFuc2l0aW9uTmFtZTogcHJvcHMucG9wdXBUcmFuc2l0aW9uTmFtZSxcbiAgICAgICAgbWFza0FuaW1hdGlvbjogcHJvcHMubWFza0FuaW1hdGlvbixcbiAgICAgICAgbWFza1RyYW5zaXRpb25OYW1lOiBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWVcbiAgICAgIH0pLFxuICAgICAgdHlwZW9mIHByb3BzLnBvcHVwID09PSAnZnVuY3Rpb24nID8gcHJvcHMucG9wdXAoKSA6IHByb3BzLnBvcHVwXG4gICAgKTtcbiAgfTtcblxuICBUcmlnZ2VyLnByb3RvdHlwZS5zZXRQb3B1cFZpc2libGUgPSBmdW5jdGlvbiBzZXRQb3B1cFZpc2libGUocG9wdXBWaXNpYmxlKSB7XG4gICAgdGhpcy5jbGVhckRlbGF5VGltZXIoKTtcbiAgICBpZiAodGhpcy5zdGF0ZS5wb3B1cFZpc2libGUgIT09IHBvcHVwVmlzaWJsZSkge1xuICAgICAgaWYgKCEoJ3BvcHVwVmlzaWJsZScgaW4gdGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcG9wdXBWaXNpYmxlOiBwb3B1cFZpc2libGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BzLm9uUG9wdXBWaXNpYmxlQ2hhbmdlKHBvcHVwVmlzaWJsZSk7XG4gICAgfVxuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmRlbGF5U2V0UG9wdXBWaXNpYmxlID0gZnVuY3Rpb24gZGVsYXlTZXRQb3B1cFZpc2libGUodmlzaWJsZSwgZGVsYXlTKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgZGVsYXkgPSBkZWxheVMgKiAxMDAwO1xuICAgIHRoaXMuY2xlYXJEZWxheVRpbWVyKCk7XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICB0aGlzLmRlbGF5VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMzLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlKTtcbiAgICAgICAgX3RoaXMzLmNsZWFyRGVsYXlUaW1lcigpO1xuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFBvcHVwVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY2xlYXJEZWxheVRpbWVyID0gZnVuY3Rpb24gY2xlYXJEZWxheVRpbWVyKCkge1xuICAgIGlmICh0aGlzLmRlbGF5VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZXIpO1xuICAgICAgdGhpcy5kZWxheVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY3JlYXRlVHdvQ2hhaW5zID0gZnVuY3Rpb24gY3JlYXRlVHdvQ2hhaW5zKGV2ZW50KSB7XG4gICAgdmFyIGNoaWxkUHJvcyA9IHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHM7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBpZiAoY2hpbGRQcm9zW2V2ZW50XSAmJiBwcm9wc1tldmVudF0pIHtcbiAgICAgIHJldHVybiB0aGlzWydmaXJlJyArIGV2ZW50XTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkUHJvc1tldmVudF0gfHwgcHJvcHNbZXZlbnRdO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmlzQ2xpY2tUb1Nob3cgPSBmdW5jdGlvbiBpc0NsaWNrVG9TaG93KCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHMuYWN0aW9uLFxuICAgICAgICBzaG93QWN0aW9uID0gX3Byb3BzLnNob3dBY3Rpb247XG5cbiAgICByZXR1cm4gYWN0aW9uLmluZGV4T2YoJ2NsaWNrJykgIT09IC0xIHx8IHNob3dBY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTE7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuaXNDbGlja1RvSGlkZSA9IGZ1bmN0aW9uIGlzQ2xpY2tUb0hpZGUoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHMyLmFjdGlvbixcbiAgICAgICAgaGlkZUFjdGlvbiA9IF9wcm9wczIuaGlkZUFjdGlvbjtcblxuICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignY2xpY2snKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgfTtcblxuICBUcmlnZ2VyLnByb3RvdHlwZS5pc01vdXNlRW50ZXJUb1Nob3cgPSBmdW5jdGlvbiBpc01vdXNlRW50ZXJUb1Nob3coKSB7XG4gICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHMzLmFjdGlvbixcbiAgICAgICAgc2hvd0FjdGlvbiA9IF9wcm9wczMuc2hvd0FjdGlvbjtcblxuICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignaG92ZXInKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdtb3VzZUVudGVyJykgIT09IC0xO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmlzTW91c2VMZWF2ZVRvSGlkZSA9IGZ1bmN0aW9uIGlzTW91c2VMZWF2ZVRvSGlkZSgpIHtcbiAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGlvbiA9IF9wcm9wczQuYWN0aW9uLFxuICAgICAgICBoaWRlQWN0aW9uID0gX3Byb3BzNC5oaWRlQWN0aW9uO1xuXG4gICAgcmV0dXJuIGFjdGlvbi5pbmRleE9mKCdob3ZlcicpICE9PSAtMSB8fCBoaWRlQWN0aW9uLmluZGV4T2YoJ21vdXNlTGVhdmUnKSAhPT0gLTE7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuaXNGb2N1c1RvU2hvdyA9IGZ1bmN0aW9uIGlzRm9jdXNUb1Nob3coKSB7XG4gICAgdmFyIF9wcm9wczUgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHM1LmFjdGlvbixcbiAgICAgICAgc2hvd0FjdGlvbiA9IF9wcm9wczUuc2hvd0FjdGlvbjtcblxuICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgc2hvd0FjdGlvbi5pbmRleE9mKCdmb2N1cycpICE9PSAtMTtcbiAgfTtcblxuICBUcmlnZ2VyLnByb3RvdHlwZS5pc0JsdXJUb0hpZGUgPSBmdW5jdGlvbiBpc0JsdXJUb0hpZGUoKSB7XG4gICAgdmFyIF9wcm9wczYgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfcHJvcHM2LmFjdGlvbixcbiAgICAgICAgaGlkZUFjdGlvbiA9IF9wcm9wczYuaGlkZUFjdGlvbjtcblxuICAgIHJldHVybiBhY3Rpb24uaW5kZXhPZignZm9jdXMnKSAhPT0gLTEgfHwgaGlkZUFjdGlvbi5pbmRleE9mKCdibHVyJykgIT09IC0xO1xuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmZvcmNlUG9wdXBBbGlnbiA9IGZ1bmN0aW9uIGZvcmNlUG9wdXBBbGlnbigpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5wb3B1cFZpc2libGUgJiYgdGhpcy5wb3B1cEluc3RhbmNlICYmIHRoaXMucG9wdXBJbnN0YW5jZS5hbGlnbkluc3RhbmNlKSB7XG4gICAgICB0aGlzLnBvcHVwSW5zdGFuY2UuYWxpZ25JbnN0YW5jZS5mb3JjZUFsaWduKCk7XG4gICAgfVxuICB9O1xuXG4gIFRyaWdnZXIucHJvdG90eXBlLmZpcmVFdmVudHMgPSBmdW5jdGlvbiBmaXJlRXZlbnRzKHR5cGUsIGUpIHtcbiAgICB2YXIgY2hpbGRDYWxsYmFjayA9IHRoaXMucHJvcHMuY2hpbGRyZW4ucHJvcHNbdHlwZV07XG4gICAgaWYgKGNoaWxkQ2FsbGJhY2spIHtcbiAgICAgIGNoaWxkQ2FsbGJhY2soZSk7XG4gICAgfVxuICAgIHZhciBjYWxsYmFjayA9IHRoaXMucHJvcHNbdHlwZV07XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayhlKTtcbiAgICB9XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICB0aGlzLnNldFBvcHVwVmlzaWJsZShmYWxzZSk7XG4gIH07XG5cbiAgVHJpZ2dlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIGNoaWxkID0gX3JlYWN0MltcImRlZmF1bHRcIl0uQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgdmFyIG5ld0NoaWxkUHJvcHMgPSB7fTtcblxuICAgIGlmICh0aGlzLmlzQ2xpY2tUb0hpZGUoKSB8fCB0aGlzLmlzQ2xpY2tUb1Nob3coKSkge1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrO1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlRG93biA9IHRoaXMub25Nb3VzZURvd247XG4gICAgICBuZXdDaGlsZFByb3BzLm9uVG91Y2hTdGFydCA9IHRoaXMub25Ub3VjaFN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uQ2xpY2sgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25DbGljaycpO1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbk1vdXNlRG93biA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbk1vdXNlRG93bicpO1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vblRvdWNoU3RhcnQgPSB0aGlzLmNyZWF0ZVR3b0NoYWlucygnb25Ub3VjaFN0YXJ0Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTW91c2VFbnRlclRvU2hvdygpKSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMub25Nb3VzZUVudGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFByb3BzLm9uTW91c2VFbnRlciA9IHRoaXMuY3JlYXRlVHdvQ2hhaW5zKCdvbk1vdXNlRW50ZXInKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNNb3VzZUxlYXZlVG9IaWRlKCkpIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5vbk1vdXNlTGVhdmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25Nb3VzZUxlYXZlID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uTW91c2VMZWF2ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0ZvY3VzVG9TaG93KCkgfHwgdGhpcy5pc0JsdXJUb0hpZGUoKSkge1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbkZvY3VzID0gdGhpcy5vbkZvY3VzO1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbkJsdXIgPSB0aGlzLm9uQmx1cjtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Q2hpbGRQcm9wcy5vbkZvY3VzID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uRm9jdXMnKTtcbiAgICAgIG5ld0NoaWxkUHJvcHMub25CbHVyID0gdGhpcy5jcmVhdGVUd29DaGFpbnMoJ29uQmx1cicpO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jbG9uZUVsZW1lbnQoY2hpbGQsIG5ld0NoaWxkUHJvcHMpO1xuICB9O1xuXG4gIHJldHVybiBUcmlnZ2VyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuXG5UcmlnZ2VyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRyaWdnZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBUcmlnZ2VyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1vdmVybGF5L2J1aWxkL3RyaWdnZXIvVHJpZ2dlci5qc1xuLy8gbW9kdWxlIGlkID0gNzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBIVE1MIERPTSBhbmQgU1ZHIERPTSBtYXkgaGF2ZSBkaWZmZXJlbnQgc3VwcG9ydCBsZXZlbHMsXG4gIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgb24gY29udGV4dCBpbnN0ZWFkIG9mIGEgZG9jdW1lbnQgcm9vdCBlbGVtZW50LlxuICByZXR1cm4gX2luRE9NMi5kZWZhdWx0ID8gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICBpZiAoY29udGV4dC5jb250YWlucykge1xuICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbnMobm9kZSk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gY29udGV4dCA9PT0gbm9kZSB8fCAhIShjb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpICYgMTYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2soY29udGV4dCwgbm9kZSk7XG4gICAgfVxuICB9IDogZmFsbGJhY2s7XG59KCk7XG5cbmZ1bmN0aW9uIGZhbGxiYWNrKGNvbnRleHQsIG5vZGUpIHtcbiAgaWYgKG5vZGUpIGRvIHtcbiAgICBpZiAobm9kZSA9PT0gY29udGV4dCkgcmV0dXJuIHRydWU7XG4gIH0gd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpO1xuXG4gIHJldHVybiBmYWxzZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9kb20taGVscGVycy9xdWVyeS9jb250YWlucy5qc1xuLy8gbW9kdWxlIGlkID0gNzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfQWxpZ24gPSByZXF1aXJlKCd0aW5wZXItYmVlLWNvcmUvbGliL0FsaWduJyk7XG5cbnZhciBfQWxpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWxpZ24pO1xuXG52YXIgX2JlZUFuaW1hdGUgPSByZXF1aXJlKCdiZWUtYW5pbWF0ZScpO1xuXG52YXIgX2JlZUFuaW1hdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmVlQW5pbWF0ZSk7XG5cbnZhciBfUG9wdXBJbm5lciA9IHJlcXVpcmUoJy4vUG9wdXBJbm5lcicpO1xuXG52YXIgX1BvcHVwSW5uZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wdXBJbm5lcik7XG5cbnZhciBfTGF6eVJlbmRlckJveCA9IHJlcXVpcmUoJy4vTGF6eVJlbmRlckJveCcpO1xuXG52YXIgX0xhenlSZW5kZXJCb3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTGF6eVJlbmRlckJveCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgdmlzaWJsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzdHlsZTogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gIGdldENsYXNzTmFtZUZyb21BbGlnbjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkFsaWduOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGdldFJvb3REb21Ob2RlOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBhbGlnbjogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIGRlc3Ryb3lQb3B1cE9uSGlkZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjbGFzc05hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBjbHNQcmVmaXg6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBvbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIFBvcHVwID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBvcHVwLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQb3B1cCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9wdXApO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLm9uQWxpZ24gPSBfdGhpcy5vbkFsaWduLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFBvcHVwRG9tTm9kZSA9IF90aGlzLmdldFBvcHVwRG9tTm9kZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRUYXJnZXQgPSBfdGhpcy5nZXRUYXJnZXQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0TWFza1RyYW5zaXRpb25OYW1lID0gX3RoaXMuZ2V0TWFza1RyYW5zaXRpb25OYW1lLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFRyYW5zaXRpb25OYW1lID0gX3RoaXMuZ2V0VHJhbnNpdGlvbk5hbWUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0Q2xhc3NOYW1lID0gX3RoaXMuZ2V0Q2xhc3NOYW1lLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFBvcHVwRWxlbWVudCA9IF90aGlzLmdldFBvcHVwRWxlbWVudC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRaSW5kZXhTdHlsZSA9IF90aGlzLmdldFpJbmRleFN0eWxlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldE1hc2tFbGVtZW50ID0gX3RoaXMuZ2V0TWFza0VsZW1lbnQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuc2F2ZUFsaWduID0gX3RoaXMuc2F2ZUFsaWduLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBvcHVwLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmdldFBvcHVwRG9tTm9kZSgpO1xuICB9O1xuXG4gIFBvcHVwLnByb3RvdHlwZS5vbkFsaWduID0gZnVuY3Rpb24gb25BbGlnbihwb3B1cERvbU5vZGUsIGFsaWduKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgYWxpZ25DbGFzc05hbWUgPSBwcm9wcy5nZXRDbGFzc05hbWVGcm9tQWxpZ24ocHJvcHMuYWxpZ24pO1xuICAgIHZhciBjdXJyZW50QWxpZ25DbGFzc05hbWUgPSBwcm9wcy5nZXRDbGFzc05hbWVGcm9tQWxpZ24oYWxpZ24pO1xuICAgIGlmIChhbGlnbkNsYXNzTmFtZSAhPT0gY3VycmVudEFsaWduQ2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLmN1cnJlbnRBbGlnbkNsYXNzTmFtZSA9IGN1cnJlbnRBbGlnbkNsYXNzTmFtZTtcbiAgICAgIHBvcHVwRG9tTm9kZS5jbGFzc05hbWUgPSB0aGlzLmdldENsYXNzTmFtZShjdXJyZW50QWxpZ25DbGFzc05hbWUpO1xuICAgIH1cbiAgICBwcm9wcy5vbkFsaWduKHBvcHVwRG9tTm9kZSwgYWxpZ24pO1xuICB9O1xuXG4gIFBvcHVwLnByb3RvdHlwZS5nZXRQb3B1cERvbU5vZGUgPSBmdW5jdGlvbiBnZXRQb3B1cERvbU5vZGUoKSB7XG4gICAgcmV0dXJuIF9yZWFjdERvbTJbXCJkZWZhdWx0XCJdLmZpbmRET01Ob2RlKHRoaXMucmVmcy5wb3B1cCk7XG4gIH07XG5cbiAgUG9wdXAucHJvdG90eXBlLmdldFRhcmdldCA9IGZ1bmN0aW9uIGdldFRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5nZXRSb290RG9tTm9kZSgpO1xuICB9O1xuXG4gIFBvcHVwLnByb3RvdHlwZS5nZXRNYXNrVHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRNYXNrVHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5tYXNrVHJhbnNpdGlvbk5hbWU7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHByb3BzLm1hc2tBbmltYXRpb247XG4gICAgaWYgKCF0cmFuc2l0aW9uTmFtZSAmJiBhbmltYXRpb24pIHtcbiAgICAgIHRyYW5zaXRpb25OYW1lID0gcHJvcHMuY2xzUHJlZml4ICsgJy0nICsgYW5pbWF0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNpdGlvbk5hbWU7XG4gIH07XG5cbiAgUG9wdXAucHJvdG90eXBlLmdldFRyYW5zaXRpb25OYW1lID0gZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZTtcbiAgICBpZiAoIXRyYW5zaXRpb25OYW1lICYmIHByb3BzLmFuaW1hdGlvbikge1xuICAgICAgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5jbHNQcmVmaXggKyAnLScgKyBwcm9wcy5hbmltYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2l0aW9uTmFtZTtcbiAgfTtcblxuICBQb3B1cC5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKGN1cnJlbnRBbGlnbkNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmNsc1ByZWZpeCArICcgJyArIHRoaXMucHJvcHMuY2xhc3NOYW1lICsgJyAnICsgY3VycmVudEFsaWduQ2xhc3NOYW1lO1xuICB9O1xuXG4gIFBvcHVwLnByb3RvdHlwZS5nZXRQb3B1cEVsZW1lbnQgPSBmdW5jdGlvbiBnZXRQb3B1cEVsZW1lbnQoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgYWxpZ24gPSBwcm9wcy5hbGlnbixcbiAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGUsXG4gICAgICAgIGNsc1ByZWZpeCA9IHByb3BzLmNsc1ByZWZpeCxcbiAgICAgICAgZGVzdHJveVBvcHVwT25IaWRlID0gcHJvcHMuZGVzdHJveVBvcHVwT25IaWRlO1xuXG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3NOYW1lKHRoaXMuY3VycmVudEFsaWduQ2xhc3NOYW1lIHx8IHByb3BzLmdldENsYXNzTmFtZUZyb21BbGlnbihhbGlnbikpO1xuICAgIHZhciBoaWRkZW5DbGFzc05hbWUgPSBjbHNQcmVmaXggKyAnLWhpZGRlbic7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRBbGlnbkNsYXNzTmFtZSA9IG51bGw7XG4gICAgfVxuICAgIHZhciBuZXdTdHlsZSA9IF9leHRlbmRzKHt9LCBzdHlsZSwgdGhpcy5nZXRaSW5kZXhTdHlsZSgpKTtcbiAgICB2YXIgcG9wdXBJbm5lclByb3BzID0ge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBjbHNQcmVmaXg6IGNsc1ByZWZpeCxcbiAgICAgIHJlZjogJ3BvcHVwJyxcbiAgICAgIG9uTW91c2VFbnRlcjogcHJvcHMub25Nb3VzZUVudGVyLFxuICAgICAgb25Nb3VzZUxlYXZlOiBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgICBzdHlsZTogbmV3U3R5bGVcbiAgICB9O1xuICAgIGlmIChkZXN0cm95UG9wdXBPbkhpZGUpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfYmVlQW5pbWF0ZTJbXCJkZWZhdWx0XCJdLFxuICAgICAgICB7XG4gICAgICAgICAgY29tcG9uZW50OiAnJyxcbiAgICAgICAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpXG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGUgPyBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9BbGlnbjJbXCJkZWZhdWx0XCJdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5nZXRUYXJnZXQsXG4gICAgICAgICAgICBrZXk6ICdwb3B1cCcsXG4gICAgICAgICAgICByZWY6IHRoaXMuc2F2ZUFsaWduLFxuICAgICAgICAgICAgbW9uaXRvcldpbmRvd1Jlc2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgICAgICAgIG9uQWxpZ246IHRoaXMub25BbGlnblxuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIF9Qb3B1cElubmVyMltcImRlZmF1bHRcIl0sXG4gICAgICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICAgIH0sIHBvcHVwSW5uZXJQcm9wcyksXG4gICAgICAgICAgICBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgIClcbiAgICAgICAgKSA6IG51bGxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX2JlZUFuaW1hdGUyW1wiZGVmYXVsdFwiXSxcbiAgICAgIHtcbiAgICAgICAgY29tcG9uZW50OiAnJyxcbiAgICAgICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgICAgICB0cmFuc2l0aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgICB0cmFuc2l0aW9uTmFtZTogdGhpcy5nZXRUcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgICBzaG93UHJvcDogJ3hWaXNpYmxlJ1xuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9BbGlnbjJbXCJkZWZhdWx0XCJdLFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiB0aGlzLmdldFRhcmdldCxcbiAgICAgICAgICBrZXk6ICdwb3B1cCcsXG4gICAgICAgICAgcmVmOiB0aGlzLnNhdmVBbGlnbixcbiAgICAgICAgICBtb25pdG9yV2luZG93UmVzaXplOiB0cnVlLFxuICAgICAgICAgIHhWaXNpYmxlOiB2aXNpYmxlLFxuICAgICAgICAgIGNoaWxkcmVuUHJvcHM6IHsgdmlzaWJsZTogJ3hWaXNpYmxlJyB9LFxuICAgICAgICAgIGRpc2FibGVkOiAhdmlzaWJsZSxcbiAgICAgICAgICBhbGlnbjogYWxpZ24sXG4gICAgICAgICAgb25BbGlnbjogdGhpcy5vbkFsaWduXG4gICAgICAgIH0sXG4gICAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgX1BvcHVwSW5uZXIyW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgICBoaWRkZW5DbGFzc05hbWU6IGhpZGRlbkNsYXNzTmFtZVxuICAgICAgICAgIH0sIHBvcHVwSW5uZXJQcm9wcyksXG4gICAgICAgICAgcHJvcHMuY2hpbGRyZW5cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgUG9wdXAucHJvdG90eXBlLmdldFpJbmRleFN0eWxlID0gZnVuY3Rpb24gZ2V0WkluZGV4U3R5bGUoKSB7XG4gICAgdmFyIHN0eWxlID0ge307XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBpZiAocHJvcHMuekluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0eWxlLnpJbmRleCA9IHByb3BzLnpJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9O1xuXG4gIFBvcHVwLnByb3RvdHlwZS5nZXRNYXNrRWxlbWVudCA9IGZ1bmN0aW9uIGdldE1hc2tFbGVtZW50KCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIG1hc2tFbGVtZW50ID0gdm9pZCAwO1xuICAgIGlmIChwcm9wcy5tYXNrKSB7XG4gICAgICB2YXIgbWFza1RyYW5zaXRpb24gPSB0aGlzLmdldE1hc2tUcmFuc2l0aW9uTmFtZSgpO1xuICAgICAgbWFza0VsZW1lbnQgPSBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KF9MYXp5UmVuZGVyQm94MltcImRlZmF1bHRcIl0sIHtcbiAgICAgICAgc3R5bGU6IHRoaXMuZ2V0WkluZGV4U3R5bGUoKSxcbiAgICAgICAga2V5OiAnbWFzaycsXG4gICAgICAgIGNsYXNzTmFtZTogcHJvcHMuY2xzUHJlZml4ICsgJy1tYXNrJyxcbiAgICAgICAgaGlkZGVuQ2xhc3NOYW1lOiBwcm9wcy5jbHNQcmVmaXggKyAnLW1hc2staGlkZGVuJyxcbiAgICAgICAgdmlzaWJsZTogcHJvcHMudmlzaWJsZVxuICAgICAgfSk7XG4gICAgICBpZiAobWFza1RyYW5zaXRpb24pIHtcbiAgICAgICAgbWFza0VsZW1lbnQgPSBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9iZWVBbmltYXRlMltcImRlZmF1bHRcIl0sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnbWFzaycsXG4gICAgICAgICAgICBzaG93UHJvcDogJ3Zpc2libGUnLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogJycsXG4gICAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogbWFza1RyYW5zaXRpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hc2tFbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXNrRWxlbWVudDtcbiAgfTtcblxuICBQb3B1cC5wcm90b3R5cGUuc2F2ZUFsaWduID0gZnVuY3Rpb24gc2F2ZUFsaWduKGFsaWduKSB7XG4gICAgdGhpcy5hbGlnbkluc3RhbmNlID0gYWxpZ247XG4gIH07XG5cbiAgUG9wdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgbnVsbCxcbiAgICAgIHRoaXMuZ2V0TWFza0VsZW1lbnQoKSxcbiAgICAgIHRoaXMuZ2V0UG9wdXBFbGVtZW50KClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQb3B1cDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuUG9wdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQb3B1cDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtb3ZlcmxheS9idWlsZC90cmlnZ2VyL1BvcHVwLmpzXG4vLyBtb2R1bGUgaWQgPSA3N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfQW5pbWF0ZSA9IHJlcXVpcmUoJy4vQW5pbWF0ZScpO1xuXG52YXIgX0FuaW1hdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQW5pbWF0ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9BbmltYXRlMltcImRlZmF1bHRcIl07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWFuaW1hdGUvYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX0NoaWxkcmVuVXRpbHMgPSByZXF1aXJlKCcuL0NoaWxkcmVuVXRpbHMnKTtcblxudmFyIF9BbmltYXRlQ2hpbGQgPSByZXF1aXJlKCcuL0FuaW1hdGVDaGlsZCcpO1xuXG52YXIgX0FuaW1hdGVDaGlsZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BbmltYXRlQ2hpbGQpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIF91dGlsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBkZWZhdWx0S2V5ID0gJ3VfYW5pbWF0ZV8nICsgRGF0ZS5ub3coKTtcblxuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbkZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgaWYgKF9yZWFjdDJbXCJkZWZhdWx0XCJdLmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIGlmICghY2hpbGRyZW4ua2V5KSB7XG4gICAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgIGtleTogZGVmYXVsdEtleVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudDogX3JlYWN0LlByb3BUeXBlcy5hbnksXG4gIGFuaW1hdGlvbjogX3JlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gIHRyYW5zaXRpb25OYW1lOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsIF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0XSksXG4gIHRyYW5zaXRpb25FbnRlcjogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGV4Y2x1c2l2ZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICB0cmFuc2l0aW9uTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgb25FbmQ6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25FbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkxlYXZlOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQXBwZWFyOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHNob3dQcm9wOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYW5pbWF0aW9uOiB7fSxcbiAgY29tcG9uZW50OiAnc3BhbicsXG4gIHRyYW5zaXRpb25FbnRlcjogdHJ1ZSxcbiAgdHJhbnNpdGlvbkxlYXZlOiB0cnVlLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBmYWxzZSxcbiAgb25FbmQ6IG5vb3AsXG4gIG9uRW50ZXI6IG5vb3AsXG4gIG9uTGVhdmU6IG5vb3AsXG4gIG9uQXBwZWFyOiBub29wXG59O1xuXG52YXIgQW5pbWF0ZSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBbmltYXRlLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBbmltYXRlKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuaW1hdGUpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzID0ge307XG4gICAgX3RoaXMua2V5c1RvRW50ZXIgPSBbXTtcbiAgICBfdGhpcy5rZXlzVG9MZWF2ZSA9IFtdO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgY2hpbGRyZW46ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKF90aGlzLnByb3BzKSlcbiAgICB9O1xuXG4gICAgX3RoaXMucGVyZm9ybUVudGVyID0gX3RoaXMucGVyZm9ybUVudGVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnBlcmZvcm1BcHBlYXIgPSBfdGhpcy5wZXJmb3JtQXBwZWFyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZURvbmVBZGRpbmcgPSBfdGhpcy5oYW5kbGVEb25lQWRkaW5nLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnBlcmZvcm1MZWF2ZSA9IF90aGlzLnBlcmZvcm1MZWF2ZS5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnBlcmZvcm1MZWF2ZSA9IF90aGlzLnBlcmZvcm1MZWF2ZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVEb25lTGVhdmluZyA9IF90aGlzLmhhbmRsZURvbmVMZWF2aW5nLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmlzVmFsaWRDaGlsZEJ5S2V5ID0gX3RoaXMuaXNWYWxpZENoaWxkQnlLZXkuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuc3RvcCA9IF90aGlzLnN0b3AuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgdmFyIHNob3dQcm9wID0gdGhpcy5wcm9wcy5zaG93UHJvcDtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiAhIWNoaWxkLnByb3BzW3Nob3dQcm9wXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIF90aGlzMi5wZXJmb3JtQXBwZWFyKGNoaWxkLmtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMubmV4dFByb3BzID0gbmV4dFByb3BzO1xuICAgIHZhciBuZXh0Q2hpbGRyZW4gPSAoMCwgX0NoaWxkcmVuVXRpbHMudG9BcnJheUNoaWxkcmVuKShnZXRDaGlsZHJlbkZyb21Qcm9wcyhuZXh0UHJvcHMpKTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIC8vIGV4Y2x1c2l2ZSBuZWVkcyBpbW1lZGlhdGUgcmVzcG9uc2VcbiAgICBpZiAocHJvcHMuZXhjbHVzaXZlKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfdGhpczMuc3RvcChrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBzaG93UHJvcCA9IHByb3BzLnNob3dQcm9wO1xuICAgIHZhciBjdXJyZW50bHlBbmltYXRpbmdLZXlzID0gdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzO1xuICAgIC8vIGxhc3QgcHJvcHMgY2hpbGRyZW4gaWYgZXhjbHVzaXZlXG4gICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9IHByb3BzLmV4Y2x1c2l2ZSA/ICgwLCBfQ2hpbGRyZW5VdGlscy50b0FycmF5Q2hpbGRyZW4pKGdldENoaWxkcmVuRnJvbVByb3BzKHByb3BzKSkgOiB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgIC8vIGluIGNhc2UgZGVzdHJveSBpbiBzaG93UHJvcCBtb2RlXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gW107XG4gICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICBjdXJyZW50Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudENoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBjdXJyZW50Q2hpbGQgJiYgKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSkobmV4dENoaWxkcmVuLCBjdXJyZW50Q2hpbGQua2V5KTtcbiAgICAgICAgdmFyIG5ld0NoaWxkID0gdm9pZCAwO1xuICAgICAgICBpZiAoKCFuZXh0Q2hpbGQgfHwgIW5leHRDaGlsZC5wcm9wc1tzaG93UHJvcF0pICYmIGN1cnJlbnRDaGlsZC5wcm9wc1tzaG93UHJvcF0pIHtcbiAgICAgICAgICBuZXdDaGlsZCA9IF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNsb25lRWxlbWVudChuZXh0Q2hpbGQgfHwgY3VycmVudENoaWxkLCBfZGVmaW5lUHJvcGVydHkoe30sIHNob3dQcm9wLCB0cnVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Q2hpbGQgPSBuZXh0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICAgICAgbmV3Q2hpbGRyZW4ucHVzaChuZXdDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbmV4dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5leHRDaGlsZCkge1xuICAgICAgICBpZiAoIW5leHRDaGlsZCB8fCAhKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSkoY3VycmVudENoaWxkcmVuLCBuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gobmV4dENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLm1lcmdlQ2hpbGRyZW4pKGN1cnJlbnRDaGlsZHJlbiwgbmV4dENoaWxkcmVuKTtcbiAgICB9XG5cbiAgICAvLyBuZWVkIHJlbmRlciB0byBhdm9pZCB1cGRhdGVcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGNoaWxkcmVuOiBuZXdDaGlsZHJlblxuICAgIH0pO1xuXG4gICAgbmV4dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICB2YXIga2V5ID0gY2hpbGQgJiYgY2hpbGQua2V5O1xuICAgICAgaWYgKGNoaWxkICYmIGN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaGFzUHJldiA9IGNoaWxkICYmICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKGN1cnJlbnRDaGlsZHJlbiwga2V5KTtcbiAgICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgICB2YXIgc2hvd0luTmV4dCA9IGNoaWxkLnByb3BzW3Nob3dQcm9wXTtcbiAgICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgICB2YXIgc2hvd0luTm93ID0gKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5KShjdXJyZW50Q2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApO1xuICAgICAgICAgIGlmICghc2hvd0luTm93ICYmIHNob3dJbk5leHQpIHtcbiAgICAgICAgICAgIF90aGlzMy5rZXlzVG9FbnRlci5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNob3dJbk5leHQpIHtcbiAgICAgICAgICBfdGhpczMua2V5c1RvRW50ZXIucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFoYXNQcmV2KSB7XG4gICAgICAgIF90aGlzMy5rZXlzVG9FbnRlci5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjdXJyZW50Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHZhciBrZXkgPSBjaGlsZCAmJiBjaGlsZC5rZXk7XG4gICAgICBpZiAoY2hpbGQgJiYgY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBoYXNOZXh0ID0gY2hpbGQgJiYgKDAsIF9DaGlsZHJlblV0aWxzLmZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleSkobmV4dENoaWxkcmVuLCBrZXkpO1xuICAgICAgaWYgKHNob3dQcm9wKSB7XG4gICAgICAgIHZhciBzaG93SW5Ob3cgPSBjaGlsZC5wcm9wc1tzaG93UHJvcF07XG4gICAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgICAgdmFyIHNob3dJbk5leHQgPSAoMCwgX0NoaWxkcmVuVXRpbHMuZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKG5leHRDaGlsZHJlbiwga2V5LCBzaG93UHJvcCk7XG4gICAgICAgICAgaWYgKCFzaG93SW5OZXh0ICYmIHNob3dJbk5vdykge1xuICAgICAgICAgICAgX3RoaXMzLmtleXNUb0xlYXZlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvd0luTm93KSB7XG4gICAgICAgICAgX3RoaXMzLmtleXNUb0xlYXZlLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaGFzTmV4dCkge1xuICAgICAgICBfdGhpczMua2V5c1RvTGVhdmUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIEFuaW1hdGUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB2YXIga2V5c1RvRW50ZXIgPSB0aGlzLmtleXNUb0VudGVyO1xuICAgIHRoaXMua2V5c1RvRW50ZXIgPSBbXTtcbiAgICBrZXlzVG9FbnRlci5mb3JFYWNoKHRoaXMucGVyZm9ybUVudGVyKTtcbiAgICB2YXIga2V5c1RvTGVhdmUgPSB0aGlzLmtleXNUb0xlYXZlO1xuICAgIHRoaXMua2V5c1RvTGVhdmUgPSBbXTtcbiAgICBrZXlzVG9MZWF2ZS5mb3JFYWNoKHRoaXMucGVyZm9ybUxlYXZlKTtcbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5wZXJmb3JtRW50ZXIgPSBmdW5jdGlvbiBwZXJmb3JtRW50ZXIoa2V5KSB7XG4gICAgLy8gbWF5IGFscmVhZHkgcmVtb3ZlIGJ5IGV4Y2x1c2l2ZVxuICAgIGlmICh0aGlzLnJlZnNba2V5XSkge1xuICAgICAgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0gPSB0cnVlO1xuICAgICAgdGhpcy5yZWZzW2tleV0uY29tcG9uZW50V2lsbEVudGVyKHRoaXMuaGFuZGxlRG9uZUFkZGluZy5iaW5kKHRoaXMsIGtleSwgJ2VudGVyJykpO1xuICAgIH1cbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5wZXJmb3JtQXBwZWFyID0gZnVuY3Rpb24gcGVyZm9ybUFwcGVhcihrZXkpIHtcbiAgICBpZiAodGhpcy5yZWZzW2tleV0pIHtcbiAgICAgIHRoaXMuY3VycmVudGx5QW5pbWF0aW5nS2V5c1trZXldID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVmc1trZXldLmNvbXBvbmVudFdpbGxBcHBlYXIodGhpcy5oYW5kbGVEb25lQWRkaW5nLmJpbmQodGhpcywga2V5LCAnYXBwZWFyJykpO1xuICAgIH1cbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5oYW5kbGVEb25lQWRkaW5nID0gZnVuY3Rpb24gaGFuZGxlRG9uZUFkZGluZyhrZXksIHR5cGUpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XTtcbiAgICAvLyBpZiB1cGRhdGUgb24gZXhjbHVzaXZlIG1vZGUsIHNraXAgY2hlY2tcbiAgICBpZiAocHJvcHMuZXhjbHVzaXZlICYmIHByb3BzICE9PSB0aGlzLm5leHRQcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VycmVudENoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKTtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZENoaWxkQnlLZXkoY3VycmVudENoaWxkcmVuLCBrZXkpKSB7XG4gICAgICAvLyBleGNsdXNpdmUgd2lsbCBub3QgbmVlZCB0aGlzXG4gICAgICB0aGlzLnBlcmZvcm1MZWF2ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2FwcGVhcicpIHtcbiAgICAgICAgaWYgKF91dGlsMltcImRlZmF1bHRcIl0uYWxsb3dBcHBlYXJDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgICAgICBwcm9wcy5vbkFwcGVhcihrZXkpO1xuICAgICAgICAgIHByb3BzLm9uRW5kKGtleSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdXRpbDJbXCJkZWZhdWx0XCJdLmFsbG93RW50ZXJDYWxsYmFjayhwcm9wcykpIHtcbiAgICAgICAgICBwcm9wcy5vbkVudGVyKGtleSk7XG4gICAgICAgICAgcHJvcHMub25FbmQoa2V5LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5wZXJmb3JtTGVhdmUgPSBmdW5jdGlvbiBwZXJmb3JtTGVhdmUoa2V5KSB7XG4gICAgLy8gbWF5IGFscmVhZHkgcmVtb3ZlIGJ5IGV4Y2x1c2l2ZVxuICAgIGlmICh0aGlzLnJlZnNba2V5XSkge1xuICAgICAgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV0gPSB0cnVlO1xuICAgICAgdGhpcy5yZWZzW2tleV0uY29tcG9uZW50V2lsbExlYXZlKHRoaXMuaGFuZGxlRG9uZUxlYXZpbmcuYmluZCh0aGlzLCBrZXkpKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZS5wcm90b3R5cGUuaGFuZGxlRG9uZUxlYXZpbmcgPSBmdW5jdGlvbiBoYW5kbGVEb25lTGVhdmluZyhrZXkpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRseUFuaW1hdGluZ0tleXNba2V5XTtcbiAgICAvLyBpZiB1cGRhdGUgb24gZXhjbHVzaXZlIG1vZGUsIHNraXAgY2hlY2tcbiAgICBpZiAocHJvcHMuZXhjbHVzaXZlICYmIHByb3BzICE9PSB0aGlzLm5leHRQcm9wcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3VycmVudENoaWxkcmVuID0gKDAsIF9DaGlsZHJlblV0aWxzLnRvQXJyYXlDaGlsZHJlbikoZ2V0Q2hpbGRyZW5Gcm9tUHJvcHMocHJvcHMpKTtcbiAgICAvLyBpbiBjYXNlIHN0YXRlIGNoYW5nZSBpcyB0b28gZmFzdFxuICAgIGlmICh0aGlzLmlzVmFsaWRDaGlsZEJ5S2V5KGN1cnJlbnRDaGlsZHJlbiwga2V5KSkge1xuICAgICAgdGhpcy5wZXJmb3JtRW50ZXIoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVuZCA9IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgaWYgKF91dGlsMltcImRlZmF1bHRcIl0uYWxsb3dMZWF2ZUNhbGxiYWNrKHByb3BzKSkge1xuICAgICAgICAgIHByb3BzLm9uTGVhdmUoa2V5KTtcbiAgICAgICAgICBwcm9wcy5vbkVuZChrZXksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qIGVzbGludCByZWFjdC9uby1pcy1tb3VudGVkOjAgKi9cbiAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgISgwLCBfQ2hpbGRyZW5VdGlscy5pc1NhbWVDaGlsZHJlbikodGhpcy5zdGF0ZS5jaGlsZHJlbiwgY3VycmVudENoaWxkcmVuLCBwcm9wcy5zaG93UHJvcCkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY2hpbGRyZW46IGN1cnJlbnRDaGlsZHJlblxuICAgICAgICB9LCBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGUucHJvdG90eXBlLmlzVmFsaWRDaGlsZEJ5S2V5ID0gZnVuY3Rpb24gaXNWYWxpZENoaWxkQnlLZXkoY3VycmVudENoaWxkcmVuLCBrZXkpIHtcbiAgICB2YXIgc2hvd1Byb3AgPSB0aGlzLnByb3BzLnNob3dQcm9wO1xuICAgIGlmIChzaG93UHJvcCkge1xuICAgICAgcmV0dXJuICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kU2hvd25DaGlsZEluQ2hpbGRyZW5CeUtleSkoY3VycmVudENoaWxkcmVuLCBrZXksIHNob3dQcm9wKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfQ2hpbGRyZW5VdGlscy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkpKGN1cnJlbnRDaGlsZHJlbiwga2V5KTtcbiAgfTtcblxuICBBbmltYXRlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gc3RvcChrZXkpIHtcbiAgICBkZWxldGUgdGhpcy5jdXJyZW50bHlBbmltYXRpbmdLZXlzW2tleV07XG4gICAgdmFyIGNvbXBvbmVudCA9IHRoaXMucmVmc1trZXldO1xuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5zdG9wKCk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHRoaXMubmV4dFByb3BzID0gcHJvcHM7XG4gICAgdmFyIHN0YXRlQ2hpbGRyZW4gPSB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZHJlbiA9IG51bGw7XG4gICAgaWYgKHN0YXRlQ2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuID0gc3RhdGVDaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGQua2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHNldCBrZXkgZm9yIDxyYy1hbmltYXRlPiBjaGlsZHJlbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9BbmltYXRlQ2hpbGQyW1wiZGVmYXVsdFwiXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IGNoaWxkLmtleSxcbiAgICAgICAgICAgIHJlZjogY2hpbGQua2V5LFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBwcm9wcy5hbmltYXRpb24sXG4gICAgICAgICAgICB0cmFuc2l0aW9uTmFtZTogcHJvcHMudHJhbnNpdGlvbk5hbWUsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRW50ZXI6IHByb3BzLnRyYW5zaXRpb25FbnRlcixcbiAgICAgICAgICAgIHRyYW5zaXRpb25BcHBlYXI6IHByb3BzLnRyYW5zaXRpb25BcHBlYXIsXG4gICAgICAgICAgICB0cmFuc2l0aW9uTGVhdmU6IHByb3BzLnRyYW5zaXRpb25MZWF2ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgQ29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50O1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIHZhciBwYXNzZWRQcm9wcyA9IHByb3BzO1xuICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhc3NlZFByb3BzID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBwcm9wcy5zdHlsZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgcGFzc2VkUHJvcHMsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW5bMF0gfHwgbnVsbDtcbiAgfTtcblxuICByZXR1cm4gQW5pbWF0ZTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcbkFuaW1hdGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuQW5pbWF0ZS5wcm9wVHlwZXMgPSBBbmltYXRlLnByb3BUeXBlcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBBbmltYXRlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1hbmltYXRlL2J1aWxkL0FuaW1hdGUuanNcbi8vIG1vZHVsZSBpZCA9IDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9BcnJheUNoaWxkcmVuID0gdG9BcnJheUNoaWxkcmVuO1xuZXhwb3J0cy5maW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXkgPSBmaW5kQ2hpbGRJbkNoaWxkcmVuQnlLZXk7XG5leHBvcnRzLmZpbmRTaG93bkNoaWxkSW5DaGlsZHJlbkJ5S2V5ID0gZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXk7XG5leHBvcnRzLmZpbmRIaWRkZW5DaGlsZEluQ2hpbGRyZW5CeUtleSA9IGZpbmRIaWRkZW5DaGlsZEluQ2hpbGRyZW5CeUtleTtcbmV4cG9ydHMuaXNTYW1lQ2hpbGRyZW4gPSBpc1NhbWVDaGlsZHJlbjtcbmV4cG9ydHMubWVyZ2VDaGlsZHJlbiA9IG1lcmdlQ2hpbGRyZW47XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHRvQXJyYXlDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgcmV0ID0gW107XG4gIF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldC5wdXNoKGNoaWxkKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShjaGlsZHJlbiwga2V5KSB7XG4gIHZhciByZXQgPSBudWxsO1xuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKHJldCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgcmV0ID0gY2hpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZmluZFNob3duQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApIHtcbiAgdmFyIHJldCA9IG51bGw7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQua2V5ID09PSBrZXkgJiYgY2hpbGQucHJvcHNbc2hvd1Byb3BdKSB7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R3byBjaGlsZCB3aXRoIHNhbWUga2V5IGZvciA8cmMtYW5pbWF0ZT4gY2hpbGRyZW4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBmaW5kSGlkZGVuQ2hpbGRJbkNoaWxkcmVuQnlLZXkoY2hpbGRyZW4sIGtleSwgc2hvd1Byb3ApIHtcbiAgdmFyIGZvdW5kID0gMDtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3VuZCA9IGNoaWxkICYmIGNoaWxkLmtleSA9PT0ga2V5ICYmICFjaGlsZC5wcm9wc1tzaG93UHJvcF07XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVDaGlsZHJlbihjMSwgYzIsIHNob3dQcm9wKSB7XG4gIHZhciBzYW1lID0gYzEubGVuZ3RoID09PSBjMi5sZW5ndGg7XG4gIGlmIChzYW1lKSB7XG4gICAgYzEuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICB2YXIgY2hpbGQyID0gYzJbaW5kZXhdO1xuICAgICAgaWYgKGNoaWxkICYmIGNoaWxkMikge1xuICAgICAgICBpZiAoY2hpbGQgJiYgIWNoaWxkMiB8fCAhY2hpbGQgJiYgY2hpbGQyKSB7XG4gICAgICAgICAgc2FtZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmtleSAhPT0gY2hpbGQyLmtleSkge1xuICAgICAgICAgIHNhbWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzaG93UHJvcCAmJiBjaGlsZC5wcm9wc1tzaG93UHJvcF0gIT09IGNoaWxkMi5wcm9wc1tzaG93UHJvcF0pIHtcbiAgICAgICAgICBzYW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc2FtZTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDaGlsZHJlbihwcmV2LCBuZXh0KSB7XG4gIHZhciByZXQgPSBbXTtcblxuICAvLyBGb3IgZWFjaCBrZXkgb2YgYG5leHRgLCB0aGUgbGlzdCBvZiBrZXlzIHRvIGluc2VydCBiZWZvcmUgdGhhdCBrZXkgaW5cbiAgLy8gdGhlIGNvbWJpbmVkIGxpc3RcbiAgdmFyIG5leHRDaGlsZHJlblBlbmRpbmcgPSB7fTtcbiAgdmFyIHBlbmRpbmdDaGlsZHJlbiA9IFtdO1xuICBwcmV2LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkICYmIGZpbmRDaGlsZEluQ2hpbGRyZW5CeUtleShuZXh0LCBjaGlsZC5rZXkpKSB7XG4gICAgICBpZiAocGVuZGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0Q2hpbGRyZW5QZW5kaW5nW2NoaWxkLmtleV0gPSBwZW5kaW5nQ2hpbGRyZW47XG4gICAgICAgIHBlbmRpbmdDaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nQ2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcblxuICBuZXh0LmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkICYmIG5leHRDaGlsZHJlblBlbmRpbmcuaGFzT3duUHJvcGVydHkoY2hpbGQua2V5KSkge1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdChuZXh0Q2hpbGRyZW5QZW5kaW5nW2NoaWxkLmtleV0pO1xuICAgIH1cbiAgICByZXQucHVzaChjaGlsZCk7XG4gIH0pO1xuXG4gIHJldCA9IHJldC5jb25jYXQocGVuZGluZ0NoaWxkcmVuKTtcblxuICByZXR1cm4gcmV0O1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYW5pbWF0ZS9idWlsZC9DaGlsZHJlblV0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX3RpbnBlckJlZUNvcmUgPSByZXF1aXJlKCd0aW5wZXItYmVlLWNvcmUnKTtcblxudmFyIF91dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBfdXRpbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogX2RlZmF1bHRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG52YXIgdHJhbnNpdGlvbk1hcCA9IHtcbiAgZW50ZXI6ICd0cmFuc2l0aW9uRW50ZXInLFxuICBhcHBlYXI6ICd0cmFuc2l0aW9uQXBwZWFyJyxcbiAgbGVhdmU6ICd0cmFuc2l0aW9uTGVhdmUnXG59O1xuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogX3JlYWN0LlByb3BUeXBlcy5hbnlcbn07XG5cbnZhciBBbmltYXRlQ2hpbGQgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQW5pbWF0ZUNoaWxkLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBbmltYXRlQ2hpbGQocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0ZUNoaWxkKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMudHJhbnNpdGlvbiA9IF90aGlzLnRyYW5zaXRpb24uYmluZChfdGhpcyk7XG4gICAgX3RoaXMuc3RvcCA9IF90aGlzLnN0b3AuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgQW5pbWF0ZUNoaWxkLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICB9O1xuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbEVudGVyID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbEVudGVyKGRvbmUpIHtcbiAgICBpZiAoX3V0aWwyW1wiZGVmYXVsdFwiXS5pc0VudGVyU3VwcG9ydGVkKHRoaXMucHJvcHMpKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb24oJ2VudGVyJywgZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZUNoaWxkLnByb3RvdHlwZS5jb21wb25lbnRXaWxsQXBwZWFyID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbEFwcGVhcihkb25lKSB7XG4gICAgaWYgKF91dGlsMltcImRlZmF1bHRcIl0uaXNBcHBlYXJTdXBwb3J0ZWQodGhpcy5wcm9wcykpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbignYXBwZWFyJywgZG9uZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZUNoaWxkLnByb3RvdHlwZS5jb21wb25lbnRXaWxsTGVhdmUgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTGVhdmUoZG9uZSkge1xuICAgIGlmIChfdXRpbDJbXCJkZWZhdWx0XCJdLmlzTGVhdmVTdXBwb3J0ZWQodGhpcy5wcm9wcykpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbignbGVhdmUnLCBkb25lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYWx3YXlzIHN5bmMsIGRvIG5vdCBpbnRlcnVwdCB3aXRoIHJlYWN0IGNvbXBvbmVudCBsaWZlIGN5Y2xlXG4gICAgICAvLyB1cGRhdGUgaGlkZGVuIC0+IGFuaW1hdGUgaGlkZGVuIC0+XG4gICAgICAvLyBkaWRVcGRhdGUgLT4gYW5pbWF0ZSBsZWF2ZSAtPiB1bm1vdW50IChpZiBhbmltYXRlIGlzIG5vbmUpXG4gICAgICBkb25lKCk7XG4gICAgfVxuICB9O1xuXG4gIEFuaW1hdGVDaGlsZC5wcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uIHRyYW5zaXRpb24oYW5pbWF0aW9uVHlwZSwgZmluaXNoQ2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBub2RlID0gX3JlYWN0RG9tMltcImRlZmF1bHRcIl0uZmluZERPTU5vZGUodGhpcyk7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy50cmFuc2l0aW9uTmFtZTtcbiAgICB2YXIgbmFtZUlzT2JqID0gKHR5cGVvZiB0cmFuc2l0aW9uTmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJhbnNpdGlvbk5hbWUpKSA9PT0gJ29iamVjdCc7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdmFyIGVuZCA9IGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgIF90aGlzMi5zdG9wcGVyID0gbnVsbDtcbiAgICAgIGZpbmlzaENhbGxiYWNrKCk7XG4gICAgfTtcbiAgICBpZiAoKF90aW5wZXJCZWVDb3JlLmNzc0FuaW1hdGlvbi5pc0Nzc0FuaW1hdGlvblN1cHBvcnRlZCB8fCAhcHJvcHMuYW5pbWF0aW9uW2FuaW1hdGlvblR5cGVdKSAmJiB0cmFuc2l0aW9uTmFtZSAmJiBwcm9wc1t0cmFuc2l0aW9uTWFwW2FuaW1hdGlvblR5cGVdXSkge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lSXNPYmogPyB0cmFuc2l0aW9uTmFtZVthbmltYXRpb25UeXBlXSA6IHRyYW5zaXRpb25OYW1lICsgJy0nICsgYW5pbWF0aW9uVHlwZTtcbiAgICAgIHZhciBhY3RpdmVOYW1lID0gbmFtZSArICctYWN0aXZlJztcbiAgICAgIGlmIChuYW1lSXNPYmogJiYgdHJhbnNpdGlvbk5hbWVbYW5pbWF0aW9uVHlwZSArICdBY3RpdmUnXSkge1xuICAgICAgICBhY3RpdmVOYW1lID0gdHJhbnNpdGlvbk5hbWVbYW5pbWF0aW9uVHlwZSArICdBY3RpdmUnXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcHBlciA9ICgwLCBfdGlucGVyQmVlQ29yZS5jc3NBbmltYXRpb24pKG5vZGUsIHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgYWN0aXZlOiBhY3RpdmVOYW1lXG4gICAgICB9LCBlbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BwZXIgPSBwcm9wcy5hbmltYXRpb25bYW5pbWF0aW9uVHlwZV0obm9kZSwgZW5kKTtcbiAgICB9XG4gIH07XG5cbiAgQW5pbWF0ZUNoaWxkLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2YXIgc3RvcHBlciA9IHRoaXMuc3RvcHBlcjtcbiAgICBpZiAoc3RvcHBlcikge1xuICAgICAgdGhpcy5zdG9wcGVyID0gbnVsbDtcbiAgICAgIHN0b3BwZXIuc3RvcCgpO1xuICAgIH1cbiAgfTtcblxuICBBbmltYXRlQ2hpbGQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgfTtcblxuICByZXR1cm4gQW5pbWF0ZUNoaWxkO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuXG5BbmltYXRlQ2hpbGQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEFuaW1hdGVDaGlsZDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtYW5pbWF0ZS9idWlsZC9BbmltYXRlQ2hpbGQuanNcbi8vIG1vZHVsZSBpZCA9IDgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xudmFyIHV0aWwgPSB7XG4gIGlzQXBwZWFyU3VwcG9ydGVkOiBmdW5jdGlvbiBpc0FwcGVhclN1cHBvcnRlZChwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uTmFtZSAmJiBwcm9wcy50cmFuc2l0aW9uQXBwZWFyIHx8IHByb3BzLmFuaW1hdGlvbi5hcHBlYXI7XG4gIH0sXG4gIGlzRW50ZXJTdXBwb3J0ZWQ6IGZ1bmN0aW9uIGlzRW50ZXJTdXBwb3J0ZWQocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbk5hbWUgJiYgcHJvcHMudHJhbnNpdGlvbkVudGVyIHx8IHByb3BzLmFuaW1hdGlvbi5lbnRlcjtcbiAgfSxcbiAgaXNMZWF2ZVN1cHBvcnRlZDogZnVuY3Rpb24gaXNMZWF2ZVN1cHBvcnRlZChwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50cmFuc2l0aW9uTmFtZSAmJiBwcm9wcy50cmFuc2l0aW9uTGVhdmUgfHwgcHJvcHMuYW5pbWF0aW9uLmxlYXZlO1xuICB9LFxuICBhbGxvd0FwcGVhckNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0FwcGVhckNhbGxiYWNrKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRyYW5zaXRpb25BcHBlYXIgfHwgcHJvcHMuYW5pbWF0aW9uLmFwcGVhcjtcbiAgfSxcbiAgYWxsb3dFbnRlckNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0VudGVyQ2FsbGJhY2socHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbkVudGVyIHx8IHByb3BzLmFuaW1hdGlvbi5lbnRlcjtcbiAgfSxcbiAgYWxsb3dMZWF2ZUNhbGxiYWNrOiBmdW5jdGlvbiBhbGxvd0xlYXZlQ2FsbGJhY2socHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudHJhbnNpdGlvbkxlYXZlIHx8IHByb3BzLmFuaW1hdGlvbi5sZWF2ZTtcbiAgfVxufTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdXRpbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1hbmltYXRlL2J1aWxkL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX0xhenlSZW5kZXJCb3ggPSByZXF1aXJlKCcuL0xhenlSZW5kZXJCb3gnKTtcblxudmFyIF9MYXp5UmVuZGVyQm94MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0xhenlSZW5kZXJCb3gpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGhpZGRlbkNsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGNsYXNzTmFtZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGNsc1ByZWZpeDogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9uTW91c2VFbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IF9yZWFjdC5Qcm9wVHlwZXMuYW55XG59O1xuXG52YXIgUG9wdXBJbm5lciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQb3B1cElubmVyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQb3B1cElubmVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3B1cElubmVyKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUG9wdXBJbm5lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZTtcbiAgICBpZiAoIXByb3BzLnZpc2libGUpIHtcbiAgICAgIGNsYXNzTmFtZSArPSAnICcgKyBwcm9wcy5oaWRkZW5DbGFzc05hbWU7XG4gICAgfVxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IHByb3BzLm9uTW91c2VFbnRlcixcbiAgICAgICAgb25Nb3VzZUxlYXZlOiBwcm9wcy5vbk1vdXNlTGVhdmUsXG4gICAgICAgIHN0eWxlOiBwcm9wcy5zdHlsZVxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9MYXp5UmVuZGVyQm94MltcImRlZmF1bHRcIl0sXG4gICAgICAgIHsgY2xhc3NOYW1lOiBwcm9wcy5jbHNQcmVmaXggKyAnLWNvbnRlbnQnLCB2aXNpYmxlOiBwcm9wcy52aXNpYmxlIH0sXG4gICAgICAgIHByb3BzLmNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUG9wdXBJbm5lcjtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuUG9wdXBJbm5lci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFBvcHVwSW5uZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci9Qb3B1cElubmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7IHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsgdmFyIGtleSA9IGtleXNbaV07IHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7IGlmICh2YWx1ZSAmJiB2YWx1ZS5jb25maWd1cmFibGUgJiYgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTsgfSB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBfcmVhY3QuUHJvcFR5cGVzLmFueSxcbiAgY2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgdmlzaWJsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoaWRkZW5DbGFzc05hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG59O1xuXG52YXIgTGF6eVJlbmRlckJveCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhMYXp5UmVuZGVyQm94LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMYXp5UmVuZGVyQm94KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXp5UmVuZGVyQm94KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTGF6eVJlbmRlckJveC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIHJldHVybiBuZXh0UHJvcHMuaGlkZGVuQ2xhc3NOYW1lIHx8IG5leHRQcm9wcy52aXNpYmxlO1xuICB9O1xuXG4gIExhenlSZW5kZXJCb3gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaGlkZGVuQ2xhc3NOYW1lID0gX3Byb3BzLmhpZGRlbkNsYXNzTmFtZSxcbiAgICAgICAgdmlzaWJsZSA9IF9wcm9wcy52aXNpYmxlLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnaGlkZGVuQ2xhc3NOYW1lJywgJ3Zpc2libGUnXSk7XG5cbiAgICBpZiAoaGlkZGVuQ2xhc3NOYW1lIHx8IF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLmNvdW50KHByb3BzLmNoaWxkcmVuKSA+IDEpIHtcbiAgICAgIGlmICghdmlzaWJsZSAmJiBoaWRkZW5DbGFzc05hbWUpIHtcbiAgICAgICAgcHJvcHMuY2xhc3NOYW1lICs9ICcgJyArIGhpZGRlbkNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdkaXYnLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLkNoaWxkcmVuLm9ubHkocHJvcHMuY2hpbGRyZW4pO1xuICB9O1xuXG4gIHJldHVybiBMYXp5UmVuZGVyQm94O1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuTGF6eVJlbmRlckJveC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTGF6eVJlbmRlckJveDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtb3ZlcmxheS9idWlsZC90cmlnZ2VyL0xhenlSZW5kZXJCb3guanNcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZXhwb3J0cy5nZXRBbGlnbkZyb21QbGFjZW1lbnQgPSBnZXRBbGlnbkZyb21QbGFjZW1lbnQ7XG5leHBvcnRzLmdldFBvcHVwQ2xhc3NOYW1lRnJvbUFsaWduID0gZ2V0UG9wdXBDbGFzc05hbWVGcm9tQWxpZ247XG5mdW5jdGlvbiBpc1BvaW50c0VxKGExLCBhMikge1xuICByZXR1cm4gYTFbMF0gPT09IGEyWzBdICYmIGExWzFdID09PSBhMlsxXTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25Gcm9tUGxhY2VtZW50KGJ1aWx0aW5QbGFjZW1lbnRzLCBwbGFjZW1lbnRTdHIsIGFsaWduKSB7XG4gIHZhciBiYXNlQWxpZ24gPSBidWlsdGluUGxhY2VtZW50c1twbGFjZW1lbnRTdHJdIHx8IHt9O1xuICByZXR1cm4gX2V4dGVuZHMoe30sIGJhc2VBbGlnbiwgYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBnZXRQb3B1cENsYXNzTmFtZUZyb21BbGlnbihidWlsdGluUGxhY2VtZW50cywgY2xzUHJlZml4LCBhbGlnbikge1xuICB2YXIgcG9pbnRzID0gYWxpZ24ucG9pbnRzO1xuICBmb3IgKHZhciBwbGFjZW1lbnQgaW4gYnVpbHRpblBsYWNlbWVudHMpIHtcbiAgICBpZiAoYnVpbHRpblBsYWNlbWVudHMuaGFzT3duUHJvcGVydHkocGxhY2VtZW50KSkge1xuICAgICAgaWYgKGlzUG9pbnRzRXEoYnVpbHRpblBsYWNlbWVudHNbcGxhY2VtZW50XS5wb2ludHMsIHBvaW50cykpIHtcbiAgICAgICAgcmV0dXJuIGNsc1ByZWZpeCArICctcGxhY2VtZW50LScgKyBwbGFjZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW92ZXJsYXkvYnVpbGQvdHJpZ2dlci91dGlscy5qc1xuLy8gbW9kdWxlIGlkID0gODVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xudmFyIGF1dG9BZGp1c3RPdmVyZmxvdyA9IHtcbiAgYWRqdXN0WDogMSxcbiAgYWRqdXN0WTogMVxufTtcblxudmFyIHRhcmdldE9mZnNldCA9IFswLCAwXTtcblxudmFyIHBsYWNlbWVudHMgPSBleHBvcnRzLnBsYWNlbWVudHMgPSB7XG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BDZW50ZXI6IHtcbiAgICBwb2ludHM6IFsnYmMnLCAndGMnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIC00XSxcbiAgICB0YXJnZXRPZmZzZXQ6IHRhcmdldE9mZnNldFxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgLTRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH0sXG4gIGJvdHRvbUNlbnRlcjoge1xuICAgIHBvaW50czogWyd0YycsICdiYyddLFxuICAgIG92ZXJmbG93OiBhdXRvQWRqdXN0T3ZlcmZsb3csXG4gICAgb2Zmc2V0OiBbMCwgNF0sXG4gICAgdGFyZ2V0T2Zmc2V0OiB0YXJnZXRPZmZzZXRcbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXSxcbiAgICBvdmVyZmxvdzogYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIG9mZnNldDogWzAsIDRdLFxuICAgIHRhcmdldE9mZnNldDogdGFyZ2V0T2Zmc2V0XG4gIH1cbn07XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gcGxhY2VtZW50cztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLWRyb3Bkb3duL2J1aWxkL3BsYWNlbWVudC5qc1xuLy8gbW9kdWxlIGlkID0gODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5EaXZpZGVyID0gZXhwb3J0cy5JdGVtR3JvdXAgPSBleHBvcnRzLk1lbnVJdGVtR3JvdXAgPSBleHBvcnRzLk1lbnVJdGVtID0gZXhwb3J0cy5JdGVtID0gZXhwb3J0cy5TdWJNZW51ID0gdW5kZWZpbmVkO1xuXG52YXIgX01lbnUgPSByZXF1aXJlKCcuL01lbnUnKTtcblxudmFyIF9NZW51MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lbnUpO1xuXG52YXIgX1N1Yk1lbnUgPSByZXF1aXJlKCcuL1N1Yk1lbnUnKTtcblxudmFyIF9TdWJNZW51MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1N1Yk1lbnUpO1xuXG52YXIgX01lbnVJdGVtID0gcmVxdWlyZSgnLi9NZW51SXRlbScpO1xuXG52YXIgX01lbnVJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lbnVJdGVtKTtcblxudmFyIF9NZW51SXRlbUdyb3VwID0gcmVxdWlyZSgnLi9NZW51SXRlbUdyb3VwJyk7XG5cbnZhciBfTWVudUl0ZW1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZW51SXRlbUdyb3VwKTtcblxudmFyIF9EaXZpZGVyID0gcmVxdWlyZSgnLi9EaXZpZGVyJyk7XG5cbnZhciBfRGl2aWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9EaXZpZGVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmV4cG9ydHMuU3ViTWVudSA9IF9TdWJNZW51MltcImRlZmF1bHRcIl07XG5leHBvcnRzLkl0ZW0gPSBfTWVudUl0ZW0yW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuTWVudUl0ZW0gPSBfTWVudUl0ZW0yW1wiZGVmYXVsdFwiXTtcbmV4cG9ydHMuTWVudUl0ZW1Hcm91cCA9IF9NZW51SXRlbUdyb3VwMltcImRlZmF1bHRcIl07XG5leHBvcnRzLkl0ZW1Hcm91cCA9IF9NZW51SXRlbUdyb3VwMltcImRlZmF1bHRcIl07XG5leHBvcnRzLkRpdmlkZXIgPSBfRGl2aWRlcjJbXCJkZWZhdWx0XCJdO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfTWVudTJbXCJkZWZhdWx0XCJdO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iZWUtbWVudS9idWlsZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9ET01XcmFwID0gcmVxdWlyZSgnLi9ET01XcmFwJyk7XG5cbnZhciBfRE9NV3JhcDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ET01XcmFwKTtcblxudmFyIF90aW5wZXJCZWVDb3JlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gc2F2ZVJlZihpbmRleCwgc3ViSW5kZXgsIGMpIHtcbiAgaWYgKGMpIHtcbiAgICBpZiAoc3ViSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnN0YW5jZUFycmF5W2luZGV4XSA9IHRoaXMuaW5zdGFuY2VBcnJheVtpbmRleF0gfHwgW107XG4gICAgICB0aGlzLmluc3RhbmNlQXJyYXlbaW5kZXhdW3N1YkluZGV4XSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VBcnJheVtpbmRleF0gPSBjO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYWxsRGlzYWJsZWQoYXJyKSB7XG4gIGlmICghYXJyLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBhcnIuZXZlcnkoZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gISFjLnByb3BzLmRpc2FibGVkO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlS2V5KHByb3BzLCBvcmlnaW5hbEFjdGl2ZUtleSkge1xuICB2YXIgYWN0aXZlS2V5ID0gb3JpZ2luYWxBY3RpdmVLZXk7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleTtcblxuICBpZiAoYWN0aXZlS2V5KSB7XG4gICAgdmFyIGZvdW5kID0gdm9pZCAwO1xuICAgICgwLCBfdXRpbC5sb29wTWVudUl0ZW0pKGNoaWxkcmVuLCBmdW5jdGlvbiAoYywgaSkge1xuICAgICAgaWYgKGMgJiYgIWMucHJvcHMuZGlzYWJsZWQgJiYgYWN0aXZlS2V5ID09PSAoMCwgX3V0aWwuZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXgpKGMsIGV2ZW50S2V5LCBpKSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gYWN0aXZlS2V5O1xuICAgIH1cbiAgfVxuICBhY3RpdmVLZXkgPSBudWxsO1xuICBpZiAocHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0KSB7XG4gICAgKDAsIF91dGlsLmxvb3BNZW51SXRlbSkoY2hpbGRyZW4sIGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgICBpZiAoIWFjdGl2ZUtleSAmJiBjICYmICFjLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIGFjdGl2ZUtleSA9ICgwLCBfdXRpbC5nZXRLZXlGcm9tQ2hpbGRyZW5JbmRleCkoYywgZXZlbnRLZXksIGkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVLZXk7XG4gIH1cbiAgcmV0dXJuIGFjdGl2ZUtleTtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcblxuICBvcGVuU3ViTWVudU9uTW91c2VFbnRlcjogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjbG9zZVN1Yk1lbnVPbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2VsZWN0ZWRLZXlzOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0LlByb3BUeXBlcy5hcnJheU9mKF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nKSwgX3JlYWN0LlByb3BUeXBlcy5hcnJheU9mKF9yZWFjdC5Qcm9wVHlwZXMubnVtYmVyKV0pLFxuICBkZWZhdWx0U2VsZWN0ZWRLZXlzOiBfcmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcpLFxuICBkZWZhdWx0T3BlbktleXM6IF9yZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyksXG4gIG9wZW5LZXlzOiBfcmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcpLFxuICBtb2RlOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb25DbGljazogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvblNlbGVjdDogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkRlc2VsZWN0OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRGVzdHJveTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvcGVuVHJhbnNpdGlvbk5hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBvcGVuQW5pbWF0aW9uOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsIF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0XSksXG4gIGxldmVsOiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgZXZlbnRLZXk6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBzZWxlY3RhYmxlOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNoaWxkcmVuOiBfcmVhY3QuUHJvcFR5cGVzLmFueSxcblxuICBmb2N1c2FibGU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbXVsdGlwbGU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc3R5bGU6IF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICBkZWZhdWx0QWN0aXZlRmlyc3Q6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgdmlzaWJsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBhY3RpdmVLZXk6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG5cbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBvcGVuU3ViTWVudU9uTW91c2VFbnRlcjogdHJ1ZSxcbiAgY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlOiB0cnVlLFxuICBzZWxlY3RhYmxlOiB0cnVlLFxuICBvbkNsaWNrOiBfdXRpbC5ub29wLFxuICBvblNlbGVjdDogX3V0aWwubm9vcCxcbiAgb25PcGVuQ2hhbmdlOiBfdXRpbC5ub29wLFxuICBvbkRlc2VsZWN0OiBfdXRpbC5ub29wLFxuICBkZWZhdWx0U2VsZWN0ZWRLZXlzOiBbXSxcbiAgZGVmYXVsdE9wZW5LZXlzOiBbXSxcblxuICBjbHNQcmVmaXg6ICd1LW1lbnUnLFxuICBjbGFzc05hbWU6ICcnLFxuICBtb2RlOiAndmVydGljYWwnLFxuICBsZXZlbDogMSxcbiAgaW5saW5lSW5kZW50OiAyNCxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgZm9jdXNhYmxlOiB0cnVlLFxuICBzdHlsZToge31cbn07XG5cbnZhciBNZW51ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1lbnUsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lbnUocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpKTtcblxuICAgIHZhciBzZWxlY3RlZEtleXMgPSBfdGhpcy5wcm9wcy5kZWZhdWx0U2VsZWN0ZWRLZXlzO1xuICAgIHZhciBvcGVuS2V5cyA9IF90aGlzLnByb3BzLmRlZmF1bHRPcGVuS2V5cztcbiAgICBpZiAoJ3NlbGVjdGVkS2V5cycgaW4gX3RoaXMucHJvcHMpIHtcbiAgICAgIHNlbGVjdGVkS2V5cyA9IF90aGlzLnByb3BzLnNlbGVjdGVkS2V5cyB8fCBbXTtcbiAgICB9XG4gICAgaWYgKCdvcGVuS2V5cycgaW4gcHJvcHMpIHtcbiAgICAgIG9wZW5LZXlzID0gX3RoaXMucHJvcHMub3BlbktleXMgfHwgW107XG4gICAgfVxuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICAgIG9wZW5LZXlzOiBvcGVuS2V5cyxcbiAgICAgIGFjdGl2ZUtleTogZ2V0QWN0aXZlS2V5KF90aGlzLnByb3BzLCBfdGhpcy5wcm9wcy5hY3RpdmVLZXkpXG4gICAgICAvL2FjdGl2ZUtleTogZ2V0QWN0aXZlS2V5KHRoaXMucHJvcHMsIHRoaXMucHJvcHMuYWN0aXZlS2V5KSxcbiAgICB9O1xuICAgIF90aGlzLnJlbmRlck1lbnVJdGVtID0gX3RoaXMucmVuZGVyTWVudUl0ZW0uYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25EZXN0cm95ID0gX3RoaXMub25EZXN0cm95LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uSXRlbUhvdmVyID0gX3RoaXMub25JdGVtSG92ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25TZWxlY3QgPSBfdGhpcy5vblNlbGVjdC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbk9wZW5DaGFuZ2UgPSBfdGhpcy5vbk9wZW5DaGFuZ2UuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DbGljayA9IF90aGlzLm9uQ2xpY2suYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25EZXNlbGVjdCA9IF90aGlzLm9uRGVzZWxlY3QuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0T3BlblRyYW5zaXRpb25OYW1lID0gX3RoaXMuZ2V0T3BlblRyYW5zaXRpb25OYW1lLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmlzSW5saW5lTW9kZSA9IF90aGlzLmlzSW5saW5lTW9kZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5sYXN0T3BlblN1Yk1lbnUgPSBfdGhpcy5sYXN0T3BlblN1Yk1lbnUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVuZGVyTWVudUl0ZW0gPSBfdGhpcy5yZW5kZXJNZW51SXRlbS5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnJlbmRlckNvbW1vbk1lbnVJdGVtID0gX3RoaXMucmVuZGVyQ29tbW9uTWVudUl0ZW0uYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVuZGVyUm9vdCA9IF90aGlzLnJlbmRlclJvb3QuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0T3BlbkNoYW5nZXNPbkl0ZW1Ib3ZlciA9IF90aGlzLmdldE9wZW5DaGFuZ2VzT25JdGVtSG92ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0RmxhdEluc3RhbmNlQXJyYXkgPSBfdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbktleURvd24gPSBfdGhpcy5vbktleURvd24uYmluZChfdGhpcyk7XG4gICAgX3RoaXMuc3RlcCA9IF90aGlzLnN0ZXAuYmluZChfdGhpcyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBNZW51LnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBpZiAoJ3NlbGVjdGVkS2V5cycgaW4gbmV4dFByb3BzKSB7XG4gICAgICBwcm9wcy5zZWxlY3RlZEtleXMgPSBuZXh0UHJvcHMuc2VsZWN0ZWRLZXlzO1xuICAgIH1cbiAgICBpZiAoJ29wZW5LZXlzJyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgIHByb3BzLm9wZW5LZXlzID0gbmV4dFByb3BzLm9wZW5LZXlzO1xuICAgIH1cblxuICAgIGlmICgnYWN0aXZlS2V5JyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgIHByb3BzLmFjdGl2ZUtleSA9IGdldEFjdGl2ZUtleShuZXh0UHJvcHMsIG5leHRQcm9wcy5hY3RpdmVLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb3JpZ2luYWxBY3RpdmVLZXkgPSB0aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSBnZXRBY3RpdmVLZXkobmV4dFByb3BzLCBvcmlnaW5hbEFjdGl2ZUtleSk7XG4gICAgICAvLyBmaXg6IHRoaXMuc2V0U3RhdGUoKSwgcGFyZW50LnJlbmRlcigpLFxuICAgICAgaWYgKGFjdGl2ZUtleSAhPT0gb3JpZ2luYWxBY3RpdmVLZXkpIHtcbiAgICAgICAgcHJvcHMuYWN0aXZlS2V5ID0gYWN0aXZlS2V5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUocHJvcHMpO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICB0aGlzLmluc3RhbmNlQXJyYXkgPSBbXTtcbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiBvbkRlc3Ryb3koa2V5KSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBzZWxlY3RlZEtleXMgPSBzdGF0ZS5zZWxlY3RlZEtleXM7XG4gICAgdmFyIG9wZW5LZXlzID0gc3RhdGUub3BlbktleXM7XG4gICAgdmFyIGluZGV4ID0gc2VsZWN0ZWRLZXlzLmluZGV4T2Yoa2V5KTtcbiAgICBpZiAoISgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykgJiYgaW5kZXggIT09IC0xKSB7XG4gICAgICBzZWxlY3RlZEtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaW5kZXggPSBvcGVuS2V5cy5pbmRleE9mKGtleSk7XG4gICAgaWYgKCEoJ29wZW5LZXlzJyBpbiBwcm9wcykgJiYgaW5kZXggIT09IC0xKSB7XG4gICAgICBvcGVuS2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbkl0ZW1Ib3ZlciA9IGZ1bmN0aW9uIG9uSXRlbUhvdmVyKGUpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBpdGVtID0gZS5pdGVtO1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBtb2RlID0gX3Byb3BzLm1vZGUsXG4gICAgICAgIGNsb3NlU3ViTWVudU9uTW91c2VMZWF2ZSA9IF9wcm9wcy5jbG9zZVN1Yk1lbnVPbk1vdXNlTGVhdmU7XG4gICAgdmFyIF9lJG9wZW5DaGFuZ2VzID0gZS5vcGVuQ2hhbmdlcyxcbiAgICAgICAgb3BlbkNoYW5nZXMgPSBfZSRvcGVuQ2hhbmdlcyA9PT0gdW5kZWZpbmVkID8gW10gOiBfZSRvcGVuQ2hhbmdlcztcbiAgICAvLyBzcGVjaWFsIGZvciB0b3Agc3ViIG1lbnVcblxuICAgIGlmIChtb2RlICE9PSAnaW5saW5lJyAmJiAhY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlICYmIGl0ZW0uaXNTdWJNZW51KSB7XG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWN0aXZlS2V5ID0gX3RoaXMyLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgICAgdmFyIGFjdGl2ZUl0ZW0gPSBfdGhpczIuZ2V0RmxhdEluc3RhbmNlQXJyYXkoKS5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXR1cm4gYyAmJiBjLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICBpZiAoYWN0aXZlSXRlbSAmJiBhY3RpdmVJdGVtLnByb3BzLm9wZW4pIHtcbiAgICAgICAgICBvcGVuQ2hhbmdlcyA9IG9wZW5DaGFuZ2VzLmNvbmNhdCh7XG4gICAgICAgICAgICBrZXk6IGl0ZW0ucHJvcHMuZXZlbnRLZXksXG4gICAgICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIG9wZW46IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9XG4gICAgb3BlbkNoYW5nZXMgPSBvcGVuQ2hhbmdlcy5jb25jYXQodGhpcy5nZXRPcGVuQ2hhbmdlc09uSXRlbUhvdmVyKGUpKTtcbiAgICBpZiAob3BlbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm9uT3BlbkNoYW5nZShvcGVuQ2hhbmdlcyk7XG4gICAgfVxuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLm9uU2VsZWN0ID0gZnVuY3Rpb24gb25TZWxlY3Qoc2VsZWN0SW5mbykge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHByb3BzLnNlbGVjdGFibGUpIHtcbiAgICAgIC8vIHJvb3QgbWVudVxuICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IHRoaXMuc3RhdGUuc2VsZWN0ZWRLZXlzO1xuICAgICAgdmFyIHNlbGVjdGVkS2V5ID0gc2VsZWN0SW5mby5rZXk7XG4gICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzID0gc2VsZWN0ZWRLZXlzLmNvbmNhdChbc2VsZWN0ZWRLZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cyA9IFtzZWxlY3RlZEtleV07XG4gICAgICB9XG4gICAgICBpZiAoISgnc2VsZWN0ZWRLZXlzJyBpbiBwcm9wcykpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9wcy5vblNlbGVjdChfZXh0ZW5kcyh7fSwgc2VsZWN0SW5mbywge1xuICAgICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5c1xuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgdGhpcy5wcm9wcy5vbkNsaWNrKGUpO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLm9uT3BlbkNoYW5nZSA9IGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShlXykge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIG9wZW5LZXlzID0gdGhpcy5zdGF0ZS5vcGVuS2V5cy5jb25jYXQoKTtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBwcm9jZXNzU2luZ2xlID0gZnVuY3Rpb24gcHJvY2Vzc1NpbmdsZShlKSB7XG4gICAgICB2YXIgb25lQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgaWYgKGUub3Blbikge1xuICAgICAgICBvbmVDaGFuZ2VkID0gb3BlbktleXMuaW5kZXhPZihlLmtleSkgPT09IC0xO1xuICAgICAgICBpZiAob25lQ2hhbmdlZCkge1xuICAgICAgICAgIG9wZW5LZXlzLnB1c2goZS5rZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSBvcGVuS2V5cy5pbmRleE9mKGUua2V5KTtcbiAgICAgICAgb25lQ2hhbmdlZCA9IGluZGV4ICE9PSAtMTtcbiAgICAgICAgaWYgKG9uZUNoYW5nZWQpIHtcbiAgICAgICAgICBvcGVuS2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjaGFuZ2VkID0gY2hhbmdlZCB8fCBvbmVDaGFuZ2VkO1xuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZV8pKSB7XG4gICAgICAvLyBiYXRjaCBjaGFuZ2UgY2FsbFxuICAgICAgZV8uZm9yRWFjaChwcm9jZXNzU2luZ2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc1NpbmdsZShlXyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICBpZiAoISgnb3BlbktleXMnIGluIHRoaXMucHJvcHMpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuS2V5czogb3BlbktleXMgfSk7XG4gICAgICB9XG4gICAgICBwcm9wcy5vbk9wZW5DaGFuZ2Uob3BlbktleXMpO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbkRlc2VsZWN0ID0gZnVuY3Rpb24gb25EZXNlbGVjdChzZWxlY3RJbmZvKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBpZiAocHJvcHMuc2VsZWN0YWJsZSkge1xuICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IHRoaXMuc3RhdGUuc2VsZWN0ZWRLZXlzLmNvbmNhdCgpO1xuICAgICAgdmFyIHNlbGVjdGVkS2V5ID0gc2VsZWN0SW5mby5rZXk7XG4gICAgICB2YXIgaW5kZXggPSBzZWxlY3RlZEtleXMuaW5kZXhPZihzZWxlY3RlZEtleSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCEoJ3NlbGVjdGVkS2V5cycgaW4gcHJvcHMpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkS2V5czogc2VsZWN0ZWRLZXlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcHJvcHMub25EZXNlbGVjdChfZXh0ZW5kcyh7fSwgc2VsZWN0SW5mbywge1xuICAgICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5c1xuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5nZXRPcGVuVHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRPcGVuVHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5vcGVuVHJhbnNpdGlvbk5hbWU7XG4gICAgdmFyIGFuaW1hdGlvbk5hbWUgPSBwcm9wcy5vcGVuQW5pbWF0aW9uO1xuICAgIGlmICghdHJhbnNpdGlvbk5hbWUgJiYgdHlwZW9mIGFuaW1hdGlvbk5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cmFuc2l0aW9uTmFtZSA9IHByb3BzLmNsc1ByZWZpeCArICctb3Blbi0nICsgYW5pbWF0aW9uTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLmlzSW5saW5lTW9kZSA9IGZ1bmN0aW9uIGlzSW5saW5lTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5tb2RlID09PSAnaW5saW5lJztcbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5sYXN0T3BlblN1Yk1lbnUgPSBmdW5jdGlvbiBsYXN0T3BlblN1Yk1lbnUoKSB7XG4gICAgdmFyIGxhc3RPcGVuID0gW107XG4gICAgdmFyIG9wZW5LZXlzID0gdGhpcy5zdGF0ZS5vcGVuS2V5cztcblxuICAgIGlmIChvcGVuS2V5cy5sZW5ndGgpIHtcbiAgICAgIGxhc3RPcGVuID0gdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYyAmJiBvcGVuS2V5cy5pbmRleE9mKGMucHJvcHMuZXZlbnRLZXkpICE9PSAtMTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGFzdE9wZW5bMF07XG4gIH07XG5cbiAgTWVudS5wcm90b3R5cGUucmVuZGVyTWVudUl0ZW0gPSBmdW5jdGlvbiByZW5kZXJNZW51SXRlbShjLCBpLCBzdWJJbmRleCkge1xuICAgIGlmICghYykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgdmFyIGV4dHJhUHJvcHMgPSB7XG4gICAgICBvcGVuS2V5czogc3RhdGUub3BlbktleXMsXG4gICAgICBzZWxlY3RlZEtleXM6IHN0YXRlLnNlbGVjdGVkS2V5cyxcbiAgICAgIG9wZW5TdWJNZW51T25Nb3VzZUVudGVyOiB0aGlzLnByb3BzLm9wZW5TdWJNZW51T25Nb3VzZUVudGVyXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJDb21tb25NZW51SXRlbShjLCBpLCBzdWJJbmRleCwgZXh0cmFQcm9wcyk7XG4gIH07XG5cbiAgTWVudS5wcm90b3R5cGUucmVuZGVyQ29tbW9uTWVudUl0ZW0gPSBmdW5jdGlvbiByZW5kZXJDb21tb25NZW51SXRlbShjaGlsZCwgaSwgc3ViSW5kZXgsIGV4dHJhUHJvcHMpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGtleSA9ICgwLCBfdXRpbC5nZXRLZXlGcm9tQ2hpbGRyZW5JbmRleCkoY2hpbGQsIHByb3BzLmV2ZW50S2V5LCBpKTtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzO1xuICAgIHZhciBpc0FjdGl2ZSA9IGtleSA9PT0gc3RhdGUuYWN0aXZlS2V5O1xuICAgIHZhciBuZXdDaGlsZFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgbW9kZTogcHJvcHMubW9kZSxcbiAgICAgIGxldmVsOiBwcm9wcy5sZXZlbCxcbiAgICAgIGlubGluZUluZGVudDogcHJvcHMuaW5saW5lSW5kZW50LFxuICAgICAgcmVuZGVyTWVudUl0ZW06IHRoaXMucmVuZGVyTWVudUl0ZW0sXG4gICAgICByb290UHJlZml4Q2xzOiBwcm9wcy5jbHNQcmVmaXgsXG4gICAgICBpbmRleDogaSxcbiAgICAgIHBhcmVudE1lbnU6IHRoaXMsXG4gICAgICByZWY6IGNoaWxkUHJvcHMuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiAoMCwgX3RpbnBlckJlZUNvcmUuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKShjaGlsZC5yZWYsIHNhdmVSZWYuYmluZCh0aGlzLCBpLCBzdWJJbmRleCkpLFxuICAgICAgZXZlbnRLZXk6IGtleSxcbiAgICAgIGNsb3NlU3ViTWVudU9uTW91c2VMZWF2ZTogcHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlLFxuICAgICAgb25JdGVtSG92ZXI6IHRoaXMub25JdGVtSG92ZXIsXG4gICAgICBhY3RpdmU6ICFjaGlsZFByb3BzLmRpc2FibGVkICYmIGlzQWN0aXZlLFxuICAgICAgbXVsdGlwbGU6IHByb3BzLm11bHRpcGxlLFxuICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrLFxuICAgICAgb3BlblRyYW5zaXRpb25OYW1lOiB0aGlzLmdldE9wZW5UcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgb3BlbkFuaW1hdGlvbjogcHJvcHMub3BlbkFuaW1hdGlvbixcbiAgICAgIG9uT3BlbkNoYW5nZTogdGhpcy5vbk9wZW5DaGFuZ2UsXG4gICAgICBvbkRlc2VsZWN0OiB0aGlzLm9uRGVzZWxlY3QsXG4gICAgICBvbkRlc3Ryb3k6IHRoaXMub25EZXN0cm95LFxuICAgICAgb25TZWxlY3Q6IHRoaXMub25TZWxlY3RcbiAgICB9LCBleHRyYVByb3BzKTtcbiAgICBpZiAocHJvcHMubW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlID0gbmV3Q2hpbGRQcm9wcy5vcGVuU3ViTWVudU9uTW91c2VFbnRlciA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkLCBuZXdDaGlsZFByb3BzKTtcbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5nZXRPcGVuQ2hhbmdlc09uSXRlbUhvdmVyID0gZnVuY3Rpb24gZ2V0T3BlbkNoYW5nZXNPbkl0ZW1Ib3ZlcihlKSB7XG4gICAgdmFyIG1vZGUgPSB0aGlzLnByb3BzLm1vZGU7XG4gICAgdmFyIGtleSA9IGUua2V5LFxuICAgICAgICBob3ZlciA9IGUuaG92ZXIsXG4gICAgICAgIHRyaWdnZXIgPSBlLnRyaWdnZXI7XG5cbiAgICB2YXIgYWN0aXZlS2V5ID0gdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgaWYgKCF0cmlnZ2VyIHx8IGhvdmVyIHx8IHRoaXMucHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlIHx8ICFlLml0ZW0uaXNTdWJNZW51IHx8IG1vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlS2V5OiBob3ZlciA/IGtleSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7fVxuICAgIC8vIGtlZXAgYWN0aXZlIGZvciBzdWIgbWVudSBmb3IgY2xpY2sgYWN0aXZlXG4gICAgLy8gZW1wdHlcblxuICAgIC8vIGNsZWFyIGxhc3Qgb3BlbiBzdGF0dXNcbiAgICBpZiAoaG92ZXIgJiYgbW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIHZhciBhY3RpdmVJdGVtID0gdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYyAmJiBjLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICB9KVswXTtcbiAgICAgIGlmIChhY3RpdmVJdGVtICYmIGFjdGl2ZUl0ZW0uaXNTdWJNZW51ICYmIGFjdGl2ZUl0ZW0ucHJvcHMuZXZlbnRLZXkgIT09IGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW06IGFjdGl2ZUl0ZW0sXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICBrZXk6IGFjdGl2ZUl0ZW0ucHJvcHMuZXZlbnRLZXksXG4gICAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLmdldEZsYXRJbnN0YW5jZUFycmF5ID0gZnVuY3Rpb24gZ2V0RmxhdEluc3RhbmNlQXJyYXkoKSB7XG4gICAgdmFyIGluc3RhbmNlQXJyYXkgPSB0aGlzLmluc3RhbmNlQXJyYXk7XG4gICAgdmFyIGhhc0lubmVyQXJyYXkgPSBpbnN0YW5jZUFycmF5LnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGEpO1xuICAgIH0pO1xuICAgIGlmIChoYXNJbm5lckFycmF5KSB7XG4gICAgICBpbnN0YW5jZUFycmF5ID0gW107XG4gICAgICB0aGlzLmluc3RhbmNlQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAgIGluc3RhbmNlQXJyYXkucHVzaC5hcHBseShpbnN0YW5jZUFycmF5LCBhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnN0YW5jZUFycmF5LnB1c2goYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnN0YW5jZUFycmF5ID0gaW5zdGFuY2VBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlQXJyYXk7XG4gIH07XG5cbiAgTWVudS5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uIHN0ZXAoZGlyZWN0aW9uKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpO1xuICAgIHZhciBhY3RpdmVLZXkgPSB0aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICB2YXIgbGVuID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGlmICghbGVuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvbiA8IDApIHtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KCkucmV2ZXJzZSgpO1xuICAgIH1cbiAgICAvLyBmaW5kIGN1cnJlbnQgYWN0aXZlSW5kZXhcbiAgICB2YXIgYWN0aXZlSW5kZXggPSAtMTtcbiAgICBjaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoYywgY2kpIHtcbiAgICAgIGlmIChjICYmIGMucHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSkge1xuICAgICAgICBhY3RpdmVJbmRleCA9IGNpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMucHJvcHMuZGVmYXVsdEFjdGl2ZUZpcnN0ICYmIGFjdGl2ZUluZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGFsbERpc2FibGVkKGNoaWxkcmVuLnNsaWNlKGFjdGl2ZUluZGV4LCBsZW4gLSAxKSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gKGFjdGl2ZUluZGV4ICsgMSkgJSBsZW47XG4gICAgdmFyIGkgPSBzdGFydDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmICghY2hpbGQgfHwgY2hpbGQucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgaSA9IChpICsgMSArIGxlbikgJSBsZW47XG4gICAgICAgIC8vIGNvbXBsZXRlIGEgbG9vcFxuICAgICAgICBpZiAoaSA9PT0gc3RhcnQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbktleURvd24gPSBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGU7XG4gICAgdmFyIGhhbmRsZWQgPSB2b2lkIDA7XG4gICAgdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgaWYgKG9iaiAmJiBvYmoucHJvcHMuYWN0aXZlKSB7XG4gICAgICAgIGhhbmRsZWQgPSBvYmoub25LZXlEb3duKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdmFyIGFjdGl2ZUl0ZW0gPSBudWxsO1xuICAgIGlmIChrZXlDb2RlID09PSBfdGlucGVyQmVlQ29yZS5LZXlDb2RlLlVQIHx8IGtleUNvZGUgPT09IF90aW5wZXJCZWVDb3JlLktleUNvZGUuRE9XTikge1xuICAgICAgYWN0aXZlSXRlbSA9IHRoaXMuc3RlcChrZXlDb2RlID09PSBfdGlucGVyQmVlQ29yZS5LZXlDb2RlLlVQID8gLTEgOiAxKTtcbiAgICB9XG4gICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVLZXk6IGFjdGl2ZUl0ZW0ucHJvcHMuZXZlbnRLZXlcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXcoUmVhY3RET00uZmluZERPTU5vZGUoYWN0aXZlSXRlbSksIFJlYWN0RE9NLmZpbmRET01Ob2RlKF90aGlzMyksIHtcbiAgICAgICAgICBvbmx5U2Nyb2xsSWZOZWVkZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZlSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlS2V5OiBudWxsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5yZW5kZXJSb290ID0gZnVuY3Rpb24gcmVuZGVyUm9vdChwcm9wcykge1xuICAgIHZhciBfY2xhc3NlcztcblxuICAgIHRoaXMuaW5zdGFuY2VBcnJheSA9IFtdO1xuICAgIHZhciBjbGFzc2VzID0gKF9jbGFzc2VzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgcHJvcHMuY2xzUHJlZml4LCAxKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc2VzLCBwcm9wcy5jbHNQcmVmaXggKyAnLScgKyBwcm9wcy5tb2RlLCAxKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc2VzLCBwcm9wcy5jbGFzc05hbWUsICEhcHJvcHMuY2xhc3NOYW1lKSwgX2NsYXNzZXMpO1xuICAgIHZhciBkb21Qcm9wcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzZXMpLFxuICAgICAgcm9sZTogJ21lbnUnLFxuICAgICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6ICcnXG4gICAgfTtcbiAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgIGRvbVByb3BzLmlkID0gcHJvcHMuaWQ7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mb2N1c2FibGUpIHtcbiAgICAgIGRvbVByb3BzLnRhYkluZGV4ID0gJzAnO1xuICAgICAgZG9tUHJvcHMub25LZXlEb3duID0gdGhpcy5vbktleURvd247XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAvLyBFU0xpbnQgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQgdGhlIHR5cGUgb2YgYGNoaWxkcmVuYCB3YXMgY2hlY2tlZC5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRE9NV3JhcDJbXCJkZWZhdWx0XCJdLFxuICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgICAgICAgIHRhZzogJ3VsJyxcbiAgICAgICAgICBoaWRkZW5DbGFzc05hbWU6IHByb3BzLmNsc1ByZWZpeCArICctaGlkZGVuJyxcbiAgICAgICAgICB2aXNpYmxlOiBwcm9wcy52aXNpYmxlXG4gICAgICAgIH0sIGRvbVByb3BzKSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uQ2hpbGRyZW4ubWFwKHByb3BzLmNoaWxkcmVuLCB0aGlzLnJlbmRlck1lbnVJdGVtLmJpbmQodGhpcykpXG4gICAgICApXG4gICAgICAvKmVzbGludC1lbmFibGUgKi9cblxuICAgICk7XG4gIH07XG5cbiAgTWVudS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCB0aGlzLnByb3BzKTtcbiAgICBwcm9wcy5jbGFzc05hbWUgKz0gJyAnICsgcHJvcHMuY2xzUHJlZml4ICsgJy1yb290JztcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJSb290KHByb3BzKTtcbiAgfTtcblxuICByZXR1cm4gTWVudTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuTWVudS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5NZW51LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBNZW51O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZW51L2J1aWxkL01lbnUuanNcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG5leHBvcnRzLmdldEtleUZyb21DaGlsZHJlbkluZGV4ID0gZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXg7XG5leHBvcnRzLmxvb3BNZW51SXRlbSA9IGxvb3BNZW51SXRlbTtcbmV4cG9ydHMubG9vcE1lbnVJdGVtUmVjdXNpdmVseSA9IGxvb3BNZW51SXRlbVJlY3VzaXZlbHk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiBnZXRLZXlGcm9tQ2hpbGRyZW5JbmRleChjaGlsZCwgbWVudUV2ZW50S2V5LCBpbmRleCkge1xuICB2YXIgcHJlZml4ID0gbWVudUV2ZW50S2V5IHx8ICcnO1xuICByZXR1cm4gY2hpbGQua2V5IHx8IHByZWZpeCArICdpdGVtXycgKyBpbmRleDtcbn1cblxuZnVuY3Rpb24gbG9vcE1lbnVJdGVtKGNoaWxkcmVuLCBjYikge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgX3JlYWN0MltcImRlZmF1bHRcIl0uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGMpIHtcbiAgICBpbmRleCsrO1xuICAgIGlmIChjICYmIGMudHlwZSAmJiBjLnR5cGUuaXNNZW51SXRlbUdyb3VwKSB7XG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5mb3JFYWNoKGMucHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjMikge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjYihjMiwgaW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKGMsIGluZGV4KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsb29wTWVudUl0ZW1SZWN1c2l2ZWx5KGNoaWxkcmVuLCBrZXlzLCByZXQpIHtcbiAgaWYgKCFjaGlsZHJlbiB8fCByZXQuZmluZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoYykge1xuICAgIGlmIChyZXQuZmluZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYykge1xuICAgICAgdmFyIGNvbnN0cnV0ID0gYy50eXBlO1xuICAgICAgaWYgKCFjb25zdHJ1dCB8fCAhKGNvbnN0cnV0LmlzU3ViTWVudSB8fCBjb25zdHJ1dC5pc01lbnVJdGVtIHx8IGNvbnN0cnV0LmlzTWVudUl0ZW1Hcm91cCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleXMuaW5kZXhPZihjLmtleSkgIT09IC0xKSB7XG4gICAgICAgIHJldC5maW5kID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYy5wcm9wcy5jaGlsZHJlbikge1xuICAgICAgICBsb29wTWVudUl0ZW1SZWN1c2l2ZWx5KGMucHJvcHMuY2hpbGRyZW4sIGtleXMsIHJldCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW1lbnUvYnVpbGQvdXRpbC5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgdGFnOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaGlkZGVuQ2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgdmlzaWJsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sXG59O1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgdGFnOiAnZGl2J1xufTtcblxudmFyIERPTVdyYXAgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRE9NV3JhcCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRE9NV3JhcCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE9NV3JhcCk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIERPTVdyYXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcyk7XG4gICAgaWYgKCFwcm9wcy52aXNpYmxlKSB7XG4gICAgICBwcm9wcy5jbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUgfHwgJyc7XG4gICAgICBwcm9wcy5jbGFzc05hbWUgKz0gJyAnICsgcHJvcHMuaGlkZGVuQ2xhc3NOYW1lO1xuICAgIH1cbiAgICB2YXIgVGFnID0gcHJvcHMudGFnO1xuICAgIGRlbGV0ZSBwcm9wcy50YWc7XG4gICAgZGVsZXRlIHByb3BzLmhpZGRlbkNsYXNzTmFtZTtcbiAgICBkZWxldGUgcHJvcHMudmlzaWJsZTtcbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChUYWcsIHByb3BzKTtcbiAgfTtcblxuICByZXR1cm4gRE9NV3JhcDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbjtcblxuRE9NV3JhcC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5ET01XcmFwLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBET01XcmFwO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZW51L2J1aWxkL0RPTVdyYXAuanNcbi8vIG1vZHVsZSBpZCA9IDkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9TdWJQb3B1cE1lbnUgPSByZXF1aXJlKCcuL1N1YlBvcHVwTWVudScpO1xuXG52YXIgX1N1YlBvcHVwTWVudTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TdWJQb3B1cE1lbnUpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfdGlucGVyQmVlQ29yZSA9IHJlcXVpcmUoJ3RpbnBlci1iZWUtY29yZScpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF91dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIGd1aWQgPSAwO1xuXG52YXIgcHJvcFR5cGVzID0ge1xuICBwYXJlbnRNZW51OiBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdCxcbiAgdGl0bGU6IF9yZWFjdC5Qcm9wVHlwZXMubm9kZSxcbiAgY2hpbGRyZW46IF9yZWFjdC5Qcm9wVHlwZXMuYW55LFxuICBzZWxlY3RlZEtleXM6IF9yZWFjdC5Qcm9wVHlwZXMuYXJyYXksXG4gIG9wZW5LZXlzOiBfcmVhY3QuUHJvcFR5cGVzLmFycmF5LFxuICBvbkNsaWNrOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uT3BlbkNoYW5nZTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICByb290UHJlZml4Q2xzOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgZXZlbnRLZXk6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBtdWx0aXBsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBhY3RpdmU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgb25TZWxlY3Q6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9wZW5TdWJNZW51T25Nb3VzZUVudGVyOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9uRGVzZWxlY3Q6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25EZXN0cm95OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uSXRlbUhvdmVyOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25UaXRsZU1vdXNlRW50ZXI6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25UaXRsZU1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25UaXRsZUNsaWNrOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmNcbn07XG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBvbk1vdXNlRW50ZXI6IF91dGlsLm5vb3AsXG4gIG9uTW91c2VMZWF2ZTogX3V0aWwubm9vcCxcbiAgb25UaXRsZU1vdXNlRW50ZXI6IF91dGlsLm5vb3AsXG4gIG9uVGl0bGVNb3VzZUxlYXZlOiBfdXRpbC5ub29wLFxuICBvblRpdGxlQ2xpY2s6IF91dGlsLm5vb3AsXG4gIHRpdGxlOiAnJ1xufTtcblxudmFyIFN1Yk1lbnUgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoU3ViTWVudSwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3ViTWVudShwcm9wcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJNZW51KTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuaXNTdWJNZW51ID0gMTtcbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdDogZmFsc2VcbiAgICB9O1xuXG4gICAgX3RoaXMub25EZXN0cm95ID0gX3RoaXMub25EZXN0cm95LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uS2V5RG93biA9IF90aGlzLm9uS2V5RG93bi5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbk9wZW5DaGFuZ2UgPSBfdGhpcy5vbk9wZW5DaGFuZ2UuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25Nb3VzZUVudGVyID0gX3RoaXMub25Nb3VzZUVudGVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uVGl0bGVNb3VzZUVudGVyID0gX3RoaXMub25UaXRsZU1vdXNlRW50ZXIuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5vblRpdGxlTW91c2VMZWF2ZSA9IF90aGlzLm9uVGl0bGVNb3VzZUxlYXZlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uTW91c2VMZWF2ZSA9IF90aGlzLm9uTW91c2VMZWF2ZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vblRpdGxlQ2xpY2sgPSBfdGhpcy5vblRpdGxlQ2xpY2suYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25TdWJNZW51Q2xpY2sgPSBfdGhpcy5vblN1Yk1lbnVDbGljay5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vblNlbGVjdCA9IF90aGlzLm9uU2VsZWN0LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRGVzZWxlY3QgPSBfdGhpcy5vbkRlc2VsZWN0LmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuZ2V0UHJlZml4Q2xzID0gX3RoaXMuZ2V0UHJlZml4Q2xzLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldEFjdGl2ZUNsYXNzTmFtZSA9IF90aGlzLmdldEFjdGl2ZUNsYXNzTmFtZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRTZWxlY3RlZENsYXNzTmFtZSA9IF90aGlzLmdldFNlbGVjdGVkQ2xhc3NOYW1lLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuZ2V0RGlzYWJsZWRDbGFzc05hbWUgPSBfdGhpcy5nZXREaXNhYmxlZENsYXNzTmFtZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRPcGVuQ2xhc3NOYW1lID0gX3RoaXMuZ2V0T3BlbkNsYXNzTmFtZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5zYXZlTWVudUluc3RhbmNlID0gX3RoaXMuc2F2ZU1lbnVJbnN0YW5jZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5hZGRLZXlQYXRoID0gX3RoaXMuYWRkS2V5UGF0aC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy50cmlnZ2VyT3BlbkNoYW5nZSA9IF90aGlzLnRyaWdnZXJPcGVuQ2hhbmdlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmNsZWFyU3ViTWVudVRpbWVycyA9IF90aGlzLmNsZWFyU3ViTWVudVRpbWVycy5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLmNsZWFyU3ViTWVudUxlYXZlVGltZXIgPSBfdGhpcy5jbGVhclN1Yk1lbnVMZWF2ZVRpbWVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmNsZWFyU3ViTWVudVRpdGxlTGVhdmVUaW1lciA9IF90aGlzLmNsZWFyU3ViTWVudVRpdGxlTGVhdmVUaW1lci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5pc0NoaWxkcmVuU2VsZWN0ZWQgPSBfdGhpcy5pc0NoaWxkcmVuU2VsZWN0ZWQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaXNPcGVuID0gX3RoaXMuaXNPcGVuLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLnJlbmRlckNoaWxkcmVuID0gX3RoaXMucmVuZGVyQ2hpbGRyZW4uYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU3ViTWVudS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25EZXN0cm95ID0gX3Byb3BzLm9uRGVzdHJveSxcbiAgICAgICAgZXZlbnRLZXkgPSBfcHJvcHMuZXZlbnRLZXksXG4gICAgICAgIHBhcmVudE1lbnUgPSBfcHJvcHMucGFyZW50TWVudTtcblxuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgaWYgKG9uRGVzdHJveSkge1xuICAgICAgb25EZXN0cm95KGV2ZW50S2V5KTtcbiAgICB9XG4gICAgaWYgKHBhcmVudE1lbnUuc3ViTWVudUluc3RhbmNlID09PSB0aGlzKSB7XG4gICAgICB0aGlzLmNsZWFyU3ViTWVudVRpbWVycygpO1xuICAgIH1cbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gb25EZXN0cm95KGtleSkge1xuICAgIHRoaXMucHJvcHMub25EZXN0cm95KGtleSk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgICB2YXIgbWVudSA9IHRoaXMubWVudUluc3RhbmNlO1xuICAgIHZhciBpc09wZW4gPSB0aGlzLmlzT3BlbigpO1xuXG4gICAgaWYgKGtleUNvZGUgPT09IF90aW5wZXJCZWVDb3JlLktleUNvZGUuRU5URVIpIHtcbiAgICAgIHRoaXMub25UaXRsZUNsaWNrKGUpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gX3RpbnBlckJlZUNvcmUuS2V5Q29kZS5SSUdIVCkge1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICBtZW51Lm9uS2V5RG93bihlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJpZ2dlck9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRlZmF1bHRBY3RpdmVGaXJzdDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5Q29kZSA9PT0gX3RpbnBlckJlZUNvcmUuS2V5Q29kZS5MRUZUKSB7XG4gICAgICB2YXIgaGFuZGxlZCA9IHZvaWQgMDtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgaGFuZGxlZCA9IG1lbnUub25LZXlEb3duKGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJPcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICB9XG5cbiAgICBpZiAoaXNPcGVuICYmIChrZXlDb2RlID09PSBfdGlucGVyQmVlQ29yZS5LZXlDb2RlLlVQIHx8IGtleUNvZGUgPT09IF90aW5wZXJCZWVDb3JlLktleUNvZGUuRE9XTikpIHtcbiAgICAgIHJldHVybiBtZW51Lm9uS2V5RG93bihlKTtcbiAgICB9XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25PcGVuQ2hhbmdlID0gZnVuY3Rpb24gb25PcGVuQ2hhbmdlKGUpIHtcbiAgICB0aGlzLnByb3BzLm9uT3BlbkNoYW5nZShlKTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5vbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5jbGVhclN1Yk1lbnVMZWF2ZVRpbWVyKHByb3BzLnBhcmVudE1lbnUuc3ViTWVudUluc3RhbmNlICE9PSB0aGlzKTtcbiAgICBwcm9wcy5vbk1vdXNlRW50ZXIoe1xuICAgICAga2V5OiBwcm9wcy5ldmVudEtleSxcbiAgICAgIGRvbUV2ZW50OiBlXG4gICAgfSk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25UaXRsZU1vdXNlRW50ZXIgPSBmdW5jdGlvbiBvblRpdGxlTW91c2VFbnRlcihkb21FdmVudCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHBhcmVudE1lbnUgPSBwcm9wcy5wYXJlbnRNZW51LFxuICAgICAgICBrZXkgPSBwcm9wcy5ldmVudEtleTtcblxuICAgIHZhciBpdGVtID0gdGhpcztcbiAgICB0aGlzLmNsZWFyU3ViTWVudVRpdGxlTGVhdmVUaW1lcihwYXJlbnRNZW51LnN1Yk1lbnVJbnN0YW5jZSAhPT0gaXRlbSk7XG4gICAgaWYgKHBhcmVudE1lbnUubWVudUl0ZW1JbnN0YW5jZSkge1xuICAgICAgcGFyZW50TWVudS5tZW51SXRlbUluc3RhbmNlLmNsZWFyTWVudUl0ZW1Nb3VzZUxlYXZlVGltZXIodHJ1ZSk7XG4gICAgfVxuICAgIHZhciBvcGVuQ2hhbmdlcyA9IFtdO1xuICAgIGlmIChwcm9wcy5vcGVuU3ViTWVudU9uTW91c2VFbnRlcikge1xuICAgICAgb3BlbkNoYW5nZXMucHVzaCh7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICB0cmlnZ2VyOiAnbW91c2VlbnRlcicsXG4gICAgICAgIG9wZW46IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBwcm9wcy5vbkl0ZW1Ib3Zlcih7XG4gICAgICBrZXk6IGtleSxcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBob3ZlcjogdHJ1ZSxcbiAgICAgIHRyaWdnZXI6ICdtb3VzZWVudGVyJyxcbiAgICAgIG9wZW5DaGFuZ2VzOiBvcGVuQ2hhbmdlc1xuICAgIH0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGVmYXVsdEFjdGl2ZUZpcnN0OiBmYWxzZVxuICAgIH0pO1xuICAgIHByb3BzLm9uVGl0bGVNb3VzZUVudGVyKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgZG9tRXZlbnQ6IGRvbUV2ZW50XG4gICAgfSk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25UaXRsZU1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvblRpdGxlTW91c2VMZWF2ZShlKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBwYXJlbnRNZW51ID0gcHJvcHMucGFyZW50TWVudSxcbiAgICAgICAgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleTtcblxuICAgIHBhcmVudE1lbnUuc3ViTWVudUluc3RhbmNlID0gdGhpcztcbiAgICBwYXJlbnRNZW51LnN1Yk1lbnVUaXRsZUxlYXZlRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLm1vdW50ZWQpIHtcbiAgICAgICAgLy8gbGVhdmUgd2hvbGUgc3ViIHRyZWVcbiAgICAgICAgLy8gc3RpbGwgYWN0aXZlXG4gICAgICAgIGlmIChwcm9wcy5tb2RlID09PSAnaW5saW5lJyAmJiBwcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgICBwcm9wcy5vbkl0ZW1Ib3Zlcih7XG4gICAgICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICAgICAgaXRlbTogX3RoaXMyLFxuICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ21vdXNlbGVhdmUnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcHMub25UaXRsZU1vdXNlTGVhdmUoe1xuICAgICAgICAgIGtleTogcHJvcHMuZXZlbnRLZXksXG4gICAgICAgICAgZG9tRXZlbnQ6IGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBwYXJlbnRNZW51LnN1Yk1lbnVUaXRsZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KHBhcmVudE1lbnUuc3ViTWVudVRpdGxlTGVhdmVGbiwgMTAwKTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5vbk1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgcGFyZW50TWVudSA9IHByb3BzLnBhcmVudE1lbnUsXG4gICAgICAgIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXk7XG5cbiAgICBwYXJlbnRNZW51LnN1Yk1lbnVJbnN0YW5jZSA9IHRoaXM7XG4gICAgcGFyZW50TWVudS5zdWJNZW51TGVhdmVGbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpczMubW91bnRlZCkge1xuICAgICAgICAvLyBsZWF2ZSB3aG9sZSBzdWIgdHJlZVxuICAgICAgICAvLyBzdGlsbCBhY3RpdmVcbiAgICAgICAgaWYgKHByb3BzLm1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgdmFyIGlzT3BlbiA9IF90aGlzMy5pc09wZW4oKTtcbiAgICAgICAgICBpZiAoaXNPcGVuICYmIHByb3BzLmNsb3NlU3ViTWVudU9uTW91c2VMZWF2ZSAmJiBwcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIHByb3BzLm9uSXRlbUhvdmVyKHtcbiAgICAgICAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgICAgICAgaXRlbTogX3RoaXMzLFxuICAgICAgICAgICAgICBob3ZlcjogZmFsc2UsXG4gICAgICAgICAgICAgIHRyaWdnZXI6ICdtb3VzZWxlYXZlJyxcbiAgICAgICAgICAgICAgb3BlbkNoYW5nZXM6IFt7XG4gICAgICAgICAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgICAgICAgICBpdGVtOiBfdGhpczMsXG4gICAgICAgICAgICAgICAgdHJpZ2dlcjogJ21vdXNlbGVhdmUnLFxuICAgICAgICAgICAgICAgIG9wZW46IGZhbHNlXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHByb3BzLmFjdGl2ZSkge1xuICAgICAgICAgICAgICBwcm9wcy5vbkl0ZW1Ib3Zlcih7XG4gICAgICAgICAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgICAgICAgICBpdGVtOiBfdGhpczMsXG4gICAgICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRyaWdnZXI6ICdtb3VzZWxlYXZlJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc09wZW4gJiYgcHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlKSB7XG4gICAgICAgICAgICAgIF90aGlzMy50cmlnZ2VyT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRyaWdnZXIgbW91c2VsZWF2ZVxuICAgICAgICBwcm9wcy5vbk1vdXNlTGVhdmUoe1xuICAgICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgICAgZG9tRXZlbnQ6IGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBwcmV2ZW50IHBvcHVwIG1lbnUgYW5kIHN1Ym1lbnUgZ2FwXG4gICAgcGFyZW50TWVudS5zdWJNZW51TGVhdmVUaW1lciA9IHNldFRpbWVvdXQocGFyZW50TWVudS5zdWJNZW51TGVhdmVGbiwgMTAwKTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5vblRpdGxlQ2xpY2sgPSBmdW5jdGlvbiBvblRpdGxlQ2xpY2soZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBwcm9wcy5vblRpdGxlQ2xpY2soe1xuICAgICAga2V5OiBwcm9wcy5ldmVudEtleSxcbiAgICAgIGRvbUV2ZW50OiBlXG4gICAgfSk7XG4gICAgaWYgKHByb3BzLm9wZW5TdWJNZW51T25Nb3VzZUVudGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlck9wZW5DaGFuZ2UoIXRoaXMuaXNPcGVuKCksICdjbGljaycpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGVmYXVsdEFjdGl2ZUZpcnN0OiBmYWxzZVxuICAgIH0pO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLm9uU3ViTWVudUNsaWNrID0gZnVuY3Rpb24gb25TdWJNZW51Q2xpY2soaW5mbykge1xuICAgIHRoaXMucHJvcHMub25DbGljayh0aGlzLmFkZEtleVBhdGgoaW5mbykpO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLm9uU2VsZWN0ID0gZnVuY3Rpb24gb25TZWxlY3QoaW5mbykge1xuICAgIHRoaXMucHJvcHMub25TZWxlY3QoaW5mbyk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUub25EZXNlbGVjdCA9IGZ1bmN0aW9uIG9uRGVzZWxlY3QoaW5mbykge1xuICAgIHRoaXMucHJvcHMub25EZXNlbGVjdChpbmZvKTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5nZXRQcmVmaXhDbHMgPSBmdW5jdGlvbiBnZXRQcmVmaXhDbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucm9vdFByZWZpeENscyArICctc3VibWVudSc7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUuZ2V0QWN0aXZlQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0QWN0aXZlQ2xhc3NOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByZWZpeENscygpICsgJy1hY3RpdmUnO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLmdldERpc2FibGVkQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0RGlzYWJsZWRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJlZml4Q2xzKCkgKyAnLWRpc2FibGVkJztcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5nZXRTZWxlY3RlZENsYXNzTmFtZSA9IGZ1bmN0aW9uIGdldFNlbGVjdGVkQ2xhc3NOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByZWZpeENscygpICsgJy1zZWxlY3RlZCc7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUuZ2V0T3BlbkNsYXNzTmFtZSA9IGZ1bmN0aW9uIGdldE9wZW5DbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucm9vdFByZWZpeENscyArICctc3VibWVudS1vcGVuJztcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5zYXZlTWVudUluc3RhbmNlID0gZnVuY3Rpb24gc2F2ZU1lbnVJbnN0YW5jZShjKSB7XG4gICAgdGhpcy5tZW51SW5zdGFuY2UgPSBjO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLmFkZEtleVBhdGggPSBmdW5jdGlvbiBhZGRLZXlQYXRoKGluZm8pIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIGluZm8sIHtcbiAgICAgIGtleVBhdGg6IChpbmZvLmtleVBhdGggfHwgW10pLmNvbmNhdCh0aGlzLnByb3BzLmV2ZW50S2V5KVxuICAgIH0pO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLnRyaWdnZXJPcGVuQ2hhbmdlID0gZnVuY3Rpb24gdHJpZ2dlck9wZW5DaGFuZ2Uob3BlbiwgdHlwZSkge1xuICAgIHZhciBrZXkgPSB0aGlzLnByb3BzLmV2ZW50S2V5O1xuICAgIHRoaXMub25PcGVuQ2hhbmdlKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgaXRlbTogdGhpcyxcbiAgICAgIHRyaWdnZXI6IHR5cGUsXG4gICAgICBvcGVuOiBvcGVuXG4gICAgfSk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUuY2xlYXJTdWJNZW51VGltZXJzID0gZnVuY3Rpb24gY2xlYXJTdWJNZW51VGltZXJzKCkge1xuICAgIHZhciBjYWxsRm4gPSB2b2lkIDA7XG4gICAgdGhpcy5jbGVhclN1Yk1lbnVMZWF2ZVRpbWVyKGNhbGxGbik7XG4gICAgdGhpcy5jbGVhclN1Yk1lbnVUaXRsZUxlYXZlVGltZXIoY2FsbEZuKTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5jbGVhclN1Yk1lbnVUaXRsZUxlYXZlVGltZXIgPSBmdW5jdGlvbiBjbGVhclN1Yk1lbnVUaXRsZUxlYXZlVGltZXIoKSB7XG4gICAgdmFyIGNhbGxGbiA9IHZvaWQgMDtcbiAgICB2YXIgcGFyZW50TWVudSA9IHRoaXMucHJvcHMucGFyZW50TWVudTtcbiAgICBpZiAocGFyZW50TWVudS5zdWJNZW51VGl0bGVMZWF2ZVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQocGFyZW50TWVudS5zdWJNZW51VGl0bGVMZWF2ZVRpbWVyKTtcbiAgICAgIHBhcmVudE1lbnUuc3ViTWVudVRpdGxlTGVhdmVUaW1lciA9IG51bGw7XG4gICAgICBpZiAoY2FsbEZuICYmIHBhcmVudE1lbnUuc3ViTWVudVRpdGxlTGVhdmVGbikge1xuICAgICAgICBwYXJlbnRNZW51LnN1Yk1lbnVUaXRsZUxlYXZlRm4oKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudE1lbnUuc3ViTWVudVRpdGxlTGVhdmVGbiA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLmNsZWFyU3ViTWVudUxlYXZlVGltZXIgPSBmdW5jdGlvbiBjbGVhclN1Yk1lbnVMZWF2ZVRpbWVyKCkge1xuICAgIHZhciBjYWxsRm4gPSB2b2lkIDA7XG4gICAgdmFyIHBhcmVudE1lbnUgPSB0aGlzLnByb3BzLnBhcmVudE1lbnU7XG4gICAgaWYgKHBhcmVudE1lbnUuc3ViTWVudUxlYXZlVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChwYXJlbnRNZW51LnN1Yk1lbnVMZWF2ZVRpbWVyKTtcbiAgICAgIHBhcmVudE1lbnUuc3ViTWVudUxlYXZlVGltZXIgPSBudWxsO1xuICAgICAgaWYgKGNhbGxGbiAmJiBwYXJlbnRNZW51LnN1Yk1lbnVMZWF2ZUZuKSB7XG4gICAgICAgIHBhcmVudE1lbnUuc3ViTWVudUxlYXZlRm4oKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudE1lbnUuc3ViTWVudUxlYXZlRm4gPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5pc0NoaWxkcmVuU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc0NoaWxkcmVuU2VsZWN0ZWQoKSB7XG4gICAgdmFyIHJldCA9IHsgZmluZDogZmFsc2UgfTtcbiAgICAoMCwgX3V0aWwubG9vcE1lbnVJdGVtUmVjdXNpdmVseSkodGhpcy5wcm9wcy5jaGlsZHJlbiwgdGhpcy5wcm9wcy5zZWxlY3RlZEtleXMsIHJldCk7XG4gICAgcmV0dXJuIHJldC5maW5kO1xuICB9O1xuXG4gIFN1Yk1lbnUucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uIGlzT3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vcGVuS2V5cy5pbmRleE9mKHRoaXMucHJvcHMuZXZlbnRLZXkpICE9PSAtMTtcbiAgfTtcblxuICBTdWJNZW51LnByb3RvdHlwZS5yZW5kZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgYmFzZVByb3BzID0ge1xuICAgICAgbW9kZTogcHJvcHMubW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ3ZlcnRpY2FsJyA6IHByb3BzLm1vZGUsXG4gICAgICB2aXNpYmxlOiB0aGlzLmlzT3BlbigpLFxuICAgICAgbGV2ZWw6IHByb3BzLmxldmVsICsgMSxcbiAgICAgIGlubGluZUluZGVudDogcHJvcHMuaW5saW5lSW5kZW50LFxuICAgICAgZm9jdXNhYmxlOiBmYWxzZSxcbiAgICAgIG9uQ2xpY2s6IHRoaXMub25TdWJNZW51Q2xpY2ssXG4gICAgICBvblNlbGVjdDogdGhpcy5vblNlbGVjdCxcbiAgICAgIG9uRGVzZWxlY3Q6IHRoaXMub25EZXNlbGVjdCxcbiAgICAgIG9uRGVzdHJveTogdGhpcy5vbkRlc3Ryb3ksXG4gICAgICBzZWxlY3RlZEtleXM6IHByb3BzLnNlbGVjdGVkS2V5cyxcbiAgICAgIGV2ZW50S2V5OiBwcm9wcy5ldmVudEtleSArICctbWVudS0nLFxuICAgICAgb3BlbktleXM6IHByb3BzLm9wZW5LZXlzLFxuICAgICAgb3BlblRyYW5zaXRpb25OYW1lOiBwcm9wcy5vcGVuVHJhbnNpdGlvbk5hbWUsXG4gICAgICBvcGVuQW5pbWF0aW9uOiBwcm9wcy5vcGVuQW5pbWF0aW9uLFxuICAgICAgb25PcGVuQ2hhbmdlOiB0aGlzLm9uT3BlbkNoYW5nZSxcbiAgICAgIGNsb3NlU3ViTWVudU9uTW91c2VMZWF2ZTogcHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlLFxuICAgICAgZGVmYXVsdEFjdGl2ZUZpcnN0OiB0aGlzLnN0YXRlLmRlZmF1bHRBY3RpdmVGaXJzdCxcbiAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICAgIHByZWZpeENsczogcHJvcHMucm9vdFByZWZpeENscyxcbiAgICAgIGlkOiB0aGlzLl9tZW51SWQsXG4gICAgICByZWY6IHRoaXMuc2F2ZU1lbnVJbnN0YW5jZVxuICAgIH07XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfU3ViUG9wdXBNZW51MltcImRlZmF1bHRcIl0sXG4gICAgICBiYXNlUHJvcHMsXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgU3ViTWVudS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfY2xhc3NlcztcblxuICAgIHZhciBpc09wZW4gPSB0aGlzLmlzT3BlbigpO1xuICAgIHRoaXMuaGF2ZU9wZW4gPSB0aGlzLmhhdmVPcGVuIHx8IGlzT3BlbjtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBwcmVmaXhDbHMgPSB0aGlzLmdldFByZWZpeENscygpO1xuICAgIHZhciBjbGFzc2VzID0gKF9jbGFzc2VzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgcHJvcHMuY2xhc3NOYW1lLCAhIXByb3BzLmNsYXNzTmFtZSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgcHJlZml4Q2xzICsgJy0nICsgcHJvcHMubW9kZSwgMSksIF9jbGFzc2VzKTtcblxuICAgIGNsYXNzZXNbdGhpcy5nZXRPcGVuQ2xhc3NOYW1lKCldID0gaXNPcGVuO1xuICAgIGNsYXNzZXNbdGhpcy5nZXRBY3RpdmVDbGFzc05hbWUoKV0gPSBwcm9wcy5hY3RpdmU7XG4gICAgY2xhc3Nlc1t0aGlzLmdldERpc2FibGVkQ2xhc3NOYW1lKCldID0gcHJvcHMuZGlzYWJsZWQ7XG4gICAgY2xhc3Nlc1t0aGlzLmdldFNlbGVjdGVkQ2xhc3NOYW1lKCldID0gdGhpcy5pc0NoaWxkcmVuU2VsZWN0ZWQoKTtcblxuICAgIGlmICghdGhpcy5fbWVudUlkKSB7XG4gICAgICBpZiAocHJvcHMuZXZlbnRLZXkpIHtcbiAgICAgICAgdGhpcy5fbWVudUlkID0gcHJvcHMuZXZlbnRLZXkgKyAnJE1lbnUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbWVudUlkID0gJyRfXyQnICsgKytndWlkICsgJyRNZW51JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzc2VzW3ByZWZpeENsc10gPSB0cnVlO1xuICAgIGNsYXNzZXNbcHJlZml4Q2xzICsgJy0nICsgcHJvcHMubW9kZV0gPSAxO1xuICAgIHZhciB0aXRsZUNsaWNrRXZlbnRzID0ge307XG4gICAgdmFyIG1vdXNlRXZlbnRzID0ge307XG4gICAgdmFyIHRpdGxlTW91c2VFdmVudHMgPSB7fTtcbiAgICBpZiAoIXByb3BzLmRpc2FibGVkKSB7XG4gICAgICB0aXRsZUNsaWNrRXZlbnRzID0ge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLm9uVGl0bGVDbGlja1xuICAgICAgfTtcbiAgICAgIG1vdXNlRXZlbnRzID0ge1xuICAgICAgICBvbk1vdXNlTGVhdmU6IHRoaXMub25Nb3VzZUxlYXZlLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IHRoaXMub25Nb3VzZUVudGVyXG4gICAgICB9O1xuICAgICAgLy8gb25seSB3b3JrcyBpbiB0aXRsZSwgbm90IG91dGVyIGxpXG4gICAgICB0aXRsZU1vdXNlRXZlbnRzID0ge1xuICAgICAgICBvbk1vdXNlRW50ZXI6IHRoaXMub25UaXRsZU1vdXNlRW50ZXIsXG4gICAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5vblRpdGxlTW91c2VMZWF2ZVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHN0eWxlID0ge307XG4gICAgaWYgKHByb3BzLm1vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IHByb3BzLmlubGluZUluZGVudCAqIHByb3BzLmxldmVsO1xuICAgIH1cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICBfZXh0ZW5kcyh7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzZXMpIH0sIG1vdXNlRXZlbnRzKSxcbiAgICAgIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgIGNsYXNzTmFtZTogcHJlZml4Q2xzICsgJy10aXRsZSdcbiAgICAgICAgfSwgdGl0bGVNb3VzZUV2ZW50cywgdGl0bGVDbGlja0V2ZW50cywge1xuICAgICAgICAgICdhcmlhLWV4cGFuZGVkJzogaXNPcGVuLFxuICAgICAgICAgICdhcmlhLW93bnMnOiB0aGlzLl9tZW51SWQsXG4gICAgICAgICAgJ2FyaWEtaGFzcG9wdXAnOiAndHJ1ZSdcbiAgICAgICAgfSksXG4gICAgICAgIHByb3BzLnRpdGxlXG4gICAgICApLFxuICAgICAgdGhpcy5yZW5kZXJDaGlsZHJlbihwcm9wcy5jaGlsZHJlbilcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBTdWJNZW51O1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuXG5TdWJNZW51LnByb3BUeXBlcyA9IHByb3BUeXBlcztcblN1Yk1lbnUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuU3ViTWVudS5pc1N1Yk1lbnUgPSAxO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFN1Yk1lbnU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW1lbnUvYnVpbGQvU3ViTWVudS5qc1xuLy8gbW9kdWxlIGlkID0gOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9iZWVBbmltYXRlID0gcmVxdWlyZSgnYmVlLWFuaW1hdGUnKTtcblxudmFyIF9iZWVBbmltYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JlZUFuaW1hdGUpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF90aW5wZXJCZWVDb3JlID0gcmVxdWlyZSgndGlucGVyLWJlZS1jb3JlJyk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgX0RPTVdyYXAgPSByZXF1aXJlKCcuL0RPTVdyYXAnKTtcblxudmFyIF9ET01XcmFwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RPTVdyYXApO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIGFsbERpc2FibGVkKGFycikge1xuICBpZiAoIWFyci5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gYXJyLmV2ZXJ5KGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICEhYy5wcm9wcy5kaXNhYmxlZDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUtleShwcm9wcywgb3JpZ2luYWxBY3RpdmVLZXkpIHtcbiAgdmFyIGFjdGl2ZUtleSA9IG9yaWdpbmFsQWN0aXZlS2V5O1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXk7XG5cbiAgaWYgKGFjdGl2ZUtleSkge1xuICAgIHZhciBmb3VuZCA9IHZvaWQgMDtcbiAgICAoMCwgX3V0aWwubG9vcE1lbnVJdGVtKShjaGlsZHJlbiwgZnVuY3Rpb24gKGMsIGkpIHtcbiAgICAgIGlmIChjICYmICFjLnByb3BzLmRpc2FibGVkICYmIGFjdGl2ZUtleSA9PT0gKDAsIF91dGlsLmdldEtleUZyb21DaGlsZHJlbkluZGV4KShjLCBldmVudEtleSwgaSkpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgcmV0dXJuIGFjdGl2ZUtleTtcbiAgICB9XG4gIH1cbiAgYWN0aXZlS2V5ID0gbnVsbDtcbiAgaWYgKHByb3BzLmRlZmF1bHRBY3RpdmVGaXJzdCkge1xuICAgICgwLCBfdXRpbC5sb29wTWVudUl0ZW0pKGNoaWxkcmVuLCBmdW5jdGlvbiAoYywgaSkge1xuICAgICAgaWYgKCFhY3RpdmVLZXkgJiYgYyAmJiAhYy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICBhY3RpdmVLZXkgPSAoMCwgX3V0aWwuZ2V0S2V5RnJvbUNoaWxkcmVuSW5kZXgpKGMsIGV2ZW50S2V5LCBpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aXZlS2V5O1xuICB9XG4gIHJldHVybiBhY3RpdmVLZXk7XG59XG5cbmZ1bmN0aW9uIHNhdmVSZWYoaW5kZXgsIHN1YkluZGV4LCBjKSB7XG4gIGlmIChjKSB7XG4gICAgaWYgKHN1YkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VBcnJheVtpbmRleF0gPSB0aGlzLmluc3RhbmNlQXJyYXlbaW5kZXhdIHx8IFtdO1xuICAgICAgdGhpcy5pbnN0YW5jZUFycmF5W2luZGV4XVtzdWJJbmRleF0gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc3RhbmNlQXJyYXlbaW5kZXhdID0gYztcbiAgICB9XG4gIH1cbn1cblxuLy9pbXBvcnQgQW5pbWF0ZSBmcm9tICdiZWUtdHJhbnNpdGlvbic7XG52YXIgcHJvcFR5cGVzID0ge1xuICBvblNlbGVjdDogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkNsaWNrOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRGVzZWxlY3Q6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25PcGVuQ2hhbmdlOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRGVzdHJveTogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvcGVuVHJhbnNpdGlvbk5hbWU6IF9yZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBvcGVuQW5pbWF0aW9uOiBfcmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsIF9yZWFjdC5Qcm9wVHlwZXMub2JqZWN0XSksXG4gIG9wZW5LZXlzOiBfcmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcpLFxuICBjbG9zZVN1Yk1lbnVPbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgdmlzaWJsZTogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjaGlsZHJlbjogX3JlYWN0LlByb3BUeXBlcy5hbnlcbn07XG5cbnZhciBTdWJQb3B1cE1lbnUgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoU3ViUG9wdXBNZW51LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTdWJQb3B1cE1lbnUocHJvcHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3ViUG9wdXBNZW51KTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmVLZXk6IGdldEFjdGl2ZUtleShfdGhpcy5wcm9wcywgX3RoaXMucHJvcHMuYWN0aXZlS2V5KVxuICAgIH07XG4gICAgX3RoaXMuZ2V0T3BlbkNoYW5nZXNPbkl0ZW1Ib3ZlciA9IF90aGlzLmdldE9wZW5DaGFuZ2VzT25JdGVtSG92ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25EZXNlbGVjdCA9IF90aGlzLm9uRGVzZWxlY3QuYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DbGljayA9IF90aGlzLm9uQ2xpY2suYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25PcGVuQ2hhbmdlID0gX3RoaXMub25PcGVuQ2hhbmdlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uRGVzdHJveSA9IF90aGlzLm9uRGVzdHJveS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vblNlbGVjdCA9IF90aGlzLm9uU2VsZWN0LmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMub25JdGVtSG92ZXIgPSBfdGhpcy5vbkl0ZW1Ib3Zlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXRPcGVuVHJhbnNpdGlvbk5hbWUgPSBfdGhpcy5nZXRPcGVuVHJhbnNpdGlvbk5hbWUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVuZGVyTWVudUl0ZW0gPSBfdGhpcy5yZW5kZXJNZW51SXRlbS5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLmdldEZsYXRJbnN0YW5jZUFycmF5ID0gX3RoaXMuZ2V0RmxhdEluc3RhbmNlQXJyYXkuYmluZChfdGhpcyk7XG4gICAgX3RoaXMucmVuZGVyQ29tbW9uTWVudUl0ZW0gPSBfdGhpcy5yZW5kZXJDb21tb25NZW51SXRlbS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5yZW5kZXJSb290ID0gX3RoaXMucmVuZGVyUm9vdC5iaW5kKF90aGlzKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFN1YlBvcHVwTWVudS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdmFyIHByb3BzID0gdm9pZCAwO1xuICAgIGlmICgnYWN0aXZlS2V5JyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBhY3RpdmVLZXk6IGdldEFjdGl2ZUtleShuZXh0UHJvcHMsIG5leHRQcm9wcy5hY3RpdmVLZXkpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb3JpZ2luYWxBY3RpdmVLZXkgPSB0aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICAgIHZhciBhY3RpdmVLZXkgPSBnZXRBY3RpdmVLZXkobmV4dFByb3BzLCBvcmlnaW5hbEFjdGl2ZUtleSk7XG4gICAgICAvLyBmaXg6IHRoaXMuc2V0U3RhdGUoKSwgcGFyZW50LnJlbmRlcigpLFxuICAgICAgaWYgKGFjdGl2ZUtleSAhPT0gb3JpZ2luYWxBY3RpdmVLZXkpIHtcbiAgICAgICAgcHJvcHMgPSB7XG4gICAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVLZXlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudmlzaWJsZSB8fCBuZXh0UHJvcHMudmlzaWJsZTtcbiAgfTtcblxuICBTdWJQb3B1cE1lbnUucHJvdG90eXBlLm9uRGVzZWxlY3QgPSBmdW5jdGlvbiBvbkRlc2VsZWN0KHNlbGVjdEluZm8pIHtcbiAgICB0aGlzLnByb3BzLm9uRGVzZWxlY3Qoc2VsZWN0SW5mbyk7XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5vblNlbGVjdCA9IGZ1bmN0aW9uIG9uU2VsZWN0KHNlbGVjdEluZm8pIHtcbiAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHNlbGVjdEluZm8pO1xuICB9O1xuXG4gIFN1YlBvcHVwTWVudS5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgIHRoaXMucHJvcHMub25DbGljayhlKTtcbiAgfTtcblxuICBTdWJQb3B1cE1lbnUucHJvdG90eXBlLm9uT3BlbkNoYW5nZSA9IGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShlKSB7XG4gICAgdGhpcy5wcm9wcy5vbk9wZW5DaGFuZ2UoZSk7XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiBvbkRlc3Ryb3koa2V5KSB7XG4gICAgdGhpcy5wcm9wcy5vbkRlc3Ryb3koa2V5KTtcbiAgfTtcblxuICBTdWJQb3B1cE1lbnUucHJvdG90eXBlLm9uSXRlbUhvdmVyID0gZnVuY3Rpb24gb25JdGVtSG92ZXIoZSkge1xuICAgIHZhciBfZSRvcGVuQ2hhbmdlcyA9IGUub3BlbkNoYW5nZXMsXG4gICAgICAgIG9wZW5DaGFuZ2VzID0gX2Ukb3BlbkNoYW5nZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogX2Ukb3BlbkNoYW5nZXM7XG5cbiAgICBvcGVuQ2hhbmdlcyA9IG9wZW5DaGFuZ2VzLmNvbmNhdCh0aGlzLmdldE9wZW5DaGFuZ2VzT25JdGVtSG92ZXIoZSkpO1xuICAgIGlmIChvcGVuQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMub25PcGVuQ2hhbmdlKG9wZW5DaGFuZ2VzKTtcbiAgICB9XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5nZXRPcGVuVHJhbnNpdGlvbk5hbWUgPSBmdW5jdGlvbiBnZXRPcGVuVHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub3BlblRyYW5zaXRpb25OYW1lO1xuICB9O1xuXG4gIFN1YlBvcHVwTWVudS5wcm90b3R5cGUucmVuZGVyTWVudUl0ZW0gPSBmdW5jdGlvbiByZW5kZXJNZW51SXRlbShjLCBpLCBzdWJJbmRleCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGV4dHJhUHJvcHMgPSB7XG4gICAgICBvcGVuS2V5czogcHJvcHMub3BlbktleXMsXG4gICAgICBzZWxlY3RlZEtleXM6IHByb3BzLnNlbGVjdGVkS2V5cyxcbiAgICAgIG9wZW5TdWJNZW51T25Nb3VzZUVudGVyOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJDb21tb25NZW51SXRlbShjLCBpLCBzdWJJbmRleCwgZXh0cmFQcm9wcyk7XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5nZXRPcGVuQ2hhbmdlc09uSXRlbUhvdmVyID0gZnVuY3Rpb24gZ2V0T3BlbkNoYW5nZXNPbkl0ZW1Ib3ZlcihlKSB7XG4gICAgdmFyIG1vZGUgPSB0aGlzLnByb3BzLm1vZGU7XG4gICAgdmFyIGtleSA9IGUua2V5LFxuICAgICAgICBob3ZlciA9IGUuaG92ZXIsXG4gICAgICAgIHRyaWdnZXIgPSBlLnRyaWdnZXI7XG5cbiAgICB2YXIgYWN0aXZlS2V5ID0gdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgaWYgKCF0cmlnZ2VyIHx8IGhvdmVyIHx8IHRoaXMucHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlIHx8ICFlLml0ZW0uaXNTdWJNZW51IHx8IG1vZGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlS2V5OiBob3ZlciA/IGtleSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7fVxuICAgIC8vIGtlZXAgYWN0aXZlIGZvciBzdWIgbWVudSBmb3IgY2xpY2sgYWN0aXZlXG4gICAgLy8gZW1wdHlcblxuICAgIC8vIGNsZWFyIGxhc3Qgb3BlbiBzdGF0dXNcbiAgICBpZiAoaG92ZXIgJiYgbW9kZSAhPT0gJ2lubGluZScpIHtcbiAgICAgIHZhciBhY3RpdmVJdGVtID0gdGhpcy5nZXRGbGF0SW5zdGFuY2VBcnJheSgpLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYyAmJiBjLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gICAgICB9KVswXTtcbiAgICAgIGlmIChhY3RpdmVJdGVtICYmIGFjdGl2ZUl0ZW0uaXNTdWJNZW51ICYmIGFjdGl2ZUl0ZW0ucHJvcHMuZXZlbnRLZXkgIT09IGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW06IGFjdGl2ZUl0ZW0sXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICBrZXk6IGFjdGl2ZUl0ZW0ucHJvcHMuZXZlbnRLZXksXG4gICAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9O1xuXG4gIFN1YlBvcHVwTWVudS5wcm90b3R5cGUucmVuZGVyQ29tbW9uTWVudUl0ZW0gPSBmdW5jdGlvbiByZW5kZXJDb21tb25NZW51SXRlbShjaGlsZCwgaSwgc3ViSW5kZXgsIGV4dHJhUHJvcHMpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIGtleSA9ICgwLCBfdXRpbC5nZXRLZXlGcm9tQ2hpbGRyZW5JbmRleCkoY2hpbGQsIHByb3BzLmV2ZW50S2V5LCBpKTtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzO1xuICAgIHZhciBpc0FjdGl2ZSA9IGtleSA9PT0gc3RhdGUuYWN0aXZlS2V5O1xuICAgIHZhciBuZXdDaGlsZFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgbW9kZTogcHJvcHMubW9kZSxcbiAgICAgIGxldmVsOiBwcm9wcy5sZXZlbCxcbiAgICAgIGlubGluZUluZGVudDogcHJvcHMuaW5saW5lSW5kZW50LFxuICAgICAgcmVuZGVyTWVudUl0ZW06IHRoaXMucmVuZGVyTWVudUl0ZW0sXG4gICAgICByb290UHJlZml4Q2xzOiBwcm9wcy5wcmVmaXhDbHMsXG4gICAgICBpbmRleDogaSxcbiAgICAgIHBhcmVudE1lbnU6IHRoaXMsXG4gICAgICByZWY6IGNoaWxkUHJvcHMuZGlzYWJsZWQgPyB1bmRlZmluZWQgOiAoMCwgX3RpbnBlckJlZUNvcmUuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKShjaGlsZC5yZWYsIHNhdmVSZWYuYmluZCh0aGlzLCBpLCBzdWJJbmRleCkpLFxuICAgICAgZXZlbnRLZXk6IGtleSxcbiAgICAgIGNsb3NlU3ViTWVudU9uTW91c2VMZWF2ZTogcHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlLFxuICAgICAgb25JdGVtSG92ZXI6IHRoaXMub25JdGVtSG92ZXIsXG4gICAgICBhY3RpdmU6ICFjaGlsZFByb3BzLmRpc2FibGVkICYmIGlzQWN0aXZlLFxuICAgICAgbXVsdGlwbGU6IHByb3BzLm11bHRpcGxlLFxuICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrLFxuICAgICAgb3BlblRyYW5zaXRpb25OYW1lOiB0aGlzLmdldE9wZW5UcmFuc2l0aW9uTmFtZSgpLFxuICAgICAgb3BlbkFuaW1hdGlvbjogcHJvcHMub3BlbkFuaW1hdGlvbixcbiAgICAgIG9uT3BlbkNoYW5nZTogdGhpcy5vbk9wZW5DaGFuZ2UsXG4gICAgICBvbkRlc2VsZWN0OiB0aGlzLm9uRGVzZWxlY3QsXG4gICAgICBvbkRlc3Ryb3k6IHRoaXMub25EZXN0cm95LFxuICAgICAgb25TZWxlY3Q6IHRoaXMub25TZWxlY3RcbiAgICB9LCBleHRyYVByb3BzKTtcbiAgICBpZiAocHJvcHMubW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIG5ld0NoaWxkUHJvcHMuY2xvc2VTdWJNZW51T25Nb3VzZUxlYXZlID0gbmV3Q2hpbGRQcm9wcy5vcGVuU3ViTWVudU9uTW91c2VFbnRlciA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gX3JlYWN0MltcImRlZmF1bHRcIl0uY2xvbmVFbGVtZW50KGNoaWxkLCBuZXdDaGlsZFByb3BzKTtcbiAgfTtcblxuICBTdWJQb3B1cE1lbnUucHJvdG90eXBlLmdldEZsYXRJbnN0YW5jZUFycmF5ID0gZnVuY3Rpb24gZ2V0RmxhdEluc3RhbmNlQXJyYXkoKSB7XG4gICAgdmFyIGluc3RhbmNlQXJyYXkgPSB0aGlzLmluc3RhbmNlQXJyYXk7XG4gICAgdmFyIGhhc0lubmVyQXJyYXkgPSBpbnN0YW5jZUFycmF5LnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGEpO1xuICAgIH0pO1xuICAgIGlmIChoYXNJbm5lckFycmF5KSB7XG4gICAgICBpbnN0YW5jZUFycmF5ID0gW107XG4gICAgICB0aGlzLmluc3RhbmNlQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAgIGluc3RhbmNlQXJyYXkucHVzaC5hcHBseShpbnN0YW5jZUFycmF5LCBhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnN0YW5jZUFycmF5LnB1c2goYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnN0YW5jZUFycmF5ID0gaW5zdGFuY2VBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlQXJyYXk7XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5yZW5kZXJSb290ID0gZnVuY3Rpb24gcmVuZGVyUm9vdChwcm9wcykge1xuICAgIHZhciBfY2xhc3NlcztcblxuICAgIHRoaXMuaW5zdGFuY2VBcnJheSA9IFtdO1xuICAgIHZhciBjbGFzc2VzID0gKF9jbGFzc2VzID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3NlcywgcHJvcHMucHJlZml4Q2xzLCAxKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc2VzLCBwcm9wcy5wcmVmaXhDbHMgKyAnLScgKyBwcm9wcy5tb2RlLCAxKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzc2VzLCBwcm9wcy5jbGFzc05hbWUsICEhcHJvcHMuY2xhc3NOYW1lKSwgX2NsYXNzZXMpO1xuICAgIHZhciBkb21Qcm9wcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMltcImRlZmF1bHRcIl0pKGNsYXNzZXMpLFxuICAgICAgcm9sZTogJ21lbnUnLFxuICAgICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6ICcnXG4gICAgfTtcbiAgICBpZiAocHJvcHMuaWQpIHtcbiAgICAgIGRvbVByb3BzLmlkID0gcHJvcHMuaWQ7XG4gICAgfVxuICAgIGlmIChwcm9wcy5mb2N1c2FibGUpIHtcbiAgICAgIGRvbVByb3BzLnRhYkluZGV4ID0gJzAnO1xuICAgICAgZG9tUHJvcHMub25LZXlEb3duID0gdGhpcy5vbktleURvd247XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAvLyBFU0xpbnQgaXMgbm90IHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQgdGhlIHR5cGUgb2YgYGNoaWxkcmVuYCB3YXMgY2hlY2tlZC5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRE9NV3JhcDJbXCJkZWZhdWx0XCJdLFxuICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgICAgICAgIHRhZzogJ3VsJyxcbiAgICAgICAgICBoaWRkZW5DbGFzc05hbWU6IHByb3BzLnByZWZpeENscyArICctaGlkZGVuJyxcbiAgICAgICAgICB2aXNpYmxlOiBwcm9wcy52aXNpYmxlXG4gICAgICAgIH0sIGRvbVByb3BzKSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uQ2hpbGRyZW4ubWFwKHByb3BzLmNoaWxkcmVuLCB0aGlzLnJlbmRlck1lbnVJdGVtLmJpbmQodGhpcykpXG4gICAgICApXG4gICAgICAvKmVzbGludC1lbmFibGUgKi9cblxuICAgICk7XG4gIH07XG5cbiAgU3ViUG9wdXBNZW51LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHJlbmRlckZpcnN0ID0gdGhpcy5yZW5kZXJGaXJzdDtcbiAgICB0aGlzLnJlbmRlckZpcnN0ID0gMTtcbiAgICB0aGlzLmhhdmVPcGVuZWQgPSB0aGlzLmhhdmVPcGVuZWQgfHwgdGhpcy5wcm9wcy52aXNpYmxlO1xuICAgIGlmICghdGhpcy5oYXZlT3BlbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHRyYW5zaXRpb25BcHBlYXIgPSB0cnVlO1xuICAgIGlmICghcmVuZGVyRmlyc3QgJiYgdGhpcy5wcm9wcy52aXNpYmxlKSB7XG4gICAgICB0cmFuc2l0aW9uQXBwZWFyID0gZmFsc2U7XG4gICAgfVxuICAgIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCB0aGlzLnByb3BzKTtcbiAgICBwcm9wcy5jbGFzc05hbWUgKz0gJyAnICsgcHJvcHMucHJlZml4Q2xzICsgJy1zdWInO1xuICAgIHZhciBhbmltUHJvcHMgPSB7fTtcbiAgICBpZiAocHJvcHMub3BlblRyYW5zaXRpb25OYW1lKSB7XG4gICAgICBhbmltUHJvcHMudHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5vcGVuVHJhbnNpdGlvbk5hbWU7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKHByb3BzLm9wZW5BbmltYXRpb24pID09PSAnb2JqZWN0Jykge1xuICAgICAgYW5pbVByb3BzLmFuaW1hdGlvbiA9IF9leHRlbmRzKHt9LCBwcm9wcy5vcGVuQW5pbWF0aW9uKTtcbiAgICAgIGlmICghdHJhbnNpdGlvbkFwcGVhcikge1xuICAgICAgICBkZWxldGUgYW5pbVByb3BzLmFuaW1hdGlvbi5hcHBlYXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX2JlZUFuaW1hdGUyW1wiZGVmYXVsdFwiXSxcbiAgICAgIF9leHRlbmRzKHt9LCBhbmltUHJvcHMsIHtcbiAgICAgICAgc2hvd1Byb3A6ICd2aXNpYmxlJyxcbiAgICAgICAgY29tcG9uZW50OiAnJyxcbiAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJhbnNpdGlvbkFwcGVhclxuICAgICAgfSksXG4gICAgICB0aGlzLnJlbmRlclJvb3QocHJvcHMpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU3ViUG9wdXBNZW51O1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuU3ViUG9wdXBNZW51LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU3ViUG9wdXBNZW51O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZW51L2J1aWxkL1N1YlBvcHVwTWVudS5qc1xuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfdGlucGVyQmVlQ29yZSA9IHJlcXVpcmUoJ3RpbnBlci1iZWUtY29yZScpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF91dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuLyogZXNsaW50IHJlYWN0L25vLWlzLW1vdW50ZWQ6MCAqL1xudmFyIHByb3BUeXBlcyA9IHtcbiAgcm9vdFByZWZpeENsczogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGV2ZW50S2V5OiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYWN0aXZlOiBfcmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNoaWxkcmVuOiBfcmVhY3QuUHJvcFR5cGVzLmFueSxcbiAgc2VsZWN0ZWRLZXlzOiBfcmVhY3QuUHJvcFR5cGVzLmFycmF5LFxuICBkaXNhYmxlZDogX3JlYWN0LlByb3BUeXBlcy5ib29sLFxuICB0aXRsZTogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9uU2VsZWN0OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ2xpY2s6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25EZXNlbGVjdDogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBwYXJlbnRNZW51OiBfcmVhY3QuUHJvcFR5cGVzLm9iamVjdCxcbiAgb25JdGVtSG92ZXI6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25EZXN0cm95OiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uTW91c2VFbnRlcjogX3JlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbk1vdXNlTGVhdmU6IF9yZWFjdC5Qcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgb25TZWxlY3Q6IF91dGlsLm5vb3AsXG4gIG9uTW91c2VFbnRlcjogX3V0aWwubm9vcCxcbiAgb25Nb3VzZUxlYXZlOiBfdXRpbC5ub29wXG59O1xuXG52YXIgTWVudUl0ZW0gPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTWVudUl0ZW0sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lbnVJdGVtKHByb3BzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMub25Nb3VzZUxlYXZlID0gX3RoaXMub25Nb3VzZUxlYXZlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLm9uTW91c2VFbnRlciA9IF90aGlzLm9uTW91c2VFbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5vbktleURvd24gPSBfdGhpcy5vbktleURvd24uYmluZChfdGhpcyk7XG4gICAgX3RoaXMub25DbGljayA9IF90aGlzLm9uQ2xpY2suYmluZChfdGhpcyk7XG4gICAgX3RoaXMuZ2V0UHJlZml4Q2xzID0gX3RoaXMuZ2V0UHJlZml4Q2xzLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldEFjdGl2ZUNsYXNzTmFtZSA9IF90aGlzLmdldEFjdGl2ZUNsYXNzTmFtZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5nZXREaXNhYmxlZENsYXNzTmFtZSA9IF90aGlzLmdldERpc2FibGVkQ2xhc3NOYW1lLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmdldFNlbGVjdGVkQ2xhc3NOYW1lID0gX3RoaXMuZ2V0U2VsZWN0ZWRDbGFzc05hbWUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuY2xlYXJNZW51SXRlbU1vdXNlTGVhdmVUaW1lciA9IF90aGlzLmNsZWFyTWVudUl0ZW1Nb3VzZUxlYXZlVGltZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaXNTZWxlY3RlZCA9IF90aGlzLmlzU2VsZWN0ZWQuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICBpZiAocHJvcHMub25EZXN0cm95KSB7XG4gICAgICBwcm9wcy5vbkRlc3Ryb3kocHJvcHMuZXZlbnRLZXkpO1xuICAgIH1cbiAgICBpZiAocHJvcHMucGFyZW50TWVudS5tZW51SXRlbUluc3RhbmNlID09PSB0aGlzKSB7XG4gICAgICB0aGlzLmNsZWFyTWVudUl0ZW1Nb3VzZUxlYXZlVGltZXIoKTtcbiAgICB9XG4gIH07XG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUub25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIga2V5Q29kZSA9IGUua2V5Q29kZTtcbiAgICBpZiAoa2V5Q29kZSA9PT0gX3RpbnBlckJlZUNvcmUuS2V5Q29kZS5FTlRFUikge1xuICAgICAgdGhpcy5vbkNsaWNrKGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5vbk1vdXNlTGVhdmUgPSBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICB2YXIgZXZlbnRLZXkgPSBwcm9wcy5ldmVudEtleSxcbiAgICAgICAgcGFyZW50TWVudSA9IHByb3BzLnBhcmVudE1lbnU7XG5cbiAgICBwYXJlbnRNZW51Lm1lbnVJdGVtSW5zdGFuY2UgPSB0aGlzO1xuICAgIHBhcmVudE1lbnUubWVudUl0ZW1Nb3VzZUxlYXZlRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMyLm1vdW50ZWQgJiYgcHJvcHMuYWN0aXZlKSB7XG4gICAgICAgIHByb3BzLm9uSXRlbUhvdmVyKHtcbiAgICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICAgIGl0ZW06IF90aGlzMixcbiAgICAgICAgICBob3ZlcjogZmFsc2UsXG4gICAgICAgICAgZG9tRXZlbnQ6IGUsXG4gICAgICAgICAgdHJpZ2dlcjogJ21vdXNlbGVhdmUnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgcGFyZW50TWVudS5tZW51SXRlbU1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQocGFyZW50TWVudS5tZW51SXRlbU1vdXNlTGVhdmVGbiwgMzApO1xuICAgIHByb3BzLm9uTW91c2VMZWF2ZSh7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgZG9tRXZlbnQ6IGVcbiAgICB9KTtcbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gb25Nb3VzZUVudGVyKGUpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5LFxuICAgICAgICBwYXJlbnRNZW51ID0gcHJvcHMucGFyZW50TWVudTtcblxuICAgIHRoaXMuY2xlYXJNZW51SXRlbU1vdXNlTGVhdmVUaW1lcihwYXJlbnRNZW51Lm1lbnVJdGVtSW5zdGFuY2UgIT09IHRoaXMpO1xuICAgIGlmIChwYXJlbnRNZW51LnN1Yk1lbnVJbnN0YW5jZSkge1xuICAgICAgcGFyZW50TWVudS5zdWJNZW51SW5zdGFuY2UuY2xlYXJTdWJNZW51VGltZXJzKCk7XG4gICAgfVxuICAgIHByb3BzLm9uSXRlbUhvdmVyKHtcbiAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICBpdGVtOiB0aGlzLFxuICAgICAgaG92ZXI6IHRydWUsXG4gICAgICBkb21FdmVudDogZSxcbiAgICAgIHRyaWdnZXI6ICdtb3VzZWVudGVyJ1xuICAgIH0pO1xuICAgIHByb3BzLm9uTW91c2VFbnRlcih7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgZG9tRXZlbnQ6IGVcbiAgICB9KTtcbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkKCk7XG4gICAgdmFyIGV2ZW50S2V5ID0gcHJvcHMuZXZlbnRLZXk7XG4gICAgdmFyIGluZm8gPSB7XG4gICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAga2V5UGF0aDogW2V2ZW50S2V5XSxcbiAgICAgIGl0ZW06IHRoaXMsXG4gICAgICBkb21FdmVudDogZVxuICAgIH07XG4gICAgcHJvcHMub25DbGljayhpbmZvKTtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBwcm9wcy5vbkRlc2VsZWN0KGluZm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMub25TZWxlY3QoaW5mbyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghc2VsZWN0ZWQpIHtcbiAgICAgIHByb3BzLm9uU2VsZWN0KGluZm8pO1xuICAgIH1cbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUuZ2V0UHJlZml4Q2xzID0gZnVuY3Rpb24gZ2V0UHJlZml4Q2xzKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnJvb3RQcmVmaXhDbHMgKyAnLWl0ZW0nO1xuICB9O1xuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5nZXRBY3RpdmVDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXRBY3RpdmVDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJlZml4Q2xzKCkgKyAnLWFjdGl2ZSc7XG4gIH07XG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmdldFNlbGVjdGVkQ2xhc3NOYW1lID0gZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJlZml4Q2xzKCkgKyAnLXNlbGVjdGVkJztcbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUuZ2V0RGlzYWJsZWRDbGFzc05hbWUgPSBmdW5jdGlvbiBnZXREaXNhYmxlZENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcmVmaXhDbHMoKSArICctZGlzYWJsZWQnO1xuICB9O1xuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5jbGVhck1lbnVJdGVtTW91c2VMZWF2ZVRpbWVyID0gZnVuY3Rpb24gY2xlYXJNZW51SXRlbU1vdXNlTGVhdmVUaW1lcigpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgIHZhciBjYWxsRm4gPSB2b2lkIDA7XG4gICAgdmFyIHBhcmVudE1lbnUgPSBwcm9wcy5wYXJlbnRNZW51O1xuICAgIGlmIChwYXJlbnRNZW51Lm1lbnVJdGVtTW91c2VMZWF2ZVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQocGFyZW50TWVudS5tZW51SXRlbU1vdXNlTGVhdmVUaW1lcik7XG4gICAgICBwYXJlbnRNZW51Lm1lbnVJdGVtTW91c2VMZWF2ZVRpbWVyID0gbnVsbDtcbiAgICAgIGlmIChjYWxsRm4gJiYgcGFyZW50TWVudS5tZW51SXRlbU1vdXNlTGVhdmVGbikge1xuICAgICAgICBwYXJlbnRNZW51Lm1lbnVJdGVtTW91c2VMZWF2ZUZuKCk7XG4gICAgICB9XG4gICAgICBwYXJlbnRNZW51Lm1lbnVJdGVtTW91c2VMZWF2ZUZuID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLmlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnNlbGVjdGVkS2V5cy5pbmRleE9mKHRoaXMucHJvcHMuZXZlbnRLZXkpICE9PSAtMTtcbiAgfTtcblxuICBNZW51SXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkKCk7XG4gICAgdmFyIGNsYXNzZXMgPSB7fTtcbiAgICBjbGFzc2VzW3RoaXMuZ2V0QWN0aXZlQ2xhc3NOYW1lKCldID0gIXByb3BzLmRpc2FibGVkICYmIHByb3BzLmFjdGl2ZTtcbiAgICBjbGFzc2VzW3RoaXMuZ2V0U2VsZWN0ZWRDbGFzc05hbWUoKV0gPSBzZWxlY3RlZDtcbiAgICBjbGFzc2VzW3RoaXMuZ2V0RGlzYWJsZWRDbGFzc05hbWUoKV0gPSBwcm9wcy5kaXNhYmxlZDtcbiAgICBjbGFzc2VzW3RoaXMuZ2V0UHJlZml4Q2xzKCldID0gdHJ1ZTtcbiAgICBjbGFzc2VzW3Byb3BzLmNsYXNzTmFtZV0gPSAhIXByb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgYXR0cnMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMuYXR0cmlidXRlLCB7XG4gICAgICB0aXRsZTogcHJvcHMudGl0bGUsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbXCJkZWZhdWx0XCJdKShjbGFzc2VzKSxcbiAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgICAnYXJpYS1zZWxlY3RlZCc6IHNlbGVjdGVkLFxuICAgICAgJ2FyaWEtZGlzYWJsZWQnOiBwcm9wcy5kaXNhYmxlZFxuICAgIH0pO1xuICAgIHZhciBtb3VzZUV2ZW50ID0ge307XG4gICAgaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgbW91c2VFdmVudCA9IHtcbiAgICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrLFxuICAgICAgICBvbk1vdXNlTGVhdmU6IHRoaXMub25Nb3VzZUxlYXZlLFxuICAgICAgICBvbk1vdXNlRW50ZXI6IHRoaXMub25Nb3VzZUVudGVyXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgc3R5bGUgPSBfZXh0ZW5kcyh7fSwgcHJvcHMuc3R5bGUpO1xuICAgIGlmIChwcm9wcy5tb2RlID09PSAnaW5saW5lJykge1xuICAgICAgc3R5bGUucGFkZGluZ0xlZnQgPSBwcm9wcy5pbmxpbmVJbmRlbnQgKiBwcm9wcy5sZXZlbDtcbiAgICB9XG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnbGknLFxuICAgICAgX2V4dGVuZHMoe1xuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIGF0dHJzLCBtb3VzZUV2ZW50KSxcbiAgICAgIHByb3BzLmNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTWVudUl0ZW07XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG47XG5cbk1lbnVJdGVtLmlzTWVudUl0ZW0gPSAxO1xuXG5NZW51SXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5NZW51SXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTWVudUl0ZW07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW1lbnUvYnVpbGQvTWVudUl0ZW0uanNcbi8vIG1vZHVsZSBpZCA9IDkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkZWZhdWx0cyk7IGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeyB2YXIga2V5ID0ga2V5c1tpXTsgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpOyB9IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBfZGVmYXVsdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHJlbmRlck1lbnVJdGVtOiBfcmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGluZGV4OiBfcmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgY2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcm9vdFByZWZpeENsczogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGRpc2FibGVkOiB0cnVlXG59O1xuXG52YXIgTWVudUl0ZW1Hcm91cCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhNZW51SXRlbUdyb3VwLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZW51SXRlbUdyb3VwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51SXRlbUdyb3VwKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVudUl0ZW1Hcm91cC5wcm90b3R5cGUucmVuZGVySW5uZXJNZW51SXRlbSA9IGZ1bmN0aW9uIHJlbmRlcklubmVyTWVudUl0ZW0oaXRlbSwgc3ViSW5kZXgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcmVuZGVyTWVudUl0ZW0gPSBfcHJvcHMucmVuZGVyTWVudUl0ZW0sXG4gICAgICAgIGluZGV4ID0gX3Byb3BzLmluZGV4O1xuXG4gICAgcmV0dXJuIHJlbmRlck1lbnVJdGVtKGl0ZW0sIGluZGV4LCBzdWJJbmRleCk7XG4gIH07XG5cbiAgTWVudUl0ZW1Hcm91cC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgX3Byb3BzMiRjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzMiRjbGFzc05hbWUgPT09IHVuZGVmaW5lZCA/ICcnIDogX3Byb3BzMiRjbGFzc05hbWUsXG4gICAgICAgIHRpdGxlID0gX3Byb3BzMi50aXRsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICByb290UHJlZml4Q2xzID0gX3Byb3BzMi5yb290UHJlZml4Q2xzO1xuXG4gICAgdmFyIHRpdGxlQ2xhc3NOYW1lID0gcm9vdFByZWZpeENscyArICctaXRlbS1ncm91cC10aXRsZSc7XG4gICAgdmFyIGxpc3RDbGFzc05hbWUgPSByb290UHJlZml4Q2xzICsgJy1pdGVtLWdyb3VwLWxpc3QnO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnbGknLFxuICAgICAgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSArICcgJyArIHJvb3RQcmVmaXhDbHMgKyAnLWl0ZW0tZ3JvdXAnIH0sXG4gICAgICBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IHRpdGxlQ2xhc3NOYW1lIH0sXG4gICAgICAgIHRpdGxlXG4gICAgICApLFxuICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3VsJyxcbiAgICAgICAgeyBjbGFzc05hbWU6IGxpc3RDbGFzc05hbWUgfSxcbiAgICAgICAgX3JlYWN0MltcImRlZmF1bHRcIl0uQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCB0aGlzLnJlbmRlcklubmVyTWVudUl0ZW0uYmluZCh0aGlzKSlcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBNZW51SXRlbUdyb3VwO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuXG5NZW51SXRlbUdyb3VwLmlzTWVudUl0ZW1Hcm91cCA9IHRydWU7XG5NZW51SXRlbUdyb3VwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1lbnVJdGVtR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE1lbnVJdGVtR3JvdXA7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmVlLW1lbnUvYnVpbGQvTWVudUl0ZW1Hcm91cC5qc1xuLy8gbW9kdWxlIGlkID0gOTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykgeyB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTsgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7IHZhciBrZXkgPSBrZXlzW2ldOyB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpOyBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7IH0gfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IF9kZWZhdWx0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBfcmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcm9vdFByZWZpeENsczogX3JlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn07XG5cbnZhciBEaXZpZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKERpdmlkZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERpdmlkZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpdmlkZXIpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBEaXZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJvb3RQcmVmaXhDbHMgPSBfcHJvcHMucm9vdFByZWZpeENscztcblxuICAgIHJldHVybiBfcmVhY3QyW1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KCdsaScsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWUgKyAnICcgKyByb290UHJlZml4Q2xzICsgJy1pdGVtLWRpdmlkZXInIH0pO1xuICB9O1xuXG4gIHJldHVybiBEaXZpZGVyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuO1xuXG5EaXZpZGVyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEaXZpZGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JlZS1tZW51L2J1aWxkL0RpdmlkZXIuanNcbi8vIG1vZHVsZSBpZCA9IDk1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDckNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUhBO0FBTUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRkE7QUFLQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQVpBO0FBREE7QUFvQkE7QUFDQTs7QUFBQTs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVRBO0FBQ0E7QUFXQTs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFHQTtBQUpBO0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTkE7QUFEQTtBQVVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFaQTtBQWlCQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUZBO0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFMQTtBQWhDQTtBQURBO0FBNkNBO0FBQ0E7Ozs7QUFBQTtBQUNBO0FBRUE7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUxBO0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBSEE7QUFRQTtBQUNBOzs7O0FBRUE7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFQQTtBQVVBO0FBQ0E7Ozs7QUFFQTs7Ozs7O0FDbExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMvSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDL0NBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDNVVBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN4UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDclJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUM5TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNwR0E7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBOzs7Ozs7Ozs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBR0E7QUFGQTtBQUtBO0FBQ0E7O0FBWEE7QUFDQTtBQVlBOzs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzVNQTtBQUNBO0FBQ0E7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3JqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN6UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN0a0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQy9nQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMxV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUMzUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OyIsInNvdXJjZVJvb3QiOiIifQ==
|
10771 | //# sourceMappingURL=demo.js.map |
\ | No newline at end of file |