1/******/ (function() { // webpackBootstrap 2/******/ var __webpack_modules__ = ({ 3
vendor: 1,951 bytes, lines 4-59
4/***/ "./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js": 5/*!*********************************************************************************************!*\ 6 !*** ./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***! 7 \*********************************************************************************************/ 8/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 9 10"use strict"; 11__webpack_require__.r(__webpack_exports__); 12/* harmony export */ __webpack_require__.d(__webpack_exports__, { 13/* harmony export */ classCallCheck: function() { return /* binding */ _classCallCheck; }, 14/* harmony export */ createClass: function() { return /* binding */ _createClass; }, 15/* harmony export */ defineProperty: function() { return /* binding */ _defineProperty; } 16/* harmony export */ }); 17function _classCallCheck(instance, Constructor) { 18 if (!(instance instanceof Constructor)) { 19 throw new TypeError("Cannot call a class as a function"); 20 } 21} 22 23function _defineProperties(target, props) { 24 for (var i = 0; i < props.length; i++) { 25 var descriptor = props[i]; 26 descriptor.enumerable = descriptor.enumerable || false; 27 descriptor.configurable = true; 28 if ("value" in descriptor) descriptor.writable = true; 29 Object.defineProperty(target, descriptor.key, descriptor); 30 } 31} 32 33function _createClass(Constructor, protoProps, staticProps) { 34 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 35 if (staticProps) _defineProperties(Constructor, staticProps); 36 return Constructor; 37} 38 39function _defineProperty(obj, key, value) { 40 if (key in obj) { 41 Object.defineProperty(obj, key, { 42 value: value, 43 enumerable: true, 44 configurable: true, 45 writable: true 46 }); 47 } else { 48 obj[key] = value; 49 } 50 51 return obj; 52} 53 54 55//# sourceMappingURL=_rollupPluginBabelHelpers.js.map 56 57 58/***/ }), 59
vendor: 8,258 bytes, lines 60-274
60/***/ "./node_modules/@sygnas/jp-social-share/dist/es6/index.js": 61/*!****************************************************************!*\ 62 !*** ./node_modules/@sygnas/jp-social-share/dist/es6/index.js ***! 63 \****************************************************************/ 64/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 65 66"use strict"; 67__webpack_require__.r(__webpack_exports__); 68/* harmony export */ __webpack_require__.d(__webpack_exports__, { 69/* harmony export */ "default": function() { return /* binding */ JpSocialShare; } 70/* harmony export */ }); 71/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/jp-social-share/dist/es6/_virtual/_rollupPluginBabelHelpers.js"); 72 73 74/** 75 * æ¥æ¬åãã½ã¼ã·ã£ã«ã·ã§ã¢ãã¿ã³ 76 * 77 * @author Hiroshi Fukuda <[email protected]> 78 * @license MIT 79 */ 80var JpSocialShare = /*#__PURE__*/function () { 81 function JpSocialShare() { 82 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, JpSocialShare); 83 } 84 85 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(JpSocialShare, null, [{ 86 key: "setShareButton", 87 value: // ãµã¼ãã¹åèå¥å 88 //////////////////////// 89 //////////////////////// 90 91 /** 92 * ã·ã§ã¢ãã¿ã³ã®ãªã³ã¯ãè¨å®ãã 93 * @param {String} target 対象ãã¿ã³ã®ã»ã¬ã¯ã¿ 94 * @param {Object} option æ°è¦ã¦ã£ã³ãã¦ã®ãã©ã¡ã¼ã¿ï¼defaultsåç §ï¼ 95 */ 96 function setShareButton(target) { 97 var _this = this; 98 99 var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 100 // è¨å®ã®ãã¼ã¸ 101 this.opt = Object.assign(this.defaults, option); // ã¯ãªãã¯ã¤ãã³ããè¨å® 102 103 this.getNodeArray(document.querySelectorAll(target)).forEach(function (elm) { 104 elm.addEventListener('click', function (ev) { 105 var elm = ev.currentTarget; 106 107 _this.openShareWindowWithElement(elm); 108 109 ev.preventDefault(); 110 }); 111 }); 112 } 113 /** 114 * ã¨ã¬ã¡ã³ãããæ å ±ãåå¾ãã¦ã·ã§ã¢ç¨ã¦ã£ã³ãã¦ãéã 115 */ 116 117 }, { 118 key: "openShareWindowWithElement", 119 value: function openShareWindowWithElement(elm) { 120 // ã¨ã¬ã¡ã³ããããã©ã¡ã¼ã¿ãåå¾ 121 var service = elm.getAttribute('data-share-service'); 122 var url = elm.getAttribute('data-share-url') || ''; 123 var message = elm.getAttribute('data-share-message') || document.title; 124 var account = elm.getAttribute('data-share-account') || ''; 125 var follow = elm.getAttribute('data-share-follow') || ''; // ã·ã§ã¢ç¨ã¦ã£ã³ãã¦ãéã 126 127 this.openShareWindow(service, url, message, account, follow); 128 } 129 /** 130 * ã·ã§ã¢ç¨ã¦ã£ã³ãã¦ãéã 131 * @param service {String} ã½ã¼ã·ã£ã«ãµã¼ãã¹èå¥å 132 * @param url {String} ã·ã§ã¢URL 133 * @param message {String} ã¡ãã»ã¼ã¸æ¬æ 134 * @param account {String} ãã¤ã¼ãã«ä»ããRepleyã¢ã«ã¦ã³ã 135 * @param follow {String} ãã¤ã¼ãå¾ã«è¡¨ç¤ºãããã©ãã¼åè£ã¢ã«ã¦ã³ã 136 */ 137 138 }, { 139 key: "openShareWindow", 140 value: function openShareWindow(service) { 141 var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 142 var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 143 var account = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; 144 var follow = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; 145 146 // åå¨ããªããµã¼ãã¹ã ã£ããã¨ã©ã¼ 147 if (this.opt.services && Object.keys(this.opt.services).indexOf(service) === -1) { 148 console.log("".concat(service, " is not supported.")); 149 return; 150 } // ãã³ãã¬ã¼ãããã³ã³ãã¼ã 151 152 153 var openUrl = this.convertOpenUrl(service, url, message, account, follow); // // LINEã¯ã¢ããªã«é£ã°ãããã以å¤ã¯ã¦ã£ã³ãã¦ãéã 154 // if (service === this.SERVICES.LINE) { 155 // window.location.href = openUrl; 156 // } else if (this.opt.window) { 157 158 if (this.opt.window) { 159 var windowOption = this.getWindowOption(this.opt.window); 160 window.open(openUrl, "share_".concat(service), windowOption); 161 } else { 162 console.log('Window option is not defined.'); 163 return; 164 } 165 } //////////////////////// 166 //////////////////////// 167 168 /** 169 * ãµã¼ãã¹æ¯ã®URLãåå¾ 170 * ãã©ã¡ã¼ã¿ã«ãã£ã¦ã¯å å·¥ãããã 171 * @param service {String} ã½ã¼ã·ã£ã«ãµã¼ãã¹èå¥å 172 * @param url {String} ã·ã§ã¢URL 173 * @param message {String} ã¡ãã»ã¼ã¸æ¬æ 174 * @param account {String} ãã¤ã¼ãã«ä»ããRepleyã¢ã«ã¦ã³ã 175 * @param follow {String} ãã¤ã¼ãå¾ã«è¡¨ç¤ºãããã©ãã¼åè£ã¢ã«ã¦ã³ã 176 * @return {String} ã·ã§ã¢çªãªã¼ãã³URL 177 */ 178 179 }, { 180 key: "convertOpenUrl", 181 value: function convertOpenUrl(service) { 182 var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 183 var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 184 var account = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; 185 var follow = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; 186 var eu = encodeURIComponent; 187 var shareUrl = url || location.href; 188 var openUrl = this.opt.services ? this.opt.services[service] : ""; 189 190 if (!openUrl) { 191 console.log("".concat(service, " is not supported.")); 192 return ""; 193 } // Twitterã ããã©ã¡ã¼ã¿ã®å 容ã«ãã£ã¦URLãå¤ãã 194 195 196 if (service === this.SERVICES.TWITTER) { 197 if (!account) openUrl = openUrl.replace("&via={{ACCOUNT}}", ""); 198 if (!follow) openUrl = openUrl.replace("&related={{FOLLOW}}", ""); 199 } 200 201 openUrl = openUrl.replace("{{ACCOUNT}}", eu(account)); 202 openUrl = openUrl.replace("{{FOLLOW}}", eu(follow)); 203 openUrl = openUrl.replace("{{MESSAGE}}", eu(message)); 204 openUrl = openUrl.replace("{{URL}}", eu(shareUrl)); 205 return openUrl; 206 } 207 /** 208 * NodeListãArrayã¨ãã¦åãåºãï¼IE対çï¼ 209 */ 210 211 }, { 212 key: "getNodeArray", 213 value: function getNodeArray(nodeList) { 214 return Array.prototype.slice.call(nodeList, 0); 215 } 216 /** 217 * Windowãã©ã¡ã¼ã¿ä½æ 218 * @param opt {Object} ã¦ã£ã³ãã¦ãã©ã¡ã¼ã¿ 219 * @return {String} æ°è¦ã¦ã£ã³ãã¦ã®ãã©ã¡ã¼ã¿æåå 220 */ 221 222 }, { 223 key: "getWindowOption", 224 value: function getWindowOption(opt) { 225 var items = []; 226 Object.keys(opt).forEach(function (key) { 227 items.push("".concat(key, "=").concat(opt[key])); 228 }); 229 return items.join(","); 230 } 231 }]); 232 233 return JpSocialShare; 234}(); 235 236(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "SERVICES", { 237 TWITTER: 'twitter', 238 FACEBOOK: 'facebook', 239 LINE: 'line', 240 FEEDLY: 'feedly', 241 POCKET: 'pocket', 242 HATEBU: 'hatebu' 243}); 244 245(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "opt", void 0); 246 247(0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(JpSocialShare, "defaults", { 248 // window.open() ã®ãªãã·ã§ã³ 249 window: { 250 width: 550, 251 height: 450, 252 personalbar: 0, 253 toolbar: 0, 254 scrollbars: 1, 255 resizable: 1 256 }, 257 // ã·ã§ã¢ç¨URLã®ãã³ãã¬ã¼ã 258 services: { 259 twitter: 'http://twitter.com/share?url={{URL}}&text={{MESSAGE}}&via={{ACCOUNT}}&related={{FOLLOW}}', 260 facebook: 'http://www.facebook.com/share.php?u={{URL}}', 261 // line: 'line://msg/text/{{MESSAGE}} {{URL}}', 262 line: 'https://social-plugins.line.me/lineit/share?url={{URL}}', 263 feedly: 'http://feedly.com/i/subscription/feed/{{URL}}', 264 pocket: 'http://getpocket.com/edit?url={{URL}}', 265 hatebu: '//b.hatena.ne.jp/add?mode=confirm&url={{URL}}&title={{MESSAGE}}' 266 } 267}); 268 269 270//# sourceMappingURL=index.js.map 271 272 273/***/ }), 274
vendor: 1,943 bytes, lines 275-330
275/***/ "./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js": 276/*!*******************************************************************************************!*\ 277 !*** ./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***! 278 \*******************************************************************************************/ 279/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 280 281"use strict"; 282__webpack_require__.r(__webpack_exports__); 283/* harmony export */ __webpack_require__.d(__webpack_exports__, { 284/* harmony export */ classCallCheck: function() { return /* binding */ _classCallCheck; }, 285/* harmony export */ createClass: function() { return /* binding */ _createClass; }, 286/* harmony export */ defineProperty: function() { return /* binding */ _defineProperty; } 287/* harmony export */ }); 288function _classCallCheck(instance, Constructor) { 289 if (!(instance instanceof Constructor)) { 290 throw new TypeError("Cannot call a class as a function"); 291 } 292} 293 294function _defineProperties(target, props) { 295 for (var i = 0; i < props.length; i++) { 296 var descriptor = props[i]; 297 descriptor.enumerable = descriptor.enumerable || false; 298 descriptor.configurable = true; 299 if ("value" in descriptor) descriptor.writable = true; 300 Object.defineProperty(target, descriptor.key, descriptor); 301 } 302} 303 304function _createClass(Constructor, protoProps, staticProps) { 305 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 306 if (staticProps) _defineProperties(Constructor, staticProps); 307 return Constructor; 308} 309 310function _defineProperty(obj, key, value) { 311 if (key in obj) { 312 Object.defineProperty(obj, key, { 313 value: value, 314 enumerable: true, 315 configurable: true, 316 writable: true 317 }); 318 } else { 319 obj[key] = value; 320 } 321 322 return obj; 323} 324 325 326//# sourceMappingURL=_rollupPluginBabelHelpers.js.map 327 328 329/***/ }), 330
vendor: 6,178 bytes, lines 331-519
331/***/ "./node_modules/@sygnas/scroll-amount/dist/es6/index.js": 332/*!**************************************************************!*\ 333 !*** ./node_modules/@sygnas/scroll-amount/dist/es6/index.js ***! 334 \**************************************************************/ 335/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 336 337"use strict"; 338__webpack_require__.r(__webpack_exports__); 339/* harmony export */ __webpack_require__.d(__webpack_exports__, { 340/* harmony export */ "default": function() { return /* binding */ SygScrollAmount; } 341/* harmony export */ }); 342/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/scroll-amount/dist/es6/_virtual/_rollupPluginBabelHelpers.js"); 343 344 345/** 346 * Add scrolling state(top / not-top / bottom / not-bottom) 347 * 348 * @author Hiroshi Fukuda <[email protected]> 349 * @license MIT 350 */ 351/////////////////////////////////////// 352// ç¶æ ãä»ä¸ããããã®data屿§ 353var ATTR_NAME = "data-scroll-amount"; // ç¶æ ã®åå 354 355var ATTR_TOP = "top"; 356var ATTR_BOTTOM = "bottom"; 357var ATTR_NOT_TOP = "not-top"; 358var ATTR_NOT_BOTTOM = "not-bottom"; 359var ATTR_POSITION = "data-position"; // ç£è¦ç¨ã¨ã¬ã¡ã³ãã®ããã©ã«ãstyle 360 361var COMMON_STYLE = { 362 position: "absolute", 363 left: "0" 364}; // IntersectionObserverã®è¨å® 365 366var OBSERVER_OPT = { 367 root: null, 368 rootMargin: "0px", 369 threshold: 0 370}; /////////////////////////////////////// 371 372var SygScrollAmount = /*#__PURE__*/function () { 373 // private observers: IntersectionObserver[]; 374 375 /** 376 * ã³ã³ã¹ãã©ã¯ã¿ 377 * @param target string ç¶æ ãä»ä¸ãã対象ã¨ã¬ã¡ã³ãã®ã»ã¬ã¯ã¿æåå 378 */ 379 function SygScrollAmount(target) { 380 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 381 382 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, SygScrollAmount); 383 384 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "opt", void 0); 385 386 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "targets", void 0); 387 388 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "isTop", void 0); 389 390 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "isBottom", void 0); 391 392 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "lastState", void 0); 393 394 var defaults = { 395 // æä¸é¨ã®ãªãã»ãã 396 offsetTop: "70px", 397 // æä¸é¨ã®ãªãã»ãã 398 offsetBottom: "70px", 399 // æä¸é¨ã«ã¹ã¯ãã¼ã«ããæã«å®è¡ 400 onTop: function onTop() {}, 401 // æä¸é¨ããé¢ããæã«å®è¡ 402 onNotTop: function onNotTop() {}, 403 // æä¸é¨ã«ã¹ã¯ãã¼ã«ããæã«å®è¡ 404 onBottom: function onBottom() {}, 405 // æä¸é¨ããé¢ããæã«å®è¡ 406 onNotBottom: function onNotBottom() {} 407 }; // ä¸ããããè¨å®ãé©ç¨ 408 409 this.opt = Object.assign(defaults, options); // ç¶æ ä»ä¸ã®å¯¾è±¡ 410 411 this.targets = document.querySelectorAll(target); // ä¸çªä¸ã«ã¹ã¯ãã¼ã«ãã 412 413 this.isTop = false; // ä¸çªä¸ã«ã¹ã¯ãã¼ã«ãã 414 415 this.isBottom = false; // æå¾ã®ç¶æ 416 417 this.lastState = ''; 418 this.start(); 419 } 420 /** 421 * ç£è¦ç¨ã¨ã¬ã¡ã³ã使ãã¦ç£è¦éå§ 422 */ 423 424 425 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(SygScrollAmount, [{ 426 key: "createObserveElement", 427 value: function createObserveElement(position) { 428 var element = document.createElement("div"); 429 Object.assign(element.style, COMMON_STYLE); 430 element.style.height = this.opt.offsetTop; 431 element.setAttribute(ATTR_POSITION, position); 432 433 if (position === "top") { 434 element.style.top = "0"; 435 } else { 436 element.style.bottom = "0"; 437 } // ãã¼ã¸æä¸é¨ã«è¿½å 438 439 440 document.body.appendChild(element); 441 return element; 442 } 443 /** 444 * ã¹ã¯ãã¼ã«æ¤ç¥å¦çãéå§ 445 */ 446 447 }, { 448 key: "start", 449 value: function start() { 450 // <body> ã« position è¨å® 451 document.body.style.position = "relative"; // IntersectionObserverã使ãã¦ç£è¦éå§ 452 453 var observer = new IntersectionObserver(this.observerCallback.bind(this), OBSERVER_OPT); // ç£è¦ç¨ã¨ã¬ã¡ã³ã使 454 455 observer.observe(this.createObserveElement("top")); 456 observer.observe(this.createObserveElement("bottom")); 457 } 458 /** 459 * ã¹ã¯ãã¼ã«å¦ç 460 * IntersectionObserver ã«åå¿ãã <div> ã top/bottom ã©ã¡ããã§å¤å®ãã 461 */ 462 463 }, { 464 key: "observerCallback", 465 value: function observerCallback(entries) { 466 var _this = this; 467 468 entries.forEach(function (entry) { 469 var position = entry.target.getAttribute(ATTR_POSITION); 470 471 if (position === "top") { 472 _this.isTop = entry.isIntersecting; 473 } else { 474 _this.isBottom = entry.isIntersecting; 475 } 476 }); // 屿§ãä»ä¸ 477 478 this.setAttribute(); 479 } 480 /** 481 * 屿§ãä»ä¸ 482 */ 483 484 }, { 485 key: "setAttribute", 486 value: function setAttribute() { 487 var state = [this.isTop ? ATTR_TOP : ATTR_NOT_TOP, this.isBottom ? ATTR_BOTTOM : ATTR_NOT_BOTTOM].join(' '); // çµæã data屿§ã«åæ ãã 488 // ååã¨åããªãåæ ããªã 489 490 if (state !== this.lastState) { 491 this.lastState = state; 492 this.targets.forEach(function (target) { 493 target.setAttribute(ATTR_NAME, state); 494 }); // ãªãã·ã§ã³é¢æ°ãå®è¡ 495 496 if (this.isTop && this.opt.onTop) { 497 this.opt.onTop(); 498 } else if (this.opt.onNotTop) { 499 this.opt.onNotTop(); 500 } 501 502 if (this.isBottom && this.opt.onBottom) { 503 this.opt.onBottom(); 504 } else if (this.opt.onNotBottom) { 505 this.opt.onNotBottom(); 506 } 507 } 508 } 509 }]); 510 511 return SygScrollAmount; 512}(); 513 514 515//# sourceMappingURL=index.js.map 516 517 518/***/ }), 519
vendor: 1,943 bytes, lines 520-575
520/***/ "./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js": 521/*!*******************************************************************************************!*\ 522 !*** ./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js ***! 523 \*******************************************************************************************/ 524/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 525 526"use strict"; 527__webpack_require__.r(__webpack_exports__); 528/* harmony export */ __webpack_require__.d(__webpack_exports__, { 529/* harmony export */ classCallCheck: function() { return /* binding */ _classCallCheck; }, 530/* harmony export */ createClass: function() { return /* binding */ _createClass; }, 531/* harmony export */ defineProperty: function() { return /* binding */ _defineProperty; } 532/* harmony export */ }); 533function _classCallCheck(instance, Constructor) { 534 if (!(instance instanceof Constructor)) { 535 throw new TypeError("Cannot call a class as a function"); 536 } 537} 538 539function _defineProperties(target, props) { 540 for (var i = 0; i < props.length; i++) { 541 var descriptor = props[i]; 542 descriptor.enumerable = descriptor.enumerable || false; 543 descriptor.configurable = true; 544 if ("value" in descriptor) descriptor.writable = true; 545 Object.defineProperty(target, descriptor.key, descriptor); 546 } 547} 548 549function _createClass(Constructor, protoProps, staticProps) { 550 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 551 if (staticProps) _defineProperties(Constructor, staticProps); 552 return Constructor; 553} 554 555function _defineProperty(obj, key, value) { 556 if (key in obj) { 557 Object.defineProperty(obj, key, { 558 value: value, 559 enumerable: true, 560 configurable: true, 561 writable: true 562 }); 563 } else { 564 obj[key] = value; 565 } 566 567 return obj; 568} 569 570 571//# sourceMappingURL=_rollupPluginBabelHelpers.js.map 572 573 574/***/ }), 575
vendor: 4,587 bytes, lines 576-713
576/***/ "./node_modules/@sygnas/scroll-inview/dist/es6/index.js": 577/*!**************************************************************!*\ 578 !*** ./node_modules/@sygnas/scroll-inview/dist/es6/index.js ***! 579 \**************************************************************/ 580/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 581 582"use strict"; 583__webpack_require__.r(__webpack_exports__); 584/* harmony export */ __webpack_require__.d(__webpack_exports__, { 585/* harmony export */ "default": function() { return /* binding */ _default; } 586/* harmony export */ }); 587/* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@sygnas/scroll-inview/dist/es6/_virtual/_rollupPluginBabelHelpers.js"); 588 589 590/** 591 * Scroll in viewport add data attribute 592 * ã¹ã¯ãã¼ã«ãã¦ãã¥ã¼ãã¼ãã«å ¥ã£ããdata屿§ãä¸ãã 593 * 594 * @author Hiroshi Fukuda <[email protected]> 595 * @license MIT 596 */ 597var ATTR_INVIEW = 'data-inview'; 598var ATTR_ROOT = 'data-inview-root'; 599var ATTR_MARGIN = 'data-inview-rootMargin'; 600var ATTR_THRESHOLD = 'data-inview-threshold'; 601var DEFAULT = { 602 root: null, 603 rootMargin: '0px', 604 threshold: 0 605}; 606/** 607 * in view controller 608 */ 609 610var _default = /*#__PURE__*/function () { 611 /** 612 * ã³ã³ã¹ãã©ã¯ã¿ 613 * ã¿ã¼ã²ããä¸è¦§ãç²¾æ»ãã¦ã data-inview-rootãdata-inview-rootMarginãdata-inview-threshold ãè¨å®ããã¦ããªãã確èªããã 614 * ä¸è¨å±æ§æ¯ã« observer ã使ããã 615 */ 616 function _default(target) { 617 var _this = this; 618 619 var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 620 621 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.classCallCheck)(this, _default); 622 623 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "onInviewFunc", undefined); 624 625 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "targetList", void 0); 626 627 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.defineProperty)(this, "opt", void 0); 628 629 this.targetList = {}; 630 this.opt = Object.assign(DEFAULT, option); 631 this.onInviewFunc = undefined; 632 document.querySelectorAll(target).forEach(function (target) { 633 _this.initTargetList(target); 634 }); 635 } 636 /** 637 * ã¿ã¼ã²ããã¨ãªãã·ã§ã³ã®ç®¡çãªã¹ãã使 638 */ 639 640 641 (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.createClass)(_default, [{ 642 key: "initTargetList", 643 value: function initTargetList(target) { 644 // ç£è¦å¯¾è±¡ã¨ã¬ã¡ã³ãã«ç¬èªæå®ãããã°ãã¡ãã使ãã 645 // ç¡ããã°ãªãã·ã§ã³è¨å®ã使ã 646 var root = target.getAttribute(ATTR_ROOT) || this.opt.root; 647 var rootMargin = target.getAttribute(ATTR_MARGIN) || this.opt.rootMargin; 648 var threshold = Number(target.getAttribute(ATTR_THRESHOLD)) || this.opt.threshold; 649 var key = "".concat(root, "-").concat(rootMargin, "-").concat(threshold); 650 651 if (key in this.targetList === false) { 652 var option = { 653 root: root, 654 rootMargin: rootMargin, 655 threshold: threshold 656 }; 657 var observer = new IntersectionObserver(this.observerCallback.bind(this), option); 658 this.targetList[key] = { 659 list: [], 660 observer: observer 661 }; 662 } 663 664 this.targetList[key].list.push(target); 665 } 666 /** 667 * ã¹ã¯ãã¼ã«æ¤ç¥å¦çãéå§ 668 */ 669 670 }, { 671 key: "start", 672 value: function start() { 673 var _this2 = this; 674 675 Object.keys(this.targetList).forEach(function (key) { 676 var targetObj = _this2.targetList[key]; 677 targetObj.list.forEach(function (target) { 678 targetObj.observer.observe(target); 679 }); 680 }); 681 } 682 /** 683 * ç»é¢ã«å ¥ã£ãã ATTR_INVIEW ã®data屿§ã« true ãå ¥ããã 684 * ãªãã¶ã¼ãã¼ããç£è¦è§£é¤ãããã 685 */ 686 687 }, { 688 key: "observerCallback", 689 value: function observerCallback(entries, observer) { 690 var _this3 = this; 691 692 entries.forEach(function (entry) { 693 if (!entry.isIntersecting) return; // inviewããæã«å®è¡ããå¤é¨é¢æ° 694 695 if (_this3.onInviewFunc) { 696 _this3.onInviewFunc(entry.target); 697 } 698 699 observer.unobserve(entry.target); 700 entry.target.setAttribute(ATTR_INVIEW, 'true'); 701 }); 702 } 703 }]); 704 705 return _default; 706}(); 707 708 709//# sourceMappingURL=index.js.map 710 711 712/***/ }), 713
vendor: 9,671 bytes, lines 714-968
714/***/ "./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js": 715/*!***********************************************************!*\ 716 !*** ./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js ***! 717 \***********************************************************/ 718/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 719 720"use strict"; 721__webpack_require__.r(__webpack_exports__); 722/* harmony export */ __webpack_require__.d(__webpack_exports__, { 723/* harmony export */ VueTabs: function() { return /* binding */ _sfc_main$1; }, 724/* harmony export */ VueTabsContent: function() { return /* binding */ _sfc_main; }, 725/* harmony export */ useTabControl: function() { return /* binding */ useTabControl; } 726/* harmony export */ }); 727/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js"); 728 729 730const _hoisted_1$1 = ["target", "rel", "href", "data-active"]; 731const _hoisted_2 = ["target", "rel", "href", "data-active"]; 732const _sfc_main$2 = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({ 733 props: { 734 activeId: null, 735 id: null, 736 href: null, 737 isBlank: { type: Boolean }, 738 classItem: null, 739 classLink: null, 740 isListTag: { type: Boolean }, 741 handlClick: null 742 }, 743 setup(__props) { 744 const props = __props; 745 const isActive = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => { 746 if (props.href) 747 return false; 748 if (props.activeId === props.id) 749 return true; 750 return false; 751 }); 752 const clickLink = (e) => { 753 if (props.href) 754 return true; 755 props.handlClick(props.id); 756 e.preventDefault(); 757 }; 758 return (_ctx, _cache) => { 759 return props.isListTag ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("li", { 760 key: 0, 761 class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classItem) 762 }, [ 763 (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", { 764 target: props.isBlank ? "_blank" : "", 765 rel: props.isBlank ? "noopener noreferrer" : "", 766 href: props.href, 767 class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classLink), 768 "data-active": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(isActive) ? "true" : "", 769 onClick: clickLink 770 }, [ 771 (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default") 772 ], 10, _hoisted_1$1) 773 ], 2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("a", { 774 key: 1, 775 target: props.isBlank ? "_blank" : "", 776 rel: props.isBlank ? "noopener noreferrer" : "", 777 href: props.href, 778 class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classLink), 779 "data-active": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(isActive) ? "true" : "", 780 onClick: clickLink 781 }, [ 782 (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default") 783 ], 10, _hoisted_2)); 784 }; 785 } 786}); 787 788const EV_CHANGE = "change"; 789const EV_CLICK = "click"; 790const tabGroups = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)([]); 791const $_getGroup = (groupId) => { 792 const group = tabGroups.value.find((group2) => group2.groupId === groupId); 793 if (group) 794 return group; 795 const newGroup = { 796 groupId, 797 activeId: "", 798 tabIdList: [], 799 intervalId: 0, 800 events: new EventTarget() 801 }; 802 tabGroups.value.push(newGroup); 803 return tabGroups.value.find((group2) => group2.groupId === groupId); 804}; 805function useTabControl(groupId, isMaster = false, useHash = false) { 806 return (() => { 807 const $_group = $_getGroup(groupId); 808 const activeId = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => { 809 return $_group.activeId; 810 }); 811 const activeIndex = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => { 812 return $_group.tabIdList.indexOf($_group.activeId); 813 }); 814 const setActiveId = (activeId2, isTabClick = false) => { 815 $_group.activeId = activeId2; 816 if (isTabClick) { 817 const event = new CustomEvent(EV_CLICK, { detail: activeId2 }); 818 $_group.events.dispatchEvent(event); 819 } 820 }; 821 const setTabIdList = (idList) => { 822 $_group.tabIdList = idList; 823 }; 824 const changeNextTab = () => { 825 const nextIndex = (activeIndex.value + 1) % $_group.tabIdList.length; 826 setActiveId($_group.tabIdList[nextIndex]); 827 }; 828 const changePrevTab = () => { 829 const index = activeIndex.value - 1; 830 const prevIndex = index <= -1 ? $_group.tabIdList.length - 1 : index; 831 setActiveId($_group.tabIdList[prevIndex]); 832 }; 833 const addChangeListener = (func) => { 834 $_group.events.addEventListener(EV_CHANGE, func); 835 }; 836 const addClickListener = (func) => { 837 $_group.events.addEventListener(EV_CLICK, func); 838 }; 839 const startAutoChange = (time) => { 840 $_group.intervalId = setInterval(() => { 841 changeNextTab(); 842 }, time); 843 }; 844 const stopAutoChange = () => { 845 clearInterval($_group.intervalId); 846 }; 847 (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(activeId, () => { 848 if (isMaster) { 849 const event = new CustomEvent(EV_CHANGE, { detail: activeId.value }); 850 $_group.events.dispatchEvent(event); 851 } 852 if (useHash && isMaster) { 853 location.hash = activeId.value; 854 } 855 }); 856 return { 857 activeId, 858 activeIndex, 859 setActiveId, 860 setTabIdList, 861 changeNextTab, 862 changePrevTab, 863 startAutoChange, 864 stopAutoChange, 865 addChangeListener, 866 addClickListener 867 }; 868 })(); 869} 870 871const _hoisted_1 = ["innerHTML"]; 872const _sfc_main$1 = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({ 873 props: { 874 group: null, 875 default: { default: "" }, 876 items: null, 877 useHash: { type: Boolean, default: false }, 878 isListTag: { type: Boolean, default: false }, 879 auto: null, 880 isStopAuto: { type: Boolean }, 881 classTabs: { default: "c-tabmenu" }, 882 classItem: { default: "c-tabmenu__item" }, 883 classLink: { default: "c-tabmenu__link" } 884 }, 885 setup(__props) { 886 const props = __props; 887 const tabControl = useTabControl(props.group, true, props.useHash); 888 const itemClicked = (id) => { 889 if (id === tabControl.activeId.value) 890 return; 891 tabControl.setActiveId(id, true); 892 if (props.isStopAuto) { 893 tabControl.stopAutoChange(); 894 } 895 }; 896 (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => { 897 const idList = props.items.filter((item) => item.id).map((item) => item.id); 898 tabControl.setTabIdList(idList); 899 if (props.useHash && location.hash) { 900 tabControl.setActiveId(location.hash.substr(1)); 901 } else { 902 tabControl.setActiveId(props.default); 903 } 904 if (props.auto && props.auto >= 1) { 905 tabControl.startAutoChange(props.auto); 906 } 907 }); 908 (0,vue__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => { 909 tabControl.stopAutoChange(); 910 }); 911 return (_ctx, _cache) => { 912 return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.isListTag ? "ul" : "div"), { 913 class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(props.classTabs) 914 }, { 915 default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [ 916 ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(props.items, (item, index) => { 917 return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_sfc_main$2, { 918 id: item.id, 919 key: index, 920 "active-id": (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(tabControl).activeId.value, 921 href: item.href || "", 922 "is-blank": item.isBlank || false, 923 "class-item": props.classItem, 924 "class-link": props.classLink, 925 "is-list-tag": props.isListTag, 926 "handl-click": itemClicked 927 }, { 928 default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [ 929 (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", { 930 innerHTML: item.value 931 }, null, 8, _hoisted_1) 932 ]), 933 _: 2 934 }, 1032, ["id", "active-id", "href", "is-blank", "class-item", "class-link", "is-list-tag"]); 935 }), 128)) 936 ]), 937 _: 1 938 }, 8, ["class"]); 939 }; 940 } 941}); 942 943const _sfc_main = /* @__PURE__ */ (0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({ 944 props: { 945 group: null, 946 tabId: null, 947 tag: { default: "div" } 948 }, 949 setup(__props) { 950 const props = __props; 951 const tabControl = useTabControl(props.group); 952 return (_ctx, _cache) => { 953 return props.tabId === (0,vue__WEBPACK_IMPORTED_MODULE_0__.unref)(tabControl).activeId.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)((0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent)(props.tag), { key: 0 }, { 954 default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [ 955 (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderSlot)(_ctx.$slots, "default") 956 ]), 957 _: 3 958 })) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("", true); 959 }; 960 } 961}); 962 963 964//# sourceMappingURL=vue-tabs.es.js.map 965 966 967/***/ }), 968
vendor: 180,146 bytes, lines 969-6779
969/***/ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js": 970/*!***************************************************************************!*\ 971 !*** ./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js ***! 972 \***************************************************************************/ 973/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 974 975"use strict"; 976__webpack_require__.r(__webpack_exports__); 977/* harmony export */ __webpack_require__.d(__webpack_exports__, { 978/* harmony export */ BASE_TRANSITION: function() { return /* binding */ BASE_TRANSITION; }, 979/* harmony export */ BindingTypes: function() { return /* binding */ BindingTypes; }, 980/* harmony export */ CAMELIZE: function() { return /* binding */ CAMELIZE; }, 981/* harmony export */ CAPITALIZE: function() { return /* binding */ CAPITALIZE; }, 982/* harmony export */ CREATE_BLOCK: function() { return /* binding */ CREATE_BLOCK; }, 983/* harmony export */ CREATE_COMMENT: function() { return /* binding */ CREATE_COMMENT; }, 984/* harmony export */ CREATE_ELEMENT_BLOCK: function() { return /* binding */ CREATE_ELEMENT_BLOCK; }, 985/* harmony export */ CREATE_ELEMENT_VNODE: function() { return /* binding */ CREATE_ELEMENT_VNODE; }, 986/* harmony export */ CREATE_SLOTS: function() { return /* binding */ CREATE_SLOTS; }, 987/* harmony export */ CREATE_STATIC: function() { return /* binding */ CREATE_STATIC; }, 988/* harmony export */ CREATE_TEXT: function() { return /* binding */ CREATE_TEXT; }, 989/* harmony export */ CREATE_VNODE: function() { return /* binding */ CREATE_VNODE; }, 990/* harmony export */ CompilerDeprecationTypes: function() { return /* binding */ CompilerDeprecationTypes; }, 991/* harmony export */ ConstantTypes: function() { return /* binding */ ConstantTypes; }, 992/* harmony export */ ElementTypes: function() { return /* binding */ ElementTypes; }, 993/* harmony export */ ErrorCodes: function() { return /* binding */ ErrorCodes; }, 994/* harmony export */ FRAGMENT: function() { return /* binding */ FRAGMENT; }, 995/* harmony export */ GUARD_REACTIVE_PROPS: function() { return /* binding */ GUARD_REACTIVE_PROPS; }, 996/* harmony export */ IS_MEMO_SAME: function() { return /* binding */ IS_MEMO_SAME; }, 997/* harmony export */ IS_REF: function() { return /* binding */ IS_REF; }, 998/* harmony export */ KEEP_ALIVE: function() { return /* binding */ KEEP_ALIVE; }, 999/* harmony export */ MERGE_PROPS: function() { return /* binding */ MERGE_PROPS; }, 1000/* harmony export */ NORMALIZE_CLASS: function() { return /* binding */ NORMALIZE_CLASS; }, 1001/* harmony export */ NORMALIZE_PROPS: function() { return /* binding */ NORMALIZE_PROPS; }, 1002/* harmony export */ NORMALIZE_STYLE: function() { return /* binding */ NORMALIZE_STYLE; }, 1003/* harmony export */ Namespaces: function() { return /* binding */ Namespaces; }, 1004/* harmony export */ NodeTypes: function() { return /* binding */ NodeTypes; }, 1005/* harmony export */ OPEN_BLOCK: function() { return /* binding */ OPEN_BLOCK; }, 1006/* harmony export */ POP_SCOPE_ID: function() { return /* binding */ POP_SCOPE_ID; }, 1007/* harmony export */ PUSH_SCOPE_ID: function() { return /* binding */ PUSH_SCOPE_ID; }, 1008/* harmony export */ RENDER_LIST: function() { return /* binding */ RENDER_LIST; }, 1009/* harmony export */ RENDER_SLOT: function() { return /* binding */ RENDER_SLOT; }, 1010/* harmony export */ RESOLVE_COMPONENT: function() { return /* binding */ RESOLVE_COMPONENT; }, 1011/* harmony export */ RESOLVE_DIRECTIVE: function() { return /* binding */ RESOLVE_DIRECTIVE; }, 1012/* harmony export */ RESOLVE_DYNAMIC_COMPONENT: function() { return /* binding */ RESOLVE_DYNAMIC_COMPONENT; }, 1013/* harmony export */ RESOLVE_FILTER: function() { return /* binding */ RESOLVE_FILTER; }, 1014/* harmony export */ SET_BLOCK_TRACKING: function() { return /* binding */ SET_BLOCK_TRACKING; }, 1015/* harmony export */ SUSPENSE: function() { return /* binding */ SUSPENSE; }, 1016/* harmony export */ TELEPORT: function() { return /* binding */ TELEPORT; }, 1017/* harmony export */ TO_DISPLAY_STRING: function() { return /* binding */ TO_DISPLAY_STRING; }, 1018/* harmony export */ TO_HANDLERS: function() { return /* binding */ TO_HANDLERS; }, 1019/* harmony export */ TO_HANDLER_KEY: function() { return /* binding */ TO_HANDLER_KEY; }, 1020/* harmony export */ TS_NODE_TYPES: function() { return /* binding */ TS_NODE_TYPES; }, 1021/* harmony export */ UNREF: function() { return /* binding */ UNREF; }, 1022/* harmony export */ WITH_CTX: function() { return /* binding */ WITH_CTX; }, 1023/* harmony export */ WITH_DIRECTIVES: function() { return /* binding */ WITH_DIRECTIVES; }, 1024/* harmony export */ WITH_MEMO: function() { return /* binding */ WITH_MEMO; }, 1025/* harmony export */ advancePositionWithClone: function() { return /* binding */ advancePositionWithClone; }, 1026/* harmony export */ advancePositionWithMutation: function() { return /* binding */ advancePositionWithMutation; }, 1027/* harmony export */ assert: function() { return /* binding */ assert; }, 1028/* harmony export */ baseCompile: function() { return /* binding */ baseCompile; }, 1029/* harmony export */ baseParse: function() { return /* binding */ baseParse; }, 1030/* harmony export */ buildDirectiveArgs: function() { return /* binding */ buildDirectiveArgs; }, 1031/* harmony export */ buildProps: function() { return /* binding */ buildProps; }, 1032/* harmony export */ buildSlots: function() { return /* binding */ buildSlots; }, 1033/* harmony export */ checkCompatEnabled: function() { return /* binding */ checkCompatEnabled; }, 1034/* harmony export */ convertToBlock: function() { return /* binding */ convertToBlock; }, 1035/* harmony export */ createArrayExpression: function() { return /* binding */ createArrayExpression; }, 1036/* harmony export */ createAssignmentExpression: function() { return /* binding */ createAssignmentExpression; }, 1037/* harmony export */ createBlockStatement: function() { return /* binding */ createBlockStatement; }, 1038/* harmony export */ createCacheExpression: function() { return /* binding */ createCacheExpression; }, 1039/* harmony export */ createCallExpression: function() { return /* binding */ createCallExpression; }, 1040/* harmony export */ createCompilerError: function() { return /* binding */ createCompilerError; }, 1041/* harmony export */ createCompoundExpression: function() { return /* binding */ createCompoundExpression; }, 1042/* harmony export */ createConditionalExpression: function() { return /* binding */ createConditionalExpression; }, 1043/* harmony export */ createForLoopParams: function() { return /* binding */ createForLoopParams; }, 1044/* harmony export */ createFunctionExpression: function() { return /* binding */ createFunctionExpression; }, 1045/* harmony export */ createIfStatement: function() { return /* binding */ createIfStatement; }, 1046/* harmony export */ createInterpolation: function() { return /* binding */ createInterpolation; }, 1047/* harmony export */ createObjectExpression: function() { return /* binding */ createObjectExpression; }, 1048/* harmony export */ createObjectProperty: function() { return /* binding */ createObjectProperty; }, 1049/* harmony export */ createReturnStatement: function() { return /* binding */ createReturnStatement; }, 1050/* harmony export */ createRoot: function() { return /* binding */ createRoot; }, 1051/* harmony export */ createSequenceExpression: function() { return /* binding */ createSequenceExpression; }, 1052/* harmony export */ createSimpleExpression: function() { return /* binding */ createSimpleExpression; }, 1053/* harmony export */ createStructuralDirectiveTransform: function() { return /* binding */ createStructuralDirectiveTransform; }, 1054/* harmony export */ createTemplateLiteral: function() { return /* binding */ createTemplateLiteral; }, 1055/* harmony export */ createTransformContext: function() { return /* binding */ createTransformContext; }, 1056/* harmony export */ createVNodeCall: function() { return /* binding */ createVNodeCall; }, 1057/* harmony export */ errorMessages: function() { return /* binding */ errorMessages; }, 1058/* harmony export */ extractIdentifiers: function() { return /* binding */ extractIdentifiers; }, 1059/* harmony export */ findDir: function() { return /* binding */ findDir; }, 1060/* harmony export */ findProp: function() { return /* binding */ findProp; }, 1061/* harmony export */ forAliasRE: function() { return /* binding */ forAliasRE; }, 1062/* harmony export */ generate: function() { return /* binding */ generate; }, 1063/* harmony export */ generateCodeFrame: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame; }, 1064/* harmony export */ getBaseTransformPreset: function() { return /* binding */ getBaseTransformPreset; }, 1065/* harmony export */ getConstantType: function() { return /* binding */ getConstantType; }, 1066/* harmony export */ getMemoedVNodeCall: function() { return /* binding */ getMemoedVNodeCall; }, 1067/* harmony export */ getVNodeBlockHelper: function() { return /* binding */ getVNodeBlockHelper; }, 1068/* harmony export */ getVNodeHelper: function() { return /* binding */ getVNodeHelper; }, 1069/* harmony export */ hasDynamicKeyVBind: function() { return /* binding */ hasDynamicKeyVBind; }, 1070/* harmony export */ hasScopeRef: function() { return /* binding */ hasScopeRef; }, 1071/* harmony export */ helperNameMap: function() { return /* binding */ helperNameMap; }, 1072/* harmony export */ injectProp: function() { return /* binding */ injectProp; }, 1073/* harmony export */ isCoreComponent: function() { return /* binding */ isCoreComponent; }, 1074/* harmony export */ isFunctionType: function() { return /* binding */ isFunctionType; }, 1075/* harmony export */ isInDestructureAssignment: function() { return /* binding */ isInDestructureAssignment; }, 1076/* harmony export */ isInNewExpression: function() { return /* binding */ isInNewExpression; }, 1077/* harmony export */ isMemberExpression: function() { return /* binding */ isMemberExpression; }, 1078/* harmony export */ isMemberExpressionBrowser: function() { return /* binding */ isMemberExpressionBrowser; }, 1079/* harmony export */ isMemberExpressionNode: function() { return /* binding */ isMemberExpressionNode; }, 1080/* harmony export */ isReferencedIdentifier: function() { return /* binding */ isReferencedIdentifier; }, 1081/* harmony export */ isSimpleIdentifier: function() { return /* binding */ isSimpleIdentifier; }, 1082/* harmony export */ isSlotOutlet: function() { return /* binding */ isSlotOutlet; }, 1083/* harmony export */ isStaticArgOf: function() { return /* binding */ isStaticArgOf; }, 1084/* harmony export */ isStaticExp: function() { return /* binding */ isStaticExp; }, 1085/* harmony export */ isStaticProperty: function() { return /* binding */ isStaticProperty; }, 1086/* harmony export */ isStaticPropertyKey: function() { return /* binding */ isStaticPropertyKey; }, 1087/* harmony export */ isTemplateNode: function() { return /* binding */ isTemplateNode; }, 1088/* harmony export */ isText: function() { return /* binding */ isText$1; }, 1089/* harmony export */ isVSlot: function() { return /* binding */ isVSlot; }, 1090/* harmony export */ locStub: function() { return /* binding */ locStub; }, 1091/* harmony export */ noopDirectiveTransform: function() { return /* binding */ noopDirectiveTransform; }, 1092/* harmony export */ processExpression: function() { return /* binding */ processExpression; }, 1093/* harmony export */ processFor: function() { return /* binding */ processFor; }, 1094/* harmony export */ processIf: function() { return /* binding */ processIf; }, 1095/* harmony export */ processSlotOutlet: function() { return /* binding */ processSlotOutlet; }, 1096/* harmony export */ registerRuntimeHelpers: function() { return /* binding */ registerRuntimeHelpers; }, 1097/* harmony export */ resolveComponentType: function() { return /* binding */ resolveComponentType; }, 1098/* harmony export */ stringifyExpression: function() { return /* binding */ stringifyExpression; }, 1099/* harmony export */ toValidAssetId: function() { return /* binding */ toValidAssetId; }, 1100/* harmony export */ trackSlotScopes: function() { return /* binding */ trackSlotScopes; }, 1101/* harmony export */ trackVForSlotScopes: function() { return /* binding */ trackVForSlotScopes; }, 1102/* harmony export */ transform: function() { return /* binding */ transform; }, 1103/* harmony export */ transformBind: function() { return /* binding */ transformBind; }, 1104/* harmony export */ transformElement: function() { return /* binding */ transformElement; }, 1105/* harmony export */ transformExpression: function() { return /* binding */ transformExpression; }, 1106/* harmony export */ transformModel: function() { return /* binding */ transformModel; }, 1107/* harmony export */ transformOn: function() { return /* binding */ transformOn; }, 1108/* harmony export */ traverseNode: function() { return /* binding */ traverseNode; }, 1109/* harmony export */ unwrapTSNode: function() { return /* binding */ unwrapTSNode; }, 1110/* harmony export */ walkBlockDeclarations: function() { return /* binding */ walkBlockDeclarations; }, 1111/* harmony export */ walkFunctionParams: function() { return /* binding */ walkFunctionParams; }, 1112/* harmony export */ walkIdentifiers: function() { return /* binding */ walkIdentifiers; }, 1113/* harmony export */ warnDeprecation: function() { return /* binding */ warnDeprecation; } 1114/* harmony export */ }); 1115/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 1116/** 1117* @vue/compiler-core v3.4.34 1118* (c) 2018-present Yuxi (Evan) You and Vue contributors 1119* @license MIT 1120**/ 1121 1122 1123 1124const FRAGMENT = Symbol( true ? `Fragment` : 0); 1125const TELEPORT = Symbol( true ? `Teleport` : 0); 1126const SUSPENSE = Symbol( true ? `Suspense` : 0); 1127const KEEP_ALIVE = Symbol( true ? `KeepAlive` : 0); 1128const BASE_TRANSITION = Symbol( true ? `BaseTransition` : 0); 1129const OPEN_BLOCK = Symbol( true ? `openBlock` : 0); 1130const CREATE_BLOCK = Symbol( true ? `createBlock` : 0); 1131const CREATE_ELEMENT_BLOCK = Symbol( true ? `createElementBlock` : 0); 1132const CREATE_VNODE = Symbol( true ? `createVNode` : 0); 1133const CREATE_ELEMENT_VNODE = Symbol( true ? `createElementVNode` : 0); 1134const CREATE_COMMENT = Symbol( true ? `createCommentVNode` : 0); 1135const CREATE_TEXT = Symbol( true ? `createTextVNode` : 0); 1136const CREATE_STATIC = Symbol( true ? `createStaticVNode` : 0); 1137const RESOLVE_COMPONENT = Symbol( true ? `resolveComponent` : 0); 1138const RESOLVE_DYNAMIC_COMPONENT = Symbol( 1139 true ? `resolveDynamicComponent` : 0 1140); 1141const RESOLVE_DIRECTIVE = Symbol( true ? `resolveDirective` : 0); 1142const RESOLVE_FILTER = Symbol( true ? `resolveFilter` : 0); 1143const WITH_DIRECTIVES = Symbol( true ? `withDirectives` : 0); 1144const RENDER_LIST = Symbol( true ? `renderList` : 0); 1145const RENDER_SLOT = Symbol( true ? `renderSlot` : 0); 1146const CREATE_SLOTS = Symbol( true ? `createSlots` : 0); 1147const TO_DISPLAY_STRING = Symbol( true ? `toDisplayString` : 0); 1148const MERGE_PROPS = Symbol( true ? `mergeProps` : 0); 1149const NORMALIZE_CLASS = Symbol( true ? `normalizeClass` : 0); 1150const NORMALIZE_STYLE = Symbol( true ? `normalizeStyle` : 0); 1151const NORMALIZE_PROPS = Symbol( true ? `normalizeProps` : 0); 1152const GUARD_REACTIVE_PROPS = Symbol( true ? `guardReactiveProps` : 0); 1153const TO_HANDLERS = Symbol( true ? `toHandlers` : 0); 1154const CAMELIZE = Symbol( true ? `camelize` : 0); 1155const CAPITALIZE = Symbol( true ? `capitalize` : 0); 1156const TO_HANDLER_KEY = Symbol( true ? `toHandlerKey` : 0); 1157const SET_BLOCK_TRACKING = Symbol( true ? `setBlockTracking` : 0); 1158const PUSH_SCOPE_ID = Symbol( true ? `pushScopeId` : 0); 1159const POP_SCOPE_ID = Symbol( true ? `popScopeId` : 0); 1160const WITH_CTX = Symbol( true ? `withCtx` : 0); 1161const UNREF = Symbol( true ? `unref` : 0); 1162const IS_REF = Symbol( true ? `isRef` : 0); 1163const WITH_MEMO = Symbol( true ? `withMemo` : 0); 1164const IS_MEMO_SAME = Symbol( true ? `isMemoSame` : 0); 1165const helperNameMap = { 1166 [FRAGMENT]: `Fragment`, 1167 [TELEPORT]: `Teleport`, 1168 [SUSPENSE]: `Suspense`, 1169 [KEEP_ALIVE]: `KeepAlive`, 1170 [BASE_TRANSITION]: `BaseTransition`, 1171 [OPEN_BLOCK]: `openBlock`, 1172 [CREATE_BLOCK]: `createBlock`, 1173 [CREATE_ELEMENT_BLOCK]: `createElementBlock`, 1174 [CREATE_VNODE]: `createVNode`, 1175 [CREATE_ELEMENT_VNODE]: `createElementVNode`, 1176 [CREATE_COMMENT]: `createCommentVNode`, 1177 [CREATE_TEXT]: `createTextVNode`, 1178 [CREATE_STATIC]: `createStaticVNode`, 1179 [RESOLVE_COMPONENT]: `resolveComponent`, 1180 [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`, 1181 [RESOLVE_DIRECTIVE]: `resolveDirective`, 1182 [RESOLVE_FILTER]: `resolveFilter`, 1183 [WITH_DIRECTIVES]: `withDirectives`, 1184 [RENDER_LIST]: `renderList`, 1185 [RENDER_SLOT]: `renderSlot`, 1186 [CREATE_SLOTS]: `createSlots`, 1187 [TO_DISPLAY_STRING]: `toDisplayString`, 1188 [MERGE_PROPS]: `mergeProps`, 1189 [NORMALIZE_CLASS]: `normalizeClass`, 1190 [NORMALIZE_STYLE]: `normalizeStyle`, 1191 [NORMALIZE_PROPS]: `normalizeProps`, 1192 [GUARD_REACTIVE_PROPS]: `guardReactiveProps`, 1193 [TO_HANDLERS]: `toHandlers`, 1194 [CAMELIZE]: `camelize`, 1195 [CAPITALIZE]: `capitalize`, 1196 [TO_HANDLER_KEY]: `toHandlerKey`, 1197 [SET_BLOCK_TRACKING]: `setBlockTracking`, 1198 [PUSH_SCOPE_ID]: `pushScopeId`, 1199 [POP_SCOPE_ID]: `popScopeId`, 1200 [WITH_CTX]: `withCtx`, 1201 [UNREF]: `unref`, 1202 [IS_REF]: `isRef`, 1203 [WITH_MEMO]: `withMemo`, 1204 [IS_MEMO_SAME]: `isMemoSame` 1205}; 1206function registerRuntimeHelpers(helpers) { 1207 Object.getOwnPropertySymbols(helpers).forEach((s) => { 1208 helperNameMap[s] = helpers[s]; 1209 }); 1210} 1211 1212const Namespaces = { 1213 "HTML": 0, 1214 "0": "HTML", 1215 "SVG": 1, 1216 "1": "SVG", 1217 "MATH_ML": 2, 1218 "2": "MATH_ML" 1219}; 1220const NodeTypes = { 1221 "ROOT": 0, 1222 "0": "ROOT", 1223 "ELEMENT": 1, 1224 "1": "ELEMENT", 1225 "TEXT": 2, 1226 "2": "TEXT", 1227 "COMMENT": 3, 1228 "3": "COMMENT", 1229 "SIMPLE_EXPRESSION": 4, 1230 "4": "SIMPLE_EXPRESSION", 1231 "INTERPOLATION": 5, 1232 "5": "INTERPOLATION", 1233 "ATTRIBUTE": 6, 1234 "6": "ATTRIBUTE", 1235 "DIRECTIVE": 7, 1236 "7": "DIRECTIVE", 1237 "COMPOUND_EXPRESSION": 8, 1238 "8": "COMPOUND_EXPRESSION", 1239 "IF": 9, 1240 "9": "IF", 1241 "IF_BRANCH": 10, 1242 "10": "IF_BRANCH", 1243 "FOR": 11, 1244 "11": "FOR", 1245 "TEXT_CALL": 12, 1246 "12": "TEXT_CALL", 1247 "VNODE_CALL": 13, 1248 "13": "VNODE_CALL", 1249 "JS_CALL_EXPRESSION": 14, 1250 "14": "JS_CALL_EXPRESSION", 1251 "JS_OBJECT_EXPRESSION": 15, 1252 "15": "JS_OBJECT_EXPRESSION", 1253 "JS_PROPERTY": 16, 1254 "16": "JS_PROPERTY", 1255 "JS_ARRAY_EXPRESSION": 17, 1256 "17": "JS_ARRAY_EXPRESSION", 1257 "JS_FUNCTION_EXPRESSION": 18, 1258 "18": "JS_FUNCTION_EXPRESSION", 1259 "JS_CONDITIONAL_EXPRESSION": 19, 1260 "19": "JS_CONDITIONAL_EXPRESSION", 1261 "JS_CACHE_EXPRESSION": 20, 1262 "20": "JS_CACHE_EXPRESSION", 1263 "JS_BLOCK_STATEMENT": 21, 1264 "21": "JS_BLOCK_STATEMENT", 1265 "JS_TEMPLATE_LITERAL": 22, 1266 "22": "JS_TEMPLATE_LITERAL", 1267 "JS_IF_STATEMENT": 23, 1268 "23": "JS_IF_STATEMENT", 1269 "JS_ASSIGNMENT_EXPRESSION": 24, 1270 "24": "JS_ASSIGNMENT_EXPRESSION", 1271 "JS_SEQUENCE_EXPRESSION": 25, 1272 "25": "JS_SEQUENCE_EXPRESSION", 1273 "JS_RETURN_STATEMENT": 26, 1274 "26": "JS_RETURN_STATEMENT" 1275}; 1276const ElementTypes = { 1277 "ELEMENT": 0, 1278 "0": "ELEMENT", 1279 "COMPONENT": 1, 1280 "1": "COMPONENT", 1281 "SLOT": 2, 1282 "2": "SLOT", 1283 "TEMPLATE": 3, 1284 "3": "TEMPLATE" 1285}; 1286const ConstantTypes = { 1287 "NOT_CONSTANT": 0, 1288 "0": "NOT_CONSTANT", 1289 "CAN_SKIP_PATCH": 1, 1290 "1": "CAN_SKIP_PATCH", 1291 "CAN_HOIST": 2, 1292 "2": "CAN_HOIST", 1293 "CAN_STRINGIFY": 3, 1294 "3": "CAN_STRINGIFY" 1295}; 1296const locStub = { 1297 start: { line: 1, column: 1, offset: 0 }, 1298 end: { line: 1, column: 1, offset: 0 }, 1299 source: "" 1300}; 1301function createRoot(children, source = "") { 1302 return { 1303 type: 0, 1304 source, 1305 children, 1306 helpers: /* @__PURE__ */ new Set(), 1307 components: [], 1308 directives: [], 1309 hoists: [], 1310 imports: [], 1311 cached: 0, 1312 temps: 0, 1313 codegenNode: void 0, 1314 loc: locStub 1315 }; 1316} 1317function createVNodeCall(context, tag, props, children, patchFlag, dynamicProps, directives, isBlock = false, disableTracking = false, isComponent = false, loc = locStub) { 1318 if (context) { 1319 if (isBlock) { 1320 context.helper(OPEN_BLOCK); 1321 context.helper(getVNodeBlockHelper(context.inSSR, isComponent)); 1322 } else { 1323 context.helper(getVNodeHelper(context.inSSR, isComponent)); 1324 } 1325 if (directives) { 1326 context.helper(WITH_DIRECTIVES); 1327 } 1328 } 1329 return { 1330 type: 13, 1331 tag, 1332 props, 1333 children, 1334 patchFlag, 1335 dynamicProps, 1336 directives, 1337 isBlock, 1338 disableTracking, 1339 isComponent, 1340 loc 1341 }; 1342} 1343function createArrayExpression(elements, loc = locStub) { 1344 return { 1345 type: 17, 1346 loc, 1347 elements 1348 }; 1349} 1350function createObjectExpression(properties, loc = locStub) { 1351 return { 1352 type: 15, 1353 loc, 1354 properties 1355 }; 1356} 1357function createObjectProperty(key, value) { 1358 return { 1359 type: 16, 1360 loc: locStub, 1361 key: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(key) ? createSimpleExpression(key, true) : key, 1362 value 1363 }; 1364} 1365function createSimpleExpression(content, isStatic = false, loc = locStub, constType = 0) { 1366 return { 1367 type: 4, 1368 loc, 1369 content, 1370 isStatic, 1371 constType: isStatic ? 3 : constType 1372 }; 1373} 1374function createInterpolation(content, loc) { 1375 return { 1376 type: 5, 1377 loc, 1378 content: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(content) ? createSimpleExpression(content, false, loc) : content 1379 }; 1380} 1381function createCompoundExpression(children, loc = locStub) { 1382 return { 1383 type: 8, 1384 loc, 1385 children 1386 }; 1387} 1388function createCallExpression(callee, args = [], loc = locStub) { 1389 return { 1390 type: 14, 1391 loc, 1392 callee, 1393 arguments: args 1394 }; 1395} 1396function createFunctionExpression(params, returns = void 0, newline = false, isSlot = false, loc = locStub) { 1397 return { 1398 type: 18, 1399 params, 1400 returns, 1401 newline, 1402 isSlot, 1403 loc 1404 }; 1405} 1406function createConditionalExpression(test, consequent, alternate, newline = true) { 1407 return { 1408 type: 19, 1409 test, 1410 consequent, 1411 alternate, 1412 newline, 1413 loc: locStub 1414 }; 1415} 1416function createCacheExpression(index, value, isVOnce = false) { 1417 return { 1418 type: 20, 1419 index, 1420 value, 1421 isVOnce, 1422 loc: locStub 1423 }; 1424} 1425function createBlockStatement(body) { 1426 return { 1427 type: 21, 1428 body, 1429 loc: locStub 1430 }; 1431} 1432function createTemplateLiteral(elements) { 1433 return { 1434 type: 22, 1435 elements, 1436 loc: locStub 1437 }; 1438} 1439function createIfStatement(test, consequent, alternate) { 1440 return { 1441 type: 23, 1442 test, 1443 consequent, 1444 alternate, 1445 loc: locStub 1446 }; 1447} 1448function createAssignmentExpression(left, right) { 1449 return { 1450 type: 24, 1451 left, 1452 right, 1453 loc: locStub 1454 }; 1455} 1456function createSequenceExpression(expressions) { 1457 return { 1458 type: 25, 1459 expressions, 1460 loc: locStub 1461 }; 1462} 1463function createReturnStatement(returns) { 1464 return { 1465 type: 26, 1466 returns, 1467 loc: locStub 1468 }; 1469} 1470function getVNodeHelper(ssr, isComponent) { 1471 return ssr || isComponent ? CREATE_VNODE : CREATE_ELEMENT_VNODE; 1472} 1473function getVNodeBlockHelper(ssr, isComponent) { 1474 return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK; 1475} 1476function convertToBlock(node, { helper, removeHelper, inSSR }) { 1477 if (!node.isBlock) { 1478 node.isBlock = true; 1479 removeHelper(getVNodeHelper(inSSR, node.isComponent)); 1480 helper(OPEN_BLOCK); 1481 helper(getVNodeBlockHelper(inSSR, node.isComponent)); 1482 } 1483} 1484 1485const defaultDelimitersOpen = new Uint8Array([123, 123]); 1486const defaultDelimitersClose = new Uint8Array([125, 125]); 1487function isTagStartChar(c) { 1488 return c >= 97 && c <= 122 || c >= 65 && c <= 90; 1489} 1490function isWhitespace(c) { 1491 return c === 32 || c === 10 || c === 9 || c === 12 || c === 13; 1492} 1493function isEndOfTagSection(c) { 1494 return c === 47 || c === 62 || isWhitespace(c); 1495} 1496function toCharCodes(str) { 1497 const ret = new Uint8Array(str.length); 1498 for (let i = 0; i < str.length; i++) { 1499 ret[i] = str.charCodeAt(i); 1500 } 1501 return ret; 1502} 1503const Sequences = { 1504 Cdata: new Uint8Array([67, 68, 65, 84, 65, 91]), 1505 // CDATA[ 1506 CdataEnd: new Uint8Array([93, 93, 62]), 1507 // ]]> 1508 CommentEnd: new Uint8Array([45, 45, 62]), 1509 // `-->` 1510 ScriptEnd: new Uint8Array([60, 47, 115, 99, 114, 105, 112, 116]), 1511 // `<\/script` 1512 StyleEnd: new Uint8Array([60, 47, 115, 116, 121, 108, 101]), 1513 // `</style` 1514 TitleEnd: new Uint8Array([60, 47, 116, 105, 116, 108, 101]), 1515 // `</title` 1516 TextareaEnd: new Uint8Array([ 1517 60, 1518 47, 1519 116, 1520 101, 1521 120, 1522 116, 1523 97, 1524 114, 1525 101, 1526 97 1527 ]) 1528 // `</textarea 1529}; 1530class Tokenizer { 1531 constructor(stack, cbs) { 1532 this.stack = stack; 1533 this.cbs = cbs; 1534 /** The current state the tokenizer is in. */ 1535 this.state = 1; 1536 /** The read buffer. */ 1537 this.buffer = ""; 1538 /** The beginning of the section that is currently being read. */ 1539 this.sectionStart = 0; 1540 /** The index within the buffer that we are currently looking at. */ 1541 this.index = 0; 1542 /** The start of the last entity. */ 1543 this.entityStart = 0; 1544 /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */ 1545 this.baseState = 1; 1546 /** For special parsing behavior inside of script and style tags. */ 1547 this.inRCDATA = false; 1548 /** For disabling RCDATA tags handling */ 1549 this.inXML = false; 1550 /** For disabling interpolation parsing in v-pre */ 1551 this.inVPre = false; 1552 /** Record newline positions for fast line / column calculation */ 1553 this.newlines = []; 1554 this.mode = 0; 1555 this.delimiterOpen = defaultDelimitersOpen; 1556 this.delimiterClose = defaultDelimitersClose; 1557 this.delimiterIndex = -1; 1558 this.currentSequence = void 0; 1559 this.sequenceIndex = 0; 1560 } 1561 get inSFCRoot() { 1562 return this.mode === 2 && this.stack.length === 0; 1563 } 1564 reset() { 1565 this.state = 1; 1566 this.mode = 0; 1567 this.buffer = ""; 1568 this.sectionStart = 0; 1569 this.index = 0; 1570 this.baseState = 1; 1571 this.inRCDATA = false; 1572 this.currentSequence = void 0; 1573 this.newlines.length = 0; 1574 this.delimiterOpen = defaultDelimitersOpen; 1575 this.delimiterClose = defaultDelimitersClose; 1576 } 1577 /** 1578 * Generate Position object with line / column information using recorded 1579 * newline positions. We know the index is always going to be an already 1580 * processed index, so all the newlines up to this index should have been 1581 * recorded. 1582 */ 1583 getPos(index) { 1584 let line = 1; 1585 let column = index + 1; 1586 for (let i = this.newlines.length - 1; i >= 0; i--) { 1587 const newlineIndex = this.newlines[i]; 1588 if (index > newlineIndex) { 1589 line = i + 2; 1590 column = index - newlineIndex; 1591 break; 1592 } 1593 } 1594 return { 1595 column, 1596 line, 1597 offset: index 1598 }; 1599 } 1600 peek() { 1601 return this.buffer.charCodeAt(this.index + 1); 1602 } 1603 stateText(c) { 1604 if (c === 60) { 1605 if (this.index > this.sectionStart) { 1606 this.cbs.ontext(this.sectionStart, this.index); 1607 } 1608 this.state = 5; 1609 this.sectionStart = this.index; 1610 } else if (!this.inVPre && c === this.delimiterOpen[0]) { 1611 this.state = 2; 1612 this.delimiterIndex = 0; 1613 this.stateInterpolationOpen(c); 1614 } 1615 } 1616 stateInterpolationOpen(c) { 1617 if (c === this.delimiterOpen[this.delimiterIndex]) { 1618 if (this.delimiterIndex === this.delimiterOpen.length - 1) { 1619 const start = this.index + 1 - this.delimiterOpen.length; 1620 if (start > this.sectionStart) { 1621 this.cbs.ontext(this.sectionStart, start); 1622 } 1623 this.state = 3; 1624 this.sectionStart = start; 1625 } else { 1626 this.delimiterIndex++; 1627 } 1628 } else if (this.inRCDATA) { 1629 this.state = 32; 1630 this.stateInRCDATA(c); 1631 } else { 1632 this.state = 1; 1633 this.stateText(c); 1634 } 1635 } 1636 stateInterpolation(c) { 1637 if (c === this.delimiterClose[0]) { 1638 this.state = 4; 1639 this.delimiterIndex = 0; 1640 this.stateInterpolationClose(c); 1641 } 1642 } 1643 stateInterpolationClose(c) { 1644 if (c === this.delimiterClose[this.delimiterIndex]) { 1645 if (this.delimiterIndex === this.delimiterClose.length - 1) { 1646 this.cbs.oninterpolation(this.sectionStart, this.index + 1); 1647 if (this.inRCDATA) { 1648 this.state = 32; 1649 } else { 1650 this.state = 1; 1651 } 1652 this.sectionStart = this.index + 1; 1653 } else { 1654 this.delimiterIndex++; 1655 } 1656 } else { 1657 this.state = 3; 1658 this.stateInterpolation(c); 1659 } 1660 } 1661 stateSpecialStartSequence(c) { 1662 const isEnd = this.sequenceIndex === this.currentSequence.length; 1663 const isMatch = isEnd ? ( 1664 // If we are at the end of the sequence, make sure the tag name has ended 1665 isEndOfTagSection(c) 1666 ) : ( 1667 // Otherwise, do a case-insensitive comparison 1668 (c | 32) === this.currentSequence[this.sequenceIndex] 1669 ); 1670 if (!isMatch) { 1671 this.inRCDATA = false; 1672 } else if (!isEnd) { 1673 this.sequenceIndex++; 1674 return; 1675 } 1676 this.sequenceIndex = 0; 1677 this.state = 6; 1678 this.stateInTagName(c); 1679 } 1680 /** Look for an end tag. For <title> and <textarea>, also decode entities. */ 1681 stateInRCDATA(c) { 1682 if (this.sequenceIndex === this.currentSequence.length) { 1683 if (c === 62 || isWhitespace(c)) { 1684 const endOfText = this.index - this.currentSequence.length; 1685 if (this.sectionStart < endOfText) { 1686 const actualIndex = this.index; 1687 this.index = endOfText; 1688 this.cbs.ontext(this.sectionStart, endOfText); 1689 this.index = actualIndex; 1690 } 1691 this.sectionStart = endOfText + 2; 1692 this.stateInClosingTagName(c); 1693 this.inRCDATA = false; 1694 return; 1695 } 1696 this.sequenceIndex = 0; 1697 } 1698 if ((c | 32) === this.currentSequence[this.sequenceIndex]) { 1699 this.sequenceIndex += 1; 1700 } else if (this.sequenceIndex === 0) { 1701 if (this.currentSequence === Sequences.TitleEnd || this.currentSequence === Sequences.TextareaEnd && !this.inSFCRoot) { 1702 if (c === this.delimiterOpen[0]) { 1703 this.state = 2; 1704 this.delimiterIndex = 0; 1705 this.stateInterpolationOpen(c); 1706 } 1707 } else if (this.fastForwardTo(60)) { 1708 this.sequenceIndex = 1; 1709 } 1710 } else { 1711 this.sequenceIndex = Number(c === 60); 1712 } 1713 } 1714 stateCDATASequence(c) { 1715 if (c === Sequences.Cdata[this.sequenceIndex]) { 1716 if (++this.sequenceIndex === Sequences.Cdata.length) { 1717 this.state = 28; 1718 this.currentSequence = Sequences.CdataEnd; 1719 this.sequenceIndex = 0; 1720 this.sectionStart = this.index + 1; 1721 } 1722 } else { 1723 this.sequenceIndex = 0; 1724 this.state = 23; 1725 this.stateInDeclaration(c); 1726 } 1727 } 1728 /** 1729 * When we wait for one specific character, we can speed things up 1730 * by skipping through the buffer until we find it. 1731 * 1732 * @returns Whether the character was found. 1733 */ 1734 fastForwardTo(c) { 1735 while (++this.index < this.buffer.length) { 1736 const cc = this.buffer.charCodeAt(this.index); 1737 if (cc === 10) { 1738 this.newlines.push(this.index); 1739 } 1740 if (cc === c) { 1741 return true; 1742 } 1743 } 1744 this.index = this.buffer.length - 1; 1745 return false; 1746 } 1747 /** 1748 * Comments and CDATA end with `-->` and `]]>`. 1749 * 1750 * Their common qualities are: 1751 * - Their end sequences have a distinct character they start with. 1752 * - That character is then repeated, so we have to check multiple repeats. 1753 * - All characters but the start character of the sequence can be skipped. 1754 */ 1755 stateInCommentLike(c) { 1756 if (c === this.currentSequence[this.sequenceIndex]) { 1757 if (++this.sequenceIndex === this.currentSequence.length) { 1758 if (this.currentSequence === Sequences.CdataEnd) { 1759 this.cbs.oncdata(this.sectionStart, this.index - 2); 1760 } else { 1761 this.cbs.oncomment(this.sectionStart, this.index - 2); 1762 } 1763 this.sequenceIndex = 0; 1764 this.sectionStart = this.index + 1; 1765 this.state = 1; 1766 } 1767 } else if (this.sequenceIndex === 0) { 1768 if (this.fastForwardTo(this.currentSequence[0])) { 1769 this.sequenceIndex = 1; 1770 } 1771 } else if (c !== this.currentSequence[this.sequenceIndex - 1]) { 1772 this.sequenceIndex = 0; 1773 } 1774 } 1775 startSpecial(sequence, offset) { 1776 this.enterRCDATA(sequence, offset); 1777 this.state = 31; 1778 } 1779 enterRCDATA(sequence, offset) { 1780 this.inRCDATA = true; 1781 this.currentSequence = sequence; 1782 this.sequenceIndex = offset; 1783 } 1784 stateBeforeTagName(c) { 1785 if (c === 33) { 1786 this.state = 22; 1787 this.sectionStart = this.index + 1; 1788 } else if (c === 63) { 1789 this.state = 24; 1790 this.sectionStart = this.index + 1; 1791 } else if (isTagStartChar(c)) { 1792 this.sectionStart = this.index; 1793 if (this.mode === 0) { 1794 this.state = 6; 1795 } else if (this.inSFCRoot) { 1796 this.state = 34; 1797 } else if (!this.inXML) { 1798 if (c === 116) { 1799 this.state = 30; 1800 } else { 1801 this.state = c === 115 ? 29 : 6; 1802 } 1803 } else { 1804 this.state = 6; 1805 } 1806 } else if (c === 47) { 1807 this.state = 8; 1808 } else { 1809 this.state = 1; 1810 this.stateText(c); 1811 } 1812 } 1813 stateInTagName(c) { 1814 if (isEndOfTagSection(c)) { 1815 this.handleTagName(c); 1816 } 1817 } 1818 stateInSFCRootTagName(c) { 1819 if (isEndOfTagSection(c)) { 1820 const tag = this.buffer.slice(this.sectionStart, this.index); 1821 if (tag !== "template") { 1822 this.enterRCDATA(toCharCodes(`</` + tag), 0); 1823 } 1824 this.handleTagName(c); 1825 } 1826 } 1827 handleTagName(c) { 1828 this.cbs.onopentagname(this.sectionStart, this.index); 1829 this.sectionStart = -1; 1830 this.state = 11; 1831 this.stateBeforeAttrName(c); 1832 } 1833 stateBeforeClosingTagName(c) { 1834 if (isWhitespace(c)) ; else if (c === 62) { 1835 if (true) { 1836 this.cbs.onerr(14, this.index); 1837 } 1838 this.state = 1; 1839 this.sectionStart = this.index + 1; 1840 } else { 1841 this.state = isTagStartChar(c) ? 9 : 27; 1842 this.sectionStart = this.index; 1843 } 1844 } 1845 stateInClosingTagName(c) { 1846 if (c === 62 || isWhitespace(c)) { 1847 this.cbs.onclosetag(this.sectionStart, this.index); 1848 this.sectionStart = -1; 1849 this.state = 10; 1850 this.stateAfterClosingTagName(c); 1851 } 1852 } 1853 stateAfterClosingTagName(c) { 1854 if (c === 62) { 1855 this.state = 1; 1856 this.sectionStart = this.index + 1; 1857 } 1858 } 1859 stateBeforeAttrName(c) { 1860 if (c === 62) { 1861 this.cbs.onopentagend(this.index); 1862 if (this.inRCDATA) { 1863 this.state = 32; 1864 } else { 1865 this.state = 1; 1866 } 1867 this.sectionStart = this.index + 1; 1868 } else if (c === 47) { 1869 this.state = 7; 1870 if (( true) && this.peek() !== 62) { 1871 this.cbs.onerr(22, this.index); 1872 } 1873 } else if (c === 60 && this.peek() === 47) { 1874 this.cbs.onopentagend(this.index); 1875 this.state = 5; 1876 this.sectionStart = this.index; 1877 } else if (!isWhitespace(c)) { 1878 if (( true) && c === 61) { 1879 this.cbs.onerr( 1880 19, 1881 this.index 1882 ); 1883 } 1884 this.handleAttrStart(c); 1885 } 1886 } 1887 handleAttrStart(c) { 1888 if (c === 118 && this.peek() === 45) { 1889 this.state = 13; 1890 this.sectionStart = this.index; 1891 } else if (c === 46 || c === 58 || c === 64 || c === 35) { 1892 this.cbs.ondirname(this.index, this.index + 1); 1893 this.state = 14; 1894 this.sectionStart = this.index + 1; 1895 } else { 1896 this.state = 12; 1897 this.sectionStart = this.index; 1898 } 1899 } 1900 stateInSelfClosingTag(c) { 1901 if (c === 62) { 1902 this.cbs.onselfclosingtag(this.index); 1903 this.state = 1; 1904 this.sectionStart = this.index + 1; 1905 this.inRCDATA = false; 1906 } else if (!isWhitespace(c)) { 1907 this.state = 11; 1908 this.stateBeforeAttrName(c); 1909 } 1910 } 1911 stateInAttrName(c) { 1912 if (c === 61 || isEndOfTagSection(c)) { 1913 this.cbs.onattribname(this.sectionStart, this.index); 1914 this.handleAttrNameEnd(c); 1915 } else if (( true) && (c === 34 || c === 39 || c === 60)) { 1916 this.cbs.onerr( 1917 17, 1918 this.index 1919 ); 1920 } 1921 } 1922 stateInDirName(c) { 1923 if (c === 61 || isEndOfTagSection(c)) { 1924 this.cbs.ondirname(this.sectionStart, this.index); 1925 this.handleAttrNameEnd(c); 1926 } else if (c === 58) { 1927 this.cbs.ondirname(this.sectionStart, this.index); 1928 this.state = 14; 1929 this.sectionStart = this.index + 1; 1930 } else if (c === 46) { 1931 this.cbs.ondirname(this.sectionStart, this.index); 1932 this.state = 16; 1933 this.sectionStart = this.index + 1; 1934 } 1935 } 1936 stateInDirArg(c) { 1937 if (c === 61 || isEndOfTagSection(c)) { 1938 this.cbs.ondirarg(this.sectionStart, this.index); 1939 this.handleAttrNameEnd(c); 1940 } else if (c === 91) { 1941 this.state = 15; 1942 } else if (c === 46) { 1943 this.cbs.ondirarg(this.sectionStart, this.index); 1944 this.state = 16; 1945 this.sectionStart = this.index + 1; 1946 } 1947 } 1948 stateInDynamicDirArg(c) { 1949 if (c === 93) { 1950 this.state = 14; 1951 } else if (c === 61 || isEndOfTagSection(c)) { 1952 this.cbs.ondirarg(this.sectionStart, this.index + 1); 1953 this.handleAttrNameEnd(c); 1954 if (true) { 1955 this.cbs.onerr( 1956 27, 1957 this.index 1958 ); 1959 } 1960 } 1961 } 1962 stateInDirModifier(c) { 1963 if (c === 61 || isEndOfTagSection(c)) { 1964 this.cbs.ondirmodifier(this.sectionStart, this.index); 1965 this.handleAttrNameEnd(c); 1966 } else if (c === 46) { 1967 this.cbs.ondirmodifier(this.sectionStart, this.index); 1968 this.sectionStart = this.index + 1; 1969 } 1970 } 1971 handleAttrNameEnd(c) { 1972 this.sectionStart = this.index; 1973 this.state = 17; 1974 this.cbs.onattribnameend(this.index); 1975 this.stateAfterAttrName(c); 1976 } 1977 stateAfterAttrName(c) { 1978 if (c === 61) { 1979 this.state = 18; 1980 } else if (c === 47 || c === 62) { 1981 this.cbs.onattribend(0, this.sectionStart); 1982 this.sectionStart = -1; 1983 this.state = 11; 1984 this.stateBeforeAttrName(c); 1985 } else if (!isWhitespace(c)) { 1986 this.cbs.onattribend(0, this.sectionStart); 1987 this.handleAttrStart(c); 1988 } 1989 } 1990 stateBeforeAttrValue(c) { 1991 if (c === 34) { 1992 this.state = 19; 1993 this.sectionStart = this.index + 1; 1994 } else if (c === 39) { 1995 this.state = 20; 1996 this.sectionStart = this.index + 1; 1997 } else if (!isWhitespace(c)) { 1998 this.sectionStart = this.index; 1999 this.state = 21; 2000 this.stateInAttrValueNoQuotes(c); 2001 } 2002 } 2003 handleInAttrValue(c, quote) { 2004 if (c === quote || this.fastForwardTo(quote)) { 2005 this.cbs.onattribdata(this.sectionStart, this.index); 2006 this.sectionStart = -1; 2007 this.cbs.onattribend( 2008 quote === 34 ? 3 : 2, 2009 this.index + 1 2010 ); 2011 this.state = 11; 2012 } 2013 } 2014 stateInAttrValueDoubleQuotes(c) { 2015 this.handleInAttrValue(c, 34); 2016 } 2017 stateInAttrValueSingleQuotes(c) { 2018 this.handleInAttrValue(c, 39); 2019 } 2020 stateInAttrValueNoQuotes(c) { 2021 if (isWhitespace(c) || c === 62) { 2022 this.cbs.onattribdata(this.sectionStart, this.index); 2023 this.sectionStart = -1; 2024 this.cbs.onattribend(1, this.index); 2025 this.state = 11; 2026 this.stateBeforeAttrName(c); 2027 } else if (( true) && c === 34 || c === 39 || c === 60 || c === 61 || c === 96) { 2028 this.cbs.onerr( 2029 18, 2030 this.index 2031 ); 2032 } else ; 2033 } 2034 stateBeforeDeclaration(c) { 2035 if (c === 91) { 2036 this.state = 26; 2037 this.sequenceIndex = 0; 2038 } else { 2039 this.state = c === 45 ? 25 : 23; 2040 } 2041 } 2042 stateInDeclaration(c) { 2043 if (c === 62 || this.fastForwardTo(62)) { 2044 this.state = 1; 2045 this.sectionStart = this.index + 1; 2046 } 2047 } 2048 stateInProcessingInstruction(c) { 2049 if (c === 62 || this.fastForwardTo(62)) { 2050 this.cbs.onprocessinginstruction(this.sectionStart, this.index); 2051 this.state = 1; 2052 this.sectionStart = this.index + 1; 2053 } 2054 } 2055 stateBeforeComment(c) { 2056 if (c === 45) { 2057 this.state = 28; 2058 this.currentSequence = Sequences.CommentEnd; 2059 this.sequenceIndex = 2; 2060 this.sectionStart = this.index + 1; 2061 } else { 2062 this.state = 23; 2063 } 2064 } 2065 stateInSpecialComment(c) { 2066 if (c === 62 || this.fastForwardTo(62)) { 2067 this.cbs.oncomment(this.sectionStart, this.index); 2068 this.state = 1; 2069 this.sectionStart = this.index + 1; 2070 } 2071 } 2072 stateBeforeSpecialS(c) { 2073 if (c === Sequences.ScriptEnd[3]) { 2074 this.startSpecial(Sequences.ScriptEnd, 4); 2075 } else if (c === Sequences.StyleEnd[3]) { 2076 this.startSpecial(Sequences.StyleEnd, 4); 2077 } else { 2078 this.state = 6; 2079 this.stateInTagName(c); 2080 } 2081 } 2082 stateBeforeSpecialT(c) { 2083 if (c === Sequences.TitleEnd[3]) { 2084 this.startSpecial(Sequences.TitleEnd, 4); 2085 } else if (c === Sequences.TextareaEnd[3]) { 2086 this.startSpecial(Sequences.TextareaEnd, 4); 2087 } else { 2088 this.state = 6; 2089 this.stateInTagName(c); 2090 } 2091 } 2092 startEntity() { 2093 } 2094 stateInEntity() { 2095 } 2096 /** 2097 * Iterates through the buffer, calling the function corresponding to the current state. 2098 * 2099 * States that are more likely to be hit are higher up, as a performance improvement. 2100 */ 2101 parse(input) { 2102 this.buffer = input; 2103 while (this.index < this.buffer.length) { 2104 const c = this.buffer.charCodeAt(this.index); 2105 if (c === 10) { 2106 this.newlines.push(this.index); 2107 } 2108 switch (this.state) { 2109 case 1: { 2110 this.stateText(c); 2111 break; 2112 } 2113 case 2: { 2114 this.stateInterpolationOpen(c); 2115 break; 2116 } 2117 case 3: { 2118 this.stateInterpolation(c); 2119 break; 2120 } 2121 case 4: { 2122 this.stateInterpolationClose(c); 2123 break; 2124 } 2125 case 31: { 2126 this.stateSpecialStartSequence(c); 2127 break; 2128 } 2129 case 32: { 2130 this.stateInRCDATA(c); 2131 break; 2132 } 2133 case 26: { 2134 this.stateCDATASequence(c); 2135 break; 2136 } 2137 case 19: { 2138 this.stateInAttrValueDoubleQuotes(c); 2139 break; 2140 } 2141 case 12: { 2142 this.stateInAttrName(c); 2143 break; 2144 } 2145 case 13: { 2146 this.stateInDirName(c); 2147 break; 2148 } 2149 case 14: { 2150 this.stateInDirArg(c); 2151 break; 2152 } 2153 case 15: { 2154 this.stateInDynamicDirArg(c); 2155 break; 2156 } 2157 case 16: { 2158 this.stateInDirModifier(c); 2159 break; 2160 } 2161 case 28: { 2162 this.stateInCommentLike(c); 2163 break; 2164 } 2165 case 27: { 2166 this.stateInSpecialComment(c); 2167 break; 2168 } 2169 case 11: { 2170 this.stateBeforeAttrName(c); 2171 break; 2172 } 2173 case 6: { 2174 this.stateInTagName(c); 2175 break; 2176 } 2177 case 34: { 2178 this.stateInSFCRootTagName(c); 2179 break; 2180 } 2181 case 9: { 2182 this.stateInClosingTagName(c); 2183 break; 2184 } 2185 case 5: { 2186 this.stateBeforeTagName(c); 2187 break; 2188 } 2189 case 17: { 2190 this.stateAfterAttrName(c); 2191 break; 2192 } 2193 case 20: { 2194 this.stateInAttrValueSingleQuotes(c); 2195 break; 2196 } 2197 case 18: { 2198 this.stateBeforeAttrValue(c); 2199 break; 2200 } 2201 case 8: { 2202 this.stateBeforeClosingTagName(c); 2203 break; 2204 } 2205 case 10: { 2206 this.stateAfterClosingTagName(c); 2207 break; 2208 } 2209 case 29: { 2210 this.stateBeforeSpecialS(c); 2211 break; 2212 } 2213 case 30: { 2214 this.stateBeforeSpecialT(c); 2215 break; 2216 } 2217 case 21: { 2218 this.stateInAttrValueNoQuotes(c); 2219 break; 2220 } 2221 case 7: { 2222 this.stateInSelfClosingTag(c); 2223 break; 2224 } 2225 case 23: { 2226 this.stateInDeclaration(c); 2227 break; 2228 } 2229 case 22: { 2230 this.stateBeforeDeclaration(c); 2231 break; 2232 } 2233 case 25: { 2234 this.stateBeforeComment(c); 2235 break; 2236 } 2237 case 24: { 2238 this.stateInProcessingInstruction(c); 2239 break; 2240 } 2241 case 33: { 2242 this.stateInEntity(); 2243 break; 2244 } 2245 } 2246 this.index++; 2247 } 2248 this.cleanup(); 2249 this.finish(); 2250 } 2251 /** 2252 * Remove data that has already been consumed from the buffer. 2253 */ 2254 cleanup() { 2255 if (this.sectionStart !== this.index) { 2256 if (this.state === 1 || this.state === 32 && this.sequenceIndex === 0) { 2257 this.cbs.ontext(this.sectionStart, this.index); 2258 this.sectionStart = this.index; 2259 } else if (this.state === 19 || this.state === 20 || this.state === 21) { 2260 this.cbs.onattribdata(this.sectionStart, this.index); 2261 this.sectionStart = this.index; 2262 } 2263 } 2264 } 2265 finish() { 2266 this.handleTrailingData(); 2267 this.cbs.onend(); 2268 } 2269 /** Handle any trailing data. */ 2270 handleTrailingData() { 2271 const endIndex = this.buffer.length; 2272 if (this.sectionStart >= endIndex) { 2273 return; 2274 } 2275 if (this.state === 28) { 2276 if (this.currentSequence === Sequences.CdataEnd) { 2277 this.cbs.oncdata(this.sectionStart, endIndex); 2278 } else { 2279 this.cbs.oncomment(this.sectionStart, endIndex); 2280 } 2281 } else if (this.state === 6 || this.state === 11 || this.state === 18 || this.state === 17 || this.state === 12 || this.state === 13 || this.state === 14 || this.state === 15 || this.state === 16 || this.state === 20 || this.state === 19 || this.state === 21 || this.state === 9) ; else { 2282 this.cbs.ontext(this.sectionStart, endIndex); 2283 } 2284 } 2285 emitCodePoint(cp, consumed) { 2286 } 2287} 2288 2289const CompilerDeprecationTypes = { 2290 "COMPILER_IS_ON_ELEMENT": "COMPILER_IS_ON_ELEMENT", 2291 "COMPILER_V_BIND_SYNC": "COMPILER_V_BIND_SYNC", 2292 "COMPILER_V_BIND_OBJECT_ORDER": "COMPILER_V_BIND_OBJECT_ORDER", 2293 "COMPILER_V_ON_NATIVE": "COMPILER_V_ON_NATIVE", 2294 "COMPILER_V_IF_V_FOR_PRECEDENCE": "COMPILER_V_IF_V_FOR_PRECEDENCE", 2295 "COMPILER_NATIVE_TEMPLATE": "COMPILER_NATIVE_TEMPLATE", 2296 "COMPILER_INLINE_TEMPLATE": "COMPILER_INLINE_TEMPLATE", 2297 "COMPILER_FILTERS": "COMPILER_FILTERS" 2298}; 2299const deprecationData = { 2300 ["COMPILER_IS_ON_ELEMENT"]: { 2301 message: `Platform-native elements with "is" prop will no longer be treated as components in Vue 3 unless the "is" value is explicitly prefixed with "vue:".`, 2302 link: `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html` 2303 }, 2304 ["COMPILER_V_BIND_SYNC"]: { 2305 message: (key) => `.sync modifier for v-bind has been removed. Use v-model with argument instead. \`v-bind:${key}.sync\` should be changed to \`v-model:${key}\`.`, 2306 link: `https://v3-migration.vuejs.org/breaking-changes/v-model.html` 2307 }, 2308 ["COMPILER_V_BIND_OBJECT_ORDER"]: { 2309 message: `v-bind="obj" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.`, 2310 link: `https://v3-migration.vuejs.org/breaking-changes/v-bind.html` 2311 }, 2312 ["COMPILER_V_ON_NATIVE"]: { 2313 message: `.native modifier for v-on has been removed as is no longer necessary.`, 2314 link: `https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html` 2315 }, 2316 ["COMPILER_V_IF_V_FOR_PRECEDENCE"]: { 2317 message: `v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with <template> tags or use a computed property that filters v-for data source.`, 2318 link: `https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html` 2319 }, 2320 ["COMPILER_NATIVE_TEMPLATE"]: { 2321 message: `<template> with no special directives will render as a native template element instead of its inner content in Vue 3.` 2322 }, 2323 ["COMPILER_INLINE_TEMPLATE"]: { 2324 message: `"inline-template" has been removed in Vue 3.`, 2325 link: `https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html` 2326 }, 2327 ["COMPILER_FILTERS"]: { 2328 message: `filters have been removed in Vue 3. The "|" symbol will be treated as native JavaScript bitwise OR operator. Use method calls or computed properties instead.`, 2329 link: `https://v3-migration.vuejs.org/breaking-changes/filters.html` 2330 } 2331}; 2332function getCompatValue(key, { compatConfig }) { 2333 const value = compatConfig && compatConfig[key]; 2334 if (key === "MODE") { 2335 return value || 3; 2336 } else { 2337 return value; 2338 } 2339} 2340function isCompatEnabled(key, context) { 2341 const mode = getCompatValue("MODE", context); 2342 const value = getCompatValue(key, context); 2343 return mode === 3 ? value === true : value !== false; 2344} 2345function checkCompatEnabled(key, context, loc, ...args) { 2346 const enabled = isCompatEnabled(key, context); 2347 if ( true && enabled) { 2348 warnDeprecation(key, context, loc, ...args); 2349 } 2350 return enabled; 2351} 2352function warnDeprecation(key, context, loc, ...args) { 2353 const val = getCompatValue(key, context); 2354 if (val === "suppress-warning") { 2355 return; 2356 } 2357 const { message, link } = deprecationData[key]; 2358 const msg = `(deprecation ${key}) ${typeof message === "function" ? message(...args) : message}${link ? ` 2359 Details: ${link}` : ``}`; 2360 const err = new SyntaxError(msg); 2361 err.code = key; 2362 if (loc) err.loc = loc; 2363 context.onWarn(err); 2364} 2365 2366function defaultOnError(error) { 2367 throw error; 2368} 2369function defaultOnWarn(msg) { 2370 true && console.warn(`[Vue warn] ${msg.message}`); 2371} 2372function createCompilerError(code, loc, messages, additionalMessage) { 2373 const msg = true ? (messages || errorMessages)[code] + (additionalMessage || ``) : 0; 2374 const error = new SyntaxError(String(msg)); 2375 error.code = code; 2376 error.loc = loc; 2377 return error; 2378} 2379const ErrorCodes = { 2380 "ABRUPT_CLOSING_OF_EMPTY_COMMENT": 0, 2381 "0": "ABRUPT_CLOSING_OF_EMPTY_COMMENT", 2382 "CDATA_IN_HTML_CONTENT": 1, 2383 "1": "CDATA_IN_HTML_CONTENT", 2384 "DUPLICATE_ATTRIBUTE": 2, 2385 "2": "DUPLICATE_ATTRIBUTE", 2386 "END_TAG_WITH_ATTRIBUTES": 3, 2387 "3": "END_TAG_WITH_ATTRIBUTES", 2388 "END_TAG_WITH_TRAILING_SOLIDUS": 4, 2389 "4": "END_TAG_WITH_TRAILING_SOLIDUS", 2390 "EOF_BEFORE_TAG_NAME": 5, 2391 "5": "EOF_BEFORE_TAG_NAME", 2392 "EOF_IN_CDATA": 6, 2393 "6": "EOF_IN_CDATA", 2394 "EOF_IN_COMMENT": 7, 2395 "7": "EOF_IN_COMMENT", 2396 "EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT": 8, 2397 "8": "EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT", 2398 "EOF_IN_TAG": 9, 2399 "9": "EOF_IN_TAG", 2400 "INCORRECTLY_CLOSED_COMMENT": 10, 2401 "10": "INCORRECTLY_CLOSED_COMMENT", 2402 "INCORRECTLY_OPENED_COMMENT": 11, 2403 "11": "INCORRECTLY_OPENED_COMMENT", 2404 "INVALID_FIRST_CHARACTER_OF_TAG_NAME": 12, 2405 "12": "INVALID_FIRST_CHARACTER_OF_TAG_NAME", 2406 "MISSING_ATTRIBUTE_VALUE": 13, 2407 "13": "MISSING_ATTRIBUTE_VALUE", 2408 "MISSING_END_TAG_NAME": 14, 2409 "14": "MISSING_END_TAG_NAME", 2410 "MISSING_WHITESPACE_BETWEEN_ATTRIBUTES": 15, 2411 "15": "MISSING_WHITESPACE_BETWEEN_ATTRIBUTES", 2412 "NESTED_COMMENT": 16, 2413 "16": "NESTED_COMMENT", 2414 "UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME": 17, 2415 "17": "UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME", 2416 "UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE": 18, 2417 "18": "UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE", 2418 "UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME": 19, 2419 "19": "UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME", 2420 "UNEXPECTED_NULL_CHARACTER": 20, 2421 "20": "UNEXPECTED_NULL_CHARACTER", 2422 "UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME": 21, 2423 "21": "UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME", 2424 "UNEXPECTED_SOLIDUS_IN_TAG": 22, 2425 "22": "UNEXPECTED_SOLIDUS_IN_TAG", 2426 "X_INVALID_END_TAG": 23, 2427 "23": "X_INVALID_END_TAG", 2428 "X_MISSING_END_TAG": 24, 2429 "24": "X_MISSING_END_TAG", 2430 "X_MISSING_INTERPOLATION_END": 25, 2431 "25": "X_MISSING_INTERPOLATION_END", 2432 "X_MISSING_DIRECTIVE_NAME": 26, 2433 "26": "X_MISSING_DIRECTIVE_NAME", 2434 "X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END": 27, 2435 "27": "X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END", 2436 "X_V_IF_NO_EXPRESSION": 28, 2437 "28": "X_V_IF_NO_EXPRESSION", 2438 "X_V_IF_SAME_KEY": 29, 2439 "29": "X_V_IF_SAME_KEY", 2440 "X_V_ELSE_NO_ADJACENT_IF": 30, 2441 "30": "X_V_ELSE_NO_ADJACENT_IF", 2442 "X_V_FOR_NO_EXPRESSION": 31, 2443 "31": "X_V_FOR_NO_EXPRESSION", 2444 "X_V_FOR_MALFORMED_EXPRESSION": 32, 2445 "32": "X_V_FOR_MALFORMED_EXPRESSION", 2446 "X_V_FOR_TEMPLATE_KEY_PLACEMENT": 33, 2447 "33": "X_V_FOR_TEMPLATE_KEY_PLACEMENT", 2448 "X_V_BIND_NO_EXPRESSION": 34, 2449 "34": "X_V_BIND_NO_EXPRESSION", 2450 "X_V_ON_NO_EXPRESSION": 35, 2451 "35": "X_V_ON_NO_EXPRESSION", 2452 "X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET": 36, 2453 "36": "X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET", 2454 "X_V_SLOT_MIXED_SLOT_USAGE": 37, 2455 "37": "X_V_SLOT_MIXED_SLOT_USAGE", 2456 "X_V_SLOT_DUPLICATE_SLOT_NAMES": 38, 2457 "38": "X_V_SLOT_DUPLICATE_SLOT_NAMES", 2458 "X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN": 39, 2459 "39": "X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN", 2460 "X_V_SLOT_MISPLACED": 40, 2461 "40": "X_V_SLOT_MISPLACED", 2462 "X_V_MODEL_NO_EXPRESSION": 41, 2463 "41": "X_V_MODEL_NO_EXPRESSION", 2464 "X_V_MODEL_MALFORMED_EXPRESSION": 42, 2465 "42": "X_V_MODEL_MALFORMED_EXPRESSION", 2466 "X_V_MODEL_ON_SCOPE_VARIABLE": 43, 2467 "43": "X_V_MODEL_ON_SCOPE_VARIABLE", 2468 "X_V_MODEL_ON_PROPS": 44, 2469 "44": "X_V_MODEL_ON_PROPS", 2470 "X_INVALID_EXPRESSION": 45, 2471 "45": "X_INVALID_EXPRESSION", 2472 "X_KEEP_ALIVE_INVALID_CHILDREN": 46, 2473 "46": "X_KEEP_ALIVE_INVALID_CHILDREN", 2474 "X_PREFIX_ID_NOT_SUPPORTED": 47, 2475 "47": "X_PREFIX_ID_NOT_SUPPORTED", 2476 "X_MODULE_MODE_NOT_SUPPORTED": 48, 2477 "48": "X_MODULE_MODE_NOT_SUPPORTED", 2478 "X_CACHE_HANDLER_NOT_SUPPORTED": 49, 2479 "49": "X_CACHE_HANDLER_NOT_SUPPORTED", 2480 "X_SCOPE_ID_NOT_SUPPORTED": 50, 2481 "50": "X_SCOPE_ID_NOT_SUPPORTED", 2482 "X_VNODE_HOOKS": 51, 2483 "51": "X_VNODE_HOOKS", 2484 "X_V_BIND_INVALID_SAME_NAME_ARGUMENT": 52, 2485 "52": "X_V_BIND_INVALID_SAME_NAME_ARGUMENT", 2486 "__EXTEND_POINT__": 53, 2487 "53": "__EXTEND_POINT__" 2488}; 2489const errorMessages = { 2490 // parse errors 2491 [0]: "Illegal comment.", 2492 [1]: "CDATA section is allowed only in XML context.", 2493 [2]: "Duplicate attribute.", 2494 [3]: "End tag cannot have attributes.", 2495 [4]: "Illegal '/' in tags.", 2496 [5]: "Unexpected EOF in tag.", 2497 [6]: "Unexpected EOF in CDATA section.", 2498 [7]: "Unexpected EOF in comment.", 2499 [8]: "Unexpected EOF in script.", 2500 [9]: "Unexpected EOF in tag.", 2501 [10]: "Incorrectly closed comment.", 2502 [11]: "Incorrectly opened comment.", 2503 [12]: "Illegal tag name. Use '<' to print '<'.", 2504 [13]: "Attribute value was expected.", 2505 [14]: "End tag name was expected.", 2506 [15]: "Whitespace was expected.", 2507 [16]: "Unexpected '<!--' in comment.", 2508 [17]: `Attribute name cannot contain U+0022 ("), U+0027 ('), and U+003C (<).`, 2509 [18]: "Unquoted attribute value cannot contain U+0022 (\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).", 2510 [19]: "Attribute name cannot start with '='.", 2511 [21]: "'<?' is allowed only in XML context.", 2512 [20]: `Unexpected null character.`, 2513 [22]: "Illegal '/' in tags.", 2514 // Vue-specific parse errors 2515 [23]: "Invalid end tag.", 2516 [24]: "Element is missing end tag.", 2517 [25]: "Interpolation end sign was not found.", 2518 [27]: "End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.", 2519 [26]: "Legal directive name was expected.", 2520 // transform errors 2521 [28]: `v-if/v-else-if is missing expression.`, 2522 [29]: `v-if/else branches must use unique keys.`, 2523 [30]: `v-else/v-else-if has no adjacent v-if or v-else-if.`, 2524 [31]: `v-for is missing expression.`, 2525 [32]: `v-for has invalid expression.`, 2526 [33]: `<template v-for> key should be placed on the <template> tag.`, 2527 [34]: `v-bind is missing expression.`, 2528 [52]: `v-bind with same-name shorthand only allows static argument.`, 2529 [35]: `v-on is missing expression.`, 2530 [36]: `Unexpected custom directive on <slot> outlet.`, 2531 [37]: `Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.`, 2532 [38]: `Duplicate slot names found. `, 2533 [39]: `Extraneous children found when component already has explicitly named default slot. These children will be ignored.`, 2534 [40]: `v-slot can only be used on components or <template> tags.`, 2535 [41]: `v-model is missing expression.`, 2536 [42]: `v-model value must be a valid JavaScript member expression.`, 2537 [43]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`, 2538 [44]: `v-model cannot be used on a prop, because local prop bindings are not writable. 2539Use a v-bind binding combined with a v-on listener that emits update:x event instead.`, 2540 [45]: `Error parsing JavaScript expression: `, 2541 [46]: `<KeepAlive> expects exactly one child component.`, 2542 [51]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`, 2543 // generic errors 2544 [47]: `"prefixIdentifiers" option is not supported in this build of compiler.`, 2545 [48]: `ES module mode is not supported in this build of compiler.`, 2546 [49]: `"cacheHandlers" option is only supported when the "prefixIdentifiers" option is enabled.`, 2547 [50]: `"scopeId" option is only supported in module mode.`, 2548 // just to fulfill types 2549 [53]: `` 2550}; 2551 2552function walkIdentifiers(root, onIdentifier, includeAll = false, parentStack = [], knownIds = /* @__PURE__ */ Object.create(null)) { 2553 { 2554 return; 2555 } 2556} 2557function isReferencedIdentifier(id, parent, parentStack) { 2558 { 2559 return false; 2560 } 2561} 2562function isInDestructureAssignment(parent, parentStack) { 2563 if (parent && (parent.type === "ObjectProperty" || parent.type === "ArrayPattern")) { 2564 let i = parentStack.length; 2565 while (i--) { 2566 const p = parentStack[i]; 2567 if (p.type === "AssignmentExpression") { 2568 return true; 2569 } else if (p.type !== "ObjectProperty" && !p.type.endsWith("Pattern")) { 2570 break; 2571 } 2572 } 2573 } 2574 return false; 2575} 2576function isInNewExpression(parentStack) { 2577 let i = parentStack.length; 2578 while (i--) { 2579 const p = parentStack[i]; 2580 if (p.type === "NewExpression") { 2581 return true; 2582 } else if (p.type !== "MemberExpression") { 2583 break; 2584 } 2585 } 2586 return false; 2587} 2588function walkFunctionParams(node, onIdent) { 2589 for (const p of node.params) { 2590 for (const id of extractIdentifiers(p)) { 2591 onIdent(id); 2592 } 2593 } 2594} 2595function walkBlockDeclarations(block, onIdent) { 2596 for (const stmt of block.body) { 2597 if (stmt.type === "VariableDeclaration") { 2598 if (stmt.declare) continue; 2599 for (const decl of stmt.declarations) { 2600 for (const id of extractIdentifiers(decl.id)) { 2601 onIdent(id); 2602 } 2603 } 2604 } else if (stmt.type === "FunctionDeclaration" || stmt.type === "ClassDeclaration") { 2605 if (stmt.declare || !stmt.id) continue; 2606 onIdent(stmt.id); 2607 } else if (stmt.type === "ForOfStatement" || stmt.type === "ForInStatement" || stmt.type === "ForStatement") { 2608 const variable = stmt.type === "ForStatement" ? stmt.init : stmt.left; 2609 if (variable && variable.type === "VariableDeclaration") { 2610 for (const decl of variable.declarations) { 2611 for (const id of extractIdentifiers(decl.id)) { 2612 onIdent(id); 2613 } 2614 } 2615 } 2616 } 2617 } 2618} 2619function extractIdentifiers(param, nodes = []) { 2620 switch (param.type) { 2621 case "Identifier": 2622 nodes.push(param); 2623 break; 2624 case "MemberExpression": 2625 let object = param; 2626 while (object.type === "MemberExpression") { 2627 object = object.object; 2628 } 2629 nodes.push(object); 2630 break; 2631 case "ObjectPattern": 2632 for (const prop of param.properties) { 2633 if (prop.type === "RestElement") { 2634 extractIdentifiers(prop.argument, nodes); 2635 } else { 2636 extractIdentifiers(prop.value, nodes); 2637 } 2638 } 2639 break; 2640 case "ArrayPattern": 2641 param.elements.forEach((element) => { 2642 if (element) extractIdentifiers(element, nodes); 2643 }); 2644 break; 2645 case "RestElement": 2646 extractIdentifiers(param.argument, nodes); 2647 break; 2648 case "AssignmentPattern": 2649 extractIdentifiers(param.left, nodes); 2650 break; 2651 } 2652 return nodes; 2653} 2654const isFunctionType = (node) => { 2655 return /Function(?:Expression|Declaration)$|Method$/.test(node.type); 2656}; 2657const isStaticProperty = (node) => node && (node.type === "ObjectProperty" || node.type === "ObjectMethod") && !node.computed; 2658const isStaticPropertyKey = (node, parent) => isStaticProperty(parent) && parent.key === node; 2659const TS_NODE_TYPES = [ 2660 "TSAsExpression", 2661 // foo as number 2662 "TSTypeAssertion", 2663 // (<number>foo) 2664 "TSNonNullExpression", 2665 // foo! 2666 "TSInstantiationExpression", 2667 // foo<string> 2668 "TSSatisfiesExpression" 2669 // foo satisfies T 2670]; 2671function unwrapTSNode(node) { 2672 if (TS_NODE_TYPES.includes(node.type)) { 2673 return unwrapTSNode(node.expression); 2674 } else { 2675 return node; 2676 } 2677} 2678 2679const isStaticExp = (p) => p.type === 4 && p.isStatic; 2680function isCoreComponent(tag) { 2681 switch (tag) { 2682 case "Teleport": 2683 case "teleport": 2684 return TELEPORT; 2685 case "Suspense": 2686 case "suspense": 2687 return SUSPENSE; 2688 case "KeepAlive": 2689 case "keep-alive": 2690 return KEEP_ALIVE; 2691 case "BaseTransition": 2692 case "base-transition": 2693 return BASE_TRANSITION; 2694 } 2695} 2696const nonIdentifierRE = /^\d|[^\$\w\xA0-\uFFFF]/; 2697const isSimpleIdentifier = (name) => !nonIdentifierRE.test(name); 2698const validFirstIdentCharRE = /[A-Za-z_$\xA0-\uFFFF]/; 2699const validIdentCharRE = /[\.\?\w$\xA0-\uFFFF]/; 2700const whitespaceRE = /\s+[.[]\s*|\s*[.[]\s+/g; 2701const isMemberExpressionBrowser = (path) => { 2702 path = path.trim().replace(whitespaceRE, (s) => s.trim()); 2703 let state = 0 /* inMemberExp */; 2704 let stateStack = []; 2705 let currentOpenBracketCount = 0; 2706 let currentOpenParensCount = 0; 2707 let currentStringType = null; 2708 for (let i = 0; i < path.length; i++) { 2709 const char = path.charAt(i); 2710 switch (state) { 2711 case 0 /* inMemberExp */: 2712 if (char === "[") { 2713 stateStack.push(state); 2714 state = 1 /* inBrackets */; 2715 currentOpenBracketCount++; 2716 } else if (char === "(") { 2717 stateStack.push(state); 2718 state = 2 /* inParens */; 2719 currentOpenParensCount++; 2720 } else if (!(i === 0 ? validFirstIdentCharRE : validIdentCharRE).test(char)) { 2721 return false; 2722 } 2723 break; 2724 case 1 /* inBrackets */: 2725 if (char === `'` || char === `"` || char === "`") { 2726 stateStack.push(state); 2727 state = 3 /* inString */; 2728 currentStringType = char; 2729 } else if (char === `[`) { 2730 currentOpenBracketCount++; 2731 } else if (char === `]`) { 2732 if (!--currentOpenBracketCount) { 2733 state = stateStack.pop(); 2734 } 2735 } 2736 break; 2737 case 2 /* inParens */: 2738 if (char === `'` || char === `"` || char === "`") { 2739 stateStack.push(state); 2740 state = 3 /* inString */; 2741 currentStringType = char; 2742 } else if (char === `(`) { 2743 currentOpenParensCount++; 2744 } else if (char === `)`) { 2745 if (i === path.length - 1) { 2746 return false; 2747 } 2748 if (!--currentOpenParensCount) { 2749 state = stateStack.pop(); 2750 } 2751 } 2752 break; 2753 case 3 /* inString */: 2754 if (char === currentStringType) { 2755 state = stateStack.pop(); 2756 currentStringType = null; 2757 } 2758 break; 2759 } 2760 } 2761 return !currentOpenBracketCount && !currentOpenParensCount; 2762}; 2763const isMemberExpressionNode = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP ; 2764const isMemberExpression = isMemberExpressionBrowser ; 2765function advancePositionWithClone(pos, source, numberOfCharacters = source.length) { 2766 return advancePositionWithMutation( 2767 { 2768 offset: pos.offset, 2769 line: pos.line, 2770 column: pos.column 2771 }, 2772 source, 2773 numberOfCharacters 2774 ); 2775} 2776function advancePositionWithMutation(pos, source, numberOfCharacters = source.length) { 2777 let linesCount = 0; 2778 let lastNewLinePos = -1; 2779 for (let i = 0; i < numberOfCharacters; i++) { 2780 if (source.charCodeAt(i) === 10) { 2781 linesCount++; 2782 lastNewLinePos = i; 2783 } 2784 } 2785 pos.offset += numberOfCharacters; 2786 pos.line += linesCount; 2787 pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos; 2788 return pos; 2789} 2790function assert(condition, msg) { 2791 if (!condition) { 2792 throw new Error(msg || `unexpected compiler condition`); 2793 } 2794} 2795function findDir(node, name, allowEmpty = false) { 2796 for (let i = 0; i < node.props.length; i++) { 2797 const p = node.props[i]; 2798 if (p.type === 7 && (allowEmpty || p.exp) && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? p.name === name : name.test(p.name))) { 2799 return p; 2800 } 2801 } 2802} 2803function findProp(node, name, dynamicOnly = false, allowEmpty = false) { 2804 for (let i = 0; i < node.props.length; i++) { 2805 const p = node.props[i]; 2806 if (p.type === 6) { 2807 if (dynamicOnly) continue; 2808 if (p.name === name && (p.value || allowEmpty)) { 2809 return p; 2810 } 2811 } else if (p.name === "bind" && (p.exp || allowEmpty) && isStaticArgOf(p.arg, name)) { 2812 return p; 2813 } 2814 } 2815} 2816function isStaticArgOf(arg, name) { 2817 return !!(arg && isStaticExp(arg) && arg.content === name); 2818} 2819function hasDynamicKeyVBind(node) { 2820 return node.props.some( 2821 (p) => p.type === 7 && p.name === "bind" && (!p.arg || // v-bind="obj" 2822 p.arg.type !== 4 || // v-bind:[_ctx.foo] 2823 !p.arg.isStatic) 2824 // v-bind:[foo] 2825 ); 2826} 2827function isText$1(node) { 2828 return node.type === 5 || node.type === 2; 2829} 2830function isVSlot(p) { 2831 return p.type === 7 && p.name === "slot"; 2832} 2833function isTemplateNode(node) { 2834 return node.type === 1 && node.tagType === 3; 2835} 2836function isSlotOutlet(node) { 2837 return node.type === 1 && node.tagType === 2; 2838} 2839const propsHelperSet = /* @__PURE__ */ new Set([NORMALIZE_PROPS, GUARD_REACTIVE_PROPS]); 2840function getUnnormalizedProps(props, callPath = []) { 2841 if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) && props.type === 14) { 2842 const callee = props.callee; 2843 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(callee) && propsHelperSet.has(callee)) { 2844 return getUnnormalizedProps( 2845 props.arguments[0], 2846 callPath.concat(props) 2847 ); 2848 } 2849 } 2850 return [props, callPath]; 2851} 2852function injectProp(node, prop, context) { 2853 let propsWithInjection; 2854 let props = node.type === 13 ? node.props : node.arguments[2]; 2855 let callPath = []; 2856 let parentCall; 2857 if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props) && props.type === 14) { 2858 const ret = getUnnormalizedProps(props); 2859 props = ret[0]; 2860 callPath = ret[1]; 2861 parentCall = callPath[callPath.length - 1]; 2862 } 2863 if (props == null || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(props)) { 2864 propsWithInjection = createObjectExpression([prop]); 2865 } else if (props.type === 14) { 2866 const first = props.arguments[0]; 2867 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(first) && first.type === 15) { 2868 if (!hasProp(prop, first)) { 2869 first.properties.unshift(prop); 2870 } 2871 } else { 2872 if (props.callee === TO_HANDLERS) { 2873 propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [ 2874 createObjectExpression([prop]), 2875 props 2876 ]); 2877 } else { 2878 props.arguments.unshift(createObjectExpression([prop])); 2879 } 2880 } 2881 !propsWithInjection && (propsWithInjection = props); 2882 } else if (props.type === 15) { 2883 if (!hasProp(prop, props)) { 2884 props.properties.unshift(prop); 2885 } 2886 propsWithInjection = props; 2887 } else { 2888 propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [ 2889 createObjectExpression([prop]), 2890 props 2891 ]); 2892 if (parentCall && parentCall.callee === GUARD_REACTIVE_PROPS) { 2893 parentCall = callPath[callPath.length - 2]; 2894 } 2895 } 2896 if (node.type === 13) { 2897 if (parentCall) { 2898 parentCall.arguments[0] = propsWithInjection; 2899 } else { 2900 node.props = propsWithInjection; 2901 } 2902 } else { 2903 if (parentCall) { 2904 parentCall.arguments[0] = propsWithInjection; 2905 } else { 2906 node.arguments[2] = propsWithInjection; 2907 } 2908 } 2909} 2910function hasProp(prop, props) { 2911 let result = false; 2912 if (prop.key.type === 4) { 2913 const propKeyName = prop.key.content; 2914 result = props.properties.some( 2915 (p) => p.key.type === 4 && p.key.content === propKeyName 2916 ); 2917 } 2918 return result; 2919} 2920function toValidAssetId(name, type) { 2921 return `_${type}_${name.replace(/[^\w]/g, (searchValue, replaceValue) => { 2922 return searchValue === "-" ? "_" : name.charCodeAt(replaceValue).toString(); 2923 })}`; 2924} 2925function hasScopeRef(node, ids) { 2926 if (!node || Object.keys(ids).length === 0) { 2927 return false; 2928 } 2929 switch (node.type) { 2930 case 1: 2931 for (let i = 0; i < node.props.length; i++) { 2932 const p = node.props[i]; 2933 if (p.type === 7 && (hasScopeRef(p.arg, ids) || hasScopeRef(p.exp, ids))) { 2934 return true; 2935 } 2936 } 2937 return node.children.some((c) => hasScopeRef(c, ids)); 2938 case 11: 2939 if (hasScopeRef(node.source, ids)) { 2940 return true; 2941 } 2942 return node.children.some((c) => hasScopeRef(c, ids)); 2943 case 9: 2944 return node.branches.some((b) => hasScopeRef(b, ids)); 2945 case 10: 2946 if (hasScopeRef(node.condition, ids)) { 2947 return true; 2948 } 2949 return node.children.some((c) => hasScopeRef(c, ids)); 2950 case 4: 2951 return !node.isStatic && isSimpleIdentifier(node.content) && !!ids[node.content]; 2952 case 8: 2953 return node.children.some((c) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(c) && hasScopeRef(c, ids)); 2954 case 5: 2955 case 12: 2956 return hasScopeRef(node.content, ids); 2957 case 2: 2958 case 3: 2959 return false; 2960 default: 2961 if (true) ; 2962 return false; 2963 } 2964} 2965function getMemoedVNodeCall(node) { 2966 if (node.type === 14 && node.callee === WITH_MEMO) { 2967 return node.arguments[1].returns; 2968 } else { 2969 return node; 2970 } 2971} 2972const forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+(\S[\s\S]*)/; 2973 2974const defaultParserOptions = { 2975 parseMode: "base", 2976 ns: 0, 2977 delimiters: [`{{`, `}}`], 2978 getNamespace: () => 0, 2979 isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO, 2980 isPreTag: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO, 2981 isCustomElement: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NO, 2982 onError: defaultOnError, 2983 onWarn: defaultOnWarn, 2984 comments: !!("development" !== "production"), 2985 prefixIdentifiers: false 2986}; 2987let currentOptions = defaultParserOptions; 2988let currentRoot = null; 2989let currentInput = ""; 2990let currentOpenTag = null; 2991let currentProp = null; 2992let currentAttrValue = ""; 2993let currentAttrStartIndex = -1; 2994let currentAttrEndIndex = -1; 2995let inPre = 0; 2996let inVPre = false; 2997let currentVPreBoundary = null; 2998const stack = []; 2999const tokenizer = new Tokenizer(stack, { 3000 onerr: emitError, 3001 ontext(start, end) { 3002 onText(getSlice(start, end), start, end); 3003 }, 3004 ontextentity(char, start, end) { 3005 onText(char, start, end); 3006 }, 3007 oninterpolation(start, end) { 3008 if (inVPre) { 3009 return onText(getSlice(start, end), start, end); 3010 } 3011 let innerStart = start + tokenizer.delimiterOpen.length; 3012 let innerEnd = end - tokenizer.delimiterClose.length; 3013 while (isWhitespace(currentInput.charCodeAt(innerStart))) { 3014 innerStart++; 3015 } 3016 while (isWhitespace(currentInput.charCodeAt(innerEnd - 1))) { 3017 innerEnd--; 3018 } 3019 let exp = getSlice(innerStart, innerEnd); 3020 if (exp.includes("&")) { 3021 { 3022 exp = currentOptions.decodeEntities(exp, false); 3023 } 3024 } 3025 addNode({ 3026 type: 5, 3027 content: createExp(exp, false, getLoc(innerStart, innerEnd)), 3028 loc: getLoc(start, end) 3029 }); 3030 }, 3031 onopentagname(start, end) { 3032 const name = getSlice(start, end); 3033 currentOpenTag = { 3034 type: 1, 3035 tag: name, 3036 ns: currentOptions.getNamespace(name, stack[0], currentOptions.ns), 3037 tagType: 0, 3038 // will be refined on tag close 3039 props: [], 3040 children: [], 3041 loc: getLoc(start - 1, end), 3042 codegenNode: void 0 3043 }; 3044 }, 3045 onopentagend(end) { 3046 endOpenTag(end); 3047 }, 3048 onclosetag(start, end) { 3049 const name = getSlice(start, end); 3050 if (!currentOptions.isVoidTag(name)) { 3051 let found = false; 3052 for (let i = 0; i < stack.length; i++) { 3053 const e = stack[i]; 3054 if (e.tag.toLowerCase() === name.toLowerCase()) { 3055 found = true; 3056 if (i > 0) { 3057 emitError(24, stack[0].loc.start.offset); 3058 } 3059 for (let j = 0; j <= i; j++) { 3060 const el = stack.shift(); 3061 onCloseTag(el, end, j < i); 3062 } 3063 break; 3064 } 3065 } 3066 if (!found) { 3067 emitError(23, backTrack(start, 60)); 3068 } 3069 } 3070 }, 3071 onselfclosingtag(end) { 3072 const name = currentOpenTag.tag; 3073 currentOpenTag.isSelfClosing = true; 3074 endOpenTag(end); 3075 if (stack[0] && stack[0].tag === name) { 3076 onCloseTag(stack.shift(), end); 3077 } 3078 }, 3079 onattribname(start, end) { 3080 currentProp = { 3081 type: 6, 3082 name: getSlice(start, end), 3083 nameLoc: getLoc(start, end), 3084 value: void 0, 3085 loc: getLoc(start) 3086 }; 3087 }, 3088 ondirname(start, end) { 3089 const raw = getSlice(start, end); 3090 const name = raw === "." || raw === ":" ? "bind" : raw === "@" ? "on" : raw === "#" ? "slot" : raw.slice(2); 3091 if (!inVPre && name === "") { 3092 emitError(26, start); 3093 } 3094 if (inVPre || name === "") { 3095 currentProp = { 3096 type: 6, 3097 name: raw, 3098 nameLoc: getLoc(start, end), 3099 value: void 0, 3100 loc: getLoc(start) 3101 }; 3102 } else { 3103 currentProp = { 3104 type: 7, 3105 name, 3106 rawName: raw, 3107 exp: void 0, 3108 arg: void 0, 3109 modifiers: raw === "." ? ["prop"] : [], 3110 loc: getLoc(start) 3111 }; 3112 if (name === "pre") { 3113 inVPre = tokenizer.inVPre = true; 3114 currentVPreBoundary = currentOpenTag; 3115 const props = currentOpenTag.props; 3116 for (let i = 0; i < props.length; i++) { 3117 if (props[i].type === 7) { 3118 props[i] = dirToAttr(props[i]); 3119 } 3120 } 3121 } 3122 } 3123 }, 3124 ondirarg(start, end) { 3125 if (start === end) return; 3126 const arg = getSlice(start, end); 3127 if (inVPre) { 3128 currentProp.name += arg; 3129 setLocEnd(currentProp.nameLoc, end); 3130 } else { 3131 const isStatic = arg[0] !== `[`; 3132 currentProp.arg = createExp( 3133 isStatic ? arg : arg.slice(1, -1), 3134 isStatic, 3135 getLoc(start, end), 3136 isStatic ? 3 : 0 3137 ); 3138 } 3139 }, 3140 ondirmodifier(start, end) { 3141 const mod = getSlice(start, end); 3142 if (inVPre) { 3143 currentProp.name += "." + mod; 3144 setLocEnd(currentProp.nameLoc, end); 3145 } else if (currentProp.name === "slot") { 3146 const arg = currentProp.arg; 3147 if (arg) { 3148 arg.content += "." + mod; 3149 setLocEnd(arg.loc, end); 3150 } 3151 } else { 3152 currentProp.modifiers.push(mod); 3153 } 3154 }, 3155 onattribdata(start, end) { 3156 currentAttrValue += getSlice(start, end); 3157 if (currentAttrStartIndex < 0) currentAttrStartIndex = start; 3158 currentAttrEndIndex = end; 3159 }, 3160 onattribentity(char, start, end) { 3161 currentAttrValue += char; 3162 if (currentAttrStartIndex < 0) currentAttrStartIndex = start; 3163 currentAttrEndIndex = end; 3164 }, 3165 onattribnameend(end) { 3166 const start = currentProp.loc.start.offset; 3167 const name = getSlice(start, end); 3168 if (currentProp.type === 7) { 3169 currentProp.rawName = name; 3170 } 3171 if (currentOpenTag.props.some( 3172 (p) => (p.type === 7 ? p.rawName : p.name) === name 3173 )) { 3174 emitError(2, start); 3175 } 3176 }, 3177 onattribend(quote, end) { 3178 if (currentOpenTag && currentProp) { 3179 setLocEnd(currentProp.loc, end); 3180 if (quote !== 0) { 3181 if (currentAttrValue.includes("&")) { 3182 currentAttrValue = currentOptions.decodeEntities( 3183 currentAttrValue, 3184 true 3185 ); 3186 } 3187 if (currentProp.type === 6) { 3188 if (currentProp.name === "class") { 3189 currentAttrValue = condense(currentAttrValue).trim(); 3190 } 3191 if (quote === 1 && !currentAttrValue) { 3192 emitError(13, end); 3193 } 3194 currentProp.value = { 3195 type: 2, 3196 content: currentAttrValue, 3197 loc: quote === 1 ? getLoc(currentAttrStartIndex, currentAttrEndIndex) : getLoc(currentAttrStartIndex - 1, currentAttrEndIndex + 1) 3198 }; 3199 if (tokenizer.inSFCRoot && currentOpenTag.tag === "template" && currentProp.name === "lang" && currentAttrValue && currentAttrValue !== "html") { 3200 tokenizer.enterRCDATA(toCharCodes(`</template`), 0); 3201 } 3202 } else { 3203 let expParseMode = 0 /* Normal */; 3204 currentProp.exp = createExp( 3205 currentAttrValue, 3206 false, 3207 getLoc(currentAttrStartIndex, currentAttrEndIndex), 3208 0, 3209 expParseMode 3210 ); 3211 if (currentProp.name === "for") { 3212 currentProp.forParseResult = parseForExpression(currentProp.exp); 3213 } 3214 let syncIndex = -1; 3215 if (currentProp.name === "bind" && (syncIndex = currentProp.modifiers.indexOf("sync")) > -1 && checkCompatEnabled( 3216 "COMPILER_V_BIND_SYNC", 3217 currentOptions, 3218 currentProp.loc, 3219 currentProp.rawName 3220 )) { 3221 currentProp.name = "model"; 3222 currentProp.modifiers.splice(syncIndex, 1); 3223 } 3224 } 3225 } 3226 if (currentProp.type !== 7 || currentProp.name !== "pre") { 3227 currentOpenTag.props.push(currentProp); 3228 } 3229 } 3230 currentAttrValue = ""; 3231 currentAttrStartIndex = currentAttrEndIndex = -1; 3232 }, 3233 oncomment(start, end) { 3234 if (currentOptions.comments) { 3235 addNode({ 3236 type: 3, 3237 content: getSlice(start, end), 3238 loc: getLoc(start - 4, end + 3) 3239 }); 3240 } 3241 }, 3242 onend() { 3243 const end = currentInput.length; 3244 if (( true) && tokenizer.state !== 1) { 3245 switch (tokenizer.state) { 3246 case 5: 3247 case 8: 3248 emitError(5, end); 3249 break; 3250 case 3: 3251 case 4: 3252 emitError( 3253 25, 3254 tokenizer.sectionStart 3255 ); 3256 break; 3257 case 28: 3258 if (tokenizer.currentSequence === Sequences.CdataEnd) { 3259 emitError(6, end); 3260 } else { 3261 emitError(7, end); 3262 } 3263 break; 3264 case 6: 3265 case 7: 3266 case 9: 3267 case 11: 3268 case 12: 3269 case 13: 3270 case 14: 3271 case 15: 3272 case 16: 3273 case 17: 3274 case 18: 3275 case 19: 3276 case 20: 3277 case 21: 3278 emitError(9, end); 3279 break; 3280 } 3281 } 3282 for (let index = 0; index < stack.length; index++) { 3283 onCloseTag(stack[index], end - 1); 3284 emitError(24, stack[index].loc.start.offset); 3285 } 3286 }, 3287 oncdata(start, end) { 3288 if (stack[0].ns !== 0) { 3289 onText(getSlice(start, end), start, end); 3290 } else { 3291 emitError(1, start - 9); 3292 } 3293 }, 3294 onprocessinginstruction(start) { 3295 if ((stack[0] ? stack[0].ns : currentOptions.ns) === 0) { 3296 emitError( 3297 21, 3298 start - 1 3299 ); 3300 } 3301 } 3302}); 3303const forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/; 3304const stripParensRE = /^\(|\)$/g; 3305function parseForExpression(input) { 3306 const loc = input.loc; 3307 const exp = input.content; 3308 const inMatch = exp.match(forAliasRE); 3309 if (!inMatch) return; 3310 const [, LHS, RHS] = inMatch; 3311 const createAliasExpression = (content, offset, asParam = false) => { 3312 const start = loc.start.offset + offset; 3313 const end = start + content.length; 3314 return createExp( 3315 content, 3316 false, 3317 getLoc(start, end), 3318 0, 3319 asParam ? 1 /* Params */ : 0 /* Normal */ 3320 ); 3321 }; 3322 const result = { 3323 source: createAliasExpression(RHS.trim(), exp.indexOf(RHS, LHS.length)), 3324 value: void 0, 3325 key: void 0, 3326 index: void 0, 3327 finalized: false 3328 }; 3329 let valueContent = LHS.trim().replace(stripParensRE, "").trim(); 3330 const trimmedOffset = LHS.indexOf(valueContent); 3331 const iteratorMatch = valueContent.match(forIteratorRE); 3332 if (iteratorMatch) { 3333 valueContent = valueContent.replace(forIteratorRE, "").trim(); 3334 const keyContent = iteratorMatch[1].trim(); 3335 let keyOffset; 3336 if (keyContent) { 3337 keyOffset = exp.indexOf(keyContent, trimmedOffset + valueContent.length); 3338 result.key = createAliasExpression(keyContent, keyOffset, true); 3339 } 3340 if (iteratorMatch[2]) { 3341 const indexContent = iteratorMatch[2].trim(); 3342 if (indexContent) { 3343 result.index = createAliasExpression( 3344 indexContent, 3345 exp.indexOf( 3346 indexContent, 3347 result.key ? keyOffset + keyContent.length : trimmedOffset + valueContent.length 3348 ), 3349 true 3350 ); 3351 } 3352 } 3353 } 3354 if (valueContent) { 3355 result.value = createAliasExpression(valueContent, trimmedOffset, true); 3356 } 3357 return result; 3358} 3359function getSlice(start, end) { 3360 return currentInput.slice(start, end); 3361} 3362function endOpenTag(end) { 3363 if (tokenizer.inSFCRoot) { 3364 currentOpenTag.innerLoc = getLoc(end + 1, end + 1); 3365 } 3366 addNode(currentOpenTag); 3367 const { tag, ns } = currentOpenTag; 3368 if (ns === 0 && currentOptions.isPreTag(tag)) { 3369 inPre++; 3370 } 3371 if (currentOptions.isVoidTag(tag)) { 3372 onCloseTag(currentOpenTag, end); 3373 } else { 3374 stack.unshift(currentOpenTag); 3375 if (ns === 1 || ns === 2) { 3376 tokenizer.inXML = true; 3377 } 3378 } 3379 currentOpenTag = null; 3380} 3381function onText(content, start, end) { 3382 { 3383 const tag = stack[0] && stack[0].tag; 3384 if (tag !== "script" && tag !== "style" && content.includes("&")) { 3385 content = currentOptions.decodeEntities(content, false); 3386 } 3387 } 3388 const parent = stack[0] || currentRoot; 3389 const lastNode = parent.children[parent.children.length - 1]; 3390 if (lastNode && lastNode.type === 2) { 3391 lastNode.content += content; 3392 setLocEnd(lastNode.loc, end); 3393 } else { 3394 parent.children.push({ 3395 type: 2, 3396 content, 3397 loc: getLoc(start, end) 3398 }); 3399 } 3400} 3401function onCloseTag(el, end, isImplied = false) { 3402 if (isImplied) { 3403 setLocEnd(el.loc, backTrack(end, 60)); 3404 } else { 3405 setLocEnd(el.loc, lookAhead(end, 62) + 1); 3406 } 3407 if (tokenizer.inSFCRoot) { 3408 if (el.children.length) { 3409 el.innerLoc.end = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, el.children[el.children.length - 1].loc.end); 3410 } else { 3411 el.innerLoc.end = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, el.innerLoc.start); 3412 } 3413 el.innerLoc.source = getSlice( 3414 el.innerLoc.start.offset, 3415 el.innerLoc.end.offset 3416 ); 3417 } 3418 const { tag, ns } = el; 3419 if (!inVPre) { 3420 if (tag === "slot") { 3421 el.tagType = 2; 3422 } else if (isFragmentTemplate(el)) { 3423 el.tagType = 3; 3424 } else if (isComponent(el)) { 3425 el.tagType = 1; 3426 } 3427 } 3428 if (!tokenizer.inRCDATA) { 3429 el.children = condenseWhitespace(el.children, el.tag); 3430 } 3431 if (ns === 0 && currentOptions.isPreTag(tag)) { 3432 inPre--; 3433 } 3434 if (currentVPreBoundary === el) { 3435 inVPre = tokenizer.inVPre = false; 3436 currentVPreBoundary = null; 3437 } 3438 if (tokenizer.inXML && (stack[0] ? stack[0].ns : currentOptions.ns) === 0) { 3439 tokenizer.inXML = false; 3440 } 3441 { 3442 const props = el.props; 3443 if ( true && isCompatEnabled( 3444 "COMPILER_V_IF_V_FOR_PRECEDENCE", 3445 currentOptions 3446 )) { 3447 let hasIf = false; 3448 let hasFor = false; 3449 for (let i = 0; i < props.length; i++) { 3450 const p = props[i]; 3451 if (p.type === 7) { 3452 if (p.name === "if") { 3453 hasIf = true; 3454 } else if (p.name === "for") { 3455 hasFor = true; 3456 } 3457 } 3458 if (hasIf && hasFor) { 3459 warnDeprecation( 3460 "COMPILER_V_IF_V_FOR_PRECEDENCE", 3461 currentOptions, 3462 el.loc 3463 ); 3464 break; 3465 } 3466 } 3467 } 3468 if (!tokenizer.inSFCRoot && isCompatEnabled( 3469 "COMPILER_NATIVE_TEMPLATE", 3470 currentOptions 3471 ) && el.tag === "template" && !isFragmentTemplate(el)) { 3472 true && warnDeprecation( 3473 "COMPILER_NATIVE_TEMPLATE", 3474 currentOptions, 3475 el.loc 3476 ); 3477 const parent = stack[0] || currentRoot; 3478 const index = parent.children.indexOf(el); 3479 parent.children.splice(index, 1, ...el.children); 3480 } 3481 const inlineTemplateProp = props.find( 3482 (p) => p.type === 6 && p.name === "inline-template" 3483 ); 3484 if (inlineTemplateProp && checkCompatEnabled( 3485 "COMPILER_INLINE_TEMPLATE", 3486 currentOptions, 3487 inlineTemplateProp.loc 3488 ) && el.children.length) { 3489 inlineTemplateProp.value = { 3490 type: 2, 3491 content: getSlice( 3492 el.children[0].loc.start.offset, 3493 el.children[el.children.length - 1].loc.end.offset 3494 ), 3495 loc: inlineTemplateProp.loc 3496 }; 3497 } 3498 } 3499} 3500function lookAhead(index, c) { 3501 let i = index; 3502 while (currentInput.charCodeAt(i) !== c && i < currentInput.length - 1) i++; 3503 return i; 3504} 3505function backTrack(index, c) { 3506 let i = index; 3507 while (currentInput.charCodeAt(i) !== c && i >= 0) i--; 3508 return i; 3509} 3510const specialTemplateDir = /* @__PURE__ */ new Set(["if", "else", "else-if", "for", "slot"]); 3511function isFragmentTemplate({ tag, props }) { 3512 if (tag === "template") { 3513 for (let i = 0; i < props.length; i++) { 3514 if (props[i].type === 7 && specialTemplateDir.has(props[i].name)) { 3515 return true; 3516 } 3517 } 3518 } 3519 return false; 3520} 3521function isComponent({ tag, props }) { 3522 if (currentOptions.isCustomElement(tag)) { 3523 return false; 3524 } 3525 if (tag === "component" || isUpperCase(tag.charCodeAt(0)) || isCoreComponent(tag) || currentOptions.isBuiltInComponent && currentOptions.isBuiltInComponent(tag) || currentOptions.isNativeTag && !currentOptions.isNativeTag(tag)) { 3526 return true; 3527 } 3528 for (let i = 0; i < props.length; i++) { 3529 const p = props[i]; 3530 if (p.type === 6) { 3531 if (p.name === "is" && p.value) { 3532 if (p.value.content.startsWith("vue:")) { 3533 return true; 3534 } else if (checkCompatEnabled( 3535 "COMPILER_IS_ON_ELEMENT", 3536 currentOptions, 3537 p.loc 3538 )) { 3539 return true; 3540 } 3541 } 3542 } else if (// :is on plain element - only treat as component in compat mode 3543 p.name === "bind" && isStaticArgOf(p.arg, "is") && checkCompatEnabled( 3544 "COMPILER_IS_ON_ELEMENT", 3545 currentOptions, 3546 p.loc 3547 )) { 3548 return true; 3549 } 3550 } 3551 return false; 3552} 3553function isUpperCase(c) { 3554 return c > 64 && c < 91; 3555} 3556const windowsNewlineRE = /\r\n/g; 3557function condenseWhitespace(nodes, tag) { 3558 const shouldCondense = currentOptions.whitespace !== "preserve"; 3559 let removedWhitespace = false; 3560 for (let i = 0; i < nodes.length; i++) { 3561 const node = nodes[i]; 3562 if (node.type === 2) { 3563 if (!inPre) { 3564 if (isAllWhitespace(node.content)) { 3565 const prev = nodes[i - 1] && nodes[i - 1].type; 3566 const next = nodes[i + 1] && nodes[i + 1].type; 3567 if (!prev || !next || shouldCondense && (prev === 3 && (next === 3 || next === 1) || prev === 1 && (next === 3 || next === 1 && hasNewlineChar(node.content)))) { 3568 removedWhitespace = true; 3569 nodes[i] = null; 3570 } else { 3571 node.content = " "; 3572 } 3573 } else if (shouldCondense) { 3574 node.content = condense(node.content); 3575 } 3576 } else { 3577 node.content = node.content.replace(windowsNewlineRE, "\n"); 3578 } 3579 } 3580 } 3581 if (inPre && tag && currentOptions.isPreTag(tag)) { 3582 const first = nodes[0]; 3583 if (first && first.type === 2) { 3584 first.content = first.content.replace(/^\r?\n/, ""); 3585 } 3586 } 3587 return removedWhitespace ? nodes.filter(Boolean) : nodes; 3588} 3589function isAllWhitespace(str) { 3590 for (let i = 0; i < str.length; i++) { 3591 if (!isWhitespace(str.charCodeAt(i))) { 3592 return false; 3593 } 3594 } 3595 return true; 3596} 3597function hasNewlineChar(str) { 3598 for (let i = 0; i < str.length; i++) { 3599 const c = str.charCodeAt(i); 3600 if (c === 10 || c === 13) { 3601 return true; 3602 } 3603 } 3604 return false; 3605} 3606function condense(str) { 3607 let ret = ""; 3608 let prevCharIsWhitespace = false; 3609 for (let i = 0; i < str.length; i++) { 3610 if (isWhitespace(str.charCodeAt(i))) { 3611 if (!prevCharIsWhitespace) { 3612 ret += " "; 3613 prevCharIsWhitespace = true; 3614 } 3615 } else { 3616 ret += str[i]; 3617 prevCharIsWhitespace = false; 3618 } 3619 } 3620 return ret; 3621} 3622function addNode(node) { 3623 (stack[0] || currentRoot).children.push(node); 3624} 3625function getLoc(start, end) { 3626 return { 3627 start: tokenizer.getPos(start), 3628 // @ts-expect-error allow late attachment 3629 end: end == null ? end : tokenizer.getPos(end), 3630 // @ts-expect-error allow late attachment 3631 source: end == null ? end : getSlice(start, end) 3632 }; 3633} 3634function setLocEnd(loc, end) { 3635 loc.end = tokenizer.getPos(end); 3636 loc.source = getSlice(loc.start.offset, end); 3637} 3638function dirToAttr(dir) { 3639 const attr = { 3640 type: 6, 3641 name: dir.rawName, 3642 nameLoc: getLoc( 3643 dir.loc.start.offset, 3644 dir.loc.start.offset + dir.rawName.length 3645 ), 3646 value: void 0, 3647 loc: dir.loc 3648 }; 3649 if (dir.exp) { 3650 const loc = dir.exp.loc; 3651 if (loc.end.offset < dir.loc.end.offset) { 3652 loc.start.offset--; 3653 loc.start.column--; 3654 loc.end.offset++; 3655 loc.end.column++; 3656 } 3657 attr.value = { 3658 type: 2, 3659 content: dir.exp.content, 3660 loc 3661 }; 3662 } 3663 return attr; 3664} 3665function createExp(content, isStatic = false, loc, constType = 0, parseMode = 0 /* Normal */) { 3666 const exp = createSimpleExpression(content, isStatic, loc, constType); 3667 return exp; 3668} 3669function emitError(code, index, message) { 3670 currentOptions.onError( 3671 createCompilerError(code, getLoc(index, index), void 0, message) 3672 ); 3673} 3674function reset() { 3675 tokenizer.reset(); 3676 currentOpenTag = null; 3677 currentProp = null; 3678 currentAttrValue = ""; 3679 currentAttrStartIndex = -1; 3680 currentAttrEndIndex = -1; 3681 stack.length = 0; 3682} 3683function baseParse(input, options) { 3684 reset(); 3685 currentInput = input; 3686 currentOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, defaultParserOptions); 3687 if (options) { 3688 let key; 3689 for (key in options) { 3690 if (options[key] != null) { 3691 currentOptions[key] = options[key]; 3692 } 3693 } 3694 } 3695 if (true) { 3696 if (!currentOptions.decodeEntities) { 3697 throw new Error( 3698 `[@vue/compiler-core] decodeEntities option is required in browser builds.` 3699 ); 3700 } 3701 } 3702 tokenizer.mode = currentOptions.parseMode === "html" ? 1 : currentOptions.parseMode === "sfc" ? 2 : 0; 3703 tokenizer.inXML = currentOptions.ns === 1 || currentOptions.ns === 2; 3704 const delimiters = options && options.delimiters; 3705 if (delimiters) { 3706 tokenizer.delimiterOpen = toCharCodes(delimiters[0]); 3707 tokenizer.delimiterClose = toCharCodes(delimiters[1]); 3708 } 3709 const root = currentRoot = createRoot([], input); 3710 tokenizer.parse(currentInput); 3711 root.loc = getLoc(0, input.length); 3712 root.children = condenseWhitespace(root.children); 3713 currentRoot = null; 3714 return root; 3715} 3716 3717function hoistStatic(root, context) { 3718 walk( 3719 root, 3720 context, 3721 // Root node is unfortunately non-hoistable due to potential parent 3722 // fallthrough attributes. 3723 isSingleElementRoot(root, root.children[0]) 3724 ); 3725} 3726function isSingleElementRoot(root, child) { 3727 const { children } = root; 3728 return children.length === 1 && child.type === 1 && !isSlotOutlet(child); 3729} 3730function walk(node, context, doNotHoistNode = false) { 3731 const { children } = node; 3732 const originalCount = children.length; 3733 let hoistedCount = 0; 3734 for (let i = 0; i < children.length; i++) { 3735 const child = children[i]; 3736 if (child.type === 1 && child.tagType === 0) { 3737 const constantType = doNotHoistNode ? 0 : getConstantType(child, context); 3738 if (constantType > 0) { 3739 if (constantType >= 2) { 3740 child.codegenNode.patchFlag = -1; 3741 child.codegenNode = context.hoist(child.codegenNode); 3742 hoistedCount++; 3743 continue; 3744 } 3745 } else { 3746 const codegenNode = child.codegenNode; 3747 if (codegenNode.type === 13) { 3748 const flag = codegenNode.patchFlag; 3749 if ((flag === void 0 || flag === 512 || flag === 1) && getGeneratedPropsConstantType(child, context) >= 2) { 3750 const props = getNodeProps(child); 3751 if (props) { 3752 codegenNode.props = context.hoist(props); 3753 } 3754 } 3755 if (codegenNode.dynamicProps) { 3756 codegenNode.dynamicProps = context.hoist(codegenNode.dynamicProps); 3757 } 3758 } 3759 } 3760 } 3761 if (child.type === 1) { 3762 const isComponent = child.tagType === 1; 3763 if (isComponent) { 3764 context.scopes.vSlot++; 3765 } 3766 walk(child, context); 3767 if (isComponent) { 3768 context.scopes.vSlot--; 3769 } 3770 } else if (child.type === 11) { 3771 walk(child, context, child.children.length === 1); 3772 } else if (child.type === 9) { 3773 for (let i2 = 0; i2 < child.branches.length; i2++) { 3774 walk( 3775 child.branches[i2], 3776 context, 3777 child.branches[i2].children.length === 1 3778 ); 3779 } 3780 } 3781 } 3782 if (hoistedCount && context.transformHoist) { 3783 context.transformHoist(children, context, node); 3784 } 3785 if (hoistedCount && hoistedCount === originalCount && node.type === 1 && node.tagType === 0 && node.codegenNode && node.codegenNode.type === 13 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node.codegenNode.children)) { 3786 const hoisted = context.hoist( 3787 createArrayExpression(node.codegenNode.children) 3788 ); 3789 if (context.hmr) { 3790 hoisted.content = `[...${hoisted.content}]`; 3791 } 3792 node.codegenNode.children = hoisted; 3793 } 3794} 3795function getConstantType(node, context) { 3796 const { constantCache } = context; 3797 switch (node.type) { 3798 case 1: 3799 if (node.tagType !== 0) { 3800 return 0; 3801 } 3802 const cached = constantCache.get(node); 3803 if (cached !== void 0) { 3804 return cached; 3805 } 3806 const codegenNode = node.codegenNode; 3807 if (codegenNode.type !== 13) { 3808 return 0; 3809 } 3810 if (codegenNode.isBlock && node.tag !== "svg" && node.tag !== "foreignObject" && node.tag !== "math") { 3811 return 0; 3812 } 3813 if (codegenNode.patchFlag === void 0) { 3814 let returnType2 = 3; 3815 const generatedPropsType = getGeneratedPropsConstantType(node, context); 3816 if (generatedPropsType === 0) { 3817 constantCache.set(node, 0); 3818 return 0; 3819 } 3820 if (generatedPropsType < returnType2) { 3821 returnType2 = generatedPropsType; 3822 } 3823 for (let i = 0; i < node.children.length; i++) { 3824 const childType = getConstantType(node.children[i], context); 3825 if (childType === 0) { 3826 constantCache.set(node, 0); 3827 return 0; 3828 } 3829 if (childType < returnType2) { 3830 returnType2 = childType; 3831 } 3832 } 3833 if (returnType2 > 1) { 3834 for (let i = 0; i < node.props.length; i++) { 3835 const p = node.props[i]; 3836 if (p.type === 7 && p.name === "bind" && p.exp) { 3837 const expType = getConstantType(p.exp, context); 3838 if (expType === 0) { 3839 constantCache.set(node, 0); 3840 return 0; 3841 } 3842 if (expType < returnType2) { 3843 returnType2 = expType; 3844 } 3845 } 3846 } 3847 } 3848 if (codegenNode.isBlock) { 3849 for (let i = 0; i < node.props.length; i++) { 3850 const p = node.props[i]; 3851 if (p.type === 7) { 3852 constantCache.set(node, 0); 3853 return 0; 3854 } 3855 } 3856 context.removeHelper(OPEN_BLOCK); 3857 context.removeHelper( 3858 getVNodeBlockHelper(context.inSSR, codegenNode.isComponent) 3859 ); 3860 codegenNode.isBlock = false; 3861 context.helper(getVNodeHelper(context.inSSR, codegenNode.isComponent)); 3862 } 3863 constantCache.set(node, returnType2); 3864 return returnType2; 3865 } else { 3866 constantCache.set(node, 0); 3867 return 0; 3868 } 3869 case 2: 3870 case 3: 3871 return 3; 3872 case 9: 3873 case 11: 3874 case 10: 3875 return 0; 3876 case 5: 3877 case 12: 3878 return getConstantType(node.content, context); 3879 case 4: 3880 return node.constType; 3881 case 8: 3882 let returnType = 3; 3883 for (let i = 0; i < node.children.length; i++) { 3884 const child = node.children[i]; 3885 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(child)) { 3886 continue; 3887 } 3888 const childType = getConstantType(child, context); 3889 if (childType === 0) { 3890 return 0; 3891 } else if (childType < returnType) { 3892 returnType = childType; 3893 } 3894 } 3895 return returnType; 3896 default: 3897 if (true) ; 3898 return 0; 3899 } 3900} 3901const allowHoistedHelperSet = /* @__PURE__ */ new Set([ 3902 NORMALIZE_CLASS, 3903 NORMALIZE_STYLE, 3904 NORMALIZE_PROPS, 3905 GUARD_REACTIVE_PROPS 3906]); 3907function getConstantTypeOfHelperCall(value, context) { 3908 if (value.type === 14 && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(value.callee) && allowHoistedHelperSet.has(value.callee)) { 3909 const arg = value.arguments[0]; 3910 if (arg.type === 4) { 3911 return getConstantType(arg, context); 3912 } else if (arg.type === 14) { 3913 return getConstantTypeOfHelperCall(arg, context); 3914 } 3915 } 3916 return 0; 3917} 3918function getGeneratedPropsConstantType(node, context) { 3919 let returnType = 3; 3920 const props = getNodeProps(node); 3921 if (props && props.type === 15) { 3922 const { properties } = props; 3923 for (let i = 0; i < properties.length; i++) { 3924 const { key, value } = properties[i]; 3925 const keyType = getConstantType(key, context); 3926 if (keyType === 0) { 3927 return keyType; 3928 } 3929 if (keyType < returnType) { 3930 returnType = keyType; 3931 } 3932 let valueType; 3933 if (value.type === 4) { 3934 valueType = getConstantType(value, context); 3935 } else if (value.type === 14) { 3936 valueType = getConstantTypeOfHelperCall(value, context); 3937 } else { 3938 valueType = 0; 3939 } 3940 if (valueType === 0) { 3941 return valueType; 3942 } 3943 if (valueType < returnType) { 3944 returnType = valueType; 3945 } 3946 } 3947 } 3948 return returnType; 3949} 3950function getNodeProps(node) { 3951 const codegenNode = node.codegenNode; 3952 if (codegenNode.type === 13) { 3953 return codegenNode.props; 3954 } 3955} 3956 3957function createTransformContext(root, { 3958 filename = "", 3959 prefixIdentifiers = false, 3960 hoistStatic: hoistStatic2 = false, 3961 hmr = false, 3962 cacheHandlers = false, 3963 nodeTransforms = [], 3964 directiveTransforms = {}, 3965 transformHoist = null, 3966 isBuiltInComponent = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, 3967 isCustomElement = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, 3968 expressionPlugins = [], 3969 scopeId = null, 3970 slotted = true, 3971 ssr = false, 3972 inSSR = false, 3973 ssrCssVars = ``, 3974 bindingMetadata = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.EMPTY_OBJ, 3975 inline = false, 3976 isTS = false, 3977 onError = defaultOnError, 3978 onWarn = defaultOnWarn, 3979 compatConfig 3980}) { 3981 const nameMatch = filename.replace(/\?.*$/, "").match(/([^/\\]+)\.\w+$/); 3982 const context = { 3983 // options 3984 filename, 3985 selfName: nameMatch && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(nameMatch[1])), 3986 prefixIdentifiers, 3987 hoistStatic: hoistStatic2, 3988 hmr, 3989 cacheHandlers, 3990 nodeTransforms, 3991 directiveTransforms, 3992 transformHoist, 3993 isBuiltInComponent, 3994 isCustomElement, 3995 expressionPlugins, 3996 scopeId, 3997 slotted, 3998 ssr, 3999 inSSR, 4000 ssrCssVars, 4001 bindingMetadata, 4002 inline, 4003 isTS, 4004 onError, 4005 onWarn, 4006 compatConfig, 4007 // state 4008 root, 4009 helpers: /* @__PURE__ */ new Map(), 4010 components: /* @__PURE__ */ new Set(), 4011 directives: /* @__PURE__ */ new Set(), 4012 hoists: [], 4013 imports: [], 4014 constantCache: /* @__PURE__ */ new WeakMap(), 4015 temps: 0, 4016 cached: 0, 4017 identifiers: /* @__PURE__ */ Object.create(null), 4018 scopes: { 4019 vFor: 0, 4020 vSlot: 0, 4021 vPre: 0, 4022 vOnce: 0 4023 }, 4024 parent: null, 4025 grandParent: null, 4026 currentNode: root, 4027 childIndex: 0, 4028 inVOnce: false, 4029 // methods 4030 helper(name) { 4031 const count = context.helpers.get(name) || 0; 4032 context.helpers.set(name, count + 1); 4033 return name; 4034 }, 4035 removeHelper(name) { 4036 const count = context.helpers.get(name); 4037 if (count) { 4038 const currentCount = count - 1; 4039 if (!currentCount) { 4040 context.helpers.delete(name); 4041 } else { 4042 context.helpers.set(name, currentCount); 4043 } 4044 } 4045 }, 4046 helperString(name) { 4047 return `_${helperNameMap[context.helper(name)]}`; 4048 }, 4049 replaceNode(node) { 4050 if (true) { 4051 if (!context.currentNode) { 4052 throw new Error(`Node being replaced is already removed.`); 4053 } 4054 if (!context.parent) { 4055 throw new Error(`Cannot replace root node.`); 4056 } 4057 } 4058 context.parent.children[context.childIndex] = context.currentNode = node; 4059 }, 4060 removeNode(node) { 4061 if ( true && !context.parent) { 4062 throw new Error(`Cannot remove root node.`); 4063 } 4064 const list = context.parent.children; 4065 const removalIndex = node ? list.indexOf(node) : context.currentNode ? context.childIndex : -1; 4066 if ( true && removalIndex < 0) { 4067 throw new Error(`node being removed is not a child of current parent`); 4068 } 4069 if (!node || node === context.currentNode) { 4070 context.currentNode = null; 4071 context.onNodeRemoved(); 4072 } else { 4073 if (context.childIndex > removalIndex) { 4074 context.childIndex--; 4075 context.onNodeRemoved(); 4076 } 4077 } 4078 context.parent.children.splice(removalIndex, 1); 4079 }, 4080 onNodeRemoved: _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, 4081 addIdentifiers(exp) { 4082 }, 4083 removeIdentifiers(exp) { 4084 }, 4085 hoist(exp) { 4086 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp)) exp = createSimpleExpression(exp); 4087 context.hoists.push(exp); 4088 const identifier = createSimpleExpression( 4089 `_hoisted_${context.hoists.length}`, 4090 false, 4091 exp.loc, 4092 2 4093 ); 4094 identifier.hoisted = exp; 4095 return identifier; 4096 }, 4097 cache(exp, isVNode = false) { 4098 return createCacheExpression(context.cached++, exp, isVNode); 4099 } 4100 }; 4101 { 4102 context.filters = /* @__PURE__ */ new Set(); 4103 } 4104 return context; 4105} 4106function transform(root, options) { 4107 const context = createTransformContext(root, options); 4108 traverseNode(root, context); 4109 if (options.hoistStatic) { 4110 hoistStatic(root, context); 4111 } 4112 if (!options.ssr) { 4113 createRootCodegen(root, context); 4114 } 4115 root.helpers = /* @__PURE__ */ new Set([...context.helpers.keys()]); 4116 root.components = [...context.components]; 4117 root.directives = [...context.directives]; 4118 root.imports = context.imports; 4119 root.hoists = context.hoists; 4120 root.temps = context.temps; 4121 root.cached = context.cached; 4122 root.transformed = true; 4123 { 4124 root.filters = [...context.filters]; 4125 } 4126} 4127function createRootCodegen(root, context) { 4128 const { helper } = context; 4129 const { children } = root; 4130 if (children.length === 1) { 4131 const child = children[0]; 4132 if (isSingleElementRoot(root, child) && child.codegenNode) { 4133 const codegenNode = child.codegenNode; 4134 if (codegenNode.type === 13) { 4135 convertToBlock(codegenNode, context); 4136 } 4137 root.codegenNode = codegenNode; 4138 } else { 4139 root.codegenNode = child; 4140 } 4141 } else if (children.length > 1) { 4142 let patchFlag = 64; 4143 let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64]; 4144 if ( true && children.filter((c) => c.type !== 3).length === 1) { 4145 patchFlag |= 2048; 4146 patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`; 4147 } 4148 root.codegenNode = createVNodeCall( 4149 context, 4150 helper(FRAGMENT), 4151 void 0, 4152 root.children, 4153 patchFlag, 4154 void 0, 4155 void 0, 4156 true, 4157 void 0, 4158 false 4159 ); 4160 } else ; 4161} 4162function traverseChildren(parent, context) { 4163 let i = 0; 4164 const nodeRemoved = () => { 4165 i--; 4166 }; 4167 for (; i < parent.children.length; i++) { 4168 const child = parent.children[i]; 4169 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) continue; 4170 context.grandParent = context.parent; 4171 context.parent = parent; 4172 context.childIndex = i; 4173 context.onNodeRemoved = nodeRemoved; 4174 traverseNode(child, context); 4175 } 4176} 4177function traverseNode(node, context) { 4178 context.currentNode = node; 4179 const { nodeTransforms } = context; 4180 const exitFns = []; 4181 for (let i2 = 0; i2 < nodeTransforms.length; i2++) { 4182 const onExit = nodeTransforms[i2](node, context); 4183 if (onExit) { 4184 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(onExit)) { 4185 exitFns.push(...onExit); 4186 } else { 4187 exitFns.push(onExit); 4188 } 4189 } 4190 if (!context.currentNode) { 4191 return; 4192 } else { 4193 node = context.currentNode; 4194 } 4195 } 4196 switch (node.type) { 4197 case 3: 4198 if (!context.ssr) { 4199 context.helper(CREATE_COMMENT); 4200 } 4201 break; 4202 case 5: 4203 if (!context.ssr) { 4204 context.helper(TO_DISPLAY_STRING); 4205 } 4206 break; 4207 case 9: 4208 for (let i2 = 0; i2 < node.branches.length; i2++) { 4209 traverseNode(node.branches[i2], context); 4210 } 4211 break; 4212 case 10: 4213 case 11: 4214 case 1: 4215 case 0: 4216 traverseChildren(node, context); 4217 break; 4218 } 4219 context.currentNode = node; 4220 let i = exitFns.length; 4221 while (i--) { 4222 exitFns[i](); 4223 } 4224} 4225function createStructuralDirectiveTransform(name, fn) { 4226 const matches = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(name) ? (n) => n === name : (n) => name.test(n); 4227 return (node, context) => { 4228 if (node.type === 1) { 4229 const { props } = node; 4230 if (node.tagType === 3 && props.some(isVSlot)) { 4231 return; 4232 } 4233 const exitFns = []; 4234 for (let i = 0; i < props.length; i++) { 4235 const prop = props[i]; 4236 if (prop.type === 7 && matches(prop.name)) { 4237 props.splice(i, 1); 4238 i--; 4239 const onExit = fn(node, prop, context); 4240 if (onExit) exitFns.push(onExit); 4241 } 4242 } 4243 return exitFns; 4244 } 4245 }; 4246} 4247 4248const PURE_ANNOTATION = `/*#__PURE__*/`; 4249const aliasHelper = (s) => `${helperNameMap[s]}: _${helperNameMap[s]}`; 4250function createCodegenContext(ast, { 4251 mode = "function", 4252 prefixIdentifiers = mode === "module", 4253 sourceMap = false, 4254 filename = `template.vue.html`, 4255 scopeId = null, 4256 optimizeImports = false, 4257 runtimeGlobalName = `Vue`, 4258 runtimeModuleName = `vue`, 4259 ssrRuntimeModuleName = "vue/server-renderer", 4260 ssr = false, 4261 isTS = false, 4262 inSSR = false 4263}) { 4264 const context = { 4265 mode, 4266 prefixIdentifiers, 4267 sourceMap, 4268 filename, 4269 scopeId, 4270 optimizeImports, 4271 runtimeGlobalName, 4272 runtimeModuleName, 4273 ssrRuntimeModuleName, 4274 ssr, 4275 isTS, 4276 inSSR, 4277 source: ast.source, 4278 code: ``, 4279 column: 1, 4280 line: 1, 4281 offset: 0, 4282 indentLevel: 0, 4283 pure: false, 4284 map: void 0, 4285 helper(key) { 4286 return `_${helperNameMap[key]}`; 4287 }, 4288 push(code, newlineIndex = -2 /* None */, node) { 4289 context.code += code; 4290 }, 4291 indent() { 4292 newline(++context.indentLevel); 4293 }, 4294 deindent(withoutNewLine = false) { 4295 if (withoutNewLine) { 4296 --context.indentLevel; 4297 } else { 4298 newline(--context.indentLevel); 4299 } 4300 }, 4301 newline() { 4302 newline(context.indentLevel); 4303 } 4304 }; 4305 function newline(n) { 4306 context.push("\n" + ` `.repeat(n), 0 /* Start */); 4307 } 4308 return context; 4309} 4310function generate(ast, options = {}) { 4311 const context = createCodegenContext(ast, options); 4312 if (options.onContextCreated) options.onContextCreated(context); 4313 const { 4314 mode, 4315 push, 4316 prefixIdentifiers, 4317 indent, 4318 deindent, 4319 newline, 4320 scopeId, 4321 ssr 4322 } = context; 4323 const helpers = Array.from(ast.helpers); 4324 const hasHelpers = helpers.length > 0; 4325 const useWithBlock = !prefixIdentifiers && mode !== "module"; 4326 const preambleContext = context; 4327 { 4328 genFunctionPreamble(ast, preambleContext); 4329 } 4330 const functionName = ssr ? `ssrRender` : `render`; 4331 const args = ssr ? ["_ctx", "_push", "_parent", "_attrs"] : ["_ctx", "_cache"]; 4332 const signature = args.join(", "); 4333 { 4334 push(`function ${functionName}(${signature}) {`); 4335 } 4336 indent(); 4337 if (useWithBlock) { 4338 push(`with (_ctx) {`); 4339 indent(); 4340 if (hasHelpers) { 4341 push( 4342 `const { ${helpers.map(aliasHelper).join(", ")} } = _Vue 4343`, 4344 -1 /* End */ 4345 ); 4346 newline(); 4347 } 4348 } 4349 if (ast.components.length) { 4350 genAssets(ast.components, "component", context); 4351 if (ast.directives.length || ast.temps > 0) { 4352 newline(); 4353 } 4354 } 4355 if (ast.directives.length) { 4356 genAssets(ast.directives, "directive", context); 4357 if (ast.temps > 0) { 4358 newline(); 4359 } 4360 } 4361 if (ast.filters && ast.filters.length) { 4362 newline(); 4363 genAssets(ast.filters, "filter", context); 4364 newline(); 4365 } 4366 if (ast.temps > 0) { 4367 push(`let `); 4368 for (let i = 0; i < ast.temps; i++) { 4369 push(`${i > 0 ? `, ` : ``}_temp${i}`); 4370 } 4371 } 4372 if (ast.components.length || ast.directives.length || ast.temps) { 4373 push(` 4374`, 0 /* Start */); 4375 newline(); 4376 } 4377 if (!ssr) { 4378 push(`return `); 4379 } 4380 if (ast.codegenNode) { 4381 genNode(ast.codegenNode, context); 4382 } else { 4383 push(`null`); 4384 } 4385 if (useWithBlock) { 4386 deindent(); 4387 push(`}`); 4388 } 4389 deindent(); 4390 push(`}`); 4391 return { 4392 ast, 4393 code: context.code, 4394 preamble: ``, 4395 map: context.map ? context.map.toJSON() : void 0 4396 }; 4397} 4398function genFunctionPreamble(ast, context) { 4399 const { 4400 ssr, 4401 prefixIdentifiers, 4402 push, 4403 newline, 4404 runtimeModuleName, 4405 runtimeGlobalName, 4406 ssrRuntimeModuleName 4407 } = context; 4408 const VueBinding = runtimeGlobalName; 4409 const helpers = Array.from(ast.helpers); 4410 if (helpers.length > 0) { 4411 { 4412 push(`const _Vue = ${VueBinding} 4413`, -1 /* End */); 4414 if (ast.hoists.length) { 4415 const staticHelpers = [ 4416 CREATE_VNODE, 4417 CREATE_ELEMENT_VNODE, 4418 CREATE_COMMENT, 4419 CREATE_TEXT, 4420 CREATE_STATIC 4421 ].filter((helper) => helpers.includes(helper)).map(aliasHelper).join(", "); 4422 push(`const { ${staticHelpers} } = _Vue 4423`, -1 /* End */); 4424 } 4425 } 4426 } 4427 genHoists(ast.hoists, context); 4428 newline(); 4429 push(`return `); 4430} 4431function genAssets(assets, type, { helper, push, newline, isTS }) { 4432 const resolver = helper( 4433 type === "filter" ? RESOLVE_FILTER : type === "component" ? RESOLVE_COMPONENT : RESOLVE_DIRECTIVE 4434 ); 4435 for (let i = 0; i < assets.length; i++) { 4436 let id = assets[i]; 4437 const maybeSelfReference = id.endsWith("__self"); 4438 if (maybeSelfReference) { 4439 id = id.slice(0, -6); 4440 } 4441 push( 4442 `const ${toValidAssetId(id, type)} = ${resolver}(${JSON.stringify(id)}${maybeSelfReference ? `, true` : ``})${isTS ? `!` : ``}` 4443 ); 4444 if (i < assets.length - 1) { 4445 newline(); 4446 } 4447 } 4448} 4449function genHoists(hoists, context) { 4450 if (!hoists.length) { 4451 return; 4452 } 4453 context.pure = true; 4454 const { push, newline, helper, scopeId, mode } = context; 4455 newline(); 4456 for (let i = 0; i < hoists.length; i++) { 4457 const exp = hoists[i]; 4458 if (exp) { 4459 push( 4460 `const _hoisted_${i + 1} = ${``}` 4461 ); 4462 genNode(exp, context); 4463 newline(); 4464 } 4465 } 4466 context.pure = false; 4467} 4468function isText(n) { 4469 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(n) || n.type === 4 || n.type === 2 || n.type === 5 || n.type === 8; 4470} 4471function genNodeListAsArray(nodes, context) { 4472 const multilines = nodes.length > 3 || true && nodes.some((n) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(n) || !isText(n)); 4473 context.push(`[`); 4474 multilines && context.indent(); 4475 genNodeList(nodes, context, multilines); 4476 multilines && context.deindent(); 4477 context.push(`]`); 4478} 4479function genNodeList(nodes, context, multilines = false, comma = true) { 4480 const { push, newline } = context; 4481 for (let i = 0; i < nodes.length; i++) { 4482 const node = nodes[i]; 4483 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) { 4484 push(node, -3 /* Unknown */); 4485 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(node)) { 4486 genNodeListAsArray(node, context); 4487 } else { 4488 genNode(node, context); 4489 } 4490 if (i < nodes.length - 1) { 4491 if (multilines) { 4492 comma && push(","); 4493 newline(); 4494 } else { 4495 comma && push(", "); 4496 } 4497 } 4498 } 4499} 4500function genNode(node, context) { 4501 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node)) { 4502 context.push(node, -3 /* Unknown */); 4503 return; 4504 } 4505 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(node)) { 4506 context.push(context.helper(node)); 4507 return; 4508 } 4509 switch (node.type) { 4510 case 1: 4511 case 9: 4512 case 11: 4513 true && assert( 4514 node.codegenNode != null, 4515 `Codegen node is missing for element/if/for node. Apply appropriate transforms first.` 4516 ); 4517 genNode(node.codegenNode, context); 4518 break; 4519 case 2: 4520 genText(node, context); 4521 break; 4522 case 4: 4523 genExpression(node, context); 4524 break; 4525 case 5: 4526 genInterpolation(node, context); 4527 break; 4528 case 12: 4529 genNode(node.codegenNode, context); 4530 break; 4531 case 8: 4532 genCompoundExpression(node, context); 4533 break; 4534 case 3: 4535 genComment(node, context); 4536 break; 4537 case 13: 4538 genVNodeCall(node, context); 4539 break; 4540 case 14: 4541 genCallExpression(node, context); 4542 break; 4543 case 15: 4544 genObjectExpression(node, context); 4545 break; 4546 case 17: 4547 genArrayExpression(node, context); 4548 break; 4549 case 18: 4550 genFunctionExpression(node, context); 4551 break; 4552 case 19: 4553 genConditionalExpression(node, context); 4554 break; 4555 case 20: 4556 genCacheExpression(node, context); 4557 break; 4558 case 21: 4559 genNodeList(node.body, context, true, false); 4560 break; 4561 case 22: 4562 break; 4563 case 23: 4564 break; 4565 case 24: 4566 break; 4567 case 25: 4568 break; 4569 case 26: 4570 break; 4571 case 10: 4572 break; 4573 default: 4574 if (true) { 4575 assert(false, `unhandled codegen node type: ${node.type}`); 4576 const exhaustiveCheck = node; 4577 return exhaustiveCheck; 4578 } 4579 } 4580} 4581function genText(node, context) { 4582 context.push(JSON.stringify(node.content), -3 /* Unknown */, node); 4583} 4584function genExpression(node, context) { 4585 const { content, isStatic } = node; 4586 context.push( 4587 isStatic ? JSON.stringify(content) : content, 4588 -3 /* Unknown */, 4589 node 4590 ); 4591} 4592function genInterpolation(node, context) { 4593 const { push, helper, pure } = context; 4594 if (pure) push(PURE_ANNOTATION); 4595 push(`${helper(TO_DISPLAY_STRING)}(`); 4596 genNode(node.content, context); 4597 push(`)`); 4598} 4599function genCompoundExpression(node, context) { 4600 for (let i = 0; i < node.children.length; i++) { 4601 const child = node.children[i]; 4602 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(child)) { 4603 context.push(child, -3 /* Unknown */); 4604 } else { 4605 genNode(child, context); 4606 } 4607 } 4608} 4609function genExpressionAsPropertyKey(node, context) { 4610 const { push } = context; 4611 if (node.type === 8) { 4612 push(`[`); 4613 genCompoundExpression(node, context); 4614 push(`]`); 4615 } else if (node.isStatic) { 4616 const text = isSimpleIdentifier(node.content) ? node.content : JSON.stringify(node.content); 4617 push(text, -2 /* None */, node); 4618 } else { 4619 push(`[${node.content}]`, -3 /* Unknown */, node); 4620 } 4621} 4622function genComment(node, context) { 4623 const { push, helper, pure } = context; 4624 if (pure) { 4625 push(PURE_ANNOTATION); 4626 } 4627 push( 4628 `${helper(CREATE_COMMENT)}(${JSON.stringify(node.content)})`, 4629 -3 /* Unknown */, 4630 node 4631 ); 4632} 4633function genVNodeCall(node, context) { 4634 const { push, helper, pure } = context; 4635 const { 4636 tag, 4637 props, 4638 children, 4639 patchFlag, 4640 dynamicProps, 4641 directives, 4642 isBlock, 4643 disableTracking, 4644 isComponent 4645 } = node; 4646 let patchFlagString; 4647 if (patchFlag) { 4648 if (true) { 4649 if (patchFlag < 0) { 4650 patchFlagString = patchFlag + ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[patchFlag]} */`; 4651 } else { 4652 const flagNames = Object.keys(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames).map(Number).filter((n) => n > 0 && patchFlag & n).map((n) => _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[n]).join(`, `); 4653 patchFlagString = patchFlag + ` /* ${flagNames} */`; 4654 } 4655 } else {} 4656 } 4657 if (directives) { 4658 push(helper(WITH_DIRECTIVES) + `(`); 4659 } 4660 if (isBlock) { 4661 push(`(${helper(OPEN_BLOCK)}(${disableTracking ? `true` : ``}), `); 4662 } 4663 if (pure) { 4664 push(PURE_ANNOTATION); 4665 } 4666 const callHelper = isBlock ? getVNodeBlockHelper(context.inSSR, isComponent) : getVNodeHelper(context.inSSR, isComponent); 4667 push(helper(callHelper) + `(`, -2 /* None */, node); 4668 genNodeList( 4669 genNullableArgs([tag, props, children, patchFlagString, dynamicProps]), 4670 context 4671 ); 4672 push(`)`); 4673 if (isBlock) { 4674 push(`)`); 4675 } 4676 if (directives) { 4677 push(`, `); 4678 genNode(directives, context); 4679 push(`)`); 4680 } 4681} 4682function genNullableArgs(args) { 4683 let i = args.length; 4684 while (i--) { 4685 if (args[i] != null) break; 4686 } 4687 return args.slice(0, i + 1).map((arg) => arg || `null`); 4688} 4689function genCallExpression(node, context) { 4690 const { push, helper, pure } = context; 4691 const callee = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(node.callee) ? node.callee : helper(node.callee); 4692 if (pure) { 4693 push(PURE_ANNOTATION); 4694 } 4695 push(callee + `(`, -2 /* None */, node); 4696 genNodeList(node.arguments, context); 4697 push(`)`); 4698} 4699function genObjectExpression(node, context) { 4700 const { push, indent, deindent, newline } = context; 4701 const { properties } = node; 4702 if (!properties.length) { 4703 push(`{}`, -2 /* None */, node); 4704 return; 4705 } 4706 const multilines = properties.length > 1 || true && properties.some((p) => p.value.type !== 4); 4707 push(multilines ? `{` : `{ `); 4708 multilines && indent(); 4709 for (let i = 0; i < properties.length; i++) { 4710 const { key, value } = properties[i]; 4711 genExpressionAsPropertyKey(key, context); 4712 push(`: `); 4713 genNode(value, context); 4714 if (i < properties.length - 1) { 4715 push(`,`); 4716 newline(); 4717 } 4718 } 4719 multilines && deindent(); 4720 push(multilines ? `}` : ` }`); 4721} 4722function genArrayExpression(node, context) { 4723 genNodeListAsArray(node.elements, context); 4724} 4725function genFunctionExpression(node, context) { 4726 const { push, indent, deindent } = context; 4727 const { params, returns, body, newline, isSlot } = node; 4728 if (isSlot) { 4729 push(`_${helperNameMap[WITH_CTX]}(`); 4730 } 4731 push(`(`, -2 /* None */, node); 4732 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(params)) { 4733 genNodeList(params, context); 4734 } else if (params) { 4735 genNode(params, context); 4736 } 4737 push(`) => `); 4738 if (newline || body) { 4739 push(`{`); 4740 indent(); 4741 } 4742 if (returns) { 4743 if (newline) { 4744 push(`return `); 4745 } 4746 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(returns)) { 4747 genNodeListAsArray(returns, context); 4748 } else { 4749 genNode(returns, context); 4750 } 4751 } else if (body) { 4752 genNode(body, context); 4753 } 4754 if (newline || body) { 4755 deindent(); 4756 push(`}`); 4757 } 4758 if (isSlot) { 4759 if (node.isNonScopedSlot) { 4760 push(`, undefined, true`); 4761 } 4762 push(`)`); 4763 } 4764} 4765function genConditionalExpression(node, context) { 4766 const { test, consequent, alternate, newline: needNewline } = node; 4767 const { push, indent, deindent, newline } = context; 4768 if (test.type === 4) { 4769 const needsParens = !isSimpleIdentifier(test.content); 4770 needsParens && push(`(`); 4771 genExpression(test, context); 4772 needsParens && push(`)`); 4773 } else { 4774 push(`(`); 4775 genNode(test, context); 4776 push(`)`); 4777 } 4778 needNewline && indent(); 4779 context.indentLevel++; 4780 needNewline || push(` `); 4781 push(`? `); 4782 genNode(consequent, context); 4783 context.indentLevel--; 4784 needNewline && newline(); 4785 needNewline || push(` `); 4786 push(`: `); 4787 const isNested = alternate.type === 19; 4788 if (!isNested) { 4789 context.indentLevel++; 4790 } 4791 genNode(alternate, context); 4792 if (!isNested) { 4793 context.indentLevel--; 4794 } 4795 needNewline && deindent( 4796 true 4797 /* without newline */ 4798 ); 4799} 4800function genCacheExpression(node, context) { 4801 const { push, helper, indent, deindent, newline } = context; 4802 push(`_cache[${node.index}] || (`); 4803 if (node.isVOnce) { 4804 indent(); 4805 push(`${helper(SET_BLOCK_TRACKING)}(-1),`); 4806 newline(); 4807 push(`(`); 4808 } 4809 push(`_cache[${node.index}] = `); 4810 genNode(node.value, context); 4811 if (node.isVOnce) { 4812 push(`).cacheIndex = ${node.index},`); 4813 newline(); 4814 push(`${helper(SET_BLOCK_TRACKING)}(1),`); 4815 newline(); 4816 push(`_cache[${node.index}]`); 4817 deindent(); 4818 } 4819 push(`)`); 4820} 4821 4822const prohibitedKeywordRE = new RegExp( 4823 "\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b" 4824); 4825const stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g; 4826function validateBrowserExpression(node, context, asParams = false, asRawStatements = false) { 4827 const exp = node.content; 4828 if (!exp.trim()) { 4829 return; 4830 } 4831 try { 4832 new Function( 4833 asRawStatements ? ` ${exp} ` : `return ${asParams ? `(${exp}) => {}` : `(${exp})`}` 4834 ); 4835 } catch (e) { 4836 let message = e.message; 4837 const keywordMatch = exp.replace(stripStringRE, "").match(prohibitedKeywordRE); 4838 if (keywordMatch) { 4839 message = `avoid using JavaScript keyword as property name: "${keywordMatch[0]}"`; 4840 } 4841 context.onError( 4842 createCompilerError( 4843 45, 4844 node.loc, 4845 void 0, 4846 message 4847 ) 4848 ); 4849 } 4850} 4851 4852const transformExpression = (node, context) => { 4853 if (node.type === 5) { 4854 node.content = processExpression( 4855 node.content, 4856 context 4857 ); 4858 } else if (node.type === 1) { 4859 for (let i = 0; i < node.props.length; i++) { 4860 const dir = node.props[i]; 4861 if (dir.type === 7 && dir.name !== "for") { 4862 const exp = dir.exp; 4863 const arg = dir.arg; 4864 if (exp && exp.type === 4 && !(dir.name === "on" && arg)) { 4865 dir.exp = processExpression( 4866 exp, 4867 context, 4868 // slot args must be processed as function params 4869 dir.name === "slot" 4870 ); 4871 } 4872 if (arg && arg.type === 4 && !arg.isStatic) { 4873 dir.arg = processExpression(arg, context); 4874 } 4875 } 4876 } 4877 } 4878}; 4879function processExpression(node, context, asParams = false, asRawStatements = false, localVars = Object.create(context.identifiers)) { 4880 { 4881 if (true) { 4882 validateBrowserExpression(node, context, asParams, asRawStatements); 4883 } 4884 return node; 4885 } 4886} 4887function stringifyExpression(exp) { 4888 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(exp)) { 4889 return exp; 4890 } else if (exp.type === 4) { 4891 return exp.content; 4892 } else { 4893 return exp.children.map(stringifyExpression).join(""); 4894 } 4895} 4896 4897const transformIf = createStructuralDirectiveTransform( 4898 /^(if|else|else-if)$/, 4899 (node, dir, context) => { 4900 return processIf(node, dir, context, (ifNode, branch, isRoot) => { 4901 const siblings = context.parent.children; 4902 let i = siblings.indexOf(ifNode); 4903 let key = 0; 4904 while (i-- >= 0) { 4905 const sibling = siblings[i]; 4906 if (sibling && sibling.type === 9) { 4907 key += sibling.branches.length; 4908 } 4909 } 4910 return () => { 4911 if (isRoot) { 4912 ifNode.codegenNode = createCodegenNodeForBranch( 4913 branch, 4914 key, 4915 context 4916 ); 4917 } else { 4918 const parentCondition = getParentCondition(ifNode.codegenNode); 4919 parentCondition.alternate = createCodegenNodeForBranch( 4920 branch, 4921 key + ifNode.branches.length - 1, 4922 context 4923 ); 4924 } 4925 }; 4926 }); 4927 } 4928); 4929function processIf(node, dir, context, processCodegen) { 4930 if (dir.name !== "else" && (!dir.exp || !dir.exp.content.trim())) { 4931 const loc = dir.exp ? dir.exp.loc : node.loc; 4932 context.onError( 4933 createCompilerError(28, dir.loc) 4934 ); 4935 dir.exp = createSimpleExpression(`true`, false, loc); 4936 } 4937 if ( true && dir.exp) { 4938 validateBrowserExpression(dir.exp, context); 4939 } 4940 if (dir.name === "if") { 4941 const branch = createIfBranch(node, dir); 4942 const ifNode = { 4943 type: 9, 4944 loc: node.loc, 4945 branches: [branch] 4946 }; 4947 context.replaceNode(ifNode); 4948 if (processCodegen) { 4949 return processCodegen(ifNode, branch, true); 4950 } 4951 } else { 4952 const siblings = context.parent.children; 4953 const comments = []; 4954 let i = siblings.indexOf(node); 4955 while (i-- >= -1) { 4956 const sibling = siblings[i]; 4957 if (sibling && sibling.type === 3) { 4958 context.removeNode(sibling); 4959 true && comments.unshift(sibling); 4960 continue; 4961 } 4962 if (sibling && sibling.type === 2 && !sibling.content.trim().length) { 4963 context.removeNode(sibling); 4964 continue; 4965 } 4966 if (sibling && sibling.type === 9) { 4967 if (dir.name === "else-if" && sibling.branches[sibling.branches.length - 1].condition === void 0) { 4968 context.onError( 4969 createCompilerError(30, node.loc) 4970 ); 4971 } 4972 context.removeNode(); 4973 const branch = createIfBranch(node, dir); 4974 if ( true && comments.length && // #3619 ignore comments if the v-if is direct child of <transition> 4975 !(context.parent && context.parent.type === 1 && (context.parent.tag === "transition" || context.parent.tag === "Transition"))) { 4976 branch.children = [...comments, ...branch.children]; 4977 } 4978 if (true) { 4979 const key = branch.userKey; 4980 if (key) { 4981 sibling.branches.forEach(({ userKey }) => { 4982 if (isSameKey(userKey, key)) { 4983 context.onError( 4984 createCompilerError( 4985 29, 4986 branch.userKey.loc 4987 ) 4988 ); 4989 } 4990 }); 4991 } 4992 } 4993 sibling.branches.push(branch); 4994 const onExit = processCodegen && processCodegen(sibling, branch, false); 4995 traverseNode(branch, context); 4996 if (onExit) onExit(); 4997 context.currentNode = null; 4998 } else { 4999 context.onError( 5000 createCompilerError(30, node.loc) 5001 ); 5002 } 5003 break; 5004 } 5005 } 5006} 5007function createIfBranch(node, dir) { 5008 const isTemplateIf = node.tagType === 3; 5009 return { 5010 type: 10, 5011 loc: node.loc, 5012 condition: dir.name === "else" ? void 0 : dir.exp, 5013 children: isTemplateIf && !findDir(node, "for") ? node.children : [node], 5014 userKey: findProp(node, `key`), 5015 isTemplateIf 5016 }; 5017} 5018function createCodegenNodeForBranch(branch, keyIndex, context) { 5019 if (branch.condition) { 5020 return createConditionalExpression( 5021 branch.condition, 5022 createChildrenCodegenNode(branch, keyIndex, context), 5023 // make sure to pass in asBlock: true so that the comment node call 5024 // closes the current block. 5025 createCallExpression(context.helper(CREATE_COMMENT), [ 5026 true ? '"v-if"' : 0, 5027 "true" 5028 ]) 5029 ); 5030 } else { 5031 return createChildrenCodegenNode(branch, keyIndex, context); 5032 } 5033} 5034function createChildrenCodegenNode(branch, keyIndex, context) { 5035 const { helper } = context; 5036 const keyProperty = createObjectProperty( 5037 `key`, 5038 createSimpleExpression( 5039 `${keyIndex}`, 5040 false, 5041 locStub, 5042 2 5043 ) 5044 ); 5045 const { children } = branch; 5046 const firstChild = children[0]; 5047 const needFragmentWrapper = children.length !== 1 || firstChild.type !== 1; 5048 if (needFragmentWrapper) { 5049 if (children.length === 1 && firstChild.type === 11) { 5050 const vnodeCall = firstChild.codegenNode; 5051 injectProp(vnodeCall, keyProperty, context); 5052 return vnodeCall; 5053 } else { 5054 let patchFlag = 64; 5055 let patchFlagText = _vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[64]; 5056 if ( true && !branch.isTemplateIf && children.filter((c) => c.type !== 3).length === 1) { 5057 patchFlag |= 2048; 5058 patchFlagText += `, ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[2048]}`; 5059 } 5060 return createVNodeCall( 5061 context, 5062 helper(FRAGMENT), 5063 createObjectExpression([keyProperty]), 5064 children, 5065 patchFlag, 5066 void 0, 5067 void 0, 5068 true, 5069 false, 5070 false, 5071 branch.loc 5072 ); 5073 } 5074 } else { 5075 const ret = firstChild.codegenNode; 5076 const vnodeCall = getMemoedVNodeCall(ret); 5077 if (vnodeCall.type === 13) { 5078 convertToBlock(vnodeCall, context); 5079 } 5080 injectProp(vnodeCall, keyProperty, context); 5081 return ret; 5082 } 5083} 5084function isSameKey(a, b) { 5085 if (!a || a.type !== b.type) { 5086 return false; 5087 } 5088 if (a.type === 6) { 5089 if (a.value.content !== b.value.content) { 5090 return false; 5091 } 5092 } else { 5093 const exp = a.exp; 5094 const branchExp = b.exp; 5095 if (exp.type !== branchExp.type) { 5096 return false; 5097 } 5098 if (exp.type !== 4 || exp.isStatic !== branchExp.isStatic || exp.content !== branchExp.content) { 5099 return false; 5100 } 5101 } 5102 return true; 5103} 5104function getParentCondition(node) { 5105 while (true) { 5106 if (node.type === 19) { 5107 if (node.alternate.type === 19) { 5108 node = node.alternate; 5109 } else { 5110 return node; 5111 } 5112 } else if (node.type === 20) { 5113 node = node.value; 5114 } 5115 } 5116} 5117 5118const transformBind = (dir, _node, context) => { 5119 const { modifiers, loc } = dir; 5120 const arg = dir.arg; 5121 let { exp } = dir; 5122 if (exp && exp.type === 4 && !exp.content.trim()) { 5123 { 5124 exp = void 0; 5125 } 5126 } 5127 if (!exp) { 5128 if (arg.type !== 4 || !arg.isStatic) { 5129 context.onError( 5130 createCompilerError( 5131 52, 5132 arg.loc 5133 ) 5134 ); 5135 return { 5136 props: [ 5137 createObjectProperty(arg, createSimpleExpression("", true, loc)) 5138 ] 5139 }; 5140 } 5141 transformBindShorthand(dir); 5142 exp = dir.exp; 5143 } 5144 if (arg.type !== 4) { 5145 arg.children.unshift(`(`); 5146 arg.children.push(`) || ""`); 5147 } else if (!arg.isStatic) { 5148 arg.content = `${arg.content} || ""`; 5149 } 5150 if (modifiers.includes("camel")) { 5151 if (arg.type === 4) { 5152 if (arg.isStatic) { 5153 arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content); 5154 } else { 5155 arg.content = `${context.helperString(CAMELIZE)}(${arg.content})`; 5156 } 5157 } else { 5158 arg.children.unshift(`${context.helperString(CAMELIZE)}(`); 5159 arg.children.push(`)`); 5160 } 5161 } 5162 if (!context.inSSR) { 5163 if (modifiers.includes("prop")) { 5164 injectPrefix(arg, "."); 5165 } 5166 if (modifiers.includes("attr")) { 5167 injectPrefix(arg, "^"); 5168 } 5169 } 5170 return { 5171 props: [createObjectProperty(arg, exp)] 5172 }; 5173}; 5174const transformBindShorthand = (dir, context) => { 5175 const arg = dir.arg; 5176 const propName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content); 5177 dir.exp = createSimpleExpression(propName, false, arg.loc); 5178}; 5179const injectPrefix = (arg, prefix) => { 5180 if (arg.type === 4) { 5181 if (arg.isStatic) { 5182 arg.content = prefix + arg.content; 5183 } else { 5184 arg.content = `\`${prefix}\${${arg.content}}\``; 5185 } 5186 } else { 5187 arg.children.unshift(`'${prefix}' + (`); 5188 arg.children.push(`)`); 5189 } 5190}; 5191 5192const transformFor = createStructuralDirectiveTransform( 5193 "for", 5194 (node, dir, context) => { 5195 const { helper, removeHelper } = context; 5196 return processFor(node, dir, context, (forNode) => { 5197 const renderExp = createCallExpression(helper(RENDER_LIST), [ 5198 forNode.source 5199 ]); 5200 const isTemplate = isTemplateNode(node); 5201 const memo = findDir(node, "memo"); 5202 const keyProp = findProp(node, `key`, false, true); 5203 if (keyProp && keyProp.type === 7 && !keyProp.exp) { 5204 transformBindShorthand(keyProp); 5205 } 5206 const keyExp = keyProp && (keyProp.type === 6 ? keyProp.value ? createSimpleExpression(keyProp.value.content, true) : void 0 : keyProp.exp); 5207 const keyProperty = keyProp && keyExp ? createObjectProperty(`key`, keyExp) : null; 5208 const isStableFragment = forNode.source.type === 4 && forNode.source.constType > 0; 5209 const fragmentFlag = isStableFragment ? 64 : keyProp ? 128 : 256; 5210 forNode.codegenNode = createVNodeCall( 5211 context, 5212 helper(FRAGMENT), 5213 void 0, 5214 renderExp, 5215 fragmentFlag, 5216 void 0, 5217 void 0, 5218 true, 5219 !isStableFragment, 5220 false, 5221 node.loc 5222 ); 5223 return () => { 5224 let childBlock; 5225 const { children } = forNode; 5226 if (( true) && isTemplate) { 5227 node.children.some((c) => { 5228 if (c.type === 1) { 5229 const key = findProp(c, "key"); 5230 if (key) { 5231 context.onError( 5232 createCompilerError( 5233 33, 5234 key.loc 5235 ) 5236 ); 5237 return true; 5238 } 5239 } 5240 }); 5241 } 5242 const needFragmentWrapper = children.length !== 1 || children[0].type !== 1; 5243 const slotOutlet = isSlotOutlet(node) ? node : isTemplate && node.children.length === 1 && isSlotOutlet(node.children[0]) ? node.children[0] : null; 5244 if (slotOutlet) { 5245 childBlock = slotOutlet.codegenNode; 5246 if (isTemplate && keyProperty) { 5247 injectProp(childBlock, keyProperty, context); 5248 } 5249 } else if (needFragmentWrapper) { 5250 childBlock = createVNodeCall( 5251 context, 5252 helper(FRAGMENT), 5253 keyProperty ? createObjectExpression([keyProperty]) : void 0, 5254 node.children, 5255 64, 5256 void 0, 5257 void 0, 5258 true, 5259 void 0, 5260 false 5261 ); 5262 } else { 5263 childBlock = children[0].codegenNode; 5264 if (isTemplate && keyProperty) { 5265 injectProp(childBlock, keyProperty, context); 5266 } 5267 if (childBlock.isBlock !== !isStableFragment) { 5268 if (childBlock.isBlock) { 5269 removeHelper(OPEN_BLOCK); 5270 removeHelper( 5271 getVNodeBlockHelper(context.inSSR, childBlock.isComponent) 5272 ); 5273 } else { 5274 removeHelper( 5275 getVNodeHelper(context.inSSR, childBlock.isComponent) 5276 ); 5277 } 5278 } 5279 childBlock.isBlock = !isStableFragment; 5280 if (childBlock.isBlock) { 5281 helper(OPEN_BLOCK); 5282 helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent)); 5283 } else { 5284 helper(getVNodeHelper(context.inSSR, childBlock.isComponent)); 5285 } 5286 } 5287 if (memo) { 5288 const loop = createFunctionExpression( 5289 createForLoopParams(forNode.parseResult, [ 5290 createSimpleExpression(`_cached`) 5291 ]) 5292 ); 5293 loop.body = createBlockStatement([ 5294 createCompoundExpression([`const _memo = (`, memo.exp, `)`]), 5295 createCompoundExpression([ 5296 `if (_cached`, 5297 ...keyExp ? [` && _cached.key === `, keyExp] : [], 5298 ` && ${context.helperString( 5299 IS_MEMO_SAME 5300 )}(_cached, _memo)) return _cached` 5301 ]), 5302 createCompoundExpression([`const _item = `, childBlock]), 5303 createSimpleExpression(`_item.memo = _memo`), 5304 createSimpleExpression(`return _item`) 5305 ]); 5306 renderExp.arguments.push( 5307 loop, 5308 createSimpleExpression(`_cache`), 5309 createSimpleExpression(String(context.cached++)) 5310 ); 5311 } else { 5312 renderExp.arguments.push( 5313 createFunctionExpression( 5314 createForLoopParams(forNode.parseResult), 5315 childBlock, 5316 true 5317 ) 5318 ); 5319 } 5320 }; 5321 }); 5322 } 5323); 5324function processFor(node, dir, context, processCodegen) { 5325 if (!dir.exp) { 5326 context.onError( 5327 createCompilerError(31, dir.loc) 5328 ); 5329 return; 5330 } 5331 const parseResult = dir.forParseResult; 5332 if (!parseResult) { 5333 context.onError( 5334 createCompilerError(32, dir.loc) 5335 ); 5336 return; 5337 } 5338 finalizeForParseResult(parseResult, context); 5339 const { addIdentifiers, removeIdentifiers, scopes } = context; 5340 const { source, value, key, index } = parseResult; 5341 const forNode = { 5342 type: 11, 5343 loc: dir.loc, 5344 source, 5345 valueAlias: value, 5346 keyAlias: key, 5347 objectIndexAlias: index, 5348 parseResult, 5349 children: isTemplateNode(node) ? node.children : [node] 5350 }; 5351 context.replaceNode(forNode); 5352 scopes.vFor++; 5353 const onExit = processCodegen && processCodegen(forNode); 5354 return () => { 5355 scopes.vFor--; 5356 if (onExit) onExit(); 5357 }; 5358} 5359function finalizeForParseResult(result, context) { 5360 if (result.finalized) return; 5361 if (true) { 5362 validateBrowserExpression(result.source, context); 5363 if (result.key) { 5364 validateBrowserExpression( 5365 result.key, 5366 context, 5367 true 5368 ); 5369 } 5370 if (result.index) { 5371 validateBrowserExpression( 5372 result.index, 5373 context, 5374 true 5375 ); 5376 } 5377 if (result.value) { 5378 validateBrowserExpression( 5379 result.value, 5380 context, 5381 true 5382 ); 5383 } 5384 } 5385 result.finalized = true; 5386} 5387function createForLoopParams({ value, key, index }, memoArgs = []) { 5388 return createParamsList([value, key, index, ...memoArgs]); 5389} 5390function createParamsList(args) { 5391 let i = args.length; 5392 while (i--) { 5393 if (args[i]) break; 5394 } 5395 return args.slice(0, i + 1).map((arg, i2) => arg || createSimpleExpression(`_`.repeat(i2 + 1), false)); 5396} 5397 5398const defaultFallback = createSimpleExpression(`undefined`, false); 5399const trackSlotScopes = (node, context) => { 5400 if (node.type === 1 && (node.tagType === 1 || node.tagType === 3)) { 5401 const vSlot = findDir(node, "slot"); 5402 if (vSlot) { 5403 vSlot.exp; 5404 context.scopes.vSlot++; 5405 return () => { 5406 context.scopes.vSlot--; 5407 }; 5408 } 5409 } 5410}; 5411const trackVForSlotScopes = (node, context) => { 5412 let vFor; 5413 if (isTemplateNode(node) && node.props.some(isVSlot) && (vFor = findDir(node, "for"))) { 5414 const result = vFor.forParseResult; 5415 if (result) { 5416 finalizeForParseResult(result, context); 5417 const { value, key, index } = result; 5418 const { addIdentifiers, removeIdentifiers } = context; 5419 value && addIdentifiers(value); 5420 key && addIdentifiers(key); 5421 index && addIdentifiers(index); 5422 return () => { 5423 value && removeIdentifiers(value); 5424 key && removeIdentifiers(key); 5425 index && removeIdentifiers(index); 5426 }; 5427 } 5428 } 5429}; 5430const buildClientSlotFn = (props, _vForExp, children, loc) => createFunctionExpression( 5431 props, 5432 children, 5433 false, 5434 true, 5435 children.length ? children[0].loc : loc 5436); 5437function buildSlots(node, context, buildSlotFn = buildClientSlotFn) { 5438 context.helper(WITH_CTX); 5439 const { children, loc } = node; 5440 const slotsProperties = []; 5441 const dynamicSlots = []; 5442 let hasDynamicSlots = context.scopes.vSlot > 0 || context.scopes.vFor > 0; 5443 const onComponentSlot = findDir(node, "slot", true); 5444 if (onComponentSlot) { 5445 const { arg, exp } = onComponentSlot; 5446 if (arg && !isStaticExp(arg)) { 5447 hasDynamicSlots = true; 5448 } 5449 slotsProperties.push( 5450 createObjectProperty( 5451 arg || createSimpleExpression("default", true), 5452 buildSlotFn(exp, void 0, children, loc) 5453 ) 5454 ); 5455 } 5456 let hasTemplateSlots = false; 5457 let hasNamedDefaultSlot = false; 5458 const implicitDefaultChildren = []; 5459 const seenSlotNames = /* @__PURE__ */ new Set(); 5460 let conditionalBranchIndex = 0; 5461 for (let i = 0; i < children.length; i++) { 5462 const slotElement = children[i]; 5463 let slotDir; 5464 if (!isTemplateNode(slotElement) || !(slotDir = findDir(slotElement, "slot", true))) { 5465 if (slotElement.type !== 3) { 5466 implicitDefaultChildren.push(slotElement); 5467 } 5468 continue; 5469 } 5470 if (onComponentSlot) { 5471 context.onError( 5472 createCompilerError(37, slotDir.loc) 5473 ); 5474 break; 5475 } 5476 hasTemplateSlots = true; 5477 const { children: slotChildren, loc: slotLoc } = slotElement; 5478 const { 5479 arg: slotName = createSimpleExpression(`default`, true), 5480 exp: slotProps, 5481 loc: dirLoc 5482 } = slotDir; 5483 let staticSlotName; 5484 if (isStaticExp(slotName)) { 5485 staticSlotName = slotName ? slotName.content : `default`; 5486 } else { 5487 hasDynamicSlots = true; 5488 } 5489 const vFor = findDir(slotElement, "for"); 5490 const slotFunction = buildSlotFn(slotProps, vFor, slotChildren, slotLoc); 5491 let vIf; 5492 let vElse; 5493 if (vIf = findDir(slotElement, "if")) { 5494 hasDynamicSlots = true; 5495 dynamicSlots.push( 5496 createConditionalExpression( 5497 vIf.exp, 5498 buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++), 5499 defaultFallback 5500 ) 5501 ); 5502 } else if (vElse = findDir( 5503 slotElement, 5504 /^else(-if)?$/, 5505 true 5506 /* allowEmpty */ 5507 )) { 5508 let j = i; 5509 let prev; 5510 while (j--) { 5511 prev = children[j]; 5512 if (prev.type !== 3) { 5513 break; 5514 } 5515 } 5516 if (prev && isTemplateNode(prev) && findDir(prev, /^(else-)?if$/)) { 5517 let conditional = dynamicSlots[dynamicSlots.length - 1]; 5518 while (conditional.alternate.type === 19) { 5519 conditional = conditional.alternate; 5520 } 5521 conditional.alternate = vElse.exp ? createConditionalExpression( 5522 vElse.exp, 5523 buildDynamicSlot( 5524 slotName, 5525 slotFunction, 5526 conditionalBranchIndex++ 5527 ), 5528 defaultFallback 5529 ) : buildDynamicSlot(slotName, slotFunction, conditionalBranchIndex++); 5530 } else { 5531 context.onError( 5532 createCompilerError(30, vElse.loc) 5533 ); 5534 } 5535 } else if (vFor) { 5536 hasDynamicSlots = true; 5537 const parseResult = vFor.forParseResult; 5538 if (parseResult) { 5539 finalizeForParseResult(parseResult, context); 5540 dynamicSlots.push( 5541 createCallExpression(context.helper(RENDER_LIST), [ 5542 parseResult.source, 5543 createFunctionExpression( 5544 createForLoopParams(parseResult), 5545 buildDynamicSlot(slotName, slotFunction), 5546 true 5547 ) 5548 ]) 5549 ); 5550 } else { 5551 context.onError( 5552 createCompilerError( 5553 32, 5554 vFor.loc 5555 ) 5556 ); 5557 } 5558 } else { 5559 if (staticSlotName) { 5560 if (seenSlotNames.has(staticSlotName)) { 5561 context.onError( 5562 createCompilerError( 5563 38, 5564 dirLoc 5565 ) 5566 ); 5567 continue; 5568 } 5569 seenSlotNames.add(staticSlotName); 5570 if (staticSlotName === "default") { 5571 hasNamedDefaultSlot = true; 5572 } 5573 } 5574 slotsProperties.push(createObjectProperty(slotName, slotFunction)); 5575 } 5576 } 5577 if (!onComponentSlot) { 5578 const buildDefaultSlotProperty = (props, children2) => { 5579 const fn = buildSlotFn(props, void 0, children2, loc); 5580 if (context.compatConfig) { 5581 fn.isNonScopedSlot = true; 5582 } 5583 return createObjectProperty(`default`, fn); 5584 }; 5585 if (!hasTemplateSlots) { 5586 slotsProperties.push(buildDefaultSlotProperty(void 0, children)); 5587 } else if (implicitDefaultChildren.length && // #3766 5588 // with whitespace: 'preserve', whitespaces between slots will end up in 5589 // implicitDefaultChildren. Ignore if all implicit children are whitespaces. 5590 implicitDefaultChildren.some((node2) => isNonWhitespaceContent(node2))) { 5591 if (hasNamedDefaultSlot) { 5592 context.onError( 5593 createCompilerError( 5594 39, 5595 implicitDefaultChildren[0].loc 5596 ) 5597 ); 5598 } else { 5599 slotsProperties.push( 5600 buildDefaultSlotProperty(void 0, implicitDefaultChildren) 5601 ); 5602 } 5603 } 5604 } 5605 const slotFlag = hasDynamicSlots ? 2 : hasForwardedSlots(node.children) ? 3 : 1; 5606 let slots = createObjectExpression( 5607 slotsProperties.concat( 5608 createObjectProperty( 5609 `_`, 5610 // 2 = compiled but dynamic = can skip normalization, but must run diff 5611 // 1 = compiled and static = can skip normalization AND diff as optimized 5612 createSimpleExpression( 5613 slotFlag + ( true ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.slotFlagsText[slotFlag]} */` : 0), 5614 false 5615 ) 5616 ) 5617 ), 5618 loc 5619 ); 5620 if (dynamicSlots.length) { 5621 slots = createCallExpression(context.helper(CREATE_SLOTS), [ 5622 slots, 5623 createArrayExpression(dynamicSlots) 5624 ]); 5625 } 5626 return { 5627 slots, 5628 hasDynamicSlots 5629 }; 5630} 5631function buildDynamicSlot(name, fn, index) { 5632 const props = [ 5633 createObjectProperty(`name`, name), 5634 createObjectProperty(`fn`, fn) 5635 ]; 5636 if (index != null) { 5637 props.push( 5638 createObjectProperty(`key`, createSimpleExpression(String(index), true)) 5639 ); 5640 } 5641 return createObjectExpression(props); 5642} 5643function hasForwardedSlots(children) { 5644 for (let i = 0; i < children.length; i++) { 5645 const child = children[i]; 5646 switch (child.type) { 5647 case 1: 5648 if (child.tagType === 2 || hasForwardedSlots(child.children)) { 5649 return true; 5650 } 5651 break; 5652 case 9: 5653 if (hasForwardedSlots(child.branches)) return true; 5654 break; 5655 case 10: 5656 case 11: 5657 if (hasForwardedSlots(child.children)) return true; 5658 break; 5659 } 5660 } 5661 return false; 5662} 5663function isNonWhitespaceContent(node) { 5664 if (node.type !== 2 && node.type !== 12) 5665 return true; 5666 return node.type === 2 ? !!node.content.trim() : isNonWhitespaceContent(node.content); 5667} 5668 5669const directiveImportMap = /* @__PURE__ */ new WeakMap(); 5670const transformElement = (node, context) => { 5671 return function postTransformElement() { 5672 node = context.currentNode; 5673 if (!(node.type === 1 && (node.tagType === 0 || node.tagType === 1))) { 5674 return; 5675 } 5676 const { tag, props } = node; 5677 const isComponent = node.tagType === 1; 5678 let vnodeTag = isComponent ? resolveComponentType(node, context) : `"${tag}"`; 5679 const isDynamicComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(vnodeTag) && vnodeTag.callee === RESOLVE_DYNAMIC_COMPONENT; 5680 let vnodeProps; 5681 let vnodeChildren; 5682 let patchFlag = 0; 5683 let vnodeDynamicProps; 5684 let dynamicPropNames; 5685 let vnodeDirectives; 5686 let shouldUseBlock = ( 5687 // dynamic component may resolve to plain elements 5688 isDynamicComponent || vnodeTag === TELEPORT || vnodeTag === SUSPENSE || !isComponent && // <svg> and <foreignObject> must be forced into blocks so that block 5689 // updates inside get proper isSVG flag at runtime. (#639, #643) 5690 // This is technically web-specific, but splitting the logic out of core 5691 // leads to too much unnecessary complexity. 5692 (tag === "svg" || tag === "foreignObject" || tag === "math") 5693 ); 5694 if (props.length > 0) { 5695 const propsBuildResult = buildProps( 5696 node, 5697 context, 5698 void 0, 5699 isComponent, 5700 isDynamicComponent 5701 ); 5702 vnodeProps = propsBuildResult.props; 5703 patchFlag = propsBuildResult.patchFlag; 5704 dynamicPropNames = propsBuildResult.dynamicPropNames; 5705 const directives = propsBuildResult.directives; 5706 vnodeDirectives = directives && directives.length ? createArrayExpression( 5707 directives.map((dir) => buildDirectiveArgs(dir, context)) 5708 ) : void 0; 5709 if (propsBuildResult.shouldUseBlock) { 5710 shouldUseBlock = true; 5711 } 5712 } 5713 if (node.children.length > 0) { 5714 if (vnodeTag === KEEP_ALIVE) { 5715 shouldUseBlock = true; 5716 patchFlag |= 1024; 5717 if ( true && node.children.length > 1) { 5718 context.onError( 5719 createCompilerError(46, { 5720 start: node.children[0].loc.start, 5721 end: node.children[node.children.length - 1].loc.end, 5722 source: "" 5723 }) 5724 ); 5725 } 5726 } 5727 const shouldBuildAsSlots = isComponent && // Teleport is not a real component and has dedicated runtime handling 5728 vnodeTag !== TELEPORT && // explained above. 5729 vnodeTag !== KEEP_ALIVE; 5730 if (shouldBuildAsSlots) { 5731 const { slots, hasDynamicSlots } = buildSlots(node, context); 5732 vnodeChildren = slots; 5733 if (hasDynamicSlots) { 5734 patchFlag |= 1024; 5735 } 5736 } else if (node.children.length === 1 && vnodeTag !== TELEPORT) { 5737 const child = node.children[0]; 5738 const type = child.type; 5739 const hasDynamicTextChild = type === 5 || type === 8; 5740 if (hasDynamicTextChild && getConstantType(child, context) === 0) { 5741 patchFlag |= 1; 5742 } 5743 if (hasDynamicTextChild || type === 2) { 5744 vnodeChildren = child; 5745 } else { 5746 vnodeChildren = node.children; 5747 } 5748 } else { 5749 vnodeChildren = node.children; 5750 } 5751 } 5752 if (dynamicPropNames && dynamicPropNames.length) { 5753 vnodeDynamicProps = stringifyDynamicPropNames(dynamicPropNames); 5754 } 5755 node.codegenNode = createVNodeCall( 5756 context, 5757 vnodeTag, 5758 vnodeProps, 5759 vnodeChildren, 5760 patchFlag === 0 ? void 0 : patchFlag, 5761 vnodeDynamicProps, 5762 vnodeDirectives, 5763 !!shouldUseBlock, 5764 false, 5765 isComponent, 5766 node.loc 5767 ); 5768 }; 5769}; 5770function resolveComponentType(node, context, ssr = false) { 5771 let { tag } = node; 5772 const isExplicitDynamic = isComponentTag(tag); 5773 const isProp = findProp( 5774 node, 5775 "is", 5776 false, 5777 true 5778 /* allow empty */ 5779 ); 5780 if (isProp) { 5781 if (isExplicitDynamic || isCompatEnabled( 5782 "COMPILER_IS_ON_ELEMENT", 5783 context 5784 )) { 5785 let exp; 5786 if (isProp.type === 6) { 5787 exp = isProp.value && createSimpleExpression(isProp.value.content, true); 5788 } else { 5789 exp = isProp.exp; 5790 if (!exp) { 5791 exp = createSimpleExpression(`is`, false, isProp.loc); 5792 } 5793 } 5794 if (exp) { 5795 return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [ 5796 exp 5797 ]); 5798 } 5799 } else if (isProp.type === 6 && isProp.value.content.startsWith("vue:")) { 5800 tag = isProp.value.content.slice(4); 5801 } 5802 } 5803 const builtIn = isCoreComponent(tag) || context.isBuiltInComponent(tag); 5804 if (builtIn) { 5805 if (!ssr) context.helper(builtIn); 5806 return builtIn; 5807 } 5808 context.helper(RESOLVE_COMPONENT); 5809 context.components.add(tag); 5810 return toValidAssetId(tag, `component`); 5811} 5812function buildProps(node, context, props = node.props, isComponent, isDynamicComponent, ssr = false) { 5813 const { tag, loc: elementLoc, children } = node; 5814 let properties = []; 5815 const mergeArgs = []; 5816 const runtimeDirectives = []; 5817 const hasChildren = children.length > 0; 5818 let shouldUseBlock = false; 5819 let patchFlag = 0; 5820 let hasRef = false; 5821 let hasClassBinding = false; 5822 let hasStyleBinding = false; 5823 let hasHydrationEventBinding = false; 5824 let hasDynamicKeys = false; 5825 let hasVnodeHook = false; 5826 const dynamicPropNames = []; 5827 const pushMergeArg = (arg) => { 5828 if (properties.length) { 5829 mergeArgs.push( 5830 createObjectExpression(dedupeProperties(properties), elementLoc) 5831 ); 5832 properties = []; 5833 } 5834 if (arg) mergeArgs.push(arg); 5835 }; 5836 const pushRefVForMarker = () => { 5837 if (context.scopes.vFor > 0) { 5838 properties.push( 5839 createObjectProperty( 5840 createSimpleExpression("ref_for", true), 5841 createSimpleExpression("true") 5842 ) 5843 ); 5844 } 5845 }; 5846 const analyzePatchFlag = ({ key, value }) => { 5847 if (isStaticExp(key)) { 5848 const name = key.content; 5849 const isEventHandler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name); 5850 if (isEventHandler && (!isComponent || isDynamicComponent) && // omit the flag for click handlers because hydration gives click 5851 // dedicated fast path. 5852 name.toLowerCase() !== "onclick" && // omit v-model handlers 5853 name !== "onUpdate:modelValue" && // omit onVnodeXXX hooks 5854 !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) { 5855 hasHydrationEventBinding = true; 5856 } 5857 if (isEventHandler && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isReservedProp)(name)) { 5858 hasVnodeHook = true; 5859 } 5860 if (isEventHandler && value.type === 14) { 5861 value = value.arguments[0]; 5862 } 5863 if (value.type === 20 || (value.type === 4 || value.type === 8) && getConstantType(value, context) > 0) { 5864 return; 5865 } 5866 if (name === "ref") { 5867 hasRef = true; 5868 } else if (name === "class") { 5869 hasClassBinding = true; 5870 } else if (name === "style") { 5871 hasStyleBinding = true; 5872 } else if (name !== "key" && !dynamicPropNames.includes(name)) { 5873 dynamicPropNames.push(name); 5874 } 5875 if (isComponent && (name === "class" || name === "style") && !dynamicPropNames.includes(name)) { 5876 dynamicPropNames.push(name); 5877 } 5878 } else { 5879 hasDynamicKeys = true; 5880 } 5881 }; 5882 for (let i = 0; i < props.length; i++) { 5883 const prop = props[i]; 5884 if (prop.type === 6) { 5885 const { loc, name, nameLoc, value } = prop; 5886 let isStatic = true; 5887 if (name === "ref") { 5888 hasRef = true; 5889 pushRefVForMarker(); 5890 } 5891 if (name === "is" && (isComponentTag(tag) || value && value.content.startsWith("vue:") || isCompatEnabled( 5892 "COMPILER_IS_ON_ELEMENT", 5893 context 5894 ))) { 5895 continue; 5896 } 5897 properties.push( 5898 createObjectProperty( 5899 createSimpleExpression(name, true, nameLoc), 5900 createSimpleExpression( 5901 value ? value.content : "", 5902 isStatic, 5903 value ? value.loc : loc 5904 ) 5905 ) 5906 ); 5907 } else { 5908 const { name, arg, exp, loc, modifiers } = prop; 5909 const isVBind = name === "bind"; 5910 const isVOn = name === "on"; 5911 if (name === "slot") { 5912 if (!isComponent) { 5913 context.onError( 5914 createCompilerError(40, loc) 5915 ); 5916 } 5917 continue; 5918 } 5919 if (name === "once" || name === "memo") { 5920 continue; 5921 } 5922 if (name === "is" || isVBind && isStaticArgOf(arg, "is") && (isComponentTag(tag) || isCompatEnabled( 5923 "COMPILER_IS_ON_ELEMENT", 5924 context 5925 ))) { 5926 continue; 5927 } 5928 if (isVOn && ssr) { 5929 continue; 5930 } 5931 if ( 5932 // #938: elements with dynamic keys should be forced into blocks 5933 isVBind && isStaticArgOf(arg, "key") || // inline before-update hooks need to force block so that it is invoked 5934 // before children 5935 isVOn && hasChildren && isStaticArgOf(arg, "vue:before-update") 5936 ) { 5937 shouldUseBlock = true; 5938 } 5939 if (isVBind && isStaticArgOf(arg, "ref")) { 5940 pushRefVForMarker(); 5941 } 5942 if (!arg && (isVBind || isVOn)) { 5943 hasDynamicKeys = true; 5944 if (exp) { 5945 if (isVBind) { 5946 pushRefVForMarker(); 5947 pushMergeArg(); 5948 { 5949 if (true) { 5950 const hasOverridableKeys = mergeArgs.some((arg2) => { 5951 if (arg2.type === 15) { 5952 return arg2.properties.some(({ key }) => { 5953 if (key.type !== 4 || !key.isStatic) { 5954 return true; 5955 } 5956 return key.content !== "class" && key.content !== "style" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(key.content); 5957 }); 5958 } else { 5959 return true; 5960 } 5961 }); 5962 if (hasOverridableKeys) { 5963 checkCompatEnabled( 5964 "COMPILER_V_BIND_OBJECT_ORDER", 5965 context, 5966 loc 5967 ); 5968 } 5969 } 5970 if (isCompatEnabled( 5971 "COMPILER_V_BIND_OBJECT_ORDER", 5972 context 5973 )) { 5974 mergeArgs.unshift(exp); 5975 continue; 5976 } 5977 } 5978 mergeArgs.push(exp); 5979 } else { 5980 pushMergeArg({ 5981 type: 14, 5982 loc, 5983 callee: context.helper(TO_HANDLERS), 5984 arguments: isComponent ? [exp] : [exp, `true`] 5985 }); 5986 } 5987 } else { 5988 context.onError( 5989 createCompilerError( 5990 isVBind ? 34 : 35, 5991 loc 5992 ) 5993 ); 5994 } 5995 continue; 5996 } 5997 if (isVBind && modifiers.includes("prop")) { 5998 patchFlag |= 32; 5999 } 6000 const directiveTransform = context.directiveTransforms[name]; 6001 if (directiveTransform) { 6002 const { props: props2, needRuntime } = directiveTransform(prop, node, context); 6003 !ssr && props2.forEach(analyzePatchFlag); 6004 if (isVOn && arg && !isStaticExp(arg)) { 6005 pushMergeArg(createObjectExpression(props2, elementLoc)); 6006 } else { 6007 properties.push(...props2); 6008 } 6009 if (needRuntime) { 6010 runtimeDirectives.push(prop); 6011 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(needRuntime)) { 6012 directiveImportMap.set(prop, needRuntime); 6013 } 6014 } 6015 } else if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isBuiltInDirective)(name)) { 6016 runtimeDirectives.push(prop); 6017 if (hasChildren) { 6018 shouldUseBlock = true; 6019 } 6020 } 6021 } 6022 } 6023 let propsExpression = void 0; 6024 if (mergeArgs.length) { 6025 pushMergeArg(); 6026 if (mergeArgs.length > 1) { 6027 propsExpression = createCallExpression( 6028 context.helper(MERGE_PROPS), 6029 mergeArgs, 6030 elementLoc 6031 ); 6032 } else { 6033 propsExpression = mergeArgs[0]; 6034 } 6035 } else if (properties.length) { 6036 propsExpression = createObjectExpression( 6037 dedupeProperties(properties), 6038 elementLoc 6039 ); 6040 } 6041 if (hasDynamicKeys) { 6042 patchFlag |= 16; 6043 } else { 6044 if (hasClassBinding && !isComponent) { 6045 patchFlag |= 2; 6046 } 6047 if (hasStyleBinding && !isComponent) { 6048 patchFlag |= 4; 6049 } 6050 if (dynamicPropNames.length) { 6051 patchFlag |= 8; 6052 } 6053 if (hasHydrationEventBinding) { 6054 patchFlag |= 32; 6055 } 6056 } 6057 if (!shouldUseBlock && (patchFlag === 0 || patchFlag === 32) && (hasRef || hasVnodeHook || runtimeDirectives.length > 0)) { 6058 patchFlag |= 512; 6059 } 6060 if (!context.inSSR && propsExpression) { 6061 switch (propsExpression.type) { 6062 case 15: 6063 let classKeyIndex = -1; 6064 let styleKeyIndex = -1; 6065 let hasDynamicKey = false; 6066 for (let i = 0; i < propsExpression.properties.length; i++) { 6067 const key = propsExpression.properties[i].key; 6068 if (isStaticExp(key)) { 6069 if (key.content === "class") { 6070 classKeyIndex = i; 6071 } else if (key.content === "style") { 6072 styleKeyIndex = i; 6073 } 6074 } else if (!key.isHandlerKey) { 6075 hasDynamicKey = true; 6076 } 6077 } 6078 const classProp = propsExpression.properties[classKeyIndex]; 6079 const styleProp = propsExpression.properties[styleKeyIndex]; 6080 if (!hasDynamicKey) { 6081 if (classProp && !isStaticExp(classProp.value)) { 6082 classProp.value = createCallExpression( 6083 context.helper(NORMALIZE_CLASS), 6084 [classProp.value] 6085 ); 6086 } 6087 if (styleProp && // the static style is compiled into an object, 6088 // so use `hasStyleBinding` to ensure that it is a dynamic style binding 6089 (hasStyleBinding || styleProp.value.type === 4 && styleProp.value.content.trim()[0] === `[` || // v-bind:style and style both exist, 6090 // v-bind:style with static literal object 6091 styleProp.value.type === 17)) { 6092 styleProp.value = createCallExpression( 6093 context.helper(NORMALIZE_STYLE), 6094 [styleProp.value] 6095 ); 6096 } 6097 } else { 6098 propsExpression = createCallExpression( 6099 context.helper(NORMALIZE_PROPS), 6100 [propsExpression] 6101 ); 6102 } 6103 break; 6104 case 14: 6105 break; 6106 default: 6107 propsExpression = createCallExpression( 6108 context.helper(NORMALIZE_PROPS), 6109 [ 6110 createCallExpression(context.helper(GUARD_REACTIVE_PROPS), [ 6111 propsExpression 6112 ]) 6113 ] 6114 ); 6115 break; 6116 } 6117 } 6118 return { 6119 props: propsExpression, 6120 directives: runtimeDirectives, 6121 patchFlag, 6122 dynamicPropNames, 6123 shouldUseBlock 6124 }; 6125} 6126function dedupeProperties(properties) { 6127 const knownProps = /* @__PURE__ */ new Map(); 6128 const deduped = []; 6129 for (let i = 0; i < properties.length; i++) { 6130 const prop = properties[i]; 6131 if (prop.key.type === 8 || !prop.key.isStatic) { 6132 deduped.push(prop); 6133 continue; 6134 } 6135 const name = prop.key.content; 6136 const existing = knownProps.get(name); 6137 if (existing) { 6138 if (name === "style" || name === "class" || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isOn)(name)) { 6139 mergeAsArray(existing, prop); 6140 } 6141 } else { 6142 knownProps.set(name, prop); 6143 deduped.push(prop); 6144 } 6145 } 6146 return deduped; 6147} 6148function mergeAsArray(existing, incoming) { 6149 if (existing.value.type === 17) { 6150 existing.value.elements.push(incoming.value); 6151 } else { 6152 existing.value = createArrayExpression( 6153 [existing.value, incoming.value], 6154 existing.loc 6155 ); 6156 } 6157} 6158function buildDirectiveArgs(dir, context) { 6159 const dirArgs = []; 6160 const runtime = directiveImportMap.get(dir); 6161 if (runtime) { 6162 dirArgs.push(context.helperString(runtime)); 6163 } else { 6164 { 6165 context.helper(RESOLVE_DIRECTIVE); 6166 context.directives.add(dir.name); 6167 dirArgs.push(toValidAssetId(dir.name, `directive`)); 6168 } 6169 } 6170 const { loc } = dir; 6171 if (dir.exp) dirArgs.push(dir.exp); 6172 if (dir.arg) { 6173 if (!dir.exp) { 6174 dirArgs.push(`void 0`); 6175 } 6176 dirArgs.push(dir.arg); 6177 } 6178 if (Object.keys(dir.modifiers).length) { 6179 if (!dir.arg) { 6180 if (!dir.exp) { 6181 dirArgs.push(`void 0`); 6182 } 6183 dirArgs.push(`void 0`); 6184 } 6185 const trueExpression = createSimpleExpression(`true`, false, loc); 6186 dirArgs.push( 6187 createObjectExpression( 6188 dir.modifiers.map( 6189 (modifier) => createObjectProperty(modifier, trueExpression) 6190 ), 6191 loc 6192 ) 6193 ); 6194 } 6195 return createArrayExpression(dirArgs, dir.loc); 6196} 6197function stringifyDynamicPropNames(props) { 6198 let propsNamesString = `[`; 6199 for (let i = 0, l = props.length; i < l; i++) { 6200 propsNamesString += JSON.stringify(props[i]); 6201 if (i < l - 1) propsNamesString += ", "; 6202 } 6203 return propsNamesString + `]`; 6204} 6205function isComponentTag(tag) { 6206 return tag === "component" || tag === "Component"; 6207} 6208 6209const transformSlotOutlet = (node, context) => { 6210 if (isSlotOutlet(node)) { 6211 const { children, loc } = node; 6212 const { slotName, slotProps } = processSlotOutlet(node, context); 6213 const slotArgs = [ 6214 context.prefixIdentifiers ? `_ctx.$slots` : `$slots`, 6215 slotName, 6216 "{}", 6217 "undefined", 6218 "true" 6219 ]; 6220 let expectedLen = 2; 6221 if (slotProps) { 6222 slotArgs[2] = slotProps; 6223 expectedLen = 3; 6224 } 6225 if (children.length) { 6226 slotArgs[3] = createFunctionExpression([], children, false, false, loc); 6227 expectedLen = 4; 6228 } 6229 if (context.scopeId && !context.slotted) { 6230 expectedLen = 5; 6231 } 6232 slotArgs.splice(expectedLen); 6233 node.codegenNode = createCallExpression( 6234 context.helper(RENDER_SLOT), 6235 slotArgs, 6236 loc 6237 ); 6238 } 6239}; 6240function processSlotOutlet(node, context) { 6241 let slotName = `"default"`; 6242 let slotProps = void 0; 6243 const nonNameProps = []; 6244 for (let i = 0; i < node.props.length; i++) { 6245 const p = node.props[i]; 6246 if (p.type === 6) { 6247 if (p.value) { 6248 if (p.name === "name") { 6249 slotName = JSON.stringify(p.value.content); 6250 } else { 6251 p.name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.name); 6252 nonNameProps.push(p); 6253 } 6254 } 6255 } else { 6256 if (p.name === "bind" && isStaticArgOf(p.arg, "name")) { 6257 if (p.exp) { 6258 slotName = p.exp; 6259 } else if (p.arg && p.arg.type === 4) { 6260 const name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.arg.content); 6261 slotName = p.exp = createSimpleExpression(name, false, p.arg.loc); 6262 } 6263 } else { 6264 if (p.name === "bind" && p.arg && isStaticExp(p.arg)) { 6265 p.arg.content = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(p.arg.content); 6266 } 6267 nonNameProps.push(p); 6268 } 6269 } 6270 } 6271 if (nonNameProps.length > 0) { 6272 const { props, directives } = buildProps( 6273 node, 6274 context, 6275 nonNameProps, 6276 false, 6277 false 6278 ); 6279 slotProps = props; 6280 if (directives.length) { 6281 context.onError( 6282 createCompilerError( 6283 36, 6284 directives[0].loc 6285 ) 6286 ); 6287 } 6288 } 6289 return { 6290 slotName, 6291 slotProps 6292 }; 6293} 6294 6295const fnExpRE = /^\s*(async\s*)?(\([^)]*?\)|[\w$_]+)\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/; 6296const transformOn = (dir, node, context, augmentor) => { 6297 const { loc, modifiers, arg } = dir; 6298 if (!dir.exp && !modifiers.length) { 6299 context.onError(createCompilerError(35, loc)); 6300 } 6301 let eventName; 6302 if (arg.type === 4) { 6303 if (arg.isStatic) { 6304 let rawName = arg.content; 6305 if ( true && rawName.startsWith("vnode")) { 6306 context.onError(createCompilerError(51, arg.loc)); 6307 } 6308 if (rawName.startsWith("vue:")) { 6309 rawName = `vnode-${rawName.slice(4)}`; 6310 } 6311 const eventString = node.tagType !== 0 || rawName.startsWith("vnode") || !/[A-Z]/.test(rawName) ? ( 6312 // for non-element and vnode lifecycle event listeners, auto convert 6313 // it to camelCase. See issue #2249 6314 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(rawName)) 6315 ) : ( 6316 // preserve case for plain element listeners that have uppercase 6317 // letters, as these may be custom elements' custom events 6318 `on:${rawName}` 6319 ); 6320 eventName = createSimpleExpression(eventString, true, arg.loc); 6321 } else { 6322 eventName = createCompoundExpression([ 6323 `${context.helperString(TO_HANDLER_KEY)}(`, 6324 arg, 6325 `)` 6326 ]); 6327 } 6328 } else { 6329 eventName = arg; 6330 eventName.children.unshift(`${context.helperString(TO_HANDLER_KEY)}(`); 6331 eventName.children.push(`)`); 6332 } 6333 let exp = dir.exp; 6334 if (exp && !exp.content.trim()) { 6335 exp = void 0; 6336 } 6337 let shouldCache = context.cacheHandlers && !exp && !context.inVOnce; 6338 if (exp) { 6339 const isMemberExp = isMemberExpression(exp.content); 6340 const isInlineStatement = !(isMemberExp || fnExpRE.test(exp.content)); 6341 const hasMultipleStatements = exp.content.includes(`;`); 6342 if (true) { 6343 validateBrowserExpression( 6344 exp, 6345 context, 6346 false, 6347 hasMultipleStatements 6348 ); 6349 } 6350 if (isInlineStatement || shouldCache && isMemberExp) { 6351 exp = createCompoundExpression([ 6352 `${isInlineStatement ? `$event` : `${``}(...args)`} => ${hasMultipleStatements ? `{` : `(`}`, 6353 exp, 6354 hasMultipleStatements ? `}` : `)` 6355 ]); 6356 } 6357 } 6358 let ret = { 6359 props: [ 6360 createObjectProperty( 6361 eventName, 6362 exp || createSimpleExpression(`() => {}`, false, loc) 6363 ) 6364 ] 6365 }; 6366 if (augmentor) { 6367 ret = augmentor(ret); 6368 } 6369 if (shouldCache) { 6370 ret.props[0].value = context.cache(ret.props[0].value); 6371 } 6372 ret.props.forEach((p) => p.key.isHandlerKey = true); 6373 return ret; 6374}; 6375 6376const transformText = (node, context) => { 6377 if (node.type === 0 || node.type === 1 || node.type === 11 || node.type === 10) { 6378 return () => { 6379 const children = node.children; 6380 let currentContainer = void 0; 6381 let hasText = false; 6382 for (let i = 0; i < children.length; i++) { 6383 const child = children[i]; 6384 if (isText$1(child)) { 6385 hasText = true; 6386 for (let j = i + 1; j < children.length; j++) { 6387 const next = children[j]; 6388 if (isText$1(next)) { 6389 if (!currentContainer) { 6390 currentContainer = children[i] = createCompoundExpression( 6391 [child], 6392 child.loc 6393 ); 6394 } 6395 currentContainer.children.push(` + `, next); 6396 children.splice(j, 1); 6397 j--; 6398 } else { 6399 currentContainer = void 0; 6400 break; 6401 } 6402 } 6403 } 6404 } 6405 if (!hasText || // if this is a plain element with a single text child, leave it 6406 // as-is since the runtime has dedicated fast path for this by directly 6407 // setting textContent of the element. 6408 // for component root it's always normalized anyway. 6409 children.length === 1 && (node.type === 0 || node.type === 1 && node.tagType === 0 && // #3756 6410 // custom directives can potentially add DOM elements arbitrarily, 6411 // we need to avoid setting textContent of the element at runtime 6412 // to avoid accidentally overwriting the DOM elements added 6413 // by the user through custom directives. 6414 !node.props.find( 6415 (p) => p.type === 7 && !context.directiveTransforms[p.name] 6416 ) && // in compat mode, <template> tags with no special directives 6417 // will be rendered as a fragment so its children must be 6418 // converted into vnodes. 6419 !(node.tag === "template"))) { 6420 return; 6421 } 6422 for (let i = 0; i < children.length; i++) { 6423 const child = children[i]; 6424 if (isText$1(child) || child.type === 8) { 6425 const callArgs = []; 6426 if (child.type !== 2 || child.content !== " ") { 6427 callArgs.push(child); 6428 } 6429 if (!context.ssr && getConstantType(child, context) === 0) { 6430 callArgs.push( 6431 1 + ( true ? ` /* ${_vue_shared__WEBPACK_IMPORTED_MODULE_0__.PatchFlagNames[1]} */` : 0) 6432 ); 6433 } 6434 children[i] = { 6435 type: 12, 6436 content: child, 6437 loc: child.loc, 6438 codegenNode: createCallExpression( 6439 context.helper(CREATE_TEXT), 6440 callArgs 6441 ) 6442 }; 6443 } 6444 } 6445 }; 6446 } 6447}; 6448 6449const seen$1 = /* @__PURE__ */ new WeakSet(); 6450const transformOnce = (node, context) => { 6451 if (node.type === 1 && findDir(node, "once", true)) { 6452 if (seen$1.has(node) || context.inVOnce || context.inSSR) { 6453 return; 6454 } 6455 seen$1.add(node); 6456 context.inVOnce = true; 6457 context.helper(SET_BLOCK_TRACKING); 6458 return () => { 6459 context.inVOnce = false; 6460 const cur = context.currentNode; 6461 if (cur.codegenNode) { 6462 cur.codegenNode = context.cache( 6463 cur.codegenNode, 6464 true 6465 /* isVNode */ 6466 ); 6467 } 6468 }; 6469 } 6470}; 6471 6472const transformModel = (dir, node, context) => { 6473 const { exp, arg } = dir; 6474 if (!exp) { 6475 context.onError( 6476 createCompilerError(41, dir.loc) 6477 ); 6478 return createTransformProps(); 6479 } 6480 const rawExp = exp.loc.source; 6481 const expString = exp.type === 4 ? exp.content : rawExp; 6482 const bindingType = context.bindingMetadata[rawExp]; 6483 if (bindingType === "props" || bindingType === "props-aliased") { 6484 context.onError(createCompilerError(44, exp.loc)); 6485 return createTransformProps(); 6486 } 6487 const maybeRef = false; 6488 if (!expString.trim() || !isMemberExpression(expString) && !maybeRef) { 6489 context.onError( 6490 createCompilerError(42, exp.loc) 6491 ); 6492 return createTransformProps(); 6493 } 6494 const propName = arg ? arg : createSimpleExpression("modelValue", true); 6495 const eventName = arg ? isStaticExp(arg) ? `onUpdate:${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.camelize)(arg.content)}` : createCompoundExpression(['"onUpdate:" + ', arg]) : `onUpdate:modelValue`; 6496 let assignmentExp; 6497 const eventArg = context.isTS ? `($event: any)` : `$event`; 6498 { 6499 assignmentExp = createCompoundExpression([ 6500 `${eventArg} => ((`, 6501 exp, 6502 `) = $event)` 6503 ]); 6504 } 6505 const props = [ 6506 // modelValue: foo 6507 createObjectProperty(propName, dir.exp), 6508 // "onUpdate:modelValue": $event => (foo = $event) 6509 createObjectProperty(eventName, assignmentExp) 6510 ]; 6511 if (dir.modifiers.length && node.tagType === 1) { 6512 const modifiers = dir.modifiers.map((m) => (isSimpleIdentifier(m) ? m : JSON.stringify(m)) + `: true`).join(`, `); 6513 const modifiersKey = arg ? isStaticExp(arg) ? `${arg.content}Modifiers` : createCompoundExpression([arg, ' + "Modifiers"']) : `modelModifiers`; 6514 props.push( 6515 createObjectProperty( 6516 modifiersKey, 6517 createSimpleExpression( 6518 `{ ${modifiers} }`, 6519 false, 6520 dir.loc, 6521 2 6522 ) 6523 ) 6524 ); 6525 } 6526 return createTransformProps(props); 6527}; 6528function createTransformProps(props = []) { 6529 return { props }; 6530} 6531 6532const validDivisionCharRE = /[\w).+\-_$\]]/; 6533const transformFilter = (node, context) => { 6534 if (!isCompatEnabled("COMPILER_FILTERS", context)) { 6535 return; 6536 } 6537 if (node.type === 5) { 6538 rewriteFilter(node.content, context); 6539 } else if (node.type === 1) { 6540 node.props.forEach((prop) => { 6541 if (prop.type === 7 && prop.name !== "for" && prop.exp) { 6542 rewriteFilter(prop.exp, context); 6543 } 6544 }); 6545 } 6546}; 6547function rewriteFilter(node, context) { 6548 if (node.type === 4) { 6549 parseFilter(node, context); 6550 } else { 6551 for (let i = 0; i < node.children.length; i++) { 6552 const child = node.children[i]; 6553 if (typeof child !== "object") continue; 6554 if (child.type === 4) { 6555 parseFilter(child, context); 6556 } else if (child.type === 8) { 6557 rewriteFilter(node, context); 6558 } else if (child.type === 5) { 6559 rewriteFilter(child.content, context); 6560 } 6561 } 6562 } 6563} 6564function parseFilter(node, context) { 6565 const exp = node.content; 6566 let inSingle = false; 6567 let inDouble = false; 6568 let inTemplateString = false; 6569 let inRegex = false; 6570 let curly = 0; 6571 let square = 0; 6572 let paren = 0; 6573 let lastFilterIndex = 0; 6574 let c, prev, i, expression, filters = []; 6575 for (i = 0; i < exp.length; i++) { 6576 prev = c; 6577 c = exp.charCodeAt(i); 6578 if (inSingle) { 6579 if (c === 39 && prev !== 92) inSingle = false; 6580 } else if (inDouble) { 6581 if (c === 34 && prev !== 92) inDouble = false; 6582 } else if (inTemplateString) { 6583 if (c === 96 && prev !== 92) inTemplateString = false; 6584 } else if (inRegex) { 6585 if (c === 47 && prev !== 92) inRegex = false; 6586 } else if (c === 124 && // pipe 6587 exp.charCodeAt(i + 1) !== 124 && exp.charCodeAt(i - 1) !== 124 && !curly && !square && !paren) { 6588 if (expression === void 0) { 6589 lastFilterIndex = i + 1; 6590 expression = exp.slice(0, i).trim(); 6591 } else { 6592 pushFilter(); 6593 } 6594 } else { 6595 switch (c) { 6596 case 34: 6597 inDouble = true; 6598 break; 6599 case 39: 6600 inSingle = true; 6601 break; 6602 case 96: 6603 inTemplateString = true; 6604 break; 6605 case 40: 6606 paren++; 6607 break; 6608 case 41: 6609 paren--; 6610 break; 6611 case 91: 6612 square++; 6613 break; 6614 case 93: 6615 square--; 6616 break; 6617 case 123: 6618 curly++; 6619 break; 6620 case 125: 6621 curly--; 6622 break; 6623 } 6624 if (c === 47) { 6625 let j = i - 1; 6626 let p; 6627 for (; j >= 0; j--) { 6628 p = exp.charAt(j); 6629 if (p !== " ") break; 6630 } 6631 if (!p || !validDivisionCharRE.test(p)) { 6632 inRegex = true; 6633 } 6634 } 6635 } 6636 } 6637 if (expression === void 0) { 6638 expression = exp.slice(0, i).trim(); 6639 } else if (lastFilterIndex !== 0) { 6640 pushFilter(); 6641 } 6642 function pushFilter() { 6643 filters.push(exp.slice(lastFilterIndex, i).trim()); 6644 lastFilterIndex = i + 1; 6645 } 6646 if (filters.length) { 6647 true && warnDeprecation( 6648 "COMPILER_FILTERS", 6649 context, 6650 node.loc 6651 ); 6652 for (i = 0; i < filters.length; i++) { 6653 expression = wrapFilter(expression, filters[i], context); 6654 } 6655 node.content = expression; 6656 node.ast = void 0; 6657 } 6658} 6659function wrapFilter(exp, filter, context) { 6660 context.helper(RESOLVE_FILTER); 6661 const i = filter.indexOf("("); 6662 if (i < 0) { 6663 context.filters.add(filter); 6664 return `${toValidAssetId(filter, "filter")}(${exp})`; 6665 } else { 6666 const name = filter.slice(0, i); 6667 const args = filter.slice(i + 1); 6668 context.filters.add(name); 6669 return `${toValidAssetId(name, "filter")}(${exp}${args !== ")" ? "," + args : args}`; 6670 } 6671} 6672 6673const seen = /* @__PURE__ */ new WeakSet(); 6674const transformMemo = (node, context) => { 6675 if (node.type === 1) { 6676 const dir = findDir(node, "memo"); 6677 if (!dir || seen.has(node)) { 6678 return; 6679 } 6680 seen.add(node); 6681 return () => { 6682 const codegenNode = node.codegenNode || context.currentNode.codegenNode; 6683 if (codegenNode && codegenNode.type === 13) { 6684 if (node.tagType !== 1) { 6685 convertToBlock(codegenNode, context); 6686 } 6687 node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [ 6688 dir.exp, 6689 createFunctionExpression(void 0, codegenNode), 6690 `_cache`, 6691 String(context.cached++) 6692 ]); 6693 } 6694 }; 6695 } 6696}; 6697 6698function getBaseTransformPreset(prefixIdentifiers) { 6699 return [ 6700 [ 6701 transformOnce, 6702 transformIf, 6703 transformMemo, 6704 transformFor, 6705 ...[transformFilter] , 6706 ... true ? [transformExpression] : 0, 6707 transformSlotOutlet, 6708 transformElement, 6709 trackSlotScopes, 6710 transformText 6711 ], 6712 { 6713 on: transformOn, 6714 bind: transformBind, 6715 model: transformModel 6716 } 6717 ]; 6718} 6719function baseCompile(source, options = {}) { 6720 const onError = options.onError || defaultOnError; 6721 const isModuleMode = options.mode === "module"; 6722 { 6723 if (options.prefixIdentifiers === true) { 6724 onError(createCompilerError(47)); 6725 } else if (isModuleMode) { 6726 onError(createCompilerError(48)); 6727 } 6728 } 6729 const prefixIdentifiers = false; 6730 if (options.cacheHandlers) { 6731 onError(createCompilerError(49)); 6732 } 6733 if (options.scopeId && !isModuleMode) { 6734 onError(createCompilerError(50)); 6735 } 6736 const resolvedOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, options, { 6737 prefixIdentifiers 6738 }); 6739 const ast = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isString)(source) ? baseParse(source, resolvedOptions) : source; 6740 const [nodeTransforms, directiveTransforms] = getBaseTransformPreset(); 6741 transform( 6742 ast, 6743 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({}, resolvedOptions, { 6744 nodeTransforms: [ 6745 ...nodeTransforms, 6746 ...options.nodeTransforms || [] 6747 // user transforms 6748 ], 6749 directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)( 6750 {}, 6751 directiveTransforms, 6752 options.directiveTransforms || {} 6753 // user transforms 6754 ) 6755 }) 6756 ); 6757 return generate(ast, resolvedOptions); 6758} 6759 6760const BindingTypes = { 6761 "DATA": "data", 6762 "PROPS": "props", 6763 "PROPS_ALIASED": "props-aliased", 6764 "SETUP_LET": "setup-let", 6765 "SETUP_CONST": "setup-const", 6766 "SETUP_REACTIVE_CONST": "setup-reactive-const", 6767 "SETUP_MAYBE_REF": "setup-maybe-ref", 6768 "SETUP_REF": "setup-ref", 6769 "OPTIONS": "options", 6770 "LITERAL_CONST": "literal-const" 6771}; 6772 6773const noopDirectiveTransform = () => ({ props: [] }); 6774 6775 6776 6777 6778/***/ }), 6779
vendor: 39,902 bytes, lines 6780-7455
6780/***/ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js": 6781/*!*************************************************************************!*\ 6782 !*** ./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js ***! 6783 \*************************************************************************/ 6784/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6785 6786"use strict"; 6787__webpack_require__.r(__webpack_exports__); 6788/* harmony export */ __webpack_require__.d(__webpack_exports__, { 6789/* harmony export */ BASE_TRANSITION: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BASE_TRANSITION; }, 6790/* harmony export */ BindingTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.BindingTypes; }, 6791/* harmony export */ CAMELIZE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAMELIZE; }, 6792/* harmony export */ CAPITALIZE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CAPITALIZE; }, 6793/* harmony export */ CREATE_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_BLOCK; }, 6794/* harmony export */ CREATE_COMMENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_COMMENT; }, 6795/* harmony export */ CREATE_ELEMENT_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_BLOCK; }, 6796/* harmony export */ CREATE_ELEMENT_VNODE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_ELEMENT_VNODE; }, 6797/* harmony export */ CREATE_SLOTS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_SLOTS; }, 6798/* harmony export */ CREATE_STATIC: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_STATIC; }, 6799/* harmony export */ CREATE_TEXT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_TEXT; }, 6800/* harmony export */ CREATE_VNODE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CREATE_VNODE; }, 6801/* harmony export */ CompilerDeprecationTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.CompilerDeprecationTypes; }, 6802/* harmony export */ ConstantTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ConstantTypes; }, 6803/* harmony export */ DOMDirectiveTransforms: function() { return /* binding */ DOMDirectiveTransforms; }, 6804/* harmony export */ DOMErrorCodes: function() { return /* binding */ DOMErrorCodes; }, 6805/* harmony export */ DOMErrorMessages: function() { return /* binding */ DOMErrorMessages; }, 6806/* harmony export */ DOMNodeTransforms: function() { return /* binding */ DOMNodeTransforms; }, 6807/* harmony export */ ElementTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ElementTypes; }, 6808/* harmony export */ ErrorCodes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; }, 6809/* harmony export */ FRAGMENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.FRAGMENT; }, 6810/* harmony export */ GUARD_REACTIVE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.GUARD_REACTIVE_PROPS; }, 6811/* harmony export */ IS_MEMO_SAME: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_MEMO_SAME; }, 6812/* harmony export */ IS_REF: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.IS_REF; }, 6813/* harmony export */ KEEP_ALIVE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.KEEP_ALIVE; }, 6814/* harmony export */ MERGE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.MERGE_PROPS; }, 6815/* harmony export */ NORMALIZE_CLASS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_CLASS; }, 6816/* harmony export */ NORMALIZE_PROPS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_PROPS; }, 6817/* harmony export */ NORMALIZE_STYLE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NORMALIZE_STYLE; }, 6818/* harmony export */ Namespaces: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.Namespaces; }, 6819/* harmony export */ NodeTypes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.NodeTypes; }, 6820/* harmony export */ OPEN_BLOCK: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.OPEN_BLOCK; }, 6821/* harmony export */ POP_SCOPE_ID: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.POP_SCOPE_ID; }, 6822/* harmony export */ PUSH_SCOPE_ID: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.PUSH_SCOPE_ID; }, 6823/* harmony export */ RENDER_LIST: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_LIST; }, 6824/* harmony export */ RENDER_SLOT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RENDER_SLOT; }, 6825/* harmony export */ RESOLVE_COMPONENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_COMPONENT; }, 6826/* harmony export */ RESOLVE_DIRECTIVE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DIRECTIVE; }, 6827/* harmony export */ RESOLVE_DYNAMIC_COMPONENT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_DYNAMIC_COMPONENT; }, 6828/* harmony export */ RESOLVE_FILTER: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.RESOLVE_FILTER; }, 6829/* harmony export */ SET_BLOCK_TRACKING: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SET_BLOCK_TRACKING; }, 6830/* harmony export */ SUSPENSE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.SUSPENSE; }, 6831/* harmony export */ TELEPORT: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TELEPORT; }, 6832/* harmony export */ TO_DISPLAY_STRING: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING; }, 6833/* harmony export */ TO_HANDLERS: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLERS; }, 6834/* harmony export */ TO_HANDLER_KEY: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_HANDLER_KEY; }, 6835/* harmony export */ TRANSITION: function() { return /* binding */ TRANSITION; }, 6836/* harmony export */ TRANSITION_GROUP: function() { return /* binding */ TRANSITION_GROUP; }, 6837/* harmony export */ TS_NODE_TYPES: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TS_NODE_TYPES; }, 6838/* harmony export */ UNREF: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.UNREF; }, 6839/* harmony export */ V_MODEL_CHECKBOX: function() { return /* binding */ V_MODEL_CHECKBOX; }, 6840/* harmony export */ V_MODEL_DYNAMIC: function() { return /* binding */ V_MODEL_DYNAMIC; }, 6841/* harmony export */ V_MODEL_RADIO: function() { return /* binding */ V_MODEL_RADIO; }, 6842/* harmony export */ V_MODEL_SELECT: function() { return /* binding */ V_MODEL_SELECT; }, 6843/* harmony export */ V_MODEL_TEXT: function() { return /* binding */ V_MODEL_TEXT; }, 6844/* harmony export */ V_ON_WITH_KEYS: function() { return /* binding */ V_ON_WITH_KEYS; }, 6845/* harmony export */ V_ON_WITH_MODIFIERS: function() { return /* binding */ V_ON_WITH_MODIFIERS; }, 6846/* harmony export */ V_SHOW: function() { return /* binding */ V_SHOW; }, 6847/* harmony export */ WITH_CTX: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_CTX; }, 6848/* harmony export */ WITH_DIRECTIVES: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_DIRECTIVES; }, 6849/* harmony export */ WITH_MEMO: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.WITH_MEMO; }, 6850/* harmony export */ advancePositionWithClone: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithClone; }, 6851/* harmony export */ advancePositionWithMutation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.advancePositionWithMutation; }, 6852/* harmony export */ assert: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.assert; }, 6853/* harmony export */ baseCompile: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile; }, 6854/* harmony export */ baseParse: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse; }, 6855/* harmony export */ buildDirectiveArgs: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildDirectiveArgs; }, 6856/* harmony export */ buildProps: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildProps; }, 6857/* harmony export */ buildSlots: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.buildSlots; }, 6858/* harmony export */ checkCompatEnabled: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled; }, 6859/* harmony export */ compile: function() { return /* binding */ compile; }, 6860/* harmony export */ convertToBlock: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.convertToBlock; }, 6861/* harmony export */ createArrayExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createArrayExpression; }, 6862/* harmony export */ createAssignmentExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createAssignmentExpression; }, 6863/* harmony export */ createBlockStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createBlockStatement; }, 6864/* harmony export */ createCacheExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCacheExpression; }, 6865/* harmony export */ createCallExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression; }, 6866/* harmony export */ createCompilerError: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError; }, 6867/* harmony export */ createCompoundExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression; }, 6868/* harmony export */ createConditionalExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createConditionalExpression; }, 6869/* harmony export */ createDOMCompilerError: function() { return /* binding */ createDOMCompilerError; }, 6870/* harmony export */ createForLoopParams: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createForLoopParams; }, 6871/* harmony export */ createFunctionExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createFunctionExpression; }, 6872/* harmony export */ createIfStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createIfStatement; }, 6873/* harmony export */ createInterpolation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createInterpolation; }, 6874/* harmony export */ createObjectExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectExpression; }, 6875/* harmony export */ createObjectProperty: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty; }, 6876/* harmony export */ createReturnStatement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createReturnStatement; }, 6877/* harmony export */ createRoot: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createRoot; }, 6878/* harmony export */ createSequenceExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSequenceExpression; }, 6879/* harmony export */ createSimpleExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression; }, 6880/* harmony export */ createStructuralDirectiveTransform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createStructuralDirectiveTransform; }, 6881/* harmony export */ createTemplateLiteral: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTemplateLiteral; }, 6882/* harmony export */ createTransformContext: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createTransformContext; }, 6883/* harmony export */ createVNodeCall: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createVNodeCall; }, 6884/* harmony export */ errorMessages: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.errorMessages; }, 6885/* harmony export */ extractIdentifiers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.extractIdentifiers; }, 6886/* harmony export */ findDir: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir; }, 6887/* harmony export */ findProp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp; }, 6888/* harmony export */ forAliasRE: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.forAliasRE; }, 6889/* harmony export */ generate: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generate; }, 6890/* harmony export */ generateCodeFrame: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.generateCodeFrame; }, 6891/* harmony export */ getBaseTransformPreset: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getBaseTransformPreset; }, 6892/* harmony export */ getConstantType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType; }, 6893/* harmony export */ getMemoedVNodeCall: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getMemoedVNodeCall; }, 6894/* harmony export */ getVNodeBlockHelper: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeBlockHelper; }, 6895/* harmony export */ getVNodeHelper: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getVNodeHelper; }, 6896/* harmony export */ hasDynamicKeyVBind: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind; }, 6897/* harmony export */ hasScopeRef: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasScopeRef; }, 6898/* harmony export */ helperNameMap: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.helperNameMap; }, 6899/* harmony export */ injectProp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.injectProp; }, 6900/* harmony export */ isCoreComponent: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isCoreComponent; }, 6901/* harmony export */ isFunctionType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isFunctionType; }, 6902/* harmony export */ isInDestructureAssignment: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isInDestructureAssignment; }, 6903/* harmony export */ isInNewExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isInNewExpression; }, 6904/* harmony export */ isMemberExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpression; }, 6905/* harmony export */ isMemberExpressionBrowser: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionBrowser; }, 6906/* harmony export */ isMemberExpressionNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isMemberExpressionNode; }, 6907/* harmony export */ isReferencedIdentifier: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isReferencedIdentifier; }, 6908/* harmony export */ isSimpleIdentifier: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSimpleIdentifier; }, 6909/* harmony export */ isSlotOutlet: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isSlotOutlet; }, 6910/* harmony export */ isStaticArgOf: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticArgOf; }, 6911/* harmony export */ isStaticExp: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp; }, 6912/* harmony export */ isStaticProperty: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticProperty; }, 6913/* harmony export */ isStaticPropertyKey: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticPropertyKey; }, 6914/* harmony export */ isTemplateNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isTemplateNode; }, 6915/* harmony export */ isText: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isText; }, 6916/* harmony export */ isVSlot: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isVSlot; }, 6917/* harmony export */ locStub: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.locStub; }, 6918/* harmony export */ noopDirectiveTransform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform; }, 6919/* harmony export */ parse: function() { return /* binding */ parse; }, 6920/* harmony export */ parserOptions: function() { return /* binding */ parserOptions; }, 6921/* harmony export */ processExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processExpression; }, 6922/* harmony export */ processFor: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processFor; }, 6923/* harmony export */ processIf: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processIf; }, 6924/* harmony export */ processSlotOutlet: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.processSlotOutlet; }, 6925/* harmony export */ registerRuntimeHelpers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers; }, 6926/* harmony export */ resolveComponentType: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponentType; }, 6927/* harmony export */ stringifyExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.stringifyExpression; }, 6928/* harmony export */ toValidAssetId: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.toValidAssetId; }, 6929/* harmony export */ trackSlotScopes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackSlotScopes; }, 6930/* harmony export */ trackVForSlotScopes: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.trackVForSlotScopes; }, 6931/* harmony export */ transform: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transform; }, 6932/* harmony export */ transformBind: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformBind; }, 6933/* harmony export */ transformElement: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformElement; }, 6934/* harmony export */ transformExpression: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformExpression; }, 6935/* harmony export */ transformModel: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel; }, 6936/* harmony export */ transformOn: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn; }, 6937/* harmony export */ transformStyle: function() { return /* binding */ transformStyle; }, 6938/* harmony export */ traverseNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.traverseNode; }, 6939/* harmony export */ unwrapTSNode: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.unwrapTSNode; }, 6940/* harmony export */ walkBlockDeclarations: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkBlockDeclarations; }, 6941/* harmony export */ walkFunctionParams: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkFunctionParams; }, 6942/* harmony export */ walkIdentifiers: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.walkIdentifiers; }, 6943/* harmony export */ warnDeprecation: function() { return /* reexport safe */ _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.warnDeprecation; } 6944/* harmony export */ }); 6945/* harmony import */ var _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/compiler-core */ "./node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js"); 6946/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 6947/** 6948* @vue/compiler-dom v3.4.34 6949* (c) 2018-present Yuxi (Evan) You and Vue contributors 6950* @license MIT 6951**/ 6952 6953 6954 6955 6956const V_MODEL_RADIO = Symbol( true ? `vModelRadio` : 0); 6957const V_MODEL_CHECKBOX = Symbol( true ? `vModelCheckbox` : 0); 6958const V_MODEL_TEXT = Symbol( true ? `vModelText` : 0); 6959const V_MODEL_SELECT = Symbol( true ? `vModelSelect` : 0); 6960const V_MODEL_DYNAMIC = Symbol( true ? `vModelDynamic` : 0); 6961const V_ON_WITH_MODIFIERS = Symbol( true ? `vOnModifiersGuard` : 0); 6962const V_ON_WITH_KEYS = Symbol( true ? `vOnKeysGuard` : 0); 6963const V_SHOW = Symbol( true ? `vShow` : 0); 6964const TRANSITION = Symbol( true ? `Transition` : 0); 6965const TRANSITION_GROUP = Symbol( true ? `TransitionGroup` : 0); 6966(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeHelpers)({ 6967 [V_MODEL_RADIO]: `vModelRadio`, 6968 [V_MODEL_CHECKBOX]: `vModelCheckbox`, 6969 [V_MODEL_TEXT]: `vModelText`, 6970 [V_MODEL_SELECT]: `vModelSelect`, 6971 [V_MODEL_DYNAMIC]: `vModelDynamic`, 6972 [V_ON_WITH_MODIFIERS]: `withModifiers`, 6973 [V_ON_WITH_KEYS]: `withKeys`, 6974 [V_SHOW]: `vShow`, 6975 [TRANSITION]: `Transition`, 6976 [TRANSITION_GROUP]: `TransitionGroup` 6977}); 6978 6979let decoder; 6980function decodeHtmlBrowser(raw, asAttr = false) { 6981 if (!decoder) { 6982 decoder = document.createElement("div"); 6983 } 6984 if (asAttr) { 6985 decoder.innerHTML = `<div foo="${raw.replace(/"/g, """)}">`; 6986 return decoder.children[0].getAttribute("foo"); 6987 } else { 6988 decoder.innerHTML = raw; 6989 return decoder.textContent; 6990 } 6991} 6992 6993const parserOptions = { 6994 parseMode: "html", 6995 isVoidTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.isVoidTag, 6996 isNativeTag: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMathMLTag)(tag), 6997 isPreTag: (tag) => tag === "pre", 6998 decodeEntities: decodeHtmlBrowser , 6999 isBuiltInComponent: (tag) => { 7000 if (tag === "Transition" || tag === "transition") { 7001 return TRANSITION; 7002 } else if (tag === "TransitionGroup" || tag === "transition-group") { 7003 return TRANSITION_GROUP; 7004 } 7005 }, 7006 // https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher 7007 getNamespace(tag, parent, rootNamespace) { 7008 let ns = parent ? parent.ns : rootNamespace; 7009 if (parent && ns === 2) { 7010 if (parent.tag === "annotation-xml") { 7011 if (tag === "svg") { 7012 return 1; 7013 } 7014 if (parent.props.some( 7015 (a) => a.type === 6 && a.name === "encoding" && a.value != null && (a.value.content === "text/html" || a.value.content === "application/xhtml+xml") 7016 )) { 7017 ns = 0; 7018 } 7019 } else if (/^m(?:[ions]|text)$/.test(parent.tag) && tag !== "mglyph" && tag !== "malignmark") { 7020 ns = 0; 7021 } 7022 } else if (parent && ns === 1) { 7023 if (parent.tag === "foreignObject" || parent.tag === "desc" || parent.tag === "title") { 7024 ns = 0; 7025 } 7026 } 7027 if (ns === 0) { 7028 if (tag === "svg") { 7029 return 1; 7030 } 7031 if (tag === "math") { 7032 return 2; 7033 } 7034 } 7035 return ns; 7036 } 7037}; 7038 7039const transformStyle = (node) => { 7040 if (node.type === 1) { 7041 node.props.forEach((p, i) => { 7042 if (p.type === 6 && p.name === "style" && p.value) { 7043 node.props[i] = { 7044 type: 7, 7045 name: `bind`, 7046 arg: (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`style`, true, p.loc), 7047 exp: parseInlineCSS(p.value.content, p.loc), 7048 modifiers: [], 7049 loc: p.loc 7050 }; 7051 } 7052 }); 7053 } 7054}; 7055const parseInlineCSS = (cssText, loc) => { 7056 const normalized = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.parseStringStyle)(cssText); 7057 return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)( 7058 JSON.stringify(normalized), 7059 false, 7060 loc, 7061 3 7062 ); 7063}; 7064 7065function createDOMCompilerError(code, loc) { 7066 return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompilerError)( 7067 code, 7068 loc, 7069 true ? DOMErrorMessages : 0 7070 ); 7071} 7072const DOMErrorCodes = { 7073 "X_V_HTML_NO_EXPRESSION": 53, 7074 "53": "X_V_HTML_NO_EXPRESSION", 7075 "X_V_HTML_WITH_CHILDREN": 54, 7076 "54": "X_V_HTML_WITH_CHILDREN", 7077 "X_V_TEXT_NO_EXPRESSION": 55, 7078 "55": "X_V_TEXT_NO_EXPRESSION", 7079 "X_V_TEXT_WITH_CHILDREN": 56, 7080 "56": "X_V_TEXT_WITH_CHILDREN", 7081 "X_V_MODEL_ON_INVALID_ELEMENT": 57, 7082 "57": "X_V_MODEL_ON_INVALID_ELEMENT", 7083 "X_V_MODEL_ARG_ON_ELEMENT": 58, 7084 "58": "X_V_MODEL_ARG_ON_ELEMENT", 7085 "X_V_MODEL_ON_FILE_INPUT_ELEMENT": 59, 7086 "59": "X_V_MODEL_ON_FILE_INPUT_ELEMENT", 7087 "X_V_MODEL_UNNECESSARY_VALUE": 60, 7088 "60": "X_V_MODEL_UNNECESSARY_VALUE", 7089 "X_V_SHOW_NO_EXPRESSION": 61, 7090 "61": "X_V_SHOW_NO_EXPRESSION", 7091 "X_TRANSITION_INVALID_CHILDREN": 62, 7092 "62": "X_TRANSITION_INVALID_CHILDREN", 7093 "X_IGNORED_SIDE_EFFECT_TAG": 63, 7094 "63": "X_IGNORED_SIDE_EFFECT_TAG", 7095 "__EXTEND_POINT__": 64, 7096 "64": "__EXTEND_POINT__" 7097}; 7098const DOMErrorMessages = { 7099 [53]: `v-html is missing expression.`, 7100 [54]: `v-html will override element children.`, 7101 [55]: `v-text is missing expression.`, 7102 [56]: `v-text will override element children.`, 7103 [57]: `v-model can only be used on <input>, <textarea> and <select> elements.`, 7104 [58]: `v-model argument is not supported on plain elements.`, 7105 [59]: `v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.`, 7106 [60]: `Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.`, 7107 [61]: `v-show is missing expression.`, 7108 [62]: `<Transition> expects exactly one child element or component.`, 7109 [63]: `Tags with side effect (<script> and <style>) are ignored in client component templates.` 7110}; 7111 7112const transformVHtml = (dir, node, context) => { 7113 const { exp, loc } = dir; 7114 if (!exp) { 7115 context.onError( 7116 createDOMCompilerError(53, loc) 7117 ); 7118 } 7119 if (node.children.length) { 7120 context.onError( 7121 createDOMCompilerError(54, loc) 7122 ); 7123 node.children.length = 0; 7124 } 7125 return { 7126 props: [ 7127 (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)( 7128 (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`innerHTML`, true, loc), 7129 exp || (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)("", true) 7130 ) 7131 ] 7132 }; 7133}; 7134 7135const transformVText = (dir, node, context) => { 7136 const { exp, loc } = dir; 7137 if (!exp) { 7138 context.onError( 7139 createDOMCompilerError(55, loc) 7140 ); 7141 } 7142 if (node.children.length) { 7143 context.onError( 7144 createDOMCompilerError(56, loc) 7145 ); 7146 node.children.length = 0; 7147 } 7148 return { 7149 props: [ 7150 (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)( 7151 (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`textContent`, true), 7152 exp ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.getConstantType)(exp, context) > 0 ? exp : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)( 7153 context.helperString(_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.TO_DISPLAY_STRING), 7154 [exp], 7155 loc 7156 ) : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)("", true) 7157 ) 7158 ] 7159 }; 7160}; 7161 7162const transformModel = (dir, node, context) => { 7163 const baseResult = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformModel)(dir, node, context); 7164 if (!baseResult.props.length || node.tagType === 1) { 7165 return baseResult; 7166 } 7167 if (dir.arg) { 7168 context.onError( 7169 createDOMCompilerError( 7170 58, 7171 dir.arg.loc 7172 ) 7173 ); 7174 } 7175 function checkDuplicatedValue() { 7176 const value = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findDir)(node, "bind"); 7177 if (value && (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticArgOf)(value.arg, "value")) { 7178 context.onError( 7179 createDOMCompilerError( 7180 60, 7181 value.loc 7182 ) 7183 ); 7184 } 7185 } 7186 const { tag } = node; 7187 const isCustomElement = context.isCustomElement(tag); 7188 if (tag === "input" || tag === "textarea" || tag === "select" || isCustomElement) { 7189 let directiveToUse = V_MODEL_TEXT; 7190 let isInvalidType = false; 7191 if (tag === "input" || isCustomElement) { 7192 const type = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.findProp)(node, `type`); 7193 if (type) { 7194 if (type.type === 7) { 7195 directiveToUse = V_MODEL_DYNAMIC; 7196 } else if (type.value) { 7197 switch (type.value.content) { 7198 case "radio": 7199 directiveToUse = V_MODEL_RADIO; 7200 break; 7201 case "checkbox": 7202 directiveToUse = V_MODEL_CHECKBOX; 7203 break; 7204 case "file": 7205 isInvalidType = true; 7206 context.onError( 7207 createDOMCompilerError( 7208 59, 7209 dir.loc 7210 ) 7211 ); 7212 break; 7213 default: 7214 true && checkDuplicatedValue(); 7215 break; 7216 } 7217 } 7218 } else if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.hasDynamicKeyVBind)(node)) { 7219 directiveToUse = V_MODEL_DYNAMIC; 7220 } else { 7221 true && checkDuplicatedValue(); 7222 } 7223 } else if (tag === "select") { 7224 directiveToUse = V_MODEL_SELECT; 7225 } else { 7226 true && checkDuplicatedValue(); 7227 } 7228 if (!isInvalidType) { 7229 baseResult.needRuntime = context.helper(directiveToUse); 7230 } 7231 } else { 7232 context.onError( 7233 createDOMCompilerError( 7234 57, 7235 dir.loc 7236 ) 7237 ); 7238 } 7239 baseResult.props = baseResult.props.filter( 7240 (p) => !(p.key.type === 4 && p.key.content === "modelValue") 7241 ); 7242 return baseResult; 7243}; 7244 7245const isEventOptionModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)(`passive,once,capture`); 7246const isNonKeyModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)( 7247 // event propagation management 7248 `stop,prevent,self,ctrl,shift,alt,meta,exact,middle` 7249); 7250const maybeKeyModifier = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)("left,right"); 7251const isKeyboardEvent = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)( 7252 `onkeyup,onkeydown,onkeypress`, 7253 true 7254); 7255const resolveModifiers = (key, modifiers, context, loc) => { 7256 const keyModifiers = []; 7257 const nonKeyModifiers = []; 7258 const eventOptionModifiers = []; 7259 for (let i = 0; i < modifiers.length; i++) { 7260 const modifier = modifiers[i]; 7261 if (modifier === "native" && (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.checkCompatEnabled)( 7262 "COMPILER_V_ON_NATIVE", 7263 context, 7264 loc 7265 )) { 7266 eventOptionModifiers.push(modifier); 7267 } else if (isEventOptionModifier(modifier)) { 7268 eventOptionModifiers.push(modifier); 7269 } else { 7270 if (maybeKeyModifier(modifier)) { 7271 if ((0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key)) { 7272 if (isKeyboardEvent(key.content)) { 7273 keyModifiers.push(modifier); 7274 } else { 7275 nonKeyModifiers.push(modifier); 7276 } 7277 } else { 7278 keyModifiers.push(modifier); 7279 nonKeyModifiers.push(modifier); 7280 } 7281 } else { 7282 if (isNonKeyModifier(modifier)) { 7283 nonKeyModifiers.push(modifier); 7284 } else { 7285 keyModifiers.push(modifier); 7286 } 7287 } 7288 } 7289 } 7290 return { 7291 keyModifiers, 7292 nonKeyModifiers, 7293 eventOptionModifiers 7294 }; 7295}; 7296const transformClick = (key, event) => { 7297 const isStaticClick = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) && key.content.toLowerCase() === "onclick"; 7298 return isStaticClick ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(event, true) : key.type !== 4 ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([ 7299 `(`, 7300 key, 7301 `) === "onClick" ? "${event}" : (`, 7302 key, 7303 `)` 7304 ]) : key; 7305}; 7306const transformOn = (dir, node, context) => { 7307 return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.transformOn)(dir, node, context, (baseResult) => { 7308 const { modifiers } = dir; 7309 if (!modifiers.length) return baseResult; 7310 let { key, value: handlerExp } = baseResult.props[0]; 7311 const { keyModifiers, nonKeyModifiers, eventOptionModifiers } = resolveModifiers(key, modifiers, context, dir.loc); 7312 if (nonKeyModifiers.includes("right")) { 7313 key = transformClick(key, `onContextmenu`); 7314 } 7315 if (nonKeyModifiers.includes("middle")) { 7316 key = transformClick(key, `onMouseup`); 7317 } 7318 if (nonKeyModifiers.length) { 7319 handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_MODIFIERS), [ 7320 handlerExp, 7321 JSON.stringify(nonKeyModifiers) 7322 ]); 7323 } 7324 if (keyModifiers.length && // if event name is dynamic, always wrap with keys guard 7325 (!(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) || isKeyboardEvent(key.content))) { 7326 handlerExp = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCallExpression)(context.helper(V_ON_WITH_KEYS), [ 7327 handlerExp, 7328 JSON.stringify(keyModifiers) 7329 ]); 7330 } 7331 if (eventOptionModifiers.length) { 7332 const modifierPostfix = eventOptionModifiers.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join(""); 7333 key = (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.isStaticExp)(key) ? (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createSimpleExpression)(`${key.content}${modifierPostfix}`, true) : (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createCompoundExpression)([`(`, key, `) + "${modifierPostfix}"`]); 7334 } 7335 return { 7336 props: [(0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.createObjectProperty)(key, handlerExp)] 7337 }; 7338 }); 7339}; 7340 7341const transformShow = (dir, node, context) => { 7342 const { exp, loc } = dir; 7343 if (!exp) { 7344 context.onError( 7345 createDOMCompilerError(61, loc) 7346 ); 7347 } 7348 return { 7349 props: [], 7350 needRuntime: context.helper(V_SHOW) 7351 }; 7352}; 7353 7354const transformTransition = (node, context) => { 7355 if (node.type === 1 && node.tagType === 1) { 7356 const component = context.isBuiltInComponent(node.tag); 7357 if (component === TRANSITION) { 7358 return () => { 7359 if (!node.children.length) { 7360 return; 7361 } 7362 if (hasMultipleChildren(node)) { 7363 context.onError( 7364 createDOMCompilerError( 7365 62, 7366 { 7367 start: node.children[0].loc.start, 7368 end: node.children[node.children.length - 1].loc.end, 7369 source: "" 7370 } 7371 ) 7372 ); 7373 } 7374 const child = node.children[0]; 7375 if (child.type === 1) { 7376 for (const p of child.props) { 7377 if (p.type === 7 && p.name === "show") { 7378 node.props.push({ 7379 type: 6, 7380 name: "persisted", 7381 nameLoc: node.loc, 7382 value: void 0, 7383 loc: node.loc 7384 }); 7385 } 7386 } 7387 } 7388 }; 7389 } 7390 } 7391}; 7392function hasMultipleChildren(node) { 7393 const children = node.children = node.children.filter( 7394 (c) => c.type !== 3 && !(c.type === 2 && !c.content.trim()) 7395 ); 7396 const child = children[0]; 7397 return children.length !== 1 || child.type === 11 || child.type === 9 && child.branches.some(hasMultipleChildren); 7398} 7399 7400const ignoreSideEffectTags = (node, context) => { 7401 if (node.type === 1 && node.tagType === 0 && (node.tag === "script" || node.tag === "style")) { 7402 true && context.onError( 7403 createDOMCompilerError( 7404 63, 7405 node.loc 7406 ) 7407 ); 7408 context.removeNode(); 7409 } 7410}; 7411 7412const DOMNodeTransforms = [ 7413 transformStyle, 7414 ... true ? [transformTransition] : 0 7415]; 7416const DOMDirectiveTransforms = { 7417 cloak: _vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.noopDirectiveTransform, 7418 html: transformVHtml, 7419 text: transformVText, 7420 model: transformModel, 7421 // override compiler-core 7422 on: transformOn, 7423 // override compiler-core 7424 show: transformShow 7425}; 7426function compile(src, options = {}) { 7427 return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseCompile)( 7428 src, 7429 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options, { 7430 nodeTransforms: [ 7431 // ignore <script> and <tag> 7432 // this is not put inside DOMNodeTransforms because that list is used 7433 // by compiler-ssr to generate vnode fallback branches 7434 ignoreSideEffectTags, 7435 ...DOMNodeTransforms, 7436 ...options.nodeTransforms || [] 7437 ], 7438 directiveTransforms: (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 7439 {}, 7440 DOMDirectiveTransforms, 7441 options.directiveTransforms || {} 7442 ), 7443 transformHoist: null 7444 }) 7445 ); 7446} 7447function parse(template, options = {}) { 7448 return (0,_vue_compiler_core__WEBPACK_IMPORTED_MODULE_0__.baseParse)(template, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, parserOptions, options)); 7449} 7450 7451 7452 7453 7454/***/ }), 7455
vendor: 40,104 bytes, lines 7456-8760
7456/***/ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js": 7457/*!*********************************************************************!*\ 7458 !*** ./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js ***! 7459 \*********************************************************************/ 7460/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 7461 7462"use strict"; 7463__webpack_require__.r(__webpack_exports__); 7464/* harmony export */ __webpack_require__.d(__webpack_exports__, { 7465/* harmony export */ EffectScope: function() { return /* binding */ EffectScope; }, 7466/* harmony export */ ITERATE_KEY: function() { return /* binding */ ITERATE_KEY; }, 7467/* harmony export */ ReactiveEffect: function() { return /* binding */ ReactiveEffect; }, 7468/* harmony export */ ReactiveFlags: function() { return /* binding */ ReactiveFlags; }, 7469/* harmony export */ TrackOpTypes: function() { return /* binding */ TrackOpTypes; }, 7470/* harmony export */ TriggerOpTypes: function() { return /* binding */ TriggerOpTypes; }, 7471/* harmony export */ computed: function() { return /* binding */ computed; }, 7472/* harmony export */ customRef: function() { return /* binding */ customRef; }, 7473/* harmony export */ deferredComputed: function() { return /* binding */ deferredComputed; }, 7474/* harmony export */ effect: function() { return /* binding */ effect; }, 7475/* harmony export */ effectScope: function() { return /* binding */ effectScope; }, 7476/* harmony export */ enableTracking: function() { return /* binding */ enableTracking; }, 7477/* harmony export */ getCurrentScope: function() { return /* binding */ getCurrentScope; }, 7478/* harmony export */ isProxy: function() { return /* binding */ isProxy; }, 7479/* harmony export */ isReactive: function() { return /* binding */ isReactive; }, 7480/* harmony export */ isReadonly: function() { return /* binding */ isReadonly; }, 7481/* harmony export */ isRef: function() { return /* binding */ isRef; }, 7482/* harmony export */ isShallow: function() { return /* binding */ isShallow; }, 7483/* harmony export */ markRaw: function() { return /* binding */ markRaw; }, 7484/* harmony export */ onScopeDispose: function() { return /* binding */ onScopeDispose; }, 7485/* harmony export */ pauseScheduling: function() { return /* binding */ pauseScheduling; }, 7486/* harmony export */ pauseTracking: function() { return /* binding */ pauseTracking; }, 7487/* harmony export */ proxyRefs: function() { return /* binding */ proxyRefs; }, 7488/* harmony export */ reactive: function() { return /* binding */ reactive; }, 7489/* harmony export */ readonly: function() { return /* binding */ readonly; }, 7490/* harmony export */ ref: function() { return /* binding */ ref; }, 7491/* harmony export */ resetScheduling: function() { return /* binding */ resetScheduling; }, 7492/* harmony export */ resetTracking: function() { return /* binding */ resetTracking; }, 7493/* harmony export */ shallowReactive: function() { return /* binding */ shallowReactive; }, 7494/* harmony export */ shallowReadonly: function() { return /* binding */ shallowReadonly; }, 7495/* harmony export */ shallowRef: function() { return /* binding */ shallowRef; }, 7496/* harmony export */ stop: function() { return /* binding */ stop; }, 7497/* harmony export */ toRaw: function() { return /* binding */ toRaw; }, 7498/* harmony export */ toRef: function() { return /* binding */ toRef; }, 7499/* harmony export */ toRefs: function() { return /* binding */ toRefs; }, 7500/* harmony export */ toValue: function() { return /* binding */ toValue; }, 7501/* harmony export */ track: function() { return /* binding */ track; }, 7502/* harmony export */ trigger: function() { return /* binding */ trigger; }, 7503/* harmony export */ triggerRef: function() { return /* binding */ triggerRef; }, 7504/* harmony export */ unref: function() { return /* binding */ unref; } 7505/* harmony export */ }); 7506/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 7507/** 7508* @vue/reactivity v3.4.34 7509* (c) 2018-present Yuxi (Evan) You and Vue contributors 7510* @license MIT 7511**/ 7512 7513 7514function warn(msg, ...args) { 7515 console.warn(`[Vue warn] ${msg}`, ...args); 7516} 7517 7518let activeEffectScope; 7519class EffectScope { 7520 constructor(detached = false) { 7521 this.detached = detached; 7522 /** 7523 * @internal 7524 */ 7525 this._active = true; 7526 /** 7527 * @internal 7528 */ 7529 this.effects = []; 7530 /** 7531 * @internal 7532 */ 7533 this.cleanups = []; 7534 this.parent = activeEffectScope; 7535 if (!detached && activeEffectScope) { 7536 this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( 7537 this 7538 ) - 1; 7539 } 7540 } 7541 get active() { 7542 return this._active; 7543 } 7544 run(fn) { 7545 if (this._active) { 7546 const currentEffectScope = activeEffectScope; 7547 try { 7548 activeEffectScope = this; 7549 return fn(); 7550 } finally { 7551 activeEffectScope = currentEffectScope; 7552 } 7553 } else if (true) { 7554 warn(`cannot run an inactive effect scope.`); 7555 } 7556 } 7557 /** 7558 * This should only be called on non-detached scopes 7559 * @internal 7560 */ 7561 on() { 7562 activeEffectScope = this; 7563 } 7564 /** 7565 * This should only be called on non-detached scopes 7566 * @internal 7567 */ 7568 off() { 7569 activeEffectScope = this.parent; 7570 } 7571 stop(fromParent) { 7572 if (this._active) { 7573 let i, l; 7574 for (i = 0, l = this.effects.length; i < l; i++) { 7575 this.effects[i].stop(); 7576 } 7577 for (i = 0, l = this.cleanups.length; i < l; i++) { 7578 this.cleanups[i](); 7579 } 7580 if (this.scopes) { 7581 for (i = 0, l = this.scopes.length; i < l; i++) { 7582 this.scopes[i].stop(true); 7583 } 7584 } 7585 if (!this.detached && this.parent && !fromParent) { 7586 const last = this.parent.scopes.pop(); 7587 if (last && last !== this) { 7588 this.parent.scopes[this.index] = last; 7589 last.index = this.index; 7590 } 7591 } 7592 this.parent = void 0; 7593 this._active = false; 7594 } 7595 } 7596} 7597function effectScope(detached) { 7598 return new EffectScope(detached); 7599} 7600function recordEffectScope(effect, scope = activeEffectScope) { 7601 if (scope && scope.active) { 7602 scope.effects.push(effect); 7603 } 7604} 7605function getCurrentScope() { 7606 return activeEffectScope; 7607} 7608function onScopeDispose(fn) { 7609 if (activeEffectScope) { 7610 activeEffectScope.cleanups.push(fn); 7611 } else if (true) { 7612 warn( 7613 `onScopeDispose() is called when there is no active effect scope to be associated with.` 7614 ); 7615 } 7616} 7617 7618let activeEffect; 7619class ReactiveEffect { 7620 constructor(fn, trigger, scheduler, scope) { 7621 this.fn = fn; 7622 this.trigger = trigger; 7623 this.scheduler = scheduler; 7624 this.active = true; 7625 this.deps = []; 7626 /** 7627 * @internal 7628 */ 7629 this._dirtyLevel = 4; 7630 /** 7631 * @internal 7632 */ 7633 this._trackId = 0; 7634 /** 7635 * @internal 7636 */ 7637 this._runnings = 0; 7638 /** 7639 * @internal 7640 */ 7641 this._shouldSchedule = false; 7642 /** 7643 * @internal 7644 */ 7645 this._depsLength = 0; 7646 recordEffectScope(this, scope); 7647 } 7648 get dirty() { 7649 if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { 7650 this._dirtyLevel = 1; 7651 pauseTracking(); 7652 for (let i = 0; i < this._depsLength; i++) { 7653 const dep = this.deps[i]; 7654 if (dep.computed) { 7655 triggerComputed(dep.computed); 7656 if (this._dirtyLevel >= 4) { 7657 break; 7658 } 7659 } 7660 } 7661 if (this._dirtyLevel === 1) { 7662 this._dirtyLevel = 0; 7663 } 7664 resetTracking(); 7665 } 7666 return this._dirtyLevel >= 4; 7667 } 7668 set dirty(v) { 7669 this._dirtyLevel = v ? 4 : 0; 7670 } 7671 run() { 7672 this._dirtyLevel = 0; 7673 if (!this.active) { 7674 return this.fn(); 7675 } 7676 let lastShouldTrack = shouldTrack; 7677 let lastEffect = activeEffect; 7678 try { 7679 shouldTrack = true; 7680 activeEffect = this; 7681 this._runnings++; 7682 preCleanupEffect(this); 7683 return this.fn(); 7684 } finally { 7685 postCleanupEffect(this); 7686 this._runnings--; 7687 activeEffect = lastEffect; 7688 shouldTrack = lastShouldTrack; 7689 } 7690 } 7691 stop() { 7692 if (this.active) { 7693 preCleanupEffect(this); 7694 postCleanupEffect(this); 7695 this.onStop && this.onStop(); 7696 this.active = false; 7697 } 7698 } 7699} 7700function triggerComputed(computed) { 7701 return computed.value; 7702} 7703function preCleanupEffect(effect2) { 7704 effect2._trackId++; 7705 effect2._depsLength = 0; 7706} 7707function postCleanupEffect(effect2) { 7708 if (effect2.deps.length > effect2._depsLength) { 7709 for (let i = effect2._depsLength; i < effect2.deps.length; i++) { 7710 cleanupDepEffect(effect2.deps[i], effect2); 7711 } 7712 effect2.deps.length = effect2._depsLength; 7713 } 7714} 7715function cleanupDepEffect(dep, effect2) { 7716 const trackId = dep.get(effect2); 7717 if (trackId !== void 0 && effect2._trackId !== trackId) { 7718 dep.delete(effect2); 7719 if (dep.size === 0) { 7720 dep.cleanup(); 7721 } 7722 } 7723} 7724function effect(fn, options) { 7725 if (fn.effect instanceof ReactiveEffect) { 7726 fn = fn.effect.fn; 7727 } 7728 const _effect = new ReactiveEffect(fn, _vue_shared__WEBPACK_IMPORTED_MODULE_0__.NOOP, () => { 7729 if (_effect.dirty) { 7730 _effect.run(); 7731 } 7732 }); 7733 if (options) { 7734 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)(_effect, options); 7735 if (options.scope) recordEffectScope(_effect, options.scope); 7736 } 7737 if (!options || !options.lazy) { 7738 _effect.run(); 7739 } 7740 const runner = _effect.run.bind(_effect); 7741 runner.effect = _effect; 7742 return runner; 7743} 7744function stop(runner) { 7745 runner.effect.stop(); 7746} 7747let shouldTrack = true; 7748let pauseScheduleStack = 0; 7749const trackStack = []; 7750function pauseTracking() { 7751 trackStack.push(shouldTrack); 7752 shouldTrack = false; 7753} 7754function enableTracking() { 7755 trackStack.push(shouldTrack); 7756 shouldTrack = true; 7757} 7758function resetTracking() { 7759 const last = trackStack.pop(); 7760 shouldTrack = last === void 0 ? true : last; 7761} 7762function pauseScheduling() { 7763 pauseScheduleStack++; 7764} 7765function resetScheduling() { 7766 pauseScheduleStack--; 7767 while (!pauseScheduleStack && queueEffectSchedulers.length) { 7768 queueEffectSchedulers.shift()(); 7769 } 7770} 7771function trackEffect(effect2, dep, debuggerEventExtraInfo) { 7772 var _a; 7773 if (dep.get(effect2) !== effect2._trackId) { 7774 dep.set(effect2, effect2._trackId); 7775 const oldDep = effect2.deps[effect2._depsLength]; 7776 if (oldDep !== dep) { 7777 if (oldDep) { 7778 cleanupDepEffect(oldDep, effect2); 7779 } 7780 effect2.deps[effect2._depsLength++] = dep; 7781 } else { 7782 effect2._depsLength++; 7783 } 7784 if (true) { 7785 (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({ effect: effect2 }, debuggerEventExtraInfo)); 7786 } 7787 } 7788} 7789const queueEffectSchedulers = []; 7790function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { 7791 var _a; 7792 pauseScheduling(); 7793 for (const effect2 of dep.keys()) { 7794 let tracking; 7795 if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { 7796 effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); 7797 effect2._dirtyLevel = dirtyLevel; 7798 } 7799 if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { 7800 if (true) { 7801 (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.extend)({ effect: effect2 }, debuggerEventExtraInfo)); 7802 } 7803 effect2.trigger(); 7804 if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { 7805 effect2._shouldSchedule = false; 7806 if (effect2.scheduler) { 7807 queueEffectSchedulers.push(effect2.scheduler); 7808 } 7809 } 7810 } 7811 } 7812 resetScheduling(); 7813} 7814 7815const createDep = (cleanup, computed) => { 7816 const dep = /* @__PURE__ */ new Map(); 7817 dep.cleanup = cleanup; 7818 dep.computed = computed; 7819 return dep; 7820}; 7821 7822const targetMap = /* @__PURE__ */ new WeakMap(); 7823const ITERATE_KEY = Symbol( true ? "iterate" : 0); 7824const MAP_KEY_ITERATE_KEY = Symbol( true ? "Map key iterate" : 0); 7825function track(target, type, key) { 7826 if (shouldTrack && activeEffect) { 7827 let depsMap = targetMap.get(target); 7828 if (!depsMap) { 7829 targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); 7830 } 7831 let dep = depsMap.get(key); 7832 if (!dep) { 7833 depsMap.set(key, dep = createDep(() => depsMap.delete(key))); 7834 } 7835 trackEffect( 7836 activeEffect, 7837 dep, 7838 true ? { 7839 target, 7840 type, 7841 key 7842 } : 0 7843 ); 7844 } 7845} 7846function trigger(target, type, key, newValue, oldValue, oldTarget) { 7847 const depsMap = targetMap.get(target); 7848 if (!depsMap) { 7849 return; 7850 } 7851 let deps = []; 7852 if (type === "clear") { 7853 deps = [...depsMap.values()]; 7854 } else if (key === "length" && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) { 7855 const newLength = Number(newValue); 7856 depsMap.forEach((dep, key2) => { 7857 if (key2 === "length" || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key2) && key2 >= newLength) { 7858 deps.push(dep); 7859 } 7860 }); 7861 } else { 7862 if (key !== void 0) { 7863 deps.push(depsMap.get(key)); 7864 } 7865 switch (type) { 7866 case "add": 7867 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) { 7868 deps.push(depsMap.get(ITERATE_KEY)); 7869 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) { 7870 deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); 7871 } 7872 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key)) { 7873 deps.push(depsMap.get("length")); 7874 } 7875 break; 7876 case "delete": 7877 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target)) { 7878 deps.push(depsMap.get(ITERATE_KEY)); 7879 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) { 7880 deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); 7881 } 7882 } 7883 break; 7884 case "set": 7885 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target)) { 7886 deps.push(depsMap.get(ITERATE_KEY)); 7887 } 7888 break; 7889 } 7890 } 7891 pauseScheduling(); 7892 for (const dep of deps) { 7893 if (dep) { 7894 triggerEffects( 7895 dep, 7896 4, 7897 true ? { 7898 target, 7899 type, 7900 key, 7901 newValue, 7902 oldValue, 7903 oldTarget 7904 } : 0 7905 ); 7906 } 7907 } 7908 resetScheduling(); 7909} 7910function getDepFromReactive(object, key) { 7911 const depsMap = targetMap.get(object); 7912 return depsMap && depsMap.get(key); 7913} 7914 7915const isNonTrackableKeys = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.makeMap)(`__proto__,__v_isRef,__isVue`); 7916const builtInSymbols = new Set( 7917 /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol) 7918); 7919const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations(); 7920function createArrayInstrumentations() { 7921 const instrumentations = {}; 7922 ["includes", "indexOf", "lastIndexOf"].forEach((key) => { 7923 instrumentations[key] = function(...args) { 7924 const arr = toRaw(this); 7925 for (let i = 0, l = this.length; i < l; i++) { 7926 track(arr, "get", i + ""); 7927 } 7928 const res = arr[key](...args); 7929 if (res === -1 || res === false) { 7930 return arr[key](...args.map(toRaw)); 7931 } else { 7932 return res; 7933 } 7934 }; 7935 }); 7936 ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { 7937 instrumentations[key] = function(...args) { 7938 pauseTracking(); 7939 pauseScheduling(); 7940 const res = toRaw(this)[key].apply(this, args); 7941 resetScheduling(); 7942 resetTracking(); 7943 return res; 7944 }; 7945 }); 7946 return instrumentations; 7947} 7948function hasOwnProperty(key) { 7949 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key)) key = String(key); 7950 const obj = toRaw(this); 7951 track(obj, "has", key); 7952 return obj.hasOwnProperty(key); 7953} 7954class BaseReactiveHandler { 7955 constructor(_isReadonly = false, _isShallow = false) { 7956 this._isReadonly = _isReadonly; 7957 this._isShallow = _isShallow; 7958 } 7959 get(target, key, receiver) { 7960 const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; 7961 if (key === "__v_isReactive") { 7962 return !isReadonly2; 7963 } else if (key === "__v_isReadonly") { 7964 return isReadonly2; 7965 } else if (key === "__v_isShallow") { 7966 return isShallow2; 7967 } else if (key === "__v_raw") { 7968 if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype 7969 // this means the reciever is a user proxy of the reactive proxy 7970 Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { 7971 return target; 7972 } 7973 return; 7974 } 7975 const targetIsArray = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target); 7976 if (!isReadonly2) { 7977 if (targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(arrayInstrumentations, key)) { 7978 return Reflect.get(arrayInstrumentations, key, receiver); 7979 } 7980 if (key === "hasOwnProperty") { 7981 return hasOwnProperty; 7982 } 7983 } 7984 const res = Reflect.get(target, key, receiver); 7985 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { 7986 return res; 7987 } 7988 if (!isReadonly2) { 7989 track(target, "get", key); 7990 } 7991 if (isShallow2) { 7992 return res; 7993 } 7994 if (isRef(res)) { 7995 return targetIsArray && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key) ? res : res.value; 7996 } 7997 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(res)) { 7998 return isReadonly2 ? readonly(res) : reactive(res); 7999 } 8000 return res; 8001 } 8002} 8003class MutableReactiveHandler extends BaseReactiveHandler { 8004 constructor(isShallow2 = false) { 8005 super(false, isShallow2); 8006 } 8007 set(target, key, value, receiver) { 8008 let oldValue = target[key]; 8009 if (!this._isShallow) { 8010 const isOldValueReadonly = isReadonly(oldValue); 8011 if (!isShallow(value) && !isReadonly(value)) { 8012 oldValue = toRaw(oldValue); 8013 value = toRaw(value); 8014 } 8015 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && isRef(oldValue) && !isRef(value)) { 8016 if (isOldValueReadonly) { 8017 return false; 8018 } else { 8019 oldValue.value = value; 8020 return true; 8021 } 8022 } 8023 } 8024 const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isIntegerKey)(key) ? Number(key) < target.length : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key); 8025 const result = Reflect.set(target, key, value, receiver); 8026 if (target === toRaw(receiver)) { 8027 if (!hadKey) { 8028 trigger(target, "add", key, value); 8029 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) { 8030 trigger(target, "set", key, value, oldValue); 8031 } 8032 } 8033 return result; 8034 } 8035 deleteProperty(target, key) { 8036 const hadKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(target, key); 8037 const oldValue = target[key]; 8038 const result = Reflect.deleteProperty(target, key); 8039 if (result && hadKey) { 8040 trigger(target, "delete", key, void 0, oldValue); 8041 } 8042 return result; 8043 } 8044 has(target, key) { 8045 const result = Reflect.has(target, key); 8046 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isSymbol)(key) || !builtInSymbols.has(key)) { 8047 track(target, "has", key); 8048 } 8049 return result; 8050 } 8051 ownKeys(target) { 8052 track( 8053 target, 8054 "iterate", 8055 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(target) ? "length" : ITERATE_KEY 8056 ); 8057 return Reflect.ownKeys(target); 8058 } 8059} 8060class ReadonlyReactiveHandler extends BaseReactiveHandler { 8061 constructor(isShallow2 = false) { 8062 super(true, isShallow2); 8063 } 8064 set(target, key) { 8065 if (true) { 8066 warn( 8067 `Set operation on key "${String(key)}" failed: target is readonly.`, 8068 target 8069 ); 8070 } 8071 return true; 8072 } 8073 deleteProperty(target, key) { 8074 if (true) { 8075 warn( 8076 `Delete operation on key "${String(key)}" failed: target is readonly.`, 8077 target 8078 ); 8079 } 8080 return true; 8081 } 8082} 8083const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); 8084const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); 8085const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler( 8086 true 8087); 8088const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); 8089 8090const toShallow = (value) => value; 8091const getProto = (v) => Reflect.getPrototypeOf(v); 8092function get(target, key, isReadonly2 = false, isShallow2 = false) { 8093 target = target["__v_raw"]; 8094 const rawTarget = toRaw(target); 8095 const rawKey = toRaw(key); 8096 if (!isReadonly2) { 8097 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(key, rawKey)) { 8098 track(rawTarget, "get", key); 8099 } 8100 track(rawTarget, "get", rawKey); 8101 } 8102 const { has: has2 } = getProto(rawTarget); 8103 const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; 8104 if (has2.call(rawTarget, key)) { 8105 return wrap(target.get(key)); 8106 } else if (has2.call(rawTarget, rawKey)) { 8107 return wrap(target.get(rawKey)); 8108 } else if (target !== rawTarget) { 8109 target.get(key); 8110 } 8111} 8112function has(key, isReadonly2 = false) { 8113 const target = this["__v_raw"]; 8114 const rawTarget = toRaw(target); 8115 const rawKey = toRaw(key); 8116 if (!isReadonly2) { 8117 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(key, rawKey)) { 8118 track(rawTarget, "has", key); 8119 } 8120 track(rawTarget, "has", rawKey); 8121 } 8122 return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); 8123} 8124function size(target, isReadonly2 = false) { 8125 target = target["__v_raw"]; 8126 !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); 8127 return Reflect.get(target, "size", target); 8128} 8129function add(value, _isShallow = false) { 8130 if (!_isShallow && !isShallow(value) && !isReadonly(value)) { 8131 value = toRaw(value); 8132 } 8133 const target = toRaw(this); 8134 const proto = getProto(target); 8135 const hadKey = proto.has.call(target, value); 8136 if (!hadKey) { 8137 target.add(value); 8138 trigger(target, "add", value, value); 8139 } 8140 return this; 8141} 8142function set(key, value, _isShallow = false) { 8143 if (!_isShallow && !isShallow(value) && !isReadonly(value)) { 8144 value = toRaw(value); 8145 } 8146 const target = toRaw(this); 8147 const { has: has2, get: get2 } = getProto(target); 8148 let hadKey = has2.call(target, key); 8149 if (!hadKey) { 8150 key = toRaw(key); 8151 hadKey = has2.call(target, key); 8152 } else if (true) { 8153 checkIdentityKeys(target, has2, key); 8154 } 8155 const oldValue = get2.call(target, key); 8156 target.set(key, value); 8157 if (!hadKey) { 8158 trigger(target, "add", key, value); 8159 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(value, oldValue)) { 8160 trigger(target, "set", key, value, oldValue); 8161 } 8162 return this; 8163} 8164function deleteEntry(key) { 8165 const target = toRaw(this); 8166 const { has: has2, get: get2 } = getProto(target); 8167 let hadKey = has2.call(target, key); 8168 if (!hadKey) { 8169 key = toRaw(key); 8170 hadKey = has2.call(target, key); 8171 } else if (true) { 8172 checkIdentityKeys(target, has2, key); 8173 } 8174 const oldValue = get2 ? get2.call(target, key) : void 0; 8175 const result = target.delete(key); 8176 if (hadKey) { 8177 trigger(target, "delete", key, void 0, oldValue); 8178 } 8179 return result; 8180} 8181function clear() { 8182 const target = toRaw(this); 8183 const hadItems = target.size !== 0; 8184 const oldTarget = true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(target) ? new Map(target) : new Set(target) : 0; 8185 const result = target.clear(); 8186 if (hadItems) { 8187 trigger(target, "clear", void 0, void 0, oldTarget); 8188 } 8189 return result; 8190} 8191function createForEach(isReadonly2, isShallow2) { 8192 return function forEach(callback, thisArg) { 8193 const observed = this; 8194 const target = observed["__v_raw"]; 8195 const rawTarget = toRaw(target); 8196 const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; 8197 !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); 8198 return target.forEach((value, key) => { 8199 return callback.call(thisArg, wrap(value), wrap(key), observed); 8200 }); 8201 }; 8202} 8203function createIterableMethod(method, isReadonly2, isShallow2) { 8204 return function(...args) { 8205 const target = this["__v_raw"]; 8206 const rawTarget = toRaw(target); 8207 const targetIsMap = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isMap)(rawTarget); 8208 const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; 8209 const isKeyOnly = method === "keys" && targetIsMap; 8210 const innerIterator = target[method](...args); 8211 const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; 8212 !isReadonly2 && track( 8213 rawTarget, 8214 "iterate", 8215 isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY 8216 ); 8217 return { 8218 // iterator protocol 8219 next() { 8220 const { value, done } = innerIterator.next(); 8221 return done ? { value, done } : { 8222 value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), 8223 done 8224 }; 8225 }, 8226 // iterable protocol 8227 [Symbol.iterator]() { 8228 return this; 8229 } 8230 }; 8231 }; 8232} 8233function createReadonlyMethod(type) { 8234 return function(...args) { 8235 if (true) { 8236 const key = args[0] ? `on key "${args[0]}" ` : ``; 8237 warn( 8238 `${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.capitalize)(type)} operation ${key}failed: target is readonly.`, 8239 toRaw(this) 8240 ); 8241 } 8242 return type === "delete" ? false : type === "clear" ? void 0 : this; 8243 }; 8244} 8245function createInstrumentations() { 8246 const mutableInstrumentations2 = { 8247 get(key) { 8248 return get(this, key); 8249 }, 8250 get size() { 8251 return size(this); 8252 }, 8253 has, 8254 add, 8255 set, 8256 delete: deleteEntry, 8257 clear, 8258 forEach: createForEach(false, false) 8259 }; 8260 const shallowInstrumentations2 = { 8261 get(key) { 8262 return get(this, key, false, true); 8263 }, 8264 get size() { 8265 return size(this); 8266 }, 8267 has, 8268 add(value) { 8269 return add.call(this, value, true); 8270 }, 8271 set(key, value) { 8272 return set.call(this, key, value, true); 8273 }, 8274 delete: deleteEntry, 8275 clear, 8276 forEach: createForEach(false, true) 8277 }; 8278 const readonlyInstrumentations2 = { 8279 get(key) { 8280 return get(this, key, true); 8281 }, 8282 get size() { 8283 return size(this, true); 8284 }, 8285 has(key) { 8286 return has.call(this, key, true); 8287 }, 8288 add: createReadonlyMethod("add"), 8289 set: createReadonlyMethod("set"), 8290 delete: createReadonlyMethod("delete"), 8291 clear: createReadonlyMethod("clear"), 8292 forEach: createForEach(true, false) 8293 }; 8294 const shallowReadonlyInstrumentations2 = { 8295 get(key) { 8296 return get(this, key, true, true); 8297 }, 8298 get size() { 8299 return size(this, true); 8300 }, 8301 has(key) { 8302 return has.call(this, key, true); 8303 }, 8304 add: createReadonlyMethod("add"), 8305 set: createReadonlyMethod("set"), 8306 delete: createReadonlyMethod("delete"), 8307 clear: createReadonlyMethod("clear"), 8308 forEach: createForEach(true, true) 8309 }; 8310 const iteratorMethods = [ 8311 "keys", 8312 "values", 8313 "entries", 8314 Symbol.iterator 8315 ]; 8316 iteratorMethods.forEach((method) => { 8317 mutableInstrumentations2[method] = createIterableMethod(method, false, false); 8318 readonlyInstrumentations2[method] = createIterableMethod(method, true, false); 8319 shallowInstrumentations2[method] = createIterableMethod(method, false, true); 8320 shallowReadonlyInstrumentations2[method] = createIterableMethod( 8321 method, 8322 true, 8323 true 8324 ); 8325 }); 8326 return [ 8327 mutableInstrumentations2, 8328 readonlyInstrumentations2, 8329 shallowInstrumentations2, 8330 shallowReadonlyInstrumentations2 8331 ]; 8332} 8333const [ 8334 mutableInstrumentations, 8335 readonlyInstrumentations, 8336 shallowInstrumentations, 8337 shallowReadonlyInstrumentations 8338] = /* @__PURE__ */ createInstrumentations(); 8339function createInstrumentationGetter(isReadonly2, shallow) { 8340 const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; 8341 return (target, key, receiver) => { 8342 if (key === "__v_isReactive") { 8343 return !isReadonly2; 8344 } else if (key === "__v_isReadonly") { 8345 return isReadonly2; 8346 } else if (key === "__v_raw") { 8347 return target; 8348 } 8349 return Reflect.get( 8350 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasOwn)(instrumentations, key) && key in target ? instrumentations : target, 8351 key, 8352 receiver 8353 ); 8354 }; 8355} 8356const mutableCollectionHandlers = { 8357 get: /* @__PURE__ */ createInstrumentationGetter(false, false) 8358}; 8359const shallowCollectionHandlers = { 8360 get: /* @__PURE__ */ createInstrumentationGetter(false, true) 8361}; 8362const readonlyCollectionHandlers = { 8363 get: /* @__PURE__ */ createInstrumentationGetter(true, false) 8364}; 8365const shallowReadonlyCollectionHandlers = { 8366 get: /* @__PURE__ */ createInstrumentationGetter(true, true) 8367}; 8368function checkIdentityKeys(target, has2, key) { 8369 const rawKey = toRaw(key); 8370 if (rawKey !== key && has2.call(target, rawKey)) { 8371 const type = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(target); 8372 warn( 8373 `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` 8374 ); 8375 } 8376} 8377 8378const reactiveMap = /* @__PURE__ */ new WeakMap(); 8379const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); 8380const readonlyMap = /* @__PURE__ */ new WeakMap(); 8381const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); 8382function targetTypeMap(rawType) { 8383 switch (rawType) { 8384 case "Object": 8385 case "Array": 8386 return 1 /* COMMON */; 8387 case "Map": 8388 case "Set": 8389 case "WeakMap": 8390 case "WeakSet": 8391 return 2 /* COLLECTION */; 8392 default: 8393 return 0 /* INVALID */; 8394 } 8395} 8396function getTargetType(value) { 8397 return value["__v_skip"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.toRawType)(value)); 8398} 8399function reactive(target) { 8400 if (isReadonly(target)) { 8401 return target; 8402 } 8403 return createReactiveObject( 8404 target, 8405 false, 8406 mutableHandlers, 8407 mutableCollectionHandlers, 8408 reactiveMap 8409 ); 8410} 8411function shallowReactive(target) { 8412 return createReactiveObject( 8413 target, 8414 false, 8415 shallowReactiveHandlers, 8416 shallowCollectionHandlers, 8417 shallowReactiveMap 8418 ); 8419} 8420function readonly(target) { 8421 return createReactiveObject( 8422 target, 8423 true, 8424 readonlyHandlers, 8425 readonlyCollectionHandlers, 8426 readonlyMap 8427 ); 8428} 8429function shallowReadonly(target) { 8430 return createReactiveObject( 8431 target, 8432 true, 8433 shallowReadonlyHandlers, 8434 shallowReadonlyCollectionHandlers, 8435 shallowReadonlyMap 8436 ); 8437} 8438function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { 8439 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(target)) { 8440 if (true) { 8441 warn( 8442 `value cannot be made ${isReadonly2 ? "readonly" : "reactive"}: ${String( 8443 target 8444 )}` 8445 ); 8446 } 8447 return target; 8448 } 8449 if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { 8450 return target; 8451 } 8452 const existingProxy = proxyMap.get(target); 8453 if (existingProxy) { 8454 return existingProxy; 8455 } 8456 const targetType = getTargetType(target); 8457 if (targetType === 0 /* INVALID */) { 8458 return target; 8459 } 8460 const proxy = new Proxy( 8461 target, 8462 targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers 8463 ); 8464 proxyMap.set(target, proxy); 8465 return proxy; 8466} 8467function isReactive(value) { 8468 if (isReadonly(value)) { 8469 return isReactive(value["__v_raw"]); 8470 } 8471 return !!(value && value["__v_isReactive"]); 8472} 8473function isReadonly(value) { 8474 return !!(value && value["__v_isReadonly"]); 8475} 8476function isShallow(value) { 8477 return !!(value && value["__v_isShallow"]); 8478} 8479function isProxy(value) { 8480 return value ? !!value["__v_raw"] : false; 8481} 8482function toRaw(observed) { 8483 const raw = observed && observed["__v_raw"]; 8484 return raw ? toRaw(raw) : observed; 8485} 8486function markRaw(value) { 8487 if (Object.isExtensible(value)) { 8488 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.def)(value, "__v_skip", true); 8489 } 8490 return value; 8491} 8492const toReactive = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? reactive(value) : value; 8493const toReadonly = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(value) ? readonly(value) : value; 8494 8495const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`; 8496class ComputedRefImpl { 8497 constructor(getter, _setter, isReadonly, isSSR) { 8498 this.getter = getter; 8499 this._setter = _setter; 8500 this.dep = void 0; 8501 this.__v_isRef = true; 8502 this["__v_isReadonly"] = false; 8503 this.effect = new ReactiveEffect( 8504 () => getter(this._value), 8505 () => triggerRefValue( 8506 this, 8507 this.effect._dirtyLevel === 2 ? 2 : 3 8508 ) 8509 ); 8510 this.effect.computed = this; 8511 this.effect.active = this._cacheable = !isSSR; 8512 this["__v_isReadonly"] = isReadonly; 8513 } 8514 get value() { 8515 const self = toRaw(this); 8516 if ((!self._cacheable || self.effect.dirty) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(self._value, self._value = self.effect.run())) { 8517 triggerRefValue(self, 4); 8518 } 8519 trackRefValue(self); 8520 if (self.effect._dirtyLevel >= 2) { 8521 if ( true && this._warnRecursive) { 8522 warn(COMPUTED_SIDE_EFFECT_WARN, ` 8523 8524getter: `, this.getter); 8525 } 8526 triggerRefValue(self, 2); 8527 } 8528 return self._value; 8529 } 8530 set value(newValue) { 8531 this._setter(newValue); 8532 } 8533 // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x 8534 get _dirty() { 8535 return this.effect.dirty; 8536 } 8537 set _dirty(v) { 8538 this.effect.dirty = v; 8539 } 8540 // #endregion 8541} 8542function computed(getterOrOptions, debugOptions, isSSR = false) { 8543 let getter; 8544 let setter; 8545 const onlyGetter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(getterOrOptions); 8546 if (onlyGetter) { 8547 getter = getterOrOptions; 8548 setter = true ? () => { 8549 warn("Write operation failed: computed value is readonly"); 8550 } : 0; 8551 } else { 8552 getter = getterOrOptions.get; 8553 setter = getterOrOptions.set; 8554 } 8555 const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); 8556 if ( true && debugOptions && !isSSR) { 8557 cRef.effect.onTrack = debugOptions.onTrack; 8558 cRef.effect.onTrigger = debugOptions.onTrigger; 8559 } 8560 return cRef; 8561} 8562 8563function trackRefValue(ref2) { 8564 var _a; 8565 if (shouldTrack && activeEffect) { 8566 ref2 = toRaw(ref2); 8567 trackEffect( 8568 activeEffect, 8569 (_a = ref2.dep) != null ? _a : ref2.dep = createDep( 8570 () => ref2.dep = void 0, 8571 ref2 instanceof ComputedRefImpl ? ref2 : void 0 8572 ), 8573 true ? { 8574 target: ref2, 8575 type: "get", 8576 key: "value" 8577 } : 0 8578 ); 8579 } 8580} 8581function triggerRefValue(ref2, dirtyLevel = 4, newVal, oldVal) { 8582 ref2 = toRaw(ref2); 8583 const dep = ref2.dep; 8584 if (dep) { 8585 triggerEffects( 8586 dep, 8587 dirtyLevel, 8588 true ? { 8589 target: ref2, 8590 type: "set", 8591 key: "value", 8592 newValue: newVal, 8593 oldValue: oldVal 8594 } : 0 8595 ); 8596 } 8597} 8598function isRef(r) { 8599 return !!(r && r.__v_isRef === true); 8600} 8601function ref(value) { 8602 return createRef(value, false); 8603} 8604function shallowRef(value) { 8605 return createRef(value, true); 8606} 8607function createRef(rawValue, shallow) { 8608 if (isRef(rawValue)) { 8609 return rawValue; 8610 } 8611 return new RefImpl(rawValue, shallow); 8612} 8613class RefImpl { 8614 constructor(value, __v_isShallow) { 8615 this.__v_isShallow = __v_isShallow; 8616 this.dep = void 0; 8617 this.__v_isRef = true; 8618 this._rawValue = __v_isShallow ? value : toRaw(value); 8619 this._value = __v_isShallow ? value : toReactive(value); 8620 } 8621 get value() { 8622 trackRefValue(this); 8623 return this._value; 8624 } 8625 set value(newVal) { 8626 const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); 8627 newVal = useDirectValue ? newVal : toRaw(newVal); 8628 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.hasChanged)(newVal, this._rawValue)) { 8629 const oldVal = this._rawValue; 8630 this._rawValue = newVal; 8631 this._value = useDirectValue ? newVal : toReactive(newVal); 8632 triggerRefValue(this, 4, newVal, oldVal); 8633 } 8634 } 8635} 8636function triggerRef(ref2) { 8637 triggerRefValue(ref2, 4, true ? ref2.value : 0); 8638} 8639function unref(ref2) { 8640 return isRef(ref2) ? ref2.value : ref2; 8641} 8642function toValue(source) { 8643 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(source) ? source() : unref(source); 8644} 8645const shallowUnwrapHandlers = { 8646 get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), 8647 set: (target, key, value, receiver) => { 8648 const oldValue = target[key]; 8649 if (isRef(oldValue) && !isRef(value)) { 8650 oldValue.value = value; 8651 return true; 8652 } else { 8653 return Reflect.set(target, key, value, receiver); 8654 } 8655 } 8656}; 8657function proxyRefs(objectWithRefs) { 8658 return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); 8659} 8660class CustomRefImpl { 8661 constructor(factory) { 8662 this.dep = void 0; 8663 this.__v_isRef = true; 8664 const { get, set } = factory( 8665 () => trackRefValue(this), 8666 () => triggerRefValue(this) 8667 ); 8668 this._get = get; 8669 this._set = set; 8670 } 8671 get value() { 8672 return this._get(); 8673 } 8674 set value(newVal) { 8675 this._set(newVal); 8676 } 8677} 8678function customRef(factory) { 8679 return new CustomRefImpl(factory); 8680} 8681function toRefs(object) { 8682 if ( true && !isProxy(object)) { 8683 warn(`toRefs() expects a reactive object but received a plain one.`); 8684 } 8685 const ret = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isArray)(object) ? new Array(object.length) : {}; 8686 for (const key in object) { 8687 ret[key] = propertyToRef(object, key); 8688 } 8689 return ret; 8690} 8691class ObjectRefImpl { 8692 constructor(_object, _key, _defaultValue) { 8693 this._object = _object; 8694 this._key = _key; 8695 this._defaultValue = _defaultValue; 8696 this.__v_isRef = true; 8697 } 8698 get value() { 8699 const val = this._object[this._key]; 8700 return val === void 0 ? this._defaultValue : val; 8701 } 8702 set value(newVal) { 8703 this._object[this._key] = newVal; 8704 } 8705 get dep() { 8706 return getDepFromReactive(toRaw(this._object), this._key); 8707 } 8708} 8709class GetterRefImpl { 8710 constructor(_getter) { 8711 this._getter = _getter; 8712 this.__v_isRef = true; 8713 this.__v_isReadonly = true; 8714 } 8715 get value() { 8716 return this._getter(); 8717 } 8718} 8719function toRef(source, key, defaultValue) { 8720 if (isRef(source)) { 8721 return source; 8722 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isFunction)(source)) { 8723 return new GetterRefImpl(source); 8724 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_0__.isObject)(source) && arguments.length > 1) { 8725 return propertyToRef(source, key, defaultValue); 8726 } else { 8727 return ref(source); 8728 } 8729} 8730function propertyToRef(source, key, defaultValue) { 8731 const val = source[key]; 8732 return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue); 8733} 8734 8735const deferredComputed = computed; 8736 8737const TrackOpTypes = { 8738 "GET": "get", 8739 "HAS": "has", 8740 "ITERATE": "iterate" 8741}; 8742const TriggerOpTypes = { 8743 "SET": "set", 8744 "ADD": "add", 8745 "DELETE": "delete", 8746 "CLEAR": "clear" 8747}; 8748const ReactiveFlags = { 8749 "SKIP": "__v_skip", 8750 "IS_REACTIVE": "__v_isReactive", 8751 "IS_READONLY": "__v_isReadonly", 8752 "IS_SHALLOW": "__v_isShallow", 8753 "RAW": "__v_raw" 8754}; 8755 8756 8757 8758 8759/***/ }), 8760
vendor: 274,590 bytes, lines 8761-17072
8761/***/ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js": 8762/*!*************************************************************************!*\ 8763 !*** ./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js ***! 8764 \*************************************************************************/ 8765/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 8766 8767"use strict"; 8768__webpack_require__.r(__webpack_exports__); 8769/* harmony export */ __webpack_require__.d(__webpack_exports__, { 8770/* harmony export */ BaseTransition: function() { return /* binding */ BaseTransition; }, 8771/* harmony export */ BaseTransitionPropsValidators: function() { return /* binding */ BaseTransitionPropsValidators; }, 8772/* harmony export */ Comment: function() { return /* binding */ Comment; }, 8773/* harmony export */ DeprecationTypes: function() { return /* binding */ DeprecationTypes; }, 8774/* harmony export */ EffectScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope; }, 8775/* harmony export */ ErrorCodes: function() { return /* binding */ ErrorCodes; }, 8776/* harmony export */ ErrorTypeStrings: function() { return /* binding */ ErrorTypeStrings; }, 8777/* harmony export */ Fragment: function() { return /* binding */ Fragment; }, 8778/* harmony export */ KeepAlive: function() { return /* binding */ KeepAlive; }, 8779/* harmony export */ ReactiveEffect: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; }, 8780/* harmony export */ Static: function() { return /* binding */ Static; }, 8781/* harmony export */ Suspense: function() { return /* binding */ Suspense; }, 8782/* harmony export */ Teleport: function() { return /* binding */ Teleport; }, 8783/* harmony export */ Text: function() { return /* binding */ Text; }, 8784/* harmony export */ TrackOpTypes: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; }, 8785/* harmony export */ TriggerOpTypes: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; }, 8786/* harmony export */ assertNumber: function() { return /* binding */ assertNumber; }, 8787/* harmony export */ callWithAsyncErrorHandling: function() { return /* binding */ callWithAsyncErrorHandling; }, 8788/* harmony export */ callWithErrorHandling: function() { return /* binding */ callWithErrorHandling; }, 8789/* harmony export */ camelize: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize; }, 8790/* harmony export */ capitalize: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize; }, 8791/* harmony export */ cloneVNode: function() { return /* binding */ cloneVNode; }, 8792/* harmony export */ compatUtils: function() { return /* binding */ compatUtils; }, 8793/* harmony export */ computed: function() { return /* binding */ computed; }, 8794/* harmony export */ createBlock: function() { return /* binding */ createBlock; }, 8795/* harmony export */ createCommentVNode: function() { return /* binding */ createCommentVNode; }, 8796/* harmony export */ createElementBlock: function() { return /* binding */ createElementBlock; }, 8797/* harmony export */ createElementVNode: function() { return /* binding */ createBaseVNode; }, 8798/* harmony export */ createHydrationRenderer: function() { return /* binding */ createHydrationRenderer; }, 8799/* harmony export */ createPropsRestProxy: function() { return /* binding */ createPropsRestProxy; }, 8800/* harmony export */ createRenderer: function() { return /* binding */ createRenderer; }, 8801/* harmony export */ createSlots: function() { return /* binding */ createSlots; }, 8802/* harmony export */ createStaticVNode: function() { return /* binding */ createStaticVNode; }, 8803/* harmony export */ createTextVNode: function() { return /* binding */ createTextVNode; }, 8804/* harmony export */ createVNode: function() { return /* binding */ createVNode; }, 8805/* harmony export */ customRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef; }, 8806/* harmony export */ defineAsyncComponent: function() { return /* binding */ defineAsyncComponent; }, 8807/* harmony export */ defineComponent: function() { return /* binding */ defineComponent; }, 8808/* harmony export */ defineEmits: function() { return /* binding */ defineEmits; }, 8809/* harmony export */ defineExpose: function() { return /* binding */ defineExpose; }, 8810/* harmony export */ defineModel: function() { return /* binding */ defineModel; }, 8811/* harmony export */ defineOptions: function() { return /* binding */ defineOptions; }, 8812/* harmony export */ defineProps: function() { return /* binding */ defineProps; }, 8813/* harmony export */ defineSlots: function() { return /* binding */ defineSlots; }, 8814/* harmony export */ devtools: function() { return /* binding */ devtools; }, 8815/* harmony export */ effect: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effect; }, 8816/* harmony export */ effectScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.effectScope; }, 8817/* harmony export */ getCurrentInstance: function() { return /* binding */ getCurrentInstance; }, 8818/* harmony export */ getCurrentScope: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; }, 8819/* harmony export */ getTransitionRawChildren: function() { return /* binding */ getTransitionRawChildren; }, 8820/* harmony export */ guardReactiveProps: function() { return /* binding */ guardReactiveProps; }, 8821/* harmony export */ h: function() { return /* binding */ h; }, 8822/* harmony export */ handleError: function() { return /* binding */ handleError; }, 8823/* harmony export */ hasInjectionContext: function() { return /* binding */ hasInjectionContext; }, 8824/* harmony export */ initCustomFormatter: function() { return /* binding */ initCustomFormatter; }, 8825/* harmony export */ inject: function() { return /* binding */ inject; }, 8826/* harmony export */ isMemoSame: function() { return /* binding */ isMemoSame; }, 8827/* harmony export */ isProxy: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy; }, 8828/* harmony export */ isReactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive; }, 8829/* harmony export */ isReadonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly; }, 8830/* harmony export */ isRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef; }, 8831/* harmony export */ isRuntimeOnly: function() { return /* binding */ isRuntimeOnly; }, 8832/* harmony export */ isShallow: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow; }, 8833/* harmony export */ isVNode: function() { return /* binding */ isVNode; }, 8834/* harmony export */ markRaw: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw; }, 8835/* harmony export */ mergeDefaults: function() { return /* binding */ mergeDefaults; }, 8836/* harmony export */ mergeModels: function() { return /* binding */ mergeModels; }, 8837/* harmony export */ mergeProps: function() { return /* binding */ mergeProps; }, 8838/* harmony export */ nextTick: function() { return /* binding */ nextTick; }, 8839/* harmony export */ normalizeClass: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass; }, 8840/* harmony export */ normalizeProps: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeProps; }, 8841/* harmony export */ normalizeStyle: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle; }, 8842/* harmony export */ onActivated: function() { return /* binding */ onActivated; }, 8843/* harmony export */ onBeforeMount: function() { return /* binding */ onBeforeMount; }, 8844/* harmony export */ onBeforeUnmount: function() { return /* binding */ onBeforeUnmount; }, 8845/* harmony export */ onBeforeUpdate: function() { return /* binding */ onBeforeUpdate; }, 8846/* harmony export */ onDeactivated: function() { return /* binding */ onDeactivated; }, 8847/* harmony export */ onErrorCaptured: function() { return /* binding */ onErrorCaptured; }, 8848/* harmony export */ onMounted: function() { return /* binding */ onMounted; }, 8849/* harmony export */ onRenderTracked: function() { return /* binding */ onRenderTracked; }, 8850/* harmony export */ onRenderTriggered: function() { return /* binding */ onRenderTriggered; }, 8851/* harmony export */ onScopeDispose: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; }, 8852/* harmony export */ onServerPrefetch: function() { return /* binding */ onServerPrefetch; }, 8853/* harmony export */ onUnmounted: function() { return /* binding */ onUnmounted; }, 8854/* harmony export */ onUpdated: function() { return /* binding */ onUpdated; }, 8855/* harmony export */ openBlock: function() { return /* binding */ openBlock; }, 8856/* harmony export */ popScopeId: function() { return /* binding */ popScopeId; }, 8857/* harmony export */ provide: function() { return /* binding */ provide; }, 8858/* harmony export */ proxyRefs: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; }, 8859/* harmony export */ pushScopeId: function() { return /* binding */ pushScopeId; }, 8860/* harmony export */ queuePostFlushCb: function() { return /* binding */ queuePostFlushCb; }, 8861/* harmony export */ reactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive; }, 8862/* harmony export */ readonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.readonly; }, 8863/* harmony export */ ref: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref; }, 8864/* harmony export */ registerRuntimeCompiler: function() { return /* binding */ registerRuntimeCompiler; }, 8865/* harmony export */ renderList: function() { return /* binding */ renderList; }, 8866/* harmony export */ renderSlot: function() { return /* binding */ renderSlot; }, 8867/* harmony export */ resolveComponent: function() { return /* binding */ resolveComponent; }, 8868/* harmony export */ resolveDirective: function() { return /* binding */ resolveDirective; }, 8869/* harmony export */ resolveDynamicComponent: function() { return /* binding */ resolveDynamicComponent; }, 8870/* harmony export */ resolveFilter: function() { return /* binding */ resolveFilter; }, 8871/* harmony export */ resolveTransitionHooks: function() { return /* binding */ resolveTransitionHooks; }, 8872/* harmony export */ setBlockTracking: function() { return /* binding */ setBlockTracking; }, 8873/* harmony export */ setDevtoolsHook: function() { return /* binding */ setDevtoolsHook; }, 8874/* harmony export */ setTransitionHooks: function() { return /* binding */ setTransitionHooks; }, 8875/* harmony export */ shallowReactive: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; }, 8876/* harmony export */ shallowReadonly: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; }, 8877/* harmony export */ shallowRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowRef; }, 8878/* harmony export */ ssrContextKey: function() { return /* binding */ ssrContextKey; }, 8879/* harmony export */ ssrUtils: function() { return /* binding */ ssrUtils; }, 8880/* harmony export */ stop: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.stop; }, 8881/* harmony export */ toDisplayString: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toDisplayString; }, 8882/* harmony export */ toHandlerKey: function() { return /* reexport safe */ _vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey; }, 8883/* harmony export */ toHandlers: function() { return /* binding */ toHandlers; }, 8884/* harmony export */ toRaw: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw; }, 8885/* harmony export */ toRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRef; }, 8886/* harmony export */ toRefs: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRefs; }, 8887/* harmony export */ toValue: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toValue; }, 8888/* harmony export */ transformVNodeArgs: function() { return /* binding */ transformVNodeArgs; }, 8889/* harmony export */ triggerRef: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.triggerRef; }, 8890/* harmony export */ unref: function() { return /* reexport safe */ _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.unref; }, 8891/* harmony export */ useAttrs: function() { return /* binding */ useAttrs; }, 8892/* harmony export */ useModel: function() { return /* binding */ useModel; }, 8893/* harmony export */ useSSRContext: function() { return /* binding */ useSSRContext; }, 8894/* harmony export */ useSlots: function() { return /* binding */ useSlots; }, 8895/* harmony export */ useTransitionState: function() { return /* binding */ useTransitionState; }, 8896/* harmony export */ version: function() { return /* binding */ version; }, 8897/* harmony export */ warn: function() { return /* binding */ warn; }, 8898/* harmony export */ watch: function() { return /* binding */ watch; }, 8899/* harmony export */ watchEffect: function() { return /* binding */ watchEffect; }, 8900/* harmony export */ watchPostEffect: function() { return /* binding */ watchPostEffect; }, 8901/* harmony export */ watchSyncEffect: function() { return /* binding */ watchSyncEffect; }, 8902/* harmony export */ withAsyncContext: function() { return /* binding */ withAsyncContext; }, 8903/* harmony export */ withCtx: function() { return /* binding */ withCtx; }, 8904/* harmony export */ withDefaults: function() { return /* binding */ withDefaults; }, 8905/* harmony export */ withDirectives: function() { return /* binding */ withDirectives; }, 8906/* harmony export */ withMemo: function() { return /* binding */ withMemo; }, 8907/* harmony export */ withScopeId: function() { return /* binding */ withScopeId; } 8908/* harmony export */ }); 8909/* harmony import */ var _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/reactivity */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js"); 8910/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 8911/** 8912* @vue/runtime-core v3.4.34 8913* (c) 2018-present Yuxi (Evan) You and Vue contributors 8914* @license MIT 8915**/ 8916 8917 8918 8919 8920 8921const stack = []; 8922function pushWarningContext(vnode) { 8923 stack.push(vnode); 8924} 8925function popWarningContext() { 8926 stack.pop(); 8927} 8928let isWarning = false; 8929function warn$1(msg, ...args) { 8930 if (isWarning) return; 8931 isWarning = true; 8932 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 8933 const instance = stack.length ? stack[stack.length - 1].component : null; 8934 const appWarnHandler = instance && instance.appContext.config.warnHandler; 8935 const trace = getComponentTrace(); 8936 if (appWarnHandler) { 8937 callWithErrorHandling( 8938 appWarnHandler, 8939 instance, 8940 11, 8941 [ 8942 // eslint-disable-next-line no-restricted-syntax 8943 msg + args.map((a) => { 8944 var _a, _b; 8945 return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); 8946 }).join(""), 8947 instance && instance.proxy, 8948 trace.map( 8949 ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` 8950 ).join("\n"), 8951 trace 8952 ] 8953 ); 8954 } else { 8955 const warnArgs = [`[Vue warn]: ${msg}`, ...args]; 8956 if (trace.length && // avoid spamming console during tests 8957 true) { 8958 warnArgs.push(` 8959`, ...formatTrace(trace)); 8960 } 8961 console.warn(...warnArgs); 8962 } 8963 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 8964 isWarning = false; 8965} 8966function getComponentTrace() { 8967 let currentVNode = stack[stack.length - 1]; 8968 if (!currentVNode) { 8969 return []; 8970 } 8971 const normalizedStack = []; 8972 while (currentVNode) { 8973 const last = normalizedStack[0]; 8974 if (last && last.vnode === currentVNode) { 8975 last.recurseCount++; 8976 } else { 8977 normalizedStack.push({ 8978 vnode: currentVNode, 8979 recurseCount: 0 8980 }); 8981 } 8982 const parentInstance = currentVNode.component && currentVNode.component.parent; 8983 currentVNode = parentInstance && parentInstance.vnode; 8984 } 8985 return normalizedStack; 8986} 8987function formatTrace(trace) { 8988 const logs = []; 8989 trace.forEach((entry, i) => { 8990 logs.push(...i === 0 ? [] : [` 8991`], ...formatTraceEntry(entry)); 8992 }); 8993 return logs; 8994} 8995function formatTraceEntry({ vnode, recurseCount }) { 8996 const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; 8997 const isRoot = vnode.component ? vnode.component.parent == null : false; 8998 const open = ` at <${formatComponentName( 8999 vnode.component, 9000 vnode.type, 9001 isRoot 9002 )}`; 9003 const close = `>` + postfix; 9004 return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; 9005} 9006function formatProps(props) { 9007 const res = []; 9008 const keys = Object.keys(props); 9009 keys.slice(0, 3).forEach((key) => { 9010 res.push(...formatProp(key, props[key])); 9011 }); 9012 if (keys.length > 3) { 9013 res.push(` ...`); 9014 } 9015 return res; 9016} 9017function formatProp(key, value, raw) { 9018 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) { 9019 value = JSON.stringify(value); 9020 return raw ? value : [`${key}=${value}`]; 9021 } else if (typeof value === "number" || typeof value === "boolean" || value == null) { 9022 return raw ? value : [`${key}=${value}`]; 9023 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) { 9024 value = formatProp(key, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value.value), true); 9025 return raw ? value : [`${key}=Ref<`, value, `>`]; 9026 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) { 9027 return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; 9028 } else { 9029 value = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(value); 9030 return raw ? value : [`${key}=`, value]; 9031 } 9032} 9033function assertNumber(val, type) { 9034 if (false) {} 9035 if (val === void 0) { 9036 return; 9037 } else if (typeof val !== "number") { 9038 warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`); 9039 } else if (isNaN(val)) { 9040 warn$1(`${type} is NaN - the duration expression might be incorrect.`); 9041 } 9042} 9043 9044const ErrorCodes = { 9045 "SETUP_FUNCTION": 0, 9046 "0": "SETUP_FUNCTION", 9047 "RENDER_FUNCTION": 1, 9048 "1": "RENDER_FUNCTION", 9049 "WATCH_GETTER": 2, 9050 "2": "WATCH_GETTER", 9051 "WATCH_CALLBACK": 3, 9052 "3": "WATCH_CALLBACK", 9053 "WATCH_CLEANUP": 4, 9054 "4": "WATCH_CLEANUP", 9055 "NATIVE_EVENT_HANDLER": 5, 9056 "5": "NATIVE_EVENT_HANDLER", 9057 "COMPONENT_EVENT_HANDLER": 6, 9058 "6": "COMPONENT_EVENT_HANDLER", 9059 "VNODE_HOOK": 7, 9060 "7": "VNODE_HOOK", 9061 "DIRECTIVE_HOOK": 8, 9062 "8": "DIRECTIVE_HOOK", 9063 "TRANSITION_HOOK": 9, 9064 "9": "TRANSITION_HOOK", 9065 "APP_ERROR_HANDLER": 10, 9066 "10": "APP_ERROR_HANDLER", 9067 "APP_WARN_HANDLER": 11, 9068 "11": "APP_WARN_HANDLER", 9069 "FUNCTION_REF": 12, 9070 "12": "FUNCTION_REF", 9071 "ASYNC_COMPONENT_LOADER": 13, 9072 "13": "ASYNC_COMPONENT_LOADER", 9073 "SCHEDULER": 14, 9074 "14": "SCHEDULER", 9075 "COMPONENT_UPDATE": 15, 9076 "15": "COMPONENT_UPDATE" 9077}; 9078const ErrorTypeStrings$1 = { 9079 ["sp"]: "serverPrefetch hook", 9080 ["bc"]: "beforeCreate hook", 9081 ["c"]: "created hook", 9082 ["bm"]: "beforeMount hook", 9083 ["m"]: "mounted hook", 9084 ["bu"]: "beforeUpdate hook", 9085 ["u"]: "updated", 9086 ["bum"]: "beforeUnmount hook", 9087 ["um"]: "unmounted hook", 9088 ["a"]: "activated hook", 9089 ["da"]: "deactivated hook", 9090 ["ec"]: "errorCaptured hook", 9091 ["rtc"]: "renderTracked hook", 9092 ["rtg"]: "renderTriggered hook", 9093 [0]: "setup function", 9094 [1]: "render function", 9095 [2]: "watcher getter", 9096 [3]: "watcher callback", 9097 [4]: "watcher cleanup function", 9098 [5]: "native event handler", 9099 [6]: "component event handler", 9100 [7]: "vnode hook", 9101 [8]: "directive hook", 9102 [9]: "transition hook", 9103 [10]: "app errorHandler", 9104 [11]: "app warnHandler", 9105 [12]: "ref function", 9106 [13]: "async component loader", 9107 [14]: "scheduler flush", 9108 [15]: "component update" 9109}; 9110function callWithErrorHandling(fn, instance, type, args) { 9111 try { 9112 return args ? fn(...args) : fn(); 9113 } catch (err) { 9114 handleError(err, instance, type); 9115 } 9116} 9117function callWithAsyncErrorHandling(fn, instance, type, args) { 9118 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(fn)) { 9119 const res = callWithErrorHandling(fn, instance, type, args); 9120 if (res && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(res)) { 9121 res.catch((err) => { 9122 handleError(err, instance, type); 9123 }); 9124 } 9125 return res; 9126 } 9127 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) { 9128 const values = []; 9129 for (let i = 0; i < fn.length; i++) { 9130 values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); 9131 } 9132 return values; 9133 } else if (true) { 9134 warn$1( 9135 `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}` 9136 ); 9137 } 9138} 9139function handleError(err, instance, type, throwInDev = true) { 9140 const contextVNode = instance ? instance.vnode : null; 9141 if (instance) { 9142 let cur = instance.parent; 9143 const exposedInstance = instance.proxy; 9144 const errorInfo = true ? ErrorTypeStrings$1[type] : 0; 9145 while (cur) { 9146 const errorCapturedHooks = cur.ec; 9147 if (errorCapturedHooks) { 9148 for (let i = 0; i < errorCapturedHooks.length; i++) { 9149 if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { 9150 return; 9151 } 9152 } 9153 } 9154 cur = cur.parent; 9155 } 9156 const appErrorHandler = instance.appContext.config.errorHandler; 9157 if (appErrorHandler) { 9158 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 9159 callWithErrorHandling( 9160 appErrorHandler, 9161 null, 9162 10, 9163 [err, exposedInstance, errorInfo] 9164 ); 9165 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 9166 return; 9167 } 9168 } 9169 logError(err, type, contextVNode, throwInDev); 9170} 9171function logError(err, type, contextVNode, throwInDev = true) { 9172 if (true) { 9173 const info = ErrorTypeStrings$1[type]; 9174 if (contextVNode) { 9175 pushWarningContext(contextVNode); 9176 } 9177 warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`); 9178 if (contextVNode) { 9179 popWarningContext(); 9180 } 9181 if (throwInDev) { 9182 throw err; 9183 } else { 9184 console.error(err); 9185 } 9186 } else {} 9187} 9188 9189let isFlushing = false; 9190let isFlushPending = false; 9191const queue = []; 9192let flushIndex = 0; 9193const pendingPostFlushCbs = []; 9194let activePostFlushCbs = null; 9195let postFlushIndex = 0; 9196const resolvedPromise = /* @__PURE__ */ Promise.resolve(); 9197let currentFlushPromise = null; 9198const RECURSION_LIMIT = 100; 9199function nextTick(fn) { 9200 const p = currentFlushPromise || resolvedPromise; 9201 return fn ? p.then(this ? fn.bind(this) : fn) : p; 9202} 9203function findInsertionIndex(id) { 9204 let start = flushIndex + 1; 9205 let end = queue.length; 9206 while (start < end) { 9207 const middle = start + end >>> 1; 9208 const middleJob = queue[middle]; 9209 const middleJobId = getId(middleJob); 9210 if (middleJobId < id || middleJobId === id && middleJob.pre) { 9211 start = middle + 1; 9212 } else { 9213 end = middle; 9214 } 9215 } 9216 return start; 9217} 9218function queueJob(job) { 9219 if (!queue.length || !queue.includes( 9220 job, 9221 isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex 9222 )) { 9223 if (job.id == null) { 9224 queue.push(job); 9225 } else { 9226 queue.splice(findInsertionIndex(job.id), 0, job); 9227 } 9228 queueFlush(); 9229 } 9230} 9231function queueFlush() { 9232 if (!isFlushing && !isFlushPending) { 9233 isFlushPending = true; 9234 currentFlushPromise = resolvedPromise.then(flushJobs); 9235 } 9236} 9237function invalidateJob(job) { 9238 const i = queue.indexOf(job); 9239 if (i > flushIndex) { 9240 queue.splice(i, 1); 9241 } 9242} 9243function queuePostFlushCb(cb) { 9244 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(cb)) { 9245 if (!activePostFlushCbs || !activePostFlushCbs.includes( 9246 cb, 9247 cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex 9248 )) { 9249 pendingPostFlushCbs.push(cb); 9250 } 9251 } else { 9252 pendingPostFlushCbs.push(...cb); 9253 } 9254 queueFlush(); 9255} 9256function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) { 9257 if (true) { 9258 seen = seen || /* @__PURE__ */ new Map(); 9259 } 9260 for (; i < queue.length; i++) { 9261 const cb = queue[i]; 9262 if (cb && cb.pre) { 9263 if (instance && cb.id !== instance.uid) { 9264 continue; 9265 } 9266 if ( true && checkRecursiveUpdates(seen, cb)) { 9267 continue; 9268 } 9269 queue.splice(i, 1); 9270 i--; 9271 cb(); 9272 } 9273 } 9274} 9275function flushPostFlushCbs(seen) { 9276 if (pendingPostFlushCbs.length) { 9277 const deduped = [...new Set(pendingPostFlushCbs)].sort( 9278 (a, b) => getId(a) - getId(b) 9279 ); 9280 pendingPostFlushCbs.length = 0; 9281 if (activePostFlushCbs) { 9282 activePostFlushCbs.push(...deduped); 9283 return; 9284 } 9285 activePostFlushCbs = deduped; 9286 if (true) { 9287 seen = seen || /* @__PURE__ */ new Map(); 9288 } 9289 for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { 9290 const cb = activePostFlushCbs[postFlushIndex]; 9291 if ( true && checkRecursiveUpdates(seen, cb)) { 9292 continue; 9293 } 9294 if (cb.active !== false) cb(); 9295 } 9296 activePostFlushCbs = null; 9297 postFlushIndex = 0; 9298 } 9299} 9300const getId = (job) => job.id == null ? Infinity : job.id; 9301const comparator = (a, b) => { 9302 const diff = getId(a) - getId(b); 9303 if (diff === 0) { 9304 if (a.pre && !b.pre) return -1; 9305 if (b.pre && !a.pre) return 1; 9306 } 9307 return diff; 9308}; 9309function flushJobs(seen) { 9310 isFlushPending = false; 9311 isFlushing = true; 9312 if (true) { 9313 seen = seen || /* @__PURE__ */ new Map(); 9314 } 9315 queue.sort(comparator); 9316 const check = true ? (job) => checkRecursiveUpdates(seen, job) : 0; 9317 try { 9318 for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { 9319 const job = queue[flushIndex]; 9320 if (job && job.active !== false) { 9321 if ( true && check(job)) { 9322 continue; 9323 } 9324 callWithErrorHandling( 9325 job, 9326 job.i, 9327 job.i ? 15 : 14 9328 ); 9329 } 9330 } 9331 } finally { 9332 flushIndex = 0; 9333 queue.length = 0; 9334 flushPostFlushCbs(seen); 9335 isFlushing = false; 9336 currentFlushPromise = null; 9337 if (queue.length || pendingPostFlushCbs.length) { 9338 flushJobs(seen); 9339 } 9340 } 9341} 9342function checkRecursiveUpdates(seen, fn) { 9343 if (!seen.has(fn)) { 9344 seen.set(fn, 1); 9345 } else { 9346 const count = seen.get(fn); 9347 if (count > RECURSION_LIMIT) { 9348 const instance = fn.i; 9349 const componentName = instance && getComponentName(instance.type); 9350 handleError( 9351 `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, 9352 null, 9353 10 9354 ); 9355 return true; 9356 } else { 9357 seen.set(fn, count + 1); 9358 } 9359 } 9360} 9361 9362let isHmrUpdating = false; 9363const hmrDirtyComponents = /* @__PURE__ */ new Map(); 9364if (true) { 9365 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_HMR_RUNTIME__ = { 9366 createRecord: tryWrap(createRecord), 9367 rerender: tryWrap(rerender), 9368 reload: tryWrap(reload) 9369 }; 9370} 9371const map = /* @__PURE__ */ new Map(); 9372function registerHMR(instance) { 9373 const id = instance.type.__hmrId; 9374 let record = map.get(id); 9375 if (!record) { 9376 createRecord(id, instance.type); 9377 record = map.get(id); 9378 } 9379 record.instances.add(instance); 9380} 9381function unregisterHMR(instance) { 9382 map.get(instance.type.__hmrId).instances.delete(instance); 9383} 9384function createRecord(id, initialDef) { 9385 if (map.has(id)) { 9386 return false; 9387 } 9388 map.set(id, { 9389 initialDef: normalizeClassComponent(initialDef), 9390 instances: /* @__PURE__ */ new Set() 9391 }); 9392 return true; 9393} 9394function normalizeClassComponent(component) { 9395 return isClassComponent(component) ? component.__vccOpts : component; 9396} 9397function rerender(id, newRender) { 9398 const record = map.get(id); 9399 if (!record) { 9400 return; 9401 } 9402 record.initialDef.render = newRender; 9403 [...record.instances].forEach((instance) => { 9404 if (newRender) { 9405 instance.render = newRender; 9406 normalizeClassComponent(instance.type).render = newRender; 9407 } 9408 instance.renderCache = []; 9409 isHmrUpdating = true; 9410 instance.effect.dirty = true; 9411 instance.update(); 9412 isHmrUpdating = false; 9413 }); 9414} 9415function reload(id, newComp) { 9416 const record = map.get(id); 9417 if (!record) return; 9418 newComp = normalizeClassComponent(newComp); 9419 updateComponentDef(record.initialDef, newComp); 9420 const instances = [...record.instances]; 9421 for (let i = 0; i < instances.length; i++) { 9422 const instance = instances[i]; 9423 const oldComp = normalizeClassComponent(instance.type); 9424 let dirtyInstances = hmrDirtyComponents.get(oldComp); 9425 if (!dirtyInstances) { 9426 if (oldComp !== record.initialDef) { 9427 updateComponentDef(oldComp, newComp); 9428 } 9429 hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set()); 9430 } 9431 dirtyInstances.add(instance); 9432 instance.appContext.propsCache.delete(instance.type); 9433 instance.appContext.emitsCache.delete(instance.type); 9434 instance.appContext.optionsCache.delete(instance.type); 9435 if (instance.ceReload) { 9436 dirtyInstances.add(instance); 9437 instance.ceReload(newComp.styles); 9438 dirtyInstances.delete(instance); 9439 } else if (instance.parent) { 9440 instance.parent.effect.dirty = true; 9441 queueJob(() => { 9442 instance.parent.update(); 9443 dirtyInstances.delete(instance); 9444 }); 9445 } else if (instance.appContext.reload) { 9446 instance.appContext.reload(); 9447 } else if (typeof window !== "undefined") { 9448 window.location.reload(); 9449 } else { 9450 console.warn( 9451 "[HMR] Root or manually mounted instance modified. Full reload required." 9452 ); 9453 } 9454 } 9455 queuePostFlushCb(() => { 9456 hmrDirtyComponents.clear(); 9457 }); 9458} 9459function updateComponentDef(oldComp, newComp) { 9460 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(oldComp, newComp); 9461 for (const key in oldComp) { 9462 if (key !== "__file" && !(key in newComp)) { 9463 delete oldComp[key]; 9464 } 9465 } 9466} 9467function tryWrap(fn) { 9468 return (id, arg) => { 9469 try { 9470 return fn(id, arg); 9471 } catch (e) { 9472 console.error(e); 9473 console.warn( 9474 `[HMR] Something went wrong during Vue component hot-reload. Full reload required.` 9475 ); 9476 } 9477 }; 9478} 9479 9480let devtools$1; 9481let buffer = []; 9482let devtoolsNotInstalled = false; 9483function emit$1(event, ...args) { 9484 if (devtools$1) { 9485 devtools$1.emit(event, ...args); 9486 } else if (!devtoolsNotInstalled) { 9487 buffer.push({ event, args }); 9488 } 9489} 9490function setDevtoolsHook$1(hook, target) { 9491 var _a, _b; 9492 devtools$1 = hook; 9493 if (devtools$1) { 9494 devtools$1.enabled = true; 9495 buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args)); 9496 buffer = []; 9497 } else if ( 9498 // handle late devtools injection - only do this if we are in an actual 9499 // browser environment to avoid the timer handle stalling test runner exit 9500 // (#4815) 9501 typeof window !== "undefined" && // some envs mock window but not fully 9502 window.HTMLElement && // also exclude jsdom 9503 // eslint-disable-next-line no-restricted-syntax 9504 !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) 9505 ) { 9506 const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; 9507 replay.push((newHook) => { 9508 setDevtoolsHook$1(newHook, target); 9509 }); 9510 setTimeout(() => { 9511 if (!devtools$1) { 9512 target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; 9513 devtoolsNotInstalled = true; 9514 buffer = []; 9515 } 9516 }, 3e3); 9517 } else { 9518 devtoolsNotInstalled = true; 9519 buffer = []; 9520 } 9521} 9522function devtoolsInitApp(app, version) { 9523 emit$1("app:init" /* APP_INIT */, app, version, { 9524 Fragment, 9525 Text, 9526 Comment, 9527 Static 9528 }); 9529} 9530function devtoolsUnmountApp(app) { 9531 emit$1("app:unmount" /* APP_UNMOUNT */, app); 9532} 9533const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook( 9534 "component:added" /* COMPONENT_ADDED */ 9535); 9536const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook("component:updated" /* COMPONENT_UPDATED */); 9537const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook( 9538 "component:removed" /* COMPONENT_REMOVED */ 9539); 9540const devtoolsComponentRemoved = (component) => { 9541 if (devtools$1 && typeof devtools$1.cleanupBuffer === "function" && // remove the component if it wasn't buffered 9542 !devtools$1.cleanupBuffer(component)) { 9543 _devtoolsComponentRemoved(component); 9544 } 9545}; 9546/*! #__NO_SIDE_EFFECTS__ */ 9547// @__NO_SIDE_EFFECTS__ 9548function createDevtoolsComponentHook(hook) { 9549 return (component) => { 9550 emit$1( 9551 hook, 9552 component.appContext.app, 9553 component.uid, 9554 component.parent ? component.parent.uid : void 0, 9555 component 9556 ); 9557 }; 9558} 9559const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook( 9560 "perf:start" /* PERFORMANCE_START */ 9561); 9562const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook( 9563 "perf:end" /* PERFORMANCE_END */ 9564); 9565function createDevtoolsPerformanceHook(hook) { 9566 return (component, type, time) => { 9567 emit$1(hook, component.appContext.app, component.uid, component, type, time); 9568 }; 9569} 9570function devtoolsComponentEmit(component, event, params) { 9571 emit$1( 9572 "component:emit" /* COMPONENT_EMIT */, 9573 component.appContext.app, 9574 component, 9575 event, 9576 params 9577 ); 9578} 9579 9580let currentRenderingInstance = null; 9581let currentScopeId = null; 9582function setCurrentRenderingInstance(instance) { 9583 const prev = currentRenderingInstance; 9584 currentRenderingInstance = instance; 9585 currentScopeId = instance && instance.type.__scopeId || null; 9586 return prev; 9587} 9588function pushScopeId(id) { 9589 currentScopeId = id; 9590} 9591function popScopeId() { 9592 currentScopeId = null; 9593} 9594const withScopeId = (_id) => withCtx; 9595function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { 9596 if (!ctx) return fn; 9597 if (fn._n) { 9598 return fn; 9599 } 9600 const renderFnWithContext = (...args) => { 9601 if (renderFnWithContext._d) { 9602 setBlockTracking(-1); 9603 } 9604 const prevInstance = setCurrentRenderingInstance(ctx); 9605 let res; 9606 try { 9607 res = fn(...args); 9608 } finally { 9609 setCurrentRenderingInstance(prevInstance); 9610 if (renderFnWithContext._d) { 9611 setBlockTracking(1); 9612 } 9613 } 9614 if (true) { 9615 devtoolsComponentUpdated(ctx); 9616 } 9617 return res; 9618 }; 9619 renderFnWithContext._n = true; 9620 renderFnWithContext._c = true; 9621 renderFnWithContext._d = true; 9622 return renderFnWithContext; 9623} 9624 9625function validateDirectiveName(name) { 9626 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBuiltInDirective)(name)) { 9627 warn$1("Do not use built-in directive ids as custom directive id: " + name); 9628 } 9629} 9630function withDirectives(vnode, directives) { 9631 if (currentRenderingInstance === null) { 9632 true && warn$1(`withDirectives can only be used inside render functions.`); 9633 return vnode; 9634 } 9635 const instance = getComponentPublicInstance(currentRenderingInstance); 9636 const bindings = vnode.dirs || (vnode.dirs = []); 9637 for (let i = 0; i < directives.length; i++) { 9638 let [dir, value, arg, modifiers = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ] = directives[i]; 9639 if (dir) { 9640 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dir)) { 9641 dir = { 9642 mounted: dir, 9643 updated: dir 9644 }; 9645 } 9646 if (dir.deep) { 9647 traverse(value); 9648 } 9649 bindings.push({ 9650 dir, 9651 instance, 9652 value, 9653 oldValue: void 0, 9654 arg, 9655 modifiers 9656 }); 9657 } 9658 } 9659 return vnode; 9660} 9661function invokeDirectiveHook(vnode, prevVNode, instance, name) { 9662 const bindings = vnode.dirs; 9663 const oldBindings = prevVNode && prevVNode.dirs; 9664 for (let i = 0; i < bindings.length; i++) { 9665 const binding = bindings[i]; 9666 if (oldBindings) { 9667 binding.oldValue = oldBindings[i].value; 9668 } 9669 let hook = binding.dir[name]; 9670 if (hook) { 9671 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 9672 callWithAsyncErrorHandling(hook, instance, 8, [ 9673 vnode.el, 9674 binding, 9675 vnode, 9676 prevVNode 9677 ]); 9678 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 9679 } 9680 } 9681} 9682 9683const leaveCbKey = Symbol("_leaveCb"); 9684const enterCbKey = Symbol("_enterCb"); 9685function useTransitionState() { 9686 const state = { 9687 isMounted: false, 9688 isLeaving: false, 9689 isUnmounting: false, 9690 leavingVNodes: /* @__PURE__ */ new Map() 9691 }; 9692 onMounted(() => { 9693 state.isMounted = true; 9694 }); 9695 onBeforeUnmount(() => { 9696 state.isUnmounting = true; 9697 }); 9698 return state; 9699} 9700const TransitionHookValidator = [Function, Array]; 9701const BaseTransitionPropsValidators = { 9702 mode: String, 9703 appear: Boolean, 9704 persisted: Boolean, 9705 // enter 9706 onBeforeEnter: TransitionHookValidator, 9707 onEnter: TransitionHookValidator, 9708 onAfterEnter: TransitionHookValidator, 9709 onEnterCancelled: TransitionHookValidator, 9710 // leave 9711 onBeforeLeave: TransitionHookValidator, 9712 onLeave: TransitionHookValidator, 9713 onAfterLeave: TransitionHookValidator, 9714 onLeaveCancelled: TransitionHookValidator, 9715 // appear 9716 onBeforeAppear: TransitionHookValidator, 9717 onAppear: TransitionHookValidator, 9718 onAfterAppear: TransitionHookValidator, 9719 onAppearCancelled: TransitionHookValidator 9720}; 9721const recursiveGetSubtree = (instance) => { 9722 const subTree = instance.subTree; 9723 return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; 9724}; 9725const BaseTransitionImpl = { 9726 name: `BaseTransition`, 9727 props: BaseTransitionPropsValidators, 9728 setup(props, { slots }) { 9729 const instance = getCurrentInstance(); 9730 const state = useTransitionState(); 9731 return () => { 9732 const children = slots.default && getTransitionRawChildren(slots.default(), true); 9733 if (!children || !children.length) { 9734 return; 9735 } 9736 let child = children[0]; 9737 if (children.length > 1) { 9738 let hasFound = false; 9739 for (const c of children) { 9740 if (c.type !== Comment) { 9741 if ( true && hasFound) { 9742 warn$1( 9743 "<transition> can only be used on a single element or component. Use <transition-group> for lists." 9744 ); 9745 break; 9746 } 9747 child = c; 9748 hasFound = true; 9749 if (false) {} 9750 } 9751 } 9752 } 9753 const rawProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props); 9754 const { mode } = rawProps; 9755 if ( true && mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { 9756 warn$1(`invalid <transition> mode: ${mode}`); 9757 } 9758 if (state.isLeaving) { 9759 return emptyPlaceholder(child); 9760 } 9761 const innerChild = getKeepAliveChild(child); 9762 if (!innerChild) { 9763 return emptyPlaceholder(child); 9764 } 9765 let enterHooks = resolveTransitionHooks( 9766 innerChild, 9767 rawProps, 9768 state, 9769 instance, 9770 // #11061, ensure enterHooks is fresh after clone 9771 (hooks) => enterHooks = hooks 9772 ); 9773 setTransitionHooks(innerChild, enterHooks); 9774 const oldChild = instance.subTree; 9775 const oldInnerChild = oldChild && getKeepAliveChild(oldChild); 9776 if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) { 9777 const leavingHooks = resolveTransitionHooks( 9778 oldInnerChild, 9779 rawProps, 9780 state, 9781 instance 9782 ); 9783 setTransitionHooks(oldInnerChild, leavingHooks); 9784 if (mode === "out-in" && innerChild.type !== Comment) { 9785 state.isLeaving = true; 9786 leavingHooks.afterLeave = () => { 9787 state.isLeaving = false; 9788 if (instance.update.active !== false) { 9789 instance.effect.dirty = true; 9790 instance.update(); 9791 } 9792 }; 9793 return emptyPlaceholder(child); 9794 } else if (mode === "in-out" && innerChild.type !== Comment) { 9795 leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { 9796 const leavingVNodesCache = getLeavingNodesForType( 9797 state, 9798 oldInnerChild 9799 ); 9800 leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; 9801 el[leaveCbKey] = () => { 9802 earlyRemove(); 9803 el[leaveCbKey] = void 0; 9804 delete enterHooks.delayedLeave; 9805 }; 9806 enterHooks.delayedLeave = delayedLeave; 9807 }; 9808 } 9809 } 9810 return child; 9811 }; 9812 } 9813}; 9814const BaseTransition = BaseTransitionImpl; 9815function getLeavingNodesForType(state, vnode) { 9816 const { leavingVNodes } = state; 9817 let leavingVNodesCache = leavingVNodes.get(vnode.type); 9818 if (!leavingVNodesCache) { 9819 leavingVNodesCache = /* @__PURE__ */ Object.create(null); 9820 leavingVNodes.set(vnode.type, leavingVNodesCache); 9821 } 9822 return leavingVNodesCache; 9823} 9824function resolveTransitionHooks(vnode, props, state, instance, postClone) { 9825 const { 9826 appear, 9827 mode, 9828 persisted = false, 9829 onBeforeEnter, 9830 onEnter, 9831 onAfterEnter, 9832 onEnterCancelled, 9833 onBeforeLeave, 9834 onLeave, 9835 onAfterLeave, 9836 onLeaveCancelled, 9837 onBeforeAppear, 9838 onAppear, 9839 onAfterAppear, 9840 onAppearCancelled 9841 } = props; 9842 const key = String(vnode.key); 9843 const leavingVNodesCache = getLeavingNodesForType(state, vnode); 9844 const callHook = (hook, args) => { 9845 hook && callWithAsyncErrorHandling( 9846 hook, 9847 instance, 9848 9, 9849 args 9850 ); 9851 }; 9852 const callAsyncHook = (hook, args) => { 9853 const done = args[1]; 9854 callHook(hook, args); 9855 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) { 9856 if (hook.every((hook2) => hook2.length <= 1)) done(); 9857 } else if (hook.length <= 1) { 9858 done(); 9859 } 9860 }; 9861 const hooks = { 9862 mode, 9863 persisted, 9864 beforeEnter(el) { 9865 let hook = onBeforeEnter; 9866 if (!state.isMounted) { 9867 if (appear) { 9868 hook = onBeforeAppear || onBeforeEnter; 9869 } else { 9870 return; 9871 } 9872 } 9873 if (el[leaveCbKey]) { 9874 el[leaveCbKey]( 9875 true 9876 /* cancelled */ 9877 ); 9878 } 9879 const leavingVNode = leavingVNodesCache[key]; 9880 if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { 9881 leavingVNode.el[leaveCbKey](); 9882 } 9883 callHook(hook, [el]); 9884 }, 9885 enter(el) { 9886 let hook = onEnter; 9887 let afterHook = onAfterEnter; 9888 let cancelHook = onEnterCancelled; 9889 if (!state.isMounted) { 9890 if (appear) { 9891 hook = onAppear || onEnter; 9892 afterHook = onAfterAppear || onAfterEnter; 9893 cancelHook = onAppearCancelled || onEnterCancelled; 9894 } else { 9895 return; 9896 } 9897 } 9898 let called = false; 9899 const done = el[enterCbKey] = (cancelled) => { 9900 if (called) return; 9901 called = true; 9902 if (cancelled) { 9903 callHook(cancelHook, [el]); 9904 } else { 9905 callHook(afterHook, [el]); 9906 } 9907 if (hooks.delayedLeave) { 9908 hooks.delayedLeave(); 9909 } 9910 el[enterCbKey] = void 0; 9911 }; 9912 if (hook) { 9913 callAsyncHook(hook, [el, done]); 9914 } else { 9915 done(); 9916 } 9917 }, 9918 leave(el, remove) { 9919 const key2 = String(vnode.key); 9920 if (el[enterCbKey]) { 9921 el[enterCbKey]( 9922 true 9923 /* cancelled */ 9924 ); 9925 } 9926 if (state.isUnmounting) { 9927 return remove(); 9928 } 9929 callHook(onBeforeLeave, [el]); 9930 let called = false; 9931 const done = el[leaveCbKey] = (cancelled) => { 9932 if (called) return; 9933 called = true; 9934 remove(); 9935 if (cancelled) { 9936 callHook(onLeaveCancelled, [el]); 9937 } else { 9938 callHook(onAfterLeave, [el]); 9939 } 9940 el[leaveCbKey] = void 0; 9941 if (leavingVNodesCache[key2] === vnode) { 9942 delete leavingVNodesCache[key2]; 9943 } 9944 }; 9945 leavingVNodesCache[key2] = vnode; 9946 if (onLeave) { 9947 callAsyncHook(onLeave, [el, done]); 9948 } else { 9949 done(); 9950 } 9951 }, 9952 clone(vnode2) { 9953 const hooks2 = resolveTransitionHooks( 9954 vnode2, 9955 props, 9956 state, 9957 instance, 9958 postClone 9959 ); 9960 if (postClone) postClone(hooks2); 9961 return hooks2; 9962 } 9963 }; 9964 return hooks; 9965} 9966function emptyPlaceholder(vnode) { 9967 if (isKeepAlive(vnode)) { 9968 vnode = cloneVNode(vnode); 9969 vnode.children = null; 9970 return vnode; 9971 } 9972} 9973function getKeepAliveChild(vnode) { 9974 if (!isKeepAlive(vnode)) { 9975 return vnode; 9976 } 9977 if ( true && vnode.component) { 9978 return vnode.component.subTree; 9979 } 9980 const { shapeFlag, children } = vnode; 9981 if (children) { 9982 if (shapeFlag & 16) { 9983 return children[0]; 9984 } 9985 if (shapeFlag & 32 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children.default)) { 9986 return children.default(); 9987 } 9988 } 9989} 9990function setTransitionHooks(vnode, hooks) { 9991 if (vnode.shapeFlag & 6 && vnode.component) { 9992 setTransitionHooks(vnode.component.subTree, hooks); 9993 } else if (vnode.shapeFlag & 128) { 9994 vnode.ssContent.transition = hooks.clone(vnode.ssContent); 9995 vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); 9996 } else { 9997 vnode.transition = hooks; 9998 } 9999} 10000function getTransitionRawChildren(children, keepComment = false, parentKey) { 10001 let ret = []; 10002 let keyedFragmentCount = 0; 10003 for (let i = 0; i < children.length; i++) { 10004 let child = children[i]; 10005 const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); 10006 if (child.type === Fragment) { 10007 if (child.patchFlag & 128) keyedFragmentCount++; 10008 ret = ret.concat( 10009 getTransitionRawChildren(child.children, keepComment, key) 10010 ); 10011 } else if (keepComment || child.type !== Comment) { 10012 ret.push(key != null ? cloneVNode(child, { key }) : child); 10013 } 10014 } 10015 if (keyedFragmentCount > 1) { 10016 for (let i = 0; i < ret.length; i++) { 10017 ret[i].patchFlag = -2; 10018 } 10019 } 10020 return ret; 10021} 10022 10023/*! #__NO_SIDE_EFFECTS__ */ 10024// @__NO_SIDE_EFFECTS__ 10025function defineComponent(options, extraOptions) { 10026 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(options) ? ( 10027 // #8326: extend call and options.name access are considered side-effects 10028 // by Rollup, so we have to wrap it in a pure-annotated IIFE. 10029 /* @__PURE__ */ (() => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ name: options.name }, extraOptions, { setup: options }))() 10030 ) : options; 10031} 10032 10033const isAsyncWrapper = (i) => !!i.type.__asyncLoader; 10034/*! #__NO_SIDE_EFFECTS__ */ 10035// @__NO_SIDE_EFFECTS__ 10036function defineAsyncComponent(source) { 10037 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) { 10038 source = { loader: source }; 10039 } 10040 const { 10041 loader, 10042 loadingComponent, 10043 errorComponent, 10044 delay = 200, 10045 timeout, 10046 // undefined = never times out 10047 suspensible = true, 10048 onError: userOnError 10049 } = source; 10050 let pendingRequest = null; 10051 let resolvedComp; 10052 let retries = 0; 10053 const retry = () => { 10054 retries++; 10055 pendingRequest = null; 10056 return load(); 10057 }; 10058 const load = () => { 10059 let thisRequest; 10060 return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { 10061 err = err instanceof Error ? err : new Error(String(err)); 10062 if (userOnError) { 10063 return new Promise((resolve, reject) => { 10064 const userRetry = () => resolve(retry()); 10065 const userFail = () => reject(err); 10066 userOnError(err, userRetry, userFail, retries + 1); 10067 }); 10068 } else { 10069 throw err; 10070 } 10071 }).then((comp) => { 10072 if (thisRequest !== pendingRequest && pendingRequest) { 10073 return pendingRequest; 10074 } 10075 if ( true && !comp) { 10076 warn$1( 10077 `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.` 10078 ); 10079 } 10080 if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { 10081 comp = comp.default; 10082 } 10083 if ( true && comp && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) { 10084 throw new Error(`Invalid async component load result: ${comp}`); 10085 } 10086 resolvedComp = comp; 10087 return comp; 10088 })); 10089 }; 10090 return defineComponent({ 10091 name: "AsyncComponentWrapper", 10092 __asyncLoader: load, 10093 get __asyncResolved() { 10094 return resolvedComp; 10095 }, 10096 setup() { 10097 const instance = currentInstance; 10098 if (resolvedComp) { 10099 return () => createInnerComp(resolvedComp, instance); 10100 } 10101 const onError = (err) => { 10102 pendingRequest = null; 10103 handleError( 10104 err, 10105 instance, 10106 13, 10107 !errorComponent 10108 ); 10109 }; 10110 if (suspensible && instance.suspense || isInSSRComponentSetup) { 10111 return load().then((comp) => { 10112 return () => createInnerComp(comp, instance); 10113 }).catch((err) => { 10114 onError(err); 10115 return () => errorComponent ? createVNode(errorComponent, { 10116 error: err 10117 }) : null; 10118 }); 10119 } 10120 const loaded = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(false); 10121 const error = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(); 10122 const delayed = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(!!delay); 10123 if (delay) { 10124 setTimeout(() => { 10125 delayed.value = false; 10126 }, delay); 10127 } 10128 if (timeout != null) { 10129 setTimeout(() => { 10130 if (!loaded.value && !error.value) { 10131 const err = new Error( 10132 `Async component timed out after ${timeout}ms.` 10133 ); 10134 onError(err); 10135 error.value = err; 10136 } 10137 }, timeout); 10138 } 10139 load().then(() => { 10140 loaded.value = true; 10141 if (instance.parent && isKeepAlive(instance.parent.vnode)) { 10142 instance.parent.effect.dirty = true; 10143 queueJob(instance.parent.update); 10144 } 10145 }).catch((err) => { 10146 onError(err); 10147 error.value = err; 10148 }); 10149 return () => { 10150 if (loaded.value && resolvedComp) { 10151 return createInnerComp(resolvedComp, instance); 10152 } else if (error.value && errorComponent) { 10153 return createVNode(errorComponent, { 10154 error: error.value 10155 }); 10156 } else if (loadingComponent && !delayed.value) { 10157 return createVNode(loadingComponent); 10158 } 10159 }; 10160 } 10161 }); 10162} 10163function createInnerComp(comp, parent) { 10164 const { ref: ref2, props, children, ce } = parent.vnode; 10165 const vnode = createVNode(comp, props, children); 10166 vnode.ref = ref2; 10167 vnode.ce = ce; 10168 delete parent.vnode.ce; 10169 return vnode; 10170} 10171 10172const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; 10173const KeepAliveImpl = { 10174 name: `KeepAlive`, 10175 // Marker for special handling inside the renderer. We are not using a === 10176 // check directly on KeepAlive in the renderer, because importing it directly 10177 // would prevent it from being tree-shaken. 10178 __isKeepAlive: true, 10179 props: { 10180 include: [String, RegExp, Array], 10181 exclude: [String, RegExp, Array], 10182 max: [String, Number] 10183 }, 10184 setup(props, { slots }) { 10185 const instance = getCurrentInstance(); 10186 const sharedContext = instance.ctx; 10187 if (!sharedContext.renderer) { 10188 return () => { 10189 const children = slots.default && slots.default(); 10190 return children && children.length === 1 ? children[0] : children; 10191 }; 10192 } 10193 const cache = /* @__PURE__ */ new Map(); 10194 const keys = /* @__PURE__ */ new Set(); 10195 let current = null; 10196 if (true) { 10197 instance.__v_cache = cache; 10198 } 10199 const parentSuspense = instance.suspense; 10200 const { 10201 renderer: { 10202 p: patch, 10203 m: move, 10204 um: _unmount, 10205 o: { createElement } 10206 } 10207 } = sharedContext; 10208 const storageContainer = createElement("div"); 10209 sharedContext.activate = (vnode, container, anchor, namespace, optimized) => { 10210 const instance2 = vnode.component; 10211 move(vnode, container, anchor, 0, parentSuspense); 10212 patch( 10213 instance2.vnode, 10214 vnode, 10215 container, 10216 anchor, 10217 instance2, 10218 parentSuspense, 10219 namespace, 10220 vnode.slotScopeIds, 10221 optimized 10222 ); 10223 queuePostRenderEffect(() => { 10224 instance2.isDeactivated = false; 10225 if (instance2.a) { 10226 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance2.a); 10227 } 10228 const vnodeHook = vnode.props && vnode.props.onVnodeMounted; 10229 if (vnodeHook) { 10230 invokeVNodeHook(vnodeHook, instance2.parent, vnode); 10231 } 10232 }, parentSuspense); 10233 if (true) { 10234 devtoolsComponentAdded(instance2); 10235 } 10236 }; 10237 sharedContext.deactivate = (vnode) => { 10238 const instance2 = vnode.component; 10239 invalidateMount(instance2.m); 10240 invalidateMount(instance2.a); 10241 move(vnode, storageContainer, null, 1, parentSuspense); 10242 queuePostRenderEffect(() => { 10243 if (instance2.da) { 10244 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance2.da); 10245 } 10246 const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; 10247 if (vnodeHook) { 10248 invokeVNodeHook(vnodeHook, instance2.parent, vnode); 10249 } 10250 instance2.isDeactivated = true; 10251 }, parentSuspense); 10252 if (true) { 10253 devtoolsComponentAdded(instance2); 10254 } 10255 }; 10256 function unmount(vnode) { 10257 resetShapeFlag(vnode); 10258 _unmount(vnode, instance, parentSuspense, true); 10259 } 10260 function pruneCache(filter) { 10261 cache.forEach((vnode, key) => { 10262 const name = getComponentName(vnode.type); 10263 if (name && (!filter || !filter(name))) { 10264 pruneCacheEntry(key); 10265 } 10266 }); 10267 } 10268 function pruneCacheEntry(key) { 10269 const cached = cache.get(key); 10270 if (!current || !isSameVNodeType(cached, current)) { 10271 unmount(cached); 10272 } else if (current) { 10273 resetShapeFlag(current); 10274 } 10275 cache.delete(key); 10276 keys.delete(key); 10277 } 10278 watch( 10279 () => [props.include, props.exclude], 10280 ([include, exclude]) => { 10281 include && pruneCache((name) => matches(include, name)); 10282 exclude && pruneCache((name) => !matches(exclude, name)); 10283 }, 10284 // prune post-render after `current` has been updated 10285 { flush: "post", deep: true } 10286 ); 10287 let pendingCacheKey = null; 10288 const cacheSubtree = () => { 10289 if (pendingCacheKey != null) { 10290 if (isSuspense(instance.subTree.type)) { 10291 queuePostRenderEffect(() => { 10292 cache.set(pendingCacheKey, getInnerChild(instance.subTree)); 10293 }, instance.subTree.suspense); 10294 } else { 10295 cache.set(pendingCacheKey, getInnerChild(instance.subTree)); 10296 } 10297 } 10298 }; 10299 onMounted(cacheSubtree); 10300 onUpdated(cacheSubtree); 10301 onBeforeUnmount(() => { 10302 cache.forEach((cached) => { 10303 const { subTree, suspense } = instance; 10304 const vnode = getInnerChild(subTree); 10305 if (cached.type === vnode.type && cached.key === vnode.key) { 10306 resetShapeFlag(vnode); 10307 const da = vnode.component.da; 10308 da && queuePostRenderEffect(da, suspense); 10309 return; 10310 } 10311 unmount(cached); 10312 }); 10313 }); 10314 return () => { 10315 pendingCacheKey = null; 10316 if (!slots.default) { 10317 return null; 10318 } 10319 const children = slots.default(); 10320 const rawVNode = children[0]; 10321 if (children.length > 1) { 10322 if (true) { 10323 warn$1(`KeepAlive should contain exactly one component child.`); 10324 } 10325 current = null; 10326 return children; 10327 } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { 10328 current = null; 10329 return rawVNode; 10330 } 10331 let vnode = getInnerChild(rawVNode); 10332 const comp = vnode.type; 10333 const name = getComponentName( 10334 isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp 10335 ); 10336 const { include, exclude, max } = props; 10337 if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { 10338 current = vnode; 10339 return rawVNode; 10340 } 10341 const key = vnode.key == null ? comp : vnode.key; 10342 const cachedVNode = cache.get(key); 10343 if (vnode.el) { 10344 vnode = cloneVNode(vnode); 10345 if (rawVNode.shapeFlag & 128) { 10346 rawVNode.ssContent = vnode; 10347 } 10348 } 10349 pendingCacheKey = key; 10350 if (cachedVNode) { 10351 vnode.el = cachedVNode.el; 10352 vnode.component = cachedVNode.component; 10353 if (vnode.transition) { 10354 setTransitionHooks(vnode, vnode.transition); 10355 } 10356 vnode.shapeFlag |= 512; 10357 keys.delete(key); 10358 keys.add(key); 10359 } else { 10360 keys.add(key); 10361 if (max && keys.size > parseInt(max, 10)) { 10362 pruneCacheEntry(keys.values().next().value); 10363 } 10364 } 10365 vnode.shapeFlag |= 256; 10366 current = vnode; 10367 return isSuspense(rawVNode.type) ? rawVNode : vnode; 10368 }; 10369 } 10370}; 10371const KeepAlive = KeepAliveImpl; 10372function matches(pattern, name) { 10373 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(pattern)) { 10374 return pattern.some((p) => matches(p, name)); 10375 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(pattern)) { 10376 return pattern.split(",").includes(name); 10377 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isRegExp)(pattern)) { 10378 return pattern.test(name); 10379 } 10380 return false; 10381} 10382function onActivated(hook, target) { 10383 registerKeepAliveHook(hook, "a", target); 10384} 10385function onDeactivated(hook, target) { 10386 registerKeepAliveHook(hook, "da", target); 10387} 10388function registerKeepAliveHook(hook, type, target = currentInstance) { 10389 const wrappedHook = hook.__wdc || (hook.__wdc = () => { 10390 let current = target; 10391 while (current) { 10392 if (current.isDeactivated) { 10393 return; 10394 } 10395 current = current.parent; 10396 } 10397 return hook(); 10398 }); 10399 injectHook(type, wrappedHook, target); 10400 if (target) { 10401 let current = target.parent; 10402 while (current && current.parent) { 10403 if (isKeepAlive(current.parent.vnode)) { 10404 injectToKeepAliveRoot(wrappedHook, type, target, current); 10405 } 10406 current = current.parent; 10407 } 10408 } 10409} 10410function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { 10411 const injected = injectHook( 10412 type, 10413 hook, 10414 keepAliveRoot, 10415 true 10416 /* prepend */ 10417 ); 10418 onUnmounted(() => { 10419 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(keepAliveRoot[type], injected); 10420 }, target); 10421} 10422function resetShapeFlag(vnode) { 10423 vnode.shapeFlag &= ~256; 10424 vnode.shapeFlag &= ~512; 10425} 10426function getInnerChild(vnode) { 10427 return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; 10428} 10429 10430function injectHook(type, hook, target = currentInstance, prepend = false) { 10431 if (target) { 10432 const hooks = target[type] || (target[type] = []); 10433 const wrappedHook = hook.__weh || (hook.__weh = (...args) => { 10434 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 10435 const reset = setCurrentInstance(target); 10436 const res = callWithAsyncErrorHandling(hook, target, type, args); 10437 reset(); 10438 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 10439 return res; 10440 }); 10441 if (prepend) { 10442 hooks.unshift(wrappedHook); 10443 } else { 10444 hooks.push(wrappedHook); 10445 } 10446 return wrappedHook; 10447 } else if (true) { 10448 const apiName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(ErrorTypeStrings$1[type].replace(/ hook$/, "")); 10449 warn$1( 10450 `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` ) 10451 ); 10452 } 10453} 10454const createHook = (lifecycle) => (hook, target = currentInstance) => { 10455 if (!isInSSRComponentSetup || lifecycle === "sp") { 10456 injectHook(lifecycle, (...args) => hook(...args), target); 10457 } 10458}; 10459const onBeforeMount = createHook("bm"); 10460const onMounted = createHook("m"); 10461const onBeforeUpdate = createHook("bu"); 10462const onUpdated = createHook("u"); 10463const onBeforeUnmount = createHook("bum"); 10464const onUnmounted = createHook("um"); 10465const onServerPrefetch = createHook("sp"); 10466const onRenderTriggered = createHook( 10467 "rtg" 10468); 10469const onRenderTracked = createHook( 10470 "rtc" 10471); 10472function onErrorCaptured(hook, target = currentInstance) { 10473 injectHook("ec", hook, target); 10474} 10475 10476const COMPONENTS = "components"; 10477const DIRECTIVES = "directives"; 10478function resolveComponent(name, maybeSelfReference) { 10479 return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; 10480} 10481const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); 10482function resolveDynamicComponent(component) { 10483 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(component)) { 10484 return resolveAsset(COMPONENTS, component, false) || component; 10485 } else { 10486 return component || NULL_DYNAMIC_COMPONENT; 10487 } 10488} 10489function resolveDirective(name) { 10490 return resolveAsset(DIRECTIVES, name); 10491} 10492function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { 10493 const instance = currentRenderingInstance || currentInstance; 10494 if (instance) { 10495 const Component = instance.type; 10496 if (type === COMPONENTS) { 10497 const selfName = getComponentName( 10498 Component, 10499 false 10500 ); 10501 if (selfName && (selfName === name || selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name) || selfName === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)))) { 10502 return Component; 10503 } 10504 } 10505 const res = ( 10506 // local registration 10507 // check instance[type] first which is resolved for options API 10508 resolve(instance[type] || Component[type], name) || // global registration 10509 resolve(instance.appContext[type], name) 10510 ); 10511 if (!res && maybeSelfReference) { 10512 return Component; 10513 } 10514 if ( true && warnMissing && !res) { 10515 const extra = type === COMPONENTS ? ` 10516If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; 10517 warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); 10518 } 10519 return res; 10520 } else if (true) { 10521 warn$1( 10522 `resolve${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(type.slice(0, -1))} can only be used in render() or setup().` 10523 ); 10524 } 10525} 10526function resolve(registry, name) { 10527 return registry && (registry[name] || registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name)] || registry[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name))]); 10528} 10529 10530function renderList(source, renderItem, cache, index) { 10531 let ret; 10532 const cached = cache && cache[index]; 10533 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source)) { 10534 ret = new Array(source.length); 10535 for (let i = 0, l = source.length; i < l; i++) { 10536 ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); 10537 } 10538 } else if (typeof source === "number") { 10539 if ( true && !Number.isInteger(source)) { 10540 warn$1(`The v-for range expect an integer value but got ${source}.`); 10541 } 10542 ret = new Array(source); 10543 for (let i = 0; i < source; i++) { 10544 ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); 10545 } 10546 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(source)) { 10547 if (source[Symbol.iterator]) { 10548 ret = Array.from( 10549 source, 10550 (item, i) => renderItem(item, i, void 0, cached && cached[i]) 10551 ); 10552 } else { 10553 const keys = Object.keys(source); 10554 ret = new Array(keys.length); 10555 for (let i = 0, l = keys.length; i < l; i++) { 10556 const key = keys[i]; 10557 ret[i] = renderItem(source[key], key, i, cached && cached[i]); 10558 } 10559 } 10560 } else { 10561 ret = []; 10562 } 10563 if (cache) { 10564 cache[index] = ret; 10565 } 10566 return ret; 10567} 10568 10569function createSlots(slots, dynamicSlots) { 10570 for (let i = 0; i < dynamicSlots.length; i++) { 10571 const slot = dynamicSlots[i]; 10572 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(slot)) { 10573 for (let j = 0; j < slot.length; j++) { 10574 slots[slot[j].name] = slot[j].fn; 10575 } 10576 } else if (slot) { 10577 slots[slot.name] = slot.key ? (...args) => { 10578 const res = slot.fn(...args); 10579 if (res) res.key = slot.key; 10580 return res; 10581 } : slot.fn; 10582 } 10583 } 10584 return slots; 10585} 10586 10587function renderSlot(slots, name, props = {}, fallback, noSlotted) { 10588 if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { 10589 if (name !== "default") props.name = name; 10590 return createVNode("slot", props, fallback && fallback()); 10591 } 10592 let slot = slots[name]; 10593 if ( true && slot && slot.length > 1) { 10594 warn$1( 10595 `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.` 10596 ); 10597 slot = () => []; 10598 } 10599 if (slot && slot._c) { 10600 slot._d = false; 10601 } 10602 openBlock(); 10603 const validSlotContent = slot && ensureValidVNode(slot(props)); 10604 const rendered = createBlock( 10605 Fragment, 10606 { 10607 key: (props.key || // slot content array of a dynamic conditional slot may have a branch 10608 // key attached in the `createSlots` helper, respect that 10609 validSlotContent && validSlotContent.key || `_${name}`) + // #7256 force differentiate fallback content from actual content 10610 (!validSlotContent && fallback ? "_fb" : "") 10611 }, 10612 validSlotContent || (fallback ? fallback() : []), 10613 validSlotContent && slots._ === 1 ? 64 : -2 10614 ); 10615 if (!noSlotted && rendered.scopeId) { 10616 rendered.slotScopeIds = [rendered.scopeId + "-s"]; 10617 } 10618 if (slot && slot._c) { 10619 slot._d = true; 10620 } 10621 return rendered; 10622} 10623function ensureValidVNode(vnodes) { 10624 return vnodes.some((child) => { 10625 if (!isVNode(child)) return true; 10626 if (child.type === Comment) return false; 10627 if (child.type === Fragment && !ensureValidVNode(child.children)) 10628 return false; 10629 return true; 10630 }) ? vnodes : null; 10631} 10632 10633function toHandlers(obj, preserveCaseIfNecessary) { 10634 const ret = {}; 10635 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) { 10636 warn$1(`v-on with no argument expects an object value.`); 10637 return ret; 10638 } 10639 for (const key in obj) { 10640 ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(key)] = obj[key]; 10641 } 10642 return ret; 10643} 10644 10645const getPublicInstance = (i) => { 10646 if (!i) return null; 10647 if (isStatefulComponent(i)) return getComponentPublicInstance(i); 10648 return getPublicInstance(i.parent); 10649}; 10650const publicPropertiesMap = ( 10651 // Move PURE marker to new line to workaround compiler discarding it 10652 // due to type annotation 10653 /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), { 10654 $: (i) => i, 10655 $el: (i) => i.vnode.el, 10656 $data: (i) => i.data, 10657 $props: (i) => true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.props) : 0, 10658 $attrs: (i) => true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.attrs) : 0, 10659 $slots: (i) => true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.slots) : 0, 10660 $refs: (i) => true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(i.refs) : 0, 10661 $parent: (i) => getPublicInstance(i.parent), 10662 $root: (i) => getPublicInstance(i.root), 10663 $emit: (i) => i.emit, 10664 $options: (i) => true ? resolveMergedOptions(i) : 0, 10665 $forceUpdate: (i) => i.f || (i.f = () => { 10666 i.effect.dirty = true; 10667 queueJob(i.update); 10668 }), 10669 $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), 10670 $watch: (i) => true ? instanceWatch.bind(i) : 0 10671 }) 10672); 10673const isReservedPrefix = (key) => key === "_" || key === "$"; 10674const hasSetupBinding = (state, key) => state !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && !state.__isScriptSetup && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(state, key); 10675const PublicInstanceProxyHandlers = { 10676 get({ _: instance }, key) { 10677 if (key === "__v_skip") { 10678 return true; 10679 } 10680 const { ctx, setupState, data, props, accessCache, type, appContext } = instance; 10681 if ( true && key === "__isVue") { 10682 return true; 10683 } 10684 let normalizedProps; 10685 if (key[0] !== "$") { 10686 const n = accessCache[key]; 10687 if (n !== void 0) { 10688 switch (n) { 10689 case 1 /* SETUP */: 10690 return setupState[key]; 10691 case 2 /* DATA */: 10692 return data[key]; 10693 case 4 /* CONTEXT */: 10694 return ctx[key]; 10695 case 3 /* PROPS */: 10696 return props[key]; 10697 } 10698 } else if (hasSetupBinding(setupState, key)) { 10699 accessCache[key] = 1 /* SETUP */; 10700 return setupState[key]; 10701 } else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) { 10702 accessCache[key] = 2 /* DATA */; 10703 return data[key]; 10704 } else if ( 10705 // only cache other properties when instance has declared (thus stable) 10706 // props 10707 (normalizedProps = instance.propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key) 10708 ) { 10709 accessCache[key] = 3 /* PROPS */; 10710 return props[key]; 10711 } else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) { 10712 accessCache[key] = 4 /* CONTEXT */; 10713 return ctx[key]; 10714 } else if ( false || shouldCacheAccess) { 10715 accessCache[key] = 0 /* OTHER */; 10716 } 10717 } 10718 const publicGetter = publicPropertiesMap[key]; 10719 let cssModule, globalProperties; 10720 if (publicGetter) { 10721 if (key === "$attrs") { 10722 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance.attrs, "get", ""); 10723 true && markAttrsAccessed(); 10724 } else if ( true && key === "$slots") { 10725 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, "get", key); 10726 } 10727 return publicGetter(instance); 10728 } else if ( 10729 // css module (injected by vue-loader) 10730 (cssModule = type.__cssModules) && (cssModule = cssModule[key]) 10731 ) { 10732 return cssModule; 10733 } else if (ctx !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key)) { 10734 accessCache[key] = 4 /* CONTEXT */; 10735 return ctx[key]; 10736 } else if ( 10737 // global properties 10738 globalProperties = appContext.config.globalProperties, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(globalProperties, key) 10739 ) { 10740 { 10741 return globalProperties[key]; 10742 } 10743 } else if ( true && currentRenderingInstance && (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading 10744 // to infinite warning loop 10745 key.indexOf("__v") !== 0)) { 10746 if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && isReservedPrefix(key[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) { 10747 warn$1( 10748 `Property ${JSON.stringify( 10749 key 10750 )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` 10751 ); 10752 } else if (instance === currentRenderingInstance) { 10753 warn$1( 10754 `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` 10755 ); 10756 } 10757 } 10758 }, 10759 set({ _: instance }, key, value) { 10760 const { data, setupState, ctx } = instance; 10761 if (hasSetupBinding(setupState, key)) { 10762 setupState[key] = value; 10763 return true; 10764 } else if ( true && setupState.__isScriptSetup && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, key)) { 10765 warn$1(`Cannot mutate <script setup> binding "${key}" from Options API.`); 10766 return false; 10767 } else if (data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key)) { 10768 data[key] = value; 10769 return true; 10770 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(instance.props, key)) { 10771 true && warn$1(`Attempting to mutate prop "${key}". Props are readonly.`); 10772 return false; 10773 } 10774 if (key[0] === "$" && key.slice(1) in instance) { 10775 true && warn$1( 10776 `Attempting to mutate public property "${key}". Properties starting with $ are reserved and readonly.` 10777 ); 10778 return false; 10779 } else { 10780 if ( true && key in instance.appContext.config.globalProperties) { 10781 Object.defineProperty(ctx, key, { 10782 enumerable: true, 10783 configurable: true, 10784 value 10785 }); 10786 } else { 10787 ctx[key] = value; 10788 } 10789 } 10790 return true; 10791 }, 10792 has({ 10793 _: { data, setupState, accessCache, ctx, appContext, propsOptions } 10794 }, key) { 10795 let normalizedProps; 10796 return !!accessCache[key] || data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(normalizedProps, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(ctx, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(publicPropertiesMap, key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(appContext.config.globalProperties, key); 10797 }, 10798 defineProperty(target, key, descriptor) { 10799 if (descriptor.get != null) { 10800 target._.accessCache[key] = 0; 10801 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(descriptor, "value")) { 10802 this.set(target, key, descriptor.value, null); 10803 } 10804 return Reflect.defineProperty(target, key, descriptor); 10805 } 10806}; 10807if (true) { 10808 PublicInstanceProxyHandlers.ownKeys = (target) => { 10809 warn$1( 10810 `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.` 10811 ); 10812 return Reflect.ownKeys(target); 10813 }; 10814} 10815const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 10816 {}, 10817 PublicInstanceProxyHandlers, 10818 { 10819 get(target, key) { 10820 if (key === Symbol.unscopables) { 10821 return; 10822 } 10823 return PublicInstanceProxyHandlers.get(target, key, target); 10824 }, 10825 has(_, key) { 10826 const has = key[0] !== "_" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isGloballyAllowed)(key); 10827 if ( true && !has && PublicInstanceProxyHandlers.has(_, key)) { 10828 warn$1( 10829 `Property ${JSON.stringify( 10830 key 10831 )} should not start with _ which is a reserved prefix for Vue internals.` 10832 ); 10833 } 10834 return has; 10835 } 10836 } 10837); 10838function createDevRenderContext(instance) { 10839 const target = {}; 10840 Object.defineProperty(target, `_`, { 10841 configurable: true, 10842 enumerable: false, 10843 get: () => instance 10844 }); 10845 Object.keys(publicPropertiesMap).forEach((key) => { 10846 Object.defineProperty(target, key, { 10847 configurable: true, 10848 enumerable: false, 10849 get: () => publicPropertiesMap[key](instance), 10850 // intercepted by the proxy so no need for implementation, 10851 // but needed to prevent set errors 10852 set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP 10853 }); 10854 }); 10855 return target; 10856} 10857function exposePropsOnRenderContext(instance) { 10858 const { 10859 ctx, 10860 propsOptions: [propsOptions] 10861 } = instance; 10862 if (propsOptions) { 10863 Object.keys(propsOptions).forEach((key) => { 10864 Object.defineProperty(ctx, key, { 10865 enumerable: true, 10866 configurable: true, 10867 get: () => instance.props[key], 10868 set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP 10869 }); 10870 }); 10871 } 10872} 10873function exposeSetupStateOnRenderContext(instance) { 10874 const { ctx, setupState } = instance; 10875 Object.keys((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(setupState)).forEach((key) => { 10876 if (!setupState.__isScriptSetup) { 10877 if (isReservedPrefix(key[0])) { 10878 warn$1( 10879 `setup() return property ${JSON.stringify( 10880 key 10881 )} should not start with "$" or "_" which are reserved prefixes for Vue internals.` 10882 ); 10883 return; 10884 } 10885 Object.defineProperty(ctx, key, { 10886 enumerable: true, 10887 configurable: true, 10888 get: () => setupState[key], 10889 set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP 10890 }); 10891 } 10892 }); 10893} 10894 10895const warnRuntimeUsage = (method) => warn$1( 10896 `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.` 10897); 10898function defineProps() { 10899 if (true) { 10900 warnRuntimeUsage(`defineProps`); 10901 } 10902 return null; 10903} 10904function defineEmits() { 10905 if (true) { 10906 warnRuntimeUsage(`defineEmits`); 10907 } 10908 return null; 10909} 10910function defineExpose(exposed) { 10911 if (true) { 10912 warnRuntimeUsage(`defineExpose`); 10913 } 10914} 10915function defineOptions(options) { 10916 if (true) { 10917 warnRuntimeUsage(`defineOptions`); 10918 } 10919} 10920function defineSlots() { 10921 if (true) { 10922 warnRuntimeUsage(`defineSlots`); 10923 } 10924 return null; 10925} 10926function defineModel() { 10927 if (true) { 10928 warnRuntimeUsage("defineModel"); 10929 } 10930} 10931function withDefaults(props, defaults) { 10932 if (true) { 10933 warnRuntimeUsage(`withDefaults`); 10934 } 10935 return null; 10936} 10937function useSlots() { 10938 return getContext().slots; 10939} 10940function useAttrs() { 10941 return getContext().attrs; 10942} 10943function getContext() { 10944 const i = getCurrentInstance(); 10945 if ( true && !i) { 10946 warn$1(`useContext() called without active instance.`); 10947 } 10948 return i.setupContext || (i.setupContext = createSetupContext(i)); 10949} 10950function normalizePropsOrEmits(props) { 10951 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props) ? props.reduce( 10952 (normalized, p) => (normalized[p] = null, normalized), 10953 {} 10954 ) : props; 10955} 10956function mergeDefaults(raw, defaults) { 10957 const props = normalizePropsOrEmits(raw); 10958 for (const key in defaults) { 10959 if (key.startsWith("__skip")) continue; 10960 let opt = props[key]; 10961 if (opt) { 10962 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt)) { 10963 opt = props[key] = { type: opt, default: defaults[key] }; 10964 } else { 10965 opt.default = defaults[key]; 10966 } 10967 } else if (opt === null) { 10968 opt = props[key] = { default: defaults[key] }; 10969 } else if (true) { 10970 warn$1(`props default key "${key}" has no corresponding declaration.`); 10971 } 10972 if (opt && defaults[`__skip_${key}`]) { 10973 opt.skipFactory = true; 10974 } 10975 } 10976 return props; 10977} 10978function mergeModels(a, b) { 10979 if (!a || !b) return a || b; 10980 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(a) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(b)) return a.concat(b); 10981 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b)); 10982} 10983function createPropsRestProxy(props, excludedKeys) { 10984 const ret = {}; 10985 for (const key in props) { 10986 if (!excludedKeys.includes(key)) { 10987 Object.defineProperty(ret, key, { 10988 enumerable: true, 10989 get: () => props[key] 10990 }); 10991 } 10992 } 10993 return ret; 10994} 10995function withAsyncContext(getAwaitable) { 10996 const ctx = getCurrentInstance(); 10997 if ( true && !ctx) { 10998 warn$1( 10999 `withAsyncContext called without active current instance. This is likely a bug.` 11000 ); 11001 } 11002 let awaitable = getAwaitable(); 11003 unsetCurrentInstance(); 11004 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(awaitable)) { 11005 awaitable = awaitable.catch((e) => { 11006 setCurrentInstance(ctx); 11007 throw e; 11008 }); 11009 } 11010 return [awaitable, () => setCurrentInstance(ctx)]; 11011} 11012 11013function createDuplicateChecker() { 11014 const cache = /* @__PURE__ */ Object.create(null); 11015 return (type, key) => { 11016 if (cache[key]) { 11017 warn$1(`${type} property "${key}" is already defined in ${cache[key]}.`); 11018 } else { 11019 cache[key] = type; 11020 } 11021 }; 11022} 11023let shouldCacheAccess = true; 11024function applyOptions(instance) { 11025 const options = resolveMergedOptions(instance); 11026 const publicThis = instance.proxy; 11027 const ctx = instance.ctx; 11028 shouldCacheAccess = false; 11029 if (options.beforeCreate) { 11030 callHook(options.beforeCreate, instance, "bc"); 11031 } 11032 const { 11033 // state 11034 data: dataOptions, 11035 computed: computedOptions, 11036 methods, 11037 watch: watchOptions, 11038 provide: provideOptions, 11039 inject: injectOptions, 11040 // lifecycle 11041 created, 11042 beforeMount, 11043 mounted, 11044 beforeUpdate, 11045 updated, 11046 activated, 11047 deactivated, 11048 beforeDestroy, 11049 beforeUnmount, 11050 destroyed, 11051 unmounted, 11052 render, 11053 renderTracked, 11054 renderTriggered, 11055 errorCaptured, 11056 serverPrefetch, 11057 // public API 11058 expose, 11059 inheritAttrs, 11060 // assets 11061 components, 11062 directives, 11063 filters 11064 } = options; 11065 const checkDuplicateProperties = true ? createDuplicateChecker() : 0; 11066 if (true) { 11067 const [propsOptions] = instance.propsOptions; 11068 if (propsOptions) { 11069 for (const key in propsOptions) { 11070 checkDuplicateProperties("Props" /* PROPS */, key); 11071 } 11072 } 11073 } 11074 if (injectOptions) { 11075 resolveInjections(injectOptions, ctx, checkDuplicateProperties); 11076 } 11077 if (methods) { 11078 for (const key in methods) { 11079 const methodHandler = methods[key]; 11080 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(methodHandler)) { 11081 if (true) { 11082 Object.defineProperty(ctx, key, { 11083 value: methodHandler.bind(publicThis), 11084 configurable: true, 11085 enumerable: true, 11086 writable: true 11087 }); 11088 } else {} 11089 if (true) { 11090 checkDuplicateProperties("Methods" /* METHODS */, key); 11091 } 11092 } else if (true) { 11093 warn$1( 11094 `Method "${key}" has type "${typeof methodHandler}" in the component definition. Did you reference the function correctly?` 11095 ); 11096 } 11097 } 11098 } 11099 if (dataOptions) { 11100 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(dataOptions)) { 11101 warn$1( 11102 `The data option must be a function. Plain object usage is no longer supported.` 11103 ); 11104 } 11105 const data = dataOptions.call(publicThis, publicThis); 11106 if ( true && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(data)) { 11107 warn$1( 11108 `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.` 11109 ); 11110 } 11111 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(data)) { 11112 true && warn$1(`data() should return an object.`); 11113 } else { 11114 instance.data = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.reactive)(data); 11115 if (true) { 11116 for (const key in data) { 11117 checkDuplicateProperties("Data" /* DATA */, key); 11118 if (!isReservedPrefix(key[0])) { 11119 Object.defineProperty(ctx, key, { 11120 configurable: true, 11121 enumerable: true, 11122 get: () => data[key], 11123 set: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP 11124 }); 11125 } 11126 } 11127 } 11128 } 11129 } 11130 shouldCacheAccess = true; 11131 if (computedOptions) { 11132 for (const key in computedOptions) { 11133 const opt = computedOptions[key]; 11134 const get = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? opt.bind(publicThis, publicThis) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.get) ? opt.get.bind(publicThis, publicThis) : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 11135 if ( true && get === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) { 11136 warn$1(`Computed property "${key}" has no getter.`); 11137 } 11138 const set = !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt.set) ? opt.set.bind(publicThis) : true ? () => { 11139 warn$1( 11140 `Write operation failed: computed property "${key}" is readonly.` 11141 ); 11142 } : 0; 11143 const c = computed({ 11144 get, 11145 set 11146 }); 11147 Object.defineProperty(ctx, key, { 11148 enumerable: true, 11149 configurable: true, 11150 get: () => c.value, 11151 set: (v) => c.value = v 11152 }); 11153 if (true) { 11154 checkDuplicateProperties("Computed" /* COMPUTED */, key); 11155 } 11156 } 11157 } 11158 if (watchOptions) { 11159 for (const key in watchOptions) { 11160 createWatcher(watchOptions[key], ctx, publicThis, key); 11161 } 11162 } 11163 if (provideOptions) { 11164 const provides = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(provideOptions) ? provideOptions.call(publicThis) : provideOptions; 11165 Reflect.ownKeys(provides).forEach((key) => { 11166 provide(key, provides[key]); 11167 }); 11168 } 11169 if (created) { 11170 callHook(created, instance, "c"); 11171 } 11172 function registerLifecycleHook(register, hook) { 11173 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) { 11174 hook.forEach((_hook) => register(_hook.bind(publicThis))); 11175 } else if (hook) { 11176 register(hook.bind(publicThis)); 11177 } 11178 } 11179 registerLifecycleHook(onBeforeMount, beforeMount); 11180 registerLifecycleHook(onMounted, mounted); 11181 registerLifecycleHook(onBeforeUpdate, beforeUpdate); 11182 registerLifecycleHook(onUpdated, updated); 11183 registerLifecycleHook(onActivated, activated); 11184 registerLifecycleHook(onDeactivated, deactivated); 11185 registerLifecycleHook(onErrorCaptured, errorCaptured); 11186 registerLifecycleHook(onRenderTracked, renderTracked); 11187 registerLifecycleHook(onRenderTriggered, renderTriggered); 11188 registerLifecycleHook(onBeforeUnmount, beforeUnmount); 11189 registerLifecycleHook(onUnmounted, unmounted); 11190 registerLifecycleHook(onServerPrefetch, serverPrefetch); 11191 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expose)) { 11192 if (expose.length) { 11193 const exposed = instance.exposed || (instance.exposed = {}); 11194 expose.forEach((key) => { 11195 Object.defineProperty(exposed, key, { 11196 get: () => publicThis[key], 11197 set: (val) => publicThis[key] = val 11198 }); 11199 }); 11200 } else if (!instance.exposed) { 11201 instance.exposed = {}; 11202 } 11203 } 11204 if (render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) { 11205 instance.render = render; 11206 } 11207 if (inheritAttrs != null) { 11208 instance.inheritAttrs = inheritAttrs; 11209 } 11210 if (components) instance.components = components; 11211 if (directives) instance.directives = directives; 11212} 11213function resolveInjections(injectOptions, ctx, checkDuplicateProperties = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP) { 11214 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(injectOptions)) { 11215 injectOptions = normalizeInject(injectOptions); 11216 } 11217 for (const key in injectOptions) { 11218 const opt = injectOptions[key]; 11219 let injected; 11220 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opt)) { 11221 if ("default" in opt) { 11222 injected = inject( 11223 opt.from || key, 11224 opt.default, 11225 true 11226 ); 11227 } else { 11228 injected = inject(opt.from || key); 11229 } 11230 } else { 11231 injected = inject(opt); 11232 } 11233 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(injected)) { 11234 Object.defineProperty(ctx, key, { 11235 enumerable: true, 11236 configurable: true, 11237 get: () => injected.value, 11238 set: (v) => injected.value = v 11239 }); 11240 } else { 11241 ctx[key] = injected; 11242 } 11243 if (true) { 11244 checkDuplicateProperties("Inject" /* INJECT */, key); 11245 } 11246 } 11247} 11248function callHook(hook, instance, type) { 11249 callWithAsyncErrorHandling( 11250 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy), 11251 instance, 11252 type 11253 ); 11254} 11255function createWatcher(raw, ctx, publicThis, key) { 11256 const getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; 11257 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw)) { 11258 const handler = ctx[raw]; 11259 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) { 11260 watch(getter, handler); 11261 } else if (true) { 11262 warn$1(`Invalid watch handler specified by key "${raw}"`, handler); 11263 } 11264 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw)) { 11265 watch(getter, raw.bind(publicThis)); 11266 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) { 11267 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) { 11268 raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); 11269 } else { 11270 const handler = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; 11271 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(handler)) { 11272 watch(getter, handler, raw); 11273 } else if (true) { 11274 warn$1(`Invalid watch handler specified by key "${raw.handler}"`, handler); 11275 } 11276 } 11277 } else if (true) { 11278 warn$1(`Invalid watch option: "${key}"`, raw); 11279 } 11280} 11281function resolveMergedOptions(instance) { 11282 const base = instance.type; 11283 const { mixins, extends: extendsOptions } = base; 11284 const { 11285 mixins: globalMixins, 11286 optionsCache: cache, 11287 config: { optionMergeStrategies } 11288 } = instance.appContext; 11289 const cached = cache.get(base); 11290 let resolved; 11291 if (cached) { 11292 resolved = cached; 11293 } else if (!globalMixins.length && !mixins && !extendsOptions) { 11294 { 11295 resolved = base; 11296 } 11297 } else { 11298 resolved = {}; 11299 if (globalMixins.length) { 11300 globalMixins.forEach( 11301 (m) => mergeOptions(resolved, m, optionMergeStrategies, true) 11302 ); 11303 } 11304 mergeOptions(resolved, base, optionMergeStrategies); 11305 } 11306 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(base)) { 11307 cache.set(base, resolved); 11308 } 11309 return resolved; 11310} 11311function mergeOptions(to, from, strats, asMixin = false) { 11312 const { mixins, extends: extendsOptions } = from; 11313 if (extendsOptions) { 11314 mergeOptions(to, extendsOptions, strats, true); 11315 } 11316 if (mixins) { 11317 mixins.forEach( 11318 (m) => mergeOptions(to, m, strats, true) 11319 ); 11320 } 11321 for (const key in from) { 11322 if (asMixin && key === "expose") { 11323 true && warn$1( 11324 `"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.` 11325 ); 11326 } else { 11327 const strat = internalOptionMergeStrats[key] || strats && strats[key]; 11328 to[key] = strat ? strat(to[key], from[key]) : from[key]; 11329 } 11330 } 11331 return to; 11332} 11333const internalOptionMergeStrats = { 11334 data: mergeDataFn, 11335 props: mergeEmitsOrPropsOptions, 11336 emits: mergeEmitsOrPropsOptions, 11337 // objects 11338 methods: mergeObjectOptions, 11339 computed: mergeObjectOptions, 11340 // lifecycle 11341 beforeCreate: mergeAsArray, 11342 created: mergeAsArray, 11343 beforeMount: mergeAsArray, 11344 mounted: mergeAsArray, 11345 beforeUpdate: mergeAsArray, 11346 updated: mergeAsArray, 11347 beforeDestroy: mergeAsArray, 11348 beforeUnmount: mergeAsArray, 11349 destroyed: mergeAsArray, 11350 unmounted: mergeAsArray, 11351 activated: mergeAsArray, 11352 deactivated: mergeAsArray, 11353 errorCaptured: mergeAsArray, 11354 serverPrefetch: mergeAsArray, 11355 // assets 11356 components: mergeObjectOptions, 11357 directives: mergeObjectOptions, 11358 // watch 11359 watch: mergeWatchOptions, 11360 // provide / inject 11361 provide: mergeDataFn, 11362 inject: mergeInject 11363}; 11364function mergeDataFn(to, from) { 11365 if (!from) { 11366 return to; 11367 } 11368 if (!to) { 11369 return from; 11370 } 11371 return function mergedDataFn() { 11372 return ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend))( 11373 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(to) ? to.call(this, this) : to, 11374 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(from) ? from.call(this, this) : from 11375 ); 11376 }; 11377} 11378function mergeInject(to, from) { 11379 return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); 11380} 11381function normalizeInject(raw) { 11382 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) { 11383 const res = {}; 11384 for (let i = 0; i < raw.length; i++) { 11385 res[raw[i]] = raw[i]; 11386 } 11387 return res; 11388 } 11389 return raw; 11390} 11391function mergeAsArray(to, from) { 11392 return to ? [...new Set([].concat(to, from))] : from; 11393} 11394function mergeObjectOptions(to, from) { 11395 return to ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), to, from) : from; 11396} 11397function mergeEmitsOrPropsOptions(to, from) { 11398 if (to) { 11399 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(to) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(from)) { 11400 return [.../* @__PURE__ */ new Set([...to, ...from])]; 11401 } 11402 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 11403 /* @__PURE__ */ Object.create(null), 11404 normalizePropsOrEmits(to), 11405 normalizePropsOrEmits(from != null ? from : {}) 11406 ); 11407 } else { 11408 return from; 11409 } 11410} 11411function mergeWatchOptions(to, from) { 11412 if (!to) return from; 11413 if (!from) return to; 11414 const merged = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(/* @__PURE__ */ Object.create(null), to); 11415 for (const key in from) { 11416 merged[key] = mergeAsArray(to[key], from[key]); 11417 } 11418 return merged; 11419} 11420 11421function createAppContext() { 11422 return { 11423 app: null, 11424 config: { 11425 isNativeTag: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NO, 11426 performance: false, 11427 globalProperties: {}, 11428 optionMergeStrategies: {}, 11429 errorHandler: void 0, 11430 warnHandler: void 0, 11431 compilerOptions: {} 11432 }, 11433 mixins: [], 11434 components: {}, 11435 directives: {}, 11436 provides: /* @__PURE__ */ Object.create(null), 11437 optionsCache: /* @__PURE__ */ new WeakMap(), 11438 propsCache: /* @__PURE__ */ new WeakMap(), 11439 emitsCache: /* @__PURE__ */ new WeakMap() 11440 }; 11441} 11442let uid$1 = 0; 11443function createAppAPI(render, hydrate) { 11444 return function createApp(rootComponent, rootProps = null) { 11445 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(rootComponent)) { 11446 rootComponent = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, rootComponent); 11447 } 11448 if (rootProps != null && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(rootProps)) { 11449 true && warn$1(`root props passed to app.mount() must be an object.`); 11450 rootProps = null; 11451 } 11452 const context = createAppContext(); 11453 const installedPlugins = /* @__PURE__ */ new WeakSet(); 11454 let isMounted = false; 11455 const app = context.app = { 11456 _uid: uid$1++, 11457 _component: rootComponent, 11458 _props: rootProps, 11459 _container: null, 11460 _context: context, 11461 _instance: null, 11462 version, 11463 get config() { 11464 return context.config; 11465 }, 11466 set config(v) { 11467 if (true) { 11468 warn$1( 11469 `app.config cannot be replaced. Modify individual options instead.` 11470 ); 11471 } 11472 }, 11473 use(plugin, ...options) { 11474 if (installedPlugins.has(plugin)) { 11475 true && warn$1(`Plugin has already been applied to target app.`); 11476 } else if (plugin && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin.install)) { 11477 installedPlugins.add(plugin); 11478 plugin.install(app, ...options); 11479 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(plugin)) { 11480 installedPlugins.add(plugin); 11481 plugin(app, ...options); 11482 } else if (true) { 11483 warn$1( 11484 `A plugin must either be a function or an object with an "install" function.` 11485 ); 11486 } 11487 return app; 11488 }, 11489 mixin(mixin) { 11490 if (true) { 11491 if (!context.mixins.includes(mixin)) { 11492 context.mixins.push(mixin); 11493 } else if (true) { 11494 warn$1( 11495 "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "") 11496 ); 11497 } 11498 } else {} 11499 return app; 11500 }, 11501 component(name, component) { 11502 if (true) { 11503 validateComponentName(name, context.config); 11504 } 11505 if (!component) { 11506 return context.components[name]; 11507 } 11508 if ( true && context.components[name]) { 11509 warn$1(`Component "${name}" has already been registered in target app.`); 11510 } 11511 context.components[name] = component; 11512 return app; 11513 }, 11514 directive(name, directive) { 11515 if (true) { 11516 validateDirectiveName(name); 11517 } 11518 if (!directive) { 11519 return context.directives[name]; 11520 } 11521 if ( true && context.directives[name]) { 11522 warn$1(`Directive "${name}" has already been registered in target app.`); 11523 } 11524 context.directives[name] = directive; 11525 return app; 11526 }, 11527 mount(rootContainer, isHydrate, namespace) { 11528 if (!isMounted) { 11529 if ( true && rootContainer.__vue_app__) { 11530 warn$1( 11531 `There is already an app instance mounted on the host container. 11532 If you want to mount another app on the same host container, you need to unmount the previous app by calling \`app.unmount()\` first.` 11533 ); 11534 } 11535 const vnode = createVNode(rootComponent, rootProps); 11536 vnode.appContext = context; 11537 if (namespace === true) { 11538 namespace = "svg"; 11539 } else if (namespace === false) { 11540 namespace = void 0; 11541 } 11542 if (true) { 11543 context.reload = () => { 11544 render( 11545 cloneVNode(vnode), 11546 rootContainer, 11547 namespace 11548 ); 11549 }; 11550 } 11551 if (isHydrate && hydrate) { 11552 hydrate(vnode, rootContainer); 11553 } else { 11554 render(vnode, rootContainer, namespace); 11555 } 11556 isMounted = true; 11557 app._container = rootContainer; 11558 rootContainer.__vue_app__ = app; 11559 if (true) { 11560 app._instance = vnode.component; 11561 devtoolsInitApp(app, version); 11562 } 11563 return getComponentPublicInstance(vnode.component); 11564 } else if (true) { 11565 warn$1( 11566 `App has already been mounted. 11567If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \`const createMyApp = () => createApp(App)\`` 11568 ); 11569 } 11570 }, 11571 unmount() { 11572 if (isMounted) { 11573 render(null, app._container); 11574 if (true) { 11575 app._instance = null; 11576 devtoolsUnmountApp(app); 11577 } 11578 delete app._container.__vue_app__; 11579 } else if (true) { 11580 warn$1(`Cannot unmount an app that is not mounted.`); 11581 } 11582 }, 11583 provide(key, value) { 11584 if ( true && key in context.provides) { 11585 warn$1( 11586 `App already provides property with key "${String(key)}". It will be overwritten with the new value.` 11587 ); 11588 } 11589 context.provides[key] = value; 11590 return app; 11591 }, 11592 runWithContext(fn) { 11593 const lastApp = currentApp; 11594 currentApp = app; 11595 try { 11596 return fn(); 11597 } finally { 11598 currentApp = lastApp; 11599 } 11600 } 11601 }; 11602 return app; 11603 }; 11604} 11605let currentApp = null; 11606 11607function provide(key, value) { 11608 if (!currentInstance) { 11609 if (true) { 11610 warn$1(`provide() can only be used inside setup().`); 11611 } 11612 } else { 11613 let provides = currentInstance.provides; 11614 const parentProvides = currentInstance.parent && currentInstance.parent.provides; 11615 if (parentProvides === provides) { 11616 provides = currentInstance.provides = Object.create(parentProvides); 11617 } 11618 provides[key] = value; 11619 } 11620} 11621function inject(key, defaultValue, treatDefaultAsFactory = false) { 11622 const instance = currentInstance || currentRenderingInstance; 11623 if (instance || currentApp) { 11624 const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides; 11625 if (provides && key in provides) { 11626 return provides[key]; 11627 } else if (arguments.length > 1) { 11628 return treatDefaultAsFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; 11629 } else if (true) { 11630 warn$1(`injection "${String(key)}" not found.`); 11631 } 11632 } else if (true) { 11633 warn$1(`inject() can only be used inside setup() or functional components.`); 11634 } 11635} 11636function hasInjectionContext() { 11637 return !!(currentInstance || currentRenderingInstance || currentApp); 11638} 11639 11640const internalObjectProto = {}; 11641const createInternalObject = () => Object.create(internalObjectProto); 11642const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; 11643 11644function initProps(instance, rawProps, isStateful, isSSR = false) { 11645 const props = {}; 11646 const attrs = createInternalObject(); 11647 instance.propsDefaults = /* @__PURE__ */ Object.create(null); 11648 setFullProps(instance, rawProps, props, attrs); 11649 for (const key in instance.propsOptions[0]) { 11650 if (!(key in props)) { 11651 props[key] = void 0; 11652 } 11653 } 11654 if (true) { 11655 validateProps(rawProps || {}, props, instance); 11656 } 11657 if (isStateful) { 11658 instance.props = isSSR ? props : (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReactive)(props); 11659 } else { 11660 if (!instance.type.props) { 11661 instance.props = attrs; 11662 } else { 11663 instance.props = props; 11664 } 11665 } 11666 instance.attrs = attrs; 11667} 11668function isInHmrContext(instance) { 11669 while (instance) { 11670 if (instance.type.__hmrId) return true; 11671 instance = instance.parent; 11672 } 11673} 11674function updateProps(instance, rawProps, rawPrevProps, optimized) { 11675 const { 11676 props, 11677 attrs, 11678 vnode: { patchFlag } 11679 } = instance; 11680 const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props); 11681 const [options] = instance.propsOptions; 11682 let hasAttrsChanged = false; 11683 if ( 11684 // always force full diff in dev 11685 // - #1942 if hmr is enabled with sfc component 11686 // - vite#872 non-sfc component used by sfc component 11687 !( true && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16) 11688 ) { 11689 if (patchFlag & 8) { 11690 const propsToUpdate = instance.vnode.dynamicProps; 11691 for (let i = 0; i < propsToUpdate.length; i++) { 11692 let key = propsToUpdate[i]; 11693 if (isEmitListener(instance.emitsOptions, key)) { 11694 continue; 11695 } 11696 const value = rawProps[key]; 11697 if (options) { 11698 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(attrs, key)) { 11699 if (value !== attrs[key]) { 11700 attrs[key] = value; 11701 hasAttrsChanged = true; 11702 } 11703 } else { 11704 const camelizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key); 11705 props[camelizedKey] = resolvePropValue( 11706 options, 11707 rawCurrentProps, 11708 camelizedKey, 11709 value, 11710 instance, 11711 false 11712 ); 11713 } 11714 } else { 11715 if (value !== attrs[key]) { 11716 attrs[key] = value; 11717 hasAttrsChanged = true; 11718 } 11719 } 11720 } 11721 } 11722 } else { 11723 if (setFullProps(instance, rawProps, props, attrs)) { 11724 hasAttrsChanged = true; 11725 } 11726 let kebabKey; 11727 for (const key in rawCurrentProps) { 11728 if (!rawProps || // for camelCase 11729 !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && // it's possible the original props was passed in as kebab-case 11730 // and converted to camelCase (#955) 11731 ((kebabKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) === key || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, kebabKey))) { 11732 if (options) { 11733 if (rawPrevProps && // for camelCase 11734 (rawPrevProps[key] !== void 0 || // for kebab-case 11735 rawPrevProps[kebabKey] !== void 0)) { 11736 props[key] = resolvePropValue( 11737 options, 11738 rawCurrentProps, 11739 key, 11740 void 0, 11741 instance, 11742 true 11743 ); 11744 } 11745 } else { 11746 delete props[key]; 11747 } 11748 } 11749 } 11750 if (attrs !== rawCurrentProps) { 11751 for (const key in attrs) { 11752 if (!rawProps || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && true) { 11753 delete attrs[key]; 11754 hasAttrsChanged = true; 11755 } 11756 } 11757 } 11758 } 11759 if (hasAttrsChanged) { 11760 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance.attrs, "set", ""); 11761 } 11762 if (true) { 11763 validateProps(rawProps || {}, props, instance); 11764 } 11765} 11766function setFullProps(instance, rawProps, props, attrs) { 11767 const [options, needCastKeys] = instance.propsOptions; 11768 let hasAttrsChanged = false; 11769 let rawCastValues; 11770 if (rawProps) { 11771 for (let key in rawProps) { 11772 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) { 11773 continue; 11774 } 11775 const value = rawProps[key]; 11776 let camelKey; 11777 if (options && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key))) { 11778 if (!needCastKeys || !needCastKeys.includes(camelKey)) { 11779 props[camelKey] = value; 11780 } else { 11781 (rawCastValues || (rawCastValues = {}))[camelKey] = value; 11782 } 11783 } else if (!isEmitListener(instance.emitsOptions, key)) { 11784 if (!(key in attrs) || value !== attrs[key]) { 11785 attrs[key] = value; 11786 hasAttrsChanged = true; 11787 } 11788 } 11789 } 11790 } 11791 if (needCastKeys) { 11792 const rawCurrentProps = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props); 11793 const castValues = rawCastValues || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 11794 for (let i = 0; i < needCastKeys.length; i++) { 11795 const key = needCastKeys[i]; 11796 props[key] = resolvePropValue( 11797 options, 11798 rawCurrentProps, 11799 key, 11800 castValues[key], 11801 instance, 11802 !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(castValues, key) 11803 ); 11804 } 11805 } 11806 return hasAttrsChanged; 11807} 11808function resolvePropValue(options, props, key, value, instance, isAbsent) { 11809 const opt = options[key]; 11810 if (opt != null) { 11811 const hasDefault = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(opt, "default"); 11812 if (hasDefault && value === void 0) { 11813 const defaultValue = opt.default; 11814 if (opt.type !== Function && !opt.skipFactory && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(defaultValue)) { 11815 const { propsDefaults } = instance; 11816 if (key in propsDefaults) { 11817 value = propsDefaults[key]; 11818 } else { 11819 const reset = setCurrentInstance(instance); 11820 value = propsDefaults[key] = defaultValue.call( 11821 null, 11822 props 11823 ); 11824 reset(); 11825 } 11826 } else { 11827 value = defaultValue; 11828 } 11829 } 11830 if (opt[0 /* shouldCast */]) { 11831 if (isAbsent && !hasDefault) { 11832 value = false; 11833 } else if (opt[1 /* shouldCastTrue */] && (value === "" || value === (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key))) { 11834 value = true; 11835 } 11836 } 11837 } 11838 return value; 11839} 11840const mixinPropsCache = /* @__PURE__ */ new WeakMap(); 11841function normalizePropsOptions(comp, appContext, asMixin = false) { 11842 const cache = true && asMixin ? mixinPropsCache : appContext.propsCache; 11843 const cached = cache.get(comp); 11844 if (cached) { 11845 return cached; 11846 } 11847 const raw = comp.props; 11848 const normalized = {}; 11849 const needCastKeys = []; 11850 let hasExtends = false; 11851 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) { 11852 const extendProps = (raw2) => { 11853 hasExtends = true; 11854 const [props, keys] = normalizePropsOptions(raw2, appContext, true); 11855 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, props); 11856 if (keys) needCastKeys.push(...keys); 11857 }; 11858 if (!asMixin && appContext.mixins.length) { 11859 appContext.mixins.forEach(extendProps); 11860 } 11861 if (comp.extends) { 11862 extendProps(comp.extends); 11863 } 11864 if (comp.mixins) { 11865 comp.mixins.forEach(extendProps); 11866 } 11867 } 11868 if (!raw && !hasExtends) { 11869 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) { 11870 cache.set(comp, _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR); 11871 } 11872 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR; 11873 } 11874 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) { 11875 for (let i = 0; i < raw.length; i++) { 11876 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(raw[i])) { 11877 warn$1(`props must be strings when using array syntax.`, raw[i]); 11878 } 11879 const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(raw[i]); 11880 if (validatePropName(normalizedKey)) { 11881 normalized[normalizedKey] = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 11882 } 11883 } 11884 } else if (raw) { 11885 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(raw)) { 11886 warn$1(`invalid props options`, raw); 11887 } 11888 for (const key in raw) { 11889 const normalizedKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key); 11890 if (validatePropName(normalizedKey)) { 11891 const opt = raw[key]; 11892 const prop = normalized[normalizedKey] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opt) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(opt) ? { type: opt } : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, opt); 11893 if (prop) { 11894 const booleanIndex = getTypeIndex(Boolean, prop.type); 11895 const stringIndex = getTypeIndex(String, prop.type); 11896 prop[0 /* shouldCast */] = booleanIndex > -1; 11897 prop[1 /* shouldCastTrue */] = stringIndex < 0 || booleanIndex < stringIndex; 11898 if (booleanIndex > -1 || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(prop, "default")) { 11899 needCastKeys.push(normalizedKey); 11900 } 11901 } 11902 } 11903 } 11904 } 11905 const res = [normalized, needCastKeys]; 11906 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) { 11907 cache.set(comp, res); 11908 } 11909 return res; 11910} 11911function validatePropName(key) { 11912 if (key[0] !== "$" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) { 11913 return true; 11914 } else if (true) { 11915 warn$1(`Invalid prop name: "${key}" is a reserved property.`); 11916 } 11917 return false; 11918} 11919function getType(ctor) { 11920 if (ctor === null) { 11921 return "null"; 11922 } 11923 if (typeof ctor === "function") { 11924 return ctor.name || ""; 11925 } else if (typeof ctor === "object") { 11926 const name = ctor.constructor && ctor.constructor.name; 11927 return name || ""; 11928 } 11929 return ""; 11930} 11931function isSameType(a, b) { 11932 return getType(a) === getType(b); 11933} 11934function getTypeIndex(type, expectedTypes) { 11935 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(expectedTypes)) { 11936 return expectedTypes.findIndex((t) => isSameType(t, type)); 11937 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(expectedTypes)) { 11938 return isSameType(expectedTypes, type) ? 0 : -1; 11939 } 11940 return -1; 11941} 11942function validateProps(rawProps, props, instance) { 11943 const resolvedValues = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(props); 11944 const options = instance.propsOptions[0]; 11945 for (const key in options) { 11946 let opt = options[key]; 11947 if (opt == null) continue; 11948 validateProp( 11949 key, 11950 resolvedValues[key], 11951 opt, 11952 true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(resolvedValues) : 0, 11953 !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(rawProps, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) 11954 ); 11955 } 11956} 11957function validateProp(name, value, prop, props, isAbsent) { 11958 const { type, required, validator, skipCheck } = prop; 11959 if (required && isAbsent) { 11960 warn$1('Missing required prop: "' + name + '"'); 11961 return; 11962 } 11963 if (value == null && !required) { 11964 return; 11965 } 11966 if (type != null && type !== true && !skipCheck) { 11967 let isValid = false; 11968 const types = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(type) ? type : [type]; 11969 const expectedTypes = []; 11970 for (let i = 0; i < types.length && !isValid; i++) { 11971 const { valid, expectedType } = assertType(value, types[i]); 11972 expectedTypes.push(expectedType || ""); 11973 isValid = valid; 11974 } 11975 if (!isValid) { 11976 warn$1(getInvalidTypeMessage(name, value, expectedTypes)); 11977 return; 11978 } 11979 } 11980 if (validator && !validator(value, props)) { 11981 warn$1('Invalid prop: custom validator check failed for prop "' + name + '".'); 11982 } 11983} 11984const isSimpleType = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)( 11985 "String,Number,Boolean,Function,Symbol,BigInt" 11986); 11987function assertType(value, type) { 11988 let valid; 11989 const expectedType = getType(type); 11990 if (isSimpleType(expectedType)) { 11991 const t = typeof value; 11992 valid = t === expectedType.toLowerCase(); 11993 if (!valid && t === "object") { 11994 valid = value instanceof type; 11995 } 11996 } else if (expectedType === "Object") { 11997 valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value); 11998 } else if (expectedType === "Array") { 11999 valid = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value); 12000 } else if (expectedType === "null") { 12001 valid = value === null; 12002 } else { 12003 valid = value instanceof type; 12004 } 12005 return { 12006 valid, 12007 expectedType 12008 }; 12009} 12010function getInvalidTypeMessage(name, value, expectedTypes) { 12011 if (expectedTypes.length === 0) { 12012 return `Prop type [] for prop "${name}" won't match anything. Did you mean to use type Array instead?`; 12013 } 12014 let message = `Invalid prop: type check failed for prop "${name}". Expected ${expectedTypes.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize).join(" | ")}`; 12015 const expectedType = expectedTypes[0]; 12016 const receivedType = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toRawType)(value); 12017 const expectedValue = styleValue(value, expectedType); 12018 const receivedValue = styleValue(value, receivedType); 12019 if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) { 12020 message += ` with value ${expectedValue}`; 12021 } 12022 message += `, got ${receivedType} `; 12023 if (isExplicable(receivedType)) { 12024 message += `with value ${receivedValue}.`; 12025 } 12026 return message; 12027} 12028function styleValue(value, type) { 12029 if (type === "String") { 12030 return `"${value}"`; 12031 } else if (type === "Number") { 12032 return `${Number(value)}`; 12033 } else { 12034 return `${value}`; 12035 } 12036} 12037function isExplicable(type) { 12038 const explicitTypes = ["string", "number", "boolean"]; 12039 return explicitTypes.some((elem) => type.toLowerCase() === elem); 12040} 12041function isBoolean(...args) { 12042 return args.some((elem) => elem.toLowerCase() === "boolean"); 12043} 12044 12045const isInternalKey = (key) => key[0] === "_" || key === "$stable"; 12046const normalizeSlotValue = (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; 12047const normalizeSlot = (key, rawSlot, ctx) => { 12048 if (rawSlot._n) { 12049 return rawSlot; 12050 } 12051 const normalized = withCtx((...args) => { 12052 if ( true && currentInstance && (!ctx || ctx.root === currentInstance.root)) { 12053 warn$1( 12054 `Slot "${key}" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.` 12055 ); 12056 } 12057 return normalizeSlotValue(rawSlot(...args)); 12058 }, ctx); 12059 normalized._c = false; 12060 return normalized; 12061}; 12062const normalizeObjectSlots = (rawSlots, slots, instance) => { 12063 const ctx = rawSlots._ctx; 12064 for (const key in rawSlots) { 12065 if (isInternalKey(key)) continue; 12066 const value = rawSlots[key]; 12067 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) { 12068 slots[key] = normalizeSlot(key, value, ctx); 12069 } else if (value != null) { 12070 if (true) { 12071 warn$1( 12072 `Non-function value encountered for slot "${key}". Prefer function slots for better performance.` 12073 ); 12074 } 12075 const normalized = normalizeSlotValue(value); 12076 slots[key] = () => normalized; 12077 } 12078 } 12079}; 12080const normalizeVNodeSlots = (instance, children) => { 12081 if ( true && !isKeepAlive(instance.vnode) && true) { 12082 warn$1( 12083 `Non-function value encountered for default slot. Prefer function slots for better performance.` 12084 ); 12085 } 12086 const normalized = normalizeSlotValue(children); 12087 instance.slots.default = () => normalized; 12088}; 12089const assignSlots = (slots, children, optimized) => { 12090 for (const key in children) { 12091 if (optimized || key !== "_") { 12092 slots[key] = children[key]; 12093 } 12094 } 12095}; 12096const initSlots = (instance, children, optimized) => { 12097 const slots = instance.slots = createInternalObject(); 12098 if (instance.vnode.shapeFlag & 32) { 12099 const type = children._; 12100 if (type) { 12101 assignSlots(slots, children, optimized); 12102 if (optimized) { 12103 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(slots, "_", type, true); 12104 } 12105 } else { 12106 normalizeObjectSlots(children, slots); 12107 } 12108 } else if (children) { 12109 normalizeVNodeSlots(instance, children); 12110 } 12111}; 12112const updateSlots = (instance, children, optimized) => { 12113 const { vnode, slots } = instance; 12114 let needDeletionCheck = true; 12115 let deletionComparisonTarget = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 12116 if (vnode.shapeFlag & 32) { 12117 const type = children._; 12118 if (type) { 12119 if ( true && isHmrUpdating) { 12120 assignSlots(slots, children, optimized); 12121 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.trigger)(instance, "set", "$slots"); 12122 } else if (optimized && type === 1) { 12123 needDeletionCheck = false; 12124 } else { 12125 assignSlots(slots, children, optimized); 12126 } 12127 } else { 12128 needDeletionCheck = !children.$stable; 12129 normalizeObjectSlots(children, slots); 12130 } 12131 deletionComparisonTarget = children; 12132 } else if (children) { 12133 normalizeVNodeSlots(instance, children); 12134 deletionComparisonTarget = { default: 1 }; 12135 } 12136 if (needDeletionCheck) { 12137 for (const key in slots) { 12138 if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { 12139 delete slots[key]; 12140 } 12141 } 12142 } 12143}; 12144 12145function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { 12146 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(rawRef)) { 12147 rawRef.forEach( 12148 (r, i) => setRef( 12149 r, 12150 oldRawRef && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(oldRawRef) ? oldRawRef[i] : oldRawRef), 12151 parentSuspense, 12152 vnode, 12153 isUnmount 12154 ) 12155 ); 12156 return; 12157 } 12158 if (isAsyncWrapper(vnode) && !isUnmount) { 12159 return; 12160 } 12161 const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; 12162 const value = isUnmount ? null : refValue; 12163 const { i: owner, r: ref } = rawRef; 12164 if ( true && !owner) { 12165 warn$1( 12166 `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.` 12167 ); 12168 return; 12169 } 12170 const oldRef = oldRawRef && oldRawRef.r; 12171 const refs = owner.refs === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ ? owner.refs = {} : owner.refs; 12172 const setupState = owner.setupState; 12173 if (oldRef != null && oldRef !== ref) { 12174 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(oldRef)) { 12175 refs[oldRef] = null; 12176 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, oldRef)) { 12177 setupState[oldRef] = null; 12178 } 12179 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(oldRef)) { 12180 oldRef.value = null; 12181 } 12182 } 12183 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref)) { 12184 callWithErrorHandling(ref, owner, 12, [value, refs]); 12185 } else { 12186 const _isString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref); 12187 const _isRef = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref); 12188 if (_isString || _isRef) { 12189 const doSet = () => { 12190 if (rawRef.f) { 12191 const existing = _isString ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref) ? setupState[ref] : refs[ref] : ref.value; 12192 if (isUnmount) { 12193 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(existing, refValue); 12194 } else { 12195 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing)) { 12196 if (_isString) { 12197 refs[ref] = [refValue]; 12198 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) { 12199 setupState[ref] = refs[ref]; 12200 } 12201 } else { 12202 ref.value = [refValue]; 12203 if (rawRef.k) refs[rawRef.k] = ref.value; 12204 } 12205 } else if (!existing.includes(refValue)) { 12206 existing.push(refValue); 12207 } 12208 } 12209 } else if (_isString) { 12210 refs[ref] = value; 12211 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(setupState, ref)) { 12212 setupState[ref] = value; 12213 } 12214 } else if (_isRef) { 12215 ref.value = value; 12216 if (rawRef.k) refs[rawRef.k] = value; 12217 } else if (true) { 12218 warn$1("Invalid template ref type:", ref, `(${typeof ref})`); 12219 } 12220 }; 12221 if (value) { 12222 doSet.id = -1; 12223 queuePostRenderEffect(doSet, parentSuspense); 12224 } else { 12225 doSet(); 12226 } 12227 } else if (true) { 12228 warn$1("Invalid template ref type:", ref, `(${typeof ref})`); 12229 } 12230 } 12231} 12232 12233const TeleportEndKey = Symbol("_vte"); 12234const isTeleport = (type) => type.__isTeleport; 12235const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === ""); 12236const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement; 12237const isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement; 12238const resolveTarget = (props, select) => { 12239 const targetSelector = props && props.to; 12240 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(targetSelector)) { 12241 if (!select) { 12242 true && warn$1( 12243 `Current renderer does not support string target for Teleports. (missing querySelector renderer option)` 12244 ); 12245 return null; 12246 } else { 12247 const target = select(targetSelector); 12248 if ( true && !target && !isTeleportDisabled(props)) { 12249 warn$1( 12250 `Failed to locate Teleport target with selector "${targetSelector}". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.` 12251 ); 12252 } 12253 return target; 12254 } 12255 } else { 12256 if ( true && !targetSelector && !isTeleportDisabled(props)) { 12257 warn$1(`Invalid Teleport target: ${targetSelector}`); 12258 } 12259 return targetSelector; 12260 } 12261}; 12262const TeleportImpl = { 12263 name: "Teleport", 12264 __isTeleport: true, 12265 process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) { 12266 const { 12267 mc: mountChildren, 12268 pc: patchChildren, 12269 pbc: patchBlockChildren, 12270 o: { insert, querySelector, createText, createComment } 12271 } = internals; 12272 const disabled = isTeleportDisabled(n2.props); 12273 let { shapeFlag, children, dynamicChildren } = n2; 12274 if ( true && isHmrUpdating) { 12275 optimized = false; 12276 dynamicChildren = null; 12277 } 12278 if (n1 == null) { 12279 const placeholder = n2.el = true ? createComment("teleport start") : 0; 12280 const mainAnchor = n2.anchor = true ? createComment("teleport end") : 0; 12281 const target = n2.target = resolveTarget(n2.props, querySelector); 12282 const targetStart = n2.targetStart = createText(""); 12283 const targetAnchor = n2.targetAnchor = createText(""); 12284 insert(placeholder, container, anchor); 12285 insert(mainAnchor, container, anchor); 12286 targetStart[TeleportEndKey] = targetAnchor; 12287 if (target) { 12288 insert(targetStart, target); 12289 insert(targetAnchor, target); 12290 if (namespace === "svg" || isTargetSVG(target)) { 12291 namespace = "svg"; 12292 } else if (namespace === "mathml" || isTargetMathML(target)) { 12293 namespace = "mathml"; 12294 } 12295 } else if ( true && !disabled) { 12296 warn$1("Invalid Teleport target on mount:", target, `(${typeof target})`); 12297 } 12298 const mount = (container2, anchor2) => { 12299 if (shapeFlag & 16) { 12300 mountChildren( 12301 children, 12302 container2, 12303 anchor2, 12304 parentComponent, 12305 parentSuspense, 12306 namespace, 12307 slotScopeIds, 12308 optimized 12309 ); 12310 } 12311 }; 12312 if (disabled) { 12313 mount(container, mainAnchor); 12314 } else if (target) { 12315 mount(target, targetAnchor); 12316 } 12317 } else { 12318 n2.el = n1.el; 12319 n2.targetStart = n1.targetStart; 12320 const mainAnchor = n2.anchor = n1.anchor; 12321 const target = n2.target = n1.target; 12322 const targetAnchor = n2.targetAnchor = n1.targetAnchor; 12323 const wasDisabled = isTeleportDisabled(n1.props); 12324 const currentContainer = wasDisabled ? container : target; 12325 const currentAnchor = wasDisabled ? mainAnchor : targetAnchor; 12326 if (namespace === "svg" || isTargetSVG(target)) { 12327 namespace = "svg"; 12328 } else if (namespace === "mathml" || isTargetMathML(target)) { 12329 namespace = "mathml"; 12330 } 12331 if (dynamicChildren) { 12332 patchBlockChildren( 12333 n1.dynamicChildren, 12334 dynamicChildren, 12335 currentContainer, 12336 parentComponent, 12337 parentSuspense, 12338 namespace, 12339 slotScopeIds 12340 ); 12341 traverseStaticChildren(n1, n2, true); 12342 } else if (!optimized) { 12343 patchChildren( 12344 n1, 12345 n2, 12346 currentContainer, 12347 currentAnchor, 12348 parentComponent, 12349 parentSuspense, 12350 namespace, 12351 slotScopeIds, 12352 false 12353 ); 12354 } 12355 if (disabled) { 12356 if (!wasDisabled) { 12357 moveTeleport( 12358 n2, 12359 container, 12360 mainAnchor, 12361 internals, 12362 1 12363 ); 12364 } else { 12365 if (n2.props && n1.props && n2.props.to !== n1.props.to) { 12366 n2.props.to = n1.props.to; 12367 } 12368 } 12369 } else { 12370 if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) { 12371 const nextTarget = n2.target = resolveTarget( 12372 n2.props, 12373 querySelector 12374 ); 12375 if (nextTarget) { 12376 moveTeleport( 12377 n2, 12378 nextTarget, 12379 null, 12380 internals, 12381 0 12382 ); 12383 } else if (true) { 12384 warn$1( 12385 "Invalid Teleport target on update:", 12386 target, 12387 `(${typeof target})` 12388 ); 12389 } 12390 } else if (wasDisabled) { 12391 moveTeleport( 12392 n2, 12393 target, 12394 targetAnchor, 12395 internals, 12396 1 12397 ); 12398 } 12399 } 12400 } 12401 updateCssVars(n2); 12402 }, 12403 remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) { 12404 const { 12405 shapeFlag, 12406 children, 12407 anchor, 12408 targetStart, 12409 targetAnchor, 12410 target, 12411 props 12412 } = vnode; 12413 if (target) { 12414 hostRemove(targetStart); 12415 hostRemove(targetAnchor); 12416 } 12417 doRemove && hostRemove(anchor); 12418 if (shapeFlag & 16) { 12419 const shouldRemove = doRemove || !isTeleportDisabled(props); 12420 for (let i = 0; i < children.length; i++) { 12421 const child = children[i]; 12422 unmount( 12423 child, 12424 parentComponent, 12425 parentSuspense, 12426 shouldRemove, 12427 !!child.dynamicChildren 12428 ); 12429 } 12430 } 12431 }, 12432 move: moveTeleport, 12433 hydrate: hydrateTeleport 12434}; 12435function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) { 12436 if (moveType === 0) { 12437 insert(vnode.targetAnchor, container, parentAnchor); 12438 } 12439 const { el, anchor, shapeFlag, children, props } = vnode; 12440 const isReorder = moveType === 2; 12441 if (isReorder) { 12442 insert(el, container, parentAnchor); 12443 } 12444 if (!isReorder || isTeleportDisabled(props)) { 12445 if (shapeFlag & 16) { 12446 for (let i = 0; i < children.length; i++) { 12447 move( 12448 children[i], 12449 container, 12450 parentAnchor, 12451 2 12452 ); 12453 } 12454 } 12455 } 12456 if (isReorder) { 12457 insert(anchor, container, parentAnchor); 12458 } 12459} 12460function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { 12461 o: { nextSibling, parentNode, querySelector } 12462}, hydrateChildren) { 12463 const target = vnode.target = resolveTarget( 12464 vnode.props, 12465 querySelector 12466 ); 12467 if (target) { 12468 const targetNode = target._lpa || target.firstChild; 12469 if (vnode.shapeFlag & 16) { 12470 if (isTeleportDisabled(vnode.props)) { 12471 vnode.anchor = hydrateChildren( 12472 nextSibling(node), 12473 vnode, 12474 parentNode(node), 12475 parentComponent, 12476 parentSuspense, 12477 slotScopeIds, 12478 optimized 12479 ); 12480 vnode.targetAnchor = targetNode; 12481 } else { 12482 vnode.anchor = nextSibling(node); 12483 let targetAnchor = targetNode; 12484 while (targetAnchor) { 12485 targetAnchor = nextSibling(targetAnchor); 12486 if (targetAnchor && targetAnchor.nodeType === 8 && targetAnchor.data === "teleport anchor") { 12487 vnode.targetAnchor = targetAnchor; 12488 target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor); 12489 break; 12490 } 12491 } 12492 hydrateChildren( 12493 targetNode, 12494 vnode, 12495 target, 12496 parentComponent, 12497 parentSuspense, 12498 slotScopeIds, 12499 optimized 12500 ); 12501 } 12502 } 12503 updateCssVars(vnode); 12504 } 12505 return vnode.anchor && nextSibling(vnode.anchor); 12506} 12507const Teleport = TeleportImpl; 12508function updateCssVars(vnode) { 12509 const ctx = vnode.ctx; 12510 if (ctx && ctx.ut) { 12511 let node = vnode.children[0].el; 12512 while (node && node !== vnode.targetAnchor) { 12513 if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid); 12514 node = node.nextSibling; 12515 } 12516 ctx.ut(); 12517 } 12518} 12519 12520let hasLoggedMismatchError = false; 12521const logMismatchError = () => { 12522 if (hasLoggedMismatchError) { 12523 return; 12524 } 12525 console.error("Hydration completed but contains mismatches."); 12526 hasLoggedMismatchError = true; 12527}; 12528const isSVGContainer = (container) => container.namespaceURI.includes("svg") && container.tagName !== "foreignObject"; 12529const isMathMLContainer = (container) => container.namespaceURI.includes("MathML"); 12530const getContainerType = (container) => { 12531 if (isSVGContainer(container)) return "svg"; 12532 if (isMathMLContainer(container)) return "mathml"; 12533 return void 0; 12534}; 12535const isComment = (node) => node.nodeType === 8 /* COMMENT */; 12536function createHydrationFunctions(rendererInternals) { 12537 const { 12538 mt: mountComponent, 12539 p: patch, 12540 o: { 12541 patchProp, 12542 createText, 12543 nextSibling, 12544 parentNode, 12545 remove, 12546 insert, 12547 createComment 12548 } 12549 } = rendererInternals; 12550 const hydrate = (vnode, container) => { 12551 if (!container.hasChildNodes()) { 12552 ( true) && warn$1( 12553 `Attempting to hydrate existing markup but container is empty. Performing full mount instead.` 12554 ); 12555 patch(null, vnode, container); 12556 flushPostFlushCbs(); 12557 container._vnode = vnode; 12558 return; 12559 } 12560 hydrateNode(container.firstChild, vnode, null, null, null); 12561 flushPostFlushCbs(); 12562 container._vnode = vnode; 12563 }; 12564 const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => { 12565 optimized = optimized || !!vnode.dynamicChildren; 12566 const isFragmentStart = isComment(node) && node.data === "["; 12567 const onMismatch = () => handleMismatch( 12568 node, 12569 vnode, 12570 parentComponent, 12571 parentSuspense, 12572 slotScopeIds, 12573 isFragmentStart 12574 ); 12575 const { type, ref, shapeFlag, patchFlag } = vnode; 12576 let domType = node.nodeType; 12577 vnode.el = node; 12578 if (true) { 12579 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(node, "__vnode", vnode, true); 12580 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(node, "__vueParentComponent", parentComponent, true); 12581 } 12582 if (patchFlag === -2) { 12583 optimized = false; 12584 vnode.dynamicChildren = null; 12585 } 12586 let nextNode = null; 12587 switch (type) { 12588 case Text: 12589 if (domType !== 3 /* TEXT */) { 12590 if (vnode.children === "") { 12591 insert(vnode.el = createText(""), parentNode(node), node); 12592 nextNode = node; 12593 } else { 12594 nextNode = onMismatch(); 12595 } 12596 } else { 12597 if (node.data !== vnode.children) { 12598 ( true) && warn$1( 12599 `Hydration text mismatch in`, 12600 node.parentNode, 12601 ` 12602 - rendered on server: ${JSON.stringify( 12603 node.data 12604 )} 12605 - expected on client: ${JSON.stringify(vnode.children)}` 12606 ); 12607 logMismatchError(); 12608 node.data = vnode.children; 12609 } 12610 nextNode = nextSibling(node); 12611 } 12612 break; 12613 case Comment: 12614 if (isTemplateNode(node)) { 12615 nextNode = nextSibling(node); 12616 replaceNode( 12617 vnode.el = node.content.firstChild, 12618 node, 12619 parentComponent 12620 ); 12621 } else if (domType !== 8 /* COMMENT */ || isFragmentStart) { 12622 nextNode = onMismatch(); 12623 } else { 12624 nextNode = nextSibling(node); 12625 } 12626 break; 12627 case Static: 12628 if (isFragmentStart) { 12629 node = nextSibling(node); 12630 domType = node.nodeType; 12631 } 12632 if (domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */) { 12633 nextNode = node; 12634 const needToAdoptContent = !vnode.children.length; 12635 for (let i = 0; i < vnode.staticCount; i++) { 12636 if (needToAdoptContent) 12637 vnode.children += nextNode.nodeType === 1 /* ELEMENT */ ? nextNode.outerHTML : nextNode.data; 12638 if (i === vnode.staticCount - 1) { 12639 vnode.anchor = nextNode; 12640 } 12641 nextNode = nextSibling(nextNode); 12642 } 12643 return isFragmentStart ? nextSibling(nextNode) : nextNode; 12644 } else { 12645 onMismatch(); 12646 } 12647 break; 12648 case Fragment: 12649 if (!isFragmentStart) { 12650 nextNode = onMismatch(); 12651 } else { 12652 nextNode = hydrateFragment( 12653 node, 12654 vnode, 12655 parentComponent, 12656 parentSuspense, 12657 slotScopeIds, 12658 optimized 12659 ); 12660 } 12661 break; 12662 default: 12663 if (shapeFlag & 1) { 12664 if ((domType !== 1 /* ELEMENT */ || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) { 12665 nextNode = onMismatch(); 12666 } else { 12667 nextNode = hydrateElement( 12668 node, 12669 vnode, 12670 parentComponent, 12671 parentSuspense, 12672 slotScopeIds, 12673 optimized 12674 ); 12675 } 12676 } else if (shapeFlag & 6) { 12677 vnode.slotScopeIds = slotScopeIds; 12678 const container = parentNode(node); 12679 if (isFragmentStart) { 12680 nextNode = locateClosingAnchor(node); 12681 } else if (isComment(node) && node.data === "teleport start") { 12682 nextNode = locateClosingAnchor(node, node.data, "teleport end"); 12683 } else { 12684 nextNode = nextSibling(node); 12685 } 12686 mountComponent( 12687 vnode, 12688 container, 12689 null, 12690 parentComponent, 12691 parentSuspense, 12692 getContainerType(container), 12693 optimized 12694 ); 12695 if (isAsyncWrapper(vnode)) { 12696 let subTree; 12697 if (isFragmentStart) { 12698 subTree = createVNode(Fragment); 12699 subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild; 12700 } else { 12701 subTree = node.nodeType === 3 ? createTextVNode("") : createVNode("div"); 12702 } 12703 subTree.el = node; 12704 vnode.component.subTree = subTree; 12705 } 12706 } else if (shapeFlag & 64) { 12707 if (domType !== 8 /* COMMENT */) { 12708 nextNode = onMismatch(); 12709 } else { 12710 nextNode = vnode.type.hydrate( 12711 node, 12712 vnode, 12713 parentComponent, 12714 parentSuspense, 12715 slotScopeIds, 12716 optimized, 12717 rendererInternals, 12718 hydrateChildren 12719 ); 12720 } 12721 } else if (shapeFlag & 128) { 12722 nextNode = vnode.type.hydrate( 12723 node, 12724 vnode, 12725 parentComponent, 12726 parentSuspense, 12727 getContainerType(parentNode(node)), 12728 slotScopeIds, 12729 optimized, 12730 rendererInternals, 12731 hydrateNode 12732 ); 12733 } else if (true) { 12734 warn$1("Invalid HostVNode type:", type, `(${typeof type})`); 12735 } 12736 } 12737 if (ref != null) { 12738 setRef(ref, null, parentSuspense, vnode); 12739 } 12740 return nextNode; 12741 }; 12742 const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { 12743 optimized = optimized || !!vnode.dynamicChildren; 12744 const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode; 12745 const forcePatch = type === "input" || type === "option"; 12746 if (true) { 12747 if (dirs) { 12748 invokeDirectiveHook(vnode, null, parentComponent, "created"); 12749 } 12750 let needCallTransitionHooks = false; 12751 if (isTemplateNode(el)) { 12752 needCallTransitionHooks = needTransition(parentSuspense, transition) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear; 12753 const content = el.content.firstChild; 12754 if (needCallTransitionHooks) { 12755 transition.beforeEnter(content); 12756 } 12757 replaceNode(content, el, parentComponent); 12758 vnode.el = el = content; 12759 } 12760 if (shapeFlag & 16 && // skip if element has innerHTML / textContent 12761 !(props && (props.innerHTML || props.textContent))) { 12762 let next = hydrateChildren( 12763 el.firstChild, 12764 vnode, 12765 el, 12766 parentComponent, 12767 parentSuspense, 12768 slotScopeIds, 12769 optimized 12770 ); 12771 let hasWarned = false; 12772 while (next) { 12773 if (( true) && !hasWarned) { 12774 warn$1( 12775 `Hydration children mismatch on`, 12776 el, 12777 ` 12778Server rendered element contains more child nodes than client vdom.` 12779 ); 12780 hasWarned = true; 12781 } 12782 logMismatchError(); 12783 const cur = next; 12784 next = next.nextSibling; 12785 remove(cur); 12786 } 12787 } else if (shapeFlag & 8) { 12788 if (el.textContent !== vnode.children) { 12789 ( true) && warn$1( 12790 `Hydration text content mismatch on`, 12791 el, 12792 ` 12793 - rendered on server: ${el.textContent} 12794 - expected on client: ${vnode.children}` 12795 ); 12796 logMismatchError(); 12797 el.textContent = vnode.children; 12798 } 12799 } 12800 if (props) { 12801 if (true) { 12802 for (const key in props) { 12803 if (( true) && // #11189 skip if this node has directives that have created hooks 12804 // as it could have mutated the DOM in any possible way 12805 !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) { 12806 logMismatchError(); 12807 } 12808 if (forcePatch && (key.endsWith("value") || key === "indeterminate") || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) || // force hydrate v-bind with .prop modifiers 12809 key[0] === ".") { 12810 patchProp(el, key, null, props[key], void 0, parentComponent); 12811 } 12812 } 12813 } else {} 12814 } 12815 let vnodeHooks; 12816 if (vnodeHooks = props && props.onVnodeBeforeMount) { 12817 invokeVNodeHook(vnodeHooks, parentComponent, vnode); 12818 } 12819 if (dirs) { 12820 invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); 12821 } 12822 if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) { 12823 queueEffectWithSuspense(() => { 12824 vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode); 12825 needCallTransitionHooks && transition.enter(el); 12826 dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); 12827 }, parentSuspense); 12828 } 12829 } 12830 return el.nextSibling; 12831 }; 12832 const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => { 12833 optimized = optimized || !!parentVNode.dynamicChildren; 12834 const children = parentVNode.children; 12835 const l = children.length; 12836 let hasWarned = false; 12837 for (let i = 0; i < l; i++) { 12838 const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]); 12839 const isText = vnode.type === Text; 12840 if (node) { 12841 if (isText && !optimized) { 12842 let next = children[i + 1]; 12843 if (next && (next = normalizeVNode(next)).type === Text) { 12844 insert( 12845 createText( 12846 node.data.slice(vnode.children.length) 12847 ), 12848 container, 12849 nextSibling(node) 12850 ); 12851 node.data = vnode.children; 12852 } 12853 } 12854 node = hydrateNode( 12855 node, 12856 vnode, 12857 parentComponent, 12858 parentSuspense, 12859 slotScopeIds, 12860 optimized 12861 ); 12862 } else if (isText && !vnode.children) { 12863 insert(vnode.el = createText(""), container); 12864 } else { 12865 if (( true) && !hasWarned) { 12866 warn$1( 12867 `Hydration children mismatch on`, 12868 container, 12869 ` 12870Server rendered element contains fewer child nodes than client vdom.` 12871 ); 12872 hasWarned = true; 12873 } 12874 logMismatchError(); 12875 patch( 12876 null, 12877 vnode, 12878 container, 12879 null, 12880 parentComponent, 12881 parentSuspense, 12882 getContainerType(container), 12883 slotScopeIds 12884 ); 12885 } 12886 } 12887 return node; 12888 }; 12889 const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => { 12890 const { slotScopeIds: fragmentSlotScopeIds } = vnode; 12891 if (fragmentSlotScopeIds) { 12892 slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; 12893 } 12894 const container = parentNode(node); 12895 const next = hydrateChildren( 12896 nextSibling(node), 12897 vnode, 12898 container, 12899 parentComponent, 12900 parentSuspense, 12901 slotScopeIds, 12902 optimized 12903 ); 12904 if (next && isComment(next) && next.data === "]") { 12905 return nextSibling(vnode.anchor = next); 12906 } else { 12907 logMismatchError(); 12908 insert(vnode.anchor = createComment(`]`), container, next); 12909 return next; 12910 } 12911 }; 12912 const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => { 12913 ( true) && warn$1( 12914 `Hydration node mismatch: 12915- rendered on server:`, 12916 node, 12917 node.nodeType === 3 /* TEXT */ ? `(text)` : isComment(node) && node.data === "[" ? `(start of fragment)` : ``, 12918 ` 12919- expected on client:`, 12920 vnode.type 12921 ); 12922 logMismatchError(); 12923 vnode.el = null; 12924 if (isFragment) { 12925 const end = locateClosingAnchor(node); 12926 while (true) { 12927 const next2 = nextSibling(node); 12928 if (next2 && next2 !== end) { 12929 remove(next2); 12930 } else { 12931 break; 12932 } 12933 } 12934 } 12935 const next = nextSibling(node); 12936 const container = parentNode(node); 12937 remove(node); 12938 patch( 12939 null, 12940 vnode, 12941 container, 12942 next, 12943 parentComponent, 12944 parentSuspense, 12945 getContainerType(container), 12946 slotScopeIds 12947 ); 12948 return next; 12949 }; 12950 const locateClosingAnchor = (node, open = "[", close = "]") => { 12951 let match = 0; 12952 while (node) { 12953 node = nextSibling(node); 12954 if (node && isComment(node)) { 12955 if (node.data === open) match++; 12956 if (node.data === close) { 12957 if (match === 0) { 12958 return nextSibling(node); 12959 } else { 12960 match--; 12961 } 12962 } 12963 } 12964 } 12965 return node; 12966 }; 12967 const replaceNode = (newNode, oldNode, parentComponent) => { 12968 const parentNode2 = oldNode.parentNode; 12969 if (parentNode2) { 12970 parentNode2.replaceChild(newNode, oldNode); 12971 } 12972 let parent = parentComponent; 12973 while (parent) { 12974 if (parent.vnode.el === oldNode) { 12975 parent.vnode.el = parent.subTree.el = newNode; 12976 } 12977 parent = parent.parent; 12978 } 12979 }; 12980 const isTemplateNode = (node) => { 12981 return node.nodeType === 1 /* ELEMENT */ && node.tagName.toLowerCase() === "template"; 12982 }; 12983 return [hydrate, hydrateNode]; 12984} 12985function propHasMismatch(el, key, clientValue, vnode, instance) { 12986 let mismatchType; 12987 let mismatchKey; 12988 let actual; 12989 let expected; 12990 if (key === "class") { 12991 actual = el.getAttribute("class"); 12992 expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(clientValue); 12993 if (!isSetEqual(toClassSet(actual || ""), toClassSet(expected))) { 12994 mismatchType = mismatchKey = `class`; 12995 } 12996 } else if (key === "style") { 12997 actual = el.getAttribute("style") || ""; 12998 expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(clientValue) ? clientValue : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.stringifyStyle)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(clientValue)); 12999 const actualMap = toStyleMap(actual); 13000 const expectedMap = toStyleMap(expected); 13001 if (vnode.dirs) { 13002 for (const { dir, value } of vnode.dirs) { 13003 if (dir.name === "show" && !value) { 13004 expectedMap.set("display", "none"); 13005 } 13006 } 13007 } 13008 if (instance) { 13009 resolveCssVars(instance, vnode, expectedMap); 13010 } 13011 if (!isMapEqual(actualMap, expectedMap)) { 13012 mismatchType = mismatchKey = "style"; 13013 } 13014 } else if (el instanceof SVGElement && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isKnownSvgAttr)(key) || el instanceof HTMLElement && ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBooleanAttr)(key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isKnownHtmlAttr)(key))) { 13015 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isBooleanAttr)(key)) { 13016 actual = el.hasAttribute(key); 13017 expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(clientValue); 13018 } else if (clientValue == null) { 13019 actual = el.hasAttribute(key); 13020 expected = false; 13021 } else { 13022 if (el.hasAttribute(key)) { 13023 actual = el.getAttribute(key); 13024 } else if (key === "value" && el.tagName === "TEXTAREA") { 13025 actual = el.value; 13026 } else { 13027 actual = false; 13028 } 13029 expected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isRenderableAttrValue)(clientValue) ? String(clientValue) : false; 13030 } 13031 if (actual !== expected) { 13032 mismatchType = `attribute`; 13033 mismatchKey = key; 13034 } 13035 } 13036 if (mismatchType) { 13037 const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}="${v}"`; 13038 const preSegment = `Hydration ${mismatchType} mismatch on`; 13039 const postSegment = ` 13040 - rendered on server: ${format(actual)} 13041 - expected on client: ${format(expected)} 13042 Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead. 13043 You should fix the source of the mismatch.`; 13044 { 13045 warn$1(preSegment, el, postSegment); 13046 } 13047 return true; 13048 } 13049 return false; 13050} 13051function toClassSet(str) { 13052 return new Set(str.trim().split(/\s+/)); 13053} 13054function isSetEqual(a, b) { 13055 if (a.size !== b.size) { 13056 return false; 13057 } 13058 for (const s of a) { 13059 if (!b.has(s)) { 13060 return false; 13061 } 13062 } 13063 return true; 13064} 13065function toStyleMap(str) { 13066 const styleMap = /* @__PURE__ */ new Map(); 13067 for (const item of str.split(";")) { 13068 let [key, value] = item.split(":"); 13069 key = key.trim(); 13070 value = value && value.trim(); 13071 if (key && value) { 13072 styleMap.set(key, value); 13073 } 13074 } 13075 return styleMap; 13076} 13077function isMapEqual(a, b) { 13078 if (a.size !== b.size) { 13079 return false; 13080 } 13081 for (const [key, value] of a) { 13082 if (value !== b.get(key)) { 13083 return false; 13084 } 13085 } 13086 return true; 13087} 13088function resolveCssVars(instance, vnode, expectedMap) { 13089 const root = instance.subTree; 13090 if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) { 13091 const cssVars = instance.getCssVars(); 13092 for (const key in cssVars) { 13093 expectedMap.set(`--${key}`, String(cssVars[key])); 13094 } 13095 } 13096 if (vnode === root && instance.parent) { 13097 resolveCssVars(instance.parent, instance.vnode, expectedMap); 13098 } 13099} 13100 13101let supported; 13102let perf; 13103function startMeasure(instance, type) { 13104 if (instance.appContext.config.performance && isSupported()) { 13105 perf.mark(`vue-${type}-${instance.uid}`); 13106 } 13107 if (true) { 13108 devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now()); 13109 } 13110} 13111function endMeasure(instance, type) { 13112 if (instance.appContext.config.performance && isSupported()) { 13113 const startTag = `vue-${type}-${instance.uid}`; 13114 const endTag = startTag + `:end`; 13115 perf.mark(endTag); 13116 perf.measure( 13117 `<${formatComponentName(instance, instance.type)}> ${type}`, 13118 startTag, 13119 endTag 13120 ); 13121 perf.clearMarks(startTag); 13122 perf.clearMarks(endTag); 13123 } 13124 if (true) { 13125 devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now()); 13126 } 13127} 13128function isSupported() { 13129 if (supported !== void 0) { 13130 return supported; 13131 } 13132 if (typeof window !== "undefined" && window.performance) { 13133 supported = true; 13134 perf = window.performance; 13135 } else { 13136 supported = false; 13137 } 13138 return supported; 13139} 13140 13141function initFeatureFlags() { 13142 const needWarn = []; 13143 if (false) {} 13144 if (false) {} 13145 if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== "boolean") { 13146 true && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`); 13147 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false; 13148 } 13149 if ( true && needWarn.length) { 13150 const multi = needWarn.length > 1; 13151 console.warn( 13152 `Feature flag${multi ? `s` : ``} ${needWarn.join(", ")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle. 13153 13154For more details, see https://link.vuejs.org/feature-flags.` 13155 ); 13156 } 13157} 13158 13159const queuePostRenderEffect = queueEffectWithSuspense ; 13160function createRenderer(options) { 13161 return baseCreateRenderer(options); 13162} 13163function createHydrationRenderer(options) { 13164 return baseCreateRenderer(options, createHydrationFunctions); 13165} 13166function baseCreateRenderer(options, createHydrationFns) { 13167 { 13168 initFeatureFlags(); 13169 } 13170 const target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)(); 13171 target.__VUE__ = true; 13172 if (true) { 13173 setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target); 13174 } 13175 const { 13176 insert: hostInsert, 13177 remove: hostRemove, 13178 patchProp: hostPatchProp, 13179 createElement: hostCreateElement, 13180 createText: hostCreateText, 13181 createComment: hostCreateComment, 13182 setText: hostSetText, 13183 setElementText: hostSetElementText, 13184 parentNode: hostParentNode, 13185 nextSibling: hostNextSibling, 13186 setScopeId: hostSetScopeId = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, 13187 insertStaticContent: hostInsertStaticContent 13188 } = options; 13189 const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = true && isHmrUpdating ? false : !!n2.dynamicChildren) => { 13190 if (n1 === n2) { 13191 return; 13192 } 13193 if (n1 && !isSameVNodeType(n1, n2)) { 13194 anchor = getNextHostNode(n1); 13195 unmount(n1, parentComponent, parentSuspense, true); 13196 n1 = null; 13197 } 13198 if (n2.patchFlag === -2) { 13199 optimized = false; 13200 n2.dynamicChildren = null; 13201 } 13202 const { type, ref, shapeFlag } = n2; 13203 switch (type) { 13204 case Text: 13205 processText(n1, n2, container, anchor); 13206 break; 13207 case Comment: 13208 processCommentNode(n1, n2, container, anchor); 13209 break; 13210 case Static: 13211 if (n1 == null) { 13212 mountStaticNode(n2, container, anchor, namespace); 13213 } else if (true) { 13214 patchStaticNode(n1, n2, container, namespace); 13215 } 13216 break; 13217 case Fragment: 13218 processFragment( 13219 n1, 13220 n2, 13221 container, 13222 anchor, 13223 parentComponent, 13224 parentSuspense, 13225 namespace, 13226 slotScopeIds, 13227 optimized 13228 ); 13229 break; 13230 default: 13231 if (shapeFlag & 1) { 13232 processElement( 13233 n1, 13234 n2, 13235 container, 13236 anchor, 13237 parentComponent, 13238 parentSuspense, 13239 namespace, 13240 slotScopeIds, 13241 optimized 13242 ); 13243 } else if (shapeFlag & 6) { 13244 processComponent( 13245 n1, 13246 n2, 13247 container, 13248 anchor, 13249 parentComponent, 13250 parentSuspense, 13251 namespace, 13252 slotScopeIds, 13253 optimized 13254 ); 13255 } else if (shapeFlag & 64) { 13256 type.process( 13257 n1, 13258 n2, 13259 container, 13260 anchor, 13261 parentComponent, 13262 parentSuspense, 13263 namespace, 13264 slotScopeIds, 13265 optimized, 13266 internals 13267 ); 13268 } else if (shapeFlag & 128) { 13269 type.process( 13270 n1, 13271 n2, 13272 container, 13273 anchor, 13274 parentComponent, 13275 parentSuspense, 13276 namespace, 13277 slotScopeIds, 13278 optimized, 13279 internals 13280 ); 13281 } else if (true) { 13282 warn$1("Invalid VNode type:", type, `(${typeof type})`); 13283 } 13284 } 13285 if (ref != null && parentComponent) { 13286 setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2); 13287 } 13288 }; 13289 const processText = (n1, n2, container, anchor) => { 13290 if (n1 == null) { 13291 hostInsert( 13292 n2.el = hostCreateText(n2.children), 13293 container, 13294 anchor 13295 ); 13296 } else { 13297 const el = n2.el = n1.el; 13298 if (n2.children !== n1.children) { 13299 hostSetText(el, n2.children); 13300 } 13301 } 13302 }; 13303 const processCommentNode = (n1, n2, container, anchor) => { 13304 if (n1 == null) { 13305 hostInsert( 13306 n2.el = hostCreateComment(n2.children || ""), 13307 container, 13308 anchor 13309 ); 13310 } else { 13311 n2.el = n1.el; 13312 } 13313 }; 13314 const mountStaticNode = (n2, container, anchor, namespace) => { 13315 [n2.el, n2.anchor] = hostInsertStaticContent( 13316 n2.children, 13317 container, 13318 anchor, 13319 namespace, 13320 n2.el, 13321 n2.anchor 13322 ); 13323 }; 13324 const patchStaticNode = (n1, n2, container, namespace) => { 13325 if (n2.children !== n1.children) { 13326 const anchor = hostNextSibling(n1.anchor); 13327 removeStaticNode(n1); 13328 [n2.el, n2.anchor] = hostInsertStaticContent( 13329 n2.children, 13330 container, 13331 anchor, 13332 namespace 13333 ); 13334 } else { 13335 n2.el = n1.el; 13336 n2.anchor = n1.anchor; 13337 } 13338 }; 13339 const moveStaticNode = ({ el, anchor }, container, nextSibling) => { 13340 let next; 13341 while (el && el !== anchor) { 13342 next = hostNextSibling(el); 13343 hostInsert(el, container, nextSibling); 13344 el = next; 13345 } 13346 hostInsert(anchor, container, nextSibling); 13347 }; 13348 const removeStaticNode = ({ el, anchor }) => { 13349 let next; 13350 while (el && el !== anchor) { 13351 next = hostNextSibling(el); 13352 hostRemove(el); 13353 el = next; 13354 } 13355 hostRemove(anchor); 13356 }; 13357 const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 13358 if (n2.type === "svg") { 13359 namespace = "svg"; 13360 } else if (n2.type === "math") { 13361 namespace = "mathml"; 13362 } 13363 if (n1 == null) { 13364 mountElement( 13365 n2, 13366 container, 13367 anchor, 13368 parentComponent, 13369 parentSuspense, 13370 namespace, 13371 slotScopeIds, 13372 optimized 13373 ); 13374 } else { 13375 patchElement( 13376 n1, 13377 n2, 13378 parentComponent, 13379 parentSuspense, 13380 namespace, 13381 slotScopeIds, 13382 optimized 13383 ); 13384 } 13385 }; 13386 const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 13387 let el; 13388 let vnodeHook; 13389 const { props, shapeFlag, transition, dirs } = vnode; 13390 el = vnode.el = hostCreateElement( 13391 vnode.type, 13392 namespace, 13393 props && props.is, 13394 props 13395 ); 13396 if (shapeFlag & 8) { 13397 hostSetElementText(el, vnode.children); 13398 } else if (shapeFlag & 16) { 13399 mountChildren( 13400 vnode.children, 13401 el, 13402 null, 13403 parentComponent, 13404 parentSuspense, 13405 resolveChildrenNamespace(vnode, namespace), 13406 slotScopeIds, 13407 optimized 13408 ); 13409 } 13410 if (dirs) { 13411 invokeDirectiveHook(vnode, null, parentComponent, "created"); 13412 } 13413 setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); 13414 if (props) { 13415 for (const key in props) { 13416 if (key !== "value" && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) { 13417 hostPatchProp(el, key, null, props[key], namespace, parentComponent); 13418 } 13419 } 13420 if ("value" in props) { 13421 hostPatchProp(el, "value", null, props.value, namespace); 13422 } 13423 if (vnodeHook = props.onVnodeBeforeMount) { 13424 invokeVNodeHook(vnodeHook, parentComponent, vnode); 13425 } 13426 } 13427 if (true) { 13428 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(el, "__vnode", vnode, true); 13429 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.def)(el, "__vueParentComponent", parentComponent, true); 13430 } 13431 if (dirs) { 13432 invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); 13433 } 13434 const needCallTransitionHooks = needTransition(parentSuspense, transition); 13435 if (needCallTransitionHooks) { 13436 transition.beforeEnter(el); 13437 } 13438 hostInsert(el, container, anchor); 13439 if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { 13440 queuePostRenderEffect(() => { 13441 vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); 13442 needCallTransitionHooks && transition.enter(el); 13443 dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); 13444 }, parentSuspense); 13445 } 13446 }; 13447 const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { 13448 if (scopeId) { 13449 hostSetScopeId(el, scopeId); 13450 } 13451 if (slotScopeIds) { 13452 for (let i = 0; i < slotScopeIds.length; i++) { 13453 hostSetScopeId(el, slotScopeIds[i]); 13454 } 13455 } 13456 if (parentComponent) { 13457 let subTree = parentComponent.subTree; 13458 if ( true && subTree.patchFlag > 0 && subTree.patchFlag & 2048) { 13459 subTree = filterSingleRoot(subTree.children) || subTree; 13460 } 13461 if (vnode === subTree) { 13462 const parentVNode = parentComponent.vnode; 13463 setScopeId( 13464 el, 13465 parentVNode, 13466 parentVNode.scopeId, 13467 parentVNode.slotScopeIds, 13468 parentComponent.parent 13469 ); 13470 } 13471 } 13472 }; 13473 const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { 13474 for (let i = start; i < children.length; i++) { 13475 const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); 13476 patch( 13477 null, 13478 child, 13479 container, 13480 anchor, 13481 parentComponent, 13482 parentSuspense, 13483 namespace, 13484 slotScopeIds, 13485 optimized 13486 ); 13487 } 13488 }; 13489 const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 13490 const el = n2.el = n1.el; 13491 if (true) { 13492 el.__vnode = n2; 13493 } 13494 let { patchFlag, dynamicChildren, dirs } = n2; 13495 patchFlag |= n1.patchFlag & 16; 13496 const oldProps = n1.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 13497 const newProps = n2.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 13498 let vnodeHook; 13499 parentComponent && toggleRecurse(parentComponent, false); 13500 if (vnodeHook = newProps.onVnodeBeforeUpdate) { 13501 invokeVNodeHook(vnodeHook, parentComponent, n2, n1); 13502 } 13503 if (dirs) { 13504 invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); 13505 } 13506 parentComponent && toggleRecurse(parentComponent, true); 13507 if ( true && isHmrUpdating) { 13508 patchFlag = 0; 13509 optimized = false; 13510 dynamicChildren = null; 13511 } 13512 if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { 13513 hostSetElementText(el, ""); 13514 } 13515 if (dynamicChildren) { 13516 patchBlockChildren( 13517 n1.dynamicChildren, 13518 dynamicChildren, 13519 el, 13520 parentComponent, 13521 parentSuspense, 13522 resolveChildrenNamespace(n2, namespace), 13523 slotScopeIds 13524 ); 13525 if (true) { 13526 traverseStaticChildren(n1, n2); 13527 } 13528 } else if (!optimized) { 13529 patchChildren( 13530 n1, 13531 n2, 13532 el, 13533 null, 13534 parentComponent, 13535 parentSuspense, 13536 resolveChildrenNamespace(n2, namespace), 13537 slotScopeIds, 13538 false 13539 ); 13540 } 13541 if (patchFlag > 0) { 13542 if (patchFlag & 16) { 13543 patchProps(el, oldProps, newProps, parentComponent, namespace); 13544 } else { 13545 if (patchFlag & 2) { 13546 if (oldProps.class !== newProps.class) { 13547 hostPatchProp(el, "class", null, newProps.class, namespace); 13548 } 13549 } 13550 if (patchFlag & 4) { 13551 hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); 13552 } 13553 if (patchFlag & 8) { 13554 const propsToUpdate = n2.dynamicProps; 13555 for (let i = 0; i < propsToUpdate.length; i++) { 13556 const key = propsToUpdate[i]; 13557 const prev = oldProps[key]; 13558 const next = newProps[key]; 13559 if (next !== prev || key === "value") { 13560 hostPatchProp(el, key, prev, next, namespace, parentComponent); 13561 } 13562 } 13563 } 13564 } 13565 if (patchFlag & 1) { 13566 if (n1.children !== n2.children) { 13567 hostSetElementText(el, n2.children); 13568 } 13569 } 13570 } else if (!optimized && dynamicChildren == null) { 13571 patchProps(el, oldProps, newProps, parentComponent, namespace); 13572 } 13573 if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { 13574 queuePostRenderEffect(() => { 13575 vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); 13576 dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); 13577 }, parentSuspense); 13578 } 13579 }; 13580 const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { 13581 for (let i = 0; i < newChildren.length; i++) { 13582 const oldVNode = oldChildren[i]; 13583 const newVNode = newChildren[i]; 13584 const container = ( 13585 // oldVNode may be an errored async setup() component inside Suspense 13586 // which will not have a mounted element 13587 oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent 13588 // of the Fragment itself so it can move its children. 13589 (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement 13590 // which also requires the correct parent container 13591 !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. 13592 oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : ( 13593 // In other cases, the parent container is not actually used so we 13594 // just pass the block element here to avoid a DOM parentNode call. 13595 fallbackContainer 13596 ) 13597 ); 13598 patch( 13599 oldVNode, 13600 newVNode, 13601 container, 13602 null, 13603 parentComponent, 13604 parentSuspense, 13605 namespace, 13606 slotScopeIds, 13607 true 13608 ); 13609 } 13610 }; 13611 const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { 13612 if (oldProps !== newProps) { 13613 if (oldProps !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) { 13614 for (const key in oldProps) { 13615 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key) && !(key in newProps)) { 13616 hostPatchProp( 13617 el, 13618 key, 13619 oldProps[key], 13620 null, 13621 namespace, 13622 parentComponent 13623 ); 13624 } 13625 } 13626 } 13627 for (const key in newProps) { 13628 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isReservedProp)(key)) continue; 13629 const next = newProps[key]; 13630 const prev = oldProps[key]; 13631 if (next !== prev && key !== "value") { 13632 hostPatchProp(el, key, prev, next, namespace, parentComponent); 13633 } 13634 } 13635 if ("value" in newProps) { 13636 hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); 13637 } 13638 } 13639 }; 13640 const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 13641 const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); 13642 const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); 13643 let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; 13644 if ( true && // #5523 dev root fragment may inherit directives 13645 (isHmrUpdating || patchFlag & 2048)) { 13646 patchFlag = 0; 13647 optimized = false; 13648 dynamicChildren = null; 13649 } 13650 if (fragmentSlotScopeIds) { 13651 slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; 13652 } 13653 if (n1 == null) { 13654 hostInsert(fragmentStartAnchor, container, anchor); 13655 hostInsert(fragmentEndAnchor, container, anchor); 13656 mountChildren( 13657 // #10007 13658 // such fragment like `<></>` will be compiled into 13659 // a fragment which doesn't have a children. 13660 // In this case fallback to an empty array 13661 n2.children || [], 13662 container, 13663 fragmentEndAnchor, 13664 parentComponent, 13665 parentSuspense, 13666 namespace, 13667 slotScopeIds, 13668 optimized 13669 ); 13670 } else { 13671 if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result 13672 // of renderSlot() with no valid children 13673 n1.dynamicChildren) { 13674 patchBlockChildren( 13675 n1.dynamicChildren, 13676 dynamicChildren, 13677 container, 13678 parentComponent, 13679 parentSuspense, 13680 namespace, 13681 slotScopeIds 13682 ); 13683 if (true) { 13684 traverseStaticChildren(n1, n2); 13685 } else {} 13686 } else { 13687 patchChildren( 13688 n1, 13689 n2, 13690 container, 13691 fragmentEndAnchor, 13692 parentComponent, 13693 parentSuspense, 13694 namespace, 13695 slotScopeIds, 13696 optimized 13697 ); 13698 } 13699 } 13700 }; 13701 const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 13702 n2.slotScopeIds = slotScopeIds; 13703 if (n1 == null) { 13704 if (n2.shapeFlag & 512) { 13705 parentComponent.ctx.activate( 13706 n2, 13707 container, 13708 anchor, 13709 namespace, 13710 optimized 13711 ); 13712 } else { 13713 mountComponent( 13714 n2, 13715 container, 13716 anchor, 13717 parentComponent, 13718 parentSuspense, 13719 namespace, 13720 optimized 13721 ); 13722 } 13723 } else { 13724 updateComponent(n1, n2, optimized); 13725 } 13726 }; 13727 const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => { 13728 const instance = (initialVNode.component = createComponentInstance( 13729 initialVNode, 13730 parentComponent, 13731 parentSuspense 13732 )); 13733 if ( true && instance.type.__hmrId) { 13734 registerHMR(instance); 13735 } 13736 if (true) { 13737 pushWarningContext(initialVNode); 13738 startMeasure(instance, `mount`); 13739 } 13740 if (isKeepAlive(initialVNode)) { 13741 instance.ctx.renderer = internals; 13742 } 13743 { 13744 if (true) { 13745 startMeasure(instance, `init`); 13746 } 13747 setupComponent(instance, false, optimized); 13748 if (true) { 13749 endMeasure(instance, `init`); 13750 } 13751 } 13752 if (instance.asyncDep) { 13753 parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized); 13754 if (!initialVNode.el) { 13755 const placeholder = instance.subTree = createVNode(Comment); 13756 processCommentNode(null, placeholder, container, anchor); 13757 } 13758 } else { 13759 setupRenderEffect( 13760 instance, 13761 initialVNode, 13762 container, 13763 anchor, 13764 parentSuspense, 13765 namespace, 13766 optimized 13767 ); 13768 } 13769 if (true) { 13770 popWarningContext(); 13771 endMeasure(instance, `mount`); 13772 } 13773 }; 13774 const updateComponent = (n1, n2, optimized) => { 13775 const instance = n2.component = n1.component; 13776 if (shouldUpdateComponent(n1, n2, optimized)) { 13777 if (instance.asyncDep && !instance.asyncResolved) { 13778 if (true) { 13779 pushWarningContext(n2); 13780 } 13781 updateComponentPreRender(instance, n2, optimized); 13782 if (true) { 13783 popWarningContext(); 13784 } 13785 return; 13786 } else { 13787 instance.next = n2; 13788 invalidateJob(instance.update); 13789 instance.effect.dirty = true; 13790 instance.update(); 13791 } 13792 } else { 13793 n2.el = n1.el; 13794 instance.vnode = n2; 13795 } 13796 }; 13797 const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => { 13798 const componentUpdateFn = () => { 13799 if (!instance.isMounted) { 13800 let vnodeHook; 13801 const { el, props } = initialVNode; 13802 const { bm, m, parent } = instance; 13803 const isAsyncWrapperVNode = isAsyncWrapper(initialVNode); 13804 toggleRecurse(instance, false); 13805 if (bm) { 13806 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bm); 13807 } 13808 if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) { 13809 invokeVNodeHook(vnodeHook, parent, initialVNode); 13810 } 13811 toggleRecurse(instance, true); 13812 if (el && hydrateNode) { 13813 const hydrateSubTree = () => { 13814 if (true) { 13815 startMeasure(instance, `render`); 13816 } 13817 instance.subTree = renderComponentRoot(instance); 13818 if (true) { 13819 endMeasure(instance, `render`); 13820 } 13821 if (true) { 13822 startMeasure(instance, `hydrate`); 13823 } 13824 hydrateNode( 13825 el, 13826 instance.subTree, 13827 instance, 13828 parentSuspense, 13829 null 13830 ); 13831 if (true) { 13832 endMeasure(instance, `hydrate`); 13833 } 13834 }; 13835 if (isAsyncWrapperVNode) { 13836 initialVNode.type.__asyncLoader().then( 13837 // note: we are moving the render call into an async callback, 13838 // which means it won't track dependencies - but it's ok because 13839 // a server-rendered async wrapper is already in resolved state 13840 // and it will never need to change. 13841 () => !instance.isUnmounted && hydrateSubTree() 13842 ); 13843 } else { 13844 hydrateSubTree(); 13845 } 13846 } else { 13847 if (true) { 13848 startMeasure(instance, `render`); 13849 } 13850 const subTree = instance.subTree = renderComponentRoot(instance); 13851 if (true) { 13852 endMeasure(instance, `render`); 13853 } 13854 if (true) { 13855 startMeasure(instance, `patch`); 13856 } 13857 patch( 13858 null, 13859 subTree, 13860 container, 13861 anchor, 13862 instance, 13863 parentSuspense, 13864 namespace 13865 ); 13866 if (true) { 13867 endMeasure(instance, `patch`); 13868 } 13869 initialVNode.el = subTree.el; 13870 } 13871 if (m) { 13872 queuePostRenderEffect(m, parentSuspense); 13873 } 13874 if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) { 13875 const scopedInitialVNode = initialVNode; 13876 queuePostRenderEffect( 13877 () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), 13878 parentSuspense 13879 ); 13880 } 13881 if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) { 13882 instance.a && queuePostRenderEffect(instance.a, parentSuspense); 13883 } 13884 instance.isMounted = true; 13885 if (true) { 13886 devtoolsComponentAdded(instance); 13887 } 13888 initialVNode = container = anchor = null; 13889 } else { 13890 let { next, bu, u, parent, vnode } = instance; 13891 { 13892 const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance); 13893 if (nonHydratedAsyncRoot) { 13894 if (next) { 13895 next.el = vnode.el; 13896 updateComponentPreRender(instance, next, optimized); 13897 } 13898 nonHydratedAsyncRoot.asyncDep.then(() => { 13899 if (!instance.isUnmounted) { 13900 componentUpdateFn(); 13901 } 13902 }); 13903 return; 13904 } 13905 } 13906 let originNext = next; 13907 let vnodeHook; 13908 if (true) { 13909 pushWarningContext(next || instance.vnode); 13910 } 13911 toggleRecurse(instance, false); 13912 if (next) { 13913 next.el = vnode.el; 13914 updateComponentPreRender(instance, next, optimized); 13915 } else { 13916 next = vnode; 13917 } 13918 if (bu) { 13919 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bu); 13920 } 13921 if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) { 13922 invokeVNodeHook(vnodeHook, parent, next, vnode); 13923 } 13924 toggleRecurse(instance, true); 13925 if (true) { 13926 startMeasure(instance, `render`); 13927 } 13928 const nextTree = renderComponentRoot(instance); 13929 if (true) { 13930 endMeasure(instance, `render`); 13931 } 13932 const prevTree = instance.subTree; 13933 instance.subTree = nextTree; 13934 if (true) { 13935 startMeasure(instance, `patch`); 13936 } 13937 patch( 13938 prevTree, 13939 nextTree, 13940 // parent may have changed if it's in a teleport 13941 hostParentNode(prevTree.el), 13942 // anchor may have changed if it's in a fragment 13943 getNextHostNode(prevTree), 13944 instance, 13945 parentSuspense, 13946 namespace 13947 ); 13948 if (true) { 13949 endMeasure(instance, `patch`); 13950 } 13951 next.el = nextTree.el; 13952 if (originNext === null) { 13953 updateHOCHostEl(instance, nextTree.el); 13954 } 13955 if (u) { 13956 queuePostRenderEffect(u, parentSuspense); 13957 } 13958 if (vnodeHook = next.props && next.props.onVnodeUpdated) { 13959 queuePostRenderEffect( 13960 () => invokeVNodeHook(vnodeHook, parent, next, vnode), 13961 parentSuspense 13962 ); 13963 } 13964 if (true) { 13965 devtoolsComponentUpdated(instance); 13966 } 13967 if (true) { 13968 popWarningContext(); 13969 } 13970 } 13971 }; 13972 const effect = instance.effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect( 13973 componentUpdateFn, 13974 _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, 13975 () => queueJob(update), 13976 instance.scope 13977 // track it in component's effect scope 13978 ); 13979 const update = instance.update = () => { 13980 if (effect.dirty) { 13981 effect.run(); 13982 } 13983 }; 13984 update.i = instance; 13985 update.id = instance.uid; 13986 toggleRecurse(instance, true); 13987 if (true) { 13988 effect.onTrack = instance.rtc ? (e) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtc, e) : void 0; 13989 effect.onTrigger = instance.rtg ? (e) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(instance.rtg, e) : void 0; 13990 } 13991 update(); 13992 }; 13993 const updateComponentPreRender = (instance, nextVNode, optimized) => { 13994 nextVNode.component = instance; 13995 const prevProps = instance.vnode.props; 13996 instance.vnode = nextVNode; 13997 instance.next = null; 13998 updateProps(instance, nextVNode.props, prevProps, optimized); 13999 updateSlots(instance, nextVNode.children, optimized); 14000 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 14001 flushPreFlushCbs(instance); 14002 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 14003 }; 14004 const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => { 14005 const c1 = n1 && n1.children; 14006 const prevShapeFlag = n1 ? n1.shapeFlag : 0; 14007 const c2 = n2.children; 14008 const { patchFlag, shapeFlag } = n2; 14009 if (patchFlag > 0) { 14010 if (patchFlag & 128) { 14011 patchKeyedChildren( 14012 c1, 14013 c2, 14014 container, 14015 anchor, 14016 parentComponent, 14017 parentSuspense, 14018 namespace, 14019 slotScopeIds, 14020 optimized 14021 ); 14022 return; 14023 } else if (patchFlag & 256) { 14024 patchUnkeyedChildren( 14025 c1, 14026 c2, 14027 container, 14028 anchor, 14029 parentComponent, 14030 parentSuspense, 14031 namespace, 14032 slotScopeIds, 14033 optimized 14034 ); 14035 return; 14036 } 14037 } 14038 if (shapeFlag & 8) { 14039 if (prevShapeFlag & 16) { 14040 unmountChildren(c1, parentComponent, parentSuspense); 14041 } 14042 if (c2 !== c1) { 14043 hostSetElementText(container, c2); 14044 } 14045 } else { 14046 if (prevShapeFlag & 16) { 14047 if (shapeFlag & 16) { 14048 patchKeyedChildren( 14049 c1, 14050 c2, 14051 container, 14052 anchor, 14053 parentComponent, 14054 parentSuspense, 14055 namespace, 14056 slotScopeIds, 14057 optimized 14058 ); 14059 } else { 14060 unmountChildren(c1, parentComponent, parentSuspense, true); 14061 } 14062 } else { 14063 if (prevShapeFlag & 8) { 14064 hostSetElementText(container, ""); 14065 } 14066 if (shapeFlag & 16) { 14067 mountChildren( 14068 c2, 14069 container, 14070 anchor, 14071 parentComponent, 14072 parentSuspense, 14073 namespace, 14074 slotScopeIds, 14075 optimized 14076 ); 14077 } 14078 } 14079 } 14080 }; 14081 const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 14082 c1 = c1 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR; 14083 c2 = c2 || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR; 14084 const oldLength = c1.length; 14085 const newLength = c2.length; 14086 const commonLength = Math.min(oldLength, newLength); 14087 let i; 14088 for (i = 0; i < commonLength; i++) { 14089 const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); 14090 patch( 14091 c1[i], 14092 nextChild, 14093 container, 14094 null, 14095 parentComponent, 14096 parentSuspense, 14097 namespace, 14098 slotScopeIds, 14099 optimized 14100 ); 14101 } 14102 if (oldLength > newLength) { 14103 unmountChildren( 14104 c1, 14105 parentComponent, 14106 parentSuspense, 14107 true, 14108 false, 14109 commonLength 14110 ); 14111 } else { 14112 mountChildren( 14113 c2, 14114 container, 14115 anchor, 14116 parentComponent, 14117 parentSuspense, 14118 namespace, 14119 slotScopeIds, 14120 optimized, 14121 commonLength 14122 ); 14123 } 14124 }; 14125 const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { 14126 let i = 0; 14127 const l2 = c2.length; 14128 let e1 = c1.length - 1; 14129 let e2 = l2 - 1; 14130 while (i <= e1 && i <= e2) { 14131 const n1 = c1[i]; 14132 const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); 14133 if (isSameVNodeType(n1, n2)) { 14134 patch( 14135 n1, 14136 n2, 14137 container, 14138 null, 14139 parentComponent, 14140 parentSuspense, 14141 namespace, 14142 slotScopeIds, 14143 optimized 14144 ); 14145 } else { 14146 break; 14147 } 14148 i++; 14149 } 14150 while (i <= e1 && i <= e2) { 14151 const n1 = c1[e1]; 14152 const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]); 14153 if (isSameVNodeType(n1, n2)) { 14154 patch( 14155 n1, 14156 n2, 14157 container, 14158 null, 14159 parentComponent, 14160 parentSuspense, 14161 namespace, 14162 slotScopeIds, 14163 optimized 14164 ); 14165 } else { 14166 break; 14167 } 14168 e1--; 14169 e2--; 14170 } 14171 if (i > e1) { 14172 if (i <= e2) { 14173 const nextPos = e2 + 1; 14174 const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor; 14175 while (i <= e2) { 14176 patch( 14177 null, 14178 c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), 14179 container, 14180 anchor, 14181 parentComponent, 14182 parentSuspense, 14183 namespace, 14184 slotScopeIds, 14185 optimized 14186 ); 14187 i++; 14188 } 14189 } 14190 } else if (i > e2) { 14191 while (i <= e1) { 14192 unmount(c1[i], parentComponent, parentSuspense, true); 14193 i++; 14194 } 14195 } else { 14196 const s1 = i; 14197 const s2 = i; 14198 const keyToNewIndexMap = /* @__PURE__ */ new Map(); 14199 for (i = s2; i <= e2; i++) { 14200 const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); 14201 if (nextChild.key != null) { 14202 if ( true && keyToNewIndexMap.has(nextChild.key)) { 14203 warn$1( 14204 `Duplicate keys found during update:`, 14205 JSON.stringify(nextChild.key), 14206 `Make sure keys are unique.` 14207 ); 14208 } 14209 keyToNewIndexMap.set(nextChild.key, i); 14210 } 14211 } 14212 let j; 14213 let patched = 0; 14214 const toBePatched = e2 - s2 + 1; 14215 let moved = false; 14216 let maxNewIndexSoFar = 0; 14217 const newIndexToOldIndexMap = new Array(toBePatched); 14218 for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0; 14219 for (i = s1; i <= e1; i++) { 14220 const prevChild = c1[i]; 14221 if (patched >= toBePatched) { 14222 unmount(prevChild, parentComponent, parentSuspense, true); 14223 continue; 14224 } 14225 let newIndex; 14226 if (prevChild.key != null) { 14227 newIndex = keyToNewIndexMap.get(prevChild.key); 14228 } else { 14229 for (j = s2; j <= e2; j++) { 14230 if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) { 14231 newIndex = j; 14232 break; 14233 } 14234 } 14235 } 14236 if (newIndex === void 0) { 14237 unmount(prevChild, parentComponent, parentSuspense, true); 14238 } else { 14239 newIndexToOldIndexMap[newIndex - s2] = i + 1; 14240 if (newIndex >= maxNewIndexSoFar) { 14241 maxNewIndexSoFar = newIndex; 14242 } else { 14243 moved = true; 14244 } 14245 patch( 14246 prevChild, 14247 c2[newIndex], 14248 container, 14249 null, 14250 parentComponent, 14251 parentSuspense, 14252 namespace, 14253 slotScopeIds, 14254 optimized 14255 ); 14256 patched++; 14257 } 14258 } 14259 const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR; 14260 j = increasingNewIndexSequence.length - 1; 14261 for (i = toBePatched - 1; i >= 0; i--) { 14262 const nextIndex = s2 + i; 14263 const nextChild = c2[nextIndex]; 14264 const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor; 14265 if (newIndexToOldIndexMap[i] === 0) { 14266 patch( 14267 null, 14268 nextChild, 14269 container, 14270 anchor, 14271 parentComponent, 14272 parentSuspense, 14273 namespace, 14274 slotScopeIds, 14275 optimized 14276 ); 14277 } else if (moved) { 14278 if (j < 0 || i !== increasingNewIndexSequence[j]) { 14279 move(nextChild, container, anchor, 2); 14280 } else { 14281 j--; 14282 } 14283 } 14284 } 14285 } 14286 }; 14287 const move = (vnode, container, anchor, moveType, parentSuspense = null) => { 14288 const { el, type, transition, children, shapeFlag } = vnode; 14289 if (shapeFlag & 6) { 14290 move(vnode.component.subTree, container, anchor, moveType); 14291 return; 14292 } 14293 if (shapeFlag & 128) { 14294 vnode.suspense.move(container, anchor, moveType); 14295 return; 14296 } 14297 if (shapeFlag & 64) { 14298 type.move(vnode, container, anchor, internals); 14299 return; 14300 } 14301 if (type === Fragment) { 14302 hostInsert(el, container, anchor); 14303 for (let i = 0; i < children.length; i++) { 14304 move(children[i], container, anchor, moveType); 14305 } 14306 hostInsert(vnode.anchor, container, anchor); 14307 return; 14308 } 14309 if (type === Static) { 14310 moveStaticNode(vnode, container, anchor); 14311 return; 14312 } 14313 const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition; 14314 if (needTransition2) { 14315 if (moveType === 0) { 14316 transition.beforeEnter(el); 14317 hostInsert(el, container, anchor); 14318 queuePostRenderEffect(() => transition.enter(el), parentSuspense); 14319 } else { 14320 const { leave, delayLeave, afterLeave } = transition; 14321 const remove2 = () => hostInsert(el, container, anchor); 14322 const performLeave = () => { 14323 leave(el, () => { 14324 remove2(); 14325 afterLeave && afterLeave(); 14326 }); 14327 }; 14328 if (delayLeave) { 14329 delayLeave(el, remove2, performLeave); 14330 } else { 14331 performLeave(); 14332 } 14333 } 14334 } else { 14335 hostInsert(el, container, anchor); 14336 } 14337 }; 14338 const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => { 14339 const { 14340 type, 14341 props, 14342 ref, 14343 children, 14344 dynamicChildren, 14345 shapeFlag, 14346 patchFlag, 14347 dirs, 14348 cacheIndex 14349 } = vnode; 14350 if (patchFlag === -2) { 14351 optimized = false; 14352 } 14353 if (ref != null) { 14354 setRef(ref, null, parentSuspense, vnode, true); 14355 } 14356 if (cacheIndex != null) { 14357 parentComponent.renderCache[cacheIndex] = void 0; 14358 } 14359 if (shapeFlag & 256) { 14360 parentComponent.ctx.deactivate(vnode); 14361 return; 14362 } 14363 const shouldInvokeDirs = shapeFlag & 1 && dirs; 14364 const shouldInvokeVnodeHook = !isAsyncWrapper(vnode); 14365 let vnodeHook; 14366 if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) { 14367 invokeVNodeHook(vnodeHook, parentComponent, vnode); 14368 } 14369 if (shapeFlag & 6) { 14370 unmountComponent(vnode.component, parentSuspense, doRemove); 14371 } else { 14372 if (shapeFlag & 128) { 14373 vnode.suspense.unmount(parentSuspense, doRemove); 14374 return; 14375 } 14376 if (shouldInvokeDirs) { 14377 invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount"); 14378 } 14379 if (shapeFlag & 64) { 14380 vnode.type.remove( 14381 vnode, 14382 parentComponent, 14383 parentSuspense, 14384 internals, 14385 doRemove 14386 ); 14387 } else if (dynamicChildren && // #5154 14388 // when v-once is used inside a block, setBlockTracking(-1) marks the 14389 // parent block with hasOnce: true 14390 // so that it doesn't take the fast path during unmount - otherwise 14391 // components nested in v-once are never unmounted. 14392 !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments 14393 (type !== Fragment || patchFlag > 0 && patchFlag & 64)) { 14394 unmountChildren( 14395 dynamicChildren, 14396 parentComponent, 14397 parentSuspense, 14398 false, 14399 true 14400 ); 14401 } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) { 14402 unmountChildren(children, parentComponent, parentSuspense); 14403 } 14404 if (doRemove) { 14405 remove(vnode); 14406 } 14407 } 14408 if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) { 14409 queuePostRenderEffect(() => { 14410 vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); 14411 shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted"); 14412 }, parentSuspense); 14413 } 14414 }; 14415 const remove = (vnode) => { 14416 const { type, el, anchor, transition } = vnode; 14417 if (type === Fragment) { 14418 if ( true && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) { 14419 vnode.children.forEach((child) => { 14420 if (child.type === Comment) { 14421 hostRemove(child.el); 14422 } else { 14423 remove(child); 14424 } 14425 }); 14426 } else { 14427 removeFragment(el, anchor); 14428 } 14429 return; 14430 } 14431 if (type === Static) { 14432 removeStaticNode(vnode); 14433 return; 14434 } 14435 const performRemove = () => { 14436 hostRemove(el); 14437 if (transition && !transition.persisted && transition.afterLeave) { 14438 transition.afterLeave(); 14439 } 14440 }; 14441 if (vnode.shapeFlag & 1 && transition && !transition.persisted) { 14442 const { leave, delayLeave } = transition; 14443 const performLeave = () => leave(el, performRemove); 14444 if (delayLeave) { 14445 delayLeave(vnode.el, performRemove, performLeave); 14446 } else { 14447 performLeave(); 14448 } 14449 } else { 14450 performRemove(); 14451 } 14452 }; 14453 const removeFragment = (cur, end) => { 14454 let next; 14455 while (cur !== end) { 14456 next = hostNextSibling(cur); 14457 hostRemove(cur); 14458 cur = next; 14459 } 14460 hostRemove(end); 14461 }; 14462 const unmountComponent = (instance, parentSuspense, doRemove) => { 14463 if ( true && instance.type.__hmrId) { 14464 unregisterHMR(instance); 14465 } 14466 const { bum, scope, update, subTree, um, m, a } = instance; 14467 invalidateMount(m); 14468 invalidateMount(a); 14469 if (bum) { 14470 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(bum); 14471 } 14472 scope.stop(); 14473 if (update) { 14474 update.active = false; 14475 unmount(subTree, instance, parentSuspense, doRemove); 14476 } 14477 if (um) { 14478 queuePostRenderEffect(um, parentSuspense); 14479 } 14480 queuePostRenderEffect(() => { 14481 instance.isUnmounted = true; 14482 }, parentSuspense); 14483 if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) { 14484 parentSuspense.deps--; 14485 if (parentSuspense.deps === 0) { 14486 parentSuspense.resolve(); 14487 } 14488 } 14489 if (true) { 14490 devtoolsComponentRemoved(instance); 14491 } 14492 }; 14493 const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => { 14494 for (let i = start; i < children.length; i++) { 14495 unmount(children[i], parentComponent, parentSuspense, doRemove, optimized); 14496 } 14497 }; 14498 const getNextHostNode = (vnode) => { 14499 if (vnode.shapeFlag & 6) { 14500 return getNextHostNode(vnode.component.subTree); 14501 } 14502 if (vnode.shapeFlag & 128) { 14503 return vnode.suspense.next(); 14504 } 14505 const el = hostNextSibling(vnode.anchor || vnode.el); 14506 const teleportEnd = el && el[TeleportEndKey]; 14507 return teleportEnd ? hostNextSibling(teleportEnd) : el; 14508 }; 14509 let isFlushing = false; 14510 const render = (vnode, container, namespace) => { 14511 if (vnode == null) { 14512 if (container._vnode) { 14513 unmount(container._vnode, null, null, true); 14514 } 14515 } else { 14516 patch( 14517 container._vnode || null, 14518 vnode, 14519 container, 14520 null, 14521 null, 14522 null, 14523 namespace 14524 ); 14525 } 14526 if (!isFlushing) { 14527 isFlushing = true; 14528 flushPreFlushCbs(); 14529 flushPostFlushCbs(); 14530 isFlushing = false; 14531 } 14532 container._vnode = vnode; 14533 }; 14534 const internals = { 14535 p: patch, 14536 um: unmount, 14537 m: move, 14538 r: remove, 14539 mt: mountComponent, 14540 mc: mountChildren, 14541 pc: patchChildren, 14542 pbc: patchBlockChildren, 14543 n: getNextHostNode, 14544 o: options 14545 }; 14546 let hydrate; 14547 let hydrateNode; 14548 if (createHydrationFns) { 14549 [hydrate, hydrateNode] = createHydrationFns( 14550 internals 14551 ); 14552 } 14553 return { 14554 render, 14555 hydrate, 14556 createApp: createAppAPI(render, hydrate) 14557 }; 14558} 14559function resolveChildrenNamespace({ type, props }, currentNamespace) { 14560 return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace; 14561} 14562function toggleRecurse({ effect, update }, allowed) { 14563 effect.allowRecurse = update.allowRecurse = allowed; 14564} 14565function needTransition(parentSuspense, transition) { 14566 return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted; 14567} 14568function traverseStaticChildren(n1, n2, shallow = false) { 14569 const ch1 = n1.children; 14570 const ch2 = n2.children; 14571 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch1) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ch2)) { 14572 for (let i = 0; i < ch1.length; i++) { 14573 const c1 = ch1[i]; 14574 let c2 = ch2[i]; 14575 if (c2.shapeFlag & 1 && !c2.dynamicChildren) { 14576 if (c2.patchFlag <= 0 || c2.patchFlag === 32) { 14577 c2 = ch2[i] = cloneIfMounted(ch2[i]); 14578 c2.el = c1.el; 14579 } 14580 if (!shallow && c2.patchFlag !== -2) 14581 traverseStaticChildren(c1, c2); 14582 } 14583 if (c2.type === Text) { 14584 c2.el = c1.el; 14585 } 14586 if ( true && c2.type === Comment && !c2.el) { 14587 c2.el = c1.el; 14588 } 14589 } 14590 } 14591} 14592function getSequence(arr) { 14593 const p = arr.slice(); 14594 const result = [0]; 14595 let i, j, u, v, c; 14596 const len = arr.length; 14597 for (i = 0; i < len; i++) { 14598 const arrI = arr[i]; 14599 if (arrI !== 0) { 14600 j = result[result.length - 1]; 14601 if (arr[j] < arrI) { 14602 p[i] = j; 14603 result.push(i); 14604 continue; 14605 } 14606 u = 0; 14607 v = result.length - 1; 14608 while (u < v) { 14609 c = u + v >> 1; 14610 if (arr[result[c]] < arrI) { 14611 u = c + 1; 14612 } else { 14613 v = c; 14614 } 14615 } 14616 if (arrI < arr[result[u]]) { 14617 if (u > 0) { 14618 p[i] = result[u - 1]; 14619 } 14620 result[u] = i; 14621 } 14622 } 14623 } 14624 u = result.length; 14625 v = result[u - 1]; 14626 while (u-- > 0) { 14627 result[u] = v; 14628 v = p[v]; 14629 } 14630 return result; 14631} 14632function locateNonHydratedAsyncRoot(instance) { 14633 const subComponent = instance.subTree.component; 14634 if (subComponent) { 14635 if (subComponent.asyncDep && !subComponent.asyncResolved) { 14636 return subComponent; 14637 } else { 14638 return locateNonHydratedAsyncRoot(subComponent); 14639 } 14640 } 14641} 14642function invalidateMount(hooks) { 14643 if (hooks) { 14644 for (let i = 0; i < hooks.length; i++) hooks[i].active = false; 14645 } 14646} 14647 14648const ssrContextKey = Symbol.for("v-scx"); 14649const useSSRContext = () => { 14650 { 14651 const ctx = inject(ssrContextKey); 14652 if (!ctx) { 14653 true && warn$1( 14654 `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.` 14655 ); 14656 } 14657 return ctx; 14658 } 14659}; 14660 14661function watchEffect(effect, options) { 14662 return doWatch(effect, null, options); 14663} 14664function watchPostEffect(effect, options) { 14665 return doWatch( 14666 effect, 14667 null, 14668 true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, options, { flush: "post" }) : 0 14669 ); 14670} 14671function watchSyncEffect(effect, options) { 14672 return doWatch( 14673 effect, 14674 null, 14675 true ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, options, { flush: "sync" }) : 0 14676 ); 14677} 14678const INITIAL_WATCHER_VALUE = {}; 14679function watch(source, cb, options) { 14680 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(cb)) { 14681 warn$1( 14682 `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.` 14683 ); 14684 } 14685 return doWatch(source, cb, options); 14686} 14687function doWatch(source, cb, { 14688 immediate, 14689 deep, 14690 flush, 14691 once, 14692 onTrack, 14693 onTrigger 14694} = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) { 14695 if (cb && once) { 14696 const _cb = cb; 14697 cb = (...args) => { 14698 _cb(...args); 14699 unwatch(); 14700 }; 14701 } 14702 if ( true && deep !== void 0 && typeof deep === "number") { 14703 warn$1( 14704 `watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.` 14705 ); 14706 } 14707 if ( true && !cb) { 14708 if (immediate !== void 0) { 14709 warn$1( 14710 `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.` 14711 ); 14712 } 14713 if (deep !== void 0) { 14714 warn$1( 14715 `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.` 14716 ); 14717 } 14718 if (once !== void 0) { 14719 warn$1( 14720 `watch() "once" option is only respected when using the watch(source, callback, options?) signature.` 14721 ); 14722 } 14723 } 14724 const warnInvalidSource = (s) => { 14725 warn$1( 14726 `Invalid watch source: `, 14727 s, 14728 `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.` 14729 ); 14730 }; 14731 const instance = currentInstance; 14732 const reactiveGetter = (source2) => deep === true ? source2 : ( 14733 // for deep: false, only traverse root-level properties 14734 traverse(source2, deep === false ? 1 : void 0) 14735 ); 14736 let getter; 14737 let forceTrigger = false; 14738 let isMultiSource = false; 14739 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(source)) { 14740 getter = () => source.value; 14741 forceTrigger = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(source); 14742 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(source)) { 14743 getter = () => reactiveGetter(source); 14744 forceTrigger = true; 14745 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(source)) { 14746 isMultiSource = true; 14747 forceTrigger = source.some((s) => (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(s)); 14748 getter = () => source.map((s) => { 14749 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(s)) { 14750 return s.value; 14751 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(s)) { 14752 return reactiveGetter(s); 14753 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) { 14754 return callWithErrorHandling(s, instance, 2); 14755 } else { 14756 true && warnInvalidSource(s); 14757 } 14758 }); 14759 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(source)) { 14760 if (cb) { 14761 getter = () => callWithErrorHandling(source, instance, 2); 14762 } else { 14763 getter = () => { 14764 if (cleanup) { 14765 cleanup(); 14766 } 14767 return callWithAsyncErrorHandling( 14768 source, 14769 instance, 14770 3, 14771 [onCleanup] 14772 ); 14773 }; 14774 } 14775 } else { 14776 getter = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 14777 true && warnInvalidSource(source); 14778 } 14779 if (cb && deep) { 14780 const baseGetter = getter; 14781 getter = () => traverse(baseGetter()); 14782 } 14783 let cleanup; 14784 let onCleanup = (fn) => { 14785 cleanup = effect.onStop = () => { 14786 callWithErrorHandling(fn, instance, 4); 14787 cleanup = effect.onStop = void 0; 14788 }; 14789 }; 14790 let ssrCleanup; 14791 if (isInSSRComponentSetup) { 14792 onCleanup = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 14793 if (!cb) { 14794 getter(); 14795 } else if (immediate) { 14796 callWithAsyncErrorHandling(cb, instance, 3, [ 14797 getter(), 14798 isMultiSource ? [] : void 0, 14799 onCleanup 14800 ]); 14801 } 14802 if (flush === "sync") { 14803 const ctx = useSSRContext(); 14804 ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); 14805 } else { 14806 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 14807 } 14808 } 14809 let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; 14810 const job = () => { 14811 if (!effect.active || !effect.dirty) { 14812 return; 14813 } 14814 if (cb) { 14815 const newValue = effect.run(); 14816 if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(v, oldValue[i])) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(newValue, oldValue)) || false) { 14817 if (cleanup) { 14818 cleanup(); 14819 } 14820 callWithAsyncErrorHandling(cb, instance, 3, [ 14821 newValue, 14822 // pass undefined as the old value when it's changed for the first time 14823 oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, 14824 onCleanup 14825 ]); 14826 oldValue = newValue; 14827 } 14828 } else { 14829 effect.run(); 14830 } 14831 }; 14832 job.allowRecurse = !!cb; 14833 let scheduler; 14834 if (flush === "sync") { 14835 scheduler = job; 14836 } else if (flush === "post") { 14837 scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); 14838 } else { 14839 job.pre = true; 14840 if (instance) job.id = instance.uid; 14841 scheduler = () => queueJob(job); 14842 } 14843 const effect = new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect(getter, _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP, scheduler); 14844 const scope = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope)(); 14845 const unwatch = () => { 14846 effect.stop(); 14847 if (scope) { 14848 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.remove)(scope.effects, effect); 14849 } 14850 }; 14851 if (true) { 14852 effect.onTrack = onTrack; 14853 effect.onTrigger = onTrigger; 14854 } 14855 if (cb) { 14856 if (immediate) { 14857 job(); 14858 } else { 14859 oldValue = effect.run(); 14860 } 14861 } else if (flush === "post") { 14862 queuePostRenderEffect( 14863 effect.run.bind(effect), 14864 instance && instance.suspense 14865 ); 14866 } else { 14867 effect.run(); 14868 } 14869 if (ssrCleanup) ssrCleanup.push(unwatch); 14870 return unwatch; 14871} 14872function instanceWatch(source, value, options) { 14873 const publicThis = this.proxy; 14874 const getter = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); 14875 let cb; 14876 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) { 14877 cb = value; 14878 } else { 14879 cb = value.handler; 14880 options = value; 14881 } 14882 const reset = setCurrentInstance(this); 14883 const res = doWatch(getter, cb.bind(publicThis), options); 14884 reset(); 14885 return res; 14886} 14887function createPathGetter(ctx, path) { 14888 const segments = path.split("."); 14889 return () => { 14890 let cur = ctx; 14891 for (let i = 0; i < segments.length && cur; i++) { 14892 cur = cur[segments[i]]; 14893 } 14894 return cur; 14895 }; 14896} 14897function traverse(value, depth = Infinity, seen) { 14898 if (depth <= 0 || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(value) || value["__v_skip"]) { 14899 return value; 14900 } 14901 seen = seen || /* @__PURE__ */ new Set(); 14902 if (seen.has(value)) { 14903 return value; 14904 } 14905 seen.add(value); 14906 depth--; 14907 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(value)) { 14908 traverse(value.value, depth, seen); 14909 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { 14910 for (let i = 0; i < value.length; i++) { 14911 traverse(value[i], depth, seen); 14912 } 14913 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMap)(value)) { 14914 value.forEach((v) => { 14915 traverse(v, depth, seen); 14916 }); 14917 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPlainObject)(value)) { 14918 for (const key in value) { 14919 traverse(value[key], depth, seen); 14920 } 14921 for (const key of Object.getOwnPropertySymbols(value)) { 14922 if (Object.prototype.propertyIsEnumerable.call(value, key)) { 14923 traverse(value[key], depth, seen); 14924 } 14925 } 14926 } 14927 return value; 14928} 14929 14930function useModel(props, name, options = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) { 14931 const i = getCurrentInstance(); 14932 if ( true && !i) { 14933 warn$1(`useModel() called without active instance.`); 14934 return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(); 14935 } 14936 if ( true && !i.propsOptions[0][name]) { 14937 warn$1(`useModel() called with prop "${name}" which is not declared.`); 14938 return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.ref)(); 14939 } 14940 const camelizedName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(name); 14941 const hyphenatedName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name); 14942 const modifiers = getModelModifiers(props, name); 14943 const res = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.customRef)((track, trigger) => { 14944 let localValue; 14945 let prevSetValue = _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 14946 let prevEmittedValue; 14947 watchSyncEffect(() => { 14948 const propValue = props[name]; 14949 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(localValue, propValue)) { 14950 localValue = propValue; 14951 trigger(); 14952 } 14953 }); 14954 return { 14955 get() { 14956 track(); 14957 return options.get ? options.get(localValue) : localValue; 14958 }, 14959 set(value) { 14960 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, localValue) && !(prevSetValue !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, prevSetValue))) { 14961 return; 14962 } 14963 const rawProps = i.vnode.props; 14964 if (!(rawProps && // check if parent has passed v-model 14965 (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) { 14966 localValue = value; 14967 trigger(); 14968 } 14969 const emittedValue = options.set ? options.set(value) : value; 14970 i.emit(`update:${name}`, emittedValue); 14971 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, emittedValue) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(value, prevSetValue) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(emittedValue, prevEmittedValue)) { 14972 trigger(); 14973 } 14974 prevSetValue = value; 14975 prevEmittedValue = emittedValue; 14976 } 14977 }; 14978 }); 14979 res[Symbol.iterator] = () => { 14980 let i2 = 0; 14981 return { 14982 next() { 14983 if (i2 < 2) { 14984 return { value: i2++ ? modifiers || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ : res, done: false }; 14985 } else { 14986 return { done: true }; 14987 } 14988 } 14989 }; 14990 }; 14991 return res; 14992} 14993const getModelModifiers = (props, modelName) => { 14994 return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(modelName)}Modifiers`] || props[`${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(modelName)}Modifiers`]; 14995}; 14996 14997function emit(instance, event, ...rawArgs) { 14998 if (instance.isUnmounted) return; 14999 const props = instance.vnode.props || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 15000 if (true) { 15001 const { 15002 emitsOptions, 15003 propsOptions: [propsOptions] 15004 } = instance; 15005 if (emitsOptions) { 15006 if (!(event in emitsOptions) && true) { 15007 if (!propsOptions || !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event) in propsOptions)) { 15008 warn$1( 15009 `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)}" prop.` 15010 ); 15011 } 15012 } else { 15013 const validator = emitsOptions[event]; 15014 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(validator)) { 15015 const isValid = validator(...rawArgs); 15016 if (!isValid) { 15017 warn$1( 15018 `Invalid event arguments: event validation failed for event "${event}".` 15019 ); 15020 } 15021 } 15022 } 15023 } 15024 } 15025 let args = rawArgs; 15026 const isModelListener = event.startsWith("update:"); 15027 const modifiers = isModelListener && getModelModifiers(props, event.slice(7)); 15028 if (modifiers) { 15029 if (modifiers.trim) { 15030 args = rawArgs.map((a) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(a) ? a.trim() : a); 15031 } 15032 if (modifiers.number) { 15033 args = rawArgs.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber); 15034 } 15035 } 15036 if (true) { 15037 devtoolsComponentEmit(instance, event, args); 15038 } 15039 if (true) { 15040 const lowerCaseEvent = event.toLowerCase(); 15041 if (lowerCaseEvent !== event && props[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(lowerCaseEvent)]) { 15042 warn$1( 15043 `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName( 15044 instance, 15045 instance.type 15046 )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)( 15047 event 15048 )}" instead of "${event}".` 15049 ); 15050 } 15051 } 15052 let handlerName; 15053 let handler = props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)(event)] || // also try camelCase event handler (#2249) 15054 props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(event))]; 15055 if (!handler && isModelListener) { 15056 handler = props[handlerName = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toHandlerKey)((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event))]; 15057 } 15058 if (handler) { 15059 callWithAsyncErrorHandling( 15060 handler, 15061 instance, 15062 6, 15063 args 15064 ); 15065 } 15066 const onceHandler = props[handlerName + `Once`]; 15067 if (onceHandler) { 15068 if (!instance.emitted) { 15069 instance.emitted = {}; 15070 } else if (instance.emitted[handlerName]) { 15071 return; 15072 } 15073 instance.emitted[handlerName] = true; 15074 callWithAsyncErrorHandling( 15075 onceHandler, 15076 instance, 15077 6, 15078 args 15079 ); 15080 } 15081} 15082function normalizeEmitsOptions(comp, appContext, asMixin = false) { 15083 const cache = appContext.emitsCache; 15084 const cached = cache.get(comp); 15085 if (cached !== void 0) { 15086 return cached; 15087 } 15088 const raw = comp.emits; 15089 let normalized = {}; 15090 let hasExtends = false; 15091 if ( true && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(comp)) { 15092 const extendEmits = (raw2) => { 15093 const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); 15094 if (normalizedFromExtend) { 15095 hasExtends = true; 15096 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, normalizedFromExtend); 15097 } 15098 }; 15099 if (!asMixin && appContext.mixins.length) { 15100 appContext.mixins.forEach(extendEmits); 15101 } 15102 if (comp.extends) { 15103 extendEmits(comp.extends); 15104 } 15105 if (comp.mixins) { 15106 comp.mixins.forEach(extendEmits); 15107 } 15108 } 15109 if (!raw && !hasExtends) { 15110 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) { 15111 cache.set(comp, null); 15112 } 15113 return null; 15114 } 15115 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(raw)) { 15116 raw.forEach((key) => normalized[key] = null); 15117 } else { 15118 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(normalized, raw); 15119 } 15120 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(comp)) { 15121 cache.set(comp, normalized); 15122 } 15123 return normalized; 15124} 15125function isEmitListener(options, key) { 15126 if (!options || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) { 15127 return false; 15128 } 15129 key = key.slice(2).replace(/Once$/, ""); 15130 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key[0].toLowerCase() + key.slice(1)) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasOwn)(options, key); 15131} 15132 15133let accessedAttrs = false; 15134function markAttrsAccessed() { 15135 accessedAttrs = true; 15136} 15137function renderComponentRoot(instance) { 15138 const { 15139 type: Component, 15140 vnode, 15141 proxy, 15142 withProxy, 15143 propsOptions: [propsOptions], 15144 slots, 15145 attrs, 15146 emit, 15147 render, 15148 renderCache, 15149 props, 15150 data, 15151 setupState, 15152 ctx, 15153 inheritAttrs 15154 } = instance; 15155 const prev = setCurrentRenderingInstance(instance); 15156 let result; 15157 let fallthroughAttrs; 15158 if (true) { 15159 accessedAttrs = false; 15160 } 15161 try { 15162 if (vnode.shapeFlag & 4) { 15163 const proxyToUse = withProxy || proxy; 15164 const thisProxy = true && setupState.__isScriptSetup ? new Proxy(proxyToUse, { 15165 get(target, key, receiver) { 15166 warn$1( 15167 `Property '${String( 15168 key 15169 )}' was accessed via 'this'. Avoid using 'this' in templates.` 15170 ); 15171 return Reflect.get(target, key, receiver); 15172 } 15173 }) : proxyToUse; 15174 result = normalizeVNode( 15175 render.call( 15176 thisProxy, 15177 proxyToUse, 15178 renderCache, 15179 true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0, 15180 setupState, 15181 data, 15182 ctx 15183 ) 15184 ); 15185 fallthroughAttrs = attrs; 15186 } else { 15187 const render2 = Component; 15188 if ( true && attrs === props) { 15189 markAttrsAccessed(); 15190 } 15191 result = normalizeVNode( 15192 render2.length > 1 ? render2( 15193 true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0, 15194 true ? { 15195 get attrs() { 15196 markAttrsAccessed(); 15197 return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(attrs); 15198 }, 15199 slots, 15200 emit 15201 } : 0 15202 ) : render2( 15203 true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(props) : 0, 15204 null 15205 ) 15206 ); 15207 fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); 15208 } 15209 } catch (err) { 15210 blockStack.length = 0; 15211 handleError(err, instance, 1); 15212 result = createVNode(Comment); 15213 } 15214 let root = result; 15215 let setRoot = void 0; 15216 if ( true && result.patchFlag > 0 && result.patchFlag & 2048) { 15217 [root, setRoot] = getChildRoot(result); 15218 } 15219 if (fallthroughAttrs && inheritAttrs !== false) { 15220 const keys = Object.keys(fallthroughAttrs); 15221 const { shapeFlag } = root; 15222 if (keys.length) { 15223 if (shapeFlag & (1 | 6)) { 15224 if (propsOptions && keys.some(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)) { 15225 fallthroughAttrs = filterModelListeners( 15226 fallthroughAttrs, 15227 propsOptions 15228 ); 15229 } 15230 root = cloneVNode(root, fallthroughAttrs, false, true); 15231 } else if ( true && !accessedAttrs && root.type !== Comment) { 15232 const allAttrs = Object.keys(attrs); 15233 const eventAttrs = []; 15234 const extraAttrs = []; 15235 for (let i = 0, l = allAttrs.length; i < l; i++) { 15236 const key = allAttrs[i]; 15237 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) { 15238 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) { 15239 eventAttrs.push(key[2].toLowerCase() + key.slice(3)); 15240 } 15241 } else { 15242 extraAttrs.push(key); 15243 } 15244 } 15245 if (extraAttrs.length) { 15246 warn$1( 15247 `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.` 15248 ); 15249 } 15250 if (eventAttrs.length) { 15251 warn$1( 15252 `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.` 15253 ); 15254 } 15255 } 15256 } 15257 } 15258 if (vnode.dirs) { 15259 if ( true && !isElementRoot(root)) { 15260 warn$1( 15261 `Runtime directive used on component with non-element root node. The directives will not function as intended.` 15262 ); 15263 } 15264 root = cloneVNode(root, null, false, true); 15265 root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; 15266 } 15267 if (vnode.transition) { 15268 if ( true && !isElementRoot(root)) { 15269 warn$1( 15270 `Component inside <Transition> renders non-element root node that cannot be animated.` 15271 ); 15272 } 15273 root.transition = vnode.transition; 15274 } 15275 if ( true && setRoot) { 15276 setRoot(root); 15277 } else { 15278 result = root; 15279 } 15280 setCurrentRenderingInstance(prev); 15281 return result; 15282} 15283const getChildRoot = (vnode) => { 15284 const rawChildren = vnode.children; 15285 const dynamicChildren = vnode.dynamicChildren; 15286 const childRoot = filterSingleRoot(rawChildren, false); 15287 if (!childRoot) { 15288 return [vnode, void 0]; 15289 } else if ( true && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) { 15290 return getChildRoot(childRoot); 15291 } 15292 const index = rawChildren.indexOf(childRoot); 15293 const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; 15294 const setRoot = (updatedRoot) => { 15295 rawChildren[index] = updatedRoot; 15296 if (dynamicChildren) { 15297 if (dynamicIndex > -1) { 15298 dynamicChildren[dynamicIndex] = updatedRoot; 15299 } else if (updatedRoot.patchFlag > 0) { 15300 vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; 15301 } 15302 } 15303 }; 15304 return [normalizeVNode(childRoot), setRoot]; 15305}; 15306function filterSingleRoot(children, recurse = true) { 15307 let singleRoot; 15308 for (let i = 0; i < children.length; i++) { 15309 const child = children[i]; 15310 if (isVNode(child)) { 15311 if (child.type !== Comment || child.children === "v-if") { 15312 if (singleRoot) { 15313 return; 15314 } else { 15315 singleRoot = child; 15316 if ( true && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) { 15317 return filterSingleRoot(singleRoot.children); 15318 } 15319 } 15320 } 15321 } else { 15322 return; 15323 } 15324 } 15325 return singleRoot; 15326} 15327const getFunctionalFallthrough = (attrs) => { 15328 let res; 15329 for (const key in attrs) { 15330 if (key === "class" || key === "style" || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) { 15331 (res || (res = {}))[key] = attrs[key]; 15332 } 15333 } 15334 return res; 15335}; 15336const filterModelListeners = (attrs, props) => { 15337 const res = {}; 15338 for (const key in attrs) { 15339 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key) || !(key.slice(9) in props)) { 15340 res[key] = attrs[key]; 15341 } 15342 } 15343 return res; 15344}; 15345const isElementRoot = (vnode) => { 15346 return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; 15347}; 15348function shouldUpdateComponent(prevVNode, nextVNode, optimized) { 15349 const { props: prevProps, children: prevChildren, component } = prevVNode; 15350 const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; 15351 const emits = component.emitsOptions; 15352 if ( true && (prevChildren || nextChildren) && isHmrUpdating) { 15353 return true; 15354 } 15355 if (nextVNode.dirs || nextVNode.transition) { 15356 return true; 15357 } 15358 if (optimized && patchFlag >= 0) { 15359 if (patchFlag & 1024) { 15360 return true; 15361 } 15362 if (patchFlag & 16) { 15363 if (!prevProps) { 15364 return !!nextProps; 15365 } 15366 return hasPropsChanged(prevProps, nextProps, emits); 15367 } else if (patchFlag & 8) { 15368 const dynamicProps = nextVNode.dynamicProps; 15369 for (let i = 0; i < dynamicProps.length; i++) { 15370 const key = dynamicProps[i]; 15371 if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { 15372 return true; 15373 } 15374 } 15375 } 15376 } else { 15377 if (prevChildren || nextChildren) { 15378 if (!nextChildren || !nextChildren.$stable) { 15379 return true; 15380 } 15381 } 15382 if (prevProps === nextProps) { 15383 return false; 15384 } 15385 if (!prevProps) { 15386 return !!nextProps; 15387 } 15388 if (!nextProps) { 15389 return true; 15390 } 15391 return hasPropsChanged(prevProps, nextProps, emits); 15392 } 15393 return false; 15394} 15395function hasPropsChanged(prevProps, nextProps, emitsOptions) { 15396 const nextKeys = Object.keys(nextProps); 15397 if (nextKeys.length !== Object.keys(prevProps).length) { 15398 return true; 15399 } 15400 for (let i = 0; i < nextKeys.length; i++) { 15401 const key = nextKeys[i]; 15402 if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { 15403 return true; 15404 } 15405 } 15406 return false; 15407} 15408function updateHOCHostEl({ vnode, parent }, el) { 15409 while (parent) { 15410 const root = parent.subTree; 15411 if (root.suspense && root.suspense.activeBranch === vnode) { 15412 root.el = vnode.el; 15413 } 15414 if (root === vnode) { 15415 (vnode = parent.vnode).el = el; 15416 parent = parent.parent; 15417 } else { 15418 break; 15419 } 15420 } 15421} 15422 15423const isSuspense = (type) => type.__isSuspense; 15424let suspenseId = 0; 15425const SuspenseImpl = { 15426 name: "Suspense", 15427 // In order to make Suspense tree-shakable, we need to avoid importing it 15428 // directly in the renderer. The renderer checks for the __isSuspense flag 15429 // on a vnode's type and calls the `process` method, passing in renderer 15430 // internals. 15431 __isSuspense: true, 15432 process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { 15433 if (n1 == null) { 15434 mountSuspense( 15435 n2, 15436 container, 15437 anchor, 15438 parentComponent, 15439 parentSuspense, 15440 namespace, 15441 slotScopeIds, 15442 optimized, 15443 rendererInternals 15444 ); 15445 } else { 15446 if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) { 15447 n2.suspense = n1.suspense; 15448 n2.suspense.vnode = n2; 15449 n2.el = n1.el; 15450 return; 15451 } 15452 patchSuspense( 15453 n1, 15454 n2, 15455 container, 15456 anchor, 15457 parentComponent, 15458 namespace, 15459 slotScopeIds, 15460 optimized, 15461 rendererInternals 15462 ); 15463 } 15464 }, 15465 hydrate: hydrateSuspense, 15466 normalize: normalizeSuspenseChildren 15467}; 15468const Suspense = SuspenseImpl ; 15469function triggerEvent(vnode, name) { 15470 const eventListener = vnode.props && vnode.props[name]; 15471 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(eventListener)) { 15472 eventListener(); 15473 } 15474} 15475function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) { 15476 const { 15477 p: patch, 15478 o: { createElement } 15479 } = rendererInternals; 15480 const hiddenContainer = createElement("div"); 15481 const suspense = vnode.suspense = createSuspenseBoundary( 15482 vnode, 15483 parentSuspense, 15484 parentComponent, 15485 container, 15486 hiddenContainer, 15487 anchor, 15488 namespace, 15489 slotScopeIds, 15490 optimized, 15491 rendererInternals 15492 ); 15493 patch( 15494 null, 15495 suspense.pendingBranch = vnode.ssContent, 15496 hiddenContainer, 15497 null, 15498 parentComponent, 15499 suspense, 15500 namespace, 15501 slotScopeIds 15502 ); 15503 if (suspense.deps > 0) { 15504 triggerEvent(vnode, "onPending"); 15505 triggerEvent(vnode, "onFallback"); 15506 patch( 15507 null, 15508 vnode.ssFallback, 15509 container, 15510 anchor, 15511 parentComponent, 15512 null, 15513 // fallback tree will not have suspense context 15514 namespace, 15515 slotScopeIds 15516 ); 15517 setActiveBranch(suspense, vnode.ssFallback); 15518 } else { 15519 suspense.resolve(false, true); 15520 } 15521} 15522function patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) { 15523 const suspense = n2.suspense = n1.suspense; 15524 suspense.vnode = n2; 15525 n2.el = n1.el; 15526 const newBranch = n2.ssContent; 15527 const newFallback = n2.ssFallback; 15528 const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; 15529 if (pendingBranch) { 15530 suspense.pendingBranch = newBranch; 15531 if (isSameVNodeType(newBranch, pendingBranch)) { 15532 patch( 15533 pendingBranch, 15534 newBranch, 15535 suspense.hiddenContainer, 15536 null, 15537 parentComponent, 15538 suspense, 15539 namespace, 15540 slotScopeIds, 15541 optimized 15542 ); 15543 if (suspense.deps <= 0) { 15544 suspense.resolve(); 15545 } else if (isInFallback) { 15546 if (!isHydrating) { 15547 patch( 15548 activeBranch, 15549 newFallback, 15550 container, 15551 anchor, 15552 parentComponent, 15553 null, 15554 // fallback tree will not have suspense context 15555 namespace, 15556 slotScopeIds, 15557 optimized 15558 ); 15559 setActiveBranch(suspense, newFallback); 15560 } 15561 } 15562 } else { 15563 suspense.pendingId = suspenseId++; 15564 if (isHydrating) { 15565 suspense.isHydrating = false; 15566 suspense.activeBranch = pendingBranch; 15567 } else { 15568 unmount(pendingBranch, parentComponent, suspense); 15569 } 15570 suspense.deps = 0; 15571 suspense.effects.length = 0; 15572 suspense.hiddenContainer = createElement("div"); 15573 if (isInFallback) { 15574 patch( 15575 null, 15576 newBranch, 15577 suspense.hiddenContainer, 15578 null, 15579 parentComponent, 15580 suspense, 15581 namespace, 15582 slotScopeIds, 15583 optimized 15584 ); 15585 if (suspense.deps <= 0) { 15586 suspense.resolve(); 15587 } else { 15588 patch( 15589 activeBranch, 15590 newFallback, 15591 container, 15592 anchor, 15593 parentComponent, 15594 null, 15595 // fallback tree will not have suspense context 15596 namespace, 15597 slotScopeIds, 15598 optimized 15599 ); 15600 setActiveBranch(suspense, newFallback); 15601 } 15602 } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { 15603 patch( 15604 activeBranch, 15605 newBranch, 15606 container, 15607 anchor, 15608 parentComponent, 15609 suspense, 15610 namespace, 15611 slotScopeIds, 15612 optimized 15613 ); 15614 suspense.resolve(true); 15615 } else { 15616 patch( 15617 null, 15618 newBranch, 15619 suspense.hiddenContainer, 15620 null, 15621 parentComponent, 15622 suspense, 15623 namespace, 15624 slotScopeIds, 15625 optimized 15626 ); 15627 if (suspense.deps <= 0) { 15628 suspense.resolve(); 15629 } 15630 } 15631 } 15632 } else { 15633 if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { 15634 patch( 15635 activeBranch, 15636 newBranch, 15637 container, 15638 anchor, 15639 parentComponent, 15640 suspense, 15641 namespace, 15642 slotScopeIds, 15643 optimized 15644 ); 15645 setActiveBranch(suspense, newBranch); 15646 } else { 15647 triggerEvent(n2, "onPending"); 15648 suspense.pendingBranch = newBranch; 15649 if (newBranch.shapeFlag & 512) { 15650 suspense.pendingId = newBranch.component.suspenseId; 15651 } else { 15652 suspense.pendingId = suspenseId++; 15653 } 15654 patch( 15655 null, 15656 newBranch, 15657 suspense.hiddenContainer, 15658 null, 15659 parentComponent, 15660 suspense, 15661 namespace, 15662 slotScopeIds, 15663 optimized 15664 ); 15665 if (suspense.deps <= 0) { 15666 suspense.resolve(); 15667 } else { 15668 const { timeout, pendingId } = suspense; 15669 if (timeout > 0) { 15670 setTimeout(() => { 15671 if (suspense.pendingId === pendingId) { 15672 suspense.fallback(newFallback); 15673 } 15674 }, timeout); 15675 } else if (timeout === 0) { 15676 suspense.fallback(newFallback); 15677 } 15678 } 15679 } 15680 } 15681} 15682let hasWarned = false; 15683function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) { 15684 if ( true && !hasWarned) { 15685 hasWarned = true; 15686 console[console.info ? "info" : "log"]( 15687 `<Suspense> is an experimental feature and its API will likely change.` 15688 ); 15689 } 15690 const { 15691 p: patch, 15692 m: move, 15693 um: unmount, 15694 n: next, 15695 o: { parentNode, remove } 15696 } = rendererInternals; 15697 let parentSuspenseId; 15698 const isSuspensible = isVNodeSuspensible(vnode); 15699 if (isSuspensible) { 15700 if (parentSuspense && parentSuspense.pendingBranch) { 15701 parentSuspenseId = parentSuspense.pendingId; 15702 parentSuspense.deps++; 15703 } 15704 } 15705 const timeout = vnode.props ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(vnode.props.timeout) : void 0; 15706 if (true) { 15707 assertNumber(timeout, `Suspense timeout`); 15708 } 15709 const initialAnchor = anchor; 15710 const suspense = { 15711 vnode, 15712 parent: parentSuspense, 15713 parentComponent, 15714 namespace, 15715 container, 15716 hiddenContainer, 15717 deps: 0, 15718 pendingId: suspenseId++, 15719 timeout: typeof timeout === "number" ? timeout : -1, 15720 activeBranch: null, 15721 pendingBranch: null, 15722 isInFallback: !isHydrating, 15723 isHydrating, 15724 isUnmounted: false, 15725 effects: [], 15726 resolve(resume = false, sync = false) { 15727 if (true) { 15728 if (!resume && !suspense.pendingBranch) { 15729 throw new Error( 15730 `suspense.resolve() is called without a pending branch.` 15731 ); 15732 } 15733 if (suspense.isUnmounted) { 15734 throw new Error( 15735 `suspense.resolve() is called on an already unmounted suspense boundary.` 15736 ); 15737 } 15738 } 15739 const { 15740 vnode: vnode2, 15741 activeBranch, 15742 pendingBranch, 15743 pendingId, 15744 effects, 15745 parentComponent: parentComponent2, 15746 container: container2 15747 } = suspense; 15748 let delayEnter = false; 15749 if (suspense.isHydrating) { 15750 suspense.isHydrating = false; 15751 } else if (!resume) { 15752 delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; 15753 if (delayEnter) { 15754 activeBranch.transition.afterLeave = () => { 15755 if (pendingId === suspense.pendingId) { 15756 move( 15757 pendingBranch, 15758 container2, 15759 anchor === initialAnchor ? next(activeBranch) : anchor, 15760 0 15761 ); 15762 queuePostFlushCb(effects); 15763 } 15764 }; 15765 } 15766 if (activeBranch) { 15767 if (parentNode(activeBranch.el) !== suspense.hiddenContainer) { 15768 anchor = next(activeBranch); 15769 } 15770 unmount(activeBranch, parentComponent2, suspense, true); 15771 } 15772 if (!delayEnter) { 15773 move(pendingBranch, container2, anchor, 0); 15774 } 15775 } 15776 setActiveBranch(suspense, pendingBranch); 15777 suspense.pendingBranch = null; 15778 suspense.isInFallback = false; 15779 let parent = suspense.parent; 15780 let hasUnresolvedAncestor = false; 15781 while (parent) { 15782 if (parent.pendingBranch) { 15783 parent.effects.push(...effects); 15784 hasUnresolvedAncestor = true; 15785 break; 15786 } 15787 parent = parent.parent; 15788 } 15789 if (!hasUnresolvedAncestor && !delayEnter) { 15790 queuePostFlushCb(effects); 15791 } 15792 suspense.effects = []; 15793 if (isSuspensible) { 15794 if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) { 15795 parentSuspense.deps--; 15796 if (parentSuspense.deps === 0 && !sync) { 15797 parentSuspense.resolve(); 15798 } 15799 } 15800 } 15801 triggerEvent(vnode2, "onResolve"); 15802 }, 15803 fallback(fallbackVNode) { 15804 if (!suspense.pendingBranch) { 15805 return; 15806 } 15807 const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense; 15808 triggerEvent(vnode2, "onFallback"); 15809 const anchor2 = next(activeBranch); 15810 const mountFallback = () => { 15811 if (!suspense.isInFallback) { 15812 return; 15813 } 15814 patch( 15815 null, 15816 fallbackVNode, 15817 container2, 15818 anchor2, 15819 parentComponent2, 15820 null, 15821 // fallback tree will not have suspense context 15822 namespace2, 15823 slotScopeIds, 15824 optimized 15825 ); 15826 setActiveBranch(suspense, fallbackVNode); 15827 }; 15828 const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; 15829 if (delayEnter) { 15830 activeBranch.transition.afterLeave = mountFallback; 15831 } 15832 suspense.isInFallback = true; 15833 unmount( 15834 activeBranch, 15835 parentComponent2, 15836 null, 15837 // no suspense so unmount hooks fire now 15838 true 15839 // shouldRemove 15840 ); 15841 if (!delayEnter) { 15842 mountFallback(); 15843 } 15844 }, 15845 move(container2, anchor2, type) { 15846 suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); 15847 suspense.container = container2; 15848 }, 15849 next() { 15850 return suspense.activeBranch && next(suspense.activeBranch); 15851 }, 15852 registerDep(instance, setupRenderEffect, optimized2) { 15853 const isInPendingSuspense = !!suspense.pendingBranch; 15854 if (isInPendingSuspense) { 15855 suspense.deps++; 15856 } 15857 const hydratedEl = instance.vnode.el; 15858 instance.asyncDep.catch((err) => { 15859 handleError(err, instance, 0); 15860 }).then((asyncSetupResult) => { 15861 if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { 15862 return; 15863 } 15864 instance.asyncResolved = true; 15865 const { vnode: vnode2 } = instance; 15866 if (true) { 15867 pushWarningContext(vnode2); 15868 } 15869 handleSetupResult(instance, asyncSetupResult, false); 15870 if (hydratedEl) { 15871 vnode2.el = hydratedEl; 15872 } 15873 const placeholder = !hydratedEl && instance.subTree.el; 15874 setupRenderEffect( 15875 instance, 15876 vnode2, 15877 // component may have been moved before resolve. 15878 // if this is not a hydration, instance.subTree will be the comment 15879 // placeholder. 15880 parentNode(hydratedEl || instance.subTree.el), 15881 // anchor will not be used if this is hydration, so only need to 15882 // consider the comment placeholder case. 15883 hydratedEl ? null : next(instance.subTree), 15884 suspense, 15885 namespace, 15886 optimized2 15887 ); 15888 if (placeholder) { 15889 remove(placeholder); 15890 } 15891 updateHOCHostEl(instance, vnode2.el); 15892 if (true) { 15893 popWarningContext(); 15894 } 15895 if (isInPendingSuspense && --suspense.deps === 0) { 15896 suspense.resolve(); 15897 } 15898 }); 15899 }, 15900 unmount(parentSuspense2, doRemove) { 15901 suspense.isUnmounted = true; 15902 if (suspense.activeBranch) { 15903 unmount( 15904 suspense.activeBranch, 15905 parentComponent, 15906 parentSuspense2, 15907 doRemove 15908 ); 15909 } 15910 if (suspense.pendingBranch) { 15911 unmount( 15912 suspense.pendingBranch, 15913 parentComponent, 15914 parentSuspense2, 15915 doRemove 15916 ); 15917 } 15918 } 15919 }; 15920 return suspense; 15921} 15922function hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) { 15923 const suspense = vnode.suspense = createSuspenseBoundary( 15924 vnode, 15925 parentSuspense, 15926 parentComponent, 15927 node.parentNode, 15928 // eslint-disable-next-line no-restricted-globals 15929 document.createElement("div"), 15930 null, 15931 namespace, 15932 slotScopeIds, 15933 optimized, 15934 rendererInternals, 15935 true 15936 ); 15937 const result = hydrateNode( 15938 node, 15939 suspense.pendingBranch = vnode.ssContent, 15940 parentComponent, 15941 suspense, 15942 slotScopeIds, 15943 optimized 15944 ); 15945 if (suspense.deps === 0) { 15946 suspense.resolve(false, true); 15947 } 15948 return result; 15949} 15950function normalizeSuspenseChildren(vnode) { 15951 const { shapeFlag, children } = vnode; 15952 const isSlotChildren = shapeFlag & 32; 15953 vnode.ssContent = normalizeSuspenseSlot( 15954 isSlotChildren ? children.default : children 15955 ); 15956 vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); 15957} 15958function normalizeSuspenseSlot(s) { 15959 let block; 15960 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(s)) { 15961 const trackBlock = isBlockTreeEnabled && s._c; 15962 if (trackBlock) { 15963 s._d = false; 15964 openBlock(); 15965 } 15966 s = s(); 15967 if (trackBlock) { 15968 s._d = true; 15969 block = currentBlock; 15970 closeBlock(); 15971 } 15972 } 15973 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(s)) { 15974 const singleChild = filterSingleRoot(s); 15975 if ( true && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) { 15976 warn$1(`<Suspense> slots expect a single root node.`); 15977 } 15978 s = singleChild; 15979 } 15980 s = normalizeVNode(s); 15981 if (block && !s.dynamicChildren) { 15982 s.dynamicChildren = block.filter((c) => c !== s); 15983 } 15984 return s; 15985} 15986function queueEffectWithSuspense(fn, suspense) { 15987 if (suspense && suspense.pendingBranch) { 15988 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn)) { 15989 suspense.effects.push(...fn); 15990 } else { 15991 suspense.effects.push(fn); 15992 } 15993 } else { 15994 queuePostFlushCb(fn); 15995 } 15996} 15997function setActiveBranch(suspense, branch) { 15998 suspense.activeBranch = branch; 15999 const { vnode, parentComponent } = suspense; 16000 let el = branch.el; 16001 while (!el && branch.component) { 16002 branch = branch.component.subTree; 16003 el = branch.el; 16004 } 16005 vnode.el = el; 16006 if (parentComponent && parentComponent.subTree === vnode) { 16007 parentComponent.vnode.el = el; 16008 updateHOCHostEl(parentComponent, el); 16009 } 16010} 16011function isVNodeSuspensible(vnode) { 16012 const suspensible = vnode.props && vnode.props.suspensible; 16013 return suspensible != null && suspensible !== false; 16014} 16015 16016const Fragment = Symbol.for("v-fgt"); 16017const Text = Symbol.for("v-txt"); 16018const Comment = Symbol.for("v-cmt"); 16019const Static = Symbol.for("v-stc"); 16020const blockStack = []; 16021let currentBlock = null; 16022function openBlock(disableTracking = false) { 16023 blockStack.push(currentBlock = disableTracking ? null : []); 16024} 16025function closeBlock() { 16026 blockStack.pop(); 16027 currentBlock = blockStack[blockStack.length - 1] || null; 16028} 16029let isBlockTreeEnabled = 1; 16030function setBlockTracking(value) { 16031 isBlockTreeEnabled += value; 16032 if (value < 0 && currentBlock) { 16033 currentBlock.hasOnce = true; 16034 } 16035} 16036function setupBlock(vnode) { 16037 vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_ARR : null; 16038 closeBlock(); 16039 if (isBlockTreeEnabled > 0 && currentBlock) { 16040 currentBlock.push(vnode); 16041 } 16042 return vnode; 16043} 16044function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) { 16045 return setupBlock( 16046 createBaseVNode( 16047 type, 16048 props, 16049 children, 16050 patchFlag, 16051 dynamicProps, 16052 shapeFlag, 16053 true 16054 ) 16055 ); 16056} 16057function createBlock(type, props, children, patchFlag, dynamicProps) { 16058 return setupBlock( 16059 createVNode( 16060 type, 16061 props, 16062 children, 16063 patchFlag, 16064 dynamicProps, 16065 true 16066 ) 16067 ); 16068} 16069function isVNode(value) { 16070 return value ? value.__v_isVNode === true : false; 16071} 16072function isSameVNodeType(n1, n2) { 16073 if ( true && n2.shapeFlag & 6 && n1.component) { 16074 const dirtyInstances = hmrDirtyComponents.get(n2.type); 16075 if (dirtyInstances && dirtyInstances.has(n1.component)) { 16076 n1.shapeFlag &= ~256; 16077 n2.shapeFlag &= ~512; 16078 return false; 16079 } 16080 } 16081 return n1.type === n2.type && n1.key === n2.key; 16082} 16083let vnodeArgsTransformer; 16084function transformVNodeArgs(transformer) { 16085 vnodeArgsTransformer = transformer; 16086} 16087const createVNodeWithArgsTransform = (...args) => { 16088 return _createVNode( 16089 ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args 16090 ); 16091}; 16092const normalizeKey = ({ key }) => key != null ? key : null; 16093const normalizeRef = ({ 16094 ref, 16095 ref_key, 16096 ref_for 16097}) => { 16098 if (typeof ref === "number") { 16099 ref = "" + ref; 16100 } 16101 return ref != null ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(ref) || (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(ref) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null; 16102}; 16103function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) { 16104 const vnode = { 16105 __v_isVNode: true, 16106 __v_skip: true, 16107 type, 16108 props, 16109 key: props && normalizeKey(props), 16110 ref: props && normalizeRef(props), 16111 scopeId: currentScopeId, 16112 slotScopeIds: null, 16113 children, 16114 component: null, 16115 suspense: null, 16116 ssContent: null, 16117 ssFallback: null, 16118 dirs: null, 16119 transition: null, 16120 el: null, 16121 anchor: null, 16122 target: null, 16123 targetStart: null, 16124 targetAnchor: null, 16125 staticCount: 0, 16126 shapeFlag, 16127 patchFlag, 16128 dynamicProps, 16129 dynamicChildren: null, 16130 appContext: null, 16131 ctx: currentRenderingInstance 16132 }; 16133 if (needFullChildrenNormalization) { 16134 normalizeChildren(vnode, children); 16135 if (shapeFlag & 128) { 16136 type.normalize(vnode); 16137 } 16138 } else if (children) { 16139 vnode.shapeFlag |= (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(children) ? 8 : 16; 16140 } 16141 if ( true && vnode.key !== vnode.key) { 16142 warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type); 16143 } 16144 if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself 16145 !isBlockNode && // has current parent block 16146 currentBlock && // presence of a patch flag indicates this node needs patching on updates. 16147 // component nodes also should always be patched, because even if the 16148 // component doesn't need to update, it needs to persist the instance on to 16149 // the next vnode so that it can be properly unmounted later. 16150 (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the 16151 // vnode should not be considered dynamic due to handler caching. 16152 vnode.patchFlag !== 32) { 16153 currentBlock.push(vnode); 16154 } 16155 return vnode; 16156} 16157const createVNode = true ? createVNodeWithArgsTransform : 0; 16158function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) { 16159 if (!type || type === NULL_DYNAMIC_COMPONENT) { 16160 if ( true && !type) { 16161 warn$1(`Invalid vnode type when creating vnode: ${type}.`); 16162 } 16163 type = Comment; 16164 } 16165 if (isVNode(type)) { 16166 const cloned = cloneVNode( 16167 type, 16168 props, 16169 true 16170 /* mergeRef: true */ 16171 ); 16172 if (children) { 16173 normalizeChildren(cloned, children); 16174 } 16175 if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) { 16176 if (cloned.shapeFlag & 6) { 16177 currentBlock[currentBlock.indexOf(type)] = cloned; 16178 } else { 16179 currentBlock.push(cloned); 16180 } 16181 } 16182 cloned.patchFlag = -2; 16183 return cloned; 16184 } 16185 if (isClassComponent(type)) { 16186 type = type.__vccOpts; 16187 } 16188 if (props) { 16189 props = guardReactiveProps(props); 16190 let { class: klass, style } = props; 16191 if (klass && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(klass)) { 16192 props.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)(klass); 16193 } 16194 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(style)) { 16195 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(style) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(style)) { 16196 style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, style); 16197 } 16198 props.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)(style); 16199 } 16200 } 16201 const shapeFlag = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(type) ? 4 : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(type) ? 2 : 0; 16202 if ( true && shapeFlag & 4 && (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(type)) { 16203 type = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(type); 16204 warn$1( 16205 `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \`markRaw\` or using \`shallowRef\` instead of \`ref\`.`, 16206 ` 16207Component that was made reactive: `, 16208 type 16209 ); 16210 } 16211 return createBaseVNode( 16212 type, 16213 props, 16214 children, 16215 patchFlag, 16216 dynamicProps, 16217 shapeFlag, 16218 isBlockNode, 16219 true 16220 ); 16221} 16222function guardReactiveProps(props) { 16223 if (!props) return null; 16224 return (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isProxy)(props) || isInternalObject(props) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, props) : props; 16225} 16226function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) { 16227 const { props, ref, patchFlag, children, transition } = vnode; 16228 const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props; 16229 const cloned = { 16230 __v_isVNode: true, 16231 __v_skip: true, 16232 type: vnode.type, 16233 props: mergedProps, 16234 key: mergedProps && normalizeKey(mergedProps), 16235 ref: extraProps && extraProps.ref ? ( 16236 // #2078 in the case of <component :is="vnode" ref="extra"/> 16237 // if the vnode itself already has a ref, cloneVNode will need to merge 16238 // the refs so the single vnode can be set on multiple refs 16239 mergeRef && ref ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps) 16240 ) : ref, 16241 scopeId: vnode.scopeId, 16242 slotScopeIds: vnode.slotScopeIds, 16243 children: true && patchFlag === -1 && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children) ? children.map(deepCloneVNode) : children, 16244 target: vnode.target, 16245 targetStart: vnode.targetStart, 16246 targetAnchor: vnode.targetAnchor, 16247 staticCount: vnode.staticCount, 16248 shapeFlag: vnode.shapeFlag, 16249 // if the vnode is cloned with extra props, we can no longer assume its 16250 // existing patch flag to be reliable and need to add the FULL_PROPS flag. 16251 // note: preserve flag for fragments since they use the flag for children 16252 // fast paths only. 16253 patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag, 16254 dynamicProps: vnode.dynamicProps, 16255 dynamicChildren: vnode.dynamicChildren, 16256 appContext: vnode.appContext, 16257 dirs: vnode.dirs, 16258 transition, 16259 // These should technically only be non-null on mounted VNodes. However, 16260 // they *should* be copied for kept-alive vnodes. So we just always copy 16261 // them since them being non-null during a mount doesn't affect the logic as 16262 // they will simply be overwritten. 16263 component: vnode.component, 16264 suspense: vnode.suspense, 16265 ssContent: vnode.ssContent && cloneVNode(vnode.ssContent), 16266 ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback), 16267 el: vnode.el, 16268 anchor: vnode.anchor, 16269 ctx: vnode.ctx, 16270 ce: vnode.ce 16271 }; 16272 if (transition && cloneTransition) { 16273 setTransitionHooks( 16274 cloned, 16275 transition.clone(cloned) 16276 ); 16277 } 16278 return cloned; 16279} 16280function deepCloneVNode(vnode) { 16281 const cloned = cloneVNode(vnode); 16282 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(vnode.children)) { 16283 cloned.children = vnode.children.map(deepCloneVNode); 16284 } 16285 return cloned; 16286} 16287function createTextVNode(text = " ", flag = 0) { 16288 return createVNode(Text, null, text, flag); 16289} 16290function createStaticVNode(content, numberOfNodes) { 16291 const vnode = createVNode(Static, null, content); 16292 vnode.staticCount = numberOfNodes; 16293 return vnode; 16294} 16295function createCommentVNode(text = "", asBlock = false) { 16296 return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text); 16297} 16298function normalizeVNode(child) { 16299 if (child == null || typeof child === "boolean") { 16300 return createVNode(Comment); 16301 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(child)) { 16302 return createVNode( 16303 Fragment, 16304 null, 16305 // #3666, avoid reference pollution when reusing vnode 16306 child.slice() 16307 ); 16308 } else if (typeof child === "object") { 16309 return cloneIfMounted(child); 16310 } else { 16311 return createVNode(Text, null, String(child)); 16312 } 16313} 16314function cloneIfMounted(child) { 16315 return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child); 16316} 16317function normalizeChildren(vnode, children) { 16318 let type = 0; 16319 const { shapeFlag } = vnode; 16320 if (children == null) { 16321 children = null; 16322 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(children)) { 16323 type = 16; 16324 } else if (typeof children === "object") { 16325 if (shapeFlag & (1 | 64)) { 16326 const slot = children.default; 16327 if (slot) { 16328 slot._c && (slot._d = false); 16329 normalizeChildren(vnode, slot()); 16330 slot._c && (slot._d = true); 16331 } 16332 return; 16333 } else { 16334 type = 32; 16335 const slotFlag = children._; 16336 if (!slotFlag && !isInternalObject(children)) { 16337 children._ctx = currentRenderingInstance; 16338 } else if (slotFlag === 3 && currentRenderingInstance) { 16339 if (currentRenderingInstance.slots._ === 1) { 16340 children._ = 1; 16341 } else { 16342 children._ = 2; 16343 vnode.patchFlag |= 1024; 16344 } 16345 } 16346 } 16347 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(children)) { 16348 children = { default: children, _ctx: currentRenderingInstance }; 16349 type = 32; 16350 } else { 16351 children = String(children); 16352 if (shapeFlag & 64) { 16353 type = 16; 16354 children = [createTextVNode(children)]; 16355 } else { 16356 type = 8; 16357 } 16358 } 16359 vnode.children = children; 16360 vnode.shapeFlag |= type; 16361} 16362function mergeProps(...args) { 16363 const ret = {}; 16364 for (let i = 0; i < args.length; i++) { 16365 const toMerge = args[i]; 16366 for (const key in toMerge) { 16367 if (key === "class") { 16368 if (ret.class !== toMerge.class) { 16369 ret.class = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([ret.class, toMerge.class]); 16370 } 16371 } else if (key === "style") { 16372 ret.style = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.normalizeStyle)([ret.style, toMerge.style]); 16373 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) { 16374 const existing = ret[key]; 16375 const incoming = toMerge[key]; 16376 if (incoming && existing !== incoming && !((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(existing) && existing.includes(incoming))) { 16377 ret[key] = existing ? [].concat(existing, incoming) : incoming; 16378 } 16379 } else if (key !== "") { 16380 ret[key] = toMerge[key]; 16381 } 16382 } 16383 } 16384 return ret; 16385} 16386function invokeVNodeHook(hook, instance, vnode, prevVNode = null) { 16387 callWithAsyncErrorHandling(hook, instance, 7, [ 16388 vnode, 16389 prevVNode 16390 ]); 16391} 16392 16393const emptyAppContext = createAppContext(); 16394let uid = 0; 16395function createComponentInstance(vnode, parent, suspense) { 16396 const type = vnode.type; 16397 const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext; 16398 const instance = { 16399 uid: uid++, 16400 vnode, 16401 type, 16402 parent, 16403 appContext, 16404 root: null, 16405 // to be immediately set 16406 next: null, 16407 subTree: null, 16408 // will be set synchronously right after creation 16409 effect: null, 16410 update: null, 16411 // will be set synchronously right after creation 16412 scope: new _vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.EffectScope( 16413 true 16414 /* detached */ 16415 ), 16416 render: null, 16417 proxy: null, 16418 exposed: null, 16419 exposeProxy: null, 16420 withProxy: null, 16421 provides: parent ? parent.provides : Object.create(appContext.provides), 16422 accessCache: null, 16423 renderCache: [], 16424 // local resolved assets 16425 components: null, 16426 directives: null, 16427 // resolved props and emits options 16428 propsOptions: normalizePropsOptions(type, appContext), 16429 emitsOptions: normalizeEmitsOptions(type, appContext), 16430 // emit 16431 emit: null, 16432 // to be set immediately 16433 emitted: null, 16434 // props default value 16435 propsDefaults: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16436 // inheritAttrs 16437 inheritAttrs: type.inheritAttrs, 16438 // state 16439 ctx: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16440 data: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16441 props: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16442 attrs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16443 slots: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16444 refs: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16445 setupState: _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ, 16446 setupContext: null, 16447 // suspense related 16448 suspense, 16449 suspenseId: suspense ? suspense.pendingId : 0, 16450 asyncDep: null, 16451 asyncResolved: false, 16452 // lifecycle hooks 16453 // not using enums here because it results in computed properties 16454 isMounted: false, 16455 isUnmounted: false, 16456 isDeactivated: false, 16457 bc: null, 16458 c: null, 16459 bm: null, 16460 m: null, 16461 bu: null, 16462 u: null, 16463 um: null, 16464 bum: null, 16465 da: null, 16466 a: null, 16467 rtg: null, 16468 rtc: null, 16469 ec: null, 16470 sp: null 16471 }; 16472 if (true) { 16473 instance.ctx = createDevRenderContext(instance); 16474 } else {} 16475 instance.root = parent ? parent.root : instance; 16476 instance.emit = emit.bind(null, instance); 16477 if (vnode.ce) { 16478 vnode.ce(instance); 16479 } 16480 return instance; 16481} 16482let currentInstance = null; 16483const getCurrentInstance = () => currentInstance || currentRenderingInstance; 16484let internalSetCurrentInstance; 16485let setInSSRSetupState; 16486{ 16487 const g = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.getGlobalThis)(); 16488 const registerGlobalSetter = (key, setter) => { 16489 let setters; 16490 if (!(setters = g[key])) setters = g[key] = []; 16491 setters.push(setter); 16492 return (v) => { 16493 if (setters.length > 1) setters.forEach((set) => set(v)); 16494 else setters[0](v); 16495 }; 16496 }; 16497 internalSetCurrentInstance = registerGlobalSetter( 16498 `__VUE_INSTANCE_SETTERS__`, 16499 (v) => currentInstance = v 16500 ); 16501 setInSSRSetupState = registerGlobalSetter( 16502 `__VUE_SSR_SETTERS__`, 16503 (v) => isInSSRComponentSetup = v 16504 ); 16505} 16506const setCurrentInstance = (instance) => { 16507 const prev = currentInstance; 16508 internalSetCurrentInstance(instance); 16509 instance.scope.on(); 16510 return () => { 16511 instance.scope.off(); 16512 internalSetCurrentInstance(prev); 16513 }; 16514}; 16515const unsetCurrentInstance = () => { 16516 currentInstance && currentInstance.scope.off(); 16517 internalSetCurrentInstance(null); 16518}; 16519const isBuiltInTag = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.makeMap)("slot,component"); 16520function validateComponentName(name, { isNativeTag }) { 16521 if (isBuiltInTag(name) || isNativeTag(name)) { 16522 warn$1( 16523 "Do not use built-in or reserved HTML elements as component id: " + name 16524 ); 16525 } 16526} 16527function isStatefulComponent(instance) { 16528 return instance.vnode.shapeFlag & 4; 16529} 16530let isInSSRComponentSetup = false; 16531function setupComponent(instance, isSSR = false, optimized = false) { 16532 isSSR && setInSSRSetupState(isSSR); 16533 const { props, children } = instance.vnode; 16534 const isStateful = isStatefulComponent(instance); 16535 initProps(instance, props, isStateful, isSSR); 16536 initSlots(instance, children, optimized); 16537 const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0; 16538 isSSR && setInSSRSetupState(false); 16539 return setupResult; 16540} 16541function setupStatefulComponent(instance, isSSR) { 16542 var _a; 16543 const Component = instance.type; 16544 if (true) { 16545 if (Component.name) { 16546 validateComponentName(Component.name, instance.appContext.config); 16547 } 16548 if (Component.components) { 16549 const names = Object.keys(Component.components); 16550 for (let i = 0; i < names.length; i++) { 16551 validateComponentName(names[i], instance.appContext.config); 16552 } 16553 } 16554 if (Component.directives) { 16555 const names = Object.keys(Component.directives); 16556 for (let i = 0; i < names.length; i++) { 16557 validateDirectiveName(names[i]); 16558 } 16559 } 16560 if (Component.compilerOptions && isRuntimeOnly()) { 16561 warn$1( 16562 `"compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.` 16563 ); 16564 } 16565 } 16566 instance.accessCache = /* @__PURE__ */ Object.create(null); 16567 instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers); 16568 if (true) { 16569 exposePropsOnRenderContext(instance); 16570 } 16571 const { setup } = Component; 16572 if (setup) { 16573 const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null; 16574 const reset = setCurrentInstance(instance); 16575 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 16576 const setupResult = callWithErrorHandling( 16577 setup, 16578 instance, 16579 0, 16580 [ 16581 true ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly)(instance.props) : 0, 16582 setupContext 16583 ] 16584 ); 16585 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 16586 reset(); 16587 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isPromise)(setupResult)) { 16588 setupResult.then(unsetCurrentInstance, unsetCurrentInstance); 16589 if (isSSR) { 16590 return setupResult.then((resolvedResult) => { 16591 handleSetupResult(instance, resolvedResult, isSSR); 16592 }).catch((e) => { 16593 handleError(e, instance, 0); 16594 }); 16595 } else { 16596 instance.asyncDep = setupResult; 16597 if ( true && !instance.suspense) { 16598 const name = (_a = Component.name) != null ? _a : "Anonymous"; 16599 warn$1( 16600 `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.` 16601 ); 16602 } 16603 } 16604 } else { 16605 handleSetupResult(instance, setupResult, isSSR); 16606 } 16607 } else { 16608 finishComponentSetup(instance, isSSR); 16609 } 16610} 16611function handleSetupResult(instance, setupResult, isSSR) { 16612 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(setupResult)) { 16613 if (instance.type.__ssrInlineRender) { 16614 instance.ssrRender = setupResult; 16615 } else { 16616 instance.render = setupResult; 16617 } 16618 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(setupResult)) { 16619 if ( true && isVNode(setupResult)) { 16620 warn$1( 16621 `setup() should not return VNodes directly - return a render function instead.` 16622 ); 16623 } 16624 if (true) { 16625 instance.devtoolsRawSetupState = setupResult; 16626 } 16627 instance.setupState = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)(setupResult); 16628 if (true) { 16629 exposeSetupStateOnRenderContext(instance); 16630 } 16631 } else if ( true && setupResult !== void 0) { 16632 warn$1( 16633 `setup() should return an object. Received: ${setupResult === null ? "null" : typeof setupResult}` 16634 ); 16635 } 16636 finishComponentSetup(instance, isSSR); 16637} 16638let compile; 16639let installWithProxy; 16640function registerRuntimeCompiler(_compile) { 16641 compile = _compile; 16642 installWithProxy = (i) => { 16643 if (i.render._rc) { 16644 i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers); 16645 } 16646 }; 16647} 16648const isRuntimeOnly = () => !compile; 16649function finishComponentSetup(instance, isSSR, skipOptions) { 16650 const Component = instance.type; 16651 if (!instance.render) { 16652 if (!isSSR && compile && !Component.render) { 16653 const template = Component.template || resolveMergedOptions(instance).template; 16654 if (template) { 16655 if (true) { 16656 startMeasure(instance, `compile`); 16657 } 16658 const { isCustomElement, compilerOptions } = instance.appContext.config; 16659 const { delimiters, compilerOptions: componentCompilerOptions } = Component; 16660 const finalCompilerOptions = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 16661 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 16662 { 16663 isCustomElement, 16664 delimiters 16665 }, 16666 compilerOptions 16667 ), 16668 componentCompilerOptions 16669 ); 16670 Component.render = compile(template, finalCompilerOptions); 16671 if (true) { 16672 endMeasure(instance, `compile`); 16673 } 16674 } 16675 } 16676 instance.render = Component.render || _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 16677 if (installWithProxy) { 16678 installWithProxy(instance); 16679 } 16680 } 16681 if (true) { 16682 const reset = setCurrentInstance(instance); 16683 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.pauseTracking)(); 16684 try { 16685 applyOptions(instance); 16686 } finally { 16687 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.resetTracking)(); 16688 reset(); 16689 } 16690 } 16691 if ( true && !Component.render && instance.render === _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP && !isSSR) { 16692 if (!compile && Component.template) { 16693 warn$1( 16694 `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".` ) 16695 ); 16696 } else { 16697 warn$1(`Component is missing template or render function: `, Component); 16698 } 16699 } 16700} 16701const attrsProxyHandlers = true ? { 16702 get(target, key) { 16703 markAttrsAccessed(); 16704 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(target, "get", ""); 16705 return target[key]; 16706 }, 16707 set() { 16708 warn$1(`setupContext.attrs is readonly.`); 16709 return false; 16710 }, 16711 deleteProperty() { 16712 warn$1(`setupContext.attrs is readonly.`); 16713 return false; 16714 } 16715} : 0; 16716function getSlotsProxy(instance) { 16717 return new Proxy(instance.slots, { 16718 get(target, key) { 16719 (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.track)(instance, "get", "$slots"); 16720 return target[key]; 16721 } 16722 }); 16723} 16724function createSetupContext(instance) { 16725 const expose = (exposed) => { 16726 if (true) { 16727 if (instance.exposed) { 16728 warn$1(`expose() should be called only once per setup().`); 16729 } 16730 if (exposed != null) { 16731 let exposedType = typeof exposed; 16732 if (exposedType === "object") { 16733 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(exposed)) { 16734 exposedType = "array"; 16735 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(exposed)) { 16736 exposedType = "ref"; 16737 } 16738 } 16739 if (exposedType !== "object") { 16740 warn$1( 16741 `expose() should be passed a plain object, received ${exposedType}.` 16742 ); 16743 } 16744 } 16745 } 16746 instance.exposed = exposed || {}; 16747 }; 16748 if (true) { 16749 let attrsProxy; 16750 let slotsProxy; 16751 return Object.freeze({ 16752 get attrs() { 16753 return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers)); 16754 }, 16755 get slots() { 16756 return slotsProxy || (slotsProxy = getSlotsProxy(instance)); 16757 }, 16758 get emit() { 16759 return (event, ...args) => instance.emit(event, ...args); 16760 }, 16761 expose 16762 }); 16763 } else {} 16764} 16765function getComponentPublicInstance(instance) { 16766 if (instance.exposed) { 16767 return instance.exposeProxy || (instance.exposeProxy = new Proxy((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.proxyRefs)((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.markRaw)(instance.exposed)), { 16768 get(target, key) { 16769 if (key in target) { 16770 return target[key]; 16771 } else if (key in publicPropertiesMap) { 16772 return publicPropertiesMap[key](instance); 16773 } 16774 }, 16775 has(target, key) { 16776 return key in target || key in publicPropertiesMap; 16777 } 16778 })); 16779 } else { 16780 return instance.proxy; 16781 } 16782} 16783const classifyRE = /(?:^|[-_])(\w)/g; 16784const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); 16785function getComponentName(Component, includeInferred = true) { 16786 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; 16787} 16788function formatComponentName(instance, Component, isRoot = false) { 16789 let name = getComponentName(Component); 16790 if (!name && Component.__file) { 16791 const match = Component.__file.match(/([^/\\]+)\.\w+$/); 16792 if (match) { 16793 name = match[1]; 16794 } 16795 } 16796 if (!name && instance && instance.parent) { 16797 const inferFromRegistry = (registry) => { 16798 for (const key in registry) { 16799 if (registry[key] === Component) { 16800 return key; 16801 } 16802 } 16803 }; 16804 name = inferFromRegistry( 16805 instance.components || instance.parent.type.components 16806 ) || inferFromRegistry(instance.appContext.components); 16807 } 16808 return name ? classify(name) : isRoot ? `App` : `Anonymous`; 16809} 16810function isClassComponent(value) { 16811 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) && "__vccOpts" in value; 16812} 16813 16814const computed = (getterOrOptions, debugOptions) => { 16815 const c = (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.computed)(getterOrOptions, debugOptions, isInSSRComponentSetup); 16816 if (true) { 16817 const i = getCurrentInstance(); 16818 if (i && i.appContext.config.warnRecursiveComputed) { 16819 c._warnRecursive = true; 16820 } 16821 } 16822 return c; 16823}; 16824 16825function h(type, propsOrChildren, children) { 16826 const l = arguments.length; 16827 if (l === 2) { 16828 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(propsOrChildren) && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(propsOrChildren)) { 16829 if (isVNode(propsOrChildren)) { 16830 return createVNode(type, null, [propsOrChildren]); 16831 } 16832 return createVNode(type, propsOrChildren); 16833 } else { 16834 return createVNode(type, null, propsOrChildren); 16835 } 16836 } else { 16837 if (l > 3) { 16838 children = Array.prototype.slice.call(arguments, 2); 16839 } else if (l === 3 && isVNode(children)) { 16840 children = [children]; 16841 } 16842 return createVNode(type, propsOrChildren, children); 16843 } 16844} 16845 16846function initCustomFormatter() { 16847 if ( false || typeof window === "undefined") { 16848 return; 16849 } 16850 const vueStyle = { style: "color:#3ba776" }; 16851 const numberStyle = { style: "color:#1677ff" }; 16852 const stringStyle = { style: "color:#f5222d" }; 16853 const keywordStyle = { style: "color:#eb2f96" }; 16854 const formatter = { 16855 __vue_custom_formatter: true, 16856 header(obj) { 16857 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(obj)) { 16858 return null; 16859 } 16860 if (obj.__isVue) { 16861 return ["div", vueStyle, `VueInstance`]; 16862 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isRef)(obj)) { 16863 return [ 16864 "div", 16865 {}, 16866 ["span", vueStyle, genRefFlag(obj)], 16867 "<", 16868 formatValue(obj.value), 16869 `>` 16870 ]; 16871 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReactive)(obj)) { 16872 return [ 16873 "div", 16874 {}, 16875 ["span", vueStyle, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(obj) ? "ShallowReactive" : "Reactive"], 16876 "<", 16877 formatValue(obj), 16878 `>${(0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj) ? ` (readonly)` : ``}` 16879 ]; 16880 } else if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isReadonly)(obj)) { 16881 return [ 16882 "div", 16883 {}, 16884 ["span", vueStyle, (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(obj) ? "ShallowReadonly" : "Readonly"], 16885 "<", 16886 formatValue(obj), 16887 ">" 16888 ]; 16889 } 16890 return null; 16891 }, 16892 hasBody(obj) { 16893 return obj && obj.__isVue; 16894 }, 16895 body(obj) { 16896 if (obj && obj.__isVue) { 16897 return [ 16898 "div", 16899 {}, 16900 ...formatInstance(obj.$) 16901 ]; 16902 } 16903 } 16904 }; 16905 function formatInstance(instance) { 16906 const blocks = []; 16907 if (instance.type.props && instance.props) { 16908 blocks.push(createInstanceBlock("props", (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.props))); 16909 } 16910 if (instance.setupState !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) { 16911 blocks.push(createInstanceBlock("setup", instance.setupState)); 16912 } 16913 if (instance.data !== _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ) { 16914 blocks.push(createInstanceBlock("data", (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(instance.data))); 16915 } 16916 const computed = extractKeys(instance, "computed"); 16917 if (computed) { 16918 blocks.push(createInstanceBlock("computed", computed)); 16919 } 16920 const injected = extractKeys(instance, "inject"); 16921 if (injected) { 16922 blocks.push(createInstanceBlock("injected", injected)); 16923 } 16924 blocks.push([ 16925 "div", 16926 {}, 16927 [ 16928 "span", 16929 { 16930 style: keywordStyle.style + ";opacity:0.66" 16931 }, 16932 "$ (internal): " 16933 ], 16934 ["object", { object: instance }] 16935 ]); 16936 return blocks; 16937 } 16938 function createInstanceBlock(type, target) { 16939 target = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, target); 16940 if (!Object.keys(target).length) { 16941 return ["span", {}]; 16942 } 16943 return [ 16944 "div", 16945 { style: "line-height:1.25em;margin-bottom:0.6em" }, 16946 [ 16947 "div", 16948 { 16949 style: "color:#476582" 16950 }, 16951 type 16952 ], 16953 [ 16954 "div", 16955 { 16956 style: "padding-left:1.25em" 16957 }, 16958 ...Object.keys(target).map((key) => { 16959 return [ 16960 "div", 16961 {}, 16962 ["span", keywordStyle, key + ": "], 16963 formatValue(target[key], false) 16964 ]; 16965 }) 16966 ] 16967 ]; 16968 } 16969 function formatValue(v, asRaw = true) { 16970 if (typeof v === "number") { 16971 return ["span", numberStyle, v]; 16972 } else if (typeof v === "string") { 16973 return ["span", stringStyle, JSON.stringify(v)]; 16974 } else if (typeof v === "boolean") { 16975 return ["span", keywordStyle, v]; 16976 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(v)) { 16977 return ["object", { object: asRaw ? (0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.toRaw)(v) : v }]; 16978 } else { 16979 return ["span", stringStyle, String(v)]; 16980 } 16981 } 16982 function extractKeys(instance, type) { 16983 const Comp = instance.type; 16984 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(Comp)) { 16985 return; 16986 } 16987 const extracted = {}; 16988 for (const key in instance.ctx) { 16989 if (isKeyOfType(Comp, key, type)) { 16990 extracted[key] = instance.ctx[key]; 16991 } 16992 } 16993 return extracted; 16994 } 16995 function isKeyOfType(Comp, key, type) { 16996 const opts = Comp[type]; 16997 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(opts) && opts.includes(key) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(opts) && key in opts) { 16998 return true; 16999 } 17000 if (Comp.extends && isKeyOfType(Comp.extends, key, type)) { 17001 return true; 17002 } 17003 if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) { 17004 return true; 17005 } 17006 } 17007 function genRefFlag(v) { 17008 if ((0,_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__.isShallow)(v)) { 17009 return `ShallowRef`; 17010 } 17011 if (v.effect) { 17012 return `ComputedRef`; 17013 } 17014 return `Ref`; 17015 } 17016 if (window.devtoolsFormatters) { 17017 window.devtoolsFormatters.push(formatter); 17018 } else { 17019 window.devtoolsFormatters = [formatter]; 17020 } 17021} 17022 17023function withMemo(memo, render, cache, index) { 17024 const cached = cache[index]; 17025 if (cached && isMemoSame(cached, memo)) { 17026 return cached; 17027 } 17028 const ret = render(); 17029 ret.memo = memo.slice(); 17030 ret.cacheIndex = index; 17031 return cache[index] = ret; 17032} 17033function isMemoSame(cached, memo) { 17034 const prev = cached.memo; 17035 if (prev.length != memo.length) { 17036 return false; 17037 } 17038 for (let i = 0; i < prev.length; i++) { 17039 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hasChanged)(prev[i], memo[i])) { 17040 return false; 17041 } 17042 } 17043 if (isBlockTreeEnabled > 0 && currentBlock) { 17044 currentBlock.push(cached); 17045 } 17046 return true; 17047} 17048 17049const version = "3.4.34"; 17050const warn = true ? warn$1 : 0; 17051const ErrorTypeStrings = ErrorTypeStrings$1 ; 17052const devtools = true ? devtools$1 : 0; 17053const setDevtoolsHook = true ? setDevtoolsHook$1 : 0; 17054const _ssrUtils = { 17055 createComponentInstance, 17056 setupComponent, 17057 renderComponentRoot, 17058 setCurrentRenderingInstance, 17059 isVNode: isVNode, 17060 normalizeVNode, 17061 getComponentPublicInstance 17062}; 17063const ssrUtils = _ssrUtils ; 17064const resolveFilter = null; 17065const compatUtils = null; 17066const DeprecationTypes = null; 17067 17068 17069 17070 17071/***/ }), 17072
vendor: 76,108 bytes, lines 17073-18860
17073/***/ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js": 17074/*!***********************************************************************!*\ 17075 !*** ./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js ***! 17076 \***********************************************************************/ 17077/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 17078 17079"use strict"; 17080__webpack_require__.r(__webpack_exports__); 17081/* harmony export */ __webpack_require__.d(__webpack_exports__, { 17082/* harmony export */ BaseTransition: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition; }, 17083/* harmony export */ BaseTransitionPropsValidators: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators; }, 17084/* harmony export */ Comment: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Comment; }, 17085/* harmony export */ DeprecationTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.DeprecationTypes; }, 17086/* harmony export */ EffectScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.EffectScope; }, 17087/* harmony export */ ErrorCodes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; }, 17088/* harmony export */ ErrorTypeStrings: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ErrorTypeStrings; }, 17089/* harmony export */ Fragment: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment; }, 17090/* harmony export */ KeepAlive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.KeepAlive; }, 17091/* harmony export */ ReactiveEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; }, 17092/* harmony export */ Static: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static; }, 17093/* harmony export */ Suspense: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Suspense; }, 17094/* harmony export */ Teleport: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Teleport; }, 17095/* harmony export */ Text: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Text; }, 17096/* harmony export */ TrackOpTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; }, 17097/* harmony export */ Transition: function() { return /* binding */ Transition; }, 17098/* harmony export */ TransitionGroup: function() { return /* binding */ TransitionGroup; }, 17099/* harmony export */ TriggerOpTypes: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; }, 17100/* harmony export */ VueElement: function() { return /* binding */ VueElement; }, 17101/* harmony export */ assertNumber: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber; }, 17102/* harmony export */ callWithAsyncErrorHandling: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling; }, 17103/* harmony export */ callWithErrorHandling: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling; }, 17104/* harmony export */ camelize: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.camelize; }, 17105/* harmony export */ capitalize: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.capitalize; }, 17106/* harmony export */ cloneVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.cloneVNode; }, 17107/* harmony export */ compatUtils: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.compatUtils; }, 17108/* harmony export */ computed: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.computed; }, 17109/* harmony export */ createApp: function() { return /* binding */ createApp; }, 17110/* harmony export */ createBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createBlock; }, 17111/* harmony export */ createCommentVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode; }, 17112/* harmony export */ createElementBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementBlock; }, 17113/* harmony export */ createElementVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createElementVNode; }, 17114/* harmony export */ createHydrationRenderer: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer; }, 17115/* harmony export */ createPropsRestProxy: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy; }, 17116/* harmony export */ createRenderer: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer; }, 17117/* harmony export */ createSSRApp: function() { return /* binding */ createSSRApp; }, 17118/* harmony export */ createSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createSlots; }, 17119/* harmony export */ createStaticVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode; }, 17120/* harmony export */ createTextVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createTextVNode; }, 17121/* harmony export */ createVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode; }, 17122/* harmony export */ customRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.customRef; }, 17123/* harmony export */ defineAsyncComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent; }, 17124/* harmony export */ defineComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent; }, 17125/* harmony export */ defineCustomElement: function() { return /* binding */ defineCustomElement; }, 17126/* harmony export */ defineEmits: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineEmits; }, 17127/* harmony export */ defineExpose: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineExpose; }, 17128/* harmony export */ defineModel: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineModel; }, 17129/* harmony export */ defineOptions: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineOptions; }, 17130/* harmony export */ defineProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineProps; }, 17131/* harmony export */ defineSSRCustomElement: function() { return /* binding */ defineSSRCustomElement; }, 17132/* harmony export */ defineSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineSlots; }, 17133/* harmony export */ devtools: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.devtools; }, 17134/* harmony export */ effect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effect; }, 17135/* harmony export */ effectScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.effectScope; }, 17136/* harmony export */ getCurrentInstance: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance; }, 17137/* harmony export */ getCurrentScope: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; }, 17138/* harmony export */ getTransitionRawChildren: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren; }, 17139/* harmony export */ guardReactiveProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps; }, 17140/* harmony export */ h: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h; }, 17141/* harmony export */ handleError: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.handleError; }, 17142/* harmony export */ hasInjectionContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.hasInjectionContext; }, 17143/* harmony export */ hydrate: function() { return /* binding */ hydrate; }, 17144/* harmony export */ initCustomFormatter: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter; }, 17145/* harmony export */ initDirectivesForSSR: function() { return /* binding */ initDirectivesForSSR; }, 17146/* harmony export */ inject: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.inject; }, 17147/* harmony export */ isMemoSame: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isMemoSame; }, 17148/* harmony export */ isProxy: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isProxy; }, 17149/* harmony export */ isReactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReactive; }, 17150/* harmony export */ isReadonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isReadonly; }, 17151/* harmony export */ isRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRef; }, 17152/* harmony export */ isRuntimeOnly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly; }, 17153/* harmony export */ isShallow: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isShallow; }, 17154/* harmony export */ isVNode: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isVNode; }, 17155/* harmony export */ markRaw: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.markRaw; }, 17156/* harmony export */ mergeDefaults: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults; }, 17157/* harmony export */ mergeModels: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeModels; }, 17158/* harmony export */ mergeProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.mergeProps; }, 17159/* harmony export */ nextTick: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick; }, 17160/* harmony export */ normalizeClass: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeClass; }, 17161/* harmony export */ normalizeProps: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeProps; }, 17162/* harmony export */ normalizeStyle: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle; }, 17163/* harmony export */ onActivated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onActivated; }, 17164/* harmony export */ onBeforeMount: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount; }, 17165/* harmony export */ onBeforeUnmount: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount; }, 17166/* harmony export */ onBeforeUpdate: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate; }, 17167/* harmony export */ onDeactivated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onDeactivated; }, 17168/* harmony export */ onErrorCaptured: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured; }, 17169/* harmony export */ onMounted: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted; }, 17170/* harmony export */ onRenderTracked: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked; }, 17171/* harmony export */ onRenderTriggered: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered; }, 17172/* harmony export */ onScopeDispose: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; }, 17173/* harmony export */ onServerPrefetch: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch; }, 17174/* harmony export */ onUnmounted: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted; }, 17175/* harmony export */ onUpdated: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated; }, 17176/* harmony export */ openBlock: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.openBlock; }, 17177/* harmony export */ popScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.popScopeId; }, 17178/* harmony export */ provide: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.provide; }, 17179/* harmony export */ proxyRefs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; }, 17180/* harmony export */ pushScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.pushScopeId; }, 17181/* harmony export */ queuePostFlushCb: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb; }, 17182/* harmony export */ reactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.reactive; }, 17183/* harmony export */ readonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.readonly; }, 17184/* harmony export */ ref: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ref; }, 17185/* harmony export */ registerRuntimeCompiler: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler; }, 17186/* harmony export */ render: function() { return /* binding */ render; }, 17187/* harmony export */ renderList: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderList; }, 17188/* harmony export */ renderSlot: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.renderSlot; }, 17189/* harmony export */ resolveComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveComponent; }, 17190/* harmony export */ resolveDirective: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDirective; }, 17191/* harmony export */ resolveDynamicComponent: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent; }, 17192/* harmony export */ resolveFilter: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveFilter; }, 17193/* harmony export */ resolveTransitionHooks: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks; }, 17194/* harmony export */ setBlockTracking: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking; }, 17195/* harmony export */ setDevtoolsHook: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook; }, 17196/* harmony export */ setTransitionHooks: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks; }, 17197/* harmony export */ shallowReactive: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; }, 17198/* harmony export */ shallowReadonly: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; }, 17199/* harmony export */ shallowRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.shallowRef; }, 17200/* harmony export */ ssrContextKey: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey; }, 17201/* harmony export */ ssrUtils: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.ssrUtils; }, 17202/* harmony export */ stop: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.stop; }, 17203/* harmony export */ toDisplayString: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toDisplayString; }, 17204/* harmony export */ toHandlerKey: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey; }, 17205/* harmony export */ toHandlers: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toHandlers; }, 17206/* harmony export */ toRaw: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRaw; }, 17207/* harmony export */ toRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRef; }, 17208/* harmony export */ toRefs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toRefs; }, 17209/* harmony export */ toValue: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.toValue; }, 17210/* harmony export */ transformVNodeArgs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs; }, 17211/* harmony export */ triggerRef: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.triggerRef; }, 17212/* harmony export */ unref: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.unref; }, 17213/* harmony export */ useAttrs: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useAttrs; }, 17214/* harmony export */ useCssModule: function() { return /* binding */ useCssModule; }, 17215/* harmony export */ useCssVars: function() { return /* binding */ useCssVars; }, 17216/* harmony export */ useModel: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useModel; }, 17217/* harmony export */ useSSRContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSSRContext; }, 17218/* harmony export */ useSlots: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useSlots; }, 17219/* harmony export */ useTransitionState: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState; }, 17220/* harmony export */ vModelCheckbox: function() { return /* binding */ vModelCheckbox; }, 17221/* harmony export */ vModelDynamic: function() { return /* binding */ vModelDynamic; }, 17222/* harmony export */ vModelRadio: function() { return /* binding */ vModelRadio; }, 17223/* harmony export */ vModelSelect: function() { return /* binding */ vModelSelect; }, 17224/* harmony export */ vModelText: function() { return /* binding */ vModelText; }, 17225/* harmony export */ vShow: function() { return /* binding */ vShow; }, 17226/* harmony export */ version: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.version; }, 17227/* harmony export */ warn: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn; }, 17228/* harmony export */ watch: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watch; }, 17229/* harmony export */ watchEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchEffect; }, 17230/* harmony export */ watchPostEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect; }, 17231/* harmony export */ watchSyncEffect: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect; }, 17232/* harmony export */ withAsyncContext: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext; }, 17233/* harmony export */ withCtx: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withCtx; }, 17234/* harmony export */ withDefaults: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDefaults; }, 17235/* harmony export */ withDirectives: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withDirectives; }, 17236/* harmony export */ withKeys: function() { return /* binding */ withKeys; }, 17237/* harmony export */ withMemo: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withMemo; }, 17238/* harmony export */ withModifiers: function() { return /* binding */ withModifiers; }, 17239/* harmony export */ withScopeId: function() { return /* reexport safe */ _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.withScopeId; } 17240/* harmony export */ }); 17241/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"); 17242/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 17243/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/runtime-core */ "./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js"); 17244/** 17245* @vue/runtime-dom v3.4.34 17246* (c) 2018-present Yuxi (Evan) You and Vue contributors 17247* @license MIT 17248**/ 17249 17250 17251 17252 17253const svgNS = "http://www.w3.org/2000/svg"; 17254const mathmlNS = "http://www.w3.org/1998/Math/MathML"; 17255const doc = typeof document !== "undefined" ? document : null; 17256const templateContainer = doc && /* @__PURE__ */ doc.createElement("template"); 17257const nodeOps = { 17258 insert: (child, parent, anchor) => { 17259 parent.insertBefore(child, anchor || null); 17260 }, 17261 remove: (child) => { 17262 const parent = child.parentNode; 17263 if (parent) { 17264 parent.removeChild(child); 17265 } 17266 }, 17267 createElement: (tag, namespace, is, props) => { 17268 const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag); 17269 if (tag === "select" && props && props.multiple != null) { 17270 el.setAttribute("multiple", props.multiple); 17271 } 17272 return el; 17273 }, 17274 createText: (text) => doc.createTextNode(text), 17275 createComment: (text) => doc.createComment(text), 17276 setText: (node, text) => { 17277 node.nodeValue = text; 17278 }, 17279 setElementText: (el, text) => { 17280 el.textContent = text; 17281 }, 17282 parentNode: (node) => node.parentNode, 17283 nextSibling: (node) => node.nextSibling, 17284 querySelector: (selector) => doc.querySelector(selector), 17285 setScopeId(el, id) { 17286 el.setAttribute(id, ""); 17287 }, 17288 // __UNSAFE__ 17289 // Reason: innerHTML. 17290 // Static content here can only come from compiled templates. 17291 // As long as the user only uses trusted templates, this is safe. 17292 insertStaticContent(content, parent, anchor, namespace, start, end) { 17293 const before = anchor ? anchor.previousSibling : parent.lastChild; 17294 if (start && (start === end || start.nextSibling)) { 17295 while (true) { 17296 parent.insertBefore(start.cloneNode(true), anchor); 17297 if (start === end || !(start = start.nextSibling)) break; 17298 } 17299 } else { 17300 templateContainer.innerHTML = namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content; 17301 const template = templateContainer.content; 17302 if (namespace === "svg" || namespace === "mathml") { 17303 const wrapper = template.firstChild; 17304 while (wrapper.firstChild) { 17305 template.appendChild(wrapper.firstChild); 17306 } 17307 template.removeChild(wrapper); 17308 } 17309 parent.insertBefore(template, anchor); 17310 } 17311 return [ 17312 // first 17313 before ? before.nextSibling : parent.firstChild, 17314 // last 17315 anchor ? anchor.previousSibling : parent.lastChild 17316 ]; 17317 } 17318}; 17319 17320const TRANSITION = "transition"; 17321const ANIMATION = "animation"; 17322const vtcKey = Symbol("_vtc"); 17323const Transition = (props, { slots }) => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.h)(_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransition, resolveTransitionProps(props), slots); 17324Transition.displayName = "Transition"; 17325const DOMTransitionPropsValidators = { 17326 name: String, 17327 type: String, 17328 css: { 17329 type: Boolean, 17330 default: true 17331 }, 17332 duration: [String, Number, Object], 17333 enterFromClass: String, 17334 enterActiveClass: String, 17335 enterToClass: String, 17336 appearFromClass: String, 17337 appearActiveClass: String, 17338 appearToClass: String, 17339 leaveFromClass: String, 17340 leaveActiveClass: String, 17341 leaveToClass: String 17342}; 17343const TransitionPropsValidators = Transition.props = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)( 17344 {}, 17345 _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators, 17346 DOMTransitionPropsValidators 17347); 17348const callHook = (hook, args = []) => { 17349 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook)) { 17350 hook.forEach((h2) => h2(...args)); 17351 } else if (hook) { 17352 hook(...args); 17353 } 17354}; 17355const hasExplicitCallback = (hook) => { 17356 return hook ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false; 17357}; 17358function resolveTransitionProps(rawProps) { 17359 const baseProps = {}; 17360 for (const key in rawProps) { 17361 if (!(key in DOMTransitionPropsValidators)) { 17362 baseProps[key] = rawProps[key]; 17363 } 17364 } 17365 if (rawProps.css === false) { 17366 return baseProps; 17367 } 17368 const { 17369 name = "v", 17370 type, 17371 duration, 17372 enterFromClass = `${name}-enter-from`, 17373 enterActiveClass = `${name}-enter-active`, 17374 enterToClass = `${name}-enter-to`, 17375 appearFromClass = enterFromClass, 17376 appearActiveClass = enterActiveClass, 17377 appearToClass = enterToClass, 17378 leaveFromClass = `${name}-leave-from`, 17379 leaveActiveClass = `${name}-leave-active`, 17380 leaveToClass = `${name}-leave-to` 17381 } = rawProps; 17382 const durations = normalizeDuration(duration); 17383 const enterDuration = durations && durations[0]; 17384 const leaveDuration = durations && durations[1]; 17385 const { 17386 onBeforeEnter, 17387 onEnter, 17388 onEnterCancelled, 17389 onLeave, 17390 onLeaveCancelled, 17391 onBeforeAppear = onBeforeEnter, 17392 onAppear = onEnter, 17393 onAppearCancelled = onEnterCancelled 17394 } = baseProps; 17395 const finishEnter = (el, isAppear, done) => { 17396 removeTransitionClass(el, isAppear ? appearToClass : enterToClass); 17397 removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass); 17398 done && done(); 17399 }; 17400 const finishLeave = (el, done) => { 17401 el._isLeaving = false; 17402 removeTransitionClass(el, leaveFromClass); 17403 removeTransitionClass(el, leaveToClass); 17404 removeTransitionClass(el, leaveActiveClass); 17405 done && done(); 17406 }; 17407 const makeEnterHook = (isAppear) => { 17408 return (el, done) => { 17409 const hook = isAppear ? onAppear : onEnter; 17410 const resolve = () => finishEnter(el, isAppear, done); 17411 callHook(hook, [el, resolve]); 17412 nextFrame(() => { 17413 removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass); 17414 addTransitionClass(el, isAppear ? appearToClass : enterToClass); 17415 if (!hasExplicitCallback(hook)) { 17416 whenTransitionEnds(el, type, enterDuration, resolve); 17417 } 17418 }); 17419 }; 17420 }; 17421 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)(baseProps, { 17422 onBeforeEnter(el) { 17423 callHook(onBeforeEnter, [el]); 17424 addTransitionClass(el, enterFromClass); 17425 addTransitionClass(el, enterActiveClass); 17426 }, 17427 onBeforeAppear(el) { 17428 callHook(onBeforeAppear, [el]); 17429 addTransitionClass(el, appearFromClass); 17430 addTransitionClass(el, appearActiveClass); 17431 }, 17432 onEnter: makeEnterHook(false), 17433 onAppear: makeEnterHook(true), 17434 onLeave(el, done) { 17435 el._isLeaving = true; 17436 const resolve = () => finishLeave(el, done); 17437 addTransitionClass(el, leaveFromClass); 17438 addTransitionClass(el, leaveActiveClass); 17439 forceReflow(); 17440 nextFrame(() => { 17441 if (!el._isLeaving) { 17442 return; 17443 } 17444 removeTransitionClass(el, leaveFromClass); 17445 addTransitionClass(el, leaveToClass); 17446 if (!hasExplicitCallback(onLeave)) { 17447 whenTransitionEnds(el, type, leaveDuration, resolve); 17448 } 17449 }); 17450 callHook(onLeave, [el, resolve]); 17451 }, 17452 onEnterCancelled(el) { 17453 finishEnter(el, false); 17454 callHook(onEnterCancelled, [el]); 17455 }, 17456 onAppearCancelled(el) { 17457 finishEnter(el, true); 17458 callHook(onAppearCancelled, [el]); 17459 }, 17460 onLeaveCancelled(el) { 17461 finishLeave(el); 17462 callHook(onLeaveCancelled, [el]); 17463 } 17464 }); 17465} 17466function normalizeDuration(duration) { 17467 if (duration == null) { 17468 return null; 17469 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isObject)(duration)) { 17470 return [NumberOf(duration.enter), NumberOf(duration.leave)]; 17471 } else { 17472 const n = NumberOf(duration); 17473 return [n, n]; 17474 } 17475} 17476function NumberOf(val) { 17477 const res = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(val); 17478 if (true) { 17479 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.assertNumber)(res, "<transition> explicit duration"); 17480 } 17481 return res; 17482} 17483function addTransitionClass(el, cls) { 17484 cls.split(/\s+/).forEach((c) => c && el.classList.add(c)); 17485 (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls); 17486} 17487function removeTransitionClass(el, cls) { 17488 cls.split(/\s+/).forEach((c) => c && el.classList.remove(c)); 17489 const _vtc = el[vtcKey]; 17490 if (_vtc) { 17491 _vtc.delete(cls); 17492 if (!_vtc.size) { 17493 el[vtcKey] = void 0; 17494 } 17495 } 17496} 17497function nextFrame(cb) { 17498 requestAnimationFrame(() => { 17499 requestAnimationFrame(cb); 17500 }); 17501} 17502let endId = 0; 17503function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) { 17504 const id = el._endId = ++endId; 17505 const resolveIfNotStale = () => { 17506 if (id === el._endId) { 17507 resolve(); 17508 } 17509 }; 17510 if (explicitTimeout) { 17511 return setTimeout(resolveIfNotStale, explicitTimeout); 17512 } 17513 const { type, timeout, propCount } = getTransitionInfo(el, expectedType); 17514 if (!type) { 17515 return resolve(); 17516 } 17517 const endEvent = type + "end"; 17518 let ended = 0; 17519 const end = () => { 17520 el.removeEventListener(endEvent, onEnd); 17521 resolveIfNotStale(); 17522 }; 17523 const onEnd = (e) => { 17524 if (e.target === el && ++ended >= propCount) { 17525 end(); 17526 } 17527 }; 17528 setTimeout(() => { 17529 if (ended < propCount) { 17530 end(); 17531 } 17532 }, timeout + 1); 17533 el.addEventListener(endEvent, onEnd); 17534} 17535function getTransitionInfo(el, expectedType) { 17536 const styles = window.getComputedStyle(el); 17537 const getStyleProperties = (key) => (styles[key] || "").split(", "); 17538 const transitionDelays = getStyleProperties(`${TRANSITION}Delay`); 17539 const transitionDurations = getStyleProperties(`${TRANSITION}Duration`); 17540 const transitionTimeout = getTimeout(transitionDelays, transitionDurations); 17541 const animationDelays = getStyleProperties(`${ANIMATION}Delay`); 17542 const animationDurations = getStyleProperties(`${ANIMATION}Duration`); 17543 const animationTimeout = getTimeout(animationDelays, animationDurations); 17544 let type = null; 17545 let timeout = 0; 17546 let propCount = 0; 17547 if (expectedType === TRANSITION) { 17548 if (transitionTimeout > 0) { 17549 type = TRANSITION; 17550 timeout = transitionTimeout; 17551 propCount = transitionDurations.length; 17552 } 17553 } else if (expectedType === ANIMATION) { 17554 if (animationTimeout > 0) { 17555 type = ANIMATION; 17556 timeout = animationTimeout; 17557 propCount = animationDurations.length; 17558 } 17559 } else { 17560 timeout = Math.max(transitionTimeout, animationTimeout); 17561 type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null; 17562 propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0; 17563 } 17564 const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/.test( 17565 getStyleProperties(`${TRANSITION}Property`).toString() 17566 ); 17567 return { 17568 type, 17569 timeout, 17570 propCount, 17571 hasTransform 17572 }; 17573} 17574function getTimeout(delays, durations) { 17575 while (delays.length < durations.length) { 17576 delays = delays.concat(delays); 17577 } 17578 return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i]))); 17579} 17580function toMs(s) { 17581 if (s === "auto") return 0; 17582 return Number(s.slice(0, -1).replace(",", ".")) * 1e3; 17583} 17584function forceReflow() { 17585 return document.body.offsetHeight; 17586} 17587 17588function patchClass(el, value, isSVG) { 17589 const transitionClasses = el[vtcKey]; 17590 if (transitionClasses) { 17591 value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" "); 17592 } 17593 if (value == null) { 17594 el.removeAttribute("class"); 17595 } else if (isSVG) { 17596 el.setAttribute("class", value); 17597 } else { 17598 el.className = value; 17599 } 17600} 17601 17602const vShowOriginalDisplay = Symbol("_vod"); 17603const vShowHidden = Symbol("_vsh"); 17604const vShow = { 17605 beforeMount(el, { value }, { transition }) { 17606 el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display; 17607 if (transition && value) { 17608 transition.beforeEnter(el); 17609 } else { 17610 setDisplay(el, value); 17611 } 17612 }, 17613 mounted(el, { value }, { transition }) { 17614 if (transition && value) { 17615 transition.enter(el); 17616 } 17617 }, 17618 updated(el, { value, oldValue }, { transition }) { 17619 if (!value === !oldValue) return; 17620 if (transition) { 17621 if (value) { 17622 transition.beforeEnter(el); 17623 setDisplay(el, true); 17624 transition.enter(el); 17625 } else { 17626 transition.leave(el, () => { 17627 setDisplay(el, false); 17628 }); 17629 } 17630 } else { 17631 setDisplay(el, value); 17632 } 17633 }, 17634 beforeUnmount(el, { value }) { 17635 setDisplay(el, value); 17636 } 17637}; 17638if (true) { 17639 vShow.name = "show"; 17640} 17641function setDisplay(el, value) { 17642 el.style.display = value ? el[vShowOriginalDisplay] : "none"; 17643 el[vShowHidden] = !value; 17644} 17645function initVShowForSSR() { 17646 vShow.getSSRProps = ({ value }) => { 17647 if (!value) { 17648 return { style: { display: "none" } }; 17649 } 17650 }; 17651} 17652 17653const CSS_VAR_TEXT = Symbol( true ? "CSS_VAR_TEXT" : 0); 17654function useCssVars(getter) { 17655 const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)(); 17656 if (!instance) { 17657 true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssVars is called without current active component instance.`); 17658 return; 17659 } 17660 const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => { 17661 Array.from( 17662 document.querySelectorAll(`[data-v-owner="${instance.uid}"]`) 17663 ).forEach((node) => setVarsOnNode(node, vars)); 17664 }; 17665 if (true) { 17666 instance.getCssVars = () => getter(instance.proxy); 17667 } 17668 const setVars = () => { 17669 const vars = getter(instance.proxy); 17670 setVarsOnVNode(instance.subTree, vars); 17671 updateTeleports(vars); 17672 }; 17673 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => { 17674 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect)(setVars); 17675 const ob = new MutationObserver(setVars); 17676 ob.observe(instance.subTree.el.parentNode, { childList: true }); 17677 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUnmounted)(() => ob.disconnect()); 17678 }); 17679} 17680function setVarsOnVNode(vnode, vars) { 17681 if (vnode.shapeFlag & 128) { 17682 const suspense = vnode.suspense; 17683 vnode = suspense.activeBranch; 17684 if (suspense.pendingBranch && !suspense.isHydrating) { 17685 suspense.effects.push(() => { 17686 setVarsOnVNode(suspense.activeBranch, vars); 17687 }); 17688 } 17689 } 17690 while (vnode.component) { 17691 vnode = vnode.component.subTree; 17692 } 17693 if (vnode.shapeFlag & 1 && vnode.el) { 17694 setVarsOnNode(vnode.el, vars); 17695 } else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment) { 17696 vnode.children.forEach((c) => setVarsOnVNode(c, vars)); 17697 } else if (vnode.type === _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Static) { 17698 let { el, anchor } = vnode; 17699 while (el) { 17700 setVarsOnNode(el, vars); 17701 if (el === anchor) break; 17702 el = el.nextSibling; 17703 } 17704 } 17705} 17706function setVarsOnNode(el, vars) { 17707 if (el.nodeType === 1) { 17708 const style = el.style; 17709 let cssText = ""; 17710 for (const key in vars) { 17711 style.setProperty(`--${key}`, vars[key]); 17712 cssText += `--${key}: ${vars[key]};`; 17713 } 17714 style[CSS_VAR_TEXT] = cssText; 17715 } 17716} 17717 17718const displayRE = /(^|;)\s*display\s*:/; 17719function patchStyle(el, prev, next) { 17720 const style = el.style; 17721 const isCssString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(next); 17722 let hasControlledDisplay = false; 17723 if (next && !isCssString) { 17724 if (prev) { 17725 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(prev)) { 17726 for (const key in prev) { 17727 if (next[key] == null) { 17728 setStyle(style, key, ""); 17729 } 17730 } 17731 } else { 17732 for (const prevStyle of prev.split(";")) { 17733 const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim(); 17734 if (next[key] == null) { 17735 setStyle(style, key, ""); 17736 } 17737 } 17738 } 17739 } 17740 for (const key in next) { 17741 if (key === "display") { 17742 hasControlledDisplay = true; 17743 } 17744 setStyle(style, key, next[key]); 17745 } 17746 } else { 17747 if (isCssString) { 17748 if (prev !== next) { 17749 const cssVarText = style[CSS_VAR_TEXT]; 17750 if (cssVarText) { 17751 next += ";" + cssVarText; 17752 } 17753 style.cssText = next; 17754 hasControlledDisplay = displayRE.test(next); 17755 } 17756 } else if (prev) { 17757 el.removeAttribute("style"); 17758 } 17759 } 17760 if (vShowOriginalDisplay in el) { 17761 el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : ""; 17762 if (el[vShowHidden]) { 17763 style.display = "none"; 17764 } 17765 } 17766} 17767const semicolonRE = /[^\\];\s*$/; 17768const importantRE = /\s*!important$/; 17769function setStyle(style, name, val) { 17770 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(val)) { 17771 val.forEach((v) => setStyle(style, name, v)); 17772 } else { 17773 if (val == null) val = ""; 17774 if (true) { 17775 if (semicolonRE.test(val)) { 17776 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 17777 `Unexpected semicolon at the end of '${name}' style value: '${val}'` 17778 ); 17779 } 17780 } 17781 if (name.startsWith("--")) { 17782 style.setProperty(name, val); 17783 } else { 17784 const prefixed = autoPrefix(style, name); 17785 if (importantRE.test(val)) { 17786 style.setProperty( 17787 (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(prefixed), 17788 val.replace(importantRE, ""), 17789 "important" 17790 ); 17791 } else { 17792 style[prefixed] = val; 17793 } 17794 } 17795 } 17796} 17797const prefixes = ["Webkit", "Moz", "ms"]; 17798const prefixCache = {}; 17799function autoPrefix(style, rawName) { 17800 const cached = prefixCache[rawName]; 17801 if (cached) { 17802 return cached; 17803 } 17804 let name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(rawName); 17805 if (name !== "filter" && name in style) { 17806 return prefixCache[rawName] = name; 17807 } 17808 name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.capitalize)(name); 17809 for (let i = 0; i < prefixes.length; i++) { 17810 const prefixed = prefixes[i] + name; 17811 if (prefixed in style) { 17812 return prefixCache[rawName] = prefixed; 17813 } 17814 } 17815 return rawName; 17816} 17817 17818const xlinkNS = "http://www.w3.org/1999/xlink"; 17819function patchAttr(el, key, value, isSVG, instance, isBoolean = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSpecialBooleanAttr)(key)) { 17820 if (isSVG && key.startsWith("xlink:")) { 17821 if (value == null) { 17822 el.removeAttributeNS(xlinkNS, key.slice(6, key.length)); 17823 } else { 17824 el.setAttributeNS(xlinkNS, key, value); 17825 } 17826 } else { 17827 if (value == null || isBoolean && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value)) { 17828 el.removeAttribute(key); 17829 } else { 17830 el.setAttribute( 17831 key, 17832 isBoolean ? "" : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSymbol)(value) ? String(value) : value 17833 ); 17834 } 17835 } 17836} 17837 17838function patchDOMProp(el, key, value, parentComponent) { 17839 if (key === "innerHTML" || key === "textContent") { 17840 if (value == null) return; 17841 el[key] = value; 17842 return; 17843 } 17844 const tag = el.tagName; 17845 if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally 17846 !tag.includes("-")) { 17847 const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value; 17848 const newValue = value == null ? "" : String(value); 17849 if (oldValue !== newValue || !("_value" in el)) { 17850 el.value = newValue; 17851 } 17852 if (value == null) { 17853 el.removeAttribute(key); 17854 } 17855 el._value = value; 17856 return; 17857 } 17858 let needRemove = false; 17859 if (value === "" || value == null) { 17860 const type = typeof el[key]; 17861 if (type === "boolean") { 17862 value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.includeBooleanAttr)(value); 17863 } else if (value == null && type === "string") { 17864 value = ""; 17865 needRemove = true; 17866 } else if (type === "number") { 17867 value = 0; 17868 needRemove = true; 17869 } 17870 } 17871 try { 17872 el[key] = value; 17873 } catch (e) { 17874 if ( true && !needRemove) { 17875 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 17876 `Failed setting prop "${key}" on <${tag.toLowerCase()}>: value ${value} is invalid.`, 17877 e 17878 ); 17879 } 17880 } 17881 needRemove && el.removeAttribute(key); 17882} 17883 17884function addEventListener(el, event, handler, options) { 17885 el.addEventListener(event, handler, options); 17886} 17887function removeEventListener(el, event, handler, options) { 17888 el.removeEventListener(event, handler, options); 17889} 17890const veiKey = Symbol("_vei"); 17891function patchEvent(el, rawName, prevValue, nextValue, instance = null) { 17892 const invokers = el[veiKey] || (el[veiKey] = {}); 17893 const existingInvoker = invokers[rawName]; 17894 if (nextValue && existingInvoker) { 17895 existingInvoker.value = true ? sanitizeEventValue(nextValue, rawName) : 0; 17896 } else { 17897 const [name, options] = parseName(rawName); 17898 if (nextValue) { 17899 const invoker = invokers[rawName] = createInvoker( 17900 true ? sanitizeEventValue(nextValue, rawName) : 0, 17901 instance 17902 ); 17903 addEventListener(el, name, invoker, options); 17904 } else if (existingInvoker) { 17905 removeEventListener(el, name, existingInvoker, options); 17906 invokers[rawName] = void 0; 17907 } 17908 } 17909} 17910const optionsModifierRE = /(?:Once|Passive|Capture)$/; 17911function parseName(name) { 17912 let options; 17913 if (optionsModifierRE.test(name)) { 17914 options = {}; 17915 let m; 17916 while (m = name.match(optionsModifierRE)) { 17917 name = name.slice(0, name.length - m[0].length); 17918 options[m[0].toLowerCase()] = true; 17919 } 17920 } 17921 const event = name[2] === ":" ? name.slice(3) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(name.slice(2)); 17922 return [event, options]; 17923} 17924let cachedNow = 0; 17925const p = /* @__PURE__ */ Promise.resolve(); 17926const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now()); 17927function createInvoker(initialValue, instance) { 17928 const invoker = (e) => { 17929 if (!e._vts) { 17930 e._vts = Date.now(); 17931 } else if (e._vts <= invoker.attached) { 17932 return; 17933 } 17934 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling)( 17935 patchStopImmediatePropagation(e, invoker.value), 17936 instance, 17937 5, 17938 [e] 17939 ); 17940 }; 17941 invoker.value = initialValue; 17942 invoker.attached = getNow(); 17943 return invoker; 17944} 17945function sanitizeEventValue(value, propName) { 17946 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { 17947 return value; 17948 } 17949 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 17950 `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop? 17951Expected function or array of functions, received type ${typeof value}.` 17952 ); 17953 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.NOOP; 17954} 17955function patchStopImmediatePropagation(e, value) { 17956 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { 17957 const originalStop = e.stopImmediatePropagation; 17958 e.stopImmediatePropagation = () => { 17959 originalStop.call(e); 17960 e._stopped = true; 17961 }; 17962 return value.map( 17963 (fn) => (e2) => !e2._stopped && fn && fn(e2) 17964 ); 17965 } else { 17966 return value; 17967 } 17968} 17969 17970const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter 17971key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123; 17972const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => { 17973 const isSVG = namespace === "svg"; 17974 if (key === "class") { 17975 patchClass(el, nextValue, isSVG); 17976 } else if (key === "style") { 17977 patchStyle(el, prevValue, nextValue); 17978 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isOn)(key)) { 17979 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isModelListener)(key)) { 17980 patchEvent(el, key, prevValue, nextValue, parentComponent); 17981 } 17982 } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) { 17983 patchDOMProp(el, key, nextValue); 17984 if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) { 17985 patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value"); 17986 } 17987 } else { 17988 if (key === "true-value") { 17989 el._trueValue = nextValue; 17990 } else if (key === "false-value") { 17991 el._falseValue = nextValue; 17992 } 17993 patchAttr(el, key, nextValue, isSVG); 17994 } 17995}; 17996function shouldSetAsProp(el, key, value, isSVG) { 17997 if (isSVG) { 17998 if (key === "innerHTML" || key === "textContent") { 17999 return true; 18000 } 18001 if (key in el && isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(value)) { 18002 return true; 18003 } 18004 return false; 18005 } 18006 if (key === "spellcheck" || key === "draggable" || key === "translate") { 18007 return false; 18008 } 18009 if (key === "form") { 18010 return false; 18011 } 18012 if (key === "list" && el.tagName === "INPUT") { 18013 return false; 18014 } 18015 if (key === "type" && el.tagName === "TEXTAREA") { 18016 return false; 18017 } 18018 if (key === "width" || key === "height") { 18019 const tag = el.tagName; 18020 if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") { 18021 return false; 18022 } 18023 } 18024 if (isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(value)) { 18025 return false; 18026 } 18027 return key in el; 18028} 18029 18030/*! #__NO_SIDE_EFFECTS__ */ 18031// @__NO_SIDE_EFFECTS__ 18032function defineCustomElement(options, extraOptions, hydrate2) { 18033 const Comp = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.defineComponent)(options, extraOptions); 18034 class VueCustomElement extends VueElement { 18035 constructor(initialProps) { 18036 super(Comp, initialProps, hydrate2); 18037 } 18038 } 18039 VueCustomElement.def = Comp; 18040 return VueCustomElement; 18041} 18042/*! #__NO_SIDE_EFFECTS__ */ 18043const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => { 18044 return /* @__PURE__ */ defineCustomElement(options, extraOptions, hydrate); 18045}; 18046const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class { 18047}; 18048class VueElement extends BaseClass { 18049 constructor(_def, _props = {}, hydrate2) { 18050 super(); 18051 this._def = _def; 18052 this._props = _props; 18053 /** 18054 * @internal 18055 */ 18056 this._instance = null; 18057 this._connected = false; 18058 this._resolved = false; 18059 this._numberProps = null; 18060 this._ob = null; 18061 if (this.shadowRoot && hydrate2) { 18062 hydrate2(this._createVNode(), this.shadowRoot); 18063 } else { 18064 if ( true && this.shadowRoot) { 18065 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 18066 `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \`defineSSRCustomElement\`.` 18067 ); 18068 } 18069 this.attachShadow({ mode: "open" }); 18070 if (!this._def.__asyncLoader) { 18071 this._resolveProps(this._def); 18072 } 18073 } 18074 } 18075 connectedCallback() { 18076 this._connected = true; 18077 if (!this._instance) { 18078 if (this._resolved) { 18079 this._update(); 18080 } else { 18081 this._resolveDef(); 18082 } 18083 } 18084 } 18085 disconnectedCallback() { 18086 this._connected = false; 18087 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => { 18088 if (!this._connected) { 18089 if (this._ob) { 18090 this._ob.disconnect(); 18091 this._ob = null; 18092 } 18093 render(null, this.shadowRoot); 18094 this._instance = null; 18095 } 18096 }); 18097 } 18098 /** 18099 * resolve inner component definition (handle possible async component) 18100 */ 18101 _resolveDef() { 18102 this._resolved = true; 18103 for (let i = 0; i < this.attributes.length; i++) { 18104 this._setAttr(this.attributes[i].name); 18105 } 18106 this._ob = new MutationObserver((mutations) => { 18107 for (const m of mutations) { 18108 this._setAttr(m.attributeName); 18109 } 18110 }); 18111 this._ob.observe(this, { attributes: true }); 18112 const resolve = (def, isAsync = false) => { 18113 const { props, styles } = def; 18114 let numberProps; 18115 if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props)) { 18116 for (const key in props) { 18117 const opt = props[key]; 18118 if (opt === Number || opt && opt.type === Number) { 18119 if (key in this._props) { 18120 this._props[key] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(this._props[key]); 18121 } 18122 (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key)] = true; 18123 } 18124 } 18125 } 18126 this._numberProps = numberProps; 18127 if (isAsync) { 18128 this._resolveProps(def); 18129 } 18130 this._applyStyles(styles); 18131 this._update(); 18132 }; 18133 const asyncDef = this._def.__asyncLoader; 18134 if (asyncDef) { 18135 asyncDef().then((def) => resolve(def, true)); 18136 } else { 18137 resolve(this._def); 18138 } 18139 } 18140 _resolveProps(def) { 18141 const { props } = def; 18142 const declaredPropKeys = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(props) ? props : Object.keys(props || {}); 18143 for (const key of Object.keys(this)) { 18144 if (key[0] !== "_" && declaredPropKeys.includes(key)) { 18145 this._setProp(key, this[key], true, false); 18146 } 18147 } 18148 for (const key of declaredPropKeys.map(_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)) { 18149 Object.defineProperty(this, key, { 18150 get() { 18151 return this._getProp(key); 18152 }, 18153 set(val) { 18154 this._setProp(key, val); 18155 } 18156 }); 18157 } 18158 } 18159 _setAttr(key) { 18160 let value = this.hasAttribute(key) ? this.getAttribute(key) : void 0; 18161 const camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.camelize)(key); 18162 if (this._numberProps && this._numberProps[camelKey]) { 18163 value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.toNumber)(value); 18164 } 18165 this._setProp(camelKey, value, false); 18166 } 18167 /** 18168 * @internal 18169 */ 18170 _getProp(key) { 18171 return this._props[key]; 18172 } 18173 /** 18174 * @internal 18175 */ 18176 _setProp(key, val, shouldReflect = true, shouldUpdate = true) { 18177 if (val !== this._props[key]) { 18178 this._props[key] = val; 18179 if (shouldUpdate && this._instance) { 18180 this._update(); 18181 } 18182 if (shouldReflect) { 18183 if (val === true) { 18184 this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), ""); 18185 } else if (typeof val === "string" || typeof val === "number") { 18186 this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key), val + ""); 18187 } else if (!val) { 18188 this.removeAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(key)); 18189 } 18190 } 18191 } 18192 } 18193 _update() { 18194 render(this._createVNode(), this.shadowRoot); 18195 } 18196 _createVNode() { 18197 const vnode = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(this._def, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, this._props)); 18198 if (!this._instance) { 18199 vnode.ce = (instance) => { 18200 this._instance = instance; 18201 instance.isCE = true; 18202 if (true) { 18203 instance.ceReload = (newStyles) => { 18204 if (this._styles) { 18205 this._styles.forEach((s) => this.shadowRoot.removeChild(s)); 18206 this._styles.length = 0; 18207 } 18208 this._applyStyles(newStyles); 18209 this._instance = null; 18210 this._update(); 18211 }; 18212 } 18213 const dispatch = (event, args) => { 18214 this.dispatchEvent( 18215 new CustomEvent(event, { 18216 detail: args 18217 }) 18218 ); 18219 }; 18220 instance.emit = (event, ...args) => { 18221 dispatch(event, args); 18222 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event) !== event) { 18223 dispatch((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event), args); 18224 } 18225 }; 18226 let parent = this; 18227 while (parent = parent && (parent.parentNode || parent.host)) { 18228 if (parent instanceof VueElement) { 18229 instance.parent = parent._instance; 18230 instance.provides = parent._instance.provides; 18231 break; 18232 } 18233 } 18234 }; 18235 } 18236 return vnode; 18237 } 18238 _applyStyles(styles) { 18239 if (styles) { 18240 styles.forEach((css) => { 18241 const s = document.createElement("style"); 18242 s.textContent = css; 18243 this.shadowRoot.appendChild(s); 18244 if (true) { 18245 (this._styles || (this._styles = [])).push(s); 18246 } 18247 }); 18248 } 18249 } 18250} 18251 18252function useCssModule(name = "$style") { 18253 { 18254 const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)(); 18255 if (!instance) { 18256 true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`useCssModule must be called inside setup()`); 18257 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 18258 } 18259 const modules = instance.type.__cssModules; 18260 if (!modules) { 18261 true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS modules injected.`); 18262 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 18263 } 18264 const mod = modules[name]; 18265 if (!mod) { 18266 true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`Current instance does not have CSS module named "${name}".`); 18267 return _vue_shared__WEBPACK_IMPORTED_MODULE_1__.EMPTY_OBJ; 18268 } 18269 return mod; 18270 } 18271} 18272 18273const positionMap = /* @__PURE__ */ new WeakMap(); 18274const newPositionMap = /* @__PURE__ */ new WeakMap(); 18275const moveCbKey = Symbol("_moveCb"); 18276const enterCbKey = Symbol("_enterCb"); 18277const TransitionGroupImpl = { 18278 name: "TransitionGroup", 18279 props: /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({}, TransitionPropsValidators, { 18280 tag: String, 18281 moveClass: String 18282 }), 18283 setup(props, { slots }) { 18284 const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance)(); 18285 const state = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.useTransitionState)(); 18286 let prevChildren; 18287 let children; 18288 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.onUpdated)(() => { 18289 if (!prevChildren.length) { 18290 return; 18291 } 18292 const moveClass = props.moveClass || `${props.name || "v"}-move`; 18293 if (!hasCSSTransform( 18294 prevChildren[0].el, 18295 instance.vnode.el, 18296 moveClass 18297 )) { 18298 return; 18299 } 18300 prevChildren.forEach(callPendingCbs); 18301 prevChildren.forEach(recordPosition); 18302 const movedChildren = prevChildren.filter(applyTranslation); 18303 forceReflow(); 18304 movedChildren.forEach((c) => { 18305 const el = c.el; 18306 const style = el.style; 18307 addTransitionClass(el, moveClass); 18308 style.transform = style.webkitTransform = style.transitionDuration = ""; 18309 const cb = el[moveCbKey] = (e) => { 18310 if (e && e.target !== el) { 18311 return; 18312 } 18313 if (!e || /transform$/.test(e.propertyName)) { 18314 el.removeEventListener("transitionend", cb); 18315 el[moveCbKey] = null; 18316 removeTransitionClass(el, moveClass); 18317 } 18318 }; 18319 el.addEventListener("transitionend", cb); 18320 }); 18321 }); 18322 return () => { 18323 const rawProps = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_2__.toRaw)(props); 18324 const cssTransitionProps = resolveTransitionProps(rawProps); 18325 let tag = rawProps.tag || _vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.Fragment; 18326 prevChildren = []; 18327 if (children) { 18328 for (let i = 0; i < children.length; i++) { 18329 const child = children[i]; 18330 if (child.el && child.el instanceof Element) { 18331 prevChildren.push(child); 18332 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)( 18333 child, 18334 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)( 18335 child, 18336 cssTransitionProps, 18337 state, 18338 instance 18339 ) 18340 ); 18341 positionMap.set( 18342 child, 18343 child.el.getBoundingClientRect() 18344 ); 18345 } 18346 } 18347 } 18348 children = slots.default ? (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren)(slots.default()) : []; 18349 for (let i = 0; i < children.length; i++) { 18350 const child = children[i]; 18351 if (child.key != null) { 18352 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks)( 18353 child, 18354 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks)(child, cssTransitionProps, state, instance) 18355 ); 18356 } else if (true) { 18357 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(`<TransitionGroup> children must be keyed.`); 18358 } 18359 } 18360 return (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createVNode)(tag, null, children); 18361 }; 18362 } 18363}; 18364const removeMode = (props) => delete props.mode; 18365/* @__PURE__ */ removeMode(TransitionGroupImpl.props); 18366const TransitionGroup = TransitionGroupImpl; 18367function callPendingCbs(c) { 18368 const el = c.el; 18369 if (el[moveCbKey]) { 18370 el[moveCbKey](); 18371 } 18372 if (el[enterCbKey]) { 18373 el[enterCbKey](); 18374 } 18375} 18376function recordPosition(c) { 18377 newPositionMap.set(c, c.el.getBoundingClientRect()); 18378} 18379function applyTranslation(c) { 18380 const oldPos = positionMap.get(c); 18381 const newPos = newPositionMap.get(c); 18382 const dx = oldPos.left - newPos.left; 18383 const dy = oldPos.top - newPos.top; 18384 if (dx || dy) { 18385 const s = c.el.style; 18386 s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`; 18387 s.transitionDuration = "0s"; 18388 return c; 18389 } 18390} 18391function hasCSSTransform(el, root, moveClass) { 18392 const clone = el.cloneNode(); 18393 const _vtc = el[vtcKey]; 18394 if (_vtc) { 18395 _vtc.forEach((cls) => { 18396 cls.split(/\s+/).forEach((c) => c && clone.classList.remove(c)); 18397 }); 18398 } 18399 moveClass.split(/\s+/).forEach((c) => c && clone.classList.add(c)); 18400 clone.style.display = "none"; 18401 const container = root.nodeType === 1 ? root : root.parentNode; 18402 container.appendChild(clone); 18403 const { hasTransform } = getTransitionInfo(clone); 18404 container.removeChild(clone); 18405 return hasTransform; 18406} 18407 18408const getModelAssigner = (vnode) => { 18409 const fn = vnode.props["onUpdate:modelValue"] || false; 18410 return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(fn) ? (value) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.invokeArrayFns)(fn, value) : fn; 18411}; 18412function onCompositionStart(e) { 18413 e.target.composing = true; 18414} 18415function onCompositionEnd(e) { 18416 const target = e.target; 18417 if (target.composing) { 18418 target.composing = false; 18419 target.dispatchEvent(new Event("input")); 18420 } 18421} 18422const assignKey = Symbol("_assign"); 18423const vModelText = { 18424 created(el, { modifiers: { lazy, trim, number } }, vnode) { 18425 el[assignKey] = getModelAssigner(vnode); 18426 const castToNumber = number || vnode.props && vnode.props.type === "number"; 18427 addEventListener(el, lazy ? "change" : "input", (e) => { 18428 if (e.target.composing) return; 18429 let domValue = el.value; 18430 if (trim) { 18431 domValue = domValue.trim(); 18432 } 18433 if (castToNumber) { 18434 domValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(domValue); 18435 } 18436 el[assignKey](domValue); 18437 }); 18438 if (trim) { 18439 addEventListener(el, "change", () => { 18440 el.value = el.value.trim(); 18441 }); 18442 } 18443 if (!lazy) { 18444 addEventListener(el, "compositionstart", onCompositionStart); 18445 addEventListener(el, "compositionend", onCompositionEnd); 18446 addEventListener(el, "change", onCompositionEnd); 18447 } 18448 }, 18449 // set value on mounted so it's after min/max for type="range" 18450 mounted(el, { value }) { 18451 el.value = value == null ? "" : value; 18452 }, 18453 beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) { 18454 el[assignKey] = getModelAssigner(vnode); 18455 if (el.composing) return; 18456 const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(el.value) : el.value; 18457 const newValue = value == null ? "" : value; 18458 if (elValue === newValue) { 18459 return; 18460 } 18461 if (document.activeElement === el && el.type !== "range") { 18462 if (lazy && value === oldValue) { 18463 return; 18464 } 18465 if (trim && el.value.trim() === newValue) { 18466 return; 18467 } 18468 } 18469 el.value = newValue; 18470 } 18471}; 18472const vModelCheckbox = { 18473 // #4096 array checkboxes need to be deep traversed 18474 deep: true, 18475 created(el, _, vnode) { 18476 el[assignKey] = getModelAssigner(vnode); 18477 addEventListener(el, "change", () => { 18478 const modelValue = el._modelValue; 18479 const elementValue = getValue(el); 18480 const checked = el.checked; 18481 const assign = el[assignKey]; 18482 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(modelValue)) { 18483 const index = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(modelValue, elementValue); 18484 const found = index !== -1; 18485 if (checked && !found) { 18486 assign(modelValue.concat(elementValue)); 18487 } else if (!checked && found) { 18488 const filtered = [...modelValue]; 18489 filtered.splice(index, 1); 18490 assign(filtered); 18491 } 18492 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(modelValue)) { 18493 const cloned = new Set(modelValue); 18494 if (checked) { 18495 cloned.add(elementValue); 18496 } else { 18497 cloned.delete(elementValue); 18498 } 18499 assign(cloned); 18500 } else { 18501 assign(getCheckboxValue(el, checked)); 18502 } 18503 }); 18504 }, 18505 // set initial checked on mount to wait for true-value/false-value 18506 mounted: setChecked, 18507 beforeUpdate(el, binding, vnode) { 18508 el[assignKey] = getModelAssigner(vnode); 18509 setChecked(el, binding, vnode); 18510 } 18511}; 18512function setChecked(el, { value, oldValue }, vnode) { 18513 el._modelValue = value; 18514 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { 18515 el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1; 18516 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) { 18517 el.checked = value.has(vnode.props.value); 18518 } else if (value !== oldValue) { 18519 el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, getCheckboxValue(el, true)); 18520 } 18521} 18522const vModelRadio = { 18523 created(el, { value }, vnode) { 18524 el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value); 18525 el[assignKey] = getModelAssigner(vnode); 18526 addEventListener(el, "change", () => { 18527 el[assignKey](getValue(el)); 18528 }); 18529 }, 18530 beforeUpdate(el, { value, oldValue }, vnode) { 18531 el[assignKey] = getModelAssigner(vnode); 18532 if (value !== oldValue) { 18533 el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(value, vnode.props.value); 18534 } 18535 } 18536}; 18537const vModelSelect = { 18538 // <select multiple> value need to be deep traversed 18539 deep: true, 18540 created(el, { value, modifiers: { number } }, vnode) { 18541 const isSetModel = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value); 18542 addEventListener(el, "change", () => { 18543 const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map( 18544 (o) => number ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseToNumber)(getValue(o)) : getValue(o) 18545 ); 18546 el[assignKey]( 18547 el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0] 18548 ); 18549 el._assigning = true; 18550 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.nextTick)(() => { 18551 el._assigning = false; 18552 }); 18553 }); 18554 el[assignKey] = getModelAssigner(vnode); 18555 }, 18556 // set value in mounted & updated because <select> relies on its children 18557 // <option>s. 18558 mounted(el, { value, modifiers: { number } }) { 18559 setSelected(el, value); 18560 }, 18561 beforeUpdate(el, _binding, vnode) { 18562 el[assignKey] = getModelAssigner(vnode); 18563 }, 18564 updated(el, { value, modifiers: { number } }) { 18565 if (!el._assigning) { 18566 setSelected(el, value); 18567 } 18568 } 18569}; 18570function setSelected(el, value, number) { 18571 const isMultiple = el.multiple; 18572 const isArrayValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value); 18573 if (isMultiple && !isArrayValue && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) { 18574 true && (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 18575 `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.` 18576 ); 18577 return; 18578 } 18579 for (let i = 0, l = el.options.length; i < l; i++) { 18580 const option = el.options[i]; 18581 const optionValue = getValue(option); 18582 if (isMultiple) { 18583 if (isArrayValue) { 18584 const optionType = typeof optionValue; 18585 if (optionType === "string" || optionType === "number") { 18586 option.selected = value.some((v) => String(v) === String(optionValue)); 18587 } else { 18588 option.selected = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, optionValue) > -1; 18589 } 18590 } else { 18591 option.selected = value.has(optionValue); 18592 } 18593 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(getValue(option), value)) { 18594 if (el.selectedIndex !== i) el.selectedIndex = i; 18595 return; 18596 } 18597 } 18598 if (!isMultiple && el.selectedIndex !== -1) { 18599 el.selectedIndex = -1; 18600 } 18601} 18602function getValue(el) { 18603 return "_value" in el ? el._value : el.value; 18604} 18605function getCheckboxValue(el, checked) { 18606 const key = checked ? "_trueValue" : "_falseValue"; 18607 return key in el ? el[key] : checked; 18608} 18609const vModelDynamic = { 18610 created(el, binding, vnode) { 18611 callModelHook(el, binding, vnode, null, "created"); 18612 }, 18613 mounted(el, binding, vnode) { 18614 callModelHook(el, binding, vnode, null, "mounted"); 18615 }, 18616 beforeUpdate(el, binding, vnode, prevVNode) { 18617 callModelHook(el, binding, vnode, prevVNode, "beforeUpdate"); 18618 }, 18619 updated(el, binding, vnode, prevVNode) { 18620 callModelHook(el, binding, vnode, prevVNode, "updated"); 18621 } 18622}; 18623function resolveDynamicModel(tagName, type) { 18624 switch (tagName) { 18625 case "SELECT": 18626 return vModelSelect; 18627 case "TEXTAREA": 18628 return vModelText; 18629 default: 18630 switch (type) { 18631 case "checkbox": 18632 return vModelCheckbox; 18633 case "radio": 18634 return vModelRadio; 18635 default: 18636 return vModelText; 18637 } 18638 } 18639} 18640function callModelHook(el, binding, vnode, prevVNode, hook) { 18641 const modelToUse = resolveDynamicModel( 18642 el.tagName, 18643 vnode.props && vnode.props.type 18644 ); 18645 const fn = modelToUse[hook]; 18646 fn && fn(el, binding, vnode, prevVNode); 18647} 18648function initVModelForSSR() { 18649 vModelText.getSSRProps = ({ value }) => ({ value }); 18650 vModelRadio.getSSRProps = ({ value }, vnode) => { 18651 if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseEqual)(vnode.props.value, value)) { 18652 return { checked: true }; 18653 } 18654 }; 18655 vModelCheckbox.getSSRProps = ({ value }, vnode) => { 18656 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isArray)(value)) { 18657 if (vnode.props && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.looseIndexOf)(value, vnode.props.value) > -1) { 18658 return { checked: true }; 18659 } 18660 } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSet)(value)) { 18661 if (vnode.props && value.has(vnode.props.value)) { 18662 return { checked: true }; 18663 } 18664 } else if (value) { 18665 return { checked: true }; 18666 } 18667 }; 18668 vModelDynamic.getSSRProps = (binding, vnode) => { 18669 if (typeof vnode.type !== "string") { 18670 return; 18671 } 18672 const modelToUse = resolveDynamicModel( 18673 // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase 18674 vnode.type.toUpperCase(), 18675 vnode.props && vnode.props.type 18676 ); 18677 if (modelToUse.getSSRProps) { 18678 return modelToUse.getSSRProps(binding, vnode); 18679 } 18680 }; 18681} 18682 18683const systemModifiers = ["ctrl", "shift", "alt", "meta"]; 18684const modifierGuards = { 18685 stop: (e) => e.stopPropagation(), 18686 prevent: (e) => e.preventDefault(), 18687 self: (e) => e.target !== e.currentTarget, 18688 ctrl: (e) => !e.ctrlKey, 18689 shift: (e) => !e.shiftKey, 18690 alt: (e) => !e.altKey, 18691 meta: (e) => !e.metaKey, 18692 left: (e) => "button" in e && e.button !== 0, 18693 middle: (e) => "button" in e && e.button !== 1, 18694 right: (e) => "button" in e && e.button !== 2, 18695 exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m)) 18696}; 18697const withModifiers = (fn, modifiers) => { 18698 const cache = fn._withMods || (fn._withMods = {}); 18699 const cacheKey = modifiers.join("."); 18700 return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => { 18701 for (let i = 0; i < modifiers.length; i++) { 18702 const guard = modifierGuards[modifiers[i]]; 18703 if (guard && guard(event, modifiers)) return; 18704 } 18705 return fn(event, ...args); 18706 }); 18707}; 18708const keyNames = { 18709 esc: "escape", 18710 space: " ", 18711 up: "arrow-up", 18712 left: "arrow-left", 18713 right: "arrow-right", 18714 down: "arrow-down", 18715 delete: "backspace" 18716}; 18717const withKeys = (fn, modifiers) => { 18718 const cache = fn._withKeys || (fn._withKeys = {}); 18719 const cacheKey = modifiers.join("."); 18720 return cache[cacheKey] || (cache[cacheKey] = (event) => { 18721 if (!("key" in event)) { 18722 return; 18723 } 18724 const eventKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.hyphenate)(event.key); 18725 if (modifiers.some((k) => k === eventKey || keyNames[k] === eventKey)) { 18726 return fn(event); 18727 } 18728 }); 18729}; 18730 18731const rendererOptions = /* @__PURE__ */ (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.extend)({ patchProp }, nodeOps); 18732let renderer; 18733let enabledHydration = false; 18734function ensureRenderer() { 18735 return renderer || (renderer = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createRenderer)(rendererOptions)); 18736} 18737function ensureHydrationRenderer() { 18738 renderer = enabledHydration ? renderer : (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer)(rendererOptions); 18739 enabledHydration = true; 18740 return renderer; 18741} 18742const render = (...args) => { 18743 ensureRenderer().render(...args); 18744}; 18745const hydrate = (...args) => { 18746 ensureHydrationRenderer().hydrate(...args); 18747}; 18748const createApp = (...args) => { 18749 const app = ensureRenderer().createApp(...args); 18750 if (true) { 18751 injectNativeTagCheck(app); 18752 injectCompilerOptionsCheck(app); 18753 } 18754 const { mount } = app; 18755 app.mount = (containerOrSelector) => { 18756 const container = normalizeContainer(containerOrSelector); 18757 if (!container) return; 18758 const component = app._component; 18759 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isFunction)(component) && !component.render && !component.template) { 18760 component.template = container.innerHTML; 18761 } 18762 container.innerHTML = ""; 18763 const proxy = mount(container, false, resolveRootNamespace(container)); 18764 if (container instanceof Element) { 18765 container.removeAttribute("v-cloak"); 18766 container.setAttribute("data-v-app", ""); 18767 } 18768 return proxy; 18769 }; 18770 return app; 18771}; 18772const createSSRApp = (...args) => { 18773 const app = ensureHydrationRenderer().createApp(...args); 18774 if (true) { 18775 injectNativeTagCheck(app); 18776 injectCompilerOptionsCheck(app); 18777 } 18778 const { mount } = app; 18779 app.mount = (containerOrSelector) => { 18780 const container = normalizeContainer(containerOrSelector); 18781 if (container) { 18782 return mount(container, true, resolveRootNamespace(container)); 18783 } 18784 }; 18785 return app; 18786}; 18787function resolveRootNamespace(container) { 18788 if (container instanceof SVGElement) { 18789 return "svg"; 18790 } 18791 if (typeof MathMLElement === "function" && container instanceof MathMLElement) { 18792 return "mathml"; 18793 } 18794} 18795function injectNativeTagCheck(app) { 18796 Object.defineProperty(app.config, "isNativeTag", { 18797 value: (tag) => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isHTMLTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isSVGTag)(tag) || (0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isMathMLTag)(tag), 18798 writable: false 18799 }); 18800} 18801function injectCompilerOptionsCheck(app) { 18802 if ((0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly)()) { 18803 const isCustomElement = app.config.isCustomElement; 18804 Object.defineProperty(app.config, "isCustomElement", { 18805 get() { 18806 return isCustomElement; 18807 }, 18808 set() { 18809 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 18810 `The \`isCustomElement\` config option is deprecated. Use \`compilerOptions.isCustomElement\` instead.` 18811 ); 18812 } 18813 }); 18814 const compilerOptions = app.config.compilerOptions; 18815 const msg = `The \`compilerOptions\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \`compilerOptions\` must be passed to \`@vue/compiler-dom\` in the build setup instead. 18816- For vue-loader: pass it via vue-loader's \`compilerOptions\` loader option. 18817- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader 18818- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`; 18819 Object.defineProperty(app.config, "compilerOptions", { 18820 get() { 18821 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg); 18822 return compilerOptions; 18823 }, 18824 set() { 18825 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)(msg); 18826 } 18827 }); 18828 } 18829} 18830function normalizeContainer(container) { 18831 if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_1__.isString)(container)) { 18832 const res = document.querySelector(container); 18833 if ( true && !res) { 18834 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 18835 `Failed to mount app: mount target selector "${container}" returned null.` 18836 ); 18837 } 18838 return res; 18839 } 18840 if ( true && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === "closed") { 18841 (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_0__.warn)( 18842 `mounting on a ShadowRoot with \`{mode: "closed"}\` may lead to unpredictable bugs` 18843 ); 18844 } 18845 return container; 18846} 18847let ssrDirectiveInitialized = false; 18848const initDirectivesForSSR = () => { 18849 if (!ssrDirectiveInitialized) { 18850 ssrDirectiveInitialized = true; 18851 initVModelForSSR(); 18852 initVShowForSSR(); 18853 } 18854} ; 18855 18856 18857 18858 18859/***/ }), 18860
vendor: 26,619 bytes, lines 18861-19441
18861/***/ "./node_modules/@vue/shared/dist/shared.esm-bundler.js": 18862/*!*************************************************************!*\ 18863 !*** ./node_modules/@vue/shared/dist/shared.esm-bundler.js ***! 18864 \*************************************************************/ 18865/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 18866 18867"use strict"; 18868__webpack_require__.r(__webpack_exports__); 18869/* harmony export */ __webpack_require__.d(__webpack_exports__, { 18870/* harmony export */ EMPTY_ARR: function() { return /* binding */ EMPTY_ARR; }, 18871/* harmony export */ EMPTY_OBJ: function() { return /* binding */ EMPTY_OBJ; }, 18872/* harmony export */ NO: function() { return /* binding */ NO; }, 18873/* harmony export */ NOOP: function() { return /* binding */ NOOP; }, 18874/* harmony export */ PatchFlagNames: function() { return /* binding */ PatchFlagNames; }, 18875/* harmony export */ PatchFlags: function() { return /* binding */ PatchFlags; }, 18876/* harmony export */ ShapeFlags: function() { return /* binding */ ShapeFlags; }, 18877/* harmony export */ SlotFlags: function() { return /* binding */ SlotFlags; }, 18878/* harmony export */ camelize: function() { return /* binding */ camelize; }, 18879/* harmony export */ capitalize: function() { return /* binding */ capitalize; }, 18880/* harmony export */ def: function() { return /* binding */ def; }, 18881/* harmony export */ escapeHtml: function() { return /* binding */ escapeHtml; }, 18882/* harmony export */ escapeHtmlComment: function() { return /* binding */ escapeHtmlComment; }, 18883/* harmony export */ extend: function() { return /* binding */ extend; }, 18884/* harmony export */ genPropsAccessExp: function() { return /* binding */ genPropsAccessExp; }, 18885/* harmony export */ generateCodeFrame: function() { return /* binding */ generateCodeFrame; }, 18886/* harmony export */ getGlobalThis: function() { return /* binding */ getGlobalThis; }, 18887/* harmony export */ hasChanged: function() { return /* binding */ hasChanged; }, 18888/* harmony export */ hasOwn: function() { return /* binding */ hasOwn; }, 18889/* harmony export */ hyphenate: function() { return /* binding */ hyphenate; }, 18890/* harmony export */ includeBooleanAttr: function() { return /* binding */ includeBooleanAttr; }, 18891/* harmony export */ invokeArrayFns: function() { return /* binding */ invokeArrayFns; }, 18892/* harmony export */ isArray: function() { return /* binding */ isArray; }, 18893/* harmony export */ isBooleanAttr: function() { return /* binding */ isBooleanAttr; }, 18894/* harmony export */ isBuiltInDirective: function() { return /* binding */ isBuiltInDirective; }, 18895/* harmony export */ isDate: function() { return /* binding */ isDate; }, 18896/* harmony export */ isFunction: function() { return /* binding */ isFunction; }, 18897/* harmony export */ isGloballyAllowed: function() { return /* binding */ isGloballyAllowed; }, 18898/* harmony export */ isGloballyWhitelisted: function() { return /* binding */ isGloballyWhitelisted; }, 18899/* harmony export */ isHTMLTag: function() { return /* binding */ isHTMLTag; }, 18900/* harmony export */ isIntegerKey: function() { return /* binding */ isIntegerKey; }, 18901/* harmony export */ isKnownHtmlAttr: function() { return /* binding */ isKnownHtmlAttr; }, 18902/* harmony export */ isKnownSvgAttr: function() { return /* binding */ isKnownSvgAttr; }, 18903/* harmony export */ isMap: function() { return /* binding */ isMap; }, 18904/* harmony export */ isMathMLTag: function() { return /* binding */ isMathMLTag; }, 18905/* harmony export */ isModelListener: function() { return /* binding */ isModelListener; }, 18906/* harmony export */ isObject: function() { return /* binding */ isObject; }, 18907/* harmony export */ isOn: function() { return /* binding */ isOn; }, 18908/* harmony export */ isPlainObject: function() { return /* binding */ isPlainObject; }, 18909/* harmony export */ isPromise: function() { return /* binding */ isPromise; }, 18910/* harmony export */ isRegExp: function() { return /* binding */ isRegExp; }, 18911/* harmony export */ isRenderableAttrValue: function() { return /* binding */ isRenderableAttrValue; }, 18912/* harmony export */ isReservedProp: function() { return /* binding */ isReservedProp; }, 18913/* harmony export */ isSSRSafeAttrName: function() { return /* binding */ isSSRSafeAttrName; }, 18914/* harmony export */ isSVGTag: function() { return /* binding */ isSVGTag; }, 18915/* harmony export */ isSet: function() { return /* binding */ isSet; }, 18916/* harmony export */ isSpecialBooleanAttr: function() { return /* binding */ isSpecialBooleanAttr; }, 18917/* harmony export */ isString: function() { return /* binding */ isString; }, 18918/* harmony export */ isSymbol: function() { return /* binding */ isSymbol; }, 18919/* harmony export */ isVoidTag: function() { return /* binding */ isVoidTag; }, 18920/* harmony export */ looseEqual: function() { return /* binding */ looseEqual; }, 18921/* harmony export */ looseIndexOf: function() { return /* binding */ looseIndexOf; }, 18922/* harmony export */ looseToNumber: function() { return /* binding */ looseToNumber; }, 18923/* harmony export */ makeMap: function() { return /* binding */ makeMap; }, 18924/* harmony export */ normalizeClass: function() { return /* binding */ normalizeClass; }, 18925/* harmony export */ normalizeProps: function() { return /* binding */ normalizeProps; }, 18926/* harmony export */ normalizeStyle: function() { return /* binding */ normalizeStyle; }, 18927/* harmony export */ objectToString: function() { return /* binding */ objectToString; }, 18928/* harmony export */ parseStringStyle: function() { return /* binding */ parseStringStyle; }, 18929/* harmony export */ propsToAttrMap: function() { return /* binding */ propsToAttrMap; }, 18930/* harmony export */ remove: function() { return /* binding */ remove; }, 18931/* harmony export */ slotFlagsText: function() { return /* binding */ slotFlagsText; }, 18932/* harmony export */ stringifyStyle: function() { return /* binding */ stringifyStyle; }, 18933/* harmony export */ toDisplayString: function() { return /* binding */ toDisplayString; }, 18934/* harmony export */ toHandlerKey: function() { return /* binding */ toHandlerKey; }, 18935/* harmony export */ toNumber: function() { return /* binding */ toNumber; }, 18936/* harmony export */ toRawType: function() { return /* binding */ toRawType; }, 18937/* harmony export */ toTypeString: function() { return /* binding */ toTypeString; } 18938/* harmony export */ }); 18939/** 18940* @vue/shared v3.4.34 18941* (c) 2018-present Yuxi (Evan) You and Vue contributors 18942* @license MIT 18943**/ 18944/*! #__NO_SIDE_EFFECTS__ */ 18945// @__NO_SIDE_EFFECTS__ 18946function makeMap(str, expectsLowerCase) { 18947 const set = new Set(str.split(",")); 18948 return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val); 18949} 18950 18951const EMPTY_OBJ = true ? Object.freeze({}) : 0; 18952const EMPTY_ARR = true ? Object.freeze([]) : 0; 18953const NOOP = () => { 18954}; 18955const NO = () => false; 18956const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter 18957(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); 18958const isModelListener = (key) => key.startsWith("onUpdate:"); 18959const extend = Object.assign; 18960const remove = (arr, el) => { 18961 const i = arr.indexOf(el); 18962 if (i > -1) { 18963 arr.splice(i, 1); 18964 } 18965}; 18966const hasOwnProperty = Object.prototype.hasOwnProperty; 18967const hasOwn = (val, key) => hasOwnProperty.call(val, key); 18968const isArray = Array.isArray; 18969const isMap = (val) => toTypeString(val) === "[object Map]"; 18970const isSet = (val) => toTypeString(val) === "[object Set]"; 18971const isDate = (val) => toTypeString(val) === "[object Date]"; 18972const isRegExp = (val) => toTypeString(val) === "[object RegExp]"; 18973const isFunction = (val) => typeof val === "function"; 18974const isString = (val) => typeof val === "string"; 18975const isSymbol = (val) => typeof val === "symbol"; 18976const isObject = (val) => val !== null && typeof val === "object"; 18977const isPromise = (val) => { 18978 return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); 18979}; 18980const objectToString = Object.prototype.toString; 18981const toTypeString = (value) => objectToString.call(value); 18982const toRawType = (value) => { 18983 return toTypeString(value).slice(8, -1); 18984}; 18985const isPlainObject = (val) => toTypeString(val) === "[object Object]"; 18986const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; 18987const isReservedProp = /* @__PURE__ */ makeMap( 18988 // the leading comma is intentional so empty string "" is also included 18989 ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" 18990); 18991const isBuiltInDirective = /* @__PURE__ */ makeMap( 18992 "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" 18993); 18994const cacheStringFunction = (fn) => { 18995 const cache = /* @__PURE__ */ Object.create(null); 18996 return (str) => { 18997 const hit = cache[str]; 18998 return hit || (cache[str] = fn(str)); 18999 }; 19000}; 19001const camelizeRE = /-(\w)/g; 19002const camelize = cacheStringFunction((str) => { 19003 return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); 19004}); 19005const hyphenateRE = /\B([A-Z])/g; 19006const hyphenate = cacheStringFunction( 19007 (str) => str.replace(hyphenateRE, "-$1").toLowerCase() 19008); 19009const capitalize = cacheStringFunction((str) => { 19010 return str.charAt(0).toUpperCase() + str.slice(1); 19011}); 19012const toHandlerKey = cacheStringFunction((str) => { 19013 const s = str ? `on${capitalize(str)}` : ``; 19014 return s; 19015}); 19016const hasChanged = (value, oldValue) => !Object.is(value, oldValue); 19017const invokeArrayFns = (fns, ...arg) => { 19018 for (let i = 0; i < fns.length; i++) { 19019 fns[i](...arg); 19020 } 19021}; 19022const def = (obj, key, value, writable = false) => { 19023 Object.defineProperty(obj, key, { 19024 configurable: true, 19025 enumerable: false, 19026 writable, 19027 value 19028 }); 19029}; 19030const looseToNumber = (val) => { 19031 const n = parseFloat(val); 19032 return isNaN(n) ? val : n; 19033}; 19034const toNumber = (val) => { 19035 const n = isString(val) ? Number(val) : NaN; 19036 return isNaN(n) ? val : n; 19037}; 19038let _globalThis; 19039const getGlobalThis = () => { 19040 return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : {}); 19041}; 19042const identRE = /^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/; 19043function genPropsAccessExp(name) { 19044 return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`; 19045} 19046 19047const PatchFlags = { 19048 "TEXT": 1, 19049 "1": "TEXT", 19050 "CLASS": 2, 19051 "2": "CLASS", 19052 "STYLE": 4, 19053 "4": "STYLE", 19054 "PROPS": 8, 19055 "8": "PROPS", 19056 "FULL_PROPS": 16, 19057 "16": "FULL_PROPS", 19058 "NEED_HYDRATION": 32, 19059 "32": "NEED_HYDRATION", 19060 "STABLE_FRAGMENT": 64, 19061 "64": "STABLE_FRAGMENT", 19062 "KEYED_FRAGMENT": 128, 19063 "128": "KEYED_FRAGMENT", 19064 "UNKEYED_FRAGMENT": 256, 19065 "256": "UNKEYED_FRAGMENT", 19066 "NEED_PATCH": 512, 19067 "512": "NEED_PATCH", 19068 "DYNAMIC_SLOTS": 1024, 19069 "1024": "DYNAMIC_SLOTS", 19070 "DEV_ROOT_FRAGMENT": 2048, 19071 "2048": "DEV_ROOT_FRAGMENT", 19072 "HOISTED": -1, 19073 "-1": "HOISTED", 19074 "BAIL": -2, 19075 "-2": "BAIL" 19076}; 19077const PatchFlagNames = { 19078 [1]: `TEXT`, 19079 [2]: `CLASS`, 19080 [4]: `STYLE`, 19081 [8]: `PROPS`, 19082 [16]: `FULL_PROPS`, 19083 [32]: `NEED_HYDRATION`, 19084 [64]: `STABLE_FRAGMENT`, 19085 [128]: `KEYED_FRAGMENT`, 19086 [256]: `UNKEYED_FRAGMENT`, 19087 [512]: `NEED_PATCH`, 19088 [1024]: `DYNAMIC_SLOTS`, 19089 [2048]: `DEV_ROOT_FRAGMENT`, 19090 [-1]: `HOISTED`, 19091 [-2]: `BAIL` 19092}; 19093 19094const ShapeFlags = { 19095 "ELEMENT": 1, 19096 "1": "ELEMENT", 19097 "FUNCTIONAL_COMPONENT": 2, 19098 "2": "FUNCTIONAL_COMPONENT", 19099 "STATEFUL_COMPONENT": 4, 19100 "4": "STATEFUL_COMPONENT", 19101 "TEXT_CHILDREN": 8, 19102 "8": "TEXT_CHILDREN", 19103 "ARRAY_CHILDREN": 16, 19104 "16": "ARRAY_CHILDREN", 19105 "SLOTS_CHILDREN": 32, 19106 "32": "SLOTS_CHILDREN", 19107 "TELEPORT": 64, 19108 "64": "TELEPORT", 19109 "SUSPENSE": 128, 19110 "128": "SUSPENSE", 19111 "COMPONENT_SHOULD_KEEP_ALIVE": 256, 19112 "256": "COMPONENT_SHOULD_KEEP_ALIVE", 19113 "COMPONENT_KEPT_ALIVE": 512, 19114 "512": "COMPONENT_KEPT_ALIVE", 19115 "COMPONENT": 6, 19116 "6": "COMPONENT" 19117}; 19118 19119const SlotFlags = { 19120 "STABLE": 1, 19121 "1": "STABLE", 19122 "DYNAMIC": 2, 19123 "2": "DYNAMIC", 19124 "FORWARDED": 3, 19125 "3": "FORWARDED" 19126}; 19127const slotFlagsText = { 19128 [1]: "STABLE", 19129 [2]: "DYNAMIC", 19130 [3]: "FORWARDED" 19131}; 19132 19133const GLOBALS_ALLOWED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error"; 19134const isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED); 19135const isGloballyWhitelisted = isGloballyAllowed; 19136 19137const range = 2; 19138function generateCodeFrame(source, start = 0, end = source.length) { 19139 start = Math.max(0, Math.min(start, source.length)); 19140 end = Math.max(0, Math.min(end, source.length)); 19141 if (start > end) return ""; 19142 let lines = source.split(/(\r?\n)/); 19143 const newlineSequences = lines.filter((_, idx) => idx % 2 === 1); 19144 lines = lines.filter((_, idx) => idx % 2 === 0); 19145 let count = 0; 19146 const res = []; 19147 for (let i = 0; i < lines.length; i++) { 19148 count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0); 19149 if (count >= start) { 19150 for (let j = i - range; j <= i + range || end > count; j++) { 19151 if (j < 0 || j >= lines.length) continue; 19152 const line = j + 1; 19153 res.push( 19154 `${line}${" ".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}` 19155 ); 19156 const lineLength = lines[j].length; 19157 const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0; 19158 if (j === i) { 19159 const pad = start - (count - (lineLength + newLineSeqLength)); 19160 const length = Math.max( 19161 1, 19162 end > count ? lineLength - pad : end - start 19163 ); 19164 res.push(` | ` + " ".repeat(pad) + "^".repeat(length)); 19165 } else if (j > i) { 19166 if (end > count) { 19167 const length = Math.max(Math.min(end - count, lineLength), 1); 19168 res.push(` | ` + "^".repeat(length)); 19169 } 19170 count += lineLength + newLineSeqLength; 19171 } 19172 } 19173 break; 19174 } 19175 } 19176 return res.join("\n"); 19177} 19178 19179function normalizeStyle(value) { 19180 if (isArray(value)) { 19181 const res = {}; 19182 for (let i = 0; i < value.length; i++) { 19183 const item = value[i]; 19184 const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); 19185 if (normalized) { 19186 for (const key in normalized) { 19187 res[key] = normalized[key]; 19188 } 19189 } 19190 } 19191 return res; 19192 } else if (isString(value) || isObject(value)) { 19193 return value; 19194 } 19195} 19196const listDelimiterRE = /;(?![^(]*\))/g; 19197const propertyDelimiterRE = /:([^]+)/; 19198const styleCommentRE = /\/\*[^]*?\*\//g; 19199function parseStringStyle(cssText) { 19200 const ret = {}; 19201 cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { 19202 if (item) { 19203 const tmp = item.split(propertyDelimiterRE); 19204 tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); 19205 } 19206 }); 19207 return ret; 19208} 19209function stringifyStyle(styles) { 19210 let ret = ""; 19211 if (!styles || isString(styles)) { 19212 return ret; 19213 } 19214 for (const key in styles) { 19215 const value = styles[key]; 19216 if (isString(value) || typeof value === "number") { 19217 const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key); 19218 ret += `${normalizedKey}:${value};`; 19219 } 19220 } 19221 return ret; 19222} 19223function normalizeClass(value) { 19224 let res = ""; 19225 if (isString(value)) { 19226 res = value; 19227 } else if (isArray(value)) { 19228 for (let i = 0; i < value.length; i++) { 19229 const normalized = normalizeClass(value[i]); 19230 if (normalized) { 19231 res += normalized + " "; 19232 } 19233 } 19234 } else if (isObject(value)) { 19235 for (const name in value) { 19236 if (value[name]) { 19237 res += name + " "; 19238 } 19239 } 19240 } 19241 return res.trim(); 19242} 19243function normalizeProps(props) { 19244 if (!props) return null; 19245 let { class: klass, style } = props; 19246 if (klass && !isString(klass)) { 19247 props.class = normalizeClass(klass); 19248 } 19249 if (style) { 19250 props.style = normalizeStyle(style); 19251 } 19252 return props; 19253} 19254 19255const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; 19256const SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; 19257const MATH_TAGS = "annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics"; 19258const VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; 19259const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS); 19260const isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS); 19261const isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS); 19262const isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS); 19263 19264const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; 19265const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); 19266const isBooleanAttr = /* @__PURE__ */ makeMap( 19267 specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected` 19268); 19269function includeBooleanAttr(value) { 19270 return !!value || value === ""; 19271} 19272const unsafeAttrCharRE = /[>/="'\u0009\u000a\u000c\u0020]/; 19273const attrValidationCache = {}; 19274function isSSRSafeAttrName(name) { 19275 if (attrValidationCache.hasOwnProperty(name)) { 19276 return attrValidationCache[name]; 19277 } 19278 const isUnsafe = unsafeAttrCharRE.test(name); 19279 if (isUnsafe) { 19280 console.error(`unsafe attribute name: ${name}`); 19281 } 19282 return attrValidationCache[name] = !isUnsafe; 19283} 19284const propsToAttrMap = { 19285 acceptCharset: "accept-charset", 19286 className: "class", 19287 htmlFor: "for", 19288 httpEquiv: "http-equiv" 19289}; 19290const isKnownHtmlAttr = /* @__PURE__ */ makeMap( 19291 `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap` 19292); 19293const isKnownSvgAttr = /* @__PURE__ */ makeMap( 19294 `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan` 19295); 19296function isRenderableAttrValue(value) { 19297 if (value == null) { 19298 return false; 19299 } 19300 const type = typeof value; 19301 return type === "string" || type === "number" || type === "boolean"; 19302} 19303 19304const escapeRE = /["'&<>]/; 19305function escapeHtml(string) { 19306 const str = "" + string; 19307 const match = escapeRE.exec(str); 19308 if (!match) { 19309 return str; 19310 } 19311 let html = ""; 19312 let escaped; 19313 let index; 19314 let lastIndex = 0; 19315 for (index = match.index; index < str.length; index++) { 19316 switch (str.charCodeAt(index)) { 19317 case 34: 19318 escaped = """; 19319 break; 19320 case 38: 19321 escaped = "&"; 19322 break; 19323 case 39: 19324 escaped = "'"; 19325 break; 19326 case 60: 19327 escaped = "<"; 19328 break; 19329 case 62: 19330 escaped = ">"; 19331 break; 19332 default: 19333 continue; 19334 } 19335 if (lastIndex !== index) { 19336 html += str.slice(lastIndex, index); 19337 } 19338 lastIndex = index + 1; 19339 html += escaped; 19340 } 19341 return lastIndex !== index ? html + str.slice(lastIndex, index) : html; 19342} 19343const commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g; 19344function escapeHtmlComment(src) { 19345 return src.replace(commentStripRE, ""); 19346} 19347 19348function looseCompareArrays(a, b) { 19349 if (a.length !== b.length) return false; 19350 let equal = true; 19351 for (let i = 0; equal && i < a.length; i++) { 19352 equal = looseEqual(a[i], b[i]); 19353 } 19354 return equal; 19355} 19356function looseEqual(a, b) { 19357 if (a === b) return true; 19358 let aValidType = isDate(a); 19359 let bValidType = isDate(b); 19360 if (aValidType || bValidType) { 19361 return aValidType && bValidType ? a.getTime() === b.getTime() : false; 19362 } 19363 aValidType = isSymbol(a); 19364 bValidType = isSymbol(b); 19365 if (aValidType || bValidType) { 19366 return a === b; 19367 } 19368 aValidType = isArray(a); 19369 bValidType = isArray(b); 19370 if (aValidType || bValidType) { 19371 return aValidType && bValidType ? looseCompareArrays(a, b) : false; 19372 } 19373 aValidType = isObject(a); 19374 bValidType = isObject(b); 19375 if (aValidType || bValidType) { 19376 if (!aValidType || !bValidType) { 19377 return false; 19378 } 19379 const aKeysCount = Object.keys(a).length; 19380 const bKeysCount = Object.keys(b).length; 19381 if (aKeysCount !== bKeysCount) { 19382 return false; 19383 } 19384 for (const key in a) { 19385 const aHasKey = a.hasOwnProperty(key); 19386 const bHasKey = b.hasOwnProperty(key); 19387 if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { 19388 return false; 19389 } 19390 } 19391 } 19392 return String(a) === String(b); 19393} 19394function looseIndexOf(arr, val) { 19395 return arr.findIndex((item) => looseEqual(item, val)); 19396} 19397 19398const isRef = (val) => { 19399 return !!(val && val.__v_isRef === true); 19400}; 19401const toDisplayString = (val) => { 19402 return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); 19403}; 19404const replacer = (_key, val) => { 19405 if (isRef(val)) { 19406 return replacer(_key, val.value); 19407 } else if (isMap(val)) { 19408 return { 19409 [`Map(${val.size})`]: [...val.entries()].reduce( 19410 (entries, [key, val2], i) => { 19411 entries[stringifySymbol(key, i) + " =>"] = val2; 19412 return entries; 19413 }, 19414 {} 19415 ) 19416 }; 19417 } else if (isSet(val)) { 19418 return { 19419 [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) 19420 }; 19421 } else if (isSymbol(val)) { 19422 return stringifySymbol(val); 19423 } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { 19424 return String(val); 19425 } 19426 return val; 19427}; 19428const stringifySymbol = (v, i = "") => { 19429 var _a; 19430 return ( 19431 // Symbol.description in es2019+ so we need to cast here to pass 19432 // the lib: es2016 check 19433 isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v 19434 ); 19435}; 19436 19437 19438 19439 19440/***/ }), 19441
19442/***/ "./src/js/pages/common/lazyload.js": 19443/*!*****************************************!*\ 19444 !*** ./src/js/pages/common/lazyload.js ***! 19445 \*****************************************/ 19446/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19447 19448"use strict"; 19449__webpack_require__.r(__webpack_exports__); 19450/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19451/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19452/* harmony export */ }); 19453/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js"); 19454/* harmony import */ var lazysizes__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lazysizes__WEBPACK_IMPORTED_MODULE_0__); 19455/* harmony import */ var lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lazysizes/plugins/unveilhooks/ls.unveilhooks */ "./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js"); 19456/* harmony import */ var lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lazysizes_plugins_unveilhooks_ls_unveilhooks__WEBPACK_IMPORTED_MODULE_1__); 19457 19458 19459 19460/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19461 (lazysizes__WEBPACK_IMPORTED_MODULE_0___default().cfg).lazyClass = "js-lazy"; 19462} 19463 19464 19465/***/ }), 19466
19467/***/ "./src/js/pages/common/loading.js": 19468/*!****************************************!*\ 19469 !*** ./src/js/pages/common/loading.js ***! 19470 \****************************************/ 19471/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19472 19473"use strict"; 19474__webpack_require__.r(__webpack_exports__); 19475/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19476/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19477/* harmony export */ }); 19478/* harmony import */ var preloader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preloader */ "./node_modules/preloader/index.js"); 19479/* harmony import */ var preloader__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(preloader__WEBPACK_IMPORTED_MODULE_0__); 19480 19481 19482/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(add_urls = []) { 19483 const $progress_bar = $(".js-loading-progress"); 19484 const loader = preloader__WEBPACK_IMPORTED_MODULE_0___default()({ xhrImages: false }); 19485 const image_urls = get_image_list(); 19486 const urls = Object.assign(image_urls, add_urls); 19487 return new Promise((resolve, reject) => { 19488 urls.forEach((url) => { 19489 loader.add(url); 19490 }); 19491 loader.on("progress", (percent, url) => { 19492 $progress_bar.css({ width: `${percent * 100}%` }); 19493 }); 19494 loader.on("complete", () => { 19495 $progress_bar.css({ width: "100%" }); 19496 $(window).trigger("page_load_complete"); 19497 resolve(); 19498 }); 19499 loader.load(); 19500 }); 19501} 19502function get_image_list() { 19503 const hostname = /^https?:\/\/[^/]+\//.exec(window.location.href)[0]; 19504 const images = document.getElementsByTagName("img"); 19505 const urls = []; 19506 for (let i = 0; i < images.length; i += 1) { 19507 const src = images[i].src; 19508 if (src.indexOf(hostname) === 0) { 19509 urls.push(src); 19510 } 19511 } 19512 return urls; 19513} 19514 19515 19516/***/ }), 19517
19518/***/ "./src/js/pages/common/loading_complete.js": 19519/*!*************************************************!*\ 19520 !*** ./src/js/pages/common/loading_complete.js ***! 19521 \*************************************************/ 19522/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19523 19524"use strict"; 19525__webpack_require__.r(__webpack_exports__); 19526/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19527/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19528/* harmony export */ }); 19529/* harmony import */ var _scroll_invew__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scroll-invew */ "./src/js/pages/common/scroll-invew.ts"); 19530 19531 19532/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19533 const delay = 600; 19534 setTimeout(fadein, 200 + delay); 19535 setTimeout(remove_fadein, 1200 + delay); 19536 setTimeout(_scroll_invew__WEBPACK_IMPORTED_MODULE_0__["default"], 1200 + delay); 19537} 19538function fadein() { 19539 $(".js-loading").attr("data-loading-finish", "true"); 19540 $(window).trigger("page_fadein"); 19541} 19542function remove_fadein() { 19543 $(".js-loading").remove(); 19544} 19545 19546 19547/***/ }), 19548
19549/***/ "./src/js/pages/common/popup.js": 19550/*!**************************************!*\ 19551 !*** ./src/js/pages/common/popup.js ***! 19552 \**************************************/ 19553/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19554 19555"use strict"; 19556__webpack_require__.r(__webpack_exports__); 19557/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19558/* harmony export */ AJAX_SETTINGS: function() { return /* binding */ AJAX_SETTINGS; }, 19559/* harmony export */ NORMAL_SETTINGS: function() { return /* binding */ NORMAL_SETTINGS; }, 19560/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19561/* harmony export */ }); 19562/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lazyload */ "./src/js/pages/common/lazyload.js"); 19563/* harmony import */ var _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @fancyapps/ui */ "./node_modules/@fancyapps/ui/dist/index.esm.js"); 19564 19565 19566 19567const closeButton = '<button data-fancybox-close class="f-button is-close-btn" title="{{CLOSE}}"><i class="i-arrows-times-1"></i></button>'; 19568const NORMAL_SETTINGS = { 19569 mainClass: "", 19570 dragToClose: false, 19571 tpl: { closeButton } 19572}; 19573const AJAX_SETTINGS = { 19574 type: "ajax", 19575 dragToClose: false, 19576 mainClass: "", 19577 toolbar: true, 19578 tpl: { closeButton }, 19579 on: { 19580 reveal: () => { 19581 (0,_lazyload__WEBPACK_IMPORTED_MODULE_0__["default"])(); 19582 } 19583 } 19584}; 19585/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19586 _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__.Fancybox.bind("[data-fancybox]", NORMAL_SETTINGS); 19587 _fancyapps_ui__WEBPACK_IMPORTED_MODULE_1__.Fancybox.bind("[data-fancybox-ajax]", AJAX_SETTINGS); 19588} 19589 19590 19591/***/ }), 19592
19593/***/ "./src/js/pages/common/check-ua.ts": 19594/*!*****************************************!*\ 19595 !*** ./src/js/pages/common/check-ua.ts ***! 19596 \*****************************************/ 19597/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19598 19599"use strict"; 19600__webpack_require__.r(__webpack_exports__); 19601/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19602/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19603/* harmony export */ }); 19604/* harmony import */ var is_touch_device__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! is-touch-device */ "./node_modules/is-touch-device/build/index.js"); 19605/* harmony import */ var is_touch_device__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(is_touch_device__WEBPACK_IMPORTED_MODULE_0__); 19606 19607 19608/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19609 if (is_touch_device__WEBPACK_IMPORTED_MODULE_0___default()()) { 19610 document.body.setAttribute("data-is-mobile", "true"); 19611 } else { 19612 document.body.setAttribute("data-is-mobile", "false"); 19613 } 19614} 19615 19616 19617/***/ }), 19618
19619/***/ "./src/js/pages/common/index.ts": 19620/*!**************************************!*\ 19621 !*** ./src/js/pages/common/index.ts ***! 19622 \**************************************/ 19623/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19624 19625"use strict"; 19626__webpack_require__.r(__webpack_exports__); 19627/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19628/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19629/* harmony export */ }); 19630/* harmony import */ var _lazyload__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lazyload */ "./src/js/pages/common/lazyload.js"); 19631/* harmony import */ var _mediaquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mediaquery */ "./src/js/pages/common/mediaquery.ts"); 19632/* harmony import */ var _check_ua__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./check-ua */ "./src/js/pages/common/check-ua.ts"); 19633/* harmony import */ var _pagescroll__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pagescroll */ "./src/js/pages/common/pagescroll.ts"); 19634/* harmony import */ var _scroll_amount__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scroll-amount */ "./src/js/pages/common/scroll-amount.ts"); 19635/* harmony import */ var _social_share__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./social-share */ "./src/js/pages/common/social-share.ts"); 19636/* harmony import */ var _popup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./popup */ "./src/js/pages/common/popup.js"); 19637/* harmony import */ var _tabs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tabs */ "./src/js/pages/common/tabs.ts"); 19638/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./menu */ "./src/js/pages/common/menu.ts"); 19639/* harmony import */ var _menuActive__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./menuActive */ "./src/js/pages/common/menuActive.ts"); 19640/* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./loading */ "./src/js/pages/common/loading.js"); 19641/* harmony import */ var _loading_complete__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./loading_complete */ "./src/js/pages/common/loading_complete.js"); 19642 19643 19644 19645 19646 19647 19648 19649 19650 19651 19652 19653 19654 19655/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19656 (0,_lazyload__WEBPACK_IMPORTED_MODULE_0__["default"])(); 19657 (0,_mediaquery__WEBPACK_IMPORTED_MODULE_1__["default"])(); 19658 (0,_check_ua__WEBPACK_IMPORTED_MODULE_2__["default"])(); 19659 (0,_pagescroll__WEBPACK_IMPORTED_MODULE_3__["default"])(); 19660 (0,_scroll_amount__WEBPACK_IMPORTED_MODULE_4__["default"])(); 19661 (0,_social_share__WEBPACK_IMPORTED_MODULE_5__["default"])(); 19662 (0,_menu__WEBPACK_IMPORTED_MODULE_8__["default"])(); 19663 (0,_menuActive__WEBPACK_IMPORTED_MODULE_9__["default"])(); 19664 (0,_popup__WEBPACK_IMPORTED_MODULE_6__["default"])(); 19665 (0,_tabs__WEBPACK_IMPORTED_MODULE_7__["default"])(); 19666 (0,_loading__WEBPACK_IMPORTED_MODULE_10__["default"])().then(_loading_complete__WEBPACK_IMPORTED_MODULE_11__["default"]); 19667} 19668 19669 19670/***/ }), 19671
19672/***/ "./src/js/pages/common/mediaquery.ts": 19673/*!*******************************************!*\ 19674 !*** ./src/js/pages/common/mediaquery.ts ***! 19675 \*******************************************/ 19676/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19677 19678"use strict"; 19679__webpack_require__.r(__webpack_exports__); 19680/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19681/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19682/* harmony export */ }); 19683/* harmony import */ var _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/mediaquery */ "./node_modules/@sygnas/mediaquery/dist/es6/index.js"); 19684 19685 19686/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19687 _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("pc", "screen and (min-width: 851px)"); 19688 _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("tb", "screen and (min-width: 551px) and (max-width: 850px)"); 19689 _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("tb-lo", "screen (max-width: 850px)"); 19690 _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("sp-up", "screen and (min-width: 551px)"); 19691 _sygnas_mediaquery__WEBPACK_IMPORTED_MODULE_0__["default"].addMedia("sp", "screen and (max-width: 550px)"); 19692} 19693 19694 19695/***/ }), 19696
19697/***/ "./src/js/pages/common/menu.ts": 19698/*!*************************************!*\ 19699 !*** ./src/js/pages/common/menu.ts ***! 19700 \*************************************/ 19701/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19702 19703"use strict"; 19704__webpack_require__.r(__webpack_exports__); 19705/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19706/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19707/* harmony export */ }); 19708 19709const getHamburger = () => { 19710 return document.querySelector(".js-hamburger"); 19711}; 19712/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19713 const $hamburger = $(".js-hamburger"); 19714 $hamburger.on("click", toggle_menu); 19715 $(".c-mainmenu a.js-pagescroll").on("click", toggle_menu); 19716 $(".js-has-submenu").on("click", toggle_submenu); 19717} 19718function toggle_menu(ev) { 19719 const hamburger = getHamburger(); 19720 const state = hamburger?.getAttribute("data-hamburger-open"); 19721 const is_open = state === "true" ? "false" : "true"; 19722 hamburger.setAttribute("data-hamburger-open", is_open); 19723 $(".js-spmenu").attr("data-spmenu", is_open === "true" ? "open" : "close"); 19724 if (ev.currentTarget === hamburger) { 19725 ev.preventDefault(); 19726 } 19727} 19728function toggle_submenu(ev) { 19729 const $button = $(ev.currentTarget); 19730 const $submenu = $button.next(); 19731 const is_opened = $button.attr("data-submenu-opened") === "true"; 19732 if (is_opened) { 19733 $button.attr("data-submenu-opened", "false"); 19734 $submenu.attr("data-submenu-opened", "false"); 19735 } else { 19736 $button.attr("data-submenu-opened", "true"); 19737 $submenu.attr("data-submenu-opened", "true"); 19738 } 19739 ev.preventDefault(); 19740} 19741 19742 19743/***/ }), 19744
19745/***/ "./src/js/pages/common/menuActive.ts": 19746/*!*******************************************!*\ 19747 !*** ./src/js/pages/common/menuActive.ts ***! 19748 \*******************************************/ 19749/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19750 19751"use strict"; 19752__webpack_require__.r(__webpack_exports__); 19753 19754const items = { 19755 news: false, 19756 story: false, 19757 staff: false, 19758 character: false, 19759 book: false 19760}; 19761const option = { 19762 rootMargin: "-48% 0px", 19763 threshold: 0 19764}; 19765const callback = (entries) => { 19766 entries.forEach((entry) => { 19767 const menu = entry.target.getAttribute("data-menu"); 19768 const isActive = entry.isIntersecting; 19769 if (isActive) { 19770 Object.keys(items).forEach((key) => { 19771 items[key] = false; 19772 }); 19773 } 19774 items[menu] = isActive; 19775 }); 19776 Object.keys(items).forEach((key) => { 19777 const menuItem = document.querySelector(`.c-mainmenu__link--${key}`); 19778 const isActive = items[key]; 19779 menuItem?.setAttribute("data-menu-active", isActive ? "true" : "false"); 19780 }); 19781}; 19782/* harmony default export */ __webpack_exports__["default"] = (() => { 19783 const observer = new IntersectionObserver(callback, option); 19784 const contents = document.querySelectorAll(".js-menu-active"); 19785 contents.forEach((content) => { 19786 observer.observe(content); 19787 }); 19788}); 19789 19790 19791/***/ }), 19792
19793/***/ "./src/js/pages/common/pagescroll.ts": 19794/*!*******************************************!*\ 19795 !*** ./src/js/pages/common/pagescroll.ts ***! 19796 \*******************************************/ 19797/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19798 19799"use strict"; 19800__webpack_require__.r(__webpack_exports__); 19801/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19802/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19803/* harmony export */ }); 19804/* harmony import */ var smooth_scroll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! smooth-scroll */ "./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js"); 19805/* harmony import */ var smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(smooth_scroll__WEBPACK_IMPORTED_MODULE_0__); 19806 19807 19808/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19809 const click_scroll = new (smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default())("a.js-pagescroll", { 19810 speed: 500, 19811 offset: 0, 19812 easing: "easeInOutCubic" 19813 }); 19814 const scroll = new (smooth_scroll__WEBPACK_IMPORTED_MODULE_0___default())(); 19815 $(".js-return-up").on("click", (ev) => { 19816 scroll.animateScroll(0, null, { 19817 speed: 500, 19818 offset: 0, 19819 easing: "easeInOutCubic" 19820 }); 19821 ev.preventDefault(); 19822 }); 19823} 19824 19825 19826/***/ }), 19827
19828/***/ "./src/js/pages/common/scroll-amount.ts": 19829/*!**********************************************!*\ 19830 !*** ./src/js/pages/common/scroll-amount.ts ***! 19831 \**********************************************/ 19832/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19833 19834"use strict"; 19835__webpack_require__.r(__webpack_exports__); 19836/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19837/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19838/* harmony export */ }); 19839/* harmony import */ var _sygnas_scroll_amount__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/scroll-amount */ "./node_modules/@sygnas/scroll-amount/dist/es6/index.js"); 19840 19841 19842/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19843 const scroll_amount = new _sygnas_scroll_amount__WEBPACK_IMPORTED_MODULE_0__["default"](".js-scroll-amount"); 19844} 19845 19846 19847/***/ }), 19848
19849/***/ "./src/js/pages/common/scroll-invew.ts": 19850/*!*********************************************!*\ 19851 !*** ./src/js/pages/common/scroll-invew.ts ***! 19852 \*********************************************/ 19853/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19854 19855"use strict"; 19856__webpack_require__.r(__webpack_exports__); 19857/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19858/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19859/* harmony export */ }); 19860/* harmony import */ var _sygnas_scroll_inview__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/scroll-inview */ "./node_modules/@sygnas/scroll-inview/dist/es6/index.js"); 19861 19862 19863/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19864 const inview = new _sygnas_scroll_inview__WEBPACK_IMPORTED_MODULE_0__["default"](".js-inview", { rootMargin: "0px 0px -20% 0px" }); 19865 inview.start(); 19866} 19867 19868 19869/***/ }), 19870
19871/***/ "./src/js/pages/common/social-share.ts": 19872/*!*********************************************!*\ 19873 !*** ./src/js/pages/common/social-share.ts ***! 19874 \*********************************************/ 19875/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19876 19877"use strict"; 19878__webpack_require__.r(__webpack_exports__); 19879/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19880/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19881/* harmony export */ }); 19882/* harmony import */ var _sygnas_jp_social_share__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sygnas/jp-social-share */ "./node_modules/@sygnas/jp-social-share/dist/es6/index.js"); 19883 19884 19885/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19886 _sygnas_jp_social_share__WEBPACK_IMPORTED_MODULE_0__["default"].setShareButton(".js-share-button"); 19887} 19888 19889 19890/***/ }), 19891
19892/***/ "./src/js/pages/common/tabs.ts": 19893/*!*************************************!*\ 19894 !*** ./src/js/pages/common/tabs.ts ***! 19895 \*************************************/ 19896/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 19897 19898"use strict"; 19899__webpack_require__.r(__webpack_exports__); 19900/* harmony export */ __webpack_require__.d(__webpack_exports__, { 19901/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } 19902/* harmony export */ }); 19903/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js"); 19904/* harmony import */ var _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sygnas/vue-tabs */ "./node_modules/@sygnas/vue-tabs/dist/vue-tabs.es.js"); 19905 19906 19907 19908/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { 19909 let target = "#app-tabs1"; 19910 if (!$(target).length) { 19911 return; 19912 } 19913 const app = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)({ 19914 components: { 19915 VueTabs: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabs, 19916 VueTabsContent: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabsContent 19917 } 19918 }); 19919 app.mount(target); 19920 target = "#app-tabs2"; 19921 const tabControl = (0,_sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.useTabControl)("tabGroup2"); 19922 const app2 = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createApp)({ 19923 components: { 19924 VueTabs: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabs, 19925 VueTabsContent: _sygnas_vue_tabs__WEBPACK_IMPORTED_MODULE_1__.VueTabsContent 19926 }, 19927 computed: { 19928 activeId() { 19929 return tabControl.activeId.value; 19930 } 19931 }, 19932 methods: { 19933 changeTab() { 19934 tabControl.setActiveId("tabB"); 19935 }, 19936 prevTab() { 19937 tabControl.changePrevTab(); 19938 }, 19939 nextTab() { 19940 tabControl.changeNextTab(); 19941 } 19942 }, 19943 mounted() { 19944 tabControl.addChangeListener((ev) => { 19945 }); 19946 } 19947 }); 19948 app2.mount(target); 19949} 19950 19951 19952/***/ }), 19953
vendor: 725 bytes, lines 19954-19970
19954/***/ "./node_modules/is-touch-device/build/index.js": 19955/*!*****************************************************!*\ 19956 !*** ./node_modules/is-touch-device/build/index.js ***! 19957 \*****************************************************/ 19958/***/ (function(module, exports) { 19959 19960Object.defineProperty(exports, "__esModule", ({ 19961 value: true 19962})); 19963exports["default"] = isTouchDevice; 19964function isTouchDevice() { 19965 return !!(typeof window !== 'undefined' && ('ontouchstart' in window || window.DocumentTouch && typeof document !== 'undefined' && document instanceof window.DocumentTouch)) || !!(typeof navigator !== 'undefined' && (navigator.maxTouchPoints || navigator.msMaxTouchPoints)); 19966} 19967module.exports = exports['default']; 19968 19969/***/ }), 19970
vendor: 5,133 bytes, lines 19971-20163
19971/***/ "./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js": 19972/*!**********************************************************************!*\ 19973 !*** ./node_modules/lazysizes/plugins/unveilhooks/ls.unveilhooks.js ***! 19974 \**********************************************************************/ 19975/***/ (function(module, exports, __webpack_require__) { 19976 19977var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* 19978This plugin extends lazySizes to lazyLoad: 19979background images, videos/posters and scripts 19980 19981Background-Image: 19982For background images, use data-bg attribute: 19983<div class="lazyload" data-bg="bg-img.jpg"></div> 19984 19985 Video: 19986 For video/audio use data-poster and preload="none": 19987 <video class="lazyload" preload="none" data-poster="poster.jpg" src="src.mp4"> 19988 <!-- sources --> 19989 </video> 19990 19991 For video that plays automatically if in view: 19992 <video 19993 class="lazyload" 19994 preload="none" 19995 muted="" 19996 data-autoplay="" 19997 data-poster="poster.jpg" 19998 src="src.mp4"> 19999</video> 20000 20001 Scripts: 20002 For scripts use data-script: 20003 <div class="lazyload" data-script="module-name.js"></div> 20004 20005 20006 Script modules using require: 20007 For modules using require use data-require: 20008 <div class="lazyload" data-require="module-name"></div> 20009*/ 20010 20011(function(window, factory) { 20012 var globalInstall = function(){ 20013 factory(window.lazySizes); 20014 window.removeEventListener('lazyunveilread', globalInstall, true); 20015 }; 20016 20017 factory = factory.bind(null, window, window.document); 20018 20019 if( true && module.exports){ 20020 factory(__webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js")); 20021 } else if (true) { 20022 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! lazysizes */ "./node_modules/lazysizes/lazysizes.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 20023 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 20024 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 20025 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 20026 } else {} 20027}(window, function(window, document, lazySizes) { 20028 /*jshint eqnull:true */ 20029 'use strict'; 20030 var bgLoad, regBgUrlEscape; 20031 var uniqueUrls = {}; 20032 20033 if(document.addEventListener){ 20034 regBgUrlEscape = /\(|\)|\s|'/; 20035 20036 bgLoad = function (url, cb){ 20037 var img = document.createElement('img'); 20038 img.onload = function(){ 20039 img.onload = null; 20040 img.onerror = null; 20041 img = null; 20042 cb(); 20043 }; 20044 img.onerror = img.onload; 20045 20046 img.src = url; 20047 20048 if(img && img.complete && img.onload){ 20049 img.onload(); 20050 } 20051 }; 20052 20053 addEventListener('lazybeforeunveil', function(e){ 20054 if(e.detail.instance != lazySizes){return;} 20055 20056 var tmp, load, bg, poster; 20057 if(!e.defaultPrevented) { 20058 20059 var target = e.target; 20060 20061 if(target.preload == 'none'){ 20062 target.preload = target.getAttribute('data-preload') || 'auto'; 20063 } 20064 20065 if (target.getAttribute('data-autoplay') != null) { 20066 if (target.getAttribute('data-expand') && !target.autoplay) { 20067 try { 20068 target.play(); 20069 } catch (er) {} 20070 } else { 20071 requestAnimationFrame(function () { 20072 target.setAttribute('data-expand', '-10'); 20073 lazySizes.aC(target, lazySizes.cfg.lazyClass); 20074 }); 20075 } 20076 } 20077 20078 tmp = target.getAttribute('data-link'); 20079 if(tmp){ 20080 addStyleScript(tmp, true); 20081 } 20082 20083 // handle data-script 20084 tmp = target.getAttribute('data-script'); 20085 if(tmp){ 20086 e.detail.firesLoad = true; 20087 load = function(){ 20088 e.detail.firesLoad = false; 20089 lazySizes.fire(target, '_lazyloaded', {}, true, true); 20090 }; 20091 addStyleScript(tmp, null, load); 20092 } 20093 20094 // handle data-require 20095 tmp = target.getAttribute('data-require'); 20096 if(tmp){ 20097 if(lazySizes.cfg.requireJs){ 20098 lazySizes.cfg.requireJs([tmp]); 20099 } else { 20100 addStyleScript(tmp); 20101 } 20102 } 20103 20104 // handle data-bg 20105 bg = target.getAttribute('data-bg'); 20106 if (bg) { 20107 e.detail.firesLoad = true; 20108 load = function(){ 20109 target.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')'; 20110 e.detail.firesLoad = false; 20111 lazySizes.fire(target, '_lazyloaded', {}, true, true); 20112 }; 20113 20114 bgLoad(bg, load); 20115 } 20116 20117 // handle data-poster 20118 poster = target.getAttribute('data-poster'); 20119 if(poster){ 20120 e.detail.firesLoad = true; 20121 load = function(){ 20122 target.poster = poster; 20123 e.detail.firesLoad = false; 20124 lazySizes.fire(target, '_lazyloaded', {}, true, true); 20125 }; 20126 20127 bgLoad(poster, load); 20128 20129 } 20130 } 20131 }, false); 20132 20133 } 20134 20135 function addStyleScript(src, style, cb){ 20136 if(uniqueUrls[src]){ 20137 return; 20138 } 20139 var elem = document.createElement(style ? 'link' : 'script'); 20140 var insertElem = document.getElementsByTagName('script')[0]; 20141 20142 if(style){ 20143 elem.rel = 'stylesheet'; 20144 elem.href = src; 20145 } else { 20146 elem.onload = function(){ 20147 elem.onerror = null; 20148 elem.onload = null; 20149 cb(); 20150 }; 20151 elem.onerror = elem.onload; 20152 20153 elem.src = src; 20154 } 20155 uniqueUrls[src] = true; 20156 uniqueUrls[elem.src || elem.href] = true; 20157 insertElem.parentNode.insertBefore(elem, insertElem); 20158 } 20159})); 20160 20161 20162/***/ }), 20163
vendor: 25,914 bytes, lines 20164-20420
20164/***/ "./node_modules/vue/dist/vue.esm-bundler.js": 20165/*!**************************************************!*\ 20166 !*** ./node_modules/vue/dist/vue.esm-bundler.js ***! 20167 \**************************************************/ 20168/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 20169 20170"use strict"; 20171__webpack_require__.r(__webpack_exports__); 20172/* harmony export */ __webpack_require__.d(__webpack_exports__, { 20173/* harmony export */ BaseTransition: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransition; }, 20174/* harmony export */ BaseTransitionPropsValidators: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.BaseTransitionPropsValidators; }, 20175/* harmony export */ Comment: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Comment; }, 20176/* harmony export */ DeprecationTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.DeprecationTypes; }, 20177/* harmony export */ EffectScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.EffectScope; }, 20178/* harmony export */ ErrorCodes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ErrorCodes; }, 20179/* harmony export */ ErrorTypeStrings: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ErrorTypeStrings; }, 20180/* harmony export */ Fragment: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Fragment; }, 20181/* harmony export */ KeepAlive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.KeepAlive; }, 20182/* harmony export */ ReactiveEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ReactiveEffect; }, 20183/* harmony export */ Static: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Static; }, 20184/* harmony export */ Suspense: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Suspense; }, 20185/* harmony export */ Teleport: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Teleport; }, 20186/* harmony export */ Text: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Text; }, 20187/* harmony export */ TrackOpTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TrackOpTypes; }, 20188/* harmony export */ Transition: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.Transition; }, 20189/* harmony export */ TransitionGroup: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TransitionGroup; }, 20190/* harmony export */ TriggerOpTypes: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.TriggerOpTypes; }, 20191/* harmony export */ VueElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.VueElement; }, 20192/* harmony export */ assertNumber: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.assertNumber; }, 20193/* harmony export */ callWithAsyncErrorHandling: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithAsyncErrorHandling; }, 20194/* harmony export */ callWithErrorHandling: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.callWithErrorHandling; }, 20195/* harmony export */ camelize: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.camelize; }, 20196/* harmony export */ capitalize: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.capitalize; }, 20197/* harmony export */ cloneVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.cloneVNode; }, 20198/* harmony export */ compatUtils: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.compatUtils; }, 20199/* harmony export */ compile: function() { return /* binding */ compileToFunction; }, 20200/* harmony export */ computed: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.computed; }, 20201/* harmony export */ createApp: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createApp; }, 20202/* harmony export */ createBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createBlock; }, 20203/* harmony export */ createCommentVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode; }, 20204/* harmony export */ createElementBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementBlock; }, 20205/* harmony export */ createElementVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createElementVNode; }, 20206/* harmony export */ createHydrationRenderer: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createHydrationRenderer; }, 20207/* harmony export */ createPropsRestProxy: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createPropsRestProxy; }, 20208/* harmony export */ createRenderer: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createRenderer; }, 20209/* harmony export */ createSSRApp: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSSRApp; }, 20210/* harmony export */ createSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createSlots; }, 20211/* harmony export */ createStaticVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode; }, 20212/* harmony export */ createTextVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createTextVNode; }, 20213/* harmony export */ createVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.createVNode; }, 20214/* harmony export */ customRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.customRef; }, 20215/* harmony export */ defineAsyncComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineAsyncComponent; }, 20216/* harmony export */ defineComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineComponent; }, 20217/* harmony export */ defineCustomElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineCustomElement; }, 20218/* harmony export */ defineEmits: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineEmits; }, 20219/* harmony export */ defineExpose: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineExpose; }, 20220/* harmony export */ defineModel: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineModel; }, 20221/* harmony export */ defineOptions: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineOptions; }, 20222/* harmony export */ defineProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineProps; }, 20223/* harmony export */ defineSSRCustomElement: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineSSRCustomElement; }, 20224/* harmony export */ defineSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.defineSlots; }, 20225/* harmony export */ devtools: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.devtools; }, 20226/* harmony export */ effect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effect; }, 20227/* harmony export */ effectScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.effectScope; }, 20228/* harmony export */ getCurrentInstance: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentInstance; }, 20229/* harmony export */ getCurrentScope: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getCurrentScope; }, 20230/* harmony export */ getTransitionRawChildren: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.getTransitionRawChildren; }, 20231/* harmony export */ guardReactiveProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.guardReactiveProps; }, 20232/* harmony export */ h: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.h; }, 20233/* harmony export */ handleError: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.handleError; }, 20234/* harmony export */ hasInjectionContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hasInjectionContext; }, 20235/* harmony export */ hydrate: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.hydrate; }, 20236/* harmony export */ initCustomFormatter: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initCustomFormatter; }, 20237/* harmony export */ initDirectivesForSSR: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.initDirectivesForSSR; }, 20238/* harmony export */ inject: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.inject; }, 20239/* harmony export */ isMemoSame: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isMemoSame; }, 20240/* harmony export */ isProxy: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isProxy; }, 20241/* harmony export */ isReactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReactive; }, 20242/* harmony export */ isReadonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isReadonly; }, 20243/* harmony export */ isRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRef; }, 20244/* harmony export */ isRuntimeOnly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isRuntimeOnly; }, 20245/* harmony export */ isShallow: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isShallow; }, 20246/* harmony export */ isVNode: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.isVNode; }, 20247/* harmony export */ markRaw: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.markRaw; }, 20248/* harmony export */ mergeDefaults: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeDefaults; }, 20249/* harmony export */ mergeModels: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeModels; }, 20250/* harmony export */ mergeProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.mergeProps; }, 20251/* harmony export */ nextTick: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.nextTick; }, 20252/* harmony export */ normalizeClass: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeClass; }, 20253/* harmony export */ normalizeProps: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeProps; }, 20254/* harmony export */ normalizeStyle: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle; }, 20255/* harmony export */ onActivated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onActivated; }, 20256/* harmony export */ onBeforeMount: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeMount; }, 20257/* harmony export */ onBeforeUnmount: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount; }, 20258/* harmony export */ onBeforeUpdate: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onBeforeUpdate; }, 20259/* harmony export */ onDeactivated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onDeactivated; }, 20260/* harmony export */ onErrorCaptured: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onErrorCaptured; }, 20261/* harmony export */ onMounted: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onMounted; }, 20262/* harmony export */ onRenderTracked: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTracked; }, 20263/* harmony export */ onRenderTriggered: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onRenderTriggered; }, 20264/* harmony export */ onScopeDispose: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onScopeDispose; }, 20265/* harmony export */ onServerPrefetch: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onServerPrefetch; }, 20266/* harmony export */ onUnmounted: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUnmounted; }, 20267/* harmony export */ onUpdated: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.onUpdated; }, 20268/* harmony export */ openBlock: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.openBlock; }, 20269/* harmony export */ popScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.popScopeId; }, 20270/* harmony export */ provide: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.provide; }, 20271/* harmony export */ proxyRefs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.proxyRefs; }, 20272/* harmony export */ pushScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.pushScopeId; }, 20273/* harmony export */ queuePostFlushCb: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.queuePostFlushCb; }, 20274/* harmony export */ reactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.reactive; }, 20275/* harmony export */ readonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.readonly; }, 20276/* harmony export */ ref: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ref; }, 20277/* harmony export */ registerRuntimeCompiler: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.registerRuntimeCompiler; }, 20278/* harmony export */ render: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.render; }, 20279/* harmony export */ renderList: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderList; }, 20280/* harmony export */ renderSlot: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.renderSlot; }, 20281/* harmony export */ resolveComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveComponent; }, 20282/* harmony export */ resolveDirective: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDirective; }, 20283/* harmony export */ resolveDynamicComponent: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveDynamicComponent; }, 20284/* harmony export */ resolveFilter: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveFilter; }, 20285/* harmony export */ resolveTransitionHooks: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.resolveTransitionHooks; }, 20286/* harmony export */ setBlockTracking: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setBlockTracking; }, 20287/* harmony export */ setDevtoolsHook: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setDevtoolsHook; }, 20288/* harmony export */ setTransitionHooks: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.setTransitionHooks; }, 20289/* harmony export */ shallowReactive: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReactive; }, 20290/* harmony export */ shallowReadonly: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowReadonly; }, 20291/* harmony export */ shallowRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.shallowRef; }, 20292/* harmony export */ ssrContextKey: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrContextKey; }, 20293/* harmony export */ ssrUtils: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.ssrUtils; }, 20294/* harmony export */ stop: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.stop; }, 20295/* harmony export */ toDisplayString: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toDisplayString; }, 20296/* harmony export */ toHandlerKey: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlerKey; }, 20297/* harmony export */ toHandlers: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toHandlers; }, 20298/* harmony export */ toRaw: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRaw; }, 20299/* harmony export */ toRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRef; }, 20300/* harmony export */ toRefs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toRefs; }, 20301/* harmony export */ toValue: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.toValue; }, 20302/* harmony export */ transformVNodeArgs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.transformVNodeArgs; }, 20303/* harmony export */ triggerRef: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.triggerRef; }, 20304/* harmony export */ unref: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.unref; }, 20305/* harmony export */ useAttrs: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useAttrs; }, 20306/* harmony export */ useCssModule: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssModule; }, 20307/* harmony export */ useCssVars: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useCssVars; }, 20308/* harmony export */ useModel: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useModel; }, 20309/* harmony export */ useSSRContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSSRContext; }, 20310/* harmony export */ useSlots: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useSlots; }, 20311/* harmony export */ useTransitionState: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.useTransitionState; }, 20312/* harmony export */ vModelCheckbox: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelCheckbox; }, 20313/* harmony export */ vModelDynamic: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelDynamic; }, 20314/* harmony export */ vModelRadio: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelRadio; }, 20315/* harmony export */ vModelSelect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelSelect; }, 20316/* harmony export */ vModelText: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vModelText; }, 20317/* harmony export */ vShow: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.vShow; }, 20318/* harmony export */ version: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.version; }, 20319/* harmony export */ warn: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.warn; }, 20320/* harmony export */ watch: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watch; }, 20321/* harmony export */ watchEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchEffect; }, 20322/* harmony export */ watchPostEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchPostEffect; }, 20323/* harmony export */ watchSyncEffect: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.watchSyncEffect; }, 20324/* harmony export */ withAsyncContext: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withAsyncContext; }, 20325/* harmony export */ withCtx: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withCtx; }, 20326/* harmony export */ withDefaults: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDefaults; }, 20327/* harmony export */ withDirectives: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withDirectives; }, 20328/* harmony export */ withKeys: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withKeys; }, 20329/* harmony export */ withMemo: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withMemo; }, 20330/* harmony export */ withModifiers: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withModifiers; }, 20331/* harmony export */ withScopeId: function() { return /* reexport safe */ _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__.withScopeId; } 20332/* harmony export */ }); 20333/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js"); 20334/* harmony import */ var _vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vue/runtime-dom */ "./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"); 20335/* harmony import */ var _vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @vue/compiler-dom */ "./node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js"); 20336/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vue/shared */ "./node_modules/@vue/shared/dist/shared.esm-bundler.js"); 20337/** 20338* vue v3.4.34 20339* (c) 2018-present Yuxi (Evan) You and Vue contributors 20340* @license MIT 20341**/ 20342 20343 20344 20345 20346 20347 20348function initDev() { 20349 { 20350 (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.initCustomFormatter)(); 20351 } 20352} 20353 20354if (true) { 20355 initDev(); 20356} 20357const compileCache = /* @__PURE__ */ new WeakMap(); 20358function getCache(options) { 20359 let c = compileCache.get(options != null ? options : _vue_shared__WEBPACK_IMPORTED_MODULE_2__.EMPTY_OBJ); 20360 if (!c) { 20361 c = /* @__PURE__ */ Object.create(null); 20362 compileCache.set(options != null ? options : _vue_shared__WEBPACK_IMPORTED_MODULE_2__.EMPTY_OBJ, c); 20363 } 20364 return c; 20365} 20366function compileToFunction(template, options) { 20367 if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.isString)(template)) { 20368 if (template.nodeType) { 20369 template = template.innerHTML; 20370 } else { 20371 true && (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`invalid template option: `, template); 20372 return _vue_shared__WEBPACK_IMPORTED_MODULE_2__.NOOP; 20373 } 20374 } 20375 const key = template; 20376 const cache = getCache(options); 20377 const cached = cache[key]; 20378 if (cached) { 20379 return cached; 20380 } 20381 if (template[0] === "#") { 20382 const el = document.querySelector(template); 20383 if ( true && !el) { 20384 (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(`Template element not found or is empty: ${template}`); 20385 } 20386 template = el ? el.innerHTML : ``; 20387 } 20388 const opts = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.extend)( 20389 { 20390 hoistStatic: true, 20391 onError: true ? onError : 0, 20392 onWarn: true ? (e) => onError(e, true) : 0 20393 }, 20394 options 20395 ); 20396 if (!opts.isCustomElement && typeof customElements !== "undefined") { 20397 opts.isCustomElement = (tag) => !!customElements.get(tag); 20398 } 20399 const { code } = (0,_vue_compiler_dom__WEBPACK_IMPORTED_MODULE_3__.compile)(template, opts); 20400 function onError(err, asWarning = false) { 20401 const message = asWarning ? err.message : `Template compilation error: ${err.message}`; 20402 const codeFrame = err.loc && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_2__.generateCodeFrame)( 20403 template, 20404 err.loc.start.offset, 20405 err.loc.end.offset 20406 ); 20407 (0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.warn)(codeFrame ? `${message} 20408${codeFrame}` : message); 20409 } 20410 const render = new Function("Vue", code)(_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_0__); 20411 render._rc = true; 20412 return cache[key] = render; 20413} 20414(0,_vue_runtime_dom__WEBPACK_IMPORTED_MODULE_1__.registerRuntimeCompiler)(compileToFunction); 20415 20416 20417 20418 20419/***/ }), 20420
vendor: 566 bytes, lines 20421-20430
20421/***/ "./node_modules/@fancyapps/ui/dist/index.esm.js": 20422/*!**************************************************************************************************!*\ 20423 !*** delegated ./node_modules/@fancyapps/ui/dist/index.esm.js from dll-reference vendor_library ***! 20424 \**************************************************************************************************/ 20425/***/ (function(module, __unused_webpack_exports, __webpack_require__) { 20426 20427module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(197); 20428 20429/***/ }), 20430
vendor: 586 bytes, lines 20431-20440
20431/***/ "./node_modules/@sygnas/mediaquery/dist/es6/index.js": 20432/*!*******************************************************************************************************!*\ 20433 !*** delegated ./node_modules/@sygnas/mediaquery/dist/es6/index.js from dll-reference vendor_library ***! 20434 \*******************************************************************************************************/ 20435/***/ (function(module, __unused_webpack_exports, __webpack_require__) { 20436 20437module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(240); 20438 20439/***/ }), 20440
vendor: 638 bytes, lines 20441-20450
20441/***/ "./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js": 20442/*!********************************************************************************************************************!*\ 20443 !*** delegated ./node_modules/smooth-scroll/dist/smooth-scroll.polyfills.min.js from dll-reference vendor_library ***! 20444 \********************************************************************************************************************/ 20445/***/ (function(module, __unused_webpack_exports, __webpack_require__) { 20446 20447module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(496); 20448 20449/***/ }), 20450
vendor: 514 bytes, lines 20451-20460
20451/***/ "./node_modules/preloader/index.js": 20452/*!*************************************************************************************!*\ 20453 !*** delegated ./node_modules/preloader/index.js from dll-reference vendor_library ***! 20454 \*************************************************************************************/ 20455/***/ (function(module, __unused_webpack_exports, __webpack_require__) { 20456 20457module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(625); 20458 20459/***/ }), 20460
vendor: 527 bytes, lines 20461-20469
20461/***/ "./node_modules/lazysizes/lazysizes.js": 20462/*!*****************************************************************************************!*\ 20463 !*** delegated ./node_modules/lazysizes/lazysizes.js from dll-reference vendor_library ***! 20464 \*****************************************************************************************/ 20465/***/ (function(module, __unused_webpack_exports, __webpack_require__) { 20466 20467module.exports = (__webpack_require__(/*! dll-reference vendor_library */ "dll-reference vendor_library"))(879); 20468 20469/***/ })
vendor: 4,350 bytes, lines 20469-20578
20469, 20470 20471/***/ "dll-reference vendor_library": 20472/*!*********************************!*\ 20473 !*** external "vendor_library" ***! 20474 \*********************************/ 20475/***/ (function(module) { 20476 20477"use strict"; 20478module.exports = vendor_library; 20479 20480/***/ }) 20481 20482/******/ }); 20483/************************************************************************/ 20484/******/ // The module cache 20485/******/ var __webpack_module_cache__ = {}; 20486/******/ 20487/******/ // The require function 20488/******/ function __webpack_require__(moduleId) { 20489/******/ // Check if module is in cache 20490/******/ var cachedModule = __webpack_module_cache__[moduleId]; 20491/******/ if (cachedModule !== undefined) { 20492/******/ return cachedModule.exports; 20493/******/ } 20494/******/ // Create a new module (and put it into the cache) 20495/******/ var module = __webpack_module_cache__[moduleId] = { 20496/******/ // no module.id needed 20497/******/ // no module.loaded needed 20498/******/ exports: {} 20499/******/ }; 20500/******/ 20501/******/ // Execute the module function 20502/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 20503/******/ 20504/******/ // Return the exports of the module 20505/******/ return module.exports; 20506/******/ } 20507/******/ 20508/************************************************************************/ 20509/******/ /* webpack/runtime/compat get default export */ 20510/******/ !function() { 20511/******/ // getDefaultExport function for compatibility with non-harmony modules 20512/******/ __webpack_require__.n = function(module) { 20513/******/ var getter = module && module.__esModule ? 20514/******/ function() { return module['default']; } : 20515/******/ function() { return module; }; 20516/******/ __webpack_require__.d(getter, { a: getter }); 20517/******/ return getter; 20518/******/ }; 20519/******/ }(); 20520/******/ 20521/******/ /* webpack/runtime/define property getters */ 20522/******/ !function() { 20523/******/ // define getter functions for harmony exports 20524/******/ __webpack_require__.d = function(exports, definition) { 20525/******/ for(var key in definition) { 20526/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 20527/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 20528/******/ } 20529/******/ } 20530/******/ }; 20531/******/ }(); 20532/******/ 20533/******/ /* webpack/runtime/global */ 20534/******/ !function() { 20535/******/ __webpack_require__.g = (function() { 20536/******/ if (typeof globalThis === 'object') return globalThis; 20537/******/ try { 20538/******/ return this || new Function('return this')(); 20539/******/ } catch (e) { 20540/******/ if (typeof window === 'object') return window; 20541/******/ } 20542/******/ })(); 20543/******/ }(); 20544/******/ 20545/******/ /* webpack/runtime/hasOwnProperty shorthand */ 20546/******/ !function() { 20547/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 20548/******/ }(); 20549/******/ 20550/******/ /* webpack/runtime/make namespace object */ 20551/******/ !function() { 20552/******/ // define __esModule on exports 20553/******/ __webpack_require__.r = function(exports) { 20554/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 20555/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 20556/******/ } 20557/******/ Object.defineProperty(exports, '__esModule', { value: true }); 20558/******/ }; 20559/******/ }(); 20560/******/ 20561/************************************************************************/ 20562var __webpack_exports__ = {}; 20563// This entry need to be wrapped in an IIFE because it need to be in strict mode. 20564!function() { 20565"use strict"; 20566/*!**************************!*\ 20567 !*** ./src/js/common.js ***! 20568 \**************************/ 20569__webpack_require__.r(__webpack_exports__); 20570/* harmony import */ var _pages_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pages/common */ "./src/js/pages/common/index.ts"); 20571 20572 20573(0,_pages_common__WEBPACK_IMPORTED_MODULE_0__["default"])(); 20574 20575}(); 20576/******/ })() 20577; 20578//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0F
20578BRTZHO0FBQzdHOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDNEo7O0FBRTVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG9GQUFlO0FBQ25COztBQUVBLEVBQUUsaUZBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0IsbUJBQW1CLFFBQVE7QUFDM0IsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFFBQVE7QUFDL0Isc0JBQXNCLFFBQVE7QUFDOUI7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CLG1CQUFtQixRQUFRO0FBQzNCLHVCQUF1QixRQUFRO0FBQy9CLHVCQUF1QixRQUFRO0FBQy9CLHNCQUFzQixRQUFRO0FBQzlCLGdCQUFnQixRQUFRO0FBQ3hCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQSx3REFBd0QsU0FBUztBQUNqRSwyREFBMkQsUUFBUTtBQUNuRTs7QUFFQSxtQ0FBbUMsU0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tBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsK0JBQStCO0FBQzFDLFNBQVMsK0JBQStCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscURBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFEQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDZCQUE2QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLFVBQVUsSUFBa0Q7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxXQUFXLEtBQWtEO0FBQzdEO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFdBQVcsS0FBa0Q7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxVQUFVLEtBQWtEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsVUFBVSxJQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxVQUFVLEtBQWtEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTSx3UkFBd1I7QUFDOVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpSEFBaUgsSUFBSSx5Q0FBeUMsSUFBSTtBQUNsSztBQUNBLEd
20578BQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQiw4QkFBOEIsSUFBSSxJQUFJLDJEQUEyRCxFQUFFO0FBQ25HLGFBQWEsS0FBSyxPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQXlDLCtCQUErQixZQUFZO0FBQ3RGO0FBQ0E7QUFDQSxjQUFjLEtBQWtELG1FQUFtRSxDQUFxRDtBQUN4TDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkNBQUk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0JBQXdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBLGtEQUFrRCxxREFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxREFBUTtBQUN4QjtBQUNBLFNBQVMscURBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscURBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxREFBUTtBQUMvQjtBQUNBLElBQUk7QUFDSjtBQUNBLFNBQVMscURBQVE7QUFDakI7QU
20578FDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLLEdBQUc7QUFDckI7QUFDQSxHQUFHLEVBQUU7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix1QkFBdUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHFEQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEI7QUFDQSxhQUFhLDJDQUFFO0FBQ2YsWUFBWSwyQ0FBRTtBQUNkLG1CQUFtQiwyQ0FBRTtBQUNyQjtBQUNBO0FBQ0EsZUFBZSxhQUFvQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFFBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsU0FBUyxLQUFrRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw4QkFBOEIsZUFBZTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1EQUFNLEdBQUc7QUFDakMsTUFBTTtBQUNOLHdCQUF3QixtREFBTSxHQUFHO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsVUFBVTtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUF5QztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFlBQVk7QUFDMUM7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtREFBTSxHQUFHO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFdBQVc7QUFDckI7QUFDQTtBQUNBO0FBQ0EsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTix1QkFBdUIsNEJBQTRCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSkFBcUosb0RBQU87QUFDNUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0JBQWdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0EsWUFBWSxxREFBUSxXQUFXLHFEQUFRO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsSUFBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscURBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QixvQkFBb0IsdUJBQXVCO0FBQzNDLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSx1QkFBdUIsNkNBQUk7QUFDM0Isb0JBQW9CLDZDQUFJO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrREFBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHVEQUFVLENBQUMscURBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGlCQUFpQixvQ0FBb0M7QUFDckQsS0FBSztBQUNMO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsVUFBVSxLQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLDZDQUFJO0FBQ3ZCO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsVUFBVSxxREFBUTtBQUNsQjtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVM7QU
20578FDbkIsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHdCQUF3Qix1REFBYztBQUN0QyxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0EsNEJBQTRCLHVEQUFjLE9BQU87QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyw0QkFBNEI7QUFDckM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0EsbUJBQW1CLDRCQUE0QjtBQUMvQztBQUNBO0FBQ0EsVUFBVSxvREFBTztBQUNqQjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxREFBUTtBQUMxQjtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsaUJBQWlCLEtBQUssaUJBQWlCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG1CQUFtQjtBQUNwQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsYUFBYSxHQUFHLFVBQVUsR0FBRztBQUNsRDtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLEVBQUUsdUNBQXVDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGVBQWU7QUFDbkMsY0FBYyxrQkFBa0IsT0FBTyxFQUFFO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixFQUFFLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDZCQUE2QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEJBQTBCLElBQUksU0FBUyxHQUFHLG1CQUFtQixFQUFFLG1DQUFtQyxHQUFHLGdCQUFnQjtBQUNwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx1Q0FBdUM7QUFDakQ7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixPQUFPLElBQUksR0FBRztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxREFBUTtBQUNqQjtBQUNBO0FBQ0EseUNBQXlDLEtBQXlDLHNCQUFzQixvREFBTztBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0EsTUFBTSxTQUFTLG9EQUFPO0FBQ3RCO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFEQUFRO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxxREFBUTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25ELHNEQUFzRCxVQUFVO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsb0JBQW9CO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQSxVQUFVLDBCQUEwQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQSxRQUFRLHFEQUFRO0F
20578BQ2hCO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSixhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLHVCQUF1QixHQUFHLDZCQUE2QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQSw2Q0FBNkMsdURBQWMsYUFBYTtBQUN4RSxRQUFRO0FBQ1Isc0NBQXNDLHVEQUFjLCtEQUErRCx1REFBYztBQUNqSSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBLE1BQU0sS0FBSyxFQUVOO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CLEdBQUcsOEJBQThCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBcUI7QUFDL0IsaUJBQWlCLHFEQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGtDQUFrQztBQUM1QyxVQUFVLGFBQWE7QUFDdkI7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLDhDQUE4QyxLQUF5QztBQUN2RixzQkFBc0IsT0FBTztBQUM3QjtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekMsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0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tBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUMsY0FBYyxDQUFJO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsV0FBVztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQix1REFBYztBQUN4QyxVQUFVLEtBQXlDO0FBQ25EO0FBQ0EsOEJBQThCLHVEQUFjLE9BQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsaUJBQWlCO0FBQzNCO0FBQ0EsUUFBUSxNQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0oscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscURBQVE7QUFDOUIsUUFBUTtBQUNSLHlCQUF5QiwrQkFBK0IsR0FBRyxZQUFZO0FBQ3ZFO0FBQ0EsTUFBTTtBQUNOLDhCQUE4QiwrQkFBK0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxREFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04seUJBQXlCLE9BQU8sR0FBRyxFQUFFLGFBQWE7QUFDbEQ7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLE9BQU87QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQixhQUFhLEtBQWtEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSw0Q0FBNEM7QUFDdEQsVUFBVSw0QkFBNEI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBaUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsbUJBQW1CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0JBQW9CO0FBQ2xDLGNBQWMsb0NBQW9DO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1Q0FBdUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLEtBQXlDLFVBQVUsc0RBQWEsWUFBWSxNQUFNLENBQUU7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCO0FBQ0EsMkVBQTJFLElBQUk7QUFDL0UsK0JBQStCLHFEQUFRO0F
20578BQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHlCQUF5QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLE1BQU07QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsaUNBQWlDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QU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UNBO0FBQ0E7QUFDQSxxQ0FBcUMseUJBQXlCLEdBQUc7QUFDakU7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWCx3QkFBd0Isc0RBQVMsU0FBUyxxREFBUSxTQUFTLHdEQUFXO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEVBQXNCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZEQUFnQjtBQUNyQyxTQUFTLDBFQUFzQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHVFQUFtQjtBQUM1QjtBQUNBO0FBQ0EsSUFBSSxLQUFrRCxzQkFBc0IsQ0FBTTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx3RUFBb0I7Q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UFTLCtEQUFXO0FBQ3BCO0FBQ0EsSUFBSSxtREFBTSxHQUFHO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixtREFBTTtBQUNqQyxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxTQUFTLDZEQUFTLFdBQVcsbURBQU0sR0FBRztBQUN0Qzs7QUFFd1Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeGZ4VDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tLOztBQUVsSztBQUNBLDZCQUE2QixJQUFJO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU0sU0FBUyxJQUF5QztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsSUFBeUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsNkNBQUk7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsSUFBSSxtREFBTTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRLElBQXlDO0FBQ2pELGlFQUFpRSxtREFBTSxHQUFHLGlCQUFpQjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRCxxRUFBcUUsbURBQU0sR0FBRyxpQkFBaUI7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQixLQUF5QyxlQUFlLENBQUU7QUFDckYsbUNBQW1DLEtBQXlDLHVCQUF1QixDQUFFO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQSxRQUFRLEVBQUUsQ0FBTTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw2QkFBNkIsb0RBQU87QUFDeEM7QUFDQTtBQUNBLGdDQUFnQyxxREFBUTtBQUN4QztBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvREFBTztBQUNwQjtBQUNBLGNBQWMsa0RBQUs7QUFDbkI7QUFDQTtBQUNBLFVBQVUsU0FBUyx5REFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0RBQU87QUFDcEI7QUFDQSxjQUFjLGtEQUFLO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsRUFBRSxDQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsb0RBQU87QUFDbEQ7QUFDQSwrSUFBK0ksaURBQVE7QUFDdko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEd
20578BQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsT0FBTyxxREFBUTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9EQUFPO0FBQ2pDO0FBQ0EsMkJBQTJCLG1EQUFNO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIseURBQVk7QUFDMUM7QUFDQSxRQUFRLHFEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9EQUFPO0FBQ2xCO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBTyxZQUFZLHlEQUFZLHNDQUFzQyxtREFBTTtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUyx1REFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbURBQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxREFBUTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxvREFBTztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQSxpQ0FBaUMsWUFBWTtBQU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BQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsYUFBYTtBQUNuQztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLCtEQUFrQjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUF5QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekMsc0NBQXNDLGtEQUFTO0FBQy9DO0FBQ0EsVUFBVSx1REFBVTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOERBQWE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSw4REFBYTtBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUF5QztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUEwQyxFQUFFLEVBQU07QUFDbEU7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNEQUFLO0FBQzVCLGNBQWMsT0FBTztBQUNyQixVQUFVLEtBQXlDO0FBQ25ELDZDQUE2QyxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0RBQU87QUFDZjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0EsVUFBVSxzQkFBc0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdURBQVU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlEQUFpRCxLQUFLO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVEQUFVO0FBQ25CO0FBQ0E7QUFDQSwyQkFBMkIsbURBQU0sR0FBRyxvQkFBb0Isa0JBQWtCLGdCQUFnQjtBQUMxRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx1REFBVTtBQUNoQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVLEtBQXlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUF5QyxhQUFhLHFEQUFRLFdBQVcsdURBQVU7QUFDN0YsZ0VBQWdFLEtBQUs7QUFDckU7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxxQkFBcUIsb0RBQUc7QUFDeEIsb0JBQW9CLG9EQUFHO0FBQ3ZCLHNCQUFzQixvREFBRztBQUN6QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxRQUFRO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsMkRBQWM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxVQUFVLElBQWtFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSwyREFBYztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsVUFBVSxJQUFrRTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQSxjQUFjLHdCQUF3QjtB
20578QUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0RBQU87QUFDYjtBQUNBLElBQUksU0FBUyxxREFBUTtBQUNyQjtBQUNBLElBQUksU0FBUyxxREFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1EQUFNO0FBQ1YsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhEQUFhO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOERBQWE7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsSUFBeUM7QUFDdEQsb0JBQW9CLHlEQUFZO0FBQ2hDO0FBQ0EsU0FBUyxTQUFTO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0scURBQVE7QUFDZDtBQUNBLEl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SxrQ0FBa0MsSUFBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0RBQU8sT0FBTyxvREFBTztBQUMzQixTQUFTLG1EQUFNLEdBQUc7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sWUFBWSxJQUFJLDBCQUEwQixXQUFXO0FBQzNFLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUNBQW1DLEtBQXlDLDhCQUE4QixDQUFJO0FBQzlHLE1BQU0sSUFBeUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHVEQUFVO0FBQ3BCLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVLEtBQUssRUFFTjtBQUNULFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBLFFBQVEsU0FBUyxJQUF5QztBQUMxRDtBQUNBLHFCQUFxQixJQUFJLGNBQWMscUJBQXFCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q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E7QUFDQSxVQUFVLFNBQVMsSUFBb0Y7QUFDdkcsc0RBQXNELFlBQVk7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxzREFBc0Q7QUFDbEU7QUFDQSxRQUFRLElBQTJFO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQW9GO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsV0FBVyxLQUFvRjtBQUMvRjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsMEJBQTBCLGVBQWU7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5STtBQUNySjtBQUNBLGlCQUFpQixLQUFvRjtBQUNyRztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRixpREFBSSxVQUFVLDJEQUFjO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUFLLEVBV047QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
20578FDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1IsYUFBYSxLQUFvRjtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFDQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxLQUFvRjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyREFBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxlQUFlLHFEQUFRLDhCQUE4QiwyREFBYyxDQUFDLDJEQUFjO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHFDQUFxQywyREFBYyx1Q0FBdUMsMERBQWEsU0FBUyw0REFBZTtBQUNuSSxRQUFRLDBEQUFhO0FBQ3JCO0FBQ0EsaUJBQWlCLCtEQUFrQjtBQUNuQyxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxpQkFBaUIsa0VBQXFCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELFlBQVksSUFBSSxFQUFFO0FBQ2hGLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0EsMEJBQTBCO0FBQzFCLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixLQUFLLEdBQUcsYUFBYTtBQUMxQztBQUNBLE1BQU0sSUFBa0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixLQUFLLEdBQUcsYUFBYTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxVQUFVLDZDQUE2QyxJQUFJLEtBQUs7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFrRTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxLQUF3QyxFQUFFLEVBRzdDO0FBQ0gsTUFBTSxLQUEwQyxFQUFFLEVBRy9DO0FBQ0g7QUFDQSxJQUFJLEtBQXlDO0FBQzdDLElBQUksMERBQWE7QUFDakI7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCOztBQUV0RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBEQUFhO0FBQzlCO0FBQ0EsTUFBTSxJQUFrRTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2Q0FBSTtBQUNyQztBQUNBLElBQUk7QUFDSix1SkFBdUosS0FBeUM7QUFDaE07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1QkFBdUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBeUM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBeUM7QUFDNUQsa0RBQWtELFlBQVk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixZQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsWUFBWTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFDQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMkRBQWM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQWtFO0FBQzFFLE1BQU0sZ0RBQUc7QUFDVCxNQUFNLGdEQUFHO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5QkFBeUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBa0U7QUFDMUU7QUFDQTtBQUNBLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0EsaUNBQWlDLGtEQUFTO0FBQzFDLGlDQUFpQyxrREFBUztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25EO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBCQUEwQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtEQUFTO0FBQ2hDO0FBQ0EsZUFBZSwyREFBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDJEQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFpRTtBQUMzRSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQSxVQUFVLEtBQUssRUFhTjtBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQSxRQUFRLElBQXlDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUIsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSxVQUFVLDJEQUFjO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQXlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixJQUF5QztBQUN6RDtBQUNBO0FBQ0EsZ0JBQWdCLElBQXlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixJQUF5QztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsY0FBYyxJQUF5QztBQUN2RDtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQXlDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBa0U7QUFDOUU7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLGNBQWMsNkJBQTZCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVUsMkRBQWM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQXlDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBa0U7QUFDOUU7QUFDQTtBQUNBLFlBQVksSUFBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsMkRBQWM7QUFDdkQ7QUFDQSxNQUFNLDZDQUFJO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUF5QztBQUNqRCw2Q0FBNkMsMkRBQWM7QUFDM0QsK0NBQStDLDJEQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw4REFBYTtBQUNqQjtBQUNBLElBQUksOERBQWE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtEQUFTO0FBQ3hCLGVBQWUsa0RBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLGNBQWMsS0FBeUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQyxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLGtEQUFTO0FBQy9GO0FBQ0EsZ0NBQWdDLFFBQVE7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDRDQUE0QztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsZ0JBQWdCLGdDQU
20578FnQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDO0FBQ0EsVUFBVSxLQUF5QztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXlDO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZLHdDQUF3QztBQUNwRDtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJEQUFjO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFrRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pEO0FBQ0E7QUFDQSx5QkFBeUIsZ0JBQWdCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG9EQUFPLFNBQVMsb0RBQU87QUFDN0Isb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBeUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBeUMsR0FBRyxtREFBTSxHQUFHLGFBQWEsZUFBZSxJQUFJLENBQWlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBeUMsR0FBRyxtREFBTSxHQUFHLGFBQWEsZUFBZSxJQUFJLENBQWlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QyxLQUFLLHVEQUFVO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLGtEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQUs7QUFDWDtBQUNBLG1CQUFtQiwwREFBUztBQUM1QixJQUFJLFNBQVMsMkRBQVU7QUFDdkI7QUFDQTtBQUNBLElBQUksU0FBUyxvREFBTztBQUNwQjtBQUNBLHNDQUFzQywyREFBVSxPQUFPLDBEQUFTO0FBQ2hFO0FBQ0EsVUFBVSxzREFBSztBQUNmO0FBQ0EsUUFBUSxTQUFTLDJEQUFVO0FBQzNCO0FBQ0EsUUFBUSxTQUFTLHVEQUFVO0FBQzNCO0FBQ0EsUUFBUTtBQUNSLFFBQVEsS0FBeUM7QUFDakQ7QUFDQSxLQUFLO0FBQ0wsSUFBSSxTQUFTLHVEQUFVO0FBQ3ZCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGFBQWEsNkNBQUk7QUFDakIsSUFBSSxLQUF5QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZDQUFJO0FBQ3BCO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGFBQWEsNkNBQUk7QUFDakI7QU
20578FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLHVEQUFVLG9CQUFvQix1REFBVTtBQUNuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDJEQUFjLFNBQVMsNkNBQUk7QUFDaEQsZ0JBQWdCLGdFQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLE1BQU0sbURBQU07QUFDWjtBQUNBO0FBQ0EsTUFBTSxJQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixxREFBUTtBQUN6QjtBQUNBLE1BQU0sdURBQVU7QUFDaEI7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIscURBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sc0RBQUs7QUFDWDtBQUNBLElBQUksU0FBUyxvREFBTztBQUNwQixvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQSxJQUFJLFNBQVMsa0RBQUssV0FBVyxrREFBSztBQUNsQztBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUksU0FBUywwREFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QyxrREFBUztBQ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CxzQkFBc0I7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsc0JBQXNCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBeUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUF5QztBQUMvQztBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEtBQXlDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsY0FBYyxLQUF5QztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGlEQUFJO0FBQ2xELHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsNERBQWU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxzREFBc0Q7QUFDaEUsVUFBVSxzREFBc0Q7QUFDaEU7QUFDQSxNQUFNLEtBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0F
20578BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sdURBQVU7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLHlHQUF5Ryw0QkFBNEIsaUJBQWlCO0FBQ3RKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHlEQUF5RDtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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DYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJLFNBQVMsaURBQUk7QUFDakIsU0FBUyw0REFBZTtBQUN4QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdURBQVU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscURBQVE7QUFDakM7QU
20578FDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrRUFBZTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sVUFBVSxLQUF5QztBQUNuRCxRQUFRLHVEQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwyREFBUTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsNkJBQTZCLGtCQUFrQjtBQUMvQztBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0Esb0JBQW9CLG9EQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFEQUFRO0FBQ3pDO0FBQ0EsaUZBQWlGLHFEQUFVO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLDZCQUE2QixvREFBTyx5Q0FBeUM7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxpREFBVTtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQ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UFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsb0RBQU8sa0JBQWtCLDJEQUFjO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWEsc0JBQXNCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwwREFBYTtBQUNoQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBLEdBQUc7QUFDSCxxQkFBcUIsOEJBQThCLHNCQUFzQjtBQUN6RTtBQUNBO0FBQ0EsaUZBQWlGLDBEQUFhO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxvREFBTztBQUNqQixzQkFBc0IseURBQVk7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTLGtEQUFLO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QU
20578FDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0EsTUFBTSxvREFBTztBQUNiLGlCQUFpQix5REFBWTtBQUM3QixJQUFJLFNBQVMsa0RBQUs7QUFDbEI7QUFDQSxJQUFJO0FBQ0osaUJBQWlCLHVEQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCLGlCQUFpQix1REFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBLG1CQUFtQix1REFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CLFVBQVU7QUFDOUMsdUJBQXVCLGtEQUFLO0FBQzVCO0FBQ0E7QUFDQSx3QkFBd0IsMERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkRBQVE7QUFDZDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0IsVUFBVTtBQUM5QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILGdCQUFnQixvQkFBb0IsVUFBVTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixvREFBTztBQUM5QixzQ0FBc0Msa0RBQUs7QUFDM0MsSUFBSSxLQUF5QyxJQUFJLHVEQUFJO0FBQ3JELDBGQUEwRixtREFBbUQ7QUFDN0k7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE9BQU87QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsNEJBQTRCLHlEQUFZO0FBQ3hDO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNLFNBQVMsdURBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxRQUFRLE9BQU87QUFDcEQsK0JBQStCLE9BQU87QUFDdEMsdUJBQXVCLHVEQUFVO0FBQ2pDLGVBQWU7QUFDZjtBQUNBO0FBQ0Esa0NBQWtDLE9BQU87QUFDekMsUUFBUSxvREFBTztBQUNmLHlCQUF5Qix5REFBWTtBQUNyQyxpQkFBaUI7QUFDakI7QUFDQSxNQUFNLFNBQVMsa0RBQUs7QUFDcEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxNQUFNO0FBQ04sZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxFQUFFO0FBQzlEO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNEQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSx3Q0FBd0MsbURBQU0sR0FBRyxXQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpRUFBYztBQUMvQztBQUNBO0FBQ0EsMkNBQTJDLDBFQUF1QjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUF5QztBQUMvQztBQUNBO0FBQ0E7QUFDQSxVQUFVLFFBQVE7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVEQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXlDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLFVBQVUsUUFBUTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0RBQVMsU0FBUyxxREFBUSxTQUFTLHdEQUFXO0FBQ2xFO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLGdFQUFhO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsUUFBUSx1REFBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQUk7QUFDWjtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsdURBQUk7QUFDWjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFEQUFRO0FBQ2Q7QUFDQSxRQUFRLEtBQXlDO0FBQ2pELE1BQU0sdURBQUk7QUFDVix1REFBdUQsVUFBVTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBeUM7QUFDL0MsSUFBSSx1REFBSTtBQUNSLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNWtEaFM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsS0FBeUMsbUJBQW1CLElBQUksQ0FBRTtBQUNwRixrQkFBa0IsS0FBeUMsdUJBQXVCLENBQUU7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHVCQUF1QixnQkFBZ0I7QUFDdkM7QU
20578FDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2S0FBNksscUJBQU0sbUJBQW1CLHFCQUFNLEtBQUs7QUFDak47QUFDQTtBQUNBO0FBQ0EseUNBQXlDLEtBQUssZUFBZSxxQkFBcUI7QUFDbEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBLDhCQUE4QiwrQkFBK0I7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsYUFBYSxLQUFLLEVBQUUsaURBQWlELEtBQUssU0FBUztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGNBQWMsR0FBRyxPQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzQkFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLEtBQUs7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixvQkFBb0I7QUFDaEQ7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQ0FBc0M7QUFDbEU7QUFDQTs7QUFFaTVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsZTMzQjtBQUNFO0FBRXhCLDZCQUFlLHNDQUFZO0FBQ3pCLHdEQUFhLENBQUMsWUFBWTtBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2RzQjtBQUV0Qiw2QkFBZSxvQ0FBVSxXQUFXLENBQUMsR0FBRztBQUV0QyxRQUFNLGdCQUFnQixFQUFFLHNCQUFzQjtBQUU5QyxRQUFNLFNBQVMsZ0RBQVMsQ0FBQyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBRzdDLFFBQU0sYUFBYSxlQUFlO0FBQ2xDL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ZDQUFVO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLHlFQUF1Qjs7QUFFaUI7Ozs7Ozs7Ozs7O0FDL0V4Qzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7VUNBQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQSxlQUFlLDRCQUE0QjtXQUMzQyxlQUFlO1dBQ2YsaUNBQWlDLFdBQVc7V0FDNUM7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsR0FBRztXQUNIO1dBQ0E7V0FDQSxDQUFDOzs7OztXQ1BELDhDQUE4Qzs7Ozs7V0NBOUM7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7OztBQ0htQjtBQUVuQix5REFBTSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9qcC1zb2NpYWwtc2hhcmUvZGlzdC9lczYvX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL2pwLXNvY2lhbC1zaGFyZS9kaXN0L2VzNi9pbmRleC5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL3Njcm9sbC1hbW91bnQvZGlzdC9lczYvX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9Ac3lnbmFzL3Njcm9sbC1hbW91bnQvZGlzdC9lczYvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9zY3JvbGwtaW52aWV3L2Rpc3QvZXM2L192aXJ0dWFsL19yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHN5Z25hcy9zY3JvbGwtaW52aWV3L2Rpc3QvZXM2L2luZGV4LmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0BzeWduYXMvdnVlLXRhYnMvZGlzdC92dWUtdGFicy5lcy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL25vZGVfbW9kdWxlcy9AdnVlL2NvbXBpbGVyLWNvcmUvZGlzdC9jb21waWxlci1jb3JlLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvY29tcGlsZXItZG9tL2Rpc3QvY29tcGlsZXItZG9tLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcm
20578UvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL0B2dWUvc2hhcmVkL2Rpc3Qvc2hhcmVkLmVzbS1idW5kbGVyLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9sYXp5bG9hZC5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbG9hZGluZy5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbG9hZGluZ19jb21wbGV0ZS5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vcG9wdXAuanMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9zcmMvanMvcGFnZXMvY29tbW9uL2NoZWNrLXVhLnRzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9pbmRleC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVkaWFxdWVyeS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVudS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vbWVudUFjdGl2ZS50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vcGFnZXNjcm9sbC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vc2Nyb2xsLWFtb3VudC50cyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9wYWdlcy9jb21tb24vc2Nyb2xsLWludmV3LnRzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vc3JjL2pzL3BhZ2VzL2NvbW1vbi9zb2NpYWwtc2hhcmUudHMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9zcmMvanMvcGFnZXMvY29tbW9uL3RhYnMudHMiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvLi9ub2RlX21vZHVsZXMvaXMtdG91Y2gtZGV2aWNlL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL2xhenlzaXplcy9wbHVnaW5zL3VudmVpbGhvb2tzL2xzLnVudmVpbGhvb2tzLmpzIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyLy4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qcyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgMTk3IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgMjQwIGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgNDk2IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgNjI1IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9kZWxlZ2F0ZWQgODc5IGZyb20gZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeSIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi9leHRlcm5hbCB2YXIgXCJ2ZW5kb3JfbGlicmFyeVwiIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL3NpdGVfdGVtcGxhdGVfMjAyMDEyL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc2l0ZV90ZW1wbGF0ZV8yMDIwMTIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zaXRlX3RlbXBsYXRlXzIwMjAxMi8uL3NyYy9qcy9jb21tb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci
205785jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGNsYXNzQ2FsbENoZWNrLCBfY3JlYXRlQ2xhc3MgYXMgY3JlYXRlQ2xhc3MsIF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZpbmVQcm9wZXJ0eSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcy5tYXBcbiIsImltcG9ydCB7IGRlZmluZVByb3BlcnR5IGFzIF9kZWZpbmVQcm9wZXJ0eSwgY3JlYXRlQ2xhc3MgYXMgX2NyZWF0ZUNsYXNzLCBjbGFzc0NhbGxDaGVjayBhcyBfY2xhc3NDYWxsQ2hlY2sgfSBmcm9tICcuL192aXJ0dWFsL19yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMnO1xuXG4vKipcbiAqIOaXpeacrOWQkeOBkeOCveODvOOCt+ODo+ODq+OCt+OCp+OCouODnOOCv+ODs1xuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG52YXIgSnBTb2NpYWxTaGFyZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEpwU29jaWFsU2hhcmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpwU29jaWFsU2hhcmUpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEpwU29jaWFsU2hhcmUsIG51bGwsIFt7XG4gICAga2V5OiBcInNldFNoYXJlQnV0dG9uXCIsXG4gICAgdmFsdWU6IC8vIOOCteODvOODk+OCueWQjeitmOWIpeWtkFxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgLyoqXG4gICAgICog44K344Kn44Ki44Oc44K/44Oz44Gu44Oq44Oz44Kv44KS6Kit5a6a44GZ44KLXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldCDlr77osaHjg5zjgr/jg7Pjga7jgrvjg6zjgq/jgr9cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uIOaWsOimj+OCpuOCo+ODs+ODieOCpuOBruODkeODqeODoeODvOOCv++8iGRlZmF1bHRz5Y+C54Wn77yJXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0U2hhcmVCdXR0b24odGFyZ2V0KSB7XG4gICAgICB2Y
20578XIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIC8vIOioreWumuOBruODnuODvOOCuFxuICAgICAgdGhpcy5vcHQgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVmYXVsdHMsIG9wdGlvbik7IC8vIOOCr+ODquODg+OCr+OCpOODmeODs+ODiOOCkuioreWumlxuXG4gICAgICB0aGlzLmdldE5vZGVBcnJheShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhcmdldCkpLmZvckVhY2goZnVuY3Rpb24gKGVsbSkge1xuICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgZWxtID0gZXYuY3VycmVudFRhcmdldDtcblxuICAgICAgICAgIF90aGlzLm9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50KGVsbSk7XG5cbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqjjg6zjg6Hjg7Pjg4jjgYvjgonmg4XloLHjgpLlj5blvpfjgZfjgabjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW5TaGFyZVdpbmRvd1dpdGhFbGVtZW50KGVsbSkge1xuICAgICAgLy8g44Ko44Os44Oh44Oz44OI44GL44KJ44OR44Op44Oh44O844K/44KS5Y+W5b6XXG4gICAgICB2Y
20578XIgc2VydmljZSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtc2VydmljZScpO1xuICAgICAgdmFyIHVybCA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtdXJsJykgfHwgJyc7XG4gICAgICB2YXIgbWVzc2FnZSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hhcmUtbWVzc2FnZScpIHx8IGRvY3VtZW50LnRpdGxlO1xuICAgICAgdmFyIGFjY291bnQgPSBlbG0uZ2V0QXR0cmlidXRlKCdkYXRhLXNoYXJlLWFjY291bnQnKSB8fCAnJztcbiAgICAgIHZhciBmb2xsb3cgPSBlbG0uZ2V0QXR0cmlidXRlKCdkYXRhLXNoYXJlLWZvbGxvdycpIHx8ICcnOyAvLyDjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cblxuICAgICAgdGhpcy5vcGVuU2hhcmVXaW5kb3coc2VydmljZSwgdXJsLCBtZXNzYWdlLCBhY2NvdW50LCBmb2xsb3cpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrfjgqfjgqLnlKjjgqbjgqPjg7Pjg4njgqbjgpLplovjgY9cbiAgICAgKiBAcGFyYW0gc2VydmljZSB7U3RyaW5nfSDjgr3jg7zjgrfjg6Pjg6vjgrXjg7zjg5PjgrnorZjliKXlrZBcbiAgICAgKiBAcGFyYW0gdXJsIHtTdHJpbmd9IOOCt+OCp+OColVSTFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IOODoeODg+OCu+ODvOOCuOacrOaWh1xuICAgICAqIEBwYXJhbSBhY2NvdW50IHtTdHJpbmd9IOODhOOCpOODvOODiOOBq+S7mOOBkeOCi1JlcGxleeOCouOCq+OCpuODs+ODiFxuICAgICAqIEBwYXJhbSBmb2xsb3cge1N0cmluZ30g44OE44Kk44O844OI5b6M44Gr6KGo56S644GZ44KL44OV44Kp44Ot44O85YCZ6KOc44Ki44Kr44Km44Oz44OIXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvcGVuU2hhcmVXaW5kb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BlblNoYXJlV2luZG93KHNlcnZpY2UpIHtcbiAgICAgIHZhciB1cmwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgICAgdmFyIG1lc3NhZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICcnO1xuICAgICAgdmFyIGFjY291bnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICcnO1xuICAgICAgdmFyIGZvbGxvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogJyc7XG5cbiAgICAgIC8vIOWtmOWcqOOBl+OBquOBhOOCteODvOODk+OCueOBoOOBo+OBn+OCieOCqOODqeODvFxuICAgICAgaWYgKHRoaXMub3B0LnNlcnZpY2VzICYmIE9iamVjdC5rZXlzKHRoaXMub3B0LnNlcnZpY2VzKS5pbmRleE9mKHNlcnZpY2UpID09PSAtMSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlwiLmNvbmNhdChzZXJ2aWNlLCBcIiBpcyBub3Qgc3VwcG9ydGVkLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8g44OG44Oz44OX44Os44O844OI44GL44KJ44Kz44Oz44OQ44O844OIXG5cblxuICAgICAgdmFyIG9wZW5VcmwgPSB0aGlzLmNvbnZlcnRPcGVuVXJsKHNlcnZpY2UsIHVybCwgbWVzc2FnZSwgYWNjb3VudCwgZm9sbG93KTsgLy8gLy8gTElOReOBr+OCouODl+ODquOBq+mjm+OBsOOBmeOAguOBneOCjOS7peWkluOBr+OCpuOCo+ODs+ODieOCpuOCkumWi+OBj1xuICAgICAgLy8gaWYgKHNlcnZpY2UgPT09IHRoaXMuU0VSVklDRVMuTElORSkge1xuICAgICAgLy8gICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG9wZW5Vcmw7XG4gICAgICAvLyB9IGVsc2UgaWYgKHRoaXMub3B0LndpbmRvdykge1xuXG4gICAgICBpZiAodGhpcy5vcHQud2luZG93KSB7XG4gICAgICAgIHZhciB3aW5kb3dPcHRpb24gPSB0aGlzLmdldFdpbmRvd09wdGlvbih0aGlzLm9wdC53aW5kb3cpO1xuICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsLCBcInNoYXJlX1wiLmNvbmNhdChzZXJ2aWNlKSwgd2luZG93T3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXaW5kb3cgb3B0aW9uIGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIC8qKlxuICAgICAqIOOCteODvOODk+OCueavjuOBrlVSTOOCkuWPluW+l1xuICAgICAqIOODkeODqeODoeODvOOCv+OBq+OCiOOBo+OBpuOBr+WKoOW3peOBjOOBleOCjOOCi1xuICAgICAqIEBwYXJhbSBzZXJ2aWNlIHtTdHJpbmd9IOOCveODvOOCt+ODo+ODq+OCteODvOODk+OCueitmOWIpeWtkFxuICAgICAqIEBwYXJhbSB1cmwge1N0cmluZ30g44K344Kn44KiVVJMXG4gICAgICogQHBhcmFtIG1lc3NhZ2Uge1N0cmluZ30g44Oh44OD44K744O844K45pys5paHXG4gICAgICogQHBhcmFtIGFjY291bnQge1N0cmluZ30g44OE44Kk44O844OI44Gr5LuY44GR44KLUmVwbGV544Ki44Kr44Km44Oz44OIXG4gICAgICogQHBhcmFtIGZvbGxvdyB7U3RyaW5nfSDjg4TjgqTjg7zjg4jlvozjgavooajnpLrjgZnjgovjg5Xjgqnjg63jg7zlgJnoo5zjgqLjgqvjgqbjg7Pjg4hcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IOOCt+OCp+OCoueqk+OCquODvOODl+ODs1VSTFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29udmVydE9wZW5VcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29udmVydE9wZW5Vcmwoc2VydmljZSkge1xuICAgICAgdmFyIHVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7XG4gICAgICB2Y
20578XIgbWVzc2FnZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJyc7XG4gICAgICB2YXIgYWNjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJyc7XG4gICAgICB2YXIgZm9sbG93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAnJztcbiAgICAgIHZhciBldSA9IGVuY29kZVVSSUNvbXBvbmVudDtcbiAgICAgIHZhciBzaGFyZVVybCA9IHVybCB8fCBsb2NhdGlvbi5ocmVmO1xuICAgICAgdmFyIG9wZW5VcmwgPSB0aGlzLm9wdC5zZXJ2aWNlcyA/IHRoaXMub3B0LnNlcnZpY2VzW3NlcnZpY2VdIDogXCJcIjtcblxuICAgICAgaWYgKCFvcGVuVXJsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiXCIuY29uY2F0KHNlcnZpY2UsIFwiIGlzIG5vdCBzdXBwb3J0ZWQuXCIpKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9IC8vIFR3aXR0ZXLjgaDjgZHjg5Hjg6njg6Hjg7zjgr/jga7lhoXlrrnjgavjgojjgaPjgaZVUkzjgYzlpInjgo/jgotcblxuXG4gICAgICBpZiAoc2VydmljZSA9PT0gdGhpcy5TRVJWSUNFUy5UV0lUVEVSKSB7XG4gICAgICAgIGlmICghYWNjb3VudCkgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcIiZ2aWE9e3tBQ0NPVU5UfX1cIiwgXCJcIik7XG4gICAgICAgIGlmICghZm9sbG93KSBvcGVuVXJsID0gb3BlblVybC5yZXBsYWNlKFwiJnJlbGF0ZWQ9e3tGT0xMT1d9fVwiLCBcIlwiKTtcbiAgICAgIH1cblxuICAgICAgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcInt7QUNDT1VOVH19XCIsIGV1KGFjY291bnQpKTtcbiAgICAgIG9wZW5VcmwgPSBvcGVuVXJsLnJlcGxhY2UoXCJ7e0ZPTExPV319XCIsIGV1KGZvbGxvdykpO1xuICAgICAgb3BlblVybCA9IG9wZW5VcmwucmVwbGFjZShcInt7TUVTU0FHRX19XCIsIGV1KG1lc3NhZ2UpKTtcbiAgICAgIG9wZW5VcmwgPSBvcGVuVXJsLnJlcGxhY2UoXCJ7e1VSTH19XCIsIGV1KHNoYXJlVXJsKSk7XG4gICAgICByZXR1cm4gb3BlblVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm9kZUxpc3TjgpJBcnJheeOBqOOBl+OBpuWPluOCiuWHuuOBme+8iElF5a++562W77yJXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXROb2RlQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Tm9kZUFycmF5KG5vZGVMaXN0KSB7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9kZUxpc3QsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaW5kb3fjg5Hjg6njg6Hjg7zjgr/kvZzmiJBcbiAgICAgKiBAcGFyYW0gb3B0IHtPYmplY3R9IOOCpuOCo+ODs+ODieOCpuODkeODqeODoeODvOOCv1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30g5paw6KaP44Km44Kj44Oz44OJ44Km44Gu44OR44Op44Oh44O844K/5paH5a2X5YiXXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRXaW5kb3dPcHRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0V2luZG93T3B0aW9uKG9wdCkge1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICBPYmplY3Qua2V5cyhvcHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpdGVtcy5wdXNoKFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChvcHRba2V5XSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXMuam9pbihcIixcIik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEpwU29jaWFsU2hhcmU7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKcFNvY2lhbFNoYXJlLCBcIlNFUlZJQ0VTXCIsIHtcbiAgVFdJVFRFUjogJ3R3aXR0ZXInLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgTElORTogJ2xpbmUnLFxuICBGRUVETFk6ICdmZWVkbHknLFxuICBQT0NLRVQ6ICdwb2NrZXQnLFxuICBIQVRFQlU6ICdoYXRlYnUnXG59KTtcblxuX2RlZmluZVByb3BlcnR5KEpwU29jaWFsU2hhcmUsIFwib3B0XCIsIHZvaWQgMCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKcFNvY2lhbFNoYXJlLCBcImRlZmF1bHRzXCIsIHtcbiAgLy8gd2luZG93Lm9wZW4oKSDjga7jgqrjg5fjgrfjg6fjg7NcbiAgd2luZG93OiB7XG4gICAgd2lkdGg6IDU1MCxcbiAgICBoZWlnaHQ6IDQ1MCxcbiAgICBwZXJzb25hbGJhcjogMCxcbiAgICB0b29sYmFyOiAwLFxuICAgIHNjcm9sbGJhcnM6IDEsXG4gICAgcmVzaXphYmxlOiAxXG4gIH0sXG4gIC8vIOOCt+OCp+OCoueUqFVSTOOBruODhuODs+ODl+ODrOODvOODiFxuICBzZXJ2aWNlczoge1xuICAgIHR3aXR0ZXI6ICdodHRwOi8vdHdpdHRlci5jb20vc2hhcmU/dXJsPXt7VVJMfX0mdGV4dD17e01FU1NBR0V9fSZ2aWE9e3tBQ0NPVU5UfX0mcmVsYXRlZD17e0ZPTExPV319JyxcbiAgICBmYWNlYm9vazogJ2h0dHA6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlLnBocD91PXt7VVJMfX0nLFxuICAgIC8vIGxpbmU6ICdsaW5lOi8vbXNnL3RleHQve3tNRVNTQUdFfX0ge3tVUkx9fScsXG4gICAgbGluZTogJ2h0dHBzOi8vc29jaWFsLXBsdWdpbnMubGluZS5tZS9saW5laXQvc2hhcmU/dXJsPXt7VVJMfX0nLFxuICAgIGZlZWRseTogJ2h0dHA6Ly9mZWVkbHkuY29tL2kvc3Vic2NyaXB0aW9uL2ZlZWQve3tVUkx9fScsXG4gICAgcG9ja2V0OiAnaHR0cDovL2dldHBvY2tldC5jb20vZWRpdD91cmw9e3tVUkx9fScsXG4gICAgaGF0ZWJ1OiAnLy9iLmhhdGVuYS5uZS5qcC9hZGQ/bW9kZT1jb25maXJtJnVybD17e1VSTH19JnRpdGxlPXt7TUVTU0FHRX19J1xuICB9XG59KTtcblxuZXhwb3J0IHsgSnBTb2NpYWxTaGFyZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci
205785lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCB7IF9jbGFzc0NhbGxDaGVjayBhcyBjbGFzc0NhbGxDaGVjaywgX2NyZWF0ZUNsYXNzIGFzIGNyZWF0ZUNsYXNzLCBfZGVmaW5lUHJvcGVydHkgYXMgZGVmaW5lUHJvcGVydHkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMuanMubWFwXG4iLCJpbXBvcnQgeyBjcmVhdGVDbGFzcyBhcyBfY3JlYXRlQ2xhc3MsIGNsYXNzQ2FsbENoZWNrIGFzIF9jbGFzc0NhbGxDaGVjaywgZGVmaW5lUHJvcGVydHkgYXMgX2RlZmluZVByb3BlcnR5IH0gZnJvbSAnLi9fdmlydHVhbC9fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmpzJztcblxuLyoqXG4gKiBBZGQgc2Nyb2xsaW5nIHN0YXRlKHRvcCAvIG5vdC10b3AgLyBib3R0b20gLyBub3QtYm90dG9tKVxuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIOeKtuaFi+OCkuS7mOS4juOBmeOCi+OBn+OCgeOBrmRhdGHlsZ7mgKdcbnZhciBBVFRSX05BTUUgPSBcImRhdGEtc2Nyb2xsLWFtb3VudFwiOyAvLyDnirbmhYvjga7lkI3liY1cblxudmFyIEFUVFJfVE9QID0gXCJ0b3BcIjtcbnZhciBBVFRSX0JPVFRPTSA9IFwiYm90dG9tXCI7XG52YXIgQVRUUl9OT1RfVE9QID0gXCJub3QtdG9wXCI7XG52YXIgQVRUUl9OT1RfQk9UVE9NID0gXCJub3QtYm90dG9tXCI7XG52YXIgQVRUUl9QT1NJVElPTiA9IFwiZGF0YS1wb3NpdGlvblwiOyAvLyDnm6PoppbnlKjjgqjjg6zjg6Hjg7Pjg4jjga7jg4fjg5Xjgqnjg6vjg4hzdHlsZVxuXG52YXIgQ09NTU9OX1NUWUxFID0ge1xuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICBsZWZ0OiBcIjBcIlxufTsgLy8gSW50ZXJzZWN0aW9uT2JzZXJ2ZXLjga7oqK3lrppcblxudmFyIE9CU0VSVkVSX09QVCA9IHtcbiAgcm9vdDogbnVsbCxcbiAgcm9vdE1hcmdpbjogXCIwcHhcIixcbiAgdGhyZXNob2xkOiAwXG59OyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIFN5Z1Njcm9sbEFtb3VudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIHByaXZhdGUgb2JzZXJ2ZXJzOiBJbnRlcnNlY3Rpb25PYnNlcnZlcltdO1xuXG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICogQHBhcmFtIHRhcmdldCBzdHJpbmcg54q25oWL44KS5LuY5LiO44GZ44KL5a++6LGh44Ko44Os44Oh44Oz44OI44Gu44K744Os44Kv44K/5paH5a2X5YiXXG4gICAqL1xuICBmdW5jdGlvbiBTeWdTY3JvbGxBbW91bnQodGFyZ2V0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN5Z1Njcm9sbEFtb3VudCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcHRcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRhcmdldHNcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlzVG9wXCIsIHZvaWQgMCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc0JvdHRvbVwiLCB2b2lkIDApO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFN0YXRlXCIsIHZvaWQgMCk7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAvLyDmnIDkuIrpg6jjga7jgqrjg5Xjgrvjg4Pjg4hcbiAgICAgIG9mZnNldFRvcDogXCI3MHB4XCIsXG4gICAgICAvLyDmnIDkuIvpg6jjga7jgqrjg5Xjgrvjg4Pjg4hcbiAgICAgIG9mZnNldEJvdHRvbTogXCI3MHB4XCIsXG4gICAgICAvLyDmnIDkuIrpg6jjgavjgrnjgq/jg63jg7zjg6vjgZfjgZ/mmYLjgavlrp/ooYxcbiAgICAgIG9uVG9wOiBmdW5jdGlvbiBvblRvcCgpIHt9LFxuICAgICAgLy8g5pyA5LiK6YOo44GL44KJ6Zui44KM44Gf5pmC44Gr5a6f6KGMXG4gICAgICBvbk5vdFRvcDogZnVuY3Rpb24gb25Ob3RUb3AoKSB7fSxcbiAgICAgIC8vIOacgOS4i+mDqOOBq+OCueOCr+ODreODvOODq+OBl+OBn+aZguOBq+Wun+ihjFxuICAgICAgb25Cb3R0b206IGZ1bmN0aW9uIG9uQm90dG9tKCkge30sXG4gICAgICAvLyDmnIDkuIvpg6jjgYvjgonpm6LjgozjgZ/mmYLjgavlrp/ooYxcbiAgICAgIG9uTm90Qm90dG9tOiBmdW5jdGlvbiBvbk5vdEJvdHRvbSgpIHt9XG4gICAgfTsgLy8g5LiO44GI44KJ44KM44Gf6Kit5a6a44KS6YGp55SoXG5cbiAgICB0aGlzLm9wdCA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdGlvbnMpOyAvLyDnirbmhYvku5jkuI7jga7lr77osaFcblxuICAgI
20578HRoaXMudGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KTsgLy8g5LiA55Wq5LiK44Gr44K544Kv44Ot44O844Or44GX44GfXG5cbiAgICB0aGlzLmlzVG9wID0gZmFsc2U7IC8vIOS4gOeVquS4i+OBq+OCueOCr+ODreODvOODq+OBl+OBn1xuXG4gICAgdGhpcy5pc0JvdHRvbSA9IGZhbHNlOyAvLyDmnIDlvozjga7nirbmhYtcblxuICAgIHRoaXMubGFzdFN0YXRlID0gJyc7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG4gIC8qKlxuICAgKiDnm6PoppbnlKjjgqjjg6zjg6Hjg7Pjg4jkvZzmiJDjgZfjgabnm6Poppbplovlp4tcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoU3lnU2Nyb2xsQW1vdW50LCBbe1xuICAgIGtleTogXCJjcmVhdGVPYnNlcnZlRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVPYnNlcnZlRWxlbWVudChwb3NpdGlvbikge1xuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBDT01NT05fU1RZTEUpO1xuICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLm9wdC5vZmZzZXRUb3A7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1BPU0lUSU9OLCBwb3NpdGlvbik7XG5cbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IFwiMFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5ib3R0b20gPSBcIjBcIjtcbiAgICAgIH0gLy8g44Oa44O844K45pyA5LiL6YOo44Gr6L+95YqgXG5cblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vmpJznn6Xlh6bnkIbjgpLplovlp4tcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgLy8gPGJvZHk+IOOBqyBwb3NpdGlvbiDoqK3lrppcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7IC8vIEludGVyc2VjdGlvbk9ic2VydmVy44KS5L2c5oiQ44GX44Gm55uj6KaW6ZaL5aeLXG5cbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9ic2VydmVyQ2FsbGJhY2suYmluZCh0aGlzKSwgT0JTRVJWRVJfT1BUKTsgLy8g55uj6KaW55So44Ko44Os44Oh44Oz44OI5L2c5oiQXG5cbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5jcmVhdGVPYnNlcnZlRWxlbWVudChcInRvcFwiKSk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuY3JlYXRlT2JzZXJ2ZUVsZW1lbnQoXCJib3R0b21cIikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vlh6bnkIZcbiAgICAgKiBJbnRlcnNlY3Rpb25PYnNlcnZlciDjgavlj43lv5zjgZfjgZ8gPGRpdj4g44GMIHRvcC9ib3R0b20g44Gp44Gh44KJ44GL44Gn5Yik5a6a44GZ44KLXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvYnNlcnZlckNhbGxiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2Y
20578XIgcG9zaXRpb24gPSBlbnRyeS50YXJnZXQuZ2V0QXR0cmlidXRlKEFUVFJfUE9TSVRJT04pO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgIF90aGlzLmlzVG9wID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuaXNCb3R0b20gPSBlbnRyeS5pc0ludGVyc2VjdGluZztcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIOWxnuaAp+OCkuS7mOS4jlxuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDlsZ7mgKfjgpLku5jkuI5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEF0dHJpYnV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBbdGhpcy5pc1RvcCA/IEFUVFJfVE9QIDogQVRUUl9OT1RfVE9QLCB0aGlzLmlzQm90dG9tID8gQVRUUl9CT1RUT00gOiBBVFRSX05PVF9CT1RUT01dLmpvaW4oJyAnKTsgLy8g57WQ5p6c44KSIGRhdGHlsZ7mgKfjgavlj43mmKDjgZnjgotcbiAgICAgIC8vIOWJjeWbnuOBqOWQjOOBmOOBquOCieWPjeaYoOOBl+OBquOBhFxuXG4gICAgICBpZiAoc3RhdGUgIT09IHRoaXMubGFzdFN0YXRlKSB7XG4gICAgICAgIHRoaXMubGFzdFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMudGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgc3RhdGUpO1xuICAgICAgICB9KTsgLy8g44Kq44OX44K344On44Oz6Zai5pWw44KS5a6f6KGMXG5cbiAgICAgICAgaWYgKHRoaXMuaXNUb3AgJiYgdGhpcy5vcHQub25Ub3ApIHtcbiAgICAgICAgICB0aGlzLm9wdC5vblRvcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0Lm9uTm90VG9wKSB7XG4gICAgICAgICAgdGhpcy5vcHQub25Ob3RUb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQm90dG9tICYmIHRoaXMub3B0Lm9uQm90dG9tKSB7XG4gICAgICAgICAgdGhpcy5vcHQub25Cb3R0b20oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdC5vbk5vdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMub3B0Lm9uTm90Qm90dG9tKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3lnU2Nyb2xsQW1vdW50O1xufSgpO1xuXG5leHBvcnQgeyBTeWdTY3JvbGxBbW91bnQgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgeyBfY2xhc3NDYWxsQ2hlY2sgYXMgY2xhc3NDYWxsQ2hlY2ssIF9jcmVhdGVDbGFzcyBhcyBjcmVhdGVDbGFzcywgX2RlZmluZVByb3BlcnR5IGFzIGRlZmluZVByb3BlcnR5IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fcm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLmpzLm1hcFxuIiwiaW1wb3J0IHsgY3JlYXRlQ2xhc3MgYXMgX2NyZWF0ZUNsYXNzLCBjbGFzc0NhbGxDaGVjayBhcyBfY2xhc3NDYWxsQ2hlY2ssIGRlZmluZVByb3BlcnR5IGFzIF9kZWZpbmVQcm9wZXJ0eSB9IGZyb20gJy4vX3ZpcnR1YWwvX3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycy5qcyc7XG5cbi8qKlxuICogU2Nyb2xsIGluIHZpZXdwb3J0IGFkZCBkYXRhIGF0dHJpYnV0ZVxuICog44K544Kv44Ot44O844Or44GX44Gm44OT44Ol44O844Od44O844OI44Gr5YWl44Gj44Gf44KJZGF0YeWxnuaAp+OCkuS4juOBiOOCi1xuICpcbiAqIEBhdXRob3IgICBIaXJvc2hpIEZ1a3VkYSA8aW5mby5zeWduYXNAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG52YXIgQVRUUl9JTlZJRVcgPSAnZGF0YS1pbnZpZXcnO1xudmFyIEFUVFJfUk9PVCA9ICdkYXRhLWludmlldy1yb290JztcbnZhciBBVFRSX01BUkdJTiA9ICdkYXRhLWludmlldy1yb290TWFyZ2luJztcbnZhciBBVFRSX1RIUkVTSE9MRCA9ICdkYXRhLWludmlldy10aHJlc2hvbGQnO1xudmFyIERFRkFVTFQgPSB7XG4gIHJvb3Q6IG51bGwsXG4gIHJvb3RNYXJnaW46ICcwcHgnLFxuICB0aHJlc2hvbGQ6IDBcbn07XG4vKipcbiAqIGluIHZpZXcgY29udHJvbGxlclxuICovXG5cbnZhciBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICog44K/44O844Ky44OD44OI5LiA6Kan44KS57K+5p+744GX44Gm44CBIGRhdGEtaW52aWV3LXJvb3TjgIFkYXRhLWludmlldy1yb290TWFyZ2lu44CBZGF0YS1pbnZpZXctdGhyZXNob2xkIOOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOOBi+eiuuiqjeOBmeOCi+OAglxuICAgKiDkuIroqJjlsZ7mgKfmr47jgasgb2JzZXJ2ZXIg44KS5L2c5oiQ44GZ44KL44CCXG4gICAqL1xuICBmdW5jdGlvbiBfZGVmYXVsdCh0YXJnZXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgX2RlZmF1bHQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25JbnZpZXdGdW5jXCIsIHVuZGVmaW5lZCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0YXJnZXRMaXN0XCIsIHZvaWQgMCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvcHRcIiwgdm9pZCAwKTtcblxuICAgI
20578HRoaXMudGFyZ2V0TGlzdCA9IHt9O1xuICAgIHRoaXMub3B0ID0gT2JqZWN0LmFzc2lnbihERUZBVUxULCBvcHRpb24pO1xuICAgIHRoaXMub25JbnZpZXdGdW5jID0gdW5kZWZpbmVkO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIF90aGlzLmluaXRUYXJnZXRMaXN0KHRhcmdldCk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIOOCv+ODvOOCsuODg+ODiOOBqOOCquODl+OCt+ODp+ODs+OBrueuoeeQhuODquOCueODiOOCkuS9nOaIkFxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhfZGVmYXVsdCwgW3tcbiAgICBrZXk6IFwiaW5pdFRhcmdldExpc3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdFRhcmdldExpc3QodGFyZ2V0KSB7XG4gICAgICAvLyDnm6Poppblr77osaHjgqjjg6zjg6Hjg7Pjg4jjgavni6zoh6rmjIflrprjgYzjgYLjgozjgbDjgZ3jgaHjgonjgpLkvb/jgYbjgIJcbiAgICAgIC8vIOeEoeOBkeOCjOOBsOOCquODl+OCt+ODp+ODs+ioreWumuOCkuS9v+OBhlxuICAgICAgdmFyIHJvb3QgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKEFUVFJfUk9PVCkgfHwgdGhpcy5vcHQucm9vdDtcbiAgICAgIHZhciByb290TWFyZ2luID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShBVFRSX01BUkdJTikgfHwgdGhpcy5vcHQucm9vdE1hcmdpbjtcbiAgICAgIHZhciB0aHJlc2hvbGQgPSBOdW1iZXIodGFyZ2V0LmdldEF0dHJpYnV0ZShBVFRSX1RIUkVTSE9MRCkpIHx8IHRoaXMub3B0LnRocmVzaG9sZDtcbiAgICAgIHZhciBrZXkgPSBcIlwiLmNvbmNhdChyb290LCBcIi1cIikuY29uY2F0KHJvb3RNYXJnaW4sIFwiLVwiKS5jb25jYXQodGhyZXNob2xkKTtcblxuICAgICAgaWYgKGtleSBpbiB0aGlzLnRhcmdldExpc3QgPT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBvcHRpb24gPSB7XG4gICAgICAgICAgcm9vdDogcm9vdCxcbiAgICAgICAgICByb290TWFyZ2luOiByb290TWFyZ2luLFxuICAgICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkXG4gICAgICAgIH07XG4gICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9ic2VydmVyQ2FsbGJhY2suYmluZCh0aGlzKSwgb3B0aW9uKTtcbiAgICAgICAgdGhpcy50YXJnZXRMaXN0W2tleV0gPSB7XG4gICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgb2JzZXJ2ZXI6IG9ic2VydmVyXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGFyZ2V0TGlzdFtrZXldLmxpc3QucHVzaCh0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgrnjgq/jg63jg7zjg6vmpJznn6Xlh6bnkIbjgpLplovlp4tcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudGFyZ2V0TGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0YXJnZXRPYmogPSBfdGhpczIudGFyZ2V0TGlzdFtrZXldO1xuICAgICAgICB0YXJnZXRPYmoubGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXRPYmoub2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDnlLvpnaLjgavlhaXjgaPjgZ/jgokgQVRUUl9JTlZJRVcg44GuZGF0YeWxnuaAp+OBqyB0cnVlIOOCkuWFpeOCjOOCi+OAglxuICAgICAqIOOCquODluOCtuODvOODkOODvOOBi+OCieebo+imluino+mZpOOBleOCjOOCi+OAglxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2JzZXJ2ZXJDYWxsYmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvYnNlcnZlckNhbGxiYWNrKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICB2Y
20578XIgX3RoaXMzID0gdGhpcztcblxuICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSByZXR1cm47IC8vIGludmlld+OBl+OBn+aZguOBq+Wun+ihjOOBmeOCi+WklumDqOmWouaVsFxuXG4gICAgICAgIGlmIChfdGhpczMub25JbnZpZXdGdW5jKSB7XG4gICAgICAgICAgX3RoaXMzLm9uSW52aWV3RnVuYyhlbnRyeS50YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7XG4gICAgICAgIGVudHJ5LnRhcmdldC5zZXRBdHRyaWJ1dGUoQVRUUl9JTlZJRVcsICd0cnVlJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX2RlZmF1bHQ7XG59KCk7XG5cbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgb3BlbkJsb2NrLCBjcmVhdGVFbGVtZW50QmxvY2ssIG5vcm1hbGl6ZUNsYXNzLCBjcmVhdGVFbGVtZW50Vk5vZGUsIHVucmVmLCByZW5kZXJTbG90LCByZWYsIHdhdGNoLCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBjcmVhdGVCbG9jaywgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHdpdGhDdHgsIEZyYWdtZW50LCByZW5kZXJMaXN0LCBjcmVhdGVDb21tZW50Vk5vZGUgfSBmcm9tICd2dWUnO1xuXG5jb25zdCBfaG9pc3RlZF8xJDEgPSBbXCJ0YXJnZXRcIiwgXCJyZWxcIiwgXCJocmVmXCIsIFwiZGF0YS1hY3RpdmVcIl07XG5jb25zdCBfaG9pc3RlZF8yID0gW1widGFyZ2V0XCIsIFwicmVsXCIsIFwiaHJlZlwiLCBcImRhdGEtYWN0aXZlXCJdO1xuY29uc3QgX3NmY19tYWluJDIgPSAvKiBAX19QVVJFX18gKi8gZGVmaW5lQ29tcG9uZW50KHtcbiAgcHJvcHM6IHtcbiAgICBhY3RpdmVJZDogbnVsbCxcbiAgICBpZDogbnVsbCxcbiAgICBocmVmOiBudWxsLFxuICAgIGlzQmxhbms6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgIGNsYXNzSXRlbTogbnVsbCxcbiAgICBjbGFzc0xpbms6IG51bGwsXG4gICAgaXNMaXN0VGFnOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICBoYW5kbENsaWNrOiBudWxsXG4gIH0sXG4gIHNldHVwKF9fcHJvcHMpIHtcbiAgICBjb25zdCBwcm9wcyA9IF9fcHJvcHM7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaHJlZilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByb3BzLmFjdGl2ZUlkID09PSBwcm9wcy5pZClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgY29uc3QgY2xpY2tMaW5rID0gKGUpID0+IHtcbiAgICAgIGlmIChwcm9wcy5ocmVmKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHByb3BzLmhhbmRsQ2xpY2socHJvcHMuaWQpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5pc0xpc3RUYWcgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUVsZW1lbnRCbG9jayhcImxpXCIsIHtcbiAgICAgICAga2V5OiAwLFxuICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NJdGVtKVxuICAgICAgfSwgW1xuICAgICAgICBjcmVhdGVFbGVtZW50Vk5vZGUoXCJhXCIsIHtcbiAgICAgICAgICB0YXJnZXQ6IHByb3BzLmlzQmxhbmsgPyBcIl9ibGFua1wiIDogXCJcIixcbiAgICAgICAgICByZWw6IHByb3BzLmlzQmxhbmsgPyBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiA6IFwiXCIsXG4gICAgICAgICAgaHJlZjogcHJvcHMuaHJlZixcbiAgICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NMaW5rKSxcbiAgICAgICAgICBcImRhdGEtYWN0aXZlXCI6IHVucmVmKGlzQWN0aXZlKSA/IFwidHJ1ZVwiIDogXCJcIixcbiAgICAgICAgICBvbkNsaWNrOiBjbGlja0xpbmtcbiAgICAgICAgfSwgW1xuICAgICAgICAgIHJlbmRlclNsb3QoX2N0eC4kc2xvdHMsIFwiZGVmYXVsdFwiKVxuICAgICAgICBdLCAxMCwgX2hvaXN0ZWRfMSQxKVxuICAgICAgXSwgMikpIDogKG9wZW5CbG9jaygpLCBjcmVhdGVFbGVtZW50QmxvY2soXCJhXCIsIHtcbiAgICAgICAga2V5OiAxLFxuICAgICAgICB0YXJnZXQ6IHByb3BzLmlzQmxhbmsgPyBcIl9ibGFua1wiIDogXCJcIixcbiAgICAgICAgcmVsOiBwcm9wcy5pc0JsYW5rID8gXCJub29wZW5lciBub3JlZmVycmVyXCIgOiBcIlwiLFxuICAgICAgICBocmVmOiBwcm9wcy5ocmVmLFxuICAgICAgICBjbGFzczogbm9ybWFsaXplQ2xhc3MocHJvcHMuY2xhc3NMaW5rKSxcbiAgICAgICAgXCJkYXRhLWFjdGl2ZVwiOiB1bnJlZihpc0FjdGl2ZSkgPyBcInRydWVcIiA6IFwiXCIsXG4gICAgICAgIG9uQ2xpY2s6IGNsaWNrTGlua1xuICAgICAgfSwgW1xuICAgICAgICByZW5kZXJTbG90KF9jdHguJHNsb3RzLCBcImRlZmF1bHRcIilcbiAgICAgIF0sIDEwLCBfaG9pc3RlZF8yKSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IEVWX0NIQU5HRSA9IFwiY2hhbmdlXCI7XG5jb25zdCBFVl9DTElDSyA9IFwiY2xpY2tcIjtcbmNvbnN0IHRhYkdyb3VwcyA9IHJlZihbXSk7XG5jb25zdCAkX2dldEdyb3VwID0gKGdyb3VwSWQpID0+IHtcbiAgY29uc3QgZ3JvdXAgPSB0YWJHcm91cHMudmFsdWUuZmluZCgoZ3JvdXAyKSA9PiBncm91cDIuZ3JvdXBJZCA9PT0gZ3JvdXBJZCk7XG4gIGlmIChncm91cClcbiAgICByZXR1cm4gZ3JvdXA7XG4gIGNvbnN0IG5ld0dyb3VwID0ge1xuICAgIGdyb3VwSWQsXG4gICAgYWN0aXZlSWQ6IFwiXCIsXG4gICAgdGFiSWRMaXN0OiBbXSxcbiAgICBpbnRlcnZhbElkOiAwLFxuICAgIGV2ZW50czogbmV3IEV2ZW50VGFyZ2V0KClcbiAgfTtcbiAgdGFiR3JvdXBzLnZhbHVlLnB1c2gobmV3R3JvdXApO1xuICByZXR1cm4gdGFiR3JvdXBzLnZhbHVlLmZpbmQoKGdyb3VwMikgPT4gZ3JvdXAyLmdyb3VwSWQgPT09IGdyb3VwSWQpO1xufTtcbmZ1bmN0aW9uIHVzZVRhYkNvbnRyb2woZ3JvdXBJZCwgaXNNYXN0ZXIgPSBmYWxzZSwgdXNlSGFzaCA9IGZhbHNlKSB7XG4gIHJldHVybiAoKCkgPT4ge1xuICAgIGNvbnN0ICRfZ3JvdXAgPSAkX2dldEdyb3VwKGdyb3VwSWQpO1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuICRfZ3JvdXAuYWN0aXZlSWQ7XG4gICAgfSk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gJF9ncm91cC50YWJJZExpc3QuaW5kZXhPZigkX2dyb3VwLmFjdGl2ZUlkKTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRBY3RpdmVJZCA9IChhY3RpdmVJZD
20578IsIGlzVGFiQ2xpY2sgPSBmYWxzZSkgPT4ge1xuICAgICAgJF9ncm91cC5hY3RpdmVJZCA9IGFjdGl2ZUlkMjtcbiAgICAgIGlmIChpc1RhYkNsaWNrKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWX0NMSUNLLCB7IGRldGFpbDogYWN0aXZlSWQyIH0pO1xuICAgICAgICAkX2dyb3VwLmV2ZW50cy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNldFRhYklkTGlzdCA9IChpZExpc3QpID0+IHtcbiAgICAgICRfZ3JvdXAudGFiSWRMaXN0ID0gaWRMaXN0O1xuICAgIH07XG4gICAgY29uc3QgY2hhbmdlTmV4dFRhYiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IChhY3RpdmVJbmRleC52YWx1ZSArIDEpICUgJF9ncm91cC50YWJJZExpc3QubGVuZ3RoO1xuICAgICAgc2V0QWN0aXZlSWQoJF9ncm91cC50YWJJZExpc3RbbmV4dEluZGV4XSk7XG4gICAgfTtcbiAgICBjb25zdCBjaGFuZ2VQcmV2VGFiID0gKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBhY3RpdmVJbmRleC52YWx1ZSAtIDE7XG4gICAgICBjb25zdCBwcmV2SW5kZXggPSBpbmRleCA8PSAtMSA/ICRfZ3JvdXAudGFiSWRMaXN0Lmxlbmd0aCAtIDEgOiBpbmRleDtcbiAgICAgIHNldEFjdGl2ZUlkKCRfZ3JvdXAudGFiSWRMaXN0W3ByZXZJbmRleF0pO1xuICAgIH07XG4gICAgY29uc3QgYWRkQ2hhbmdlTGlzdGVuZXIgPSAoZnVuYykgPT4ge1xuICAgICAgJF9ncm91cC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcihFVl9DSEFOR0UsIGZ1bmMpO1xuICAgIH07XG4gICAgY29uc3QgYWRkQ2xpY2tMaXN0ZW5lciA9IChmdW5jKSA9PiB7XG4gICAgICAkX2dyb3VwLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKEVWX0NMSUNLLCBmdW5jKTtcbiAgICB9O1xuICAgIGNvbnN0IHN0YXJ0QXV0b0NoYW5nZSA9ICh0aW1lKSA9PiB7XG4gICAgICAkX2dyb3VwLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNoYW5nZU5leHRUYWIoKTtcbiAgICAgIH0sIHRpbWUpO1xuICAgIH07XG4gICAgY29uc3Qgc3RvcEF1dG9DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKCRfZ3JvdXAuaW50ZXJ2YWxJZCk7XG4gICAgfTtcbiAgICB3YXRjaChhY3RpdmVJZCwgKCkgPT4ge1xuICAgICAgaWYgKGlzTWFzdGVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEVWX0NIQU5HRSwgeyBkZXRhaWw6IGFjdGl2ZUlkLnZhbHVlIH0pO1xuICAgICAgICAkX2dyb3VwLmV2ZW50cy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VIYXNoICYmIGlzTWFzdGVyKSB7XG4gICAgICAgIGxvY2F0aW9uLmhhc2ggPSBhY3RpdmVJZC52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlSWQsXG4gICAgICBhY3RpdmVJbmRleCxcbiAgICAgIHNldEFjdGl2ZUlkLFxuICAgICAgc2V0VGFiSWRMaXN0LFxuICAgICAgY2hhbmdlTmV4dFRhYixcbiAgICAgIGNoYW5nZVByZXZUYWIsXG4gICAgICBzdGFydEF1dG9DaGFuZ2UsXG4gICAgICBzdG9wQXV0b0NoYW5nZSxcbiAgICAgIGFkZENoYW5nZUxpc3RlbmVyLFxuICAgICAgYWRkQ2xpY2tMaXN0ZW5lclxuICAgIH07XG4gIH0pKCk7XG59XG5cbmNvbnN0IF9ob2lzdGVkXzEgPSBbXCJpbm5lckhUTUxcIl07XG5jb25zdCBfc2ZjX21haW4kMSA9IC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIGRlZmF1bHQ6IHsgZGVmYXVsdDogXCJcIiB9LFxuICAgIGl0ZW1zOiBudWxsLFxuICAgIHVzZUhhc2g6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpc0xpc3RUYWc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvOiBudWxsLFxuICAgIGlzU3RvcEF1dG86IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgIGNsYXNzVGFiczogeyBkZWZhdWx0OiBcImMtdGFibWVudVwiIH0sXG4gICAgY2xhc3NJdGVtOiB7IGRlZmF1bHQ6IFwiYy10YWJtZW51X19pdGVtXCIgfSxcbiAgICBjbGFzc0xpbms6IHsgZGVmYXVsdDogXCJjLXRhYm1lbnVfX2xpbmtcIiB9XG4gIH0sXG4gIHNldHVwKF9fcHJvcHMpIHtcbiAgICBjb25zdCBwcm9wcyA9IF9fcHJvcHM7XG4gICAgY29uc3QgdGFiQ29udHJvbCA9IHVzZVRhYkNvbnRyb2wocHJvcHMuZ3JvdXAsIHRydWUsIHByb3BzLnVzZUhhc2gpO1xuICAgIGNvbnN0IGl0ZW1DbGlja2VkID0gKGlkKSA9PiB7XG4gICAgICBpZiAoaWQgPT09IHRhYkNvbnRyb2wuYWN0aXZlSWQudmFsdWUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRhYkNvbnRyb2wuc2V0QWN0aXZlSWQoaWQsIHRydWUpO1xuICAgICAgaWYgKHByb3BzLmlzU3RvcEF1dG8pIHtcbiAgICAgICAgdGFiQ29udHJvbC5zdG9wQXV0b0NoYW5nZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkTGlzdCA9IHByb3BzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pZCkubWFwKChpdGVtKSA9PiBpdGVtLmlkKTtcbiAgICAgIHRhYkNvbnRyb2wuc2V0VGFiSWRMaXN0KGlkTGlzdCk7XG4gICAgICBpZiAocHJvcHMudXNlSGFzaCAmJiBsb2NhdGlvbi5oYXNoKSB7XG4gICAgICAgIHRhYkNvbnRyb2wuc2V0QWN0aXZlSWQobG9jYXRpb24uaGFzaC5zdWJzdHIoMSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiQ29udHJvbC5zZXRBY3RpdmVJZChwcm9wcy5kZWZhdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5hdXRvICYmIHByb3BzLmF1dG8gPj0gMSkge1xuICAgICAgICB0YWJDb250cm9sLnN0YXJ0QXV0b0NoYW5nZShwcm9wcy5hdXRvKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgICB0YWJDb250cm9sLnN0b3BBdXRvQ2hhbmdlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2socmVzb2x2ZUR5bmFtaWNDb21wb25lbnQocHJvcHMuaXNMaXN0VGFnID8gXCJ1bFwiIDogXCJkaXZcIiksIHtcbiAgICAgICAgY2xhc3M6IG5vcm1hbGl6ZUNsYXNzKHByb3BzLmNsYXNzVGFicylcbiAgICAgIH0sIHtcbiAgICAgICAgZGVmYXVsdDogd2l0aEN0eCgoKSA9PiBbXG4gICAgICAgICAgKG9wZW5CbG9jayh0cnVlKSwgY3JlYXRlRWxlbWVudEJsb2NrKEZyYWdtZW50LCBudWxsLCByZW5kZXJMaXN0KHByb3BzLml0ZW1zLCAoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgI
20578HJldHVybiBvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soX3NmY19tYWluJDIsIHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgICAgIFwiYWN0aXZlLWlkXCI6IHVucmVmKHRhYkNvbnRyb2wpLmFjdGl2ZUlkLnZhbHVlLFxuICAgICAgICAgICAgICBocmVmOiBpdGVtLmhyZWYgfHwgXCJcIixcbiAgICAgICAgICAgICAgXCJpcy1ibGFua1wiOiBpdGVtLmlzQmxhbmsgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIFwiY2xhc3MtaXRlbVwiOiBwcm9wcy5jbGFzc0l0ZW0sXG4gICAgICAgICAgICAgIFwiY2xhc3MtbGlua1wiOiBwcm9wcy5jbGFzc0xpbmssXG4gICAgICAgICAgICAgIFwiaXMtbGlzdC10YWdcIjogcHJvcHMuaXNMaXN0VGFnLFxuICAgICAgICAgICAgICBcImhhbmRsLWNsaWNrXCI6IGl0ZW1DbGlja2VkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHdpdGhDdHgoKCkgPT4gW1xuICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnRWTm9kZShcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBpdGVtLnZhbHVlXG4gICAgICAgICAgICAgICAgfSwgbnVsbCwgOCwgX2hvaXN0ZWRfMSlcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgIF86IDJcbiAgICAgICAgICAgIH0sIDEwMzIsIFtcImlkXCIsIFwiYWN0aXZlLWlkXCIsIFwiaHJlZlwiLCBcImlzLWJsYW5rXCIsIFwiY2xhc3MtaXRlbVwiLCBcImNsYXNzLWxpbmtcIiwgXCJpcy1saXN0LXRhZ1wiXSk7XG4gICAgICAgICAgfSksIDEyOCkpXG4gICAgICAgIF0pLFxuICAgICAgICBfOiAxXG4gICAgICB9LCA4LCBbXCJjbGFzc1wiXSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IF9zZmNfbWFpbiA9IC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBwcm9wczoge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHRhYklkOiBudWxsLFxuICAgIHRhZzogeyBkZWZhdWx0OiBcImRpdlwiIH1cbiAgfSxcbiAgc2V0dXAoX19wcm9wcykge1xuICAgIGNvbnN0IHByb3BzID0gX19wcm9wcztcbiAgICBjb25zdCB0YWJDb250cm9sID0gdXNlVGFiQ29udHJvbChwcm9wcy5ncm91cCk7XG4gICAgcmV0dXJuIChfY3R4LCBfY2FjaGUpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy50YWJJZCA9PT0gdW5yZWYodGFiQ29udHJvbCkuYWN0aXZlSWQudmFsdWUgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHByb3BzLnRhZyksIHsga2V5OiAwIH0sIHtcbiAgICAgICAgZGVmYXVsdDogd2l0aEN0eCgoKSA9PiBbXG4gICAgICAgICAgcmVuZGVyU2xvdChfY3R4LiRzbG90cywgXCJkZWZhdWx0XCIpXG4gICAgICAgIF0pLFxuICAgICAgICBfOiAzXG4gICAgICB9KSkgOiBjcmVhdGVDb21tZW50Vk5vZGUoXCJcIiwgdHJ1ZSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IF9zZmNfbWFpbiQxIGFzIFZ1ZVRhYnMsIF9zZmNfbWFpbiBhcyBWdWVUYWJzQ29udGVudCwgdXNlVGFiQ29udHJvbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dnVlLXRhYnMuZXMuanMubWFwXG4iLCIvKipcbiogQHZ1ZS9jb21waWxlci1jb3JlIHYzLjQuMzRcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IGlzU3RyaW5nLCBOT09QLCBpc09iamVjdCwgTk8sIGV4dGVuZCwgaXNTeW1ib2wsIGlzQXJyYXksIGNhcGl0YWxpemUsIGNhbWVsaXplLCBFTVBUWV9PQkosIFBhdGNoRmxhZ05hbWVzLCBzbG90RmxhZ3NUZXh0LCBpc09uLCBpc0J1aWx0SW5EaXJlY3RpdmUsIGlzUmVzZXJ2ZWRQcm9wLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBnZW5lcmF0ZUNvZGVGcmFtZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3QgRlJBR01FTlQgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBGcmFnbWVudGAgOiBgYCk7XG5jb25zdCBURUxFUE9SVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYFRlbGVwb3J0YCA6IGBgKTtcbmNvbnN0IFNVU1BFTlNFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgU3VzcGVuc2VgIDogYGApO1xuY29uc3QgS0VFUF9BTElWRSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYEtlZXBBbGl2ZWAgOiBgYCk7XG5jb25zdCBCQVNFX1RSQU5TSVRJT04gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBCYXNlVHJhbnNpdGlvbmAgOiBgYCk7XG5jb25zdCBPUEVOX0JMT0NLID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgb3BlbkJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9CTE9DSyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNyZWF0ZUJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9FTEVNRU5UX0JMT0NLID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlRWxlbWVudEJsb2NrYCA6IGBgKTtcbmNvbnN0IENSRUFURV9WTk9ERSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNyZWF0ZVZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9FTEVNRU5UX1ZOT0RFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlRWxlbWVudFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9DT01NRU5UID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlQ29tbWVudFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY3JlYXRlVGV4dFZOb2RlYCA6IGBgKTtcbmNvbnN0IENSRUFURV9TVEFUSUMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBjcmVhdGVTdGF0aWNWTm9kZWAgOiBgYCk7XG5jb25zdCBSRVNPTFZFX0NPTVBPTkVOVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpID8gYHJlc29sdmVDb21wb25lbnRgIDogYGApO1xuY29uc3QgUkVTT0xWRV9EWU5BTUlDX0NPTVBPTkVOVCA9IFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGByZXNvbHZlRHluYW1pY0NvbXBvbmVudGAgOiBgYFxuKTtcbmNvbnN0IFJFU09MVkVfRElSRUNUSVZFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcmVzb2x2ZURpcmVjdGl2ZWAgOiBgYCk7XG5jb25zdCBSRVNPTFZFX0ZJTFRFUiA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHJlc29sdmVGaWx0ZXJgIDogYGApO1xuY29uc3QgV0lUSF9ESVJFQ1RJVkVTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgd2l0aERpcmVjdGl2ZXNgIDogYGApO1xuY29uc3QgUkVOREVSX0xJU1QgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGByZW5kZXJMaXN0YCA6IGBgKTtcbmNvbnN0IFJFTkRFUl9TTE9UID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcmVuZGVyU2xvdGAgOiBgYCk7XG5jb25zdCBDUkVBVEVfU0xPVFMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBjcmVhdGVTbG90c2AgOiBgYCk7XG5jb25zdCBUT19ESVNQTEFZX1NUUklORyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHRvRGlzcGxheVN0cmluZ2AgOiBgYCk7XG5jb25zdCBNRVJHRV9QUk9QUyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYG1lcmdlUHJvcHNgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX0NMQVNTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplQ2xhc3NgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX1NUWUxFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplU3R5bGVgIDogYGApO1xuY29uc3QgTk9STUFMSVpFX1BST1BTID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgbm9ybWFsaXplUHJvcHNgIDogYGApO1xuY29uc3QgR1VBUkRfUkVBQ1RJVkVfUFJPUFMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBndWFyZFJlYWN0aXZlUHJvcHNgIDogYGApO1xuY29uc3QgVE9fSEFORExFUlMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB0b0hhbmRsZXJzYCA6IGBgKTtcbmNvbnN0IENBTUVMSVpFID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgY2FtZWxpemVgIDogYGApO1xuY29uc3QgQ0FQSVRBTElaRSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYGNhcGl0YWxpemVgIDogYGApO1xuY29uc3QgVE9fSEFORExFUl9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB0b0hhbmRsZXJLZXlgIDogYGApO1xuY29uc3QgU0VUX0JMT0NLX1RSQUNLSU5HID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgc2V0QmxvY2tUcmFja2luZ2AgOiBgYCk7XG5jb25zdCBQVVNIX1NDT1BFX0lEID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcHVzaFNjb3BlSWRgIDogYGApO1xuY29uc3QgUE9QX1NDT1BFX0lEID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgcG9wU2NvcGVJZGAgOiBgYCk7XG5jb25zdCBXSVRIX0NUWCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHdpdGhDdHhgIDogYGApO1xuY29uc3QgVU5SRUYgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB1bnJlZmAgOiBgYCk7XG5jb25zdCBJU19SRUYgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBpc1JlZmAgOiBgYCk7XG5jb25zdCBXSVRIX01FTU8gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB3aXRoTWVtb2AgOiBgYCk7XG5jb25zdCBJU19NRU1PX1NBTUUgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGBpc01lbW9TYW1lYCA6IGBgKTtcbmNvbnN0IGhlbHBlck5hbWVNYXAgPSB7XG4gIFtGUkFHTUVOVF06IGBGcmFnbWVudGAsXG4gIFtURUxFUE9SVF06IGBUZWxlcG9ydGAsXG4gIFtTVVNQRU5TRV06IGBTdXNwZW5zZWAsXG4gIFtLRUVQX0FMSVZFXTogYEtlZXBBbGl2ZWAsXG4gIFtCQVNFX1RSQU5TSVRJT05dOiBgQmFzZVRyYW5zaXRpb25gLFxuICBbT1BFTl9CTE9DS106IGBvcGVuQmxvY2tgLFxuICBbQ1JFQVRFX0JMT0NLXTogYGNyZWF0ZUJsb2NrYCxcbiAgW0NSRUFURV9FTEVNRU5UX0JMT0NLXTogYGNyZWF0ZUVsZW1lbnRCbG9ja2AsXG4gIFtDUkVBVEVfVk5PREVdOiBgY3JlYXRlVk5vZGVgLFxuICBbQ1JFQVRFX0VMRU1FTlRfVk5PREVdOiBgY3JlYXRlRWxlbWVudFZOb2RlYCxcbiAgW0NSRUFURV9DT01NRU5UXTogYGNyZWF0ZUNvbW1lbnRWTm9kZWAsXG4gIFtDUkVBVEVfVEVYVF06IGBjcmVhdGVUZXh0Vk5vZGVgLFxuICBbQ1JFQVRFX1NUQVRJQ106IGBjcmVhdGVTdGF0aWNWTm9kZWAsXG4gIFtSRVNPTFZFX0NPTVBPTkVOVF06IGByZXNvbHZlQ29tcG9uZW50YCxcbiAgW1JFU09MVkVfRFlOQU1JQ19DT01QT05FTlRdOiBgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnRgLFxuICBbUkVTT0xWRV9ESVJFQ1RJVkVdOi
20578BgcmVzb2x2ZURpcmVjdGl2ZWAsXG4gIFtSRVNPTFZFX0ZJTFRFUl06IGByZXNvbHZlRmlsdGVyYCxcbiAgW1dJVEhfRElSRUNUSVZFU106IGB3aXRoRGlyZWN0aXZlc2AsXG4gIFtSRU5ERVJfTElTVF06IGByZW5kZXJMaXN0YCxcbiAgW1JFTkRFUl9TTE9UXTogYHJlbmRlclNsb3RgLFxuICBbQ1JFQVRFX1NMT1RTXTogYGNyZWF0ZVNsb3RzYCxcbiAgW1RPX0RJU1BMQVlfU1RSSU5HXTogYHRvRGlzcGxheVN0cmluZ2AsXG4gIFtNRVJHRV9QUk9QU106IGBtZXJnZVByb3BzYCxcbiAgW05PUk1BTElaRV9DTEFTU106IGBub3JtYWxpemVDbGFzc2AsXG4gIFtOT1JNQUxJWkVfU1RZTEVdOiBgbm9ybWFsaXplU3R5bGVgLFxuICBbTk9STUFMSVpFX1BST1BTXTogYG5vcm1hbGl6ZVByb3BzYCxcbiAgW0dVQVJEX1JFQUNUSVZFX1BST1BTXTogYGd1YXJkUmVhY3RpdmVQcm9wc2AsXG4gIFtUT19IQU5ETEVSU106IGB0b0hhbmRsZXJzYCxcbiAgW0NBTUVMSVpFXTogYGNhbWVsaXplYCxcbiAgW0NBUElUQUxJWkVdOiBgY2FwaXRhbGl6ZWAsXG4gIFtUT19IQU5ETEVSX0tFWV06IGB0b0hhbmRsZXJLZXlgLFxuICBbU0VUX0JMT0NLX1RSQUNLSU5HXTogYHNldEJsb2NrVHJhY2tpbmdgLFxuICBbUFVTSF9TQ09QRV9JRF06IGBwdXNoU2NvcGVJZGAsXG4gIFtQT1BfU0NPUEVfSURdOiBgcG9wU2NvcGVJZGAsXG4gIFtXSVRIX0NUWF06IGB3aXRoQ3R4YCxcbiAgW1VOUkVGXTogYHVucmVmYCxcbiAgW0lTX1JFRl06IGBpc1JlZmAsXG4gIFtXSVRIX01FTU9dOiBgd2l0aE1lbW9gLFxuICBbSVNfTUVNT19TQU1FXTogYGlzTWVtb1NhbWVgXG59O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lSGVscGVycyhoZWxwZXJzKSB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaGVscGVycykuZm9yRWFjaCgocykgPT4ge1xuICAgIGhlbHBlck5hbWVNYXBbc10gPSBoZWxwZXJzW3NdO1xuICB9KTtcbn1cblxuY29uc3QgTmFtZXNwYWNlcyA9IHtcbiAgXCJIVE1MXCI6IDAsXG4gIFwiMFwiOiBcIkhUTUxcIixcbiAgXCJTVkdcIjogMSxcbiAgXCIxXCI6IFwiU1ZHXCIsXG4gIFwiTUFUSF9NTFwiOiAyLFxuICBcIjJcIjogXCJNQVRIX01MXCJcbn07XG5jb25zdCBOb2RlVHlwZXMgPSB7XG4gIFwiUk9PVFwiOiAwLFxuICBcIjBcIjogXCJST09UXCIsXG4gIFwiRUxFTUVOVFwiOiAxLFxuICBcIjFcIjogXCJFTEVNRU5UXCIsXG4gIFwiVEVYVFwiOiAyLFxuICBcIjJcIjogXCJURVhUXCIsXG4gIFwiQ09NTUVOVFwiOiAzLFxuICBcIjNcIjogXCJDT01NRU5UXCIsXG4gIFwiU0lNUExFX0VYUFJFU1NJT05cIjogNCxcbiAgXCI0XCI6IFwiU0lNUExFX0VYUFJFU1NJT05cIixcbiAgXCJJTlRFUlBPTEFUSU9OXCI6IDUsXG4gIFwiNVwiOiBcIklOVEVSUE9MQVRJT05cIixcbiAgXCJBVFRSSUJVVEVcIjogNixcbiAgXCI2XCI6IFwiQVRUUklCVVRFXCIsXG4gIFwiRElSRUNUSVZFXCI6IDcsXG4gIFwiN1wiOiBcIkRJUkVDVElWRVwiLFxuICBcIkNPTVBPVU5EX0VYUFJFU1NJT05cIjogOCxcbiAgXCI4XCI6IFwiQ09NUE9VTkRfRVhQUkVTU0lPTlwiLFxuICBcIklGXCI6IDksXG4gIFwiOVwiOiBcIklGXCIsXG4gIFwiSUZfQlJBTkNIXCI6IDEwLFxuICBcIjEwXCI6IFwiSUZfQlJBTkNIXCIsXG4gIFwiRk9SXCI6IDExLFxuICBcIjExXCI6IFwiRk9SXCIsXG4gIFwiVEVYVF9DQUxMXCI6IDEyLFxuICBcIjEyXCI6IFwiVEVYVF9DQUxMXCIsXG4gIFwiVk5PREVfQ0FMTFwiOiAxMyxcbiAgXCIxM1wiOiBcIlZOT0RFX0NBTExcIixcbiAgXCJKU19DQUxMX0VYUFJFU1NJT05cIjogMTQsXG4gIFwiMTRcIjogXCJKU19DQUxMX0VYUFJFU1NJT05cIixcbiAgXCJKU19PQkpFQ1RfRVhQUkVTU0lPTlwiOiAxNSxcbiAgXCIxNVwiOiBcIkpTX09CSkVDVF9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfUFJPUEVSVFlcIjogMTYsXG4gIFwiMTZcIjogXCJKU19QUk9QRVJUWVwiLFxuICBcIkpTX0FSUkFZX0VYUFJFU1NJT05cIjogMTcsXG4gIFwiMTdcIjogXCJKU19BUlJBWV9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfRlVOQ1RJT05fRVhQUkVTU0lPTlwiOiAxOCxcbiAgXCIxOFwiOiBcIkpTX0ZVTkNUSU9OX0VYUFJFU1NJT05cIixcbiAgXCJKU19DT05ESVRJT05BTF9FWFBSRVNTSU9OXCI6IDE5LFxuICBcIjE5XCI6IFwiSlNfQ09ORElUSU9OQUxfRVhQUkVTU0lPTlwiLFxuICBcIkpTX0NBQ0hFX0VYUFJFU1NJT05cIjogMjAsXG4gIFwiMjBcIjogXCJKU19DQUNIRV9FWFBSRVNTSU9OXCIsXG4gIFwiSlNfQkxPQ0tfU1RBVEVNRU5UXCI6IDIxLFxuICBcIjIxXCI6IFwiSlNfQkxPQ0tfU1RBVEVNRU5UXCIsXG4gIFwiSlNfVEVNUExBVEVfTElURVJBTFwiOiAyMixcbiAgXCIyMlwiOiBcIkpTX1RFTVBMQVRFX0xJVEVSQUxcIixcbiAgXCJKU19JRl9TVEFURU1FTlRcIjogMjMsXG4gIFwiMjNcIjogXCJKU19JRl9TVEFURU1FTlRcIixcbiAgXCJKU19BU1NJR05NRU5UX0VYUFJFU1NJT05cIjogMjQsXG4gIFwiMjRcIjogXCJKU19BU1NJR05NRU5UX0VYUFJFU1NJT05cIixcbiAgXCJKU19TRVFVRU5DRV9FWFBSRVNTSU9OXCI6IDI1LFxuICBcIjI1XCI6IFwiSlNfU0VRVUVOQ0VfRVhQUkVTU0lPTlwiLFxuICBcIkpTX1JFVFVSTl9TVEFURU1FTlRcIjogMjYsXG4gIFwiMjZcIjogXCJKU19SRVRVUk5fU1RBVEVNRU5UXCJcbn07XG5jb25zdCBFbGVtZW50VHlwZXMgPSB7XG4gIFwiRUxFTUVOVFwiOiAwLFxuICBcIjBcIjogXCJFTEVNRU5UXCIsXG4gIFwiQ09NUE9ORU5UXCI6IDEsXG4gIFwiMVwiOiBcIkNPTVBPTkVOVFwiLFxuICBcIlNMT1RcIjogMixcbiAgXCIyXCI6IFwiU0xPVFwiLFxuICBcIlRFTVBMQVRFXCI6IDMsXG4gIFwiM1wiOiBcIlRFTVBMQVRFXCJcbn07XG5jb25zdCBDb25zdGFudFR5cGVzID0ge1xuICBcIk5PVF9DT05TVEFOVFwiOiAwLFxuICBcIjBcIjogXCJOT1RfQ09OU1RBTlRcIixcbiAgXCJDQU5fU0tJUF9QQVRDSFwiOiAxLFxuICBcIjFcIjogXCJDQU5fU0tJUF9QQVRDSFwiLFxuICBcIkNBTl9IT0lTVFwiOiAyLFxuICBcIjJcIjogXCJDQU5fSE9JU1RcIixcbiAgXCJDQU5fU1RSSU5HSUZZXCI6IDMsXG4gIFwiM1wiOiBcIkNBTl9TVFJJTkdJRllcIlxufTtcbmNvbnN0IGxvY1N0dWIgPSB7XG4gIHN0YXJ0Oi
20578B7IGxpbmU6IDEsIGNvbHVtbjogMSwgb2Zmc2V0OiAwIH0sXG4gIGVuZDogeyBsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMCB9LFxuICBzb3VyY2U6IFwiXCJcbn07XG5mdW5jdGlvbiBjcmVhdGVSb290KGNoaWxkcmVuLCBzb3VyY2UgPSBcIlwiKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMCxcbiAgICBzb3VyY2UsXG4gICAgY2hpbGRyZW4sXG4gICAgaGVscGVyczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICBob2lzdHM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGNhY2hlZDogMCxcbiAgICB0ZW1wczogMCxcbiAgICBjb2RlZ2VuTm9kZTogdm9pZCAwLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVk5vZGVDYWxsKGNvbnRleHQsIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgZGlyZWN0aXZlcywgaXNCbG9jayA9IGZhbHNlLCBkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSwgaXNDb21wb25lbnQgPSBmYWxzZSwgbG9jID0gbG9jU3R1Yikge1xuICBpZiAoY29udGV4dCkge1xuICAgIGlmIChpc0Jsb2NrKSB7XG4gICAgICBjb250ZXh0LmhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgIGNvbnRleHQuaGVscGVyKGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgaXNDb21wb25lbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5oZWxwZXIoZ2V0Vk5vZGVIZWxwZXIoY29udGV4dC5pblNTUiwgaXNDb21wb25lbnQpKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGl2ZXMpIHtcbiAgICAgIGNvbnRleHQuaGVscGVyKFdJVEhfRElSRUNUSVZFUyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTMsXG4gICAgdGFnLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgZGlyZWN0aXZlcyxcbiAgICBpc0Jsb2NrLFxuICAgIGRpc2FibGVUcmFja2luZyxcbiAgICBpc0NvbXBvbmVudCxcbiAgICBsb2NcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihlbGVtZW50cywgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE3LFxuICAgIGxvYyxcbiAgICBlbGVtZW50c1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzLCBsb2MgPSBsb2NTdHViKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTUsXG4gICAgbG9jLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFByb3BlcnR5KGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAxNixcbiAgICBsb2M6IGxvY1N0dWIsXG4gICAga2V5OiBpc1N0cmluZyhrZXkpID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihrZXksIHRydWUpIDoga2V5LFxuICAgIHZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGlzU3RhdGljID0gZmFsc2UsIGxvYyA9IGxvY1N0dWIsIGNvbnN0VHlwZSA9IDApIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiA0LFxuICAgIGxvYyxcbiAgICBjb250ZW50LFxuICAgIGlzU3RhdGljLFxuICAgIGNvbnN0VHlwZTogaXNTdGF0aWMgPyAzIDogY29uc3RUeXBlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbnRlcnBvbGF0aW9uKGNvbnRlbnQsIGxvYykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDUsXG4gICAgbG9jLFxuICAgIGNvbnRlbnQ6IGlzU3RyaW5nKGNvbnRlbnQpID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihjb250ZW50LCBmYWxzZSwgbG9jKSA6IGNvbnRlbnRcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihjaGlsZHJlbiwgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDgsXG4gICAgbG9jLFxuICAgIGNoaWxkcmVuXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MgPSBbXSwgbG9jID0gbG9jU3R1Yikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE0LFxuICAgIGxvYyxcbiAgICBjYWxsZWUsXG4gICAgYXJndW1lbnRzOiBhcmdzXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24ocGFyYW1zLCByZXR1cm5zID0gdm9pZCAwLCBuZXdsaW5lID0gZmFsc2UsIGlzU2xvdCA9IGZhbHNlLCBsb2MgPSBsb2NTdHViKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMTgsXG4gICAgcGFyYW1zLFxuICAgIHJldHVybnMsXG4gICAgbmV3bGluZSxcbiAgICBpc1Nsb3QsXG4gICAgbG9jXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24odGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlLCBuZXdsaW5lID0gdHJ1ZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDE5LFxuICAgIHRlc3QsXG4gICAgY29uc2VxdWVudCxcbiAgICBhbHRlcm5hdGUsXG4gICAgbmV3bGluZSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlRXhwcmVzc2lvbihpbmRleCwgdmFsdWUsIGlzVk9uY2UgPSBmYWxzZSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDIwLFxuICAgIGluZGV4LFxuICAgIHZhbHVlLFxuICAgIGlzVk9uY2UsXG4gICAgbG9jOiBsb2NTdHViXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVCbG9ja1N0YXRlbWVudChib2R5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMjEsXG4gICAgYm9keSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlTGl0ZXJhbChlbGVtZW50cykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDIyLFxuICAgIGVsZW1lbnRzLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogMjMsXG4gICAgdGVzdCxcbiAgICBjb25zZXF1ZW50LFxuICAgIGFsdGVybmF0ZSxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybi
20578B7XG4gICAgdHlwZTogMjQsXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICBsb2M6IGxvY1N0dWJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9ucykge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDI1LFxuICAgIGV4cHJlc3Npb25zLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUmV0dXJuU3RhdGVtZW50KHJldHVybnMpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAyNixcbiAgICByZXR1cm5zLFxuICAgIGxvYzogbG9jU3R1YlxuICB9O1xufVxuZnVuY3Rpb24gZ2V0Vk5vZGVIZWxwZXIoc3NyLCBpc0NvbXBvbmVudCkge1xuICByZXR1cm4gc3NyIHx8IGlzQ29tcG9uZW50ID8gQ1JFQVRFX1ZOT0RFIDogQ1JFQVRFX0VMRU1FTlRfVk5PREU7XG59XG5mdW5jdGlvbiBnZXRWTm9kZUJsb2NrSGVscGVyKHNzciwgaXNDb21wb25lbnQpIHtcbiAgcmV0dXJuIHNzciB8fCBpc0NvbXBvbmVudCA/IENSRUFURV9CTE9DSyA6IENSRUFURV9FTEVNRU5UX0JMT0NLO1xufVxuZnVuY3Rpb24gY29udmVydFRvQmxvY2sobm9kZSwgeyBoZWxwZXIsIHJlbW92ZUhlbHBlciwgaW5TU1IgfSkge1xuICBpZiAoIW5vZGUuaXNCbG9jaykge1xuICAgIG5vZGUuaXNCbG9jayA9IHRydWU7XG4gICAgcmVtb3ZlSGVscGVyKGdldFZOb2RlSGVscGVyKGluU1NSLCBub2RlLmlzQ29tcG9uZW50KSk7XG4gICAgaGVscGVyKE9QRU5fQkxPQ0spO1xuICAgIGhlbHBlcihnZXRWTm9kZUJsb2NrSGVscGVyKGluU1NSLCBub2RlLmlzQ29tcG9uZW50KSk7XG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdERlbGltaXRlcnNPcGVuID0gbmV3IFVpbnQ4QXJyYXkoWzEyMywgMTIzXSk7XG5jb25zdCBkZWZhdWx0RGVsaW1pdGVyc0Nsb3NlID0gbmV3IFVpbnQ4QXJyYXkoWzEyNSwgMTI1XSk7XG5mdW5jdGlvbiBpc1RhZ1N0YXJ0Q2hhcihjKSB7XG4gIHJldHVybiBjID49IDk3ICYmIGMgPD0gMTIyIHx8IGMgPj0gNjUgJiYgYyA8PSA5MDtcbn1cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjKSB7XG4gIHJldHVybiBjID09PSAzMiB8fCBjID09PSAxMCB8fCBjID09PSA5IHx8IGMgPT09IDEyIHx8IGMgPT09IDEzO1xufVxuZnVuY3Rpb24gaXNFbmRPZlRhZ1NlY3Rpb24oYykge1xuICByZXR1cm4gYyA9PT0gNDcgfHwgYyA9PT0gNjIgfHwgaXNXaGl0ZXNwYWNlKGMpO1xufVxuZnVuY3Rpb24gdG9DaGFyQ29kZXMoc3RyKSB7XG4gIGNvbnN0IHJldCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHJldFtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jb25zdCBTZXF1ZW5jZXMgPSB7XG4gIENkYXRhOiBuZXcgVWludDhBcnJheShbNjcsIDY4LCA2NSwgODQsIDY1LCA5MV0pLFxuICAvLyBDREFUQVtcbiAgQ2RhdGFFbmQ6IG5ldyBVaW50OEFycmF5KFs5MywgOTMsIDYyXSksXG4gIC8vIF1dPlxuICBDb21tZW50RW5kOiBuZXcgVWludDhBcnJheShbNDUsIDQ1LCA2Ml0pLFxuICAvLyBgLS0+YFxuICBTY3JpcHRFbmQ6IG5ldyBVaW50OEFycmF5KFs2MCwgNDcsIDExNSwgOTksIDExNCwgMTA1LCAxMTIsIDExNl0pLFxuICAvLyBgPFxcL3NjcmlwdGBcbiAgU3R5bGVFbmQ6IG5ldyBVaW50OEFycmF5KFs2MCwgNDcsIDExNSwgMTE2LCAxMjEsIDEwOCwgMTAxXSksXG4gIC8vIGA8L3N0eWxlYFxuICBUaXRsZUVuZDogbmV3IFVpbnQ4QXJyYXkoWzYwLCA0NywgMTE2LCAxMDUsIDExNiwgMTA4LCAxMDFdKSxcbiAgLy8gYDwvdGl0bGVgXG4gIFRleHRhcmVhRW5kOiBuZXcgVWludDhBcnJheShbXG4gICAgNjAsXG4gICAgNDcsXG4gICAgMTE2LFxuICAgIDEwMSxcbiAgICAxMjAsXG4gICAgMTE2LFxuICAgIDk3LFxuICAgIDExNCxcbiAgICAxMDEsXG4gICAgOTdcbiAgXSlcbiAgLy8gYDwvdGV4dGFyZWFcbn07XG5jbGFzcyBUb2tlbml6ZXIge1xuICBjb25zdHJ1Y3RvcihzdGFjaywgY2JzKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuY2JzID0gY2JzO1xuICAgIC8qKiBUaGUgY3VycmVudCBzdGF0ZSB0aGUgdG9rZW5pemVyIGlzIGluLiAqL1xuICAgIHRoaXMuc3RhdGUgPSAxO1xuICAgIC8qKiBUaGUgcmVhZCBidWZmZXIuICovXG4gICAgdGhpcy5idWZmZXIgPSBcIlwiO1xuICAgIC8qKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHJlYWQuICovXG4gICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAwO1xuICAgIC8qKiBUaGUgaW5kZXggd2l0aGluIHRoZSBidWZmZXIgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGxvb2tpbmcgYXQuICovXG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgLyoqIFRoZSBzdGFydCBvZiB0aGUgbGFzdCBlbnRpdHkuICovXG4gICAgdGhpcy5lbnRpdHlTdGFydCA9IDA7XG4gICAgLyoqIFNvbWUgYmVoYXZpb3IsIGVnLiB3aGVuIGRlY29kaW5nIGVudGl0aWVzLCBpcyBkb25lIHdoaWxlIHdlIGFyZSBpbiBhbm90aGVyIHN0YXRlLiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvdGhlciBzdGF0ZSB0eXBlLiAqL1xuICAgIHRoaXMuYmFzZVN0YXRlID0gMTtcbiAgICAvKiogRm9yIHNwZWNpYWwgcGFyc2luZyBiZWhhdmlvciBpbnNpZGUgb2Ygc2NyaXB0IGFuZCBzdHlsZSB0YWdzLiAqL1xuICAgIHRoaXMuaW5SQ0RBVEEgPSBmYWxzZTtcbiAgICAvKiogRm9yIGRpc2FibGluZyBSQ0RBVEEgdGFncyBoYW5kbGluZyAqL1xuICAgIHRoaXMuaW5YTUwgPSBmYWxzZTtcbiAgICAvKiogRm9yIGRpc2FibGluZyBpbnRlcnBvbGF0aW9uIHBhcnNpbmcgaW4gdi1wcmUgKi9cbiAgICB0aGlzLmluVlByZSA9IGZhbHNlO1xuICAgIC8qKiBSZWNvcmQgbmV3bGluZSBwb3NpdGlvbnMgZm9yIGZhc3QgbGluZSAvIGNvbHVtbiBjYWxjdWxhdGlvbiAqL1xuICAgIHRoaXMubmV3bGluZXMgPSBbXTtcbiAgICB0aGlzLm1vZGUgPSAwO1xuICAgIHRoaXMuZGVsaW1pdGVyT3BlbiA9IGRlZmF1bHREZWxpbWl0ZXJzT3BlbjtcbiAgICB0aGlzLmRlbGltaXRlckNsb3NlID0gZGVmYXVsdERlbGltaXRlcnNDbG9zZTtcbiAgICB0aGlzLmRlbGltaXRlckluZGV4ID0gLTE7XG4gICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMDtcbiAgfVxuICBnZXQgaW5TRkNSb290KCkge1xuICAgIHJldHVybi
20578B0aGlzLm1vZGUgPT09IDIgJiYgdGhpcy5zdGFjay5sZW5ndGggPT09IDA7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgdGhpcy5tb2RlID0gMDtcbiAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XG4gICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAwO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuYmFzZVN0YXRlID0gMTtcbiAgICB0aGlzLmluUkNEQVRBID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5uZXdsaW5lcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuZGVsaW1pdGVyT3BlbiA9IGRlZmF1bHREZWxpbWl0ZXJzT3BlbjtcbiAgICB0aGlzLmRlbGltaXRlckNsb3NlID0gZGVmYXVsdERlbGltaXRlcnNDbG9zZTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgUG9zaXRpb24gb2JqZWN0IHdpdGggbGluZSAvIGNvbHVtbiBpbmZvcm1hdGlvbiB1c2luZyByZWNvcmRlZFxuICAgKiBuZXdsaW5lIHBvc2l0aW9ucy4gV2Uga25vdyB0aGUgaW5kZXggaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGFscmVhZHlcbiAgICogcHJvY2Vzc2VkIGluZGV4LCBzbyBhbGwgdGhlIG5ld2xpbmVzIHVwIHRvIHRoaXMgaW5kZXggc2hvdWxkIGhhdmUgYmVlblxuICAgKiByZWNvcmRlZC5cbiAgICovXG4gIGdldFBvcyhpbmRleCkge1xuICAgIGxldCBsaW5lID0gMTtcbiAgICBsZXQgY29sdW1uID0gaW5kZXggKyAxO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm5ld2xpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBuZXdsaW5lSW5kZXggPSB0aGlzLm5ld2xpbmVzW2ldO1xuICAgICAgaWYgKGluZGV4ID4gbmV3bGluZUluZGV4KSB7XG4gICAgICAgIGxpbmUgPSBpICsgMjtcbiAgICAgICAgY29sdW1uID0gaW5kZXggLSBuZXdsaW5lSW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgbGluZSxcbiAgICAgIG9mZnNldDogaW5kZXhcbiAgICB9O1xuICB9XG4gIHBlZWsoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpO1xuICB9XG4gIHN0YXRlVGV4dChjKSB7XG4gICAgaWYgKGMgPT09IDYwKSB7XG4gICAgICBpZiAodGhpcy5pbmRleCA+IHRoaXMuc2VjdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMuY2JzLm9udGV4dCh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXRlID0gNTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmluVlByZSAmJiBjID09PSB0aGlzLmRlbGltaXRlck9wZW5bMF0pIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAyO1xuICAgICAgdGhpcy5kZWxpbWl0ZXJJbmRleCA9IDA7XG4gICAgICB0aGlzLnN0YXRlSW50ZXJwb2xhdGlvbk9wZW4oYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlSW50ZXJwb2xhdGlvbk9wZW4oYykge1xuICAgIGlmIChjID09PSB0aGlzLmRlbGltaXRlck9wZW5bdGhpcy5kZWxpbWl0ZXJJbmRleF0pIHtcbiAgICAgIGlmICh0aGlzLmRlbGltaXRlckluZGV4ID09PSB0aGlzLmRlbGltaXRlck9wZW4ubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXggKyAxIC0gdGhpcy5kZWxpbWl0ZXJPcGVuLmxlbmd0aDtcbiAgICAgICAgaWYgKHN0YXJ0ID4gdGhpcy5zZWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIHN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gMztcbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsaW1pdGVySW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAzMjtcbiAgICAgIHRoaXMuc3RhdGVJblJDREFUQShjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnN0YXRlVGV4dChjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbnRlcnBvbGF0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJDbG9zZVswXSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDQ7XG4gICAgICB0aGlzLmRlbGltaXRlckluZGV4ID0gMDtcbiAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uQ2xvc2UoYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlSW50ZXJwb2xhdGlvbkNsb3NlKGMpIHtcbiAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJDbG9zZVt0aGlzLmRlbGltaXRlckluZGV4XSkge1xuICAgICAgaWYgKHRoaXMuZGVsaW1pdGVySW5kZXggPT09IHRoaXMuZGVsaW1pdGVyQ2xvc2UubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLmNicy5vbmludGVycG9sYXRpb24odGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gMzI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsaW1pdGVySW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDM7XG4gICAgICB0aGlzLnN0YXRlSW50ZXJwb2xhdGlvbihjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVTcGVjaWFsU3RhcnRTZXF1ZW5jZShjKSB7XG4gICAgY29uc3QgaXNFbmQgPSB0aGlzLnNlcXVlbmNlSW5kZXggPT09IHRoaXMuY3VycmVudFNlcXVlbmNlLmxlbmd0aDtcbiAgICBjb25zdCBpc01hdGNoID0gaXNFbmQgPyAoXG4gICAgICAvLyBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG1ha2Ugc3VyZSB0aGUgdGFnIG5hbWUgaGFzIGVuZGVkXG4gICAgICBpc0VuZE9mVGFnU2VjdGlvbihjKVxuICAgICkgOiAoXG4gICAgICAvLyBPdGhlcndpc2UsIGRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uXG4gICAgICAoYyB8IDMyKSA9PT0gdGhpcy5jdXJyZW50U2VxdWVuY2VbdGhpcy5zZXF1ZW5jZUluZGV4XVxuICAgICk7XG4gICAgaWYgKCFpc01hdGNoKSB7XG4gICAgICB0aGlzLmluUkNEQVRBID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaXNFbmQpIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIHRoaXMuc3RhdGUgPSA2O1xuICAgIHRoaXMuc3RhdGVJblRhZ05hbWUoYyk7XG4gIH1cbiAgLyoqIExvb2sgZm9yIGFuIGVuZCB0YWcuIEZvciA8dGl0bGU+IGFuZCA8dGV4dGFyZWE+LCBhbHNvIGRlY29kZSBlbnRpdGllcy4gKi9cbiAgc3RhdGVJblJDREFUQShjKSB7XG4gICAgaWYgKHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gdGhpcy5jdXJyZW50U2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICBpZiAoYyA9PT0gNjIgfHwgaXNXaGl0ZXNwYWNl
20578KGMpKSB7XG4gICAgICAgIGNvbnN0IGVuZE9mVGV4dCA9IHRoaXMuaW5kZXggLSB0aGlzLmN1cnJlbnRTZXF1ZW5jZS5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25TdGFydCA8IGVuZE9mVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGFjdHVhbEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gZW5kT2ZUZXh0O1xuICAgICAgICAgIHRoaXMuY2JzLm9udGV4dCh0aGlzLnNlY3Rpb25TdGFydCwgZW5kT2ZUZXh0KTtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gYWN0dWFsSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSBlbmRPZlRleHQgKyAyO1xuICAgICAgICB0aGlzLnN0YXRlSW5DbG9zaW5nVGFnTmFtZShjKTtcbiAgICAgICAgdGhpcy5pblJDREFUQSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIH1cbiAgICBpZiAoKGMgfCAzMikgPT09IHRoaXMuY3VycmVudFNlcXVlbmNlW3RoaXMuc2VxdWVuY2VJbmRleF0pIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCArPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZXF1ZW5jZUluZGV4ID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgPT09IFNlcXVlbmNlcy5UaXRsZUVuZCB8fCB0aGlzLmN1cnJlbnRTZXF1ZW5jZSA9PT0gU2VxdWVuY2VzLlRleHRhcmVhRW5kICYmICF0aGlzLmluU0ZDUm9vdCkge1xuICAgICAgICBpZiAoYyA9PT0gdGhpcy5kZWxpbWl0ZXJPcGVuWzBdKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IDI7XG4gICAgICAgICAgdGhpcy5kZWxpbWl0ZXJJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5zdGF0ZUludGVycG9sYXRpb25PcGVuKGMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmFzdEZvcndhcmRUbyg2MCkpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gTnVtYmVyKGMgPT09IDYwKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVDREFUQVNlcXVlbmNlKGMpIHtcbiAgICBpZiAoYyA9PT0gU2VxdWVuY2VzLkNkYXRhW3RoaXMuc2VxdWVuY2VJbmRleF0pIHtcbiAgICAgIGlmICgrK3RoaXMuc2VxdWVuY2VJbmRleCA9PT0gU2VxdWVuY2VzLkNkYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gMjg7XG4gICAgICAgIHRoaXMuY3VycmVudFNlcXVlbmNlID0gU2VxdWVuY2VzLkNkYXRhRW5kO1xuICAgICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgdGhpcy5zdGF0ZSA9IDIzO1xuICAgICAgdGhpcy5zdGF0ZUluRGVjbGFyYXRpb24oYyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBXaGVuIHdlIHdhaXQgZm9yIG9uZSBzcGVjaWZpYyBjaGFyYWN0ZXIsIHdlIGNhbiBzcGVlZCB0aGluZ3MgdXBcbiAgICogYnkgc2tpcHBpbmcgdGhyb3VnaCB0aGUgYnVmZmVyIHVudGlsIHdlIGZpbmQgaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNoYXJhY3RlciB3YXMgZm91bmQuXG4gICAqL1xuICBmYXN0Rm9yd2FyZFRvKGMpIHtcbiAgICB3aGlsZSAoKyt0aGlzLmluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjYyA9IHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG4gICAgICBpZiAoY2MgPT09IDEwKSB7XG4gICAgICAgIHRoaXMubmV3bGluZXMucHVzaCh0aGlzLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjYyA9PT0gYykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBDb21tZW50cyBhbmQgQ0RBVEEgZW5kIHdpdGggYC0tPmAgYW5kIGBdXT5gLlxuICAgKlxuICAgKiBUaGVpciBjb21tb24gcXVhbGl0aWVzIGFyZTpcbiAgICogLSBUaGVpciBlbmQgc2VxdWVuY2VzIGhhdmUgYSBkaXN0aW5jdCBjaGFyYWN0ZXIgdGhleSBzdGFydCB3aXRoLlxuICAgKiAtIFRoYXQgY2hhcmFjdGVyIGlzIHRoZW4gcmVwZWF0ZWQsIHNvIHdlIGhhdmUgdG8gY2hlY2sgbXVsdGlwbGUgcmVwZWF0cy5cbiAgICogLSBBbGwgY2hhcmFjdGVycyBidXQgdGhlIHN0YXJ0IGNoYXJhY3RlciBvZiB0aGUgc2VxdWVuY2UgY2FuIGJlIHNraXBwZWQuXG4gICAqL1xuICBzdGF0ZUluQ29tbWVudExpa2UoYykge1xuICAgIGlmIChjID09PSB0aGlzLmN1cnJlbnRTZXF1ZW5jZVt0aGlzLnNlcXVlbmNlSW5kZXhdKSB7XG4gICAgICBpZiAoKyt0aGlzLnNlcXVlbmNlSW5kZXggPT09IHRoaXMuY3VycmVudFNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2VxdWVuY2UgPT09IFNlcXVlbmNlcy5DZGF0YUVuZCkge1xuICAgICAgICAgIHRoaXMuY2JzLm9uY2RhdGEodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggLSAyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNicy5vbmNvbW1lbnQodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXggLSAyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuZmFzdEZvcndhcmRUbyh0aGlzLmN1cnJlbnRTZXF1ZW5jZVswXSkpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgIT09IHRoaXMuY3VycmVudFNlcXVlbmNlW3RoaXMuc2VxdWVuY2VJbmRleCAtIDFdKSB7XG4gICAgICB0aGlzLnNlcXVlbmNlSW5kZXggPSAwO1xuICAgIH1cbiAgfVxuICBzdGFydFNwZWNpYWwoc2VxdWVuY2UsIG9mZnNldCkge1xuICAgIHRoaXMuZW50ZXJSQ0RBVEEoc2VxdWVuY2UsIG9mZnNldCk7XG4gICAgdGhpcy5zdGF0ZSA9IDMxO1xuICB9XG4gIGVudGVyUkNEQVRBKHNlcXVlbmNlLCBvZmZzZXQpIHtcbiAgICB0aGlzLmluUkNEQVRBID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRTZXF1ZW5jZSA9IHNlcXVlbmNlO1xuICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IG9mZnNldDtcbiAgfVxuICBzdGF0ZUJlZm9yZVRhZ05hbWUoYykge1xuICAgIGlmIChjID09PSAzMykge1xuICAgICAgdGhpcy5zdGF0ZSA9IDIyO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDYzKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMjQ7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoaXNUYWdTdGFydENoYX
20578IoYykpIHtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09IDApIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDY7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5TRkNSb290KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAzNDtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5YTUwpIHtcbiAgICAgICAgaWYgKGMgPT09IDExNikge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSAzMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gYyA9PT0gMTE1ID8gMjkgOiA2O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlID0gNjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgPT09IDQ3KSB7XG4gICAgICB0aGlzLnN0YXRlID0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnN0YXRlVGV4dChjKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJblRhZ05hbWUoYykge1xuICAgIGlmIChpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5oYW5kbGVUYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluU0ZDUm9vdFRhZ05hbWUoYykge1xuICAgIGlmIChpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgY29uc3QgdGFnID0gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgaWYgKHRhZyAhPT0gXCJ0ZW1wbGF0ZVwiKSB7XG4gICAgICAgIHRoaXMuZW50ZXJSQ0RBVEEodG9DaGFyQ29kZXMoYDwvYCArIHRhZyksIDApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVUYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVUYWdOYW1lKGMpIHtcbiAgICB0aGlzLmNicy5vbm9wZW50YWduYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gIH1cbiAgc3RhdGVCZWZvcmVDbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGlzV2hpdGVzcGFjZShjKSkgOyBlbHNlIGlmIChjID09PSA2Mikge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoMTQsIHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gaXNUYWdTdGFydENoYXIoYykgPyA5IDogMjc7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5DbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYyIHx8IGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgdGhpcy5jYnMub25jbG9zZXRhZyh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgICAgdGhpcy5zdGF0ZSA9IDEwO1xuICAgICAgdGhpcy5zdGF0ZUFmdGVyQ2xvc2luZ1RhZ05hbWUoYyk7XG4gICAgfVxuICB9XG4gIHN0YXRlQWZ0ZXJDbG9zaW5nVGFnTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYyKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlQmVmb3JlQXR0ck5hbWUoYykge1xuICAgIGlmIChjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25vcGVudGFnZW5kKHRoaXMuaW5kZXgpO1xuICAgICAgaWYgKHRoaXMuaW5SQ0RBVEEpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDMyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNDcpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSA3O1xuICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZhbHNlKSAmJiB0aGlzLnBlZWsoKSAhPT0gNjIpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoMjIsIHRoaXMuaW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYyA9PT0gNjAgJiYgdGhpcy5wZWVrKCkgPT09IDQ3KSB7XG4gICAgICB0aGlzLmNicy5vbm9wZW50YWdlbmQodGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gNTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgYyA9PT0gNjEpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoXG4gICAgICAgICAgMTksXG4gICAgICAgICAgdGhpcy5pbmRleFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVBdHRyU3RhcnQoYyk7XG4gICAgfVxuICB9XG4gIGhhbmRsZUF0dHJTdGFydChjKSB7XG4gICAgaWYgKGMgPT09IDExOCAmJiB0aGlzLnBlZWsoKSA9PT0gNDUpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMztcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDQ2IHx8IGMgPT09IDU4IHx8IGMgPT09IDY0IHx8IGMgPT09IDM1KSB7XG4gICAgICB0aGlzLmNicy5vbmRpcm5hbWUodGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE0O1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDEyO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIH1cbiAgfVxuICBzdGF0ZUluU2VsZkNsb3NpbmdUYWcoYykge1xuICAgIGlmIChjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25zZWxmY2xvc2luZ3RhZyh0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICAgIHRoaXMuaW5SQ0RBVEEgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyTmFtZShjKTtcbiAgICB9XG4gI
20578H1cbiAgc3RhdGVJbkF0dHJOYW1lKGMpIHtcbiAgICBpZiAoYyA9PT0gNjEgfHwgaXNFbmRPZlRhZ1NlY3Rpb24oYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmlibmFtZSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgIH0gZWxzZSBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpICYmIChjID09PSAzNCB8fCBjID09PSAzOSB8fCBjID09PSA2MCkpIHtcbiAgICAgIHRoaXMuY2JzLm9uZXJyKFxuICAgICAgICAxNyxcbiAgICAgICAgdGhpcy5pbmRleFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkRpck5hbWUoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuaGFuZGxlQXR0ck5hbWVFbmQoYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSA1OCkge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxNDtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfSBlbHNlIGlmIChjID09PSA0Nikge1xuICAgICAgdGhpcy5jYnMub25kaXJuYW1lKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxNjtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5EaXJBcmcoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJhcmcodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5oYW5kbGVBdHRyTmFtZUVuZChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IDkxKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTU7XG4gICAgfSBlbHNlIGlmIChjID09PSA0Nikge1xuICAgICAgdGhpcy5jYnMub25kaXJhcmcodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE2O1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkR5bmFtaWNEaXJBcmcoYykge1xuICAgIGlmIChjID09PSA5Mykge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE0O1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNjEgfHwgaXNFbmRPZlRhZ1NlY3Rpb24oYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uZGlyYXJnKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4ICsgMSk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgdGhpcy5jYnMub25lcnIoXG4gICAgICAgICAgMjcsXG4gICAgICAgICAgdGhpcy5pbmRleFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0ZUluRGlyTW9kaWZpZXIoYykge1xuICAgIGlmIChjID09PSA2MSB8fCBpc0VuZE9mVGFnU2VjdGlvbihjKSkge1xuICAgICAgdGhpcy5jYnMub25kaXJtb2RpZmllcih0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLmhhbmRsZUF0dHJOYW1lRW5kKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gNDYpIHtcbiAgICAgIHRoaXMuY2JzLm9uZGlybW9kaWZpZXIodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSB0aGlzLmluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlQXR0ck5hbWVFbmQoYykge1xuICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnN0YXRlID0gMTc7XG4gICAgdGhpcy5jYnMub25hdHRyaWJuYW1lZW5kKHRoaXMuaW5kZXgpO1xuICAgIHRoaXMuc3RhdGVBZnRlckF0dHJOYW1lKGMpO1xuICB9XG4gIHN0YXRlQWZ0ZXJBdHRyTmFtZShjKSB7XG4gICAgaWYgKGMgPT09IDYxKSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTg7XG4gICAgfSBlbHNlIGlmIChjID09PSA0NyB8fCBjID09PSA2Mikge1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJlbmQoMCwgdGhpcy5zZWN0aW9uU3RhcnQpO1xuICAgICAgdGhpcy5zZWN0aW9uU3RhcnQgPSAtMTtcbiAgICAgIHRoaXMuc3RhdGUgPSAxMTtcbiAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyTmFtZShjKTtcbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmliZW5kKDAsIHRoaXMuc2VjdGlvblN0YXJ0KTtcbiAgICAgIHRoaXMuaGFuZGxlQXR0clN0YXJ0KGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZUF0dHJWYWx1ZShjKSB7XG4gICAgaWYgKGMgPT09IDM0KSB7XG4gICAgICB0aGlzLnN0YXRlID0gMTk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gMzkpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSAyMDtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfSBlbHNlIGlmICghaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnN0YXRlID0gMjE7XG4gICAgICB0aGlzLnN0YXRlSW5BdHRyVmFsdWVOb1F1b3RlcyhjKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlSW5BdHRyVmFsdWUoYywgcXVvdGUpIHtcbiAgICBpZiAoYyA9PT0gcXVvdGUgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKHF1b3RlKSkge1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJkYXRhKHRoaXMuc2VjdGlvblN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gLTE7XG4gICAgICB0aGlzLmNicy5vbmF0dHJpYmVuZChcbiAgICAgICAgcXVvdGUgPT09IDM0ID8gMyA6IDIsXG4gICAgICAgIHRoaXMuaW5kZXggKyAxXG4gICAgICApO1xuICAgICAgdGhpcy5zdGF0ZSA9IDExO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlRG91YmxlUXVvdGVzKGMpIHtcbiAgICB0aGlzLmhhbmRsZUluQXR0clZhbHVlKGMsIDM0KTtcbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlU2luZ2xlUXVvdGVzKGMpIHtcbiAgICB0aGlzLmhhbmRsZUluQXR0clZhbHVlKGMsIDM5KTtcbiAgfVxuICBzdGF0ZUluQXR0clZhbHVlTm9RdW90ZXMoYykge1xuICAgIGlmIChpc1doaXRlc3BhY2UoYykgfHwgYyA9PT0gNjIpIHtcbiAgICAgIHRoaXMuY2JzLm9uYXR0cmliZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IC0xO1xuICAgICAgdGhpcy5jYnMub25hdHRyaWJlbmQoMSwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gMTE7XG4gICAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gICAgfSBlbHNlIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgYyA9PT0gMzQgfHwgYyA9PT0gMzkgfHwgYyA9PT0gNjAgfHwgYyA9PT0gNjEgfHwgYyA9PT0gOTYpIHtcbiAgICAgIHRoaXMuY2JzLm9uZXJyKFxuICAgICAgICAxOCxcbiAgICAgICAgdGhpcy5pbmRleFxuICAgICAgKTtcbiAgICB9IGVsc2UgO1xuICB9XG4gI
20578HN0YXRlQmVmb3JlRGVjbGFyYXRpb24oYykge1xuICAgIGlmIChjID09PSA5MSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDI2O1xuICAgICAgdGhpcy5zZXF1ZW5jZUluZGV4ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IGMgPT09IDQ1ID8gMjUgOiAyMztcbiAgICB9XG4gIH1cbiAgc3RhdGVJbkRlY2xhcmF0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gNjIgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKDYyKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH1cbiAgfVxuICBzdGF0ZUluUHJvY2Vzc2luZ0luc3RydWN0aW9uKGMpIHtcbiAgICBpZiAoYyA9PT0gNjIgfHwgdGhpcy5mYXN0Rm9yd2FyZFRvKDYyKSkge1xuICAgICAgdGhpcy5jYnMub25wcm9jZXNzaW5naW5zdHJ1Y3Rpb24odGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5zdGF0ZSA9IDE7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZUNvbW1lbnQoYykge1xuICAgIGlmIChjID09PSA0NSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IDI4O1xuICAgICAgdGhpcy5jdXJyZW50U2VxdWVuY2UgPSBTZXF1ZW5jZXMuQ29tbWVudEVuZDtcbiAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IDI7XG4gICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gMjM7XG4gICAgfVxuICB9XG4gIHN0YXRlSW5TcGVjaWFsQ29tbWVudChjKSB7XG4gICAgaWYgKGMgPT09IDYyIHx8IHRoaXMuZmFzdEZvcndhcmRUbyg2MikpIHtcbiAgICAgIHRoaXMuY2JzLm9uY29tbWVudCh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICB0aGlzLnN0YXRlID0gMTtcbiAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHN0YXRlQmVmb3JlU3BlY2lhbFMoYykge1xuICAgIGlmIChjID09PSBTZXF1ZW5jZXMuU2NyaXB0RW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuU2NyaXB0RW5kLCA0KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09IFNlcXVlbmNlcy5TdHlsZUVuZFszXSkge1xuICAgICAgdGhpcy5zdGFydFNwZWNpYWwoU2VxdWVuY2VzLlN0eWxlRW5kLCA0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IDY7XG4gICAgICB0aGlzLnN0YXRlSW5UYWdOYW1lKGMpO1xuICAgIH1cbiAgfVxuICBzdGF0ZUJlZm9yZVNwZWNpYWxUKGMpIHtcbiAgICBpZiAoYyA9PT0gU2VxdWVuY2VzLlRpdGxlRW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuVGl0bGVFbmQsIDQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gU2VxdWVuY2VzLlRleHRhcmVhRW5kWzNdKSB7XG4gICAgICB0aGlzLnN0YXJ0U3BlY2lhbChTZXF1ZW5jZXMuVGV4dGFyZWFFbmQsIDQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gNjtcbiAgICAgIHRoaXMuc3RhdGVJblRhZ05hbWUoYyk7XG4gICAgfVxuICB9XG4gIHN0YXJ0RW50aXR5KCkge1xuICB9XG4gIHN0YXRlSW5FbnRpdHkoKSB7XG4gIH1cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGJ1ZmZlciwgY2FsbGluZyB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICpcbiAgICogU3RhdGVzIHRoYXQgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGhpdCBhcmUgaGlnaGVyIHVwLCBhcyBhIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LlxuICAgKi9cbiAgcGFyc2UoaW5wdXQpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGlucHV0O1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICAgIGlmIChjID09PSAxMCkge1xuICAgICAgICB0aGlzLm5ld2xpbmVzLnB1c2godGhpcy5pbmRleCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVRleHQoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUludGVycG9sYXRpb25PcGVuKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNDoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbnRlcnBvbGF0aW9uQ2xvc2UoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMToge1xuICAgICAgICAgIHRoaXMuc3RhdGVTcGVjaWFsU3RhcnRTZXF1ZW5jZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluUkNEQVRBKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjY6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQ0RBVEFTZXF1ZW5jZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQXR0clZhbHVlRG91YmxlUXVvdGVzKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTI6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5BdHRyTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluRGlyTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluRGlyQXJnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EeW5hbWljRGlyQXJnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTY6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EaXJNb2RpZmllcihjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI4OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQ29tbWVudExpa2UoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FzZSAyNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJblNwZWNpYWxDb21tZW50KGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTE6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlQXR0ck5hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluVGFnTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDM0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluU0ZDUm9vdFRhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluQ2xvc2luZ1RhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZVRhZ05hbWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVBZnRlckF0dHJOYW1lKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5BdHRyVmFsdWVTaW5nbGVRdW90ZXMoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODoge1xuICAgICAgICAgIHRoaXMuc3RhdGVCZWZvcmVBdHRyVmFsdWUoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA4OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZUNsb3NpbmdUYWdOYW1lKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMTA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQWZ0ZXJDbG9zaW5nVGFnTmFtZShjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI5OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZVNwZWNpYWxTKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzA6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlU3BlY2lhbFQoYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyMToge1xuICAgICAgICAgIHRoaXMuc3RhdGVJbkF0dHJWYWx1ZU5vUXVvdGVzKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzoge1xuICAgICAgICAgIHRoaXMuc3RhdGVJblNlbGZDbG9zaW5nVGFnKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjM6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5EZWNsYXJhdGlvbihjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDIyOiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUJlZm9yZURlY2xhcmF0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjU6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlQmVmb3JlQ29tbWVudChjKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDI0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0ZUluUHJvY2Vzc2luZ0luc3RydWN0aW9uKGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzM6IHtcbiAgICAgICAgICB0aGlzLnN0YXRlSW5FbnRpdHkoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pbmRleCsrO1xuICAgIH1cbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgZGF0YSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQgZnJvbSB0aGUgYnVmZmVyLlxuICAgKi9cbiAgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy5zZWN0aW9uU3RhcnQgIT09IHRoaXMuaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSAxIHx8IHRoaXMuc3RhdGUgPT09IDMyICYmIHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gMCkge1xuICAgICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgICB0aGlzLnNlY3Rpb25TdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IDE5IHx8IHRoaXMuc3RhdGUgPT09IDIwIHx8IHRoaXMuc3RhdGUgPT09IDIxKSB7XG4gICAgICAgIHRoaXMuY2JzLm9uYXR0cmliZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuc2VjdGlvblN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZmluaXNoKCkge1xuICAgIHRoaXMuaGFuZGxlVHJhaWxpbmdEYXRhKCk7XG4gICAgdGhpcy5jYnMub25lbmQoKTtcbiAgfVxuICAvKiogSGFuZGxlIGFueSB0cmFpbGluZyBkYXRhLiAqL1xuICBoYW5kbGVUcmFpbGluZ0RhdGEoKSB7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKHRoaXMuc2VjdGlvblN0YXJ0ID49IGVuZEluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSAyOCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFNlcXVlbmNlID09PSBTZXF1ZW5jZXMuQ2RhdGFFbmQpIHtcbiAgICAgICAgdGhpcy5jYnMub25jZGF0YSh0aGlzLnNlY3Rpb25TdGFydCwgZW5kSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jYnMub25jb21tZW50KHRoaXMuc2VjdGlvblN0YXJ0LCBlbmRJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSA2IHx8IHRoaXMuc3RhdGUgPT09IDExIHx8IHRoaXMuc3RhdGUgPT09IDE4IHx8IHRoaXMuc3RhdGUgPT09IDE3IHx8IHRoaXMuc3RhdGUgPT09IDEyIHx8IHRoaXMuc3RhdGUgPT09IDEzIHx8IHRoaXMuc3RhdGUgPT09IDE0IHx8IHRoaXMuc3RhdGUgPT09IDE1IHx8IHRoaXMuc3RhdGUgPT09IDE2IHx8IHRoaXMuc3RhdGUgPT09IDIwIHx8IHRoaXMuc3RhdGUgPT09IDE5IHx8IHRoaXMuc3RhdGUgPT09IDIxIHx8IHRoaXMuc3RhdGUgPT09IDkpIDsgZWxzZSB7XG4gICAgICB0aGlzLmNicy5vbnRleHQodGhpcy5zZWN0aW9uU3RhcnQsIGVuZEluZGV4KTtcbiAgICB9XG4gI
20578H1cbiAgZW1pdENvZGVQb2ludChjcCwgY29uc3VtZWQpIHtcbiAgfVxufVxuXG5jb25zdCBDb21waWxlckRlcHJlY2F0aW9uVHlwZXMgPSB7XG4gIFwiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiOiBcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIixcbiAgXCJDT01QSUxFUl9WX0JJTkRfU1lOQ1wiOiBcIkNPTVBJTEVSX1ZfQklORF9TWU5DXCIsXG4gIFwiQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUlwiOiBcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIixcbiAgXCJDT01QSUxFUl9WX09OX05BVElWRVwiOiBcIkNPTVBJTEVSX1ZfT05fTkFUSVZFXCIsXG4gIFwiQ09NUElMRVJfVl9JRl9WX0ZPUl9QUkVDRURFTkNFXCI6IFwiQ09NUElMRVJfVl9JRl9WX0ZPUl9QUkVDRURFTkNFXCIsXG4gIFwiQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFXCI6IFwiQ09NUElMRVJfTkFUSVZFX1RFTVBMQVRFXCIsXG4gIFwiQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFXCI6IFwiQ09NUElMRVJfSU5MSU5FX1RFTVBMQVRFXCIsXG4gIFwiQ09NUElMRVJfRklMVEVSU1wiOiBcIkNPTVBJTEVSX0ZJTFRFUlNcIlxufTtcbmNvbnN0IGRlcHJlY2F0aW9uRGF0YSA9IHtcbiAgW1wiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiXToge1xuICAgIG1lc3NhZ2U6IGBQbGF0Zm9ybS1uYXRpdmUgZWxlbWVudHMgd2l0aCBcImlzXCIgcHJvcCB3aWxsIG5vIGxvbmdlciBiZSB0cmVhdGVkIGFzIGNvbXBvbmVudHMgaW4gVnVlIDMgdW5sZXNzIHRoZSBcImlzXCIgdmFsdWUgaXMgZXhwbGljaXRseSBwcmVmaXhlZCB3aXRoIFwidnVlOlwiLmAsXG4gICAgbGluazogYGh0dHBzOi8vdjMtbWlncmF0aW9uLnZ1ZWpzLm9yZy9icmVha2luZy1jaGFuZ2VzL2N1c3RvbS1lbGVtZW50cy1pbnRlcm9wLmh0bWxgXG4gIH0sXG4gIFtcIkNPTVBJTEVSX1ZfQklORF9TWU5DXCJdOiB7XG4gICAgbWVzc2FnZTogKGtleSkgPT4gYC5zeW5jIG1vZGlmaWVyIGZvciB2LWJpbmQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHYtbW9kZWwgd2l0aCBhcmd1bWVudCBpbnN0ZWFkLiBcXGB2LWJpbmQ6JHtrZXl9LnN5bmNcXGAgc2hvdWxkIGJlIGNoYW5nZWQgdG8gXFxgdi1tb2RlbDoke2tleX1cXGAuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1tb2RlbC5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9WX0JJTkRfT0JKRUNUX09SREVSXCJdOiB7XG4gICAgbWVzc2FnZTogYHYtYmluZD1cIm9ialwiIHVzYWdlIGlzIG5vdyBvcmRlciBzZW5zaXRpdmUgYW5kIGJlaGF2ZXMgbGlrZSBKYXZhU2NyaXB0IG9iamVjdCBzcHJlYWQ6IGl0IHdpbGwgbm93IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBub24tbWVyZ2VhYmxlIGF0dHJpYnV0ZSB0aGF0IGFwcGVhcnMgYmVmb3JlIHYtYmluZCBpbiB0aGUgY2FzZSBvZiBjb25mbGljdC4gVG8gcmV0YWluIDIueCBiZWhhdmlvciwgbW92ZSB2LWJpbmQgdG8gbWFrZSBpdCB0aGUgZmlyc3QgYXR0cmlidXRlLiBZb3UgY2FuIGFsc28gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGlmIHRoZSB1c2FnZSBpcyBpbnRlbmRlZC5gLFxuICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy92LWJpbmQuaHRtbGBcbiAgfSxcbiAgW1wiQ09NUElMRVJfVl9PTl9OQVRJVkVcIl06IHtcbiAgICBtZXNzYWdlOiBgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBoYXMgYmVlbiByZW1vdmVkIGFzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1vbi1uYXRpdmUtbW9kaWZpZXItcmVtb3ZlZC5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9WX0lGX1ZfRk9SX1BSRUNFREVOQ0VcIl06IHtcbiAgICBtZXNzYWdlOiBgdi1pZiAvIHYtZm9yIHByZWNlZGVuY2Ugd2hlbiB1c2VkIG9uIHRoZSBzYW1lIGVsZW1lbnQgaGFzIGNoYW5nZWQgaW4gVnVlIDM6IHYtaWYgbm93IHRha2VzIGhpZ2hlciBwcmVjZWRlbmNlIGFuZCB3aWxsIG5vIGxvbmdlciBoYXZlIGFjY2VzcyB0byB2LWZvciBzY29wZSB2YXJpYWJsZXMuIEl0IGlzIGJlc3QgdG8gYXZvaWQgdGhlIGFtYmlndWl0eSB3aXRoIDx0ZW1wbGF0ZT4gdGFncyBvciB1c2UgYSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGZpbHRlcnMgdi1mb3IgZGF0YSBzb3VyY2UuYCxcbiAgICBsaW5rOiBgaHR0cHM6Ly92My1taWdyYXRpb24udnVlanMub3JnL2JyZWFraW5nLWNoYW5nZXMvdi1pZi12LWZvci5odG1sYFxuICB9LFxuICBbXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIl06IHtcbiAgICBtZXNzYWdlOiBgPHRlbXBsYXRlPiB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0aXZlcyB3aWxsIHJlbmRlciBhcyBhIG5hdGl2ZSB0ZW1wbGF0ZSBlbGVtZW50IGluc3RlYWQgb2YgaXRzIGlubmVyIGNvbnRlbnQgaW4gVnVlIDMuYFxuICB9LFxuICBbXCJDT01QSUxFUl9JTkxJTkVfVEVNUExBVEVcIl06IHtcbiAgICBtZXNzYWdlOiBgXCJpbmxpbmUtdGVtcGxhdGVcIiBoYXMgYmVlbiByZW1vdmVkIGluIFZ1ZSAzLmAsXG4gICAgbGluazogYGh0dHBzOi8vdjMtbWlncmF0aW9uLnZ1ZWpzLm9yZy9icmVha2luZy1jaGFuZ2VzL2lubGluZS10ZW1wbGF0ZS1hdHRyaWJ1dGUuaHRtbGBcbiAgfSxcbiAgW1wiQ09NUElMRVJfRklMVEVSU1wiXToge1xuICAgIG1lc3NhZ2U6IGBmaWx0ZXJzIGhhdmUgYmVlbiByZW1vdmVkIGluIFZ1ZSAzLiBUaGUgXCJ8XCIgc3ltYm9sIHdpbGwgYmUgdHJlYXRlZCBhcyBuYXRpdmUgSmF2YVNjcmlwdCBiaXR3aXNlIE9SIG9wZXJhdG9yLiBVc2UgbWV0aG9kIGNhbGxzIG9yIGNvbXB1dGVkIHByb3BlcnRpZXMgaW5zdGVhZC5gLFxuICAgIGxpbms6IGBodHRwczovL3YzLW1pZ3JhdGlvbi52dWVqcy5vcmcvYnJlYWtpbmctY2hhbmdlcy9maWx0ZXJzLmh0bWxgXG4gIH1cbn07XG5mdW5jdGlvbiBnZXRDb21wYXRWYWx1ZShrZXksIHsgY29tcGF0Q29uZmlnIH0pIHtcbiAgY29uc3QgdmFsdWUgPSBjb21wYXRDb25maWcgJiYgY29tcGF0Q29uZmlnW2tleV07XG4gIGlmIChrZXkgPT09IFwiTU9ERVwiKSB7XG4gICAgcmV0dXJuIHZhbHVlIHx8IDM7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbXBhdEVuYWJsZWQoa2V5LCBjb250ZXh0KSB7XG4gIGNvbnN0IG1vZGUgPSBnZXRDb21wYXRWYWx1ZShcIk1PREVcIiwgY29udGV4dCk7XG4gIGNvbnN0IHZhbHVlID0gZ2V0Q29tcGF0VmFsdWUoa2V5LCBjb250ZXh0KTtcbiAgcmV0dXJuIG1vZGUgPT09IDMgPyB2YWx1ZSA9PT0gdHJ1ZSA6IHZhbHVlICE9PSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrQ29tcGF0RW5hYmxlZChrZXksIGNvbnRleHQsIGxvYywgLi4uYXJncykge1xuICBjb25zdCBlbmFibGVkID0gaXNDb21wYXRFbmFibGVkKGtleSwgY29udGV4dCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIGVuYWJsZWQpIHtcbiAgICB3YXJuRGVwcmVjYXRpb24oa2V5LCBjb250ZXh0LCBsb2MsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBlbmFibGVkO1xufVxuZnVuY3Rpb24gd2FybkRlcHJlY2F0aW9uKGtleSwgY29udGV4dCwgbG9jLCAuLi5hcmdzKSB7XG4gIGNvbnN0IHZhbCA9IGdldENvbXBhdFZhbHVlKGtleSwgY29udGV4dCk7XG4gIGlmICh2YWwgPT09IFwic3VwcHJlc3Mtd2FybmluZ1wiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHsgbWVzc2FnZSwgbGluayB9ID0gZGVwcmVjYXRpb25EYXRhW2tleV07XG4gIGNvbnN0IG1zZyA9IGAoZGVwcmVjYXRpb24gJHtrZXl9KSAke3R5cGVvZiBtZXNzYWdlID09PSBcImZ1bmN0aW9uXCIgPyBtZXNzYWdlKC4uLmFyZ3MpIDogbWVzc2FnZX0ke2xpbmsgPyBgXG4gIERldGFpbHM6ICR7bGlua31gIDogYGB9YDtcbiAgY29uc3QgZXJyID0gbmV3IFN5bnRheEVycm9yKG1zZyk7XG4gIGVyci5jb2RlID0ga2V5O1xuICBpZiAobG9jKSBlcnIubG9jID0gbG9jO1xuICBjb250ZXh0Lm9uV2FybihlcnIpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlcnJvcikge1xuICB0aHJvdyBlcnJvcjtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRPbldhcm4obXNnKSB7XG4gICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnLm1lc3NhZ2V9YCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21waWxlckVycm9yKGNvZGUsIGxvYywgbWVzc2FnZXMsIGFkZGl0aW9uYWxNZXNzYWdlKSB7XG4gIGNvbnN0IG1zZyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UgPyAobWVzc2FnZXMgfHwgZXJyb3JNZXNzYWdlcylbY29kZV0gKyAoYWRkaXRpb25hbE1lc3NhZ2UgfHwgYGApIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9yLXJlZmVyZW5jZS8jY29tcGlsZXItJHtjb2RlfWA7XG4gIGNvbnN0IGVycm9yID0gbmV3IFN5bnRheEVycm9yKFN0cmluZyhtc2cpKTtcbiAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIGVycm9yLmxvYyA9IGxvYztcbiAgcmV0dXJuIGVycm9yO1xufVxuY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgXCJBQlJVUFRfQ0xPU0lOR19PRl9FTVBUWV9DT01NRU5UXCI6IDAsXG4gIFwiMFwiOiBcIkFCUlVQVF9DTE9TSU5HX09GX0VNUFRZX0NPTU1FTlRcIixcbiAgXCJDREFUQV9JTl9IVE1MX0NPTlRFTlRcIjogMSxcbiAgXCIxXCI6IFwiQ0RBVEFfSU5fSFRNTF9DT05URU5UXCIsXG4gIFwiRFVQTElDQVRFX0FUVFJJQlVURVwiOiAyLFxuICBcIjJcIjogXCJEVVBMSUNBVEVfQVRUUklCVVRFXCIsXG4gIFwiRU5EX1RBR19XSVRIX0FUVFJJQlVURVNcIjogMyxcbiAgXCIzXCI6IFwiRU5EX1RBR19XSVRIX0FUVFJJQlVURVNcIixcbiAgXCJFTkRfVEFHX1dJVEhfVFJBSUxJTkdfU09MSURVU1wiOiA0LFxuICBcIjRcIjogXCJFTkRfVEFHX1dJVEhfVFJBSUxJTkdfU09MSURVU1wiLFxuICBcIkVPRl9CRUZPUkVfVEFHX05BTUVcIjogNSxcbiAgXCI1XCI6IFwiRU9GX0JFRk9SRV9UQUdfTkFNRVwiLFxuICBcIkVPRl9JTl9DREFUQVwiOiA2LFxuICBcIjZcIjogXCJFT0ZfSU5fQ0RBVEFcIixcbiAgXCJFT0ZfSU5fQ09NTUVOVFwiOiA3LFxuICBcIjdcIjogXCJFT0ZfSU5fQ09NTUVOVFwiLFxuICBcIkVPRl9JTl9TQ1JJUFRfSFRNTF9DT01NRU5UX0xJS0VfVEVYVFwiOiA4LFxuICBcIjhcIjogXCJFT0ZfSU5fU0NSSVBUX0hUTUxfQ09NTUVOVF9MSUtFX1RFWFRcIixcbiAgXCJFT0ZfSU5fVEFHXCI6IDksXG4gIFwiOVwiOiBcIkVPRl9JTl9UQUdcIixcbiAgXCJJTkNPUlJFQ1RMWV9DTE9TRURfQ09NTUVOVFwiOiAxMCxcbiAgXCIxMFwiOiBcIklOQ09SUkVDVExZX0NMT1NFRF9DT01NRU5UXCIsXG4gIFwiSU5DT1JSRUNUTFlfT1BFTkVEX0NPTU1FTlRcIjogMTEsXG4gIFwiMTFcIjogXCJJTkNPUlJFQ1RMWV9PUEVORURfQ09NTUVOVFwiLFxuICBcIklOVkFMSURfRklSU1RfQ0hBUkFDVEVSX09GX1RBR19OQU1FXCI6IDEyLFxuICBcIjEyXCI6IFwiSU5WQUxJRF9GSVJTVF9DSEFSQUNURVJfT0ZfVEFHX05BTUVcIixcbiAgXCJNSVNTSU5HX0FUVFJJQlVURV9WQUxVRVwiOiAxMyxcbiAgXCIxM1wiOiBcIk1JU1NJTkdfQVRUUklCVVRFX1ZBTFVFXCIsXG4gIFwiTUlTU0lOR19FTkRfVEFHX05BTUVcIjogMTQsXG4gIFwiMTRcIjogXCJNSVNTSU5HX0VORF9UQUdfTkFNRVwiLFxuICBcIk1JU1NJTkdfV0hJVEVTUEFDRV9CRVRXRUVOX0FUVFJJQlVURVNcIjogMTUsXG4gIFwiMTVcIjogXCJNSVNTSU5HX1dISVRFU1BBQ0VfQkVUV0VFTl9BVFRSSUJVVEVTXCIsXG4gIFwiTkVTVEVEX0NPTU1FTlRcIjogMTYsXG4gIFwiMTZcIjogXCJORVNURURfQ09NTUVOVFwiLFxuICBcIlVORVhQRUNURURfQ0hBUkFDVEVSX0lOX0FUVFJJQlVURV9OQU1FXCI6IDE3LFxuICBcIjE3XCI6IFwiVU5FWFBFQ1RFRF9DSEFSQUNURVJfSU5fQVRUUklCVVRFX05BTUVcIixcbiAgXCJVTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9VTlFVT1RFRF9BVFRSSUJVVEVfVkFMVUVcIjogMTgsXG4gIFwiMThcIjogXCJVTkVYUEVDVEVEX0NIQVJBQ1RFUl9JTl9VTlFVT1RFRF9BVFRSSUJVVEVfVkFMVUVcIixcbiAgXCJVTkVYUEVDVEVEX0VRVUFMU19TSUdOX0JFRk9SRV9BVFRSSUJVVEVfTkFNRVwiOiAxOSxcbiAgXCIxOVwiOiBcIlVORVhQRUNURURfRVFVQUxTX1NJR05fQkVGT1JFX0FUVFJJQlVURV9OQU1FXCIsXG4gIFwiVU5FWFBFQ1RFRF9OVUxMX0NIQVJBQ1RFUlwiOiAyMCxcbiAgXCIyMFwiOiBcIlVORVhQRUNURURfTlVMTF9DSEFSQUNURVJcIixcbiAgXCJVTkVYUEVDVEVEX1FVRVNUSU9OX01BUktfSU5TVEVBRF9PRl9UQUdfTkFNRVwiOiAyMSxcbiAgXCIyMVwiOiBcIlVORVhQRUNURURfUVVFU1RJT05fTUFSS19JTlNURUFEX09GX1RBR19OQU1FXCIsXG4gIFwiVU5FWFBFQ1RFRF9TT0xJRFVTX0lOX1RBR1wiOiAyMixcbiAgXCIyMlwiOiBcIlVORVhQRUNURURfU09MSURVU19JTl9UQUdcIixcbiAgXCJYX0lOVkFMSURfRU5EX1RBR1wiOiAyMyxcbiAgXCIyM1wiOiBcIlhfSU5WQUxJRF9FTkRfVEFHXCIsXG4gIFwiWF9NSVNTSU5HX0VORF9UQUdcIjogMjQsXG4gIFwiMjRcIjogXCJYX01JU1NJTkdfRU5EX1RBR1wiLFxuICBcIlhfTUlTU0lOR19JTlRFUlBPTEFUSU9OX0VORFwiOiAyNSxcbiAgXCIyNVwiOiBcIlhfTUlTU0lOR19JTlRFUlBPTEFUSU9OX0VORFwiLFxuICBcIlhfTUlTU0lOR19ESVJFQ1RJVkVfTkFNRVwiOiAyNixcbiAgXCIyNlwiOiBcIlhfTUlTU0lOR19ESVJFQ1RJVkVfTkFNRVwiLFxuICBcIlhfTUlTU0lOR19EWU5BTUlDX0RJUkVDVElWRV9BUkdVTUVOVF9FTkRcIjogMjcsXG4gIFwiMjdcIjogXCJYX01JU1NJTkdfRFlOQU1JQ19ESVJFQ1RJVkVfQVJHVU1FTlRfRU5EXCIsXG4gIFwiWF9WX0lGX05PX0VYUFJFU1NJT05cIjogMjgsXG4gIFwiMjhcIjogXCJYX1ZfSUZfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9JRl9TQU1FX0tFWVwiOiAyOSxcbiAgXCIyOVwiOiBcIlhfVl9JRl9TQU1FX0tFWVwiLFxuICBcIlhfVl9FTFNFX05PX0FESkFDRU5UX0lGXCI6IDMwLFxuICBcIjMwXCI6IFwiWF9WX0VMU0VfTk9fQURKQUNFTlRfSUZcIixcbiAgXCJYX1ZfRk9SX05PX0VYUFJFU1NJT05cIjogMzEsXG4gIFwiMzFcIjogXCJYX1ZfRk9SX05PX0VYUFJFU1NJT05cIixcbiAgXCJYX1ZfRk9SX01BTEZPUk1FRF9FWFBSRVNTSU9OXCI6IDMyLFxuICBcIjMyXCI6IFwiWF9WX0ZPUl9NQUxGT1JNRURfRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9GT1JfVEVNUExBVEVfS0VZX1BMQUNFTUVOVFwiOiAzMyxcbiAgXCIzM1wiOiBcIlhfVl9GT1JfVEVNUExBVEVfS0VZX1BMQUNFTUVOVFwiLFxuICBcIlhfVl9CSU5EX05PX0VYUFJFU1NJT05cIjogMzQsXG4gIFwiMzRcIjogXCJYX1ZfQklORF9OT19FWFBSRVNTSU9OXCIsXG4gIFwiWF9WX09OX05PX0VYUFJFU1NJT05cIjogMzUsXG4gIFwiMzVcIjogXCJYX1ZfT05fTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9TTE9UX1VORVhQRUNURURfRElSRUNUSVZFX09OX1NMT1RfT1VUTEVUXCI6I
20578DM2LFxuICBcIjM2XCI6IFwiWF9WX1NMT1RfVU5FWFBFQ1RFRF9ESVJFQ1RJVkVfT05fU0xPVF9PVVRMRVRcIixcbiAgXCJYX1ZfU0xPVF9NSVhFRF9TTE9UX1VTQUdFXCI6IDM3LFxuICBcIjM3XCI6IFwiWF9WX1NMT1RfTUlYRURfU0xPVF9VU0FHRVwiLFxuICBcIlhfVl9TTE9UX0RVUExJQ0FURV9TTE9UX05BTUVTXCI6IDM4LFxuICBcIjM4XCI6IFwiWF9WX1NMT1RfRFVQTElDQVRFX1NMT1RfTkFNRVNcIixcbiAgXCJYX1ZfU0xPVF9FWFRSQU5FT1VTX0RFRkFVTFRfU0xPVF9DSElMRFJFTlwiOiAzOSxcbiAgXCIzOVwiOiBcIlhfVl9TTE9UX0VYVFJBTkVPVVNfREVGQVVMVF9TTE9UX0NISUxEUkVOXCIsXG4gIFwiWF9WX1NMT1RfTUlTUExBQ0VEXCI6IDQwLFxuICBcIjQwXCI6IFwiWF9WX1NMT1RfTUlTUExBQ0VEXCIsXG4gIFwiWF9WX01PREVMX05PX0VYUFJFU1NJT05cIjogNDEsXG4gIFwiNDFcIjogXCJYX1ZfTU9ERUxfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9NT0RFTF9NQUxGT1JNRURfRVhQUkVTU0lPTlwiOiA0MixcbiAgXCI0MlwiOiBcIlhfVl9NT0RFTF9NQUxGT1JNRURfRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9NT0RFTF9PTl9TQ09QRV9WQVJJQUJMRVwiOiA0MyxcbiAgXCI0M1wiOiBcIlhfVl9NT0RFTF9PTl9TQ09QRV9WQVJJQUJMRVwiLFxuICBcIlhfVl9NT0RFTF9PTl9QUk9QU1wiOiA0NCxcbiAgXCI0NFwiOiBcIlhfVl9NT0RFTF9PTl9QUk9QU1wiLFxuICBcIlhfSU5WQUxJRF9FWFBSRVNTSU9OXCI6IDQ1LFxuICBcIjQ1XCI6IFwiWF9JTlZBTElEX0VYUFJFU1NJT05cIixcbiAgXCJYX0tFRVBfQUxJVkVfSU5WQUxJRF9DSElMRFJFTlwiOiA0NixcbiAgXCI0NlwiOiBcIlhfS0VFUF9BTElWRV9JTlZBTElEX0NISUxEUkVOXCIsXG4gIFwiWF9QUkVGSVhfSURfTk9UX1NVUFBPUlRFRFwiOiA0NyxcbiAgXCI0N1wiOiBcIlhfUFJFRklYX0lEX05PVF9TVVBQT1JURURcIixcbiAgXCJYX01PRFVMRV9NT0RFX05PVF9TVVBQT1JURURcIjogNDgsXG4gIFwiNDhcIjogXCJYX01PRFVMRV9NT0RFX05PVF9TVVBQT1JURURcIixcbiAgXCJYX0NBQ0hFX0hBTkRMRVJfTk9UX1NVUFBPUlRFRFwiOiA0OSxcbiAgXCI0OVwiOiBcIlhfQ0FDSEVfSEFORExFUl9OT1RfU1VQUE9SVEVEXCIsXG4gIFwiWF9TQ09QRV9JRF9OT1RfU1VQUE9SVEVEXCI6IDUwLFxuICBcIjUwXCI6IFwiWF9TQ09QRV9JRF9OT1RfU1VQUE9SVEVEXCIsXG4gIFwiWF9WTk9ERV9IT09LU1wiOiA1MSxcbiAgXCI1MVwiOiBcIlhfVk5PREVfSE9PS1NcIixcbiAgXCJYX1ZfQklORF9JTlZBTElEX1NBTUVfTkFNRV9BUkdVTUVOVFwiOiA1MixcbiAgXCI1MlwiOiBcIlhfVl9CSU5EX0lOVkFMSURfU0FNRV9OQU1FX0FSR1VNRU5UXCIsXG4gIFwiX19FWFRFTkRfUE9JTlRfX1wiOiA1MyxcbiAgXCI1M1wiOiBcIl9fRVhURU5EX1BPSU5UX19cIlxufTtcbmNvbnN0IGVycm9yTWVzc2FnZXMgPSB7XG4gIC8vIHBhcnNlIGVycm9yc1xuICBbMF06IFwiSWxsZWdhbCBjb21tZW50LlwiLFxuICBbMV06IFwiQ0RBVEEgc2VjdGlvbiBpcyBhbGxvd2VkIG9ubHkgaW4gWE1MIGNvbnRleHQuXCIsXG4gIFsyXTogXCJEdXBsaWNhdGUgYXR0cmlidXRlLlwiLFxuICBbM106IFwiRW5kIHRhZyBjYW5ub3QgaGF2ZSBhdHRyaWJ1dGVzLlwiLFxuICBbNF06IFwiSWxsZWdhbCAnLycgaW4gdGFncy5cIixcbiAgWzVdOiBcIlVuZXhwZWN0ZWQgRU9GIGluIHRhZy5cIixcbiAgWzZdOiBcIlVuZXhwZWN0ZWQgRU9GIGluIENEQVRBIHNlY3Rpb24uXCIsXG4gIFs3XTogXCJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50LlwiLFxuICBbOF06IFwiVW5leHBlY3RlZCBFT0YgaW4gc2NyaXB0LlwiLFxuICBbOV06IFwiVW5leHBlY3RlZCBFT0YgaW4gdGFnLlwiLFxuICBbMTBdOiBcIkluY29ycmVjdGx5IGNsb3NlZCBjb21tZW50LlwiLFxuICBbMTFdOiBcIkluY29ycmVjdGx5IG9wZW5lZCBjb21tZW50LlwiLFxuICBbMTJdOiBcIklsbGVnYWwgdGFnIG5hbWUuIFVzZSAnJmx0OycgdG8gcHJpbnQgJzwnLlwiLFxuICBbMTNdOiBcIkF0dHJpYnV0ZSB2YWx1ZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIFsxNF06IFwiRW5kIHRhZyBuYW1lIHdhcyBleHBlY3RlZC5cIixcbiAgWzE1XTogXCJXaGl0ZXNwYWNlIHdhcyBleHBlY3RlZC5cIixcbiAgWzE2XTogXCJVbmV4cGVjdGVkICc8IS0tJyBpbiBjb21tZW50LlwiLFxuICBbMTddOiBgQXR0cmlidXRlIG5hbWUgY2Fubm90IGNvbnRhaW4gVSswMDIyIChcIiksIFUrMDAyNyAoJyksIGFuZCBVKzAwM0MgKDwpLmAsXG4gIFsxOF06IFwiVW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlIGNhbm5vdCBjb250YWluIFUrMDAyMiAoXFxcIiksIFUrMDAyNyAoJyksIFUrMDAzQyAoPCksIFUrMDAzRCAoPSksIGFuZCBVKzAwNjAgKGApLlwiLFxuICBbMTldOiBcIkF0dHJpYnV0ZSBuYW1lIGNhbm5vdCBzdGFydCB3aXRoICc9Jy5cIixcbiAgWzIxXTogXCInPD8nIGlzIGFsbG93ZWQgb25seSBpbiBYTUwgY29udGV4dC5cIixcbiAgWzIwXTogYFVuZXhwZWN0ZWQgbnVsbCBjaGFyYWN0ZXIuYCxcbiAgWzIyXTogXCJJbGxlZ2FsICcvJyBpbiB0YWdzLlwiLFxuICAvLyBWdWUtc3BlY2lmaWMgcGFyc2UgZXJyb3JzXG4gIFsyM106IFwiSW52YWxpZCBlbmQgdGFnLlwiLFxuICBbMjRdOiBcIkVsZW1lbnQgaXMgbWlzc2luZyBlbmQgdGFnLlwiLFxuICBbMjVdOiBcIkludGVycG9sYXRpb24gZW5kIHNpZ24gd2FzIG5vdCBmb3VuZC5cIixcbiAgWzI3XTogXCJFbmQgYnJhY2tldCBmb3IgZHluYW1pYyBkaXJlY3RpdmUgYXJndW1lbnQgd2FzIG5vdCBmb3VuZC4gTm90ZSB0aGF0IGR5bmFtaWMgZGlyZWN0aXZlIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIHNwYWNlcy5cIixcbiAgWzI2XTogXCJMZWdhbCBkaXJlY3RpdmUgbmFtZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIC8vIHRyYW5zZm9ybSBlcnJvcnNcbiAgWzI4XTogYHYtaWYvdi1lbHNlLWlmIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbMjldOiBgdi1pZi9lbHNlIGJyYW5jaGVzIG11c3QgdXNlIHVuaXF1ZSBrZXlzLmAsXG4gIFszMF06IGB2LWVsc2Uvdi1lbHNlLWlmIGhhcyBubyBhZGphY2VudCB2LWlmIG9yIHYtZWxzZS1pZi5gLFxuICBbMzFdOiBgdi1mb3IgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFszMl06IGB2LWZvciBoYXMgaW52YWxpZCBleHByZXNzaW9uLmAsXG4gIFszM106IGA8dGVtcGxhdGUgdi1mb3I+IGtleSBzaG91bGQgYmUgcGxhY2VkIG9uIHRoZSA8dGVtcGxhdGU+IHRhZy5gLFxuICBbMzRdOiBgdi1iaW5kIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTJdOiBgdi1iaW5kIHdpdGggc2FtZS1uYW1lIHNob3J0aGFuZCBvbmx5IGFsbG93cyBzdGF0aWMgYXJndW1lbnQuYCxcbiAgWzM1XTogYHYtb24gaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFszNl06IGBVbmV4cGVjdGVkIGN1c3RvbSBkaXJlY3RpdmUgb24gPHNsb3Q+IG91dGxldC5gLFxuICBbMzddOiBgTWl4ZWQgdi1zbG90IHVzYWdlIG9uIGJvdGggdGhlIGNvbXBvbmVudCBhbmQgbmVzdGVkIDx0
20578ZW1wbGF0ZT4uIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG5hbWVkIHNsb3RzLCBhbGwgc2xvdHMgc2hvdWxkIHVzZSA8dGVtcGxhdGU+IHN5bnRheCB0byBhdm9pZCBzY29wZSBhbWJpZ3VpdHkuYCxcbiAgWzM4XTogYER1cGxpY2F0ZSBzbG90IG5hbWVzIGZvdW5kLiBgLFxuICBbMzldOiBgRXh0cmFuZW91cyBjaGlsZHJlbiBmb3VuZCB3aGVuIGNvbXBvbmVudCBhbHJlYWR5IGhhcyBleHBsaWNpdGx5IG5hbWVkIGRlZmF1bHQgc2xvdC4gVGhlc2UgY2hpbGRyZW4gd2lsbCBiZSBpZ25vcmVkLmAsXG4gIFs0MF06IGB2LXNsb3QgY2FuIG9ubHkgYmUgdXNlZCBvbiBjb21wb25lbnRzIG9yIDx0ZW1wbGF0ZT4gdGFncy5gLFxuICBbNDFdOiBgdi1tb2RlbCBpcyBtaXNzaW5nIGV4cHJlc3Npb24uYCxcbiAgWzQyXTogYHYtbW9kZWwgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIEphdmFTY3JpcHQgbWVtYmVyIGV4cHJlc3Npb24uYCxcbiAgWzQzXTogYHYtbW9kZWwgY2Fubm90IGJlIHVzZWQgb24gdi1mb3Igb3Igdi1zbG90IHNjb3BlIHZhcmlhYmxlcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCB3cml0YWJsZS5gLFxuICBbNDRdOiBgdi1tb2RlbCBjYW5ub3QgYmUgdXNlZCBvbiBhIHByb3AsIGJlY2F1c2UgbG9jYWwgcHJvcCBiaW5kaW5ncyBhcmUgbm90IHdyaXRhYmxlLlxuVXNlIGEgdi1iaW5kIGJpbmRpbmcgY29tYmluZWQgd2l0aCBhIHYtb24gbGlzdGVuZXIgdGhhdCBlbWl0cyB1cGRhdGU6eCBldmVudCBpbnN0ZWFkLmAsXG4gIFs0NV06IGBFcnJvciBwYXJzaW5nIEphdmFTY3JpcHQgZXhwcmVzc2lvbjogYCxcbiAgWzQ2XTogYDxLZWVwQWxpdmU+IGV4cGVjdHMgZXhhY3RseSBvbmUgY2hpbGQgY29tcG9uZW50LmAsXG4gIFs1MV06IGBAdm5vZGUtKiBob29rcyBpbiB0ZW1wbGF0ZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSB0aGUgdnVlOiBwcmVmaXggaW5zdGVhZC4gRm9yIGV4YW1wbGUsIEB2bm9kZS1tb3VudGVkIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEB2dWU6bW91bnRlZC4gQHZub2RlLSogaG9va3Mgc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGluIDMuNC5gLFxuICAvLyBnZW5lcmljIGVycm9yc1xuICBbNDddOiBgXCJwcmVmaXhJZGVudGlmaWVyc1wiIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgY29tcGlsZXIuYCxcbiAgWzQ4XTogYEVTIG1vZHVsZSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBjb21waWxlci5gLFxuICBbNDldOiBgXCJjYWNoZUhhbmRsZXJzXCIgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdGhlIFwicHJlZml4SWRlbnRpZmllcnNcIiBvcHRpb24gaXMgZW5hYmxlZC5gLFxuICBbNTBdOiBgXCJzY29wZUlkXCIgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIG1vZHVsZSBtb2RlLmAsXG4gIC8vIGp1c3QgdG8gZnVsZmlsbCB0eXBlc1xuICBbNTNdOiBgYFxufTtcblxuZnVuY3Rpb24gd2Fsa0lkZW50aWZpZXJzKHJvb3QsIG9uSWRlbnRpZmllciwgaW5jbHVkZUFsbCA9IGZhbHNlLCBwYXJlbnRTdGFjayA9IFtdLCBrbm93bklkcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSB7XG4gIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIGlzUmVmZXJlbmNlZElkZW50aWZpZXIoaWQsIHBhcmVudCwgcGFyZW50U3RhY2spIHtcbiAge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNJbkRlc3RydWN0dXJlQXNzaWdubWVudChwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gIGlmIChwYXJlbnQgJiYgKHBhcmVudC50eXBlID09PSBcIk9iamVjdFByb3BlcnR5XCIgfHwgcGFyZW50LnR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIpKSB7XG4gICAgbGV0IGkgPSBwYXJlbnRTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcCA9IHBhcmVudFN0YWNrW2ldO1xuICAgICAgaWYgKHAudHlwZSA9PT0gXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwLnR5cGUgIT09IFwiT2JqZWN0UHJvcGVydHlcIiAmJiAhcC50eXBlLmVuZHNXaXRoKFwiUGF0dGVyblwiKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNJbk5ld0V4cHJlc3Npb24ocGFyZW50U3RhY2spIHtcbiAgbGV0IGkgPSBwYXJlbnRTdGFjay5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBjb25zdCBwID0gcGFyZW50U3RhY2tbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocC50eXBlICE9PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHdhbGtGdW5jdGlvblBhcmFtcyhub2RlLCBvbklkZW50KSB7XG4gIGZvciAoY29uc3QgcCBvZiBub2RlLnBhcmFtcykge1xuICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKHApKSB7XG4gICAgICBvbklkZW50KGlkKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHdhbGtCbG9ja0RlY2xhcmF0aW9ucyhibG9jaywgb25JZGVudCkge1xuICBmb3IgKGNvbnN0IHN0bXQgb2YgYmxvY2suYm9keSkge1xuICAgIGlmIChzdG10LnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICBpZiAoc3RtdC5kZWNsYXJlKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgZGVjbCBvZiBzdG10LmRlY2xhcmF0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGV4dHJhY3RJZGVudGlmaWVycyhkZWNsLmlkKSkge1xuICAgICAgICAgIG9uSWRlbnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdG10LnR5cGUgPT09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiIHx8IHN0bXQudHlwZSA9PT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGlmIChzdG10LmRlY2xhcmUgfHwgIXN0bXQuaWQpIGNvbnRpbnVlO1xuICAgICAgb25JZGVudChzdG10LmlkKTtcbiAgICB9IGVsc2UgaWYgKHN0bXQudHlwZSA9PT0gXCJGb3JPZlN0YXRlbWVudFwiIHx8IHN0bXQudHlwZSA9PT0gXCJGb3JJblN0YXRlbWVudFwiIHx8IHN0bXQudHlwZSA9PT0gXCJGb3JTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgdmFyaWFibGUgPSBzdG10LnR5cGUgPT09IFwiRm9yU3RhdGVtZW50XCIgPyBzdG10LmluaXQgOiBzdG10LmxlZnQ7XG4gICAgICBpZiAodmFyaWFibGUgJiYgdmFyaWFibGUudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIHZhcmlhYmxlLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZXh0cmFjdElkZW50aWZpZXJzKGRlY2wuaWQpKSB7XG4gICAgICAgICAgICBvbklkZW50KGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGV4dHJhY3RJZGVudGlmaWVycyhwYXJhbSwgbm9kZXMgPSBbXSkge1xuICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgbm9kZXMucHVzaChwYXJhbSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgbGV0IG9iamVjdCA9IHBhcmFtO1xuICAgICAgd2hpbGUgKG9iamVjdC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgICBvYmplY3QgPSBvYmplY3Qub2JqZWN0O1xuICAgICAgfVxuICAgICAgbm9kZXMucHVzaChvYmplY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwYXJhbS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIikge1xuICAgICAgICAgIGV4dHJhY3RJZGVudGlmaWVycyhwcm9wLmFyZ3VtZW50LCBub2Rlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHByb3AudmFsdWUsIG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgICAgcGFyYW0uZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCkgZXh0cmFjdElkZW50aWZpZXJzKGVsZW1lbnQsIG5vZGVzKTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICBleHRyYWN0SWRlbnRpZmllcnMocGFyYW0uYXJndW1lbnQsIG5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHBhcmFtLmxlZnQsIG5vZGVzKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cbmNvbnN0IGlzRnVuY3Rpb25UeXBlID0gKG5vZGUpID0+IHtcbiAgcmV0dXJuIC9GdW5jdGlvbig/OkV4cHJlc3Npb258RGVjbGFyYXRpb24pJHxNZXRob2QkLy50ZXN0KG5vZGUudHlwZSk7XG59O1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eSA9IChub2RlKSA9PiBub2RlICYmIChub2RlLnR5cGUgPT09IFwiT2JqZWN0UHJvcGVydHlcIiB8fCBub2RlLnR5cGUgPT09IFwiT2JqZWN0TWV0aG9kXCIpICYmICFub2RlLmNvbXB1dGVkO1xuY29uc3QgaXNTdGF0aWNQcm9wZXJ0eUtleSA9IChub2RlLCBwYXJlbnQpID0+IGlzU3RhdGljUHJvcGVydHkocGFyZW50KSAmJiBwYXJlbnQua2V5ID09PSBub2RlO1xuY29uc3QgVFNfTk9ERV9UWVBFUyA9IFtcbiAgXCJUU0FzRXhwcmVzc2lvblwiLFxuICAvLyBmb28gYXMgbnVtYmVyXG4gIFwiVFNUeXBlQXNzZXJ0aW9uXCIsXG4gIC8vICg8bnVtYmVyPmZvbylcbiAgXCJUU05vbk51bGxFeHByZXNzaW9uXCIsXG4gIC8vIGZvbyFcbiAgXCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uXCIsXG4gIC8vIGZvbzxzdHJpbmc+XG4gIFwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uXCJcbiAgLy8gZm9vIHNhdGlzZmllcyBUXG5dO1xuZnVuY3Rpb24gdW53cmFwVFNOb2RlKG5vZGUpIHtcbiAgaWYgKFRTX05PREVfVFlQRVMuaW5jbHVkZXMobm9kZS50eXBlKSkge1xuICAgIHJldHVybiB1bndyYXBUU05vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuXG5jb25zdCBpc1N0YXRpY0V4cCA9IChwKSA9PiBwLnR5cGUgPT09IDQgJiYgcC5pc1N0YXRpYztcbmZ1bmN0aW9uIGlzQ29yZUNvbXBvbmVudCh0YWcpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIFwiVGVsZXBvcnRcIjpcbiAgICBjYXNlIFwidGVsZXBvcnRcIjpcbiAgICAgIHJldHVybiBURUxFUE9SVDtcbiAgICBjYXNlIFwiU3VzcGVuc2VcIjpcbiAgICBjYXNlIFwic3VzcGVuc2VcIjpcbiAgICAgIHJldHVybiBTVVNQRU5TRTtcbiAgICBjYXNlIFwiS2VlcEFsaXZlXCI6XG4gICAgY2FzZSBcImtlZXAtYWxpdmVcIjpcbiAgICAgIHJldHVybiBLRUVQX0FMSVZFO1xuICAgIGNhc2UgXCJCYXNlVHJhbnNpdGlvblwiOlxuICAgIGNhc2UgXCJiYXNlLXRyYW5zaXRpb25cIjpcbiAgICAgIHJldHVybiBCQVNFX1RSQU5TSVRJT047XG4gIH1cbn1cbmNvbnN0IG5vbklkZW50aWZpZXJSRSA9IC9eXFxkfFteXFwkXFx3XFx4QTAtXFx1RkZGRl0vO1xuY29uc3QgaXNTaW1wbGVJZGVudGlmaWVyID0gKG5hbWUpID0+ICFub25JZGVudGlmaWVyUkUudGVzdChuYW1lKTtcbmNvbnN0IHZhbGlkRmlyc3RJZGVudENoYXJSRSA9IC9bQS1aYS16XyRcXHhBMC1cXHVGRkZGXS87XG5jb25zdCB2YWxpZElkZW50Q2hhclJFID0gL1tcXC5cXD9cXHckXFx4QTAtXFx1RkZGRl0vO1xuY29uc3Qgd2hpdGVzcGFjZVJFID0gL1xccytbLltdXFxzKnxcXHMqWy5bXVxccysvZztcbmNvbnN0IGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXIgPSAocGF0aCkgPT4ge1xuICBwYXRoID0gcGF0aC50cmltKCkucmVwbGFjZSh3aGl0ZXNwYWNlUkUsIChzKSA9PiBzLnRyaW0oKSk7XG4gIGxldCBzdGF0ZSA9IDAgLyogaW5NZW1iZXJFeHAgKi87XG4gIGxldCBzdGF0ZVN0YWNrID0gW107XG4gIGxldCBjdXJyZW50T3BlbkJyYWNrZXRDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50T3BlblBhcmVuc0NvdW50ID0gMDtcbiAgbGV0IGN1cnJlbnRTdHJpbmdUeXBlID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHBhdGguY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgMCAvKiBpbk1lbWJlckV4cCAqLzpcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDEgLyogaW5CcmFja2V0cyAqLztcbiAgICAgICAgICBjdXJyZW50T3BlbkJyYWNrZXRDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDIgLyogaW5QYXJlbnMgKi87XG4gICAgICAgICAgY3VycmVudE9wZW5QYXJlbnNDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKCEoaSA9PT0gMCA/IHZhbGlkRmlyc3RJZGVudENoYXJSRSA6IHZhbGlkSWRlbnRDaGFyUkUpLnRlc3QoY2hhcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgI
20578H1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEgLyogaW5CcmFja2V0cyAqLzpcbiAgICAgICAgaWYgKGNoYXIgPT09IGAnYCB8fCBjaGFyID09PSBgXCJgIHx8IGNoYXIgPT09IFwiYFwiKSB7XG4gICAgICAgICAgc3RhdGVTdGFjay5wdXNoKHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZSA9IDMgLyogaW5TdHJpbmcgKi87XG4gICAgICAgICAgY3VycmVudFN0cmluZ1R5cGUgPSBjaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IGBbYCkge1xuICAgICAgICAgIGN1cnJlbnRPcGVuQnJhY2tldENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gYF1gKSB7XG4gICAgICAgICAgaWYgKCEtLWN1cnJlbnRPcGVuQnJhY2tldENvdW50KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHN0YXRlU3RhY2sucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyIC8qIGluUGFyZW5zICovOlxuICAgICAgICBpZiAoY2hhciA9PT0gYCdgIHx8IGNoYXIgPT09IGBcImAgfHwgY2hhciA9PT0gXCJgXCIpIHtcbiAgICAgICAgICBzdGF0ZVN0YWNrLnB1c2goc3RhdGUpO1xuICAgICAgICAgIHN0YXRlID0gMyAvKiBpblN0cmluZyAqLztcbiAgICAgICAgICBjdXJyZW50U3RyaW5nVHlwZSA9IGNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gYChgKSB7XG4gICAgICAgICAgY3VycmVudE9wZW5QYXJlbnNDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IGApYCkge1xuICAgICAgICAgIGlmIChpID09PSBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEtLWN1cnJlbnRPcGVuUGFyZW5zQ291bnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMgLyogaW5TdHJpbmcgKi86XG4gICAgICAgIGlmIChjaGFyID09PSBjdXJyZW50U3RyaW5nVHlwZSkge1xuICAgICAgICAgIHN0YXRlID0gc3RhdGVTdGFjay5wb3AoKTtcbiAgICAgICAgICBjdXJyZW50U3RyaW5nVHlwZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAhY3VycmVudE9wZW5CcmFja2V0Q291bnQgJiYgIWN1cnJlbnRPcGVuUGFyZW5zQ291bnQ7XG59O1xuY29uc3QgaXNNZW1iZXJFeHByZXNzaW9uTm9kZSA9IE5PT1AgO1xuY29uc3QgaXNNZW1iZXJFeHByZXNzaW9uID0gaXNNZW1iZXJFeHByZXNzaW9uQnJvd3NlciA7XG5mdW5jdGlvbiBhZHZhbmNlUG9zaXRpb25XaXRoQ2xvbmUocG9zLCBzb3VyY2UsIG51bWJlck9mQ2hhcmFjdGVycyA9IHNvdXJjZS5sZW5ndGgpIHtcbiAgcmV0dXJuIGFkdmFuY2VQb3NpdGlvbldpdGhNdXRhdGlvbihcbiAgICB7XG4gICAgICBvZmZzZXQ6IHBvcy5vZmZzZXQsXG4gICAgICBsaW5lOiBwb3MubGluZSxcbiAgICAgIGNvbHVtbjogcG9zLmNvbHVtblxuICAgIH0sXG4gICAgc291cmNlLFxuICAgIG51bWJlck9mQ2hhcmFjdGVyc1xuICApO1xufVxuZnVuY3Rpb24gYWR2YW5jZVBvc2l0aW9uV2l0aE11dGF0aW9uKHBvcywgc291cmNlLCBudW1iZXJPZkNoYXJhY3RlcnMgPSBzb3VyY2UubGVuZ3RoKSB7XG4gIGxldCBsaW5lc0NvdW50ID0gMDtcbiAgbGV0IGxhc3ROZXdMaW5lUG9zID0gLTE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaGFyYWN0ZXJzOyBpKyspIHtcbiAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaSkgPT09IDEwKSB7XG4gICAgICBsaW5lc0NvdW50Kys7XG4gICAgICBsYXN0TmV3TGluZVBvcyA9IGk7XG4gICAgfVxuICB9XG4gIHBvcy5vZmZzZXQgKz0gbnVtYmVyT2ZDaGFyYWN0ZXJzO1xuICBwb3MubGluZSArPSBsaW5lc0NvdW50O1xuICBwb3MuY29sdW1uID0gbGFzdE5ld0xpbmVQb3MgPT09IC0xID8gcG9zLmNvbHVtbiArIG51bWJlck9mQ2hhcmFjdGVycyA6IG51bWJlck9mQ2hhcmFjdGVycyAtIGxhc3ROZXdMaW5lUG9zO1xuICByZXR1cm4gcG9zO1xufVxuZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbXNnKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCBgdW5leHBlY3RlZCBjb21waWxlciBjb25kaXRpb25gKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluZERpcihub2RlLCBuYW1lLCBhbGxvd0VtcHR5ID0gZmFsc2UpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gNyAmJiAoYWxsb3dFbXB0eSB8fCBwLmV4cCkgJiYgKGlzU3RyaW5nKG5hbWUpID8gcC5uYW1lID09PSBuYW1lIDogbmFtZS50ZXN0KHAubmFtZSkpKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRQcm9wKG5vZGUsIG5hbWUsIGR5bmFtaWNPbmx5ID0gZmFsc2UsIGFsbG93RW1wdHkgPSBmYWxzZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICBpZiAocC50eXBlID09PSA2KSB7XG4gICAgICBpZiAoZHluYW1pY09ubHkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHAubmFtZSA9PT0gbmFtZSAmJiAocC52YWx1ZSB8fCBhbGxvd0VtcHR5KSkge1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHAubmFtZSA9PT0gXCJiaW5kXCIgJiYgKHAuZXhwIHx8IGFsbG93RW1wdHkpICYmIGlzU3RhdGljQXJnT2YocC5hcmcsIG5hbWUpKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGljQXJnT2YoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAhIShhcmcgJiYgaXNTdGF0aWNFeHAoYXJnKSAmJiBhcmcuY29udGVudCA9PT0gbmFtZSk7XG59XG5mdW5jdGlvbiBoYXNEeW5hbWljS2V5VkJpbmQobm9kZSkge1xuICByZXR1cm4gbm9kZS5wcm9wcy5zb21lKFxuICAgIChwKSA9PiBwLnR5cGUgPT09IDcgJiYgcC5uYW1lID09PSBcImJpbmRcIiAmJiAoIXAuYXJnIHx8IC8vIHYtYmluZD1cIm9ialwiXG4gICAgcC5hcmcudHlwZSAhPT0gNCB8fCAvLyB2LWJpbmQ6W19jdHguZm9vXVxuICAgICFwLmFyZy5pc1N0YXRpYylcbiAgICAvLyB2LWJpbmQ6W2Zvb11cbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVGV4dCQxKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gNSB8fCBub2RlLnR5cGUgPT09IDI7XG59XG5mdW5jdGlvbiBpc1ZTbG90KHApIHtcbiAgcmV0dXJuIHAudHlwZSA9PT0gNyAmJiBwLm5hbWUgPT09IFwic2xvdFwiO1xufVxuZnVuY3Rpb24gaXNUZW1wbGF0ZU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAxICYmIG5vZGUudGFnVHlwZSA9PT0gMztcbn1cbmZ1bmN0aW9uIGlzU2xvdE91dGxldChub2RlKSB7XG4gIHJldHVybi
20578Bub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAyO1xufVxuY29uc3QgcHJvcHNIZWxwZXJTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbTk9STUFMSVpFX1BST1BTLCBHVUFSRF9SRUFDVElWRV9QUk9QU10pO1xuZnVuY3Rpb24gZ2V0VW5ub3JtYWxpemVkUHJvcHMocHJvcHMsIGNhbGxQYXRoID0gW10pIHtcbiAgaWYgKHByb3BzICYmICFpc1N0cmluZyhwcm9wcykgJiYgcHJvcHMudHlwZSA9PT0gMTQpIHtcbiAgICBjb25zdCBjYWxsZWUgPSBwcm9wcy5jYWxsZWU7XG4gICAgaWYgKCFpc1N0cmluZyhjYWxsZWUpICYmIHByb3BzSGVscGVyU2V0LmhhcyhjYWxsZWUpKSB7XG4gICAgICByZXR1cm4gZ2V0VW5ub3JtYWxpemVkUHJvcHMoXG4gICAgICAgIHByb3BzLmFyZ3VtZW50c1swXSxcbiAgICAgICAgY2FsbFBhdGguY29uY2F0KHByb3BzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtwcm9wcywgY2FsbFBhdGhdO1xufVxuZnVuY3Rpb24gaW5qZWN0UHJvcChub2RlLCBwcm9wLCBjb250ZXh0KSB7XG4gIGxldCBwcm9wc1dpdGhJbmplY3Rpb247XG4gIGxldCBwcm9wcyA9IG5vZGUudHlwZSA9PT0gMTMgPyBub2RlLnByb3BzIDogbm9kZS5hcmd1bWVudHNbMl07XG4gIGxldCBjYWxsUGF0aCA9IFtdO1xuICBsZXQgcGFyZW50Q2FsbDtcbiAgaWYgKHByb3BzICYmICFpc1N0cmluZyhwcm9wcykgJiYgcHJvcHMudHlwZSA9PT0gMTQpIHtcbiAgICBjb25zdCByZXQgPSBnZXRVbm5vcm1hbGl6ZWRQcm9wcyhwcm9wcyk7XG4gICAgcHJvcHMgPSByZXRbMF07XG4gICAgY2FsbFBhdGggPSByZXRbMV07XG4gICAgcGFyZW50Q2FsbCA9IGNhbGxQYXRoW2NhbGxQYXRoLmxlbmd0aCAtIDFdO1xuICB9XG4gIGlmIChwcm9wcyA9PSBudWxsIHx8IGlzU3RyaW5nKHByb3BzKSkge1xuICAgIHByb3BzV2l0aEluamVjdGlvbiA9IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW3Byb3BdKTtcbiAgfSBlbHNlIGlmIChwcm9wcy50eXBlID09PSAxNCkge1xuICAgIGNvbnN0IGZpcnN0ID0gcHJvcHMuYXJndW1lbnRzWzBdO1xuICAgIGlmICghaXNTdHJpbmcoZmlyc3QpICYmIGZpcnN0LnR5cGUgPT09IDE1KSB7XG4gICAgICBpZiAoIWhhc1Byb3AocHJvcCwgZmlyc3QpKSB7XG4gICAgICAgIGZpcnN0LnByb3BlcnRpZXMudW5zaGlmdChwcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLmNhbGxlZSA9PT0gVE9fSEFORExFUlMpIHtcbiAgICAgICAgcHJvcHNXaXRoSW5qZWN0aW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoTUVSR0VfUFJPUFMpLCBbXG4gICAgICAgICAgY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihbcHJvcF0pLFxuICAgICAgICAgIHByb3BzXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMuYXJndW1lbnRzLnVuc2hpZnQoY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihbcHJvcF0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgIXByb3BzV2l0aEluamVjdGlvbiAmJiAocHJvcHNXaXRoSW5qZWN0aW9uID0gcHJvcHMpO1xuICB9IGVsc2UgaWYgKHByb3BzLnR5cGUgPT09IDE1KSB7XG4gICAgaWYgKCFoYXN
20578Qcm9wKHByb3AsIHByb3BzKSkge1xuICAgICAgcHJvcHMucHJvcGVydGllcy51bnNoaWZ0KHByb3ApO1xuICAgIH1cbiAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBwcm9wcztcbiAgfSBlbHNlIHtcbiAgICBwcm9wc1dpdGhJbmplY3Rpb24gPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihNRVJHRV9QUk9QUyksIFtcbiAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW3Byb3BdKSxcbiAgICAgIHByb3BzXG4gICAgXSk7XG4gICAgaWYgKHBhcmVudENhbGwgJiYgcGFyZW50Q2FsbC5jYWxsZWUgPT09IEdVQVJEX1JFQUNUSVZFX1BST1BTKSB7XG4gICAgICBwYXJlbnRDYWxsID0gY2FsbFBhdGhbY2FsbFBhdGgubGVuZ3RoIC0gMl07XG4gICAgfVxuICB9XG4gIGlmIChub2RlLnR5cGUgPT09IDEzKSB7XG4gICAgaWYgKHBhcmVudENhbGwpIHtcbiAgICAgIHBhcmVudENhbGwuYXJndW1lbnRzWzBdID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BzID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyZW50Q2FsbCkge1xuICAgICAgcGFyZW50Q2FsbC5hcmd1bWVudHNbMF0gPSBwcm9wc1dpdGhJbmplY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuYXJndW1lbnRzWzJdID0gcHJvcHNXaXRoSW5qZWN0aW9uO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaGFzUHJvcChwcm9wLCBwcm9wcykge1xuICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gIGlmIChwcm9wLmtleS50eXBlID09PSA0KSB7XG4gICAgY29uc3QgcHJvcEtleU5hbWUgPSBwcm9wLmtleS5jb250ZW50O1xuICAgIHJlc3VsdCA9IHByb3BzLnByb3BlcnRpZXMuc29tZShcbiAgICAgIChwKSA9PiBwLmtleS50eXBlID09PSA0ICYmIHAua2V5LmNvbnRlbnQgPT09IHByb3BLZXlOYW1lXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9WYWxpZEFzc2V0SWQobmFtZSwgdHlwZSkge1xuICByZXR1cm4gYF8ke3R5cGV9XyR7bmFtZS5yZXBsYWNlKC9bXlxcd10vZywgKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpID0+IHtcbiAgICByZXR1cm4gc2VhcmNoVmFsdWUgPT09IFwiLVwiID8gXCJfXCIgOiBuYW1lLmNoYXJDb2RlQXQocmVwbGFjZVZhbHVlKS50b1N0cmluZygpO1xuICB9KX1gO1xufVxuZnVuY3Rpb24gaGFzU2NvcGVSZWYobm9kZSwgaWRzKSB7XG4gIGlmICghbm9kZSB8fCBPYmplY3Qua2V5cyhpZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAmJiAoaGFzU2NvcGVSZWYocC5hcmcsIGlkcykgfHwgaGFzU2NvcGVSZWYocC5leHAsIGlkcykpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLnNvbWUoKGMpID0+IGhhc1Njb3BlUmVmKGMsIGlkcykpO1xuICAgIGNhc2UgMTE6XG4gICAgICBpZiAoaGFzU2NvcGVSZWYobm9kZS5zb3VyY2UsIGlkcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5zb21lKChjKSA9PiBoYXNTY29wZVJlZihjLCBpZHMpKTtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gbm9kZS5icmFuY2hlcy5zb21lKChiKSA9PiBoYXNTY29wZVJlZihiLCBpZHMpKTtcbiAgICBjYXNlIDEwOlxuICAgICAgaWYgKGhhc1Njb3BlUmVmKG5vZGUuY29uZGl0aW9uLCBpZHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uc29tZSgoYykgPT4gaGFzU2NvcGVSZWYoYywgaWRzKSk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuICFub2RlLmlzU3RhdGljICYmIGlzU2ltcGxlSWRlbnRpZmllcihub2RlLmNvbnRlbnQpICYmICEhaWRzW25vZGUuY29udGVudF07XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4uc29tZSgoYykgPT4gaXNPYmplY3QoYykgJiYgaGFzU2NvcGVSZWYoYywgaWRzKSk7XG4gICAgY2FzZSA1OlxuICAgIGNhc2UgMTI6XG4gICAgICByZXR1cm4gaGFzU2NvcGVSZWYobm9kZS5jb250ZW50LCBpZHMpO1xuICAgIGNhc2UgMjpcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSA7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE1lbW9lZFZOb2RlQ2FsbChub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDE0ICYmIG5vZGUuY2FsbGVlID09PSBXSVRIX01FTU8pIHtcbiAgICByZXR1cm4gbm9kZS5hcmd1bWVudHNbMV0ucmV0dXJucztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuY29uc3QgZm9yQWxpYXNSRSA9IC8oW1xcc1xcU10qPylcXHMrKD86aW58b2YpXFxzKyhcXFNbXFxzXFxTXSopLztcblxuY29uc3QgZGVmYXVsdFBhcnNlck9wdGlvbnMgPSB7XG4gIHBhcnNlTW9kZTogXCJiYXNlXCIsXG4gIG5zOiAwLFxuICBkZWxpbWl0ZXJzOiBbYHt7YCwgYH19YF0sXG4gIGdldE5hbWVzcGFjZTogKCkgPT4gMCxcbiAgaXNWb2lkVGFnOiBOTyxcbiAgaXNQcmVUYWc6IE5PLFxuICBpc0N1c3RvbUVsZW1lbnQ6IE5PLFxuICBvbkVycm9yOiBkZWZhdWx0T25FcnJvcixcbiAgb25XYXJuOiBkZWZhdWx0T25XYXJuLFxuICBjb21tZW50czogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSxcbiAgcHJlZml4SWRlbnRpZmllcnM6IGZhbHNlXG59O1xubGV0IGN1cnJlbnRPcHRpb25zID0gZGVmYXVsdFBhcnNlck9wdGlvbnM7XG5sZXQgY3VycmVudFJvb3QgPSBudWxsO1xubGV0IGN1cnJlbnRJbnB1dCA9IFwiXCI7XG5sZXQgY3VycmVudE9wZW5UYWcgPSBudWxsO1xubGV0IGN1cnJlbnRQcm9wID0gbnVsbDtcbmxldCBjdXJyZW50QXR0clZhbHVlID0gXCJcIjtcbmxldCBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSAtMTtcbmxldCBjdXJyZW50QXR0ckVuZEluZGV4ID0gLTE7XG5sZXQgaW5QcmUgPSAwO1xubGV0IGluVlByZSA9IGZhbHNlO1xubGV0IGN1cnJlbnRWUHJlQm91bmRhcnkgPSBudWxsO1xuY29uc3Qgc3RhY2sgPSBbXTtcbmNvbnN0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RhY2ssIHtcbiAgb25lcnI6IGVtaXRFcnJvcixcbiAgb250ZXh0KHN0YXJ0LCBlbmQpIHtcbiAgICBvblRleHQoZ2V0U2xpY2Uoc3RhcnQsIGVuZCksIHN0YXJ0LCBlbmQpO1xuICB9LFxuICBvbnRleHRlbnRpdHkoY2hhciwgc3RhcnQsIGVuZCkge1xuICAgIG9uVGV4dChjaGFyLCBzdGFydCwgZW5kKTtcbiAgfSxcbiAgb25pbnRlcnBvbGF0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoaW5WUHJlKSB7XG4gICAgICByZXR1cm4gb25UZXh0KGdldFNsaWNlKHN0YXJ0LCBlbmQpLCBzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgbGV0IGlubmVyU3RhcnQgPSBzdGFydCArIHRva2VuaXplci5kZWxpbWl0ZXJPcGVuLmxlbmd0aDtcbiAgICBsZXQgaW5uZXJFbmQgPSBlbmQgLSB0b2tlbml6ZXIuZGVsaW1pdGVyQ2xvc2UubGVuZ3RoO1xuICAgIHdoaWxlIChpc1doaXRlc3BhY2UoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaW5uZXJTdGFydCkpKSB7XG4gICAgICBpbm5lclN0YXJ0Kys7XG4gICAgfVxuICAgIHdoaWxlIChpc1doaXRlc3BhY2UoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaW5uZXJFbmQgLSAxKSkpIHtcbiAgICAgIGlubmVyRW5kLS07XG4gICAgfVxuICAgIGxldCBleHAgPSBnZXRTbGljZShpbm5lclN0YXJ0LCBpbm5lckVuZCk7XG4gICAgaWYgKGV4cC5pbmNsdWRlcyhcIiZcIikpIHtcbiAgICAgIHtcbiAgICAgICAgZXhwID0gY3VycmVudE9wdGlvbnMuZGVjb2RlRW50aXRpZXMoZXhwLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZE5vZGUoe1xuICAgICAgdHlwZTogNSxcbiAgICAgIGNvbnRlbnQ6IGNyZWF0ZUV4cChleHAsIGZhbHNlLCBnZXRMb2MoaW5uZXJTdGFydCwgaW5uZXJFbmQpKSxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpXG4gICAgfSk7XG4gIH0sXG4gIG9ub3BlbnRhZ25hbWUoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IG5hbW
20578UgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBjdXJyZW50T3BlblRhZyA9IHtcbiAgICAgIHR5cGU6IDEsXG4gICAgICB0YWc6IG5hbWUsXG4gICAgICBuczogY3VycmVudE9wdGlvbnMuZ2V0TmFtZXNwYWNlKG5hbWUsIHN0YWNrWzBdLCBjdXJyZW50T3B0aW9ucy5ucyksXG4gICAgICB0YWdUeXBlOiAwLFxuICAgICAgLy8gd2lsbCBiZSByZWZpbmVkIG9uIHRhZyBjbG9zZVxuICAgICAgcHJvcHM6IFtdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgbG9jOiBnZXRMb2Moc3RhcnQgLSAxLCBlbmQpLFxuICAgICAgY29kZWdlbk5vZGU6IHZvaWQgMFxuICAgIH07XG4gIH0sXG4gIG9ub3BlbnRhZ2VuZChlbmQpIHtcbiAgICBlbmRPcGVuVGFnKGVuZCk7XG4gIH0sXG4gIG9uY2xvc2V0YWcoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IG5hbWUgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoIWN1cnJlbnRPcHRpb25zLmlzVm9pZFRhZyhuYW1lKSkge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGUgPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGVtaXRFcnJvcigyNCwgc3RhY2tbMF0ubG9jLnN0YXJ0Lm9mZnNldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgb25DbG9zZVRhZyhlbCwgZW5kLCBqIDwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGVtaXRFcnJvcigyMywgYmFja1RyYWNrKHN0YXJ0LCA2MCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgb25zZWxmY2xvc2luZ3RhZyhlbmQpIHtcbiAgICBjb25zdCBuYW1lID0gY3VycmVudE9wZW5UYWcudGFnO1xuICAgIGN1cnJlbnRPcGVuVGFnLmlzU2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgIGVuZE9wZW5UYWcoZW5kKTtcbiAgICBpZiAoc3RhY2tbMF0gJiYgc3RhY2tbMF0udGFnID09PSBuYW1lKSB7XG4gICAgICBvbkNsb3NlVGFnKHN0YWNrLnNoaWZ0KCksIGVuZCk7XG4gICAgfVxuICB9LFxuICBvbmF0dHJpYm5hbWUoc3RhcnQsIGVuZCkge1xuICAgIGN1cnJlbnRQcm9wID0ge1xuICAgICAgdHlwZTogNixcbiAgICAgIG5hbWU6IGdldFNsaWNlKHN0YXJ0LCBlbmQpLFxuICAgICAgbmFtZUxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgIH07XG4gIH0sXG4gIG9uZGlybmFtZShzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgcmF3ID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgY29uc3QgbmFtZSA9IHJhdyA9PT0gXCIuXCIgfHwgcmF3ID09PSBcIjpcIiA/IFwiYmluZFwiIDogcmF3ID09PSBcIkBcIiA/IFwib25cIiA6IHJhdyA9PT0gXCIjXCIgPyBcInNsb3RcIiA6IHJhdy5zbGljZSgyKTtcbiAgICBpZiAoIWluVlByZSAmJiBuYW1lID09PSBcIlwiKSB7XG4gICAgICBlbWl0RXJyb3IoMjYsIHN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGluVlByZSB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICBjdXJyZW50UHJvcCA9IHtcbiAgICAgICAgdHlwZTogNixcbiAgICAgICAgbmFtZTogcmF3LFxuICAgICAgICBuYW1lTG9jOiBnZXRMb2Moc3RhcnQsIGVuZCksXG4gICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudFByb3AgPSB7XG4gICAgICAgIHR5cGU6IDcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJhd05hbWU6IHJhdyxcbiAgICAgICAgZXhwOiB2b2lkIDAsXG4gICAgICAgIGFyZzogdm9pZCAwLFxuICAgICAgICBtb2RpZmllcnM6IHJhdyA9PT0gXCIuXCIgPyBbXCJwcm9wXCJdIDogW10sXG4gICAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0KVxuICAgICAgfTtcbiAgICAgIGlmIChuYW1lID09PSBcInByZVwiKSB7XG4gICAgICAgIGluVlByZSA9IHRva2VuaXplci5pblZQcmUgPSB0cnVlO1xuICAgICAgICBjdXJyZW50VlByZUJvdW5kYXJ5ID0gY3VycmVudE9wZW5UYWc7XG4gICAgICAgIGNvbnN0IHByb3BzID0gY3VycmVudE9wZW5UYWcucHJvcHM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAocHJvcHNbaV0udHlwZSA9PT0gNykge1xuICAgICAgICAgICAgcHJvcHNbaV0gPSBkaXJUb0F0dHIocHJvcHNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgb25kaXJhcmcoc3RhcnQsIGVuZCkge1xuICAgIGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm47XG4gICAgY29uc3QgYXJnID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKGluVlByZSkge1xuICAgICAgY3VycmVudFByb3AubmFtZSArPSBhcmc7XG4gICAgICBzZXRMb2NFbmQoY3VycmVudFByb3AubmFtZUxvYywgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNTdGF0aWMgPSBhcmdbMF0gIT09IGBbYDtcbiAgICAgIGN1cnJlbnRQcm9wLmFyZyA9IGNyZWF0ZUV4cChcbiAgICAgICAgaXNTdGF0aWMgPyBhcmcgOiBhcmcuc2xpY2UoMSwgLTEpLFxuICAgICAgICBpc1N0YXRpYyxcbiAgICAgICAgZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgICBpc1N0YXRpYyA/IDMgOiAwXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgb25kaXJtb2RpZmllcihzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgbW9kID0gZ2V0U2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKGluVlByZSkge1xuICAgICAgY3VycmVudFByb3AubmFtZSArPSBcIi5cIiArIG1vZDtcbiAgICAgIHNldExvY0VuZChjdXJyZW50UHJvcC5uYW1lTG9jLCBlbmQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3AubmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGN1cnJlbnRQcm9wLmFyZztcbiAgICAgIGlmIChhcmcpIHtcbiAgICAgICAgYXJnLmNvbnRlbnQgKz0gXCIuXCIgKyBtb2Q7XG4gICAgICAgI
20578HNldExvY0VuZChhcmcubG9jLCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50UHJvcC5tb2RpZmllcnMucHVzaChtb2QpO1xuICAgIH1cbiAgfSxcbiAgb25hdHRyaWJkYXRhKHN0YXJ0LCBlbmQpIHtcbiAgICBjdXJyZW50QXR0clZhbHVlICs9IGdldFNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIGlmIChjdXJyZW50QXR0clN0YXJ0SW5kZXggPCAwKSBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSBzdGFydDtcbiAgICBjdXJyZW50QXR0ckVuZEluZGV4ID0gZW5kO1xuICB9LFxuICBvbmF0dHJpYmVudGl0eShjaGFyLCBzdGFydCwgZW5kKSB7XG4gICAgY3VycmVudEF0dHJWYWx1ZSArPSBjaGFyO1xuICAgIGlmIChjdXJyZW50QXR0clN0YXJ0SW5kZXggPCAwKSBjdXJyZW50QXR0clN0YXJ0SW5kZXggPSBzdGFydDtcbiAgICBjdXJyZW50QXR0ckVuZEluZGV4ID0gZW5kO1xuICB9LFxuICBvbmF0dHJpYm5hbWVlbmQoZW5kKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50UHJvcC5sb2Muc3RhcnQub2Zmc2V0O1xuICAgIGNvbnN0IG5hbWUgPSBnZXRTbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoY3VycmVudFByb3AudHlwZSA9PT0gNykge1xuICAgICAgY3VycmVudFByb3AucmF3TmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50T3BlblRhZy5wcm9wcy5zb21lKFxuICAgICAgKHApID0+IChwLnR5cGUgPT09IDcgPyBwLnJhd05hbWUgOiBwLm5hbWUpID09PSBuYW1lXG4gICAgKSkge1xuICAgICAgZW1pdEVycm9yKDIsIHN0YXJ0KTtcbiAgICB9XG4gIH0sXG4gIG9uYXR0cmliZW5kKHF1b3RlLCBlbmQpIHtcbiAgICBpZiAoY3VycmVudE9wZW5UYWcgJiYgY3VycmVudFByb3ApIHtcbiAgICAgIHNldExvY0VuZChjdXJyZW50UHJvcC5sb2MsIGVuZCk7XG4gICAgICBpZiAocXVvdGUgIT09IDApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRBdHRyVmFsdWUuaW5jbHVkZXMoXCImXCIpKSB7XG4gICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSA9IGN1cnJlbnRPcHRpb25zLmRlY29kZUVudGl0aWVzKFxuICAgICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50UHJvcC50eXBlID09PSA2KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wLm5hbWUgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgY3VycmVudEF0dHJWYWx1ZSA9IGNvbmRlbnNlKGN1cnJlbnRBdHRyVmFsdWUpLnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1b3RlID09PSAxICYmICFjdXJyZW50QXR0clZhbHVlKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoMTMsIGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQcm9wLnZhbHVlID0ge1xuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGN1cnJlbnRBdHRyVmFsdWUsXG4gICAgICAgICAgICBsb2M6IHF1b3RlID09PSAxID8gZ2V0TG9jKGN1cnJlbnRBdHRyU3RhcnRJbmRleCwgY3VycmVudEF0dHJFbmRJbmRleCkgOiBnZXRMb2MoY3VycmVudEF0dHJTdGFydEluZGV4IC0gMSwgY3VycmVudEF0dHJFbmRJbmRleCArIDEpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodG9rZW5pemVyLmluU0ZDUm9vdCAmJiBjdXJyZW50T3BlblRhZy50YWcgPT09IFwidGVtcGxhdGVcIiAmJiBjdXJyZW50UHJvcC5uYW1lID09PSBcImxhbmdcIiAmJiBjdXJyZW50QXR0clZhbHVlICYmIGN1cnJlbnRBdHRyVmFsdWUgIT09IFwiaHRtbFwiKSB7XG4gICAgICAgICAgICB0b2tlbml6ZXIuZW50ZXJSQ0RBVEEodG9DaGFyQ29kZXMoYDwvdGVtcGxhdGVgKSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBleHBQYXJzZU1vZGUgPSAwIC8qIE5vcm1hbCAqLztcbiAgICAgICAgICBjdXJyZW50UHJvcC5leHAgPSBjcmVhdGVFeHAoXG4gICAgICAgICAgICBjdXJyZW50QXR0clZhbHVlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBnZXRMb2MoY3VycmVudEF0dHJTdGFydEluZGV4LCBjdXJyZW50QXR0ckVuZEluZGV4KSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBleHBQYXJzZU1vZGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjdXJyZW50UHJvcC5uYW1lID09PSBcImZvclwiKSB7XG4gICAgICAgICAgICBjdXJyZW50UHJvcC5mb3JQYXJzZVJlc3VsdCA9IHBhcnNlRm9yRXhwcmVzc2lvbihjdXJyZW50UHJvcC5leHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc3luY0luZGV4ID0gLTE7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wLm5hbWUgPT09IFwiYmluZFwiICYmIChzeW5jSW5kZXggPSBjdXJyZW50UHJvcC5tb2RpZmllcnMuaW5kZXhPZihcInN5bmNcIikpID4gLTEgJiYgY2hlY2tDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgXCJDT01QSUxFUl9WX0JJTkRfU1lOQ1wiLFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgICBjdXJyZW50UHJvcC5sb2MsXG4gICAgICAgICAgICBjdXJyZW50UHJvcC5yYXdOYW1lXG4gICAgICAgICAgKSkge1xuICAgICAgICAgICAgY3VycmVudFByb3AubmFtZSA9IFwibW9kZWxcIjtcbiAgICAgICAgICAgIGN1cnJlbnRQcm9wLm1vZGlmaWVycy5zcGxpY2Uoc3luY0luZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50UHJvcC50eXBlICE9PSA3IHx8IGN1cnJlbnRQcm9wLm5hbWUgIT09IFwicHJlXCIpIHtcbiAgICAgICAgY3VycmVudE9wZW5UYWcucHJvcHMucHVzaChjdXJyZW50UHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRBdHRyVmFsdWUgPSBcIlwiO1xuICAgIGN1cnJlbnRBdHRyU3RhcnRJbmRleCA9IGN1cnJlbnRBdHRyRW5kSW5kZXggPSAtMTtcbiAgfSxcbiAgb25jb21tZW50KHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoY3VycmVudE9wdGlvbnMuY29tbWVudHMpIHtcbiAgICAgIGFkZE5vZGUoe1xuICAgICAgICB0eXBlOiAzLFxuICAgICAgICBjb250ZW50OiBnZXRTbGljZShzdGFydCwgZW5kKSxcbiAgICAgICAgbG9jOiBnZXRMb2Moc3RhcnQgLSA0LCBlbmQgKyAzKVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBvbmVuZCgpIHtcbiAgICBjb25zdCBlbmQgPSBjdXJyZW50SW5wdXQubGVuZ3RoO1xuICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmYWxzZSkgJiYgdG9rZW5pemVyLnN0YXRlICE9PSAxKSB7XG4gICAgICBzd2l0Y2ggKHRva2VuaXplci5zdGF0ZSkge1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBlbWl0RXJyb3IoNSwgZW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgZW1pdEVycm9yKFxuICAgICAgICAgICAgMjUsXG4gICAgICAgICAgICB0b2tlbml6ZXIuc2VjdGlvblN0YXJ0XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICBpZiAodG9rZW5pemVyLmN1cnJlbnRTZXF1ZW5jZSA9PT0gU2VxdWVuY2VzLkNkYXRhRW5kKSB7XG4gICAgICAgICAgICBlbWl0RXJyb3IoNiwgZW5kKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW1pdEVycm9yKDcsIGVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDEyOlxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGVtaXRFcnJvcig5LCBlbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3RhY2subGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBvbkNsb3NlVGFnKHN0YWNrW2luZGV4XSwgZW5kIC0gMSk7XG4gICAgICBlbWl0RXJyb3IoMjQsIHN0YWNrW2luZGV4XS5sb2Muc3RhcnQub2Zmc2V0KTtcbiAgICB9XG4gI
20578H0sXG4gIG9uY2RhdGEoc3RhcnQsIGVuZCkge1xuICAgIGlmIChzdGFja1swXS5ucyAhPT0gMCkge1xuICAgICAgb25UZXh0KGdldFNsaWNlKHN0YXJ0LCBlbmQpLCBzdGFydCwgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdEVycm9yKDEsIHN0YXJ0IC0gOSk7XG4gICAgfVxuICB9LFxuICBvbnByb2Nlc3NpbmdpbnN0cnVjdGlvbihzdGFydCkge1xuICAgIGlmICgoc3RhY2tbMF0gPyBzdGFja1swXS5ucyA6IGN1cnJlbnRPcHRpb25zLm5zKSA9PT0gMCkge1xuICAgICAgZW1pdEVycm9yKFxuICAgICAgICAyMSxcbiAgICAgICAgc3RhcnQgLSAxXG4gICAgICApO1xuICAgIH1cbiAgfVxufSk7XG5jb25zdCBmb3JJdGVyYXRvclJFID0gLywoW14sXFx9XFxdXSopKD86LChbXixcXH1cXF1dKikpPyQvO1xuY29uc3Qgc3RyaXBQYXJlbnNSRSA9IC9eXFwofFxcKSQvZztcbmZ1bmN0aW9uIHBhcnNlRm9yRXhwcmVzc2lvbihpbnB1dCkge1xuICBjb25zdCBsb2MgPSBpbnB1dC5sb2M7XG4gIGNvbnN0IGV4cCA9IGlucHV0LmNvbnRlbnQ7XG4gIGNvbnN0IGluTWF0Y2ggPSBleHAubWF0Y2goZm9yQWxpYXNSRSk7XG4gIGlmICghaW5NYXRjaCkgcmV0dXJuO1xuICBjb25zdCBbLCBMSFMsIFJIU10gPSBpbk1hdGNoO1xuICBjb25zdCBjcmVhdGVBbGlhc0V4cHJlc3Npb24gPSAoY29udGVudCwgb2Zmc2V0LCBhc1BhcmFtID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IGxvYy5zdGFydC5vZmZzZXQgKyBvZmZzZXQ7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBjb250ZW50Lmxlbmd0aDtcbiAgICByZXR1cm4gY3JlYXRlRXhwKFxuICAgICAgY29udGVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgZ2V0TG9jKHN0YXJ0LCBlbmQpLFxuICAgICAgMCxcbiAgICAgIGFzUGFyYW0gPyAxIC8qIFBhcmFtcyAqLyA6IDAgLyogTm9ybWFsICovXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHNvdXJjZTogY3JlYXRlQWxpYXNFeHByZXNzaW9uKFJIUy50cmltKCksIGV4cC5pbmRleE9mKFJIUywgTEhTLmxlbmd0aCkpLFxuICAgIHZhbHVlOiB2b2lkIDAsXG4gICAga2V5OiB2b2lkIDAsXG4gICAgaW5kZXg6IHZvaWQgMCxcbiAgICBmaW5hbGl6ZWQ6IGZhbHNlXG4gIH07XG4gIGxldCB2YWx1ZUNvbnRlbnQgPSBMSFMudHJpbSgpLnJlcGxhY2Uoc3RyaXBQYXJlbnNSRSwgXCJcIikudHJpbSgpO1xuICBjb25zdCB0cmltbWVkT2Zmc2V0ID0gTEhTLmluZGV4T2YodmFsdWVDb250ZW50KTtcbiAgY29uc3QgaXRlcmF0b3JNYXRjaCA9IHZhbHVlQ29udGVudC5tYXRjaChmb3JJdGVyYXRvclJFKTtcbiAgaWYgKGl0ZXJhdG9yTWF0Y2gpIHtcbiAgICB2YWx1ZUNvbnRlbnQgPSB2YWx1ZUNvbnRlbnQucmVwbGFjZShmb3JJdGVyYXRvclJFLCBcIlwiKS50cmltKCk7XG4gICAgY29uc3Qga2V5Q29udGVudCA9IGl0ZXJhdG9yTWF0Y2hbMV0udHJpbSgpO1xuICAgIGxldCBrZXlPZmZzZXQ7XG4gICAgaWYgKGtleUNvbnRlbnQpIHtcbiAgICAgIGtleU9mZnNldCA9IGV4cC5pbmRleE9mKGtleUNvbnRlbnQsIHRyaW1tZWRPZmZzZXQgKyB2YWx1ZUNvbnRlbnQubGVuZ3RoKTtcbiAgICAgIHJlc3VsdC5rZXkgPSBjcmVhdGVBbGlhc0V4cHJlc3Npb24oa2V5Q29udGVudCwga2V5T2Zmc2V0LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGl0ZXJhdG9yTWF0Y2hbMl0pIHtcbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IGl0ZXJhdG9yTWF0Y2hbMl0udHJpbSgpO1xuICAgICAgaWYgKGluZGV4Q29udGVudCkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBjcmVhdGVBbGlhc0V4cHJlc3Npb24oXG4gICAgICAgICAgaW5kZXhDb250ZW50LFxuICAgICAgICAgIGV4cC5pbmRleE9mKFxuICAgICAgICAgICAgaW5kZXhDb250ZW50LFxuICAgICAgICAgICAgcmVzdWx0LmtleSA/IGtleU9mZnNldCArIGtleUNvbnRlbnQubGVuZ3RoIDogdHJpbW1lZE9mZnNldCArIHZhbHVlQ29udGVudC5sZW5ndGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZhbHVlQ29udGVudCkge1xuICAgIHJlc3VsdC52YWx1ZSA9IGNyZWF0ZUFsaWFzRXhwcmVzc2lvbih2YWx1ZUNvbnRlbnQsIHRyaW1tZWRPZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRTbGljZShzdGFydCwgZW5kKSB7XG4gIHJldHVybiBjdXJyZW50SW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5mdW5jdGlvbiBlbmRPcGVuVGFnKGVuZCkge1xuICBpZiAodG9rZW5pemVyLmluU0ZDUm9vdCkge1xuICAgIGN1cnJlbnRPcGVuVGFnLmlubmVyTG9jID0gZ2V0TG9jKGVuZCArIDEsIGVuZCArIDEpO1xuICB9XG4gIGFkZE5vZGUoY3VycmVudE9wZW5UYWcpO1xuICBjb25zdCB7IHRhZywgbnMgfSA9IGN1cnJlbnRPcGVuVGFnO1xuICBpZiAobnMgPT09IDAgJiYgY3VycmVudE9wdGlvbnMuaXNQcmVUYWcodGFnKSkge1xuICAgIGluUHJlKys7XG4gIH1cbiAgaWYgKGN1cnJlbnRPcHRpb25zLmlzVm9pZFRhZyh0YWcpKSB7XG4gICAgb25DbG9zZVRhZyhjdXJyZW50T3BlblRhZywgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay51bnNoaWZ0KGN1cnJlbnRPcGVuVGFnKTtcbiAgICBpZiAobnMgPT09IDEgfHwgbnMgPT09IDIpIHtcbiAgICAgIHRva2VuaXplci5pblhNTCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGN1cnJlbnRPcGVuVGFnID0gbnVsbDtcbn1cbmZ1bmN0aW9uIG9uVGV4dChjb250ZW50LCBzdGFydCwgZW5kKSB7XG4gIHtcbiAgICBjb25zdCB0YWcgPSBzdGFja1swXSAmJiBzdGFja1swXS50YWc7XG4gICAgaWYgKHRhZyAhPT0gXCJzY3JpcHRcIiAmJiB0YWcgIT09IFwic3R5bGVcIiAmJiBjb250ZW50LmluY2x1ZGVzKFwiJlwiKSkge1xuICAgICAgY29udGVudCA9IGN1cnJlbnRPcHRpb25zLmRlY29kZUVudGl0aWVzKGNvbnRlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyZW50ID0gc3RhY2tbMF0gfHwgY3VycmVudFJvb3Q7XG4gIGNvbnN0IGxhc3ROb2RlID0gcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDIpIHtcbiAgICBsYXN0Tm9kZS5jb250ZW50ICs9IGNvbnRlbnQ7XG4gICAgc2V0TG9jRW5kKGxhc3ROb2RlLmxvYywgZW5kKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh7XG4gICAgICB0eX
20578BlOiAyLFxuICAgICAgY29udGVudCxcbiAgICAgIGxvYzogZ2V0TG9jKHN0YXJ0LCBlbmQpXG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ2xvc2VUYWcoZWwsIGVuZCwgaXNJbXBsaWVkID0gZmFsc2UpIHtcbiAgaWYgKGlzSW1wbGllZCkge1xuICAgIHNldExvY0VuZChlbC5sb2MsIGJhY2tUcmFjayhlbmQsIDYwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0TG9jRW5kKGVsLmxvYywgbG9va0FoZWFkKGVuZCwgNjIpICsgMSk7XG4gIH1cbiAgaWYgKHRva2VuaXplci5pblNGQ1Jvb3QpIHtcbiAgICBpZiAoZWwuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBlbC5pbm5lckxvYy5lbmQgPSBleHRlbmQoe30sIGVsLmNoaWxkcmVuW2VsLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxvYy5lbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5pbm5lckxvYy5lbmQgPSBleHRlbmQoe30sIGVsLmlubmVyTG9jLnN0YXJ0KTtcbiAgICB9XG4gICAgZWwuaW5uZXJMb2Muc291cmNlID0gZ2V0U2xpY2UoXG4gICAgICBlbC5pbm5lckxvYy5zdGFydC5vZmZzZXQsXG4gICAgICBlbC5pbm5lckxvYy5lbmQub2Zmc2V0XG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHRhZywgbnMgfSA9IGVsO1xuICBpZiAoIWluVlByZSkge1xuICAgIGlmICh0YWcgPT09IFwic2xvdFwiKSB7XG4gICAgICBlbC50YWdUeXBlID0gMjtcbiAgICB9IGVsc2UgaWYgKGlzRnJhZ21lbnRUZW1wbGF0ZShlbCkpIHtcbiAgICAgIGVsLnRhZ1R5cGUgPSAzO1xuICAgIH0gZWxzZSBpZiAoaXNDb21wb25lbnQoZWwpKSB7XG4gICAgICBlbC50YWdUeXBlID0gMTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0b2tlbml6ZXIuaW5SQ0RBVEEpIHtcbiAgICBlbC5jaGlsZHJlbiA9IGNvbmRlbnNlV2hpdGVzcGFjZShlbC5jaGlsZHJlbiwgZWwudGFnKTtcbiAgfVxuICBpZiAobnMgPT09IDAgJiYgY3VycmVudE9wdGlvbnMuaXNQcmVUYWcodGFnKSkge1xuICAgIGluUHJlLS07XG4gIH1cbiAgaWYgKGN1cnJlbnRWUHJlQm91bmRhcnkgPT09IGVsKSB7XG4gICAgaW5WUHJlID0gdG9rZW5pemVyLmluVlByZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRWUHJlQm91bmRhcnkgPSBudWxsO1xuICB9XG4gIGlmICh0b2tlbml6ZXIuaW5YTUwgJiYgKHN0YWNrWzBdID8gc3RhY2tbMF0ubnMgOiBjdXJyZW50T3B0aW9ucy5ucykgPT09IDApIHtcbiAgICB0b2tlbml6ZXIuaW5YTUwgPSBmYWxzZTtcbiAgfVxuICB7XG4gICAgY29uc3QgcHJvcHMgPSBlbC5wcm9wcztcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiLFxuICAgICAgY3VycmVudE9wdGlvbnNcbiAgICApKSB7XG4gICAgICBsZXQgaGFzSWYgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNGb3IgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IHByb3BzW2ldO1xuICAgICAgICBpZiAocC50eXBlID09PSA3KSB7XG4gICAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZlwiKSB7XG4gICAgICAgICAgICBoYXNJZiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwLm5hbWUgPT09IFwiZm9yXCIpIHtcbiAgICAgICAgICAgIGhhc0ZvciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJZiAmJiBoYXNGb3IpIHtcbiAgICAgICAgICB3YXJuRGVwcmVjYXRpb24oXG4gICAgICAgICAgICBcIkNPTVBJTEVSX1ZfSUZfVl9GT1JfUFJFQ0VERU5DRVwiLFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgICBlbC5sb2NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdG9rZW5pemVyLmluU0ZDUm9vdCAmJiBpc0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX05BVElWRV9URU1QTEFURVwiLFxuICAgICAgY3VycmVudE9wdGlvbnNcbiAgICApICYmIGVsLnRhZyA9PT0gXCJ0ZW1wbGF0ZVwiICYmICFpc0ZyYWdtZW50VGVtcGxhdGUoZWwpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5EZXByZWNhdGlvbihcbiAgICAgICAgXCJDT01QSUxFUl9OQVRJVkVfVEVNUExBVEVcIixcbiAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgIGVsLmxvY1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHN0YWNrWzBdIHx8IGN1cnJlbnRSb290O1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlbCk7XG4gICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxLCAuLi5lbC5jaGlsZHJlbik7XG4gICAgfVxuICAgIGNvbnN0IGlubGluZVRlbXBsYXRlUHJvcCA9IHByb3BzLmZpbmQoXG4gICAgICAocCkgPT4gcC50eXBlID09PSA2ICYmIHAubmFtZSA9PT0gXCJpbmxpbmUtdGVtcGxhdGVcIlxuICAgICk7XG4gICAgaWYgKGlubGluZVRlbXBsYXRlUHJvcCAmJiBjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX0lOTElORV9URU1QTEFURVwiLFxuICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICBpbmxpbmVUZW1wbGF0ZVByb3AubG9jXG4gICAgKSAmJiBlbC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGlubGluZVRlbXBsYXRlUHJvcC52YWx1ZSA9IHtcbiAgICAgICAgdHlwZTogMixcbiAgICAgICAgY29udGVudDogZ2V0U2xpY2UoXG4gICAgICAgICAgZWwuY2hpbGRyZW5bMF0ubG9jLnN0YXJ0Lm9mZnNldCxcbiAgICAgICAgICBlbC5jaGlsZHJlbltlbC5jaGlsZHJlbi5sZW5ndGggLSAxXS5sb2MuZW5kLm9mZnNldFxuICAgICAgICApLFxuICAgICAgICBsb2M6IGlubGluZVRlbXBsYXRlUHJvcC5sb2NcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBsb29rQWhlYWQoaW5kZXgsIGMpIHtcbiAgbGV0IGkgPSBpbmRleDtcbiAgd2hpbGUgKGN1cnJlbnRJbnB1dC5jaGFyQ29kZUF0KGkpICE9PSBjICYmIGkgPCBjdXJyZW50SW5wdXQubGVuZ3RoIC0gMSkgaSsrO1xuICByZXR1cm4gaTtcbn1cbmZ1bmN0aW9uIGJhY2tUcmFjayhpbmRleCwgYykge1xuICBsZXQgaSA9IGluZGV4O1xuICB3aGlsZSAoY3VycmVudElucHV0LmNoYXJDb2RlQXQoaSkgIT09IGMgJiYgaSA+PSAwKSBpLS07XG4gIHJldHVybi
20578BpO1xufVxuY29uc3Qgc3BlY2lhbFRlbXBsYXRlRGlyID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1wiaWZcIiwgXCJlbHNlXCIsIFwiZWxzZS1pZlwiLCBcImZvclwiLCBcInNsb3RcIl0pO1xuZnVuY3Rpb24gaXNGcmFnbWVudFRlbXBsYXRlKHsgdGFnLCBwcm9wcyB9KSB7XG4gIGlmICh0YWcgPT09IFwidGVtcGxhdGVcIikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wc1tpXS50eXBlID09PSA3ICYmIHNwZWNpYWxUZW1wbGF0ZURpci5oYXMocHJvcHNbaV0ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50KHsgdGFnLCBwcm9wcyB9KSB7XG4gIGlmIChjdXJyZW50T3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQodGFnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGFnID09PSBcImNvbXBvbmVudFwiIHx8IGlzVXBwZXJDYXNlKHRhZy5jaGFyQ29kZUF0KDApKSB8fCBpc0NvcmVDb21wb25lbnQodGFnKSB8fCBjdXJyZW50T3B0aW9ucy5pc0J1aWx0SW5Db21wb25lbnQgJiYgY3VycmVudE9wdGlvbnMuaXNCdWlsdEluQ29tcG9uZW50KHRhZykgfHwgY3VycmVudE9wdGlvbnMuaXNOYXRpdmVUYWcgJiYgIWN1cnJlbnRPcHRpb25zLmlzTmF0aXZlVGFnKHRhZykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IHByb3BzW2ldO1xuICAgIGlmIChwLnR5cGUgPT09IDYpIHtcbiAgICAgIGlmIChwLm5hbWUgPT09IFwiaXNcIiAmJiBwLnZhbHVlKSB7XG4gICAgICAgIGlmIChwLnZhbHVlLmNvbnRlbnQuc3RhcnRzV2l0aChcInZ1ZTpcIikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICAgICAgcC5sb2NcbiAgICAgICAgKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgvLyA6aXMgb24gcGxhaW4gZWxlbWVudCAtIG9ubHkgdHJlYXQgYXMgY29tcG9uZW50IGluIGNvbXBhdCBtb2RlXG4gICAgcC5uYW1lID09PSBcImJpbmRcIiAmJiBpc1N0YXRpY0FyZ09mKHAuYXJnLCBcImlzXCIpICYmIGNoZWNrQ29tcGF0RW5hYmxlZChcbiAgICAgIFwiQ09NUElMRVJfSVNfT05fRUxFTUVOVFwiLFxuICAgICAgY3VycmVudE9wdGlvbnMsXG4gICAgICBwLmxvY1xuICAgICkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1VwcGVyQ2FzZShjKSB7XG4gIHJldHVybiBjID4gNjQgJiYgYyA8IDkxO1xufVxuY29uc3Qgd2luZG93c05ld2xpbmVSRSA9IC9cXHJcXG4vZztcbmZ1bmN0aW9uIGNvbmRlbnNlV2hpdGVzcGFjZShub2RlcywgdGFnKSB7XG4gIGNvbnN0IHNob3VsZENvbmRlbnNlID0gY3VycmVudE9wdGlvbnMud2hpdGVzcGFjZSAhPT0gXCJwcmVzZXJ2ZVwiO1xuICBsZXQgcmVtb3ZlZFdoaXRlc3BhY2UgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS50eXBlID09PSAyKSB7XG4gICAgICBpZiAoIWluUHJlKSB7XG4gICAgICAgIGlmIChpc0FsbFdoaXRlc3BhY2Uobm9kZS5jb250ZW50KSkge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBub2Rlc1tpIC0gMV0gJiYgbm9kZXNbaSAtIDFdLnR5cGU7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5vZGVzW2kgKyAxXSAmJiBub2Rlc1tpICsgMV0udHlwZTtcbiAgICAgICAgICBpZiAoIXByZXYgfHwgIW5leHQgfHwgc2hvdWxkQ29uZGVuc2UgJiYgKHByZXYgPT09IDMgJiYgKG5leHQgPT09IDMgfHwgbmV4dCA9PT0gMSkgfHwgcHJldiA9PT0gMSAmJiAobmV4dCA9PT0gMyB8fCBuZXh0ID09PSAxICYmIGhhc05ld2xpbmVDaGFyKG5vZGUuY29udGVudCkpKSkge1xuICAgICAgICAgICAgcmVtb3ZlZFdoaXRlc3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgbm9kZXNbaV0gPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmNvbnRlbnQgPSBcIiBcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkQ29uZGVuc2UpIHtcbiAgICAgICAgICBub2RlLmNvbnRlbnQgPSBjb25kZW5zZShub2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNvbnRlbnQgPSBub2RlLmNvbnRlbnQucmVwbGFjZSh3aW5kb3dzTmV3bGluZVJFLCBcIlxcblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluUHJlICYmIHRhZyAmJiBjdXJyZW50T3B0aW9ucy5pc1ByZVRhZyh0YWcpKSB7XG4gICAgY29uc3QgZmlyc3QgPSBub2Rlc1swXTtcbiAgICBpZiAoZmlyc3QgJiYgZmlyc3QudHlwZSA9PT0gMikge1xuICAgICAgZmlyc3QuY29udGVudCA9IGZpcnN0LmNvbnRlbnQucmVwbGFjZSgvXlxccj9cXG4vLCBcIlwiKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRXaGl0ZXNwYWNlID8gbm9kZXMuZmlsdGVyKEJvb2xlYW4pIDogbm9kZXM7XG59XG5mdW5jdGlvbiBpc0FsbFdoaXRlc3BhY2Uoc3RyKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpc1doaXRlc3BhY2Uoc3RyLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFzTmV3bGluZUNoYXIoc3RyKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjID09PSAxMCB8fCBjID09PSAxMykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gI
20578HJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbmRlbnNlKHN0cikge1xuICBsZXQgcmV0ID0gXCJcIjtcbiAgbGV0IHByZXZDaGFySXNXaGl0ZXNwYWNlID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGlzV2hpdGVzcGFjZShzdHIuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgIGlmICghcHJldkNoYXJJc1doaXRlc3BhY2UpIHtcbiAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICBwcmV2Q2hhcklzV2hpdGVzcGFjZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldCArPSBzdHJbaV07XG4gICAgICBwcmV2Q2hhcklzV2hpdGVzcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gYWRkTm9kZShub2RlKSB7XG4gIChzdGFja1swXSB8fCBjdXJyZW50Um9vdCkuY2hpbGRyZW4ucHVzaChub2RlKTtcbn1cbmZ1bmN0aW9uIGdldExvYyhzdGFydCwgZW5kKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHRva2VuaXplci5nZXRQb3Moc3RhcnQpLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWxsb3cgbGF0ZSBhdHRhY2htZW50XG4gICAgZW5kOiBlbmQgPT0gbnVsbCA/IGVuZCA6IHRva2VuaXplci5nZXRQb3MoZW5kKSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFsbG93IGxhdGUgYXR0YWNobWVudFxuICAgIHNvdXJjZTogZW5kID09IG51bGwgPyBlbmQgOiBnZXRTbGljZShzdGFydCwgZW5kKVxuICB9O1xufVxuZnVuY3Rpb24gc2V0TG9jRW5kKGxvYywgZW5kKSB7XG4gIGxvYy5lbmQgPSB0b2tlbml6ZXIuZ2V0UG9zKGVuZCk7XG4gIGxvYy5zb3VyY2UgPSBnZXRTbGljZShsb2Muc3RhcnQub2Zmc2V0LCBlbmQpO1xufVxuZnVuY3Rpb24gZGlyVG9BdHRyKGRpcikge1xuICBjb25zdCBhdHRyID0ge1xuICAgIHR5cGU6IDYsXG4gICAgbmFtZTogZGlyLnJhd05hbWUsXG4gICAgbmFtZUxvYzogZ2V0TG9jKFxuICAgICAgZGlyLmxvYy5zdGFydC5vZmZzZXQsXG4gICAgICBkaXIubG9jLnN0YXJ0Lm9mZnNldCArIGRpci5yYXdOYW1lLmxlbmd0aFxuICAgICksXG4gICAgdmFsdWU6IHZvaWQgMCxcbiAgICBsb2M6IGRpci5sb2NcbiAgfTtcbiAgaWYgKGRpci5leHApIHtcbiAgICBjb25zdCBsb2MgPSBkaXIuZXhwLmxvYztcbiAgICBpZiAobG9jLmVuZC5vZmZzZXQgPCBkaXIubG9jLmVuZC5vZmZzZXQpIHtcbiAgICAgIGxvYy5zdGFydC5vZmZzZXQtLTtcbiAgICAgIGxvYy5zdGFydC5jb2x1bW4tLTtcbiAgICAgIGxvYy5lbmQub2Zmc2V0Kys7XG4gICAgICBsb2MuZW5kLmNvbHVtbisrO1xuICAgIH1cbiAgICBhdHRyLnZhbHVlID0ge1xuICAgICAgdHlwZTogMixcbiAgICAgIGNvbnRlbnQ6IGRpci5leHAuY29udGVudCxcbiAgICAgIGxvY1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGF0dHI7XG59XG5mdW5jdGlvbiBjcmVhdGVFeHAoY29udGVudCwgaXNTdGF0aWMgPSBmYWxzZSwgbG9jLCBjb25zdFR5cGUgPSAwLCBwYXJzZU1vZGUgPSAwIC8qIE5vcm1hbCAqLykge1xuICBjb25zdCBleHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGNvbnRlbnQsIGlzU3RhdGljLCBsb2MsIGNvbnN0VHlwZSk7XG4gIHJldHVybiBleHA7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3IoY29kZSwgaW5kZXgsIG1lc3NhZ2UpIHtcbiAgY3VycmVudE9wdGlvbnMub25FcnJvcihcbiAgICBjcmVhdGVDb21waWxlckVycm9yKGNvZGUsIGdldExvYyhpbmRleCwgaW5kZXgpLCB2b2lkIDAsIG1lc3NhZ2UpXG4gICk7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgdG9rZW5pemVyLnJlc2V0KCk7XG4gIGN1cnJlbnRPcGVuVGFnID0gbnVsbDtcbiAgY3VycmVudFByb3AgPSBudWxsO1xuICBjdXJyZW50QXR0clZhbHVlID0gXCJcIjtcbiAgY3VycmVudEF0dHJTdGFydEluZGV4ID0gLTE7XG4gIGN1cnJlbnRBdHRyRW5kSW5kZXggPSAtMTtcbiAgc3RhY2subGVuZ3RoID0gMDtcbn1cbmZ1bmN0aW9uIGJhc2VQYXJzZShpbnB1dCwgb3B0aW9ucykge1xuICByZXNldCgpO1xuICBjdXJyZW50SW5wdXQgPSBpbnB1dDtcbiAgY3VycmVudE9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRQYXJzZXJPcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zW2tleV0gIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50T3B0aW9uc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmICghY3VycmVudE9wdGlvbnMuZGVjb2RlRW50aXRpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtAdnVlL2NvbXBpbGVyLWNvcmVdIGRlY29kZUVudGl0aWVzIG9wdGlvbiBpcyByZXF1aXJlZCBpbiBicm93c2VyIGJ1aWxkcy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICB0b2tlbml6ZXIubW9kZSA9IGN1cnJlbnRPcHRpb25zLnBhcnNlTW9kZSA9PT0gXCJodG1sXCIgPyAxIDogY3VycmVudE9wdGlvbnMucGFyc2VNb2RlID09PSBcInNmY1wiID8gMiA6IDA7XG4gIHRva2VuaXplci5pblhNTCA9IGN1cnJlbnRPcHRpb25zLm5zID09PSAxIHx8IGN1cnJlbnRPcHRpb25zLm5zID09PSAyO1xuICBjb25zdCBkZWxpbWl0ZXJzID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGltaXRlcnM7XG4gIGlmIChkZWxpbWl0ZXJzKSB7XG4gICAgdG9rZW5pemVyLmRlbGltaXRlck9wZW4gPSB0b0NoYXJDb2RlcyhkZWxpbWl0ZXJzWzBdKTtcbiAgICB0b2tlbml6ZXIuZGVsaW1pdGVyQ2xvc2UgPSB0b0NoYXJDb2RlcyhkZWxpbWl0ZXJzWzFdKTtcbiAgfVxuICBjb25zdCByb290ID0gY3VycmVudFJvb3QgPSBjcmVhdGVSb290KFtdLCBpbnB1dCk7XG4gIHRva2VuaXplci5wYXJzZShjdXJyZW50SW5wdXQpO1xuICByb290LmxvYyA9IGdldExvYygwLCBpbnB1dC5sZW5ndGgpO1xuICByb290LmNoaWxkcmVuID0gY29uZGVuc2VXaGl0ZXNwYWNlKHJvb3QuY2hpbGRyZW4pO1xuICBjdXJyZW50Um9vdCA9IG51bGw7XG4gIHJldHVybi
20578Byb290O1xufVxuXG5mdW5jdGlvbiBob2lzdFN0YXRpYyhyb290LCBjb250ZXh0KSB7XG4gIHdhbGsoXG4gICAgcm9vdCxcbiAgICBjb250ZXh0LFxuICAgIC8vIFJvb3Qgbm9kZSBpcyB1bmZvcnR1bmF0ZWx5IG5vbi1ob2lzdGFibGUgZHVlIHRvIHBvdGVudGlhbCBwYXJlbnRcbiAgICAvLyBmYWxsdGhyb3VnaCBhdHRyaWJ1dGVzLlxuICAgIGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgcm9vdC5jaGlsZHJlblswXSlcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgY2hpbGQpIHtcbiAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcm9vdDtcbiAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBjaGlsZC50eXBlID09PSAxICYmICFpc1Nsb3RPdXRsZXQoY2hpbGQpO1xufVxuZnVuY3Rpb24gd2Fsayhub2RlLCBjb250ZXh0LCBkb05vdEhvaXN0Tm9kZSA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IG5vZGU7XG4gIGNvbnN0IG9yaWdpbmFsQ291bnQgPSBjaGlsZHJlbi5sZW5ndGg7XG4gIGxldCBob2lzdGVkQ291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSAmJiBjaGlsZC50YWdUeXBlID09PSAwKSB7XG4gICAgICBjb25zdCBjb25zdGFudFR5cGUgPSBkb05vdEhvaXN0Tm9kZSA/IDAgOiBnZXRDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgaWYgKGNvbnN0YW50VHlwZSA+IDApIHtcbiAgICAgICAgaWYgKGNvbnN0YW50VHlwZSA+PSAyKSB7XG4gICAgICAgICAgY2hpbGQuY29kZWdlbk5vZGUucGF0Y2hGbGFnID0gLTE7XG4gICAgICAgICAgY2hpbGQuY29kZWdlbk5vZGUgPSBjb250ZXh0LmhvaXN0KGNoaWxkLmNvZGVnZW5Ob2RlKTtcbiAgICAgICAgICBob2lzdGVkQ291bnQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBjaGlsZC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzKSB7XG4gICAgICAgICAgY29uc3QgZmxhZyA9IGNvZGVnZW5Ob2RlLnBhdGNoRmxhZztcbiAgICAgICAgICBpZiAoKGZsYWcgPT09IHZvaWQgMCB8fCBmbGFnID09PSA1MTIgfHwgZmxhZyA9PT0gMSkgJiYgZ2V0R2VuZXJhdGVkUHJvcHNDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZ2V0Tm9kZVByb3BzKGNoaWxkKTtcbiAgICAgICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgICAgICBjb2RlZ2VuTm9kZS5wcm9wcyA9IGNvbnRleHQuaG9pc3QocHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZWdlbk5vZGUuZHluYW1pY1Byb3BzKSB7XG4gICAgICAgICAgICBjb2RlZ2VuTm9kZS5keW5hbWljUHJvcHMgPSBjb250ZXh0LmhvaXN0KGNvZGVnZW5Ob2RlLmR5bmFtaWNQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGlsZC50eXBlID09PSAxKSB7XG4gICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGNoaWxkLnRhZ1R5cGUgPT09IDE7XG4gICAgICBpZiAoaXNDb21wb25lbnQpIHtcbiAgICAgICAgY29udGV4dC5zY29wZXMudlNsb3QrKztcbiAgICAgIH1cbiAgICAgIHdhbGsoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgaWYgKGlzQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnRleHQuc2NvcGVzLnZTbG90LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSAxMSkge1xuICAgICAgd2FsayhjaGlsZCwgY29udGV4dCwgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDkpIHtcbiAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBjaGlsZC5icmFuY2hlcy5sZW5ndGg7IGkyKyspIHtcbiAgICAgICAgd2FsayhcbiAgICAgICAgICBjaGlsZC5icmFuY2hlc1tpMl0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGlsZC5icmFuY2hlc1tpMl0uY2hpbGRyZW4ubGVuZ3RoID09PSAxXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChob2lzdGVkQ291bnQgJiYgY29udGV4dC50cmFuc2Zvcm1Ib2lzdCkge1xuICAgIGNvbnRleHQudHJhbnNmb3JtSG9pc3QoY2hpbGRyZW4sIGNvbnRleHQsIG5vZGUpO1xuICB9XG4gIGlmIChob2lzdGVkQ291bnQgJiYgaG9pc3RlZENvdW50ID09PSBvcmlnaW5hbENvdW50ICYmIG5vZGUudHlwZSA9PT0gMSAmJiBub2RlLnRhZ1R5cGUgPT09IDAgJiYgbm9kZS5jb2RlZ2VuTm9kZSAmJiBub2RlLmNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzICYmIGlzQXJyYXkobm9kZS5jb2RlZ2VuTm9kZS5jaGlsZHJlbikpIHtcbiAgICBjb25zdCBob2lzdGVkID0gY29udGV4dC5ob2lzdChcbiAgICAgIGNyZWF0ZUFycmF5RXhwcmVzc2lvbihub2RlLmNvZGVnZW5Ob2RlLmNoaWxkcmVuKVxuICAgICk7XG4gICAgaWYgKGNvbnRleHQuaG1yKSB7XG4gICAgICBob2lzdGVkLmNvbnRlbnQgPSBgWy4uLiR7aG9pc3RlZC5jb250ZW50fV1gO1xuICAgIH1cbiAgICBub2RlLmNvZGVnZW5Ob2RlLmNoaWxkcmVuID0gaG9pc3RlZDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uc3RhbnRUeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBjb25zdGFudENhY2hlIH0gPSBjb250ZXh0O1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIGlmIChub2RlLnRhZ1R5cGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWQgPSBjb25zdGFudENhY2hlLmdldChub2RlKTtcbiAgICAgIGlmIChjYWNoZWQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgfVxuICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBub2RlLmNvZGVnZW5Ob2RlO1xuICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgIT09IDEzKSB7XG4gICAgICAgI
20578HJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGVnZW5Ob2RlLmlzQmxvY2sgJiYgbm9kZS50YWcgIT09IFwic3ZnXCIgJiYgbm9kZS50YWcgIT09IFwiZm9yZWlnbk9iamVjdFwiICYmIG5vZGUudGFnICE9PSBcIm1hdGhcIikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlZ2VuTm9kZS5wYXRjaEZsYWcgPT09IHZvaWQgMCkge1xuICAgICAgICBsZXQgcmV0dXJuVHlwZTIgPSAzO1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRQcm9wc1R5cGUgPSBnZXRHZW5lcmF0ZWRQcm9wc0NvbnN0YW50VHlwZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGdlbmVyYXRlZFByb3BzVHlwZSA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDApO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZW5lcmF0ZWRQcm9wc1R5cGUgPCByZXR1cm5UeXBlMikge1xuICAgICAgICAgIHJldHVyblR5cGUyID0gZ2VuZXJhdGVkUHJvcHNUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkVHlwZSA9IGdldENvbnN0YW50VHlwZShub2RlLmNoaWxkcmVuW2ldLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoY2hpbGRUeXBlID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCAwKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hpbGRUeXBlIDwgcmV0dXJuVHlwZTIpIHtcbiAgICAgICAgICAgIHJldHVyblR5cGUyID0gY2hpbGRUeXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0dXJuVHlwZTIgPiAxKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcgJiYgcC5uYW1lID09PSBcImJpbmRcIiAmJiBwLmV4cCkge1xuICAgICAgICAgICAgICBjb25zdCBleHBUeXBlID0gZ2V0Q29uc3RhbnRUeXBlKHAuZXhwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgaWYgKGV4cFR5cGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZXhwVHlwZSA8IHJldHVyblR5cGUyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVHlwZTIgPSBleHBUeXBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlZ2VuTm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgICAgICAgIGlmIChwLnR5cGUgPT09IDcpIHtcbiAgICAgICAgICAgICAgY29uc3RhbnRDYWNoZS5zZXQobm9kZSwgMCk7XG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LnJlbW92ZUhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICBjb250ZXh0LnJlbW92ZUhlbHBlcihcbiAgICAgICAgICAgIGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgY29kZWdlbk5vZGUuaXNDb21wb25lbnQpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlZ2VuTm9kZS5pc0Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgY29udGV4dC5oZWxwZXIoZ2V0Vk5vZGVIZWxwZXIoY29udGV4dC5pblNTUiwgY29kZWdlbk5vZGUuaXNDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdGFudENhY2hlLnNldChub2RlLCByZXR1cm5UeXBlMik7XG4gICAgICAgIHJldHVybiByZXR1cm5UeXBlMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0YW50Q2FjaGUuc2V0KG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICBjYXNlIDI6XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIDM7XG4gICAgY2FzZSA5OlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxMDpcbiAgICAgIHJldHVybiAwO1xuICAgIGNhc2UgNTpcbiAgICBjYXNlIDEyOlxuICAgICAgcmV0dXJuIGdldENvbnN0YW50VHlwZShub2RlLmNvbnRlbnQsIGNvbnRleHQpO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBub2RlLmNvbnN0VHlwZTtcbiAgICBjYXNlIDg6XG4gICAgICBsZXQgcmV0dXJuVHlwZSA9IDM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNTdHJpbmcoY2hpbGQpIHx8IGlzU3ltYm9sKGNoaWxkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkVHlwZSA9IGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChjaGlsZFR5cGUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZFR5cGUgPCByZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZSA9IGNoaWxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldHVyblR5cGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSA7XG4gICAgICByZXR1cm4gMDtcbiAgfVxufVxuY29uc3QgYWxsb3dIb2lzdGVkSGVscGVyU2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBOT1JNQUxJWkVfQ0xBU1MsXG4gIE5PUk1BTElaRV9TVFlMRSxcbiAgTk9STUFMSVpFX1BST1BTLFxuICBHVUFSRF9SRUFDVElWRV9QUk9QU1xuXSk7XG5mdW5jdGlvbiBnZXRDb25zdGFudFR5cGVPZkhlbHBlckNhbGwodmFsdWUsIGNvbnRleHQpIHtcbiAgaWYgKHZhbHVlLnR5cGUgPT09IDE0ICYmICFpc1N0cmluZyh2YWx1ZS
205785jYWxsZWUpICYmIGFsbG93SG9pc3RlZEhlbHBlclNldC5oYXModmFsdWUuY2FsbGVlKSkge1xuICAgIGNvbnN0IGFyZyA9IHZhbHVlLmFyZ3VtZW50c1swXTtcbiAgICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICAgIHJldHVybiBnZXRDb25zdGFudFR5cGUoYXJnLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGFyZy50eXBlID09PSAxNCkge1xuICAgICAgcmV0dXJuIGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbChhcmcsIGNvbnRleHQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFByb3BzQ29uc3RhbnRUeXBlKG5vZGUsIGNvbnRleHQpIHtcbiAgbGV0IHJldHVyblR5cGUgPSAzO1xuICBjb25zdCBwcm9wcyA9IGdldE5vZGVQcm9wcyhub2RlKTtcbiAgaWYgKHByb3BzICYmIHByb3BzLnR5cGUgPT09IDE1KSB7XG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzIH0gPSBwcm9wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGNvbnN0IGtleVR5cGUgPSBnZXRDb25zdGFudFR5cGUoa2V5LCBjb250ZXh0KTtcbiAgICAgIGlmIChrZXlUeXBlID09PSAwKSB7XG4gICAgICAgIHJldHVybiBrZXlUeXBlO1xuICAgICAgfVxuICAgICAgaWYgKGtleVR5cGUgPCByZXR1cm5UeXBlKSB7XG4gICAgICAgIHJldHVyblR5cGUgPSBrZXlUeXBlO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlVHlwZTtcbiAgICAgIGlmICh2YWx1ZS50eXBlID09PSA0KSB7XG4gICAgICAgIHZhbHVlVHlwZSA9IGdldENvbnN0YW50VHlwZSh2YWx1ZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IDE0KSB7XG4gICAgICAgIHZhbHVlVHlwZSA9IGdldENvbnN0YW50VHlwZU9mSGVscGVyQ2FsbCh2YWx1ZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVR5cGUgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlVHlwZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdmFsdWVUeXBlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlVHlwZSA8IHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuVHlwZSA9IHZhbHVlVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldHVyblR5cGU7XG59XG5mdW5jdGlvbiBnZXROb2RlUHJvcHMobm9kZSkge1xuICBjb25zdCBjb2RlZ2VuTm9kZSA9IG5vZGUuY29kZWdlbk5vZGU7XG4gIGlmIChjb2RlZ2VuTm9kZS50eXBlID09PSAxMykge1xuICAgIHJldHVybiBjb2RlZ2VuTm9kZS5wcm9wcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIHtcbiAgZmlsZW5hbWUgPSBcIlwiLFxuICBwcmVmaXhJZGVudGlmaWVycyA9IGZhbHNlLFxuICBob2lzdFN0YXRpYzogaG9pc3RTdGF0aWMyID0gZmFsc2UsXG4gIGhtciA9IGZhbHNlLFxuICBjYWNoZUhhbmRsZXJzID0gZmFsc2UsXG4gIG5vZGVUcmFuc2Zvcm1zID0gW10sXG4gIGRpcmVjdGl2ZVRyYW5zZm9ybXMgPSB7fSxcbiAgdHJhbnNmb3JtSG9pc3QgPSBudWxsLFxuICBpc0J1aWx0SW5Db21wb25lbnQgPSBOT09QLFxuICBpc0N1c3RvbUVsZW1lbnQgPSBOT09QLFxuICBleHByZXNzaW9uUGx1Z2lucyA9IFtdLFxuICBzY29wZUlkID0gbnVsbCxcbiAgc2xvdHRlZCA9IHRydWUsXG4gIHNzciA9IGZhbHNlLFxuICBpblNTUiA9IGZhbHNlLFxuICBzc3JDc3NWYXJzID0gYGAsXG4gIGJpbmRpbmdNZXRhZGF0YSA9IEVNUFRZX09CSixcbiAgaW5saW5lID0gZmFsc2UsXG4gIGlzVFMgPSBmYWxzZSxcbiAgb25FcnJvciA9IGRlZmF1bHRPbkVycm9yLFxuICBvbldhcm4gPSBkZWZhdWx0T25XYXJuLFxuICBjb21wYXRDb25maWdcbn0pIHtcbiAgY29uc3QgbmFtZU1hdGNoID0gZmlsZW5hbWUucmVwbGFjZSgvXFw/LiokLywgXCJcIikubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICAvLyBvcHRpb25zXG4gICAgZmlsZW5hbWUsXG4gICAgc2VsZk5hbWU6IG5hbWVNYXRjaCAmJiBjYXBpdGFsaXplKGNhbWVsaXplKG5hbWVNYXRjaFsxXSkpLFxuICAgIHByZWZpeElkZW50aWZpZXJzLFxuICAgIGhvaXN0U3RhdGljOiBob2lzdFN0YXRpYzIsXG4gICAgaG1yLFxuICAgIGNhY2hlSGFuZGxlcnMsXG4gICAgbm9kZVRyYW5zZm9ybXMsXG4gICAgZGlyZWN0aXZlVHJhbnNmb3JtcyxcbiAgICB0cmFuc2Zvcm1Ib2lzdCxcbiAgICBpc0J1aWx0SW5Db21wb25lbnQsXG4gICAgaXNDdXN0b21FbGVtZW50LFxuICAgIGV4cHJlc3Npb25QbHVnaW5zLFxuICAgIHNjb3BlSWQsXG4gICAgc2xvdHRlZCxcbiAgICBzc3IsXG4gICAgaW5TU1IsXG4gICAgc3NyQ3NzVmFycyxcbiAgICBiaW5kaW5nTWV0YWRhdGEsXG4gICAgaW5saW5lLFxuICAgIGlzVFMsXG4gICAgb25FcnJvcixcbiAgICBvbldhcm4sXG4gICAgY29tcGF0Q29uZmlnLFxuICAgIC8vIHN0YXRlXG4gICAgcm9vdCxcbiAgICBoZWxwZXJzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgIGNvbXBvbmVudHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgZGlyZWN0aXZlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICBob2lzdHM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGNvbnN0YW50Q2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIHRlbXBzOiAwLFxuICAgIGNhY2hlZDogMCxcbiAgICBpZGVudGlmaWVyczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgc2NvcGVzOiB7XG4gICAgICB2Rm9yOiAwLFxuICAgICAgdlNsb3Q6IDAsXG4gICAgICB2UHJlOiAwLFxuICAgICAgdk9uY2U6IDBcbiAgICB9LFxuICAgIHBhcmVudDogbnVsbCxcbiAgICBncmFuZFBhcmVudDogbnVsbCxcbiAgICBjdXJyZW50Tm9kZTogcm9vdCxcbiAgICBjaGlsZEluZGV4OiAwLFxuICAgIGluVk9uY2U6IGZhbHNlLFxuICAgIC8vIG1ldGhvZHNcbiAgICBoZWxwZXIobmFtZSkge1xuICAgICAgY29uc3QgY291bnQgPSBjb250ZXh0LmhlbHBlcnMuZ2V0KG5hbWUpIHx8IDA7XG4gICAgICBjb250ZXh0LmhlbHBlcnMuc2V0KG5hbWUsIGNvdW50ICsgMSk7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIHJlbW92ZUhlbHBlcihuYW1lKSB7XG4gICAgICBjb25zdCBjb3VudCA9IGNvbnRleHQuaGVscGVycy5nZXQobmFtZSk7XG4gICAgICBpZiAoY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50ID0gY291bnQgLSAxO1xuICAgICAgICBpZiAoIWN1cnJlbnRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuaGVscGVycy5kZWxldGUobmFtZSk7XG4gICAgICAgI
20578H0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5oZWxwZXJzLnNldChuYW1lLCBjdXJyZW50Q291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBoZWxwZXJTdHJpbmcobmFtZSkge1xuICAgICAgcmV0dXJuIGBfJHtoZWxwZXJOYW1lTWFwW2NvbnRleHQuaGVscGVyKG5hbWUpXX1gO1xuICAgIH0sXG4gICAgcmVwbGFjZU5vZGUobm9kZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgaWYgKCFjb250ZXh0LmN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGJlaW5nIHJlcGxhY2VkIGlzIGFscmVhZHkgcmVtb3ZlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSByb290IG5vZGUuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRleHQucGFyZW50LmNoaWxkcmVuW2NvbnRleHQuY2hpbGRJbmRleF0gPSBjb250ZXh0LmN1cnJlbnROb2RlID0gbm9kZTtcbiAgICB9LFxuICAgIHJlbW92ZU5vZGUobm9kZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbnRleHQucGFyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZSByb290IG5vZGUuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaXN0ID0gY29udGV4dC5wYXJlbnQuY2hpbGRyZW47XG4gICAgICBjb25zdCByZW1vdmFsSW5kZXggPSBub2RlID8gbGlzdC5pbmRleE9mKG5vZGUpIDogY29udGV4dC5jdXJyZW50Tm9kZSA/IGNvbnRleHQuY2hpbGRJbmRleCA6IC0xO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVtb3ZhbEluZGV4IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGUgYmVpbmcgcmVtb3ZlZCBpcyBub3QgYSBjaGlsZCBvZiBjdXJyZW50IHBhcmVudGApO1xuICAgICAgfVxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUgPT09IGNvbnRleHQuY3VycmVudE5vZGUpIHtcbiAgICAgICAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRleHQuY2hpbGRJbmRleCA+IHJlbW92YWxJbmRleCkge1xuICAgICAgICAgIGNvbnRleHQuY2hpbGRJbmRleC0tO1xuICAgICAgICAgIGNvbnRleHQub25Ob2RlUmVtb3ZlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250ZXh0LnBhcmVudC5jaGlsZHJlbi5zcGxpY2UocmVtb3ZhbEluZGV4LCAxKTtcbiAgICB9LFxuICAgIG9uTm9kZVJlbW92ZWQ6IE5PT1AsXG4gICAgYWRkSWRlbnRpZmllcnMoZXhwKSB7XG4gICAgfSxcbiAgICByZW1vdmVJZGVudGlmaWVycyhleHApIHtcbiAgICB9LFxuICAgIGhvaXN0KGV4cCkge1xuICAgICAgaWYgKGlzU3RyaW5nKGV4cCkpIGV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oZXhwKTtcbiAgICAgIGNvbnRleHQuaG9pc3RzLnB1c2goZXhwKTtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICBgX2hvaXN0ZWRfJHtjb250ZXh0LmhvaXN0cy5sZW5ndGh9YCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGV4cC5sb2MsXG4gICAgICAgIDJcbiAgICAgICk7XG4gICAgICBpZGVudGlmaWVyLmhvaXN0ZWQgPSBleHA7XG4gICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9LFxuICAgIGNhY2hlKGV4cCwgaXNWTm9kZSA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ2FjaGVFeHByZXNzaW9uKGNvbnRleHQuY2FjaGVkKyssIGV4cCwgaXNWTm9kZSk7XG4gICAgfVxuICB9O1xuICB7XG4gICAgY29udGV4dC5maWx0ZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybShyb290LCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0KHJvb3QsIG9wdGlvbnMpO1xuICB0cmF2ZXJzZU5vZGUocm9vdCwgY29udGV4dCk7XG4gIGlmIChvcHRpb25zLmhvaXN0U3RhdGljKSB7XG4gICAgaG9pc3RTdGF0aWMocm9vdCwgY29udGV4dCk7XG4gIH1cbiAgaWYgKCFvcHRpb25zLnNzcikge1xuICAgIGNyZWF0ZVJvb3RDb2RlZ2VuKHJvb3QsIGNvbnRleHQpO1xuICB9XG4gIHJvb3QuaGVscGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi5jb250ZXh0LmhlbHBlcnMua2V5cygpXSk7XG4gIHJvb3QuY29tcG9uZW50cyA9IFsuLi5jb250ZXh0LmNvbXBvbmVudHNdO1xuICByb290LmRpcmVjdGl2ZXMgPSBbLi4uY29udGV4dC5kaXJlY3RpdmVzXTtcbiAgcm9vdC5pbXBvcnRzID0gY29udGV4dC5pbXBvcnRzO1xuICByb290LmhvaXN0cyA9IGNvbnRleHQuaG9pc3RzO1xuICByb290LnRlbXBzID0gY29udGV4dC50ZW1wcztcbiAgcm9vdC5jYWNoZWQgPSBjb250ZXh0LmNhY2hlZDtcbiAgcm9vdC50cmFuc2Zvcm1lZCA9IHRydWU7XG4gIHtcbiAgICByb290LmZpbHRlcnMgPSBbLi4uY29udGV4dC5maWx0ZXJzXTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUm9vdENvZGVnZW4ocm9vdCwgY29udGV4dCkge1xuICBjb25zdCB7IGhlbHBlciB9ID0gY29udGV4dDtcbiAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcm9vdDtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgaWYgKGlzU2luZ2xlRWxlbWVudFJvb3Qocm9vdCwgY2hpbGQpICYmIGNoaWxkLmNvZGVnZW5Ob2RlKSB7XG4gICAgICBjb25zdCBjb2RlZ2VuTm9kZSA9IGNoaWxkLmNvZGVnZW5Ob2RlO1xuICAgICAgaWYgKGNvZGVnZW5Ob2RlLnR5cGUgPT09IDEzKSB7XG4gICAgICAgIGNvbnZlcnRUb0Jsb2NrKGNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJvb3QuY29kZWdlbk5vZGUgPSBjb2RlZ2VuTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdC5jb2RlZ2VuTm9kZSA9IGNoaWxkO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgbGV0IHBhdGNoRmxhZyA9IDY0O1xuICAgIGxldCBwYXRjaEZsYWdUZXh0ID0gUGF0Y2hGbGFnTmFtZXNbNjRdO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIGNoaWxkcmVuLmZpbHRlcigoYykgPT4gYy50eXBlICE9PSAzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSAyMDQ4O1xuICAgICAgcGF0Y2hGbGFnVGV4dCArPSBgLCAke1BhdGNoRmxhZ05hbWVzWzIwNDhdfWA7XG4gICAgfVxuICAgIHJvb3QuY29kZWdlbk5vZGUgPSBjcmVhdGVWTm9kZUNhbGwoXG4gICAgICBjb250ZXh0LFxuICAgICAgaGVscGVyKEZSQUdNRU5UKSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHJvb3QuY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICB2b2lkIDAsXG4gICAgICB2b2lkIDAsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9IGVsc2UgO1xufVxuZnVuY3Rpb24gdHJhdmVyc2VDaGlsZHJlbihwYXJlbnQsIGNvbnRleHQpIHtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBub2RlUmVtb3ZlZCA9ICgpID0+IHtcbiAgICBpLS07XG4gIH07XG4gIGZvciAoOyBpIDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5baV07XG4gICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkgY29udGludWU7XG4gICAgY29udGV4dC5ncmFuZFBhcmVudCA9IGNvbnRleHQucGFyZW50O1xuICAgIGNvbnRleHQucGFyZW50ID0gcGFyZW50O1xuICAgIGNvbnRleHQuY2hpbGRJbmRleCA9IGk7XG4gICAgY29udGV4dC5vbk5vZGVSZW1vdmVkID0gbm9kZVJlbW92ZWQ7XG4gICAgdHJhdmVyc2VOb2RlKGNoaWxkLCBjb250ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gdHJhdmVyc2VOb2RlKG5vZGUsIGNvbnRleHQpIHtcbiAgY29udGV4dC5jdXJyZW50Tm9kZSA9IG5vZGU7XG4gIGNvbnN0IHsgbm9kZVRyYW5zZm9ybXMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGV4aXRGbnMgPSBbXTtcbiAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IG5vZGVUcmFuc2Zvcm1zLmxlbmd0aDsgaTIrKykge1xuICAgIGNvbnN0IG9uRXhpdCA9IG5vZGVUcmFuc2Zvcm1zW2kyXShub2RlLCBjb250ZXh0KTtcbiAgICBpZiAob25FeGl0KSB7XG4gICAgICBpZiAoaXNBcnJheShvbkV4aXQpKSB7XG4gICAgICAgIGV4aXRGbnMucHVzaCguLi5vbkV4aXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdEZucy5wdXNoKG9uRXhpdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY29udGV4dC5jdXJyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gY29udGV4dC5jdXJyZW50Tm9kZTtcbiAgICB9XG4gIH1cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIDM6XG4gICAgICBpZiAoIWNvbnRleHQuc3NyKSB7XG4gICAgICAgIGNvbnRleHQuaGVscGVyKENSRUFURV9DT01NRU5UKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIGlmICghY29udGV4dC5zc3IpIHtcbiAgICAgICAgY29udGV4dC5oZWxwZXIoVE9fRElTUExBWV9TVFJJTkcpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IG5vZGUuYnJhbmNoZXMubGVuZ3RoOyBpMisrKSB7XG4gICAgICAgIHRyYXZlcnNlTm9kZShub2RlLmJyYW5jaGVzW2kyXSwgY29udGV4dCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgIGNhc2UgMTE6XG4gICAgY2FzZSAxOlxuICAgIGNhc2UgMDpcbiAgICAgIHRyYXZlcnNlQ2hpbGRyZW4obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgfVxuICBjb250ZXh0LmN1cnJlbnROb2RlID0gbm9kZTtcbiAgbGV0IGkgPSBleGl0Rm5zLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIGV4aXRGbnNbaV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybShuYW1lLCBmbikge1xuICBjb25zdCBtYXRjaGVzID0gaXNTdHJpbmcobmFtZSkgPyAobikgPT4gbiA9PT0gbmFtZSA6IChuKSA9PiBuYW1lLnRlc3Qobik7XG4gIHJldHVybiAobm9kZSwgY29udGV4dCkgPT4ge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IG5vZGU7XG4gICAgICBpZiAobm9kZS50YWdUeXBlID09PSAzICYmIHByb3BzLnNvbWUoaXNWU2xvdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpdEZucyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IDcgJiYgbWF0Y2hlcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgcHJvcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb25zdCBvbkV4aXQgPSBmbihub2RlLCBwcm9wLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAob25FeGl0KSBleGl0Rm5zLnB1c2gob25FeGl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4aXRGbnM7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBQVVJFX0FOTk9UQVRJT04gPSBgLyojX19QVVJFX18qL2A7XG5jb25zdCBhbGlhc0hlbHBlciA9IChzKSA9PiBgJHtoZWxwZXJOYW1lTWFwW3NdfTogXyR7aGVscGVyTmFtZU1hcFtzXX1gO1xuZnVuY3Rpb24gY3JlYXRlQ29kZWdlbkNvbnRleHQoYXN0LCB7XG4gIG1vZGUgPSBcImZ1bmN0aW9uXCIsXG4gIHByZWZpeElkZW50aWZpZXJzID0gbW9kZSA9PT0gXCJtb2R1bGVcIixcbiAgc291cmNlTWFwID0gZmFsc2UsXG4gIGZpbGVuYW1lID0gYHRlbXBsYXRlLnZ1ZS5odG1sYCxcbiAgc2NvcGVJZCA9IG51bGwsXG4gIG9wdGltaXplSW1wb3J0cyA9IGZhbHNlLFxuICBydW50aW1lR2xvYmFsTmFtZSA9IGBWdWVgLFxuICBydW50aW1lTW9kdWxlTmFtZSA9IGB2dWVgLFxuICBzc3JSdW50aW1lTW9kdWxlTmFtZSA9IFwidnVlL3NlcnZlci1yZW5kZXJlclwiLFxuICBzc3IgPSBmYWxzZSxcbiAgaXNUUyA9IGZhbHNlLFxuICBpblNTUiA9IGZhbHNlXG59KSB7XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgbW9kZSxcbiAgICBwcmVmaXhJZGVudGlmaWVycyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZmlsZW5hbWUsXG4gICAgc2NvcGVJZCxcbiAgICBvcHRpbWl6ZUltcG9ydHMsXG4gICAgcnVudGltZUdsb2JhbE5hbWUsXG4gICAgcnVudGltZU1vZHVsZU5hbWUsXG4gICAgc3NyUnVudGltZU1vZHVsZU5hbWUsXG4gICAgc3NyLFxuICAgIGlzVFMsXG4gICAgaW5TU1IsXG4gICAgc291cmNlOiBhc3Quc291cmNlLFxuICAgIGNvZGU6IGBgLFxuICAgIGNvbHVtbjogMSxcbiAgICBsaW5lOiAxLFxuICAgIG9mZnNldDogMCxcbiAgICBpbmRlbnRMZXZlbDogMCxcbiAgICBwdXJlOiBmYWxzZSxcbiAgICBtYXA6IHZvaWQgMCxcbiAgICBoZWxwZXIoa2V5KSB7XG4gICAgICByZXR1cm4gYF8ke2hlbHBlck5hbWVNYXBba2V5XX1gO1xuICAgIH0sXG4gICAgcHVzaChjb2RlLCBuZXdsaW5lSW5kZXggPSAtMiAvKiBOb25lICovLCBub2RlKSB7XG4gICAgICBjb250ZXh0LmNvZGUgKz0gY29kZTtcbiAgICB9LFxuICAgIGluZGVudCgpIHtcbiAgICAgIG5ld2xpbmUoKytjb250ZXh0LmluZGVudExldmVsKTtcbiAgICB9LFxuICAgIGRlaW5kZW50KHdpdGhvdXROZXdMaW5lID0gZmFsc2UpIHtcbiAgICAgIGlmICh3aXRob3V0TmV3TGluZSkge1xuICAgICAgICAtLWNvbnRleHQuaW5kZW50TGV2ZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdsaW5lKC0tY29udGV4dC5pbmRlbnRMZXZlbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBuZXdsaW5lKCkge1xuICAgICAgbmV3bGluZShjb250ZXh0LmluZGVudExldmVsKTtcbiAgICB9XG4gI
20578H07XG4gIGZ1bmN0aW9uIG5ld2xpbmUobikge1xuICAgIGNvbnRleHQucHVzaChcIlxcblwiICsgYCAgYC5yZXBlYXQobiksIDAgLyogU3RhcnQgKi8pO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufVxuZnVuY3Rpb24gZ2VuZXJhdGUoYXN0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUNvZGVnZW5Db250ZXh0KGFzdCwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLm9uQ29udGV4dENyZWF0ZWQpIG9wdGlvbnMub25Db250ZXh0Q3JlYXRlZChjb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIG1vZGUsXG4gICAgcHVzaCxcbiAgICBwcmVmaXhJZGVudGlmaWVycyxcbiAgICBpbmRlbnQsXG4gICAgZGVpbmRlbnQsXG4gICAgbmV3bGluZSxcbiAgICBzY29wZUlkLFxuICAgIHNzclxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgaGVscGVycyA9IEFycmF5LmZyb20oYXN0LmhlbHBlcnMpO1xuICBjb25zdCBoYXNIZWxwZXJzID0gaGVscGVycy5sZW5ndGggPiAwO1xuICBjb25zdCB1c2VXaXRoQmxvY2sgPSAhcHJlZml4SWRlbnRpZmllcnMgJiYgbW9kZSAhPT0gXCJtb2R1bGVcIjtcbiAgY29uc3QgcHJlYW1ibGVDb250ZXh0ID0gY29udGV4dDtcbiAge1xuICAgIGdlbkZ1bmN0aW9uUHJlYW1ibGUoYXN0LCBwcmVhbWJsZUNvbnRleHQpO1xuICB9XG4gIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHNzciA/IGBzc3JSZW5kZXJgIDogYHJlbmRlcmA7XG4gIGNvbnN0IGFyZ3MgPSBzc3IgPyBbXCJfY3R4XCIsIFwiX3B1c2hcIiwgXCJfcGFyZW50XCIsIFwiX2F0dHJzXCJdIDogW1wiX2N0eFwiLCBcIl9jYWNoZVwiXTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXJncy5qb2luKFwiLCBcIik7XG4gIHtcbiAgICBwdXNoKGBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0oJHtzaWduYXR1cmV9KSB7YCk7XG4gIH1cbiAgaW5kZW50KCk7XG4gIGlmICh1c2VXaXRoQmxvY2spIHtcbiAgICBwdXNoKGB3aXRoIChfY3R4KSB7YCk7XG4gICAgaW5kZW50KCk7XG4gICAgaWYgKGhhc0hlbHBlcnMpIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBjb25zdCB7ICR7aGVscGVycy5tYXAoYWxpYXNIZWxwZXIpLmpvaW4oXCIsIFwiKX0gfSA9IF9WdWVcbmAsXG4gICAgICAgIC0xIC8qIEVuZCAqL1xuICAgICAgKTtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFzdC5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgIGdlbkFzc2V0cyhhc3QuY29tcG9uZW50cywgXCJjb21wb25lbnRcIiwgY29udGV4dCk7XG4gICAgaWYgKGFzdC5kaXJlY3RpdmVzLmxlbmd0aCB8fCBhc3QudGVtcHMgPiAwKSB7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIGlmIChhc3QuZGlyZWN0aXZlcy5sZW5ndGgpIHtcbiAgICBnZW5Bc3NldHMoYXN0LmRpcmVjdGl2ZXMsIFwiZGlyZWN0aXZlXCIsIGNvbnRleHQpO1xuICAgIGlmIChhc3QudGVtcHMgPiAwKSB7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIGlmIChhc3QuZmlsdGVycyAmJiBhc3QuZmlsdGVycy5sZW5ndGgpIHtcbiAgICBuZXdsaW5lKCk7XG4gICAgZ2VuQXNzZXRzKGFzdC5maWx0ZXJzLCBcImZpbHRlclwiLCBjb250ZXh0KTtcbiAgICBuZXdsaW5lKCk7XG4gIH1cbiAgaWYgKGFzdC50ZW1wcyA+IDApIHtcbiAgICBwdXNoKGBsZXQgYCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc3QudGVtcHM7IGkrKykge1xuICAgICAgcHVzaChgJHtpID4gMCA/IGAsIGAgOiBgYH1fdGVtcCR7aX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFzdC5jb21wb25lbnRzLmxlbmd0aCB8fCBhc3QuZGlyZWN0aXZlcy5sZW5ndGggfHwgYXN0LnRlbXBzKSB7XG4gICAgcHVzaChgXG5gLCAwIC8qIFN0YXJ0ICovKTtcbiAgICBuZXdsaW5lKCk7XG4gIH1cbiAgaWYgKCFzc3IpIHtcbiAgICBwdXNoKGByZXR1cm4gYCk7XG4gIH1cbiAgaWYgKGFzdC5jb2RlZ2VuTm9kZSkge1xuICAgIGdlbk5vZGUoYXN0LmNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBwdXNoKGBudWxsYCk7XG4gIH1cbiAgaWYgKHVzZVdpdGhCbG9jaykge1xuICAgIGRlaW5kZW50KCk7XG4gICAgcHVzaChgfWApO1xuICB9XG4gIGRlaW5kZW50KCk7XG4gIHB1c2goYH1gKTtcbiAgcmV0dXJuIHtcbiAgICBhc3QsXG4gICAgY29kZTogY29udGV4dC5jb2RlLFxuICAgIHByZWFtYmxlOiBgYCxcbiAgICBtYXA6IGNvbnRleHQubWFwID8gY29udGV4dC5tYXAudG9KU09OKCkgOiB2b2lkIDBcbiAgfTtcbn1cbmZ1bmN0aW9uIGdlbkZ1bmN0aW9uUHJlYW1ibGUoYXN0LCBjb250ZXh0KSB7XG4gIGNvbnN0IHtcbiAgICBzc3IsXG4gICAgcHJlZml4SWRlbnRpZmllcnMsXG4gICAgcHVzaCxcbiAgICBuZXdsaW5lLFxuICAgIHJ1bnRpbWVNb2R1bGVOYW1lLFxuICAgIHJ1bnRpbWVHbG9iYWxOYW1lLFxuICAgIHNzclJ1bnRpbWVNb2R1bGVOYW1lXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCBWdWVCaW5kaW5nID0gcnVudGltZUdsb2JhbE5hbWU7XG4gIGNvbnN0IGhlbHBlcnMgPSBBcnJheS5mcm9tKGFzdC5oZWxwZXJzKTtcbiAgaWYgKGhlbHBlcnMubGVuZ3RoID4gMCkge1xuICAgIHtcbiAgICAgIHB1c2goYGNvbnN0IF9WdWUgPSAke1Z1ZUJpbmRpbmd9XG5gLCAtMSAvKiBFbmQgKi8pO1xuICAgICAgaWYgKGFzdC5ob2lzdHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0hlbHBlcnMgPSBbXG4gICAgICAgICAgQ1JFQVRFX1ZOT0RFLFxuICAgICAgICAgIENSRUFURV9FTEVNRU5UX1ZOT0RFLFxuICAgICAgICAgIENSRUFURV9DT01NRU5ULFxuICAgICAgICAgIENSRUFURV9URVhULFxuICAgICAgICAgIENSRUFURV9TVEFUSUNcbiAgICAgICAgXS5maWx0ZXIoKGhlbHBlcikgPT4gaGVscGVycy5pbmNsdWRlcyhoZWxwZXIpKS5tYXAoYWxpYXNIZWxwZXIpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgcHVzaChgY29uc3QgeyAke3N0YXRpY0hlbHBlcnN9IH0gPSBfVnVlXG5gLCAtMSAvKiBFbmQgKi8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZW5Ib2lzdHMoYXN0LmhvaXN0cywgY29udGV4dCk7XG4gIG5ld2xpbmUoKTtcbiAgcHVzaChgcmV0dXJuIGApO1xufVxuZnVuY3Rpb24gZ2VuQXNzZXRzKGFzc2V0cywgdHlwZSwgeyBoZWxwZXIsIHB1c2gsIG5ld2xpbmUsIGlzVFMgfSkge1xuICBjb25zdCByZXNvbHZlciA9IGhlbHBlcihcbiAgICB0eX
20578BlID09PSBcImZpbHRlclwiID8gUkVTT0xWRV9GSUxURVIgOiB0eXBlID09PSBcImNvbXBvbmVudFwiID8gUkVTT0xWRV9DT01QT05FTlQgOiBSRVNPTFZFX0RJUkVDVElWRVxuICApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFzc2V0cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpZCA9IGFzc2V0c1tpXTtcbiAgICBjb25zdCBtYXliZVNlbGZSZWZlcmVuY2UgPSBpZC5lbmRzV2l0aChcIl9fc2VsZlwiKTtcbiAgICBpZiAobWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgICBpZCA9IGlkLnNsaWNlKDAsIC02KTtcbiAgICB9XG4gICAgcHVzaChcbiAgICAgIGBjb25zdCAke3RvVmFsaWRBc3NldElkKGlkLCB0eXBlKX0gPSAke3Jlc29sdmVyfSgke0pTT04uc3RyaW5naWZ5KGlkKX0ke21heWJlU2VsZlJlZmVyZW5jZSA/IGAsIHRydWVgIDogYGB9KSR7aXNUUyA/IGAhYCA6IGBgfWBcbiAgICApO1xuICAgIGlmIChpIDwgYXNzZXRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkhvaXN0cyhob2lzdHMsIGNvbnRleHQpIHtcbiAgaWYgKCFob2lzdHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnRleHQucHVyZSA9IHRydWU7XG4gIGNvbnN0IHsgcHVzaCwgbmV3bGluZSwgaGVscGVyLCBzY29wZUlkLCBtb2RlIH0gPSBjb250ZXh0O1xuICBuZXdsaW5lKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaG9pc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZXhwID0gaG9pc3RzW2ldO1xuICAgIGlmIChleHApIHtcbiAgICAgIHB1c2goXG4gICAgICAgIGBjb25zdCBfaG9pc3RlZF8ke2kgKyAxfSA9ICR7YGB9YFxuICAgICAgKTtcbiAgICAgIGdlbk5vZGUoZXhwLCBjb250ZXh0KTtcbiAgICAgIG5ld2xpbmUoKTtcbiAgICB9XG4gIH1cbiAgY29udGV4dC5wdXJlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1RleHQobikge1xuICByZXR1cm4gaXNTdHJpbmcobikgfHwgbi50eXBlID09PSA0IHx8IG4udHlwZSA9PT0gMiB8fCBuLnR5cGUgPT09IDUgfHwgbi50eXBlID09PSA4O1xufVxuZnVuY3Rpb24gZ2VuTm9kZUxpc3RBc0FycmF5KG5vZGVzLCBjb250ZXh0KSB7XG4gIGNvbnN0IG11bHRpbGluZXMgPSBub2Rlcy5sZW5ndGggPiAzIHx8ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbm9kZXMuc29tZSgobikgPT4gaXNBcnJheShuKSB8fCAhaXNUZXh0KG4pKTtcbiAgY29udGV4dC5wdXNoKGBbYCk7XG4gIG11bHRpbGluZXMgJiYgY29udGV4dC5pbmRlbnQoKTtcbiAgZ2VuTm9kZUxpc3Qobm9kZXMsIGNvbnRleHQsIG11bHRpbGluZXMpO1xuICBtdWx0aWxpbmVzICYmIGNvbnRleHQuZGVpbmRlbnQoKTtcbiAgY29udGV4dC5wdXNoKGBdYCk7XG59XG5mdW5jdGlvbiBnZW5Ob2RlTGlzdChub2RlcywgY29udGV4dCwgbXVsdGlsaW5lcyA9IGZhbHNlLCBjb21tYSA9IHRydWUpIHtcbiAgY29uc3QgeyBwdXNoLCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmIChpc1N0cmluZyhub2RlKSkge1xuICAgICAgcHVzaChub2RlLCAtMyAvKiBVbmtub3duICovKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGdlbk5vZGVMaXN0QXNBcnJheShub2RlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuTm9kZShub2RlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKGkgPCBub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICBpZiAobXVsdGlsaW5lcykge1xuICAgICAgICBjb21tYSAmJiBwdXNoKFwiLFwiKTtcbiAgICAgICAgbmV3bGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWEgJiYgcHVzaChcIiwgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2VuTm9kZShub2RlLCBjb250ZXh0KSB7XG4gIGlmIChpc1N0cmluZyhub2RlKSkge1xuICAgIGNvbnRleHQucHVzaChub2RlLCAtMyAvKiBVbmtub3duICovKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzU3ltYm9sKG5vZGUpKSB7XG4gICAgY29udGV4dC5wdXNoKGNvbnRleHQuaGVscGVyKG5vZGUpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIDE6XG4gICAgY2FzZSA5OlxuICAgIGNhc2UgMTE6XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGFzc2VydChcbiAgICAgICAgbm9kZS5jb2RlZ2VuTm9kZSAhPSBudWxsLFxuICAgICAgICBgQ29kZWdlbiBub2RlIGlzIG1pc3NpbmcgZm9yIGVsZW1lbnQvaWYvZm9yIG5vZGUuIEFwcGx5IGFwcHJvcHJpYXRlIHRyYW5zZm9ybXMgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIGdlbk5vZGUobm9kZS5jb2RlZ2VuTm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBnZW5UZXh0KG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgZ2VuRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIGdlbkludGVycG9sYXRpb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyOlxuICAgICAgZ2VuTm9kZShub2RlLmNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIGdlbkNvbW1lbnQobm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgZ2VuVk5vZGVDYWxsKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNDpcbiAgICAgIGdlbkNhbGxFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNTpcbiAgICAgIGdlbk9iamVjdEV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE3OlxuICAgICAgZ2VuQXJyYXlFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxODpcbiAgICAgIGdlbkZ1bmN0aW9uRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTk6XG4gICAgICBnZW5Db25kaXRpb25hbEV4cHJlc3Npb24obm9kZSwgY29udGV4dCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIwOlxuICAgICAgZ2VuQ2FjaG
20578VFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMTpcbiAgICAgIGdlbk5vZGVMaXN0KG5vZGUuYm9keSwgY29udGV4dCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjM6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI0OlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNTpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjY6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgYHVuaGFuZGxlZCBjb2RlZ2VuIG5vZGUgdHlwZTogJHtub2RlLnR5cGV9YCk7XG4gICAgICAgIGNvbnN0IGV4aGF1c3RpdmVDaGVjayA9IG5vZGU7XG4gICAgICAgIHJldHVybiBleGhhdXN0aXZlQ2hlY2s7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlblRleHQobm9kZSwgY29udGV4dCkge1xuICBjb250ZXh0LnB1c2goSlNPTi5zdHJpbmdpZnkobm9kZS5jb250ZW50KSwgLTMgLyogVW5rbm93biAqLywgbm9kZSk7XG59XG5mdW5jdGlvbiBnZW5FeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBjb250ZW50LCBpc1N0YXRpYyB9ID0gbm9kZTtcbiAgY29udGV4dC5wdXNoKFxuICAgIGlzU3RhdGljID8gSlNPTi5zdHJpbmdpZnkoY29udGVudCkgOiBjb250ZW50LFxuICAgIC0zIC8qIFVua25vd24gKi8sXG4gICAgbm9kZVxuICApO1xufVxuZnVuY3Rpb24gZ2VuSW50ZXJwb2xhdGlvbihub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgcHVzaCwgaGVscGVyLCBwdXJlIH0gPSBjb250ZXh0O1xuICBpZiAocHVyZSkgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICBwdXNoKGAke2hlbHBlcihUT19ESVNQTEFZX1NUUklORyl9KGApO1xuICBnZW5Ob2RlKG5vZGUuY29udGVudCwgY29udGV4dCk7XG4gIHB1c2goYClgKTtcbn1cbmZ1bmN0aW9uIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICBpZiAoaXNTdHJpbmcoY2hpbGQpKSB7XG4gICAgICBjb250ZXh0LnB1c2goY2hpbGQsIC0zIC8qIFVua25vd24gKi8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5Ob2RlKGNoaWxkLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkV4cHJlc3Npb25Bc1Byb3BlcnR5S2V5KG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoIH0gPSBjb250ZXh0O1xuICBpZiAobm9kZS50eXBlID09PSA4KSB7XG4gICAgcHVzaChgW2ApO1xuICAgIGdlbkNvbXBvdW5kRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KTtcbiAgICBwdXNoKGBdYCk7XG4gIH0gZWxzZSBpZiAobm9kZS5pc1N0YXRpYykge1xuICAgIGNvbnN0IHRleHQgPSBpc1NpbXBsZUlkZW50aWZpZXIobm9kZS5jb250ZW50KSA/IG5vZGUuY29udGVudCA6IEpTT04uc3RyaW5naWZ5KG5vZGUuY29udGVudCk7XG4gICAgcHVzaCh0ZXh0LCAtMiAvKiBOb25lICovLCBub2RlKTtcbiAgfSBlbHNlIHtcbiAgICBwdXNoKGBbJHtub2RlLmNvbnRlbnR9XWAsIC0zIC8qIFVua25vd24gKi8sIG5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBnZW5Db21tZW50KG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGlmIChwdXJlKSB7XG4gICAgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICB9XG4gIHB1c2goXG4gICAgYCR7aGVscGVyKENSRUFURV9DT01NRU5UKX0oJHtKU09OLnN0cmluZ2lmeShub2RlLmNvbnRlbnQpfSlgLFxuICAgIC0zIC8qIFVua25vd24gKi8sXG4gICAgbm9kZVxuICApO1xufVxuZnVuY3Rpb24gZ2VuVk5vZGVDYWxsKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICB0YWcsXG4gICAgcHJvcHMsXG4gICAgY2hpbGRyZW4sXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGlzQmxvY2ssXG4gICAgZGlzYWJsZVRyYWNraW5nLFxuICAgIGlzQ29tcG9uZW50XG4gIH0gPSBub2RlO1xuICBsZXQgcGF0Y2hGbGFnU3RyaW5nO1xuICBpZiAocGF0Y2hGbGFnKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPCAwKSB7XG4gICAgICAgIHBhdGNoRmxhZ1N0cmluZyA9IHBhdGNoRmxhZyArIGAgLyogJHtQYXRjaEZsYWdOYW1lc1twYXRjaEZsYWddfSAqL2A7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmbGFnTmFtZXMgPSBPYmplY3Qua2V5cyhQYXRjaEZsYWdOYW1lcykubWFwKE51bWJlcikuZmlsdGVyKChuKSA9PiBuID4gMCAmJiBwYXRjaEZsYWcgJiBuKS5tYXAoKG4pID0+IFBhdGNoRmxhZ05hbWVzW25dKS5qb2luKGAsIGApO1xuICAgICAgICBwYXRjaEZsYWdTdHJpbmcgPSBwYXRjaEZsYWcgKyBgIC8qICR7ZmxhZ05hbWVzfSAqL2A7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoRmxhZ1N0cmluZyA9IFN0cmluZyhwYXRjaEZsYWcpO1xuICAgIH1cbiAgfVxuICBpZiAoZGlyZWN0aXZlcykge1xuICAgIHB1c2goaGVscGVyKFdJVEhfRElSRUNUSVZFUykgKyBgKGApO1xuICB9XG4gIGlmIChpc0Jsb2NrKSB7XG4gICAgcHVzaChgKCR7aGVscGVyKE9QRU5fQkxPQ0spfSgke2Rpc2FibGVUcmFja2luZyA/IGB0cnVlYCA6IGBgfSksIGApO1xuICB9XG4gIGlmIChwdXJlKSB7XG4gICAgcHVzaChQVVJFX0FOTk9UQVRJT04pO1xuICB9XG4gIGNvbnN0IGNhbGxIZWxwZXIgPSBpc0Jsb2NrID8gZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudCkgOiBnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBpc0NvbXBvbmVudCk7XG4gIHB1c2goaGVscGVyKGNhbGxIZWxwZXIpICsgYChgLCAtMiAvKiBOb25lICovLCBub2RlKTtcbiAgZ2VuTm9kZUxpc3QoXG4gICAgZ2VuTnVsbGFibGVBcmdzKFt0YWcsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnU3RyaW5nLCBkeW5hbWljUHJvcHNdKSxcbiAgICBjb250ZXh0XG4gICk7XG4gIHB1c2goYClgKTtcbiAgaWYgKGlzQmxvY2spIHtcbiAgICBwdXNoKGApYCk7XG4gIH1cbiAgaWYgKGRpcmVjdGl2ZXMpIHtcbiAgICBwdXNoKGAsIGApO1xuICAgIGdlbk5vZGUoZGlyZWN0aXZlcywgY29udGV4dCk7XG4gICAgcHVzaChgKWApO1xuICB9XG59XG5mdW5jdGlvbiBnZW5OdWxsYWJsZUFyZ3MoYXJncykge1xuICBsZXQgaSA9IGFyZ3MubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKGFyZ3NbaV0gIT0gbnVsbCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGFyZ3Muc2xpY2UoMCwgaSArIDEpLm1hcCgoYXJnKSA9PiBhcmcgfHwgYG51bGxgKTtcbn1cbmZ1bmN0aW9uIGdlbkNhbGxFeHByZXNzaW9uKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBwdXNoLCBoZWxwZXIsIHB1cmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGNhbGxlZSA9IGlzU3RyaW5nKG5vZGUuY2FsbGVlKSA/IG5vZGUuY2FsbGVlIDogaGVscGVyKG5vZGUuY2FsbGVlKTtcbiAgaWYgKHB1cmUpIHtcbiAgICBwdXNoKFBVUkVfQU5OT1RBVElPTik7XG4gIH1cbiAgcHVzaChjYWxsZWUgKyBgKGAsIC0yIC8qIE5vbmUgKi8sIG5vZGUpO1xuICBnZW5Ob2RlTGlzdChub2RlLmFyZ3VtZW50cywgY29udGV4dCk7XG4gIHB1c2goYClgKTtcbn1cbmZ1bmN0aW9uIGdlbk9iamVjdEV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGluZGVudCwgZGVpbmRlbnQsIG5ld2xpbmUgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgcHJvcGVydGllcyB9ID0gbm9kZTtcbiAgaWYgKCFwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHB1c2goYHt9YCwgLTIgLyogTm9uZSAqLywgbm9kZSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG11bHRpbGluZXMgPSBwcm9wZXJ0aWVzLmxlbmd0aCA+IDEgfHwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwcm9wZXJ0aWVzLnNvbWUoKHApID0+IHAudmFsdWUud
20578HlwZSAhPT0gNCk7XG4gIHB1c2gobXVsdGlsaW5lcyA/IGB7YCA6IGB7IGApO1xuICBtdWx0aWxpbmVzICYmIGluZGVudCgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHByb3BlcnRpZXNbaV07XG4gICAgZ2VuRXhwcmVzc2lvbkFzUHJvcGVydHlLZXkoa2V5LCBjb250ZXh0KTtcbiAgICBwdXNoKGA6IGApO1xuICAgIGdlbk5vZGUodmFsdWUsIGNvbnRleHQpO1xuICAgIGlmIChpIDwgcHJvcGVydGllcy5sZW5ndGggLSAxKSB7XG4gICAgICBwdXNoKGAsYCk7XG4gICAgICBuZXdsaW5lKCk7XG4gICAgfVxuICB9XG4gIG11bHRpbGluZXMgJiYgZGVpbmRlbnQoKTtcbiAgcHVzaChtdWx0aWxpbmVzID8gYH1gIDogYCB9YCk7XG59XG5mdW5jdGlvbiBnZW5BcnJheUV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBnZW5Ob2RlTGlzdEFzQXJyYXkobm9kZS5lbGVtZW50cywgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZW5GdW5jdGlvbkV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGluZGVudCwgZGVpbmRlbnQgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgcGFyYW1zLCByZXR1cm5zLCBib2R5LCBuZXdsaW5lLCBpc1Nsb3QgfSA9IG5vZGU7XG4gIGlmIChpc1Nsb3QpIHtcbiAgICBwdXNoKGBfJHtoZWxwZXJOYW1lTWFwW1dJVEhfQ1RYXX0oYCk7XG4gIH1cbiAgcHVzaChgKGAsIC0yIC8qIE5vbmUgKi8sIG5vZGUpO1xuICBpZiAoaXNBcnJheShwYXJhbXMpKSB7XG4gICAgZ2VuTm9kZUxpc3QocGFyYW1zLCBjb250ZXh0KTtcbiAgfSBlbHNlIGlmIChwYXJhbXMpIHtcbiAgICBnZW5Ob2RlKHBhcmFtcywgY29udGV4dCk7XG4gIH1cbiAgcHVzaChgKSA9PiBgKTtcbiAgaWYgKG5ld2xpbmUgfHwgYm9keSkge1xuICAgIHB1c2goYHtgKTtcbiAgICBpbmRlbnQoKTtcbiAgfVxuICBpZiAocmV0dXJucykge1xuICAgIGlmIChuZXdsaW5lKSB7XG4gICAgICBwdXNoKGByZXR1cm4gYCk7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHJldHVybnMpKSB7XG4gICAgICBnZW5Ob2RlTGlzdEFzQXJyYXkocmV0dXJucywgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbk5vZGUocmV0dXJucywgY29udGV4dCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGJvZHkpIHtcbiAgICBnZW5Ob2RlKGJvZHksIGNvbnRleHQpO1xuICB9XG4gIGlmIChuZXdsaW5lIHx8IGJvZHkpIHtcbiAgICBkZWluZGVudCgpO1xuICAgIHB1c2goYH1gKTtcbiAgfVxuICBpZiAoaXNTbG90KSB7XG4gICAgaWYgKG5vZGUuaXNOb25TY29wZWRTbG90KSB7XG4gICAgICBwdXNoKGAsIHVuZGVmaW5lZCwgdHJ1ZWApO1xuICAgIH1cbiAgICBwdXNoKGApYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdlbkNvbmRpdGlvbmFsRXhwcmVzc2lvbihub2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlLCBuZXdsaW5lOiBuZWVkTmV3bGluZSB9ID0gbm9kZTtcbiAgY29uc3QgeyBwdXNoLCBpbmRlbnQsIGRlaW5kZW50LCBuZXdsaW5lIH0gPSBjb250ZXh0O1xuICBpZiAodGVzdC50eXBlID09PSA0KSB7XG4gICAgY29uc3QgbmVlZHNQYXJlbnMgPSAhaXNTaW1wbGVJZGVudGlmaWVyKHRlc3QuY29udGVudCk7XG4gICAgbmVlZHNQYXJlbnMgJiYgcHVzaChgKGApO1xuICAgIGdlbkV4cHJlc3Npb24odGVzdCwgY29udGV4dCk7XG4gICAgbmVlZHNQYXJlbnMgJiYgcHVzaChgKWApO1xuICB9IGVsc2Uge1xuICAgIHB1c2goYChgKTtcbiAgICBnZW5Ob2RlKHRlc3QsIGNvbnRleHQpO1xuICAgIHB1c2goYClgKTtcbiAgfVxuICBuZWVkTmV3bGluZSAmJiBpbmRlbnQoKTtcbiAgY29udGV4dC5pbmRlbnRMZXZlbCsrO1xuICBuZWVkTmV3bGluZSB8fCBwdXNoKGAgYCk7XG4gIHB1c2goYD8gYCk7XG4gIGdlbk5vZGUoY29uc2VxdWVudCwgY29udGV4dCk7XG4gIGNvbnRleHQuaW5kZW50TGV2ZWwtLTtcbiAgbmVlZE5ld2xpbmUgJiYgbmV3bGluZSgpO1xuICBuZWVkTmV3bGluZSB8fCBwdXNoKGAgYCk7XG4gIHB1c2goYDogYCk7XG4gIGNvbnN0IGlzTmVzdGVkID0gYWx0ZXJuYXRlLnR5cGUgPT09IDE5O1xuICBpZiAoIWlzTmVzdGVkKSB7XG4gICAgY29udGV4dC5pbmRlbnRMZXZlbCsrO1xuICB9XG4gIGdlbk5vZGUoYWx0ZXJuYXRlLCBjb250ZXh0KTtcbiAgaWYgKCFpc05lc3RlZCkge1xuICAgIGNvbnRleHQuaW5kZW50TGV2ZWwtLTtcbiAgfVxuICBuZWVkTmV3bGluZSAmJiBkZWluZGVudChcbiAgICB0cnVlXG4gICAgLyogd2l0aG91dCBuZXdsaW5lICovXG4gICk7XG59XG5mdW5jdGlvbiBnZW5DYWNoZUV4cHJlc3Npb24obm9kZSwgY29udGV4dCkge1xuICBjb25zdCB7IHB1c2gsIGhlbHBlciwgaW5kZW50LCBkZWluZGVudCwgbmV3bGluZSB9ID0gY29udGV4dDtcbiAgcHVzaChgX2NhY2hlWyR7bm9kZS5pbmRleH1dIHx8IChgKTtcbiAgaWYgKG5vZGUuaXNWT25jZSkge1xuICAgIGluZGVudCgpO1xuICAgIHB1c2goYCR7aGVscGVyKFNFVF9CTE9DS19UUkFDS0lORyl9KC0xKSxgKTtcbiAgICBuZXdsaW5lKCk7XG4gICAgcHVzaChgKGApO1xuICB9XG4gIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XSA9IGApO1xuICBnZW5Ob2RlKG5vZGUudmFsdWUsIGNvbnRleHQpO1xuICBpZiAobm9kZS5pc1ZPbmNlKSB7XG4gICAgcHVzaChgKS5jYWNoZUluZGV4ID0gJHtub2RlLmluZGV4fSxgKTtcbiAgICBuZXdsaW5lKCk7XG4gICAgcHVzaChgJHtoZWxwZXIoU0VUX0JMT0NLX1RSQUNLSU5HKX0oMSksYCk7XG4gICAgbmV3bGluZSgpO1xuICAgIHB1c2goYF9jYWNoZVske25vZGUuaW5kZXh9XWApO1xuICAgIGRlaW5kZW50KCk7XG4gIH1cbiAgcHVzaChgKWApO1xufVxuXG5jb25zdCBwcm9oaWJpdGVkS2V5d29yZFJFID0gbmV3IFJlZ0V4cChcbiAgXCJcXFxcYlwiICsgXCJhcmd1bWVudHMsYXdhaXQsYnJlYWssY2FzZSxjYXRjaCxjbGFzcyxjb25zdCxjb250aW51ZSxkZWJ1Z2dlcixkZWZhdWx0LGRlbGV0ZSxkbyxlbHNlLGV4cG9ydCxleHRlbmRzLGZpbmFsbHksZm9yLGZ1bmN0aW9uLGlmLGltcG9ydCxsZXQsbmV3LHJldHVybixzdXBlcixzd2l0Y2gsdGhyb3csdHJ5L
20578HZhcix2b2lkLHdoaWxlLHdpdGgseWllbGRcIi5zcGxpdChcIixcIikuam9pbihcIlxcXFxifFxcXFxiXCIpICsgXCJcXFxcYlwiXG4pO1xuY29uc3Qgc3RyaXBTdHJpbmdSRSA9IC8nKD86W14nXFxcXF18XFxcXC4pKid8XCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifGAoPzpbXmBcXFxcXXxcXFxcLikqXFwkXFx7fFxcfSg/OlteYFxcXFxdfFxcXFwuKSpgfGAoPzpbXmBcXFxcXXxcXFxcLikqYC9nO1xuZnVuY3Rpb24gdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcyA9IGZhbHNlLCBhc1Jhd1N0YXRlbWVudHMgPSBmYWxzZSkge1xuICBjb25zdCBleHAgPSBub2RlLmNvbnRlbnQ7XG4gIGlmICghZXhwLnRyaW0oKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcbiAgICAgIGFzUmF3U3RhdGVtZW50cyA/IGAgJHtleHB9IGAgOiBgcmV0dXJuICR7YXNQYXJhbXMgPyBgKCR7ZXhwfSkgPT4ge31gIDogYCgke2V4cH0pYH1gXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxldCBtZXNzYWdlID0gZS5tZXNzYWdlO1xuICAgIGNvbnN0IGtleXdvcmRNYXRjaCA9IGV4cC5yZXBsYWNlKHN0cmlwU3RyaW5nUkUsIFwiXCIpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpO1xuICAgIGlmIChrZXl3b3JkTWF0Y2gpIHtcbiAgICAgIG1lc3NhZ2UgPSBgYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6IFwiJHtrZXl3b3JkTWF0Y2hbMF19XCJgO1xuICAgIH1cbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICA0NSxcbiAgICAgICAgbm9kZS5sb2MsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtRXhwcmVzc2lvbiA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDUpIHtcbiAgICBub2RlLmNvbnRlbnQgPSBwcm9jZXNzRXhwcmVzc2lvbihcbiAgICAgIG5vZGUuY29udGVudCxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5wcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGlyID0gbm9kZS5wcm9wc1tpXTtcbiAgICAgIGlmIChkaXIudHlwZSA9PT0gNyAmJiBkaXIubmFtZSAhPT0gXCJmb3JcIikge1xuICAgICAgICBjb25zdCBleHAgPSBkaXIuZXhwO
205781xuICAgICAgICBjb25zdCBhcmcgPSBkaXIuYXJnO1xuICAgICAgICBpZiAoZXhwICYmIGV4cC50eXBlID09PSA0ICYmICEoZGlyLm5hbWUgPT09IFwib25cIiAmJiBhcmcpKSB7XG4gICAgICAgICAgZGlyLmV4cCA9IHByb2Nlc3NFeHByZXNzaW9uKFxuICAgICAgICAgICAgZXhwLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIC8vIHNsb3QgYXJncyBtdXN0IGJlIHByb2Nlc3NlZCBhcyBmdW5jdGlvbiBwYXJhbXNcbiAgICAgICAgICAgIGRpci5uYW1lID09PSBcInNsb3RcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZyAmJiBhcmcudHlwZSA9PT0gNCAmJiAhYXJnLmlzU3RhdGljKSB7XG4gICAgICAgICAgZGlyLmFyZyA9IHByb2Nlc3NFeHByZXNzaW9uKGFyZywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBwcm9jZXNzRXhwcmVzc2lvbihub2RlLCBjb250ZXh0LCBhc1BhcmFtcyA9IGZhbHNlLCBhc1Jhd1N0YXRlbWVudHMgPSBmYWxzZSwgbG9jYWxWYXJzID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0LmlkZW50aWZpZXJzKSkge1xuICB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24obm9kZSwgY29udGV4dCwgYXNQYXJhbXMsIGFzUmF3U3RhdGVtZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlFeHByZXNzaW9uKGV4cCkge1xuICBpZiAoaXNTdHJpbmcoZXhwKSkge1xuICAgIHJldHVybiBleHA7XG4gIH0gZWxzZSBpZiAoZXhwLnR5cGUgPT09IDQpIHtcbiAgICByZXR1cm4gZXhwLmNvbnRlbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cC5jaGlsZHJlbi5tYXAoc3RyaW5naWZ5RXhwcmVzc2lvbikuam9pbihcIlwiKTtcbiAgfVxufVxuXG5jb25zdCB0cmFuc2Zvcm1JZiA9IGNyZWF0ZVN0cnVjdHVyYWxEaXJlY3RpdmVUcmFuc2Zvcm0oXG4gIC9eKGlmfGVsc2V8ZWxzZS1pZikkLyxcbiAgKG5vZGUsIGRpciwgY29udGV4dCkgPT4ge1xuICAgIHJldHVybiBwcm9jZXNzSWYobm9kZSwgZGlyLCBjb250ZXh0LCAoaWZOb2RlLCBicmFuY2gsIGlzUm9vdCkgPT4ge1xuICAgICAgY29uc3Qgc2libGluZ3MgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICAgIGxldCBpID0gc2libGluZ3MuaW5kZXhPZihpZk5vZGUpO1xuICAgICAgbGV0IGtleSA9IDA7XG4gICAgICB3aGlsZSAoaS0tID49IDApIHtcbiAgICAgICAgY29uc3Qgc2libGluZyA9IHNpYmxpbmdzW2ldO1xuICAgICAgICBpZiAoc2libGluZyAmJiBzaWJsaW5nLnR5cGUgPT09IDkpIHtcbiAgICAgICAgICBrZXkgKz0gc2libGluZy5icmFuY2hlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgICAgICBpZk5vZGUuY29kZWdlbk5vZGUgPSBjcmVhdGVDb2RlZ2VuTm9kZUZvckJyYW5jaChcbiAgICAgICAgICAgIGJyYW5jaCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcmVudENvbmRpdGlvbiA9IGdldFBhcmVudENvbmRpdGlvbihpZk5vZGUuY29kZWdlbk5vZGUpO1xuICAgICAgICAgIHBhcmVudENvbmRpdGlvbi5hbHRlcm5hdGUgPSBjcmVhdGVDb2RlZ2VuTm9kZUZvckJyYW5jaChcbiAgICAgICAgICAgIGJyYW5jaCxcbiAgICAgICAgICAgIGtleSArIGlmTm9kZS5icmFuY2hlcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbik7XG5mdW5jdGlvbiBwcm9jZXNzSWYobm9kZSwgZGlyLCBjb250ZXh0LCBwcm9jZXNzQ29kZWdlbikge1xuICBpZiAoZGlyLm5hbWUgIT09IFwiZWxzZVwiICYmICghZGlyLmV4cCB8fCAhZGlyLmV4cC5jb250ZW50LnRyaW0oKSkpIHtcbiAgICBjb25zdCBsb2MgPSBkaXIuZXhwID8gZGlyLmV4cC5sb2MgOiBub2RlLmxvYztcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDI4LCBkaXIubG9jKVxuICAgICk7XG4gICAgZGlyLmV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHRydWVgLCBmYWxzZSwgbG9jKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlICYmIGRpci5leHApIHtcbiAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKGRpci5leHAsIGNvbnRleHQpO1xuICB9XG4gIGlmIChkaXIubmFtZSA9PT0gXCJpZlwiKSB7XG4gICAgY29uc3QgYnJhbmNoID0gY3JlYXRlSWZCcmFuY2gobm9kZSwgZGlyKTtcbiAgICBjb25zdCBpZk5vZGUgPSB7XG4gICAgICB0eXBlOiA5LFxuICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgIGJyYW5jaGVzOiBbYnJhbmNoXVxuICAgIH07XG4gICAgY29udGV4dC5yZXBsYWNlTm9kZShpZk5vZGUpO1xuICAgIGlmIChwcm9jZXNzQ29kZWdlbikge1xuICAgICAgcmV0dXJuIHByb2Nlc3NDb2RlZ2VuKGlmTm9kZSwgYnJhbmNoLCB0cnVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2libGluZ3MgPSBjb250ZXh0LnBhcmVudC5jaGlsZHJlbjtcbiAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuICAgIGxldCBpID0gc2libGluZ3MuaW5kZXhPZihub2RlKTtcbiAgICB3aGlsZSAoaS0tID49IC0xKSB7XG4gICAgICBjb25zdCBzaWJsaW5nID0gc2libGluZ3NbaV07XG4gICAgICBpZiAoc2libGluZyAmJiBzaWJsaW5nLnR5cGUgPT09IDMpIHtcbiAgICAgICAgY29udGV4dC5yZW1vdmVOb2RlKHNpYmxpbmcpO1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbW1lbnRzLnVuc2hpZnQoc2libGluZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNpYmxpbmcgJiYgc2libGluZy50eXBlID09PSA
20578yICYmICFzaWJsaW5nLmNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICBjb250ZXh0LnJlbW92ZU5vZGUoc2libGluZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNpYmxpbmcgJiYgc2libGluZy50eXBlID09PSA5KSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJlbHNlLWlmXCIgJiYgc2libGluZy5icmFuY2hlc1tzaWJsaW5nLmJyYW5jaGVzLmxlbmd0aCAtIDFdLmNvbmRpdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMCwgbm9kZS5sb2MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnJlbW92ZU5vZGUoKTtcbiAgICAgICAgY29uc3QgYnJhbmNoID0gY3JlYXRlSWZCcmFuY2gobm9kZSwgZGlyKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tbWVudHMubGVuZ3RoICYmIC8vICMzNjE5IGlnbm9yZSBjb21tZW50cyBpZiB0aGUgdi1pZiBpcyBkaXJlY3QgY2hpbGQgb2YgPHRyYW5zaXRpb24+XG4gICAgICAgICEoY29udGV4dC5wYXJlbnQgJiYgY29udGV4dC5wYXJlbnQudHlwZSA9PT0gMSAmJiAoY29udGV4dC5wYXJlbnQudGFnID09PSBcInRyYW5zaXRpb25cIiB8fCBjb250ZXh0LnBhcmVudC50YWcgPT09IFwiVHJhbnNpdGlvblwiKSkpIHtcbiAgICAgICAgICBicmFuY2guY2hpbGRyZW4gPSBbLi4uY29tbWVudHMsIC4uLmJyYW5jaC5jaGlsZHJlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBicmFuY2gudXNlcktleTtcbiAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBzaWJsaW5nLmJyYW5jaGVzLmZvckVhY2goKHsgdXNlcktleSB9KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpc1NhbWVLZXkodXNlcktleSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIDI5LFxuICAgICAgICAgICAgICAgICAgICBicmFuY2gudXNlcktleS5sb2NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2libGluZy5icmFuY2hlcy5wdXNoKGJyYW5jaCk7XG4gICAgICAgIGNvbnN0IG9uRXhpdCA9IHByb2Nlc3NDb2RlZ2VuICYmIHByb2Nlc3NDb2RlZ2VuKHNpYmxpbmcsIGJyYW5jaCwgZmFsc2UpO1xuICAgICAgICB0cmF2ZXJzZU5vZGUoYnJhbmNoLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKG9uRXhpdCkgb25FeGl0KCk7XG4gICAgICAgIGNvbnRleHQuY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzAsIG5vZGUubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVJZkJyYW5jaChub2RlLCBkaXIpIHtcbiAgY29uc3QgaXNUZW1wbGF0ZUlmID0gbm9kZS50YWdUeXBlID09PSAzO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IDEwLFxuICAgIGxvYzogbm9kZS5sb2MsXG4gICAgY29uZGl0aW9uOiBkaXIubmFtZSA9PT0gXCJlbHNlXCIgPyB2b2lkIDAgOiBkaXIuZXhwLFxuICAgIGNoaWxkcmVuOiBpc1RlbXBsYXRlSWYgJiYgIWZpbmREaXIobm9kZSwgXCJmb3JcIikgPyBub2RlLmNoaWxkcmVuIDogW25vZGVdLFxuICAgIHVzZXJLZXk6IGZpbmRQcm9wKG5vZGUsIGBrZXlgKSxcbiAgICBpc1RlbXBsYXRlSWZcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvZGVnZW5Ob2RlRm9yQnJhbmNoKGJyYW5jaCwga2V5SW5kZXgsIGNvbnRleHQpIHtcbiAgaWYgKGJyYW5jaC5jb25kaXRpb24pIHtcbiAgICByZXR1cm4gY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICAgICAgYnJhbmNoLmNvbmRpdGlvbixcbiAgICAgIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCksXG4gICAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBpbiBhc0Jsb2NrOiB0cnVlIHNvIHRoYXQgdGhlIGNvbW1lbnQgbm9kZSBjYWxsXG4gICAgICAvLyBjbG9zZXMgdGhlIGN1cnJlbnQgYmxvY2suXG4gICAgICBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihDUkVBVEVfQ09NTUVOVCksIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICdcInYtaWZcIicgOiAnXCJcIicsXG4gICAgICAgIFwidHJ1ZVwiXG4gICAgICBdKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUNoaWxkcmVuQ29kZWdlbk5vZGUoYnJhbmNoLCBrZXlJbmRleCwgY29udGV4dCkge1xuICBjb25zdCB7IGhlbHBlciB9ID0gY29udGV4dDtcbiAgY29uc3Qga2V5UHJvcGVydHkgPSBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICBga2V5YCxcbiAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgYCR7a2V5SW5kZXh9YCxcbiAgICAgIGZhbHNlLFxuICAgICAgbG9jU3R1YixcbiAgICAgIDJcbiAgICApXG4gICk7XG4gIGNvbnN0IHsgY2hpbGRyZW4gfSA9IGJyYW5jaDtcbiAgY29uc3QgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdO1xuICBjb25zdCBuZWVkRnJhZ21lbnRXcmFwcGVyID0gY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGZpcnN0Q2hpbGQudHlwZSAhPT0gMTtcbiAgaWYgKG5lZWRGcmFnbWVudFdyYXBwZXIpIHtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGZpcnN0Q2hpbGQudHlwZSA9PT0gMTEpIHtcbiAgICAgIGNvbnN0IHZub2RlQ2FsbCA9IGZpcnN0Q2hpbGQuY29kZWdlbk5vZGU7XG4gICAgICBpbmplY3RQcm9wKHZub2RlQ2FsbCwga2V5UHJvcGVydHksIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHZub2RlQ2FsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBhdGNoRmxhZyA9IDY0O1xuICAgICAgbGV0IHBhdGNoRmxhZ1RleHQgPSBQYXRjaEZsYWdOYW1lc1s2NF07XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhYnJhbmNoLmlzVGVtcGxhdGVJZiAmJiBjaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMudHlwZSAhPT0gMykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgI
20578HBhdGNoRmxhZyB8PSAyMDQ4O1xuICAgICAgICBwYXRjaEZsYWdUZXh0ICs9IGAsICR7UGF0Y2hGbGFnTmFtZXNbMjA0OF19YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZUNhbGwoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGhlbHBlcihGUkFHTUVOVCksXG4gICAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW2tleVByb3BlcnR5XSksXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBwYXRjaEZsYWcsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGJyYW5jaC5sb2NcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJldCA9IGZpcnN0Q2hpbGQuY29kZWdlbk5vZGU7XG4gICAgY29uc3Qgdm5vZGVDYWxsID0gZ2V0TWVtb2VkVk5vZGVDYWxsKHJldCk7XG4gICAgaWYgKHZub2RlQ2FsbC50eXBlID09PSAxMykge1xuICAgICAgY29udmVydFRvQmxvY2sodm5vZGVDYWxsLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaW5qZWN0UHJvcCh2bm9kZUNhbGwsIGtleVByb3BlcnR5LCBjb250ZXh0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5mdW5jdGlvbiBpc1NhbWVLZXkoYSwgYikge1xuICBpZiAoIWEgfHwgYS50eXBlICE9PSBiLnR5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGEudHlwZSA9PT0gNikge1xuICAgIGlmIChhLnZhbHVlLmNvbnRlbnQgIT09IGIudmFsdWUuY29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHAgPSBhLmV4cDtcbiAgICBjb25zdCBicmFuY2hFeHAgPSBiLmV4cDtcbiAgICBpZiAoZXhwLnR5cGUgIT09IGJyYW5jaEV4cC50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChleHAudHlwZSAhPT0gNCB8fCBleHAuaXNTdGF0aWMgIT09IGJyYW5jaEV4cC5pc1N0YXRpYyB8fCBleHAuY29udGVudCAhPT0gYnJhbmNoRXhwLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRQYXJlbnRDb25kaXRpb24obm9kZSkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnR5cGUgPT09IDE5KSB7XG4gICAgICBpZiAobm9kZS5hbHRlcm5hdGUudHlwZSA9PT0gMTkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuYWx0ZXJuYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IDIwKSB7XG4gICAgICBub2RlID0gbm9kZS52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgdHJhbnNmb3JtQmluZCA9IChkaXIsIF9ub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgbW9kaWZpZXJzLCBsb2MgfSA9IGRpcjtcbiAgY29uc3QgYXJnID0gZGlyLmFyZztcbiAgbGV0IHsgZXhwIH0gPSBkaXI7XG4gIGlmIChleHAgJiYgZXhwLnR5cGUgPT09IDQgJiYgIWV4cC5jb250ZW50LnRyaW0oKSkge1xuICAgIHtcbiAgICAgIGV4cCA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCFleHApIHtcbiAgICBpZiAoYXJnLnR5cGUgIT09IDQgfHwgIWFyZy5pc1N0YXRpYykge1xuICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgIDUyLFxuICAgICAgICAgIGFyZy5sb2NcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYXJnLCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiXCIsIHRydWUsIGxvYykpXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybUJpbmRTaG9ydGhhbmQoZGlyKTtcbiAgICBleHAgPSBkaXIuZXhwO
205781xuICB9XG4gIGlmIChhcmcudHlwZSAhPT0gNCkge1xuICAgIGFyZy5jaGlsZHJlbi51bnNoaWZ0KGAoYCk7XG4gICAgYXJnLmNoaWxkcmVuLnB1c2goYCkgfHwgXCJcImApO1xuICB9IGVsc2UgaWYgKCFhcmcuaXNTdGF0aWMpIHtcbiAgICBhcmcuY29udGVudCA9IGAke2FyZy5jb250ZW50fSB8fCBcIlwiYDtcbiAgfVxuICBpZiAobW9kaWZpZXJzLmluY2x1ZGVzKFwiY2FtZWxcIikpIHtcbiAgICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICAgIGlmIChhcmcuaXNTdGF0aWMpIHtcbiAgICAgICAgYXJnLmNvbnRlbnQgPSBjYW1lbGl6ZShhcmcuY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcuY29udGVudCA9IGAke2NvbnRleHQuaGVscGVyU3RyaW5nKENBTUVMSVpFKX0oJHthcmcuY29udGVudH0pYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJnLmNoaWxkcmVuLnVuc2hpZnQoYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoQ0FNRUxJWkUpfShgKTtcbiAgICAgIGFyZy5jaGlsZHJlbi5wdXNoKGApYCk7XG4gICAgfVxuICB9XG4gIGlmICghY29udGV4dC5pblNTUikge1xuICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJwcm9wXCIpKSB7XG4gICAgICBpbmplY3RQcmVmaXgoYXJnLCBcIi5cIik7XG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMuaW5jbHVkZXMoXCJhdHRyXCIpKSB7XG4gICAgICBpbmplY3RQcmVmaXgoYXJnLCBcIl5cIik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IFtjcmVhdGVPYmplY3RQcm9wZXJ0eShhcmcsIGV4cCldXG4gIH07XG59O1xuY29uc3QgdHJhbnNmb3JtQmluZFNob3J0aGFuZCA9IChkaXIsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgYXJnID0gZGlyLmFyZztcbiAgY29uc3QgcHJvcE5hbWUgPSBjYW1lbGl6ZShhcmcuY29udGVudCk7XG4gIGRpci5leHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKHByb3BOYW1lLCBmYWxzZSwgYXJnLmxvYyk7XG59O1xuY29uc3QgaW5qZWN0UHJlZml4ID0gKGFyZywgcHJlZml4KSA9PiB7XG4gIGlmIChhcmcudHlwZSA9PT0gNCkge1xuICAgIGlmIChhcmcuaXNTdGF0aWMpIHtcbiAgICAgIGFyZy5jb250ZW50ID0gcHJlZml4ICsgYXJnLmNvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZy5jb250ZW50ID0gYFxcYCR7cHJlZml4fVxcJHske2FyZy5jb250ZW50fX1cXGBgO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhcmcuY2hpbGRyZW4udW5zaGlmdChgJyR7cHJlZml4fScgKyAoYCk7XG4gICAgYXJnLmNoaWxkcmVuLnB1c2goYClgKTtcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtRm9yID0gY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybShcbiAgXCJmb3JcIixcbiAgKG5vZGUsIGRpciwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaGVscGVyLCByZW1vdmVIZWxwZXIgfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHByb2Nlc3NGb3Iobm9kZSwgZGlyLCBjb250ZXh0LCAoZm9yTm9kZSkgPT4ge1xuICAgICAgY29uc3QgcmVuZGVyRXhwID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oaGVscGVyKFJFTkRFUl9MSVNUKSwgW1xuICAgICAgICBmb3JOb2RlLnNvdXJjZVxuICAgICAgXSk7XG4gICAgICBjb25zdCBpc1RlbXBsYXRlID0gaXNUZW1wbGF0ZU5vZGUobm9kZSk7XG4gICAgICBjb25zdCBtZW1vID0gZmluZERpcihub2RlLCBcIm1lbW9cIik7XG4gICAgICBjb25zdCBrZXlQcm9wID0gZmluZFByb3Aobm9kZSwgYGtleWAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIGlmIChrZXlQcm9wICYmIGtleVByb3AudHlwZSA9PT0gNyAmJiAha2V5UHJvcC5leHApIHtcbiAgICAgICAgdHJhbnNmb3JtQmluZFNob3J0aGFuZChrZXlQcm9wKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleUV4cCA9IGtleVByb3AgJiYgKGtleVByb3AudHlwZSA9PT0gNiA/IGtleVByb3AudmFsdWUgPyBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGtleVByb3AudmFsdWUuY29udGVudCwgdHJ1ZSkgOiB2b2lkIDAgOiBrZXlQcm9wLmV4cCk7XG4gICAgICBjb25zdCBrZXlQcm9wZXJ0eSA9IGtleVByb3AgJiYga2V5RXhwID8gY3JlYXRlT2JqZWN0UHJvcGVydHkoYGtleWAsIGtleUV4cCkgOiBudWxsO1xuICAgICAgY29uc3QgaXNTdGFibGVGcmFnbWVudCA9IGZvck5vZGUuc291cmNlLnR5cGUgPT09IDQgJiYgZm9yTm9kZS5zb3VyY2UuY29uc3RUeXBlID4gMDtcbiAgICAgIGNvbnN0IGZyYWdtZW50RmxhZyA9IGlzU3RhYmxlRnJhZ21lbnQgPyA2NCA6IGtleVByb3AgPyAxMjggOiAyNTY7XG4gICAgICBmb3JOb2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlVk5vZGVDYWxsKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBoZWxwZXIoRlJBR01FTlQpLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHJlbmRlckV4cCxcbiAgICAgICAgZnJhZ21lbnRGbGFnLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgIWlzU3RhYmxlRnJhZ21lbnQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBub2RlLmxvY1xuICAgICAgKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxldCBjaGlsZEJsb2NrO1xuICAgICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBmb3JOb2RlO1xuICAgICAgICBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZmFsc2UpICYmIGlzVGVtcGxhdGUpIHtcbiAgICAgICAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZmluZFByb3AoYywgXCJrZXlcIik7XG4gICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgICAgICAgICAzMyxcbiAgICAgICAgICAgICAgICAgICAga2V5LmxvY1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgI
20578H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZWVkRnJhZ21lbnRXcmFwcGVyID0gY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGNoaWxkcmVuWzBdLnR5cGUgIT09IDE7XG4gICAgICAgIGNvbnN0IHNsb3RPdXRsZXQgPSBpc1Nsb3RPdXRsZXQobm9kZSkgPyBub2RlIDogaXNUZW1wbGF0ZSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBpc1Nsb3RPdXRsZXQobm9kZS5jaGlsZHJlblswXSkgPyBub2RlLmNoaWxkcmVuWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHNsb3RPdXRsZXQpIHtcbiAgICAgICAgICBjaGlsZEJsb2NrID0gc2xvdE91dGxldC5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICBpZiAoaXNUZW1wbGF0ZSAmJiBrZXlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgaW5qZWN0UHJvcChjaGlsZEJsb2NrLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5lZWRGcmFnbWVudFdyYXBwZXIpIHtcbiAgICAgICAgICBjaGlsZEJsb2NrID0gY3JlYXRlVk5vZGVDYWxsKFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGhlbHBlcihGUkFHTUVOVCksXG4gICAgICAgICAgICBrZXlQcm9wZXJ0eSA/IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oW2tleVByb3BlcnR5XSkgOiB2b2lkIDAsXG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgNjQsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkQmxvY2sgPSBjaGlsZHJlblswXS5jb2RlZ2VuTm9kZTtcbiAgICAgICAgICBpZiAoaXNUZW1wbGF0ZSAmJiBrZXlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgaW5qZWN0UHJvcChjaGlsZEJsb2NrLCBrZXlQcm9wZXJ0eSwgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZEJsb2NrLmlzQmxvY2sgIT09ICFpc1N0YWJsZUZyYWdtZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRCbG9jay5pc0Jsb2NrKSB7XG4gICAgICAgICAgICAgIHJlbW92ZUhlbHBlcihPUEVOX0JMT0NLKTtcbiAgICAgICAgICAgICAgcmVtb3ZlSGVscGVyKFxuICAgICAgICAgICAgICAgIGdldFZOb2RlQmxvY2tIZWxwZXIoY29udGV4dC5pblNTUiwgY2hpbGRCbG9jay5pc0NvbXBvbmVudClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZUhlbHBlcihcbiAgICAgICAgICAgICAgICBnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZEJsb2NrLmlzQmxvY2sgPSAhaXNTdGFibGVGcmFnbWVudDtcbiAgICAgICAgICBpZiAoY2hpbGRCbG9jay5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBoZWxwZXIoT1BFTl9CTE9DSyk7XG4gICAgICAgICAgICBoZWxwZXIoZ2V0Vk5vZGVCbG9ja0hlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlbHBlcihnZXRWTm9kZUhlbHBlcihjb250ZXh0LmluU1NSLCBjaGlsZEJsb2NrLmlzQ29tcG9uZW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKSB7XG4gICAgICAgICAgY29uc3QgbG9vcCA9IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgIGNyZWF0ZUZvckxvb3BQYXJhbXMoZm9yTm9kZS5wYXJzZVJlc3VsdCwgW1xuICAgICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfY2FjaGVkYClcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb29wLmJvZHkgPSBjcmVhdGVCbG9ja1N0YXRlbWVudChbXG4gICAgICAgICAgICBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2Bjb25zdCBfbWVtbyA9IChgLCBtZW1vLmV4cCwgYClgXSksXG4gICAgICAgICAgICBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW1xuICAgICAgICAgICAgICBgaWYgKF9jYWNoZWRgLFxuICAgICAgICAgICAgICAuLi5rZXlFeHAgPyBbYCAmJiBfY2FjaGVkLmtleSA9PT0gYCwga2V5RXhwXSA6IFtdLFxuICAgICAgICAgICAgICBgICYmICR7Y29udGV4dC5oZWxwZXJTdHJpbmcoXG4gICAgICAgICAgICAgICAgSVNfTUVNT19TQU1FXG4gICAgICAgICAgICAgICl9KF9jYWNoZWQsIF9tZW1vKSkgcmV0dXJuIF9jYWNoZWRgXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbYGNvbnN0IF9pdGVtID0gYCwgY2hpbGRCbG9ja10pLFxuICAgICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgX2l0ZW0ubWVtbyA9IF9tZW1vYCksXG4gICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGByZXR1cm4gX2l0ZW1gKVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJlbmRlckV4cC5hcmd1bWVudHMucHVzaChcbiAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfY2FjaGVgKSxcbiAgICAgICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oU3RyaW5nKGNvbnRleHQuY2FjaGVkKyspKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyRXhwLmFyZ3VtZW50cy5wdXNoKFxuICAgICAgICAgICAgY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjcmVhdGVGb3JMb29wUGFyYW1zKGZvck5vZGUucGFyc2VSZXN1bHQpLFxuICAgICAgICAgICAgICBjaGlsZEJsb2NrLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuKTtcbmZ1bmN0aW9uIHByb2Nlc3NGb3Iobm9kZSwgZGlyLCBjb250ZXh0LCBwcm9jZXNzQ29kZWdlbikge1xuICBpZiAoIWRpci5leHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDMxLCBkaXIubG9jKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlUmVzdWx0ID0gZGlyLmZvclBhcnNlUmVzdWx0O1xuICBpZiAoIXBhcnNlUmVzdWx0KSB7XG4gICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMiwgZGlyLmxvYylcbiAgICApO
205781xuICAgIHJldHVybjtcbiAgfVxuICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHBhcnNlUmVzdWx0LCBjb250ZXh0KTtcbiAgY29uc3QgeyBhZGRJZGVudGlmaWVycywgcmVtb3ZlSWRlbnRpZmllcnMsIHNjb3BlcyB9ID0gY29udGV4dDtcbiAgY29uc3QgeyBzb3VyY2UsIHZhbHVlLCBrZXksIGluZGV4IH0gPSBwYXJzZVJlc3VsdDtcbiAgY29uc3QgZm9yTm9kZSA9IHtcbiAgICB0eXBlOiAxMSxcbiAgICBsb2M6IGRpci5sb2MsXG4gICAgc291cmNlLFxuICAgIHZhbHVlQWxpYXM6IHZhbHVlLFxuICAgIGtleUFsaWFzOiBrZXksXG4gICAgb2JqZWN0SW5kZXhBbGlhczogaW5kZXgsXG4gICAgcGFyc2VSZXN1bHQsXG4gICAgY2hpbGRyZW46IGlzVGVtcGxhdGVOb2RlKG5vZGUpID8gbm9kZS5jaGlsZHJlbiA6IFtub2RlXVxuICB9O1xuICBjb250ZXh0LnJlcGxhY2VOb2RlKGZvck5vZGUpO1xuICBzY29wZXMudkZvcisrO1xuICBjb25zdCBvbkV4aXQgPSBwcm9jZXNzQ29kZWdlbiAmJiBwcm9jZXNzQ29kZWdlbihmb3JOb2RlKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBzY29wZXMudkZvci0tO1xuICAgIGlmIChvbkV4aXQpIG9uRXhpdCgpO1xuICB9O1xufVxuZnVuY3Rpb24gZmluYWxpemVGb3JQYXJzZVJlc3VsdChyZXN1bHQsIGNvbnRleHQpIHtcbiAgaWYgKHJlc3VsdC5maW5hbGl6ZWQpIHJldHVybjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24ocmVzdWx0LnNvdXJjZSwgY29udGV4dCk7XG4gICAgaWYgKHJlc3VsdC5rZXkpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJl
20578c3Npb24oXG4gICAgICAgIHJlc3VsdC5rZXksXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuaW5kZXgpIHtcbiAgICAgIHZhbGlkYXRlQnJvd3NlckV4cHJlc3Npb24oXG4gICAgICAgIHJlc3VsdC5pbmRleCxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC52YWx1ZSkge1xuICAgICAgdmFsaWRhdGVCcm93c2VyRXhwcmVzc2lvbihcbiAgICAgICAgcmVzdWx0LnZhbHVlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXN1bHQuZmluYWxpemVkID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvckxvb3BQYXJhbXMoeyB2YWx1ZSwga2V5LCBpbmRleCB9LCBtZW1vQXJncyA9IFtdKSB7XG4gIHJldHVybiBjcmVhdGVQYXJhbXNMaXN0KFt2YWx1ZSwga2V5LCBpbmRleCwgLi4ubWVtb0FyZ3NdKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhcmFtc0xpc3QoYXJncykge1xuICBsZXQgaSA9IGFyZ3MubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKGFyZ3NbaV0pIGJyZWFrO1xuICB9XG4gIHJldHVybiBhcmdzLnNsaWNlKDAsIGkgKyAxKS5tYXAoKGFyZywgaTIpID0+IGFyZyB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKGBfYC5yZXBlYXQoaTIgKyAxKSwgZmFsc2UpKTtcbn1cblxuY29uc3QgZGVmYXVsdEZhbGxiYWNrID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgdW5kZWZpbmVkYCwgZmFsc2UpO1xuY29uc3QgdHJhY2tTbG90U2NvcGVzID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSAmJiAobm9kZS50YWdUeXBlID09PSAxIHx8IG5vZGUudGFnVHlwZSA9PT0gMykpIHtcbiAgICBjb25zdCB2U2xvdCA9IGZpbmREaXIobm9kZSwgXCJzbG90XCIpO1xuICAgIGlmICh2U2xvdCkge1xuICAgICAgdlNsb3QuZXhwO1xuICAgICAgY29udGV4dC5zY29wZXMudlNsb3QrKztcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuc2NvcGVzLnZTbG90LS07XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IHRyYWNrVkZvclNsb3RTY29wZXMgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBsZXQgdkZvcjtcbiAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpICYmIG5vZGUucHJvcHMuc29tZShpc1ZTbG90KSAmJiAodkZvciA9IGZpbmREaXIobm9kZSwgXCJmb3JcIikpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdkZvci5mb3JQYXJzZVJlc3VsdDtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHJlc3VsdCwgY29udGV4dCk7XG4gICAgICBjb25zdCB7IHZhbHVlLCBrZXksIGluZGV4IH0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7IGFkZElkZW50aWZpZXJzLCByZW1vdmVJZGVudGlmaWVycyB9ID0gY29udGV4dDtcbiAgICAgIHZhbHVlICYmIGFkZElkZW50aWZpZXJzKHZhbHVlKTtcbiAgICAgIGtleSAmJiBhZGRJZGVudGlmaWVycyhrZXkpO1xuICAgICAgaW5kZXggJiYgYWRkSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdmFsdWUgJiYgcmVtb3ZlSWRlbnRpZmllcnModmFsdWUpO1xuICAgICAgICBrZXkgJiYgcmVtb3ZlSWRlbnRpZmllcnMoa2V5KTtcbiAgICAgICAgaW5kZXggJiYgcmVtb3ZlSWRlbnRpZmllcnMoaW5kZXgpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBidWlsZENsaWVudFNsb3RGbiA9IChwcm9wcywgX3ZGb3JFeHAsIGNoaWxkcmVuLCBsb2MpID0+IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihcbiAgcHJvcHMsXG4gIGNoaWxkcmVuLFxuICBmYWxzZSxcbiAgdHJ1ZSxcbiAgY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bMF0ubG9jIDogbG9jXG4pO1xuZnVuY3Rpb24gYnVpbGRTbG90cyhub2RlLCBjb250ZXh0LCBidWlsZFNsb3RGbiA9IGJ1aWxkQ2xpZW50U2xvdEZuKSB7XG4gIGNvbnRleHQuaGVscGVyKFdJVEhfQ1RYKTtcbiAgY29uc3QgeyBjaGlsZHJlbiwgbG9jIH0gPSBub2RlO1xuICBjb25zdCBzbG90c1Byb3BlcnRpZXMgPSBbXTtcbiAgY29uc3QgZHluYW1pY1Nsb3RzID0gW107XG4gIGxldCBoYXNEeW5hbWljU2xvdHMgPSBjb250ZXh0LnNjb3Blcy52U2xvdCA+IDAgfHwgY29udGV4dC5zY29wZXMudkZvciA+IDA7XG4gIGNvbnN0IG9uQ29tcG9uZW50U2xvdCA9IGZpbmREaXIobm9kZSwgXCJzbG90XCIsIHRydWUpO1xuICBpZiAob25Db21wb25lbnRTbG90KSB7XG4gICAgY29uc3QgeyBhcmcsIGV4cCB9ID0gb25Db21wb25lbnRTbG90O1xuICAgIGlmIChhcmcgJiYgIWlzU3RhdGljRXhwKGFyZykpIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgfVxuICAgIHNsb3RzUHJvcGVydGllcy5wdXNoKFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGFyZyB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiZGVmYXVsdFwiLCB0cnVlKSxcbiAgICAgICAgYnVpbGRTbG90Rm4oZXhwLCB2b2lkIDAsIGNo
20578aWxkcmVuLCBsb2MpXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBsZXQgaGFzVGVtcGxhdGVTbG90cyA9IGZhbHNlO1xuICBsZXQgaGFzTmFtZWREZWZhdWx0U2xvdCA9IGZhbHNlO1xuICBjb25zdCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbiA9IFtdO1xuICBjb25zdCBzZWVuU2xvdE5hbWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGNvbmRpdGlvbmFsQnJhbmNoSW5kZXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2xvdEVsZW1lbnQgPSBjaGlsZHJlbltpXTtcbiAgICBsZXQgc2xvdERpcjtcbiAgICBpZiAoIWlzVGVtcGxhdGVOb2RlKHNsb3RFbGVtZW50KSB8fCAhKHNsb3REaXIgPSBmaW5kRGlyKHNsb3RFbGVtZW50LCBcInNsb3RcIiwgdHJ1ZSkpKSB7XG4gICAgICBpZiAoc2xvdEVsZW1lbnQudHlwZSAhPT0gMykge1xuICAgICAgICBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbi5wdXNoKHNsb3RFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAob25Db21wb25lbnRTbG90KSB7XG4gICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoMzcsIHNsb3REaXIubG9jKVxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBoYXNUZW1wbGF0ZVNsb3RzID0gdHJ1ZTtcbiAgICBjb25zdCB7IGNoaWxkcmVuOiBzbG90Q2hpbGRyZW4sIGxvYzogc2xvdExvYyB9ID0gc2xvdEVsZW1lbnQ7XG4gICAgY29uc3Qge1xuICAgICAgYXJnOiBzbG90TmFtZSA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGRlZmF1bHRgLCB0cnVlKSxcbiAgICAgIGV4cDogc2xvdFByb3BzLFxuICAgICAgbG9jOiBkaXJMb2NcbiAgICB9ID0gc2xvdERpcjtcbiAgICBsZXQgc3RhdGljU2xvdE5hbWU7XG4gICAgaWYgKGlzU3RhdGljRXhwKHNsb3ROYW1lKSkge1xuICAgICAgc3RhdGljU2xvdE5hbWUgPSBzbG90TmFtZSA/IHNsb3ROYW1lLmNvbnRlbnQgOiBgZGVmYXVsdGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHZGb3IgPSBmaW5kRGlyKHNsb3RFbGVtZW50LCBcImZvclwiKTtcbiAgICBjb25zdCBzbG90RnVuY3Rpb24gPSBidWlsZFNsb3RGbihzbG90UHJvcHMsIHZGb3IsIHNsb3RDaGlsZHJlbiwgc2xvdExvYyk7XG4gICAgbGV0IHZJZjtcbiAgICBsZXQgdkVsc2U7XG4gICAgaWYgKHZJZiA9IGZpbmREaXIoc2xvdEVsZW1lbnQsIFwiaWZcIikpIHtcbiAgICAgIGhhc0R5bmFtaWNTbG90cyA9IHRydWU7XG4gICAgICBkeW5hbWljU2xvdHMucHVzaChcbiAgICAgICAgY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKFxuICAgICAgICAgIHZJZi5leHAsXG4gICAgICAgICAgYnVpbGREeW5hbWljU2xvdChzbG90TmFtZSwgc2xvdEZ1bmN0aW9uLCBjb25kaXRpb25hbEJyYW5jaEluZGV4KyspL
20578FxuICAgICAgICAgIGRlZmF1bHRGYWxsYmFja1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodkVsc2UgPSBmaW5kRGlyKFxuICAgICAgc2xvdEVsZW1lbnQsXG4gICAgICAvXmVsc2UoLWlmKT8kLyxcbiAgICAgIHRydWVcbiAgICAgIC8qIGFsbG93RW1wdHkgKi9cbiAgICApKSB7XG4gICAgICBsZXQgaiA9IGk7XG4gICAgICBsZXQgcHJldjtcbiAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgcHJldiA9IGNoaWxkcmVuW2pdO1xuICAgICAgICBpZiAocHJldi50eXBlICE9PSAzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcmV2ICYmIGlzVGVtcGxhdGVOb2RlKHByZXYpICYmIGZpbmREaXIocHJldiwgL14oZWxzZS0pP2lmJC8pKSB7XG4gICAgICAgIGxldCBjb25kaXRpb25hbCA9IGR5bmFtaWNTbG90c1tkeW5hbWljU2xvdHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHdoaWxlIChjb25kaXRpb25hbC5hbHRlcm5hdGUudHlwZSA9PT0gMTkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmFsdGVybmF0ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25kaXRpb25hbC5hbHRlcm5hdGUgPSB2RWxzZS5leHAgPyBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oXG4gICAgICAgICAgdkVsc2UuZXhwLFxuICAgICAgICAgIGJ1aWxkRHluYW1pY1Nsb3QoXG4gICAgICAgICAgICBzbG90TmFtZSxcbiAgICAgICAgICAgIHNsb3RGdW5jdGlvbixcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsQnJhbmNoSW5kZXgrK1xuICAgICAgICAgICksXG4gICAgICAgICAgZGVmYXVsdEZhbGxiYWNrXG4gICAgICAgICkgOiBidWlsZER5bmFtaWNTbG90KHNsb3ROYW1lLCBzbG90RnVuY3Rpb24sIGNvbmRpdGlvbmFsQnJhbmNoSW5kZXgrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcigzMCwgdkVsc2UubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodkZvcikge1xuICAgICAgaGFzRHluYW1pY1Nsb3RzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gdkZvci5mb3JQYXJzZVJlc3VsdDtcbiAgICAgIGlmIChwYXJzZVJlc3VsdCkge1xuICAgICAgICBmaW5hbGl6ZUZvclBhcnNlUmVzdWx0KHBhcnNlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goXG4gICAgICAgICAgY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoUkVOREVSX0xJU1QpLCBbXG4gICAgICAgICAgICBwYXJzZVJlc3VsdC5zb3VyY2UsXG4gICAgICAgICAgICBjcmVhdGVGdW5jdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICAgIGNyZWF0ZUZvckxvb3BQYXJhbXMocGFyc2VSZXN1bHQpLFxuICAgICAgICAgICAgICBidWlsZER5bmFtaWNTbG90KHNsb3ROYW1lLCBzbG90RnVuY3Rpb24pLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgMzIsXG4gICAgICAgICAgICB2Rm9yLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRpY1Nsb3ROYW1lKSB7XG4gICAgICAgIGlmIChzZWVuU2xvdE5hbWVzLmhhcyhzdGF0aWNTbG90TmFtZSkpIHtcbiAgICAgICAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgICAzOCxcbiAgICAgICAgICAgICAgZGlyTG9jXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuU2xvdE5hbWVzLmFkZChzdGF0aWNTbG90TmFtZSk7XG4gICAgICAgIGlmIChzdGF0aWNTbG90TmFtZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgICBoYXNOYW1lZERlZmF1bHRTbG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2xvdHNQcm9wZXJ0aWVzLnB1c2goY3JlYXRlT2JqZWN0UHJvcGVydHkoc2xvdE5hbWUsIHNsb3RGdW5jdGlvbikpO1xuICAgIH1cbiAgfVxuICBpZiAoIW9uQ29tcG9uZW50U2xvdCkge1xuICAgIGNvbnN0IGJ1aWxkRGVmYXVsdFNsb3RQcm9wZXJ0eSA9IChwcm9wcywgY2hpbGRyZW4yKSA9PiB7XG4gICAgICBjb25zdCBmbiA9IGJ1aWxkU2xvdEZuKHByb3BzLCB2b2lkIDAsIGNo
20578aWxkcmVuMiwgbG9jKTtcbiAgICAgIGlmIChjb250ZXh0LmNvbXBhdENvbmZpZykge1xuICAgICAgICBmbi5pc05vblNjb3BlZFNsb3QgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdFByb3BlcnR5KGBkZWZhdWx0YCwgZm4pO1xuICAgIH07XG4gICAgaWYgKCFoYXNUZW1wbGF0ZVNsb3RzKSB7XG4gICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChidWlsZERlZmF1bHRTbG90UHJvcGVydHkodm9pZCAwLCBjaGlsZHJlbikpO1xuICAgIH0gZWxzZSBpZiAoaW1wbGljaXREZWZhdWx0Q2hpbGRyZW4ubGVuZ3RoICYmIC8vICMzNzY2XG4gICAgLy8gd2l0aCB3aGl0ZXNwYWNlOiAncHJlc2VydmUnLCB3aGl0ZXNwYWNlcyBiZXR3ZWVuIHNsb3RzIHdpbGwgZW5kIHVwIGluXG4gICAgLy8gaW1wbGljaXREZWZhdWx0Q2hpbGRyZW4uIElnbm9yZSBpZiBhbGwgaW1wbGljaXQgY2hpbGRyZW4gYXJlIHdoaXRlc3BhY2VzLlxuICAgIGltcGxpY2l0RGVmYXVsdENoaWxkcmVuLnNvbWUoKG5vZGUyKSA9PiBpc05vbldoaXRlc3BhY2VDb250ZW50KG5vZGUyKSkpIHtcbiAgICAgIGlmIChoYXNOYW1lZERlZmF1bHRTbG90KSB7XG4gICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgICAgMzksXG4gICAgICAgICAgICBpbXBsaWNpdERlZmF1bHRDaGlsZHJlblswXS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90c1Byb3BlcnRpZXMucHVzaChcbiAgICAgICAgICBidWlsZERlZmF1bHRTbG90UHJvcGVydHkodm9pZCAwLCBpbXBsaWNpdERlZmF1bHRDaGlsZHJlbilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgc2xvdEZsYWcgPSBoYXNEeW5hbWljU2xvdHMgPyAyIDogaGFzRm9yd2FyZGVkU2xvdHMobm9kZS5jaGlsZHJlbikgPyAzIDogMTtcbiAgbGV0IHNsb3RzID0gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihcbiAgICBzbG90c1Byb3BlcnRpZXMuY29uY2F0KFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGBfYCxcbiAgICAgICAgLy8gMiA9IGNvbXBpbGVkIGJ1dCBkeW5hbWljID0gY2FuIHNraXAgbm9ybWFsaXphdGlvbiwgYnV0IG11c3QgcnVuIGRpZmZcbiAgICAgICAgLy8gMSA9IGNvbXBpbGVkIGFuZCBzdGF0aWMgPSBjYW4gc2tpcCBub3JtYWxpemF0aW9uIEFORCBkaWZmIGFzIG9wdGltaXplZFxuICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICAgIHNsb3RGbGFnICsgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgIC8qICR7c2xvdEZsYWdzVGV4dFtzbG90RmxhZ119ICovYCA6IGBgKSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBsb2NcbiAgKTtcbiAgaWYgKGR5bmFtaWNTbG90cy5sZW5ndGgpIHtcbiAgICBzbG90cyA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKENSRUFURV9TTE9UUyksIFtcbiAgICAgIHNsb3RzLFxuICAgICAgY3JlYXRlQXJyYXlFeHByZXNzaW9uKGR5bmFtaWNTbG90cylcbiAgICBdKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNsb3RzLFxuICAgIGhhc0R5bmFtaWNTbG90c1xuICB9O1xufVxuZnVuY3Rpb24gYnVpbGREeW5hbWljU2xvdChuYW1lLCBmbiwgaW5kZXgpIHtcbiAgY29uc3QgcHJvcHMgPSBbXG4gICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYG5hbWVgLCBuYW1lKSxcbiAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShgZm5gLCBmbilcbiAgXTtcbiAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICBwcm9wcy5wdXNoKFxuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoYGtleWAsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oU3RyaW5nKGluZGV4KSwgdHJ1ZSkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlT2JqZWN0RXhwcmVzc2lvbihwcm9wcyk7XG59XG5mdW5jdGlvbiBoYXNGb3J3YXJkZWRTbG90cyhjaGlsZHJlbikge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKGNoaWxkLnRhZ1R5cGUgPT09IDIgfHwgaGFzRm9yd2FyZGVkU2xvdHMoY2hpbGQuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIGlmIChoYXNGb3J3YXJkZWRTbG90cyhjaGlsZC5icmFuY2hlcykpIHJldHVybiB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDExOlxuICAgICAgICBpZiAoaGFzRm9yd2FyZGVkU2xvdHMoY2hpbGQuY2hpbGRyZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTm9uV2hpdGVzcGFjZUNvbnRlbnQobm9kZSkge1xuICBpZiAobm9kZS50eXBlICE9PSAyICYmIG5vZGUudHlwZSAhPT0gMTIpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBub2RlLnR5cGUgPT09IDIgPyAhIW5vZGUuY29udGVudC50cmltKCkgOiBpc05vbldoaXRlc3BhY2VDb250ZW50KG5vZGUuY29udGVudCk7XG59XG5cbmNvbnN0IGRpcmVjdGl2ZUltcG9ydE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNmb3JtRWxlbWVudCA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBwb3N0VHJhbnNmb3JtRWxlbWVudCgpIHtcbiAgICBub2RlID0gY29udGV4dC5jdXJyZW50Tm9kZTtcbiAgICBpZiAoIShub2RlLnR5cGUgPT09IDEgJiYgKG5vZGUudGFnVHlwZSA9PT0gMCB8fCBub2RlLnRhZ1R5cGUgPT09IDEpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRhZywgcHJvcHMgfSA9IG5vZGU7XG4gICAgY29uc3QgaXNDb21wb25lbnQgPSBub2RlLnRhZ1R5cGUgPT09IDE7XG4gICAgbGV0IHZub2RlVGFnID0gaXNDb21wb25lbnQgPyByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0KSA6IGBcIiR7dGFnfVwiYDtcbiAgICBjb25zdCBpc0R5bmFtaWNDb21wb25lbnQgPSBpc09iamVjdCh2bm9kZVRhZykgJiYgdm5vZGVUYWcuY2FsbGVlID09PSBSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5UO1xuICAgIGxldCB2bm9kZVByb3BzO1xuICAgIGxldCB2bm9kZUNoaWxkcmVuO1xuICAgIGxldCBwYXRjaEZsYWcgPSAwO1xuICAgIGxldCB2bm9kZUR5bmFtaWNQcm9wcztcbiAgICBsZXQgZHluYW1pY1Byb3BOYW1lcztcbiAgICBsZXQgdm5vZGVEaXJlY3RpdmVzO1xuICAgIGxldCBzaG91bGRVc2VCbG9jayA9IChcbiAgICAgIC8vIGR5bmFtaWMgY29tcG9uZW50IG1heSByZXNvbHZlIHRvIHBsYWluIGVsZW1lbnRzXG4gICAgICBpc0R5bmFtaWNDb21wb25lbnQgfHwgdm5vZGVUYWcgPT09IFRFTEVQT1J
20578UIHx8IHZub2RlVGFnID09PSBTVVNQRU5TRSB8fCAhaXNDb21wb25lbnQgJiYgLy8gPHN2Zz4gYW5kIDxmb3JlaWduT2JqZWN0PiBtdXN0IGJlIGZvcmNlZCBpbnRvIGJsb2NrcyBzbyB0aGF0IGJsb2NrXG4gICAgICAvLyB1cGRhdGVzIGluc2lkZSBnZXQgcHJvcGVyIGlzU1ZHIGZsYWcgYXQgcnVudGltZS4gKCM2MzksICM2NDMpXG4gICAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IHdlYi1zcGVjaWZpYywgYnV0IHNwbGl0dGluZyB0aGUgbG9naWMgb3V0IG9mIGNvcmVcbiAgICAgIC8vIGxlYWRzIHRvIHRvbyBtdWNoIHVubmVjZXNzYXJ5IGNvbXBsZXhpdHkuXG4gICAgICAodGFnID09PSBcInN2Z1wiIHx8IHRhZyA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgdGFnID09PSBcIm1hdGhcIilcbiAgICApO1xuICAgIGlmIChwcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcm9wc0J1aWxkUmVzdWx0ID0gYnVpbGRQcm9wcyhcbiAgICAgICAgbm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBpc0NvbXBvbmVudCxcbiAgICAgICAgaXNEeW5hbWljQ29tcG9uZW50XG4gICAgICApO1xuICAgICAgdm5vZGVQcm9wcyA9IHByb3BzQnVpbGRSZXN1bHQucHJvcHM7XG4gICAgICBwYXRjaEZsYWcgPSBwcm9wc0J1aWxkUmVzdWx0LnBhdGNoRmxhZztcbiAgICAgIGR5bmFtaWNQcm9wTmFtZXMgPSBwcm9wc0J1aWxkUmVzdWx0LmR5bmFtaWNQcm9wTmFtZXM7XG4gICAgICBjb25zdCBkaXJlY3RpdmVzID0gcHJvcHNCdWlsZFJlc3VsdC5kaXJlY3RpdmVzO1xuICAgICAgdm5vZGVEaXJlY3RpdmVzID0gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzLmxlbmd0aCA/IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihcbiAgICAgICAgZGlyZWN0aXZlcy5tYXAoKGRpcikgPT4gYnVpbGREaXJlY3RpdmVBcmdzKGRpciwgY29udGV4dCkpXG4gICAgICApIDogdm9pZCAwO1xuICAgICAgaWYgKHByb3BzQnVpbGRSZXN1bHQuc2hvdWxkVXNlQmxvY2spIHtcbiAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodm5vZGVUYWcgPT09IEtFRVBfQUxJVkUpIHtcbiAgICAgICAgc2hvdWxkVXNlQmxvY2sgPSB0cnVlO1xuICAgICAgICBwYXRjaEZsYWcgfD0gMTAyNDtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcig0Niwge1xuICAgICAgICAgICAgICBzdGFydDogbm9kZS5jaGlsZHJlblswXS5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgIGVuZDogbm9kZS5jaGlsZHJlbltub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxvYy5lbmQsXG4gICAgICAgICAgICAgIHNvdXJjZTogXCJcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzaG91bGRCdWlsZEFzU2xvdHMgPSBpc0NvbXBvbmVudCAmJiAvLyBUZWxlcG9ydCBpcyBub3QgYSByZWFsIGNvbXBvbmVudCBhbmQgaGFzIGRlZGljYXRlZCBydW50aW1lIGhhbmRsaW5nXG4gICAgICB2bm9kZVRhZyAhPT0gVEVMRVBPUlQgJiYgLy8gZXhwbGFpbmVkIGFib3ZlLlxuICAgICAgdm5vZGVUYWcgIT09IEtFRVBfQUxJVkU7XG4gICAgICBpZiAoc2hvdWxkQnVpbGRBc1Nsb3RzKSB7XG4gICAgICAgIGNvbnN0IHsgc2xvdHMsIGhhc0R5bmFtaWNTbG90cyB9ID0gYnVpbGRTbG90cyhub2RlLCBjb250ZXh0KTtcbiAgICAgICAgdm5vZGVDaGlsZHJlbiA9IHNsb3RzO1xuICAgICAgICBpZiAoaGFzRHluYW1pY1Nsb3RzKSB7XG4gICAgICAgICAgcGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgdm5vZGVUYWcgIT09IFRFTEVQT1JUKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGNoaWxkLnR5cGU7XG4gICAgICAgIGNvbnN0IGhhc0R5bmFtaWNUZXh0Q2hpbGQgPSB0eXBlID09PSA1IHx8IHR5cGUgPT09IDg7XG4gICAgICAgIGlmIChoYXNEeW5hbWljVGV4dENoaWxkICYmIGdldENvbnN0YW50VHlwZShjaGlsZCwgY29udGV4dCkgPT09IDApIHtcbiAgICAgICAgICBwYXRjaEZsYWcgfD0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRHluYW1pY1RleHRDaGlsZCB8fCB0eXBlID09PSAyKSB7XG4gICAgICAgICAgdm5vZGVDaGlsZHJlbiA9IGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZub2RlQ2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZUNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGR5bmFtaWNQcm9wTmFtZXMgJiYgZHluYW1pY1Byb3BOYW1lcy5sZW5ndGgpIHtcbiAgICAgIHZub2RlRHluYW1pY1Byb3BzID0gc3RyaW5naWZ5RHluYW1pY1Byb3BOYW1lcyhkeW5hbWljUHJvcE5hbWVzKTtcbiAgICB9XG4gICAgbm9kZS5jb2RlZ2VuTm9kZSA9IGNyZWF0ZVZOb2RlQ2FsbChcbiAgICAgIGNvbnRleHQsXG4gICAgICB2bm9kZVRhZyxcbiAgICAgIHZub2RlUHJvcHMsXG4gICAgICB2bm9kZUNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnID09PSAwID8gdm9pZCAwIDogcGF0Y2hGbGFnLFxuICAgICAgdm5vZGVEeW5hbWljUHJvcHMsXG4gICAgICB2bm9kZURpcmVjdGl2ZXMsXG4gICAgICAhIXNob3VsZFVzZUJsb2NrLFxuICAgICAgZmFsc2UsXG4gICAgICBpc0NvbXBvbmVudCxcbiAgICAgIG5vZGUubG9jXG4gICAgKTtcbiAgfTtcbn07XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50VHlwZShub2RlLCBjb250ZXh0LCBzc3IgPSBmYWxzZSkge1xuICBsZXQgeyB0YWcgfSA9IG5vZGU7XG4gIGNvbnN0IGlzRXhwbGljaXREeW5hbWljID0gaXNDb21wb25lbnRUYWcodGFnKTtcbiAgY29uc3QgaXNQcm9wID0gZmluZFByb3AoXG4gICAgbm9kZSxcbiAgICBcImlzXCIsXG4gICAgZmFsc2UsXG4gICAgdHJ1ZVxuICAgIC8qIGFsbG93IGVtcHR5ICovXG4gICk7XG4gIGlmIChpc1Byb3ApIHtcbiAgICBpZiAoaXNFeHBsaWNpdER5bmFtaWMgfHwgaXNDb21wYXRFbmFibGVkKFxuICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICBjb250ZXh0XG4gICAgKSkge1xuICAgICAgbGV0IGV4cDtcbiAgICAgIGlmIChpc1Byb3AudHlwZSA9PT0gNikge1xuICAgICAgICBleHAgPSBpc1Byb3AudmFsdWUgJiYgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihpc1Byb3AudmFsdWUuY29udGVudCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHAgPSBpc1Byb3AuZXhwO1xuICAgICAgICBpZiAoIWV4cCkge1xuICAgICAgICAgIGV4cCA9IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGlzYCwgZmFsc2UsIGlzUHJvcC5sb2MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXhwKSB7XG4gICAgICAgI
20578HJldHVybiBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihSRVNPTFZFX0RZTkFNSUNfQ09NUE9ORU5UKSwgW1xuICAgICAgICAgIGV4cFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJvcC50eXBlID09PSA2ICYmIGlzUHJvcC52YWx1ZS5jb250ZW50LnN0YXJ0c1dpdGgoXCJ2dWU6XCIpKSB7XG4gICAgICB0YWcgPSBpc1Byb3AudmFsdWUuY29udGVudC5zbGljZSg0KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgYnVpbHRJbiA9IGlzQ29yZUNvbXBvbmVudCh0YWcpIHx8IGNvbnRleHQuaXNCdWlsdEluQ29tcG9uZW50KHRhZyk7XG4gIGlmIChidWlsdEluKSB7XG4gICAgaWYgKCFzc3IpIGNvbnRleHQuaGVscGVyKGJ1aWx0SW4pO1xuICAgIHJldHVybiBidWlsdEluO1xuICB9XG4gIGNvbnRleHQuaGVscGVyKFJFU09MVkVfQ09NUE9ORU5UKTtcbiAgY29udGV4dC5jb21wb25lbnRzLmFkZCh0YWcpO1xuICByZXR1cm4gdG9WYWxpZEFzc2V0SWQodGFnLCBgY29tcG9uZW50YCk7XG59XG5mdW5jdGlvbiBidWlsZFByb3BzKG5vZGUsIGNvbnRleHQsIHByb3BzID0gbm9kZS5wcm9wcywgaXNDb21wb25lbnQsIGlzRHluYW1pY0NvbXBvbmVudCwgc3NyID0gZmFsc2UpIHtcbiAgY29uc3QgeyB0YWcsIGxvYzogZWxlbWVudExvYywgY2hpbGRyZW4gfSA9IG5vZGU7XG4gIGxldCBwcm9wZXJ0aWVzID0gW107XG4gIGNvbnN0IG1lcmdlQXJncyA9IFtdO1xuICBjb25zdCBydW50aW1lRGlyZWN0aXZlcyA9IFtdO1xuICBjb25zdCBoYXNDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gIGxldCBzaG91bGRVc2VCbG9jayA9IGZhbHNlO1xuICBsZXQgcGF0Y2hGbGFnID0gMDtcbiAgbGV0IGhhc1JlZiA9IGZhbHNlO1xuICBsZXQgaGFzQ2xhc3NCaW5kaW5nID0gZmFsc2U7XG4gIGxldCBoYXNTdHlsZUJpbmRpbmcgPSBmYWxzZTtcbiAgbGV0IGhhc0h5ZHJhdGlvbkV2ZW50QmluZGluZyA9IGZhbHNlO1xuICBsZXQgaGFzRHluYW1pY0tleXMgPSBmYWxzZTtcbiAgbGV0IGhhc1Zub2RlSG9vayA9IGZhbHNlO1xuICBjb25zdCBkeW5hbWljUHJvcE5hbWVzID0gW107XG4gIGNvbnN0IHB1c2hNZXJnZUFyZyA9IChhcmcpID0+IHtcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlQXJncy5wdXNoKFxuICAgICAgICBjcmVhdGVPYmplY3RFeHByZXNzaW9uKGRlZHVwZVByb3BlcnRpZXMocHJvcGVydGllcyksIGVsZW1lbnRMb2MpXG4gICAgICApO1xuICAgICAgcHJvcGVydGllcyA9IFtdO1xuICAgIH1cbiAgICBpZiAoYXJnKSBtZXJnZUFyZ3MucHVzaChhcmcpO1xuICB9O1xuICBjb25zdCBwdXNoUmVmVkZvck1hcmtlciA9ICgpID0+IHtcbiAgICBpZiAoY29udGV4dC5zY29wZXMudkZvciA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMucHVzaChcbiAgICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihcInJlZl9mb3JcIiwgdHJ1ZSksXG4gICAgICAgICAgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihcInRydWVcIilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGFuYWx5emVQYXRjaEZsYWcgPSAoeyBrZXksIHZhbHVlIH0pID0+IHtcbiAgICBpZiAoaXNTdGF0aWNFeHAoa2V5KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGtleS5jb250ZW50O1xuICAgICAgY29uc3QgaXNFdmVudEhhbmRsZXIgPSBpc09uKG5hbWUpO1xuICAgICAgaWYgKGlzRXZlbnRIYW5kbGVyICYmICghaXNDb21wb25lbnQgfHwgaXNEeW5hbWljQ29tcG9uZW50KSAmJiAvLyBvbWl0IHRoZSBmbGFnIGZvciBjbGljayBoYW5kbGVycyBiZWNhdXNlIGh5ZHJhdGlvbiBnaXZlcyBjbGlja1xuICAgICAgLy8gZGVkaWNhdGVkIGZhc3QgcGF0aC5cbiAgICAgIG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvbmNsaWNrXCIgJiYgLy8gb21pdCB2LW1vZGVsIGhhbmRsZXJzXG4gICAgICBuYW1lICE9PSBcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIiAmJiAvLyBvbWl0IG9uVm5vZGVYWFggaG9va3NcbiAgICAgICFpc1Jlc2VydmVkUHJvcChuYW1lKSkge1xuICAgICAgICBoYXNIeWRyYXRpb25FdmVudEJpbmRpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXZlbnRIYW5kbGVyICYmIGlzUmVzZXJ2ZWRQcm9wKG5hbWUpKSB7XG4gICAgICAgIGhhc1Zub2RlSG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNFdmVudEhhbmRsZXIgJiYgdmFsdWUudHlwZSA9PT0gMTQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5hcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUudHlwZSA9PT0gMjAgfHwgKHZhbHVlLnR5cGUgPT09IDQgfHwgdmFsdWUudHlwZSA9PT0gOCkgJiYgZ2V0Q29uc3RhbnRUeXBlKHZhbHVlLCBjb250ZXh0KSA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwicmVmXCIpIHtcbiAgICAgICAgaGFzUmVmID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGhhc0NsYXNzQmluZGluZyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICBoYXNTdHlsZUJpbmRpbmcgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChuYW1lICE9PSBcImtleVwiICYmICFkeW5hbWljUHJvcE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIGR5bmFtaWNQcm9wTmFtZXMucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbXBvbmVudCAmJiAobmFtZSA9PT0gXCJjbGFzc1wiIHx8IG5hbWUgPT09IFwic3R5bGVcIikgJiYgIWR5bmFtaWNQcm9wTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgZHluYW1pY1Byb3BOYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNEeW5hbWljS2V5cyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgIGlmIChwcm9wLnR5cGUgPT09IDYpIHtcbiAgICAgIGNvbnN0IHsgbG9jLCBuYW1lLCBuYW1lTG9jLCB2YWx1ZSB9ID0gcHJvcDtcbiAgICAgIGxldCBpc1N0YXRpYyA9IHRydWU7XG4gICAgICBpZiAobmFtZSA9PT0gXCJyZWZcIikge1xuICAgICAgICBoYXNSZWYgPSB0cnVlO1xuICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IFwiaXNcIiAmJiAoaXNDb21wb25lbnRUYWcodGFnKSB8fCB2YWx1ZSAmJiB2YWx1ZS
205785jb250ZW50LnN0YXJ0c1dpdGgoXCJ2dWU6XCIpIHx8IGlzQ29tcGF0RW5hYmxlZChcbiAgICAgICAgXCJDT01QSUxFUl9JU19PTl9FTEVNRU5UXCIsXG4gICAgICAgIGNvbnRleHRcbiAgICAgICkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcHJvcGVydGllcy5wdXNoKFxuICAgICAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKG5hbWUsIHRydWUsIG5hbWVMb2MpLFxuICAgICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXG4gICAgICAgICAgICB2YWx1ZSA/IHZhbHVlLmNvbnRlbnQgOiBcIlwiLFxuICAgICAgICAgICAgaXNTdGF0aWMsXG4gICAgICAgICAgICB2YWx1ZSA/IHZhbHVlLmxvYyA6IGxvY1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBuYW1lLCBhcmcsIGV4cCwgbG9jLCBtb2RpZmllcnMgfSA9IHByb3A7XG4gICAgICBjb25zdCBpc1ZCaW5kID0gbmFtZSA9PT0gXCJiaW5kXCI7XG4gICAgICBjb25zdCBpc1ZPbiA9IG5hbWUgPT09IFwib25cIjtcbiAgICAgIGlmIChuYW1lID09PSBcInNsb3RcIikge1xuICAgICAgICBpZiAoIWlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcig0MCwgbG9jKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gXCJvbmNlXCIgfHwgbmFtZSA9PT0gXCJtZW1vXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gXCJpc1wiIHx8IGlzVkJpbmQgJiYgaXNTdGF0aWNBcmdPZihhcmcsIFwiaXNcIikgJiYgKGlzQ29tcG9uZW50VGFnKHRhZykgfHwgaXNDb21wYXRFbmFibGVkKFxuICAgICAgICBcIkNPTVBJTEVSX0lTX09OX0VMRU1FTlRcIixcbiAgICAgICAgY29udGV4dFxuICAgICAgKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNWT24gJiYgc3NyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAvLyAjOTM4OiBlbGVtZW50cyB3aXRoIGR5bmFtaWMga2V5cyBzaG91bGQgYmUgZm9yY2VkIGludG8gYmxvY2tzXG4gICAgICAgIGlzVkJpbmQgJiYgaXNTdGF0aWNBcmdPZihhcmcsIFwia2V5XCIpIHx8IC8vIGlubGluZSBiZWZvcmUtdXBkYXRlIGhvb2tzIG5lZWQgdG8gZm9yY2UgYmxvY2sgc28gdGhhdCBpdCBpcyBpbnZva2VkXG4gICAgICAgIC8vIGJlZm9yZSBjaGlsZHJlblxuICAgICAgICBpc1ZPbiAmJiBoYXNDaGlsZHJlbiAmJiBpc1N0YXRpY0FyZ09mKGFyZywgXCJ2dWU6YmVmb3JlLXVwZGF0ZVwiKVxuICAgICAgKSB7XG4gICAgICAgIHNob3VsZFVzZUJsb2NrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ZCaW5kICYmIGlzU3RhdGljQXJnT2YoYXJnLCBcInJlZlwiKSkge1xuICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcmcgJiYgKGlzVkJpbmQgfHwgaXNWT24pKSB7XG4gICAgICAgIGhhc0R5bmFtaWNLZXlzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGV4cCkge1xuICAgICAgICAgIGlmIChpc1ZCaW5kKSB7XG4gICAgICAgICAgICBwdXNoUmVmVkZvck1hcmtlcigpO1xuICAgICAgICAgICAgcHVzaE1lcmdlQXJnKCk7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzT3ZlcnJpZGFibGVLZXlzID0gbWVyZ2VBcmdzLnNvbWUoKGFyZzIpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChhcmcyLnR5cGUgPT09IDE1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcyLnByb3BlcnRpZXMuc29tZSgoeyBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudHlwZSAhPT0gNCB8fCAha2V5LmlzU3RhdGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5jb250ZW50ICE9PSBcImNsYXNzXCIgJiYga2V5LmNvbnRlbnQgIT09IFwic3R5bGVcIiAmJiAhaXNPbihrZXkuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc092ZXJyaWRhYmxlS2V5cykge1xuICAgICAgICAgICAgICAgICAgY2hlY2tDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgICAgICAgICBcIkNPTVBJTEVSX1ZfQklORF9PQkpFQ1RfT1JERVJcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgbG9jXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNDb21wYXRFbmFibGVkKFxuICAgICAgICAgICAgICAgIFwiQ09NUElMRVJfVl9CSU5EX09CSkVDVF9PUkRFUlwiLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIG1lcmdlQXJncy51bnNoaWZ0KGV4cCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lcmdlQXJncy5wdXNoKGV4cCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2hNZXJnZUFyZyh7XG4gICAgICAgICAgICAgIHR5cGU6IDE0LFxuICAgICAgICAgICAgICBsb2MsXG4gICAgICAgICAgICAgIGNhbGxlZTogY29udGV4dC5oZWxwZXIoVE9fSEFORExFUlMpLFxuICAgICAgICAgICAgICBhcmd1bWVudHM6IGlzQ29tcG9uZW50ID8gW2V4cF0gOiBbZXhwLCBgdHJ1ZWBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICAgICAgaXNWQmluZCA/IDM0IDogMzUsXG4gICAgICAgICAgICAgIGxvY1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNWQmluZCAmJiBtb2RpZmllcnMuaW5jbHVkZXMoXCJwcm9wXCIpKSB7XG4gICAgICAgIHBhdGNoRmxhZyB8PSAzMjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpcmVjdGl2ZVRyYW5zZm9ybSA9IGNvbnRleHQuZGlyZWN0aXZlVHJhbnNmb3Jtc1tuYW1lXTtcbiAgICAgIGlmIChkaXJlY3RpdmVUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgeyBwcm9wczogcHJvcHMyLCBuZWVkUnVudGltZSB9ID0gZGlyZWN0aXZlVHJhbnNmb3JtKHByb3AsIG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAhc3NyICYmIHByb3BzMi5mb3JFYWNoKGFuYWx5emVQYXRjaEZsYWcpO1xuICAgICAgICBpZiAoaXNWT24gJiYgYXJnICYmICFpc1N0YXRpY0V4cChhcmcpKSB7XG4gICAgICAgICAgcHVzaE1lcmdlQXJnKGNyZWF0ZU9iamVjdEV4cHJlc3Npb24ocHJvcHMyLCBlbGVtZW50TG9jKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydGllcy5wdXNoKC4uLnByb3BzMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRSdW50aW1lKSB7XG4gICAgICAgICAgcnVudGltZURpcmVjdGl2ZXMucHVzaChwcm9wKTtcbiAgICAgICAgICBpZiAoaXNTeW1ib2wobmVlZFJ1bnRpbWUpKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVJbXBvcnRNYXAuc2V0KHByb3AsIG5lZWRSdW50aW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzQnVpbHRJbkRpcmVjdGl2ZShuYW1lKSkge1xuICAgICAgICBydW50aW1lRGlyZWN0aXZlcy5wdXNoKHByb3ApO1xuICAgICAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICBzaG91bGRVc2VCbG9jayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IHByb3BzRXhwcmVzc2lvbiA9IHZvaWQgMDtcbiAgaWYgKG1lcmdlQXJncy5sZW5ndGgpIHtcbiAgICBwdXNoTWVyZ2VBcmcoKTtcbiAgICBpZiAobWVyZ2VBcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICBjb250ZXh0LmhlbHBlcihNRVJHRV9QUk9QUyksXG4gICAgICAgIG1lcmdlQXJncyxcbiAgICAgICAgZWxlbWVudExvY1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHNFeHByZXNzaW9uID0gbWVyZ2VBcmdzWzBdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BzRXhwcmVzc2lvbiA9IGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oXG4gICAgICBkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLFxuICAgICAgZWxlbWVudExvY1xuICAgICk7XG4gIH1cbiAgaWYgKGhhc0R5bmFtaWNLZXlzKSB7XG4gICAgcGF0Y2hGbGFnIHw9IDE2O1xuICB9IGVsc2Uge1xuICAgIGlmIChoYXNDbGFzc0JpbmRpbmcgJiYgIWlzQ29tcG9uZW50KSB7XG4gICAgICBwYXRjaEZsYWcgfD0gMjtcbiAgICB9XG4gICAgaWYgKGhhc1N0eWxlQmluZGluZyAmJiAhaXNDb21wb25lbnQpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSA0O1xuICAgIH1cbiAgICBpZiAoZHluYW1pY1Byb3BOYW1lcy5sZW5ndGgpIHtcbiAgICAgIHBhdGNoRmxhZyB8PSA4O1xuICAgIH1cbiAgICBpZiAoaGFzSHlkcmF0aW9uRXZlbnRCaW5kaW5nKSB7XG4gICAgICBwYXRjaEZsYWcgfD0gMzI7XG4gICAgfVxuICB9XG4gIGlmICghc2hvdWxkVXNlQmxvY2sgJiYgKHBhdGNoRmxhZyA9PT0gMCB8fCBwYXRjaEZsYWcgPT09IDMyKSAmJiAoaGFzUmVmIHx8IGhhc1Zub2RlSG9vayB8fCBydW50aW1lRGlyZWN0aXZlcy5sZW5ndGggPiAwKSkge1xuICAgIHBhdGNoRmxhZyB8PSA1MTI7XG4gIH1cbiAgaWYgKCFjb250ZXh0LmluU1NSICYmIHByb3BzRXhwcmVzc2lvbikge1xuICAgIHN3aXRjaCAocHJvcHNFeHByZXNzaW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgMTU6XG4gICAgICAgIGxldCBjbGFzc0tleUluZGV4ID0gLTE7XG4gICAgICAgIGxldCBzdHlsZUtleUluZGV4ID0gLTE7XG4gICAgICAgIGxldCBoYXNEeW5hbWljS2V5ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tpXS5rZXk7XG4gICAgICAgICAgaWYgKGlzU3RhdGljRXhwKGtleSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuY29udGVudCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgIGNsYXNzS2V5SW5kZXggPSBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuY29udGVudCA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAgIHN0eWxlS2V5SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIWtleS5pc0hhbmRsZXJLZXkpIHtcbiAgICAgICAgICAgIGhhc0R5bmFtaWNLZXkgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGFzc1Byb3AgPSBwcm9wc0V4cHJlc3Npb24ucHJvcGVydGllc1tjbGFzc0tleUluZGV4XTtcbiAgICAgICAgY29uc3Qgc3R5bGVQcm9wID0gcHJvcHNFeHByZXNzaW9uLnByb3BlcnRpZXNbc3R5bGVLZXlJbmRleF07XG4gICAgICAgIGlmICghaGFzRHluYW1pY0tleSkge1xuICAgICAgICAgIGlmIChjbGFzc1Byb3AgJiYgIWlzU3RhdGljRXhwKGNsYXNzUHJvcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzUHJvcC52YWx1ZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfQ0xBU1MpLFxuICAgICAgICAgICAgICBbY2xhc3NQcm9wLnZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0eWxlUHJvcCAmJiAvLyB0aGUgc3RhdGljIHN0eWxlIGlzIGNvbXBpbGVkIGludG8gYW4gb2JqZWN0LFxuICAgICAgICAgIC8vIHNvIHVzZSBgaGFzU3R5bGVCaW5kaW5nYCB0byBlbnN1cmUgdGhhdCBpdCBpcyBh
20578IGR5bmFtaWMgc3R5bGUgYmluZGluZ1xuICAgICAgICAgIChoYXNTdHlsZUJpbmRpbmcgfHwgc3R5bGVQcm9wLnZhbHVlLnR5cGUgPT09IDQgJiYgc3R5bGVQcm9wLnZhbHVlLmNvbnRlbnQudHJpbSgpWzBdID09PSBgW2AgfHwgLy8gdi1iaW5kOnN0eWxlIGFuZCBzdHlsZSBib3RoIGV4aXN0LFxuICAgICAgICAgIC8vIHYtYmluZDpzdHlsZSB3aXRoIHN0YXRpYyBsaXRlcmFsIG9iamVjdFxuICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZS50eXBlID09PSAxNykpIHtcbiAgICAgICAgICAgIHN0eWxlUHJvcC52YWx1ZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfU1RZTEUpLFxuICAgICAgICAgICAgICBbc3R5bGVQcm9wLnZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNFeHByZXNzaW9uID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfUFJPUFMpLFxuICAgICAgICAgICAgW3Byb3BzRXhwcmVzc2lvbl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwcm9wc0V4cHJlc3Npb24gPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihcbiAgICAgICAgICBjb250ZXh0LmhlbHBlcihOT1JNQUxJWkVfUFJPUFMpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGNyZWF0ZUNhbGxFeHByZXNzaW9uKGNvbnRleHQuaGVscGVyKEdVQVJEX1JFQUNUSVZFX1BST1BTKSwgW1xuICAgICAgICAgICAgICBwcm9wc0V4cHJlc3Npb25cbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogcHJvcHNFeHByZXNzaW9uLFxuICAgIGRpcmVjdGl2ZXM6IHJ1bnRpbWVEaXJlY3RpdmVzLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcE5hbWVzLFxuICAgIHNob3VsZFVzZUJsb2NrXG4gIH07XG59XG5mdW5jdGlvbiBkZWR1cGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgY29uc3Qga25vd25Qcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgaWYgKHByb3Aua2V5LnR5cGUgPT09IDggfHwgIXByb3Aua2V5LmlzU3RhdGljKSB7XG4gICAgICBkZWR1cGVkLnB1c2gocHJvcCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHByb3Aua2V5LmNvbnRlbnQ7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBrbm93blByb3BzLmdldChuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGlmIChuYW1lID09PSBcInN0eWxlXCIgfHwgbmFtZSA9PT0gXCJjbGFzc1wiIHx8IGlzT24obmFtZSkpIHtcbiAgICAgICAgbWVyZ2VBc0FycmF5KGV4aXN0aW5nLCBwcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga25vd25Qcm9wcy5zZXQobmFtZSwgcHJvcCk7XG4gICAgICBkZWR1cGVkLnB1c2gocHJvcCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWR1cGVkO1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KGV4aXN0aW5nLCBpbmNvbWluZykge1xuICBpZiAoZXhpc3RpbmcudmFsdWUudHlwZSA9PT0gMTcpIHtcbiAgICBleGlzdGluZy52YWx1ZS5lbGVtZW50cy5wdXNoKGluY29taW5nLnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBleGlzdGluZy52YWx1ZSA9IGNyZWF0ZUFycmF5RXhwcmVzc2lvbihcbiAgICAgIFtleGlzdGluZy52YWx1ZSwgaW5jb21pbmcudmFsdWVdLFxuICAgICAgZXhpc3RpbmcubG9jXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gYnVpbGREaXJlY3RpdmVBcmdzKGRpciwgY29udGV4dCkge1xuICBjb25zdCBkaXJBcmdzID0gW107XG4gIGNvbnN0IHJ1bnRpbWUgPSBkaXJlY3RpdmVJbXBvcnRNYXAuZ2V0KGRpcik7XG4gIGlmIChydW50aW1lKSB7XG4gICAgZGlyQXJncy5wdXNoKGNvbnRleHQuaGVscGVyU3RyaW5nKHJ1bnRpbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBjb250ZXh0LmhlbHBlcihSRVNPTFZFX0RJUkVDVElWRSk7XG4gICAgICBjb250ZXh0LmRpcmVjdGl2ZXMuYWRkKGRpci5uYW1lKTtcbiAgICAgIGRpckFyZ3MucHVzaCh0b1ZhbGlkQXNzZXRJZChkaXIubmFtZSwgYGRpcmVjdGl2ZWApKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgeyBsb2MgfSA9IGRpcjtcbiAgaWYgKGRpci5leHApIGRpckFyZ3MucHVzaChkaXIuZXhwKTtcbiAgaWYgKGRpci5hcmcpIHtcbiAgICBpZiAoIWRpci5leHApIHtcbiAgICAgIGRpckFyZ3MucHVzaChgdm9pZCAwYCk7XG4gICAgfVxuICAgIGRpckFyZ3MucHVzaChkaXIuYXJnKTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycykubGVuZ3RoKSB7XG4gICAgaWYgKCFkaXIuYXJnKSB7XG4gICAgICBpZiAoIWRpci5leHApIHtcbiAgICAgICAgZGlyQXJncy5wdXNoKGB2b2lkIDBgKTtcbiAgICAgIH1cbiAgICAgIGRpckFyZ3MucHVzaChgdm9pZCAwYCk7XG4gICAgfVxuICAgIGNvbnN0IHRydWVFeHByZXNzaW9uID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihgdHJ1ZWAsIGZhbHNlLCBsb2MpO1xuICAgIGRpckFyZ3MucHVzaChcbiAgICAgIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24oXG4gICAgICAgIGRpci5tb2RpZmllcnMubWFwKFxuICAgICAgICAgIChtb2RpZmllcikgPT4gY3JlYXRlT2JqZWN0UHJvcGVydHkobW9kaWZpZXIsIHRydWVFeHByZXNzaW9uKVxuICAgICAgICApLFxuICAgICAgICBsb2NcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVBcnJheUV4cHJlc3Npb24oZGlyQXJncywgZGlyLmxvYyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlEeW5hbWljUHJvcE5hbWVzKHByb3BzKSB7XG4gIGxldCBwcm9wc05hbWVzU3RyaW5nID0gYFtgO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHByb3BzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHByb3BzTmFtZXNTdHJpbmcgKz
205780gSlNPTi5zdHJpbmdpZnkocHJvcHNbaV0pO1xuICAgIGlmIChpIDwgbCAtIDEpIHByb3BzTmFtZXNTdHJpbmcgKz0gXCIsIFwiO1xuICB9XG4gIHJldHVybiBwcm9wc05hbWVzU3RyaW5nICsgYF1gO1xufVxuZnVuY3Rpb24gaXNDb21wb25lbnRUYWcodGFnKSB7XG4gIHJldHVybiB0YWcgPT09IFwiY29tcG9uZW50XCIgfHwgdGFnID09PSBcIkNvbXBvbmVudFwiO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1TbG90T3V0bGV0ID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKGlzU2xvdE91dGxldChub2RlKSkge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGxvYyB9ID0gbm9kZTtcbiAgICBjb25zdCB7IHNsb3ROYW1lLCBzbG90UHJvcHMgfSA9IHByb2Nlc3NTbG90T3V0bGV0KG5vZGUsIGNvbnRleHQpO1xuICAgIGNvbnN0IHNsb3RBcmdzID0gW1xuICAgICAgY29udGV4dC5wcmVmaXhJZGVudGlmaWVycyA/IGBfY3R4LiRzbG90c2AgOiBgJHNsb3RzYCxcbiAgICAgIHNsb3ROYW1lLFxuICAgICAgXCJ7fVwiLFxuICAgICAgXCJ1bmRlZmluZWRcIixcbiAgICAgIFwidHJ1ZVwiXG4gICAgXTtcbiAgICBsZXQgZXhwZWN0ZWRMZW4gPSAyO1xuICAgIGlmIChzbG90UHJvcHMpIHtcbiAgICAgIHNsb3RBcmdzWzJdID0gc2xvdFByb3BzO1xuICAgICAgZXhwZWN0ZWRMZW4gPSAzO1xuICAgIH1cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBzbG90QXJnc1szXSA9IGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbihbXSwgY2hpbGRyZW4sIGZhbHNlLCBmYWxzZSwgbG9jKTtcbiAgICAgIGV4cGVjdGVkTGVuID0gNDtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuc2NvcGVJZCAmJiAhY29udGV4dC5zbG90dGVkKSB7XG4gICAgICBleHBlY3RlZExlbiA9IDU7XG4gICAgfVxuICAgIHNsb3RBcmdzLnNwbGljZShleHBlY3RlZExlbik7XG4gICAgbm9kZS5jb2RlZ2VuTm9kZSA9IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgY29udGV4dC5oZWxwZXIoUkVOREVSX1NMT1QpLFxuICAgICAgc2xvdEFyZ3MsXG4gICAgICBsb2NcbiAgICApO1xuICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RPdXRsZXQobm9kZSwgY29udGV4dCkge1xuICBsZXQgc2xvdE5hbWUgPSBgXCJkZWZhdWx0XCJgO1xuICBsZXQgc2xvdFByb3BzID0gdm9pZCAwO1xuICBjb25zdCBub25OYW1lUHJvcHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcCA9IG5vZGUucHJvcHNbaV07XG4gICAgaWYgKHAudHlwZSA9PT0gNikge1xuICAgICAgaWYgKHAudmFsdWUpIHtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICBzbG90TmFtZSA9IEpTT04uc3RyaW5naWZ5KHAudmFsdWUuY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcC5uYW1lID0gY2FtZWxpemUocC5uYW1lKTtcbiAgICAgICAgICBub25OYW1lUHJvcHMucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocC5uYW1lID09PSBcImJpbmRcIiAmJiBpc1N0YXRpY0FyZ09mKHAuYXJnLCBcIm5hbWVcIikpIHtcbiAgICAgICAgaWYgKHAuZXhwKSB7XG4gICAgICAgICAgc2xvdE5hbWUgPSBwLmV4cDtcbiAgICAgICAgfSBlbHNlIGlmIChwLmFyZyAmJiBwLmFyZy50eXBlID09PSA0KSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGNhbWVsaXplKHAuYXJnLmNvbnRlbnQpO1xuICAgICAgICAgIHNsb3ROYW1lID0gcC5leHAgPSBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKG5hbWUsIGZhbHNlLCBwLmFyZy5sb2MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocC5uYW1lID09PSBcImJpbmRcIiAmJiBwLmFyZyAmJiBpc1N0YXRpY0V4cChwLmFyZykpIHtcbiAgICAgICAgICBwLmFyZy5jb250ZW50ID0gY2FtZWxpemUocC5hcmcuY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9uTmFtZVByb3BzLnB1c2gocCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChub25OYW1lUHJvcHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHsgcHJvcHMsIGRpcmVjdGl2ZXMgfSA9IGJ1aWxkUHJvcHMoXG4gICAgICBub2RlLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vbk5hbWVQcm9wcyxcbiAgICAgIGZhbHNlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHNsb3RQcm9wcyA9IHByb3BzO1xuICAgIGlmIChkaXJlY3RpdmVzLmxlbmd0aCkge1xuICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICBjcmVhdGVDb21waWxlckVycm9yKFxuICAgICAgICAgIDM2LFxuICAgICAgICAgIGRpcmVjdGl2ZXNbMF0ubG9jXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc2xvdE5hbWUsXG4gICAgc2xvdFByb3BzXG4gIH07XG59XG5cbmNvbnN0IGZuRXhwUkUgPSAvXlxccyooYXN5bmNcXHMqKT8oXFwoW14pXSo/XFwpfFtcXHckX10rKVxccyooOltePV0rKT89PnxeXFxzKihhc3luY1xccyspP2Z1bmN0aW9uKD86XFxzK1tcXHckXSspP1xccypcXCgvO1xuY29uc3QgdHJhbnNmb3JtT24gPSAoZGlyLCBub2RlLCBjb250ZXh0LCBhdWdtZW50b3IpID0+IHtcbiAgY29uc3QgeyBsb2MsIG1vZGlmaWVycywgYXJnIH0gPSBkaXI7XG4gIGlmICghZGlyLmV4cCAmJiAhbW9kaWZpZXJzLmxlbmd0aCkge1xuICAgIGNvbnRleHQub25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDM1LCBsb2MpKTtcbiAgfVxuICBsZXQgZXZlbnROYW1lO1xuICBpZiAoYXJnLnR5cGUgPT09IDQpIHtcbiAgICBpZiAoYXJnLmlzU3RhdGljKSB7XG4gICAgICBsZXQgcmF3TmFtZSA9IGFyZy5jb250ZW50O1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmF3TmFtZS5zdGFydHNXaXRoKFwidm5vZGVcIikpIHtcbiAgICAgICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNTEsIGFyZy5sb2MpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXdOYW1lLnN0YXJ0c1dpdGgoXCJ2dWU6XCIpKSB7XG4gICAgICAgIHJhd05hbWUgPSBgdm5vZGUtJHtyYXdOYW1lLnNsaWNlKDQpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudFN0cmluZyA9IG5vZGUudGFnVHlwZSAhPT0gMCB8fCByYXdOYW1lLnN0YXJ0c1dpdGgoXCJ2bm9kZVwiKSB8fCAhL1tBLVpdLy50ZXN0KHJhd05hbWUpID8gKFxuICAgICAgICAvLyBmb3Igbm9uLWVsZW1lbnQgYW5kIHZub2RlIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMsIGF1dG8gY29udmVydFxuICAgICAgICAvLyBpdCB0byBjYW1lbENhc2UuIFNlZSBpc3N1ZSAjMjI0OVxuICAgICAgICB0b0hhbmRsZXJLZXkoY2FtZWxpemUocmF3TmFtZSkpXG4gICAgICApIDogKFxuICAgICAgICAvLyBwcmVzZXJ2ZSBjYXNlIGZvciBwbGFpbiBlbGVtZW50IGxpc3RlbmVycyB0aGF0IGhh
20578dmUgdXBwZXJjYXNlXG4gICAgICAgIC8vIGxldHRlcnMsIGFzIHRoZXNlIG1heSBiZSBjdXN0b20gZWxlbWVudHMnIGN1c3RvbSBldmVudHNcbiAgICAgICAgYG9uOiR7cmF3TmFtZX1gXG4gICAgICApO1xuICAgICAgZXZlbnROYW1lID0gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihldmVudFN0cmluZywgdHJ1ZSwgYXJnLmxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2ZW50TmFtZSA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICAgIGAke2NvbnRleHQuaGVscGVyU3RyaW5nKFRPX0hBTkRMRVJfS0VZKX0oYCxcbiAgICAgICAgYXJnLFxuICAgICAgICBgKWBcbiAgICAgIF0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBldmVudE5hbWUgPSBhcmc7XG4gICAgZXZlbnROYW1lLmNoaWxkcmVuLnVuc2hpZnQoYCR7Y29udGV4dC5oZWxwZXJTdHJpbmcoVE9fSEFORExFUl9LRVkpfShgKTtcbiAgICBldmVudE5hbWUuY2hpbGRyZW4ucHVzaChgKWApO1xuICB9XG4gIGxldCBleHAgPSBkaXIuZXhwO1xuICBpZiAoZXhwICYmICFleHAuY29udGVudC50cmltKCkpIHtcbiAgICBleHAgPSB2b2lkIDA7XG4gIH1cbiAgbGV0IHNob3VsZENhY2hlID0gY29udGV4dC5jYWNoZUhhbmRsZXJzICYmICFleHAgJiYgIWNvbnRleHQuaW5WT25jZTtcbiAgaWYgKGV4cCkge1xuICAgIGNvbnN0IGlzTWVtYmVyRXhwID0gaXNNZW1iZXJFeHByZXNzaW9uKGV4cC5jb250ZW50KTtcbiAgICBjb25zdCBpc0lubGluZVN0YXRlbWVudCA9ICEoaXNNZW1iZXJFeHAgfHwgZm5FeHBSRS50ZXN0KGV4cC5jb250ZW50KSk7XG4gICAgY29uc3QgaGFzTXVsdGlwbGVTdGF0ZW1lbnRzID0gZXhwLmNvbnRlbnQuaW5jbHVkZXMoYDtgKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICB2YWxpZGF0ZUJyb3dzZXJFeHByZXNzaW9uKFxuICAgICAgICBleHAsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBoYXNNdWx0aXBsZVN0YXRlbWVudHNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpc0lubGluZVN0YXRlbWVudCB8fCBzaG91bGRDYWNoZSAmJiBpc01lbWJlckV4cCkge1xuICAgICAgZXhwID0gY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uKFtcbiAgICAgICAgYCR7aXNJbmxpbmVTdGF0ZW1lbnQgPyBgJGV2ZW50YCA6IGAke2BgfSguLi5hcmdzKWB9ID0+ICR7aGFzTXVsdGlwbGVTdGF0ZW1lbnRzID8gYHtgIDogYChgfWAsXG4gICAgICAgIGV4cCxcbiAgICAgICAgaGFzTXVsdGlwbGVTdGF0ZW1lbnRzID8gYH1gIDogYClgXG4gICAgICBdKTtcbiAgICB9XG4gIH1cbiAgbGV0IHJldCA9IHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgZXhwIHx8IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCgpID0+IHt9YCwgZmFsc2UsIGxvYylcbiAgICAgIClcbiAgICBdXG4gIH07XG4gIGlmIChhdWdtZW50b3IpIHtcbiAgICByZXQgPSBhdWdtZW50b3IocmV0KTtcbiAgfVxuICBpZiAoc2hvdWxkQ2FjaGUpIHtcbiAgICByZXQucHJvcHNbMF0udmFsdWUgPSBjb250ZXh0LmNhY2hlKHJldC5wcm9wc1swXS52YWx1ZSk7XG4gIH1cbiAgcmV0LnByb3BzLmZvckVhY2goKHApID0+IHAua2V5LmlzSGFuZGxlcktleSA9IHRydWUpO1xuICByZXR1cm4gcmV0O1xufTtcblxuY29uc3QgdHJhbnNmb3JtVGV4dCA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDAgfHwgbm9kZS50eXBlID09PSAxIHx8IG5vZGUudHlwZSA9PT0gMTEgfHwgbm9kZS50eXBlID09PSAxMCkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBsZXQgY3VycmVudENvbnRhaW5lciA9IHZvaWQgMDtcbiAgICAgIGxldCBoYXNUZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChpc1RleHQkMShjaGlsZCkpIHtcbiAgICAgICAgICBoYXNUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgaWYgKGlzVGV4dCQxKG5leHQpKSB7XG4gICAgICAgICAgICAgIGlmICghY3VycmVudENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBjaGlsZHJlbltpXSA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgIFtjaGlsZF0sXG4gICAgICAgICAgICAgICAgICBjaGlsZC5sb2NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIuY2hpbGRyZW4ucHVzaChgICsgYCwgbmV4dCk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1RleHQgfHwgLy8gaWYgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgd2l0aCBhIHNpbmdsZSB0ZXh0IGNoaWxkLCBsZWF2ZSBpdFxuICAgICAgLy8gYXMtaXMgc2luY2UgdGhlIHJ1bnRpbWUgaGFzIGRlZGljYXRlZCBmYXN0IHBhdGggZm9yIHRoaXMgYnkgZGlyZWN0bHlcbiAgICAgIC8vIHNldHRpbmcgdGV4dENvbnRlbnQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAvLyBmb3IgY29tcG9uZW50IHJvb3QgaXQncyBhbHdheXMgbm9ybWFsaXplZCBhbnl3YXkuXG4gICAgICBjaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgKG5vZGUudHlwZSA9PT0gMCB8fCBub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAwICYmIC8vICMzNzU2XG4gICAgICAvLyBjdXN0b20gZGlyZWN0aXZlcyBjYW4gcG90ZW50aWFsbHkgYWRkIERPTSBlbGVtZW50cyBhcmJpdHJhcmlseSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gYXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCBvZiB0aGUgZWxlbWVudCBhdCBydW50aW1lXG4gICAgICAvLyB0byBhdm9pZCBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlIERPTSBlbGVtZW50cyBhZGRlZFxuICAgICAgLy8gYnkgdGhlI
20578HVzZXIgdGhyb3VnaCBjdXN0b20gZGlyZWN0aXZlcy5cbiAgICAgICFub2RlLnByb3BzLmZpbmQoXG4gICAgICAgIChwKSA9PiBwLnR5cGUgPT09IDcgJiYgIWNvbnRleHQuZGlyZWN0aXZlVHJhbnNmb3Jtc1twLm5hbWVdXG4gICAgICApICYmIC8vIGluIGNvbXBhdCBtb2RlLCA8dGVtcGxhdGU+IHRhZ3Mgd2l0aCBubyBzcGVjaWFsIGRpcmVjdGl2ZXNcbiAgICAgIC8vIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBmcmFnbWVudCBzbyBpdHMgY2hpbGRyZW4gbXVzdCBiZVxuICAgICAgLy8gY29udmVydGVkIGludG8gdm5vZGVzLlxuICAgICAgIShub2RlLnRhZyA9PT0gXCJ0ZW1wbGF0ZVwiKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoaXNUZXh0JDEoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09IDgpIHtcbiAgICAgICAgICBjb25zdCBjYWxsQXJncyA9IFtdO1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9PSAyIHx8IGNoaWxkLmNvbnRlbnQgIT09IFwiIFwiKSB7XG4gICAgICAgICAgICBjYWxsQXJncy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjb250ZXh0LnNzciAmJiBnZXRDb25zdGFudFR5cGUoY2hpbGQsIGNvbnRleHQpID09PSAwKSB7XG4gICAgICAgICAgICBjYWxsQXJncy5wdXNoKFxuICAgICAgICAgICAgICAxICsgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgIC8qICR7UGF0Y2hGbGFnTmFtZXNbMV19ICovYCA6IGBgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hpbGRyZW5baV0gPSB7XG4gICAgICAgICAgICB0eXBlOiAxMixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNoaWxkLFxuICAgICAgICAgICAgbG9jOiBjaGlsZC5sb2MsXG4gICAgICAgICAgICBjb2RlZ2VuTm9kZTogY3JlYXRlQ2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICAgIGNvbnRleHQuaGVscGVyKENSRUFURV9URVhUKSxcbiAgICAgICAgICAgICAgY2FsbEFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuY29uc3Qgc2VlbiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG5jb25zdCB0cmFuc2Zvcm1PbmNlID0gKG5vZGUsIGNvbnRleHQpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gMSAmJiBmaW5kRGlyKG5vZGUsIFwib25jZVwiLCB0cnVlKSkge1xuICAgIGlmIChzZWVuJDEuaGFzKG5vZGUpIHx8IGNvbnRleHQuaW5WT25jZSB8fCBjb250ZXh0LmluU1NSKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4kMS5hZGQobm9kZSk7XG4gICAgY29udGV4dC5pblZPbmNlID0gdHJ1ZTtcbiAgICBjb250ZXh0LmhlbHBlcihTRVRfQkxPQ0tfVFJBQ0tJTkcpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb250ZXh0LmluVk9uY2UgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGN1ciA9IGNvbnRleHQuY3VycmVudE5vZGU7XG4gICAgICBpZiAoY3VyLmNvZGVnZW5Ob2RlKSB7XG4gICAgICAgIGN1ci5jb2RlZ2VuTm9kZSA9IGNvbnRleHQuY2FjaGUoXG4gICAgICAgICAgY3VyLmNvZGVnZW5Ob2RlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgICAvKiBpc1ZOb2RlICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtTW9kZWwgPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBhcmcgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVDb21waWxlckVycm9yKDQxLCBkaXIubG9jKVxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKCk7XG4gIH1cbiAgY29uc3QgcmF3RXhwID0gZXhwLmxvYy5zb3VyY2U7XG4gIGNvbnN0IGV4cFN0cmluZyA9IGV4cC50eXBlID09PSA0ID8gZXhwLmNvbnRlbnQgOiByYXdFeHA7XG4gIGNvbnN0IGJpbmRpbmdUeXBlID0gY29udGV4dC5iaW5kaW5nTWV0YWRhdGFbcmF3RXhwXTtcbiAgaWYgKGJpbmRpbmdUeXBlID09PSBcInByb3BzXCIgfHwgYmluZGluZ1R5cGUgPT09IFwicHJvcHMtYWxpYXNlZFwiKSB7XG4gICAgY29udGV4dC5vbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDQsIGV4cC5sb2MpKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNmb3JtUHJvcHMoKTtcbiAgfVxuICBjb25zdCBtYXliZVJlZiA9IGZhbHNlO1xuICBpZiAoIWV4cFN0cmluZy50cmltKCkgfHwgIWlzTWVtYmVyRXhwcmVzc2lvbihleHBTdHJpbmcpICYmICFtYXliZVJlZikge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDIsIGV4cC5sb2MpXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlVHJhbnNmb3JtUHJvcHMoKTtcbiAgfVxuICBjb25zdCBwcm9wTmFtZSA9IGFyZyA/IGFyZyA6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXCJtb2RlbFZhbHVlXCIsIHRydWUpO1xuICBjb25zdCBldmVudE5hbWUgPSBhcmcgPyBpc1N0YXRpY0V4cChhcmcpID8gYG9uVXBkYXRlOiR7Y2FtZWxpemUoYXJnLmNvbnRlbnQpfWAgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oWydcIm9uVXBkYXRlOlwiICsgJywgYXJnXSkgOiBgb25VcGRhdGU6bW9kZWxWYWx1ZWA7XG4gIGxldCBhc3NpZ25tZW50RXhwO1xuICBjb25zdCBldmVudEFyZyA9IGNvbnRleHQuaXNUUyA/IGAoJGV2ZW50OiBhbnkpYCA6IGAkZXZlbnRgO1xuICB7XG4gICAgYXNzaWdubWVudEV4cCA9IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgICBgJHtldmVudEFyZ30gPT4gKChgLFxuICAgICAgZXhwLFxuICAgICAgYCkgPSAkZXZlbnQpYFxuICAgIF0pO1xuICB9XG4gIGNvbnN0IHByb3BzID0gW1xuICAgIC8vIG1vZGVsVmFsdWU6IGZvb1xuICAgIGNyZWF0ZU9iamVjdFByb3BlcnR5KHByb3BOYW1lLCBkaXIuZXhwKSxcbiAgICAvLyBcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIjogJGV2ZW50ID0+IChmb28gPSAkZXZlbnQpXG4gICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoZXZlbnROYW1lLCBhc3NpZ25tZW50RXhwKVxuICBdO1xuICBpZiAoZGlyLm1vZGlmaWVycy5sZW5ndGggJiYgbm9kZS50YWdUeXBlID09PSAxKSB7XG4gICAgY29uc3QgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVycy5tYXAoKG0pID0+IChpc1NpbXBsZUlkZW50aWZpZXIobSkgPyBtIDogSlNPTi5zdHJpbmdpZnkobSkpICsgYDogdHJ1ZWApLmpvaW4oYCwgYCk7XG4gICAgY29uc3QgbW9kaWZpZXJzS2V5ID0gYXJnID8gaXNTdGF0aWNFeHAoYXJnKSA/IGA
20578ke2FyZy5jb250ZW50fU1vZGlmaWVyc2AgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2FyZywgJyArIFwiTW9kaWZpZXJzXCInXSkgOiBgbW9kZWxNb2RpZmllcnNgO1xuICAgIHByb3BzLnB1c2goXG4gICAgICBjcmVhdGVPYmplY3RQcm9wZXJ0eShcbiAgICAgICAgbW9kaWZpZXJzS2V5LFxuICAgICAgICBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgICAgICAgIGB7ICR7bW9kaWZpZXJzfSB9YCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBkaXIubG9jLFxuICAgICAgICAgIDJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVRyYW5zZm9ybVByb3BzKHByb3BzKTtcbn07XG5mdW5jdGlvbiBjcmVhdGVUcmFuc2Zvcm1Qcm9wcyhwcm9wcyA9IFtdKSB7XG4gIHJldHVybiB7IHByb3BzIH07XG59XG5cbmNvbnN0IHZhbGlkRGl2aXNpb25DaGFyUkUgPSAvW1xcdykuK1xcLV8kXFxdXS87XG5jb25zdCB0cmFuc2Zvcm1GaWx0ZXIgPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBpZiAoIWlzQ29tcGF0RW5hYmxlZChcIkNPTVBJTEVSX0ZJTFRFUlNcIiwgY29udGV4dCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gNSkge1xuICAgIHJld3JpdGVGaWx0ZXIobm9kZS5jb250ZW50LCBjb250ZXh0KTtcbiAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICBub2RlLnByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09IDcgJiYgcHJvcC5uYW1lICE9PSBcImZvclwiICYmIHByb3AuZXhwKSB7XG4gICAgICAgIHJld3JpdGVGaWx0ZXIocHJvcC5leHAsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuZnVuY3Rpb24gcmV3cml0ZUZpbHRlcihub2RlLCBjb250ZXh0KSB7XG4gIGlmIChub2RlLnR5cGUgPT09IDQpIHtcbiAgICBwYXJzZUZpbHRlcihub2RlLCBjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IDQpIHtcbiAgICAgICAgcGFyc2VGaWx0ZXIoY2hpbGQsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlID09PSA4KSB7XG4gICAgICAgIHJld3JpdGVGaWx0ZXIobm9kZSwgY29udGV4dCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgPT09IDUpIHtcbiAgICAgICAgcmV3cml0ZUZpbHRlcihjaGlsZC5jb250ZW50LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKG5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgZXhwID0gbm9kZS5jb250ZW50O1xuICBsZXQgaW5TaW5nbGUgPSBmYWxzZTtcbiAgbGV0IGluRG91YmxlID0gZmFsc2U7XG4gIGxldCBpblRlbXBsYXRlU3RyaW5nID0gZmFsc2U7XG4gIGxldCBpblJlZ2V4ID0gZmFsc2U7XG4gIGxldCBjdXJseSA9IDA7XG4gIGxldCBzcXVhcmUgPSAwO1xuICBsZXQgcGFyZW4gPSAwO1xuICBsZXQgbGFzdEZpbHRlckluZGV4ID0gMDtcbiAgbGV0IGMsIHByZXYsIGksIGV4cHJlc3Npb24sIGZpbHRlcnMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykge1xuICAgIHByZXYgPSBjO1xuICAgIGMgPSBleHAuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoaW5TaW5nbGUpIHtcbiAgICAgIGlmIChjID09PSAzOSAmJiBwcmV2ICE9PSA5MikgaW5TaW5nbGUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7XG4gICAgICBpZiAoYyA9PT0gMzQgJiYgcHJldiAhPT0gOTIpIGluRG91YmxlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7XG4gICAgICBpZiAoYyA9PT0gOTYgJiYgcHJldiAhPT0gOTIpIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHtcbiAgICAgIGlmIChjID09PSA0NyAmJiBwcmV2ICE9PSA5MikgaW5SZWdleCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gMTI0ICYmIC8vIHBpcGVcbiAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDEyNCAmJiBleHAuY2hhckNvZGVBdChpIC0gMSkgIT09IDEyNCAmJiAhY3VybHkgJiYgIXNxdWFyZSAmJiAhcGFyZW4pIHtcbiAgICAgIGlmIChleHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7XG4gICAgICAgIGV4cHJlc3Npb24gPSBleHAuc2xpY2UoMCwgaSkudHJpbSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaEZpbHRlcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICBpbkRvdWJsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgaW5TaW5nbGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk2OlxuICAgICAgICAgIGluVGVtcGxhdGVTdHJpbmcgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgIHBhcmVuKys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgcGFyZW4tLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICBzcXVhcmUrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MzpcbiAgICAgICAgICBzcXVhcmUtLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgY3VybHkrKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgY3VybHktLTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChjID09PSA0Nykge1xuICAgICAgICBsZXQgaiA9IGkgLSAxO1xuICAgICAgICBsZXQgcDtcbiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgcCA9IGV4cC5jaGFyQXQoaik7XG4gICAgICAgICAgaWYgKHAgIT09IFwiIFwiKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkge1xuICAgICAgICAgIGluUmVnZXggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uID09PSB2b2lkIDApIHtcbiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTtcbiAgfSBlbHNlIGlmIChsYXN0RmlsdGVySW5kZXggIT09IDApIHtcbiAgICBwdXNoRmlsdGVyKCk7XG4gIH1cbiAgZnVuY3Rpb24gcHVzaEZpbHRlcigpIHtcbiAgICBmaWx0ZXJzLnB1c2goZXhwLnNsaWNlKGxhc3RGaWx0ZXJJbmRleCwgaSkudHJpbSgpKTtcbiAgICBsYXN0RmlsdGVySW5kZXggPSBpICsgMTtcbiAgfVxuICBpZiAoZmlsdGVycy5sZW5ndGgpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm5EZXByZWNhdGlvbihcbiAgICAgIFwiQ09NUElMRVJfRklMVEVSU1wiLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vZGUubG9jXG4gICAgKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSwgY29udGV4dCk7XG4gICAgfVxuICAgIG5vZGUuY29udGVudCA9IGV4cHJlc3Npb247XG4gICAgbm9kZS5hc3QgPSB2b2lkIDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBGaWx0ZXIoZXhwLCBmaWx0ZXIsIGNvbnRleHQpIHtcbiAgY29udGV4dC5oZWxwZXIoUkVTT0xWRV9GSUxURVIpO1xuICBjb25zdCBpID0gZmlsdGVyLmluZGV4T2YoXCIoXCIpO1xuICBpZiAoaSA8IDApIHtcbiAgICBjb250ZXh0LmZpbHRlcnMuYWRkKGZpbHRlcik7XG4gICAgcmV0dXJuIGAke3RvVmFsaWRBc3NldElkKGZpbHRlciwgXCJmaWx0ZXJcIil9KCR7ZXhwfSlgO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5hbWUgPSBmaWx0ZXIuc2xpY2UoMCwgaSk7XG4gICAgY29uc3QgYXJncyA9IGZpbHRlci5zbGljZShpICsgMSk7XG4gICAgY29udGV4dC5maWx0ZXJzLmFkZChuYW1lKTtcbiAgICByZXR1cm4gYCR7dG9WYWxpZEFzc2V0SWQobmFtZSwgXCJmaWx0ZXJcIil9KCR7ZXhwfSR7YXJncyAhPT0gXCIpXCIgPyBcIixcIiArIGFyZ3MgOiBhcmdzfWA7XG4gIH1cbn1cblxuY29uc3Qgc2VlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuY29uc3QgdHJhbnNmb3JtTWVtbyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBkaXIgPSBmaW5kRGlyKG5vZGUsIFwibWVtb1wiKTtcbiAgICBpZiAoIWRpciB8fCBzZWVuLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY29kZWdlbk5vZGUgPSBub2RlLmNvZGVnZW5Ob2RlIHx8IGNvbnRleHQuY3VycmVudE5vZGUuY29kZWdlbk5vZGU7XG4gICAgICBpZiAoY29kZWdlbk5vZGUgJiYgY29kZWdlbk5vZGUudHlwZSA9PT0gMTMpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnVHlwZSAhPT0gMSkge1xuICAgICAgICAgIGNvbnZlcnRUb0Jsb2NrKGNvZGVnZW5Ob2RlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmNvZGVnZW5Ob2RlID0gY3JlYXRlQ2FsbEV4cHJlc3Npb24oY29udGV4dC5oZWxwZXIoV0lUSF9NRU1PKSwgW1xuICAgICAgICAgIGRpci5leHAsXG4gICAgICAgICAgY3JlYXRlRnVuY3Rpb25FeHByZXNzaW9uKHZvaWQgMCwgY29kZWdlbk5vZGUpLFxuICAgICAgICAgIGBfY2FjaGVgLFxuICAgICAgICAgIFN0cmluZyhjb250ZXh0LmNhY2hlZCsrKVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KHByZWZpeElkZW50aWZpZXJzKSB7XG4gIHJldHVybiBbXG4gICAgW1xuICAgICAgdHJhbnNmb3JtT25jZSxcbiAgICAgIHRyYW5zZm9ybUlmLFxuICAgICAgdHJhbnNmb3JtTWVtbyxcbiAgICAgIHRyYW5zZm9ybUZvcixcbiAgICAgIC4uLlt0cmFuc2Zvcm1GaWx0ZXJdICxcbiAgICAgIC4uLiEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBbdHJhbnNmb3JtRXhwcmVzc2lvbl0gOiBbXSxcbiAgICAgIHRyYW5zZm9ybVNsb3RPdXRsZXQsXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50LFxuICAgICAgdHJhY2tTbG90U2NvcGVzLFxuICAgICAgdHJhbnNmb3JtVGV4dFxuICAgIF0sXG4gICAge1xuICAgICAgb246IHRyYW5zZm9ybU9uLFxuICAgICAgYmluZDogdHJhbnNmb3JtQmluZCxcbiAgICAgIG1vZGVsOiB0cmFuc2Zvcm1Nb2RlbFxuICAgIH1cbiAgXTtcbn1cbmZ1bmN0aW9uIGJhc2VDb21waWxlKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgfHwgZGVmYXVsdE9uRXJyb3I7XG4gIGNvbnN0IGlzTW9kdWxlTW9kZSA9IG9wdGlvbnMubW9kZSA9PT0gXCJtb2R1bGVcIjtcbiAge1xuICAgIGlmIChvcHRpb25zLnByZWZpeElkZW50aWZpZXJzID09PSB0cnVlKSB7XG4gICAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDcpKTtcbiAgICB9IGVsc2UgaWYgKGlzTW9kdWxlTW9kZSkge1xuICAgICAgb25FcnJvcihjcmVhdGVDb21waWxlckVycm9yKDQ4KSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHByZWZpeElkZW50aWZpZXJzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmNhY2hlSGFuZGxlcnMpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNDkpKTtcbiAgfVxuICBpZiAob3B0aW9ucy5zY29wZUlkICYmICFpc01vZHVsZU1vZGUpIHtcbiAgICBvbkVycm9yKGNyZWF0ZUNvbXBpbGVyRXJyb3IoNTApKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZE9wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICBwcmVmaXhJZGVudGlmaWVyc1xuICB9KTtcbiAgY29uc3QgYXN0ID0gaXNTdHJpbmcoc291cmNlKSA/IGJhc2VQYXJzZShzb3VyY2UsIHJlc29sdmVkT3B0aW9ucykgOiBzb3VyY2U7XG4gIGNvbnN0IFtub2RlVHJhbnNmb3JtcywgZGlyZWN0aXZlVHJhbnNmb3Jtc10gPSBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0KCk7XG4gIHRyYW5zZm9ybShcbiAgICBhc3QsXG4gICAgZXh0ZW5kKHt9LCByZXNvbHZlZE9wdGlvbnMsIHtcbiAgICAgIG5vZGVUcmFuc2Zvcm1zOiBbXG4gICAgICAgIC4uLm5vZGVUcmFuc2Zvcm1zLFxuICAgICAgICAuLi5vcHRpb25zLm5vZGVUcmFuc2Zvcm1zIHx8IFtdXG4gICAgICAgIC8vIHVzZXIgdHJhbnNmb3Jtc1xuICAgICAgXSxcbiAgICAgIGRpcmVjdGl2ZVRyYW5zZm9ybXM6IGV4dGVuZChcbiAgICAgICAge30sXG4gICAgICAgIGRpcmVjdGl2ZVRyYW5zZm9ybXMsXG4gICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlVHJhbnNmb3JtcyB8fCB7fVxuICAgICAgICAvLyB1c2VyIHRyYW5zZm9ybXNcbiAgICAgIClcbiAgICB9KVxuICApO1xuICByZXR1cm4gZ2VuZXJhdGUoYXN0LCByZXNvbHZlZE9wdGlvbnMpO1xufVxuXG5jb25zdCBCaW5kaW5nVHlwZXMgPSB7XG4gIFwiREFUQVwiOiBcImRhdGFcIixcbiAgXCJQUk9QU1wiOiBcInByb3BzXCIsXG4gIFwiUFJPUFNfQUxJQVNFRFwiOiBcInByb3BzLWFsaWFzZWRcIixcbiAgXCJTRVRVUF9MRVRcIjogXCJzZXR1cC1sZXRcIixcbiAgXCJTRVRVUF9DT05TVFwiOiBcInNldHVwLWNvbnN0XCIsXG4gIFwiU0VUVVBfUkVBQ1RJVkVfQ09OU1RcIjogXCJzZXR1cC1yZWFjdGl2ZS1jb25zdFwiLFxuICBcIlNFVFVQX01BWUJFX1JFRlwiOiBcInNldHVwLW1heWJlLXJlZlwiLFxuICBcIlNFVFVQX1JFRlwiOiBcInNldHVwLXJlZlwiLFxuICBcIk9QVElPTlNcIjogXCJvcHRpb25zXCIsXG4gIFwiTElURVJBTF9DT05TVFwiOiBcImxpdGVyYWwtY29uc3RcIlxufTtcblxuY29uc3Qgbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSA9ICgpID0+ICh7IHByb3BzOiBbXSB9KTtcblxuZXhwb3J0IHsgQkFTRV9UUkFOU0lUSU9OLCBCaW5kaW5nVHlwZXMsIENBTUVMSVpFLCBDQVBJVEFMSVpFLCBDUkVBVEVfQkxPQ0ssIENSRUFURV9DT01NRU5ULCBDUkVBVEVfRUxFTUVOVF9CTE9DSywgQ1JFQVRFX0VMRU1FTlRfVk5PREUsIENSRUFURV9TTE9UUywgQ1JFQVRFX1NUQVRJQywgQ1JFQVRFX1RFWFQsIENSRUFURV9WTk9ERSwgQ29tcGlsZXJEZXByZWNhdGlvblR5cGVzLCBDb25zdGFudFR5cGVzLCBFbGVtZW50VHlwZXMsIEVycm9yQ29kZXMsIEZSQUdNRU5ULCBHVUFSRF9SRUFDVElWRV9QUk9QUywgSVNfTUVNT19TQU1FLCBJU19SRUYsIEtFRVBfQUxJVkUsIE1FUkdFX1BST1BTLCBOT1JNQUxJWkVfQ0xBU1MsIE5PUk1BTElaRV9QUk9QUywgTk9STUFMSVpFX1NUWUxFLCBOYW1lc3BhY2VzLCBOb2RlVHlwZXMsIE9QRU5fQkxPQ0ssIFBPUF9TQ09QRV9JRCwgUFVTSF9TQ09QRV9JRCwgUkVOREVSX0xJU1QsIFJFTkRFUl9TTE9ULCBSRVNPTFZFX0NPTVBPTkVOVCwgUkVTT0xWRV9ESVJFQ1RJVkUsIFJFU09MVkVfRFlOQU1JQ19DT01QT05FTlQsIFJFU09MVkVfRklMVEVSLCBTRVRfQkxPQ0tfVFJBQ0tJTkcsIFNVU1BFTlNFLCBURUxFUE9SVCwgVE9fRElTUExBWV9TVFJJTkcsIFRPX0hBTkRMRVJTLCBUT19IQU5ETEVSX0tFWSwgVFNfTk9ERV9UWVBFUywgVU5SRUYsIFdJVEhfQ1RYLCBXSVRIX0RJUkVDVElWRVMsIFdJVEhfTUVNTywgYWR2YW5jZVBvc2l0aW9uV2l0aENsb25lLCBhZHZhbmNlUG9zaXRpb25XaXRoTXV0YXRpb24sIGFzc2VydCwgYmFzZUNvbXBpbGUsIGJhc2VQYXJzZSwgYnVpbGREaXJlY3RpdmVBcmdzLCBidWlsZFByb3BzLCBidWlsZFNsb3RzLCBjaGVja0NvbXBhdEVuYWJsZWQsIGNvbnZlcnRUb0Jsb2NrLCBjcmVhdGVBcnJheUV4cHJlc3Npb24sIGNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uLCBjcmVhdGVCbG9ja1N0YXRlbWVudCwgY3JlYXRlQ2FjaG
20578VFeHByZXNzaW9uLCBjcmVhdGVDYWxsRXhwcmVzc2lvbiwgY3JlYXRlQ29tcGlsZXJFcnJvciwgY3JlYXRlQ29tcG91bmRFeHByZXNzaW9uLCBjcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24sIGNyZWF0ZUZvckxvb3BQYXJhbXMsIGNyZWF0ZUZ1bmN0aW9uRXhwcmVzc2lvbiwgY3JlYXRlSWZTdGF0ZW1lbnQsIGNyZWF0ZUludGVycG9sYXRpb24sIGNyZWF0ZU9iamVjdEV4cHJlc3Npb24sIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBjcmVhdGVSZXR1cm5TdGF0ZW1lbnQsIGNyZWF0ZVJvb3QsIGNyZWF0ZVNlcXVlbmNlRXhwcmVzc2lvbiwgY3JlYXRlU2ltcGxlRXhwcmVzc2lvbiwgY3JlYXRlU3RydWN0dXJhbERpcmVjdGl2ZVRyYW5zZm9ybSwgY3JlYXRlVGVtcGxhdGVMaXRlcmFsLCBjcmVhdGVUcmFuc2Zvcm1Db250ZXh0LCBjcmVhdGVWTm9kZUNhbGwsIGVycm9yTWVzc2FnZXMsIGV4dHJhY3RJZGVudGlmaWVycywgZmluZERpciwgZmluZFByb3AsIGZvckFsaWFzUkUsIGdlbmVyYXRlLCBnZXRCYXNlVHJhbnNmb3JtUHJlc2V0LCBnZXRDb25zdGFudFR5cGUsIGdldE1lbW9lZFZOb2RlQ2FsbCwgZ2V0Vk5vZGVCbG9ja0hlbHBlciwgZ2V0Vk5vZGVIZWxwZXIsIGhhc0R5bmFtaWNLZXlWQmluZCwgaGFzU2NvcGVSZWYsIGhlbHBlck5hbWVNYXAsIGluamVjdFByb3AsIGlzQ29yZUNvbXBvbmVudCwgaXNGdW5jdGlvblR5cGUsIGlzSW5EZXN0cnVjdHVyZUFzc2lnbm1lbnQsIGlzSW5OZXdFeHByZXNzaW9uLCBpc01lbWJlckV4cHJlc3Npb24sIGlzTWVtYmVyRXhwcmVzc2lvbkJyb3dzZXIsIGlzTWVtYmVyRXhwcmVzc2lvbk5vZGUsIGlzUmVmZXJlbmNlZElkZW50aWZpZXIsIGlzU2ltcGxlSWRlbnRpZmllciwgaXNTbG90T3V0bGV0LCBpc1N0YXRpY0FyZ09mLCBpc1N0YXRpY0V4cCwgaXNTdGF0aWNQcm9wZXJ0eSwgaXNTdGF0aWNQcm9wZXJ0eUtleSwgaXNUZW1wbGF0ZU5vZGUsIGlzVGV4dCQxIGFzIGlzVGV4dCwgaXNWU2xvdCwgbG9jU3R1Yiwgbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSwgcHJvY2Vzc0V4cHJlc3Npb24sIHByb2Nlc3NGb3IsIHByb2Nlc3NJZiwgcHJvY2Vzc1Nsb3RPdXRsZXQsIHJlZ2lzdGVyUnVudGltZUhlbHBlcnMsIHJlc29sdmVDb21wb25lbnRUeXBlLCBzdHJpbmdpZnlFeHByZXNzaW9uLCB0b1ZhbGlkQXNzZXRJZCwgdHJhY2tTbG90U2NvcGVzLCB0cmFja1ZGb3JTbG90U2NvcGVzLCB0cmFuc2Zvcm0sIHRyYW5zZm9ybUJpbmQsIHRyYW5zZm9ybUVsZW1lbnQsIHRyYW5zZm9ybUV4cHJlc3Npb24sIHRyYW5zZm9ybU1vZGVsLCB0cmFuc2Zvcm1PbiwgdHJhdmVyc2VOb2RlLCB1bndyYXBUU05vZGUsIHdhbGtCbG9ja0RlY2xhcmF0aW9ucywgd2Fsa0Z1bmN0aW9uUGFyYW1zLCB3YWxrSWRlbnRpZmllcnMsIHdhcm5EZXByZWNhdGlvbiB9O1xuIiwiLyoqXG4qIEB2dWUvY29tcGlsZXItZG9tIHYzLjQuMzRcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IHJlZ2lzdGVyUnVudGltZUhlbHBlcnMsIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24sIGNyZWF0ZUNvbXBpbGVyRXJyb3IsIGNyZWF0ZU9iamVjdFByb3BlcnR5LCBnZXRDb25zdGFudFR5cGUsIGNyZWF0ZUNhbGxFeHByZXNzaW9uLCBUT19ESVNQTEFZX1NUUklORywgdHJhbnNmb3JtTW9kZWwgYXMgdHJhbnNmb3JtTW9kZWwkMSwgZmluZFByb3AsIGhhc0R5bmFtaWNLZXlWQmluZCwgZmluZERpciwgaXNTdGF0aWNBcmdPZiwgdHJhbnNmb3JtT24gYXMgdHJhbnNmb3JtT24kMSwgaXNTdGF0aWNFeHAsIGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbiwgY2hlY2tDb21wYXRFbmFibGVkLCBub29wRGlyZWN0aXZlVHJhbnNmb3JtLCBiYXNlQ29tcGlsZSwgYmFzZVBhcnNlIH0gZnJvbSAnQHZ1ZS9jb21waWxlci1jb3JlJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvY29tcGlsZXItY29yZSc7XG5pbXBvcnQgeyBpc1ZvaWRUYWcsIGlzSFRNTFRhZywgaXNTVkdUYWcsIGlzTWF0aE1MVGFnLCBwYXJzZVN0cmluZ1N0eWxlLCBjYXBpdGFsaXplLCBtYWtlTWFwLCBleHRlbmQgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IFZfTU9ERUxfUkFESU8gPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2TW9kZWxSYWRpb2AgOiBgYCk7XG5jb25zdCBWX01PREVMX0NIRUNLQk9YID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgdk1vZGVsQ2hlY2tib3hgIDogYGApO1xuY29uc3QgVl9NT0RFTF9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgdk1vZGVsVGV4dGAgOiBgYCk7XG5jb25zdCBWX01PREVMX1NFTEVDVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHZNb2RlbFNlbGVjdGAgOiBgYCk7XG5jb25zdCBWX01PREVMX0RZTkFNSUMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2TW9kZWxEeW5hbWljYCA6IGBgKTtcbmNvbnN0IFZfT05fV0lUSF9NT0RJRklFUlMgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2T25Nb2RpZmllcnNHdWFyZGAgOiBgYCk7XG5jb25zdCBWX09OX1dJVEhfS0VZUyA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gYHZPbktleXNHdWFyZGAgOiBgYCk7XG5jb25zdCBWX1NIT1cgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGB2U2hvd2AgOiBgYCk7XG5jb25zdCBUUkFOU0lUSU9OID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgVHJhbnNpdGlvbmAgOiBgYCk7XG5jb25zdCBUUkFOU0lUSU9OX0dST1VQID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBgVHJhbnNpdGlvbkdyb3VwYCA6IGBgKTtcbnJlZ2lzdGVyUnVudGltZUhlbHBlcnMoe1xuICBbVl9NT0RFTF9SQURJT106IGB2TW9kZWxSYWRpb2AsXG4gIFtWX01PREVMX0NIRUNLQk9YXTogYHZNb2RlbENoZWNrYm94YCxcbiAgW1ZfTU9ERUxfVEVYVF06IGB2TW9kZWxUZXh0YC
20578xcbiAgW1ZfTU9ERUxfU0VMRUNUXTogYHZNb2RlbFNlbGVjdGAsXG4gIFtWX01PREVMX0RZTkFNSUNdOiBgdk1vZGVsRHluYW1pY2AsXG4gIFtWX09OX1dJVEhfTU9ESUZJRVJTXTogYHdpdGhNb2RpZmllcnNgLFxuICBbVl9PTl9XSVRIX0tFWVNdOiBgd2l0aEtleXNgLFxuICBbVl9TSE9XXTogYHZTaG93YCxcbiAgW1RSQU5TSVRJT05dOiBgVHJhbnNpdGlvbmAsXG4gIFtUUkFOU0lUSU9OX0dST1VQXTogYFRyYW5zaXRpb25Hcm91cGBcbn0pO1xuXG5sZXQgZGVjb2RlcjtcbmZ1bmN0aW9uIGRlY29kZUh0bWxCcm93c2VyKHJhdywgYXNBdHRyID0gZmFsc2UpIHtcbiAgaWYgKCFkZWNvZGVyKSB7XG4gICAgZGVjb2RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIH1cbiAgaWYgKGFzQXR0cikge1xuICAgIGRlY29kZXIuaW5uZXJIVE1MID0gYDxkaXYgZm9vPVwiJHtyYXcucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIil9XCI+YDtcbiAgICByZXR1cm4gZGVjb2Rlci5jaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoXCJmb29cIik7XG4gIH0gZWxzZSB7XG4gICAgZGVjb2Rlci5pbm5lckhUTUwgPSByYXc7XG4gICAgcmV0dXJuIGRlY29kZXIudGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuY29uc3QgcGFyc2VyT3B0aW9ucyA9IHtcbiAgcGFyc2VNb2RlOiBcImh0bWxcIixcbiAgaXNWb2lkVGFnLFxuICBpc05hdGl2ZVRhZzogKHRhZykgPT4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkdUYWcodGFnKSB8fCBpc01hdGhNTFRhZyh0YWcpLFxuICBpc1ByZVRhZzogKHRhZykgPT4gdGFnID09PSBcInByZVwiLFxuICBkZWNvZGVFbnRpdGllczogZGVjb2RlSHRtbEJyb3dzZXIgLFxuICBpc0J1aWx0SW5Db21wb25lbnQ6ICh0YWcpID0+IHtcbiAgICBpZiAodGFnID09PSBcIlRyYW5zaXRpb25cIiB8fCB0YWcgPT09IFwidHJhbnNpdGlvblwiKSB7XG4gICAgICByZXR1cm4gVFJBTlNJVElPTjtcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gXCJUcmFuc2l0aW9uR3JvdXBcIiB8fCB0YWcgPT09IFwidHJhbnNpdGlvbi1ncm91cFwiKSB7XG4gICAgICByZXR1cm4gVFJBTlNJVElPTl9HUk9VUDtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCN0cmVlLWNvbnN0cnVjdGlvbi1kaXNwYXRjaGVyXG4gIGdldE5hbWVzcGFjZSh0YWcsIHBhcmVudCwgcm9vdE5hbWVzcGFjZSkge1xuICAgIGxldCBucyA9IHBhcmVudCA/IHBhcmVudC5ucyA6IHJvb3ROYW1lc3BhY2U7XG4gICAgaWYgKHBhcmVudCAmJiBucyA9PT0gMikge1xuICAgICAgaWYgKHBhcmVudC50YWcgPT09IFwiYW5ub3RhdGlvbi14bWxcIikge1xuICAgICAgICBpZiAodGFnID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudC5wcm9wcy5zb21lKFxuICAgICAgICAgIChhKSA9PiBhLnR5cGUgPT09IDYgJiYgYS5uYW1lID09PSBcImVuY29kaW5nXCIgJiYgYS52YWx1ZSAhPSBudWxsICYmIChhLnZhbHVlLmNvbnRlbnQgPT09IFwidGV4dC9odG1sXCIgfHwgYS52YWx1ZS5jb250ZW50ID09PSBcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiKVxuICAgICAgICApKSB7XG4gICAgICAgICAgbnMgPSAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKC9ebSg/Oltpb25zXXx0ZXh0KSQvLnRlc3QocGFyZW50LnRhZykgJiYgdGFnICE9PSBcIm1nbHlwaFwiICYmIHRhZyAhPT0gXCJtYWxpZ25tYXJrXCIpIHtcbiAgICAgICAgbnMgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyZW50ICYmIG5zID09PSAxKSB7XG4gICAgICBpZiAocGFyZW50LnRhZyA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgcGFyZW50LnRhZyA9PT0gXCJkZXNjXCIgfHwgcGFyZW50LnRhZyA9PT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgIG5zID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5zID09PSAwKSB7XG4gICAgICBpZiAodGFnID09PSBcInN2Z1wiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHRhZyA9PT0gXCJtYXRoXCIpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBucztcbiAgfVxufTtcblxuY29uc3QgdHJhbnNmb3JtU3R5bGUgPSAobm9kZSkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAxKSB7XG4gICAgbm9kZS5wcm9wcy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBpZiAocC50eXBlID09PSA2ICYmIHAubmFtZSA9PT0gXCJzdHlsZVwiICYmIHAudmFsdWUpIHtcbiAgICAgICAgbm9kZS5wcm9wc1tpXSA9IHtcbiAgICAgICAgICB0eXBlOiA3LFxuICAgICAgICAgIG5hbWU6IGBiaW5kYCxcbiAgICAgICAgICBhcmc6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHN0eWxlYCwgdHJ1ZSwgcC5sb2MpLFxuICAgICAgICAgIGV4cDogcGFyc2VJbmxpbmVDU1MocC52YWx1ZS5jb250ZW50LCBwLmxvYyksXG4gICAgICAgICAgbW9kaWZpZXJzOiBbXSxcbiAgICAgICAgICBsb2M6IHAubG9jXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5jb25zdCBwYXJzZUlubGluZUNTUyA9IChjc3NUZXh0LCBsb2MpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhcnNlU3RyaW5nU3R5bGUoY3NzVGV4dCk7XG4gIHJldHVybiBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFxuICAgIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQpLFxuICAgIGZhbHNlLFxuICAgIGxvYyxcbiAgICAzXG4gICk7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVET01Db21waWxlckVycm9yKGNvZGUsIGxvYykge1xuICByZXR1cm4gY3JlYXRlQ29tcGlsZXJFcnJvcihcbiAgICBjb2RlLFxuICAgIGxvYyxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZhbHNlID8gRE9NRXJyb3JNZXNzYWdlcyA6IHZvaWQgMFxuICApO1xufVxuY29uc3QgRE9NRXJyb3JDb2RlcyA9IHtcbiAgXCJYX1ZfSFRNTF9OT19FWFBSRVNTSU9OXCI6IDUzLFxuICBcIjUzXCI6IFwiWF9WX0hUTUxfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVl9IVE1MX1dJVEhfQ0hJTERSRU5cIjogNTQsXG4gIFwiNTRcIjogXCJYX1ZfSFRNTF9XSVRIX0NISUxEUkVOXCIsXG4gIFwiWF9WX1RFWFRfTk9fRVhQUkVTU0lPTlwiOiA1NSxcbiAgXCI1NVwiOiBcIlhfVl9URVhUX05PX0VYUFJFU1NJT05cIixcbiAgXCJYX1ZfVEVYVF9XSVRIX0NISUxEUkVOXCI6IDU2LFxuICBcIjU2XCI6IFwiWF9WX1RFWFRfV0lUSF9DSElMRFJFTlwiLFxuICBcIlhfVl9NT0RFTF9PTl9JTlZBTElEX0VMRU1FTlRcIjogNTcsXG4gIFwiNTdcIjogXCJYX1ZfTU9ERUxfT05fSU5WQUxJRF9FTEVNRU5UXCIsXG4gIFwiWF9WX01PREVMX0FSR19PTl9FTEVNRU5UXCI6IDU4LFxuICBcIjU4XCI6IFwiWF9WX01PREVMX0FSR19PTl9FTEVNRU5UXCIsXG4gIFwiWF9WX01PREVMX09OX0ZJTEVfSU5QVVRfRUxFTUVOVFwiOiA1OSxcbiAgXCI1OVwiOiBcIlhfVl9NT0RFTF9PTl9GSUxFX0lOUFVUX0VMRU1FTlRcIixcbiAgXCJYX1ZfTU9ERUxfVU5ORUNFU1NBUllfVkFMVUVcIjogNjAsXG4gIFwiNjBcIjogXCJYX1ZfTU9ERUxfVU5ORUNFU1NBUllfVkFMVUVcIixcbiAgXCJYX1ZfU0hPV19OT19FWFBSRVNTSU9OXCI6IDYxLFxuICBcIjYxXCI6IFwiWF9WX1NIT1dfTk9fRVhQUkVTU0lPTlwiLFxuICBcIlhfVFJBTlNJVElPTl9JTlZBTElEX0NISUxEUkVOXCI6IDYyLFxuICBcIjYyXCI6IFwiWF9UUkFOU0lUSU9OX0lOVkFMSURfQ0hJTERSRU5cIixcbiAgXCJYX0lHTk9SRURfU0lERV9FRkZFQ1RfVEFHXCI6IDYzLFxuICBcIjYzXCI6IFwiWF9JR05PUkVEX1NJREVfRUZGRUNUX1RBR1wiLFxuICBcIl9fRVhURU5EX1BPSU5UX19cIjogNjQsXG4gIFwiNjRcIjogXCJfX0VYVEVORF9QT0lOVF9fXCJcbn07XG5jb25zdCBET01FcnJvck1lc3NhZ2VzID0ge1xuICBbNTNdOiBgdi1odG1sIGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTRdOiBgdi1odG1sIHdpbGwgb3ZlcnJpZGUgZWxlbWVudCBjaGlsZHJlbi5gLFxuICBbNTVdOiBgdi10ZXh0IGlzIG1pc3NpbmcgZXhwcmVzc2lvbi5gLFxuICBbNTZdOiBgdi10ZXh0IHdpbGwgb3ZlcnJpZGUgZWxlbWVudCBjaGlsZHJlbi5gLFxuICBbNTddOiBgdi1tb2RlbCBjYW4gb25seSBiZSB1c2VkIG9uIDxpbnB1dD4sIDx0ZXh0YXJlYT4gYW5kIDxzZWxlY3Q+IGVsZW1lbnRzLmAsXG4gIFs1OF06IGB2LW1vZGVsIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgb24gcGxhaW4gZWxlbWVudHMuYCxcbiAgWzU5XTogYHYtbW9kZWwgY2Fubm90IGJlIHVzZWQgb24gZmlsZSBpbnB1dHMgc2luY2UgdGhleSBhcmUgcmVhZC1vbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLmAsXG4gIFs2MF06IGBVbm5lY2Vzc2FyeSB2YWx1ZSBiaW5kaW5nIHVzZWQgYWxvbmdzaWRlIHYtbW9kZWwuIEl0IHdpbGwgaW50ZXJmZXJlIHdpdGggdi1tb2RlbCdzIGJlaGF2aW9yLmAsXG4gIFs2MV06IGB2LXNob3cgaXMgbWlzc2luZyBleHByZXNzaW9uLmAsXG4gIFs2Ml06IGA8VHJhbnNpdGlvbj4gZXhwZWN0cyBleGFjdGx5IG9uZSBjaGlsZCBlbGVtZW50IG9yIGNvbXBvbmVudC5gLFxuICBbNjNdOiBgVGFncyB3aXRoIHNpZGUgZWZmZWN0ICg8c2NyaXB0PiBhbmQgPHN0eWxlPikgYXJlIGlnbm9yZWQgaW4gY2xpZW50IGNvbXBvbmVudCB0ZW1wbGF0ZXMuYFxufTtcblxuY29uc3QgdHJhbnNmb3JtVkh0bWwgPSAoZGlyLCBub2Rl
20578LCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDUzLCBsb2MpXG4gICAgKTtcbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU0LCBsb2MpXG4gICAgKTtcbiAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYGlubmVySFRNTGAsIHRydWUsIGxvYyksXG4gICAgICAgIGV4cCB8fCBjcmVhdGVTaW1wbGVFeHByZXNzaW9uKFwiXCIsIHRydWUpXG4gICAgICApXG4gICAgXVxuICB9O1xufTtcblxuY29uc3QgdHJhbnNmb3JtVlRleHQgPSAoZGlyLCBub2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHsgZXhwLCBsb2MgfSA9IGRpcjtcbiAgaWYgKCFleHApIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU1LCBsb2MpXG4gICAgKTtcbiAgfVxuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjb250ZXh0Lm9uRXJyb3IoXG4gICAgICBjcmVhdGVET01Db21waWxlckVycm9yKDU2LCBsb2MpXG4gICAgKTtcbiAgICBub2RlLmNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW1xuICAgICAgY3JlYXRlT2JqZWN0UHJvcGVydHkoXG4gICAgICAgIGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYHRleHRDb250ZW50YCwgdHJ1ZSksXG4gICAgICAgIGV4cCA/IGdldENvbnN0YW50VHlwZShleHAsIGNvbnRleHQpID4gMCA/IGV4cCA6IGNyZWF0ZUNhbGxFeHByZXNzaW9uKFxuICAgICAgICAgIGNvbnRleHQuaGVscGVyU3RyaW5nKFRPX0RJU1BMQVlfU1RSSU5HKSxcbiAgICAgICAgICBbZXhwXSxcbiAgICAgICAgICBsb2NcbiAgICAgICAgKSA6IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oXCJcIiwgdHJ1ZSlcbiAgICAgIClcbiAgICBdXG4gIH07XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Nb2RlbCA9IChkaXIsIG5vZGUsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgYmFzZVJlc3VsdCA9IHRyYW5zZm9ybU1vZGVsJDEoZGlyLCBub2RlLCBjb250ZXh0KTtcbiAgaWYgKCFiYXNlUmVzdWx0LnByb3BzLmxlbmd0aCB8fCBub2RlLnRhZ1R5cGUgPT09IDEpIHtcbiAgICByZXR1cm4gYmFzZVJlc3VsdDtcbiAgfVxuICBpZiAoZGlyLmFyZykge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoXG4gICAgICAgIDU4LFxuICAgICAgICBkaXIuYXJnLmxvY1xuICAgICAgKVxuICAgICk7XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVkVmFsdWUoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBmaW5kRGlyKG5vZGUsIFwiYmluZFwiKTtcbiAgICBpZiAodmFsdWUgJiYgaXNTdGF0aWNBcmdPZih2YWx1ZS5hcmcsIFwidmFsdWVcIikpIHtcbiAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICA2MCxcbiAgICAgICAgICB2YWx1ZS5sb2NcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgeyB0YWcgfSA9IG5vZGU7XG4gIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGNvbnRleHQuaXNDdXN0b21FbGVtZW50KHRhZyk7XG4gIGlmICh0YWcgPT09IFwiaW5wdXRcIiB8fCB0YWcgPT09IFwidGV4dGFyZWFcIiB8fCB0YWcgPT09IFwic2VsZWN0XCIgfHwgaXNDdXN0b21FbGVtZW50KSB7XG4gICAgbGV0IGRpcmVjdGl2ZVRvVXNlID0gVl9NT0RFTF9URVhUO1xuICAgIGxldCBpc0ludmFsaWRUeXBlID0gZmFsc2U7XG4gICAgaWYgKHRhZyA9PT0gXCJpbnB1dFwiIHx8IGlzQ3VzdG9tRWxlbWVudCkge1xuICAgICAgY29uc3QgdHlwZSA9IGZpbmRQcm9wKG5vZGUsIGB0eXBlYCk7XG4gICAgICBpZiAodHlwZSkge1xuICAgICAgICBpZiAodHlwZS50eXBlID09PSA3KSB7XG4gICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX0RZTkFNSUM7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZS52YWx1ZSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZS52YWx1ZS5jb250ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1JBRElPO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICBkaXJlY3RpdmVUb1VzZSA9IFZfTU9ERUxfQ0hFQ0tCT1g7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgaXNJbnZhbGlkVHlwZSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgICAgICAgICAgICBjcmVhdGVET01Db21waWxlckVycm9yKFxuICAgICAgICAgICAgICAgICAgNTksXG4gICAgICAgICAgICAgICAgICBkaXIubG9jXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhhc0R5bmFtaWNLZXlWQmluZChub2RlKSkge1xuICAgICAgICBkaXJlY3RpdmVUb1VzZSA9IFZfTU9ERUxfRFlOQU1JQztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tEdXBsaWNhdGVkVmFsdWUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgZGlyZWN0aXZlVG9Vc2UgPSBWX01PREVMX1NFTEVDVDtcbiAgICB9IGVsc2Uge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja0R1cGxpY2F0ZWRWYWx1ZSgpO1xuICAgIH1cbiAgICBpZiAoIWlzSW52YWxpZFR5cGUpIHtcbiAgICAgIGJhc2VSZXN1bHQubmVlZFJ1bnRpbWUgPSBjb250ZXh0LmhlbHBlcihkaXJlY3RpdmVUb1VzZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnRleHQub25FcnJvcihcbiAgICAgIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IoXG4gICAgICAgIDU3LFxuICAgICAgICBkaXIubG9jXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBiYXNlUmVzdWx0LnByb3BzID0gYmFzZVJlc3VsdC5wcm9wcy5maWx0ZXIoXG4gICAgKHApID0+ICEocC5rZXkudHlwZSA9PT0gNCAmJiBwLmtleS5jb250ZW50ID09PSBcIm1vZGVsVmFsdWVcIilcbiAgKTtcbiAgcmV0dXJuIGJhc2VSZXN1bHQ7XG59O1xuXG5jb25zdCBpc0V2ZW50T3B0aW9uTW9kaWZpZXIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChgcGFzc2l2ZSxvbmNlLGNhcHR1cmVgKTtcbmNvbnN0IGlzTm9uS2V5TW9kaWZpZXIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgLy8gZXZlbnQgcHJv
20578cGFnYXRpb24gbWFuYWdlbWVudFxuICBgc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCxtaWRkbGVgXG4pO1xuY29uc3QgbWF5YmVLZXlNb2RpZmllciA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFwibGVmdCxyaWdodFwiKTtcbmNvbnN0IGlzS2V5Ym9hcmRFdmVudCA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBgb25rZXl1cCxvbmtleWRvd24sb25rZXlwcmVzc2AsXG4gIHRydWVcbik7XG5jb25zdCByZXNvbHZlTW9kaWZpZXJzID0gKGtleSwgbW9kaWZpZXJzLCBjb250ZXh0LCBsb2MpID0+IHtcbiAgY29uc3Qga2V5TW9kaWZpZXJzID0gW107XG4gIGNvbnN0IG5vbktleU1vZGlmaWVycyA9IFtdO1xuICBjb25zdCBldmVudE9wdGlvbk1vZGlmaWVycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJzW2ldO1xuICAgIGlmIChtb2RpZmllciA9PT0gXCJuYXRpdmVcIiAmJiBjaGVja0NvbXBhdEVuYWJsZWQoXG4gICAgICBcIkNPTVBJTEVSX1ZfT05fTkFUSVZFXCIsXG4gICAgICBjb250ZXh0LFxuICAgICAgbG9jXG4gICAgKSkge1xuICAgICAgZXZlbnRPcHRpb25Nb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgfSBlbHNlIGlmIChpc0V2ZW50T3B0aW9uTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICBldmVudE9wdGlvbk1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1heWJlS2V5TW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0V4cChrZXkpKSB7XG4gICAgICAgICAgaWYgKGlzS2V5Ym9hcmRFdmVudChrZXkuY29udGVudCkpIHtcbiAgICAgICAgICAgIGtleU1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uS2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgICAgbm9uS2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNOb25LZXlNb2RpZmllcihtb2RpZmllcikpIHtcbiAgICAgICAgICBub25LZXlNb2RpZmllcnMucHVzaChtb2RpZmllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5TW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAga2V5TW9kaWZpZXJzLFxuICAgIG5vbktleU1vZGlmaWVycyxcbiAgICBldmVudE9wdGlvbk1vZGlmaWVyc1xuICB9O1xufTtcbmNvbnN0IHRyYW5zZm9ybUNsaWNrID0gKGtleSwgZXZlbnQpID0+IHtcbiAgY29uc3QgaXNTdGF0aWNDbGljayA9IGlzU3RhdGljRXhwKGtleSkgJiYga2V5LmNvbnRlbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJvbmNsaWNrXCI7XG4gIHJldHVybiBpc1N0YXRpY0NsaWNrID8gY3JlYXRlU2ltcGxlRXhwcmVzc2lvbihldmVudCwgdHJ1ZSkgOiBrZXkudHlwZSAhPT0gNCA/IGNyZWF0ZUNvbXBvdW5kRXhwcmVzc2lvbihbXG4gICAgYChgLFxuICAgIGtleSxcbiAgICBgKSA9PT0gXCJvbkNsaWNrXCIgPyBcIiR7ZXZlbnR9XCIgOiAoYCxcbiAgICBrZXksXG4gICAgYClgXG4gIF0pIDoga2V5O1xufTtcbmNvbnN0IHRyYW5zZm9ybU9uID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICByZXR1cm4gdHJhbnNmb3JtT24kMShkaXIsIG5vZGUsIGNvbnRleHQsIChiYXNlUmVzdWx0KSA9PiB7XG4gICAgY29uc3QgeyBtb2RpZmllcnMgfSA9IGRpcjtcbiAgICBpZiAoIW1vZGlmaWVycy5sZW5ndGgpIHJldHVybiBiYXNlUmVzdWx0O1xuICAgIGxldCB7IGtleSwgdmFsdWU6IGhhbmRsZXJFeHAgfSA9IGJhc2VSZXN1bHQucHJvcHNbMF07XG4gICAgY29uc3QgeyBrZXlNb2RpZmllcnMsIG5vbktleU1vZGlmaWVycywgZXZlbnRPcHRpb25Nb2RpZmllcnMgfSA9IHJlc29sdmVNb2RpZmllcnMoa2V5LCBtb2RpZmllcnMsIGNvbnRleHQsIGRpci5sb2MpO1xuICAgIGlmIChub25LZXlNb2RpZmllcnMuaW5jbHVkZXMoXCJyaWdodFwiKSkge1xuICAgICAga2V5ID0gdHJhbnNmb3JtQ2xpY2soa2V5LCBgb25Db250ZXh0bWVudWApO1xuICAgIH1cbiAgICBpZiAobm9uS2V5TW9kaWZpZXJzLmluY2x1ZGVzKFwibWlkZGxlXCIpKSB7XG4gICAgICBrZXkgPSB0cmFuc2Zvcm1DbGljayhrZXksIGBvbk1vdXNldXBgKTtcbiAgICB9XG4gICAgaWYgKG5vbktleU1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfTU9ESUZJRVJTKSwgW1xuICAgICAgICBoYW5kbGVyRXhwLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShub25LZXlNb2RpZmllcnMpXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKGtleU1vZGlmaWVycy5sZW5ndGggJiYgLy8gaWYgZXZlbnQgbmFtZSBpcyBkeW5hbWljLCBhbHdheXMgd3JhcCB3aXRoIGtleXMgZ3VhcmRcbiAgICAoIWlzU3RhdGljRXhwKGtleSkgfHwgaXNLZXlib2FyZEV2ZW50KGtleS5jb250ZW50KSkpIHtcbiAgICAgIGhhbmRsZXJFeHAgPSBjcmVhdGVDYWxsRXhwcmVzc2lvbihjb250ZXh0LmhlbHBlcihWX09OX1dJVEhfS0VZUyksIFtcbiAgICAgICAgaGFuZGxlckV4cCxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoa2V5TW9kaWZpZXJzKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGlmIChldmVudE9wdGlvbk1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG1vZGlmaWVyUG9zdGZpeCA9IGV2ZW50T3B0aW9uTW9kaWZpZXJzLm1hcChjYXBpdGFsaXplKS5qb2luKFwiXCIpO1xuICAgICAga2V5ID0gaXNTdGF0aWNFeHAoa2V5KSA/IGNyZWF0ZVNpbXBsZUV4cHJlc3Npb24oYCR7a2V5LmNvbnRlbnR9JHttb2RpZmllclBvc3RmaXh9YCwgdHJ1ZSkgOiBjcmVhdGVDb21wb3VuZEV4cHJlc3Npb24oW2AoYCwga2V5LCBgKSArIFwiJHttb2RpZmllclBvc3RmaXh9XCJgXSk7XG4gICAgfVxuICAgIHJldHVybi
20578B7XG4gICAgICBwcm9wczogW2NyZWF0ZU9iamVjdFByb3BlcnR5KGtleSwgaGFuZGxlckV4cCldXG4gICAgfTtcbiAgfSk7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1TaG93ID0gKGRpciwgbm9kZSwgY29udGV4dCkgPT4ge1xuICBjb25zdCB7IGV4cCwgbG9jIH0gPSBkaXI7XG4gIGlmICghZXhwKSB7XG4gICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcig2MSwgbG9jKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcm9wczogW10sXG4gICAgbmVlZFJ1bnRpbWU6IGNvbnRleHQuaGVscGVyKFZfU0hPVylcbiAgfTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVRyYW5zaXRpb24gPSAobm9kZSwgY29udGV4dCkgPT4ge1xuICBpZiAobm9kZS50eXBlID09PSAxICYmIG5vZGUudGFnVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuaXNCdWlsdEluQ29tcG9uZW50KG5vZGUudGFnKTtcbiAgICBpZiAoY29tcG9uZW50ID09PSBUUkFOU0lUSU9OKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNNdWx0aXBsZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgICAgICAgY29udGV4dC5vbkVycm9yKFxuICAgICAgICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgICAgICAgNjIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGFydDogbm9kZS5jaGlsZHJlblswXS5sb2Muc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBub2RlLmNoaWxkcmVuW25vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubG9jLmVuZCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFwiXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuWzBdO1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gMSkge1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgaWYgKHAudHlwZSA9PT0gNyAmJiBwLm5hbWUgPT09IFwic2hvd1wiKSB7XG4gICAgICAgICAgICAgIG5vZGUucHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogNixcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBlcnNpc3RlZFwiLFxuICAgICAgICAgICAgICAgIG5hbWVMb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbG9jOiBub2RlLmxvY1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gaGFzTXVsdGlwbGVDaGlsZHJlbihub2RlKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKFxuICAgIChjKSA9PiBjLnR5cGUgIT09IDMgJiYgIShjLnR5cGUgPT09IDIgJiYgIWMuY29udGVudC50cmltKCkpXG4gICk7XG4gIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gIHJldHVybiBjaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgY2hpbGQudHlwZSA9PT0gMTEgfHwgY2hpbGQudHlwZSA9PT0gOSAmJiBjaGlsZC5icmFuY2hlcy5zb21lKGhhc011bHRpcGxlQ2hpbGRyZW4pO1xufVxuXG5jb25zdCBpZ25vcmVTaWRlRWZmZWN0VGFncyA9IChub2RlLCBjb250ZXh0KSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09IDEgJiYgbm9kZS50YWdUeXBlID09PSAwICYmIChub2RlLnRhZyA9PT0gXCJzY3JpcHRcIiB8fCBub2RlLnRhZyA9PT0gXCJzdHlsZVwiKSkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5vbkVycm9yKFxuICAgICAgY3JlYXRlRE9NQ29tcGlsZXJFcnJvcihcbiAgICAgICAgNjMsXG4gICAgICAgIG5vZGUubG9jXG4gICAgICApXG4gICAgKTtcbiAgICBjb250ZXh0LnJlbW92ZU5vZGUoKTtcbiAgfVxufTtcblxuY29uc3QgRE9NTm9kZVRyYW5zZm9ybXMgPSBbXG4gIHRyYW5zZm9ybVN0eWxlLF
20578xuICAuLi4hIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gW3RyYW5zZm9ybVRyYW5zaXRpb25dIDogW11cbl07XG5jb25zdCBET01EaXJlY3RpdmVUcmFuc2Zvcm1zID0ge1xuICBjbG9hazogbm9vcERpcmVjdGl2ZVRyYW5zZm9ybSxcbiAgaHRtbDogdHJhbnNmb3JtVkh0bWwsXG4gIHRleHQ6IHRyYW5zZm9ybVZUZXh0LFxuICBtb2RlbDogdHJhbnNmb3JtTW9kZWwsXG4gIC8vIG92ZXJyaWRlIGNvbXBpbGVyLWNvcmVcbiAgb246IHRyYW5zZm9ybU9uLFxuICAvLyBvdmVycmlkZSBjb21waWxlci1jb3JlXG4gIHNob3c6IHRyYW5zZm9ybVNob3dcbn07XG5mdW5jdGlvbiBjb21waWxlKHNyYywgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBiYXNlQ29tcGlsZShcbiAgICBzcmMsXG4gICAgZXh0ZW5kKHt9LCBwYXJzZXJPcHRpb25zLCBvcHRpb25zLCB7XG4gICAgICBub2RlVHJhbnNmb3JtczogW1xuICAgICAgICAvLyBpZ25vcmUgPHNjcmlwdD4gYW5kIDx0YWc+XG4gICAgICAgIC8vIHRoaXMgaXMgbm90IHB1dCBpbnNpZGUgRE9NTm9kZVRyYW5zZm9ybXMgYmVjYXVzZSB0aGF0IGxpc3QgaXMgdXNlZFxuICAgICAgICAvLyBieSBjb21waWxlci1zc3IgdG8gZ2VuZXJhdGUgdm5vZGUgZmFsbGJhY2sgYnJhbmNoZXNcbiAgICAgICAgaWdub3JlU2lkZUVmZmVjdFRhZ3MsXG4gICAgICAgIC4uLkRPTU5vZGVUcmFuc2Zvcm1zLFxuICAgICAgICAuLi5vcHRpb25zLm5vZGVUcmFuc2Zvcm1zIHx8IFtdXG4gICAgICBdLFxuICAgICAgZGlyZWN0aXZlVHJhbnNmb3JtczogZXh0ZW5kKFxuICAgICAgICB7fSxcbiAgICAgICAgRE9NRGlyZWN0aXZlVHJhbnNmb3JtcyxcbiAgICAgICAgb3B0aW9ucy5kaXJlY3RpdmVUcmFuc2Zvcm1zIHx8IHt9XG4gICAgICApLFxuICAgICAgdHJhbnNmb3JtSG9pc3Q6IG51bGwgXG4gICAgfSlcbiAgKTtcbn1cbmZ1bmN0aW9uIHBhcnNlKHRlbXBsYXRlLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGJhc2VQYXJzZSh0ZW1wbGF0ZSwgZXh0ZW5kKHt9LCBwYXJzZXJPcHRpb25zLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCB7IERPTURpcmVjdGl2ZVRyYW5zZm9ybXMsIERPTUVycm9yQ29kZXMsIERPTUVycm9yTWVzc2FnZXMsIERPTU5vZGVUcmFuc2Zvcm1zLCBUUkFOU0lUSU9OLCBUUkFOU0lUSU9OX0dST1VQLCBWX01PREVMX0NIRUNLQk9YLCBWX01PREVMX0RZTkFNSUMsIFZfTU9ERUxfUkFESU8sIFZfTU9ERUxfU0VMRUNULCBWX01PREVMX1RFWFQsIFZfT05fV0lUSF9LRVlTLCBWX09OX1dJVEhfTU9ESUZJRVJTLCBWX1NIT1csIGNvbXBpbGUsIGNyZWF0ZURPTUNvbXBpbGVyRXJyb3IsIHBhcnNlLCBwYXJzZXJPcHRpb25zLCB0cmFuc2Zvcm1TdHlsZSB9O1xuIiwiLyoqXG4qIEB2dWUvcmVhY3Rpdml0eSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBOT09QLCBleHRlbmQsIGlzQXJyYXksIGlzU3ltYm9sLCBpc01hcCwgaXNJbnRlZ2VyS2V5LCBoYXNPd24sIGhhc0NoYW5nZWQsIGlzT2JqZWN0LCBtYWtlTWFwLCBjYXBpdGFsaXplLCB0b1Jhd1R5cGUsIGRlZiwgaXNGdW5jdGlvbiB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gICAgdGhpcy5wYXJlbnQgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICBpZiAoIWRldGFjaGVkICYmIGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgICB0aGlzLmluZGV4ID0gKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKFxuICAgICAgICB0aGlzXG4gICAgICApIC0gMTtcbiAgICB9XG4gIH1cbiAgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHJ1bihmbikge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3RTY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gY3VycmVudEVmZmVjdFNjb3BlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgY2Fubm90IHJ1biBhbiBpbmFjdGl2ZSBlZmZlY3Qgc2NvcGUuYCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb24oKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb2ZmKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcy5wYXJlbnQ7XG4gIH1cbiAgc3RvcChmcm9tUGFyZW50KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbGV0IGksIGw7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0uc3RvcCgpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuY2xlYW51cHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgI
20578HRoaXMuY2xlYW51cHNbaV0oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5zY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5zY29wZXNbaV0uc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRldGFjaGVkICYmIHRoaXMucGFyZW50ICYmICFmcm9tUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBhcmVudC5zY29wZXMucG9wKCk7XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3QgIT09IHRoaXMpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF0gPSBsYXN0O1xuICAgICAgICAgIGxhc3QuaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0U2NvcGUoZGV0YWNoZWQpIHtcbiAgcmV0dXJuIG5ldyBFZmZlY3RTY29wZShkZXRhY2hlZCk7XG59XG5mdW5jdGlvbiByZWNvcmRFZmZlY3RTY29wZShlZmZlY3QsIHNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgaWYgKHNjb3BlICYmIHNjb3BlLmFjdGl2ZSkge1xuICAgIHNjb3BlLmVmZmVjdHMucHVzaChlZmZlY3QpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBhY3RpdmVFZmZlY3RTY29wZTtcbn1cbmZ1bmN0aW9uIG9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYG9uU2NvcGVEaXNwb3NlKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGVmZmVjdCBzY29wZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGFjdGl2ZUVmZmVjdDtcbmNsYXNzIFJlYWN0aXZlRWZmZWN0IHtcbiAgY29uc3RydWN0b3IoZm4sIHRyaWdnZXIsIHNjaGVkdWxlciwgc2NvcGUpIHtcbiAgICB0aGlzLmZuID0gZm47XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5kZXBzID0gW107XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fZGlydHlMZXZlbCA9IDQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fdHJhY2tJZCA9IDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fcnVubmluZ3MgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3Nob3VsZFNjaGVkdWxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fZGVwc0xlbmd0aCA9IDA7XG4gICAgcmVjb3JkRWZmZWN0U2NvcGUodGhpcywgc2NvcGUpO1xuICB9XG4gIGdldCBkaXJ0eSgpIHtcbiAgICBpZiAodGhpcy5fZGlydHlMZXZlbCA9PT0gMiB8fCB0aGlzLl9kaXJ0eUxldmVsID09PSAzKSB7XG4gICAgICB0aGlzLl9kaXJ0eUxldmVsID0gMTtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGVwc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRlcCA9IHRoaXMuZGVwc1tpXTtcbiAgICAgICAgaWYgKGRlcC5jb21wdXRlZCkge1xuICAgICAgICAgIHRyaWdnZXJDb21wdXRlZChkZXAuY29tcHV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLl9kaXJ0eUxldmVsID49IDQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2RpcnR5TGV2ZWwgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fZGlydHlMZXZlbCA9IDA7XG4gICAgICB9XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXJ0eUxldmVsID49IDQ7XG4gIH1cbiAgc2V0IGRpcnR5KHYpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gdiA/IDQgOiAwO1xuICB9XG4gIHJ1bigpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gMDtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH1cbiAgICBsZXQgbGFzdFNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gICAgbGV0IGxhc3RFZmZlY3QgPSBhY3RpdmVFZmZlY3Q7XG4gICAgdHJ5IHtcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IHRoaXM7XG4gICAgICB0aGlzLl9ydW5uaW5ncysrO1xuICAgICAgcHJlQ2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBvc3RDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgdGhpcy5fcnVubmluZ3MtLTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IGxhc3RFZmZlY3Q7XG4gICAgICBzaG91bGRUcmFjayA9IGxhc3RTaG91bGRUcmFjaztcbiAgICB9XG4gIH1cbiAgc3RvcCgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIHByZUNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICBwb3N0Q2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHRoaXMub25TdG9wICYmIHRoaXMub25TdG9wKCk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlckNvbXB1dGVkKGNvbXB1dGVkKSB7XG4gIHJldHVybiBjb21wdXRlZC52YWx1ZTtcbn1cbmZ1bmN0aW9uIHByZUNsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBlZmZlY3QyLl90cmFja0lkKys7XG4gIGVmZmVjdDIuX2RlcHNMZW5ndGggPSAwO1xufVxuZnVuY3Rpb24gcG9zdENsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBpZiAoZWZmZWN0Mi5kZXBzLmxlbmd0aCA+IGVmZmVjdDIuX2RlcHNMZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gZWZmZWN0Mi5fZGVwc0xlbmd0aDsgaSA8IGVmZmVjdDIuZGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2xlYW51cERlcEVmZmVjdChlZmZlY3QyLmRlcHNbaV0sIGVmZmVjdDIpO1xuICAgIH1cbiAgICBlZmZlY3QyLmRlcHMubGVuZ3RoID0gZWZmZWN0Mi5fZGVwc0xlbmd0aDtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYW51cERlcEVmZmVjdChkZXAsIGVmZmVjdDIpIHtcbiAgY29uc3QgdHJhY2tJZCA9IGRlcC5nZXQoZWZmZWN0Mik7XG4gIGlmICh0cmFja0lkICE9PSB2b2lkIDAgJiYgZWZmZWN0Mi5fdHJhY2tJZCAhPT0gdHJhY2tJZCkge1xuICAgIGRlcC5kZWxldGUoZWZmZWN0Mik7XG4gICAgaWYgKGRlcC5zaXplID09PSAwKSB7XG4gICAgICBkZXAuY2xlYW51cCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0KGZuLCBvcHRpb25zKSB7XG4gIGlmIChmbi5lZmZlY3QgaW5zdGFuY2VvZiBSZWFjdGl2ZUVmZmVjdCkge1xuICAgIGZuID0gZm4uZWZmZWN0LmZuO1xuICB9XG4gIGNvbnN0IF9lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZm4sIE5PT1AsICgpID0+IHtcbiAgICBpZiAoX2VmZmVjdC5kaXJ0eSkge1xuICAgICAgX2VmZmVjdC5ydW4oKTtcbiAgICB9XG4gI
20578H0pO1xuICBpZiAob3B0aW9ucykge1xuICAgIGV4dGVuZChfZWZmZWN0LCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5zY29wZSkgcmVjb3JkRWZmZWN0U2NvcGUoX2VmZmVjdCwgb3B0aW9ucy5zY29wZSk7XG4gIH1cbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmxhenkpIHtcbiAgICBfZWZmZWN0LnJ1bigpO1xuICB9XG4gIGNvbnN0IHJ1bm5lciA9IF9lZmZlY3QucnVuLmJpbmQoX2VmZmVjdCk7XG4gIHJ1bm5lci5lZmZlY3QgPSBfZWZmZWN0O1xuICByZXR1cm4gcnVubmVyO1xufVxuZnVuY3Rpb24gc3RvcChydW5uZXIpIHtcbiAgcnVubmVyLmVmZmVjdC5zdG9wKCk7XG59XG5sZXQgc2hvdWxkVHJhY2sgPSB0cnVlO1xubGV0IHBhdXNlU2NoZWR1bGVTdGFjayA9IDA7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gcGF1c2VTY2hlZHVsaW5nKCkge1xuICBwYXVzZVNjaGVkdWxlU3RhY2srKztcbn1cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGluZygpIHtcbiAgcGF1c2VTY2hlZHVsZVN0YWNrLS07XG4gIHdoaWxlICghcGF1c2VTY2hlZHVsZVN0YWNrICYmIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5sZW5ndGgpIHtcbiAgICBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMuc2hpZnQoKSgpO1xuICB9XG59XG5mdW5jdGlvbiB0cmFja0VmZmVjdChlZmZlY3QyLCBkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBpZiAoZGVwLmdldChlZmZlY3QyKSAhPT0gZWZmZWN0Mi5fdHJhY2tJZCkge1xuICAgIGRlcC5zZXQoZWZmZWN0MiwgZWZmZWN0Mi5fdHJhY2tJZCk7XG4gICAgY29uc3Qgb2xkRGVwID0gZWZmZWN0Mi5kZXBzW2VmZmVjdDIuX2RlcHNMZW5ndGhdO1xuICAgIGlmIChvbGREZXAgIT09IGRlcCkge1xuICAgICAgaWYgKG9sZERlcCkge1xuICAgICAgICBjbGVhbnVwRGVwRWZmZWN0KG9sZERlcCwgZWZmZWN0Mik7XG4gICAgICB9XG4gICAgICBlZmZlY3QyLmRlcHNbZWZmZWN0Mi5fZGVwc0xlbmd0aCsrXSA9IGRlcDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0Mi5fZGVwc0xlbmd0aCsrO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgKF9hID0gZWZmZWN0Mi5vblRyYWNrKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlZmZlY3QyLCBleHRlbmQoeyBlZmZlY3Q6IGVmZmVjdDIgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgcXVldWVFZmZlY3RTY2hlZHVsZXJzID0gW107XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRpcnR5TGV2ZWwsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBwYXVzZVNjaGVkdWxpbmcoKTtcbiAgZm9yIChjb25zdCBlZmZlY3QyIG9mIGRlcC5rZXlzKCkpIHtcbiAgICBsZXQgdHJhY2tpbmc7XG4gICAgaWYgKGVmZmVjdDIuX2RpcnR5TGV2ZWwgPCBkaXJ0eUxldmVsICYmICh0cmFja2luZyAhPSBudWxsID8gdHJhY2tpbmcgOiB0cmFja2luZyA9IGRlcC5nZXQoZWZmZWN0MikgPT09IGVmZmVjdDIuX3RyYWNrSWQpKSB7XG4gICAgICBlZmZlY3QyLl9zaG91bGRTY2hlZHVsZSB8fCAoZWZmZWN0Mi5fc2hvdWxkU2NoZWR1bGUgPSBlZmZlY3QyLl9kaXJ0eUxldmVsID09PSAwKTtcbiAgICAgIGVmZmVjdDIuX2RpcnR5TGV2ZWwgPSBkaXJ0eUxldmVsO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0Mi5fc2hvdWxkU2NoZWR1bGUgJiYgKHRyYWNraW5nICE9IG51bGwgPyB0cmFja2luZyA6IHRyYWNraW5nID0gZGVwLmdldChlZmZlY3QyKSA9PT0gZWZmZWN0Mi5fdHJhY2tJZCkpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIChfYSA9IGVmZmVjdDIub25UcmlnZ2VyKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlZmZlY3QyLCBleHRlbmQoeyBlZmZlY3Q6IGVmZmVjdDIgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgICAgfVxuICAgICAgZWZmZWN0Mi50cmlnZ2VyKCk7XG4gICAgICBpZiAoKCFlZmZlY3QyLl9ydW5uaW5ncyB8fCBlZmZlY3QyLmFsbG93UmVjdXJzZSkgJiYgZWZmZWN0Mi5fZGlydHlMZXZlbCAhPT0gMikge1xuICAgICAgICBlZmZlY3QyLl9zaG91bGRTY2hlZHVsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWZmZWN0Mi5zY2hlZHVsZXIpIHtcbiAgICAgICAgICBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMucHVzaChlZmZlY3QyLnNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVzZXRTY2hlZHVsaW5nKCk7XG59XG5cbmNvbnN0IGNyZWF0ZURlcCA9IChjbGVhbnVwLCBjb21wdXRlZCkgPT4ge1xuICBjb25zdCBkZXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBkZXAuY2xlYW51cCA9IGNsZWFudXA7XG4gIGRlcC5jb21wdXRlZCA9IGNvbXB1dGVkO1xuICByZXR1cm4gZGVwO1xufTtcblxuY29uc3QgdGFyZ2V0TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBJVEVSQVRFX0tFWSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJpdGVyYXRlXCIgOiBcIlwiKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiTWFwIGtleSBpdGVyYXRlXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHRyYWNrKHRhcmdldCwgdHlwZSwga2V5KSB7XG4gIGlmIChzaG91bGRUcmFjayAmJiBhY3RpdmVFZmZlY3QpIHtcbiAgICBsZXQgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgIHRhcmdldE1hcC5zZXQodGFyZ2V0LCBkZXBzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGxldCBkZXAgPSBkZXBzTWFwLmdldChrZXkpO1xuICAgIGlmICghZGVwKSB7XG4gICAgICBkZXBzTWFwLnNldChrZXksIGRlcCA9IGNyZWF0ZURlcCgoKSA9PiBkZXBzTWFwLmRlbGV0ZShrZXkpKSk7XG4gICAgfVxuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgZGVwLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICB0eX
20578BlLFxuICAgICAgICBrZXlcbiAgICAgIH0gOiB2b2lkIDBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyKHRhcmdldCwgdHlwZSwga2V5LCBuZXdWYWx1ZSwgb2xkVmFsdWUsIG9sZFRhcmdldCkge1xuICBjb25zdCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICBpZiAoIWRlcHNNYXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGRlcHMgPSBbXTtcbiAgaWYgKHR5cGUgPT09IFwiY2xlYXJcIikge1xuICAgIGRlcHMgPSBbLi4uZGVwc01hcC52YWx1ZXMoKV07XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcImxlbmd0aFwiICYmIGlzQXJyYXkodGFyZ2V0KSkge1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IE51bWJlcihuZXdWYWx1ZSk7XG4gICAgZGVwc01hcC5mb3JFYWNoKChkZXAsIGtleTIpID0+IHtcbiAgICAgIGlmIChrZXkyID09PSBcImxlbmd0aFwiIHx8ICFpc1N5bWJvbChrZXkyKSAmJiBrZXkyID49IG5ld0xlbmd0aCkge1xuICAgICAgICBkZXBzLnB1c2goZGVwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ICE9PSB2b2lkIDApIHtcbiAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChrZXkpKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzSW50ZWdlcktleShrZXkpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KFwibGVuZ3RoXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KE1BUF9LRVlfSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2V0XCI6XG4gICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHBhdXNlU2NoZWR1bGluZygpO1xuICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgaWYgKGRlcCkge1xuICAgICAgdHJpZ2dlckVmZmVjdHMoXG4gICAgICAgIGRlcCxcbiAgICAgICAgNCxcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgb2xkVGFyZ2V0XG4gICAgICAgIH0gOiB2b2lkIDBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJlc2V0U2NoZWR1bGluZygpO1xufVxuZnVuY3Rpb24gZ2V0RGVwRnJvbVJlYWN0aXZlKG9iamVjdCwga2V5KSB7XG4gIGNvbnN0IGRlcHNNYXAgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCk7XG4gIHJldHVybiBkZXBzTWFwICYmIGRlcHNNYXAuZ2V0KGtleSk7XG59XG5cbmNvbnN0IGlzTm9uVHJhY2thYmxlS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKGBfX3Byb3RvX18sX192X2lzUmVmLF9faXNWdWVgKTtcbmNvbnN0IGJ1aWx0SW5TeW1ib2xzID0gbmV3IFNldChcbiAgLyogQF9fUFVSRV9fICovIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCkuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJhcmd1bWVudHNcIiAmJiBrZXkgIT09IFwiY2FsbGVyXCIpLm1hcCgoa2V5KSA9PiBTeW1ib2xba2V5XSkuZmlsdGVyKGlzU3ltYm9sKVxuKTtcbmNvbnN0IGFycmF5SW5zdHJ1bWVudGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMoKTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHt9O1xuICBbXCJpbmNsdWRlc1wiLCBcImluZGV4T2ZcIiwgXCJsYXN0SW5kZXhPZlwiXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpbnN0cnVtZW50YXRpb25zW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhcnIgPSB0b1Jhdyh0aGlzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJhY2soYXJyLCBcImdldFwiLCBpICsgXCJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPSBhcnJba2V5XSguLi5hcmdzKTtcbiAgICAgIGlmIChyZXMgPT09IC0xIHx8IHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGFycltrZXldKC4uLmFyZ3MubWFwKHRvUmF3KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBbXCJwdXNoXCIsIFwicG9wXCIsIFwic2hpZnRcIiwgXCJ1bnNoaWZ0XCIsIFwic3BsaWNlXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIHBhdXNlU2NoZWR1bGluZygpO1xuICAgICAgY29uc3QgcmVzID0gdG9SYXcodGhpcylba2V5XS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIHJlc2V0U2NoZWR1bGluZygpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGluc3RydW1lbnRhdGlvbnM7XG59XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShrZXkpIHtcbiAgaWYgKCFpc1N5bWJvbChrZXkpKSBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgY29uc3Qgb2JqID0gdG9SYXcodGhpcyk7XG4gIHRyYWNrKG9iaiwgXCJoYXNcIiwga2V5KTtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xufVxuY2xhc3MgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKF9pc1JlYWRvbmx5ID0gZmFsc2UsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICAgIHRoaXMuX2lzUmVhZG9ubHkgPSBfaXNSZWFkb25seTtcbiAgICB0aGlzLl9pc1NoYWxsb3cgPSBfaXNTaGFsbG93O1xuICB9XG4gIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICBjb25zdCBpc1JlYWRvbmx5MiA9IHRoaXMuX2lzUmVhZG9ubHksIGlzU2hhbGxvdzIgPSB0aGlzLl9pc1NoYWxsb3c7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybi
20578Bpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNTaGFsbG93XCIpIHtcbiAgICAgIHJldHVybiBpc1NoYWxsb3cyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgaWYgKHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBpc1NoYWxsb3cyID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpIHx8IC8vIHJlY2VpdmVyIGlzIG5vdCB0aGUgcmVhY3RpdmUgcHJveHksIGJ1dCBoYXMgdGhlIHNhbWUgcHJvdG90eXBlXG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSByZWNpZXZlciBpcyBhIHVzZXIgcHJveHkgb2YgdGhlIHJlYWN0aXZlIHByb3h5XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoaXNTaGFsbG93Mikge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoaXNTaGFsbG93MiA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIGlzU2hhbGxvdzIpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKCF0aGlzLl9pc1NoYWxsb3cpIHtcbiAgICAgIGNvbnN0IGlzT2xkVmFsdWVSZWFkb25seSA9IGlzUmVhZG9ubHkob2xkVmFsdWUpO1xuICAgICAgaWYgKCFpc1NoYWxsb3codmFsdWUpICYmICFpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZSA9IHRvUmF3KG9sZFZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSAmJiBpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICBpZiAoaXNPbGRWYWx1ZVJlYWRvbmx5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGFkS2V5ID0gaXNBcnJheSh0YXJnZXQpICYmIGlzSW50ZWdlcktleShrZXkpID8gTnVtYmVyKGtleSkgPCB0YXJnZXQubGVuZ3RoIDogaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICBpZiAodGFyZ2V0ID09PSB0b1JhdyhyZWNlaXZlcikpIHtcbiAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCBoYWRLZXkgPSBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSk7XG4gICAgaWYgKHJlc3VsdCAmJiBoYWRLZXkpIHtcbiAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGhhcyh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICB0cmFjayh0YXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayhcbiAgICAgIHRhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNBcnJheSh0YXJnZXQpID8gXCJsZW5ndGhcIiA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH1cbn1cbmNsYXNzIFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICAgIHN1cGVyKHRydWUsIGlzU2hhbGxvdzIpO1xuICB9XG4gI
20578HNldCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcihcbiAgdHJ1ZVxuKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcblxuY29uc3QgdG9TaGFsbG93ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IGdldFByb3RvID0gKHYpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yodik7XG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIGlzUmVhZG9ubHkyID0gZmFsc2UsIGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkyKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwgcmF3S2V5KTtcbiAgfVxuICBjb25zdCB7IGhhczogaGFzMiB9ID0gZ2V0UHJvdG8ocmF3VGFyZ2V0KTtcbiAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdzIgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5MiA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwga2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQoa2V5KSk7XG4gIH0gZWxzZSBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwgcmF3S2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQocmF3S2V5KSk7XG4gIH0gZWxzZSBpZiAodGFyZ2V0ICE9PSByYXdUYXJnZXQpIHtcbiAgICB0YXJnZXQuZ2V0KGtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhcyhrZXksIGlzUmVhZG9ubHkyID0gZmFsc2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seTIpIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChrZXksIHJhd0tleSkpIHtcbiAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwga2V5KTtcbiAgICB9XG4gICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCByYXdLZXkpO1xuICB9XG4gIHJldHVybiBrZXkgPT09IHJhd0tleSA/IHRhcmdldC5oYXMoa2V5KSA6IHRhcmdldC5oYXMoa2V5KSB8fCB0YXJnZXQuaGFzKHJhd0tleSk7XG59XG5mdW5jdGlvbiBzaXplKHRhcmdldCwgaXNSZWFkb25seTIgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICAhaXNSZWFkb25seTIgJiYgdHJhY2sodG9SYXcodGFyZ2V0KSwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgXCJzaXplXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBhZGQodmFsdWUsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICBpZiAoIV9pc1NoYWxsb3cgJiYgIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgY29uc3QgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCB2YWx1ZSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAgdGFyZ2V0LmFkZCh2YWx1ZSk7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIHZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSwgX2lzU2hhbGxvdyA9IGZhbHNlKSB7XG4gIGlmICghX2lzU2hhbGxvdyAmJiAhaXNTaGFsbG93KHZhbHVlKSAmJiAhaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gI
20578HJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZGVsZXRlRW50cnkoa2V5KSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIgPyBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuZGVsZXRlKGtleSk7XG4gIGlmIChoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2xlYXIoKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBoYWRJdGVtcyA9IHRhcmdldC5zaXplICE9PSAwO1xuICBjb25zdCBvbGRUYXJnZXQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gaXNNYXAodGFyZ2V0KSA/IG5ldyBNYXAodGFyZ2V0KSA6IG5ldyBTZXQodGFyZ2V0KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmNsZWFyKCk7XG4gIGlmIChoYWRJdGVtcykge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImNsZWFyXCIsIHZvaWQgMCwgdm9pZCAwLCBvbGRUYXJnZXQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVGb3JFYWNoKGlzUmVhZG9ubHkyLCBpc1NoYWxsb3cyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSB0aGlzO1xuICAgIGNvbnN0IHRhcmdldCA9IG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cyID8gdG9TaGFsbG93IDogaXNSZWFkb25seTIgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAhaXNSZWFkb25seTIgJiYgdHJhY2socmF3VGFyZ2V0LCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICAgIHJldHVybiB0YXJnZXQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgd3JhcCh2YWx1ZSksIHdyYXAoa2V5KSwgb2JzZXJ2ZWQpO1xuICAgIH0pO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBpc1JlYWRvbmx5MiwgaXNTaGFsbG93Mikge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0SXNNYXAgPSBpc01hcChyYXdUYXJnZXQpO1xuICAgIGNvbnN0IGlzUGFpciA9IG1ldGhvZCA9PT0gXCJlbnRyaWVzXCIgfHwgbWV0aG9kID09PSBTeW1ib2wuaXRlcmF0b3IgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaXNLZXlPbmx5ID0gbWV0aG9kID09PSBcImtleXNcIiAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpbm5lckl0ZXJhdG9yID0gdGFyZ2V0W21ldGhvZF0oLi4uYXJncyk7XG4gICAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdzIgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5MiA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5MiAmJiB0cmFjayhcbiAgICAgIHJhd1RhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNLZXlPbmx5ID8gTUFQX0tFWV9JVEVSQVRFX0tFWSA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gaXRlcmF0b3IgcHJvdG9jb2xcbiAgICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gZG9uZSA/IHsgdmFsdWUsIGRvbmUgfSA6IHtcbiAgICAgICAgICB2YWx1ZTogaXNQYWlyID8gW3dyYXAodmFsdWVbMF0pLCB3cmFwKHZhbHVlWzFdKV0gOiB3cmFwKHZhbHVlKSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgLy8gaXRlcmFibGUgcHJvdG9jb2xcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhZG9ubHlNZXRob2QodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmdzWzBdID8gYG9uIGtleSBcIiR7YXJnc1swXX1cIiBgIDogYGA7XG4gICAgICB3YXJuKFxuICAgICAgICBgJHtjYXBpdGFsaXplKHR5cGUpfSBvcGVyYXRpb24gJHtrZXl9ZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdG9SYXcodGhpcylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlID09PSBcImRlbGV0ZVwiID8gZmFsc2UgOiB0eXBlID09PSBcImNsZWFyXCIgPyB2b2lkIDAgOiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYWRkLmNhbGwodGhpcywgdmFsdWUsIHRydWUpO1xuICAgIH0sXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybi
20578BzZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlLCB0cnVlKTtcbiAgICB9LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgY2xlYXIsXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaChmYWxzZSwgdHJ1ZSlcbiAgfTtcbiAgY29uc3QgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIHRydWUpXG4gIH07XG4gIGNvbnN0IGl0ZXJhdG9yTWV0aG9kcyA9IFtcbiAgICBcImtleXNcIixcbiAgICBcInZhbHVlc1wiLFxuICAgIFwiZW50cmllc1wiLFxuICAgIFN5bWJvbC5pdGVyYXRvclxuICBdO1xuICBpdGVyYXRvck1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGZhbHNlLCBmYWxzZSk7XG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCB0cnVlLCBmYWxzZSk7XG4gICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGZhbHNlLCB0cnVlKTtcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gW1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMixcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyLFxuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlxuICBdO1xufVxuY29uc3QgW1xuICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyxcbiAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zLFxuICBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uc1xuXSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCk7XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoaXNSZWFkb25seTIsIHNoYWxsb3cpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHNoYWxsb3cgPyBpc1JlYWRvbmx5MiA/IHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMgOiBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyA6IGlzUmVhZG9ubHkyID8gcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogbXV0YWJsZUluc3RydW1lbnRhdGlvbnM7XG4gIHJldHVybiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0LmdldChcbiAgICAgIGhhc093bihpbnN0cnVtZW50YXRpb25zLCBrZXkpICYmIGtleSBpbiB0YXJnZXQgPyBpbnN0cnVtZW50YXRpb25zIDogdGFyZ2V0LFxuICAgICAga2V5LFxuICAgICAgcmVjZWl2ZXJcbiAgICApO1xuICB9O1xufVxuY29uc3QgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIHRydWUpXG59O1xuY29uc3QgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCB0cnVlKVxufTtcbmZ1bmN0aW9uIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KSB7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmIChyYXdLZXkgIT09IGtleSAmJiBoYXMyLmNhbGwodGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgY29uc3QgdHlwZSA9IHRvUmF3VHlwZSh0YXJnZXQpO1xuICAgIHdhcm4oXG4gICAgICBgUmVhY3RpdmUgJHt0eXBlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7dHlwZSA9PT0gYE1hcGAgPyBgIGFzIGtleXNgIDogYGB9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gdGFyZ2V0VHlwZU1hcChyYXdUeXBlKSB7XG4gIHN3aXRjaCAocmF3VHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiAxIC8qIENPTU1PTiAqLztcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICAgIHJldHVybiAyIC8qIENPTExFQ1RJT04gKi87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwIC8qIElOVkFMSUQgKi87XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhcmdldFR5cGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlW1wiX192X3NraXBcIl0gfHwgIU9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpID8gMCAvKiBJTlZBTElEICovIDogdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIHJlYWN0aXZlKHRhcmdldCkge1xuICBpZiAoaXNSZWFkb25seSh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIG11dGFibGVIYW5kbGVycyxcbiAgICBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHJlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gIHJldHVybi
20578BjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMsXG4gICAgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhY3RpdmVNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgcmVhZG9ubHlIYW5kbGVycyxcbiAgICByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgc2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVPYmplY3QodGFyZ2V0LCBpc1JlYWRvbmx5MiwgYmFzZUhhbmRsZXJzLCBjb2xsZWN0aW9uSGFuZGxlcnMsIHByb3h5TWFwKSB7XG4gIGlmICghaXNPYmplY3QodGFyZ2V0KSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgdmFsdWUgY2Fubm90IGJlIG1hZGUgJHtpc1JlYWRvbmx5MiA/IFwicmVhZG9ubHlcIiA6IFwicmVhY3RpdmVcIn06ICR7U3RyaW5nKFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICApfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKHRhcmdldFtcIl9fdl9yYXdcIl0gJiYgIShpc1JlYWRvbmx5MiAmJiB0YXJnZXRbXCJfX3ZfaXNSZWFjdGl2ZVwiXSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nUHJveHkgPSBwcm94eU1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKGV4aXN0aW5nUHJveHkpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdQcm94eTtcbiAgfVxuICBjb25zdCB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZSh0YXJnZXQpO1xuICBpZiAodGFyZ2V0VHlwZSA9PT0gMCAvKiBJTlZBTElEICovKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShcbiAgICB0YXJnZXQsXG4gICAgdGFyZ2V0VHlwZSA9PT0gMiAvKiBDT0xMRUNUSU9OICovID8gY29sbGVjdGlvbkhhbmRsZXJzIDogYmFzZUhhbmRsZXJzXG4gICk7XG4gIHByb3h5TWFwLnNldCh0YXJnZXQsIHByb3h5KTtcbiAgcmV0dXJuIHByb3h5O1xufVxuZnVuY3Rpb24gaXNSZWFjdGl2ZSh2YWx1ZSkge1xuICBpZiAoaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaXNSZWFjdGl2ZSh2YWx1ZVtcIl9fdl9yYXdcIl0pO1xuICB9XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWN0aXZlXCJdKTtcbn1cbmZ1bmN0aW9uIGlzUmVhZG9ubHkodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhZG9ubHlcIl0pO1xufVxuZnVuY3Rpb24gaXNTaGFsbG93KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1NoYWxsb3dcIl0pO1xufVxuZnVuY3Rpb24gaXNQcm94eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPyAhIXZhbHVlW1wiX192X3Jhd1wiXSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgY29uc3QgcmF3ID0gb2JzZXJ2ZWQgJiYgb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICByZXR1cm4gcmF3ID8gdG9SYXcocmF3KSA6IG9ic2VydmVkO1xufVxuZnVuY3Rpb24gbWFya1Jhdyh2YWx1ZSkge1xuICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkpIHtcbiAgICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgdG9SZWFjdGl2ZSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhY3RpdmUodmFsdWUpIDogdmFsdWU7XG5jb25zdCB0b1JlYWRvbmx5ID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFkb25seSh2YWx1ZSkgOiB2YWx1ZTtcblxuY29uc3QgQ09NUFVURURfU0lERV9FRkZFQ1RfV0FSTiA9IGBDb21wdXRlZCBpcyBzdGlsbCBkaXJ0eSBhZnRlciBnZXR0ZXIgZXZhbHVhdGlvbiwgbGlrZWx5IGJlY2F1c2UgYSBjb21wdXRlZCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY3kgaW4gaXRzIGdldHRlci4gU3RhdGUgbXV0YXRpb25zIGluIGNvbXB1dGVkIGdldHRlcnMgc2hvdWxkIGJlIGF2b2lkZWQuICBDaGVjayB0aGUgZG9jcyBmb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9lc3NlbnRpYWxzL2NvbXB1dGVkLmh0bWwjZ2V0dGVycy1zaG91bGQtYmUtc2lkZS1lZmZlY3QtZnJlZWA7XG5jbGFzcyBDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIsIF9zZXR0ZXIsIGlzUmVhZG9ubHksIGlzU1NSKSB7XG4gICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7XG4gICAgdGhpcy5fc2V0dGVyID0gX3NldHRlcjtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpc1tcIl9fdl9pc1JlYWRvbmx5XCJdID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoXG4gICAgICAoKSA9PiBnZXR0ZXIodGhpcy5fdmFsdWUpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmVmZmVjdC5fZGlydHlMZXZlbCA9PT0gMiA/IDIgOiAzXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmVmZmVjdC5jb21wdXRlZCA9IHRoaXM7XG4gICAgdGhpcy5lZmZlY3QuYWN0aXZlID0gdGhpcy5fY2FjaGVhYmxlID0gIWlzU1NSO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGlzUmVhZG9ubHk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0b1Jhdyh0aGlzKTtcbiAgICBpZiAoKCFzZWxmLl9jYWNoZWFibGUgfHwgc2VsZi5lZmZlY3QuZGlydHkpICYmIGhhc0NoYW5nZWQoc2VsZi5fdmFsdWUsIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCkpKSB7XG4gICAgICB0cmlnZ2VyUmVmVmFsdWUoc2VsZiwgNCk7XG4gICAgfVxuICAgIHRyYWNrUmVmVmFsdWUoc2VsZik7XG4gICAgaWYgKHNlbGYuZWZmZWN0Ll9kaXJ0eUxldmVsID49IDIpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHRoaXMuX3dhcm5SZWN1cnNpdmUpIHtcbiAgICAgICAgd2FybihDT01QVVRFRF9TSURFX0VGRkVDVF9XQVJOLCBgXG5cbmdldHRlcjogYCwgdGhpcy5nZXR0ZXIpO1xuICAgICAgfVxuICAgICAgdHJpZ2dlclJlZlZhbHVlKHNlbGYsIDIpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fc2V0dGVyKG5ld1ZhbHVlKTtcbiAgfVxuICAvLyAjcmVnaW9uIHBvbHlmaWxsIF9kaXJ0eSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGlyZCBwYXJ0eSBjb2RlIGZvciBWdWUgPD0gMy4zLnhcbiAgZ2V0IF9kaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3QuZGlydHk7XG4gIH1cbiAgc2V0IF9kaXJ0eSh2KSB7XG4gICAgdGhpcy5lZmZlY3QuZGlydHkgPSB2O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbmZ1bmN0aW9uIGNvbXB1dGVkKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBzZXR0ZXI7XG4gIGNvbnN0IG9ubHlHZXR0ZXIgPSBpc0Z1bmN0aW9uKGdldHRlck9yT3B0aW9ucyk7XG4gIGlmIChvbmx5R2V0dGVyKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICAgIHNldHRlciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoKSA9PiB7XG4gICAgICB3YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfSA6IE5PT1A7XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLmdldDtcbiAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICB9XG4gIGNvbnN0IGNSZWYgPSBuZXcgQ29tcHV0ZWRSZWZJbXBsKGdldHRlciwgc2V0dGVyLCBvbmx5R2V0dGVyIHx8ICFzZXR0ZXIsIGlzU1NSKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVidWdPcHRpb25zICYmICFpc1NTUikge1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICBjUmVmLmVmZmVjdC5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5mdW5jdGlvbiB0cmFja1JlZlZhbHVlKHJlZjIpIHtcbiAgdmFyIF9hO1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgKF9hID0gcmVmMi5kZXApICE9IG51bGwgPyBfYSA6IHJlZjIuZGVwID0gY3JlYXRlRGVwKFxuICAgICAgICAoKSA9PiByZWYyLmRlcCA9IHZvaWQgMCxcbiAgICAgICAgcmVmMiBpbnN0YW5jZW9mIENvbXB1dGVkUmVmSW1wbCA/IHJlZjIgOiB2b2lkIDBcbiAgICAgICksXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICB0YXJnZXQ6IHJlZjIsXG4gICAgICAgIHR5cGU6IFwiZ2V0XCIsXG4gICAgICAgIGtleTogXCJ2YWx1ZVwiXG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZlZhbHVlKHJlZjIsIGRpcnR5TGV2ZWwgPSA0LCBuZXdWYWwsIG9sZFZhbCkge1xuICByZWYyID0gdG9SYXcocmVmMik7XG4gIGNvbnN0IGRlcCA9IHJlZjIuZGVwO1xuICBpZiAoZGVwKSB7XG4gICAgdHJpZ2dlckVmZmVjdHMoXG4gICAgICBkZXAsXG4gICAgICBkaXJ0eUxldmVsLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbCxcbiAgICAgICAgb2xkVmFsdWU6IG9sZFZhbFxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzUmVmKHIpIHtcbiAgcmV0dXJuICEhKHIgJiYgci5fX3ZfaXNSZWYgPT09IHRydWUpO1xufVxuZnVuY3Rpb24gcmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWYocmF3VmFsdWUsIHNoYWxsb3cpIHtcbiAgaWYgKGlzUmVmKHJhd1ZhbHVlKSkge1xuICAgIHJldHVybiByYXdWYWx1ZTtcbiAgfVxuICByZXR1cm4gbmV3IFJlZkltcGwocmF3VmFsdWUsIHNoYWxsb3cpO1xufVxuY2xhc3MgUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBfX3ZfaXNTaGFsbG93KSB7XG4gICAgdGhpcy5fX3ZfaXNTaGFsbG93ID0gX192X2lzU2hhbGxvdztcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpcy5fcmF3VmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1Jhdyh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1JlYWN0aXZlKHZhbHVlKTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgdHJhY2tSZWZWYWx1ZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIGNvbnN0IHVzZURpcmVjdFZhbHVlID0gdGhpcy5fX3ZfaXNTaGFsbG93IHx8IGlzU2hhbGxvdyhuZXdWYWwpIHx8IGlzUmVhZG9ubHkobmV3VmFsKTtcbiAgICBuZXdWYWwgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbCA6IHRvUmF3KG5ld1ZhbCk7XG4gICAgaWYgKGhhc0NoYW5nZWQobmV3VmFsLCB0aGlzLl9yYXdWYWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuX3Jhd1ZhbHVlO1xuICAgICAgdGhpcy5fcmF3VmFsdWUgPSBuZXdWYWw7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SZWFjdGl2ZShuZXdWYWwpO1xuICAgICAgdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDQsIG5ld1ZhbCwgb2xkVmFsKTtcbiAgICB9XG4gI
20578H1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWYocmVmMikge1xuICB0cmlnZ2VyUmVmVmFsdWUocmVmMiwgNCwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlZjIudmFsdWUgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gdW5yZWYocmVmMikge1xuICByZXR1cm4gaXNSZWYocmVmMikgPyByZWYyLnZhbHVlIDogcmVmMjtcbn1cbmZ1bmN0aW9uIHRvVmFsdWUoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSkgPyBzb3VyY2UoKSA6IHVucmVmKHNvdXJjZSk7XG59XG5jb25zdCBzaGFsbG93VW53cmFwSGFuZGxlcnMgPSB7XG4gIGdldDogKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4gdW5yZWYoUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSksXG4gIHNldDogKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmIChpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcHJveHlSZWZzKG9iamVjdFdpdGhSZWZzKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKG9iamVjdFdpdGhSZWZzKSA/IG9iamVjdFdpdGhSZWZzIDogbmV3IFByb3h5KG9iamVjdFdpdGhSZWZzLCBzaGFsbG93VW53cmFwSGFuZGxlcnMpO1xufVxuY2xhc3MgQ3VzdG9tUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKGZhY3RvcnkpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZmFjdG9yeShcbiAgICAgICgpID0+IHRyYWNrUmVmVmFsdWUodGhpcyksXG4gICAgICAoKSA9PiB0cmlnZ2VyUmVmVmFsdWUodGhpcylcbiAgICApO1xuICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICB0aGlzLl9zZXQgPSBzZXQ7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoKTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fc2V0KG5ld1ZhbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVJlZihmYWN0b3J5KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIHdhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgIHRoaXMuX29iamVjdCA9IF9vYmplY3Q7XG4gICAgdGhpcy5fa2V5ID0gX2tleTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgcmV0dXJuIHZhbCA9PT0gdm9pZCAwID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogdmFsO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XSA9IG5ld1ZhbDtcbiAgfVxuICBnZXQgZGVwKCkge1xuICAgIHJldHVybiBnZXREZXBGcm9tUmVhY3RpdmUodG9SYXcodGhpcy5fb2JqZWN0KSwgdGhpcy5fa2V5KTtcbiAgfVxufVxuY2xhc3MgR2V0dGVyUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKF9nZXR0ZXIpIHtcbiAgICB0aGlzLl9nZXR0ZXIgPSBfZ2V0dGVyO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9fdl9pc1JlYWRvbmx5ID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldHRlcigpO1xuICB9XG59XG5mdW5jdGlvbiB0b1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gbmV3IEdldHRlclJlZkltcGwoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlZihzb3VyY2UpO1xuICB9XG59XG5mdW5jdGlvbiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3QgdmFsID0gc291cmNlW2tleV07XG4gIHJldHVybiBpc1JlZih2YWwpID8gdmFsIDogbmV3IE9iamVjdFJlZkltcGwoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmVycmVkQ29tcHV0ZWQgPSBjb21wdXRlZDtcblxuY29uc3QgVHJhY2tPcFR5cGVzID0ge1xuICBcIkdFVFwiOiBcImdldFwiLFxuICBcIkhBU1wiOiBcImhhc1wiLFxuICBcIklURVJBVEVcIjogXCJpdGVyYXRlXCJcbn07XG5jb25zdCBUcmlnZ2VyT3BUeXBlcyA9IHtcbiAgXCJTRVRcIjogXCJzZXRcIixcbiAgXCJBRERcIjogXCJhZGRcIixcbiAgXCJERUxFVEVcIjogXCJkZWxldGVcIixcbiAgXCJDTEVBUlwiOiBcImNsZWFyXCJcbn07XG5jb25zdCBSZWFjdGl2ZUZsYWdzID0ge1xuICBcIlNLSVBcIjogXCJfX3Zfc2tpcFwiLFxuICBcIklTX1JFQUNUSVZFXCI6IFwiX192X2lzUmVhY3RpdmVcIixcbiAgXCJJU19SRUFET05MWVwiOiBcIl9fdl9pc1JlYWRvbmx5XCIsXG4gIFwiSVNfU0hBTExPV1wiOiBcIl9fdl9pc1NoYWxsb3dcIixcbiAgXCJSQVdcIjogXCJfX3ZfcmF3XCJcbn07XG5cbmV4cG9ydCB7
20578IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIFJlYWN0aXZlRmxhZ3MsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVNjaGVkdWxpbmcsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHJlc2V0U2NoZWR1bGluZywgcmVzZXRUcmFja2luZywgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmFjaywgdHJpZ2dlciwgdHJpZ2dlclJlZiwgdW5yZWYgfTtcbiIsIi8qKlxuKiBAdnVlL3J1bnRpbWUtY29yZSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIGlzU2hhbGxvdywgZ2V0Q3VycmVudFNjb3BlLCBjdXN0b21SZWYsIGlzUHJveHksIHByb3h5UmVmcywgbWFya1JhdywgRWZmZWN0U2NvcGUsIGNvbXB1dGVkIGFzIGNvbXB1dGVkJDEsIGlzUmVhZG9ubHkgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJpZ2dlclJlZiwgdW5yZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRnVuY3Rpb24sIGlzUHJvbWlzZSwgaXNBcnJheSwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBpc0J1aWx0SW5EaXJlY3RpdmUsIEVNUFRZX09CSiwgaXNPYmplY3QsIHJlbW92ZSwgaXNSZWdFeHAsIGludm9rZUFycmF5Rm5zLCB0b0hhbmRsZXJLZXksIGNhcGl0YWxpemUsIGNhbWVsaXplLCBoYXNPd24sIGlzR2xvYmFsbHlBbGxvd2VkLCBOTywgaHlwaGVuYXRlLCBpc1Jlc2VydmVkUHJvcCwgRU1QVFlfQVJSLCB0b1Jhd1R5cGUsIG1ha2VNYXAsIGRlZiwgaXNPbiwgbm9ybWFsaXplQ2xhc3MsIHN0cmluZ2lmeVN0eWxlLCBub3JtYWxpemVTdHlsZSwgaXNLbm93blN2Z0F0dHIsIGlzQm9vbGVhbkF0dHIsIGlzS25vd25IdG1sQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1JlbmRlcmFibGVBdHRyVmFsdWUsIGhhc0NoYW5nZWQsIGlzU2V0LCBpc01hcCwgaXNQbGFpbk9iamVjdCwgbG9vc2VUb051bWJlciwgaXNNb2RlbExpc3RlbmVyLCB0b051bWJlciB9IGZyb20gJ0B2dWUvc2hhcmVkJztcbmV4cG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCB0b0Rpc3BsYXlTdHJpbmcsIHRvSGFuZGxlcktleSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZSkge1xuICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICBzdGFjay5wb3AoKTtcbn1cbmxldCBpc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHdhcm4kMShtc2csIC4uLmFyZ3MpIHtcbiAgaWYgKGlzV2FybmluZykgcmV0dXJuO1xuICBpc1dhcm5pbmcgPSB0cnVlO1xuICBwYXVzZVRyYWNraW5nKCk7XG4gIGNvbnN0IGluc3RhbmNlID0gc3RhY2subGVuZ3RoID8gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uY29tcG9uZW50IDogbnVsbDtcbiAgY29uc3QgYXBwV2FybkhhbmRsZXIgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcjtcbiAgY29uc3QgdHJhY2UgPSBnZXRDb21wb25lbnRUcmFjZSgpO1xuICBpZiAoYXBwV2FybkhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBhcHBXYXJuSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMTEsXG4gICAgICBbXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBtc2cgKyBhcmdzLm1hcCgoYSkgPT4ge1xuICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IGEudG9TdHJpbmcpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGEpKSAhPSBudWxsID8gX2IgOiBKU09OLnN0cmluZ2lmeShhKTtcbiAgICAgICAgfSkuam9pbihcIlwiKSxcbiAgICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2UucHJveHksXG4gICAgICAgIHRyYWNlLm1hcChcbiAgICAgICAgICAoeyB2bm9kZSB9KSA9PiBgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgdm5vZGUudHlwZSl9PmBcbiAgICAgICAgKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICB0cmFjZVxuICAgICAgXVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd2FybkFyZ3MgPSBbYFtWdWUgd2Fybl06ICR7bXNnfWAsIC4uLmFyZ3NdO1xuICAgIGlmICh0cmFjZS5sZW5ndGggJiYgLy8gYXZvaWQgc3BhbW1pbmcgY29uc29sZSBkdXJpbmcgdGVzdHNcbiAgICB0cnVlKSB7XG4gICAgICB3YXJuQXJncy5wdXNoKGBcbmAsIC4uLmZvcm1hdFRyYWNlKHRyYWNlKSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybiguLi53YXJuQXJncyk7XG4gIH1cbiAgcmVzZXRUcmFja2luZygpO1xuICBpc1dhcm5pbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRyYWNlKCkge1xuICBsZXQgY3VycmVudFZOb2RlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gIGlmICghY3VycmVudFZOb2RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9IFtdO1xuICB3aGlsZSAoY3VycmVudFZOb2RlKSB7XG4gICAgY29uc3QgbGFzdCA9IG5vcm1hbGl6ZWRTdGFja1swXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LnZub2RlID09PSBjdXJyZW50Vk5vZGUpIHtcbiAgICAgIGxhc3QucmVjdXJzZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWRTdGFjay5wdXNoKHtcbiAgICAgICAgdm5vZGU6IGN1cnJlbnRWTm9kZSxcbiAgICAgICAgcmVjdXJzZUNvdW50OiAwXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50SW5zdGFuY2UgPSBjdXJyZW50Vk5vZGUuY29tcG9uZW50ICYmIGN1cnJlbnRWTm9kZS5jb21wb25lbnQucGFyZW50O1xuICAgIGN1cnJlbnRWTm9kZSA9IHBhcmVudEluc3RhbmNlICYmIHBhcmVudEluc3RhbmNlLnZub2RlO1xuICB9XG4gI
20578HJldHVybiBub3JtYWxpemVkU3RhY2s7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZSh0cmFjZSkge1xuICBjb25zdCBsb2dzID0gW107XG4gIHRyYWNlLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmkgPT09IDAgPyBbXSA6IFtgXG5gXSwgLi4uZm9ybWF0VHJhY2VFbnRyeShlbnRyeSkpO1xuICB9KTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZUVudHJ5KHsgdm5vZGUsIHJlY3Vyc2VDb3VudCB9KSB7XG4gIGNvbnN0IHBvc3RmaXggPSByZWN1cnNlQ291bnQgPiAwID8gYC4uLiAoJHtyZWN1cnNlQ291bnR9IHJlY3Vyc2l2ZSBjYWxscylgIDogYGA7XG4gIGNvbnN0IGlzUm9vdCA9IHZub2RlLmNvbXBvbmVudCA/IHZub2RlLmNvbXBvbmVudC5wYXJlbnQgPT0gbnVsbCA6IGZhbHNlO1xuICBjb25zdCBvcGVuID0gYCBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKFxuICAgIHZub2RlLmNvbXBvbmVudCxcbiAgICB2bm9kZS50eXBlLFxuICAgIGlzUm9vdFxuICApfWA7XG4gIGNvbnN0IGNsb3NlID0gYD5gICsgcG9zdGZpeDtcbiAgcmV0dXJuIHZub2RlLnByb3BzID8gW29wZW4sIC4uLmZvcm1hdFByb3BzKHZub2RlLnByb3BzKSwgY2xvc2VdIDogW29wZW4gKyBjbG9zZV07XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wcyhwcm9wcykge1xuICBjb25zdCByZXMgPSBbXTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAga2V5cy5zbGljZSgwLCAzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXMucHVzaCguLi5mb3JtYXRQcm9wKGtleSwgcHJvcHNba2V5XSkpO1xuICB9KTtcbiAgaWYgKGtleXMubGVuZ3RoID4gMykge1xuICAgIHJlcy5wdXNoKGAgLi4uYCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFByb3Aoa2V5LCB2YWx1ZSwgcmF3KSB7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHZhbHVlID0gZm9ybWF0UHJvcChrZXksIHRvUmF3KHZhbHVlLnZhbHVlKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09UmVmPGAsIHZhbHVlLCBgPmBdO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgcmV0dXJuIFtgJHtrZXl9PWZuJHt2YWx1ZS5uYW1lID8gYDwke3ZhbHVlLm5hbWV9PmAgOiBgYH1gXTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1gLCB2YWx1ZV07XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydE51bWJlcih2YWwsIHR5cGUpIHtcbiAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9LmApO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LmApO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIFwiU0VUVVBfRlVOQ1RJT05cIjogMCxcbiAgXCIwXCI6IFwiU0VUVVBfRlVOQ1RJT05cIixcbiAgXCJSRU5ERVJfRlVOQ1RJT05cIjogMSxcbiAgXCIxXCI6IFwiUkVOREVSX0ZVTkNUSU9OXCIsXG4gIFwiV0FUQ0hfR0VUVEVSXCI6IDIsXG4gIFwiMlwiOiBcIldBVENIX0dFVFRFUlwiLFxuICBcIldBVENIX0NBTExCQUNLXCI6IDMsXG4gIFwiM1wiOiBcIldBVENIX0NBTExCQUNLXCIsXG4gIFwiV0FUQ0hfQ0xFQU5VUFwiOiA0LFxuICBcIjRcIjogXCJXQVRDSF9DTEVBTlVQXCIsXG4gIFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIjogNSxcbiAgXCI1XCI6IFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiOiA2LFxuICBcIjZcIjogXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiLFxuICBcIlZOT0RFX0hPT0tcIjogNyxcbiAgXCI3XCI6IFwiVk5PREVfSE9PS1wiLFxuICBcIkRJUkVDVElWRV9IT09LXCI6IDgsXG4gIFwiOFwiOiBcIkRJUkVDVElWRV9IT09LXCIsXG4gIFwiVFJBTlNJVElPTl9IT09LXCI6IDksXG4gIFwiOVwiOiBcIlRSQU5TSVRJT05fSE9PS1wiLFxuICBcIkFQUF9FUlJPUl9IQU5ETEVSXCI6IDEwLFxuICBcIjEwXCI6IFwiQVBQX0VSUk9SX0hBTkRMRVJcIixcbiAgXCJBUFBfV0FSTl9IQU5ETEVSXCI6IDExLFxuICBcIjExXCI6IFwiQVBQX1dBUk5fSEFORExFUlwiLFxuICBcIkZVTkNUSU9OX1JFRlwiOiAxMixcbiAgXCIxMlwiOiBcIkZVTkNUSU9OX1JFRlwiLFxuICBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIjogMTMsXG4gIFwiMTNcIjogXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCIsXG4gIFwiU0NIRURVTEVSXCI6IDE0LFxuICBcIjE0XCI6IFwiU0NIRURVTEVSXCIsXG4gIFwiQ09NUE9ORU5UX1VQREFURVwiOiAxNSxcbiAgXCIxNVwiOiBcIkNPTVBPTkVOVF9VUERBVEVcIlxufTtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MkMSA9IHtcbiAgW1wic3BcIl06IFwic2VydmVyUHJlZmV0Y2ggaG9va1wiLFxuICBbXCJiY1wiXTogXCJiZWZvcmVDcmVhdGUgaG9va1wiLFxuICBbXCJjXCJdOiBcImNyZWF0ZWQgaG9va1wiLFxuICBbXCJibVwiXTogXCJiZWZvcmVNb3VudCBob29rXCIsXG4gIFtcIm1cIl06IFwibW91bnRlZCBob29rXCIsXG4gIFtcImJ1XCJdOiBcImJlZm9yZVVwZGF0ZSBob29rXCIsXG4gIFtcInVcIl06IFwidXBkYXRlZFwiLFxuICBbXCJidW1cIl06IFwiYmVmb3JlVW5tb3VudCBob29rXCIsXG4gIFtcInVtXCJdOiBcInVubW91bnRlZCBob29rXCIsXG4gIFtcImFcIl06IFwiYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZGFcIl06IFwiZGVhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJlY1wiXTogXCJlcnJvckNhcHR1cmVkIGhvb2tcIixcbiAgW1wicnRjXCJdOiBcInJlbmRlclRyYWNrZWQgaG9va1wiLFxuICBbXCJydGdcIl06IFwicmVuZGVyVHJpZ2dlcmVkIGhvb2tcIixcbiAgWzBdOiBcInNldHVwIGZ1bmN0aW9uXCIsXG4gIFsxXTogXCJyZW5kZXIgZnVuY3Rpb25cIixcbiAgWzJdOiBcIndhdGNoZXIgZ2V0dGVyXCIsXG4gIFszXTogXCJ3YXRjaGVyIGNhbGxiYWNrXCIsXG4gIFs0XTogXCJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb25cIixcbiAgWzVdOiBcIm5hdGl2ZSBldmVudCBoYW5kbGVyXCIsXG4gIFs2XTogXCJjb21wb25lbnQgZXZlbnQgaGFuZGxlclwiLFxuICBbN106IFwidm5vZGUgaG9va1wiLFxuICBbOF06IFwiZGlyZWN0aXZlIGhvb2tcIixcbiAgWzldOiBcInRyYW5zaXRpb24gaG9va1wiLFxuICBbMTBdOiBcImFwcCBlcnJvckhhbmRsZXJcIixcbiAgWzExXTogXCJhcHAgd2FybkhhbmRsZXJcIixcbiAgWzEyXTogXCJyZWYgZnVuY3Rpb25cIixcbiAgWzEzXTogXCJhc3luYyBjb21wb25lbnQgbG9hZGVyXCIsXG4gIFsxNF06IFwic2NoZWR1bGVyIGZsdXNoXCIsXG4gIFsxNV06IFwiY29tcG9uZW50IHVwZGF0ZVwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICB0cnkge1xuICAgIHJldHVybi
20578BhcmdzID8gZm4oLi4uYXJncykgOiBmbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgIGNvbnN0IHJlcyA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpO1xuICAgIGlmIChyZXMgJiYgaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcy5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzLnB1c2goY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm5baV0sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBJbnZhbGlkIHZhbHVlIHR5cGUgcGFzc2VkIHRvIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKCk6ICR7dHlwZW9mIGZufWBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9yLXJlZmVyZW5jZS8jcnVudGltZS0ke3R5cGV9YDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBjb25zdCBlcnJvckNhcHR1cmVkSG9va3MgPSBjdXIuZWM7XG4gICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JDYXB0dXJlZEhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rc1tpXShlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGFwcEVycm9ySGFuZGxlciA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtcbiAgICBpZiAoYXBwRXJyb3JIYW5kbGVyKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICAgIGFwcEVycm9ySGFuZGxlcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMTAsXG4gICAgICAgIFtlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvXVxuICAgICAgKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYpO1xufVxuZnVuY3Rpb24gbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoY29udGV4dFZOb2RlKTtcbiAgICB9XG4gICAgd2FybiQxKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gI
20578HJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNiID0gcXVldWVbaV07XG4gICAgaWYgKGNiICYmIGNiLnByZSkge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGNiLmlkICE9PSBpbnN0YW5jZS51aWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMucHVzaCguLi5kZWR1cGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gZGVkdXBlZDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZm9yIChwb3N0Rmx1c2hJbmRleCA9IDA7IHBvc3RGbHVzaEluZGV4IDwgYWN0aXZlUG9zdEZsdXNoQ2JzLmxlbmd0aDsgcG9zdEZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3QgY2IgPSBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjYi5hY3RpdmUgIT09IGZhbHNlKSBjYigpO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IEluZmluaXR5IDogam9iLmlkO1xuY29uc3QgY29tcGFyYXRvciA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGRpZmYgPSBnZXRJZChhKSAtIGdldElkKGIpO1xuICBpZiAoZGlmZiA9PT0gMCkge1xuICAgIGlmIChhLnByZSAmJiAhYi5wcmUpIHJldHVybiAtMTtcbiAgICBpZiAoYi5wcmUgJiYgIWEucHJlKSByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gZGlmZjtcbn07XG5mdW5jdGlvbiBmbHVzaEpvYnMoc2Vlbikge1xuICBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIHF1ZXVlLnNvcnQoY29tcGFyYXRvcik7XG4gIGNvbnN0IGNoZWNrID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChqb2IpID0+IGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBqb2IpIDogTk9PUDtcbiAgdHJ5IHtcbiAgICBmb3IgKGZsdXNoSW5kZXggPSAwOyBmbHVzaEluZGV4IDwgcXVldWUubGVuZ3RoOyBmbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpvYiA9IHF1ZXVlW2ZsdXNoSW5kZXhdO1xuICAgICAgaWYgKGpvYiAmJiBqb2IuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVjayhqb2IpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICAgIGpvYixcbiAgICAgICAgICBqb2IuaSxcbiAgICAgICAgICBqb2IuaSA/IDE1IDogMTRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hJbmRleCA9IDA7XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCB8fCBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgICAgZmx1c2hKb2JzKHNlZW4pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGZuKSB7XG4gIGlmICghc2Vlbi5oYXMoZm4pKSB7XG4gICAgc2Vlbi5zZXQoZm4sIDEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvdW50ID0gc2Vlbi5nZXQoZm4pO1xuICAgIGlmIChjb3VudCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBmbi5pO1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlICYmIGdldENvbXBvbmVudE5hbWUoaW5zdGFuY2UudHlwZSk7XG4gICAgICBoYW5kbGVFcnJvcihcbiAgICAgICAgYE1heGltdW0gcmVjdXJzaXZlIHVwZGF0ZXMgZXhjZWVkZWQke2NvbXBvbmVudE5hbWUgPyBgIGluIGNvbXBvbmVudCA8JHtjb21wb25lbnROYW1lfT5gIDogYGB9LiBUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLmAsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDEwXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZW4uc2V0KGZuLCBjb3VudCArIDEpO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuY29uc3QgaG1yRGlydHlDb21wb25lbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9ITVJfUlVOVElNRV9fID0ge1xuICAgIGNyZWF0ZVJlY29yZDogdHJ5V3JhcChjcmVhdGVSZWNvcmQpLFxuICAgIHJlcmVuZGVyOiB0cnlXcmFwKHJlcmVuZGVyKSxcbiAgICByZWxvYWQ6IHRyeVdyYXAocmVsb2FkKVxuICB9O1xufVxuY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmZ1bmN0aW9uIHJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gIGNvbnN0IGlkID0gaW5zdGFuY2UudHlwZS5fX2htcklkO1xuICBsZXQgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgY3JlYXRlUmVjb3JkKGlkLCBpbnN0YW5jZS50eXBlKTtcbiAgICByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgfVxuICByZWNvcmQuaW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiB1bnJlZ2lzdGVySE1SKGluc3RhbmNlKSB7XG4gIG1hcC5nZXQoaW5zdGFuY2UudHlwZS5fX2htcklkKS5pbnN0YW5jZXMuZGVsZXRlKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlY29yZChpZCwgaW5pdGlhbERlZikge1xuICBpZiAobWFwLmhhcyhpZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbWFwLnNldChpZCwge1xuICAgIGluaXRpYWxEZWY6IG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluaXRpYWxEZWYpLFxuICAgIGluc3RhbmNlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuIGlzQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSA/IGNvbXBvbmVudC5fX3ZjY09wdHMgOiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiByZXJlbmRlcihpZCwgbmV3UmVuZGVyKSB7XG4gIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZWNvcmQuaW5pdGlhbERlZi5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gIFsuLi5yZWNvcmQuaW5zdGFuY2VzXS5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgIGlmIChuZXdSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgICAgIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyQ2FjaGUgPSBbXTtcbiAgICBpc0htclVwZGF0aW5nID0gdHJ1ZTtcbiAgICBpbnN0YW5jZS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgIGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbiAgfSk7XG59XG5mdW5jdGlvbiByZWxvYWQoaWQsIG5ld0NvbXApIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSByZXR1cm47XG4gIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICBsZXQgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG9sZENvbXApO1xuICAgIGlmICghZGlydHlJbnN0YW5jZXMpIHtcbiAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgICB9XG4gICAgICBobXJEaXJ0eUNvbX
20578BvbmVudHMuc2V0KG9sZENvbXAsIGRpcnR5SW5zdGFuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBkaXJ0eUluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBpbnN0YW5jZS5wYXJlbnQuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHF1ZXVlSm9iKCgpID0+IHtcbiAgICAgICAgaW5zdGFuY2UucGFyZW50LnVwZGF0ZSgpO1xuICAgICAgICBkaXJ0eUluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCkge1xuICAgICAgaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHF1ZXVlUG9zdEZsdXNoQ2IoKCkgPT4ge1xuICAgIGhtckRpcnR5Q29tcG9uZW50cy5jbGVhcigpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKSB7XG4gIGV4dGVuZChvbGRDb21wLCBuZXdDb21wKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkQ29tcCkge1xuICAgIGlmIChrZXkgIT09IFwiX19maWxlXCIgJiYgIShrZXkgaW4gbmV3Q29tcCkpIHtcbiAgICAgIGRlbGV0ZSBvbGRDb21wW2tleV07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiAoaWQsIGFyZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oaWQsIGFyZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5sZXQgZGV2dG9vbHMkMTtcbmxldCBidWZmZXIgPSBbXTtcbmxldCBkZXZ0b29sc05vdEluc3RhbGxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW1pdCQxKGV2ZW50LCAuLi5hcmdzKSB7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfSBlbHNlIGlmICghZGV2dG9vbHNOb3RJbnN0YWxsZWQpIHtcbiAgICBidWZmZXIucHVzaCh7IGV2ZW50LCBhcmdzIH0pO1xuICB9XG59XG5mdW5jdGlvbiBzZXREZXZ0b29sc0hvb2skMShob29rLCB0YXJnZXQpIHtcbiAgdmFyIF9hLCBfYjtcbiAgZGV2dG9vbHMkMSA9IGhvb2s7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbmFibGVkID0gdHJ1ZTtcbiAgICBidWZmZXIuZm9yRWFjaCgoeyBldmVudCwgYXJncyB9KSA9PiBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rJDEobmV3SG9vaywgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGV2dG9vbHMkMSkge1xuICAgICAgICB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IG51bGw7XG4gICAgICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICB9XG4gICAgfSwgM2UzKTtcbiAgfSBlbHNlIHtcbiAgICBkZXZ0b29sc05vdEluc3RhbGxlZCA9IHRydWU7XG4gICAgYnVmZmVyID0gW107XG4gIH1cbn1cbmZ1bmN0aW9uIGRldnRvb2xzSW5pdEFwcChhcHAsIHZlcnNpb24pIHtcbiAgZW1pdCQxKFwiYXBwOmluaXRcIiAvKiBBUFBfSU5JVCAqLywgYXBwLCB2ZXJzaW9uLCB7XG4gICAgRnJhZ21lbnQsXG4gICAgVGV4dCxcbiAgICBDb21tZW50LFxuICAgIFN0YXRpY1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzVW5tb3VudEFwcChhcHApIHtcbiAgZW1pdCQxKFwiYXBwOnVubW91bnRcIiAvKiBBUFBfVU5NT1VOVCAqLywgYXBwKTtcbn1cbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50QWRkZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDphZGRlZFwiIC8qIENPTVBPTkVOVF9BRERFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudE
20578hvb2soXCJjb21wb25lbnQ6dXBkYXRlZFwiIC8qIENPTVBPTkVOVF9VUERBVEVEICovKTtcbmNvbnN0IF9kZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDpyZW1vdmVkXCIgLyogQ09NUE9ORU5UX1JFTU9WRUQgKi9cbik7XG5jb25zdCBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAoY29tcG9uZW50KSA9PiB7XG4gIGlmIChkZXZ0b29scyQxICYmIHR5cGVvZiBkZXZ0b29scyQxLmNsZWFudXBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiAvLyByZW1vdmUgdGhlIGNvbXBvbmVudCBpZiBpdCB3YXNuJ3QgYnVmZmVyZWRcbiAgIWRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlcihjb21wb25lbnQpKSB7XG4gICAgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChjb21wb25lbnQpO1xuICB9XG59O1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQpID0+IHtcbiAgICBlbWl0JDEoXG4gICAgICBob29rLFxuICAgICAgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLFxuICAgICAgY29tcG9uZW50LnVpZCxcbiAgICAgIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHZvaWQgMCxcbiAgICAgIGNvbXBvbmVudFxuICAgICk7XG4gIH07XG59XG5jb25zdCBkZXZ0b29sc1BlcmZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOnN0YXJ0XCIgLyogUEVSRk9STUFOQ0VfU1RBUlQgKi9cbik7XG5jb25zdCBkZXZ0b29sc1BlcmZFbmQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soXG4gIFwicGVyZjplbmRcIiAvKiBQRVJGT1JNQU5DRV9FTkQgKi9cbik7XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhob29rKSB7XG4gIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgZW1pdCQxKGhvb2ssIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LnVpZCwgY29tcG9uZW50LCB0eXBlLCB0aW1lKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgZW1pdCQxKFxuICAgIFwiY29tcG9uZW50OmVtaXRcIiAvKiBDT01QT05FTlRfRU1JVCAqLyxcbiAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgY29tcG9uZW50LFxuICAgIGV2ZW50LFxuICAgIHBhcmFtc1xuICApO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpIHJldHVybiBmbjtcbiAgaWYgKGZuLl9uKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG4gIGNvbnN0IHJlbmRlckZuV2l0aENvbnRleHQgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICBzZXRCbG9ja1RyYWNraW5nKC0xKTtcbiAgICB9XG4gICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgc2V0QmxvY2tUcmFja2luZygxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fbiA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9kID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlckZuV2l0aENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKSB7XG4gIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICB3YXJuJDEoXCJEbyBub3QgdXNlIGJ1aWx0LWluIGRpcmVjdGl2ZSBpZHMgYXMgY3VzdG9tIGRpcmVjdGl2ZSBpZDogXCIgKyBuYW1lKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERpcmVjdGl2ZXModm5vZGUsIGRpcmVjdGl2ZXMpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGB3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLmApO1xuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIp
20578IHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxlYXZlQ2JLZXkgPSBTeW1ib2woXCJfbGVhdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IHJlY3Vyc2l2ZUdldFN1YnRyZWUgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3Qgc3ViVHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gIHJldHVybiBzdWJUcmVlLmNvbXBvbmVudCA/IHJlY3Vyc2l2ZUdldFN1YnRyZWUoc3ViVHJlZS5jb21wb25lbnQpIDogc3ViVHJlZTtcbn07XG5jb25zdCBCYXNlVHJhbnNpdGlvbkltcGwgPSB7XG4gIG5hbWU6IGBCYXNlVHJhbnNpdGlvbmAsXG4gIHByb3BzOiBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZh
20578dWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGhhc0ZvdW5kKSB7XG4gICAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgICBcIjx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQgb3IgY29tcG9uZW50LiBVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkID0gYztcbiAgICAgICAgICAgIGhhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IHsgbW9kZSB9ID0gcmF3UHJvcHM7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtb2RlICYmIG1vZGUgIT09IFwiaW4tb3V0XCIgJiYgbW9kZSAhPT0gXCJvdXQtaW5cIiAmJiBtb2RlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgICB3YXJuJDEoYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXJDaGlsZCA9IGdldEtlZXBBbGl2ZUNoaWxkKGNoaWxkKTtcbiAgICAgIGlmICghaW5uZXJDaGlsZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBsZXQgZW50ZXJIb29rcyA9IHJlc29sdmVUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgIGlubmVyQ2hpbGQsXG4gICAgICAgIHJhd1Byb3BzLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIC8vICMxMTA2MSwgZW5zdXJlIGVudGVySG9va3MgaXMgZnJlc2ggYWZ0ZXIgY2xvbmVcbiAgICAgICAgKGhvb2tzKSA9PiBlbnRlckhvb2tzID0gaG9va3NcbiAgICAgICk7XG4gICAgICBzZXRUcmFuc2l0aW9uSG9va3MoaW5uZXJDaGlsZCwgZW50ZXJIb29rcyk7XG4gICAgICBjb25zdCBvbGRDaGlsZCA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICBjb25zdCBvbGRJbm5lckNoaWxkID0gb2xkQ2hpbGQgJiYgZ2V0S2VlcEFsaXZlQ2hpbGQob2xkQ2hpbGQpO1xuICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiYgb2xkSW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50ICYmICFpc1NhbWVWTm9kZVR5cGUoaW5uZXJDaGlsZCwgb2xkSW5uZXJDaGlsZCkgJiYgcmVjdXJzaXZlR2V0U3VidHJlZShpbnN0YW5jZSkudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS51cGRhdGUuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9IGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uID0gQmFzZVRyYW5zaXRpb25JbXBsO1xuZnVuY3Rpb24gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpIHtcbiAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgbGV0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGxlYXZpbmdWTm9kZXMuZ2V0KHZub2RlLnR5cGUpO1xuICBpZiAoIWxlYXZpbmdWTm9kZXNDYWNoZSkge1xuICAgIGxlYXZpbmdWTm9kZXNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxlYXZpbmdWTm9kZXMuc2V0KHZub2RlLnR5cGUsIGxlYXZpbmdWTm9kZXNDYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uSG9va3Modm5vZGUsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UsIHBvc3RDbG9uZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF
205785KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSkgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKGFmdGVySG9vaywgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgIGhvb2tzLmRlbGF5ZWRMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsW2VudGVyQ2JLZXldID0gdm9pZCAwO1xuICAgICAgfTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2soaG9vaywgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZWF2ZShlbCwgcmVtb3ZlKSB7XG4gICAgICBjb25zdCBrZXkyID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICAgICAgZWxbZW50ZXJDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzVW5tb3VudGluZykge1xuICAgICAgICByZXR1cm4gcmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUxlYXZlLCBbZWxdKTtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZCkgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKG9uTGVhdmVDYW5jZWxsZWQsIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKG9uQWZ0ZXJMZWF2ZSwgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgIGlmIChsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPT09IHZub2RlKSB7XG4gICAgICAgICAgZGVsZXRlIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9IHZub2RlO1xuICAgICAgaWYgKG9uTGVhdmUpIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhvbkxlYXZlLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsb25lKHZub2RlMikge1xuICAgICAgY29uc3QgaG9va3MyID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgdm5vZGUyLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBwb3N0Q2xvbmVcbiAgICAgICk7XG4gICAgICBpZiAocG9zdENsb25lKSBwb3N0Q2xvbmUoaG9va3MyKTtcbiAgICAgIHJldHVybiBob29rczI7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEtlZXBBbGl2ZUNoaWxkKHZub2RlKSB7XG4gIGlmICghaXNLZWVwQWxpdmUodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHZub2RlLmNvbXBvbmVudCkge1xuICAgIHJldHVybiB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlblswXTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDMyICYmIGlzRnVuY3Rpb24oY2hpbGRyZW4uZGVmYXVsdCkpIHtcbiAgICAgIHJldHVybiBjaGlsZHJlbi5kZWZhdWx0KCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIGhvb2tzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2ICYmIHZub2RlLmNvbXBvbmVudCkge1xuICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgaG9va3MpO1xuICB9IGVsc2UgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIHZub2RlLnNzQ29udGVudC50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NDb250ZW50KTtcbiAgICB2bm9kZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICB2bm9kZS50cmFuc2l0aW9uID0gaG9va3M7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZHJlbiwga2VlcENvbW1lbnQgPSBmYWxzZSwgcGFyZW50S2V5KSB7XG4gIGxldCByZXQgPSBbXTtcbiAgbGV0IGtleWVkRnJhZ21lbnRDb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBjb25zdCBrZXkgPSBwYXJlbnRLZXkgPT0gbnVsbCA/IGNoaWxkLmtleSA6IFN0cmluZyhwYXJlbnRLZXkpICsgU3RyaW5nKGNoaWxkLmtleSAhPSBudWxsID8gY2hpbGQua2V5IDogaSk7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoY2hpbGQucGF0Y2hGbGFnICYgMTI4KSBrZXllZEZyYWdtZW50Q291bnQrKztcbiAgICAgIHJldCA9IHJldC5jb25jYXQoXG4gICAgICAgIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwga2VlcENvbW1lbnQsIGtleSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChrZWVwQ29tbWVudCB8fCBjaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICByZXQucHVzaChrZXkgIT0gbnVsbCA/IGNsb25lVk5vZGUoY2hpbGQsIHsga2V5IH0pIDogY2hpbGQpO1xuICAgIH1cbiAgfVxuICBpZiAoa2V5ZWRGcmFnbWVudENvdW50ID4gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRbaV0ucGF0Y2hGbGFnID0gLTI7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob3B0aW9ucykgPyAoXG4gICAgLy8gIzgzMjY6IGV4dGVuZCBjYWxsIGFuZCBvcHRpb25zLm5hbWUgYWNjZXNzIGFyZSBjb25zaWRlcmVkIHNpZGUtZWZmZWN0c1xuICAgIC8vIGJ5IFJvbGx1cCwgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgcHVyZS1hbm5vdGF0ZWQgSUlGRS5cbiAgICAvKiBAX19QVVJFX18gKi8gKCgpID0+IGV4dGVuZCh7IG5hbWU6IG9wdGlvbnMubmFtZSB9LCBleHRyYU9wdGlvbnMsIHsgc2V0dXA6IG9wdGlvbnMgfSkpKClcbiAgKSA6IG9wdGlvbnM7XG59XG5cbmNvbnN0IGlzQXN5bmNXcmFwcGVyID0gKGkpID0+ICEhaS50eXBlLl9fYXN5bmNMb2FkZXI7XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVBc3luY0NvbXBvbmVudChzb3VyY2UpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIHNvdXJjZSA9IHsgbG9hZGVyOiBzb3VyY2UgfTtcbiAgfVxuICBjb25zdCB7XG4gICAgbG9hZGVyLFxuICAgIGxvYWRpbmdDb21wb25lbnQsXG4gICAgZXJyb3JDb21wb25lbnQsXG4gICAgZGVsYXkgPSAyMDAsXG4gICAgdGltZW91dCxcbiAgICAvLyB1bmRlZmluZWQgPSBuZXZlciB0aW1lcyBvdXRcbiAgICBzdXNwZW5zaWJsZSA9IHRydWUsXG4gICAgb25FcnJvcjogdXNlck9uRXJyb3JcbiAgfSA9IHNvdXJjZTtcbiAgbGV0IHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgbGV0IHJlc29sdmVkQ29tcDtcbiAgbGV0IHJldHJpZXMgPSAwO1xuICBjb25zdCByZXRyeSA9ICgpID0+IHtcbiAgICByZXRyaWVzKys7XG4gICAgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgIHJldHVybiBsb2FkKCk7XG4gIH07XG4gIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgbGV0IHRoaXNSZXF1ZXN0O1xuICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdCB8fCAodGhpc1JlcXVlc3QgPSBwZW5kaW5nUmVxdWVzdCA9IGxvYWRlcigpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKTtcbiAgICAgIGlmICh1c2VyT25FcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXJSZXRyeSA9ICgpID0+IHJlc29sdmUocmV0cnkoKSk7XG4gICAgICAgICAgY29uc3QgdXNlckZhaWwgPSAoKSA9PiByZWplY3QoZXJyKTtcbiAgICAgICAgICB1c2VyT25FcnJvcihlcnIsIHVzZXJSZXRyeSwgdXNlckZhaWwsIHJldHJpZXMgKyAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkudGhlbigoY29tcCkgPT4ge1xuICAgICAgaWYgKHRoaXNSZXF1ZXN0ICE9PSBwZW5kaW5nUmVxdWVzdCAmJiBwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3Q7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY29tcCkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYEFzeW5jIGNvbXBvbmVudCBsb2FkZXIgcmVzb2x2ZWQgdG8gdW5kZWZpbmVkLiBJZiB5b3UgYXJlIHVzaW5nIHJldHJ5KCksIG1ha2Ugc3VyZSB0byByZXR1cm4gaXRzIHJldHVybi
20578B2YWx1ZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcCAmJiAoY29tcC5fX2VzTW9kdWxlIHx8IGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gXCJNb2R1bGVcIikpIHtcbiAgICAgICAgY29tcCA9IGNvbXAuZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbXAgJiYgIWlzT2JqZWN0KGNvbXApICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhc3luYyBjb21wb25lbnQgbG9hZCByZXN1bHQ6ICR7Y29tcH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmVkQ29tcCA9IGNvbXA7XG4gICAgICByZXR1cm4gY29tcDtcbiAgICB9KSk7XG4gIH07XG4gIHJldHVybiBkZWZpbmVDb21wb25lbnQoe1xuICAgIG5hbWU6IFwiQXN5bmNDb21wb25lbnRXcmFwcGVyXCIsXG4gICAgX19hc3luY0xvYWRlcjogbG9hZCxcbiAgICBnZXQgX19hc3luY1Jlc29sdmVkKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQ29tcDtcbiAgICB9LFxuICAgIHNldHVwKCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gICAgICBpZiAocmVzb2x2ZWRDb21wKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGhhbmRsZUVycm9yKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAxMyxcbiAgICAgICAgICAhZXJyb3JDb21wb25lbnRcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGlmIChkZWxheSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkZWxheWVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWQudmFsdWUgJiYgIWVycm9yLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIGxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgaW5zdGFuY2UucGFyZW50LmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZC52YWx1ZSAmJiByZXNvbHZlZENvbXApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGxvYWRpbmdDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVJbm5lckNvbXAoY29tcCwgcGFyZW50KSB7XG4gIGNvbnN0IHsgcmVmOiByZWYyLCBwcm9wcywgY2hpbGRyZW4sIGNlIH0gPSBwYXJlbnQudm5vZGU7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoY29tcCwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgdm5vZGUucmVmID0gcmVmMjtcbiAgdm5vZGUuY2UgPSBjZTtcbiAgZGVsZXRlIHBhcmVudC52bm9kZS5jZTtcbiAgcmV0dXJuIHZub2RlO1xufVxuXG5jb25zdCBpc0tlZXBBbGl2ZSA9ICh2bm9kZSkgPT4gdm5vZGUudHlwZS5fX2lzS2VlcEFsaXZlO1xuY29uc3QgS2VlcEFsaXZlSW1wbCA9IHtcbiAgbmFtZTogYEtlZXBBbGl2ZWAsXG4gIC8vIE1hcmtlciBmb3Igc3BlY2lhbCBoYW5kbGluZyBpbnNpZGUgdGhlIHJlbmRlcmVyLiBXZSBhcmUgbm90IHVzaW5nIGEgPT09XG4gIC8vIGNoZWNrIGRpcmVjdGx5IG9uIEtlZXBBbGl2ZSBpbiB0aGUgcmVuZGVyZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGl0IGRpcmVjdGx5XG4gIC8vIHdvdWxkIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0cmVlLXNoYWtlbi5cbiAgX19pc0tlZXBBbGl2ZTogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBleGNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc2hhcmVkQ29udGV4dCA9IGluc3RhbmNlLmN0eDtcbiAgICBpZiAoIXNoYXJlZENvbnRleHQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCAmJiBzbG90cy5kZWZh
20578dWx0KCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPT09IDEgPyBjaGlsZHJlblswXSA6IGNoaWxkcmVuO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLl9fdl9jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTdXNwZW5zZSA9IGluc3RhbmNlLnN1c3BlbnNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmVyOiB7XG4gICAgICAgIHA6IHBhdGNoLFxuICAgICAgICBtOiBtb3ZlLFxuICAgICAgICB1bTogX3VubW91bnQsXG4gICAgICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gICAgICB9XG4gICAgfSA9IHNoYXJlZENvbnRleHQ7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgc2hhcmVkQ29udGV4dC5hY3RpdmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICBtb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgMCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcGF0Y2goXG4gICAgICAgIGluc3RhbmNlMi52bm9kZSxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBpbnN0YW5jZTIsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaW5zdGFuY2UyLmlzRGVhY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5hKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UyLmEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZub2RlSG9vayA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLm9uVm5vZGVNb3VudGVkO1xuICAgICAgICBpZiAodm5vZGVIb29rKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgaW5zdGFuY2UyLnBhcmVudCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgc2hhcmVkQ29udGV4dC5kZWFjdGl2YXRlID0gKHZub2RlKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICBpbnZhbGlkYXRlTW91bnQoaW5zdGFuY2UyLm0pO1xuICAgICAgaW52YWxpZGF0ZU1vdW50KGluc3RhbmNlMi5hKTtcbiAgICAgIG1vdmUodm5vZGUsIHN0b3JhZ2VDb250YWluZXIsIG51bGwsIDEsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuZGEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuZGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZub2RlSG9vayA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLm9uVm5vZGVVbm1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UyLmlzRGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHVubW91bnQodm5vZGUpIHtcbiAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgIF91bm1vdW50KHZub2RlLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlKGZpbHRlcikge1xuICAgICAgY2FjaGUuZm9yRWFjaCgodm5vZGUsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh2bm9kZS50eXBlKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgKCFmaWx0ZXIgfHwgIWZpbHRlcihuYW1lKSkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeShrZXkpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKCFjdXJyZW50IHx8ICFpc1NhbWVWTm9kZVR5cGUoY2FjaGVkLCBjdXJyZW50KSkge1xuICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcmVzZXRTaGFwZUZsYWcoY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gW3Byb3BzLmluY2x1ZGUsIHByb3BzLmV4Y2x1ZGVdLFxuICAgICAgKFtpbmNsdWRlLCBleGNsdWRlXSkgPT4ge1xuICAgICAgICBpbmNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+IG1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpO1xuICAgICAgICBleGNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+ICFtYXRjaGVzKGV4Y2x1ZGUsIG5hbW
20578UpKTtcbiAgICAgIH0sXG4gICAgICAvLyBwcnVuZSBwb3N0LXJlbmRlciBhZnRlciBgY3VycmVudGAgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgeyBmbHVzaDogXCJwb3N0XCIsIGRlZXA6IHRydWUgfVxuICAgICk7XG4gICAgbGV0IHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgY29uc3QgY2FjaGVTdWJ0cmVlID0gKCkgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdDYWNoZUtleSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc1N1c3BlbnNlKGluc3RhbmNlLnN1YlRyZWUudHlwZSkpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICAgICAgfSwgaW5zdGFuY2Uuc3ViVHJlZS5zdXNwZW5zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG9uTW91bnRlZChjYWNoZVN1YnRyZWUpO1xuICAgIG9uVXBkYXRlZChjYWNoZVN1YnRyZWUpO1xuICAgIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgICBjYWNoZS5mb3JFYWNoKChjYWNoZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdWJUcmVlLCBzdXNwZW5zZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChzdWJUcmVlKTtcbiAgICAgICAgaWYgKGNhY2hlZC50eXBlID09PSB2bm9kZS50eXBlICYmIGNhY2hlZC5rZXkgPT09IHZub2RlLmtleSkge1xuICAgICAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgICAgICBjb25zdCBkYSA9IHZub2RlLmNvbXBvbmVudC5kYTtcbiAgICAgICAgICBkYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZGEsIHN1c3BlbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdW5tb3VudChjYWNoZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgICBpZiAoIXNsb3RzLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHJhd1ZOb2RlID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgS2VlcEFsaXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIGNvbXBvbmVudCBjaGlsZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgfSBlbHNlIGlmICghaXNWTm9kZShyYXdWTm9kZSkgfHwgIShyYXdWTm9kZS5zaGFwZUZsYWcgJiA0KSAmJiAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCkpIHtcbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZSA9IGdldElubmVyQ2hpbGQocmF3Vk5vZGUpO1xuICAgICAgY29uc3QgY29tcCA9IHZub2RlLnR5cGU7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgaXNBc3luY1dyYXBwZXIodm5vZGUpID8gdm5vZGUudHlwZS5fX2FzeW5jUmVzb2x2ZWQgfHwge30gOiBjb21wXG4gICAgICApO1xuICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBtYXggfSA9IHByb3BzO1xuICAgICAgaWYgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSB8fCBleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSkge1xuICAgICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICAgIHJldHVybiByYXdWTm9kZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IHZub2RlLmtleSA9PSBudWxsID8gY29tcCA6IHZub2RlLmtleTtcbiAgICAgIGNvbnN0IGNhY2hlZFZOb2RlID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAodm5vZGUuZWwpIHtcbiAgICAgICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICAgICAgaWYgKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIHJhd1ZOb2RlLnNzQ29udGVudCA9IHZub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBrZXk7XG4gICAgICBpZiAoY2FjaGVkVk5vZGUpIHtcbiAgICAgICAgdm5vZGUuZWwgPSBjYWNoZWRWTm9kZS5lbDtcbiAgICAgICAgdm5vZGUuY29tcG9uZW50ID0gY2FjaGVkVk5vZGUuY29tcG9uZW50O1xuICAgICAgICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgdm5vZGUudHJhbnNpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDUxMjtcbiAgICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICAgIGlmIChtYXggJiYga2V5cy5zaXplID4gcGFyc2VJbnQobWF4LCAxMCkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5cy52YWx1ZXMoKS5uZXh0KCkudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gMjU2O1xuICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgcmV0dXJuIGlzU3VzcGVuc2UocmF3Vk5vZGUudHlwZSkgPyByYXdWTm9kZSA6IHZub2RlO1xuICAgIH07XG4gIH1cbn07XG5jb25zdCBLZWVwQWxpdmUgPSBLZWVwQWxpdmVJbXBsO1xuZnVuY3Rpb24gbWF0Y2hlcyhwYXR0ZXJuLCBuYW1lKSB7XG4gIGlmIChpc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc29tZSgocCkgPT4gbWF0Y2hlcyhwLCBuYW1lKSk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zcGxpdChcIixcIikuaW5jbHVkZXMobmFtZSk7XG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpO1xuICB9XG4gI
20578HJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uQWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBvbkRlYWN0aXZhdGVkKGhvb2ssIHRhcmdldCkge1xuICByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgXCJkYVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIHR5cGUsIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkge1xuICBjb25zdCB3cmFwcGVkSG9vayA9IGhvb2suX193ZGMgfHwgKGhvb2suX193ZGMgPSAoKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChjdXJyZW50LmlzRGVhY3RpdmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gaG9vaygpO1xuICB9KTtcbiAgaW5qZWN0SG9vayh0eXBlLCB3cmFwcGVkSG9vaywgdGFyZ2V0KTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0LnBhcmVudDtcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudCkge1xuICAgICAgaWYgKGlzS2VlcEFsaXZlKGN1cnJlbnQucGFyZW50LnZub2RlKSkge1xuICAgICAgICBpbmplY3RUb0tlZXBBbGl2ZVJvb3Qod3JhcHBlZEhvb2ssIHR5cGUsIHRhcmdldCwgY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbmplY3RUb0tlZXBBbGl2ZVJvb3QoaG9vaywgdHlwZSwgdGFyZ2V0LCBrZWVwQWxpdmVSb290KSB7XG4gIGNvbnN0IGluamVjdGVkID0gaW5qZWN0SG9vayhcbiAgICB0eXBlLFxuICAgIGhvb2ssXG4gICAga2VlcEFsaXZlUm9vdCxcbiAgICB0cnVlXG4gICAgLyogcHJlcGVuZCAqL1xuICApO1xuICBvblVubW91bnRlZCgoKSA9PiB7XG4gICAgcmVtb3ZlKGtlZXBBbGl2ZVJvb3RbdHlwZV0sIGluamVjdGVkKTtcbiAgfSwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlc2V0U2hhcGVGbGFnKHZub2RlKSB7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+MjU2O1xuICB2bm9kZS5zaGFwZUZsYWcgJj0gfjUxMjtcbn1cbmZ1bmN0aW9uIGdldElubmVyQ2hpbGQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmIDEyOCA/IHZub2RlLnNzQ29udGVudCA6IHZub2RlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RIb29rKHR5cGUsIGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSwgcHJlcGVuZCA9IGZhbHNlKSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCBob29rcyA9IHRhcmdldFt0eXBlXSB8fCAodGFyZ2V0W3R5cGVdID0gW10pO1xuICAgIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dlaCB8fCAoaG9vay5fX3dlaCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgdGFyZ2V0LCB0eXBlLCBhcmdzKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBob29rcy51bnNoaWZ0KHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkSG9vaztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4kMShcbiAgICAgIGAke2FwaU5hbWV9IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuYCArIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC5gIClcbiAgICApO1xuICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4ge1xuICBpZiAoIWlzSW5TU1JDb21wb25lbnRTZXR1cCB8fCBsaWZlY3ljbGUgPT09IFwic3BcIikge1xuICAgIGluamVjdEhvb2sobGlmZWN5Y2xlLCAoLi4uYXJncykgPT4gaG9vayguLi5hcmdzKSwgdGFyZ2V0KTtcbiAgfVxufTtcbmNvbnN0IG9uQmVmb3JlTW91bnQgPSBjcmVhdGVIb29rKFwiYm1cIik7XG5jb25zdCBvbk1vdW50ZWQgPSBjcmVhdGVIb29rKFwibVwiKTtcbmNvbnN0IG9uQmVmb3JlVXBkYXRlID0gY3JlYXRlSG9vayhcImJ1XCIpO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIik7XG5jb25zdCBvbkJlZm9yZVVubW91bnQgPSBjcmVhdGVIb29rKFwiYnVtXCIpO1xuY29uc3Qgb25Vbm1vdW50ZWQgPSBjcmVhdGVIb29rKFwidW1cIik7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcInNwXCIpO1xuY29uc3Qgb25SZW5kZXJUcmlnZ2VyZWQgPSBjcmVhdGVIb29rKFxuICBcInJ0Z1wiXG4pO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcbiAgXCJydGNcIlxuKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgaW5qZWN0SG9vayhcImVjXCIsIGhvb2ssIHRhcmdldCk7XG59XG5cbmNvbnN0IENPTVBPTkVOVFMgPSBcImNvbXBvbmVudHNcIjtcbmNvbnN0IERJUkVDVElWRVMgPSBcImRpcmVjdGl2ZXNcIjtcbmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnQobmFtZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gIHJldHVybi
20578ByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgbmFtZSwgdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlKSB8fCBuYW1lO1xufVxuY29uc3QgTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCA9IFN5bWJvbC5mb3IoXCJ2LW5kY1wiKTtcbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICBpZiAoaXNTdHJpbmcoY29tcG9uZW50KSkge1xuICAgIHJldHVybiByZXNvbHZlQXNzZXQoQ09NUE9ORU5UUywgY29tcG9uZW50LCBmYWxzZSkgfHwgY29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb25lbnQgfHwgTlVMTF9EWU5BTUlDX0NPTVBPTkVOVDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdGl2ZShuYW1lKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQoRElSRUNUSVZFUywgbmFtZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQXNzZXQodHlwZSwgbmFtZSwgd2Fybk1pc3NpbmcgPSB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UgPSBmYWxzZSkge1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50SW5zdGFuY2U7XG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gICAgaWYgKHR5cGUgPT09IENPTVBPTkVOVFMpIHtcbiAgICAgIGNvbnN0IHNlbGZOYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxmTmFtZSAmJiAoc2VsZk5hbWUgPT09IG5hbWUgfHwgc2VsZk5hbWUgPT09IGNhbWVsaXplKG5hbWUpIHx8IHNlbGZOYW1lID09PSBjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKSkpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gKFxuICAgICAgLy8gbG9jYWwgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBjaGVjayBpbnN0YW5jZVt0eXBlXSBmaXJzdCB3aGljaCBpcyByZXNvbHZlZCBmb3Igb3B0aW9ucyBBUElcbiAgICAgIHJlc29sdmUoaW5zdGFuY2VbdHlwZV0gfHwgQ29tcG9uZW50W3R5cGVdLCBuYW1lKSB8fCAvLyBnbG9iYWwgcmVnaXN0cmF0aW9uXG4gICAgICByZXNvbHZlKGluc3RhbmNlLmFwcENvbnRleHRbdHlwZV0sIG5hbWUpXG4gICAgKTtcbiAgICBpZiAoIXJlcyAmJiBtYXliZVNlbGZSZWZlcmVuY2UpIHtcbiAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICAgIGNvbnN0IGV4dHJhID0gdHlwZSA9PT0gQ09NUE9ORU5UUyA/IGBcbklmIHRoaXMgaXMgYSBuYXRpdmUgY3VzdG9tIGVsZW1lbnQsIG1ha2Ugc3VyZSB0byBleGNsdWRlIGl0IGZyb20gY29tcG9uZW50IHJlc29sdXRpb24gdmlhIGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnQuYCA6IGBgO1xuICAgICAgd2FybiQxKGBGYWlsZWQgdG8gcmVzb2x2ZSAke3R5cGUuc2xpY2UoMCwgLTEpfTogJHtuYW1lfSR7ZXh0cmF9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGByZXNvbHZlJHtjYXBpdGFsaXplKHR5cGUuc2xpY2UoMCwgLTEpKX0gY2FuIG9ubHkgYmUgdXNlZCBpbiByZW5kZXIoKSBvciBzZXR1cCgpLmBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlKHJlZ2lzdHJ5LCBuYW1lKSB7XG4gIHJldHVybiByZWdpc3RyeSAmJiAocmVnaXN0cnlbbmFtZV0gfHwgcmVnaXN0cnlbY2FtZWxpemUobmFtZSldIHx8IHJlZ2lzdHJ5W2NhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpXSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpc3Qoc291cmNlLCByZW5kZXJJdGVtLCBjYWNoZSwgaW5kZXgpIHtcbiAgbGV0IHJldDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUgJiYgY2FjaGVbaW5kZXhdO1xuICBpZiAoaXNBcnJheShzb3VyY2UpIHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtpXSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZSkpIHtcbiAgICAgIHdhcm4kMShgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBBcnJheS5mcm9tKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIChpdGVtLCBpKSA9PiByZW5kZXJJdGVtKGl0ZW0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2Vba2V5XSwga2V5LCBpLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0ID0gW107XG4gIH1cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGVbaW5kZXhdID0gcmV0O1xuICB9XG4gI
20578HJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgIGlmIChpc0FycmF5KHNsb3QpKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsb3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc2xvdHNbc2xvdFtqXS5uYW1lXSA9IHNsb3Rbal0uZm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzbG90KSB7XG4gICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXkgPyAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBzbG90LmZuKC4uLmFyZ3MpO1xuICAgICAgICBpZiAocmVzKSByZXMua2V5ID0gc2xvdC5rZXk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IDogc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTbG90KHNsb3RzLCBuYW1lLCBwcm9wcyA9IHt9LCBmYWxsYmFjaywgbm9TbG90dGVkKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UuaXNDRSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50ICYmIGlzQXN5bmNXcmFwcGVyKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQuaXNDRSkge1xuICAgIGlmIChuYW1lICE9PSBcImRlZmF1bHRcIikgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFwic2xvdFwiLCBwcm9wcywgZmFsbGJhY2sgJiYgZmFsbGJhY2soKSk7XG4gIH1cbiAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2xvdCAmJiBzbG90Lmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiAocHJvcHMua2V5IHx8IC8vIHNsb3QgY29udGVudCBhcnJheSBvZiBhIGR5bmFtaWMgY29uZGl0aW9uYWwgc2xvdCBtYXkgaGF2ZSBhIGJyYW5jaFxuICAgICAgLy8ga2V5IGF0dGFjaGVkIGluIHRoZSBgY3JlYXRlU2xvdHNgIGhlbHBlciwgcmVzcGVjdCB0aGF0XG4gICAgICB2YWxpZFNsb3RDb250ZW50ICYmIHZhbGlkU2xvdENvbnRlbnQua2V5IHx8IGBfJHtuYW1lfWApICsgLy8gIzcyNTYgZm9yY2UgZGlmZmVyZW50aWF0ZSBmYWxsYmFjayBjb250ZW50IGZyb20gYWN0dWFsIGNvbnRlbnRcbiAgICAgICghdmFsaWRTbG90Q29udGVudCAmJiBmYWxsYmFjayA/IFwiX2ZiXCIgOiBcIlwiKVxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpIHJldHVybiB0cnVlO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50ICYmICFlbnN1cmVWYWxpZFZOb2RlKGNoaWxkLmNoaWxkcmVuKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgPyB2bm9kZXMgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0b0hhbmRsZXJzKG9iaiwgcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChvYmopKSB7XG4gICAgd2FybiQxKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSkgPyBgb246JHtrZXl9YCA6IHRvSGFuZGxlcktleShrZXkpXSA9IG9ialtrZXldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGdldFB1YmxpY0luc3RhbmNlID0gKGkpID0+IHtcbiAgaWYgKCFpKSByZXR1cm4gbnVsbDtcbiAgaWYgKGlzU3RhdGVmdWxDb21wb25lbnQoaSkpIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZShpKTtcbiAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gKFxuICAvLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuICAvLyBkdWUgdG8gdHlwZSBhbm5vdGF0aW9uXG4gIC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAkOiAoaSkgPT4gaSxcbiAgICAkZWw6IChpKSA9PiBpLnZub2RlLmVsLFxuICAgICRkYXRhOiAoaSkgPT4gaS5kYXRhLFxuICAgICRwcm9wczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzLFxuICAgICRhdHRyczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5hdHRycykgOiBpLmF0dHJzLFxuICAgICRzbG90czogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5zbG90cykgOiBpLnNsb3RzLFxuICAgICRyZWZzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzLFxuICAgICRwYXJlbnQ6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCksXG4gICAgJHJvb3Q6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0L
20578FxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4ge1xuICAgICAgaS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgcXVldWVKb2IoaS51cGRhdGUpO1xuICAgIH0pLFxuICAgICRuZXh0VGljazogKGkpID0+IGkubiB8fCAoaS5uID0gbmV4dFRpY2suYmluZChpLnByb3h5KSksXG4gICAgJHdhdGNoOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1BcbiAgfSlcbik7XG5jb25zdCBpc1Jlc2VydmVkUHJlZml4ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJFwiO1xuY29uc3QgaGFzU2V0dXBCaW5kaW5nID0gKHN0YXRlLCBrZXkpID0+IHN0YXRlICE9PSBFTVBUWV9PQkogJiYgIXN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc3RhdGUsIGtleSk7XG5jb25zdCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSB7XG4gIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiX192X3NraXBcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlLCBkYXRhLCBwcm9wcywgYWNjZXNzQ2FjaGUsIHR5cGUsIGFwcENvbnRleHQgfSA9IGluc3RhbmNlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCJfX2lzVnVlXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBuID0gYWNjZXNzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChuICE9PSB2b2lkIDApIHtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAxIC8qIFNFVFVQICovOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgICAgICBjYXNlIDIgLyogREFUQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICAgICAgY2FzZSA0IC8qIENPTlRFWFQgKi86XG4gICAgICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICAgICAgY2FzZSAzIC8qIFBST1BTICovOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDEgLyogU0VUVVAgKi87XG4gICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMiAvKiBEQVRBICovO1xuICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gb25seSBjYWNoZSBvdGhlciBwcm9wZXJ0aWVzIHdoZW4gaW5zdGFuY2UgaGFzIGRlY2xhcmVkICh0aHVzIHN0YWJsZSlcbiAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgKG5vcm1hbGl6ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAzIC8qIFBST1BTICovO1xuICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICB9IGVsc2UgaWYgKCFfX1ZVRV9PUFRJT05TX0FQSV9fIHx8IHNob3VsZENhY2hlQWNjZXNzKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAwIC8qIE9USEVSICovO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwdWJsaWNHZXR0ZXIgPSBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV07XG4gICAgbGV0IGNzc01vZHVsZSwgZ2xvYmFsUHJvcGVydGllcztcbiAgICBpZiAocHVibGljR2V0dGVyKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRhdHRyc1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLmF0dHJzLCBcImdldFwiLCBcIlwiKTtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCIkc2xvdHNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNHZXR0ZXIoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBjc3MgbW9kdWxlIChpbmplY3RlZCBieSB2dWUtbG9hZGVyKVxuICAgICAgKGNzc01vZHVsZSA9IHR5cGUuX19jc3NNb2R1bGVzKSAmJiAoY3NzTW9kdWxlID0gY3NzTW9kdWxlW2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3NzTW9kdWxlO1xuICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgIGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBoYXNPd24oZ2xvYmFsUHJvcGVydGllcywga2V5KVxuICAgICkge1xuICAgICAge1xuICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiYgKCFpc1N0cmluZyhrZXkpIHx8IC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAga2V5LmluZGV4T2YoXCJfX3ZcIikgIT09IDApKSB7XG4gICAgICBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBtdXN0IGJlIGFjY2Vzc2VkIHZpYSAkZGF0YSBiZWNhdXNlIGl0IHN0YXJ0cyB3aXRoIGEgcmVzZXJ2ZWQgY2hhcmFjdGVyIChcIiRcIiBvciBcIl9cIikgYW5kIGlzIG5vdCBwcm94aWVkIG9uIHRoZSByZW5kZXIgY29udGV4dC5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlID09PSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KGtleSl9IHdhcyBhY2Nlc3NlZCBkdXJpbmcgcmVuZGVyIGJ1dCBpcyBub3QgZGVmaW5lZCBvbiBpbnN0YW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzZXQoeyBfOiBpbnN0YW5jZSB9LCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgeyBkYXRhLCBzZXR1cFN0YXRlLCBjdHggfSA9IGluc3RhbmNlO1xuICAgIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgc2V0dXBTdGF0ZVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgIHdhcm4kMShgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgIHJldHVybi
20578BmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc093bihpbnN0YW5jZS5wcm9wcywga2V5KSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHByb3AgXCIke2tleX1cIi4gUHJvcHMgYXJlIHJlYWRvbmx5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoa2V5WzBdID09PSBcIiRcIiAmJiBrZXkuc2xpY2UoMSkgaW4gaW5zdGFuY2UpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHVibGljIHByb3BlcnR5IFwiJHtrZXl9XCIuIFByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCAkIGFyZSByZXNlcnZlZCBhbmQgcmVhZG9ubHkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHhba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgaGFzKHtcbiAgICBfOiB7IGRhdGEsIHNldHVwU3RhdGUsIGFjY2Vzc0NhY2hlLCBjdHgsIGFwcENvbnRleHQsIHByb3BzT3B0aW9ucyB9XG4gIH0sIGtleSkge1xuICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgcmV0dXJuICEhYWNjZXNzQ2FjaGVba2V5XSB8fCBkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkgfHwgaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkgfHwgKG5vcm1hbGl6ZWRQcm9wcyA9IHByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KSB8fCBoYXNPd24oY3R4LCBrZXkpIHx8IGhhc093bihwdWJsaWNQcm9wZXJ0aWVzTWFwLCBrZXkpIHx8IGhhc093bihhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBrZXkpO1xuICB9LFxuICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICAgIGlmIChkZXNjcmlwdG9yLmdldCAhPSBudWxsKSB7XG4gICAgICB0YXJnZXQuXy5hY2Nlc3NDYWNoZVtrZXldID0gMDtcbiAgICB9IGVsc2UgaWYgKGhhc093bihkZXNjcmlwdG9yLCBcInZhbHVlXCIpKSB7XG4gICAgICB0aGlzLnNldCh0YXJnZXQsIGtleSwgZGVzY3JpcHRvci
2057852YWx1ZSwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufTtcbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUpIHtcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLm93bktleXMgPSAodGFyZ2V0KSA9PiB7XG4gICAgd2FybiQxKFxuICAgICAgYEF2b2lkIGFwcCBsb2dpYyB0aGF0IHJlbGllcyBvbiBlbnVtZXJhdGluZyBrZXlzIG9uIGEgY29tcG9uZW50IGluc3RhbmNlLiBUaGUga2V5cyB3aWxsIGJlIGVtcHR5IGluIHByb2R1Y3Rpb24gbW9kZSB0byBhdm9pZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC5gXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH07XG59XG5jb25zdCBSdW50aW1lQ29tcGlsZWRQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLFxuICB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gICAgfSxcbiAgICBoYXMoXywga2V5KSB7XG4gICAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIF8gd2hpY2ggaXMgYSByZXNlcnZlZCBwcmVmaXggZm9yIFZ1ZSBpbnRlcm5hbHMuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcztcbiAgICB9XG4gIH1cbik7XG5mdW5jdGlvbiBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHRhcmdldCA9IHt9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBgX2AsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiAoKSA9PiBpbnN0YW5jZVxuICB9KTtcbiAgT2JqZWN0LmtleXMocHVibGljUHJvcGVydGllc01hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogKCkgPT4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKSxcbiAgICAgIC8vIGludGVyY2VwdGVkIGJ5IHRoZSBwcm94eSBzbyBubyBuZWVkIGZvciBpbXBsZW1lbnRhdGlvbixcbiAgICAgIC8vIGJ1dCBuZWVkZWQgdG8gcHJldmVudCBzZXQgZXJyb3JzXG4gICAgICBzZXQ6IE5PT1BcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBleHBvc2VQcm9wc09uUmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgY3R4LFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgfSA9IGluc3RhbmNlO1xuICBpZiAocHJvcHNPcHRpb25zKSB7XG4gICAgT2JqZWN0LmtleXMocHJvcHNPcHRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gaW5zdGFuY2UucHJvcHNba2V5XSxcbiAgICAgICAgc2V0OiBOT09QXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSB9ID0gaW5zdGFuY2U7XG4gIE9iamVjdC5rZXlzKHRvUmF3KHNldHVwU3RhdGUpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIXNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgc2V0dXAoKSByZXR1cm4gcHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBcIiRcIiBvciBcIl9cIiB3aGljaCBhcmUgcmVzZXJ2ZWQgcHJlZml4ZXMgZm9yIFZ1ZSBpbnRlcm5hbHMuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHNldHVwU3RhdGVba2V5XSxcbiAgICAgICAgc2V0OiBOT09QXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB3YXJuUnVudGltZVVzYWdlID0gKG1ldGhvZCkgPT4gd2FybiQxKFxuICBgJHttZXRob2R9KCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSA8c2NyaXB0IHNldHVwPiBvZiBhIHNpbmdsZSBmaWxlIGNvbXBvbmVudC4gSXRzIGFyZ3VtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgYXdheSBhbmQgcGFzc2luZyBpdCBhdCBydW50aW1lIGhhcyBubyBlZmZlY3QuYFxuKTtcbmZ1bmN0aW9uIGRlZmluZVByb3BzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVByb3BzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFbWl0cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFbWl0c2ApO1xuICB9XG4gI
20578HJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRXhwb3NlKGV4cG9zZWQpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFeHBvc2VgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lT3B0aW9ucyhvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lT3B0aW9uc2ApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVTbG90cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVTbG90c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lTW9kZWwoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShcImRlZmluZU1vZGVsXCIpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocHJvcHMsIGRlZmF1bHRzKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgd2l0aERlZmF1bHRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTbG90cygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5zbG90cztcbn1cbmZ1bmN0aW9uIHVzZUF0dHJzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLmF0dHJzO1xufVxuZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4kMShgdXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgfVxuICByZXR1cm4gaS5zZXR1cENvbnRleHQgfHwgKGkuc2V0dXBDb250ZXh0ID0gY3JlYXRlU2V0dXBDb250ZXh0KGkpKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhwcm9wcykge1xuICByZXR1cm4gaXNBcnJheShwcm9wcykgPyBwcm9wcy5yZWR1Y2UoXG4gICAgKG5vcm1hbGl6ZWQsIHApID0+IChub3JtYWxpemVkW3BdID0gbnVsbCwgbm9ybWFsaXplZCksXG4gICAge31cbiAgKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWZhdWx0cyhyYXcsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHByb3BzID0gbm9ybWFsaXplUHJvcHNPckVtaXRzKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiX19za2lwXCIpKSBjb250aW51ZTtcbiAgICBsZXQgb3B0ID0gcHJvcHNba2V5XTtcbiAgICBpZiAob3B0KSB7XG4gICAgICBpZiAoaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSkge1xuICAgICAgICBvcHQgPSBwcm9wc1trZXldID0geyB0eXBlOiBvcHQsIGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdC5kZWZhdWx0ID0gZGVmYXVsdHNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdCA9PT0gbnVsbCkge1xuICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm9wcyBkZWZhdWx0IGtleSBcIiR7a2V5fVwiIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLmApO1xuICAgIH1cbiAgICBpZiAob3B0ICYmIGRlZmF1bHRzW2BfX3NraXBfJHtrZXl9YF0pIHtcbiAgICAgIG9wdC5za2lwRmFjdG9yeSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlTW9kZWxzKGEsIGIpIHtcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gYSB8fCBiO1xuICBpZiAoaXNBcnJheShhKSAmJiBpc0FycmF5KGIpKSByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4kMShcbiAgICAgIGB3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpc1Byb21pc2UoYXdhaXRhYmxlKSkge1xuICAgIGF3YWl0YWJsZSA9IGF3YWl0YWJsZS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGN0eCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBbYXdhaXRhYmxlLCAoKSA9PiBzZXRDdXJyZW50SW5zdGFuY2UoY3R4KV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAodHlwZSwga2V5KSA9PiB7XG4gICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgIHdhcm4kMShgJHt0eXBlfSBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAke2NhY2hlW2tleV19LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVtrZXldID0gdHlwZTtcbiAgICB9XG4gI
20578H07XG59XG5sZXQgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuZnVuY3Rpb24gYXBwbHlPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSk7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgY3R4ID0gaW5zdGFuY2UuY3R4O1xuICBzaG91bGRDYWNoZUFjY2VzcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5iZWZvcmVDcmVhdGUpIHtcbiAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIC8vIHN0YXRlXG4gICAgZGF0YTogZGF0YU9wdGlvbnMsXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkT3B0aW9ucyxcbiAgICBtZXRob2RzLFxuICAgIHdhdGNoOiB3YXRjaE9wdGlvbnMsXG4gICAgcHJvdmlkZTogcHJvdmlkZU9wdGlvbnMsXG4gICAgaW5qZWN0OiBpbmplY3RPcHRpb25zLFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIGNyZWF0ZWQsXG4gICAgYmVmb3JlTW91bnQsXG4gICAgbW91bnRlZCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgdXBkYXRlZCxcbiAgICBhY3RpdmF0ZWQsXG4gICAgZGVhY3RpdmF0ZWQsXG4gICAgYmVmb3JlRGVzdHJveSxcbiAgICBiZWZvcmVVbm1vdW50LFxuICAgIGRlc3Ryb3llZCxcbiAgICB1bm1vdW50ZWQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlclRyYWNrZWQsXG4gICAgcmVuZGVyVHJpZ2dlcmVkLFxuICAgIGVycm9yQ2FwdHVyZWQsXG4gICAgc2VydmVyUHJlZmV0Y2gsXG4gICAgLy8gcHVibGljIEFQSVxuICAgIGV4cG9zZSxcbiAgICBpbmhlcml0QXR0cnMsXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGZpbHRlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkgOiBudWxsO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzT3B0aW9ucykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIFBST1BTICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5qZWN0T3B0aW9ucykge1xuICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKTtcbiAgfVxuICBpZiAobWV0aG9kcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eFtrZXldID0gbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGRhdGEgZmV0Y2hpbmcgYmVmb3JlIGNvbXBvbmVudCByZW5kZXJzLCB1c2UgYXN5bmMgc2V0dXAoKSArIDxTdXNwZW5zZT4uYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJv
20578cGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybiQxKGBDb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGhhcyBubyBnZXR0ZXIuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSAhaXNGdW5jdGlvbihvcHQpICYmIGlzRnVuY3Rpb24ob3B0LnNldCkgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcykgOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYFxuICAgICAgICApO1xuICAgICAgfSA6IE5PT1A7XG4gICAgICBjb25zdCBjID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGMudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGMudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkNvbXB1dGVkXCIgLyogQ09NUFVURUQgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh3YXRjaE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB3YXRjaE9wdGlvbnMpIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIod2F0Y2hPcHRpb25zW2tleV0sIGN0eCwgcHVibGljVGhpcywga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3ZpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpc0Z1bmN0aW9uKHByb3ZpZGVPcHRpb25zKSA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcykgOiBwcm92aWRlT3B0aW9ucztcbiAgICBSZWZsZWN0Lm93bktleXMocHJvdmlkZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChjcmVhdGVkKSB7XG4gICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaG9vay5mb3JFYWNoKChfaG9vaykgPT4gcmVnaXN0ZXIoX2hvb2suYmluZChwdWJsaWNUaGlzKSkpO1xuICAgIH0gZWxzZSBpZiAoaG9vaykge1xuICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlTW91bnQsIGJlZm9yZU1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uTW91bnRlZCwgbW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVXBkYXRlZCwgdXBkYXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkFjdGl2YXRlZCwgYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRXJyb3JDYXB0dXJlZCwgZXJyb3JDYXB0dXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyYWNrZWQsIHJlbmRlclRyYWNrZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVubW91bnQsIGJlZm9yZVVubW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Vbm1vdW50ZWQsIHVubW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gIGlmIChpc0FycmF5KGV4cG9zZSkpIHtcbiAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICBleHBvc2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHB1YmxpY1RoaXNba2V5XSxcbiAgICAgICAgICBzZXQ6ICh2YWwpID0+IHB1YmxpY1RoaXNba2V5XSA9IHZhbFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmV4cG9zZWQgPSB7fTtcbiAgICB9XG4gI
20578H1cbiAgaWYgKHJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1ApIHtcbiAgICBpbnN0YW5jZS5yZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgaW5zdGFuY2UuaW5oZXJpdEF0dHJzID0gaW5oZXJpdEF0dHJzO1xuICB9XG4gIGlmIChjb21wb25lbnRzKSBpbnN0YW5jZS5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgaWYgKGRpcmVjdGl2ZXMpIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBjb25zdCBnZXR0ZXIgPSBrZXkuaW5jbHVkZXMoXCIuXCIpID8gY3JlYXRlUGF0aEdldHRlcihwdWJsaWNUaGlzLCBrZXkpIDogKCkgPT4gcHVibGljVGhpc1trZXldO1xuICBpZiAoaXNTdHJpbmcocmF3KSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBjdHhbcmF3XTtcbiAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhd31cImAsIGhhbmRsZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHJhdykpIHtcbiAgICB3YXRjaChnZXR0ZXIsIHJhdy5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChyYXcpKSB7XG4gICAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgICAgcmF3LmZvckVhY2goKHIpID0+IGNyZWF0ZVdhdGNoZXIociwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGlzRnVuY3Rpb24ocmF3LmhhbmRsZXIpID8gcmF3LmhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSA6IGN0eFtyYXcuaGFuZGxlcl07XG4gICAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgICB3YXRjaChnZXR0ZXIsIGhhbmRsZXIsIHJhdyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgd2FybiQxKGBJbnZhbGlkIHdhdGNoIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IGtleSBcIiR7cmF3LmhhbmRsZXJ9XCJgLCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBvcHRpb246IFwiJHtrZXl9XCJgLCByYXcpO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBiYXNlID0gaW5zdGFuY2UudHlwZTtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBiYXNlO1xuICBjb25zdCB7XG4gICAgbWl4aW5zOiBnbG9iYWxNaXhpbnMsXG4gICAgb3B0aW9uc0NhY2hlOiBjYWNoZSxcbiAgICBjb25maWc6IHsgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzIH1cbiAgfSA9IGluc3RhbmNlLmFwcENvbnRleHQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChiYXNlKTtcbiAgbGV0IHJlc29sdmVkO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmVzb2x2ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSBpZiAoIWdsb2JhbE1peGlucy5sZW5ndGggJiYgIW1peGlucyAmJiAhZXh0ZW5kc09wdGlvbnMpIHtcbiAgICB7XG4gICAgICByZXNvbHZlZCA9IGJhc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc29sdmVkID0ge307XG4gICAgaWYgKGdsb2JhbE1peGlucy5sZW5ndGgpIHtcbiAgICAgIGdsb2JhbE1peGlucy5mb3JFYWNoKFxuICAgICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBtLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMsIHRydWUpXG4gICAgICApO1xuICAgIH1cbiAgICBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIGJhc2UsIG9wdGlvbk1lcmdlU3RyYXRlZ2llcyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGJhc2UpKSB7XG4gICAgY2FjaGUuc2V0KGJhc2UsIHJlc29sdmVkKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5mdW5jdGlvbiBtZXJnZU9wdGlvbnModG8sIGZyb20sIHN0cmF0cywgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gZnJvbTtcbiAgaWYgKGV4dGVuZHNPcHRpb25zKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBleHRlbmRzT3B0aW9ucywgc3RyYXRzLCB0cnVlKTtcbiAgfVxuICBpZiAobWl4aW5zKSB7XG4gICAgbWl4aW5zLmZvckVhY2goXG4gICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHRvLCBtLCBzdHJhdHMsIHRydWUpXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgaWYgKGFzTWl4aW4gJiYga2V5ID09PSBcImV4cG9zZVwiKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYFwiZXhwb3NlXCIgb3B0aW9uIGlzIGlnbm9yZWQgd2hlbiBkZWNsYXJlZCBpbiBtaXhpbnMgb3IgZXh0ZW5kcy4gSXQgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQgaW4gdGhlIGJhc2UgY29tcG9uZW50IGl0c2VsZi5gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdHJhdCA9IGludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHNba2V5XSB8fCBzdHJhdHMgJiYgc3RyYXRzW2tleV07XG4gICAgICB0b1trZXldID0gc3RyYXQgPyBzdHJhdCh0b1trZXldLCBmcm9tW2tleV0pIDogZnJvbVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG87XG59XG5jb25zdCBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzID0ge1xuICBkYXRhOiBtZXJnZURhdGFGbixcbiAgcHJvcHM6IG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyxcbiAgZW1pdHM6IG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyxcbiAgLy8gb2JqZWN0c1xuICBtZXRob2RzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIGNvbXB1dGVkOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIGxpZmVjeWNsZVxuICBiZWZvcmVDcmVhdGU6IG1lcmdlQXNBcnJheSxcbiAgY3JlYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVNb3VudDogbWVyZ2VBc0FycmF5LFxuICBtb3VudGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVwZGF0ZTogbWVyZ2VBc0FycmF5LFxuICB1cGRhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZURlc3Ryb3k6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlVW5tb3VudDogbWVyZ2VBc0FycmF5LFxuICBkZXN0cm95ZWQ6IG1lcmdlQXNBcnJheSxcbiAgdW5tb3VudGVkOiBtZXJnZUFzQXJyYXksXG4gIGFjdGl2YXRlZDogbWVyZ2VBc0FycmF5LFxuICBkZWFjdGl2YXRlZDogbWVyZ2VBc0FycmF5LFxuICBlcnJvckNhcHR1cmVkOiBtZXJnZUFzQXJyYXksXG4gIHNlcnZlclByZWZldGNoOiBtZXJnZUFzQXJyYXksXG4gIC8vIGFzc2V0c1xuICBjb21wb25lbnRzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIGRpcmVjdGl2ZXM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgLy8gd2F0Y2hcbiAgd2F0Y2g6IG1lcmdlV2F0Y2hPcHRpb25zLFxuICAvLyBwcm92aWRlIC8gaW5qZWN0XG4gIHByb3ZpZGU6IG1lcmdlRGF0YUZuLFxuICBpbmplY3Q6IG1lcmdlSW5qZWN0XG59O1xuZnVuY3Rpb24gbWVyZ2VEYXRhRm4odG8sIGZyb20pIHtcbiAgaWYgKCFmcm9tKSB7XG4gICAgcmV0dXJuIHRvO1xuICB9XG4gIGlmICghdG8pIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuKCkge1xuICAgIHJldHVybiAoZXh0ZW5kKShcbiAgICAgIGlzRnVuY3Rpb24odG8pID8gdG8uY2FsbCh0aGlzLCB0aGlzKSA6IHRvLFxuICAgICAgaXNGdW5jdGlvbihmcm9tKSA/IGZyb20uY2FsbCh0aGlzLCB0aGlzKSA6IGZyb21cbiAgICApO1xuICB9O1xufVxuZnVuY3Rpb24gbWVyZ2VJbmplY3QodG8sIGZyb20pIHtcbiAgcmV0dXJuIG1lcmdlT2JqZWN0T3B0aW9ucyhub3JtYWxpemVJbmplY3QodG8pLCBub3JtYWxpemVJbmplY3QoZnJvbSkpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplSW5qZWN0KHJhdykge1xuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc1tyYXdbaV1dID0gcmF3W2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5mdW5jdGlvbiBtZXJnZUFzQXJyYXkodG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gWy4uLm5ldyBTZXQoW10uY29uY2F0KHRvLCBmcm9tKSldIDogZnJvbTtcbn1cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0T3B0aW9ucyh0bywgZnJvbSkge1xuICByZXR1cm4gdG8gPyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRvLCBmcm9tKSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKHRvKSB7XG4gICAgaWYgKGlzQXJyYXkodG8pICYmIGlzQXJyYXkoZnJvbSkpIHtcbiAgICAgIHJldHVybiBbLi4uLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWy4uLnRvLCAuLi5mcm9tXSldO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5kKFxuICAgICAgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICBub3JtYWxpemVQcm9wc09yRW1pdHModG8pLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKGZyb20gIT0gbnVsbCA/IGZyb20gOiB7fSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmcm9tO1xuICB9XG59XG5mdW5jdGlvbiBtZXJnZVdhdGNoT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAoIXRvKSByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKSByZXR1cm4gdG87XG4gIGNvbnN0IG1lcmdlZCA9IGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8pO1xuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgbWVyZ2VkW2tleV0gPSBtZXJnZUFzQXJyYXkodG9ba2V5XSwgZnJvbVtrZXldKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcHBDb250ZXh0KCkge1xuICByZXR1cm4ge1xuICAgIGFwcDogbnVsbCxcbiAgICBjb25maWc6IHtcbiAgICAgIGlzTmF0aXZlVGFnOiBOTyxcbiAgICAgIHBlcmZvcm1hbmNlOiBmYWxzZSxcbiAgICAgIGdsb2JhbFByb3BlcnRpZXM6IHt9LFxuICAgICAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiB7fSxcbiAgICAgIGVycm9ySGFuZGxlcjogdm9pZCAwLFxuICAgICAgd2FybkhhbmRsZXI6IHZvaWQgMCxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge31cbiAgICB9LFxuICAgIG1peGluczogW10sXG4gICAgY29tcG9uZW50czoge30sXG4gICAgZGlyZWN0aXZlczoge30sXG4gICAgcHJvdmlkZXM6IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgIG9wdGlvbnNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgcHJvcHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgZW1pdHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKClcbiAgfTtcbn1cbmxldCB1aWQkMSA9IDA7XG5mdW5jdGlvbiBjcmVhdGVBcHBBUEkocmVuZGVyLCBoeWRyYXRlKSB7XG4gIHJldHVybi
20578BmdW5jdGlvbiBjcmVhdGVBcHAocm9vdENvbXBvbmVudCwgcm9vdFByb3BzID0gbnVsbCkge1xuICAgIGlmICghaXNGdW5jdGlvbihyb290Q29tcG9uZW50KSkge1xuICAgICAgcm9vdENvbXBvbmVudCA9IGV4dGVuZCh7fSwgcm9vdENvbXBvbmVudCk7XG4gICAgfVxuICAgIGlmIChyb290UHJvcHMgIT0gbnVsbCAmJiAhaXNPYmplY3Qocm9vdFByb3BzKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYHJvb3QgcHJvcHMgcGFzc2VkIHRvIGFwcC5tb3VudCgpIG11c3QgYmUgYW4gb2JqZWN0LmApO1xuICAgICAgcm9vdFByb3BzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbiAgICBjb25zdCBpbnN0YWxsZWRQbHVnaW5zID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG4gICAgbGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFwcCA9IGNvbnRleHQuYXBwID0ge1xuICAgICAgX3VpZDogdWlkJDErKyxcbiAgICAgIF9jb21wb25lbnQ6IHJvb3RDb21wb25lbnQsXG4gICAgICBfcHJvcHM6IHJvb3RQcm9wcyxcbiAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9pbnN0YW5jZTogbnVsbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jb25maWc7XG4gICAgICB9LFxuICAgICAgc2V0IGNvbmZpZyh2KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYFBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChwbHVnaW4gJiYgaXNGdW5jdGlvbihwbHVnaW4uaW5zdGFsbCkpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbi5pbnN0YWxsKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihwbHVnaW4pKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4oYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IHdpdGggYW4gXCJpbnN0YWxsXCIgZnVuY3Rpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBtaXhpbihtaXhpbikge1xuICAgICAgICBpZiAoX19WVUVfT1BUSU9OU19BUElfXykge1xuICAgICAgICAgIGlmICghY29udGV4dC5taXhpbnMuaW5jbHVkZXMobWl4aW4pKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm1peGlucy5wdXNoKG1peGluKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiTWl4aW5zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBidWlsZHMgc3VwcG9ydGluZyBPcHRpb25zIEFQSVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudChuYW1lLCBjb21wb25lbnQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29udGV4dC5jb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgZGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdKSB7XG4gICAgICAgICAgd2FybiQxKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgI
20578H1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGlmICghaXNNb3VudGVkKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXykge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIGNsb25lVk5vZGUodm5vZGUpLFxuICAgICAgICAgICAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgYXBwLl9jb250YWluZXIgPSByb290Q29udGFpbmVyO1xuICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSh2bm9kZS5jb21wb25lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCkge1xuICAgICAgICAgIHJlbmRlcihudWxsLCBhcHAuX2NvbnRhaW5lcik7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIGRldnRvb2xzVW5tb3VudEFwcChhcHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYXBwLl9jb250YWluZXIuX192dWVfYXBwX187XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgQ2Fubm90IHVubW91bnQgYW4gYXBwIHRoYXQgaXMgbm90IG1vdW50ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGNvbnRleHQucHJvdmlkZXMpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjb25zdCBsYXN0QXBwID0gY3VycmVudEFwcDtcbiAgICAgICAgY3VycmVudEFwcCA9IGFwcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50QXBwID0gbGFzdEFwcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbiAgfTtcbn1cbmxldCBjdXJyZW50QXBwID0gbnVsbDtcblxuZnVuY3Rpb24gcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gIGlmICghY3VycmVudEluc3RhbmNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UgfHwgY3VycmVudEFwcCkge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXM7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZh
20578dWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYGluamVjdGlvbiBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy5gKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzSW5qZWN0aW9uQ29udGV4dCgpIHtcbiAgcmV0dXJuICEhKGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEFwcCk7XG59XG5cbmNvbnN0IGludGVybmFsT2JqZWN0UHJvdG8gPSB7fTtcbmNvbnN0IGNyZWF0ZUludGVybmFsT2JqZWN0ID0gKCkgPT4gT2JqZWN0LmNyZWF0ZShpbnRlcm5hbE9iamVjdFByb3RvKTtcbmNvbnN0IGlzSW50ZXJuYWxPYmplY3QgPSAob2JqKSA9PiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gaW50ZXJuYWxPYmplY3RQcm90bztcblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IGNyZWF0ZUludGVybmFsT2JqZWN0KCk7XG4gIGluc3RhbmNlLnByb3BzRGVmYXVsdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb3BzKSkge1xuICAgICAgcHJvcHNba2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzIHx8IHt9LCBwcm9wcywgaW5zdGFuY2UpO1xuICB9XG4gIGlmIChpc1N0YXRlZnVsKSB7XG4gICAgaW5zdGFuY2UucHJvcHMgPSBpc1NTUiA/IHByb3BzIDogc2hhbGxvd1JlYWN0aXZlKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWluc3RhbmNlLnR5cGUucHJvcHMpIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmF0dHJzID0gYXR0cnM7XG59XG5mdW5jdGlvbiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkge1xuICB3aGlsZSAoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX2htcklkKSByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgIC
20578FoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UuYXR0cnMsIFwic2V0XCIsIFwiXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgI
20578HZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0WzAgLyogc2hvdWxkQ2FzdCAqL10pIHtcbiAgICAgIGlmIChpc0Fic2VudCAmJiAhaGFzRGVmYXVsdCkge1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvcHRbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gJiYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBtaXhpblByb3BzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBfX1ZVRV9PUFRJT05TX0FQSV9fICYmIGFzTWl4aW4gPyBtaXhpblByb3BzQ2FjaGUgOiBhcHBDb250ZXh0LnByb3BzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5wcm9wcztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBjb25zdCBuZWVkQ2FzdEtleXMgPSBbXTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRQcm9wcyA9IChyYXcyKSA9PiB7XG4gICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IFtwcm9wcywga2V5c10gPSBub3JtYWxpemVQcm9wc09wdGlvbnMocmF3MiwgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICBleHRlbmQobm9ybWFsaXplZCwgcHJvcHMpO1xuICAgICAgaWYgKGtleXMpIG5lZWRDYXN0S2V5cy5wdXNoKC4uLmtleXMpO1xuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZFByb3BzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRQcm9wcyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgRU1QVFlfQVJSKTtcbiAgICB9XG4gICAgcmV0dXJuIEVNUFRZX0FSUjtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc1N0cmluZyhyYXdbaV0pKSB7XG4gICAgICAgIHdhcm4kMShgcHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LmAsIHJhd1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUocmF3W2ldKTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHJhdykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChyYXcpKSB7XG4gICAgICB3YXJuJDEoYGludmFsaWQgcHJvcHMgb3B0aW9uc2AsIHJhdyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHJhdykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKGtleSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBjb25zdCBvcHQgPSByYXdba2V5XTtcbiAgICAgICAgY29uc3QgcHJvcCA9IG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpID8geyB0eXBlOiBvcHQgfSA6IGV4dGVuZCh7fSwgb3B0KTtcbiAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICBjb25zdCBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdJbmRleCA9IGdldFR5cGVJbmRleChTdHJpbmcsIHByb3AudHlwZSk7XG4gICAgICAgICAgcHJvcFswIC8qIHNob3VsZENhc3QgKi9dID0gYm9vbGVhbkluZGV4ID4gLTE7XG4gICAgICAgICAgcHJvcFsxIC8qIHNob3VsZENhc3RUcnVlICovXSA9IHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleDtcbiAgICAgICAgICBpZiAoYm9vbGVhbkluZGV4ID4gLTEgfHwgaGFzT3duKHByb3AsIFwiZGVmYXVsdFwiKSkge1xuICAgICAgICAgICAgbmVlZENhc3RLZXlzLnB1c2gobm9ybWFsaXplZEtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlcyA9IFtub3JtYWxpemVkLCBuZWVkQ2FzdEtleXNdO1xuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgcmVzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wTmFtZShrZXkpIHtcbiAgaWYgKGtleVswXSAhPT0gXCIkXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBJbnZhbGlkIHByb3AgbmFtZTogXCIke2tleX1cIiBpcyBhIHJlc2VydmVkIHByb3BlcnR5LmApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFR5cGUoY3Rvcikge1xuICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBpZiAodHlwZW9mIGN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybi
20578BjdG9yLm5hbWUgfHwgXCJcIjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY3RvciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG5hbWUgPSBjdG9yLmNvbnN0cnVjdG9yICYmIGN0b3IuY29uc3RydWN0b3IubmFtZTtcbiAgICByZXR1cm4gbmFtZSB8fCBcIlwiO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuZnVuY3Rpb24gaXNTYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGlzQXJyYXkoZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgoKHQpID0+IGlzU2FtZVR5cGUodCwgdHlwZSkpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbCkgY29udGludWU7XG4gICAgdmFsaWRhdGVQcm9wKFxuICAgICAga2V5LFxuICAgICAgcmVzb2x2ZWRWYWx1ZXNba2V5XSxcbiAgICAgIG9wdCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocmVzb2x2ZWRWYWx1ZXMpIDogcmVzb2x2ZWRWYWx1ZXMsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgcHJvcHMsIGlzQWJzZW50KSB7XG4gIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciwgc2tpcENoZWNrIH0gPSBwcm9wO1xuICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICB3YXJuJDEoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuJDEoZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSwgcHJvcHMpKSB7XG4gICAgd2FybiQxKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyk7XG4gIH1cbn1cbmNvbnN0IGlzU2ltcGxlVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50XCJcbik7XG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIGxldCB2YWxpZDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKGlzU2ltcGxlVHlwZShleHBlY3RlZFR5cGUpKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdmFsaWQgJiYgdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJPYmplY3RcIikge1xuICAgIHZhbGlkID0gaXNPYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgdmFsaWQgPSBpc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgdmFsaWQgPSB2YWx1ZSA9PT0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkLFxuICAgIGV4cGVjdGVkVHlwZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUHJvcCB0eXBlIFtdIGZvciBwcm9wIFwiJHtuYW1lfVwiIHdvbid0IG1hdGNoIGFueXRoaW5nLiBEaWQgeW91IG1lYW4gdG8gdXNlIHR5cGUgQXJyYXkgaW5zdGVhZD9gO1xuICB9XG4gIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuIEV4cGVjdGVkICR7ZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbihcIiB8IFwiKX1gO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICBjb25zdCByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJi
20578Bpc0V4cGxpY2FibGUoZXhwZWN0ZWRUeXBlKSAmJiAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoZWxlbSkgPT4gZWxlbS50b0xvd2VyQ2FzZSgpID09PSBcImJvb2xlYW5cIik7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXlbMF0gPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkc3RhYmxlXCI7XG5jb25zdCBub3JtYWxpemVTbG90VmFsdWUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZOb2RlKSA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICBpZiAocmF3U2xvdC5fbikge1xuICAgIHJldHVybiByYXdTbG90O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRoQ3R4KCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudEluc3RhbmNlICYmICghY3R4IHx8IGN0eC5yb290ID09PSBjdXJyZW50SW5zdGFuY2Uucm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFNsb3QgXCIke2tleX1cIiBpbnZva2VkIG91dHNpZGUgb2YgdGhlIHJlbmRlciBmdW5jdGlvbjogdGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gSW52b2tlIHRoZSBzbG90IGZ1bmN0aW9uIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNsb3RWYWx1ZShyYXdTbG90KC4uLmFyZ3MpKTtcbiAgfSwgY3R4KTtcbiAgbm9ybWFsaXplZC5fYyA9IGZhbHNlO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBub3JtYWxpemVPYmplY3RTbG90cyA9IChyYXdTbG90cywgc2xvdHMsIGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHJhd1Nsb3RzLl9jdHg7XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Nsb3RzKSB7XG4gICAgaWYgKGlzSW50ZXJuYWxLZXkoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSByYXdTbG90c1trZXldO1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgc2xvdHNba2V5XSA9IG5vcm1hbGl6ZVNsb3Qoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgXCIke2tleX1cIi4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZSh2YWx1ZSk7XG4gICAgICBzbG90c1trZXldID0gKCkgPT4gbm9ybWFsaXplZDtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBub3JtYWxpemVWTm9kZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbikgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNLZWVwQWxpdmUoaW5zdGFuY2Uudm5vZGUpICYmIHRydWUpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICBpbnN0YW5jZS5zbG90cy5kZWZh
20578dWx0ID0gKCkgPT4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBhc3NpZ25TbG90cyA9IChzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZHJlbikge1xuICAgIGlmIChvcHRpbWl6ZWQgfHwga2V5ICE9PSBcIl9cIikge1xuICAgICAgc2xvdHNba2V5XSA9IGNoaWxkcmVuW2tleV07XG4gICAgfVxuICB9XG59O1xuY29uc3QgaW5pdFNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGNvbnN0IHNsb3RzID0gaW5zdGFuY2Uuc2xvdHMgPSBjcmVhdGVJbnRlcm5hbE9iamVjdCgpO1xuICBpZiAoaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgMzIpIHtcbiAgICBjb25zdCB0eXBlID0gY2hpbGRyZW4uXztcbiAgICBpZiAodHlwZSkge1xuICAgICAgYXNzaWduU2xvdHMoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgaWYgKG9wdGltaXplZCkge1xuICAgICAgICBkZWYoc2xvdHMsIFwiX1wiLCB0eXBlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gIH1cbn07XG5jb25zdCB1cGRhdGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gIGxldCBuZWVkRGVsZXRpb25DaGVjayA9IHRydWU7XG4gIGxldCBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBFTVBUWV9PQko7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIGFzc2lnblNsb3RzKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICAgICAgdHJpZ2dlcihpbnN0YW5jZSwgXCJzZXRcIiwgXCIkc2xvdHNcIik7XG4gICAgICB9IGVsc2UgaWYgKG9wdGltaXplZCAmJiB0eXBlID09PSAxKSB7XG4gICAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NpZ25TbG90cyhzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lZWREZWxldGlvbkNoZWNrID0gIWNoaWxkcmVuLiRzdGFibGU7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhjaGlsZHJlbiwgc2xvdHMpO1xuICAgIH1cbiAgICBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIG5vcm1hbGl6ZVZOb2RlU2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgICBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSB7IGRlZmF1bHQ6IDEgfTtcbiAgfVxuICBpZiAobmVlZERlbGV0aW9uQ2hlY2spIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzbG90cykge1xuICAgICAgaWYgKCFpc0ludGVybmFsS2V5KGtleSkgJiYgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgc2xvdHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFJlZihyYXdSZWYsIG9sZFJhd1JlZiwgcGFyZW50U3VzcGVuc2UsIHZub2Rl
20578LCBpc1VubW91bnQgPSBmYWxzZSkge1xuICBpZiAoaXNBcnJheShyYXdSZWYpKSB7XG4gICAgcmF3UmVmLmZvckVhY2goXG4gICAgICAociwgaSkgPT4gc2V0UmVmKFxuICAgICAgICByLFxuICAgICAgICBvbGRSYXdSZWYgJiYgKGlzQXJyYXkob2xkUmF3UmVmKSA/IG9sZFJhd1JlZltpXSA6IG9sZFJhd1JlZiksXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgaXNVbm1vdW50XG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSAmJiAhaXNVbm1vdW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlZlZhbHVlID0gdm5vZGUuc2hhcGVGbGFnICYgNCA/IGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKHZub2RlLmNvbXBvbmVudCkgOiB2bm9kZS5lbDtcbiAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gIGNvbnN0IHsgaTogb3duZXIsIHI6IHJlZiB9ID0gcmF3UmVmO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhb3duZXIpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTWlzc2luZyByZWYgb3duZXIgY29udGV4dC4gcmVmIGNhbm5vdCBiZSB1c2VkIG9uIGhvaXN0ZWQgdm5vZGVzLiBBIHZub2RlIHdpdGggcmVmIG11c3QgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbi5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2xkUmVmID0gb2xkUmF3UmVmICYmIG9sZFJhd1JlZi5yO1xuICBjb25zdCByZWZzID0gb3duZXIucmVmcyA9PT0gRU1QVFlfT0JKID8gb3duZXIucmVmcyA9IHt9IDogb3duZXIucmVmcztcbiAgY29uc3Qgc2V0dXBTdGF0ZSA9IG93bmVyLnNldHVwU3RhdGU7XG4gIGlmIChvbGRSZWYgIT0gbnVsbCAmJiBvbGRSZWYgIT09IHJlZikge1xuICAgIGlmIChpc1N0cmluZyhvbGRSZWYpKSB7XG4gICAgICByZWZzW29sZFJlZl0gPSBudWxsO1xuICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCBvbGRSZWYpKSB7XG4gICAgICAgIHNldHVwU3RhdGVbb2xkUmVmXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihyZWYpKSB7XG4gICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKHJlZiwgb3duZXIsIDEyLCBbdmFsdWUsIHJlZnNdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBfaXNTdHJpbmcgPSBpc1N0cmluZyhyZWYpO1xuICAgIGNvbnN0IF9pc1JlZiA9IGlzUmVmKHJlZik7XG4gICAgaWYgKF9pc1N0cmluZyB8fCBfaXNSZWYpIHtcbiAgICAgIGNvbnN0IGRvU2V0ID0gKCkgPT4ge1xuICAgICAgICBpZiAocmF3UmVmLmYpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IF9pc1N0cmluZyA/IGhhc093bihzZXR1cFN0YXRlLCByZWYpID8gc2V0dXBTdGF0ZVtyZWZdIDogcmVmc1tyZWZdIDogcmVmLnZhbHVlO1xuICAgICAgICAgIGlmIChpc1VubW91bnQpIHtcbiAgICAgICAgICAgIGlzQXJyYXkoZXhpc3RpbmcpICYmIHJlbW92ZShleGlzdGluZywgcmVmVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSkge1xuICAgICAgICAgICAgICAgICAgc2V0dXBTdGF0ZVtyZWZdID0gcmVmc1tyZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWYudmFsdWUgPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChyYXdSZWYuaykgcmVmc1tyYXdSZWYua10gPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKHJlZlZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgcmVmc1tyZWZdID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHJhd1JlZi5rKSByZWZzW3Jhd1JlZi5rXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkb1NldC5pZCA9IC0xO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZG9TZXQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgVGVsZXBvcnRFbmRLZXkgPSBTeW1ib2woXCJfdnRlXCIpO1xuY29uc3QgaXNUZWxlcG9ydCA9ICh0eXBlKSA9PiB0eXBlLl9faXNUZWxlcG9ydDtcbmNvbnN0IGlzVGVsZXBvcnREaXNhYmxlZCA9IChwcm9wcykgPT4gcHJvcHMgJiYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmRpc2FibGVkID09PSBcIlwiKTtcbmNvbnN0IGlzVGFyZ2V0U1ZHID0gKHRhcmdldCkgPT4gdHlwZW9mIFNWR0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbmNvbnN0IGlzVGFyZ2V0TWF0aE1MID0gKHRhcmdldCkgPT4gdHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50O1xuY29uc3QgcmVzb2x2ZVRhcmdldCA9IChwcm9wcywgc2VsZWN0KSA9PiB7XG4gIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gcHJvcHMgJiYgcHJvcHMudG87XG4gIGlmIChpc1N0cmluZyh0YXJnZXRTZWxlY3RvcikpIHtcbiAgICBpZiAoIXNlbGVjdCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBDdXJyZW50IHJlbmRlcmVyIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIHRhcmdldCBmb3IgVGVsZXBvcnRzLiAobWlzc2luZyBxdWVyeVNlbGVjdG9yIHJlbmRlcmVyIG9wdGlvbilgXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdCh0YXJnZXRTZWxlY3Rvcik7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0ICYmICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgICAgI
20578Hdhcm4kMShcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciBcIiR7dGFyZ2V0U2VsZWN0b3J9XCIuIE5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0YXJnZXRTZWxlY3RvciAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIFRlbGVwb3J0IHRhcmdldDogJHt0YXJnZXRTZWxlY3Rvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFNlbGVjdG9yO1xuICB9XG59O1xuY29uc3QgVGVsZXBvcnRJbXBsID0ge1xuICBuYW1lOiBcIlRlbGVwb3J0XCIsXG4gIF9faXNUZWxlcG9ydDogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgcGJjOiBwYXRjaEJsb2NrQ2hpbGRyZW4sXG4gICAgICBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9XG4gICAgfSA9IGludGVybmFscztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMi5wcm9wcyk7XG4gICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG4yLmVsID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBzdGFydFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBlbmRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChuMi5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICBjb25zdCB0YXJnZXRTdGFydCA9IG4yLnRhcmdldFN0YXJ0ID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IG4yLnRhcmdldEFuY2hvciA9IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBpbnNlcnQocGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGluc2VydChtYWluQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICB0YXJnZXRTdGFydFtUZWxlcG9ydEVuZEtleV0gPSB0YXJnZXRBbmNob3I7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGluc2VydCh0YXJnZXRTdGFydCwgdGFyZ2V0KTtcbiAgICAgICAgaW5zZXJ0KHRhcmdldEFuY2hvciwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgd2FybiQxKFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6XCIsIHRhcmdldCwgYCgke3R5cGVvZiB0YXJnZXR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnQgPSAoY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgbW91bnQodGFyZ2V0LCB0YXJnZXRBbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIudGFyZ2V0U3RhcnQgPSBuMS50YXJnZXRTdGFydDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiB8fCBpc1RhcmdldE1hdGhNTCh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICB9XG4gICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgI
20578HBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnRDb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKCF3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbWFpbkFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChuMi5wcm9wcyAmJiBuMS5wcm9wcyAmJiBuMi5wcm9wcy50byAhPT0gbjEucHJvcHMudG8pIHtcbiAgICAgICAgICAgIG4yLnByb3BzLnRvID0gbjEucHJvcHMudG87XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKG4yLnByb3BzICYmIG4yLnByb3BzLnRvKSAhPT0gKG4xLnByb3BzICYmIG4xLnByb3BzLnRvKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRUYXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgbjIucHJvcHMsXG4gICAgICAgICAgICBxdWVyeVNlbGVjdG9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobmV4dFRhcmdldCkge1xuICAgICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgICBuMixcbiAgICAgICAgICAgICAgbmV4dFRhcmdldCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHsgdW06IHVubW91bnQsIG86IHsgcmVtb3ZlOiBob3N0UmVtb3ZlIH0gfSwgZG9SZW1vdmUpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGFuY2hvcixcbiAgICAgIHRhcmdldFN0YXJ0LFxuICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcHNcbiAgICB9ID0gdm5vZGU7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgaG9zdFJlbW92ZSh0YXJnZXRTdGFydCk7XG4gICAgICBob3N0UmVtb3ZlKHRhcmdldEFuY2hvcik7XG4gICAgfVxuICAgIGRvUmVtb3ZlICYmIGhvc3RSZW1vdmUoYW5jaG9yKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGNvbnN0IHNob3VsZFJlbW92ZSA9IGRvUmVtb3ZlIHx8ICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICB1bm1vdW50KFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzaG91bGRSZW1vdmUsXG4gICAgICAgICAgISFjaGlsZC5keW5hbWljQ2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1vdmU6IG1vdmVUZWxlcG9ydCxcbiAgaHlkcmF0ZTogaHlkcmF0ZVRlbGVwb3J0XG59O1xuZnVuY3Rpb24gbW92ZVRlbGVwb3J0KHZub2RlLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgeyBvOiB7IGluc2VydCB9LCBtOiBtb3ZlIH0sIG1vdmVUeXBlID0gMikge1xuICBpZiAobW92ZVR5cGUgPT09IDApIHtcbiAgICBpbnNlcnQodm5vZGUudGFyZ2V0QW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbiAgY29uc3QgeyBlbCwgYW5jaG9yLCBzaGFwZUZsYWcsIGNoaWxkcmVuLCBwcm9wcyB9ID0gdm5vZGU7XG4gIGNvbnN0IGlzUmVvcmRlciA9IG1vdmVUeXBlID09PSAyO1xuICBpZiAoaXNSZW9yZGVyKSB7XG4gICAgaW5zZXJ0KGVsLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbiAgaWYgKCFpc1Jlb3JkZXIgfHwgaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKFxuICAgICAgICAgIGNoaWxkcmVuW2ldLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBwYXJlbnRBbmNob3IsXG4gICAgICAgICAgMlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaXNSZW9yZGVyKSB7XG4gICAgaW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlVGVsZXBvcnQobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7XG4gIG86IHsgbmV4dFNpYmxpbmcsIHBhcmVudE5vZGUsIHF1ZXJ5U2VsZWN0b3IgfVxufSwgaHlkcmF0ZUNoaWxkcmVuKSB7XG4gIGNvbnN0IHRhcmdldCA9IHZub2RlLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgdm5vZGUucHJvcHMsXG4gICAgcXVlcnlTZWxlY3RvclxuICApO
205781xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldC5fbHBhIHx8IHRhcmdldC5maXJzdENoaWxkO1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxNikge1xuICAgICAgaWYgKGlzVGVsZXBvcnREaXNhYmxlZCh2bm9kZS5wcm9wcykpIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIG5leHRTaWJsaW5nKG5vZGUpLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudE5vZGUobm9kZSksXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBsZXQgdGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgd2hpbGUgKHRhcmdldEFuY2hvcikge1xuICAgICAgICAgIHRhcmdldEFuY2hvciA9IG5leHRTaWJsaW5nKHRhcmdldEFuY2hvcik7XG4gICAgICAgICAgaWYgKHRhcmdldEFuY2hvciAmJiB0YXJnZXRBbmNob3Iubm9kZVR5cGUgPT09IDggJiYgdGFyZ2V0QW5jaG9yLmRhdGEgPT09IFwidGVsZXBvcnQgYW5jaG9yXCIpIHtcbiAgICAgICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICAgIHRhcmdldC5fbHBhID0gdm5vZGUudGFyZ2V0QW5jaG9yICYmIG5leHRTaWJsaW5nKHZub2RlLnRhcmdldEFuY2hvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIHRhcmdldE5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnModm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZS5hbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yKTtcbn1cbmNvbnN0IFRlbGVwb3J0ID0gVGVsZXBvcnRJbXBsO1xuZnVuY3Rpb24gdXBkYXRlQ3NzVmFycyh2bm9kZSkge1xuICBjb25zdCBjdHggPSB2bm9kZS5jdHg7XG4gIGlmIChjdHggJiYgY3R4LnV0KSB7XG4gICAgbGV0IG5vZGUgPSB2bm9kZS5jaGlsZHJlblswXS5lbDtcbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSB2bm9kZS50YXJnZXRBbmNob3IpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdi1vd25lclwiLCBjdHgudWlkKTtcbiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBjdHgudXQoKTtcbiAgfVxufVxuXG5sZXQgaGFzTG9nZ2VkTWlzbWF0Y2hFcnJvciA9IGZhbHNlO1xuY29uc3QgbG9nTWlzbWF0Y2hFcnJvciA9ICgpID0+IHtcbiAgaWYgKGhhc0xvZ2dlZE1pc21hdGNoRXJyb3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5lcnJvcihcIkh5ZHJhdGlvbiBjb21wbGV0ZWQgYnV0IGNvbnRhaW5zIG1pc21hdGNoZXMuXCIpO1xuICBoYXNMb2dnZWRNaXNtYXRjaEVycm9yID0gdHJ1ZTtcbn07XG5jb25zdCBpc1NWR0NvbnRhaW5lciA9IChjb250YWluZXIpID0+IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoXCJzdmdcIikgJiYgY29udGFpbmVyLnRhZ05hbWUgIT09IFwiZm9yZWlnbk9iamVjdFwiO1xuY29uc3QgaXNNYXRoTUxDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwiTWF0aE1MXCIpO1xuY29uc3QgZ2V0Q29udGFpbmVyVHlwZSA9IChjb250YWluZXIpID0+IHtcbiAgaWYgKGlzU1ZHQ29udGFpbmVyKGNvbnRhaW5lcikpIHJldHVybiBcInN2Z1wiO1xuICBpZiAoaXNNYXRoTUxDb250YWluZXIoY29udGFpbmVyKSkgcmV0dXJuIFwibWF0aG1sXCI7XG4gIHJldHVybiB2b2lkIDA7XG59O1xuY29uc3QgaXNDb21tZW50ID0gKG5vZGUpID0+IG5vZGUubm9kZVR5cGUgPT09IDggLyogQ09NTUVOVCAqLztcbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyhyZW5kZXJlckludGVybmFscykge1xuICBjb25zdCB7XG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIHA6IHBhdGNoLFxuICAgIG86IHtcbiAgICAgIHBhdGNoUHJvcCxcbiAgICAgIGNyZWF0ZVRleHQsXG4gICAgICBuZXh0U2libGluZyxcbiAgICAgIHBhcmVudE5vZGUsXG4gICAgICByZW1vdmUsXG4gICAgICBpbnNlcnQsXG4gICAgICBjcmVhdGVDb21tZW50XG4gICAgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGh5ZHJhdGUgPSAodm5vZGUsIGNvbnRhaW5lcikgPT4ge1xuICAgIGlmICghY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGh5ZHJhdGVOb2RlKGNvbnRhaW5lci5maXJzdENoaWxkLCB2bm9kZSwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2Rl
20578LCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGlzRnJhZ21lbnRTdGFydCA9IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiO1xuICAgIGNvbnN0IG9uTWlzbWF0Y2ggPSAoKSA9PiBoYW5kbGVNaXNtYXRjaChcbiAgICAgIG5vZGUsXG4gICAgICB2bm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgaXNGcmFnbWVudFN0YXJ0XG4gICAgKTtcbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnLCBwYXRjaEZsYWcgfSA9IHZub2RlO1xuICAgIGxldCBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICB2bm9kZS5lbCA9IG5vZGU7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYobm9kZSwgXCJfX3Zub2RlXCIsIHZub2RlLCB0cnVlKTtcbiAgICAgIGRlZihub2RlLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGxldCBuZXh0Tm9kZSA9IG51bGw7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIGlmIChkb21UeXBlICE9PSAzIC8qIFRFWFQgKi8pIHtcbiAgICAgICAgICBpZiAodm5vZGUuY2hpbGRyZW4gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGluc2VydCh2bm9kZS5lbCA9IGNyZWF0ZVRleHQoXCJcIiksIHBhcmVudE5vZGUobm9kZSksIG5vZGUpO1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgbWlzbWF0Y2ggaW5gLFxuICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgIGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgbm9kZS5kYXRhXG4gICAgICAgICAgICAgICl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke0pTT04uc3RyaW5naWZ5KHZub2RlLmNoaWxkcmVuKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgcmVwbGFjZU5vZGUoXG4gICAgICAgICAgICB2bm9kZS5lbCA9IG5vZGUuY29udGVudC5maXJzdENoaWxkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tVHlwZSAhPT0gOCAvKiBDT01NRU5UICovIHx8IGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovIHx8IGRvbVR5cGUgPT09IDMgLyogVEVYVCAqLykge1xuICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICBjb25zdCBuZWVkVG9BZG9wdENvbnRlbnQgPSAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuc3RhdGljQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lZWRUb0Fkb3B0Q29udGVudClcbiAgICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4gKz0gbmV4dE5vZGUubm9kZVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyA/IG5leHROb2RlLm91dGVySFRNTCA6IG5leHROb2RlLmRhdGE7XG4gICAgICAgICAgICBpZiAoaSA9PT0gdm5vZGUuc3RhdGljQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIHZub2RlLmFuY2hvciA9IG5leHROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhuZXh0Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpc0ZyYWdtZW50U3RhcnQgPyBuZXh0U2libGluZyhuZXh0Tm9kZSkgOiBuZXh0Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk1pc21hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBpZiAoIWlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgI
20578HZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBpZiAoKGRvbVR5cGUgIT09IDEgLyogRUxFTUVOVCAqLyB8fCB2bm9kZS50eXBlLnRvTG93ZXJDYXNlKCkgIT09IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSAmJiAhaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcInRlbGVwb3J0IHN0YXJ0XCIpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlLCBub2RlLmRhdGEsIFwidGVsZXBvcnQgZW5kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViVHJlZTtcbiAgICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKEZyYWdtZW50KTtcbiAgICAgICAgICAgICAgc3ViVHJlZS5hbmNob3IgPSBuZXh0Tm9kZSA/IG5leHROb2RlLnByZXZpb3VzU2libGluZyA6IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gbm9kZS5ub2RlVHlwZSA9PT0gMyA/IGNyZWF0ZVRleHRWTm9kZShcIlwiKSA6IGNyZWF0ZVZOb2RlKFwiZGl2XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViVHJlZS5lbCA9IG5vZGU7XG4gICAgICAgICAgICB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA9IHN1YlRyZWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgaWYgKGRvbVR5cGUgIT09IDggLyogQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKHBhcmVudE5vZGUobm9kZSkpLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICBoeWRyYXRlTm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHROb2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIHBhdGNoRmxhZywgc2hhcGVGbGFnLCBkaXJzLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBjb25zdCBmb3JjZVBhdGNoID0gdHlwZSA9PT0gXCJpbnB1dFwiIHx8IHR5cGUgPT09IFwib3B0aW9uXCI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZm9yY2VQYXRjaCB8fCBwYXRjaEZsYWcgIT09IC0xKSB7XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2Rl
20578LCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSAmJiBwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcy5hcHBlYXI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbC5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZU5vZGUoY29udGVudCwgZWwsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgIHZub2RlLmVsID0gZWwgPSBjb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2ICYmIC8vIHNraXAgaWYgZWxlbWVudCBoYXMgaW5uZXJIVE1MIC8gdGV4dENvbnRlbnRcbiAgICAgICEocHJvcHMgJiYgKHByb3BzLmlubmVySFRNTCB8fCBwcm9wcy50ZXh0Q29udGVudCkpKSB7XG4gICAgICAgIGxldCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIGVsLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBgXG5TZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICBjb25zdCBjdXIgPSBuZXh0O1xuICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIHJlbW92ZShjdXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2VsLnRleHRDb250ZW50fVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHt2bm9kZS5jaGlsZHJlbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgZWwudGV4dENvbnRlbnQgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyB8fCBmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIC8vICMxMTE4OSBza2lwIGlmIHRoaXMgbm9kZSBoYXMgZGlyZWN0aXZlcyB0aGF0IGhhdmUgY3JlYXRlZCBob29rc1xuICAgICAgICAgICAgLy8gYXMgaXQgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBET00gaW4gYW55IHBvc3NpYmxlIHdheVxuICAgICAgICAgICAgIShkaXJzICYmIGRpcnMuc29tZSgoZCkgPT4gZC5kaXIuY3JlYXRlZCkpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50KSkge1xuICAgICAgICAgICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9yY2VQYXRjaCAmJiAoa2V5LmVuZHNXaXRoKFwidmFsdWVcIikgfHwga2V5ID09PSBcImluZGV0ZXJtaW5hdGVcIikgfHwgaXNPbihrZXkpICYmICFpc1Jlc2VydmVkUHJvcChrZXkpIHx8IC8vIGZvcmNlIGh5ZHJhdGUgdi1iaW5kIHdpdGggLnByb3AgbW9kaWZpZXJzXG4gICAgICAgICAgICBrZXlbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgIHBhdGNoUHJvcChlbCwga2V5LCBudWxsLCBwcm9wc1trZXldLCB2b2lkIDAsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIFwib25DbGlja1wiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDQgJiYgaXNSZWFjdGl2ZShwcm9wcy5zdHlsZSkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcy5zdHlsZSkgcHJvcHMuc3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICBpZiAodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2Rl
20578LCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWwubmV4dFNpYmxpbmc7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXBhcmVudFZOb2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IG9wdGltaXplZCA/IGNoaWxkcmVuW2ldIDogY2hpbGRyZW5baV0gPSBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBjb25zdCBpc1RleHQgPSB2bm9kZS50eXBlID09PSBUZXh0O1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzVGV4dCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltpICsgMV07XG4gICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgPSBub3JtYWxpemVWTm9kZShuZXh0KSkudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICAgICAgaW5zZXJ0KFxuICAgICAgICAgICAgICBjcmVhdGVUZXh0KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5zbGljZSh2bm9kZS5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBjb250YWluZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgZmV3ZXIgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUZyYWdtZW50ID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IHsgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gdm5vZGU7XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIGNvbnN0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBvcHRpbWl6ZWRcbiAgICApO1xuICAgIGlmIChuZXh0ICYmIGlzQ29tbWVudChuZXh0KSAmJiBuZXh0LmRhdGEgPT09IFwiXVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yID0gbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgIGluc2VydCh2bm9kZS5hbmNob3IgPSBjcmVhdGVDb21tZW50KGBdYCksIGNvbnRhaW5lciwgbmV4dCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gI
20578H07XG4gIGNvbnN0IGhhbmRsZU1pc21hdGNoID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIGlzRnJhZ21lbnQpID0+IHtcbiAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgIGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDpcbi0gcmVuZGVyZWQgb24gc2VydmVyOmAsXG4gICAgICBub2RlLFxuICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBURVhUICovID8gYCh0ZXh0KWAgOiBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIiA/IGAoc3RhcnQgb2YgZnJhZ21lbnQpYCA6IGBgLFxuICAgICAgYFxuLSBleHBlY3RlZCBvbiBjbGllbnQ6YCxcbiAgICAgIHZub2RlLnR5cGVcbiAgICApO1xuICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICB2bm9kZS5lbCA9IG51bGw7XG4gICAgaWYgKGlzRnJhZ21lbnQpIHtcbiAgICAgIGNvbnN0IGVuZCA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXh0MiA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBpZiAobmV4dDIgJiYgbmV4dDIgIT09IGVuZCkge1xuICAgICAgICAgIHJlbW92ZShuZXh0Mik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgcmVtb3ZlKG5vZGUpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgbmV4dCxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgZ2V0Q29udGFpbmVyVHlwZShjb250YWluZXIpLFxuICAgICAgc2xvdFNjb3BlSWRzXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfTtcbiAgY29uc3QgbG9jYXRlQ2xvc2luZ0FuY2hvciA9IChub2RlLCBvcGVuID0gXCJbXCIsIGNsb3NlID0gXCJdXCIpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSAwO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobm9kZSAmJiBpc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gb3BlbikgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRlbXBsYXRlXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuZnVuY3Rpb24gcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIGNsaWVudFZhbHVlLCB2bm9kZSwgaW5zdGFuY2UpIHtcbiAgbGV0IG1pc21hdGNoVHlwZTtcbiAgbGV0IG1pc21hdGNoS2V5O1xuICBsZXQgYWN0dWFsO1xuICBsZXQgZXhwZWN0ZWQ7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IGBjbGFzc2A7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikgfHwgXCJcIjtcbiAgICBleHBlY3RlZCA9IGlzU3RyaW5nKGNsaWVudFZhbHVlKSA/IGNsaWVudFZhbHVlIDogc3RyaW5naWZ5U3R5bGUobm9ybWFsaXplU3R5bGUoY2xpZW50VmFsdWUpKTtcbiAgICBjb25zdCBhY3R1YWxNYXAgPSB0b1N0eWxlTWFwKGFjdHVhbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNYXAgPSB0b1N0eWxlTWFwKGV4cGVjdGVkKTtcbiAgICBpZiAodm5vZGUuZGlycykge1xuICAgICAgZm9yIChjb25zdCB7IGRpciwgdmFsdWUgfSBvZiB2bm9kZS5kaXJzKSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJzaG93XCIgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZXhwZWN0ZWRNYXAuc2V0KFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICByZXNvbHZlQ3NzVmFycyhpbnN0YW5jZSwgdm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgICB9XG4gICAgaWYgKCFpc01hcEVxdWFsKGFjdHVhbE1hcCwgZXhwZWN0ZWRNYXApKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IFwic3R5bGVcIjtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBTVkdFbGVtZW50ICYmIGlzS25vd25TdmdBdHRyKGtleSkgfHwgZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAoaXNCb29sZWFuQXR0cihrZXkpIHx8IGlzS25vd25IdG1sQXR0cihrZXkpKSkge1xuICAgIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAgIGFjdHVhbCA9IGVsLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgICAgZXhwZWN0ZWQgPSBpbmNsdWRlQm9vbGVhbkF0dHIoY2xpZW50VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY2xpZW50VmFsdWUgPT0gbnVsbCkge1xuICAgICAgYWN0dWFsID0gZWwuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgICBleHBlY3RlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJ2YWx1ZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICBhY3R1YWwgPSBlbC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZXhwZWN0ZWQgPSBpc1JlbmRlcmFibGVBdHRyVmFsdWUoY2xpZW50VmFsdWUpID8gU3RyaW5nKGNsaWVudFZhbHVlKSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gYGF0dHJpYnV0ZWA7XG4gICAgICBtaXNtYXRjaEtleSA9IGtleTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc21hdGNoVHlwZSkge1xuICAgIGNvbnN0IGZvcm1hdCA9ICh2KSA9PiB2ID09PSBmYWxzZSA/IGAobm90IHJlbmRlcmVkKWAgOiBgJHttaXNtYXRjaEtleX09XCIke3Z9XCJgO1xuICAgIGNvbnN0IHByZVNlZ21lbnQgPSBgSHlkcmF0aW9uICR7bWlzbWF0Y2hUeXBlfSBtaXNtYXRjaCBvbmA7XG4gICAgY29uc3QgcG9zdFNlZ21lbnQgPSBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2Zvcm1hdChhY3R1YWwpfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtmb3JtYXQoZXhwZWN0ZWQpfVxuICBOb3RlOiB0aGlzIG1pc21hdGNoIGlzIGNoZWNrLW9ubHkuIFRoZSBET00gd2lsbCBub3QgYmUgcmVjdGlmaWVkIGluIHByb2R1Y3Rpb24gZHVlIHRvIHBlcmZvcm1hbmNlIG92ZXJoZWFkLlxuICBZb3Ugc2hvdWxkIGZpeCB0aGUgc291cmNlIG9mIHRoZSBtaXNtYXRjaC5gO1xuICAgIHtcbiAgICAgIHdhcm4kMShwcmVTZWdtZW50LCBlbCwgcG9zdFNlZ21lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b0NsYXNzU2V0KHN0cikge1xuICByZXR1cm4gbmV3IFNldChzdHIudHJpbSgpLnNwbGl0KC9cXHMrLykpO1xufVxuZnVuY3Rpb24gaXNTZXRFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IHMgb2YgYSkge1xuICAgIGlmICghYi5oYXMocykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0b1N0eWxlTWFwKHN0cikge1xuICBjb25zdCBzdHlsZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzdHIuc3BsaXQoXCI7XCIpKSB7XG4gICAgbGV0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoXCI6XCIpO1xuICAgIGtleSA9IGtleS50cmltKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSAmJiB2YWx1ZS50cmltKCk7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgc3R5bGVNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVNYXA7XG59XG5mdW5jdGlvbiBpc01hcEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICBpZiAodmFsdWUgIT09IGIuZ2V0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNvbHZlQ3NzVmFycyhpbnN0YW5jZSwgdm5vZGUsIGV4cGVjdGVkTWFwKSB7XG4gIGNvbnN0IHJvb3QgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICBpZiAoaW5zdGFuY2UuZ2V0Q3NzVmFycyAmJiAodm5vZGUgPT09IHJvb3QgfHwgcm9vdCAmJiByb290LnR5cGUgPT09IEZyYWdtZW50ICYmIHJvb3QuY2hpbGRyZW4uaW5jbHVkZXModm5vZGUpKSkge1xuICAgIGNvbnN0IGNzc1ZhcnMgPSBpbnN0YW5jZS5nZXRDc3NWYXJzKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3NzVmFycykge1xuICAgICAgZXhwZWN0ZWRNYXAuc2V0KGAtLSR7a2V5fWAsIFN0cmluZyhjc3NWYXJzW2tleV0pKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlID09PSByb290ICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIHJlc29sdmVDc3NWYXJzKGluc3RhbmNlLnBhcmVudCwgaW5zdGFuY2Uudm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgfVxufVxuXG5sZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5mdW5jdGlvbiBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBwZXJmLm1hcmsoYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBlbmRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgY29uc3Qgc3RhcnRUYWcgPSBgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YDtcbiAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICBwZXJmLm1hcmsoZW5kVGFnKTtcbiAgICBwZXJmLm1lYXN1cmU
20578oXG4gICAgICBgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YCxcbiAgICAgIHN0YXJ0VGFnLFxuICAgICAgZW5kVGFnXG4gICAgKTtcbiAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZkVuZChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICB9IGVsc2Uge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gIGNvbnN0IG5lZWRXYXJuID0gW107XG4gIGlmICh0eXBlb2YgX19WVUVfT1BUSU9OU19BUElfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX09QVElPTlNfQVBJX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0RFVlRPT0xTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0RFVlRPT0xTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZWVkV2Fybi5sZW5ndGggPiAxO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbihcIiwgXCIpfSAke211bHRpID8gYGFyZWAgOiBgaXNgfSBub3QgZXhwbGljaXRseSBkZWZpbmVkLiBZb3UgYXJlIHJ1bm5pbmcgdGhlIGVzbS1idW5kbGVyIGJ1aWxkIG9mIFZ1ZSwgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QgPSBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSA7XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKTtcbn1cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAge1xuICAgIGluaXRGZWF0dXJlRmxhZ3MoKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIHRhcmdldC5fX1ZVRV9fID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgc2V0RGV2dG9vbHNIb29rJDEodGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIHRhcmdldCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGluc2VydDogaG9zdEluc2VydCxcbiAgICByZW1vdmU6IGhvc3RSZW1vdmUsXG4gICAgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLFxuICAgIGNyZWF0ZUVsZW1lbnQ6IGhvc3RDcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZVRleHQ6IGhvc3RDcmVhdGVUZXh0LFxuICAgIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LFxuICAgIHNldFRleHQ6IGhvc3RTZXRUZXh0LFxuICAgIHNldEVsZW1lbnRUZXh0OiBob3N0U2V0RWxlbWVudFRleHQsXG4gICAgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IGhvc3ROZXh0U2libGluZyxcbiAgICBzZXRTY29wZUlkOiBob3N0U2V0U2NvcGVJZCA9IE5PT1AsXG4gICAgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBhdGNoID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IgPSBudWxsLCBwYXJlbnRDb21wb25lbnQgPSBudWxsLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwsIG5hbWVzcGFjZSA9IHZvaWQgMCwgc2xvdFNjb3BlSWRzID0gbnVsbCwgb3B0aW1pemVkID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nID8gZmFsc2UgOiAhIW4yLmR5bmFtaWNDaGlsZHJlbikgPT4ge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG4xICYmICFpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgYW5jaG9yID0gZ2V0TmV4dEhvc3ROb2RlKG4xKTtcbiAgICAgIHVubW91bnQobjEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgbjEgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjIucGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBuMi5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgcHJvY2Vzc1RleHQobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgbW91bnRTdGF0aWNOb2RlKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpKSB7XG4gICAgICAgICAgcGF0Y2hTdGF0aWNOb2RlKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBwcm9jZXNzRWxlbWVudChcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsICYmIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJlZiwgbjEgJiYgbjEucmVmLCBwYXJlbnRTdXNwZW5zZSwgbjIgfHwgbjEsICFuMik7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzVGV4dCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZVRleHQobjIuY2hpbGRyZW4pLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgICBob3N0U2V0VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbW1lbnROb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlQ29tbWVudChuMi5jaGlsZHJlbiB8fCBcIlwiKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudFN0YXRpY05vZGUgPSAobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UpID0+IHtcbiAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgbjIuZWwsXG4gICAgICBuMi5hbmNob3JcbiAgICApO1xuICB9O1xuICBjb25zdCBwYXRjaFN0YXRpY05vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGhvc3ROZXh0U2libGluZyhuMS5hbmNob3IpO1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZShuMSk7XG4gICAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlU3Rh
20578dGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0pID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICB9O1xuICBjb25zdCBwcm9jZXNzRWxlbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgaWYgKG4yLnR5cGUgPT09IFwic3ZnXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgfSBlbHNlIGlmIChuMi50eXBlID09PSBcIm1hdGhcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50RWxlbWVudChcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaEVsZW1lbnQoXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50RWxlbWVudCA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBjb25zdCB7IHByb3BzLCBzaGFwZUZsYWcsIHRyYW5zaXRpb24sIGRpcnMgfSA9IHZub2RlO1xuICAgIGVsID0gdm5vZGUuZWwgPSBob3N0Q3JlYXRlRWxlbWVudChcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wcyAmJiBwcm9wcy5pcyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCB2bm9kZS5jaGlsZHJlbik7XG4gICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2Uodm5vZGUsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgfVxuICAgIHNldFNjb3BlSWQoZWwsIHZub2RlLCB2bm9kZS5zY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoa2V5ICE9PSBcInZhbHVlXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIG51bGwsIHByb3BzW2tleV0sIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYoZWwsIFwiX192bm9kZVwiLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICBkZWYoZWwsIFwiX192dWVQYXJlbnRDb21wb25lbnRcIiwgcGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgI
20578HZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTY29wZUlkID0gKGVsLCB2bm9kZSwgc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBpZiAoc2NvcGVJZCkge1xuICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNjb3BlSWQpO1xuICAgIH1cbiAgICBpZiAoc2xvdFNjb3BlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RTY29wZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgbGV0IHN1YlRyZWUgPSBwYXJlbnRDb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJiBzdWJUcmVlLnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgc3ViVHJlZSA9IGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHBhcmVudENvbXBvbmVudC52bm9kZTtcbiAgICAgICAgc2V0U2NvcGVJZChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRWTm9kZSxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zY29wZUlkLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQucGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjaGlsZHJlbltpXSkgOiBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gKG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGVsLl9fdm5vZGUgPSBuMjtcbiAgICB9XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIGRpcnMgfSA9IG4yO1xuICAgIHBhdGNoRmxhZyB8PSBuMS5wYXRjaEZsYWcgJiAxNjtcbiAgICBjb25zdCBvbGRQcm9wcyA9IG4xLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBjb25zdCBuZXdQcm9wcyA9IG4yLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGlmICh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVwZGF0ZVwiKTtcbiAgICB9XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAob2xkUHJvcHMuaW5uZXJIVE1MICYmIG5ld1Byb3BzLmlubmVySFRNTCA9PSBudWxsIHx8IG9sZFByb3BzLnRleHRDb250ZW50ICYmIG5ld1Byb3BzLnRleHRDb250ZW50ID09IG51bGwpIHtcbiAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgXCJcIik7XG4gICAgfVxuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UobjIsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgI
20578HBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiAyKSB7XG4gICAgICAgICAgaWYgKG9sZFByb3BzLmNsYXNzICE9PSBuZXdQcm9wcy5jbGFzcykge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJjbGFzc1wiLCBudWxsLCBuZXdQcm9wcy5jbGFzcywgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDQpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInN0eWxlXCIsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBuMi5keW5hbWljUHJvcHM7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEpIHtcbiAgICAgICAgaWYgKG4xLmNoaWxkcmVuICE9PSBuMi5jaGlsZHJlbikge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkICYmIGR5bmFtaWNDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICB9XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlVXBkYXRlZCkgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcInVwZGF0ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEJsb2NrQ2hpbGRyZW4gPSAob2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBmYWxsYmFja0NvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgbmV3Vk5vZGUgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IChcbiAgICAgICAgLy8gb2xkVk5vZGUgbWF5IGJlIGFuIGVycm9yZWQgYXN5bmMgc2V0dXAoKSBjb21wb25lbnQgaW5zaWRlIFN1c3BlbnNlXG4gICAgICAgIC8vIHdoaWNoIHdpbGwgbm90IGhhdmUgYSBtb3VudGVkIGVsZW1lbnRcbiAgICAgICAgb2xkVk5vZGUuZWwgJiYgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIEZyYWdtZW50LCB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIGFjdHVhbCBwYXJlbnRcbiAgICAgICAgLy8gb2YgdGhlIEZyYWdtZW50IGl0c2VsZiBzbyBpdCBjYW4gbW92ZSBpdHMgY2hpbGRyZW4uXG4gICAgICAgIChvbGRWTm9kZS50eXBlID09PSBGcmFnbWVudCB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGRpZmZlcmVudCBub2RlcywgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSByZXBsYWNlbWVudFxuICAgICAgICAvLyB3aGljaCBhbHNvIHJlcXVpcmVzIHRoZSBjb3JyZWN0IHBhcmVudCBjb250YWluZXJcbiAgICAgICAgIWlzU2FtZVZOb2RlVHlwZShvbGRWTm9kZSwgbmV3Vk5vZGUpIHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBjb21wb25lbnQsIGl0IGNvdWxkIGNvbnRhaW4gYW55dGhpbmcuXG4gICAgICAgIG9sZFZOb2RlLnNoYXBlRmxhZyAmICg2IHwgNjQpKSA/IGhvc3RQYXJlbnROb2RlKG9sZFZOb2RlLmVsKSA6IChcbiAgICAgICAgICAvLyBJbiBvdGhlciBjYXNlcywgdGhlIHBhcmVudCBjb250YWluZXIgaXMgbm90IGFjdHVhbGx5IHVzZWQgc28gd2VcbiAgICAgICAgICAvLyBqdXN0IHBhc3MgdGhlIGJsb2NrIGVsZW1lbnQgaGVyZSB0byBhdm9pZCBhIERPTSBwYXJlbnROb2RlIGNhbGwuXG4gICAgICAgICAgZmFsbGJhY2tDb250YWluZXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBvbGRWTm9kZSxcbiAgICAgICAgbmV3Vk5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFByb3BzID0gKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRQcm9wc1trZXldLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgI
20578HBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgb2xkUHJvcHMudmFsdWUsIG5ld1Byb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBmcmFnbWVudFN0YXJ0QW5jaG9yID0gbjIuZWwgPSBuMSA/IG4xLmVsIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgY29uc3QgZnJhZ21lbnRFbmRBbmNob3IgPSBuMi5hbmNob3IgPSBuMSA/IG4xLmFuY2hvciA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAvLyAjNTUyMyBkZXYgcm9vdCBmcmFnbWVudCBtYXkgaW5oZXJpdCBkaXJlY3RpdmVzXG4gICAgKGlzSG1yVXBkYXRpbmcgfHwgcGF0Y2hGbGFnICYgMjA0OCkpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRTdGFydEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudEVuZEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgLy8gIzEwMDA3XG4gICAgICAgIC8vIHN1Y2ggZnJhZ21lbnQgbGlrZSBgPD48Lz5gIHdpbGwgYmUgY29tcGlsZWQgaW50b1xuICAgICAgICAvLyBhIGZyYWdtZW50IHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGNoaWxkcmVuLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZmFsbGJhY2sgdG8gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgbjIuY2hpbGRyZW4gfHwgW10sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0ICYmIGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMjcxNSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgY291bGQndmUgYmVlbiBhIEJBSUxlZCBvbmUgYXMgYSByZXN1bHRcbiAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vI
20578HZhbGlkIGNoaWxkcmVuXG4gICAgICBuMS5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENvbXBvbmVudCA9IChpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBmYWxzZSwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCkge1xuICAgICAgcGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0LCBvcHRpbWl6ZWQpO1xuICAgICAgaWYgKCFpbml0aWFsVk5vZGUuZWwpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBpbnN0YW5jZS5zdWJUcmVlID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShudWxsLCBwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgI
20578HBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudCA9IChuMSwgbjIsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50O1xuICAgIGlmIChzaG91bGRVcGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobjIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbjI7XG4gICAgICAgIGludmFsaWRhdGVKb2IoaW5zdGFuY2UudXBkYXRlKTtcbiAgICAgICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBpbnN0YW5jZS52bm9kZSA9IG4yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlKSB7XG4gICAgICAgICAgICBpbml0aWFsVk5vZGUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbihcbiAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29uJ3QgdHJhY2sgZGVwZW5kZW5jaWVzIC0gYnV0IGl0J3Mgb2sgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyBhIHNlcnZlci1yZW5kZXJlZCBhc3luYyB3cmFwcGVyIGlzIGFscmVhZHkgaW4gcmVzb2x2ZWQgc3RhdGVcbiAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBoeWRyYXRlU3ViVHJlZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmU
20578oaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRVcGRhdGVGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVmZmVjdCA9IGluc3RhbmNlLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChcbiAgICAgIGNvbXBvbmVudFVwZGF0ZUZuLFxuICAgICAgTk9PUCxcbiAgICAgICgpID0+IHF1ZXVlSm9iKHVwZGF0ZSksXG4gICAgICBpbnN0YW5jZS5zY29wZVxuICAgICAgLy8gdHJhY2sgaXQgaW4gY29tcG9uZW50J3MgZWZmZWN0IHNjb3BlXG4gICAgKTtcbiAgICBjb25zdCB1cGRhdGUgPSBpbnN0YW5jZS51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWZmZWN0LmRpcnR5KSB7XG4gICAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHVwZGF0ZS5pID0gaW5zdGFuY2U7XG4gICAgdXBkYXRlLmlkID0gaW5zdGFuY2UudWlkO1xuICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBlZmZlY3Qub25UcmFjayA9IGluc3RhbmNlLnJ0YyA/IChlKSA9PiBpbnZva2VBcnJheUZucyhpbnN0YW5jZS5ydGMsIGUpIDogdm9pZCAwO1xuICAgICAgZWZmZWN0Lm9uVHJpZ2dlciA9IGluc3RhbmNlLnJ0ZyA/IChlKSA9PiBpbnZva2VBcnJheUZucyhpbnN0YW5jZS5ydGcsIGUpIDogdm9pZCAwO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyID0gKGluc3RhbmNlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkgPT4ge1xuICAgIG5leHRWTm9kZS5jb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcztcbiAgICBpbnN0YW5jZS52bm9kZSA9IG5leHRWTm9kZTtcbiAgICBpbnN0YW5jZS5uZXh0ID0gbnVsbDtcbiAgICB1cGRhdGVQcm9wcyhpbnN0YW5jZSwgbmV4dFZOb2RlLnByb3BzLCBwcmV2UHJvcHMsIG9wdGltaXplZCk7XG4gICAgdXBkYXRlU2xvdHMoaW5zdGFuY2UsIG5leHRWTm9kZS5jaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSk7XG4gICAgcmVzZXRUcmFja2luZygpO1xuICB9O1xuICBjb25zdCBwYXRjaENoaWxkcmVuID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGMxID0gbjEgJiYgbjEuY2hpbGRyZW47XG4gICAgY29uc3QgcHJldlNoYXBlRmxhZyA9IG4xID8gbjEuc2hhcGVGbGFnIDogMDtcbiAgICBjb25zdCBjMiA9IG4yLmNoaWxkcmVuO1xuICAgIGNvbnN0IHsgcGF0Y2hGbGFnLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIGlmIChwYXRjaEZsYWcgPiAwKSB7XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMTI4KSB7XG4gICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDI1Nikge1xuICAgICAgICBwYXRjaFVua2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoYzIgIT09IGMxKSB7XG4gICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIGMyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgICBjMSxcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
20578HVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgOCkge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hVbmtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGMxID0gYzEgfHwgRU1QVFlfQVJSO1xuICAgIGMyID0gYzIgfHwgRU1QVFlfQVJSO1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IGMxLmxlbmd0aDtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBjMi5sZW5ndGg7XG4gICAgY29uc3QgY29tbW9uTGVuZ3RoID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb21tb25MZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgYzFbaV0sXG4gICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMxLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICBjMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIGNvbW1vbkxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoS2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGwyID0gYzIubGVuZ3RoO1xuICAgIGxldCBlMSA9IGMxLmxlbmd0aCAtIDE7XG4gICAgbGV0IGUyID0gbDIgLSAxO1xuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbaV07XG4gICAgICBjb25zdCBuMiA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbZTFdO1xuICAgICAgY29uc3QgbjIgPSBjMltlMl0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltlMl0pIDogbm9ybWFsaXplVk5vZGUoYzJbZTJdKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZTEtLTtcbiAgICAgIGUyLS07XG4gICAgfVxuICAgIGlmIChpID4gZTEpIHtcbiAgICAgIGlmIChpIDw9IGUyKSB7XG4gICAgICAgIGNvbnN0IG5leHRQb3MgPSBlMiArIDE7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRQb3MgPCBsMiA/IGMyW25leHRQb3NdLmVsIDogcGFyZW50QW5jaG9yO1xuICAgICAgICB3aGlsZSAoaSA8PSBlMikge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSA+IGUyKSB7XG4gICAgICB3aGlsZSAoaSA8PSBlMSkge1xuICAgICAgICB1bm1vdW50KGMxW2ldLCBwYXJlbnRDb21wb25lbnQsIH
20578BhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzMSA9IGk7XG4gICAgICBjb25zdCBzMiA9IGk7XG4gICAgICBjb25zdCBrZXlUb05ld0luZGV4TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGZvciAoaSA9IHMyOyBpIDw9IGUyOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICAgIGlmIChuZXh0Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXlUb05ld0luZGV4TWFwLmhhcyhuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIGtleXMgZm91bmQgZHVyaW5nIHVwZGF0ZTpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuZXh0Q2hpbGQua2V5KSxcbiAgICAgICAgICAgICAgYE1ha2Ugc3VyZSBrZXlzIGFyZSB1bmlxdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5VG9OZXdJbmRleE1hcC5zZXQobmV4dENoaWxkLmtleSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBqO1xuICAgICAgbGV0IHBhdGNoZWQgPSAwO1xuICAgICAgY29uc3QgdG9CZVBhdGNoZWQgPSBlMiAtIHMyICsgMTtcbiAgICAgIGxldCBtb3ZlZCA9IGZhbHNlO1xuICAgICAgbGV0IG1heE5ld0luZGV4U29GYXIgPSAwO1xuICAgICAgY29uc3QgbmV3SW5kZXhUb09sZEluZGV4TWFwID0gbmV3IEFycmF5KHRvQmVQYXRjaGVkKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0b0JlUGF0Y2hlZDsgaSsrKSBuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPSAwO1xuICAgICAgZm9yIChpID0gczE7IGkgPD0gZTE7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGQgPSBjMVtpXTtcbiAgICAgICAgaWYgKHBhdGNoZWQgPj0gdG9CZVBhdGNoZWQpIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld0luZGV4O1xuICAgICAgICBpZiAocHJldkNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBrZXlUb05ld0luZGV4TWFwLmdldChwcmV2Q2hpbGQua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGogPSBzMjsgaiA8PSBlMjsgaisrKSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ogLSBzMl0gPT09IDAgJiYgaXNTYW1lVk5vZGVUeXBlKHByZXZDaGlsZCwgYzJbal0pKSB7XG4gICAgICAgICAgICAgIG5ld0luZGV4ID0gajtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdJbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtuZXdJbmRleCAtIHMyXSA9IGkgKyAxO1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSBtYXhOZXdJbmRleFNvRmFyKSB7XG4gICAgICAgICAgICBtYXhOZXdJbmRleFNvRmFyID0gbmV3SW5kZXg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBwcmV2Q2hpbGQsXG4gICAgICAgICAgICBjMltuZXdJbmRleF0sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UgPSBtb3ZlZCA/IGdldFNlcXVlbmNlKG5ld0luZGV4VG9PbGRJbmRleE1hcCkgOiBFTVBUWV9BUlI7XG4gICAgICBqID0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAoaSA9IHRvQmVQYXRjaGVkIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gczIgKyBpO1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltuZXh0SW5kZXhdO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0SW5kZXggKyAxIDwgbDIgPyBjMltuZXh0SW5kZXggKyAxXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9PT0gMCkge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZlZCkge1xuICAgICAgICAgIGlmIChqIDwgMCB8fCBpICE9PSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZVtqXSkge1xuICAgICAgICAgICAgbW92ZShuZXh0Q2hpbGQsIGNvbnRhaW5lciwgYW5jaG9yLCAyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwpID0+IHtcbiAgICBjb25zdCB7IGVsLCB0eX
20578BlLCB0cmFuc2l0aW9uLCBjaGlsZHJlbiwgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgICBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgbW92ZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdm5vZGUuc3VzcGVuc2UubW92ZShjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgIHR5cGUubW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKGNoaWxkcmVuW2ldLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgfVxuICAgICAgaG9zdEluc2VydCh2bm9kZS5hbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgbW92ZVN0YXRpY05vZGUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmVlZFRyYW5zaXRpb24yID0gbW92ZVR5cGUgIT09IDIgJiYgc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uO1xuICAgIGlmIChuZWVkVHJhbnNpdGlvbjIpIHtcbiAgICAgIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4gdHJhbnNpdGlvbi5lbnRlcihlbCksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUsIGFmdGVyTGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHJlbW92ZTIgPSAoKSA9PiBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICBsZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlMigpO1xuICAgICAgICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgICAgZGVsYXlMZWF2ZShlbCwgcmVtb3ZlMiwgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50ID0gKHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHJlZixcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZGlycyxcbiAgICAgIGNhY2hlSW5kZXhcbiAgICB9ID0gdm5vZGU7XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChjYWNoZUluZGV4ICE9IG51bGwpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5yZW5kZXJDYWNoZVtjYWNoZUluZGV4XSA9IHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlRGlycyA9IHNoYXBlRmxhZyAmIDEgJiYgZGlycztcbiAgICBjb25zdCBzaG91bGRJbnZva2VWbm9kZUhvb2sgPSAhaXNBc3luY1dyYXBwZXIodm5vZGUpO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZVVubW91bnQpKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgIHZub2RlLnN1c3BlbnNlLnVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVubW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgdm5vZGUudHlwZS5yZW1vdmUoXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkeW5hbWljQ2hpbGRyZW4gJiYgLy8gIzUxNTRcbiAgICAgIC8vIHdoZW4gdi1vbmNlIGlzIHVzZWQgaW5zaWRlIGEgYmxvY2ssIHNldEJsb2NrVHJhY2tpbmcoLTEpIG1hcmtzIHRoZVxuICAgICAgLy8gcGFyZW50IGJsb2NrIHdpdGggaGFzT25jZTogdHJ1ZVxuICAgICAgLy8gc28gdGhhdCBpdCBkb2Vzbid0IHRha2UgdGhlIGZhc3QgcGF0aCBkdXJpbmcgdW5tb3VudCAtIG90aGVyd2lzZVxuICAgICAgLy8gY29tcG9uZW50cyBuZXN0ZWQgaW4gdi1vbmNlIGFyZSBuZXZlciB1bm1vdW50ZWQuXG4gICAgICAhZHluYW1pY0NoaWxkcmVuLmhhc09uY2UgJiYgLy8gIzExNTM6IGZhc3QgcGF0aCBzaG91bGQgbm90IGJlIHRha2VuIGZvciBub24tc3RhYmxlICh2LWZvcikgZnJhZ21lbn
20578RzXG4gICAgICAodHlwZSAhPT0gRnJhZ21lbnQgfHwgcGF0Y2hGbGFnID4gMCAmJiBwYXRjaEZsYWcgJiA2NCkpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBGcmFnbWVudCAmJiBwYXRjaEZsYWcgJiAoMTI4IHwgMjU2KSB8fCAhb3B0aW1pemVkICYmIHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9SZW1vdmUpIHtcbiAgICAgICAgcmVtb3ZlKHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZVVubW91bnRlZCkgfHwgc2hvdWxkSW52b2tlRGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBzaG91bGRJbnZva2VEaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJ1bm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmUgPSAodm5vZGUpID0+IHtcbiAgICBjb25zdCB7IHR5cGUsIGVsLCBhbmNob3IsIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUucGF0Y2hGbGFnID4gMCAmJiB2bm9kZS5wYXRjaEZsYWcgJiAyMDQ4ICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGhvc3RSZW1vdmUoY2hpbGQuZWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmUoY2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVGcmFnbWVudChlbCwgYW5jaG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBlcmZvcm1SZW1vdmUgPSAoKSA9PiB7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGlmICh0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCAmJiB0cmFuc2l0aW9uLmFmdGVyTGVhdmUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5hZnRlckxlYXZlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgY29uc3QgeyBsZWF2ZSwgZGVsYXlMZWF2ZSB9ID0gdHJhbnNpdGlvbjtcbiAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IGxlYXZlKGVsLCBwZXJmb3JtUmVtb3ZlKTtcbiAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgIGRlbGF5TGVhdmUodm5vZGUuZWwsIHBlcmZvcm1SZW1vdmUsIHBlcmZvcm1MZWF2ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVyZm9ybVJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlRnJhZ21lbnQgPSAoY3VyLCBlbmQpID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoY3VyICE9PSBlbmQpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoY3VyKTtcbiAgICAgIGhvc3RSZW1vdmUoY3VyKTtcbiAgICAgIGN1ciA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RSZW1vdmUoZW5kKTtcbiAgfTtcbiAgY29uc3QgdW5tb3VudENvbXBvbmVudCA9IChpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICB1bnJlZ2lzdGVySE1SKGluc3RhbmNlKTtcbiAgICB9XG4gICAgY29uc3QgeyBidW0sIHNjb3BlLCB1cGRhdGUsIHN1YlRyZWUsIHVtLCBtLCBhIH0gPSBpbnN0YW5jZTtcbiAgICBpbnZhbGlkYXRlTW91bnQobSk7XG4gICAgaW52YWxpZGF0ZU1vdW50KGEpO1xuICAgIGlmIChidW0pIHtcbiAgICAgIGludm9rZUFycmF5Rm5zKGJ1bSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB1cGRhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiYgaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgJiYgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldE5leHRIb3N0Tm9kZSA9ICh2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dEhvc3ROb2RlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgcmV0dXJuIHZub2RlLnN1c3BlbnNlLm5leHQoKTtcbiAgICB9XG4gICAgY29uc3QgZWwgPSBob3N0TmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yIHx8IHZub2RlLmVsKTtcbiAgICBjb25zdCB0ZWxlcG9ydEVuZCA9IGVsICYmIGVsW1RlbGVwb3J0RW5kS2V5XTtcbiAgICByZXR1cm4gdGVsZXBvcnRFbmQgPyBob3N0TmV4dFNpYmxpbmcodGVsZXBvcnRFbmQpIDogZWw7XG4gIH07XG4gIGxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgfHwgbnVsbCxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh7IHR5cGUsIHByb3BzIH0sIGN1cnJlbnROYW1lc3BhY2UpIHtcbiAgcmV0dXJuIGN1cnJlbnROYW1lc3BhY2UgPT09IFwic3ZnXCIgJiYgdHlwZSA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgY3VycmVudE5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiAmJiB0eXBlID09PSBcImFubm90YXRpb24teG1sXCIgJiYgcHJvcHMgJiYgcHJvcHMuZW5jb2RpbmcgJiYgcHJvcHMuZW5jb2RpbmcuaW5jbHVkZXMoXCJodG1sXCIpID8gdm9pZCAwIDogY3VycmVudE5hbWVzcGFjZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIHVwZGF0ZSB9LCBhbGxvd2VkKSB7XG4gIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbmZ1bmN0aW9uIG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSB7XG4gIHJldHVybiAoIXBhcmVudFN1c3BlbnNlIHx8IHBhcmVudFN1c3BlbnNlICYmICFwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZDtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCBzaGFsbG93ID0gZmFsc2UpIHtcbiAgY29uc3QgY2gxID0gbjEuY2hpbGRyZW47XG4gIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICBpZiAoaXNBcnJheShjaDEpICYmIGlzQXJyYXkoY2gyKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxICYmICFjMi5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIpIHtcbiAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWxsb3cgJiYgYzIucGF0Y2hGbGFnICE9PSAtMilcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKGMxLCBjMik7XG4gICAgICB9XG4gICAgICBpZiAoYzIudHlwZSA9PT0gVGV4dCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYzIudHlwZSA9PT0gQ29tbWVudCAmJiAhYzIuZWwpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICB9XG4gI
20578H1cbn1cbmZ1bmN0aW9uIGdldFNlcXVlbmNlKGFycikge1xuICBjb25zdCBwID0gYXJyLnNsaWNlKCk7XG4gIGNvbnN0IHJlc3VsdCA9IFswXTtcbiAgbGV0IGksIGosIHUsIHYsIGM7XG4gIGNvbnN0IGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGFyckkgPSBhcnJbaV07XG4gICAgaWYgKGFyckkgIT09IDApIHtcbiAgICAgIGogPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGFycltqXSA8IGFyckkpIHtcbiAgICAgICAgcFtpXSA9IGo7XG4gICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHUgPSAwO1xuICAgICAgdiA9IHJlc3VsdC5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKHUgPCB2KSB7XG4gICAgICAgIGMgPSB1ICsgdiA+PiAxO1xuICAgICAgICBpZiAoYXJyW3Jlc3VsdFtjXV0gPCBhcnJJKSB7XG4gICAgICAgICAgdSA9IGMgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHYgPSBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXJySSA8IGFycltyZXN1bHRbdV1dKSB7XG4gICAgICAgIGlmICh1ID4gMCkge1xuICAgICAgICAgIHBbaV0gPSByZXN1bHRbdSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFt1XSA9IGk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHUgPSByZXN1bHQubGVuZ3RoO1xuICB2ID0gcmVzdWx0W3UgLSAxXTtcbiAgd2hpbGUgKHUtLSA+IDApIHtcbiAgICByZXN1bHRbdV0gPSB2O1xuICAgIHYgPSBwW3ZdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBsb2NhdGVOb25IeWRyYXRlZEFzeW5jUm9vdChpbnN0YW5jZSkge1xuICBjb25zdCBzdWJDb21wb25lbnQgPSBpbnN0YW5jZS5zdWJUcmVlLmNvbXBvbmVudDtcbiAgaWYgKHN1YkNvbXBvbmVudCkge1xuICAgIGlmIChzdWJDb21wb25lbnQuYXN5bmNEZXAgJiYgIXN1YkNvbXBvbmVudC5hc3luY1Jlc29sdmVkKSB7XG4gICAgICByZXR1cm4gc3ViQ29tcG9uZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3Qoc3ViQ29tcG9uZW50KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGludmFsaWRhdGVNb3VudChob29rcykge1xuICBpZiAoaG9va3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSBob29rc1tpXS5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufVxuXG5jb25zdCBzc3JDb250ZXh0S2V5ID0gU3ltYm9sLmZvcihcInYtc2N4XCIpO1xuY29uc3QgdXNlU1NSQ29udGV4dCA9ICgpID0+IHtcbiAge1xuICAgIGNvbnN0IGN0eCA9IGluamVjdChzc3JDb250ZXh0S2V5KTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBTZXJ2ZXIgcmVuZGVyaW5nIGNvbnRleHQgbm90IHByb3ZpZGVkLiBNYWtlIHN1cmUgdG8gb25seSBjYWxsIHVzZVNTUkNvbnRleHQoKSBjb25kaXRpb25hbGx5IGluIHRoZSBzZXJ2ZXIgYnVpbGQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN0eDtcbiAgfVxufTtcblxuZnVuY3Rpb24gd2F0Y2hFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKGVmZmVjdCwgbnVsbCwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiB3YXRjaFBvc3RFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwicG9zdFwiIH0pIDogeyBmbHVzaDogXCJwb3N0XCIgfVxuICApO1xufVxuZnVuY3Rpb24gd2F0Y2hTeW5jRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInN5bmNcIiB9KSA6IHsgZmx1c2g6IFwic3luY1wiIH1cbiAgKTtcbn1cbmNvbnN0IElOSVRJQUxfV0FUQ0hFUl9WQUxVRSA9IHt9O1xuZnVuY3Rpb24gd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihjYikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgXFxgd2F0Y2goZm4sIG9wdGlvbnM/KVxcYCBzaWduYXR1cmUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBBUEkuIFVzZSBcXGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pXFxgIGluc3RlYWQuIFxcYHdhdGNoXFxgIG5vdyBvbmx5IHN1cHBvcnRzIFxcYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkb1dhdGNoKHNvdXJjZSwgY2IsIHtcbiAgaW1tZWRpYXRlLFxuICBkZWVwLFxuICBmbHVzaCxcbiAgb25jZSxcbiAgb25UcmFjayxcbiAgb25UcmlnZ2VyXG59ID0gRU1QVFlfT0JKKSB7XG4gIGlmIChjYiAmJiBvbmNlKSB7XG4gICAgY29uc3QgX2NiID0gY2I7XG4gICAgY2IgPSAoLi4uYXJncykgPT4ge1xuICAgICAgX2NiKC4uLmFyZ3MpO1xuICAgICAgdW53YXRjaCgpO1xuICAgIH07XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVlcCAhPT0gdm9pZCAwICYmIHR5cGVvZiBkZWVwID09PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIHdpdGggbnVtYmVyIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB3YXRjaCBkZXB0aCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSB1c2UgYSBib29sZWFuIGluc3RlYWQgdG8gYXZvaWQgcG90ZW50aWFsIGJyZWFrYWdlLmBcbiAgICApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmICFjYikge1xuICAgIGlmIChpbW1lZGlhdGUgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcImltbWVkaWF0ZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWVwICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9uY2UgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcIm9uY2VcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCB3YXJuSW52YWxpZFNvdXJjZSA9IChzKSA9PiB7XG4gICAgd2FybiQxKFxuICAgICAgYEludmFsaWQgd2F0Y2ggc291cmNlOiBgLFxuICAgICAgcyxcbiAgICAgIGBBIHdhdGNoIHNvdXJjZSBjYW4gb25seSBiZSBhIGdldHRlci9lZmZlY3QgZnVuY3Rpb24sIGEgcmVmLCBhIHJlYWN0aXZlIG9iamVjdCwgb3IgYW4gYXJyYXkgb2YgdGhlc2UgdHlwZXMuYFxuICAgICk7XG4gIH07XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICBjb25zdCByZWFjdGl2ZUdldHRlciA9IChzb3VyY2UyKSA9PiBkZWVwID09PSB0cnVlID8gc291cmNlMiA6IChcbiAgICAvLyBmb3IgZGVlcDogZmFsc2UsIG9ubHkgdHJhdmVyc2Ugcm9vdC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgdHJhdmVyc2Uoc291cmNlMiwgZGVlcCA9PT0gZmFsc2UgPyAxIDogdm9pZCAwKVxuICApO1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgZm9yY2VUcmlnZ2VyID0gZmFsc2U7XG4gIGxldCBpc011bHRpU291cmNlID0gZmFsc2U7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLnZhbHVlO1xuICAgIGZvcmNlVHJpZ2dlciA9IGlzU2hhbGxvdyhzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3cocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVHZXR0ZXIocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIGlmIChjYikge1xuICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChjbGVhbnVwKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMyxcbiAgICAgICAgICBbb25DbGVhbnVwXVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gTk9PUDtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gIH1cbiAgaWYgKGNiICYmIGRlZXApIHtcbiAgICBjb25zdCBiYXNlR2V0dGVyID0gZ2V0dGVyO1xuICAgIGdldHRlciA9ICgpID0+IHRyYXZlcnNlKGJhc2VHZXR0ZXIoKSk7XG4gIH1cbiAgbGV0IGNsZWFudXA7XG4gIGxldCBvbkNsZWFudXAgPSAoZm4pID0+IHtcbiAgICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9ICgpID0+IHtcbiAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIDQpO1xuICAgICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSB2b2lkIDA7XG4gICAgfTtcbiAgfTtcbiAgbGV0IHNzckNsZWFudXA7XG4gIGlmIChpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICBvbkNsZWFudXAgPSBOT09QO1xuICAgIGlmICghY2IpIHtcbiAgICAgIGdldHRlcigpO1xuICAgIH0gZWxzZSBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgZ2V0dGVyKCksXG4gICAgICAgIGlzTXVsdGlTb3VyY2UgPyBbXSA6IHZvaWQgMCxcbiAgICAgICAgb25DbGVhbnVwXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKGZsdXNoID09PSBcInN5bmNcIikge1xuICAgICAgY29uc3QgY3R4ID0gdXNlU1NSQ29udGV4dCgpO1xuICAgICAgc3NyQ2xlYW51cCA9IGN0eC5fX3dhdGNoZXJIYW5kbGVzIHx8IChjdHguX193YXRjaGVySGFuZGxlcyA9IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE5PT1A7XG4gICAgfVxuICB9XG4gIGxldCBvbGRWYWx1ZSA9IGlzTXVsdGlTb3VyY2UgPyBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCkuZmlsbChJTklUSUFMX1dBVENIRVJfVkFMVUUpIDogSU5JVElBTF9XQVRDSEVSX1ZBTFVFO1xuICBjb25zdCBqb2IgPSAoKSA9PiB7XG4gICAgaWYgKCFlZmZlY3QuYWN0aXZlIHx8ICFlZmZlY3QuZGlydHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNiKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICAgIGlmIChkZWVwIHx8IGZvcmNlVHJpZ2dlciB8fCAoaXNNdWx0aVNvdXJjZSA/IG5ld1ZhbHVlLnNvbWUoKHYsIGkpID0+IGhhc0NoYW5nZWQodiwgb2xkVmFsdWVbaV0pKSA6IGhhc0NoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKSkgfHwgZmFsc2UpIHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgI
20578H1cbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzLCBbXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgLy8gcGFzcyB1bmRlZmluZWQgYXMgdGhlIG9sZCB2YWx1ZSB3aGVuIGl0J3MgY2hhbmdlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gdm9pZCAwIDogaXNNdWx0aVNvdXJjZSAmJiBvbGRWYWx1ZVswXSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gW10gOiBvbGRWYWx1ZSxcbiAgICAgICAgICBvbkNsZWFudXBcbiAgICAgICAgXSk7XG4gICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH07XG4gIGpvYi5hbGxvd1JlY3Vyc2UgPSAhIWNiO1xuICBsZXQgc2NoZWR1bGVyO1xuICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgc2NoZWR1bGVyID0gam9iO1xuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBqb2IucHJlID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFuY2UpIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBzY2hlZHVsZXIgPSAoKSA9PiBxdWV1ZUpvYihqb2IpO1xuICB9XG4gIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIE5PT1AsIHNjaGVkdWxlcik7XG4gIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG4gIGNvbnN0IHVud2F0Y2ggPSAoKSA9PiB7XG4gICAgZWZmZWN0LnN0b3AoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHJlbW92ZShzY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBlZmZlY3Qub25UcmFjayA9IG9uVHJhY2s7XG4gICAgZWZmZWN0Lm9uVHJpZ2dlciA9IG9uVHJpZ2dlcjtcbiAgfVxuICBpZiAoY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBqb2IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkVmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgIGVmZmVjdC5ydW4uYmluZChlZmZlY3QpLFxuICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5ydW4oKTtcbiAgfVxuICBpZiAoc3NyQ2xlYW51cCkgc3NyQ2xlYW51cC5wdXNoKHVud2F0Y2gpO1xuICByZXR1cm4gdW53YXRjaDtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgcmVzZXQoKTtcbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKHZhbHVlLCBkZXB0aCA9IEluZmluaXR5LCBzZWVuKSB7XG4gIGlmIChkZXB0aCA8PSAwIHx8ICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbXCJfX3Zfc2tpcFwiXSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHNlZW4uYWRkKHZhbHVlKTtcbiAgZGVwdGgtLTtcbiAgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHRyYXZlcnNlKHZhbHVlLnZhbHVlLCBkZXB0aCwgc2Vlbik7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgZGVwdGgsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkgfHwgaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgodikgPT4ge1xuICAgICAgdHJhdmVyc2UodiwgZGVwdGgsIHNlZW4pO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlW2tleV0sIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh2YWx1ZSkpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsdWVba2V5XSwgZGVwdGgsIHNlZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVzZU1vZGVsKHByb3BzLCBuYW1lLCBvcHRpb25zID0gRU1QVFlfT0JKKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICAgIHJldHVybi
20578ByZWYoKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bbmFtZV0pIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGggcHJvcCBcIiR7bmFtZX1cIiB3aGljaCBpcyBub3QgZGVjbGFyZWQuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGNvbnN0IGNhbWVsaXplZE5hbWUgPSBjYW1lbGl6ZShuYW1lKTtcbiAgY29uc3QgaHlwaGVuYXRlZE5hbWUgPSBoeXBoZW5hdGUobmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGVsTW9kaWZpZXJzKHByb3BzLCBuYW1lKTtcbiAgY29uc3QgcmVzID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIGxldCBsb2NhbFZhbHVlO1xuICAgIGxldCBwcmV2U2V0VmFsdWUgPSBFTVBUWV9PQko7XG4gICAgbGV0IHByZXZFbWl0dGVkVmFsdWU7XG4gICAgd2F0Y2hTeW5jRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BWYWx1ZSA9IHByb3BzW25hbWVdO1xuICAgICAgaWYgKGhhc0NoYW5nZWQobG9jYWxWYWx1ZSwgcHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbFZhbHVlID0gcHJvcFZhbHVlO1xuICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgdHJhY2soKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0ID8gb3B0aW9ucy5nZXQobG9jYWxWYWx1ZSkgOiBsb2NhbFZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBpZiAoIWhhc0NoYW5nZWQodmFsdWUsIGxvY2FsVmFsdWUpICYmICEocHJldlNldFZhbHVlICE9PSBFTVBUWV9PQkogJiYgaGFzQ2hhbmdlZCh2YWx1ZSwgcHJldlNldFZhbHVlKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3UHJvcHMgPSBpLnZub2RlLnByb3BzO1xuICAgICAgICBpZiAoIShyYXdQcm9wcyAmJiAvLyBjaGVjayBpZiBwYXJlbnQgaGFzIHBhc3NlZCB2LW1vZGVsXG4gICAgICAgIChuYW1lIGluIHJhd1Byb3BzIHx8IGNhbWVsaXplZE5hbWUgaW4gcmF3UHJvcHMgfHwgaHlwaGVuYXRlZE5hbWUgaW4gcmF3UHJvcHMpICYmIChgb25VcGRhdGU6JHtuYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7Y2FtZWxpemVkTmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2h5cGhlbmF0ZWROYW1lfWAgaW4gcmF3UHJvcHMpKSkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW1pdHRlZFZhbHVlID0gb3B0aW9ucy5zZXQgPyBvcHRpb25zLnNldCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIGVtaXR0ZWRWYWx1ZSk7XG4gICAgICAgIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBlbWl0dGVkVmFsdWUpICYmIGhhc0NoYW5nZWQodmFsdWUsIHByZXZTZXRWYWx1ZSkgJiYgIWhhc0NoYW5nZWQoZW1pdHRlZFZhbHVlLCBwcmV2RW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2U2V0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcHJldkVtaXR0ZWRWYWx1ZSA9IGVtaXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmVzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB7XG4gICAgbGV0IGkyID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKGkyIDwgMikge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBpMisrID8gbW9kaWZpZXJzIHx8IEVNUFRZX09CSiA6IHJlcywgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gcmVzO1xufVxuY29uc3QgZ2V0TW9kZWxNb2RpZmllcnMgPSAocHJvcHMsIG1vZGVsTmFtZSkgPT4ge1xuICByZXR1cm4gbW9kZWxOYW1lID09PSBcIm1vZGVsVmFsdWVcIiB8fCBtb2RlbE5hbWUgPT09IFwibW9kZWwtdmFsdWVcIiA/IHByb3BzLm1vZGVsTW9kaWZpZXJzIDogcHJvcHNbYCR7bW9kZWxOYW1lfU1vZGlmaWVyc2BdIHx8IHByb3BzW2Ake2NhbWVsaXplKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF0gfHwgcHJvcHNbYCR7aHlwaGVuYXRlKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF07XG59O1xuXG5mdW5jdGlvbiBlbWl0KGluc3RhbmNlLCBldmVudCwgLi4ucmF3QXJncykge1xuICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHJldHVybjtcbiAgY29uc3QgcHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3Qge1xuICAgICAgZW1pdHNPcHRpb25zLFxuICAgICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICAgIH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoZW1pdHNPcHRpb25zKSB7XG4gICAgICBpZiAoIShldmVudCBpbiBlbWl0c09wdGlvbnMpICYmIHRydWUpIHtcbiAgICAgICAgaWYgKCFwcm9wc09wdGlvbnMgfHwgISh0b0hhbmRsZXJLZXkoZXZlbnQpIGluIHByb3BzT3B0aW9ucykpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IGVtaXR0ZWQgZXZlbnQgXCIke2V2ZW50fVwiIGJ1dCBpdCBpcyBuZWl0aGVyIGRlY2xhcmVkIGluIHRoZSBlbWl0cyBvcHRpb24gbm9yIGFzIGFuIFwiJHt0b0hhbmRsZXJLZXkoZXZlbnQpfVwiIHByb3AuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGVtaXRzT3B0aW9uc1tldmVudF07XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbGlkYXRvcikpIHtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdG9yKC4uLnJhd0FyZ3MpO1xuICAgICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCBcIiR7ZXZlbnR9XCIuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGFyZ3MgPSByYXdBcmdzO1xuICBjb25zdCBpc01vZGVsTGlzdGVuZXIgPSBldmVudC5zdGFydHNXaXRoKFwidXBkYXRlOlwiKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gaXNNb2RlbExpc3RlbmVyICYmIGdldE1vZGVsTW9kaWZpZXJzKHByb3BzLCBldmVudC5zbGljZSg3KSk7XG4gIGlmIChtb2RpZmllcnMpIHtcbiAgICBpZiAobW9kaWZpZXJzLnRyaW0pIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcCgoYSkgPT4gaXNTdHJpbmcoYSkgPyBhLnRyaW0oKSA6IGEpO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLm51bWJlcikge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGxvb3NlVG9OdW1iZXIpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc0NvbXBvbmVudEVtaXQoaW5zdGFuY2UsIGV2ZW50LCBhcmdzKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHByb3BzW3RvSGFuZGxlcktleShsb3dlckNhc2VFdmVudCldKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBFdmVudCBcIiR7bG93ZXJDYXNlRXZlbnR9XCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgJHtmb3JtYXRDb21wb25lbnROYW1lKFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIGluc3RhbmNlLnR5cGVcbiAgICAgICAgKX0gYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiJHtldmVudH1cIi4gTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgeW91IGNhbm5vdCB1c2Ugdi1vbiB0byBsaXN0ZW4gdG8gY2FtZWxDYXNlIGV2ZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiJHtoeXBoZW5hdGUoXG4gICAgICAgICAgZXZlbnRcbiAgICAgICAgKX1cIiBpbnN0ZWFkIG9mIFwiJHtldmVudH1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBsZXQgaGFuZGxlck5hbWU7XG4gIGxldCBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoZXZlbnQpXSB8fCAvLyBhbHNvIHRyeSBjYW1lbENhc2UgZXZlbnQgaGFuZGxlciAoIzIyNDkpXG4gIHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSldO1xuICBpZiAoIWhhbmRsZXIgJiYgaXNNb2RlbExpc3RlbmVyKSB7XG4gICAgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGh5cGhlbmF0ZShldmVudCkpXTtcbiAgfVxuICBpZiAoaGFuZGxlcikge1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG4gIGNvbnN0IG9uY2VIYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgKyBgT25jZWBdO1xuICBpZiAob25jZUhhbmRsZXIpIHtcbiAgICBpZiAoIWluc3RhbmNlLmVtaXR0ZWQpIHtcbiAgICAgIGluc3RhbmNlLmVtaXR0ZWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdID0gdHJ1ZTtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIG9uY2VIYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBhcHBDb250ZXh0LmVtaXRzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLmVtaXRzO1xuICBsZXQgbm9ybWFsaXplZCA9IHt9O1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZEVtaXRzID0gKHJhdzIpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKSB7XG4gICAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZEVtaXRzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICByYXcuZm9yRWFjaCgoa2V5KSA9PiBub3JtYWxpemVkW2tleV0gPSBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgfVxuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgbm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiBpc0VtaXRMaXN0ZW5lcihvcHRpb25zLCBrZXkpIHtcbiAgaWYgKCFvcHRpb25zIHx8ICFpc09uKGtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAga2V5ID0ga2V5LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywgXCJcIik7XG4gIHJldHVybi
20578BoYXNPd24ob3B0aW9ucywga2V5WzBdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkpIHx8IGhhc093bihvcHRpb25zLCBoeXBoZW5hdGUoa2V5KSkgfHwgaGFzT3duKG9wdGlvbnMsIGtleSk7XG59XG5cbmxldCBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG5mdW5jdGlvbiBtYXJrQXR0cnNBY2Nlc3NlZCgpIHtcbiAgYWNjZXNzZWRBdHRycyA9IHRydWU7XG59XG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlOiBDb21wb25lbnQsXG4gICAgdm5vZGUsXG4gICAgcHJveHksXG4gICAgd2l0aFByb3h5LFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc10sXG4gICAgc2xvdHMsXG4gICAgYXR0cnMsXG4gICAgZW1pdCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyQ2FjaGUsXG4gICAgcHJvcHMsXG4gICAgZGF0YSxcbiAgICBzZXR1cFN0YXRlLFxuICAgIGN0eCxcbiAgICBpbmhlcml0QXR0cnNcbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKTtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IGZhbGx0aHJvdWdoQXR0cnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDQpIHtcbiAgICAgIGNvbnN0IHByb3h5VG9Vc2UgPSB3aXRoUHJveHkgfHwgcHJveHk7XG4gICAgICBjb25zdCB0aGlzUHJveHkgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwID8gbmV3IFByb3h5KHByb3h5VG9Vc2UsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBQcm9wZXJ0eSAnJHtTdHJpbmcoXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKX0nIHdhcyBhY2Nlc3NlZCB2aWEgJ3RoaXMnLiBBdm9pZCB1c2luZyAndGhpcycgaW4gdGVtcGxhdGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgICB9KSA6IHByb3h5VG9Vc2U7XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyLmNhbGwoXG4gICAgICAgICAgdGhpc1Byb3h5LFxuICAgICAgICAgIHByb3h5VG9Vc2UsXG4gICAgICAgICAgcmVuZGVyQ2FjaGUsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocHJvcHMpIDogcHJvcHMsXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNoYWxsb3dSZWFkb25seShhdHRycyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xvdHMsXG4gICAgICAgICAgICBlbWl0XG4gICAgICAgICAgfSA6IHsgYXR0cnMsIHNsb3RzLCBlbWl0IH1cbiAgICAgICAgKSA6IHJlbmRlcjIoXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gQ29tcG9uZW50LnByb3BzID8gYXR0cnMgOiBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2goYXR0cnMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYmxvY2tTdGFjay5sZW5ndGggPSAwO1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDEpO1xuICAgIHJlc3VsdCA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9XG4gIGxldCByb290ID0gcmVzdWx0O1xuICBsZXQgc2V0Um9vdCA9IHZvaWQgMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVzdWx0LnBhdGNoRmxhZyA+IDAgJiYgcmVzdWx0LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICBbcm9vdCwgc2V0Um9vdF0gPSBnZXRDaGlsZFJvb3QocmVzdWx0KTtcbiAgfVxuICBpZiAoZmFsbHRocm91Z2hBdHRycyAmJiBpbmhlcml0QXR0cnMgIT09IGZhbHNlKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnIH0gPSByb290O1xuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNikpIHtcbiAgICAgICAgaWYgKHByb3BzT3B0aW9ucyAmJiBrZXlzLnNvbWUoaXNNb2RlbExpc3RlbmVyKSkge1xuICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBmaWx0ZXJNb2RlbExpc3RlbmVycyhcbiAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMsXG4gICAgICAgICAgICBwcm9wc09wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIGZhbGx0aHJvdWdoQXR0cnMsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhYWNjZXNzZWRBdHRycyAmJiByb290LnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgYWxsQXR0cnMgPSBPYmplY3Qua2V5cyhhdHRycyk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXR0cnMgPSBbXTtcbiAgICAgICAgY29uc3QgZXh0cmFBdHRycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFsbEF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGFsbEF0dHJzW2ldO1xuICAgICAgICAgIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgICAgICAgICAgZXZlbnRBdHRycy5wdXNoKGtleVsyXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDMpKTtcbiAgICAgICAgICAgI
20578H1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cmFBdHRycy5wdXNoKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRyYUF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1wcm9wcyBhdHRyaWJ1dGVzICgke2V4dHJhQXR0cnMuam9pbihcIiwgXCIpfSkgd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IHJvb3Qgbm9kZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50QXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoJHtldmVudEF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlIFwiZW1pdHNcIiBvcHRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgUnVudGltZSBkaXJlY3RpdmUgdXNlZCBvbiBjb21wb25lbnQgd2l0aCBub24tZWxlbWVudCByb290IG5vZGUuIFRoZSBkaXJlY3RpdmVzIHdpbGwgbm90IGZ1bmN0aW9uIGFzIGludGVuZGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIG51bGwsIGZhbHNlLCB0cnVlKTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnRyYW5zaXRpb24gPSB2bm9kZS50cmFuc2l0aW9uO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldFJvb3QpIHtcbiAgICBzZXRSb290KHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHJvb3Q7XG4gIH1cbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXYpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ2V0Q2hpbGRSb290ID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gIGNvbnN0IGR5bmFtaWNDaGlsZHJlbiA9IHZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgY29uc3QgY2hpbGRSb290ID0gZmlsdGVyU2luZ2xlUm9vdChyYXdDaGlsZHJlbiwgZmFsc2UpO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnID4gMCAmJiBjaGlsZFJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIHJldHVybiBnZXRDaGlsZFJvb3QoY2hpbGRSb290KTtcbiAgfVxuICBjb25zdCBpbmRleCA9IHJhd0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KTtcbiAgY29uc3QgZHluYW1pY0luZGV4ID0gZHluYW1pY0NoaWxkcmVuID8gZHluYW1pY0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KSA6IC0xO1xuICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgcmF3Q2hpbGRyZW5baW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgaWYgKGR5bmFtaWNJbmRleCA+IC0xKSB7XG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbltkeW5hbWljSW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRSb290LnBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gWy4uLmR5bmFtaWNDaGlsZHJlbiwgdXBkYXRlZFJvb3RdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuLCByZWN1cnNlID0gdHJ1ZSkge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHJlY3Vyc2UgJiYgc2luZ2xlUm9vdC5wYXRjaEZsYWcgPiAwICYmIHNpbmdsZVJvb3QucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlclNpbmdsZVJvb3Qoc2luZ2xlUm9vdC5jaGlsZHJlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gI
20578H1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQuc3ViVHJlZTtcbiAgICBpZiAocm9vdC5zdXNwZW5zZSAmJiByb290LnN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9PT0gdm5vZGUpIHtcbiAgICAgIHJvb3QuZWwgPSB2bm9kZS5lbDtcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IHZub2RlKSB7XG4gICAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaXNTdXNwZW5zZSA9ICh0eXBlKSA9PiB0eXBlLl9faXNTdXNwZW5zZTtcbmxldCBzdXNwZW5zZUlkID0gMDtcbmNvbnN0IFN1c3BlbnNlSW1wbCA9IHtcbiAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAvLyBJbiBvcmRlciB0byBtYWtlIFN1c3BlbnNlIHRyZWUtc2hha2FibGUsIHdlIG5lZWQgdG8gYXZvaWQgaW1wb3J0aW5nIGl0XG4gIC8vIGRpcmVjdGx5IGluIHRoZSByZW5kZXJlci4gVGhlIHJlbmRlcmVyIGNoZWNrcyBmb3IgdGhlIF9faXNTdXNwZW5zZSBmbGFnXG4gIC8vIG9uIGEgdm5vZGUncyB0eXBlIGFuZCBjYWxscyB0aGUgYHByb2Nlc3NgIG1ldGhvZCwgcGFzc2luZyBpbiByZW5kZXJlclxuICAvLyBpbnRlcm5hbHMuXG4gIF9faXNTdXNwZW5zZTogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIH
20578BhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscykge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudFN1c3BlbnNlKFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UuZGVwcyA+IDAgJiYgIW4xLnN1c3BlbnNlLmlzSW5GYWxsYmFjaykge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICBuMi5zdXNwZW5zZS52bm9kZSA9IG4yO1xuICAgICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG5jb25zdCBTdXNwZW5zZSA9IFN1c3BlbnNlSW1wbCA7XG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodm5vZGUsIG5hbWUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzW25hbWVdO1xuICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgIGV2ZW50TGlzdGVuZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFsc1xuICApO1xuICBwYXRjaChcbiAgICBudWxsLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIG51bGwsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHNcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPiAwKSB7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uUGVuZGluZ1wiKTtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25GYWxsYmFja1wiKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZS5zc0ZhbGxiYWNrLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICBjb25zdCBzdXNwZW5zZSA9IG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2U7XG4gIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gIG4yLmVsID0gbjEuZWw7XG4gIGNvbnN0IG5ld0JyYW5jaCA9IG4yLnNzQ29udGVudDtcbiAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICBjb25zdCB7IGFjdGl2ZUJyYW5jaCwgcGVuZGluZ0JyYW5jaCwgaXNJbkZhbGxiYWNrLCBpc0h5ZHJhdGluZyB9ID0gc3VzcGVuc2U7XG4gIGlmIChwZW5kaW5nQnJhbmNoKSB7XG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgcGVuZGluZ0JyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgI
20578HNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IHBlbmRpbmdCcmFuY2g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KHBlbmRpbmdCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICAgIG5ld0ZhbGxiYWNrLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBpZiAobmV3QnJhbmNoLnNoYXBlRmxhZyAmIDUxMikge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBuZXdCcmFuY2guY29tcG9uZW50LnN1c3BlbnNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICB9XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCwgcGVuZGluZ0lkIH0gPSBzdXNwZW5zZTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0lkID09PSBwZW5kaW5nSWQpIHtcbiAgICAgICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgI
20578H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudFN1c3BlbnNlLCBwYXJlbnRDb21wb25lbnQsIGNvbnRhaW5lciwgaGlkZGVuQ29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZDtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMrKztcbiAgICB9XG4gIH1cbiAgY29uc3QgdGltZW91dCA9IHZub2RlLnByb3BzID8gdG9OdW1iZXIodm5vZGUucHJvcHMudGltZW91dCkgOiB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEFuY2hvciA9IGFuY2hvcjtcbiAgY29uc3Qgc3VzcGVuc2UgPSB7XG4gICAgdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgZGVwczogMCxcbiAgICBwZW5kaW5nSWQ6IHN1c3BlbnNlSWQrKyxcbiAgICB0aW1lb3V0OiB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXQgOiAtMSxcbiAgICBhY3RpdmVCcmFuY2g6IG51bGwsXG4gICAgcGVuZGluZ0JyYW5jaDogbnVsbCxcbiAgICBpc0luRmFsbGJhY2s6ICFpc0h5ZHJhdGluZyxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUoXG4gICAgICAgICAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgICAgIGFuY2hvciA9PT0gaW5pdGlhbEFuY2hvciA/IG5leHQoYWN0aXZlQnJhbmNoKSA6IGFuY2hvcixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSAhPT0gc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBhbmNob3IgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQyLCBzdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgICAgbW92ZShwZW5kaW5nQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHBlbmRpbmdCcmFuY2gpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG51bGw7XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgIGxldCBwYXJlbnQgPSBzdXNwZW5zZS5wYXJlbnQ7XG4gICAgICBsZXQgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gZmFsc2U7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgI
20578HBhcmVudC5lZmZlY3RzLnB1c2goLi4uZWZmZWN0cyk7XG4gICAgICAgICAgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNVbnJlc29sdmVkQW5jZXN0b3IgJiYgIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgcXVldWVQb3N0Rmx1c2hDYihlZmZlY3RzKTtcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMgPSBbXTtcbiAgICAgIGlmIChpc1N1c3BlbnNpYmxlKSB7XG4gICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmIHBhcmVudFN1c3BlbnNlSWQgPT09IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCAmJiAhc3luYykge1xuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvblJlc29sdmVcIik7XG4gICAgfSxcbiAgICBmYWxsYmFjayhmYWxsYmFja1ZOb2RlKSB7XG4gICAgICBpZiAoIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyLCBhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MiwgY29udGFpbmVyOiBjb250YWluZXIyLCBuYW1lc3BhY2U6IG5hbWVzcGFjZTIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgbmFtZXNwYWNlMixcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgZmFsbGJhY2tWTm9kZSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVsYXlFbnRlciA9IGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbiAmJiBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgIGFjdGl2ZUJyYW5jaC50cmFuc2l0aW9uLmFmdGVyTGVhdmUgPSBtb3VudEZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIHVubW91bnQoXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gbm8gc3VzcGVuc2Ugc28gdW5tb3VudCBob29rcyBmaXJlIG5vd1xuICAgICAgICB0cnVlXG4gICAgICAgIC8vIHNob3VsZFJlbW92ZVxuICAgICAgKTtcbiAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICBtb3VudEZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtb3ZlKGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpIHtcbiAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBtb3ZlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSk7XG4gICAgICBzdXNwZW5zZS5jb250YWluZXIgPSBjb250YWluZXIyO1xuICAgIH0sXG4gICAgbmV4dCgpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbmV4dChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0LCBvcHRpbWl6ZWQyKSB7XG4gICAgICBjb25zdCBpc0luUGVuZGluZ1N1c3BlbnNlID0gISFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoO1xuICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UpIHtcbiAgICAgICAgc3VzcGVuc2UuZGVwcysrO1xuICAgICAgfVxuICAgICAgY29uc3QgaHlkcmF0ZWRFbCA9IGluc3RhbmNlLnZub2RlLmVsO1xuICAgICAgaW5zdGFuY2UuYXN5bmNEZXAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAwKTtcbiAgICAgIH0pLnRoZW4oKGFzeW5jU2V0dXBSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLnBlbmRpbmdJZCAhPT0gaW5zdGFuY2Uuc3VzcGVuc2VJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5hc3luY1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUyKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgYXN5bmNTZXR1cFJlc3VsdCwgZmFsc2UpO1xuICAgICAgICBpZiAoaHlkcmF0ZWRFbCkge1xuICAgICAgICAgIHZub2RlMi5lbCA9IGh5ZHJhdGVkRWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAhaHlkcmF0ZWRFbCAmJiBpbnN0YW5jZS5zdWJUcmVlLmVsO1xuICAgICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB2bm9kZTIsXG4gICAgICAgICAgLy8gY29tcG9uZW50IG1heSBoYXZlIGJlZW4gbW92ZWQgYmVmb3JlIHJlc29sdmUuXG4gICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBoeWRyYXRpb24sIGluc3RhbmNlLnN1YlRyZWUgd2lsbCBiZSB0aGUgY29tbWVudFxuICAgICAgICAgIC8vIHBsYWNlaG9sZG
20578VyLlxuICAgICAgICAgIHBhcmVudE5vZGUoaHlkcmF0ZWRFbCB8fCBpbnN0YW5jZS5zdWJUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3Igd2lsbCBub3QgYmUgdXNlZCBpZiB0aGlzIGlzIGh5ZHJhdGlvbiwgc28gb25seSBuZWVkIHRvXG4gICAgICAgICAgLy8gY29uc2lkZXIgdGhlIGNvbW1lbnQgcGxhY2Vob2xkZXIgY2FzZS5cbiAgICAgICAgICBoeWRyYXRlZEVsID8gbnVsbCA6IG5leHQoaW5zdGFuY2Uuc3ViVHJlZSksXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG9wdGltaXplZDJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlMi5lbCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudChwYXJlbnRTdXNwZW5zZTIsIGRvUmVtb3ZlKSB7XG4gICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3VzcGVuc2U7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2Uobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBoeWRyYXRlTm9kZSkge1xuICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlID0gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeShcbiAgICB2bm9kZSxcbiAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbm9kZS5wYXJlbnROb2RlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICAgIG51bGwsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgdHJ1ZVxuICApO1xuICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShcbiAgICBub2RlLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWRcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlbih2bm9kZSkge1xuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBpc1Nsb3RDaGlsZHJlbiA9IHNoYXBlRmxhZyAmIDMyO1xuICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoXG4gICAgaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW5cbiAgKTtcbiAgdm5vZGUuc3NGYWxsYmFjayA9IGlzU2xvdENoaWxkcmVuID8gbm9ybWFsaXplU3VzcGVuc2VTbG90KGNoaWxkcmVuLmZhbGxiYWNrKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VTbG90KHMpIHtcbiAgbGV0IGJsb2NrO1xuICBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IGZhbHNlO1xuICAgICAgb3BlbkJsb2NrKCk7XG4gICAgfVxuICAgIHMgPSBzKCk7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSB0cnVlO1xuICAgICAgYmxvY2sgPSBjdXJyZW50QmxvY2s7XG4gICAgICBjbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KHMpKSB7XG4gICAgY29uc3Qgc2luZ2xlQ2hpbGQgPSBmaWx0ZXJTaW5nbGVSb290KHMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFzaW5nbGVDaGlsZCAmJiBzLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkICE9PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKS5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuJDEoYDxTdXNwZW5zZT4gc2xvdHMgZXhwZWN0IGEgc2luZ2xlIHJvb3Qgbm9kZS5gKTtcbiAgICB9XG4gICAgcyA9IHNpbmdsZUNoaWxkO1xuICB9XG4gIHMgPSBub3JtYWxpemVWTm9kZShzKTtcbiAgaWYgKGJsb2NrICYmICFzLmR5bmFtaWNDaGlsZHJlbikge1xuICAgIHMuZHluYW1pY0NoaWxkcmVuID0gYmxvY2suZmlsdGVyKChjKSA9PiBjICE9PSBzKTtcbiAgfVxuICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlKGZuLCBzdXNwZW5zZSkge1xuICBpZiAoc3VzcGVuc2UgJiYgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgIGlmIChpc0FycmF
205785KGZuKSkge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKC4uLmZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKGZuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcXVldWVQb3N0Rmx1c2hDYihmbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgYnJhbmNoKSB7XG4gIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IGJyYW5jaDtcbiAgY29uc3QgeyB2bm9kZSwgcGFyZW50Q29tcG9uZW50IH0gPSBzdXNwZW5zZTtcbiAgbGV0IGVsID0gYnJhbmNoLmVsO1xuICB3aGlsZSAoIWVsICYmIGJyYW5jaC5jb21wb25lbnQpIHtcbiAgICBicmFuY2ggPSBicmFuY2guY29tcG9uZW50LnN1YlRyZWU7XG4gICAgZWwgPSBicmFuY2guZWw7XG4gIH1cbiAgdm5vZGUuZWwgPSBlbDtcbiAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQuc3ViVHJlZSA9PT0gdm5vZGUpIHtcbiAgICBwYXJlbnRDb21wb25lbnQudm5vZGUuZWwgPSBlbDtcbiAgICB1cGRhdGVIT0NIb3N0RWwocGFyZW50Q29tcG9uZW50LCBlbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVk5vZGVTdXNwZW5zaWJsZSh2bm9kZSkge1xuICBjb25zdCBzdXNwZW5zaWJsZSA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnN1c3BlbnNpYmxlO1xuICByZXR1cm4gc3VzcGVuc2libGUgIT0gbnVsbCAmJiBzdXNwZW5zaWJsZSAhPT0gZmFsc2U7XG59XG5cbmNvbnN0IEZyYWdtZW50ID0gU3ltYm9sLmZvcihcInYtZmd0XCIpO1xuY29uc3QgVGV4dCA9IFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2wuZm9yKFwidi1jbXRcIik7XG5jb25zdCBTdGF0aWMgPSBTeW1ib2wuZm9yKFwidi1zdGNcIik7XG5jb25zdCBibG9ja1N0YWNrID0gW107XG5sZXQgY3VycmVudEJsb2NrID0gbnVsbDtcbmZ1bmN0aW9uIG9wZW5CbG9jayhkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSkge1xuICBibG9ja1N0YWNrLnB1c2goY3VycmVudEJsb2NrID0gZGlzYWJsZVRyYWNraW5nID8gbnVsbCA6IFtdKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soKSB7XG4gIGJsb2NrU3RhY2sucG9wKCk7XG4gIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxubGV0IGlzQmxvY2tUcmVlRW5hYmxlZCA9IDE7XG5mdW5jdGlvbiBzZXRCbG9ja1RyYWNraW5nKHZhbHVlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbiAgaWYgKHZhbHVlIDwgMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICBjdXJyZW50QmxvY2suaGFzT25jZSA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBpc1ZOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLl9fdl9pc1ZOb2RlID09PSB0cnVlIDogZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG4yLnNoYXBlRmxhZyAmIDYgJiYgbjEuY29tcG9uZW50KSB7XG4gICAgY29uc3QgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG4yLnR5cGUpO1xuICAgIGlmIChkaXJ0eUluc3RhbmNlcyAmJiBkaXJ0eUluc3RhbmNlcy5oYXMobjEuY29tcG9uZW50KSkge1xuICAgICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgICBuMi5zaGFwZUZsYWcgJj0gfjUxMjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG4xLnR5cGUgPT09IG4yLnR5cGUgJiYgbjEua2V5ID09PSBuMi5rZXk7XG59XG5sZXQgdm5vZGVBcmdzVHJhbnNmb3JtZXI7XG5mdW5jdGlvbiB0cmFuc2Zvcm1WTm9kZUFyZ3ModHJhbnNmb3JtZXIpIHtcbiAgdm5vZGVBcmdzVHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gPSAoLi4uYXJncykgPT4ge1xuICByZXR1cm4gX2NyZWF0ZVZOb2RlKFxuICAgIC4uLnZub2RlQXJnc1RyYW5zZm9ybWVyID8gdm5vZGVBcmdzVHJhbnNmb3JtZXIoYXJncywgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSA6IGFyZ3NcbiAgKTtcbn07XG5jb25zdCBub3JtYWxpemVLZXkgPSAoeyBrZXkgfSkgPT4ga2V5ICE9IG51bGwgPyBrZXkgOiBudWxsO1xuY29uc3Qgbm9ybWFsaXplUmVmID0gKHtcbiAgcmVmLFxuICByZWZfa2V5LFxuICByZWZfZm9yXG59KSA9PiB7XG4gIGlmICh0eXBlb2YgcmVmID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVmID0gXCJcIiArIHJlZjtcbiAgfVxuICByZXR1cm4gcmVmICE9IG51bGwgPyBpc1N0cmluZyhyZWYpIHx8IGlzUmVmKHJlZikgfHwgaXNGdW5jdGlvbihyZWYpID8gey
20578BpOiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIHI6IHJlZiwgazogcmVmX2tleSwgZjogISFyZWZfZm9yIH0gOiByZWYgOiBudWxsO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgc2hhcGVGbGFnID0gdHlwZSA9PT0gRnJhZ21lbnQgPyAwIDogMSwgaXNCbG9ja05vZGUgPSBmYWxzZSwgbmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24gPSBmYWxzZSkge1xuICBjb25zdCB2bm9kZSA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGtleTogcHJvcHMgJiYgbm9ybWFsaXplS2V5KHByb3BzKSxcbiAgICByZWY6IHByb3BzICYmIG5vcm1hbGl6ZVJlZihwcm9wcyksXG4gICAgc2NvcGVJZDogY3VycmVudFNjb3BlSWQsXG4gICAgc2xvdFNjb3BlSWRzOiBudWxsLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICBzdXNwZW5zZTogbnVsbCxcbiAgICBzc0NvbnRlbnQ6IG51bGwsXG4gICAgc3NGYWxsYmFjazogbnVsbCxcbiAgICBkaXJzOiBudWxsLFxuICAgIHRyYW5zaXRpb246IG51bGwsXG4gICAgZWw6IG51bGwsXG4gICAgYW5jaG9yOiBudWxsLFxuICAgIHRhcmdldDogbnVsbCxcbiAgICB0YXJnZXRTdGFydDogbnVsbCxcbiAgICB0YXJnZXRBbmNob3I6IG51bGwsXG4gICAgc3RhdGljQ291bnQ6IDAsXG4gICAgc2hhcGVGbGFnLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiBudWxsLFxuICAgIGFwcENvbnRleHQ6IG51bGwsXG4gICAgY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2VcbiAgfTtcbiAgaWYgKG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uKSB7XG4gICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB0eXBlLm5vcm1hbGl6ZSh2bm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgdm5vZGUuc2hhcGVGbGFnIHw9IGlzU3RyaW5nKGNoaWxkcmVuKSA/IDggOiAxNjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5rZXkgIT09IHZub2RlLmtleSkge1xuICAgIHdhcm4kMShgVk5vZGUgY3JlYXRlZCB3aXRoIGludmFsaWQga2V5IChOYU4pLiBWTm9kZSB0eXBlOmAsIHZub2RlLnR5cGUpO1xuICB9XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIC8vIGF2b2lkIGEgYmxvY2sgbm9kZSBmcm9tIHRyYWNraW5nIGl0c2VsZlxuICAhaXNCbG9ja05vZGUgJiYgLy8gaGFzIGN1cnJlbnQgcGFyZW50IGJsb2NrXG4gIGN1cnJlbnRCbG9jayAmJiAvLyBwcmVzZW5jZSBvZiBhIHBhdGNoIGZsYWcgaW5kaWNhdGVzIHRoaXMgbm9kZSBuZWVkcyBwYXRjaGluZyBvbiB1cGRhdGVzLlxuICAvLyBjb21wb25lbnQgbm9kZXMgYWxzbyBzaG91bGQgYWx3YXlzIGJlIHBhdGNoZWQsIGJlY2F1c2UgZXZlbiBpZiB0aGVcbiAgLy8gY29tcG9uZW50IGRvZXNuJ3QgbmVlZCB0byB1cGRhdGUsIGl0IG5lZWRzIHRvIHBlcnNpc3QgdGhlIGluc3RhbmNlIG9uIHRvXG4gIC8vIHRoZSBuZXh0IHZub2RlIHNvIHRoYXQgaXQgY2FuIGJlIHByb3Blcmx5IHVubW91bnRlZCBsYXRlci5cbiAgKHZub2RlLnBhdGNoRmxhZyA+IDAgfHwgc2hhcGVGbGFnICYgNikgJiYgLy8gdGhlIEVWRU5UUyBmbGFnIGlzIG9ubHkgZm9yIGh5ZHJhdGlvbiBhbmQgaWYgaXQgaXMgdGhlIG9ubHkgZmxhZywgdGhlXG4gIC8vIHZub2RlIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBkeW5hbWljIGR1ZSB0byBoYW5kbGVyIGNhY2hpbmcuXG4gIHZub2RlLnBhdGNoRmxhZyAhPT0gMzIpIHtcbiAgICBjdXJyZW50QmxvY2sucHVzaCh2bm9kZSk7XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuY29uc3QgY3JlYXRlVk5vZGUgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSA6IF9jcmVhdGVWTm9kZTtcbmZ1bmN0aW9uIF9jcmVhdGVWTm9kZSh0eXBlLCBwcm9wcyA9IG51bGwsIGNoaWxkcmVuID0gbnVsbCwgcGF0Y2hGbGFnID0gMCwgZHluYW1pY1Byb3BzID0gbnVsbCwgaXNCbG9ja05vZGUgPSBmYWxzZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0eXBlKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAke3R5cGV9LmApO1xuICAgIH1cbiAgICB0eXBlID0gQ29tbWVudDtcbiAgfVxuICBpZiAoaXNWTm9kZSh0eXBlKSkge1xuICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICB0cnVlXG4gICAgICAvKiBtZXJnZVJlZjogdHJ1ZSAqL1xuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVDaGlsZHJlbihjbG9uZWQsIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgIWlzQmxvY2tOb2RlICYmIGN1cnJlbnRCbG9jaykge1xuICAgICAgaWYgKGNsb25lZC5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgIGN1cnJlbnRCbG9ja1tjdXJyZW50QmxvY2suaW5kZXhPZih0eXBlKV0gPSBjbG9uZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50QmxvY2sucHVzaChjbG9uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjbG9uZWQucGF0Y2hGbGFnID0gLTI7XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBpZiAoaXNDbGFzc0NvbXBvbmVudCh0eXBlKSkge1xuICAgIHR5cGUgPSB0eXBlLl9fdmNjT3B0cztcbiAgfVxuICBpZiAocHJvcHMpIHtcbiAgICBwcm9wcyA9IGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcyk7XG4gICAgbGV0IHsgY2xhc3M6IGtsYXNzLCBzdHlsZSB9ID0gcHJvcHM7XG4gICAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qoc3R5bGUpKSB7XG4gICAgICBpZiAoaXNQcm94eShzdHlsZSkgJiYgIWlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAgI
20578HN0eWxlID0gZXh0ZW5kKHt9LCBzdHlsZSk7XG4gICAgICB9XG4gICAgICBwcm9wcy5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2hhcGVGbGFnID0gaXNTdHJpbmcodHlwZSkgPyAxIDogaXNTdXNwZW5zZSh0eXBlKSA/IDEyOCA6IGlzVGVsZXBvcnQodHlwZSkgPyA2NCA6IGlzT2JqZWN0KHR5cGUpID8gNCA6IGlzRnVuY3Rpb24odHlwZSkgPyAyIDogMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2hhcGVGbGFnICYgNCAmJiBpc1Byb3h5KHR5cGUpKSB7XG4gICAgdHlwZSA9IHRvUmF3KHR5cGUpO1xuICAgIHdhcm4kMShcbiAgICAgIGBWdWUgcmVjZWl2ZWQgYSBDb21wb25lbnQgdGhhdCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggXFxgbWFya1Jhd1xcYCBvciB1c2luZyBcXGBzaGFsbG93UmVmXFxgIGluc3RlYWQgb2YgXFxgcmVmXFxgLmAsXG4gICAgICBgXG5Db21wb25lbnQgdGhhdCB3YXMgbWFkZSByZWFjdGl2ZTogYCxcbiAgICAgIHR5cGVcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVCYXNlVk5vZGUoXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBjaGlsZHJlbixcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIHNoYXBlRmxhZyxcbiAgICBpc0Jsb2NrTm9kZSxcbiAgICB0cnVlXG4gICk7XG59XG5mdW5jdGlvbiBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpIHtcbiAgaWYgKCFwcm9wcykgcmV0dXJuIG51bGw7XG4gIHJldHVybiBpc1Byb3h5KHByb3BzKSB8fCBpc0ludGVybmFsT2JqZWN0KHByb3BzKSA/IGV4dGVuZCh7fSwgcHJvcHMpIDogcHJvcHM7XG59XG5mdW5jdGlvbiBjbG9uZVZOb2RlKHZub2RlLCBleHRyYVByb3BzLCBtZXJnZVJlZiA9IGZhbHNlLCBjbG9uZVRyYW5zaXRpb24gPSBmYWxzZSkge1xuICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4sIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICBjb25zdCBtZXJnZWRQcm9wcyA9IGV4dHJhUHJvcHMgPyBtZXJnZVByb3BzKHByb3BzIHx8IHt9LCBleHRyYVByb3BzKSA6IHByb3BzO1xuICBjb25zdCBjbG9uZWQgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZTogdm5vZGUudHlwZSxcbiAgICBwcm9wczogbWVyZ2VkUHJvcHMsXG4gICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgIHJlZjogZXh0cmFQcm9wcyAmJiBleHRyYVByb3BzLnJlZiA/IChcbiAgICAgIC8vICMyMDc4IGluIHRoZSBjYXNlIG9mIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIiByZWY9XCJleHRyYVwiLz5cbiAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAvLyB0aGUgcmVmcyBzbyB0aGUgc2luZ2xlIHZub2RlIGNhbiBiZSBzZXQgb24gbXVsdGlwbGUgcmVmc1xuICAgICAgbWVyZ2VSZWYgJiYgcmVmID8gaXNBcnJheShyZWYpID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpIDogW3JlZiwgbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXSA6IG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKVxuICAgICkgOiByZWYsXG4gICAgc2NvcGVJZDogdm5vZGUuc2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICBjaGlsZHJlbjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwYXRjaEZsYWcgPT09IC0xICYmIGlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKSA6IGNoaWxkcmVuLFxuICAgIHRhcmdldDogdm5vZGUudGFyZ2V0LFxuICAgIHRhcmdldFN0YXJ0OiB2bm9kZS50YXJnZXRTdGFydCxcbiAgICB0YXJnZXRBbmNob3I6IHZub2RlLnRhcmdldEFuY2hvcixcbiAgICBzdGF0aWNDb3VudDogdm5vZGUuc3RhdGljQ291bnQsXG4gICAgc2hhcGVGbGFnOiB2bm9kZS5zaGFwZUZsYWcsXG4gICAgLy8gaWYgdGhlIHZub2RlIGlzIGNsb25lZCB3aXRoIGV4dHJhIHByb3BzLCB3ZSBjYW4gbm8gbG9uZ2VyIGFzc3VtZSBpdHNcbiAgICAvLyBleGlzdGluZyBwYXRjaCBmbGFnIHRvIGJlIHJlbGlhYmxlIGFuZCBuZWVkIHRvIGFkZCB0aGUgRlVMTF9QUk9QUyBmbGFnLlxuICAgIC8vIG5vdGU6IHByZXNlcnZlIGZsYWcgZm9yIGZyYWdtZW50cyBzaW5jZSB0aGV5IHVzZSB0aGUgZmxhZyBmb3IgY2hpbGRyZW5cbiAgICAvLyBmYXN0IHBhdGhzIG9ubHkuXG4gICAgcGF0Y2hGbGFnOiBleHRyYVByb3BzICYmIHZub2RlLnR5cGUgIT09IEZyYWdtZW50ID8gcGF0Y2hGbGFnID09PSAtMSA/IDE2IDogcGF0Y2hGbGFnIHwgMTYgOiBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzOiB2bm9kZS5keW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiB2bm9kZS5keW5hbWljQ2hpbGRyZW4sXG4gICAgYXBwQ29udGV4dDogdm5vZGUuYXBwQ29udGV4dCxcbiAgICBkaXJzOiB2bm9kZS5kaXJzLFxuICAgIHRyYW5zaXRpb24sXG4gICAgLy8gVGhlc2Ugc2hvdWxkIHRlY2huaWNhbGx5IG9ubHkgYmUgbm9uLW51bGwgb24gbW91bnRlZCBWTm9kZXMuIEhvd2V2ZXIsXG4gICAgLy8gdGhleSAqc2hvdWxkKiBiZSBjb3BpZWQgZm9yIGtlcHQtYWxpdmUgdm5vZGVzLiBTbyB3ZSBqdXN0IGFsd2F5cyBjb3B5XG4gICAgLy8gdGhlbSBzaW5jZSB0aGVtIGJlaW5nIG5vbi1udWxsIGR1cmluZyBhIG1vdW50IGRvZXNuJ3QgYWZmZWN0IHRoZSBsb2dpYyBhc1xuICAgIC8vIHRoZXkgd2lsbCBzaW1wbHkgYmUgb3ZlcndyaXR0ZW4uXG4gICAgY29tcG9uZW50OiB2bm9kZS5jb21wb25lbnQsXG4gICAgc3VzcGVuc2U6IHZub2RlLnN1c3BlbnNlLFxuICAgIHNzQ29udGVudDogdm5vZGUuc3NDb250ZW50ICYmIGNsb25lVk5vZGUodm5vZGUuc3NDb250ZW50KSxcbiAgICBzc0ZhbGxiYWNrOiB2bm9kZS5zc0ZhbGxiYWNrICYmIGNsb25lVk5vZGUodm5vZGUuc3NGYWxsYmFjayksXG4gICAgZWw6IHZub2Rl
20578LmVsLFxuICAgIGFuY2hvcjogdm5vZGUuYW5jaG9yLFxuICAgIGN0eDogdm5vZGUuY3R4LFxuICAgIGNlOiB2bm9kZS5jZVxuICB9O1xuICBpZiAodHJhbnNpdGlvbiAmJiBjbG9uZVRyYW5zaXRpb24pIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICBjbG9uZWQsXG4gICAgICB0cmFuc2l0aW9uLmNsb25lKGNsb25lZClcbiAgICApO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O
205781xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhaXNJbnRlcm5hbE9iamVjdChjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4uX2N0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdEZsYWcgPT09IDMgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2Uuc2xvdHMuXyA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAyO1xuICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyB8PSAxMDI0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2hpbGRyZW4pKSB7XG4gICAgY2hpbGRyZW4gPSB7IGRlZmF1bHQ6IGNoaWxkcmVuLCBfY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfTtcbiAgICB0eXBlID0gMzI7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZSA9IDE2O1xuICAgICAgY2hpbGRyZW4gPSBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSA4O1xuICAgIH1cbiAgfVxuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB2bm9kZS5zaGFwZUZsYWcgfD0gdHlwZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoLi4uYXJncykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9NZXJnZSA9IGFyZ3NbaV07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9NZXJnZSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGlmIChyZXQuY2xhc3MgIT09IHRvTWVyZ2UuY2xhc3MpIHtcbiAgICAgICAgICByZXQuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhbcmV0LmNsYXNzLCB0b01lcmdlLmNsYXNzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgcmV0LnN0eWxlID0gbm9ybWFsaXplU3R5bGUoW3JldC5zdHlsZSwgdG9NZXJnZS5zdHlsZV0pO1xuICAgICAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXRba2V5XTtcbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSB0b01lcmdlW2tleV07XG4gICAgICAgIGlmIChpbmNvbWluZyAmJiBleGlzdGluZyAhPT0gaW5jb21pbmcgJiYgIShpc0FycmF5KGV4aXN0aW5nKSAmJiBleGlzdGluZy5pbmNsdWRlcyhpbmNvbWluZykpKSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaW5jb21pbmcpIDogaW5jb21pbmc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBcIlwiKSB7XG4gICAgICAgIHJldFtrZXldID0gdG9NZXJnZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gaW52b2tlVk5vZGVIb29rKGhvb2ssIGluc3RhbmNlLCB2bm9kZSwgcHJldlZOb2RlID0gbnVsbCkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgNywgW1xuICAgIHZub2RlLFxuICAgIHByZXZWTm9kZVxuICBdKTtcbn1cblxuY29uc3QgZW1wdHlBcHBDb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xubGV0IHVpZCA9IDA7XG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSh2bm9kZSwgcGFyZW50LCBzdXNwZW5zZSkge1xuICBjb25zdCB0eXBlID0gdm5vZGUudHlwZTtcbiAgY29uc3QgYXBwQ29udGV4dCA9IChwYXJlbnQgPyBwYXJlbnQuYXBwQ29udGV4dCA6IHZub2RlLmFwcENvbnRleHQpIHx8IGVtcHR5QXBwQ29udGV4dDtcbiAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgdWlkOiB1aWQrKyxcbiAgICB2bm9kZSxcbiAgICB0eXBlLFxuICAgIHBhcmVudCxcbiAgICBhcHBDb250ZXh0LFxuICAgIHJvb3Q6IG51bGwsXG4gICAgLy8gdG8gYmUgaW1tZWRpYXRlbHkgc2V0XG4gICAgbmV4dDogbnVsbCxcbiAgICBzdWJUcmVlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBlZmZlY3Q6IG51bGwsXG4gICAgdXBkYXRlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKFxuICAgICAgdHJ1ZVxuICAgICAgLyogZGV0YWNoZWQgKi9cbiAgICApLFxuICAgIHJlbmRlcjogbnVsbCxcbiAgICBwcm94eTogbnVsbCxcbiAgICBleHBvc2VkOiBudWxsLFxuICAgIGV4cG9zZVByb3h5OiBudWxsLFxuICAgIHdpdGhQcm94eTogbnVsbCxcbiAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICBhY2Nlc3NDYWNoZTogbnVsbCxcbiAgICByZW5kZXJDYWNoZTogW10sXG4gICAgLy8gbG9jYWwgcmVzb2x2ZWQgYXNzZXRzXG4gICAgY29tcG9uZW50czogbnVsbCxcbiAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgIC8vIHJlc29sdmVkIHByb3BzIGFuZCBlbWl0cyBvcHRpb25zXG4gICAgcHJvcHNPcHRpb25zOiBub3JtYWxpemVQcm9wc09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgZW1pdHNPcHRpb25zOiBub3JtYWxpemVFbWl0c09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgLy8gZW1pdFxuICAgIGVtaXQ6IG51bGwsXG4gICAgLy8gdG8gYmUgc2V0IGltbWVkaWF0ZWx5XG4gICAgZW1pdHRlZDogbnVsbCxcbiAgICAvLyBwcm9wcyBkZWZhdWx0IHZhbHVlXG4gICAgcHJvcHNEZWZh
20578dWx0czogRU1QVFlfT0JKLFxuICAgIC8vIGluaGVyaXRBdHRyc1xuICAgIGluaGVyaXRBdHRyczogdHlwZS5pbmhlcml0QXR0cnMsXG4gICAgLy8gc3RhdGVcbiAgICBjdHg6IEVNUFRZX09CSixcbiAgICBkYXRhOiBFTVBUWV9PQkosXG4gICAgcHJvcHM6IEVNUFRZX09CSixcbiAgICBhdHRyczogRU1QVFlfT0JKLFxuICAgIHNsb3RzOiBFTVBUWV9PQkosXG4gICAgcmVmczogRU1QVFlfT0JKLFxuICAgIHNldHVwU3RhdGU6IEVNUFRZX09CSixcbiAgICBzZXR1cENvbnRleHQ6IG51bGwsXG4gICAgLy8gc3VzcGVuc2UgcmVsYXRlZFxuICAgIHN1c3BlbnNlLFxuICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICBhc3luY0RlcDogbnVsbCxcbiAgICBhc3luY1Jlc29sdmVkOiBmYWxzZSxcbiAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAvLyBub3QgdXNpbmcgZW51bXMgaGVyZSBiZWNhdXNlIGl0IHJlc3VsdHMgaW4gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGlzRGVhY3RpdmF0ZWQ6IGZhbHNlLFxuICAgIGJjOiBudWxsLFxuICAgIGM6IG51bGwsXG4gICAgYm06IG51bGwsXG4gICAgbTogbnVsbCxcbiAgICBidTogbnVsbCxcbiAgICB1OiBudWxsLFxuICAgIHVtOiBudWxsLFxuICAgIGJ1bTogbnVsbCxcbiAgICBkYTogbnVsbCxcbiAgICBhOiBudWxsLFxuICAgIHJ0ZzogbnVsbCxcbiAgICBydGM6IG51bGwsXG4gICAgZWM6IG51bGwsXG4gICAgc3A6IG51bGxcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5jdHggPSBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gIH1cbiAgaW5zdGFuY2Uucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogaW5zdGFuY2U7XG4gIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICBpZiAodm5vZGUuY2UpIHtcbiAgICB2bm9kZS5jZShpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxubGV0IGN1cnJlbnRJbnN0YW5jZSA9IG51bGw7XG5jb25zdCBnZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xubGV0IGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlO1xubGV0IHNldEluU1NSU2V0dXBTdGF0ZTtcbntcbiAgY29uc3QgZyA9IGdldEdsb2JhbFRoaXMoKTtcbiAgY29uc3QgcmVnaXN0ZXJHbG9iYWxTZXR0ZXIgPSAoa2V5LCBzZXR0ZXIpID0+IHtcbiAgICBsZXQgc2V0dGVycztcbiAgICBpZiAoIShzZXR0ZXJzID0gZ1trZXldKSkgc2V0dGVycyA9IGdba2V5XSA9IFtdO1xuICAgIHNldHRlcnMucHVzaChzZXR0ZXIpO1xuICAgIHJldHVybiAodikgPT4ge1xuICAgICAgaWYgKHNldHRlcnMubGVuZ3RoID4gMSkgc2V0dGVycy5mb3JFYWNoKChzZXQpID0+IHNldCh2KSk7XG4gICAgICBlbHNlIHNldHRlcnNbMF0odik7XG4gICAgfTtcbiAgfTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UgPSByZWdpc3Rlckdsb2JhbFNldHRlcihcbiAgICBgX19WVUVfSU5TVEFOQ0VfU0VUVEVSU19fYCxcbiAgICAodikgPT4gY3VycmVudEluc3RhbmNlID0gdlxuICApO1xuICBzZXRJblNTUlNldHVwU3RhdGUgPSByZWdpc3Rlckdsb2JhbFNldHRlcihcbiAgICBgX19WVUVfU1NSX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IHZcbiAgKTtcbn1cbmNvbnN0IHNldEN1cnJlbnRJbnN0YW5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBwcmV2ID0gY3VycmVudEluc3RhbmNlO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gIGluc3RhbmNlLnNjb3BlLm9uKCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gICAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UocHJldik7XG4gIH07XG59O1xuY29uc3QgdW5zZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiB7XG4gIGN1cnJlbnRJbnN0YW5jZSAmJiBjdXJyZW50SW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKG51bGwpO1xufTtcbmNvbnN0IGlzQnVpbHRJblRhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFwic2xvdCxjb21wb25lbnRcIik7XG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgeyBpc05hdGl2ZVRhZyB9KSB7XG4gIGlmIChpc0J1aWx0SW5UYWcobmFtZSkgfHwgaXNOYXRpdmVUYWcobmFtZSkpIHtcbiAgICB3YXJuJDEoXG4gICAgICBcIkRvIG5vdCB1c2UgYnVpbHQtaW4gb3IgcmVzZXJ2ZWQgSFRNTCBlbGVtZW50cyBhcyBjb21wb25lbnQgaWQ6IFwiICsgbmFtZVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDQ7XG59XG5sZXQgaXNJblNTUkNvbXBvbmVudFNldHVwID0gZmFsc2U7XG5mdW5jdGlvbiBzZXR1cENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UpIHtcbiAgaXNTU1IgJiYgc2V0SW5TU1JTZXR1cFN0YXRlKGlzU1NSKTtcbiAgY29uc3QgeyBwcm9wcywgY2hpbGRyZW4gfSA9IGluc3RhbmNlLnZub2RlO1xuICBjb25zdCBpc1N0YXRlZnVsI
20578D0gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSk7XG4gIGluaXRQcm9wcyhpbnN0YW5jZSwgcHJvcHMsIGlzU3RhdGVmdWwsIGlzU1NSKTtcbiAgaW5pdFNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgY29uc3Qgc2V0dXBSZXN1bHQgPSBpc1N0YXRlZnVsID8gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIDogdm9pZCAwO1xuICBpc1NTUiAmJiBzZXRJblNTUlNldHVwU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gc2V0dXBSZXN1bHQ7XG59XG5mdW5jdGlvbiBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikge1xuICB2YXIgX2E7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKENvbXBvbmVudC5uYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoQ29tcG9uZW50Lm5hbWUsIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWVzW2ldLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuZGlyZWN0aXZlcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuZGlyZWN0aXZlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcGlsZXJPcHRpb25zICYmIGlzUnVudGltZU9ubHkoKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgXCJjb21waWxlck9wdGlvbnNcIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpbnN0YW5jZS5hY2Nlc3NDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpbnN0YW5jZS5wcm94eSA9IG5ldyBQcm94eShpbnN0YW5jZS5jdHgsIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9XG4gIGNvbnN0IHsgc2V0dXAgfSA9IENvbXBvbmVudDtcbiAgaWYgKHNldHVwKSB7XG4gICAgY29uc3Qgc2V0dXBDb250ZXh0ID0gaW5zdGFuY2Uuc2V0dXBDb250ZXh0ID0gc2V0dXAubGVuZ3RoID4gMSA/IGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkgOiBudWxsO1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBzZXR1cCxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMCxcbiAgICAgIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpbnN0YW5jZS5wcm9wcykgOiBpbnN0YW5jZS5wcm9wcyxcbiAgICAgICAgc2V0dXBDb250ZXh0XG4gICAgICBdXG4gICAgKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gICAgcmVzZXQoKTtcbiAgICBpZiAoaXNQcm9taXNlKHNldHVwUmVzdWx0KSkge1xuICAgICAgc2V0dXBSZXN1bHQudGhlbih1bnNldEN1cnJlbnRJbnN0YW5jZSwgdW5zZXRDdXJyZW50SW5zdGFuY2UpO1xuICAgICAgaWYgKGlzU1NSKSB7XG4gICAgICAgIHJldHVybiBzZXR1cFJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCByZXNvbHZlZFJlc3VsdCwgaXNTU1IpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGluc3RhbmNlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5hc3luY0RlcCA9IHNldHVwUmVzdWx0O1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaW5zdGFuY2Uuc3VzcGVuc2UpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKF9hID0gQ29tcG9uZW50Lm5hbWUpICE9IG51bGwgPyBfYSA6IFwiQW5vbnltb3VzXCI7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCA8JHtuYW1lfT46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vIDxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHNldHVwKCkgc2hvdWxkIG5vdCByZXR1cm4gVk5vZGVzIGRpcmVjdGx5IC0gcmV0dXJuIGEgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5kZXZ0b29sc1Jhd1NldHVwU3RhdGUgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gICAgaW5zdGFuY2Uuc2V0dXBTdGF0ZSA9IHByb3h5UmVmcyhzZXR1cFJlc3VsdCk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwUmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICB3YXJuJDEoXG4gICAgICBgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBzZXR1cFJlc3VsdH1gXG4gICAgKTtcbiAgfVxuICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xufVxubGV0IGNvbXBpbGU7XG5sZXQgaW5zdGFsbFdpdGhQcm94eTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gIGNvbXBpbGUgPSBfY29tcGlsZTtcbiAgaW5zdGFsbFdpdGhQcm94eSA9IChpKSA9PiB7XG4gICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgfVxuICB9O1xufVxuY29uc3QgaXNSdW50aW1lT25seSA9ICgpID0+ICFjb21waWxlO1xuZnVuY3Rpb24gZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSLCBza2lwT3B0aW9ucykge1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoIWluc3RhbmNlLnJlbmRlcikge1xuICAgIGlmICghaXNTU1IgJiYgY29tcGlsZSAmJiAhQ29tcG9uZW50LnJlbmRlcikge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBDb21wb25lbnQudGVtcGxhdGUgfHwgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpLnRlbXBsYXRlO1xuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaXNDdXN0b21FbGVtZW50LCBjb21waWxlck9wdGlvbnMgfSA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnO1xuICAgICAgICBjb25zdCB7IGRlbGltaXRlcnMsIGNvbXBpbGVyT3B0aW9uczogY29tcG9uZW50Q29tcGlsZXJPcHRpb25zIH0gPSBDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsQ29tcGlsZXJPcHRpb25zID0gZXh0ZW5kKFxuICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50LFxuICAgICAgICAgICAgICBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zXG4gICAgICAgICAgKSxcbiAgICAgICAgICBjb21wb25lbnRDb21waWxlck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgQ29tcG9uZW50LnJlbmRlciA9IGNvbXBpbGUodGVtcGxhdGUsIGZpbmFsQ29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlciA9IENvbXBvbmVudC5yZW5kZXIgfHwgTk9PUDtcbiAgICBpZiAoaW5zdGFsbFdpdGhQcm94eSkge1xuICAgICAgaW5zdGFsbFdpdGhQcm94eShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmIHRydWUpIHtcbiAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIHRyeSB7XG4gICAgICBhcHBseU9wdGlvbnMoaW5zdGFuY2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXNldCgpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhQ29tcG9uZW50LnJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1AgJiYgIWlzU1NSKSB7XG4gICAgaWYgKCFjb21waWxlICYmIENvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IHByb3ZpZGVkIHRlbXBsYXRlIG9wdGlvbiBidXQgcnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4kMShgQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uOiBgLCBDb21wb25lbnQpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgYXR0cnNQcm94eUhhbmRsZXJzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICB0cmFjayh0YXJnZXQsIFwiZ2V0XCIsIFwiXCIpO1xuICAgIHJldHVybi
20578B0YXJnZXRba2V5XTtcbiAgfSxcbiAgc2V0KCkge1xuICAgIHdhcm4kMShgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoKSB7XG4gICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IDoge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICB0cmFjayh0YXJnZXQsIFwiZ2V0XCIsIFwiXCIpO1xuICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgfVxufTtcbmZ1bmN0aW9uIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShpbnN0YW5jZS5zbG90cywge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgZXhwb3NlID0gKGV4cG9zZWQpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgICAgd2FybiQxKGBleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvc2VkICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGV4cG9zZWRUeXBlID0gdHlwZW9mIGV4cG9zZWQ7XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwiYXJyYXlcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwicmVmXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBleHBvc2UoKSBzaG91bGQgYmUgcGFzc2VkIGEgcGxhaW4gb2JqZWN0LCByZWNlaXZlZCAke2V4cG9zZWRUeXBlfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5leHBvc2VkID0gZXhwb3NlZCB8fCB7fTtcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBsZXQgYXR0cnNQcm94eTtcbiAgICBsZXQgc2xvdHNQcm94eTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiBhdHRyc1Byb3h5IHx8IChhdHRyc1Byb3h5ID0gbmV3IFByb3h5KGluc3RhbmNlLmF0dHJzLCBhdHRyc1Byb3h5SGFuZGxlcnMpKTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2xvdHMoKSB7XG4gICAgICAgIHJldHVybiBzbG90c1Byb3h5IHx8IChzbG90c1Byb3h5ID0gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSkpO1xuICAgICAgfSxcbiAgICAgIGdldCBlbWl0KCkge1xuICAgICAgICByZXR1cm4gKGV2ZW50LCAuLi5hcmdzKSA9PiBpbnN0YW5jZS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBleHBvc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cnM6IG5ldyBQcm94eShpbnN0YW5jZS5hdHRycywgYXR0cnNQcm94eUhhbmRsZXJzKSxcbiAgICAgIHNsb3RzOiBpbnN0YW5jZS5zbG90cyxcbiAgICAgIGVtaXQ6IGluc3RhbmNlLmVtaXQsXG4gICAgICBleHBvc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgIHJldHVybiBpbnN0YW5jZS5leHBvc2VQcm94eSB8fCAoaW5zdGFuY2UuZXhwb3NlUHJveHkgPSBuZXcgUHJveHkocHJveHlSZWZzKG1hcmtSYXcoaW5zdGFuY2UuZXhwb3NlZCkpLCB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXApIHtcbiAgICAgICAgICByZXR1cm4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhcyh0YXJnZXQsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRhcmdldCB8fCBrZXkgaW4gcHVibGljUHJvcGVydGllc01hcDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnByb3h5O1xuICB9XG59XG5jb25zdCBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuY29uc3QgY2xhc3NpZnkgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShjbGFzc2lmeVJFLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIFwiXCIpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQsIGluY2x1ZGVJbmZlcnJlZCA9IHRydWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oQ29tcG9uZW50KSA/IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSA6IENvbXBvbmVudC5uYW1lIHx8IGluY2x1ZGVJbmZlcnJlZCAmJiBDb21wb25lbnQuX19uYW1lO1xufVxuZnVuY3Rpb24gZm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgQ29tcG9uZW50LCBpc1Jvb3QgPSBmYWxzZSkge1xuICBsZXQgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KTtcbiAgaWYgKCFuYW1lICYmIENvbXBvbmVudC5fX2ZpbGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IENvbXBvbmVudC5fX2ZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICB9XG4gIH1cbiAgaWYgKCFuYW1lICYmIGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIGNvbnN0IGluZmVyRnJvbVJlZ2lzdHJ5ID0gKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiByZWdpc3RyeSkge1xuICAgICAgICBpZiAocmVnaXN0cnlba2V5XSA9PT0gQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgbmFtZSA9IGluZmVyRnJvbVJlZ2lzdHJ5KFxuICAgICAgaW5zdGFuY2UuY29tcG9uZW50cyB8fCBpbnN0YW5jZS5wYXJlbnQud
20578HlwZS5jb21wb25lbnRzXG4gICAgKSB8fCBpbmZlckZyb21SZWdpc3RyeShpbnN0YW5jZS5hcHBDb250ZXh0LmNvbXBvbmVudHMpO1xuICB9XG4gIHJldHVybiBuYW1lID8gY2xhc3NpZnkobmFtZSkgOiBpc1Jvb3QgPyBgQXBwYCA6IGBBbm9ueW1vdXNgO1xufVxuZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSkgJiYgXCJfX3ZjY09wdHNcIiBpbiB2YWx1ZTtcbn1cblxuY29uc3QgY29tcHV0ZWQgPSAoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMpID0+IHtcbiAgY29uc3QgYyA9IGNvbXB1dGVkJDEoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMsIGlzSW5TU1JDb21wb25lbnRTZXR1cCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmIChpICYmIGkuYXBwQ29udGV4dC5jb25maWcud2FyblJlY3Vyc2l2ZUNvbXB1dGVkKSB7XG4gICAgICBjLl93YXJuUmVjdXJzaXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGM7XG59O1xuXG5mdW5jdGlvbiBoKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pIHtcbiAgY29uc3QgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIGlmIChsID09PSAyKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3BzT3JDaGlsZHJlbikgJiYgIWlzQXJyYXkocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgaWYgKGlzVk5vZGUocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgW3Byb3BzT3JDaGlsZHJlbl0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobCA+IDMpIHtcbiAgICAgIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICB9IGVsc2UgaWYgKGwgPT09IDMgJiYgaXNWTm9kZShjaGlsZHJlbikpIHtcbiAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHZ1ZVN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojM2JhNzc2XCIgfTtcbiAgY29uc3QgbnVtYmVyU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMxNjc3ZmZcIiB9O1xuICBjb25zdCBzdHJpbmdTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2Y1MjIyZFwiIH07XG4gIGNvbnN0IGtleXdvcmRTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2ViMmY5NlwiIH07XG4gIGNvbnN0IGZvcm1hdHRlciA9IHtcbiAgICBfX3Z1ZV9jdXN0b21fZm9ybWF0dGVyOiB0cnVlLFxuICAgIGhlYWRlcihvYmopIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1wiZGl2XCIsIHZ1ZVN0eWxlLCBgVnVlSW5zdGFuY2VgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgZ2VuUmVmRmxhZyhvYmopXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmoudmFsdWUpLFxuICAgICAgICAgIGA+YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhY3RpdmVcIiA6IFwiUmVhY3RpdmVcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBgPiR7aXNSZWFkb25seShvYmopID8gYCAocmVhZG9ubHkpYCA6IGBgfWBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkb25seShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWRvbmx5XCIgOiBcIlJlYWRvbmx5XCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgXCI+XCJcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgaGFzQm9keShvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqLl9faXNWdWU7XG4gICAgfSxcbiAgICBib2R5KG9iaikge1xuICAgICAgaWYgKG9iaiAmJiBvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgLi4uZm9ybWF0SW5zdGFuY2Uob2JqLiQpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJsb2NrcyA9IFtdO1xuICAgIGlmIChpbnN0YW5jZS50eXBlLnByb3BzICYmIGluc3RhbmNlLnByb3BzKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwicHJvcHNcIiwgdG9SYXcoaW5zdGFuY2UucHJvcHMpKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5zZXR1cFN0YXRlICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJzZXR1cFwiLCBpbnN0YW5jZS5zZXR1cFN0YXRlKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5kYXRhICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJkYXRhXCIsIHRvUmF3KGluc3RhbmNlLmRhdGEpKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiY29tcHV0ZWRcIik7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiY29tcHV0ZWRcIiwgY29tcHV0ZWQpKTtcbiAgICB9XG4gICAgY29uc3QgaW5qZWN0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJpbmplY3RcIik7XG4gICAgaWYgKGluamVjdGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiaW5qZWN0ZWRcIiwgaW5qZWN0ZWQpKTtcbiAgICB9XG4gICAgYmxvY2tzLnB1c2goW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHt9LFxuICAgICAgW1xuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgI
20578HN0eWxlOiBrZXl3b3JkU3R5bGUuc3R5bGUgKyBcIjtvcGFjaXR5OjAuNjZcIlxuICAgICAgICB9LFxuICAgICAgICBcIiQgKGludGVybmFsKTogXCJcbiAgICAgIF0sXG4gICAgICBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGluc3RhbmNlIH1dXG4gICAgXSk7XG4gICAgcmV0dXJuIGJsb2NrcztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUJsb2NrKHR5cGUsIHRhcmdldCkge1xuICAgIHRhcmdldCA9IGV4dGVuZCh7fSwgdGFyZ2V0KTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCB7fV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdHlsZTogXCJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbVwiIH0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJjb2xvcjojNDc2NTgyXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcInBhZGRpbmctbGVmdDoxLjI1ZW1cIlxuICAgICAgICB9LFxuICAgICAgICAuLi5PYmplY3Qua2V5cyh0YXJnZXQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCBrZXkgKyBcIjogXCJdLFxuICAgICAgICAgICAgZm9ybWF0VmFsdWUodGFyZ2V0W2tleV0sIGZhbHNlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgXTtcbiAgfVxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2LCBhc1JhdyA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIG51bWJlclN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgSlNPTi5zdHJpbmdpZnkodildO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodikpIHtcbiAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGFzUmF3ID8gdG9SYXcodikgOiB2IH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgU3RyaW5nKHYpXTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0cmFjdEtleXMoaW5zdGFuY2UsIHR5cGUpIHtcbiAgICBjb25zdCBDb21wID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAoaXNGdW5jdGlvbihDb21wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRyYWN0ZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5jdHgpIHtcbiAgICAgIGlmIChpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpKSB7XG4gICAgICAgIGV4dHJhY3RlZFtrZXldID0gaW5zdGFuY2UuY3R4W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRyYWN0ZWQ7XG4gIH1cbiAgZnVuY3Rpb24gaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSB7XG4gICAgY29uc3Qgb3B0cyA9IENvbXBbdHlwZV07XG4gICAgaWYgKGlzQXJyYXkob3B0cykgJiYgb3B0cy5pbmNsdWRlcyhrZXkpIHx8IGlzT2JqZWN0KG9wdHMpICYmIGtleSBpbiBvcHRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAuZXh0ZW5kcyAmJiBpc0tleU9mVHlwZShDb21wLmV4dGVuZHMsIGtleSwgdHlwZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5taXhpbnMgJiYgQ29tcC5taXhpbnMuc29tZSgobSkgPT4gaXNLZXlPZlR5cGUobSwga2V5LCB0eXBlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5SZWZGbGFnKHYpIHtcbiAgICBpZiAoaXNTaGFsbG93KHYpKSB7XG4gICAgICByZXR1cm4gYFNoYWxsb3dSZWZgO1xuICAgIH1cbiAgICBpZiAodi5lZmZlY3QpIHtcbiAgICAgIHJldHVybiBgQ29tcHV0ZWRSZWZgO1xuICAgIH1cbiAgICByZXR1cm4gYFJlZmA7XG4gIH1cbiAgaWYgKHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMpIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzID0gW2Zvcm1hdHRlcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2l0aE1lbW8obWVtbywgcmVuZGVyLCBjYWNoZSwgaW5kZXgpIHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVbaW5kZXhdO1xuICBpZiAoY2FjaGVkICYmIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmV0ID0gcmVuZGVyKCk7XG4gIHJldC5tZW1vID0gbWVtby5zbGljZSgpO1xuICByZXQuY2FjaGVJbmRleCA9IGluZGV4O1xuICByZXR1cm4gY2FjaGVbaW5kZXhdID0gcmV0O1xufVxuZnVuY3Rpb24gaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pIHtcbiAgY29uc3QgcHJldiA9IGNhY2hlZC5tZW1vO1xuICBpZiAocHJldi5sZW5ndGggIT0gbWVtby5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgbWVtb1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2goY2FjaGVkKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdmVyc2lvbiA9I
20578FwiMy40LjM0XCI7XG5jb25zdCB3YXJuID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHdhcm4kMSA6IE5PT1A7XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzID0gRXJyb3JUeXBlU3RyaW5ncyQxIDtcbmNvbnN0IGRldnRvb2xzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gZGV2dG9vbHMkMSA6IHZvaWQgMDtcbmNvbnN0IHNldERldnRvb2xzSG9vayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHJ1ZSA/IHNldERldnRvb2xzSG9vayQxIDogTk9PUDtcbmNvbnN0IF9zc3JVdGlscyA9IHtcbiAgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UsXG4gIHNldHVwQ29tcG9uZW50LFxuICByZW5kZXJDb21wb25lbnRSb290LFxuICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsXG4gIGlzVk5vZGU6IGlzVk5vZGUsXG4gIG5vcm1hbGl6ZVZOb2RlLFxuICBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZVxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuY29uc3QgRGVwcmVjYXRpb25UeXBlcyA9IG51bGw7XG5cbmV4cG9ydCB7IEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgQ29tbWVudCwgRGVwcmVjYXRpb25UeXBlcywgRXJyb3JDb2RlcywgRXJyb3JUeXBlU3RyaW5ncywgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lTW9kZWwsIGRlZmluZU9wdGlvbnMsIGRlZmluZVByb3BzLCBkZWZpbmVTbG90cywgZGV2dG9vbHMsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBndWFyZFJlYWN0aXZlUHJvcHMsIGgsIGhhbmRsZUVycm9yLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlTW9kZWwsIHVzZVNTUkNvbnRleHQsIHVzZVNsb3RzLCB1c2VUcmFuc2l0aW9uU3RhdGUsIHZlcnNpb24sIHdhcm4sIHdhdGNoLCB3YXRjaEVmZmVjdCwgd2F0Y2hQb3N0RWZmZWN0LCB3YXRjaFN5bmNFZmZlY3QsIHdpdGhBc3luY0NvbnRleHQsIHdpdGhDdHgsIHdpdGhEZWZhdWx0cywgd2l0aERpcmVjdGl2ZXMsIHdpdGhNZW1vLCB3aXRoU2NvcGVJZCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNC4zNFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaCwgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgd2Fybiwgb25Nb3VudGVkLCB3YXRjaFBvc3RFZmZlY3QsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIGNyZWF0ZVZOb2RlLCB1c2VUcmFuc2l0aW9uU3RhdGUsIG9uVXBkYXRlZCwgdG9SYXcsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgc2V0VHJhbnNpdGlvbkhvb2tzLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBpc1J1bnRpbWVPbmx5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGlzT2JqZWN0LCB0b051bWJlciwgaXNBcnJheSwgaXNTdHJpbmcsIGh5cGhlbmF0ZSwgY2FwaXRhbGl6ZSwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc1N5bWJvbCwgaXNTcGVjaWFsQm9vbGVhbkF0dHIsIGlzRnVuY3Rpb24sIE5PT1AsIGlzT24sIGlzTW9kZWxMaXN0ZW5lciwgY2FtZWxpemUgYXMgY2FtZWxpemUkMSwgRU1QVFlfT0JKLCBsb29zZVRvTnVtYmVyLCBsb29zZUluZGV4T2YsIGlzU2V0LCBsb29zZUVxdWFsLCBpbnZva2VBcnJheUZucywgaXNIVE1MVGFnLCBpc1NWR1RhZywgaXNNYXRoTUxUYWcgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gI
20578H0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGlzID8gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCB7IGlzIH0pIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgbmFtZXNwYWNlLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50O1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBUcmFuc2l0aW9uID0gKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cyk7XG5UcmFuc2l0aW9uLmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gVHJhbnNpdGlvbi5wcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MgPSBbXSkgPT4ge1xuICBpZiAoaXNBcnJheShob29rKSkge1xuICAgIGhvb2suZm9yRWFjaCgoaDIpID0+IGgyKC4uLmFyZ3MpKTtcbiAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgaG9vayguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICByZXR1cm4gaG9vayA/IGlzQXJyYXkoaG9vaykgPyBob29rLnNvbWUoKGgyKSA9PiBoMi5sZW5ndGggPiAxKSA6IGhvb2subGVuZ3RoID4gMSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgY29uc3QgYmFzZVByb3BzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMpKSB7XG4gICAgICBiYXNlUHJvcHNba2V5XSA9IHJhd1Byb3BzW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChyYXdQcm9wcy5jc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJhc2VQcm9wcztcbiAgfVxuICBjb25zdCB7XG4gICAgbmFtZSA9IFwidlwiLFxuICAgIHR5cGUsXG4gICAgZHVyYXRpb24sXG4gICAgZW50ZXJGcm9tQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1mcm9tYCxcbiAgICBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCxcbiAgICBlbnRlclRvQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci10b2AsXG4gICAgYXBwZWFyRnJvbUNsYXNzID0gZW50ZXJGcm9tQ2xhc3MsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLFxuICAgIGFwcGVhclRvQ2xhc3MgPSBlbnRlclRvQ2xhc3MsXG4gICAgbGVhdmVGcm9tQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1mcm9tYCxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCxcbiAgICBsZWF2ZVRvQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS10b2BcbiAgfSA9IHJhd1Byb3BzO1xuICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpem
20578VEdXJhdGlvbihkdXJhdGlvbik7XG4gIGNvbnN0IGVudGVyRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzBdO1xuICBjb25zdCBsZWF2ZUR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1sxXTtcbiAgY29uc3Qge1xuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsXG4gICAgb25BcHBlYXIgPSBvbkVudGVyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkID0gb25FbnRlckNhbmNlbGxlZFxuICB9ID0gYmFzZVByb3BzO1xuICBjb25zdCBmaW5pc2hFbnRlciA9IChlbCwgaXNBcHBlYXIsIGRvbmUpID0+IHtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKG9uTGVhdmUpKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBsZWF2ZUR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlLCBbZWwsIHJlc29sdmVdKTtcbiAgICB9LFxuICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gI
20578HJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlSWZOb3RTdGFsZSwgZXhwbGljaXRUaW1lb3V0KTtcbiAgfVxuICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiByZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZW5kRXZlbnQgPSB0eXBlICsgXCJlbmRcIjtcbiAgbGV0IGVuZGVkID0gMDtcbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbiAgICByZXNvbHZlSWZOb3RTdGFsZSgpO1xuICB9O1xuICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCAmJiArK2VuZGVkID49IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgZ2V0U3R5bGVQcm9wZXJ0aWVzID0gKGtleSkgPT4gKHN0eWxlc1trZXldIHx8IFwiXCIpLnNwbGl0KFwiLCBcIik7XG4gIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgP
20578SBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuICBsZXQgdHlwZSA9IG51bGw7XG4gIGxldCB0aW1lb3V0ID0gMDtcbiAgbGV0IHByb3BDb3VudCA9IDA7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICBpZiAodHJhbnNpdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gVFJBTlNJVElPTjtcbiAgICAgIHRpbWVvdXQgPSB0cmFuc2l0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgIGlmIChhbmltYXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IEFOSU1BVElPTjtcbiAgICAgIHRpbWVvdXQgPSBhbmltYXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGltZW91dCA9IE1hdGgubWF4KHRyYW5zaXRpb25UaW1lb3V0LCBhbmltYXRpb25UaW1lb3V0KTtcbiAgICB0eXBlID0gdGltZW91dCA+IDAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQgPyBUUkFOU0lUSU9OIDogQU5JTUFUSU9OIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlID8gdHlwZSA9PT0gVFJBTlNJVElPTiA/IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoIDogYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJiAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoXG4gICAgZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB0aW1lb3V0LFxuICAgIHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpbWVvdXQoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkLCBpKSA9PiB0b01zKGQpICsgdG9NcyhkZWxheXNbaV0pKSk7XG59XG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgaWYgKHMgPT09IFwiYXV0b1wiKSByZXR1cm4gMDtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKFwiLFwiLCBcIi5cIikpICogMWUzO1xufVxuZnVuY3Rpb24gZm9yY2VSZWZsb3coKSB7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDbGFzcyhlbCwgdmFsdWUsIGlzU1ZHKSB7XG4gIGNvbnN0IHRyYW5zaXRpb25DbGFzc2VzID0gZWxbdnRjS2V5XTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPyBbdmFsdWUsIC4uLnRyYW5zaXRpb25DbGFzc2VzXSA6IFsuLi50cmFuc2l0aW9uQ2xhc3Nlc10pLmpvaW4oXCIgXCIpO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gIH0gZWxzZSBpZiAoaXNTVkcpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuY2xhc3NOYW1lID0gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgdlNob3dPcmlnaW5hbERpc3BsYXkgPSBTeW1ib2woXCJfdm9kXCIpO1xuY29uc3QgdlNob3dIaWRkZW4gPSBTeW1ib2woXCJfdnNoXCIpO1xuY29uc3QgdlNob3cgPSB7XG4gIGJlZm9yZU1vdW50KGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgZWxbdlNob3dPcmlnaW5hbERpc3BsYXldID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZWwuc3R5bGUuZGlzcGxheTtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgfVxuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24ubGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVbm1vdW50KGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICB2U2hvdy5uYW1lID0gXCJzaG93XCI7XG59XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gOiBcIm5vbmVcIjtcbiAgZWxbdlNob3dIaWRkZW5dID0gIXZhbHVlO1xufVxuZnVuY3Rpb24gaW5pdFZTaG93Rm9yU1NSKCkge1xuICB2U2hvdy5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4geyBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9IH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBDU1NfVkFSX1RFWFQgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQ1NTX1ZBUl9URVhUXCIgOiBcIlwiKTtcbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc1ZhcnMgaXMgY2FsbGVkIHdpdGhvdXQgY3VycmVudCBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSBpbnN0YW5jZS51dCA9ICh2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KSkgPT4ge1xuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYClcbiAgICApLmZvckVhY2goKG5vZGUpID0+IHNldFZhcnNPbk5vZGUobm9kZSwgdmFycykpO1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmdldENzc1ZhcnMgPSAoKSA9PiBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICB9XG4gIGNvbnN0IHNldFZhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgdmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSk7XG4gICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgdXBkYXRlVGVsZXBvcnRzKHZhcnMpO1xuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgIG9iLm9ic2VydmUoaW5zdGFuY2Uuc3ViVHJlZS5lbC5wYXJlbnROb2RlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiBvYi5kaXNjb25uZWN0KCkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhcnNPblZOb2RlKHZub2RlLCB2YXJzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFzdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKCgpID0+IHtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCB2YXJzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB2bm9kZS5lbCkge1xuICAgIHNldFZhcnNPbk5vZGUodm5vZGUuZWwsIHZhcnMpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gc2V0VmFyc09uVk5vZGUoYywgdmFycykpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFN0YXRpYykge1xuICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgIHdoaWxlIChlbCkge1xuICAgICAgc2V0VmFyc09uTm9kZShlbCwgdmFycyk7XG4gICAgICBpZiAoZWwgPT09IGFuY2hvcikgYnJlYWs7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICBpZiAoZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGxldCBjc3NUZXh0ID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB2YXJzW2tleV0pO1xuICAgICAgY3NzVGV4dCArPSBgLS0ke2tleX06ICR7dmFyc1trZXldfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5jb25zdCBkaXNwbGF5UkUgPSAvKF58OylcXHMqZGlzcGxheVxccyo6LztcbmZ1bmN0aW9uIHBhdGNoU3R5bGUoZWwsIHByZXYsIG5leHQpIHtcbiAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgbGV0IGhhc0NvbnRyb2xsZWREaXNwbGF5ID0gZmFsc2U7XG4gIGlmIChuZXh0ICYmICFpc0Nzc1N0cmluZykge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICBpZiAoIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgICAgICBpZiAobmV4dFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwcmV2U3R5bGUgb2YgcHJldi5zcGxpdChcIjtcIikpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBwcmV2U3R5bGUuc2xpY2UoMCwgcHJldlN0eWxlLmluZGV4T2YoXCI6XCIpKS50cmltKCk7XG4gICAgICAgICAgaWYgKG5leHRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYgKGtleSA9PT0gXCJkaXNwbGF5XCIpIHtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgbmV4dFtrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzQ3NzU3RyaW5nKSB7XG4gICAgICBpZiAocHJldiAhPT0gbm
20578V4dCkge1xuICAgICAgICBjb25zdCBjc3NWYXJUZXh0ID0gc3R5bGVbQ1NTX1ZBUl9URVhUXTtcbiAgICAgICAgaWYgKGNzc1ZhclRleHQpIHtcbiAgICAgICAgICBuZXh0ICs9IFwiO1wiICsgY3NzVmFyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS5jc3NUZXh0ID0gbmV4dDtcbiAgICAgICAgaGFzQ29udHJvbGxlZERpc3BsYXkgPSBkaXNwbGF5UkUudGVzdChuZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZXYpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIH1cbiAgfVxuICBpZiAodlNob3dPcmlnaW5hbERpc3BsYXkgaW4gZWwpIHtcbiAgICBlbFt2U2hvd09yaWdpbmFsRGlzcGxheV0gPSBoYXNDb250cm9sbGVkRGlzcGxheSA/IHN0eWxlLmRpc3BsYXkgOiBcIlwiO1xuICAgIGlmIChlbFt2U2hvd0hpZGRlbl0pIHtcbiAgICAgIHN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHNlbWljb2xvblJFID0gL1teXFxcXF07XFxzKiQvO1xuY29uc3QgaW1wb3J0YW50UkUgPSAvXFxzKiFpbXBvcnRhbnQkLztcbmZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2YWwpIHtcbiAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgIHZhbC5mb3JFYWNoKCh2KSA9PiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdikpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWwgPT0gbnVsbCkgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSwgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGlzQm9vbGVhbiAmJiAhaW5jbHVkZUJvb2xlYW5BdHRyKHZhbHVlKSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcbiAgICAgICAga2V5LFxuICAgICAgICBpc0Jvb2xlYW4gPyBcIlwiIDogaXNTeW1ib2wodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBlbFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgfHwgXCJcIiA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcodmFsdWUpO1xuICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUgfHwgIShcIl92YWx1ZVwiIGluIGVsKSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH1cbiAgICBlbC5fdmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGVsW2tleV07XG4gICAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsICYmIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgbmVlZFJlbW92ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gI
20578HRyeSB7XG4gICAgZWxba2V5XSA9IHZhbHVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgc2V0dGluZyBwcm9wIFwiJHtrZXl9XCIgb24gPCR7dGFnLnRvTG93ZXJDYXNlKCl9PjogdmFsdWUgJHt2YWx1ZX0gaXMgaW52YWxpZC5gLFxuICAgICAgICBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBuZWVkUmVtb3ZlICYmIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuY29uc3QgdmVpS2V5ID0gU3ltYm9sKFwiX3ZlaVwiKTtcbmZ1bmN0aW9uIHBhdGNoRXZlbnQoZWwsIHJhd05hbWUsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBpbnN0YW5jZSA9IG51bGwpIHtcbiAgY29uc3QgaW52b2tlcnMgPSBlbFt2ZWlLZXldIHx8IChlbFt2ZWlLZXldID0ge30pO1xuICBjb25zdCBleGlzdGluZ0ludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXTtcbiAgaWYgKG5leHRWYWx1ZSAmJiBleGlzdGluZ0ludm9rZXIpIHtcbiAgICBleGlzdGluZ0ludm9rZXIudmFsdWUgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2FuaXRpemVFdmVudFZhbHVlKG5leHRWYWx1ZSwgcmF3TmFtZSkgOiBuZXh0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW25hbWUsIG9wdGlvbnNdID0gcGFyc2VOYW1lKHJhd05hbWUpO1xuICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgIGNvbnN0IGludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXSA9IGNyZWF0ZUludm9rZXIoXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzYW5pdGl6ZUV2ZW50VmFsdWUobmV4dFZhbHVlLCByYXdOYW1lKSA6IG5leHRWYWx1ZSxcbiAgICAgICAgaW5zdGFuY2VcbiAgICAgICk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nSW52b2tlcikge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKG9wdGlvbnNNb2RpZmllclJFLnRlc3QobmFtZSkpIHtcbiAgICBvcHRpb25zID0ge307XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKG0gPSBuYW1lLm1hdGNoKG9wdGlvbnNNb2RpZmllclJFKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIGludm9rZXIudmFsdWUpLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA1LFxuICAgICAgW2VdXG4gICAgKTtcbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHNhbml0aXplRXZlbnRWYWx1ZSh2YWx1ZSwgcHJvcE5hbWUpIHtcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHdhcm4oXG4gICAgYFdyb25nIHR5cGUgcGFzc2VkIGFzIGV2ZW50IGhhbmRsZXIgdG8gJHtwcm9wTmFtZX0gLSBkaWQgeW91IGZvcmdldCBAIG9yIDogaW4gZnJvbnQgb2YgeW91ciBwcm9wP1xuRXhwZWN0ZWQgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zLCByZWNlaXZlZCB0eXBlICR7dHlwZW9mIHZhbHVlfS5gXG4gICk7XG4gIHJldHVybiBOT09QO1xufVxuZnVuY3Rpb24gcGF0Y2hTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oZSwgdmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSAoKSA9PiB7XG4gICAgICBvcmlnaW5hbFN0b3AuY2FsbChlKTtcbiAgICAgIGUuX3N0b3BwZWQgPSB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIHZhbHVlLm1hcChcbiAgICAgIChmbikgPT4gKGUyKSA9PiAhZTIuX3N0b3BwZWQgJiYgZm4gJiYgZm4oZTIpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgaXNOYXRpdmVPbiA9IChrZXkpID0+IGtleS5jaGFyQ29kZUF0KDApID09PSAxMTEgJiYga2V5LmNoYXJDb2RlQXQoMSkgPT09IDExMCAmJiAvLyBsb3dlcmNhc2UgbGV0dGVyXG5rZXkuY2hhckNvZGVBdCgyKSA+IDk2ICYmIGtleS5jaGFyQ29kZUF0KDIpIDwgMTIzO1xuY29uc3QgcGF0Y2hQcm9wID0gKGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBuYW1lc3BhY2UsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICBjb25zdCBpc1NWRyA9IG5hbWVzcGFjZSA9PT0gXCJzdmdcIjtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgcGF0Y2hDbGFzcyhlbCwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICBwYXRjaFN0eWxlKGVsLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNPbihrZXkpKSB7XG4gICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgcGF0Y2hFdmVudChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICB9XG4gI
20578H0gZWxzZSBpZiAoa2V5WzBdID09PSBcIi5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIHRydWUpIDoga2V5WzBdID09PSBcIl5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIGZhbHNlKSA6IHNob3VsZFNldEFzUHJvcChlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKSkge1xuICAgIHBhdGNoRE9NUHJvcChlbCwga2V5LCBuZXh0VmFsdWUpO1xuICAgIGlmICghZWwudGFnTmFtZS5pbmNsdWRlcyhcIi1cIikgJiYgKGtleSA9PT0gXCJ2YWx1ZVwiIHx8IGtleSA9PT0gXCJjaGVja2VkXCIgfHwga2V5ID09PSBcInNlbGVjdGVkXCIpKSB7XG4gICAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRywgcGFyZW50Q29tcG9uZW50LCBrZXkgIT09IFwidmFsdWVcIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgPT09IFwidHJ1ZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fdHJ1ZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImZhbHNlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH1cbn07XG5mdW5jdGlvbiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgdmFsdWUsIGlzU1ZHKSB7XG4gIGlmIChpc1NWRykge1xuICAgIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5IGluIGVsICYmIGlzTmF0aXZlT24oa2V5KSAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInNwZWxsY2hlY2tcIiB8fCBrZXkgPT09IFwiZHJhZ2dhYmxlXCIgfHwga2V5ID09PSBcInRyYW5zbGF0ZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwiZm9ybVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwibGlzdFwiICYmIGVsLnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInR5cGVcIiAmJiBlbC50YWdOYW1lID09PSBcIlRFWFRBUkVBXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ3aWR0aFwiIHx8IGtleSA9PT0gXCJoZWlnaHRcIikge1xuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gICAgaWYgKHRhZyA9PT0gXCJJTUdcIiB8fCB0YWcgPT09IFwiVklERU9cIiB8fCB0YWcgPT09IFwiQ0FOVkFTXCIgfHwgdGFnID09PSBcIlNPVVJDRVwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc05hdGl2ZU9uKGtleSkgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBrZXkgaW4gZWw7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBoeWRyYXRlMikge1xuICBjb25zdCBDb21wID0gZGVmaW5lQ29tcG9uZW50KG9wdGlvbnMsIGV4dHJhT3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgaHlkcmF0ZTIpO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMsIGV4dHJhT3B0aW9ucykgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zLCBoeWRyYXRlKTtcbn07XG5jb25zdCBCYXNlQ2xhc3MgPSB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBIVE1MRWxlbWVudCA6IGNsYXNzIHtcbn07XG5jbGFzcyBWdWVFbGVtZW50IGV4dGVuZHMgQmFzZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoX2RlZiwgX3Byb3BzID0ge30sIGh5ZHJhdGUyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgIHRoaXMuX3Byb3BzID0gX3Byb3BzO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IGZhbHNlO1xuICAgIHRoaXMuX251bWJlclByb3BzID0gbnVsbDtcbiAgICB0aGlzLl9vYiA9IG51bGw7XG4gICAgaWYgKHRoaXMuc2hhZG93Um9vdCAmJiBoeWRyYXRlMikge1xuICAgICAgaHlkcmF0ZTIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gICAgICBpZiAoIXRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyh0aGlzLl9kZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgI
20578HRoaXMuX3Jlc29sdmVEZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX29iKSB7XG4gICAgICAgICAgdGhpcy5fb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIobnVsbCwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiByZXNvbHZlIGlubmVyIGNvbXBvbmVudCBkZWZpbml0aW9uIChoYW5kbGUgcG9zc2libGUgYXN5bmMgY29tcG9uZW50KVxuICAgKi9cbiAgX3Jlc29sdmVEZWYoKSB7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyKHRoaXMuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldEF0dHIobS5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vYi5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXNvbHZlID0gKGRlZiwgaXNBc3luYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCB7IHByb3BzLCBzdHlsZXMgfSA9IGRlZjtcbiAgICAgIGxldCBudW1iZXJQcm9wcztcbiAgICAgIGlmIChwcm9wcyAmJiAhaXNBcnJheShwcm9wcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBvcHQgPSBwcm9wc1trZXldO1xuICAgICAgICAgIGlmIChvcHQgPT09IE51bWJlciB8fCBvcHQgJiYgb3B0LnR5cGUgPT09IE51bWJlcikge1xuICAgICAgICAgICAgaWYgKGtleSBpbiB0aGlzLl9wcm9wcykge1xuICAgICAgICAgICAgICB0aGlzLl9wcm9wc1trZXldID0gdG9OdW1iZXIodGhpcy5fcHJvcHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAobnVtYmVyUHJvcHMgfHwgKG51bWJlclByb3BzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCkpKVtjYW1lbGl6ZSQxKGtleSldID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX251bWJlclByb3BzID0gbnVtYmVyUHJvcHM7XG4gICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICB0aGlzLl9yZXNvbHZlUHJvcHMoZGVmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKHN0eWxlcyk7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9O1xuICAgIGNvbnN0IGFzeW5jRGVmID0gdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7XG4gICAgaWYgKGFzeW5jRGVmKSB7XG4gICAgICBhc3luY0RlZigpLnRoZW4oKGRlZikgPT4gcmVzb2x2ZShkZWYsIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh0aGlzLl9kZWYpO1xuICAgIH1cbiAgfVxuICBfcmVzb2x2ZVByb3BzKGRlZikge1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IGRlZjtcbiAgICBjb25zdCBkZWNsYXJlZFByb3BLZXlzID0gaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IE9iamVjdC5rZXlzKHByb3BzIHx8IHt9KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xuICAgICAgaWYgKGtleVswXSAhPT0gXCJfXCIgJiYgZGVjbGFyZWRQcm9wS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB0aGlzW2tleV0sIHRydWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZGVjbGFyZWRQcm9wS2V5cy5tYXAoY2FtZWxpemUkMSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wKGtleSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWwpIHtcbiAgICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRBdHRyKGtleSkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuaGFzQXR0cmlidXRlKGtleSkgPyB0aGlzLmdldEF0dHJpYnV0ZShrZXkpIDogdm9pZCAwO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmICh0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX3Byb3BzW2tleV0pIHtcbiAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5
20578hdGUoa2V5KSwgdmFsICsgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIHJlbmRlcih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICB9XG4gIF9jcmVhdGVWTm9kZSgpIHtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgKHBhcmVudC5wYXJlbnROb2RlIHx8IHBhcmVudC5ob3N0KSkge1xuICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWdWVFbGVtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvdmlkZXMgPSBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcykge1xuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgICAgcy50ZXh0Q29udGVudCA9IGNzcztcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICh0aGlzLl9zdHlsZXMgfHwgKHRoaXMuX3N0eWxlcyA9IFtdKSkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXBJbXBsID0ge1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgI
20578HByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBtb3ZlZENoaWxkcmVuLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBjLmVsO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGNiID0gZWxbbW92ZUNiS2V5XSA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgICAgICAgIGVsW21vdmVDYktleV0gPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKGNoaWxkLmVsICYmIGNoaWxkLmVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uUHJvcHMsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChcbiAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZh
20578dWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IHJlbW92ZU1vZGUgPSAocHJvcHMpID0+IGRlbGV0ZSBwcm9wcy5tb2RlO1xuLyogQF9fUFVSRV9fICovIHJlbW92ZU1vZGUoVHJhbnNpdGlvbkdyb3VwSW1wbC5wcm9wcyk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICBjb25zdCBlbCA9IGMuZWw7XG4gIGlmIChlbFttb3ZlQ2JLZXldKSB7XG4gICAgZWxbbW92ZUNiS2V5XSgpO1xuICB9XG4gIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgIGVsW2VudGVyQ2JLZXldKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgbmV3UG9zaXRpb25NYXAuc2V0KGMsIGMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xufVxuZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbihjKSB7XG4gIGNvbnN0IG9sZFBvcyA9IHBvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgbmV3UG9zID0gbmV3UG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7XG4gIGNvbnN0IGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGNvbnN0IHMgPSBjLmVsLnN0eWxlO1xuICAgIHMudHJhbnNmb3JtID0gcy53ZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZHh9cHgsJHtkeX1weClgO1xuICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gXCIwc1wiO1xuICAgIHJldHVybiBjO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDU1NUcmFuc2Zvcm0oZWwsIHJvb3QsIG1vdmVDbGFzcykge1xuICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmZvckVhY2goKGNscykgPT4ge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKGMpKTtcbiAgICB9KTtcbiAgfVxuICBtb3ZlQ2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5hZGQoYykpO1xuICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIGNvbnN0IGNvbnRhaW5lciA9IHJvb3Qubm9kZVR5cGUgPT09IDEgPyByb290IDogcm9vdC5wYXJlbnROb2RlO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICBjb25zdCB7IGhhc1RyYW5zZm9ybSB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICByZXR1cm4gaGFzVHJhbnNmb3JtO1xufVxuXG5jb25zdCBnZXRNb2RlbEFzc2lnbmVyID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IGZuID0gdm5vZGUucHJvcHNbXCJvblVwZGF0ZTptb2RlbFZhbHVlXCJdIHx8IGZhbHNlO1xuICByZXR1cm4gaXNBcnJheShmbikgPyAodmFsdWUpID0+IGludm9rZUFycmF5Rm5zKGZuLCB2YWx1ZSkgOiBmbjtcbn07XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uU3RhcnQoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChlKSB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICBpZiAodGFyZ2V0LmNvbXBvc2luZykge1xuICAgIHRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gIH1cbn1cbmNvbnN0IGFzc2lnbktleSA9IFN5bWJvbChcIl9hc3NpZ25cIik7XG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICBjcmVhdGVkKGVsLCB7IG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBjb25zdCBjYXN0VG9OdW1iZXIgPSBudW1iZXIgfHwgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBsYXp5ID8gXCJjaGFuZ2VcIiA6IFwiaW5wdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC5jb21wb3NpbmcpIHJldHVybjtcbiAgICAgIGxldCBkb21WYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgZG9tVmFsdWUgPSBkb21WYWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FzdFRvTnVtYmVyKSB7XG4gICAgICAgIGRvbVZhbHVlID0gbG9vc2VUb051bWJlcihkb21WYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbFthc3NpZ25LZXldKGRvbVZhbHVlKTtcbiAgICB9KTtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLnRyaW0oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWxhenkpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsIG9uQ29tcG9zaXRpb25
20578FbmQpO1xuICAgIH1cbiAgfSxcbiAgLy8gc2V0IHZhbHVlIG9uIG1vdW50ZWQgc28gaXQncyBhZnRlciBtaW4vbWF4IGZvciB0eXBlPVwicmFuZ2VcIlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUsIG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBpZiAoZWwuY29tcG9zaW5nKSByZXR1cm47XG4gICAgY29uc3QgZWxWYWx1ZSA9IChudW1iZXIgfHwgZWwudHlwZSA9PT0gXCJudW1iZXJcIikgJiYgIS9eMFxcZC8udGVzdChlbC52YWx1ZSkgPyBsb29zZVRvTnVtYmVyKGVsLnZhbHVlKSA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgICBpZiAoZWxWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsICYmIGVsLnR5cGUgIT09IFwicmFuZ2VcIikge1xuICAgICAgaWYgKGxhenkgJiYgdmFsdWUgPT09IG9sZFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0cmltICYmIGVsLnZhbHVlLnRyaW0oKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBlbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG59O1xuY29uc3Qgdk1vZGVsQ2hlY2tib3ggPSB7XG4gIC8vICM0MDk2IGFycmF5IGNoZWNrYm94ZXMgbmVlZCB0byBiZSBkZWVwIHRyYXZlcnNlZFxuICBkZWVwOiB0cnVlLFxuICBjcmVhdGVkKGVsLCBfLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFZhbHVlID0gZWwuX21vZGVsVmFsdWU7XG4gICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSBnZXRWYWx1ZShlbCk7XG4gICAgICBjb25zdCBjaGVja2VkID0gZWwuY2hlY2tlZDtcbiAgICAgIGNvbnN0IGFzc2lnbiA9IGVsW2Fzc2lnbktleV07XG4gICAgICBpZiAoaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxvb3NlSW5kZXhPZihtb2RlbFZhbHVlLCBlbGVtZW50VmFsdWUpO1xuICAgICAgICBjb25zdCBmb3VuZCA9IGluZGV4ICE9PSAtMTtcbiAgICAgICAgaWYgKGNoZWNrZWQgJiYgIWZvdW5kKSB7XG4gICAgICAgICAgYXNzaWduKG1vZGVsVmFsdWUuY29uY2F0KGVsZW1lbnRWYWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFjaGVja2VkICYmIGZvdW5kKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbLi4ubW9kZWxWYWx1ZV07XG4gICAgICAgICAgZmlsdGVyZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICBhc3NpZ24oZmlsdGVyZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzU2V0KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZCA9IG5ldyBTZXQobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2xvbmVkLmFkZChlbGVtZW50VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb25lZC5kZWxldGUoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NpZ24oY2xvbmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2lnbihnZXRDaGVja2JveFZhbHVlKGVsLCBjaGVja2VkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIC8vIHNldCBpbml0aWFsIGNoZWNrZWQgb24gbW91bnQgdG8gd2FpdCBmb3IgdHJ1ZS12YWx1ZS9mYWxzZS12YWx1ZVxuICBtb3VudGVkOiBzZXRDaGVja2VkLFxuICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIHNldENoZWNrZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldENoZWNrZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gIGVsLl9tb2RlbFZhbHVlID0gdmFsdWU7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIHZub2Rl
20578LnByb3BzLnZhbHVlKSA+IC0xO1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCBnZXRDaGVja2JveFZhbHVlKGVsLCB0cnVlKSk7XG4gIH1cbn1cbmNvbnN0IHZNb2RlbFJhZGlvID0ge1xuICBjcmVhdGVkKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgZWxbYXNzaWduS2V5XShnZXRWYWx1ZShlbCkpO1xuICAgIH0pO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgdk1vZGVsU2VsZWN0ID0ge1xuICAvLyA8c2VsZWN0IG11bHRpcGxlPiB2YWx1ZSBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUsIG1vZGlmaWVyczogeyBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGNvbnN0IGlzU2V0TW9kZWwgPSBpc1NldCh2YWx1ZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZWwub3B0aW9ucywgKG8pID0+IG8uc2VsZWN0ZWQpLm1hcChcbiAgICAgICAgKG8pID0+IG51bWJlciA/IGxvb3NlVG9OdW1iZXIoZ2V0VmFsdWUobykpIDogZ2V0VmFsdWUobylcbiAgICAgICk7XG4gICAgICBlbFthc3NpZ25LZXldKFxuICAgICAgICBlbC5tdWx0aXBsZSA/IGlzU2V0TW9kZWwgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKSA6IHNlbGVjdGVkVmFsIDogc2VsZWN0ZWRWYWxbMF1cbiAgICAgICk7XG4gICAgICBlbC5fYXNzaWduaW5nID0gdHJ1ZTtcbiAgICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgZWwuX2Fzc2lnbmluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gIC8vIDxvcHRpb24+cy5cbiAgbW91bnRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9I
20578H0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIF9iaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0pIHtcbiAgICBpZiAoIWVsLl9hc3NpZ25pbmcpIHtcbiAgICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gc2V0U2VsZWN0ZWQoZWwsIHZhbHVlLCBudW1iZXIpIHtcbiAgY29uc3QgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBjb25zdCBpc0FycmF5VmFsdWUgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzTXVsdGlwbGUgJiYgIWlzQXJyYXlWYWx1ZSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5VmFsdWUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uVHlwZSA9IHR5cGVvZiBvcHRpb25WYWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvblR5cGUgPT09IFwic3RyaW5nXCIgfHwgb3B0aW9uVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlLnNvbWUoKHYpID0+IFN0cmluZyh2KSA9PT0gU3RyaW5nKG9wdGlvblZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBvcHRpb25WYWx1ZSkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSkgZWwuc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF
205785KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBndWFyZCA9IG1vZGlmaWVyR3VhcmRzW21vZGlmaWVyc1tpXV07XG4gICAgICBpZiAoZ3VhcmQgJiYgZ3VhcmQoZXZlbnQsIG1vZGlmaWVycykpIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgfSk7XG59O1xuY29uc3Qga2V5TmFtZXMgPSB7XG4gIGVzYzogXCJlc2NhcGVcIixcbiAgc3BhY2U6IFwiIFwiLFxuICB1cDogXCJhcnJvdy11cFwiLFxuICBsZWZ0OiBcImFycm93LWxlZnRcIixcbiAgcmlnaHQ6IFwiYXJyb3ctcmlnaHRcIixcbiAgZG93bjogXCJhcnJvdy1kb3duXCIsXG4gIGRlbGV0ZTogXCJiYWNrc3BhY2VcIlxufTtcbmNvbnN0IHdpdGhLZXlzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aEtleXMgfHwgKGZuLl93aXRoS2V5cyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKChrKSA9PiBrID09PSBldmVudEtleSB8fCBrZXlOYW1lc1trXSA9PT0gZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm4gZm4oZXZlbnQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59O1xuY29uc3QgaHlkcmF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn07XG5jb25zdCBjcmVhdGVBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVSZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO
205781xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGFwcC5fY29tcG9uZW50O1xuICAgIGlmICghaXNGdW5jdGlvbihjb21wb25lbnQpICYmICFjb21wb25lbnQucmVuZGVyICYmICFjb21wb25lbnQudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbnRhaW5lci5pbm5lckhUTUw7XG4gICAgfVxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuICAgIGNvbnN0IHByb3h5ID0gbW91bnQoY29udGFpbmVyLCBmYWxzZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJ2LWNsb2FrXCIpO1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtdi1hcHBcIiwgXCJcIik7XG4gICAgfVxuICAgIHJldHVybiBwcm94eTtcbiAgfTtcbiAgcmV0dXJuIGFwcDtcbn07XG5jb25zdCBjcmVhdGVTU1JBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gbW91bnQoY29udGFpbmVyLCB0cnVlLCByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwic3ZnXCI7XG4gIH1cbiAgaWYgKHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudCkge1xuICAgIHJldHVybiBcIm1hdGhtbFwiO1xuICB9XG59XG5mdW5jdGlvbiBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNOYXRpdmVUYWdcIiwge1xuICAgIHZhbHVlOiAodGFnKSA9PiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWR1RhZyh0YWcpIHx8IGlzTWF0aE1MVGFnKHRhZyksXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKSB7XG4gIGlmIChpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICBjb25zdCBpc0N1c3RvbUVsZW1lbnQgPSBhcHAuY29uZmlnLmlzQ3VzdG9tRWxlbWVudDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc0N1c3RvbUVsZW1lbnRcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gaXNDdXN0b21FbGVtZW50O1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgVGhlIFxcYGlzQ3VzdG9tRWxlbWVudFxcYCBjb25maWcgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBcXGBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50XFxgIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IGFwcC5jb25maWcuY29tcGlsZXJPcHRpb25zO1xuICAgIGNvbnN0IG1zZyA9IGBUaGUgXFxgY29tcGlsZXJPcHRpb25zXFxgIGNvbmZpZyBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZS5qcyB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyIChha2EgXCJmdWxsIGJ1aWxkXCIpLiBTaW5jZSB5b3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQsIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBtdXN0IGJlIHBhc3NlZCB0byBcXGBAdnVlL2NvbXBpbGVyLWRvbVxcYCBpbiB0aGUgYnVpbGQgc2V0dXAgaW5zdGVhZC5cbi0gRm9yIHZ1ZS1sb2FkZXI6IHBhc3MgaXQgdmlhIHZ1ZS1sb2FkZXIncyBcXGBjb21waWxlck9wdGlvbnNcXGAgbG9hZGVyIG9wdGlvbi5cbi0gRm9yIHZ1ZS1jbGk6IHNlZSBodHRwczovL2NsaS52dWVqcy5vcmcvZ3VpZGUvd2VicGFjay5odG1sI21vZGlmeWluZy1vcHRpb25zLW9mLWEtbG9hZGVyXG4tIEZvciB2aXRlOiBwYXNzIGl0IHZpYSBAdml0ZWpzL3BsdWdpbi12dWUgb3B0aW9ucy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS1wbHVnaW4tdnVlL3RyZWUvbWFpbi9wYWNrYWdlcy9wbHVnaW4tdnVlI2V4YW1wbGUtZm9yLXBhc3Npbmctb3B0aW9ucy10by12dWVjb21waWxlci1zZmNgO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImNvbXBpbGVyT3B0aW9uc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyT3B0aW9ucztcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IHJlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhcmVzKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIG1vdW50IGFwcDogbW91bnQgdGFyZ2V0IHNlbGVjdG9yIFwiJHtjb250YWluZXJ9XCIgcmV0dXJuZWQgbnVsbC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9k
20578dWN0aW9uXCIpICYmIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lci5tb2RlID09PSBcImNsb3NlZFwiKSB7XG4gICAgd2FybihcbiAgICAgIGBtb3VudGluZyBvbiBhIFNoYWRvd1Jvb3Qgd2l0aCBcXGB7bW9kZTogXCJjbG9zZWRcIn1cXGAgbWF5IGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBidWdzYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbmxldCBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IGZhbHNlO1xuY29uc3QgaW5pdERpcmVjdGl2ZXNGb3JTU1IgPSAoKSA9PiB7XG4gIGlmICghc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQpIHtcbiAgICBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaW5pdFZNb2RlbEZvclNTUigpO1xuICAgIGluaXRWU2hvd0ZvclNTUigpO1xuICB9XG59IDtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbiwgVHJhbnNpdGlvbkdyb3VwLCBWdWVFbGVtZW50LCBjcmVhdGVBcHAsIGNyZWF0ZVNTUkFwcCwgZGVmaW5lQ3VzdG9tRWxlbWVudCwgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudCwgaHlkcmF0ZSwgaW5pdERpcmVjdGl2ZXNGb3JTU1IsIHJlbmRlciwgdXNlQ3NzTW9kdWxlLCB1c2VDc3NWYXJzLCB2TW9kZWxDaGVja2JveCwgdk1vZGVsRHluYW1pYywgdk1vZGVsUmFkaW8sIHZNb2RlbFNlbGVjdCwgdk1vZGVsVGV4dCwgdlNob3csIHdpdGhLZXlzLCB3aXRoTW9kaWZpZXJzIH07XG4iLCIvKipcbiogQHZ1ZS9zaGFyZWQgdjMuNC4zNFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gbWFrZU1hcChzdHIsIGV4cGVjdHNMb3dlckNhc2UpIHtcbiAgY29uc3Qgc2V0ID0gbmV3IFNldChzdHIuc3BsaXQoXCIsXCIpKTtcbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2UgPyAodmFsKSA9PiBzZXQuaGFzKHZhbC50b0xvd2VyQ2FzZSgpKSA6ICh2YWwpID0+IHNldC5oYXModmFsKTtcbn1cblxuY29uc3QgRU1QVFlfT0JKID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IE9iamVjdC5mcmVlemUoe30pIDoge307XG5jb25zdCBFTVBUWV9BUlIgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gT2JqZWN0LmZyZWV6ZShbXSkgOiBbXTtcbmNvbnN0IE5PT1AgPSAoKSA9PiB7XG59O1xuY29uc3QgTk8gPSAoKSA9PiBmYWxzZTtcbmNvbnN0IGlzT24gPSAoa2V5KSA9PiBrZXkuY2hhckNvZGVBdCgwKSA9PT0gMTExICYmIGtleS5jaGFyQ29kZUF0KDEpID09PSAxMTAgJiYgLy8gdXBwZXJjYXNlIGxldHRlclxuKGtleS5jaGFyQ29kZUF0KDIpID4gMTIyIHx8IGtleS5jaGFyQ29kZUF0KDIpIDwgOTcpO1xuY29uc3QgaXNNb2RlbExpc3RlbmVyID0gKGtleSkgPT4ga2V5LnN0YXJ0c1dpdGgoXCJvblVwZGF0ZTpcIik7XG5jb25zdCBleHRlbmQgPSBPYmplY3QuYXNzaWduO1xuY29uc3QgcmVtb3ZlID0gKGFyciwgZWwpID0+IHtcbiAgY29uc3QgaSA9IGFyci5pbmRleE9mKGVsKTtcbiAgaWYgKGkgPiAtMSkge1xuICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gIH1cbn07XG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc01hcCA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgTWFwXVwiO1xuY29uc3QgaXNTZXQgPSAodmFsKSA9PiB0b1R5cGVTdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFNldF1cIjtcbmNvbnN0IGlzRGF0ZSA9ICh2YWwpID0+IHRvVHlwZVN0cmluZyh2YWwpID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbmNvbnN0IGlzUmVnRXhwID0gKHZhbCkgPT4gdG9UeXBlU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNTdHJpbmcgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiO1xuY29uc3QgaXNTeW1ib2wgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcInN5bWJvbFwiO1xuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbmNvbnN0IGlzUHJvbWlzZSA9ICh2YWwpID0+IHtcbiAgcmV0dXJuIChpc09iamVjdCh2YWwpIHx8IGlzRnVuY3Rpb24odmFsKSkgJiYgaXNGdW5jdGlvbih2YWwudGhlbikgJiYgaXNGdW5jdGlvbih2YWwuY2F0Y2gpO1xufTtcbmNvbnN0IG9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IHRvVHlwZVN0cmluZyA9ICh2YWx1ZSkgPT4gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5jb25zdCB0b1Jhd1R5cGUgPSAodmFsdWUpID0+IHtcbiAgcmV0dXJuIHRvVHlwZVN0cmluZyh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xufTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB0b1R5cGVTdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzSW50ZWdlcktleSA9IChrZXkpID0+IGlzU3RyaW5nKGtleSkgJiYga2V5ICE9PSBcIk5hTlwiICYmIGtleVswXSAhPT0gXCItXCIgJiYgXCJcIiArIHBhcnNlSW50KGtleSwgMTApID09PSBrZXk7XG5jb25zdCBpc1Jlc2VydmVkUHJvcCA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICAvLyB0aGUgbGVhZGluZyBjb21tYSBpcyBpbnRlbnRpb25hbCBzbyBlbXB0eSBzdHJpbmcgXCJcIiBpcyBhbHNvIGluY2x1ZGVkXG4gIFwiLGtleSxyZWYscmVmX2ZvcixyZWZfa2V5LG9uVm5vZGVCZWZvcmVNb3VudCxvblZub2RlTW91bnRlZCxvblZub2RlQmVmb3JlVXBkYXRlLG9uVm5vZGVVcGRhdGVkLG9uVm5vZGVCZWZvcmVVbm1vdW50LG9uVm5vZGVVbm1vdW50ZWRcIlxuKTtcbmNvbnN0IGlzQnVpbHRJbkRpcmVjdGl2ZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcImJpbmQsY2xvYWssZWxzZS1pZixlbHNlLGZvcixodG1sLGlmLG1vZGVsLG9uLG9uY2UscHJlLHNob3csc2xvdCx0ZXh0LG1lbW9cIlxuKTtcbmNvbnN0IGNhY2hlU3RyaW5nRnVuY3Rpb24gPSAoZm4pID0+IHtcbiAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIChzdHIpID0+IHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybi
20578BoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgfTtcbn07XG5jb25zdCBjYW1lbGl6ZVJFID0gLy0oXFx3KS9nO1xuY29uc3QgY2FtZWxpemUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIChfLCBjKSA9PiBjID8gYy50b1VwcGVyQ2FzZSgpIDogXCJcIik7XG59KTtcbmNvbnN0IGh5cGhlbmF0ZVJFID0gL1xcQihbQS1aXSkvZztcbmNvbnN0IGh5cGhlbmF0ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oXG4gIChzdHIpID0+IHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpXG4pO1xuY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufSk7XG5jb25zdCB0b0hhbmRsZXJLZXkgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHtcbiAgY29uc3QgcyA9IHN0ciA/IGBvbiR7Y2FwaXRhbGl6ZShzdHIpfWAgOiBgYDtcbiAgcmV0dXJuIHM7XG59KTtcbmNvbnN0IGhhc0NoYW5nZWQgPSAodmFsdWUsIG9sZFZhbHVlKSA9PiAhT2JqZWN0LmlzKHZhbHVlLCBvbGRWYWx1ZSk7XG5jb25zdCBpbnZva2VBcnJheUZucyA9IChmbnMsIC4uLmFyZykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgIGZuc1tpXSguLi5hcmcpO1xuICB9XG59O1xuY29uc3QgZGVmID0gKG9iaiwga2V5LCB2YWx1ZSwgd3JpdGFibGUgPSBmYWxzZSkgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGUsXG4gICAgdmFsdWVcbiAgfSk7XG59O1xuY29uc3QgbG9vc2VUb051bWJlciA9ICh2YWwpID0+IHtcbiAgY29uc3QgbiA9IHBhcnNlRmxvYXQodmFsKTtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbjtcbn07XG5jb25zdCB0b051bWJlciA9ICh2YWwpID0+IHtcbiAgY29uc3QgbiA9IGlzU3RyaW5nKHZhbCkgPyBOdW1iZXIodmFsKSA6IE5hTjtcbiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbjtcbn07XG5sZXQgX2dsb2JhbFRoaXM7XG5jb25zdCBnZXRHbG9iYWxUaGlzID0gKCkgPT4ge1xuICByZXR1cm4gX2dsb2JhbFRoaXMgfHwgKF9nbG9iYWxUaGlzID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB7fSk7XG59O1xuY29uc3QgaWRlbnRSRSA9IC9eW18kYS16QS1aXFx4QTAtXFx1RkZGRl1bXyRhLXpBLVowLTlcXHhBMC1cXHVGRkZGXSokLztcbmZ1bmN0aW9uIGdlblByb3BzQWNjZXNzRXhwKG5hbWUpIHtcbiAgcmV0dXJuIGlkZW50UkUudGVzdChuYW1lKSA/IGBfX3Byb3BzLiR7bmFtZX1gIDogYF9fcHJvcHNbJHtKU09OLnN0cmluZ2lmeShuYW1lKX1dYDtcbn1cblxuY29uc3QgUGF0Y2hGbGFncyA9IHtcbiAgXCJURVhUXCI6IDEsXG4gIFwiMVwiOiBcIlRFWFRcIixcbiAgXCJDTEFTU1wiOiAyLFxuICBcIjJcIjogXCJDTEFTU1wiLFxuICBcIlNUWUxFXCI6IDQsXG4gIFwiNFwiOiBcIlNUWUxFXCIsXG4gIFwiUFJPUFNcIjogOCxcbiAgXCI4XCI6IFwiUFJPUFNcIixcbiAgXCJGVUxMX1BST1BTXCI6IDE2LFxuICBcIjE2XCI6IFwiRlVMTF9QUk9QU1wiLFxuICBcIk5FRURfSFlEUkFUSU9OXCI6IDMyLFxuICBcIjMyXCI6IFwiTkVFRF9IWURSQVRJT05cIixcbiAgXCJTVEFCTEVfRlJBR01FTlRcIjogNjQsXG4gIFwiNjRcIjogXCJTVEFCTEVfRlJBR01FTlRcIixcbiAgXCJLRVlFRF9GUkFHTUVOVFwiOiAxMjgsXG4gIFwiMTI4XCI6IFwiS0VZRURfRlJBR01FTlRcIixcbiAgXCJVTktFWUVEX0ZSQUdNRU5UXCI6IDI1NixcbiAgXCIyNTZcIjogXCJVTktFWUVEX0ZSQUdNRU5UXCIsXG4gIFwiTkVFRF9QQVRDSFwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiTkVFRF9QQVRDSFwiLFxuICBcIkRZTkFNSUNfU0xPVFNcIjogMTAyNCxcbiAgXCIxMDI0XCI6IFwiRFlOQU1JQ19TTE9UU1wiLFxuICBcIkRFVl9ST09UX0ZSQUdNRU5UXCI6IDIwNDgsXG4gIFwiMjA0OFwiOiBcIkRFVl9ST09UX0ZSQUdNRU5UXCIsXG4gIFwiSE9JU1RFRFwiOiAtMSxcbiAgXCItMVwiOiBcIkhPSVNURURcIixcbiAgXCJCQUlMXCI6IC0yLFxuICBcIi0yXCI6IFwiQkFJTFwiXG59O1xuY29uc3QgUGF0Y2hGbGFnTmFtZXMgPSB7XG4gIFsxXTogYFRFWFRgLFxuICBbMl06IGBDTEFTU2AsXG4gIFs0XTogYFNUWUxFYCxcbiAgWzhdOiBgUFJPUFNgLFxuICBbMTZdOiBgRlVMTF9QUk9QU2AsXG4gIFszMl06IGBORUVEX0hZRFJBVElPTmAsXG4gIFs2NF06IGBTVEFCTEVfRlJBR01FTlRgLFxuICBbMTI4XTogYEtFWUVEX0ZSQUdNRU5UYCxcbiAgWzI1Nl06IGBVTktFWUVEX0ZSQUdNRU5UYCxcbiAgWzUxMl06IGBORUVEX1BBVENIYCxcbiAgWzEwMjRdOiBgRFlOQU1JQ19TTE9UU2AsXG4gIFsyMDQ4XTogYERFVl9ST09UX0ZSQUdNRU5UYCxcbiAgWy0xXTogYEhPSVNURURgLFxuICBbLTJdOiBgQkFJTGBcbn07XG5cbmNvbnN0IFNoYXBlRmxhZ3MgPSB7XG4gIFwiRUxFTUVOVFwiOiAxLFxuICBcIjFcIjogXCJFTEVNRU5UXCIsXG4gIFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIjogMixcbiAgXCIyXCI6IFwiRlVOQ1RJT05BTF9DT01QT05FTlRcIixcbiAgXCJTVEFURUZVTF9DT01QT05FTlRcIjogNCxcbiAgXCI0XCI6IFwiU1RBVEVGVUxfQ09NUE9ORU5UXCIsXG4gIFwiVEVYVF9DSElMRFJFTlwiOiA4LFxuICBcIjhcIjogXCJURVhUX0NISUxEUkVOXCIsXG4gIFwiQVJSQVlfQ0hJTERSRU5cIjogMTYsXG4gIFwiMTZcIjogXCJBUlJBWV9DSElMRFJFTlwiLFxuICBcIlNMT1RTX0NISUxEUkVOXCI6IDMyLFxuICBcIjMyXCI6IFwiU0xPVFNfQ0hJTERSRU5cIixcbiAgXCJURUxFUE9SVFwiOiA2NCxcbiAgXCI2NFwiOiBcIlRFTEVQT1J
20578UXCIsXG4gIFwiU1VTUEVOU0VcIjogMTI4LFxuICBcIjEyOFwiOiBcIlNVU1BFTlNFXCIsXG4gIFwiQ09NUE9ORU5UX1NIT1VMRF9LRUVQX0FMSVZFXCI6IDI1NixcbiAgXCIyNTZcIjogXCJDT01QT05FTlRfU0hPVUxEX0tFRVBfQUxJVkVcIixcbiAgXCJDT01QT05FTlRfS0VQVF9BTElWRVwiOiA1MTIsXG4gIFwiNTEyXCI6IFwiQ09NUE9ORU5UX0tFUFRfQUxJVkVcIixcbiAgXCJDT01QT05FTlRcIjogNixcbiAgXCI2XCI6IFwiQ09NUE9ORU5UXCJcbn07XG5cbmNvbnN0IFNsb3RGbGFncyA9IHtcbiAgXCJTVEFCTEVcIjogMSxcbiAgXCIxXCI6IFwiU1RBQkxFXCIsXG4gIFwiRFlOQU1JQ1wiOiAyLFxuICBcIjJcIjogXCJEWU5BTUlDXCIsXG4gIFwiRk9SV0FSREVEXCI6IDMsXG4gIFwiM1wiOiBcIkZPUldBUkRFRFwiXG59O1xuY29uc3Qgc2xvdEZsYWdzVGV4dCA9IHtcbiAgWzFdOiBcIlNUQUJMRVwiLFxuICBbMl06IFwiRFlOQU1JQ1wiLFxuICBbM106IFwiRk9SV0FSREVEXCJcbn07XG5cbmNvbnN0IEdMT0JBTFNfQUxMT1dFRCA9IFwiSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTixwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCxNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsQmlnSW50LGNvbnNvbGUsRXJyb3JcIjtcbmNvbnN0IGlzR2xvYmFsbHlBbGxvd2VkID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoR0xPQkFMU19BTExPV0VEKTtcbmNvbnN0IGlzR2xvYmFsbHlXaGl0ZWxpc3RlZCA9IGlzR2xvYmFsbHlBbGxvd2VkO1xuXG5jb25zdCByYW5nZSA9IDI7XG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGVGcmFtZShzb3VyY2UsIHN0YXJ0ID0gMCwgZW5kID0gc291cmNlLmxlbmd0aCkge1xuICBzdGFydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHN0YXJ0LCBzb3VyY2UubGVuZ3RoKSk7XG4gIGVuZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGVuZCwgc291cmNlLmxlbmd0aCkpO1xuICBpZiAoc3RhcnQgPiBlbmQpIHJldHVybiBcIlwiO1xuICBsZXQgbGluZXMgPSBzb3VyY2Uuc3BsaXQoLyhcXHI/XFxuKS8pO1xuICBjb25zdCBuZXdsaW5lU2VxdWVuY2VzID0gbGluZXMuZmlsdGVyKChfLCBpZHgpID0+IGlkeCAlIDIgPT09IDEpO1xuICBsaW5lcyA9IGxpbmVzLmZpbHRlcigoXywgaWR4KSA9PiBpZHggJSAyID09PSAwKTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgcmVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3VudCArPSBsaW5lc1tpXS5sZW5ndGggKyAobmV3bGluZVNlcXVlbmNlc1tpXSAmJiBuZXdsaW5lU2VxdWVuY2VzW2ldLmxlbmd0aCB8fCAwKTtcbiAgICBpZiAoY291bnQgPj0gc3RhcnQpIHtcbiAgICAgIGZvciAobGV0IGogPSBpIC0gcmFuZ2U7IGogPD0gaSArIHJhbmdlIHx8IGVuZCA+IGNvdW50OyBqKyspIHtcbiAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbGluZXMubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbGluZSA9IGogKyAxO1xuICAgICAgICByZXMucHVzaChcbiAgICAgICAgICBgJHtsaW5lfSR7XCIgXCIucmVwZWF0KE1hdGgubWF4KDMgLSBTdHJpbmcobGluZSkubGVuZ3RoLCAwKSl9fCAgJHtsaW5lc1tqXX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBsaW5lc1tqXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5ld0xpbmVTZXFMZW5ndGggPSBuZXdsaW5lU2VxdWVuY2VzW2pdICYmIG5ld2xpbmVTZXF1ZW5jZXNbal0ubGVuZ3RoIHx8IDA7XG4gICAgICAgIGlmIChqID09PSBpKSB7XG4gICAgICAgICAgY29uc3QgcGFkID0gc3RhcnQgLSAoY291bnQgLSAobGluZUxlbmd0aCArIG5ld0xpbmVTZXFMZW5ndGgpKTtcbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heChcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBlbmQgPiBjb3VudCA/IGxpbmVMZW5ndGggLSBwYWQgOiBlbmQgLSBzdGFydFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzLnB1c2goYCAgIHwgIGAgKyBcIiBcIi5yZXBlYXQocGFkKSArIFwiXlwiLnJlcGVhdChsZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChqID4gaSkge1xuICAgICAgICAgIGlmIChlbmQgPiBjb3VudCkge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoTWF0aC5taW4oZW5kIC0gY291bnQsIGxpbmVMZW5ndGgpLCAxKTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGAgICB8ICBgICsgXCJeXCIucmVwZWF0KGxlbmd0aCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb3VudCArPSBsaW5lTGVuZ3RoICsgbmV3TGluZVNlcUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGUodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHZhbHVlW2ldO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGlzU3RyaW5nKGl0ZW0pID8gcGFyc2VTdHJpbmdTdHlsZShpdGVtKSA6IG5vcm1hbGl6ZVN0eWxlKGl0ZW0pO1xuICAgICAgaWYgKG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9ybWFsaXplZCkge1xuICAgICAgICAgIHJlc1trZXldID0gbm9ybWFsaXplZFtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWUpIHx8IGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY29uc3QgbGlzdERlbGltaXRlclJFID0gLzsoPyFbXihdKlxcKSkvZztcbmNvbnN0IHByb3BlcnR5RGVsaW1pdGVyUkUgPSAvOihbXl0rKS87XG5jb25zdCBzdHlsZUNvbW1lbnRSRSA9IC9cXC9cXCpbXl0qP1xcKlxcLy9nO1xuZnVuY3Rpb24gcGFyc2VTdHJpbmdTdHlsZShjc3NUZXh0KSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBjc3NUZXh0LnJlcGxhY2Uoc3R5bGVDb21tZW50UkUsIFwiXCIpLnNwbGl0KGxpc3REZWxpbWl0ZXJSRSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBjb25zdCB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW
205781pdGVyUkUpO1xuICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJldFt0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdHlsZShzdHlsZXMpIHtcbiAgbGV0IHJldCA9IFwiXCI7XG4gIGlmICghc3R5bGVzIHx8IGlzU3RyaW5nKHN0eWxlcykpIHtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgIGNvbnN0IHZhbHVlID0gc3R5bGVzW2tleV07XG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBrZXkuc3RhcnRzV2l0aChgLS1gKSA/IGtleSA6IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgcmV0ICs9IGAke25vcm1hbGl6ZWRLZXl9OiR7dmFsdWV9O2A7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDbGFzcyh2YWx1ZSkge1xuICBsZXQgcmVzID0gXCJcIjtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJlcyA9IHZhbHVlO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUNsYXNzKHZhbHVlW2ldKTtcbiAgICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICAgIHJlcyArPSBub3JtYWxpemVkICsgXCIgXCI7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlW25hbWVdKSB7XG4gICAgICAgIHJlcyArPSBuYW1lICsgXCIgXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXMudHJpbSgpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHMocHJvcHMpIHtcbiAgaWYgKCFwcm9wcykgcmV0dXJuIG51bGw7XG4gIGxldCB7IGNsYXNzOiBrbGFzcywgc3R5bGUgfSA9IHByb3BzO1xuICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICB9XG4gIGlmIChzdHlsZSkge1xuICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICB9XG4gIHJldHVybiBwcm9wcztcbn1cblxuY29uc3QgSFRNTF9UQUdTID0gXCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsaDEsaDIsaDMsaDQsaDUsaDYsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsc3VtbWFyeSx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdFwiO1xuY29uc3QgU1ZHX1RBR1MgPSBcInN2ZyxhbmltYXRlLGFuaW1hdGVNb3Rpb24sYW5pbWF0ZVRyYW5zZm9ybSxjaXJjbGUsY2xpcFBhdGgsY29sb3ItcHJvZmlsZSxkZWZzLGRlc2MsZGlzY2FyZCxlbGxpcHNlLGZlQmxlbmQsZmVDb2xvck1hdHJpeCxmZUNvbXBvbmVudFRyYW5zZmVyLGZlQ29tcG9zaXRlLGZlQ29udm9sdmVNYXRyaXgsZmVEaWZmdXNlTGlnaHRpbmcsZmVEaXNwbGFjZW1lbnRNYXAsZmVEaXN0YW50TGlnaHQsZmVEcm9wU2hhZG93LGZlRmxvb2QsZmVGdW5jQSxmZUZ1bmNCLGZlRnVuY0csZmVGdW5jUixmZUdhdXNzaWFuQmx1cixmZUltYWdlLGZlTWVyZ2UsZmVNZXJnZU5vZGUsZmVNb3JwaG9sb2d5LGZlT2Zmc2V0LGZlUG9pbnRMaWdodCxmZVNwZWN1bGFyTGlnaHRpbmcsZmVTcG90TGlnaHQsZmVUaWxlLGZlVHVyYnVsZW5jZSxmaWx0ZXIsZm9yZWlnbk9iamVjdCxnLGhhdGNoLGhhdGNocGF0aCxpbWFnZSxsaW5lLGxpbmVhckdyYWRpZW50LG1hcmtlcixtYXNrLG1lc2gsbWVzaGdyYWRpZW50LG1lc2hwYXRjaCxtZXNocm93LG1ldGFkYXRhLG1wYXRoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc2V0LHNvbGlkY29sb3Isc3RvcCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dFBhdGgsdGl0bGUsdHNwYW4sdW5rbm93bix1c2Usdmlld1wiO1xuY29uc3QgTUFUSF9UQUdTID0gXCJhbm5vdGF0aW9uLGFubm90YXRpb24teG1sLG1hY3Rpb24sbWFsaWduZ3JvdXAsbWFsaWdubWFyayxtYXRoLG1lbmNsb3NlLG1lcnJvcixtZmVuY2VkLG1mcmFjLG1mcmFjdGlvbixtZ2x5cGgsbWksbWxhYmVsZWR0cixtbG9uZ2RpdixtbXVsdGlzY3JpcHRzLG1uLG1vLG1vdmVyLG1wYWRkZWQsbXBoYW50b20sbXByZXNjcmlwdHMsbXJvb3QsbXJvdyxtcyxtc2NhcnJpZXMsbXNjYXJyeSxtc2dyb3VwLG1zbGluZSxtc3BhY2UsbXNxcnQsbXNyb3csbXN0YWNrLG1zdHlsZSxtc3ViLG1zdWJzdXAsbXN1cCxtdGFibGUsbXRkLG10ZXh0LG10cixtdW5kZXIsbXVuZGVyb3Zlcixub25lLHNlbWFudGljc1wiO1xuY29uc3QgVk9JRF9UQUdTID0gXCJhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGhyLGltZyxpbnB1dCxsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdiclwiO1xuY29uc3QgaXNIVE1MVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoSFRNTF9UQUdTKTtcbmNvbnN0IGlzU1ZHVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoU1ZHX1RBR1MpO1xuY29uc3QgaXNNYXRoTUxUYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChNQVRIX1RB
20578R1MpO1xuY29uc3QgaXNWb2lkVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoVk9JRF9UQUdTKTtcblxuY29uc3Qgc3BlY2lhbEJvb2xlYW5BdHRycyA9IGBpdGVtc2NvcGUsYWxsb3dmdWxsc2NyZWVuLGZvcm1ub3ZhbGlkYXRlLGlzbWFwLG5vbW9kdWxlLG5vdmFsaWRhdGUscmVhZG9ubHlgO1xuY29uc3QgaXNTcGVjaWFsQm9vbGVhbkF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChzcGVjaWFsQm9vbGVhbkF0dHJzKTtcbmNvbnN0IGlzQm9vbGVhbkF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgc3BlY2lhbEJvb2xlYW5BdHRycyArIGAsYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNvbnRyb2xzLGRlZmF1bHQsZGVmZXIsZGlzYWJsZWQsaGlkZGVuLGluZXJ0LGxvb3Asb3BlbixyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3MsY2hlY2tlZCxtdXRlZCxtdWx0aXBsZSxzZWxlY3RlZGBcbik7XG5mdW5jdGlvbiBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5jb25zdCB1bnNhZmVBdHRyQ2hhclJFID0gL1s+Lz1cIidcXHUwMDA5XFx1MDAwYVxcdTAwMGNcXHUwMDIwXS87XG5jb25zdCBhdHRyVmFsaWRhdGlvbkNhY2hlID0ge307XG5mdW5jdGlvbiBpc1NTUlNhZmVBdHRyTmFtZShuYW1lKSB7XG4gIGlmIChhdHRyVmFsaWRhdGlvbkNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGF0dHJWYWxpZGF0aW9uQ2FjaGVbbmFtZV07XG4gIH1cbiAgY29uc3QgaXNVbnNhZmUgPSB1bnNhZmVBdHRyQ2hhclJFLnRlc3QobmFtZSk7XG4gIGlmIChpc1Vuc2FmZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHVuc2FmZSBhdHRyaWJ1dGUgbmFtZTogJHtuYW1lfWApO1xuICB9XG4gIHJldHVybiBhdHRyVmFsaWRhdGlvbkNhY2hlW25hbWVdID0gIWlzVW5zYWZlO1xufVxuY29uc3QgcHJvcHNUb0F0dHJNYXAgPSB7XG4gIGFjY2VwdENoYXJzZXQ6IFwiYWNjZXB0LWNoYXJzZXRcIixcbiAgY2xhc3NOYW1lOiBcImNsYXNzXCIsXG4gIGh0bWxGb3I6IFwiZm9yXCIsXG4gIGh0dHBFcXVpdjogXCJodHRwLWVxdWl2XCJcbn07XG5jb25zdCBpc0tub3duSHRtbEF0dHIgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgYGFjY2VwdCxhY2NlcHQtY2hhcnNldCxhY2Nlc3NrZXksYWN0aW9uLGFsaWduLGFsbG93LGFsdCxhc3luYyxhdXRvY2FwaXRhbGl6ZSxhdXRvY29tcGxldGUsYXV0b2ZvY3VzLGF1dG9wbGF5LGJhY2tncm91bmQsYmdjb2xvcixib3JkZXIsYnVmZmVyZWQsY2FwdHVyZSxjaGFsbGVuZ2UsY2hhcnNldCxjaGVja2VkLGNpdGUsY2xhc3MsY29kZSxjb2RlYmFzZSxjb2xvcixjb2xzLGNvbHNwYW4sY29udGVudCxjb250ZW50ZWRpdGFibGUsY29udGV4dG1lbnUsY29udHJvbHMsY29vcmRzLGNyb3Nzb3JpZ2luLGNzcCxkYXRhLGRhdGV0aW1lLGRlY29kaW5nLGRlZmF1bHQsZGVmZXIsZGlyLGRpcm5hbWUsZGlzYWJsZWQsZG93bmxvYWQsZHJhZ2dhYmxlLGRyb3B6b25lLGVuY3R5cGUsZW50ZXJrZXloaW50LGZvcixmb3JtLGZvcm1hY3Rpb24sZm9ybWVuY3R5cGUsZm9ybW1ldGhvZCxmb3Jtbm92YWxpZGF0ZSxmb3JtdGFyZ2V0LGhlYWRlcnMsaGVpZ2h0LGhpZGRlbixoaWdoLGhyZWYsaHJlZmxhbmcsaHR0cC1lcXVpdixpY29uLGlkLGltcG9ydGFuY2
20578UsaW5lcnQsaW50ZWdyaXR5LGlzbWFwLGl0ZW1wcm9wLGtleXR5cGUsa2luZCxsYWJlbCxsYW5nLGxhbmd1YWdlLGxvYWRpbmcsbGlzdCxsb29wLGxvdyxtYW5pZmVzdCxtYXgsbWF4bGVuZ3RoLG1pbmxlbmd0aCxtZWRpYSxtaW4sbXVsdGlwbGUsbXV0ZWQsbmFtZSxub3ZhbGlkYXRlLG9wZW4sb3B0aW11bSxwYXR0ZXJuLHBpbmcscGxhY2Vob2xkZXIscG9zdGVyLHByZWxvYWQscmFkaW9ncm91cCxyZWFkb25seSxyZWZlcnJlcnBvbGljeSxyZWwscmVxdWlyZWQscmV2ZXJzZWQscm93cyxyb3dzcGFuLHNhbmRib3gsc2NvcGUsc2NvcGVkLHNlbGVjdGVkLHNoYXBlLHNpemUsc2l6ZXMsc2xvdCxzcGFuLHNwZWxsY2hlY2ssc3JjLHNyY2RvYyxzcmNsYW5nLHNyY3NldCxzdGFydCxzdGVwLHN0eWxlLHN1bW1hcnksdGFiaW5kZXgsdGFyZ2V0LHRpdGxlLHRyYW5zbGF0ZSx0eXBlLHVzZW1hcCx2YWx1ZSx3aWR0aCx3cmFwYFxuKTtcbmNvbnN0IGlzS25vd25TdmdBdHRyID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXG4gIGB4bWxucyxhY2NlbnQtaGVpZ2h0LGFjY3VtdWxhdGUsYWRkaXRpdmUsYWxpZ25tZW50LWJhc2VsaW5lLGFscGhhYmV0aWMsYW1wbGl0dWRlLGFyYWJpYy1mb3JtLGFzY2VudCxhdHRyaWJ1dGVOYW1lLGF0dHJpYnV0ZVR5cGUsYXppbXV0aCxiYXNlRnJlcXVlbmN5LGJhc2VsaW5lLXNoaWZ0LGJhc2VQcm9maWxlLGJib3gsYmVnaW4sYmlhcyxieSxjYWxjTW9kZSxjYXAtaGVpZ2h0LGNsYXNzLGNsaXAsY2xpcFBhdGhVbml0cyxjbGlwLXBhdGgsY2xpcC1ydWxlLGNvbG9yLGNvbG9yLWludGVycG9sYXRpb24sY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzLGNvbG9yLXByb2ZpbGUsY29sb3ItcmVuZGVyaW5nLGNvbnRlbnRTY3JpcHRUeXBlLGNvbnRlbnRTdHlsZVR5cGUsY3Jvc3NvcmlnaW4sY3Vyc29yLGN4LGN5LGQsZGVjZWxlcmF0ZSxkZXNjZW50LGRpZmZ1c2VDb25zdGFudCxkaXJlY3Rpb24sZGlzcGxheSxkaXZpc29yLGRvbWluYW50LWJhc2VsaW5lLGR1cixkeCxkeSxlZGdlTW9kZSxlbGV2YXRpb24sZW5hYmxlLWJhY2tncm91bmQsZW5kLGV4cG9uZW50LGZpbGwsZmlsbC1vcGFjaXR5LGZpbGwtcnVsZSxmaWx0ZXIsZmlsdGVyUmVzLGZpbHRlclVuaXRzLGZsb29kLWNvbG9yLGZsb29kLW9wYWNpdHksZm9udC1mYW1pbHksZm9udC1zaXplLGZvbnQtc2l6ZS1hZGp1c3QsZm9udC1zdHJldGNoLGZvbnQtc3R5bGUsZm9udC12YXJpYW50LGZvbnQtd2VpZ2h0LGZvcm1hdCxmcm9tLGZyLGZ4LGZ5LGcxLGcyLGdseXBoLW5hbWUsZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCxnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCxnbHlwaFJlZixncmFkaWVudFRyYW5zZm9ybSxncmFkaWVudFVuaXRzLGhhbmdpbmcsaGVpZ2h0LGhyZWYsaHJlZmxhbmcsaG9yaXotYWR2LXgsaG9yaXotb3JpZ2luLXgsaWQsaWRlb2dyYXBoaWMsaW1hZ2UtcmVuZGVyaW5nLGluLGluMixpbnRlcmNlcHQsayxrMSxrMixrMyxrNCxrZXJuZWxNYXRyaXgsa2VybmVsVW5pdExlbmd0aCxrZXJuaW5nLGtleVBvaW50cyxrZXlTcGxpbmVzLGtleVRpbWVzLGxhbmcsbGVuZ3RoQWRqdXN0LGxldHRlci1zcGFjaW5nLGxpZ2h0aW5nLWNvbG9yLGxpbWl0aW5nQ29uZUFuZ2xlLGxvY2FsLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLG1hcmtlcldpZHRoLG1hc2ssbWFza0NvbnRlbnRVbml0cyxtYXNrVW5pdHMsbWF0aGVtYXRpY2FsLG1heCxtZWRpYSxtZXRob2QsbWluLG1vZGUsbmFtZSxudW1PY3RhdmVzLG9mZnNldCxvcGFjaXR5LG9wZXJhdG9yLG9yZGVyLG9yaWVudCxvcmllbnRhdGlvbixvcmlnaW4sb3ZlcmZsb3csb3ZlcmxpbmUtcG9zaXRpb24sb3ZlcmxpbmUtdGhpY2tuZXNzLHBhbm9zZS0xLHBhaW50LW9yZGVyLHBhdGgscGF0aExlbmd0aCxwYXR0ZXJuQ29udGVudFVuaXRzLHBhdHRlcm5UcmFuc2Zvcm0scGF0dGVyblVuaXRzLHBpbmcscG9pbnRlci1ldmVudHMscG9pbnRzLHBvaW50c0F0WCxwb2ludHNBdFkscG9pbnRzQXRaLHByZXNlcnZlQWxwaGEscHJlc2VydmVBc3BlY3RSYXRpbyxwcmltaXRpdmVVbml0cyxyLHJhZGl1cyxyZWZlcnJlclBvbGljeSxyZWZYLHJlZlkscmVsLHJlbmRlcmluZy1pbnRlbnQscmVwZWF0Q291bnQscmVwZWF0RHVyLHJlcXVpcmVkRXh0ZW5zaW9ucyxyZXF1aXJlZEZlYXR1cmVzLHJlc3RhcnQscmVzdWx0LHJvdGF0ZSxyeCxyeSxzY2FsZSxzZWVkLHNoYXBlLXJlbmRlcmluZyxzbG9wZSxzcGFjaW5nLHNwZWN1bGFyQ29uc3RhbnQsc3BlY3VsYXJFeHBvbmVudCxzcGVlZCxzcHJlYWRNZXRob2Qsc3RhcnRPZmZzZXQsc3RkRGV2aWF0aW9uLHN0ZW1oLHN0ZW12LHN0aXRjaFRpbGVzLHN0b3AtY29sb3Isc3RvcC1vcGFjaXR5LHN0cmlrZXRocm91Z2gtcG9zaXRpb24sc3RyaWtldGhyb3VnaC10aGlja25lc3Msc3RyaW5nLHN0cm9rZSxzdHJva2UtZGFzaGFycmF5LHN0cm9rZS1kYXNob2Zmc2V0LHN0cm9rZS1saW5lY2FwLHN0cm9rZS1saW5lam9pbixzdHJva2UtbWl0ZXJsaW1pdCxzdHJva2Utb3BhY2l0eSxzdHJva2Utd2lkdGgsc3R5bGUsc3VyZmFjZVNjYWxlLHN5c3RlbUxhbmd1YWdlLHRhYmluZGV4LHRhYmxlVmFsdWVzLHRhcmdldCx0YXJnZXRYLHRhcmdldFksdGV4dC1hbmNob3IsdGV4dC1kZWNvcmF0aW9uLHRleHQtcmVuZGVyaW5nLHRleHRMZW5ndGgsdG8sdHJhbnNmb3JtLHRyYW5zZm9ybS1vcmlnaW4sdHlwZSx1MSx1Mix1bmRlcmxpbmUtcG9zaXRpb24sdW5kZXJsaW5lLXRoaWNrbmVzcyx1bmljb2RlLHVuaWNvZGUtYmlkaSx1bmljb2RlLXJhbmdlLHVuaXRzLXBlci1lbSx2LWFscGhhYmV0aWMsdi1oYW5naW5nLHYtaWRlb2dyYXBoaWMsdi1tYXRoZW1hdGljYWwsdmFsdWVzLHZlY3Rvci1lZmZlY3QsdmVyc2lvbix2ZXJ0LWFkdi15LHZlcnQtb3JpZ2luLXgsdmVydC1vcmlnaW4teSx2aWV3Qm94LHZpZXdUYXJnZXQsdmlzaWJpbGl0eSx3aWR0aCx3aWR0aHMsd29yZC1zcGFjaW5nLHdyaXRpbmctbW9kZSx4LHgtaGVpZ2h0LHgxLHgyLHhDaGFubmVsU2VsZWN0b3IseGxpbms6YWN0dWF0ZSx4bGluazphcmNyb2xlLHhsaW5rOmhyZWYseGxpbms6cm9sZSx4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sbnM6eGxpbmsseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHkseTEseTIseUNoYW5uZWxTZWxlY3Rvcix6LHpvb21BbmRQYW5gXG4pO1xuZnVuY3Rpb24gaXNSZW5kZXJhYmxlQXR0clZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybi
20578B0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCI7XG59XG5cbmNvbnN0IGVzY2FwZVJFID0gL1tcIicmPD5dLztcbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIGNvbnN0IHN0ciA9IFwiXCIgKyBzdHJpbmc7XG4gIGNvbnN0IG1hdGNoID0gZXNjYXBlUkUuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBsZXQgaHRtbCA9IFwiXCI7XG4gIGxldCBlc2NhcGVkO1xuICBsZXQgaW5kZXg7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OlxuICAgICAgICBlc2NhcGVkID0gXCImcXVvdDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICBlc2NhcGVkID0gXCImYW1wO1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6XG4gICAgICAgIGVzY2FwZWQgPSBcIiYjMzk7XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2MDpcbiAgICAgICAgZXNjYXBlZCA9IFwiJmx0O1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIGVzY2FwZWQgPSBcIiZndDtcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIGh0bWwgKz0gc3RyLnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cbiAgICBsYXN0SW5kZXggPSBpbmRleCArIDE7XG4gICAgaHRtbCArPSBlc2NhcGVkO1xuICB9XG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4ID8gaHRtbCArIHN0ci5zbGljZShsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG5jb25zdCBjb21tZW50U3RyaXBSRSA9IC9eLT8+fDwhLS18LS0+fC0tIT58PCEtJC9nO1xuZnVuY3Rpb24gZXNjYXBlSHRtbENvbW1lbnQoc3JjKSB7XG4gIHJldHVybiBzcmMucmVwbGFjZShjb21tZW50U3RyaXBSRSwgXCJcIik7XG59XG5cbmZ1bmN0aW9uIGxvb3NlQ29tcGFyZUFycmF5cyhhLCBiKSB7XG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgbGV0IGVxdWFsID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGVxdWFsICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZXF1YWwgPSBsb29zZUVxdWFsKGFbaV0sIGJbaV0pO1xuICB9XG4gIHJldHVybiBlcXVhbDtcbn1cbmZ1bmN0aW9uIGxvb3NlRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGxldCBhVmFsaWRUeXBlID0gaXNEYXRlKGEpO1xuICBsZXQgYlZhbGlkVHlwZSA9IGlzRGF0ZShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNTeW1ib2woYSk7XG4gIGJWYWxpZFR5cGUgPSBpc1N5bWJvbChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIGFWYWxpZFR5cGUgPSBpc0FycmF5KGEpO1xuICBiVmFsaWRUeXBlID0gaXNBcnJheShiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIHJldHVybiBhVmFsaWRUeXBlICYmIGJWYWxpZFR5cGUgPyBsb29zZUNvbXBhcmVBcnJheXMoYSwgYikgOiBmYWxzZTtcbiAgfVxuICBhVmFsaWRUeXBlID0gaXNPYmplY3QoYSk7XG4gIGJWYWxpZFR5cGUgPSBpc09iamVjdChiKTtcbiAgaWYgKGFWYWxpZFR5cGUgfHwgYlZhbGlkVHlwZSkge1xuICAgIGlmICghYVZhbGlkVHlwZSB8fCAhYlZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBhS2V5c0NvdW50ID0gT2JqZWN0LmtleXMoYSkubGVuZ3RoO1xuICAgIGNvbnN0IGJLZXlzQ291bnQgPSBPYmplY3Qua2V5cyhiKS5sZW5ndGg7XG4gICAgaWYgKGFLZXlzQ291bnQgIT09IGJLZXlzQ291bnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgY29uc3QgYUhhc0tleSA9IGEuaGFzT3duUHJvcGVydHkoa2V5KTtcbiAgICAgIGNvbnN0IGJIYXNLZXkgPSBiLmhhc093blByb3BlcnR5KGtleSk7XG4gICAgICBpZiAoYUhhc0tleSAmJiAhYkhhc0tleSB8fCAhYUhhc0tleSAmJiBiSGFzS2V5IHx8ICFsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKTtcbn1cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZihhcnIsIHZhbCkge1xuICByZXR1cm4gYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gbG9vc2VFcXVhbChpdGVtLCB2YWwpKTtcbn1cblxuY29uc3QgaXNSZWYgPSAodmFsKSA9PiB7XG4gIHJldHVybiAhISh2YWwgJiYgdmFsLl9fdl9pc1JlZiA9PT0gdHJ1ZSk7XG59O1xuY29uc3QgdG9EaXNwbGF5U3RyaW5nID0gKHZhbCkgPT4ge1xuICByZXR1cm4gaXNTdHJpbmcodmFsKSA/IHZhbCA6IHZhbCA9PSBudWxsID8gXCJcIiA6IGlzQXJyYXkodmFsKSB8fCBpc09iamVjdCh2YWwpICYmICh2YWwudG9TdHJpbmcgPT09IG9iamVjdFRvU3RyaW5nIHx8ICFpc0Z1bmN0aW9uKHZhbC50b1N0cmluZykpID8gaXNSZWYodmFsKSA/IHRvRGlzcGxheVN0cmluZyh2YWwudmFsdWUpIDogSlNPTi5zdHJpbmdpZnkodmFsLCByZXBsYWNlciwgMikgOiBTdHJpbmcodmFsKTtcbn07XG5jb25zdCByZXBsYWNlciA9IChfa2V5LCB2YWwpID0+IHtcbiAgaWYgKGlzUmVmKHZhbCkpIHtcbiAgICByZXR1cm4gcmVwbGFjZXIoX2tleSwgdmFsLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtgTWFwKCR7dmFsLnNpemV9KWBdOiBbLi4udmFsLmVud
20578HJpZXMoKV0ucmVkdWNlKFxuICAgICAgICAoZW50cmllcywgW2tleSwgdmFsMl0sIGkpID0+IHtcbiAgICAgICAgICBlbnRyaWVzW3N0cmluZ2lmeVN5bWJvbChrZXksIGkpICsgXCIgPT5cIl0gPSB2YWwyO1xuICAgICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbYFNldCgke3ZhbC5zaXplfSlgXTogWy4uLnZhbC52YWx1ZXMoKV0ubWFwKCh2KSA9PiBzdHJpbmdpZnlTeW1ib2wodikpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc1N5bWJvbCh2YWwpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeVN5bWJvbCh2YWwpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkgJiYgIWlzQXJyYXkodmFsKSAmJiAhaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9XG4gIHJldHVybiB2YWw7XG59O1xuY29uc3Qgc3RyaW5naWZ5U3ltYm9sID0gKHYsIGkgPSBcIlwiKSA9PiB7XG4gIHZhciBfYTtcbiAgcmV0dXJuIChcbiAgICAvLyBTeW1ib2wuZGVzY3JpcHRpb24gaW4gZXMyMDE5KyBzbyB3ZSBuZWVkIHRvIGNhc3QgaGVyZSB0byBwYXNzXG4gICAgLy8gdGhlIGxpYjogZXMyMDE2IGNoZWNrXG4gICAgaXNTeW1ib2wodikgPyBgU3ltYm9sKCR7KF9hID0gdi5kZXNjcmlwdGlvbikgIT0gbnVsbCA/IF9hIDogaX0pYCA6IHZcbiAgKTtcbn07XG5cbmV4cG9ydCB7IEVNUFRZX0FSUiwgRU1QVFlfT0JKLCBOTywgTk9PUCwgUGF0Y2hGbGFnTmFtZXMsIFBhdGNoRmxhZ3MsIFNoYXBlRmxhZ3MsIFNsb3RGbGFncywgY2FtZWxpemUsIGNhcGl0YWxpemUsIGRlZiwgZXNjYXBlSHRtbCwgZXNjYXBlSHRtbENvbW1lbnQsIGV4dGVuZCwgZ2VuUHJvcHNBY2Nlc3NFeHAsIGdlbmVyYXRlQ29kZUZyYW1lLCBnZXRHbG9iYWxUaGlzLCBoYXNDaGFuZ2VkLCBoYXNPd24sIGh5cGhlbmF0ZSwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpbnZva2VBcnJheUZucywgaXNBcnJheSwgaXNCb29sZWFuQXR0ciwgaXNCdWlsdEluRGlyZWN0aXZlLCBpc0RhdGUsIGlzRnVuY3Rpb24sIGlzR2xvYmFsbHlBbGxvd2VkLCBpc0dsb2JhbGx5V2hpdGVsaXN0ZWQsIGlzSFRNTFRhZywgaXNJbnRlZ2VyS2V5LCBpc0tub3duSHRtbEF0dHIsIGlzS25vd25TdmdBdHRyLCBpc01hcCwgaXNNYXRoTUxUYWcsIGlzTW9kZWxMaXN0ZW5lciwgaXNPYmplY3QsIGlzT24sIGlzUGxhaW5PYmplY3QsIGlzUHJvbWlzZSwgaXNSZWdFeHAsIGlzUmVuZGVyYWJsZUF0dHJWYWx1ZSwgaXNSZXNlcnZlZFByb3AsIGlzU1NSU2FmZUF0dHJOYW1lLCBpc1NWR1RhZywgaXNTZXQsIGlzU3BlY2lhbEJvb2xlYW5BdHRyLCBpc1N0cmluZywgaXNTeW1ib2wsIGlzVm9pZFRhZywgbG9vc2VFcXVhbCwgbG9vc2VJbmRleE9mLCBsb29zZVRvTnVtYmVyLCBtYWtlTWFwLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCBvYmplY3RUb1N0cmluZywgcGFyc2VTdHJpbmdTdHlsZSwgcHJvcHNUb0F0dHJNYXAsIHJlbW92ZSwgc2xvdEZsYWdzVGV4dCwgc3RyaW5naWZ5U3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5LCB0b051bWJlciwgdG9SYXdUeXBlLCB0b1R5cGVTdHJpbmcgfTtcbiIsIi8qKlxuICog55S75YOP44Gu6YGF5bu26Kqt44G/6L6844G/XG4gKiBodHRwczovL25vdGVzLnNoYXJlc2wubmV0L2FydGljbGVzLzEyNzEvXG4gKlxuICogPGltZyBzcmM9XCJkdW1teS5wbmdcIiBkYXRhLXNyYz1cImhvZ2UuanBnXCIgY2xhc3M9XCJqcy1sYXp5XCI+XG4gKiBkYXRhLXNyYyDlsZ7mgKfjgavpgYXlu7boqq3jgb/ovrzjgb/jgZXjgZvjgZ/jgYTnlLvlg4/jgpLmjIflrprjgZnjgovjgIJcbiAqXG4gKiBkYXRhLXNyYyA6IHNyY+OBq+OCu+ODg+ODiOOBleOCjOOCi1xuICogZGF0YS1zcmNzZXQgOiBzcmNzZXTjgavjgrvjg4Pjg4jjgZXjgozjgotcbiAqIGRhdGEtYmcgOiBiYWNrZ3JvdW5kSW1hZ2Xjgavjgrvjg4Pjg4jjgZXjgozjgotcblxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBsYXp5U2l6ZXMgZnJvbSAnbGF6eXNpemVzJztcbmltcG9ydCB1bnZlaWxob29rcyBmcm9tICdsYXp5c2l6ZXMvcGx1Z2lucy91bnZlaWxob29rcy9scy51bnZlaWxob29rcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgbGF6eVNpemVzLmNmZy5sYXp5Q2xhc3MgPSAnanMtbGF6eSc7XG59XG4iLCIvKipcbiAqIOODmuODvOOCuOiqreOBv+i+vOOBv+ODl+ODreOCsOODrOOCueODkOODvFxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBwcmVsb2FkZXIgZnJvbSAncHJlbG9hZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFkZF91cmxzID0gW10pIHtcbiAgLy8g44OX44Ot44Kw44Os44K544OQ44O844Ko44Os44Oh44Oz44OIXG4gIGNvbnN0ICRwcm9ncmVzc19iYXIgPSAkKCcuanMtbG9hZGluZy1wcm9ncmVzcycpO1xuICAvLyDjg5fjg6rjg63jg7zjg4Djg7xcbiAgY29uc3QgbG9hZGVyID0gcHJlbG9hZGVyKHsgeGhySW1hZ2VzOiBmYWxzZSB9KTtcblxuICAvLyB1cmzjg6rjgrnjg4jkvZzmiJBcbiAgY29uc3QgaW1hZ2VfdXJscyA9IGdldF9pbWFnZV9saXN0KCk7XG4gIGNvbnN0IHVybHMgPSBPYmplY3QuYXNzaWduKGltYWdlX3VybHMsIGFkZF91cmxzKTtcblxuICAvLyBQcm9taXNl44KS6L+U44GZXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8g44OX44Oq44Ot44O844OA44O844Gr55m76YyyXG4gICAgdXJscy5mb3JFYWNoKCh1cmwpID0+IHtcbiAgICAgIGxvYWRlci5hZGQodXJsKTtcbiAgICB9KTtcblxuICAgIC8vIOiqreOBv+i+vOOBv+S4re+8muODkOODvOOCqOODrOODoeODs+ODiOOBruW5heiqv+aVtFxuICAgIGxvYWRlci5vbigncHJvZ3Jlc3MnLCAocGVyY2VudCwgdXJsKSA9PiB7XG4gICAgICAkcHJvZ3Jlc3NfYmFyLmNzcyh7IHdpZHRoOiBgJHtwZXJjZW50ICogMTAwfSVgIH0
20578pO1xuICAgIH0pO1xuXG4gICAgLy8g6Kqt44G/6L6844G/5a6M5LqGXG4gICAgLy8g6Kqt44G/6L6844G/5a6M5LqG6YCa55+l44CB44OX44Ot44Kw44Os44K544Ko44Os44Oh44Oz44OI44KS5bmFMTAwJeOBq+OBmeOCi1xuICAgIGxvYWRlci5vbignY29tcGxldGUnLCAoKSA9PiB7XG4gICAgICAkcHJvZ3Jlc3NfYmFyLmNzcyh7IHdpZHRoOiAnMTAwJScgfSk7XG4gICAgICAkKHdpbmRvdykudHJpZ2dlcigncGFnZV9sb2FkX2NvbXBsZXRlJyk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDoqq3jgb/ovrzjgb/plovlp4tcbiAgICBsb2FkZXIubG9hZCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiA8aW1nPiDjgpLjg4Hjgqfjg4Pjgq/jgZnjgotcbiAqIEByZXR1cm4gdXJscyB7QXJyYXl9IFVSTOOBrumFjeWIl1xuICovXG5mdW5jdGlvbiBnZXRfaW1hZ2VfbGlzdCgpIHtcbiAgY29uc3QgaG9zdG5hbWUgPSAvXmh0dHBzPzpcXC9cXC9bXi9dK1xcLy8uZXhlYyh3aW5kb3cubG9jYXRpb24uaHJlZilbMF07XG4gIGNvbnN0IGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcbiAgY29uc3QgdXJscyA9IFtdO1xuXG4gIC8vIDxpbWc+44K/44Kw44KS5YWo44Gm44OB44Kn44OD44KvXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc3JjID0gaW1hZ2VzW2ldLnNyYztcbiAgICAvLyDpgZXjgYbjg5vjgrnjg4jjga7jgoLjga7jga/lvL7jgY9cbiAgICBpZiAoc3JjLmluZGV4T2YoaG9zdG5hbWUpID09PSAwKSB7XG4gICAgICB1cmxzLnB1c2goc3JjKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVybHM7XG59XG4iLCIvKipcbiAqIOODmuODvOOCuOiqreOBv+i+vOOBv+OBjOe1guOCj+OBo+OBn+W+jOOBruWHpueQhlxuICovXG5cbi8vIOOCueOCr+ODreODvOODq+aknOefpeihqOekulxuaW1wb3J0IGludmlldyBmcm9tICcuL3Njcm9sbC1pbnZldyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGVsYXkgPSA2MDA7XG4gIHNldFRpbWVvdXQoZmFkZWluLCAyMDAgKyBkZWxheSk7XG4gIHNldFRpbWVvdXQocmVtb3ZlX2ZhZGVpbiwgMTIwMCArIGRlbGF5KTtcbiAgc2V0VGltZW91dChpbnZpZXcsIDEyMDAgKyBkZWxheSk7XG59XG5cbi8qKlxuICog44OV44Kn44O844OJ44Kk44Oz44GV44Gb44KLXG4gKi9cbmZ1bmN0aW9uIGZ
20578hZGVpbigpIHtcbiAgJCgnLmpzLWxvYWRpbmcnKS5hdHRyKCdkYXRhLWxvYWRpbmctZmluaXNoJywgJ3RydWUnKTtcbiAgLy8g44OV44Kn44O844OJ44Kk44Oz44Kk44OZ44Oz44OI44Gu6YCa55+lXG4gICQod2luZG93KS50cmlnZ2VyKCdwYWdlX2ZhZGVpbicpO1xufVxuXG4vKipcbiAqIOODleOCp+ODvOODieOCpOODs+OCqOODrOODoeODs+ODiOOCkuWJiumZpFxuICovXG5mdW5jdGlvbiByZW1vdmVfZmFkZWluKCkge1xuICAkKCcuanMtbG9hZGluZycpLnJlbW92ZSgpO1xufVxuIiwiLyoqXG4gKiBmYW5jeWJveDUg44KS5L2/44Gj44Gf44Od44OD44OX44Ki44OD44OXXG4gKiDjgqrjg5fjgrfjg6fjg7Pjga4gdHBsIOOBr+eUu+WDj+OBp+OBr+eEoeWKueOBq+OBquOCi1xuICovXG5cbmltcG9ydCBsYXp5bG9hZCBmcm9tICcuL2xhenlsb2FkJztcbmltcG9ydCB7IEZhbmN5Ym94IH0gZnJvbSAnQGZhbmN5YXBwcy91aSc7XG5cbmNvbnN0IGNsb3NlQnV0dG9uID1cbiAgJzxidXR0b24gZGF0YS1mYW5jeWJveC1jbG9zZSBjbGFzcz1cImYtYnV0dG9uIGlzLWNsb3NlLWJ0blwiIHRpdGxlPVwie3tDTE9TRX19XCI+PGkgY2xhc3M9XCJpLWFycm93cy10aW1lcy0xXCI+PC9pPjwvYnV0dG9uPic7XG5cbmV4cG9ydCBjb25zdCBOT1JNQUxfU0VUVElOR1MgPSB7XG4gIG1haW5DbGFzczogJycsXG4gIGRyYWdUb0Nsb3NlOiBmYWxzZSxcbiAgdHBsOiB7IGNsb3NlQnV0dG9uIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQUpBWF9TRVRUSU5HUyA9IHtcbiAgdHlwZTogJ2FqYXgnLFxuICBkcmFnVG9DbG9zZTogZmFsc2UsXG4gIG1haW5DbGFzczogJycsXG4gIHRvb2xiYXI6IHRydWUsXG4gIHRwbDogeyBjbG9zZUJ1dHRvbiB9LFxuICBvbjoge1xuICAgIHJldmVhbDogKCkgPT4ge1xuICAgICAgbGF6eWxvYWQoKTtcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBGYW5jeWJveC5iaW5kKCdbZGF0YS1mYW5jeWJveF0nLCBOT1JNQUxfU0VUVElOR1MpO1xuICBGYW5jeWJveC5iaW5kKCdbZGF0YS1mYW5jeWJveC1hamF4XScsIEFKQVhfU0VUVElOR1MpO1xufVxuIiwiLyoqXG4gKiDjg6bjg7zjgrbjg7zjgqjjg7zjgrjjgqfjg7Pjg4jnorroqo1cbiAqIE9T44KS6KaL44Gm44K544Oe44Ob57O744Gg44Go5Yik5a6a44GX44Gf44KJIDxib2R5IGRhdGEtaXMtbW9iaWxlPVwidHJ1ZVwiPiDjgpLoqK3lrprjgZnjgotcbiAqIFBD44Gg44Go5Yik5a6a44GX44Gf44KJIDxib2R5IGRhdGEtaXMtbW9iaWxlPVwiZmFsc2VcIj4g44KS6Kit5a6aXG4gKi9cblxuaW1wb3J0IGlzVG91Y2hEZXZpY2UgZnJvbSAnaXMtdG91Y2gtZGV2aWNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBpZiAoaXNUb3VjaERldmljZSgpKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtbW9iaWxlJywgJ3RydWUnKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgnZGF0YS1pcy1tb2JpbGUnLCAnZmFsc2UnKTtcbiAgfVxufVxuIiwiLy8g5YWo44Oa44O844K45YWx6YCa5Yem55CGXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBuby1jb25zb2xlOm9mZiAqL1xuXG4vLyDnlLvlg4/jga7pgYXlu7boqq3jgb/ovrzjgb9cbmltcG9ydCBsYXp5bG9hZCBmcm9tICcuL2xhenlsb2FkJztcbi8vIOODoeODh+OCo+OCouOCr+OCqOODquODvOeuoeeQhlxuaW1wb3J0IG1lZGlhcXVlcnkgZnJvbSAnLi9tZWRpYXF1ZXJ5Jztcbi8vIOODpuODvOOCtuODvOOCqOODvOOCuOOCp+ODs+ODiOWIpOWumlxuaW1wb3J0IGNoZWNrX3VhIGZyb20gJy4vY2hlY2stdWEnO1xuLy8g44Oa44O844K45YaF44K544Kv44Ot44O844OrXG5pbXBvcnQgcGFnZXNjcm9sbCBmcm9tICcuL3BhZ2VzY3JvbGwnO1xuLy8g55S76Z2i5L2N572u44Gr5b+c44GY44Gf44GmIGRhdGEg5bGe5oCn5aSJ5YyW44CC44Oa44O844K444OI44OD44OX5oi744KL44Oc44K/44Oz44Gq44GpXG5pbXBvcnQgc2Nyb2xsX2Ftb3VudCBmcm9tICcuL3Njcm9sbC1hbW91bnQnO1xuLy8g44K944O844K344Oj44Or44K344Kn44Ki44Oc44K/44OzXG5pbXBvcnQgc29jaWFsX3NoYXJlIGZyb20gJy4vc29jaWFsLXNoYXJlJztcbi8vIOODneODg+ODl+OCouODg+ODl1xuaW1wb3J0IHBvcHVwIGZyb20gJy4vcG9wdXAnO1xuLy8g44Kq44O844OH44Kj44Kq5YaN55Sf44Oc44K/44OzXG4vLyBpbXBvcnQgYXVkaW8gZnJvbSAnLi9hdWRpbyc7XG4vLyDjgr/jg5bjg6Hjg4vjg6Xjg7xcbmltcG9ydCB0YWJzIGZyb20gJy4vdGFicyc7XG4vLyDjg6HjgqTjg7Pjg6Hjg4vjg6Xjg7xcbmltcG9ydCBtZW51IGZyb20gJy4vbWVudSc7XG4vLyDjgrnjgq/jg63jg7zjg6vjgafjg6Hjg4vjg6Xjg7zjga7jgqLjgq/jg4bjgqPjg5bljJZcbmltcG9ydCBtZW51QWN0aXZlIGZyb20gJy4vbWVudUFjdGl2ZSc7XG4vLyDjg5rjg7zjgrjoqq3jgb/ovrzjgb9cbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZyc7XG4vLyDjg5rjg7zjgrjoqq3jgb/ovrzjgb/lrozkuoZcbmltcG9ydCBsb2FkaW5nX2NvbXBsZXRlIGZyb20gJy4vbG9hZGluZ19jb21wbGV0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgbGF6eWxvYWQoKTtcbiAgbWVkaWFxdWVyeSgpO1xuICBjaGVja191YSgpO1xuICBwYWdlc2Nyb2xsKCk7XG4gIHNjcm9sbF9hbW91bnQoKTtcbiAgc29jaWFsX3NoYXJlKCk7XG4gIG1lbnUoKTtcbiAgbWVudUFjdGl2ZSgpO1xuICBwb3B1cCgpO1xuICAvLyBhdWRpbygpO1xuICB0YWJzKCk7XG4gIGxvYWRpbmcoKS50aGVuKGxvYWRpbmdfY29tcGxldGUpO1xufVxuIiwiLyoqXG4gKiDjg6Hjg4fjgqPjgqLjgq/jgqjjg6rjg7zjgpLnrqHnkIZcbiAqL1xuXG5pbXBvcnQgTWVkaWFxdWVyeSBmcm9tICdAc3lnbmFzL21lZGlhcXVlcnknO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIE1lZGlhcXVlcnkuYWRkTWVkaWEoJ3BjJywgJ3NjcmVlbiBhbmQgKG1pbi13aWR0aDogODUxcHgpJyk7XG4gIE1lZGlhcXVlcnkuYWRkTWVkaWEoJ3RiJywgJ3NjcmVlbiBhbmQgKG1pbi13aWR0aDogNTUxcHgpIGFuZCAobWF4LXdpZHRoOiA4NTBweCknKTtcbiAgTWVkaWFxdWVyeS5hZGRNZWRpYSgndGItbG8nLCAnc2NyZWVuIChtYXgtd2lkdGg6IDg1MHB4KScpO1xuICBNZWRpYXF1ZXJ5LmFkZE1lZGlhKCdz
20578cC11cCcsICdzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU1MXB4KScpO1xuICBNZWRpYXF1ZXJ5LmFkZE1lZGlhKCdzcCcsICdzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU1MHB4KScpO1xufVxuIiwiLyoqXG4gKiDjg6HjgqTjg7Pjg6Hjg4vjg6Xjg7xcbiAqL1xuY29uc3QgZ2V0SGFtYnVyZ2VyID0gKCkgPT4ge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWhhbWJ1cmdlcicpIGFzIEhUTUxFbGVtZW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICAvLyDjgq/jg6rjg4Pjgq/jgacgZGF0YS1oYW1idXJnZXItb3BlbiA9IFwidHJ1ZVwiIOOBq+OBmeOCi1xuICBjb25zdCAkaGFtYnVyZ2VyID0gJCgnLmpzLWhhbWJ1cmdlcicpO1xuXG4gIC8vIOODj+ODs+ODkOODvOOCrOODvOODnOOCv+ODs+OBruOCr+ODquODg+OCr+OBp+ODoeODi+ODpeODvOOBrumWi+mWiVxuICAkaGFtYnVyZ2VyLm9uKCdjbGljaycsIHRvZ2dsZV9tZW51KTtcblxuICAvLyDjg6Hjg4vjg6Xjg7zjga7jg5zjgr/jg7PjgpLmirzjgZfjgabjgoLplovplonjgZnjgotcbiAgJCgnLmMtbWFpbm1lbnUgYS5qcy1wYWdlc2Nyb2xsJykub24oJ2NsaWNrJywgdG9nZ2xlX21lbnUpO1xuXG4gIC8vIOOCteODluODoeODi+ODpeODvOmWi+mWiVxuICAkKCcuanMtaGFzLXN1Ym1lbnUnKS5vbignY2xpY2snLCB0b2dnbGVfc3VibWVudSk7XG59XG5cbi8qKlxuICog44Oh44OL44Ol44O844KS6ZaL6ZaJ44GZ44KLXG4gKiBAcGFyYW0ge0V2ZW50fSBldiDjgq/jg6rjg4Pjgq/jgqTjg5njg7Pjg4hcbiAqL1xuZnVuY3Rpb24gdG9nZ2xlX21lbnUoZXYpIHtcbiAgLy8g44OP44Oz44OQ44O844Ks44O844Oh44OL44Ol44O844Gu5YiH44KK5pu/44GIXG4gIGNvbnN0IGhhbWJ1cmdlciA9IGdldEhhbWJ1cmdlcigpO1xuICBjb25zdCBzdGF0ZSA9IGhhbWJ1cmdlcj8uZ2V0QXR0cmlidXRlKCdkYXRhLWhhbWJ1cmdlci1vcGVuJyk7XG4gIGNvbnN0IGlzX29wZW4gPSBzdGF0ZSA9PT0gJ3RydWUnID8gJ2ZhbHNlJyA6ICd0cnVlJztcbiAgaGFtYnVyZ2VyLnNldEF0dHJpYnV0ZSgnZGF0YS1oYW1idXJnZXItb3BlbicsIGlzX29wZW4pO1xuXG4gIC8vIOOCueODnuODm+eUqOODoeODi+ODpeODvOOBruOCqOODleOCp+OCr+ODiFxuICAkKCcuanMtc3BtZW51JykuYXR0cignZGF0YS1zcG1lbnUnLCBpc19vcGVuID09PSAndHJ1ZScgPyAnb3BlbicgOiAnY2xvc2UnKTtcblxuICBpZiAoZXYuY3VycmVudFRhcmdldCA9PT0gaGFtYnVyZ2VyKSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIOOCteODluODoeODi+ODpeODvOOBrumWi+mWiVxuICogQHBhcmFtIHtFdmVudH0gZXYg44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZV9zdWJtZW51KGV2KSB7XG4gIC8vIOODoeODi+ODpeODvOODnOOCv+ODs+OBqOOAgeWFhOW8n+imgee0oOOBruOCteODluODoeODi+ODpeODvFxuICBjb25zdCAkYnV0dG9uID0gJChldi5jdXJyZW50VGFyZ2V0KTtcbiAgY29uc3QgJHN1Ym1lbnUgPSAkYnV0dG9uLm5leHQoKTtcbiAgY29uc3QgaXNfb3BlbmVkID0gJGJ1dHRvbi5hdHRyKCdkYXRhLXN1Ym1lbnUtb3BlbmVkJykgPT09ICd0cnVlJztcblxuICBpZiAoaXNfb3BlbmVkKSB7XG4gICAgJGJ1dHRvbi5hdHRyKCdkYXRhLXN1Ym1lbnUtb3BlbmVkJywgJ2ZhbHNlJyk7XG4gICAgJHN1Ym1lbnUuYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICdmYWxzZScpO1xuICB9IGVsc2Uge1xuICAgICRidXR0b24uYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICd0cnVlJyk7XG4gICAgJHN1Ym1lbnUuYXR0cignZGF0YS1zdWJtZW51LW9wZW5lZCcsICd0cnVlJyk7XG4gIH1cbiAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cbiIsIi8qKlxuICog44Oa44O844K444K544Kv44Ot44O844Or44Gn44Oh44Kk44Oz44Oh44OL44Ol44O844KS44Ki44Kv44OG44Kj44OW54q25oWL44Gr44GZ44KLXG5cbi5qcy1tZW51LWFjdGl2ZSDjgYzlr77osaHjgqjjg6rjgqLjgajjgarjgotcbuWvvuixoeOCqOODquOCouOBq+OBryBkYXRhLW1lbnUg5bGe5oCn44KS5oyH5a6a44GZ44KLXG7lkI3liY3jga8gYGNvbnN0IGl0ZW1zYCDjgajkuIDoh7TjgZXjgZvjgotcbjxkaXYgaWQ9XCJzdG9yeVwiIGNsYXNzPVwianMtbWVudS1hY3RpdmVcIiBkYXRhLW1lbnU9XCJzdG9yeVwiPiA8L2Rpdj5cblxuaWTlsZ7mgKfjgpLkvb/jgo/jgZogZGF0YS1tZW515bGe5oCn44KS5L2/44GG55CG55Sx44Gv44CBaWTlsZ7mgKfjgaDjgajku5bjga7nlKjpgJTjgajooqvjgovlj6/og73mgKfjgYzjgYLjgovjgZ/jgoHjgIJcbmRhdGEtbWVudeWxnuaAp+OBq+OBl+OBn+OBu+OBhuOBjOiHqueUseW6puOBjOS4iuOBjOOCi+OAglxuICovXG5cbi8vIOOCqOODquOCouODgeOCp+ODg+OCr+OBruWvvuixoUlEXG5jb25zdCBpdGVtcyA9IHtcbiAgbmV3czogZmFsc2UsXG4gIHN0b3J5OiBmYWxzZSxcbiAgc3RhZmY6IGZhbHNlLFxuICBjaGFyYWN0ZXI6IGZhbHNlLFxuICBib29rOiBmYWxzZSxcbn07XG5cbi8vIEludGVyc2VjdGlvbk9ic2VydmVyIOOCquODl+OCt+ODp+ODs1xuY29uc3Qgb3B0aW9uID0ge1xuICByb290TWFyZ2luOiAnLTQ4JSAwcHgnLFxuICB0aHJlc2hvbGQ6IDAsXG59O1xuXG5jb25zdCBjYWxsYmFjayA9IChlbnRyaWVzKSA9PiB7XG4gIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtZW51ID0gZW50cnkudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1tZW51Jyk7XG4gICAgY29uc3QgaXNBY3RpdmUgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcblxuICAgIC8vIG9uIOOBq+OBquOBo+OBn+aZguOBr+WFqOOBpiBvZmYg44Gr44GX44Gm44GL44KJIG9uIOOBq+OBmeOCi1xuICAgIC8vIG9mZiDjgavjgarjgaPjgZ/mmYLjga/jgZ3jgozjgaDjgZEgb2ZmIOOBq+OBmeOCi1xuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgT2JqZWN0LmtleXMoaXRlbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpdGVtc1trZXldID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaXRlbXNbbWVudV0gPSBpc0FjdGl2ZTtcbiAgfSk7XG5cbiAgLy8g44Oh44OL44Ol44O844Gr5Y+N5pig44GZ44KLXG4gIE9iamVjdC5rZXlzKGl0ZW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBtZW51SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5jLW1haW5tZW51X19saW5rLS0ke2tleX1gKTtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IGl0ZW1zW2tleV07XG4gICAgbWVudUl0ZW0/LnNldEF0dHJpYnV0ZSgnZGF0YS1tZW51LWFjdGl2ZScsIGlzQWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9uKTtcbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtbWVudS1hY3RpdmUnKTtcblxuICBjb250ZW50cy5mb3JFYWNoKChjb250ZW50KSA9PiB7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250ZW50IGFzIEVsZW1lbnQpO1xuICB9KTtcbn07XG4iLCIvKipcbiAqIOODmuODvOOCuOWGheOCueOCr+ODreODvOODq1xuICogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc21vb3RoLXNjcm9sbFxuICogPGEgaHJlZj1cIiN0YXJnZXRcIiBjbGFzcz1cImpzLXBhZ2VzY3JvbGxcIj5cbiAqXG4gKiDjgrnjgq/jg63jg7zjg6vjgpLnmbrnlJ/jgZXjgZv
20578jgovjgZPjgajjgoLlj6/og71cbiAqIHNjcm9sbC5hbmltYXRlU2Nyb2xsKFxuICogICB0YXJnZXRfeSxcbiAqICAgJycsXG4gKiAgIHtcbiAqICAgICAgIHNwZWVkOiAxNTAwLFxuICogICAgICAgZWFzaW5nOiAnZWFzZUluT3V0Q3ViaWMnXG4gKiAgIH1cbiAqICk7XG4gKlxuICog44Kt44Oj44Oz44K744Or44KC5Y+v6IO9XG4gKiBzY3JvbGwuY2FuY2VsU2Nyb2xsKCk7XG4gKlxuICovXG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cbi8qIGVzbGludCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnM6b2ZmICovXG5cbmltcG9ydCBTbW9vdGhTY3JvbGwgZnJvbSAnc21vb3RoLXNjcm9sbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgLy8g5rGO55So44K544Kv44Ot44O844OrXG4gIGNvbnN0IGNsaWNrX3Njcm9sbCA9IG5ldyBTbW9vdGhTY3JvbGwoJ2EuanMtcGFnZXNjcm9sbCcsIHtcbiAgICBzcGVlZDogNTAwLFxuICAgIG9mZnNldDogMCxcbiAgICBlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXG4gIH0pO1xuXG4gIGNvbnN0IHNjcm9sbCA9IG5ldyBTbW9vdGhTY3JvbGwoKTtcblxuICAvLyDjg5rjg7zjgrjjg4jjg4Pjg5fjgavjgrnjgq/jg63jg7zjg6tcbiAgJCgnLmpzLXJldHVybi11cCcpLm9uKCdjbGljaycsIChldikgPT4ge1xuICAgIHNjcm9sbC5hbmltYXRlU2Nyb2xsKDAsIG51bGwsIHtcbiAgICAgIHNwZWVkOiA1MDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgICBlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXG4gICAgfSk7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG59XG4iLCIvKipcbiAqIOeUu+mdouWGheOBruS9jee9ruOBq+W/nOOBmOOBpiBkYXRhLXNjcm9sbC1hbW91bnQg5bGe5oCn44KS5aSJ5YyW44GV44Gb44KLXG4gKiDjgIzjg5rjg7zjgrjjg4jjg4Pjg5fjgavmiLvjgovjg5zjgr/jg7PjgI3jga7ooajnpLrliIfjgormm7/jgYjjgarjgalcbiAqL1xuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6b2ZmICovXG4vKiBlc2xpbnQgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzOm9mZiAqL1xuXG5pbXBvcnQgU2Nyb2xsQW1vdW50IGZyb20gJ0BzeWduYXMvc2Nyb2xsLWFtb3VudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc2Nyb2xsX2Ftb3VudCA9IG5ldyBTY3JvbGxBbW91bnQoJy5qcy1zY3JvbGwtYW1vdW50Jyk7XG59XG4iLCIvKipcbiAqIOOCueOCr+ODreODvOODqyBpbiBWaWV3XG4gKiDnlLvpnaLjgavlhaXjgovjgaggZGF0YS1pbnZpZXcg5bGe5oCn44GM44CMdHJ1ZeOAjeOBq+OBquOCi+OBruOBp+OAgVxuICogY3NzIOWBtOOBp+OCqOODleOCp+OCr+ODiOOCkuWItuW+oeOBmeOCi1xuICovXG5cbmltcG9ydCBJblZpZXcgZnJvbSAnQHN5Z25hcy9zY3JvbGwtaW52aWV3JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBjb25zdCBpbnZpZXcgPSBuZXcgSW5WaWV3KCcuanMtaW52aWV3JywgeyByb290TWFyZ2luOiAnMHB4IDBweCAtMjAlIDBweCcgfSk7XG4gIGludmlldy5zdGFydCgpO1xufVxuIiwiLyoqXG4gKiDjgr3jg7zjgrfjg6Pjg6vjgrfjgqfjgqLjg5zjgr/jg7NcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zeWduYXMvc3lnLWpwLXNvY2lhbC1zaGFyZVxuICovXG5cbmltcG9ydCBzb2NpYWxTaGFyZSBmcm9tICdAc3lnbmFzL2pwLXNvY2lhbC1zaGFyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgc29jaWFsU2hhcmUuc2V0U2hhcmVCdXR0b24oJy5qcy1zaGFyZS1idXR0b24nKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBWdWVUYWJzLCBWdWVUYWJzQ29udGVudCwgdXNlVGFiQ29udHJvbCB9IGZyb20gJ0BzeWduYXMvdnVlLXRhYnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIGxldCB0YXJnZXQgPSAnI2FwcC10YWJzMSc7XG5cbiAgaWYgKCEkKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBwID0gY3JlYXRlQXBwKHtcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBWdWVUYWJzLFxuICAgICAgVnVlVGFic0NvbnRlbnQsXG4gICAgfSxcbiAgfSk7XG4gIGFwcC5tb3VudCh0YXJnZXQpO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICB0YXJnZXQgPSAnI2FwcC10YWJzMic7XG5cbiAgY29uc3QgdGFiQ29udHJvbCA9IHVzZVRhYkNvbnRyb2woJ3RhYkdyb3VwMicpO1xuXG4gIGNvbnN0IGFwcDIgPSBjcmVhdGVBcHAoe1xuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgIFZ1ZVRhYnMsXG4gICAgICBWdWVUYWJzQ29udGVudCxcbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBhY3RpdmVJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRhYkNvbnRyb2wuYWN0aXZlSWQudmFsdWU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgY2hhbmdlVGFiKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2hhbmdlIGZyb20gb3V0c2lkZScpO1xuICAgICAgICB0YWJDb250cm9sLnNldEFjdGl2ZUlkKCd0YWJCJyk7XG4gICAgICB9LFxuICAgICAgcHJldlRhYigpIHtcbiAgICAgICAgdGFiQ29udHJvbC5jaGFuZ2VQcmV2VGFiKCk7XG4gICAgICB9LFxuICAgICAgbmV4dFRhYigpIHtcbiAgICAgICAgdGFiQ29udHJvbC5jaGFuZ2VOZXh0VGFiKCk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdtb3VudGVkJyk7XG5cbiAgICAgIC8vIHRhYkNvbnRyb2wuYWRkQ2hhbmdlTGlzdGVuZXIoKGV2KSA9PiB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKCd0YWIgY2hhbmdlZCcsIGV2LmRldGFpbCk7XG4gICAgICAvLyB9KTtcbiAgICAgIHRhYkNvbnRyb2wuYWRkQ2hhbmdlTGlzdGVuZXIoKChldjogQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3RhYiBjaGFuZ2VkJywgZXYuZGV0YWlsKTtcbiAgICAgIH0pIGFzIEV2ZW50TGlzdGVuZXIpO1xuICAgIH0sXG4gIH0pO1xuICBhcHAyLm1vdW50KHRhcmdldCk7XG59XG4iLCJPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1snZGVmYXVsdCddID0gaXNUb3VjaERldmljZTtcbmZ1bmN0aW9uIGlzVG91Y2hEZXZpY2UoKSB7XG4gIHJldHVybiAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8IHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkpIHx8ICEhKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IubWF4
20578VG91Y2hQb2ludHMgfHwgbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8qXG5UaGlzIHBsdWdpbiBleHRlbmRzIGxhenlTaXplcyB0byBsYXp5TG9hZDpcbmJhY2tncm91bmQgaW1hZ2VzLCB2aWRlb3MvcG9zdGVycyBhbmQgc2NyaXB0c1xuXG5CYWNrZ3JvdW5kLUltYWdlOlxuRm9yIGJhY2tncm91bmQgaW1hZ2VzLCB1c2UgZGF0YS1iZyBhdHRyaWJ1dGU6XG48ZGl2IGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLWJnPVwiYmctaW1nLmpwZ1wiPjwvZGl2PlxuXG4gVmlkZW86XG4gRm9yIHZpZGVvL2F1ZGlvIHVzZSBkYXRhLXBvc3RlciBhbmQgcHJlbG9hZD1cIm5vbmVcIjpcbiA8dmlkZW8gY2xhc3M9XCJsYXp5bG9hZFwiIHByZWxvYWQ9XCJub25lXCIgZGF0YS1wb3N0ZXI9XCJwb3N0ZXIuanBnXCIgc3JjPVwic3JjLm1wNFwiPlxuIDwhLS0gc291cmNlcyAtLT5cbiA8L3ZpZGVvPlxuXG4gRm9yIHZpZGVvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseSBpZiBpbiB2aWV3OlxuIDx2aWRlb1xuXHRjbGFzcz1cImxhenlsb2FkXCJcblx0cHJlbG9hZD1cIm5vbmVcIlxuXHRtdXRlZD1cIlwiXG5cdGRhdGEtYXV0b3BsYXk9XCJcIlxuXHRkYXRhLXBvc3Rlcj1cInBvc3Rlci5qcGdcIlxuXHRzcmM9XCJzcmMubXA0XCI+XG48L3ZpZGVvPlxuXG4gU2NyaXB0czpcbiBGb3Igc2NyaXB0cyB1c2UgZGF0YS1zY3JpcHQ6XG4gPGRpdiBjbGFzcz1cImxhenlsb2FkXCIgZGF0YS1zY3JpcHQ9XCJtb2R1bGUtbmFtZS5qc1wiPjwvZGl2PlxuXG5cbiBTY3JpcHQgbW9kdWxlcyB1c2luZyByZXF1aXJlOlxuIEZvciBtb2R1bGVzIHVzaW5nIHJlcXVpcmUgdXNlIGRhdGEtcmVxdWlyZTpcbiA8ZGl2IGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLXJlcXVpcmU9XCJtb2R1bGUtbmFtZVwiPjwvZGl2PlxuKi9cblxuKGZ1bmN0aW9uKHdpbmRvdywgZmFjdG9yeSkge1xuXHR2YXIgZ2xvYmFsSW5zdGFsbCA9IGZ1bmN0aW9uKCl7XG5cdFx0ZmFjdG9yeSh3aW5kb3cubGF6eVNpemVzKTtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbGF6eXVudmVpbHJlYWQnLCBnbG9iYWxJbnN0YWxsLCB0cnVlKTtcblx0fTtcblxuXHRmYWN0b3J5ID0gZmFjdG9yeS5iaW5kKG51bGwsIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcblxuXHRpZih0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKXtcblx0XHRmYWN0b3J5KHJlcXVpcmUoJ2xhenlzaXplcycpKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShbJ2xhenlzaXplcyddLCBmYWN0b3J5KTtcblx0fSBlbHNlIGlmKHdpbmRvdy5sYXp5U2l6ZXMpIHtcblx0XHRnbG9iYWxJbnN0YWxsKCk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xhenl1bnZlaWxyZWFkJywgZ2xvYmFsSW5zdGFsbCwgdHJ1ZSk7XG5cdH1cbn0od2luZG93LCBmdW5jdGlvbih3aW5kb3csIGRvY3VtZW50LCBsYXp5U2l6ZXMpIHtcblx0Lypqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYmdMb2FkLCByZWdCZ1VybEVzY2FwZTtcblx0dmFyIHVuaXF1ZVVybHMgPSB7fTtcblxuXHRpZihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKXtcblx0XHRyZWdCZ1VybEVzY2FwZSA9IC9cXCh8XFwpfFxcc3wnLztcblxuXHRcdGJnTG9hZCA9IGZ1bmN0aW9uICh1cmwsIGNiKXtcblx0XHRcdHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcblx0XHRcdGltZy5vbmxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRpbWcub25sb2FkID0gbnVsbDtcblx0XHRcdFx0aW1nLm9uZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRpbWcgPSBudWxsO1xuXHRcdFx0XHRjYigpO1xuXHRcdFx0fTtcblx0XHRcdGltZy5vbmVycm9yID0gaW1nLm9ubG9hZDtcblxuXHRcdFx0aW1nLnNyYyA9IHVybDtcblxuXHRcdFx0aWYoaW1nICYmIGltZy5jb21wbGV0ZSAmJiBpbWcub25sb2FkKXtcblx0XHRcdFx0aW1nLm9ubG9hZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRhZGRFdmVudExpc3RlbmVyKCdsYXp5YmVmb3JldW52ZWlsJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRpZihlLmRldGFpbC5pbnN0YW5jZSAhPSBsYXp5U2l6ZXMpe3JldHVybjt9XG5cblx0XHRcdHZhciB0bXAsIGxvYWQsIGJnLCBwb3N0ZXI7XG5cdFx0XHRpZighZS5kZWZhdWx0UHJldmVudGVkKSB7XG5cblx0XHRcdFx0dmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuXG5cdFx0XHRcdGlmKHRhcmdldC5wcmVsb2FkID09ICdub25lJyl7XG5cdFx0XHRcdFx0dGFyZ2V0LnByZWxvYWQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXByZWxvYWQnKSB8fCAnYXV0byc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvcGxheScpICE9IG51bGwpIHtcblx0XHRcdFx0XHRpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1leHBhbmQnKSAmJiAhdGFyZ2V0LmF1dG9wbGF5KSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQucGxheSgpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXIpIHt9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwYW5kJywgJy0xMCcpO1xuXHRcdFx0XHRcdFx0XHRsYXp5U2l6ZXMuYUModGFyZ2V0LCBsYXp5U2l6ZXMuY2ZnLmxhenlDbGFzcyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0bXAgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmsnKTtcblx0XHRcdFx0aWYodG1wKXtcblx0XHRcdFx0XHRhZGRTdHlsZVNjcmlwdCh0bXAsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtc2NyaXB0XG5cdFx0XHRcdHRtcCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyaXB0Jyk7XG5cdFx0XHRcdGlmKHRtcCl7XG5cdFx0XHRcdFx0ZS5kZXRhaWwuZmlyZXNMb2FkID0gdHJ1ZTtcblx0XHRcdFx0XHRsb2FkID0gZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhZGRTdHlsZVNjcmlwdCh0bXAsIG51bGwsIGxvYWQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtcmVxdWlyZVxuXHRcdFx0XHR0bXAgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmUnKTtcblx0XHRcdFx0aWYodG1wKXtcblx0XHRcdFx0XHRpZihsYXp5U2l6ZXMuY2ZnLnJlcXVpcmVKcyl7XG5cdFx0XHRcdFx0XHRsYXp5U2l6ZXMuY2ZnLnJlcXVpcmVKcyhbdG1wXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFkZFN0eWxlU2NyaXB0KHRtcCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtYmdcblx0XHRcdFx0YmcgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWJnJyk7XG5cdFx0XHRcdGlmIChiZykge1xuXHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IHRydWU7XG5cdFx0XHRcdFx0bG9hZCA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3Vyb
20578CgnICsgKHJlZ0JnVXJsRXNjYXBlLnRlc3QoYmcpID8gSlNPTi5zdHJpbmdpZnkoYmcpIDogYmcgKSArICcpJztcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGJnTG9hZChiZywgbG9hZCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBoYW5kbGUgZGF0YS1wb3N0ZXJcblx0XHRcdFx0cG9zdGVyID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1wb3N0ZXInKTtcblx0XHRcdFx0aWYocG9zdGVyKXtcblx0XHRcdFx0XHRlLmRldGFpbC5maXJlc0xvYWQgPSB0cnVlO1xuXHRcdFx0XHRcdGxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnBvc3RlciA9IHBvc3Rlcjtcblx0XHRcdFx0XHRcdGUuZGV0YWlsLmZpcmVzTG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGF6eVNpemVzLmZpcmUodGFyZ2V0LCAnX2xhenlsb2FkZWQnLCB7fSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGJnTG9hZChwb3N0ZXIsIGxvYWQpO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LCBmYWxzZSk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFN0eWxlU2NyaXB0KHNyYywgc3R5bGUsIGNiKXtcblx0XHRpZih1bmlxdWVVcmxzW3NyY10pe1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoc3R5bGUgPyAnbGluaycgOiAnc2NyaXB0Jyk7XG5cdFx0dmFyIGluc2VydEVsZW0gP
20578SBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG5cblx0XHRpZihzdHlsZSl7XG5cdFx0XHRlbGVtLnJlbCA9ICdzdHlsZXNoZWV0Jztcblx0XHRcdGVsZW0uaHJlZiA9IHNyYztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5vbmxvYWQgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRlbGVtLm9uZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRlbGVtLm9ubG9hZCA9IG51bGw7XG5cdFx0XHRcdGNiKCk7XG5cdFx0XHR9O1xuXHRcdFx0ZWxlbS5vbmVycm9yID0gZWxlbS5vbmxvYWQ7XG5cblx0XHRcdGVsZW0uc3JjID0gc3JjO1xuXHRcdH1cblx0XHR1bmlxdWVVcmxzW3NyY10gPSB0cnVlO1xuXHRcdHVuaXF1ZVVybHNbZWxlbS5zcmMgfHwgZWxlbS5ocmVmXSA9IHRydWU7XG5cdFx0aW5zZXJ0RWxlbS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtLCBpbnNlcnRFbGVtKTtcblx0fVxufSkpO1xuIiwiLyoqXG4qIHZ1ZSB2My40LjM0XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgKiBhcyBydW50aW1lRG9tIGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuaW1wb3J0IHsgaW5pdEN1c3RvbUZvcm1hdHRlciwgcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIsIHdhcm4gfSBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuaW1wb3J0IHsgY29tcGlsZSB9IGZyb20gJ0B2dWUvY29tcGlsZXItZG9tJztcbmltcG9ydCB7IGlzU3RyaW5nLCBOT09QLCBleHRlbmQsIGdlbmVyYXRlQ29kZUZyYW1lLCBFTVBUWV9PQkogfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmZ1bmN0aW9uIGluaXREZXYoKSB7XG4gIHtcbiAgICBpbml0Q3VzdG9tRm9ybWF0dGVyKCk7XG4gIH1cbn1cblxuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgaW5pdERldigpO1xufVxuY29uc3QgY29tcGlsZUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBnZXRDYWNoZShvcHRpb25zKSB7XG4gIGxldCBjID0gY29tcGlsZUNhY2hlLmdldChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogRU1QVFlfT0JKKTtcbiAgaWYgKCFjKSB7XG4gICAgYyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGNvbXBpbGVDYWNoZS5zZXQob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IEVNUFRZX09CSiwgYyk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5mdW5jdGlvbiBjb21waWxlVG9GdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykge1xuICBpZiAoIWlzU3RyaW5nKHRlbXBsYXRlKSkge1xuICAgIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkge1xuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5pbm5lckhUTUw7XG4gICAgfSBlbHNlIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgaW52YWxpZCB0ZW1wbGF0ZSBvcHRpb246IGAsIHRlbXBsYXRlKTtcbiAgICAgIHJldHVybiBOT09QO1xuICAgIH1cbiAgfVxuICBjb25zdCBrZXkgPSB0ZW1wbGF0ZTtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZShvcHRpb25zKTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVba2V5XTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgaWYgKHRlbXBsYXRlWzBdID09PSBcIiNcIikge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0ZW1wbGF0ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWVsKSB7XG4gICAgICB3YXJuKGBUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogJHt0ZW1wbGF0ZX1gKTtcbiAgICB9XG4gICAgdGVtcGxhdGUgPSBlbCA/IGVsLmlubmVySFRNTCA6IGBgO1xuICB9XG4gIGNvbnN0IG9wdHMgPSBleHRlbmQoXG4gICAge1xuICAgICAgaG9pc3RTdGF0aWM6IHRydWUsXG4gICAgICBvbkVycm9yOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gb25FcnJvciA6IHZvaWQgMCxcbiAgICAgIG9uV2FybjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChlKSA9PiBvbkVycm9yKGUsIHRydWUpIDogTk9PUFxuICAgIH0sXG4gICAgb3B0aW9uc1xuICApO1xuICBpZiAoIW9wdHMuaXNDdXN0b21FbGVtZW50ICYmIHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG9wdHMuaXNDdXN0b21FbGVtZW50ID0gKHRhZykgPT4gISFjdXN0b21FbGVtZW50cy5nZXQodGFnKTtcbiAgfVxuICBjb25zdCB7IGNvZGUgfSA9IGNvbXBpbGUodGVtcGxhdGUsIG9wdHMpO1xuICBmdW5jdGlvbiBvbkVycm9yKGVyciwgYXNXYXJuaW5nID0gZmFsc2UpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYXNXYXJuaW5nID8gZXJyLm1lc3NhZ2UgOiBgVGVtcGxhdGUgY29tcGlsYXRpb24gZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICBjb25zdCBjb2RlRnJhbWUgPSBlcnIubG9jICYmIGdlbmVyYXRlQ29kZUZyYW1lKFxuICAgICAgdGVtcGxhdGUsXG4gICAgICBlcnIubG9jLnN0YXJ0Lm9mZnNldCxcbiAgICAgIGVyci5sb2MuZW5kLm9mZnNldFxuICAgICk7XG4gICAgd2Fybihjb2RlRnJhbWUgPyBgJHttZXNzYWdlfVxuJHtjb2RlRnJhbWV9YCA6IG1lc3NhZ2UpO1xuICB9XG4gIGNvbnN0IHJlbmRlciA9IG5ldyBGdW5jdGlvbihcIlZ1ZVwiLCBjb2RlKShydW50aW1lRG9tKTtcbiAgcmVuZGVyLl9yYyA9IHRydWU7XG4gIHJldHVybiBjYWNoZVtrZXldID0gcmVuZGVyO1xufVxucmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoY29tcGlsZVRvRnVuY3Rpb24pO1xuXG5leHBvcnQgeyBjb21waWxlVG9GdW5jdGlvbiBhcyBjb21waWxlIH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoMTk3KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoMjQwKTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoNDk2KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoNjI1KTsiLCJtb2R1bGUuZXhwb3J0cyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBkbGwtcmVmZXJlbmNlIHZlbmRvcl9saWJyYXJ5ICovIFwiZGxsLXJlZmVyZW5jZSB2ZW5kb3JfbGlicmFyeVwiKSkoODc5KTsiLCJtb2R1bGUuZXhwb3J0cyA9IHZlbmRvcl9saWJyYXJ5OyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGh
20578pcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH0iLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczpvZmYgKi9cblxuLy8g5YWo44Oa44O844K45YWx6YCa5Yem55CGXG5pbXBvcnQgY29tbW9uIGZyb20gJy4vcGFnZXMvY29tbW9uJztcblxuY29tbW9uKCk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.