1(()=>{"use strict";var __webpack_modules__={"./src/scripts/components/blog.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2/* harmony import */ var _styles_templates_blog_blog_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../styles/templates/blog/blog.scss */ "./src/styles/templates/blog/blog.scss"); 3/* harmony import */ var _components_blog_article_page__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/components/blog/article-page */ "./src/scripts/components/blog/article-page.js"); 4/* harmony import */ var _components_blog_article_page_simple__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/blog/article-page-simple */ "./src/scripts/components/blog/article-page-simple.js"); 5/* harmony import */ var _components_blog_before_after_page__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/blog/before-after-page */ "./src/scripts/components/blog/before-after-page.js"); 6/* harmony import */ var _components_pages_hero_special__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/components/pages/hero-special */ "./src/scripts/components/pages/hero-special.js"); 7/* harmony import */ var _components_blog_ingredients_page__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/blog/ingredients-page */ "./src/scripts/components/blog/ingredients-page.js"); 8/* harmony import */ var _components_blog_inspiration_buy_flow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/components/blog/inspiration-buy-flow */ "./src/scripts/components/blog/inspiration-buy-flow.js"); 9/* harmony import */ var _components_blog_results_page__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/components/blog/results-page */ "./src/scripts/components/blog/results-page.js"); 10/* harmony import */ var _components_blog_faithpilot_page__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/components/blog/faithpilot-page */ "./src/scripts/components/blog/faithpilot-page.js"); 11/* harmony import */ var _components_blog_video_studio__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/components/blog/video-studio */ "./src/scripts/components/blog/video-studio.js"); 12var _app; 13 14 15 16 17 18 19 20 21 22 23var components = { 24 articlePage: _components_blog_article_page__WEBPACK_IMPORTED_MODULE_1__["default"], 25 articlePageSimple: _components_blog_article_page_simple__WEBPACK_IMPORTED_MODULE_2__["default"], 26 beforeAfterPage: _components_blog_before_after_page__WEBPACK_IMPORTED_MODULE_3__["default"], 27 heroSpecial: _components_pages_hero_special__WEBPACK_IMPORTED_MODULE_4__["default"], 28 ingredientsPage: _components_blog_ingredients_page__WEBPACK_IMPORTED_MODULE_5__["default"], 29 inspirationBuyFlow: _components_blog_inspiration_buy_flow__WEBPACK_IMPORTED_MODULE_6__["default"], 30 resultsPage: _components_blog_results_page__WEBPACK_IMPORTED_MODULE_7__["default"], 31 faithpilotPage: _components_blog_faithpilot_page__WEBPACK_IMPORTED_MODULE_8__["default"], 32 videoStudio: _components_blog_video_studio__WEBPACK_IMPORTED_MODULE_9__["default"] 33}; 34app.add(components); 35if ((_app = app) !== null && _app !== void 0 && (_app = _app.getState()) !== null && _app !== void 0 && _app.cart) app.mount();//# sourceURL=[module] 36//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQThDO0FBRVU7QUFDYTtBQUNKO0FBQ1I7QUFDTztBQUNPO0FBQ2Y7QUFDTTtBQUNOO0FBRXhELElBQU1TLFVBQVUsR0FBRztFQUNmVCxXQUFXLEVBQVhBLHFFQUFXO0VBQ1hDLGlCQUFpQixFQUFqQkEsNEVBQWlCO0VBQ2pCQyxlQUFlLEVBQWZBLDBFQUFlO0VBQ2ZDLFdBQVcsRUFBWEEsc0VBQVc7RUFDWEMsZUFBZSxFQUFmQSx5RUFBZTtFQUNmQyxrQkFBa0IsRUFBbEJBLDZFQUFrQjtFQUNsQkMsV0FBVyxFQUFYQSxxRUFBVztFQUNYQyxjQUFjLEVBQWRBLHdFQUFjO0VBQ2RDLFdBQVcsRUFBWEEscUVBQVdBO0FBQ2YsQ0FBQztBQUVERSxHQUFHLENBQUNDLEdBQUcsQ0FBQ0YsVUFBVSxDQUFDO0FBQ25CLEtBQUFHLElBQUEsR0FBSUYsR0FBRyxjQUFBRSxJQUFBLGdCQUFBQSxJQUFBLEdBQUhBLElBQUEsQ0FBS0MsUUFBUSxDQUFDLENBQUMsY0FBQUQsSUFBQSxlQUFmQSxJQUFBLENBQWlCRSxJQUFJLEVBQUVKLEdBQUcsQ0FBQ0ssS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cuanM/NWFlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4uLy4uL3N0eWxlcy90ZW1wbGF0ZXMvYmxvZy9ibG9nLnNjc3MnXG5cbmltcG9ydCBhcnRpY2xlUGFnZSBmcm9tICdAL2NvbXBvbmVudHMvYmxvZy9hcnRpY2xlLXBhZ2UnXG5pbXBvcnQgYXJ0aWNsZVBhZ2VTaW1wbGUgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdl
vendor: 7,949 bytes, lines 36-70
36LXNpbXBsZSdcbmltcG9ydCBiZWZvcmVBZnRlclBhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvYmVmb3JlLWFmdGVyLXBhZ2UnXG5pbXBvcnQgaGVyb1NwZWNpYWwgZnJvbSAnQC9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbCdcbmltcG9ydCBpbmdyZWRpZW50c1BhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvaW5ncmVkaWVudHMtcGFnZSdcbmltcG9ydCBpbnNwaXJhdGlvbkJ1eUZsb3cgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvaW5zcGlyYXRpb24tYnV5LWZsb3cnXG5pbXBvcnQgcmVzdWx0c1BhZ2UgZnJvbSAnQC9jb21wb25lbnRzL2Jsb2cvcmVzdWx0cy1wYWdlJ1xuaW1wb3J0IGZhaXRocGlsb3RQYWdlIGZyb20gJ0AvY29tcG9uZW50cy9ibG9nL2ZhaXRocGlsb3QtcGFnZSdcbmltcG9ydCB2aWRlb1N0dWRpbyBmcm9tICdAL2NvbXBvbmVudHMvYmxvZy92aWRlby1zdHVkaW8nXG5cbmNvbnN0IGNvbXBvbmVudHMgPSB7XG4gICAgYXJ0aWNsZVBhZ2UsXG4gICAgYXJ0aWNsZVBhZ2VTaW1wbGUsXG4gICAgYmVmb3JlQWZ0ZXJQYWdlLFxuICAgIGhlcm9TcGVjaWFsLFxuICAgIGluZ3JlZGllbnRzUGFnZSxcbiAgICBpbnNwaXJhdGlvbkJ1eUZsb3csXG4gICAgcmVzdWx0c1BhZ2UsXG4gICAgZmFpdGhwaWxvdFBhZ2UsXG4gICAgdmlkZW9TdHVkaW9cbn1cblxuYXBwLmFkZChjb21wb25lbnRzKVxuaWYgKGFwcD8uZ2V0U3RhdGUoKT8uY2FydCkgYXBwLm1vdW50KCkiXSwibmFtZXMiOlsiYXJ0aWNsZVBhZ2UiLCJhcnRpY2xlUGFnZVNpbXBsZSIsImJlZm9yZUFmdGVyUGFnZSIsImhlcm9TcGVjaWFsIiwiaW5ncmVkaWVudHNQYWdlIiwiaW5zcGlyYXRpb25CdXlGbG93IiwicmVzdWx0c1BhZ2UiLCJmYWl0aHBpbG90UGFnZSIsInZpZGVvU3R1ZGlvIiwiY29tcG9uZW50cyIsImFwcCIsImFkZCIsIl9hcHAiLCJnZXRTdGF0ZSIsImNhcnQiLCJtb3VudCJdLCJzb3VyY2VSb290IjoiIn0= 37//# sourceURL=webpack-internal:///./src/scripts/components/blog.js 38 39}`)},"./src/scripts/components/blog/article-page-simple.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 40/* harmony export */ __webpack_require__.d(__webpack_exports__, { 41/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 42/* harmony export */ }); 43/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js"); 44 45/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) { 46 /*******************************************************************************************************************************************/ 47 /* Data + Elements 48 /*******************************************************************************************************************************************/ 49 var _zelektor = zelektor(node), 50 mainContent = _zelektor.mainContent; 51 52 /*******************************************************************************************************************************************/ 53 /* Init 54 /*******************************************************************************************************************************************/ 55 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.wrapIFrames)(mainContent); 56}));//# sourceURL=[module] 57//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLXNpbXBsZS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFxRDtBQUVyRCxpRUFBZUMsU0FBUyxDQUFDLFVBQUNDLElBQUksRUFBQ0MsR0FBRyxFQUFLO0VBQ25DO0VBQ0E7QUFDSjtFQUNJLElBQUFDLFNBQUEsR0FBd0JDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBQTlCSSxXQUFXLEdBQUFGLFNBQUEsQ0FBWEUsV0FBVzs7RUFHbkI7RUFDQTtBQUNKO0VBQ0lOLG1FQUFXLENBQUNNLFdBQVcsQ0FBQztBQUU1QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLXNpbXBsZS5qcz9mZWJmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyYXBJRnJhbWVzIH0gZnJvbSAnQC9saWIvdXRpbGl0eS1mdW5jdGlvbnMnXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSxjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG1haW5Db250ZW50IH0gPSB6ZWxla3Rvcihub2RlKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBJbml0XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgd3JhcElGcmFtZXMobWFpbkNvbnRlbnQpXG4gICAgXG59KSJdLCJuYW1lcyI6WyJ3cmFwSUZyYW1lcyIsImNvbXBvbmVudCIsIm5vZGUiLCJjdHgiLCJfemVsZWt0b3IiLCJ6ZWxla3RvciIsIm1haW5Db250ZW50Il0sInNvdXJjZVJvb3QiOiIifQ== 58//# sourceURL=webpack-internal:///./src/scripts/components/blog/article-page-simple.js 59 60}`)},"./src/scripts/components/blog/article-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 61/* harmony export */ __webpack_require__.d(__webpack_exports__, { 62/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 63/* harmony export */ }); 64/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js"); 65/* harmony import */ var _lib_load_script__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/load-script */ "./src/scripts/lib/load-script.js"); 66/* harmony import */ var _lib_consent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/consent */ "./src/scripts/lib/consent.js"); 67/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js"); 68/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js"); 69/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js"); 70function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
70 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 71function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 72function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 73function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 74 75 76 77 78 79 80/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) { 81 /*******************************************************************************************************************************************/ 82 /* Data + Elements 83 /*******************************************************************************************************************************************/ 84 var _zelektor = zelektor(node), 85 mainContent = _zelektor.mainContent, 86 contentTable = _zelektor.contentTable, 87 pollElements = _zelektor.poll, 88 beforeAfterSliderWrappers = _zelektor.beforeAfterSliderWrapper; 89 var strings = window.theme.strings.blog; 90 var canTrackFunctional = (0,_lib_consent__WEBPACK_IMPORTED_MODULE_2__.hasConsent)('cookie_cat_functional'); 91 92 /*******************************************************************************************************************************************/ 93 /* Event Listeners 94 /*******************************************************************************************************************************************/ 95 _lib_consent__WEBPACK_IMPORTED_MODULE_2__.consentEvents.forEach(function (eventName) { 96 window.addEventListener(eventName, updateTrackingConsent, false); 97 }); 98 99 /*******************************************************************************************************************************************/ 100 /* Init 101 /*******************************************************************************************************************************************/ 102 createContentTable(); 103 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.wrapIFrames)(mainContent); 104 if (pollElements) { 105 var observer = new IntersectionObserver(function (entries) { 106 entries.forEach(/*#__PURE__*/function () { 107 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(entry) { 108 return _regenerator().w(function (_context) { 109 while (1) switch (_context.n) { 110 case 0: 111 if (!entry.isIntersecting) { 112 _context.n = 3; 113 break; 114 } 115 _context.n = 1; 116 return (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_1__["default"])('https://www.gstatic.
116com/firebasejs/7.19.0/firebase-app.js'); 117 case 1: 118 _context.n = 2; 119 return (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_1__["default"])('https://www.gstatic.com/firebasejs/7.19.0/firebase-database.js'); 120 case 2: 121 createPolls(); 122 observer.disconnect(); 123 case 3: 124 return _context.a(2); 125 } 126 }, _callee); 127 })); 128 return function (_x) { 129 return _ref.apply(this, arguments); 130 }; 131 }()); 132 }); 133 loopify(pollElements).forEach(function (poll) { 134 observer.observe(poll); 135 }); 136 } 137 if (beforeAfterSliderWrappers) { 138 awaitVendorScript('keenSlider', function () { 139 return initBeforeAfterSliders(); 140 }); 141 } 142 143 /*******************************************************************************************************************************************/ 144 /* Functions 145 /*******************************************************************************************************************************************/ 146 function createContentTable() { 147 var _zelektor2 = zelektor(mainContent), 148 headings = _zelektor2.heading; 149 if (!(headings !== null && headings !== void 0 && headings.length)) { 150 contentTable === null || contentTable === void 0 || contentTable.remove(); 151 return; 152 }
153 headings.forEach(function (h, index) { 154 var btn = document.createElement('p'); 155 btn.classList.add('article__content-table__item', 'js-contentScrollBtn'); 156 btn.innerHTML = "\\n ".concat(window.theme.icons.arrowRightSmall, "\\n <span class=\\"article__content-table__item__text\\">").concat(h.textContent, "</span>\\n "); 157 contentTable.appendChild(btn); 158 btn.addEventListener('click', function () { 159 return scrollToHeading(h); 160 }); 161 }); 162 contentTable.classList.add('is-initialized'); 163 } 164 function scrollToHeading(heading) { 165 var headerHeight = parseInt(getComputedStyle(root).getPropertyValue('--header-height').replace('px', '')); 166 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.smoothScroll)(heading, { 167 offset: -headerHeight - 30 168 }); 169 } 170 function createPolls() { 171 // Create polls 172 var _window = window, 173 pollItems = _window.pollItems; 174 175 // Initialize Firebase database 176 var config = window.theme.config.firebase; 177 firebase.initializeApp(config); 178 var database = firebase.database(); 179 loopify(pollElements).forEach(function (p) { 180 var id = p.dataset.id; 181 var item = pollItems.find(function (i) { 182 return i.questionId === id; 183 }); 184 if (!item) return; 185 p.dataset.questionId = item.questionId; 186 p.dataset.databaseId = "".concat(item.databaseId); 187 p.dataset.type = item.type; 188 p.innerHTML = "\\n <div class=\\"article__poll__cookie-notice js-cookieNotice\\">\\n <p>".concat(window.theme.strings.layout.acceptCookiesFunctional, "</p>\\n </div>\\n\\n <div class=\\"article__poll__content-wrapper\\">\\n <p class=\\"title title--small\\">").concat(item.question, "</p>\\n\\n <ul class=\\"article__poll__list\\">\\n ").concat(item.answers.map(function (a, index) { 189 return "\\n <li class=\\"article__poll__item js-answer\\" data-value=\\"".concat(index, "\\" data-index=\\"").concat(index, "\\">\\n <div>").concat(a, "</div>\\n <div class=\\"article__poll__item__percent is-hidden js-percent\\">\\n <span class=\\"js-percentVal\\">0</span>\\n <span>%</span>\\n </div>\\n </li>\\n "); 190 }).join(''), "\\n </ul>\\n\\n <button type=\\"button\\" class=\\"cta cta--filled-dark js-submitBtn\\">").concat(strings.vote, "</button>\\n\\n <p class=\\"article__poll__count is-hidden js-voteCount\\">\\n <span>").concat(strings.voteCount, ": </span>\\n <span class=\\"js-voteCountVal\\"></span>\\n </p>\\n </div>\\n "); 191 initPollElement(p); 192 }); 193 194 // Initialize poll element (fetch database + update poll, create event listeners, etc.) 195 function initPollElement(el) { 196 var questionId = el.dataset.questionId; 197 var _zelektor3 = zelektor(el), 198 answers = _zelektor3.answer, 199 submitBtn = _zelektor3.submitBtn, 200 cookieNotice = _zelektor3.cookieNotice; 201 202 // Check if user already voted 203 // If yes, get results and disable poll 204 var alreadyVoted = localStorage.getItem("hairlustPoll_".concat(questionId)); 205 if (alreadyVoted) getResults(el); 206 207 // Set up event listeners 208 loopify(answers).forEach(function (a) { 209 a.addEventListener('click', function () { 210 return selectAnswer(a, el); 211 }); 212 }); 213 submitBtn.addEventListener('click', function () { 214 return submitVote(el); 215 }); 216 cookieNotice.addEventListener('click', function () { 217 var _window$CookieScript, _window$CookieScript$; 218 (_window$CookieScript = window.CookieScript) === null || _window$CookieScript === void 0 || (_window$CookieScript = _window$CookieScript.instance) === null || _window$CookieScript === void 0 || (_window$CookieScript$ = _window$CookieScript.show) === null || _window$CookieScript$ === void 0 || _window$CookieScript$.call(_window$CookieScript); 219 }); 220 el.classList.add('is-initialized'); 221 } 222 function selectAnswer(answer, pollEl) { 223 if (pollEl.dataset.type === 'single') { 224 var _zelektor4 = zelektor(pollEl), 225 allAnswers = _zelektor4.answer;
226 loopify(allAnswers).forEach(function (a) { 227 return a.classList.remove('is-active'); 228 }); 229 answer.classList.add('is-active'); 230 } else if (pollEl.dataset.type === 'multiple') { 231 answer.classList.toggle('is-active'); 232 } 233 } 234 function submitVote(pollEl) { 235 var _pollEl$dataset = pollEl.dataset, 236 questionId = _pollEl$dataset.questionId, 237 databaseId = _pollEl$dataset.databaseId; 238 var _zelektor5 = zelektor(pollEl), 239 answers = _zelektor5.answer; 240 var selectedAnswers = loopify(answers).filter(function (a) { 241 return a.classList.contains('is-active'); 242 }); 243 if (!(selectedAnswers !== null && selectedAnswers !== void 0 && selectedAnswers.length)) { 244 alert('Please select an answer'); 245 } else { 246 localStorage.setItem("hairlustPoll_".concat(questionId), "".concat(loopify(selectedAnswers.map(function (a) { 247 return a.dataset.index; 248 }).join(',')))); 249 250 // For each selected answer 251 // Create new key in database and set it to answer value 252 selectedAnswers.forEach(function (a) { 253 var newPostKey = database.ref(databaseId).push(); 254 newPostKey.set(a.dataset.value); 255 }); 256 257 // Get results and disable vote 258 getResults(pollEl); 259 } 260 } 261 function getResults(pollEl) { 262 var _pollEl$dataset2 = pollEl.dataset, 263 questionId = _pollEl$dataset2.questionId, 264 databaseId = _pollEl$dataset2.databaseId; 265 var _zelektor6 = zelektor(pollEl), 266 submitBtn = _zelektor6.submitBtn; 267 268 // Load user answers from localStorage 269 var userAnswers = localStorage.getItem("hairlustPoll_".concat(questionId)).split(','); 270 271 // Mark the answers that the user selected (and unmark the rest) 272 var _zelektor7 = zelektor(pollEl), 273 answers = _zelektor7.answer; 274 var markedAnswers = loopify(answers).filter(function (a) { 275 return userAnswers.find(function (u) { 276 return a.dataset.index === u; 277 }); 278 }); 279 markedAnswers.forEach(function (a) { 280 return a.classList.add('is-active'); 281 }); 282 283 // Disable answers to prevent user from changing marks 284 answers.forEach(function (a) { 285 return a.classList.add('is-disabled'); 286 }); 287 288 // Load all answers from database 289 var ref = database.ref(databaseId); 290 ref.on('value', function (data) { 291 return updatePoll(pollEl, Object.values(data.val())); 292 }); 293 294 // Hide submit button 295 submitBtn.classList.add('is-hidden'); 296 } 297 function updatePoll(pollEl, databaseVals) { 298 // Update answers with percentages 299 var _zelektor8 = zelektor(pollEl), 300 answers = _zelektor8.answer, 301 voteCount = _zelektor8.voteCount, 302 voteCountVal = _zelektor8.voteCountVal; 303 loopify(answers).forEach(function (a) { 304 var matches = databaseVals.filter(function (v) { 305 return v === a.dataset.value; 306 }); 307 var percentage = Math.round(matches.length / databaseVals.length * 100); 308 var _zelektor9 = zelektor(a), 309 percent = _zelektor9.percent, 310 percentVal = _zelektor9.percentVal; 311 percent.classList.remove('is-hidden'); 312 var counter = { 313 val: 0 314 }; 315 gsap__WEBPACK_IMPORTED_MODULE_5__.gsap.to(counter, { 316 duration: 2, 317 val: percentage, 318 onUpdate: setVal 319 }); 320 function setVal() { 321 var val = gsap__WEBPACK_IMPORTED_MODULE_5__.gsap.utils.snap(1, counter.val); 322 percentVal.textContent = val; 323 } 324 }); 325 326 // Show total amount of votes 327 voteCountVal.textContent = databaseVals.length; 328 voteCount.classList.remove('is-hidden'); 329 } 330 togglePolls(); 331 } 332 function updateTrackingConsent() { 333 canTrackFunctional = (0,_lib_consent__WEBPACK_IMPORTED_MODULE_2__.hasConsent)('cookie_cat_functional'); 334 togglePolls(); 335 } 336 function togglePolls() { 337 if (canTrackFunctional) { 338 loopify(pollElements).forEach(function (el) { 339 return el.classList.remove('is-hidden'); 340 }); 341 } else {
342 loopify(pollElements).forEach(function (el) { 343 return el.classList.add('is-hidden'); 344 }); 345 } 346 } 347 function initBeforeAfterSliders() { 348 loopify(beforeAfterSliderWrappers).forEach(function (w) { 349 var _zelektor0 = zelektor(w), 350 sliderEl = _zelektor0.sliderEl, 351 prev = _zelektor0.prev, 352 next = _zelektor0.next; 353 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.addClasses)(sliderEl); 354 var slider = new keen_slider__WEBPACK_IMPORTED_MODULE_4__["default"](sliderEl, { 355 slidesPerView: 1, 356 loop: true, 357 duration: 700, 358 breakpoints: { 359 '(max-width: 1024px)': { 360 slidesPerView: 1.4, 361 centered: true 362 } 363 }, 364 created: function created(inst) { 365 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.initSliderWrapper)(w); 366 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_3__.initArrows)(inst, prev, next); 367 updateSlides(sliderEl, inst); 368 }, 369 slideChanged: function slideChanged(inst) { 370 updateSlides(sliderEl, inst); 371 } 372 }); 373 }); 374 } 375 function updateSlides(sliderEl, inst) { 376 var _inst$details = inst.details(), 377 relativeSlide = _inst$details.relativeSlide; 378 var _zelektor1 = zelektor(sliderEl), 379 slides = _zelektor1.slide; 380 loopify(slides).forEach(function (slide, index) { 381 slide.classList[index === relativeSlide ? 'add' : 'remove']('is-active'); 382 }); 383 } 384}));//# sourceURL=[module] 385//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYXJ0aWNsZS1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElBQUFGLENBQUEsS0FBQVYsQ0FBQSxJQUFBTCxDQUFBLEdBQUFnQixDQUFBLENBQUFPLE1BQUEsRUFBQXZCLENBQUEsVUFBQUssQ0FBQSxFQUFBRSxDQUFBLEdBQUFTLENBQUEsQ0FBQWhCLENBQUEsR0FBQXFCLENBQUEsR0FBQUgsQ0FBQSxDQUFBRixDQUFBLEVBQUFRLENBQUEsR0FBQWpCLENBQUEsS0FBQU4sQ0FBQSxRQUFBSSxDQUFBLEdBQUFtQixDQUFBLEtBQUFyQixDQUFBLE1BQUFRLENBQUEsR0FBQUosQ0FBQSxFQUFBQyxDQUFBLEdBQUFELENBQUEsWUFBQUMsQ0FBQSxXQUFBRCxDQUFBLE1BQUFBLENBQUEsTUFBQVIsQ0FBQSxJQUFBUSxDQUFBLE9BQUFjLENBQUEsTUFBQWhCLENBQUEsR0FBQUosQ0FBQSxRQUFBb0IsQ0FBQSxHQUFBZCxDQUFBLFFBQUFDLENBQUEsTUFBQVUsQ0FBQSxDQUFBQyxDQUFBLEdBQUFoQixDQUFBLEVBQUFlLENBQUEsQ0FBQWYsQ0FBQSxHQUFBSSxDQUFBLE9BQUFjLENBQUEsR0FBQUcsQ0FBQSxLQUFBbkIsQ0FBQSxHQUFBSixDQUFBLFFBQUFNLENBQUEsTUFBQUosQ0FBQSxJQUFBQSxDQUFBLEdBQUFxQixDQUFBLE1BQUFqQixDQUFBLE1BQUFOLENBQUEsRUFBQU0sQ0FBQSxNQUFBSixDQUFBLEVBQUFlLENBQUEsQ0FBQWYsQ0FBQSxHQUFBcUIsQ0FBQSxFQUFBaEIsQ0FBQSxjQUFBSCxDQUFBLElBQUFKLENBQUEsYUFBQW1CLENBQUEsUUFBQUgsQ0FBQSxPQUFBZCxDQUFBLHFCQUFBRSxDQUFBLEVBQUFXLENBQUEsRUFBQVEsQ0FBQSxRQUFBVCxDQUFBLFlBQUFVLFNBQUEsdUNBQUFSLENBQUEsVUFBQUQsQ0FBQSxJQUFBSyxDQUFBLENBQUFMLENBQUEsRUFBQVEsQ0FBQSxHQUFBaEIsQ0FBQSxHQUFBUSxDQUFBLEVBQUFMLENBQUEsR0FBQWEsQ0FBQSxHQUFBeEIsQ0FBQSxHQUFBUSxDQUFBLE9BQUFULENBQUEsR0FBQVksQ0FBQSxNQUFBTSxDQUFBLEtBQUFWLENBQUEsS0FBQUMsQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQVUsQ0FBQSxDQUFBZixDQUFBLFFBQUFrQixDQUFBLENBQUFiLENBQUEsRUFBQUcsQ0FBQSxLQUFBTyxDQUFBLENBQUFmLENBQUEsR0FBQVEsQ0FBQSxHQUFBTyxDQUFBLENBQUFDLENBQUEsR0FBQVIsQ0FBQSxhQUFBSSxDQUFBLE1BQUFSLENBQUEsUUFBQUMsQ0FBQSxLQUFBSCxDQUFBLFlBQUFMLENBQUEsR0FBQU8sQ0FBQSxDQUFBRixDQUFBLFdBQUFMLENBQUEsR0FBQUEsQ0FBQSxDQUFBMEIsSUFBQSxDQUFBbkIsQ0FBQSxFQUFBSSxDQUFBLFVBQUFjLFNBQUEsMkNBQUF6QixDQUFBLENBQUEyQixJQUFBLFNBQUEzQixDQUFBLEVBQUFXLENBQUEsR0FBQVgsQ0FBQSxDQUFBNEIsS0FBQSxFQUFBcEIsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUFSLENBQUEsR0FBQU8sQ0FBQSxlQUFBUCxDQUFBLENBQUEwQixJQUFBLENBQUFuQixDQUFBLEdBQUFDLENBQUEsU0FBQUcsQ0FBQSxHQUFBYyxTQUFBLHVDQUFBcEIsQ0FBQSxnQkFBQUcsQ0FBQSxPQUFBRCxDQUFBLEdBQUFSLENBQUEsY0FBQUMsQ0FBQSxJQUFBaUIsQ0FBQSxHQUFBQyxDQUFBLENBQUFmLENBQUEsUUFBQVEsQ0FBQSxHQUFBVixDQUFBLENBQUF5QixJQUFBLENBQUF2QixDQUFBLEVBQUFlLENBQUEsT0FBQUUsQ0FBQSxrQkFBQXBCLENBQUEsSUFBQU8sQ0FBQSxHQUFBUixDQUFBLEVBQUFTLENBQUEsTUFBQUcsQ0FBQSxHQUFBWCxDQUFBLGNBQUFlLENBQUEsbUJBQUFhLEtB
385QUEsRUFBQTVCLENBQUEsRUFBQTJCLElBQUEsRUFBQVYsQ0FBQSxTQUFBaEIsQ0FBQSxFQUFBSSxDQUFBLEVBQUFFLENBQUEsUUFBQUksQ0FBQSxRQUFBUyxDQUFBLGdCQUFBVixVQUFBLGNBQUFtQixrQkFBQSxjQUFBQywyQkFBQSxLQUFBOUIsQ0FBQSxHQUFBWSxNQUFBLENBQUFtQixjQUFBLE1BQUF2QixDQUFBLE1BQUFMLENBQUEsSUFBQUgsQ0FBQSxDQUFBQSxDQUFBLElBQUFHLENBQUEsU0FBQVcsbUJBQUEsQ0FBQWQsQ0FBQSxPQUFBRyxDQUFBLGlDQUFBSCxDQUFBLEdBQUFXLENBQUEsR0FBQW1CLDBCQUFBLENBQUFyQixTQUFBLEdBQUFDLFNBQUEsQ0FBQUQsU0FBQSxHQUFBRyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxZQUFBTyxFQUFBaEIsQ0FBQSxXQUFBYSxNQUFBLENBQUFvQixjQUFBLEdBQUFwQixNQUFBLENBQUFvQixjQUFBLENBQUFqQyxDQUFBLEVBQUErQiwwQkFBQSxLQUFBL0IsQ0FBQSxDQUFBa0MsU0FBQSxHQUFBSCwwQkFBQSxFQUFBaEIsbUJBQUEsQ0FBQWYsQ0FBQSxFQUFBTSxDQUFBLHlCQUFBTixDQUFBLENBQUFVLFNBQUEsR0FBQUcsTUFBQSxDQUFBQyxNQUFBLENBQUFGLENBQUEsR0FBQVosQ0FBQSxXQUFBOEIsaUJBQUEsQ0FBQXBCLFNBQUEsR0FBQXFCLDBCQUFBLEVBQUFoQixtQkFBQSxDQUFBSCxDQUFBLGlCQUFBbUIsMEJBQUEsR0FBQWhCLG1CQUFBLENBQUFnQiwwQkFBQSxpQkFBQUQsaUJBQUEsR0FBQUEsaUJBQUEsQ0FBQUssV0FBQSx3QkFBQXBCLG1CQUFBLENBQUFnQiwwQkFBQSxFQUFBekIsQ0FBQSx3QkFBQVMsbUJBQUEsQ0FBQUgsQ0FBQSxHQUFBRyxtQkFBQSxDQUFBSCxDQUFBLEVBQUFOLENBQUEsZ0JBQUFTLG1CQUFBLENBQUFILENBQUEsRUFBQVIsQ0FBQSxpQ0FBQVcsbUJBQUEsQ0FBQUgsQ0FBQSw4REFBQXdCLFlBQUEsWUFBQ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YUFBYTtJQUNyQixJQUFBQyxVQUFBLEdBQTBCM0osUUFBUSxDQUFDNEksUUFBUSxDQUFDO01BQTdCZ0IsTUFBTSxHQUFBRCxVQUFBLENBQWJFLEtBQUs7SUFFYmpJLE9BQU8sQ0FBQ2dJLE1BQU0sQ0FBQyxDQUFDaEosT0FBTyxDQUFDLFVBQUNpSixLQUFLLEVBQUV4SCxLQUFLLEVBQUs7TUFDdEN3SCxLQUFLLENBQUNwSCxTQUFTLENBQUNKLEtBQUssS0FBS3FILGFBQWEsR0FBRyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQzVFLENBQUMsQ0FBQztFQUNOO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvY29tcG9uZW50cy9ibG9nL2FydGljbGUtcGFnZS5qcz9hZDgzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7
385IHNtb290aFNjcm9sbCwgd3JhcElGcmFtZXMgfSBmcm9tICdAL2xpYi91dGlsaXR5LWZ1bmN0aW9ucydcbmltcG9ydCBsb2FkU2NyaXB0IGZyb20gJ0AvbGliL2xvYWQtc2NyaXB0J1xuaW1wb3J0IHsgY29uc2VudEV2ZW50cywgaGFzQ29uc2VudCB9IGZyb20gJ0AvbGliL2NvbnNlbnQnXG5pbXBvcnQgeyBhZGRDbGFzc2VzLCBpbml0U2xpZGVyV3JhcHBlciwgaW5pdEFycm93cyB9IGZyb20gJ0AvbGliL2tlZW4tc2xpZGVyLmpzJ1xuaW1wb3J0IEtlZW5TbGlkZXIgZnJvbSAna2Vlbi1zbGlkZXInXG5pbXBvcnQgeyBnc2FwIH0gZnJvbSAnZ3NhcCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLCBjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG1haW5Db250ZW50LCBjb250ZW50VGFibGUsIHBvbGw6IHBvbGxFbGVtZW50cywgYmVmb3JlQWZ0ZXJTbGlkZXJXcmFwcGVyOiBiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzIH0gPSB6ZWxla3Rvcihub2RlKVxuICAgIGNvbnN0IHN0cmluZ3MgPSB3aW5kb3cudGhlbWUuc3RyaW5ncy5ibG9nXG5cbiAgICBsZXQgY2FuVHJhY2tGdW5jdGlvbmFsID0gaGFzQ29uc2VudCgnY29va2llX2NhdF9mdW5jdGlvbmFsJylcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgY29uc2VudEV2ZW50cy5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB1cGRhdGVUcmFja2luZ0NvbnNlbnQsIGZhbHNlKVxuICAgIH0pXG5cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogSW5
385pdFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNyZWF0ZUNvbnRlbnRUYWJsZSgpXG4gICAgd3JhcElGcmFtZXMobWFpbkNvbnRlbnQpXG5cbiAgICBpZiAocG9sbEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRTY3JpcHQoJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2ZpcmViYXNlanMvNy4xOS4wL2ZpcmViYXNlLWFwcC5qcycpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkU2NyaXB0KCdodHRwczovL3d3dy5nc3RhdGljLmNvbS9maXJlYmFzZWpzLzcuMTkuMC9maXJlYmFzZS1kYXRhYmFzZS5qcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBvbGxzKCk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9vcGlmeShwb2xsRWxlbWVudHMpLmZvckVhY2goKHBvbGwpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUocG9sbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzKSB7XG4gICAgICAgIGF3YWl0VmVuZG9yU2NyaXB0KCdrZWVuU2xpZGVyJywgKCkgPT4gaW5pdEJlZm9yZUFmdGVyU2xpZGVycygpKVxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRnVuY3Rpb25zXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29udGVudFRhYmxlKCkge1xuICAgICAgICBjb25zdCB7IGhlYWRpbmc6IGhlYWRpbmdzIH0gPSB6ZWxla3RvcihtYWluQ29udGVudClcblxuICAgICAgICBpZiAoIWhlYWRpbmdzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRlbnRUYWJsZT8ucmVtb3ZlKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaGVhZGluZ3MuZm9yRWFjaCgoaCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKVxuXG4gICAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYXJ0aWNsZV9fY29udGVudC10YWJsZV9faXRlbScsICdqcy1jb250ZW50U2Nyb2xsQnRuJylcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3aW5kb3cudGhlbWUuaWNvbnMuYXJyb3dSaWdodFNtYWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJ0aWNsZV9fY29udGVudC10YWJsZV9faXRlbV9fdGV4dFwiPiR7aC50ZXh0Q29udGVudH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuXG4gICAgICAgICAgICBjb250ZW50VGFibGUuYXBwZW5kQ2hpbGQoYnRuKVxuXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzY3JvbGxUb0hlYWRpbmcoaCkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29udGVudFRhYmxlLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY3JvbGxUb0hlYWRpbmcoaGVhZGluZykge1xuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0taGVhZGVyLWhlaWdodCcpLnJlcGxhY2UoJ3B4JywgJycpKVxuICAgICAgICBzbW9vdGhTY3JvbGwoaGVhZGluZywgeyBvZmZzZXQ6IC1oZWFkZXJIZWlnaHQgLSAzMCB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVBvbGxzKCkge1xuICAgICAgICAvLyBDcmVhdGUgcG9sbHNcbiAgICAgICAgY29uc3QgeyBwb2xsSXRlbXMgfSA9IHdpbmRvd1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgRmlyZWJhc2UgZGF0YWJhc2VcbiAgICAgICAgY29uc3QgY29uZmlnID0gd2luZG93LnRoZW1lLmNvbmZpZy5maXJlYmFzZVxuICAgICAgICBmaXJlYmFzZS5pbml0aWFsaXplQXBwKGNvbmZpZylcblxuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IGZpcmViYXNlLmRhdGFiYXNlKClcblxuICAgICAgICBsb29waWZ5KHBvbGxFbGVtZW50cykuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IHAuZGF0YXNldFxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBvbGxJdGVtcy5maW5kKGkgPT4gaS5xdWVzdGlvbklkID09PSBpZClcblxuICAgICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm5cblxuICAgICAgICAgICAgcC5kYXRhc2V0LnF1ZXN0aW9uSWQgPSBpdGVtLnF1ZXN0aW9uSWRcbiAgICAgICAgICAgIHAuZGF0YXNldC5kYXRhYmFzZUlkID0gYCR7aXRlbS5kYXRhYmFzZUlkfWBcbiAgICAgICAgICAgIHAuZGF0YXNldC50eXBlID0gaXRlbS50eXBlXG5cbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlX19wb2xsX19jb29raWUtbm90aWNlIGpzLWNvb2tpZU5vdGljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4ke3dpbmRvdy50aGVtZS5zdHJpbmdzLmxheW91dC5hY2NlcHRDb29raWVzRnVuY3Rpb25hbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZV9fcG9sbF9fY29udGVudC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGl0bGUgdGl0bGUtLXNtYWxsXCI+JHtpdGVtLnF1ZXN0aW9ufTwvcD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhcnRpY2xlX19wb2xsX19saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2l0ZW0uYW5zd2Vycy5tYXAoKGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFydGljbGVfX3BvbGxfX2l0ZW0ganMtYW5zd2VyXCIgZGF0YS12YWx1ZT1cIiR7aW5kZXh9XCIgZGF0YS1pbmRleD1cIiR7aW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4ke2F9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGVfX3BvbGxfX2l0ZW1fX3BlcmNlbnQgaXMtaGlkZGVuIGpzLXBlcmNlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJqcy1wZXJjZW50VmFsXCI+MDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImN0YSBjdGEtLWZpbGxlZC1kYXJrIGpzLXN1Ym1pdEJ0blwiPiR7c3RyaW5ncy52b3RlfTwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXJ0aWNsZV9fcG9sbF9fY291bnQgaXMtaGlkZGVuIGpzLXZvdGVDb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtzdHJpbmdzLnZvdGVDb3VudH06IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwianMtdm90ZUNvdW50VmFsXCI+P
385C9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuXG4gICAgICAgICAgICBpbml0UG9sbEVsZW1lbnQocClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBJbml0aWFsaXplIHBvbGwgZWxlbWVudCAoZmV0Y2ggZGF0YWJhc2UgKyB1cGRhdGUgcG9sbCwgY3JlYXRlIGV2ZW50IGxpc3RlbmVycywgZXRjLilcbiAgICAgICAgZnVuY3Rpb24gaW5pdFBvbGxFbGVtZW50KGVsKSB7XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXN0aW9uSWQgfSA9IGVsLmRhdGFzZXRcbiAgICAgICAgICAgIGNvbnN0IHsgYW5zd2VyOiBhbnN3ZXJzLCBzdWJtaXRCdG4sIGNvb2tpZU5vdGljZSB9ID0gemVsZWt0b3IoZWwpXG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHVzZXIgYWxyZWFkeSB2b3RlZFxuICAgICAgICAgICAgLy8gSWYgeWVzLCBnZXQgcmVzdWx0cyBhbmQgZGlzYWJsZSBwb2xsXG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5Vm90ZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgaGFpcmx1c3RQb2xsXyR7cXVlc3Rpb25JZH1gKVxuICAgICAgICAgICAgaWYgKGFscmVhZHlWb3RlZCkgZ2V0UmVzdWx0cyhlbClcblxuXG4gICAgICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICBsb29waWZ5KGFuc3dlcnMpLmZvckVhY2goYSA9PiB7XG4gICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNlbGVjdEFuc3dlcihhLCBlbCkpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzdWJtaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzdWJtaXRWb3RlKGVsKSlcbiAgICAgICAgICAgIGNvb2tpZU5vdGljZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuQ29va2llU2NyaXB0Py5pbnN0YW5jZT8uc2hvdz8uKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNlbGVjdEFuc3dlcihhbnN3ZXIsIHBvbGxFbCkge1xuICAgICAgICAgICAgaWYgKHBvbGxFbC5kYXRhc2V0LnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFsbEFuc3dlcnMgfSA9IHplbGVrdG9yKHBvbGxFbClcbiAgICAgICAgICAgICAgICBsb29waWZ5KGFsbEFuc3dlcnMpLmZvckVhY2goYSA9PiBhLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpKVxuICAgICAgICAgICAgICAgIGFuc3dlci5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsRWwuZGF0YXNldC50eXBlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgYW5zd2VyLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWFjdGl2ZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzdWJtaXRWb3RlKHBvbGxFbCkge1xuICAgICAgICAgICAgY29uc3QgeyBxdWVzdGlvbklkLCBkYXRhYmFzZUlkIH0gPSBwb2xsRWwuZGF0YXNldFxuICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFuc3dlcnMgfSA9IHplbGVrdG9yKHBvbGxFbClcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQW5zd2VycyA9IGxvb3BpZnkoYW5zd2VycykuZmlsdGVyKGEgPT4gYS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKVxuXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkQW5zd2Vycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ1BsZWFzZSBzZWxlY3QgYW4gYW5zd2VyJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGhhaXJsdXN0UG9sbF8ke3F1ZXN0aW9uSWR9YCwgYCR7bG9vcGlmeShzZWxlY3RlZEFuc3dlcnMubWFwKGEgPT4gYS5kYXRhc2V0LmluZGV4KS5qb2luKCcsJykpfWApXG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBzZWxlY3RlZCBhbnN3ZXJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGtleSBpbiBkYXRhYmFzZSBhbmQgc2V0IGl0IHRvIGFuc3dlciB2YWx1ZVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQW5zd2Vycy5mb3JFYWNoKGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQb3N0S2V5ID0gZGF0YWJhc2UucmVmKGRhdGFiYXNlSWQpLnB1c2goKVxuICAgICAgICAgICAgICAgICAgICBuZXdQb3N0S2V5LnNldChhLmRhdGFzZXQudmFsdWUpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vIEdldCByZXN1bHRzIGFuZCBkaXNhYmxlIHZvdGVcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKHBvbGxFbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldFJlc3VsdHMocG9sbEVsKSB7XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXN0aW9uSWQsIGRhdGFiYXNlSWQgfSA9IHBvbGxFbC5kYXRhc2V0XG4gICAgICAgICAgICBjb25zdCB7IHN1Ym1pdEJ0biB9ID0gemVsZWt0b3IocG9sbEVsKVxuXG4gICAgICAgICAgICAvLyBMb2FkIHVzZXIgYW5zd2VycyBmcm9tIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgY29uc3QgdXNlckFuc3dlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgaGFpcmx1c3RQb2xsXyR7cXVlc3Rpb25JZH1gKS5zcGxpdCgnLCcpXG5cbiAgICAgICAgICAgIC8vIE1hcmsgdGhlIGFuc3dlcnMgdGhhdCB0aGUgdXNlciBzZWxlY3RlZCAoYW5kIHVubWFyayB0aGUgcmVzdClcbiAgICAgICAgICAgIGNvbnN0IHsgYW5zd2VyOiBhbnN3ZXJzIH0gPSB6ZWxla3Rvcihwb2xsRWwpXG4gICAgICAgICAgICBjb25zdCBtYXJrZWRBbnN3ZXJzID0gbG9vcGlmeShhbnN3ZXJzKS5maWx0ZXIoYSA9PiB1c2VyQW5zd2Vycy5maW5kKHUgPT4gYS5kYXRhc2V0LmluZGV4ID09PSB1KSlcbiAgICAgICAgICAgIG1hcmtlZEFuc3dlcnMuZm9yRWFjaChhID0+IGEuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJykpXG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYW5zd2VycyB0byBwcmV2ZW50IHVzZXIgZnJvbSBjaGFuZ2luZyBtYXJrc1xuICAgICAgICAgICAgYW5zd2Vycy5mb3JFYWNoKGEgPT4gYS5jbGFzc0xpc3QuYWRkKCdpcy1kaXNhYmxlZCcpKVxuXG4gICAgICAgICAgICAvLyBMb2FkIGFsbCBhbnN3ZXJzIGZyb20gZGF0YWJhc2VcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGRhdGFiYXNlLnJlZihkYXRhYmFzZUlkKVxuICAgICAgICAgICAgcmVmLm9uKCd2YWx1ZScsIGRhdGEgPT4gdXBkYXRlUG9sbChwb2xsRWwsIE9iamVjdC52YWx1ZXMoZGF0YS52YWwoKSkpKVxuXG4gICAgICAgICAgICAvLyBIaWRlIHN1Ym1pdCBidXR0b25cbiAgICAgICAgICAgI
385HN1Ym1pdEJ0bi5jbGFzc0xpc3QuYWRkKCdpcy1oaWRkZW4nKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlUG9sbChwb2xsRWwsIGRhdGFiYXNlVmFscykge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGFuc3dlcnMgd2l0aCBwZXJjZW50YWdlc1xuICAgICAgICAgICAgY29uc3QgeyBhbnN3ZXI6IGFuc3dlcnMsIHZvdGVDb3VudCwgdm90ZUNvdW50VmFsIH0gPSB6ZWxla3Rvcihwb2xsRWwpXG5cbiAgICAgICAgICAgIGxvb3BpZnkoYW5zd2VycykuZm9yRWFjaChhID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZGF0YWJhc2VWYWxzLmZpbHRlcih2ID0+IHYgPT09IGEuZGF0YXNldC52YWx1ZSlcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5yb3VuZChtYXRjaGVzLmxlbmd0aCAvIGRhdGFiYXNlVmFscy5sZW5ndGggKiAxMDApXG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHBlcmNlbnQsIHBlcmNlbnRWYWwgfSA9IHplbGVrdG9yKGEpXG4gICAgICAgICAgICAgICAgcGVyY2VudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHsgdmFsOiAwIH1cbiAgICAgICAgICAgICAgICBnc2FwLnRvKGNvdW50ZXIsIHsgZHVyYXRpb246IDIsIHZhbDogcGVyY2VudGFnZSwgb25VcGRhdGU6IHNldFZhbCB9KVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNldFZhbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZ3NhcC51dGlscy5zbmFwKDEsIGNvdW50ZXIudmFsKVxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50VmFsLnRleHRDb250ZW50ID0gdmFsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgLy8gU2hvdyB0b3RhbCBhbW91bnQgb2Ygdm90ZXNcbiAgICAgICAgICAgIHZvdGVDb3VudFZhbC50ZXh0Q29udGVudCA9IGRhdGFiYXNlVmFscy5sZW5ndGhcbiAgICAgICAgICAgIHZvdGVDb3VudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKVxuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlUG9sbHMoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRyYWNraW5nQ29uc2VudCgpIHtcbiAgICAgICAgY2FuVHJhY2tGdW5jdGlvbmFsID0gaGFzQ29uc2VudCgnY29va2llX2NhdF9mdW5jdGlvbmFsJylcbiAgICAgICAgdG9nZ2xlUG9sbHMoKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVBvbGxzKCkge1xuICAgICAgICBpZiAoY2FuVHJhY2tGdW5jdGlvbmFsKSB7XG4gICAgICAgICAgICBsb29waWZ5KHBvbGxFbGVtZW50cykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1oaWRkZW4nKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvb3BpZnkocG9sbEVsZW1lbnRzKS5mb3JFYWNoKGVsID0+IGVsLmNsYXNzTGlzdC5hZGQoJ2lzLWhpZGRlbicpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdEJlZm9yZUFmdGVyU2xpZGVycygpIHtcbiAgICAgICAgbG9vcGlmeShiZWZvcmVBZnRlclNsaWRlcldyYXBwZXJzKS5mb3JFYWNoKHcgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzbGlkZXJFbCwgcHJldiwgbmV4dCB9ID0gemVsZWt0b3IodylcbiAgICAgICAgICAgIGFkZENsYXNzZXMoc2xpZGVyRWwpXG5cbiAgICAgICAgICAgIGNvbnN0IHNsaWRlciA9IG5ldyBLZWVuU2xpZGVyKHNsaWRlckVsLCB7XG4gICAgICAgICAgICAgICAgc2xpZGVzUGVyVmlldzogMSxcbiAgICAgICAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA3MDAsXG4gICAgICAgICAgICAgICAgYnJlYWtwb2ludHM6IHtcbiAgICAgICAgICAgICAgICAgICAgJyhtYXgtd2lkdGg6IDEwMjRweCknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNQZXJWaWV3OiAxLjQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiBpbnN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdFNsaWRlcldyYXBwZXIodylcbiAgICAgICAgICAgICAgICAgICAgaW5pdEFycm93cyhpbnN0LCBwcmV2LCBuZXh0KVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzbGlkZUNoYW5nZWQ6IGluc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVTbGlkZXMoc2xpZGVyRWwsIGluc3QpIHtcbiAgICAgICAgY29uc3QgeyByZWxhdGl2ZVNsaWRlIH0gPSBpbnN0LmRldGFpbHMoKVxuICAgICAgICBjb25zdCB7IHNsaWRlOiBzbGlkZXMgfSA9IHplbGVrdG9yKHNsaWRlckVsKVxuXG4gICAgICAgIGxvb3BpZnkoc2xpZGVzKS5mb3JFYWNoKChzbGlkZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHNsaWRlLmNsYXNzTGlzdFtpbmRleCA9PT0gcmVsYXRpdmVTbGlkZSA/ICdhZGQnIDogJ3JlbW92ZSddKCdpcy1hY3RpdmUnKVxuICAgICAgICB9KVxuICAgIH1cbn0pXG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJzbW9vdGhTY3JvbGwiLCJ3cmFwSUZyYW1lcyIsImxvYWRTY3JpcHQiLCJjb25zZW50RXZlbnRzIiwiaGFzQ29uc2VudCIsImFkZENsYXNzZXMiLCJpbml0U2xpZGVyV3JhcHBlciIsImluaXRBcnJvd3MiLCJLZWVuU2xpZGVyIiwi
vendor: 5,594 bytes, lines 385-396
385Z3NhcCIsImNvbXBvbmVudCIsIm5vZGUiLCJjdHgiLCJfemVsZWt0b3IiLCJ6ZWxla3RvciIsIm1haW5Db250ZW50IiwiY29udGVudFRhYmxlIiwicG9sbEVsZW1lbnRzIiwicG9sbCIsImJlZm9yZUFmdGVyU2xpZGVyV3JhcHBlcnMiLCJiZWZvcmVBZnRlclNsaWRlcldyYXBwZXIiLCJzdHJpbmdzIiwid2luZG93IiwidGhlbWUiLCJibG9nIiwiY2FuVHJhY2tGdW5jdGlvbmFsIiwiZm9yRWFjaCIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVUcmFja2luZ0NvbnNlbnQiLCJjcmVhdGVDb250ZW50VGFibGUiLCJvYnNlcnZlciIsIkludGVyc2VjdGlvbk9ic2VydmVyIiwiZW50cmllcyIsIl9yZWYiLCJfY2FsbGVlIiwiZW50cnkiLCJfY29udGV4dCIsImlzSW50ZXJzZWN0aW5nIiwiY3JlYXRlUG9sbHMiLCJkaXNjb25uZWN0IiwiX3giLCJsb29waWZ5Iiwib2JzZXJ2ZSIsImF3YWl0VmVuZG9yU2NyaXB0IiwiaW5pdEJlZm9yZUFmdGVyU2xpZGVycyIsIl96ZWxla3RvcjIiLCJoZWFkaW5ncyIsImhlYWRpbmciLCJyZW1vdmUiLCJoIiwiaW5kZXgiLCJidG4iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJpbm5lckhUTUwiLCJjb25jYXQiLCJpY29ucyIsImFycm93UmlnaHRTbWFsbCIsInRleHRDb250ZW50IiwiYXBwZW5kQ2hpbGQiLCJzY3JvbGxUb0hlYWRpbmciLCJoZWFkZXJIZWlnaHQiLCJwYXJzZUludCIsImdldENvbXB1dGVkU3R5bGUiLCJyb290IiwiZ2V0UHJvcGVydHlWYWx1ZSIsInJlcGxhY2UiLCJvZmZzZXQiLCJfd2luZG93IiwicG9sbEl0ZW1zIiwiY29uZmlnIiwiZmlyZWJhc2UiLCJpbml0aWFsaXplQXBwIiwiZGF0YWJhc2UiLCJpZCIsImRhdGFzZXQiLCJpdGVtIiwiZmluZCIsInF1ZXN0aW9uSWQiLCJkYXRhYmFzZUlkIiwidHlwZSIsImxheW91dCIsImFjY2VwdENvb2tpZXNGdW5jdGlvbmFsIiwicXVlc3Rpb24iLCJhbnN3ZXJzIiwibWFwIiwiam9pbiIsInZvdGUiLCJ2b3RlQ291bnQiLCJpbml0UG9sbEVsZW1lbnQiLCJlbCIsIl96ZWxla3RvcjMiLCJhbnN3ZXIiLCJzdWJtaXRCdG4iLCJjb29raWVOb3RpY2UiLCJhbHJlYWR5Vm90ZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiZ2V0UmVzdWx0cyIsInNlbGVjdEFuc3dlciIsInN1Ym1pdFZvdGUiLCJfd2luZG93JENvb2tpZVNjcmlwdCIsIl93aW5kb3ckQ29va2llU2NyaXB0JCIsIkNvb2tpZVNjcmlwdCIsImluc3RhbmNlIiwic2hvdyIsInBvbGxFbCIsIl96ZWxla3RvcjQiLCJhbGxBbnN3ZXJzIiwidG9nZ2xlIiwiX3BvbGxFbCRkYXRhc2V0IiwiX3plbGVrdG9yNSIsInNlbGVjdGVkQW5zd2VycyIsImZpbHRlciIsImNvbnRhaW5zIiwiYWxlcnQiLCJzZXRJdGVtIiwibmV3UG9zdEtleSIsInJlZiIsInB1c2giLCJzZXQiLCJfcG9sbEVsJGRhdGFzZXQyIiwiX3plbGVrdG9yNiIsInVzZXJBbnN3ZXJzIiwic3BsaXQiLCJfemVsZWt0b3I3IiwibWFya2VkQW5zd2VycyIsIm9uIiwiZGF0YSIsInVwZGF0ZVBvbGwiLCJ2YWx1ZXMiLCJ2YWwiLCJkYXRhYmFzZVZhbHMiLCJfemVsZWt0b3I4Iiwidm90ZUNvdW50VmFsIiwibWF0Y2hlcyIsInBlcmNlbnRhZ2UiLCJNYXRoIiwicm91bmQiLCJfemVsZWt0b3I5IiwicGVyY2VudCIsInBlcmNlbnRWYWwiLCJjb3VudGVyIiwidG8iLCJkdXJhdGlvbiIsIm9uVXBkYXRlIiwic2V0VmFsIiwidXRpbHMiLCJzbmFwIiwidG9nZ2xlUG9sbHMiLCJfemVsZWt0b3IwIiwic2xpZGVyRWwiLCJwcmV2IiwibmV4dCIsInNsaWRlciIsInNsaWRlc1BlclZpZXciLCJsb29wIiwiYnJlYWtwb2ludHMiLCJjZW50ZXJlZCIsImNyZWF0ZWQiLCJpbnN0IiwidXBkYXRlU2xpZGVzIiwic2xpZGVDaGFuZ2VkIiwiX2luc3QkZGV0YWlscyIsImRldGFpbHMiLCJyZWxhdGl2ZVNsaWRlIiwiX3plbGVrdG9yMSIsInNsaWRlcyIsInNsaWRlIl0sInNvdXJjZVJvb3QiOiIifQ== 386//# sourceURL=webpack-internal:///./src/scripts/components/blog/article-page.js 387 388}`)},"./src/scripts/components/blog/before-after-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 389/* harmony export */ __webpack_require__.d(__webpack_exports__, { 390/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 391/* harmony export */ }); 392/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"); 393/* harmony import */ var _lib_images__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images */ "./src/scripts/lib/images.js"); 394/* harmony import */ var _lib_currency__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/currency */ "./src/scripts/lib/currency.js"); 395/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js"); 396function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
396 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 397function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 398function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 399function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 400/* eslint-disable max-len */ 401 402 403 404 405/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) { 406 var ENDPOINT = '/blogs/before-after?view=data_before-after'; 407 var inner = node.querySelector('.js-inner'); 408 var list = node.querySelector('.js-list'); 409 var onlyHandle = node.dataset.onlyHandle; 410 var pageSize = parseInt(node.dataset.pageSize); 411 var pages = []; 412 var strings = window.theme.strings.reviews; 413 init(); 414 function init() { 415 return _init.apply(this, arguments); 416 } 417 function _init() { 418 _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 419 var items, item; 420 return _regenerator().w(function (_context) { 421 while (1) switch (_context.n) { 422 case 0: 423 _context.n = 1; 424 return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_3__["default"])(ENDPOINT); 425 case 1: 426 items = _context.v; 427 if (!onlyHandle) { 428 _context.n = 2; 429 break; 430 } 431 item = items.find(function (i) { 432 return i.handle === onlyHandle; 433 }); 434 renderItems([item]); 435 _context.n = 4; 436 break; 437 case 2: 438 while (items.length) { 439 pages.push(items.splice(0, pageSize)); 440 } 441 _context.n = 3; 442 return renderContent(); 443 case 3: 444 if (pages.length) { 445 createPagination(); 446 } 447 case 4: 448 window.app.mount(); 449 case 5: 450 return _context.a(2); 451 } 452 }, _callee); 453 })); 454 return _init.apply(this, arguments); 455 } 456 function renderContent() { 457 return _renderContent.apply(this, arguments); 458 } 459 function _renderContent() { 460 _renderContent = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() { 461 return _regenerator().w(function (_context2) { 462 while (1) switch (_context2.n) { 463 case 0: 464 _context2.n = 1; 465 return renderItems(pages.splice(0, 1)[0]); 466 case 1: 467 return _context2.a(2); 468 } 469 }, _callee2); 470 })); 471 return _renderContent.apply(this, arguments); 472 } 473 function renderItems(_x) { 474 return _renderItems.apply(this, arguments); 475 } 476 function _renderItems() { 477 _renderItems = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(items) { 478 return _regenerator().w(function (_context4) { 479 while (1) switch (_context4.n) { 480 case 0: 481 _context4.n = 1; 482 return Promise.all(items.map(function (item) { 483 // eslint-disable-next-line no-async-promise-executor 484 return new Promise(/*#__PURE__*/function () { 485 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(resolve) { 486 var _products$2; 487 var products, div; 488 return _regenerator().w(function (_context3) { 489 while (1) switch (_context3.n) { 490 case 0: 491 _context3.n = 1; 492 return Promise.all(item.productHandles.map(function (handle) { 493 return fetch("/products/".concat(handle, ".js")).then(function (response) { 494 return response.json(); 495 }); 496 })); 497 case 1: 498 products = _context3.v; 499 div = document.createElement('div'); 500 list.appendChild(div); 501 div.outerHTML = "<li class=\\"before-after__content\\">\\n <div class=\\"before-after__image-slider\\">\\n <figure class=\\"before-after__image-slider__slide is-active\\">\\n <div class=\\"image-wrapper\\">\\n ".concat(function () { 502 var imgSrc = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1512x') : ''; 503 var imgSrcLazy = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1x') : ''; 504 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">"); 505 }(), "\\n\\n <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n </div>\\n </figure>\\n </div>\\n\\n <article class=\\"before-after__content-container\\">\\n <div class=\\"before-after__content-item is-active\\">\\n <p class=\\"before-after__content-item__title\\">").concat(item.title, "</p>\\n <p class=\\"before-after__content-item__quote\\">").concat(item.quote, "</p>\\n\\n <div class=\\"faithpilot\\">\\n <div class=\\"faithpilot__stars\\">\\n ").concat(function () { 506 var stars = parseInt(item.stars); 507 var html = window.theme.icons.faithpilotStarDark.repeat(stars); 508 if (stars < 5) { 509 for (var i = 0; i < 5 - stars; i++) { 510 html += window.theme.icons.faithpilotStarVoid; 511 } 512 } 513 return html; 514 }(), "\\n </div>\\n\\n ").concat(function () { 515 var date = item.date.length ? new Date(item.date) : null; 516 var options = { 517 year: 'numeric', 518 month: 'long', 519 day: 'numeric' 520 }; 521 if (date) date = date.toLocaleDateString(window.theme.config.locale, options); 522 return "<div class=\\"faithpilot__customer\\">\\n ".concat(window.theme.config.showFaithpilotLogo ? window.theme.faithpilot.logo : '', "\\n ").concat(date ? "<span>
522".concat(date, "</span>") : '', "\\n </div>"); 523 }(), "\\n </div>\\n\\n <div class=\\"before-after__content-item__product\\"").concat(products.length > 1 ? ' data-component="modalSlidein"' : '', ">\\n <figure class=\\"before-after__content-item__product__image\\">\\n ").concat(function (_products$) { 524 var imgUrl = (_products$ = products[0]) === null || _products$ === void 0 ? void 0 : _products$.images[0]; 525 var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '80x') : ''; 526 var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : ''; 527 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">"); 528 }(), "\\n\\n <a href=\\"").concat((_products$2 = products[0]) === null || _products$2 === void 0 ? void 0 : _products$2.url, "\\" class=\\"before-after__content-item__image-link\\"></a>\\n </figure>\\n\\n ").concat(function () { 529 if (products.length > 1) { 530 if (!products[1]) return ''; 531 return "<figure class=\\"before-after__content-item__product__image\\">\\n ".concat(function () { 532 var imgUrl = products[1].images[0]; 533 var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '80x') : ''; 534 var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : ''; 535 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">\\n ").concat(window.theme.icons.plusMinus); 536 }(), "\\n\\n <button type=\\"button\\" class=\\"js-openBtn\\"></button>\\n </figure>"); 537 } 538 return ''; 539 }(), "\\n\\n <div class=\\"before-after__content-item__product__text\\">\\n ").concat(function () { 540 if (products.length > 1) { 541 return "<p>".concat(item.productText.replace('[product_title]', "<button type=\\"button\\" class=\\"js-openBtn\\">".concat(strings.multipleProducts.replace('%count%', products.length), "</button>")), "</p>\\n <button type=\\"button\\" class=\\"js-openBtn\\">").concat(strings.viewAllProducts, "</button>"); 542 } else if (products[0]) { 543 var _products$3 = products[0], 544 title = _products$3.title, 545 url = _products$3.url; 546 return "<p>".concat(item.productText.replace('[product_title]', "<a href=\\"".concat(url, "\\">").concat(title, "</a>")), "</p>"); 547 } 548 }(), "\\n </div>\\n\\n ", "\\n ").concat(function () { 549 return "<div class=\\"product-inspiration__modal modal-slidein js-modal\\" data-component=\\"inspirationBuyFlow\\">\\n <div class=\\"product-inspiration__modal__main modal-slidein__main\\">\\n <button type=\\"button\\" class=\\"back-button js-closeBtn\\">\\n ".concat(window.theme.icons.arrowLeft, "\\n <span class=\\"back-button__text\\">").concat(window.theme.strings.layout.goBack, "</span>\\n </button>\\n\\n <div class=\\"product-inspiration__modal__images\\">\\n <div class=\\"product-inspiration__modal__images__inner\\">\\n ").concat(function () { 550 var imgUrl = item.imageUrl; 551 var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1080x') : ''; 552 var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : ''; 553 return "<div class=\\"image-wrapper before-after\\">\\n <img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">\\n <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n </div>"); 554 }(), "\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\"modal-slidein__inner\\">\\n <header class=\\"modal-slidein__header\\">\\n <p class=\\"modal-slidein__title\\">").concat(window.theme.strings.reviews.usedProducts, "</p>\\n\\n <button type=\\"button\\" class=\\"modal-slidein__close-button js-closeBtn\\">
554\\n <span class=\\"modal-slidein__close-button__text\\">").concat(window.theme.strings.layout.closeText, "</span>\\n ").concat(window.theme.icons.close, "\\n </button>\\n </header>\\n\\n <div class=\\"product-inspiration__modal__products modal-slidein__content\\">\\n <ul class=\\"product-inspiration__modal__product-list grid\\">\\n ").concat(products.map(function (p) { 555 var _p$variants$find; 556 return "<li class=\\"grid__item product-item js-productItem\\" data-variant-id=\\"".concat(((_p$variants$find = p.variants.find(function (v) { 557 return v.available; 558 })) === null || _p$variants$find === void 0 ? void 0 : _p$variants$find.id) || p.variants[0].id, "\\">\\n <figure class=\\"product-item__image\\">\\n ").concat(function () { 559 var imgUrl = p.images[0]; 560 var imgSrc = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '540x') : ''; 561 var imgSrcLazy = imgUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(imgUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(imgUrl), ''), '1x') : ''; 562 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">"); 563 }(), "\\n\\n <a href=\\"").concat(p.url, "\\" class=\\"product-item__link\\"></a>\\n </figure>\\n\\n <p class=\\"product-item__title\\">\\n <a href=\\"").concat(p.url, "\\">").concat(p.title, "</a>\\n </p>\\n\\n <div class=\\"product-prices\\">\\n ").concat(function () { 564 var v = p.variants.find(function (v) { 565 return v.available; 566 }) || p.variants[0]; 567 if (v.compare_at_price && v.compare_at_price > v.price) { 568 return "<p class=\\"price price--compare\\">".concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.compare_at_price), "</p>\\n <p class=\\"price price--current\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.price), "</p>"); 569 } else { 570 return "<p class=\\"price price--current\\">".concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(v.price), "</p>"); 571 } 572 }(), "\\n </div>\\n\\n <button type=\\"button\\" class=\\"cta cta--stroked-dark js-addBtn\\">").concat(window.theme.strings.product.addToCart, "</button>\\n </li>"); 573 }).join(''), "\\n </ul>\\n\\n <div class=\\"product-inspiration__modal__add-all\\">\\n <p>").concat(window.theme.strings.inspiration.buyAllProducts.replace('%count%', products.length), "</p>\\n <button type=\\"button\\" class=\\"cta cta--filled-dark js-addAllBtn\\">").concat(window.theme.strings.product.addToCart, "</button>\\n </div>\\n </div>\\n </div>\\n </div>"); 574 }(), "\\n </div>\\n\\n <p class=\\"before-after__content-item__disclaimer\\">").concat(strings.disclaimer, "</p>\\n </div>\\n </article>\\n\\n <figure class=\\"before-after__image-container\\">\\n <div class=\\"before-after__image-container__inner\\">\\n <div class=\\"before-after__image-item is-active\\">\\n ").concat(function () { 575 var imgSrc = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '720x') : ''; 576 var imgSrcLazy = item.imageUrl ? (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(item.imageUrl.replace('_' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(item.imageUrl), ''), '1x') : ''; 577 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">"); 578 }(), "\\n\\n <div class=\\"image-badge image-badge--left\\">").concat(strings.before, "</div>\\n <div class=\\"image-badge image-badge--right\\">").concat(strings.inProgress, "</div>\\n </div>\\n </div>\\n </figure>\\n </li>"); 579 resolve(true); 580 case 2: 581 return _context3.a(2); 582 } 583 }, _callee3); 584 })); 585 return function (_x2) { 586 return _ref.apply(this, arguments); 587 }; 588 }()); 589 })); 590 case 1: 591 window.app.mount(); 592 case 2: 593 return _context4.a(2); 594 } 595 }, _callee4); 596 })); 597 return _renderItems.apply(this, arguments); 598 } 599 function createPagination() { 600 var btn = document.createElement('button'); 601 btn.classList.add('cta', 'cta--filled-dark'); 602 btn.textContent = window.theme.strings.layout.loadMore; 603 inner.appendChild(btn); 604 btn.addEventListener('click', function () { 605 renderContent(); 606 if (!pages.length) { 607 btn.remove(); 608 } 609 }); 610 } 611}));//# sourceURL=[module] 612//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvYmVmb3JlLWFmdGVyLXBhZ2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixD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TyxDQUFDLElBQUksQ0FBQztzQkFBQzt3QkFBQSxPQUFBdUQsU0FBQSxDQUFBakYsQ0FBQTtvQkFBQTtrQkFBQSxHQUFBNkUsUUFBQTtnQkFBQSxDQUNmO2dCQUFBLGlCQUFBbUUsR0FBQTtrQkFBQSxPQUFBcEUsSUFBQSxDQUFBOUMsS0FBQSxPQUFBRCxTQUFBO2dCQUFBO2NBQUEsSUFBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1VBQUE7WUFFSG9CLE1BQU0sQ0FBQ2dCLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7VUFBQztZQUFBLE9BQUFPLFNBQUEsQ0FBQXpFLENBQUE7UUFBQTtNQUFBLEdBQUF3RSxRQUFBO0lBQUEsQ0FDcEI7SUFBQSxPQUFBRCxZQUFBLENBQUF6QyxLQUFBLE9BQUFELFNBQUE7RUFBQTtFQUVELFNBQVNtQyxnQkFBZ0JBLENBQUEsRUFBRztJQUMxQixJQUFNaUYsR0FBRyxHQU
612FHMUQsUUFBUSxDQUFDQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBRTVDeUQsR0FBRyxDQUFDQyxTQUFTLENBQUNDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsa0JBQWtCLENBQUM7SUFDM0NGLEdBQUcsQ0FBQ0csV0FBVyxHQUFHbkcsTUFBTSxDQUFDQyxLQUFLLENBQUNGLE9BQU8sQ0FBQytFLE1BQU0sQ0FBQ3NCLFFBQVE7SUFDdEQ3RyxLQUFLLENBQUNpRCxXQUFXLENBQUN3RCxHQUFHLENBQUM7SUFFdEJBLEdBQUcsQ0FBQ0ssZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFlBQU07TUFDbEN2RixhQUFhLENBQUMsQ0FBQztNQUVmLElBQUksQ0FBQ2hCLEtBQUssQ0FBQzVDLE1BQU0sRUFBRTtRQUNqQjhJLEdBQUcsQ0FBQ00sTUFBTSxDQUFDLENBQUM7TUFDZDtJQUNGLENBQUMsQ0FBQztFQUNKO0FBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvY29tcG9uZW50cy9ibG9nL2JlZm9yZS1hZnRlci1wYWdlLmpzP2E2M2MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgY29tcG9uZW50IH0gZnJvbSAncGljb2FwcCc7XG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMnO1xuaW1wb3J0IHsgZm9ybWF0TW9uZXkgfSBmcm9tICdAL2xpYi9jdXJyZW5jeSc7XG5pbXBvcnQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyBmcm9tICdAL2xpYi9mZXRjaC1wYWdpbmF0ZWQtaXRlbXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQoKG5vZGUpID0+IHtcbiAgY29uc3QgRU5EUE9JTlQgPSAnL2Jsb2dzL2JlZm9yZS1hZnRlcj92aWV3PWRhdGFfYmVmb3JlLWFmdGVyJztcblxuICBjb25zdCBpbm5lciA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLWlubmVyJyk7XG4gIGNvbnN0IGxpc3QgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJy5qcy1saXN0Jyk7XG4gIGNvbnN0IHsgb25seUhhbmRsZSB9ID0gbm9kZS5kYXRhc2V0O1xuICBjb25zdCBwYWdlU2l6ZSA9IHBhcnNlSW50KG5vZGUuZGF0YXNldC5wYWdlU2l6ZSk7XG4gIGNvbnN0IHBhZ2VzID0gW107XG4gIGNvbnN0IHN0cmluZ3MgPSB3aW5kb3cudGhlbWUuc3RyaW5ncy5yZXZpZXdzO1xuXG4gIGluaXQoKTtcblxuICBhc3luYyBmdW5jdGlvbiBpbml0KCkge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyhFTkRQT0lOVCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBiZWZvcmUtYWZ0ZXIgYXJ0aWNsZSBwYWdlLFxuICAgIC8vIHdoZXJlIGl0IHNob3VsZCBvbmx5IGxvYWQgdGhlIG9uZSBpdGVtIHdpdGggdGhlIGNvcnJlY3QgaGFuZGxlXG4gICAgaWYgKG9ubHlIYW5kbGUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtcy5maW5kKChpKSA9PiBpLmhhbmRsZSA9PT0gb25seUhhbmRsZSk7XG4gICAgICByZW5kZXJJdGVtcyhbaXRlbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHBhZ2VzLnB1c2goaXRlbXMuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHJlbmRlckNvbnRlbnQoKTtcblxuICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjcmVhdGVQYWdpbmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICBhd2FpdCByZW5kZXJJdGVtcyhwYWdlcy5zcGxpY2UoMCwxKVswXSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJJdGVtcyhpdGVtcykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
612hhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IGF3YWl0IFByb21pc2UuYWxsKGl0ZW0ucHJvZHVjdEhhbmRsZXMubWFwKChoYW5kbGUpID0+IChcbiAgICAgICAgICBmZXRjaChgL3Byb2R1Y3RzLyR7aGFuZGxlfS5qc2ApLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICkpKTtcblxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGRpdi5vdXRlckhUTUwgPSBgPGxpIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9faW1hZ2Utc2xpZGVyXCI+XG4gICAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19pbWFnZS1zbGlkZXJfX3NsaWRlIGlzLWFjdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGl0ZW0uaW1hZ2VVcmwgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaXRlbS5pbWFnZVVybCksICcnKSwgJzE1MTJ4JykgOiAnJztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpdGVtLmltYWdlVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpdGVtLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGl0ZW0uaW1hZ2VVcmwpLCAnJyksICcxeCcpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBgPGltZyBzcmM9XCIke2ltZ1NyY0xhenl9XCIgZGF0YS1zcmM9XCIke2ltZ1NyY31cIiBjbGFzcz1cImxhenlsb2FkXCI+YDtcbiAgICAgICAgICAgICAgICB9KSgpfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1sZWZ0XCI+JHtzdHJpbmdzLmJlZm9yZX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtYmFkZ2UgaW1hZ2UtYmFkZ2UtLXJpZ2h0XCI+JHtzdHJpbmdzLmluUHJvZ3Jlc3N9PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9maWd1cmU+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbSBpcy1hY3RpdmVcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fdGl0bGVcIj4ke2l0ZW0udGl0bGV9PC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19xdW90ZVwiPiR7aXRlbS5xdW90ZX08L3A+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhaXRocGlsb3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFpdGhwaWxvdF9fc3RhcnNcIj5cbiAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnMgPSBwYXJzZUludChpdGVtLnN0YXJzKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSB3aW5kb3cudGhlbWUuaWNvbnMuZmFpdGhwaWxvdFN0YXJEYXJrLnJlcGVhdChzdGFycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNSAtIHN0YXJzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gd2luZG93LnRoZW1lLmljb25zLmZhaXRocGlsb3RTdGFyVm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHRtbFxuICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gaXRlbS5kYXRlLmxlbmd0aCA/IG5ldyBEYXRlKGl0ZW0uZGF0ZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9O1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0ZSkgZGF0ZSA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHdpbmRvdy50aGVtZS5jb25maWcubG9jYWxlLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuICBgPGRpdiBjbGFzcz1cImZhaXRocGlsb3RfX2N1c3RvbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmNvbmZpZy5zaG93RmFpdGhwaWxvdExvZ28gPyB3aW5kb3cudGhlbWUuZmFpdGhwaWxvdC5sb2dvIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICR7ZGF0ZSA/IGA8c3Bhbj4ke2RhdGV9PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19wcm9kdWN0XCIke3Byb2R1Y3RzLmxlbmd0aCA+IDEgPyAnIGRhdGEtY29tcG9uZW50PVwibW9kYWxTbGlkZWluXCInIDogJyd9PlxuICAgICAgICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fcHJvZHVjdF9faW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nVXJsID0gcHJvZHVjdHNbMF0/LmltYWdlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjID0gaW1nVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaW1nVXJsKSwgJycpLCAnODB4JykgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzF4JykgOiAnJztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2x
612hc3M9XCJsYXp5bG9hZFwiPmA7XG4gICAgICAgICAgICAgICAgICB9KSgpfVxuXG4gICAgICAgICAgICAgICAgICA8YSBocmVmPVwiJHtwcm9kdWN0c1swXT8udXJsfVwiIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50LWl0ZW1fX2ltYWdlLWxpbmtcIj48L2E+XG4gICAgICAgICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2R1Y3RzWzFdKSByZXR1cm4gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBgPGZpZ3VyZSBjbGFzcz1cImJlZm9yZS1hZnRlcl9fY29udGVudC1pdGVtX19wcm9kdWN0X19pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1VybCA9IHByb2R1Y3RzWzFdLmltYWdlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzgweCcpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmNMYXp5ID0gaW1nVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaW1nVXJsKSwgJycpLCAnMXgnKSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8aW1nIHNyYz1cIiR7aW1nU3JjTGF6eX1cIiBkYXRhLXNyYz1cIiR7aW1nU3JjfVwiIGNsYXNzPVwibGF6eWxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHt3aW5kb3cudGhlbWUuaWNvbnMucGx1c01pbnVzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwianMtb3BlbkJ0blwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2ZpZ3VyZT5gO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2NvbnRlbnQtaXRlbV9fcHJvZHVjdF9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPHA+JHtpdGVtLnByb2R1Y3RUZXh0LnJlcGxhY2UoJ1twcm9kdWN0X3RpdGxlXScsIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImpzLW9wZW5CdG5cIj4ke3N0cmluZ3MubXVsdGlwbGVQcm9kdWN0cy5yZXBsYWNlKCclY291bnQlJywgcHJvZHVjdHMubGVuZ3RoKX08L2J1dHRvbj5gKX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImpzLW9wZW5CdG5cIj4ke3N0cmluZ3Mudmlld0FsbFByb2R1Y3RzfTwvYnV0dG9uPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRpdGxlLCB1cmwgfSA9IHByb2R1Y3RzWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8cD4ke2l0ZW0ucHJvZHVjdFRleHQucmVwbGFjZSgnW3Byb2R1Y3RfdGl0bGVdJywgYDxhIGhyZWY9XCIke3VybH1cIj4ke3RpdGxlfTwvYT5gKX08L3A+YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSkoKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICR7LyogSWYgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHByb2R1Y3QsIGNyZWF0ZSBtb2RhbCBzbGlkZWluIHdpdGggcHVyY2hhc2UgZmxvdyAqLycnfVxuICAgICAgICAgICAgICAgICR7KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsIG1vZGFsLXNsaWRlaW4ganMtbW9kYWxcIiBkYXRhLWNvbXBvbmVudD1cImluc3BpcmF0aW9uQnV5Rmxvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbnNwaXJhdGlvbl9fbW9kYWxfX21haW4gbW9kYWwtc2xpZGVpbl9fbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYmFjay1idXR0b24ganMtY2xvc2VCdG5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmljb25zLmFycm93TGVmdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFjay1idXR0b25fX3RleHRcIj4ke3dpbmRvdy50aGVtZS5zdHJpbmdzLmxheW91dC5nb0JhY2t9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19pbWFnZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWluc3BpcmF0aW9uX19tb2RhbF9faW1hZ2VzX19pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nVXJsID0gaXRlbS5pbWFnZVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBpbWdVcmwgPyBnZXRTaXplZEltYWdlVXJsKGltZ1VybC5yZXBsYWNlKCdfJyArIGltYWdlU2l6ZShpbWdVcmwpLCAnJyksICcxMDgweCcpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzF4JykgOiAnJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
612HJldHVybiAgYDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyIGJlZm9yZS1hZnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIke2ltZ1NyY0xhenl9XCIgZGF0YS1zcmM9XCIke2ltZ1NyY31cIiBjbGFzcz1cImxhenlsb2FkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtYmFkZ2UgaW1hZ2UtYmFkZ2UtLWxlZnRcIj4ke3N0cmluZ3MuYmVmb3JlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1yaWdodFwiPiR7c3RyaW5ncy5pblByb2dyZXNzfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2hlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zbGlkZWluX190aXRsZVwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucmV2aWV3cy51c2VkUHJvZHVjdHN9PC9wPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2Nsb3NlLWJ1dHRvbiBqcy1jbG9zZUJ0blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vZGFsLXNsaWRlaW5fX2Nsb3NlLWJ1dHRvbl9fdGV4dFwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmNsb3NlVGV4dH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7d2luZG93LnRoZW1lLmljb25zLmNsb3NlfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1pbnNwaXJhdGlvbl9fbW9kYWxfX3Byb2R1Y3RzIG1vZGFsLXNsaWRlaW5fX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19wcm9kdWN0LWxpc3QgZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2R1Y3RzLm1hcChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8bGkgY2xhc3M9XCJncmlkX19pdGVtIHByb2R1Y3QtaXRlbSBqcy1wcm9kdWN0SXRlbVwiIGRhdGEtdmFyaWFudC1pZD1cIiR7cC52YXJpYW50cy5maW5kKHYgPT4gdi5hdmFpbGFibGUpPy5pZCB8fCBwLnZhcmlhbnRzWzBdLmlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZSBjbGFzcz1cInByb2R1Y3QtaXRlbV9faW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1VybCA9IHAuaW1hZ2VzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyYyA9IGltZ1VybCA/IGdldFNpemVkSW1hZ2VVcmwoaW1nVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGltZ1VybCksICcnKSwgJzU0MHgnKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpbWdVcmwgPyBnZXRTaXplZEltYWdlVXJsKGltZ1VybC5yZXBsYWNlKCdfJyArIGltYWdlU2l6ZShpbWdVcmwpLCAnJyksICcxeCcpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2xhc3M9XCJsYXp5bG9hZFwiPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiR7cC51cmx9XCIgY2xhc3M9XCJwcm9kdWN0LWl0ZW1fX2xpbmtcIj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZ3VyZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcm9kdWN0LWl0ZW1fX3Rp
612dGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIke3AudXJsfVwiPiR7cC50aXRsZX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXByaWNlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHAudmFyaWFudHMuZmluZCh2ID0+IHYuYXZhaWxhYmxlKSB8fCBwLnZhcmlhbnRzWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZV9hdF9wcmljZSAmJiB2LmNvbXBhcmVfYXRfcHJpY2UgPiB2LnByaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGA8cCBjbGFzcz1cInByaWNlIHByaWNlLS1jb21wYXJlXCI+JHtmb3JtYXRNb25leSh2LmNvbXBhcmVfYXRfcHJpY2UpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwcmljZSBwcmljZS0tY3VycmVudFwiPiR7Zm9ybWF0TW9uZXkodi5wcmljZSl9PC9wPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPHAgY2xhc3M9XCJwcmljZSBwcmljZS0tY3VycmVudFwiPiR7Zm9ybWF0TW9uZXkodi5wcmljZSl9PC9wPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3RhIGN0YS0tc3Ryb2tlZC1kYXJrIGpzLWFkZEJ0blwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnR9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJycpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtaW5zcGlyYXRpb25fX21vZGFsX19hZGQtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiR7d2luZG93LnRoZW1lLnN0cmluZ3MuaW5zcGlyYXRpb24uYnV5QWxsUHJvZHVjdHMucmVwbGFjZSgnJWNvdW50JScsIHByb2R1Y3RzLmxlbmd0aCl9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImN0YSBjdGEtLWZpbGxlZC1kYXJrIGpzLWFkZEFsbEJ0blwiPiR7d2luZG93LnRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnR9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19jb250ZW50LWl0ZW1fX2Rpc2NsYWltZXJcIj4ke3N0cmluZ3MuZGlzY2xhaW1lcn08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FydGljbGU+XG5cbiAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiYmVmb3JlLWFmdGVyX19pbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtYWZ0ZXJfX2ltYWdlLWNvbnRhaW5lcl9faW5uZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJlZm9yZS1hZnRlcl9faW1hZ2UtaXRlbSBpcy1hY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAkeygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBpdGVtLmltYWdlVXJsID8gZ2V0U2l6ZWRJbWFnZVVybChpdGVtLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGl0ZW0uaW1hZ2VVcmwpLCAnJyksICc3MjB4JykgOiAnJ1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW1nU3JjTGF6eSA9IGl0ZW0uaW1hZ2VVcmwgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaXRlbS5pbWFnZVVybCksICcnKSwgJzF4JykgOiAnJ1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8aW1nIHNyYz1cIiR7aW1nU3JjTGF6eX1cIiBkYXRhLXNyYz1cIiR7aW1nU3JjfVwiIGNsYXNzPVwibGF6eWxvYWRcIj5gXG4gICAgICAgICAgICAgICAgfSkoKX1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1iYWRnZSBpbWFnZS1iYWRnZS0tbGVmdFwiPiR7c3RyaW5ncy5iZWZvcmV9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWJhZGdlIGltYWdlLWJhZGdlLS1yaWdodFwiPiR7c3RyaW5ncy5pblByb2dyZXNzfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZmlndXJlPlxuICAgICAgICA8L2xpPmBcblxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUGFnaW5hdGlvbigpIHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdjdGEnLCdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsImNvbXBvbmVudCIsImdldFNpemVkSW1hZ2VVcmwiLCJpbWFnZVNpemUiLCJmb3JtYXRNb25leSIsImZldGNoUGFnaW5hdGVkSXRlbXMiLCJub2RlIiwiRU5EUE9JTlQiLCJpbm5lciIsInF1ZXJ5U2VsZWN0b3IiLCJsaXN0Iiwib25seUhhbmRsZSIsImRhdGFzZXQiLCJwYWdlU2l6ZSIsInBhcnNlSW50IiwicGFnZXMiLCJzdHJpbmdzIiwid2luZG93IiwidGhlbWUiLCJyZXZpZXdzIiwiaW5pdCIsIl9pbml0IiwiX2NhbGxlZSIsIml0ZW1zIiwiaXRlbSIsIl9jb250ZXh0IiwiZmluZCIsImhhbmRsZSIsInJlbmRlckl0ZW1zIiwicHVzaCIsInNwbGljZSIsInJlbmRlckNvbnRlbnQiLCJjcmVhdGVQYWdpbmF0aW9uIiwiYXBwIiwibW91bnQiLCJfcmVuZGVyQ29udGVudCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiX3giLCJfcmVuZGVySXRlbXMiLCJfY2FsbGVlNCIsIl9jb250ZXh0NCIsImFsbCIsIm1hcCIsIl9yZWYiLCJfY2FsbGVlMyIsIl9wcm9kdWN0cyQyIiwicHJvZHVjdHMiLCJkaXYiLCJfY29udGV4dDMiLCJwcm9kdWN0SGFuZGxlcyIsImZldGNoIiwiY29uY2F0IiwicmVzcG9uc2UiLCJqc29uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJpbWdTcmMiLCJpbWFnZVVybCIsInJlcGxhY2UiLCJpbWdTcmNMYXp5IiwiYmVmb3JlIiwiaW5Qcm9ncmVzcyIsInRpdGxlIiwicXVvdGUiLCJzdGFycyIsImh0bWwiLCJpY29ucyIsImZhaXRocGlsb3RTdGFyRGFyayIsInJlcGVhdCIsImZhaXRocGlsb3RTdGFyVm9pZCIsImRhdGUiLCJEYXRlIiwib3B0aW9ucyIsInllYXIiLCJtb250aCIsImRheSIsInRvTG9jYWxlRGF0ZVN0cmluZyIsImNvbmZpZyIsImxvY2FsZSIsInNob3dGYWl0aHBpbG90TG9nbyIsImZhaXRocGlsb3QiLCJsb2dvIiwiX3Byb2R1Y3RzJCIsImltZ1VybCIsImltYWdlcyIsInVybCIsInBsdXNNaW51cyIsInByb2R1Y3RU
612ZXh0IiwibXVsdGlwbGVQcm9kdWN0cyIsInZpZXdBbGxQcm9kdWN0cyIsIl9wcm9kdWN0cyQzIiwiYXJyb3dMZWZ0IiwibGF5b3V0IiwiZ29CYWNrIiwidXNlZFByb2R1Y3RzIiwiY2xvc2VUZXh0IiwiY2xvc2UiLCJfcCR2YXJpYW50cyRmaW5kIiwidmFyaWFudHMiLCJhdmFpbGFibGUiLCJpZCIsImNvbXBhcmVfYXRfcHJpY2UiLCJwcmljZSIsInByb2R1Y3QiLCJhZGRUb0NhcnQiLCJqb2luIiwiaW5zcGlyYXRpb24iLCJidXlBbGxQcm9kdWN0cyIsImRpc2NsYWltZXIiLCJfeDIiLCJidG4iLCJjbGFzc0xpc3QiLCJhZGQiLCJ0ZXh0Q29udGVudCIsImxvYWRNb3JlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSJdLCJzb3VyY2VSb290IjoiIn0= 613//# sourceURL=webpack-internal:///./src/scripts/components/blog/before-after-page.js 614 615}`)},"./src/scripts/components/blog/faithpilot-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 616/* harmony export */ __webpack_require__.d(__webpack_exports__, { 617/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 618/* harmony export */ }); 619/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"); 620/* harmony import */ var _lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/faithpilot */ "./src/scripts/lib/faithpilot.js"); 621/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js"); 622function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 623function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 624function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 625function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 626 627 628 629/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) { 630 var ENDPOINT = '/blogs/reviews?view=data_faithpilot'; 631 var inner = node.querySelector('.js-inner'); 632 var list = node.querySelector('.js-list'); 633 var onlyHandle = node.dataset.onlyHandle; 634 var pageSize = parseInt(node.dataset.pageSize); 635 var pages = []; 636 var renderItems = function renderItems() { 637 (0,_lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__.renderFaithpilotItems)(pages.splice(0, 1)[0], list, pageSize, false); 638 }; 639 var createPagination = function createPagination() { 640 var btn = document.createElement('button'); 641 btn.classList.add('cta', 'cta--filled-dark'); 642 btn.textContent = window.theme.strings.layout.loadMore; 643 inner.appendChild(btn); 644 btn.addEventListener('click', function () { 645 renderItems(); 646 if (!pages.length) { 647 btn.remove(); 648 } 649 }); 650 }; 651 var init = /*#__PURE__*/function () { 652 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 653 var items; 654 return _regenerator().w(function (_context) { 655 while (1) switch (_context.n) { 656 case 0: 657 _context.n = 1; 658 return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__["default"])(ENDPOINT); 659 case 1: 660 items = _context.v; 661 // This is so we can use the same component on the faithpilot article page, 662 // where it should only load the one item with the correct handle 663 if (onlyHandle) { 664 (0,_lib_faithpilot__WEBPACK_IMPORTED_MODULE_1__.renderFaithpilotItems)(items.find(function (i) { 665 return i.handle === onlyHandle; 666 }), list, null, false); 667 } else { 668 while (items.length) { 669 pages.push(items.splice(0, pageSize)); 670 } 671 renderItems(); 672 if (pages.length) { 673 createPagination(); 674 } 675 } 676 case 2: 677 return _context.a(2); 678 } 679 }, _callee); 680 }));
681 return function init() { 682 return _ref.apply(this, arguments); 683 }; 684 }(); 685 init(); 686}));//# sourceURL=[module] 687//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvZmFpdGhwaWxvdC1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFB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zRUFBbUIsQ0FBQ0UsUUFBUSxDQUFDO1VBQUE7WUFBM0M2QixLQUFLLEdBQUFDLFFBQUEsQ0FBQXBFLENBQUE7WUFFWDtZQUNBO1lBQ0EsSUFBSTBDLFVBQVUsRUFBRTtjQUNkUCxzRUFBcUIsQ0FBQ2dDLEtBQUssQ0FBQ0UsSUFBSSxDQUFDLFVBQUFqRixDQUFDO2dCQUFBLE9BQUlBLENBQUMsQ0FBQ2tGLE1BQU0sS0FBSzVCLFVBQVU7Y0FBQSxFQUFDLEVBQUVELElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ3BGLENBQUMsTUFBTTtjQUNMLE9BQU8wQixLQUFLLENBQUMvRCxNQUFNLEVBQUU7Z0JBQ25CMEMsS0FBSyxDQUFDeUIsSUFBSSxDQUFDSixLQUFLLENBQUNuQixNQUFNLENBQUMsQ0FBQyxFQUFFSixRQUFRLENBQUMsQ0FBQztjQUN2QztjQUVBRyxXQUFXLENBQUMsQ0FBQztjQUViLElBQUlELEtBQUssQ0FBQzFDLE1BQU0sRUFBRTtnQkFDaEI2QyxnQkFBZ0IsQ0FBQyxDQUFDO2NBQ3BCO1lBQ0Y7VUFBQztZQUFBLE9BQUFtQixRQUFBLENBQUFuRSxDQUFBO1FBQUE7TUFBQSxHQUFBaUUsT0FBQTtJQUFBLENBQ0Y7SUFBQSxnQkFsQktGLElBQUlBLENBQUE7TUFBQSxPQUFBQyxJQUFBLENBQUFsQyxLQUFBLE9BQUFELFNBQUE7SUFBQTtFQUFBLEdBa0JUO0VBRURrQyxJQUFJLENBQUMsQ0FBQztBQUNSLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9mYWl0aHBpbG90LXBhZ2UuanM/NmUzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7
vendor: 6,328 bytes, lines 687-698
687IHJlbmRlckZhaXRocGlsb3RJdGVtcyB9IGZyb20gJ0AvbGliL2ZhaXRocGlsb3QnO1xuaW1wb3J0IGZldGNoUGFnaW5hdGVkSXRlbXMgZnJvbSAnQC9saWIvZmV0Y2gtcGFnaW5hdGVkLWl0ZW1zJztcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlKSA9PiB7XG4gIGNvbnN0IEVORFBPSU5UID0gJy9ibG9ncy9yZXZpZXdzP3ZpZXc9ZGF0YV9mYWl0aHBpbG90JztcblxuICBjb25zdCBpbm5lciA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLWlubmVyJyk7XG4gIGNvbnN0IGxpc3QgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJy5qcy1saXN0Jyk7XG5cbiAgY29uc3QgeyBvbmx5SGFuZGxlIH0gPSBub2RlLmRhdGFzZXQ7XG4gIGNvbnN0IHBhZ2VTaXplID0gcGFyc2VJbnQobm9kZS5kYXRhc2V0LnBhZ2VTaXplKTtcbiAgY29uc3QgcGFnZXMgPSBbXTtcblxuICBjb25zdCByZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICByZW5kZXJGYWl0aHBpbG90SXRlbXMocGFnZXMuc3BsaWNlKDAsMSlbMF0sIGxpc3QsIHBhZ2VTaXplLCBmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlUGFnaW5hdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcblxuICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdjdGEnLCdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bilcblxuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyhFTkRQT0lOVCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBmYWl0aHBpbG90IGFydGljbGUgcGFnZSxcbiAgICAvLyB3aGVyZSBpdCBzaG91bGQgb25seSBsb2FkIHRoZSBvbmUgaXRlbSB3aXRoIHRoZSBjb3JyZWN0IGhhbmRsZVxuICAgIGlmIChvbmx5SGFuZGxlKSB7XG4gICAgICByZW5kZXJGYWl0aHBpbG90SXRlbXMoaXRlbXMuZmluZChpID0+IGkuaGFuZGxlID09PSBvbmx5SGFuZGxlKSwgbGlzdCwgbnVsbCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHBhZ2VzLnB1c2goaXRlbXMuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlckl0ZW1zKCk7XG5cbiAgICAgIGlmIChwYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgY3JlYXRlUGFnaW5hdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpbml0KCk7XG59KTsiXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJjb21wb25lbnQiLCJyZW5kZXJGYWl0aHBpbG90SXRlbXMiLCJmZXRjaFBhZ2luYXRlZEl0ZW1zIiwibm9kZSIsIkVORFBPSU5UIiwiaW5uZXIiLCJxdWVyeVNlbGVjdG9yIiwibGlzdCIsIm9ubHlIYW5kbGUiLCJkYXRhc2V0IiwicGFnZVNpemUiLCJwYXJzZUludCIsInBhZ2VzIiwicmVuZGVySXRlbXMiLCJzcGxpY2UiLCJjcmVhdGVQYWdpbmF0aW9uIiwiYnRuIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwidGV4dENvbnRlbnQiLCJ3aW5kb3ciLCJ0aGVtZSIsInN0cmluZ3MiLCJsYXlvdXQiLCJsb2FkTW9yZSIsImFwcGVuZENoaWxkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSIsImluaXQiLCJfcmVmIiwiX2NhbGxlZSIsIml0ZW1zIiwiX2NvbnRleHQiLCJmaW5kIiwiaGFuZGxlIiwicHVzaCJdLCJzb3VyY2VSb290IjoiIn0= 688//# sourceURL=webpack-internal:///./src/scripts/components/blog/faithpilot-page.js 689 690}`)},"./src/scripts/components/blog/ingredients-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 691/* harmony export */ __webpack_require__.d(__webpack_exports__, { 692/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 693/* harmony export */ }); 694/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js"); 695/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js"); 696/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js"); 697/* harmony import */ var gsap_ScrollTrigger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! gsap/ScrollTrigger */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js"); 698function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
vendor: 4,337 bytes, lines 698-733
698 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 699function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 700function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 701function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 702function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 703function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } 704function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 705function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 706function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 707function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 708 709 710 711 712gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.registerPlugin(gsap_ScrollTrigger__WEBPACK_IMPORTED_MODULE_3__.ScrollTrigger); 713/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) { 714 /*******************************************************************************************************************************************/ 715 /* Data + Elements 716 /*******************************************************************************************************************************************/ 717 var _zelektor = zelektor(node), 718 nav = _zelektor.nav, 719 listWrapper = _zelektor.listWrapper, 720 list = _zelektor.list; 721 var backgroundPatternHeight = 250; // Sets the pattern height in vh units 722 723 // List background parallax speeds 724 var speeds = { 725 slow: 2, 726 medium: 4, 727 fast: 6 728 }; 729 730 /*******************************************************************************************************************************************/ 731 /* Event Listeners 732 /*******************************************************************************************************************************************/ 733 window.addEventListener('resize', (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.debounce)(updateListBackgroun
733d)); 734 735 /*******************************************************************************************************************************************/ 736 /* Init 737 /*******************************************************************************************************************************************/ 738 init(); 739 740 /*******************************************************************************************************************************************/ 741 /* Functions 742 /*******************************************************************************************************************************************/ 743 function init() { 744 return _init.apply(this, arguments); 745 } 746 function _init() { 747 _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 748 var items, sortedItems, letters; 749 return _regenerator().w(function (_context) { 750 while (1) switch (_context.n) { 751 case 0: 752 _context.n = 1; 753 return fetch("/blogs/ingredients?view=data_ingredients").then(function (r) { 754 return r.json(); 755 }); 756 case 1: 757 items = _context.v; 758 sortedItems = (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.sortAlphabetically)(items).filter(function (i) { 759 return !i.tags.find(function (t) { 760 return t === 'page_omit'; 761 }); 762 }); 763 letters = _toConsumableArray(new Set(sortedItems.map(function (i) { 764 return i.title[0].toLowerCase(); 765 }))); 766 renderList(letters, sortedItems); 767 renderNav(letters);
768 updateListBackground(); 769 case 2: 770 return _context.a(2); 771 } 772 }, _callee); 773 })); 774 return _init.apply(this, arguments); 775 } 776 function renderList(letters, items) { 777 list.innerHTML = "\\n ".concat(letters.map(function (l) { 778 return "\\n <section class=\\"ingredients__list-division js-listDivision\\" data-letter=\\"".concat(l, "\\">\\n <div class=\\"ingredients__list-division__letter title title--large\\">").concat(l.toUpperCase(), "</div>\\n <ul class=\\"ingredients__item-list\\">\\n ").concat(items.filter(function (i) { 779 return i.title[0].toLowerCase() === l; 780 }).map(function (i) { 781 return "\\n <li class=\\"ingredients__item\\">\\n <p class=\\"ingredients__item__title\\">".concat(i.title, "</p>\\n <div class=\\"ingredients__item__content\\">\\n <div class=\\"ingredients__item__text rte\\">").concat(i.descriptionLong, "</div>\\n ").concat(function () { 782 if (i.imageUrl) { 783 var imgSrc = (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '180x'); 784 var imgSrcLazy = (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '1x'); 785 return "<img src=\\"".concat(imgSrcLazy, "\\" data-src=\\"").concat(imgSrc, "\\" class=\\"lazyload\\">"); 786 } else { 787 return ''; 788 } 789 }(), "\\n </div>\\n </li>\\n "); 790 }).join(''), "\\n </ul>\\n </section>\\n "); 791 }).join(''), "\\n "); 792 } 793 function renderNav(letters) { 794 nav.innerHTML = "\\n ".concat(letters.map(function (l) { 795 return "<button type=\\"button\\" class=\\"ingredients__nav__button js-btn\\" data-letter=\\"".concat(l, "\\">").concat(l, "</button>"); 796 }).join(''), "\\n "); 797 initNav(); 798 } 799 function initNav() { 800 var _zelektor2 = zelektor(nav), 801 btns = _zelektor2.btn; 802 loopify(btns).forEach(function (btn) { 803 btn.addEventListener('click', scrollToDivision); 804 }); 805 } 806 function scrollToDivision(e) { 807 var letter = e.currentTarget.dataset.letter; 808 var _zelektor3 = zelektor(list), 809 divisions = _zelektor3.listDivision; 810 var match = loopify(divisions).find(function (d) { 811 return d.dataset.letter === letter; 812 }); 813 var headerHeight = parseInt(getComputedStyle(root).getPropertyValue('--header-height').replace('px', '')); 814 var navHeight = parseInt(getComputedStyle(nav).getPropertyValue('height').replace('px', '')); 815 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.smoothScroll)(match, { 816 offset: -headerHeight - navHeight - 20 817 }); 818 }
819 function updateListBackground() { 820 var _zelektor4 = zelektor(listWrapper), 821 listBackgrounds = _zelektor4.listBackground; 822 823 // If the listWrapper scroll height is larger than the background pattern, 824 // duplicate the pattern x amount of times to fill the listWrapper 825 var listHeight = listWrapper.scrollHeight; 826 var backgroundHeight = loopify(listBackgrounds)[0].offsetHeight; 827 var reps = Math.ceil(listHeight / backgroundHeight); 828 var firstClone = loopify(listBackgrounds)[0].cloneNode(true); 829 firstClone.classList.remove('is-initialized'); 830 831 // Background is hidden on mobile, so backgroundHeight = 0, 832 // so reps becomes = Infinity 833 // So to prevent infinite loop... 834 if (reps === Infinity) return; 835 loopify(listBackgrounds).forEach(function (b) { 836 return b.remove(); 837 }); 838 for (var i = 0; i < reps; i++) { 839 var clone = firstClone.cloneNode(true); 840 841 // Remove styles from images to reset animated properties for the new clone 842 var _zelektor5 = zelektor(clone), 843 images = _zelektor5.image; 844 loopify(images).forEach(function (i) { 845 return i.style = ''; 846 }); 847 listWrapper.appendChild(clone); 848 clone.style.top = "".concat(backgroundPatternHeight * i, "vh"); 849 } 850 var _zelektor6 = zelektor(listWrapper), 851 updatedBackgrounds = _zelektor6.listBackground; 852 updatedBackgrounds.forEach(function (b) {
853 initBackgroundAnim(b); 854 b.classList.add('is-initialized'); 855 }); 856 } 857 function initBackgroundAnim(background) { 858 var _zelektor7 = zelektor(background), 859 images = _zelektor7.image; 860 loopify(images).forEach(function (i) { 861 var speed = i.dataset.speed; 862 var top = parseFloat(getComputedStyle(i).top); 863 gsap__WEBPACK_IMPORTED_MODULE_2__.gsap.to(i, { 864 top: top - window.innerHeight * speeds[speed] / 4, 865 // yPercent: speeds[speed], 866 ease: 'none', 867 scrollTrigger: { 868 trigger: background, 869 scrub: true 870 } 871 }); 872 }); 873 } 874}));//# sourceURL=[module] 875//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvaW5ncmVkaWVudHMtcGFnZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OzswQkFDQSx1S0FBQUEsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLFdBQUEsOEJBQUFDLEVBQUFOLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBTCxDQUFBLElBQUFBLENBQUEsQ0FBQU0sU0FBQSxZQUFBQyxTQUFBLEdBQUFQLENBQUEsR0FBQU8sU0FBQSxFQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLENBQUFDLFNBQUEsVUFBQUssbUJBQUEsQ0FBQUgsQ0FBQSx1QkFBQVYsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUksQ0FBQSxNQUFBQyxDQUFBLEdBQUFYLENBQUEsUUFBQVksQ0FBQSxPQUFBQyxDQUFBLEtBQUFGLENBQUEsS0FBQWIsQ0FBQSxLQUFBZ0IsQ0FBQSxFQUFBcEIsQ0FBQSxFQUFBcUIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFOLENBQUEsRUFBQU0sQ0FBQSxDQUFBQyxJQUFBLENBQUF2QixDQUFBLE1BQUFzQixDQUFBLFdBQUFBLEVBQUFyQixDQUFBLEVBQUFDLENBQUEsV0FBQU0sQ0FBQSxHQUFBUCxDQUFBLEVBQUFRLENBQUEsTUFBQUcsQ0FBQSxHQUFBWixDQUFBLEVBQUFtQixDQUFBLENBQUFmLENBQUEsR0FBQUYsQ0FBQSxFQUFBbUIsQ0FBQSxnQkFBQUMsRUFBQXBCLENBQUEsRUFBQUUsQ0FBQSxTQUFBSyxDQUFBLEdBQUFQLENBQUEsRUFBQVUsQ0FBQSxHQUFBUixDQUFBLEVBQUFILENBQUEsT0FBQWlCLENBQUEsSUFBQUYsQ0FBQSxLQUFBVixDQUFBLElBQUFMLENBQUEsR0FBQWdCLENBQUEsQ0FBQU8sTUFBQSxFQUFBdkIsQ0FBQSxVQUFBSyxDQUFBLEVBQUFFLENBQUEsR0FBQVMsQ0FBQSxDQUFBaEIsQ0FBQSxHQUFBcUIsQ0FBQSxHQUFBSCxDQUFBLENBQUFGLENBQUEsRUFBQVEsQ0FBQSxHQUFBakIsQ0FBQSxLQUFBTixDQUFBLFFBQUFJLENBQUEsR0FBQW1CLENBQUEsS0FBQXJCLENBQUEsTUFBQVEsQ0FBQSxHQUFBSixDQUFBLEVBQUFDLENBQUEsR0FBQUQsQ0FBQSxZQUFBQyxDQUFBLFdBQUFELENBQUEsTUFBQUEsQ0FBQSxNQUFBUixDQUFBLElBQUFRLENBQUEsT0FBQWMsQ0FBQSxNQUFBaEIsQ0FBQSxHQUFBSixDQUFBLFFBQUFvQixDQUFBLEdBQUFkLENBQUEsUUFBQUMsQ0FBQSxNQUFBVSxDQUFBLENBQUFDLENBQUEsR0FBQWhCLENBQUEsRUFBQWUsQ0FBQSxDQUFBZixDQUFBLEdBQUFJLENBQUEsT0FBQWMsQ0FBQSxHQUFBRyxDQUFBLEtBQUFuQixDQUFBLEdBQUFKLENBQUEsUUFBQU0sQ0FBQSxNQUFBSixDQUFBLElBQUFBLENBQUEsR0FBQXFCLENBQUEsTUFBQWpCLENBQUEsTUFBQU4sQ0FBQSxFQUFBTSxDQUFBLE1BQUFKLENBQUEsRUFBQWUsQ0FBQSxDQUFBZixDQUFBLEdBQUFxQixDQUFBLEVBQUFoQixDQUFBLGNBQUFILENBQUEsSUFBQUosQ0FBQSxhQUFBbUIsQ0FBQSxRQUFBSCxDQUFBLE9BQUFkLENBQUEscUJBQUFFLENBQUEsRUFBQVcsQ0FBQSxFQUFBUSxDQUFBLFFBQUFULENBQUEsWUFBQVUsU0FBQSx1Q0FBQVIsQ0FBQSxVQUFBRCxDQUFBLElBQUFLLENBQUEsQ0FBQUwsQ0FBQSxFQUFBUSxDQUFBLEdBQUFoQixDQUFBLEdBQUFRLENBQUEsRUFBQUwsQ0FBQSxHQUFBYSxDQUFBLEdBQUF4QixDQUFBLEdBQUFRLENBQUEsT0FBQVQsQ0FBQSxHQUFBWSxDQUFBLE1BQUFNLENBQUEsS0FBQVYsQ0FBQSxLQUFBQyxDQUFBLEdBQUFBLENBQUEsUUFBQUEsQ0FBQSxTQUFBVSxDQUFBLENBQUFmLENBQUEsUUFBQWtCLENBQUEsQ0FBQWIsQ0FBQSxFQUFBRyxDQUFBLEtBQUFPLENBQUEsQ0FBQWYsQ0FBQSxHQUFBUSxDQUFBLEdBQUFPLENBQUEsQ0FBQUMsQ0FBQSxHQUFBUixDQUFBLGFBQUFJLENBQUEsTUFBQVIsQ0FBQSxRQUFBQyxDQUFBLEtBQUFILENBQUEsWUFBQUwsQ0FBQSxHQUFBTyxDQUFBLENBQUFGLENBQUEsV0FBQUwsQ0FBQSxHQUFBQSxDQUFBLENBQUEwQixJQUFBLENBQUFuQixDQUFBLEVBQUFJLENBQUEsVUFBQWMsU0FBQSwyQ0FBQXpCLENBQUEsQ0FBQTJCLElBQUEsU0FBQTNCLENBQUEsRUFBQVcsQ0FBQSxHQUFBWCxDQUFBLENBQUE0QixLQUFBLEVBQUFwQixDQUFBLFNBQUFBLENBQUEsb0JBQUFBLENBQUEsS0FBQVIsQ0FBQSxHQUFBTyxDQUFBLGVBQUFQLENBQUEsQ0FBQTBCLElBQUEsQ0FBQW5CLENBQUEsR0FBQUMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFjLFNBQUEsdUNBQUFwQixDQUFBLGdCQUFBRyxDQUFBLE9BQUFELENBQUEsR0FBQVIsQ0FBQSxjQUFBQyxDQUFBLElBQUFpQixDQUFBLEdBQUFDLENBQUEsQ0FBQWYsQ0FBQSxRQUFBUSxDQUFBLEdBQUFWLENBQUEsQ0FBQXlCLElBQUEsQ0FBQXZCLENBQUEsRUFBQWUsQ0FBQSxPQUFBRSxDQUFBLGtCQUFBcEIsQ0FBQSxJQUFBTyxDQUFBLEdBQUFSLENBQUEsRUFBQVMsQ0FBQSxNQUFBRyxDQUFBLEdBQUFYLENBQUEsY0FBQWUsQ0FBQSxtQk
875FBQWEsS0FBQSxFQUFBNUIsQ0FBQSxFQUFBMkIsSUFBQSxFQUFBVixDQUFBLFNBQUFoQixDQUFBLEVBQUFJLENBQUEsRUFBQUUsQ0FBQSxRQUFBSSxDQUFBLFFBQUFTLENBQUEsZ0JBQUFWLFVBQUEsY0FBQW1CLGtCQUFBLGNBQUFDLDJCQUFBLEtBQUE5QixDQUFBLEdBQUFZLE1BQUEsQ0FBQW1CLGNBQUEsTUFBQXZCLENBQUEsTUFBQUwsQ0FBQSxJQUFBSCxDQUFBLENBQUFBLENBQUEsSUFBQUcsQ0FBQSxTQUFBVyxtQkFBQSxDQUFBZCxDQUFBLE9BQUFHLENBQUEsaUNBQUFILENBQUEsR0FBQVcsQ0FBQSxHQUFBbUIsMEJBQUEsQ0FBQXJCLFNBQUEsR0FBQUMsU0FBQSxDQUFBRCxTQUFBLEdBQUFHLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLFlBQUFPLEVBQUFoQixDQUFBLFdBQUFhLE1BQUEsQ0FBQW9CLGNBQUEsR0FBQXBCLE1BQUEsQ0FBQW9CLGNBQUEsQ0FBQWpDLENBQUEsRUFBQStCLDBCQUFBLEtBQUEvQixDQUFBLENBQUFrQyxTQUFBLEdBQUFILDBCQUFBLEVBQUFoQixtQkFBQSxDQUFBZixDQUFBLEVBQUFNLENBQUEseUJBQUFOLENBQUEsQ0FBQVUsU0FBQSxHQUFBRyxNQUFBLENBQUFDLE1BQUEsQ0FBQUYsQ0FBQSxHQUFBWixDQUFBLFdBQUE4QixpQkFBQSxDQUFBcEIsU0FBQSxHQUFBcUIsMEJBQUEsRUFBQWhCLG1CQUFBLENBQUFILENBQUEsaUJBQUFtQiwwQkFBQSxHQUFBaEIsbUJBQUEsQ0FBQWdCLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBSyxXQUFBLHdCQUFBcEIsbUJBQUEsQ0FBQWdCLDBCQUFBLEVBQUF6QixDQUFBLHdCQUFBUyxtQkFBQSxDQUFBSCxDQUFBLEdBQUFHLG1CQUFBLENBQUFILENBQUEsRUFBQU4sQ0FBQSxnQkFBQVMsbUJBQUEsQ0FBQUgsQ0FBQSxFQUFBUixDQUFBLGlD
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xDQUFDO0VBQ047RUFFQSxTQUFTRCxrQkFBa0JBLENBQUNFLFVBQVUsRUFBRTtJQUNwQyxJQUFBQyxVQUFBLEdBQTBCeEYsUUFBUSxDQUFDdUYsVUFBVSxDQUFDO01BQS9CVCxNQUFNLEdBQUFVLFVBQUEsQ0FBYlQsS0FBSztJQUVicEMsT0FBTyxDQUFDbUMsTUFBTSxDQUFDLENBQUNsQyxPQUFPLENBQUMsVUFBQXBILENBQUMsRUFBSTtNQUN6QixJQUFRaUssS0FBSyxHQUFLakssQ0FBQyxDQUFDd0gsT0FBTyxDQUFuQnlDLEtBQUs7TUFDYixJQUFNUCxHQUFHLEdBQUdRLFVBQVUsQ0FBQ25DLGdCQUFnQixDQUFDL0gsQ0FBQyxDQUFDLENBQUMwSixHQUFHLENBQUM7TUFFL0N6RixzQ0FBSSxDQUFDa0csRUFBRSxDQUFDbkssQ0FBQyxFQUFFO1FBQ1AwSixHQUFHLEVBQUVBLEdBQUcsR0FBSXpFLE1BQU0sQ0FBQ21GLFdBQVcsR0FBR3ZGLE1BQU0sQ0FBQ29GLEtBQUssQ0FBQyxHQUFJLENBQUM7UUFDbkQ7UUFDQUksSUFBSSxFQUFFLE1BQU07UUFDWkMsYUFBYSxFQUFFO1VBQ1hDLE9BQU8sRUFBRVIsVUFBVTtVQUNuQlMsS0FBSyxFQUFFO1FBQ1g7TUFDSixDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9pbmdyZWRpZW50cy1wYWdlLmpzPzkzMjgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc29ydEFscGhhYmV0aWNhbGx5LCBzbW9vdGhTY3JvbGwsIGRlYm91bmNlIH0gZnJvbSAnQC9saWIvdXRpbGl0eS1mdW5jdGlvbnMnXG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMuanMnXG5pbXBvcnQgeyBnc2FwIH0gZnJvbSAnZ3NhcCc7XG5pbXBvcnQgeyBTY3JvbGxUcmlnZ2VyIH0gZnJvbSAnZ3NhcC9TY3JvbGxUcmlnZ2VyJztcbmdzYXAucmVnaXN0ZXJQbHVnaW4oU2Nyb2xsVHJpZ2dlcik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSxjdHgpID0+IHtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBEYXRhICsgRWxlbWVudHNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBjb25zdCB7IG5hdiwgbGlzdFdyYXBwZXIsIGxpc3QgfSA9IHplbGVrdG9yKG5vZGUpXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdHRlcm5IZWlnaHQgPSAyNTAgLy8gU2V0cyB0aGUgcGF0dGVybiBoZWlnaHQgaW4gdmggdW5pdHNcblxuICAgIC8vIExpc3QgYmFja2dyb3VuZCBwYXJhbGxheCBzcGVlZHNcbiAgICBjb25zdCBzcGVlZHMgPSB7XG4gICAgICAgI
875HNsb3c6IDIsXG4gICAgICAgIG1lZGl1bTogNCxcbiAgICAgICAgZmFzdDogNlxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlKHVwZGF0ZUxpc3RCYWNrZ3JvdW5kKSlcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogSW5pdFxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGluaXQoKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBGdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBhc3luYyBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IGZldGNoKGAvYmxvZ3MvaW5ncmVkaWVudHM/dmlldz1kYXRhX2luZ3JlZGllbnRzYCkudGhlbihyID0+IHIuanNvbigpKVxuICAgICAgICBsZXQgc29ydGVkSXRlbXMgPSBzb3J0QWxwaGFiZXRpY2FsbHkoaXRlbXMpLmZpbHRlcihpID0+ICFpLnRhZ3MuZmluZCh0ID0+IHQgPT09ICdwYWdlX29taXQnKSlcbiAgICAgICAgY29uc3QgbGV0dGVycyA9IFsuLi5uZXcgU2V0KHNvcnRlZEl0ZW1zLm1hcChpID0+IGkudGl0bGVbMF0udG9Mb3dlckNhc2UoKSkpXVxuXG4gICAgICAgIHJlbmRlckxpc3QobGV0dGVycywgc29ydGVkSXRlbXMpXG4gICAgICAgIHJlbmRlck5hdihsZXR0ZXJzKVxuICAgICAgICB1cGRhdGVMaXN0QmFja2dyb3VuZCgpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyTGlzdChsZXR0ZXJzLCBpdGVtcykge1xuICAgICAgICBsaXN0LmlubmVySFRNTCA9ICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2xldHRlcnMubWFwKGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImluZ3JlZGllbnRzX19saXN0LWRpdmlzaW9uIGpzLWxpc3REaXZpc2lvblwiIGRhdGEtbGV0dGVyPVwiJHtsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5ncmVkaWVudHNfX2xpc3QtZGl2aXNpb25fX2xldHRlciB0aXRsZSB0aXRsZS0tbGFyZ2VcIj4ke2wudG9VcHBlckNhc2UoKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiaW5ncmVkaWVudHNfX2l0ZW0tbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtpdGVtcy5maWx0ZXIoaSA9PiBpLnRpdGxlWzBdLnRvTG93ZXJDYXNlKCkgPT09IGwpLm1hcChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImluZ3JlZGllbnRzX19pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJpbmdyZWRpZW50c19faXRlbV9fdGl0bGVcIj4ke2kudGl0bGV9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmdyZWRpZW50c19faXRlbV9fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5ncmVkaWVudHNfX2l0ZW1fX3RleHQgcnRlXCI+JHtpLmRlc2NyaXB0aW9uTG9uZ308L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuaW1hZ2VVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdTcmMgPSBnZXRTaXplZEltYWdlVXJsKGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSwgJzE4MHgnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBnZXRTaXplZEltYWdlVXJsKGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSwgJzF4JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtpbWdTcmNMYXp5fVwiIGRhdGEtc3JjPVwiJHtpbWdTcmN9XCIgY2x
875hc3M9XCJsYXp5bG9hZFwiPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyTmF2KGxldHRlcnMpIHtcbiAgICAgICAgbmF2LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgICR7bGV0dGVycy5tYXAobCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImluZ3JlZGllbnRzX19uYXZfX2J1dHRvbiBqcy1idG5cIiBkYXRhLWxldHRlcj1cIiR7bH1cIj4ke2x9PC9idXR0b24+YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBgXG5cbiAgICAgICAgaW5pdE5hdigpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdE5hdigpIHtcbiAgICAgICAgY29uc3QgeyBidG46IGJ0bnMgfSA9IHplbGVrdG9yKG5hdilcbiAgICAgICAgbG9vcGlmeShidG5zKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzY3JvbGxUb0RpdmlzaW9uKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRGl2aXNpb24oZSkge1xuICAgICAgICBjb25zdCB7IGxldHRlciB9ID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXRcbiAgICAgICAgY29uc3QgeyBsaXN0RGl2aXNpb246IGRpdmlzaW9ucyB9ID0gemVsZWt0b3IobGlzdClcblxuICAgICAgICBjb25zdCBtYXRjaCA9IGxvb3BpZnkoZGl2aXNpb25zKS5maW5kKGQgPT4gZC5kYXRhc2V0LmxldHRlciA9PT0gbGV0dGVyKVxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHJvb3QpLmdldFByb3BlcnR5VmFsdWUoJy0taGVhZGVyLWhlaWdodCcpLnJlcGxhY2UoJ3B4JywnJykpXG4gICAgICAgIGNvbnN0IG5hdkhlaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobmF2KS5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKS5yZXBsYWNlKCdweCcsJycpKVxuICAgICAgICBzbW9vdGhTY3JvbGwobWF0Y2gsIHtvZmZzZXQ6IC1oZWFkZXJIZWlnaHQgLSBuYXZIZWlnaHQgLSAyMH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTGlzdEJhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IHsgbGlzdEJhY2tncm91bmQ6IGxpc3RCYWNrZ3JvdW5kcyB9ID0gemVsZWt0b3IobGlzdFdyYXBwZXIpXG5cbiAgICAgICAgLy8gSWYgdGhlIGxpc3RXcmFwcGVyIHNjcm9sbCBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGJhY2tncm91bmQgcGF0dGVybixcbiAgICAgICAgLy8gZHVwbGljYXRlIHRoZSBwYXR0ZXJuIHggYW1vdW50IG9mIHRpbWVzIHRvIGZpbGwgdGhlIGxpc3RXcmFwcGVyXG4gICAgICAgIGNvbnN0IGxpc3RIZWlnaHQgPSBsaXN0V3JhcHBlci5zY3JvbGxIZWlnaHRcbiAgICAgICAgY29uc3QgYmFja2dyb3VuZEhlaWdodCA9IGxvb3BpZnkobGlzdEJhY2tncm91bmRzKVswXS5vZmZzZXRIZWlnaHRcbiAgICAgICAgY29uc3QgcmVwcyA9IE1hdGguY2VpbChsaXN0SGVpZ2h0IC8gYmFja2dyb3VuZEhlaWdodClcbiAgICAgICAgY29uc3QgZmlyc3RDbG9uZSA9IGxvb3BpZnkobGlzdEJhY2tncm91bmRzKVswXS5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgZmlyc3RDbG9uZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1pbml0aWFsaXplZCcpXG5cbiAgICAgICAgLy8gQmFja2dyb3VuZCBpcyBoaWRkZW4gb24gbW9iaWxlLCBzbyBiYWNrZ3JvdW5kSGVpZ2h0ID0gMCxcbiAgICAgICAgLy8gc28gcmVwcyBiZWNvbWVzID0gSW5maW5pdHlcbiAgICAgICAgLy8gU28gdG8gcHJldmVudCBpbmZpbml0ZSBsb29wLi4uXG4gICAgICAgIGlmIChyZXBzID09PSBJbmZpbml0eSkgcmV0dXJuXG5cbiAgICAgICAgbG9vcGlmeShsaXN0QmFja2dyb3VuZHMpLmZvckVhY2goYiA9PiBiLnJlbW92ZSgpKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZSA9IGZpcnN0Q2xvbmUuY2xvbmVOb2RlKHRydWUpXG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBzdHlsZXMgZnJvbSBpbWFnZXMgdG8gcmVzZXQgYW5pbWF0ZWQgcHJvcGVydGllcyBmb3IgdGhlIG5ldyBjbG9uZVxuICAgICAgICAgICAgY29uc3QgeyBpbWFnZTogaW1hZ2VzIH0gPSB6ZWxla3RvcihjbG9uZSlcbiAgICAgICAgICAgIGxvb3BpZnkoaW1hZ2VzKS5mb3JFYWNoKGkgPT4gaS5zdHlsZSA9ICcnKVxuXG4gICAgICAgICAgICBsaXN0V3JhcHBlci5hcHBlbmRDaGlsZChjbG9uZSlcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnRvcCA9IGAke2JhY2tncm91bmRQYXR0ZXJuSGVpZ2h0ICogaX12aGBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbGlzdEJhY2tncm91bmQ6IHVwZGF0ZWRCYWNrZ3JvdW5kcyB9ID0gemVsZWt0b3IobGlzdFdyYXBwZXIpXG4gICAgICAgI
875HVwZGF0ZWRCYWNrZ3JvdW5kcy5mb3JFYWNoKGIgPT4ge1xuICAgICAgICAgICAgaW5pdEJhY2tncm91bmRBbmltKGIpXG4gICAgICAgICAgICBiLmNsYXNzTGlzdC5hZGQoJ2lzLWluaXRpYWxpemVkJylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0QmFja2dyb3VuZEFuaW0oYmFja2dyb3VuZCkge1xuICAgICAgICBjb25zdCB7IGltYWdlOiBpbWFnZXMgfSA9IHplbGVrdG9yKGJhY2tncm91bmQpXG5cbiAgICAgICAgbG9vcGlmeShpbWFnZXMpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHNwZWVkIH0gPSBpLmRhdGFzZXRcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShpKS50b3ApXG5cbiAgICAgICAgICAgIGdzYXAudG8oaSwge1xuICAgICAgICAgICAgICAgIHRvcDogdG9wIC0gKHdpbmRvdy5pbm5lckhlaWdodCAqIHNwZWVkc1tzcGVlZF0pIC8gNCxcbiAgICAgICAgICAgICAgICAvLyB5UGVyY2VudDogc3BlZWRzW3NwZWVkXSxcbiAgICAgICAgICAgICAgICBlYXNlOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgc2Nyb2xsVHJpZ2dlcjoge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICAgICAgICBzY3J1YjogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufSlcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwiaXNBcnJheSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsInNvcnRBbHBoYWJldGljYWxseSIsInNtb290aFNjcm9sbCIsImRlYm91bmNlIiwiZ2V0U2l6ZWRJbWFnZVVybCIsImltYWdlU2l6ZSIsImdzYXAiLCJTY3JvbGxUcmlnZ2VyIiwicmVnaXN0ZXJQbHVnaW4iLCJjb21wb25lbnQiLCJub2RlIiwiY3R4IiwiX3plbGVrdG9yIiwiemVsZWt0b3IiLCJuYXYiLCJsaXN0V3JhcHBlciIsImxpc3QiLCJiYWNrZ3JvdW5kUGF0dGVybkhlaWdodCIsInNwZWVkcyIsInNsb3ciLCJtZWRpdW0iLCJmYXN0Iiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsInVwZGF0ZUxpc3RCYWNrZ3JvdW5kIiwiaW5pdCIsIl9pbml0IiwiX2NhbGxlZSIsIml0ZW1zIiwic29ydGVkSXRlbXMiLCJsZXR0ZXJzIiwiX2NvbnRleHQiLCJmZXRjaCIsImpzb24iLCJmaWx0ZXIiLCJ0YWdzIiwiZmluZCIsIlNldCIsIm1hcCIsInRpdGxlIiwidG9Mb3dlckNhc2UiLCJyZW5kZXJMaXN0IiwicmVuZGVyTmF2IiwiaW5uZXJIVE1MIiwiY29uY2F0IiwidG9VcHBlckNhc2UiLCJkZXNjcmlwdGlvbkxvbmciLCJpbWFnZVVybCIsImltZ1NyYyIsInJlcGxhY2UiLCJpbWdTcmNMYXp5Iiwiam9pbiIsImluaXROYXYiLCJfemVsZWt0b3IyIiwiYnRucyIsImJ0biIsImxvb3BpZnkiLCJmb3JFYWNoIiwic2Nyb2xsVG9EaXZpc2lvbiIsImxldHRlciIsImN1cnJlbnRUYXJnZXQiLCJkYXRhc2V0IiwiX3plbGVrdG9yMyIsImRpdmlzaW9ucyIsImxpc3REaXZpc2lvbiIsIm1hdGNoIiwiaGVhZGVySGVpZ2h0IiwicGFyc2VJbnQiLCJnZXRDb21wdXRlZFN0eWxlIiwicm9vdCIsImdldFByb3BlcnR5VmFsdWUiLCJuYXZIZWlnaHQiLCJvZmZzZXQiLCJfemVsZWt0b3I0IiwibGlzdEJhY2tncm91bmRzIiwibGlzdEJhY2tncm91bmQiLCJsaXN0SGVpZ2h0Iiwic2Nyb2xsSGVpZ2h0IiwiYmFja2dyb3VuZEhlaWdodCIsIm9mZnNldEhlaWdodCIsInJlcHMiLCJNYXRoIiwiY2VpbCIsImZpcnN0Q2xvbmUiLCJjbG9uZU5vZGUiLCJjbGFzc0xpc3QiLCJyZW1vdmUiLCJJbmZpbml0eSIsImIiLCJjbG9uZSIsIl96ZWxla3RvcjUiLCJpbWFnZXMiLCJpbWFnZSIsInN0eWxlIiwiYXBwZW5kQ2hpbGQiLCJ0b3AiLCJfemVsZWt0b3I2IiwidXBkYXRlZEJhY2tncm91bmRzIiwiaW5pdEJhY2tncm91bmRBbmltIiwiYWRkIiwiYmFja2dyb3VuZCIsIl96ZWxla3RvcjciLCJzcGVlZCIsInBhcnNlRmxvYXQiLCJ0byIsImlubmVySGVpZ2h0IiwiZWFzZSIsInNjcm9sbFRyaWdnZXIiLCJ0cmlnZ2VyIiwic2NydWIiXSwic291cmNlUm9vdCI6IiJ9 876//# sourceURL=webpack-internal:///./src/scripts/components/blog/ingredients-page.js 877 878}`)},"./src/scripts/components/blog/inspiration-buy-flow.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 879/* harmony export */ __webpack_require__.d(__webpack_exports__, { 880/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 881/* harmony export */ }); 882/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js"); 883/* harmony import */ var _lib_cart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/cart */ "./src/scripts/lib/cart.js"); 884 885 886/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) { 887 /*******************************************************************************************************************************************/ 888 /* Data + Elements 889 /*******************************************************************************************************************************************/ 890 var _zelektor = zelektor(node), 891 productItems = _zelektor.productItem, 892 addAllBtn = _zelektor.addAllBtn; 893 894 /*******************************************************************************************************************************************/ 895 /* Event Listeners 896 /*******************************************************************************************************************************************/ 897 addAllBtn === null || addAllBtn === void 0 || addAllBtn.addEventListener('click', function () { 898 return addItems(addAllBtn, loopify(productItems)); 899 });
900 loopify(productItems).forEach(function (i) { 901 return initProductItem(i); 902 }); 903 904 /*******************************************************************************************************************************************/ 905 /* Functions 906 /*******************************************************************************************************************************************/ 907 function initProductItem(item) { 908 var _zelektor2 = zelektor(item), 909 addBtn = _zelektor2.addBtn; 910 addBtn.addEventListener('click', function () { 911 return addItems(addBtn, [item]); 912 }); 913 } 914 function addItems(btn, itemArray) { 915 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.toggleBtn)(btn, true, theme.strings.product.addingToCart); 916 var items = itemArray.map(function (i) { 917 return { 918 id: parseInt(i.dataset.variantId), 919 quantity: 1 920 }; 921 }); 922 fetch('/cart/add.js', { 923 method: 'POST', 924 credentials: 'include', 925 headers: { 926 'Content-Type': 'application/json', 927 'X-Requested-With': 'XMLHttpRequest' 928 }, 929 body: JSON.stringify({ 930 items: items 931 }) 932 }).then(function (r) { 933 return r.json(); 934 }).then(function (data) { 935 if (data.status) { 936 alert(data.description); 937 } else { 938 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_0__.toggleBtn)(btn, false, theme.strings.product.addToCart); 939 (0,_lib_cart__WEBPACK_IMPORTED_MODULE_1__.fetchCart)().then(function (cart) { 940 app.hydrate({ 941 cart: cart 942 }); 943 app.emit('cart:updated'); 944 }); 945 } 946 }); 947 } 948}));//# sourceURL=[module] 949//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvaW5zcGlyYXRpb24tYnV5LWZsb3cuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQW1EO0FBQ2I7QUFFdEMsaUVBQWVFLFNBQVMsQ0FBQyxVQUFDQyxJQUFJLEVBQUNDLEdBQUcsRUFBSztFQUNuQztFQUNBO0FBQ0o7RUFDSSxJQUFBQyxTQUFBLEdBR0lDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBRkRJLFlBQVksR0FBQUYsU0FBQSxDQUF6QkcsV0FBVztJQUNYQyxTQUFTLEdBQUFKLFNBQUEsQ0FBVEksU0FBUzs7RUFJYjtFQUNBO0FBQ0o7RUFDSUEsU0FBUyxhQUFUQSxTQUFTLGVBQVRBLFNBQVMsQ0FBRUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO0lBQUEsT0FBTUMsUUFBUSxDQUFDRixTQUFTLEVBQUVHLE9BQU8sQ0FBQ0wsWUFBWSxDQUFDLENBQUM7RUFBQSxFQUFDO0VBQ3RGSyxPQUFPLENBQUNMLFlBQVksQ0FBQyxDQUFDTSxPQUFPLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUlDLGVBQWUsQ0FBQ0QsQ0FBQyxDQUFDO0VBQUEsRUFBQzs7RUFHdEQ7RUFDQTtBQUNKO0VBQ0ksU0FBU0MsZUFBZUEsQ0FBQ0MsSUFBSSxFQUFFO0lBQzNCLElBQUFDLFVBQUEsR0FBbUJYLFFBQVEsQ0FBQ1UsSUFBSSxDQUFDO01BQXpCRSxNQUFNLEdBQUFELFVBQUEsQ0FBTkMsTUFBTTtJQUNkQSxNQUFNLENBQUNSLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtNQUFBLE9BQU1DLFFBQVEsQ0FBQ08sTUFBTSxFQUFFLENBQUNGLElBQUksQ0FBQyxDQUFDO0lBQUEsRUFBQztFQUNwRTtFQUVBLFNBQVNMLFFBQVFBLENBQUNRLEdBQUcsRUFBRUMsU0FBUyxFQUFFO0lBQzlCcEIsaUVBQVMsQ0FBQ21CLEdBQUcsRUFBRSxJQUFJLEVBQUVFLEtBQUssQ0FBQ0MsT0FBTyxDQUFDQyxPQUFPLENBQUNDLFlBQVksQ0FBQztJQUV4RCxJQUFNQyxLQUFLLEdBQUdMLFNBQVMsQ0FBQ00sR0FBRyxDQUFDLFVBQUFaLENBQUMsRUFBSTtNQUFFLE9BQU87UUFBRWEsRUFBRSxFQUFFQyxRQUFRLENBQUNkLENBQUMsQ0FBQ2UsT0FBTyxDQUFDQyxTQUFTLENBQUM7UUFBRUMsUUFBUSxFQUFFO01BQUUsQ0FBQztJQUFDLENBQUMsQ0FBQztJQUUvRkMsS0FBSyxDQUFDLGNBQWMsRUFBRTtNQUNsQkMsTUFBTSxFQUFFLE1BQU07TUFDZEMsV0FBVyxFQUFFLFNBQVM7TUFDdEJDLE9BQU8sRUFBRTtRQUNMLGNBQWMsRUFBRSxrQkFBa0I7UUFDbEMsa0JBQWtCLEVBQUU7TUFDeEIsQ0FBQztNQUNEQyxJQUFJLEVBQUVDLElBQUksQ0FBQ0MsU0FBUyxDQUFDO1FBQUViLEtBQUssRUFBTEE7TUFBTSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUNEYyxJQUFJLENBQUMsVUFBQUMsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7SUFBQSxFQUFDLENBQ25CRixJQUFJLENBQUMsVUFBQUcsSUFBSSxFQUFJO01BQ1YsSUFBSUEsSUFBSSxDQUFDQyxNQUFNLEVBQUU7UUFDYkMsS0FBSyxDQUFDRixJQUFJLENBQUNHLFdBQVcsQ0FBQztNQUMzQixDQUFDLE1BQU07UUFDSDdDLGlFQUFTLENBQUNtQixHQUFHLEVBQUUsS0FBSyxFQUFFRSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDdUIsU0FBUyxDQUFDO1FBRXREN0Msb0RBQVMsQ0FBQyxDQUFDLENBQUNzQyxJQUFJLENBQUMsVUFBQVEsSUFBSSxFQUFJO1VBQ3JCQyxHQUFHLENBQUNDLE9BQU8sQ0FBQztZQUFFRixJQUFJLEVBQUVBO1VBQUssQ0FBQyxDQUFDO1VBQzNCQyxHQUFHLENBQUNFLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDNUIsQ0FBQyxDQUFDO01BQ047SUFDSixDQUFDLENBQUM7RUFDTjtBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9pbnNwaXJhdGlvbi1idXktZmxvdy5qcz9lODlmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7
vendor: 6,833 bytes, lines 949-959
949IHRvZ2dsZUJ0biB9IGZyb20gJ0AvbGliL3V0aWxpdHktZnVuY3Rpb25zJ1xuaW1wb3J0IHsgZmV0Y2hDYXJ0IH0gZnJvbSAnQC9saWIvY2FydCdcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLGN0eCkgPT4ge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIERhdGEgKyBFbGVtZW50c1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNvbnN0IHtcbiAgICAgICAgcHJvZHVjdEl0ZW06IHByb2R1Y3RJdGVtcyxcbiAgICAgICAgYWRkQWxsQnRuXG4gICAgfSA9IHplbGVrdG9yKG5vZGUpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEV2ZW50IExpc3RlbmVyc1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGFkZEFsbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBhZGRJdGVtcyhhZGRBbGxCdG4sIGxvb3BpZnkocHJvZHVjdEl0ZW1zKSkpXG4gICAgbG9vcGlmeShwcm9kdWN0SXRlbXMpLmZvckVhY2goaSA9PiBpbml0UHJvZHVjdEl0ZW0oaSkpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEZ1bmN0aW9uc1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGZ1bmN0aW9uIGluaXRQcm9kdWN0SXRlbShpdGVtKSB7XG4gICAgICAgIGNvbnN0IHsgYWRkQnRuIH0gPSB6ZWxla3RvcihpdGVtKVxuICAgICAgICBhZGRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBhZGRJdGVtcyhhZGRCdG4sIFtpdGVtXSkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkSXRlbXMoYnRuLCBpdGVtQXJyYXkpIHtcbiAgICAgICAgdG9nZ2xlQnRuKGJ0biwgdHJ1ZSwgdGhlbWUuc3RyaW5ncy5wcm9kdWN0LmFkZGluZ1RvQ2FydClcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGl0ZW1BcnJheS5tYXAoaSA9PiB7IHJldHVybiB7IGlkOiBwYXJzZUludChpLmRhdGFzZXQudmFyaWFudElkKSwgcXVhbnRpdHk6IDEgfSB9KVxuXG4gICAgICAgIGZldGNoKCcvY2FydC9hZGQuanMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGl0ZW1zIH0pXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHIgPT4gci5qc29uKCkpXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoZGF0YS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQnRuKGJ0biwgZmFsc2UsIHRoZW1lLnN0cmluZ3MucHJvZHVjdC5hZGRUb0NhcnQpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZmV0Y2hDYXJ0KCkudGhlbihjYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwLmh5ZHJhdGUoeyBjYXJ0OiBjYXJ0IH0pXG4gICAgICAgICAgICAgICAgICAgIGFwcC5lbWl0KCdjYXJ0OnVwZGF0ZWQnKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufSkiXSwibmFtZXMiOlsidG9nZ2xlQnRuIiwiZmV0Y2hDYXJ0IiwiY29tcG9uZW50Iiwibm9kZSIsImN0eCIsIl96ZWxla3RvciIsInplbGVrdG9yIiwicHJvZHVjdEl0ZW1zIiwicHJvZHVjdEl0ZW0iLCJhZGRBbGxCdG4iLCJhZGRFdmVudExpc3RlbmVyIiwiYWRkSXRlbXMiLCJsb29waWZ5IiwiZm9yRWFjaCIsImkiLCJpbml0UHJvZHVjdEl0ZW0iLCJpdGVtIiwiX3plbGVrdG9yMiIsImFkZEJ0biIsImJ0biIsIml0ZW1BcnJheSIsInRoZW1lIiwic3RyaW5ncyIsInByb2R1Y3QiLCJhZGRpbmdUb0NhcnQiLCJpdGVtcyIsIm1hcCIsImlkIiwicGFyc2VJbnQiLCJkYXRhc2V0IiwidmFyaWFudElkIiwicXVhbnRpdHkiLCJmZXRjaCIsIm1ldGhvZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwidGhlbiIsInIiLCJqc29uIiwiZGF0YSIsInN0YXR1cyIsImFsZXJ0IiwiZGVzY3JpcHRpb24iLCJhZGRUb0NhcnQiLCJjYXJ0IiwiYXBwIiwiaHlkcmF0ZSIsImVtaXQiXSwic291cmNlUm9vdCI6IiJ9 950//# sourceURL=webpack-internal:///./src/scripts/components/blog/inspiration-buy-flow.js 951 952}`)},"./src/scripts/components/blog/results-page.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 953/* harmony export */ __webpack_require__.d(__webpack_exports__, { 954/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 955/* harmony export */ }); 956/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"); 957/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js"); 958/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js"); 959function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
959 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 960function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 961function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 962function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 963 964 965 966/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) { 967 var PATH_NAME = 'blogs/results'; 968 var VIEW = 'data_results'; 969 var _window$zelektor = window.zelektor(node), 970 inner = _window$zelektor.inner, 971 list = _window$zelektor.list; 972 var onlyHandle = node.dataset.onlyHandle; 973 var pageSize = parseInt(node.dataset.pageSize); 974 var pages = []; 975 init(); 976 function init() { 977 return _init.apply(this, arguments); 978 } 979 function _init() { 980 _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 981 var url, data; 982 return _regenerator().w(function (_context) { 983 while (1) switch (_context.n) { 984 case 0: 985 url = new URL(location.origin); 986 url.pathname = PATH_NAME; 987 url.searchParams.set('view', VIEW); 988 _context.n = 1; 989 return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_2__["default"])(url); 990 case 1: 991 data = _context.v; 992 // This is so we can use the same component on the before-after article page, 993 // where it should only load the one item with the correct handle 994 if (onlyHandle) { 995 renderItems(data.find(function (i) { 996 return i.handle === onlyHandle; 997 })); 998 } else { 999 while (data.length) { 1000 pages.push(data.splice(0, pageSize)); 1001 } 1002 renderContent(); 1003 if (pages.length) { 1004 createPagination(); 1005 } 1006 } 1007 case 2: 1008 return _context.a(2); 1009 } 1010 }, _callee); 1011 })); 1012 return _init.apply(this, arguments); 1013 } 1014 function renderContent() { 1015 renderItems(pages.splice(0, 1)[0]); 1016 } 1017 function renderItems(items) { 1018 window.loopify(items).forEach(function (i) { 1019 var imgSrc = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '720x') : ''; 1020 var imgSrcLazy = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_1__.imageSize)(i.imageUrl), ''), '1x') : ''; 1021 var div = document.createElement('div'); 1022 list.appendChild(div); 1023 1024 // eslint-ignore-next-line 1025 div.outerHTML = "\\n ".concat(window.theme.videoStudio.videoItemTemplate.replace('%imgSrc%', imgSrc).replace('%imgSrcLazy%', imgSrcLazy).replace('%title%', i.title).replace('%description%', i.description).replace('%videoUrlDesktop%', i.videoUrlDesktop).replace('%videoUrlMobile%', i.videoUrlMobile), "\\n "); 1026 }); 1027 window.app.mount(); 1028 } 1029 function createPagination() { 1030 var btn = document.createElement('button'); 1031 btn.classList.add('cta', 'cta--filled-dark'); 1032 btn.textContent = window.theme.strings.layout.loadMore; 1033 inner.appendChild(btn); 1034 btn.addEventListener('click', function () { 1035 renderContent(); 1036 if (!pages.length) { 1037 btn.remove(); 1038 } 1039 }); 1040 } 1041}));//# sourceURL=[module] 1042//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvcmVzdWx0cy1wYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElB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BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy9yZXN1bHRzLXBhZ2UuanM/ODg0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGdldFNpemVkSW1hZ2VVcmwsIGltYWdlU2l6ZSB9IGZyb20gJ0AvbGliL2ltYWdlcy5qcyc7XG5pbXBvcnQgZmV0Y2hQYWdpbmF0ZWRJdGVtcyBmcm9tICdAL2xpYi9mZXRjaC1wYWdpbmF0ZWQtaXRlbXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQoKG5vZGUpID0+IHtcbiAgY29uc3QgUEFUSF9OQU1FID0gJ2Jsb2dzL3Jlc3VsdHMnO1xuICBjb25zdCBWSUVXID0gJ2RhdGFfcmVzdWx0cyc7XG5cbiAgY29uc3QgeyBpbm5lciwgbGlzdCB9ID0gd2luZG93LnplbGVrdG9yKG5vZGUpO1xuICBjb25zdCB7IG9ubHlIYW5kbGUgfSA9IG5vZGUuZGF0YXNldDtcblxuICBjb25zdCBwYWdlU2l6ZSA9IHBhcnNlSW50KG5vZGUuZGF0YXNldC5wYWdlU2l6ZSk7XG4gIGNvbnN0IHBhZ2VzID0gW107XG5cbiAgaW5pdCgpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChsb2NhdGlvbi5vcmlnaW4pO1xuICAgIHVybC5wYXRobmFtZSA9IFBBVEhfTkFNRTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndmlldycsIFZJRVcpO1xuICAgIFxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFBhZ2luYXRlZEl0ZW1zKHVybCk7XG5cbiAgICAvLyBUaGlzIGlzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgY29tcG9uZW50IG9uIHRoZSBiZWZvcmUtYWZ0ZXIgYXJ0aWNsZSBwYWdlLFxuICAgIC8vIHdoZXJlIGl0IHNob3VsZCBvbmx5IGxvYWQgdGhlIG9uZSBpdGVtIHdpdGggdGhlIGNvcnJlY3QgaGFuZGxlXG4gICAgaWYgKG9ubHlIYW5kbGUpIHtcbiAgICAgIHJlbmRlckl0ZW1zKGRhdGEuZmluZCgoaSkgPT4gaS5oYW5kbGUgPT09IG9ubHlIYW5kbGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGRhdGEubGVuZ3RoKSB7XG4gICAgICAgI
vendor: 7,265 bytes, lines 1042-1055
1042HBhZ2VzLnB1c2goZGF0YS5zcGxpY2UoMCwgcGFnZVNpemUpKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyQ29udGVudCgpO1xuXG4gICAgICBpZiAocGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGNyZWF0ZVBhZ2luYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgIHJlbmRlckl0ZW1zKHBhZ2VzLnNwbGljZSgwLCAxKVswXSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJJdGVtcyhpdGVtcykge1xuICAgIHdpbmRvdy5sb29waWZ5KGl0ZW1zKS5mb3JFYWNoKChpKSA9PiB7XG4gICAgICBjb25zdCBpbWdTcmMgPSBpLmltYWdlVXJsXG4gICAgICAgID8gZ2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgIGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSxcbiAgICAgICAgICAgICc3MjB4J1xuICAgICAgICAgIClcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGltZ1NyY0xhenkgPSBpLmltYWdlVXJsXG4gICAgICAgID8gZ2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgIGkuaW1hZ2VVcmwucmVwbGFjZSgnXycgKyBpbWFnZVNpemUoaS5pbWFnZVVybCksICcnKSxcbiAgICAgICAgICAgICcxeCdcbiAgICAgICAgICApXG4gICAgICAgIDogJyc7XG5cbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAvLyBlc2xpbnQtaWdub3JlLW5leHQtbGluZVxuICAgICAgZGl2Lm91dGVySFRNTCA9IGBcbiAgICAgICAgJHt3aW5kb3cudGhlbWUudmlkZW9TdHVkaW8udmlkZW9JdGVtVGVtcGxhdGVcbiAgICAgICAgICAucmVwbGFjZSgnJWltZ1NyYyUnLCBpbWdTcmMpXG4gICAgICAgICAgLnJlcGxhY2UoJyVpbWdTcmNMYXp5JScsIGltZ1NyY0xhenkpXG4gICAgICAgICAgLnJlcGxhY2UoJyV0aXRsZSUnLCBpLnRpdGxlKVxuICAgICAgICAgIC5yZXBsYWNlKCclZGVzY3JpcHRpb24lJywgaS5kZXNjcmlwdGlvbilcbiAgICAgICAgICAucmVwbGFjZSgnJXZpZGVvVXJsRGVza3RvcCUnLCBpLnZpZGVvVXJsRGVza3RvcClcbiAgICAgICAgICAucmVwbGFjZSgnJXZpZGVvVXJsTW9iaWxlJScsIGkudmlkZW9VcmxNb2JpbGUpfVxuICAgICAgYDtcbiAgICB9KTtcblxuICAgIHdpbmRvdy5hcHAubW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2N0YScsICdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGlubmVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJjb21wb25lbnQiLCJnZXRTaXplZEltYWdlVXJsIiwiaW1hZ2VTaXplIiwiZmV0Y2hQYWdpbmF0ZWRJdGVtcyIsIm5vZGUiLCJQQVRIX05BTUUiLCJWSUVXIiwiX3dpbmRvdyR6ZWxla3RvciIsIndpbmRvdyIsInplbGVrdG9yIiwiaW5uZXIiLCJsaXN0Iiwib25seUhhbmRsZSIsImRhdGFzZXQiLCJwYWdlU2l6ZSIsInBhcnNlSW50IiwicGFnZXMiLCJpbml0IiwiX2luaXQiLCJfY2FsbGVlIiwidXJsIiwiZGF0YSIsIl9jb250ZXh0IiwiVVJMIiwibG9jYXRpb24iLCJvcmlnaW4iLCJwYXRobmFtZSIsInNlYXJjaFBhcmFtcyIsInNldCIsInJlbmRlckl0ZW1zIiwiZmluZCIsImhhbmRsZSIsInB1c2giLCJzcGxpY2UiLCJyZW5kZXJDb250ZW50IiwiY3JlYXRlUGFnaW5hdGlvbiIsIml0ZW1zIiwibG9vcGlmeSIsImZvckVhY2giLCJpbWdTcmMiLCJpbWFnZVVybCIsInJlcGxhY2UiLCJpbWdTcmNMYXp5IiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJjb25jYXQiLCJ0aGVtZSIsInZpZGVvU3R1ZGlvIiwidmlkZW9JdGVtVGVtcGxhdGUiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwidmlkZW9VcmxEZXNrdG9wIiwidmlkZW9VcmxNb2JpbGUiLCJhcHAiLCJtb3VudCIsImJ0biIsImNsYXNzTGlzdCIsImFkZCIsInRleHRDb250ZW50Iiwic3RyaW5ncyIsImxheW91dCIsImxvYWRNb3JlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZSJdLCJzb3VyY2VSb290IjoiIn0= 1043//# sourceURL=webpack-internal:///./src/scripts/components/blog/results-page.js 1044 1045}`)},"./src/scripts/components/blog/video-studio.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1046/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1047/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 1048/* harmony export */ }); 1049/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"); 1050/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js"); 1051/* harmony import */ var _components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/home/product-slider.js */ "./src/scripts/components/home/product-slider.js"); 1052/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js"); 1053/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js"); 1054/* harmony import */ var _lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/fetch-paginated-items */ "./src/scripts/lib/fetch-paginated-items.js"); 1055function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1055 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 1056function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 1057function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 1058function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 1059 1060 1061 1062 1063 1064 1065/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) { 1066 var _window$zelektor = window.zelektor(node), 1067 listWrapper = _window$zelektor.listWrapper, 1068 list = _window$zelektor.list, 1069 sliderWrapperDesktop = _window$zelektor.sliderWrapperDesktop, 1070 sliderElDesktop = _window$zelektor.sliderElDesktop, 1071 sliderWrapperMobile = _window$zelektor.sliderWrapperMobile, 1072 sliderElMobile = _window$zelektor.sliderElMobile, 1073 prev = _window$zelektor.prev, 1074 next = _window$zelektor.next, 1075 progressWrapper = _window$zelektor.progressWrapper, 1076 progress = _window$zelektor.progress, 1077 scrollIndicator = _window$zelektor.scrollIndicator; 1078 var PATH_NAME = 'blogs/video-studio'; 1079 var VIEW = 'data_video-studio'; 1080 var onlyHandle = node.dataset.onlyHandle; 1081 var pageSize = parseInt(node.dataset.pageSize); 1082 var pages = []; 1083 window.addEventListener('resize', function () { 1084 return (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.initScroll)(sliderElMobile, scrollIndicator); 1085 }); 1086 sliderWrapperMobile === null || sliderWrapperMobile === void 0 || sliderWrapperMobile.addEventListener('scroll', function () { 1087 return (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateScroll)(sliderWrapperMobile, progressWrapper, scrollIndicator); 1088 }); 1089 init(); 1090 function init() { 1091 return _init.apply(this, arguments); 1092 } 1093 function _init() { 1094 _init = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 1095 var url, data; 1096 return _regenerator().w(function (_context) { 1097 while (1) switch (_context.n) { 1098 case 0: 1099 // We use same component on video studio blog and article, so we perform 1100 // some checks to distinguish. If on article, only load the article with 1101 // same handle as onlyHandle, and don't create sliders 1102 if (sliderElDesktop && sliderElMobile) window.awaitVendorScript('keenSlider', initSlider); 1103 url = new URL(location.origin); 1104 url.pathname = PATH_NAME; 1105 url.searchParams.set('view', VIEW); 1106 _context.n = 1; 1107 return (0,_lib_fetch_paginated_items__WEBPACK_IMPORTED_MODULE_5__["default"])(url); 1108 case 1: 1109 data = _context.v; 1110 if (onlyHandle) { 1111 renderItems(data.find(function (i) { 1112 return i.handle === onlyHandle; 1113 })); 1114 } else { 1115 while (data.length) { 1116 pages.push(data.splice(0, pageSize)); 1117 } 1118 renderContent(); 1119 if (pages.length) { 1120 createPagination(); 1121 } 1122 } 1123 window.app.mount(); 1124 case 2: 1125 return _context.a(2); 1126 } 1127 }, _callee); 1128 })); 1129 return _init.apply(this, arguments); 1130 } 1131 function renderContent() { 1132 renderItems(pages.splice(0, 1)[0]); 1133 } 1134 function renderItems(items) {
1135 window.loopify(items).forEach(function (i) { 1136 var imgSrc = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.imageSize)(i.imageUrl), ''), '720x') : ''; 1137 var imgSrcLazy = i.imageUrl ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.getSizedImageUrl)(i.imageUrl.replace('_' + (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_3__.imageSize)(i.imageUrl), ''), '1x') : ''; 1138 var div = document.createElement('li'); 1139 list.appendChild(div); 1140 div.classList.add('video-studio__list__item', 'grid__item'); 1141 div.innerHTML = " \\n ".concat(window.theme.videoStudio.videoItemTemplate.replace('%imgSrc%', imgSrc).replace('%imgSrcLazy%', imgSrcLazy).replace('%title%', i.title).replace('%description%', i.description).replace('%videoUrlDesktop%', i.videoUrlDesktop).replace('%videoUrlMobile%', i.videoUrlMobile), "\\n "); 1142 var YT_VID_REGEX = /^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?]*).*/; 1143 if (div && i.videoUrlDesktop.includes('youtube.com')) { 1144 i.videoUrlDesktop = i.videoUrlDesktop.match(YT_VID_REGEX)[1]; 1145 var deskVidEl = div.querySelector('.js-videoDesktop'); 1146 if (deskVidEl) { 1147 var wrapper = deskVidEl.parentNode; 1148 deskVidEl.remove(); 1149 if (wrapper) { 1150 /* prettier-ignore-next-line */ 1151 wrapper.insertAdjacentHTML('beforeend', "\\n <iframe\\n src='https://www.youtube.com/embed/".concat(i.videoUrlDesktop, "'\\n title='YouTube video player'\\n frameborder='0'\\n loading='lazy'\\n class='video-modal__video video-modal__video--desktop js-videoDesktop'\\n allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\\n allowfullscreen\\n ></iframe>\\n ")); 1152 } 1153 } 1154 } 1155 if (div && i.videoUrlMobile.includes('youtube.com')) { 1156 i.videoUrlMobile = i.videoUrlMobile.match(YT_VID_REGEX)[1]; 1157 var mobVidEl = div.querySelector('.js-videoMobile'); 1158 if (mobVidEl) { 1159 var _wrapper = mobVidEl.parentNode; 1160 mobVidEl.remove(); 1161 if (_wrapper) { 1162 /* prettier-ignore-next-line */ 1163 _wrapper.insertAdjacentHTML('beforeend', "\\n <iframe\\n src='https://www.youtube.com/embed/".concat(i.videoUrlMobile, "'\\n title='YouTube video player'\\n frameborder='0'\\n loading='lazy'\\n class='video-modal__video video-modal__video--mobile js-videoMobile'\\n allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\\n allowfullscreen\\n ></iframe>\\n ")); 1164 } 1165 } 1166 } 1167 }); 1168 window.app.mount(); 1169 } 1170 function createPagination() { 1171 var btn = document.createElement('button'); 1172 btn.classList.add('cta', 'cta--filled-dark'); 1173 btn.textContent = window.theme.strings.layout.loadMore; 1174 listWrapper.appendChild(btn); 1175 btn.addEventListener('click', function () { 1176 renderContent(); 1177 if (!pages.length) { 1178 btn.remove(); 1179 } 1180 }); 1181 } 1182 function initSlider() { 1183 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.addClasses)(sliderElDesktop); 1184 1185 // eslint-disable-next-line no-unused-vars 1186 var slider = new keen_slider__WEBPACK_IMPORTED_MODULE_4__["default"](sliderElDesktop, { 1187 slidesPerView: 3, 1188 spacing: 20, 1189 duration: 700, 1190 controls: false, 1191 created: function created(inst) { 1192 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initSliderWrapper)(sliderWrapperDesktop); 1193 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initArrows)(inst, prev, next); 1194 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next); 1195 (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateProgress)(inst, progress); 1196 }, 1197 slideChanged: function slideChanged(inst) { 1198 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next); 1199 (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateProgress)(inst, progress); 1200 } 1201 }); 1202 (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.initScroll)(sliderElMobile, scrollIndicator); 1203 (0,_components_home_product_slider_js__WEBPACK_IMPORTED_MODULE_2__.updateScroll)(sliderWrapperMobile, progressWrapper, scrollIndicator); 1204 } 1205}));//# sourceURL=[module] 1206//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2Jsb2cvdmlkZW8tc3R1ZGlvLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFB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ElBQUksQ0FBQ3JCLEtBQUssQ0FBQy9ELE1BQU0sRUFBRTtRQUNqQndILEdBQUcsQ0FBQ0gsTUFBTSxDQUFDLENBQUM7TUFDZDtJQUNGLENBQUMsQ0FBQztFQUNKO0VBRUEsU0FBUzdDLFVBQVVBLENBQUEsRUFBRztJQUNwQnpDLCtEQUFVLENBQUNrQixlQUFlLENBQUM7O0lBRTNCO0lBQ0EsSUFBTTRFLE1BQU0sR0FBRyxJQUFJckYsbURBQVUsQ0FBQ1MsZUFBZSxFQUFFO01BQzdDNkUsYUFBYSxFQUFFLENBQUM7TUFDaEJDLE9BQU8sRUFBRSxFQUFFO01BQ1hDLFFBQVEsRUFBRSxHQUFHO01BQ2JDLFFBQVEsRUFBRSxLQUFLO01BQ2ZDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFHQyxJQUFJLEVBQUs7UUFDakJuRyxzRUFBaUIsQ0FBQ2dCLG9CQUFvQixDQUFDO1FBQ3ZDZiwrREFBVSxDQUFDa0csSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDNUJuQixpRUFBWSxDQUFDaUcsSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDOUJsQixrRkFBYyxDQUFDZ0csSUFBSSxFQUFFNUUsUUFBUSxDQUFDO01BQ2hDLENBQUM7TUFDRDZFLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFHRCxJQUFJLEVBQUs7UUFDdEJqRyxpRUFBWSxDQUFDaUcsSUFBSSxFQUFFL0UsSUFBSSxFQUFFQyxJQUFJLENBQUM7UUFDOUJsQixrRkFBYyxDQUFDZ0csSUFBSSxFQUFFNUUsUUFBUSxDQUFDO01BQ2hDO0lBQ0YsQ0FBQyxDQUFDO0lBRUZuQiw4RUFBVSxDQUFDZSxjQUFjLEVBQUVLLGVBQWUsQ0FBQztJQUMzQ25CLGdGQUFZLENBQUNhLG1CQUFtQixFQUFFSSxlQUFlLEVBQUVFLGVBQWUsQ0FBQztFQUNyRTtBQUNGLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2NvbXBvbmVudHMvYmxvZy92aWRlby1zdHVkaW8uanM/Yjc4NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGFkZENsYXNzZXMsIGluaXRTbGlkZXJXcmFwcGVyLCBpbml0QXJyb3dzLCB1cGRhdGVBcnJvd3MgfSBmcm9tICdAL2xpYi9rZWVuLXNsaWRlci5qcyc7XG5pbXBvcnQgeyB1cGRhdGVQcm9ncmVzcywgaW5pdFNjcm9sbCwgdXBkYXRlU2Nyb2xsIH0gZnJvbSAnQC9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanMnO1xuaW1wb3J0IHsgZ2V0U2l6ZWRJbWFnZVVybCwgaW1hZ2VTaXplIH0gZnJvbSAnQC9saWIvaW1hZ2VzLmpzJztcbmltcG9ydCBLZWVuU2xpZGVyIGZyb20gJ2tlZW4tc2xpZGVyJztcbmltcG9ydCBmZXRjaFBhZ2luYXRlZEl0ZW1zIGZyb20gJ0AvbGliL2ZldGNoLXBhZ2luYXRlZC1pdGVtcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCgobm9kZSkgPT4ge1xuICBjb25zdCB7XG4gICAgbGlzdFdyYXBwZXIsXG4gICAgbGlzdCxcbiAgICBzbGlkZXJXcmFwcGVyRGVza3RvcCxcbiAgICBzbGlkZXJFbERlc2t0b3AsXG4gICAgc2xpZGVyV3JhcHBlck1vYmlsZSxcbiAgICBzbGlkZXJFbE1vYmlsZSxcbiAgICBwcmV2LFxuICAgIG5leHQsXG4gICAgcHJvZ3Jlc3NXcmFwcGVyLFxuICAgIHByb2dyZXNzLFxuICAgIHNjcm9sbEluZGljYXRvcixcbiAgfSA9IHdpbmRvdy56ZWxla3Rvcihub2RlKTtcblxuICBjb25zdCBQQVRIX05BTUUgPSAnYmxvZ3MvdmlkZW8tc3R1ZGlvJztcbiAgY29uc3QgVklFVyA9ICdkYXRhX3ZpZGVvLXN0dWRpbyc7XG5cbiAgY29uc3QgeyBvbmx5SGFuZGxlIH0gPSBub2RlLmRhdGFzZXQ7XG5cbiAgY29uc3QgcGFnZVNpemUgPSBwYXJzZUludChub2RlLmRhdGFzZXQucGFnZVNpemUpO1xuICBjb25zdCBwYWdlcyA9IFtdO1xuXG4gIHdpbmRvdy5hZGR
1206FdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PlxuICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcilcbiAgKTtcbiAgc2xpZGVyV3JhcHBlck1vYmlsZT8uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT5cbiAgICB1cGRhdGVTY3JvbGwoc2xpZGVyV3JhcHBlck1vYmlsZSwgcHJvZ3Jlc3NXcmFwcGVyLCBzY3JvbGxJbmRpY2F0b3IpXG4gICk7XG5cbiAgaW5pdCgpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgLy8gV2UgdXNlIHNhbWUgY29tcG9uZW50IG9uIHZpZGVvIHN0dWRpbyBibG9nIGFuZCBhcnRpY2xlLCBzbyB3ZSBwZXJmb3JtXG4gICAgLy8gc29tZSBjaGVja3MgdG8gZGlzdGluZ3Vpc2guIElmIG9uIGFydGljbGUsIG9ubHkgbG9hZCB0aGUgYXJ0aWNsZSB3aXRoXG4gICAgLy8gc2FtZSBoYW5kbGUgYXMgb25seUhhbmRsZSwgYW5kIGRvbid0IGNyZWF0ZSBzbGlkZXJzXG4gICAgaWYgKHNsaWRlckVsRGVza3RvcCAmJiBzbGlkZXJFbE1vYmlsZSlcbiAgICAgIHdpbmRvdy5hd2FpdFZlbmRvclNjcmlwdCgna2VlblNsaWRlcicsIGluaXRTbGlkZXIpO1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChsb2NhdGlvbi5vcmlnaW4pO1xuICAgIHVybC5wYXRobmFtZSA9IFBBVEhfTkFNRTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndmlldycsIFZJRVcpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoUGFnaW5hdGVkSXRlbXModXJsKTtcblxuICAgIGlmIChvbmx5SGFuZGxlKSB7XG4gICAgICByZW5kZXJJdGVtcyhkYXRhLmZpbmQoKGkpID0+IGkuaGFuZGxlID09PSBvbmx5SGFuZGxlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChkYXRhLmxlbmd0aCkge1xuICAgICAgICBwYWdlcy5wdXNoKGRhdGEuc3BsaWNlKDAsIHBhZ2VTaXplKSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlckNvbnRlbnQoKTtcblxuICAgICAgaWYgKHBhZ2VzLmxlbmd0aCkge1xuICAgICAgICBjcmVhdGVQYWdpbmF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2luZG93LmFwcC5tb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICByZW5kZXJJdGVtcyhwYWdlcy5zcGxpY2UoMCwgMSlbMF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVySXRlbXMoaXRlbXMpIHtcbiAgICB3aW5kb3cubG9vcGlmeShpdGVtcykuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3QgaW1nU3JjID0gaS5pbWFnZVVybFxuICAgICAgICA/IGdldFNpemVkSW1hZ2VVcmwoXG4gICAgICAgICAgICBpLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGkuaW1hZ2VVcmwpLCAnJyksXG4gICAgICAgICAgICAnNzIweCdcbiAgICAgICAgICApXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBpbWdTcmNMYXp5ID0gaS5pbWFnZVVybFxuICAgICAgICA/IGdldFNpemVkSW1hZ2VVcmwoXG4gICAgICAgICAgICBpLmltYWdlVXJsLnJlcGxhY2UoJ18nICsgaW1hZ2VTaXplKGkuaW1hZ2VVcmwpLCAnJyksXG4gICAgICAgICAgICAnMXgnXG4gICAgICAgICAgKVxuICAgICAgICA6ICcnO1xuXG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgbGlzdC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLXN0dWRpb19fbGlzdF9faXRlbScsICdncmlkX19pdGVtJyk7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYCAgICAgICAgIFxuICAgICAgICAgICAgICAke3dpbmRvdy50aGVtZS52aWRlb1N0dWRpby52aWRlb0l0ZW1UZW1wbGF0ZVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclaW1nU3JjJScsIGltZ1NyYylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWltZ1NyY0xhenklJywgaW1nU3JjTGF6eSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnJXRpdGxlJScsIGkudGl0bGUpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVkZXNjcmlwdGlvbiUnLCBpLmRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcldmlkZW9VcmxEZXNrdG9wJScsIGkudmlkZW9VcmxEZXNrdG9wKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcldmlkZW9VcmxNb2JpbGUlJywgaS52aWRlb1VybE1vYmlsZSl9XG4gICAgICAgICAgICBgO1xuXG4gICAgICBjb25zdCBZVF9WSURfUkVHRVggPVxuICAgICAgICAvXi4qKD86KD86eW91dHVcXC5iZVxcL3x2XFwvfHZpXFwvfHVcXC9cXHdcXC98ZW1iZWRcXC98c2hvcnRzXFwvKXwoPzooPzp3YXRjaCk/XFw/dig/OmkpPz18XFwmdig/OmkpPz0pKShbXiNcXCZcXD9dKikuKi87XG5cbiAgICAgIGlmIChkaXYgJiYgaS52aWRlb1VybERlc2t0b3AuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykpIHtcbiAgICAgICAgaS52aWRlb1VybERlc2t0b3AgPSBpLnZpZG
1206VvVXJsRGVza3RvcC5tYXRjaChZVF9WSURfUkVHRVgpWzFdO1xuXG4gICAgICAgIGNvbnN0IGRlc2tWaWRFbCA9IGRpdi5xdWVyeVNlbGVjdG9yKCcuanMtdmlkZW9EZXNrdG9wJyk7XG5cbiAgICAgICAgaWYgKGRlc2tWaWRFbCkge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkZXNrVmlkRWwucGFyZW50Tm9kZTtcbiAgICAgICAgICBkZXNrVmlkRWwucmVtb3ZlKCk7XG5cbiAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgLyogcHJldHRpZXItaWdub3JlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgd3JhcHBlci5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICAgICAgICdiZWZvcmVlbmQnLFxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgPGlmcmFtZVxuICAgICAgICAgICAgICAgICAgc3JjPSdodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2kudmlkZW9VcmxEZXNrdG9wfSdcbiAgICAgICAgICAgICAgICAgIHRpdGxlPSdZb3VUdWJlIHZpZGVvIHBsYXllcidcbiAgICAgICAgICAgICAgICAgIGZyYW1lYm9yZGVyPScwJ1xuICAgICAgICAgICAgICAgICAgbG9hZGluZz0nbGF6eSdcbiAgICAgICAgICAgICAgICAgIGNsYXNzPSd2aWRlby1tb2RhbF9fdmlkZW8gdmlkZW8tbW9kYWxfX3ZpZGVvLS1kZXNrdG9wIGpzLXZpZGVvRGVza3RvcCdcbiAgICAgICAgICAgICAgICAgIGFsbG93PSdhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlJ1xuICAgICAgICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICAgICAgPjwvaWZyYW1lPlxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGl2ICYmIGkudmlkZW9VcmxNb2JpbGUuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykpIHtcbiAgICAgICAgaS52aWRlb1VybE1vYmlsZSA9IGkudmlkZW9VcmxNb2JpbGUubWF0Y2goWVRfVklEX1JFR0VYKVsxXTtcblxuICAgICAgICBjb25zdCBtb2JWaWRFbCA9IGRpdi5xdWVyeVNlbGVjdG9yKCcuanMtdmlkZW9Nb2JpbGUnKTtcblxuICAgICAgICBpZiAobW9iVmlkRWwpIHtcbiAgICAgICAgICBjb25zdCB3cmFwcGVyID0gbW9iVmlkRWwucGFyZW50Tm9kZTtcblxuICAgICAgICAgIG1vYlZpZEVsLnJlbW92ZSgpO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICAgIHdyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgICAgICAgICAnYmVmb3JlZW5kJyxcbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgIDxpZnJhbWVcbiAgICAgICAgICAgICAgICAgIHNyYz0naHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpLnZpZGVvVXJsTW9iaWxlfSdcbiAgICAgICAgICAgICAgICAgIHRpdGxlPSdZb3VUdWJlIHZpZGVvIHBsYXllcidcbiAgICAgICAgICAgICAgICAgIGZyYW1lYm9yZGVyPScwJ1xuICAgICAgICAgICAgICAgICAgbG9hZGluZz0nbGF6eSdcbiAgICAgICAgICAgICAgICAgIGNsYXNzPSd2aWRlby1tb2RhbF9fdmlkZW8gdmlkZW8tbW9kYWxfX3ZpZGVvLS1tb2JpbGUganMtdmlkZW9Nb2JpbGUnXG4gICAgICAgICAgICAgICAgICBhbGxvdz0nYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSdcbiAgICAgICAgICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgICAgICAgID48L2lmcmFtZT5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdpbmRvdy5hcHAubW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2N0YScsICdjdGEtLWZpbGxlZC1kYXJrJyk7XG4gICAgYnRuLnRleHRDb250ZW50ID0gd2luZG93LnRoZW1lLnN0cmluZ3MubGF5b3V0LmxvYWRNb3JlO1xuICAgIGxpc3RXcmFwcGVyLmFwcGVuZENoaWxkKGJ0bik7XG5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXJDb250ZW50KCk7XG5cbiAgICAgIGlmICghcGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGJ0bi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRTbGlkZXIoKSB7XG4gICAgYWRkQ2xhc3NlcyhzbGlkZXJFbERlc2t0b3ApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3Qgc2xpZGVyID0gbmV3IEtlZW5TbGlkZXIoc2xpZGVyRWxEZXNrdG9wLCB7XG4gICAgICBzbGlkZXNQZXJWaWV3OiAzLFxuICAgICAgc3BhY2luZzogMjAsXG4gICAgICBkdXJhdGlvbjogNzAwLFxuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgY3JlYXRlZDogKGluc3QpID0+IHtcbiAgICAgICAgaW5pdFNsaWRlcldyYXBwZXIoc2xpZGVyV3JhcHBlckRlc2t0b3ApO1xuICAgICAgICBpbml0QXJyb3dzKGluc3QsIHByZXYsIG5leHQpO1xuICAgICAgICB1cGRhdGVBcnJvd3MoaW5zdCwgcHJldiwgbmV4dCk7XG4gICAgICAgIHVwZGF0ZVByb2dyZXNzKGluc3QsIHByb2dyZXNzKTtcbiAgICAgIH0sXG4gICAgICBzbGlkZUNoYW5nZWQ6IChpbnN0KSA9PiB7XG4gICAgICAgIHVwZGF0ZUFycm93cyhpbnN0LCBwcmV2LCBuZXh0KTtcbiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoaW5zdCwgcHJvZ3Jlc3MpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcik7XG4gICAgdXBkYXRlU2Nyb2xsKHNsaWRlcldyYXBwZXJNb2JpbGUsIHByb2dyZXNzV3JhcHBlciwgc2Nyb2xsSW5kaWNhdG9yKTtcbiAgfVxufSk7XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJ
vendor: 5,269 bytes, lines 1206-1222
1206jb21wb25lbnQiLCJhZGRDbGFzc2VzIiwiaW5pdFNsaWRlcldyYXBwZXIiLCJpbml0QXJyb3dzIiwidXBkYXRlQXJyb3dzIiwidXBkYXRlUHJvZ3Jlc3MiLCJpbml0U2Nyb2xsIiwidXBkYXRlU2Nyb2xsIiwiZ2V0U2l6ZWRJbWFnZVVybCIsImltYWdlU2l6ZSIsIktlZW5TbGlkZXIiLCJmZXRjaFBhZ2luYXRlZEl0ZW1zIiwibm9kZSIsIl93aW5kb3ckemVsZWt0b3IiLCJ3aW5kb3ciLCJ6ZWxla3RvciIsImxpc3RXcmFwcGVyIiwibGlzdCIsInNsaWRlcldyYXBwZXJEZXNrdG9wIiwic2xpZGVyRWxEZXNrdG9wIiwic2xpZGVyV3JhcHBlck1vYmlsZSIsInNsaWRlckVsTW9iaWxlIiwicHJldiIsIm5leHQiLCJwcm9ncmVzc1dyYXBwZXIiLCJwcm9ncmVzcyIsInNjcm9sbEluZGljYXRvciIsIlBBVEhfTkFNRSIsIlZJRVciLCJvbmx5SGFuZGxlIiwiZGF0YXNldCIsInBhZ2VTaXplIiwicGFyc2VJbnQiLCJwYWdlcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbml0IiwiX2luaXQiLCJfY2FsbGVlIiwidXJsIiwiZGF0YSIsIl9jb250ZXh0IiwiYXdhaXRWZW5kb3JTY3JpcHQiLCJpbml0U2xpZGVyIiwiVVJMIiwibG9jYXRpb24iLCJvcmlnaW4iLCJwYXRobmFtZSIsInNlYXJjaFBhcmFtcyIsInNldCIsInJlbmRlckl0ZW1zIiwiZmluZCIsImhhbmRsZSIsInB1c2giLCJzcGxpY2UiLCJyZW5kZXJDb250ZW50IiwiY3JlYXRlUGFnaW5hdGlvbiIsImFwcCIsIm1vdW50IiwiaXRlbXMiLCJsb29waWZ5IiwiZm9yRWFjaCIsImltZ1NyYyIsImltYWdlVXJsIiwicmVwbGFjZSIsImltZ1NyY0xhenkiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsImNsYXNzTGlzdCIsImFkZCIsImlubmVySFRNTCIsImNvbmNhdCIsInRoZW1lIiwidmlkZW9TdHVkaW8iLCJ2aWRlb0l0ZW1UZW1wbGF0ZSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJ2aWRlb1VybERlc2t0b3AiLCJ2aWRlb1VybE1vYmlsZSIsIllUX1ZJRF9SRUdFWCIsImluY2x1ZGVzIiwibWF0Y2giLCJkZXNrVmlkRWwiLCJxdWVyeVNlbGVjdG9yIiwid3JhcHBlciIsInBhcmVudE5vZGUiLCJyZW1vdmUiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJtb2JWaWRFbCIsImJ0biIsInRleHRDb250ZW50Iiwic3RyaW5ncyIsImxheW91dCIsImxvYWRNb3JlIiwic2xpZGVyIiwic2xpZGVzUGVyVmlldyIsInNwYWNpbmciLCJkdXJhdGlvbiIsImNvbnRyb2xzIiwiY3JlYXRlZCIsImluc3QiLCJzbGlkZUNoYW5nZWQiXSwic291cmNlUm9vdCI6IiJ9 1207//# sourceURL=webpack-internal:///./src/scripts/components/blog/video-studio.js 1208 1209}`)},"./src/scripts/components/home/product-slider.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1210/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1211/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), 1212/* harmony export */ initScroll: () => (/* binding */ initScroll), 1213/* harmony export */ updateProgress: () => (/* binding */ updateProgress), 1214/* harmony export */ updateScroll: () => (/* binding */ updateScroll) 1215/* harmony export */ }); 1216/* harmony import */ var picoapp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! picoapp */ "./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"); 1217/* harmony import */ var _lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/keen-slider.js */ "./src/scripts/lib/keen-slider.js"); 1218/* harmony import */ var keen_slider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! keen-slider */ "./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js"); 1219/* harmony import */ var _lib_string_memory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/string-memory */ "./src/scripts/lib/string-memory.js"); 1220/* harmony import */ var _lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/product-card.js */ "./src/scripts/lib/product-card.js"); 1221/* harmony import */ var _lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/utility-functions */ "./src/scripts/lib/utility-functions.js"); 1222function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1222 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 1223function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 1224function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 1225function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 1226function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 1227function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 1228function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 1229function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } 1230function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 1231function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 1232 1233 1234 1235 1236 1237 1238function updateProgress(sliderInstance, progress) { 1239 var _sliderInstance$detai = sliderInstance.details(), 1240 size = _sliderInstance$detai.size, 1241 relativeSlide = _sliderInstance$detai.relativeSlide, 1242 slidesPerView = _sliderInstance$detai.slidesPerView; 1243 var left = relativeSlide / size * 100; 1244 var width = slidesPerView / size * 100; 1245 progress.style.left = "".concat(left, "%"); 1246 progress.style.width = "".concat(width, "%"); 1247} 1248function initScroll(sliderElement, scrollIndicator) { 1249 var slides = _toConsumableArray(sliderElement.children).length; 1250 var width = 100 / slides; 1251 scrollIndicator.style.width = "".concat(width, "%"); 1252} 1253function updateScroll(sliderWrapper, progressWrapper, scrollIndicator) { 1254 var scrollPos = sliderWrapper.scrollLeft; 1255 var width = sliderWrapper.scrollWidth - sliderWrapper.clientWidth; 1256 var scrolled = scrollPos / width * 100; 1257 var fraction = progressWrapper.offsetWidth / scrollIndicator.offsetWidth; 1258 var translateVal = scrolled * (fraction - 1); 1259 scrollIndicator.style.transform = "translateX(".concat(translateVal, "%)"); 1260} 1261/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,picoapp__WEBPACK_IMPORTED_MODULE_0__.component)(function (node) { 1262 var sliderWrapperDesktop = node.querySelector('.js-sliderWrapperDesktop'); 1263 var sliderWrapperMobile = node.querySelector('.js-sliderWrapperMobile'); 1264 var sliderElDesktop = node.querySelector('.js-sliderElDesktop'); 1265 var sliderElMobile = node.querySelector('.js-sliderElMobile'); 1266 var prev = node.querySelector('.js-prev'); 1267 var next = node.querySelector('.js-next'); 1268 var progressWrapper = node.querySelector('.js-progressWrapper'); 1269 var progress = node.querySelector('.js-progress'); 1270 var scrollIndicator = node.querySelector('.js-scrollIndicator'); 1271 var _node$dataset = node.dataset, 1272 source = _node$dataset.source, 1273 clerkEndpoint = _node$dataset.clerkEndpoint, 1274 limit = _node$dataset.limit; 1275 var SLIDE_WIDTH = 250; 1276 var createSlider = function createSlider() { 1277 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.addClasses)(sliderElDesktop); 1278 new keen_slider__WEBPACK_IMPORTED_MODULE_2__["default"](sliderElDesktop, { 1279 slidesPerView: function slidesPerView() { 1280 return sliderElDesktop.offsetWidth / SLIDE_WIDTH; 1281 }, 1282 spacing: 15, 1283 duration: 700, 1284 controls: false, 1285 created: function created(inst) { 1286 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initSliderWrapper)(sliderWrapperDesktop); 1287 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.initArrows)(inst, prev, next); 1288 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next); 1289 updateProgress(inst, progress); 1290 }, 1291 slideChanged: function slideChanged(inst) { 1292 (0,_lib_keen_slider_js__WEBPACK_IMPORTED_MODULE_1__.updateArrows)(inst, prev, next); 1293 updateProgress(inst, progress); 1294 } 1295 }); 1296 initScroll(sliderElMobile, scrollIndicator); 1297 updateScroll(sliderWrapperMobile, progressWrapper, scrollIndicator); 1298 window.dispatchEvent(new Event('resize')); 1299 }; 1300 var fetchClerkProducts = /*#__PURE__*/function () { 1301 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() { 1302 var memory; 1303 return _regenerator().w(function (_context4) { 1304 while (1) switch (_context4.n) { 1305 case 0: 1306 memory = (0,_lib_string_memory__WEBPACK_IMPORTED_MODULE_3__["default"])(sessionStorage); 1307 return _context4.a(2, new Promise(function (resolve) { 1308 window.Clerk('call', clerkEndpoint, { 1309 labels: ['Product slider'], 1310 limit: parseInt(limit), 1311 attributes: ['handle', 'description'] 1312 }, /*#__PURE__*/function () { 1313 var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(response) { 1314 var handles, promises, results, products; 1315 return _regenerator().w(function (_context3) { 1316 while (1) switch (_context3.n) { 1317 case 0: 1318 handles = response.product_data.map(function (item) { 1319 return item.handle; 1320 }); 1321 promises = handles.map(/*#__PURE__*/function () { 1322 var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(handle) { 1323 var memoryOrResponse; 1324 return _regenerator().w(function (_context2) { 1325 while (1) switch (_context2.n) { 1326 case 0: 1327 _context2.n = 1; 1328 return memory.get("product-".concat(handle), /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 1329 var response, json, _t; 1330 return _regenerator().w(function (_context) { 1331 while (1) switch (_context.n) { 1332 case 0: 1333 _context.n = 1; 1334 return fetch("/products/".concat(handle, "?view=data")); 1335 case 1: 1336 response = _context.v; 1337 if (!response.ok) { 1338 _context.n = 3; 1339 break; 1340 } 1341 _context.n = 2; 1342 return response.json(); 1343 case 2: 1344 _t = _context.v; 1345 _context.n = 4; 1346 break; 1347 case 3: 1348 _t = null; 1349 case 4: 1350 json = _t; 1351 return _context.a(2, JSON.stringify(json !== null && json !== void 0 ? json : {})); 1352 } 1353 }, _callee); 1354 }))); 1355 case 1: 1356 memoryOrResponse = _context2.v; 1357 return _context2.a(2, JSON.parse(memoryOrResponse)); 1358 } 1359 }, _callee2); 1360 })); 1361 return function (_x2) { 1362 return _ref3.apply(this, arguments); 1363 }; 1364 }()); 1365 _context3.n = 1; 1366 return Promise.all(promises); 1367 case 1:
1368 results = _context3.v; 1369 products = results.filter(function (result) { 1370 return Object.keys(result).length; 1371 }); 1372 resolve(products); 1373 case 2: 1374 return _context3.a(2); 1375 } 1376 }, _callee3); 1377 })); 1378 return function (_x) { 1379 return _ref2.apply(this, arguments); 1380 }; 1381 }(), function (error) { 1382 console.error(error); 1383 }); 1384 })); 1385 } 1386 }, _callee4); 1387 })); 1388 return function fetchClerkProducts() { 1389 return _ref.apply(this, arguments); 1390 }; 1391 }(); 1392 var renderClerkProducts = function renderClerkProducts(products) { 1393 products.forEach(function (product) { 1394 product.description = product.description.split('%%%')[0].replaceAll('<p>', '').replaceAll('</p>', ''); 1395 var htmlDesktop = products.map(function (product) { 1396 return "<li\\n class=\\"product-slider__slide product-slider__slide--desktop\\"\\n data-clerk-product-id=\\"".concat(product.id, "\\"\\n >\\n ").concat((0,_lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__["default"])(product, '', { 1397 showQuickBuy: true 1398 }), "\\n </li>"); 1399 }).join(''); 1400 var htmlMobile = products.map(function (product) { 1401 return "<li\\n class=\\"product-slider__slide product-slider__slide--mobile\\"\\n data-clerk-product-id=\\"".concat(product.id, "\\"\\n >\\n ").concat((0,_lib_product_card_js__WEBPACK_IMPORTED_MODULE_4__["default"])(product, '', { 1402 showQuickBuy: true 1403 }), "\\n </li>"); 1404 }).join(''); 1405 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__.clear)(sliderElDesktop); 1406 (0,_lib_utility_functions__WEBPACK_IMPORTED_MODULE_5__.clear)(sliderElMobile); 1407 sliderElDesktop.insertAdjacentHTML('beforeend', htmlDesktop); 1408 sliderElMobile.insertAdjacentHTML('beforeend', htmlMobile); 1409 app.mount(); 1410 if (window.theme.clerk.clickTracking && window.Clerk !== undefined) { 1411 window.Clerk('click', '*[data-clerk-product-id]'); 1412 } 1413 }); 1414 }; 1415 var init = /*#__PURE__*/function () { 1416 var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() { 1417 var products; 1418 return _regenerator().w(function (_context5) { 1419 while (1) switch (_context5.n) { 1420 case 0: 1421 window.addEventListener('resize', function () { 1422 initScroll(sliderElMobile, scrollIndicator); 1423 }); 1424 sliderWrapperMobile.addEventListener('scroll', function () { 1425 updateScroll(sliderWrapperMobile, progressWrapper, scrollIndicator); 1426 }); 1427 if (!(source === 'clerk')) { 1428 _context5.n = 2; 1429 break; 1430 } 1431 _context5.n = 1; 1432 return fetchClerkProducts(); 1433 case 1: 1434 products = _context5.v; 1435 renderClerkProducts(products); 1436 case 2: 1437 window.awaitVendorScript('keenSlider', createSlider); 1438 case 3: 1439 return _context5.a(2); 1440 } 1441 }, _callee5); 1442 })); 1443 return function init() { 1444 return _ref5.apply(this, arguments); 1445 }; 1446 }(); 1447 init(); 1448}));//# sourceURL=[module] 1449//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzswQkFDQSx1S0FBQUEsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLFdBQUEsOEJBQUFDLEVBQUFOLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUMsQ0FBQSxHQUFBTCxDQUFBLElBQUFBLENBQUEsQ0FBQU0sU0FBQSxZQUFBQyxTQUFBLEdBQUFQLENBQUEsR0FBQU8sU0FBQSxFQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsTUFBQSxDQUFBTCxDQUFBLENBQUFDLFNBQUEsVUFBQUssbUJBQUEsQ0FBQUgsQ0FBQSx1QkFBQVYsQ0FBQSxFQUFBRSxDQUFBLEVBQUFFLENBQUEsUUFBQUUsQ0FBQSxFQUFBQyxDQUFBLEVBQUFHLENBQUEsRUFBQUksQ0FBQSxNQUFBQyxDQUFBLEdBQUFYLENBQUEsUUFBQVksQ0FBQSxPQUFBQyxDQUFBLEtBQUFGLENBQUEsS0FBQWIsQ0FBQSxLQUFBZ0IsQ0FBQSxFQUFBcEIsQ0FBQSxFQUFBcUIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFOLENBQUEsRUFBQU0sQ0FBQSxDQUFBQyxJQUFBLENBQUF2QixDQUFBLE1BQUFzQixDQUFBLFdBQUFBLEVBQUFyQixDQUFBLEVBQUFDLENBQUEsV0FBQU0sQ0FBQSxHQUFBUCxDQUFBLEVBQUFRLENBQUEsTUFBQUcsQ0FBQSxHQUFBWixDQUFBLEVBQUFtQixDQUFBLENBQUFmLENBQUEsR0FBQUYsQ0FBQSxFQUFBbUIsQ0FBQSxnQkFBQUMsRUFBQXBCLENBQUEsRUFBQUUsQ0FBQSxTQUFBSyxDQUFBLEdBQUFQLENBQUEsRUFBQVUsQ0FBQSxHQUFBUixDQUFBLEVBQUFILENBQUEsT0FBQWlC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SUFBQSxJQUFBQyxLQUFBLEdBQUFoSixpQkFBQSxjQUFBYixZQUFBLEdBQUFFLENBQUEsQ0FBRyxTQUFBNEosU0FBQTtNQUFBLElBQUFoRCxRQUFBO01BQUEsT0FBQTlHLFlBQUEsR0FBQUMsQ0FBQSxXQUFBOEosU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEvTCxDQUFBO1VBQUE7WUFDWDJILE1BQU0sQ0FBQ3FFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFNO2NBQ3RDM0csVUFBVSxDQUFDc0IsY0FBYyxFQUFFcEIsZUFBZSxDQUFDO1lBQzdDLENBQUMsQ0FBQztZQUVGa0IsbUJBQW1CLENBQUN1RixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsWUFBTTtjQUNuRHRHLFlBQVksQ0FBQ2UsbUJBQW1CLEVBQUViLGVBQWUsRUFBRUwsZUFBZSxDQUFDO1lBQ3JFLENBQUMsQ0FBQztZQUFDLE1BRUN5QixNQUFNLEtBQUssT0FBTztjQUFBK0UsU0FBQSxDQUFBL0wsQ0FBQTtjQUFBO1lBQUE7WUFBQStMLFNBQUEsQ0FBQS9MLENBQUE7WUFBQSxPQUNHOEgsa0JBQWtCLENBQUMsQ0FBQztVQUFBO1lBQXJDZ0IsUUFBUSxHQUFBaUQsU0FBQSxDQUFBL0ssQ0FBQTtZQUNkMEosbUJBQW1CLENBQUM1QixRQUFRLENBQUM7VUFBQztZQUdoQ25CLE1BQU0sQ0FBQ3NFLGlCQUFpQixDQUFDLFlBQVksRUFBRTdFLFlBQVksQ0FBQztVQUFDO1lBQUEsT0FBQTJFLFNBQUEsQ0FBQTlLLENBQUE7UUFBQTtNQUFBLEdBQUE2SyxRQUFBO0lBQUEsQ0FDdEQ7SUFBQSxnQkFmS0YsSUFBSUEsQ0FBQTtNQUFBLE9BQUFDLEtBQUEsQ0FBQTlJLEtBQUEsT0FBQUQsU0FBQTtJQUFBO0VBQUEsR0FlVDtFQUVEOEksSUFBSSxDQUFDLENBQUM7QUFDUixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL2hvbWUvcHJvZHVjdC1zbGlkZXIuanM/NmM5YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tICdwaWNvYXBwJztcbmltcG9ydCB7IGFkZENsYXNzZXMsIGluaXRTbGlkZXJXcmFwcGVyLCBpbml0QXJyb3dzLCB1cGRhdGVBcnJvd3MgfSBmcm9tICdAL2xpYi9rZWVuLXNsaWRlci5qcyc7XG5pbXBvcnQgS2VlblNsaWRlciBmcm9tICdrZWVuLXNsaWRlcic7XG5pbXBvcnQgU3RyaW5nTWVtb3J5IGZyb20gJ0AvbGliL3N0cmluZy1tZW1vcnknO1xuaW1wb3J0IGdldFByb2R1Y3RDYXJkSHRtbCBmcm9tICdAL2xpYi9wcm9kdWN0LWNhcmQuanMnO1xuaW1wb3J0IHsgY2xlYXIgfSBmcm9tICdAL2xpYi91dGlsaXR5LWZ1bmN0aW9ucyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzcyhzbGlkZXJJbnN0YW5jZSwgcHJvZ3Jlc3MpIHtcbiAgY29uc3QgeyBzaXplLCByZWxhdGl2ZVNsaWRlLCBzbGlkZXNQZXJWaWV3IH0gPSBzbGlkZXJJbnN0YW5jZS5kZXRhaWxzKCk7XG4gIGNvbnN0IGxlZnQgPSAocmVsYXRpdmVTbGlkZSAvIHNpemUpICogMTAwO1xuICBjb25zdCB3aWR0aCA9IChzbGlkZXNQZXJWaWV3IC8gc2l6ZSkgKiAxMDA7XG5cbiAgcHJvZ3Jlc3Muc3R5bGUubGVmdCA9IGAke2xlZnR9JWA7XG4gIHByb2dyZXNzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9JWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2Nyb2xsKHNsaWRlckVsZW1lbnQsIHNjcm9sbEluZGljYXRvcikge1xuICBjb25zdCBzbGlkZXMgPSBbLi4uc2xpZGVyRWxlbWVudC5jaGlsZHJlbl0ubGVuZ3RoO1xuICBjb25zdCB3aWR0aCA9IDEwMCAvIHNsaWRlcztcblxuICBzY3JvbGxJbmRpY2F0b3Iuc3R5bGUud2lkdGggPSBgJHt3aWR0aH0lYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbChzbGlkZXJXcmFwcGVyLCBwcm9ncmVzc1dyYXBwZXIsIHNjcm9sbEluZGljYXRvcikge1xuICBjb25zdCBzY3JvbGxQb3MgPSBzbGlkZXJXcmFwcGVyLnNjcm9sbExlZnQ7XG4gIGNvbnN0IHdpZHRoID0gc2xpZGVyV3JhcHBlci5zY3JvbGxXaWR0aCAtIHNsaWRlcldyYXBwZXIuY2xpZW50V2lkdGg7XG4gIGNvbnN0IHNjcm9sbGVkID0gKHNjcm9sbFBvcyAvIHdpZHRoKSAqIDEwMDtcbiAgY29uc3QgZnJhY3Rpb24gPSBwcm9ncmVzc1dyYXBwZXIub2Zmc2V0V2lkdGggLyBzY3JvbGxJbmRpY2F0b3Iub2Zmc2V0V2lkdGg7XG4gIGNvbnN0IHRyYW5zbGF0ZVZhbCA9IHNjcm9sbGVkICogKGZyYWN0aW9uIC0gMSk7XG5cbiAgc2Nyb2xsSW5kaWNhdG9yLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlVmFsfSUpYDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlKSA9PiB7XG4gIGNvbnN0IHNsaWRlcldyYXBwZXJEZXNrdG9wID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyV3JhcHBlckRlc2t0b3AnKTtcbiAgY29uc3Qgc2xpZGVyV3JhcHBlck1vYmlsZSA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLXNsaWRlcldyYXBwZXJNb2JpbGUnKTtcbiAgY29uc3Qgc2xpZGVyRWxEZXNrdG9wID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyRWxEZXNrdG9wJyk7XG4gIGNvbnN0IHNsaWRlckVsTW9iaWxlID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGVyRWxNb2JpbGUnKTtcbiAgY29uc3QgcHJldiA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLXByZXYnKTtcbiAgY29uc3QgbmV4dCA9IG5vZGUucXVlcnlTZWxlY3RvcignLmpzLW5leHQnKTtcbiAgY29uc3QgcHJvZ3Jlc3NXcmFwcGVyID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZ3Jlc3NXcmFwcGVyJyk7XG4gIGNvbnN0IHByb2dyZXNzID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZ3Jlc3MnKTtcbiAgY29uc3Qgc2Nyb2xsSW5kaWNhdG9yID0gbm9kZS5xdWVyeVNlbGVjdG9yKCcuanMtc2Nyb2xsSW5kaWNhdG9yJyk7XG5cbiAgY29uc3QgeyBzb3VyY2UsIGNsZXJrRW5kcG9pbnQsIGxpbWl0IH0gPSBub2RlLmRhdGFzZXQ7XG5cbiAgY29uc3QgU0xJREVfV0lEVEggPSAyNTA7XG5cbiAgY29uc3QgY3JlYXRlU2xpZGVyID0gKCkgPT4ge1xuICAgIGFkZENsYXNzZXMoc2xpZGVyRWxEZXNrdG9wKVxuXG4gICAgbmV3IEtlZW5TbGlkZXIoc2xpZGVyRWxEZXNrdG9wLCB7XG4gICAgICBzbGlkZXNQZXJWaWV3OiAoKSA9PiBzbGlkZXJFbERlc2t0b3Aub2Zmc2V0V2lkdGggLyBTTElERV9XSURUSCxcbiAgICAgIHNwYWNpbmc6IDE1LFxuICAgICAgZHVyYXRpb246IDcwMCxcbiAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWQ6IChpbnN0KSA9PiB7XG4gICAgICAgIGluaXRTbGlkZXJXcmFwcGVyKHNsaWRlcldyYXBwZXJEZXNrdG9wKTtcbiAgICAgICAgaW5pdEFycm93cyhpbnN0LCBwcmV2LCBuZXh0KTtcbiAgICAgICAgdXBkYXRlQXJyb3dzKGluc3QsIHByZXYsIG5leHQpO1xuICAgICAgICB1cGRhdGVQcm9ncmVzcyhpbnN0LCBwcm9ncmVzcyk7XG4gICAgICB9LFxuICAgICAgc2xpZGVDaGFuZ2VkOiAoaW5zdCkgPT4ge1xuICAgICAgICB1cGRhdGVBcnJvd3MoaW5zdCwgcHJldiwgbmV4dCk7XG4gICAgICAgI
1449HVwZGF0ZVByb2dyZXNzKGluc3QsIHByb2dyZXNzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpbml0U2Nyb2xsKHNsaWRlckVsTW9iaWxlLCBzY3JvbGxJbmRpY2F0b3IpO1xuICAgIHVwZGF0ZVNjcm9sbChzbGlkZXJXcmFwcGVyTW9iaWxlLCBwcm9ncmVzc1dyYXBwZXIsIHNjcm9sbEluZGljYXRvcik7XG5cbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Jlc2l6ZScpKTtcbiAgfTtcblxuICBjb25zdCBmZXRjaENsZXJrUHJvZHVjdHMgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWVtb3J5ID0gU3RyaW5nTWVtb3J5KHNlc3Npb25TdG9yYWdlKVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB3aW5kb3cuQ2xlcmsoJ2NhbGwnLFxuICAgICAgICBjbGVya0VuZHBvaW50LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWxzOiBbJ1Byb2R1Y3Qgc2xpZGVyJ10sXG4gICAgICAgICAgbGltaXQ6IHBhcnNlSW50KGxpbWl0KSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbICdoYW5kbGUnLCAnZGVzY3JpcHRpb24nIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXMgPSByZXNwb25zZS5wcm9kdWN0X2RhdGEubWFwKChpdGVtKSA9PiBpdGVtLmhhbmRsZSk7XG5cbiAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IGhhbmRsZXMubWFwKGFzeW5jIChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lbW9yeU9yUmVzcG9uc2UgPSBhd2FpdCBtZW1vcnkuZ2V0KGBwcm9kdWN0LSR7aGFuZGxlfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL3Byb2R1Y3RzLyR7aGFuZGxlfT92aWV3PWRhdGFgKTtcbiAgICAgICAgICAgICAgY29uc3QganNvbiA9IHJlc3BvbnNlLm9rID8gYXdhaXQgcmVzcG9uc2UuanNvbigpIDogbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24gPz8ge30pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG1lbW9yeU9yUmVzcG9uc2UpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICBjb25zdCBwcm9kdWN0cyA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+IE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoKTtcbiAgICAgICAgICByZXNvbHZlKHByb2R1Y3RzKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJDbGVya1Byb2R1Y3RzID0gKHByb2R1Y3RzKSA9PiB7XG4gICAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAgICAgcHJvZHVjdC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb24uc3BsaXQoJyUlJScpWzBdLnJlcGxhY2VBbGwoJzxwPicsICcnKS5yZXBsYWNlQWxsKCc8L3A+JywgJycpO1xuXG4gICAgICBjb25zdCBodG1sRGVza3RvcCA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gKFxuICAgICAgICBgPGxpXG4gICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXNsaWRlcl9fc2xpZGUgcHJvZHVjdC1zbGlkZXJfX3NsaWRlLS1kZXNrdG9wXCJcbiAgICAgICAgICBkYXRhLWNsZXJrLXByb2R1Y3QtaWQ9XCIke3Byb2R1Y3QuaWR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7Z2V0UHJvZHVjdENhcmRIdG1sKHByb2R1Y3QsICcnLCB7IHNob3dRdWlja0J1eTogdHJ1ZSB9KX1cbiAgICAgICAgPC9saT5gXG4gICAgICApKS5qb2luKCcnKTtcblxuICAgICAgY29uc3QgaHRtbE1vYmlsZSA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gKFxuICAgICAgICBgPGxpXG4gICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXNsaWRlcl9fc2xpZGUgcHJvZHVjdC1zbGlkZXJfX3NsaWRlLS1tb2JpbGVcIlxuICAgICAgICAgIGRhdGEtY2xlcmstcHJvZHVjdC1pZD1cIiR7cHJvZHVjdC5pZH1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHtnZXRQcm9kdWN0Q2FyZEh0bWwocHJvZHVjdCwgJycsIHsgc2hvd1F1aWNrQnV5OiB0cnVlIH0pfVxuICAgICAgICA8L2xpPmBcbiAgICAgICkpLmpvaW4oJycpO1xuXG4gICAgICBjbGVhcihzbGlkZXJFbERlc2t0b3ApO1xuICAgICAgY2xlYXIoc2xpZGVyRWxNb2JpbGUpO1xuXG4gICAgICBzbGlkZXJFbERlc2t0b3AuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sRGVza3RvcCk7XG4gICAgICBzbGlkZXJFbE1vYmlsZS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWxNb2JpbGUpO1xuICAgICAgYXBwLm1vdW50KCk7XG5cbiAgICAgIGlmICh3aW5kb3cudGhlbWUuY2xlcmsuY2xpY2tUcmFja2luZyAmJiB3aW5kb3cuQ2xlcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuQ2xlcmsoJ2NsaWNrJywgJypbZGF0YS1jbGVyay1wcm9kdWN0LWlkXScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGluaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIGluaXRTY3JvbGwoc2xpZGVyRWxNb2JpbGUsIHNjcm9sbEluZGljYXRvcilcbiAgICB9KTtcblxuICAgIHNsaWRlcldyYXBwZXJNb2JpbGUuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgdXBkYXRlU2Nyb2xsKHNsaWRlcldyYXBwZXJNb2JpbGUsIHByb2dyZXNzV3JhcHBlciwgc2Nyb2xsSW5kaWNhdG9yKTtcbiAgICB9KTtcblxuICAgIGlmIChzb3VyY2UgPT09ICdjbGVyaycpIHtcbiAgICAgIGNvbnN0IHByb2R1Y3RzID0gYXdhaXQgZmV0Y2hDbGVya1Byb2R1Y3RzKCk7XG4gICAgICByZW5kZXJDbGVya1Byb2R1Y3RzKHByb2R1Y3RzKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYXdhaXRWZW5kb3JTY3JpcHQoJ2tlZW5TbGlkZXInLCBjcmVhdGVTbGlkZXIpO1xuICB9O1xuXG4gIGluaXQoKTtcbn0pO1xuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsIm
1449NyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5IiwiY29tcG9uZW50IiwiYWRkQ2xhc3NlcyIsImluaXRTbGlkZXJXcmFwcGVyIiwiaW5pdEFycm93cyIsInVwZGF0ZUFycm93cyIsIktlZW5TbGlkZXIiLCJTdHJpbmdNZW1vcnkiLCJnZXRQcm9kdWN0Q2FyZEh0bWwiLCJjbGVhciIsInVwZGF0ZVByb2dyZXNzIiwic2xpZGVySW5zdGFuY2UiLCJwcm9ncmVzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaSIsImRldGFpbHMiLCJzaXplIiwicmVsYXRpdmVTbGlkZSIsInNsaWRlc1BlclZpZXciLCJsZWZ0Iiwid2lkdGgiLCJzdHlsZSIsImNvbmNhdCIsImluaXRTY3JvbGwiLCJzbGlkZXJFbGVtZW50Iiwic2Nyb2xsSW5kaWNhdG9yIiwic2xpZGVzIiwiY2hpbGRyZW4iLCJ1cGRhdGVTY3JvbGwiLCJzbGlkZXJXcmFwcGVyIiwicHJvZ3Jlc3NXcmFwcGVyIiwic2Nyb2xsUG9zIiwic2Nyb2xsTGVmdCIsInNjcm9sbFdpZHR
1449oIiwiY2xpZW50V2lkdGgiLCJzY3JvbGxlZCIsImZyYWN0aW9uIiwib2Zmc2V0V2lkdGgiLCJ0cmFuc2xhdGVWYWwiLCJ0cmFuc2Zvcm0iLCJub2RlIiwic2xpZGVyV3JhcHBlckRlc2t0b3AiLCJxdWVyeVNlbGVjdG9yIiwic2xpZGVyV3JhcHBlck1vYmlsZSIsInNsaWRlckVsRGVza3RvcCIsInNsaWRlckVsTW9iaWxlIiwicHJldiIsIm5leHQiLCJfbm9kZSRkYXRhc2V0IiwiZGF0YXNldCIsInNvdXJjZSIsImNsZXJrRW5kcG9pbnQiLCJsaW1pdCIsIlNMSURFX1dJRFRIIiwiY3JlYXRlU2xpZGVyIiwic3BhY2luZyIsImR1cmF0aW9uIiwiY29udHJvbHMiLCJjcmVhdGVkIiwiaW5zdCIsInNsaWRlQ2hhbmdlZCIsIndpbmRvdyIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsImZldGNoQ2xlcmtQcm9kdWN0cyIsIl9yZWYiLCJfY2FsbGVlNCIsIm1lbW9yeSIsIl9jb250ZXh0NCIsInNlc3Npb25TdG9yYWdlIiwiQ2xlcmsiLCJsYWJlbHMiLCJwYXJzZUludCIsImF0dHJpYnV0ZXMiLCJfcmVmMiIsIl9jYWxsZWUzIiwicmVzcG9uc2UiLCJoYW5kbGVzIiwicHJvbWlzZXMiLCJyZXN1bHRzIiwicHJvZHVjdHMiLCJfY29udGV4dDMiLCJwcm9kdWN0X2RhdGEiLCJtYXAiLCJpdGVtIiwiaGFuZGxlIiwiX3JlZjMiLCJfY2FsbGVlMiIsIm1lbW9yeU9yUmVzcG9uc2UiLCJfY29udGV4dDIiLCJnZXQiLCJfY2FsbGVlIiwianNvbiIsIl90IiwiX2NvbnRleHQiLCJmZXRjaCIsIm9rIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiX3gyIiwiYWxsIiwiZmlsdGVyIiwicmVzdWx0Iiwia2V5cyIsIl94IiwiZXJyb3IiLCJjb25zb2xlIiwicmVuZGVyQ2xlcmtQcm9kdWN0cyIsImZvckVhY2giLCJwcm9kdWN0IiwiZGVzY3JpcHRpb24iLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJodG1sRGVza3RvcCIsImlkIiwic2hvd1F1aWNrQnV5Iiwiam9pbiIsImh0bWxNb2JpbGUiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJhcHAiLCJtb3VudCIsInRoZW1lIiwiY2xlcmsiLCJjbGlja1RyYWNraW5nIiwidW5kZWZpbmVkIiwiaW5pdCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJfY29udGV4dDUiLCJhZGRFdmVudExpc3RlbmVyIiwiYXdhaXRWZW5kb3JTY3JpcHQiXSwic291cmNlUm9vdCI6IiJ9 1450//# sourceURL=webpack-internal:///./src/scripts/components/home/product-slider.js 1451 1452}`)},"./src/scripts/components/pages/hero-special.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1453/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1454/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 1455/* harmony export */ }); 1456/* harmony import */ var gsap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! gsap */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js"); 1457 1458/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component(function (node, ctx) { 1459 /*******************************************************************************************************************************************/ 1460 /* Data + Elements 1461 /*******************************************************************************************************************************************/ 1462 var _zelektor = zelektor(node), 1463 images = _zelektor.image; 1464 1465 /*******************************************************************************************************************************************/ 1466 /* Event Listeners 1467 /*******************************************************************************************************************************************/ 1468 node.addEventListener('mousemove', function (e) { 1469 return parallaxImages(e, images); 1470 }); 1471 1472 /*******************************************************************************************************************************************/ 1473 /* Init 1474 /*******************************************************************************************************************************************/ 1475 animateInImages(); 1476 1477 /*******************************************************************************************************************************************/ 1478 /* Functions 1479 /*******************************************************************************************************************************************/ 1480 function parallaxImages(e, images) { 1481 var mouseX = e.clientX - node.offsetLeft; 1482 var mouseY = e.clientY - node.offsetTop; 1483 loopify(images).forEach(function (i) { 1484 var movement = parseInt(i.dataset.movement); 1485 var x = (mouseX - window.innerWidth / 2) / window.innerWidth * movement; 1486 var y = (mouseY - window.innerHeight / 2) / window.innerHeight * movement; 1487 gsap__WEBPACK_IMPORTED_MODULE_0__.gsap.to(i, { 1488 x: x, 1489 y: y 1490 }); 1491 }); 1492 } 1493 function animateInImages() {
1494 loopify(images).forEach(function (i) { 1495 var x = parseInt(i.dataset.x); 1496 var y = parseInt(i.dataset.y); 1497 var rotation = parseInt(i.dataset.rotation); 1498 var isSingle = i.dataset.single === 'true'; 1499 gsap__WEBPACK_IMPORTED_MODULE_0__.gsap.fromTo(i, { 1500 x: isSingle ? '0%' : "".concat(x, "%"), 1501 y: isSingle ? '0%' : "".concat(y, "%"), 1502 rotation: isSingle ? 0 : rotation - 2, 1503 scale: isSingle ? 1.1 : 1, 1504 opacity: 0 1505 }, { 1506 x: '0%', 1507 y: '0%', 1508 rotation: isSingle ? 0 : rotation, 1509 scale: 1.05, 1510 opacity: 1, 1511 duration: 1.5 1512 }); 1513 }); 1514 } 1515}));//# sourceURL=[module] 1516//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUE0QjtBQUU1QixpRUFBZUMsU0FBUyxDQUFDLFVBQUNDLElBQUksRUFBQ0MsR0FBRyxFQUFLO0VBQ25DO0VBQ0E7QUFDSjtFQUNJLElBQUFDLFNBQUEsR0FBMEJDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0lBQXpCSSxNQUFNLEdBQUFGLFNBQUEsQ0FBYkcsS0FBSzs7RUFHYjtFQUNBO0FBQ0o7RUFDSUwsSUFBSSxDQUFDTSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsVUFBQUMsQ0FBQztJQUFBLE9BQUlDLGNBQWMsQ0FBQ0QsQ0FBQyxFQUFFSCxNQUFNLENBQUM7RUFBQSxFQUFDOztFQUdsRTtFQUNBO0FBQ0o7RUFDSUssZUFBZSxDQUFDLENBQUM7O0VBR2pCO0VBQ0E7QUFDSjtFQUNJLFNBQVNELGNBQWNBLENBQUNELENBQUMsRUFBRUgsTUFBTSxFQUFFO0lBQy9CLElBQU1NLE1BQU0sR0FBR0gsQ0FBQyxDQUFDSSxPQUFPLEdBQUdYLElBQUksQ0FBQ1ksVUFBVTtJQUMxQyxJQUFNQyxNQUFNLEdBQUdOLENBQUMsQ0FBQ08sT0FBTyxHQUFHZCxJQUFJLENBQUNlLFNBQVM7SUFFekNDLE9BQU8sQ0FBQ1osTUFBTSxDQUFDLENBQUNhLE9BQU8sQ0FBQyxVQUFBQyxDQUFDLEVBQUk7TUFDekIsSUFBTUMsUUFBUSxHQUFHQyxRQUFRLENBQUNGLENBQUMsQ0FBQ0csT0FBTyxDQUFDRixRQUFRLENBQUM7TUFFN0MsSUFBTUcsQ0FBQyxHQUFHLENBQUNaLE1BQU0sR0FBR2EsTUFBTSxDQUFDQyxVQUFVLEdBQUcsQ0FBQyxJQUFJRCxNQUFNLENBQUNDLFVBQVUsR0FBR0wsUUFBUTtNQUN6RSxJQUFNTSxDQUFDLEdBQUcsQ0FBQ1osTUFBTSxHQUFHVSxNQUFNLENBQUNHLFdBQVcsR0FBRyxDQUFDLElBQUlILE1BQU0sQ0FBQ0csV0FBVyxHQUFHUCxRQUFRO01BRTNFckIsc0NBQUksQ0FBQzZCLEVBQUUsQ0FBQ1QsQ0FBQyxFQUFFO1FBQUVJLENBQUMsRUFBREEsQ0FBQztRQUFFRyxDQUFDLEVBQURBO01BQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztFQUNOO0VBRUEsU0FBU2hCLGVBQWVBLENBQUEsRUFBRztJQUN2Qk8sT0FBTyxDQUFDWixNQUFNLENBQUMsQ0FBQ2EsT0FBTyxDQUFDLFVBQUFDLENBQUMsRUFBSTtNQUN6QixJQUFNSSxDQUFDLEdBQUdGLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNDLENBQUMsQ0FBQztNQUMvQixJQUFNRyxDQUFDLEdBQUdMLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNJLENBQUMsQ0FBQztNQUMvQixJQUFNRyxRQUFRLEdBQUdSLFFBQVEsQ0FBQ0YsQ0FBQyxDQUFDRyxPQUFPLENBQUNPLFFBQVEsQ0FBQztNQUU3QyxJQUFNQyxRQUFRLEdBQUdYLENBQUMsQ0FBQ0csT0FBTyxDQUFDUyxNQUFNLEtBQUssTUFBTTtNQUU1Q2hDLHNDQUFJLENBQUNpQyxNQUFNLENBQUNiLENBQUMsRUFBRTtRQUNYSSxDQUFDLEVBQUVPLFFBQVEsR0FBRyxJQUFJLE1BQUFHLE1BQUEsQ0FBTVYsQ0FBQyxNQUFHO1FBQzVCRyxDQUFDLEVBQUVJLFFBQVEsR0FBRyxJQUFJLE1BQUFHLE1BQUEsQ0FBTVAsQ0FBQyxNQUFHO1FBQzVCRyxRQUFRLEVBQUVDLFFBQVEsR0FBRyxDQUFDLEdBQUdELFFBQVEsR0FBRyxDQUFDO1FBQ3JDSyxLQUFLLEVBQUVKLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN6QkssT0FBTyxFQUFFO01BQ2IsQ0FBQyxFQUFFO1FBQ0NaLENBQUMsRUFBRSxJQUFJO1FBQ1BHLENBQUMsRUFBRSxJQUFJO1FBQ1BHLFFBQVEsRUFBRUMsUUFBUSxHQUFHLENBQUMsR0FBR0QsUUFBUTtRQUNqQ0ssS0FBSyxFQUFFLElBQUk7UUFDWEMsT0FBTyxFQUFFLENBQUM7UUFDVkMsUUFBUSxFQUFFO01BQ2QsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0VBQ047QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9jb21wb25lbnRzL3BhZ2VzL2hlcm8tc3BlY2lhbC5qcz9lMDc0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdzYXAgfSBmcm9tICdnc2FwJztcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50KChub2RlLGN0eCkgPT4ge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIERhdGEgKyBFbGVtZW50c1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIGNvbnN0IHsgaW1hZ2U6IGltYWdlcyB9ID0gemVsZWt0b3Iobm9kZSlcblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLyogRXZlbnQgTGlzdGVuZXJzXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBlID0+IHBhcmFsbGF4SW1hZ2VzKGUsIGltYWdlcykpXG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIC8qIEluaXRcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBhbmltYXRlSW5JbWFnZXMoKVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBGdW5jdGlvbnNcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBmdW5jdGlvbiBwYXJhbGxheEltYWdlcyhlLCBpbWFnZXMpIHtcbiAgICAgICAgY29uc3QgbW91c2VYID0gZS5jbGllbnRYIC0gbm9kZS5vZmZzZXRMZWZ0XG4gICAgICAgIGNvbnN0IG1vdXNlWSA9IGUuY2xpZW50WSAtIG5vZGUub2Zmc2V0VG9wXG5cbiAgICAgICAgbG9vcGlmeShpbWFnZXMpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb3ZlbWVudCA9IHBhcnNlSW50KGkuZGF0YXNldC5tb3ZlbWVudClcblxuICAgICAgICAgICAgY29uc3QgeCA9IChtb3VzZVggLSB3aW5kb3cuaW5uZXJXaWR0aCAvIDIpIC8gd2luZG93LmlubmVyV2lkdGggKiBtb3ZlbWVudFxuICAgICAgICAgICAgY29uc3QgeSA9IChtb3VzZVkgLSB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyKSAvIHdpbmRvdy5pbm5lckhlaWdodCAqIG1vdmVtZW50XG5cbiAgICAgICAgICAgIGdzYXAudG8oaSwgeyB4LCB5IH0pXG4gICAgICAgI
vendor: 4,526 bytes, lines 1516-1530
1516H0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYW5pbWF0ZUluSW1hZ2VzKCkge1xuICAgICAgICBsb29waWZ5KGltYWdlcykuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwYXJzZUludChpLmRhdGFzZXQueClcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwYXJzZUludChpLmRhdGFzZXQueSlcbiAgICAgICAgICAgIGNvbnN0IHJvdGF0aW9uID0gcGFyc2VJbnQoaS5kYXRhc2V0LnJvdGF0aW9uKVxuXG4gICAgICAgICAgICBjb25zdCBpc1NpbmdsZSA9IGkuZGF0YXNldC5zaW5nbGUgPT09ICd0cnVlJ1xuXG4gICAgICAgICAgICBnc2FwLmZyb21UbyhpLCB7XG4gICAgICAgICAgICAgICAgeDogaXNTaW5nbGUgPyAnMCUnIDogYCR7eH0lYCxcbiAgICAgICAgICAgICAgICB5OiBpc1NpbmdsZSA/ICcwJScgOiBgJHt5fSVgLFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBpc1NpbmdsZSA/IDAgOiByb3RhdGlvbiAtIDIsXG4gICAgICAgICAgICAgICAgc2NhbGU6IGlzU2luZ2xlID8gMS4xIDogMSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogJzAlJyxcbiAgICAgICAgICAgICAgICB5OiAnMCUnLFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uOiBpc1NpbmdsZSA/IDAgOiByb3RhdGlvbixcbiAgICAgICAgICAgICAgICBzY2FsZTogMS4wNSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxLjVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufSlcbiJdLCJuYW1lcyI6WyJnc2FwIiwiY29tcG9uZW50Iiwibm9kZSIsImN0eCIsIl96ZWxla3RvciIsInplbGVrdG9yIiwiaW1hZ2VzIiwiaW1hZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInBhcmFsbGF4SW1hZ2VzIiwiYW5pbWF0ZUluSW1hZ2VzIiwibW91c2VYIiwiY2xpZW50WCIsIm9mZnNldExlZnQiLCJtb3VzZVkiLCJjbGllbnRZIiwib2Zmc2V0VG9wIiwibG9vcGlmeSIsImZvckVhY2giLCJpIiwibW92ZW1lbnQiLCJwYXJzZUludCIsImRhdGFzZXQiLCJ4Iiwid2luZG93IiwiaW5uZXJXaWR0aCIsInkiLCJpbm5lckhlaWdodCIsInRvIiwicm90YXRpb24iLCJpc1NpbmdsZSIsInNpbmdsZSIsImZyb21UbyIsImNvbmNhdCIsInNjYWxlIiwib3BhY2l0eSIsImR1cmF0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ== 1517//# sourceURL=webpack-internal:///./src/scripts/components/pages/hero-special.js 1518 1519}`)},"./src/scripts/lib/cart.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1520/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1521/* harmony export */ addVariant: () => (/* binding */ addVariant), 1522/* harmony export */ changeItem: () => (/* binding */ changeItem), 1523/* harmony export */ clearCart: () => (/* binding */ clearCart), 1524/* harmony export */ fetchCart: () => (/* binding */ fetchCart), 1525/* harmony export */ removeItem: () => (/* binding */ removeItem), 1526/* harmony export */ updateAllCartQuantities: () => (/* binding */ updateAllCartQuantities), 1527/* harmony export */ updateItem: () => (/* binding */ updateItem) 1528/* harmony export */ }); 1529/* harmony import */ var _lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/upsell-gift */ "./src/scripts/lib/upsell-gift.js"); 1530function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
1530 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 1531function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 1532function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 1533function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 1534 1535var fetchCart = /*#__PURE__*/function () { 1536 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 1537 var response, data; 1538 return _regenerator().w(function (_context) { 1539 while (1) switch (_context.n) { 1540 case 0: 1541 _context.n = 1; 1542 return fetch('/cart.js', { 1543 method: 'GET', 1544 credentials: 'include', 1545 headers: { 1546 'Content-Type': 'application/json', 1547 'X-Requested-With': 'XMLHttpRequest' 1548 } 1549 }); 1550 case 1: 1551 response = _context.v; 1552 _context.n = 2; 1553 return response.json(); 1554 case 2: 1555 data = _context.v; 1556 return _context.a(2, data); 1557 } 1558 }, _callee); 1559 })); 1560 return function fetchCart() { 1561 return _ref.apply(this, arguments); 1562 }; 1563}(); 1564var addVariant = /*#__PURE__*/function () { 1565 var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref2) { 1566 var id, quantity, _ref2$properties, properties, _ref2$selling_plan, selling_plan, callback, onError, _ref2$emitUpdate, emitUpdate, _ref2$updateCrossSell, updateCrossSell, response, item, cart; 1567 return _regenerator().w(function (_context2) { 1568 while (1) switch (_context2.n) { 1569 case 0: 1570 id = _ref2.variantId, quantity = _ref2.qty, _ref2$properties = _ref2.properties, properties = _ref2$properties === void 0 ? null : _ref2$properties, _ref2$selling_plan = _ref2.selling_plan, selling_plan = _ref2$selling_plan === void 0 ? null : _ref2$selling_plan, callback = _ref2.callback, onError = _ref2.onError, _ref2$emitUpdate = _ref2.emitUpdate, emitUpdate = _ref2$emitUpdate === void 0 ? true : _ref2$emitUpdate, _ref2$updateCrossSell = _ref2.updateCrossSell, updateCrossSell = _ref2$updateCrossSell === void 0 ? true : _ref2$updateCrossSell; 1571 _context2.n = 1; 1572 return fetch('/cart/add.js', { 1573 method: 'POST', 1574 credentials: 'include', 1575 headers: { 1576 'Content-Type': 'application/json', 1577 'X-Requested-With': 'XMLHttpRequest' 1578 }, 1579 body: JSON.stringify({ 1580 id: id, 1581 quantity: quantity, 1582 properties: properties, 1583 selling_plan: selling_plan 1584 }) 1585 }); 1586 case 1: 1587 response = _context2.v; 1588 _context2.n = 2; 1589 return response.json(); 1590 case 2: 1591 item = _context2.v; 1592 if (!item.status) { 1593 _context2.n = 3; 1594 break; 1595 } 1596 if (onError) { 1597 onError(item); 1598 } else { 1599 alert(item.description); 1600 } 1601 if (callback) callback(); 1602 return _context2.a(2); 1603 case 3: 1604 _context2.n = 4; 1605 return fetchCart(); 1606 case 4: 1607 cart = _context2.v; 1608 app.hydrate({ 1609 cart: cart 1610 }); 1611 if (emitUpdate) { 1612 (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)(); 1613 app.emit('cart:updated'); 1614 } 1615 if (updateCrossSell) app.emit('crossSell:update'); 1616 if (callback) callback(); 1617 return _context2.a(2, { 1618 item: item, 1619 cart: cart 1620 }); 1621 case 5: 1622 return _context2.a(2); 1623 } 1624 }, _callee2); 1625 })); 1626 return function addVariant(_x) { 1627 return _ref3.apply(this, arguments); 1628 }; 1629}(); 1630var changeItem = /*#__PURE__*/function () { 1631 var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(_ref4) { 1632 var line, qty, _ref4$properties, properties, _ref4$emitUpdate, emitUpdate, response, cart; 1633 return _regenerator().w(function (_context3) { 1634 while (1) switch (_context3.n) { 1635 case 0: 1636 line = _ref4.line, qty = _ref4.qty, _ref4$properties = _ref4.properties, properties = _ref4$properties === void 0 ? null : _ref4$properties, _ref4$emitUpdate = _ref4.emitUpdate, emitUpdate = _ref4$emitUpdate === void 0 ? true : _ref4$emitUpdate; 1637 _context3.n = 1; 1638 return fetch('/cart/change.js', { 1639 method: 'POST', 1640 credentials: 'include', 1641 headers: { 1642 'Content-Type': 'application/json', 1643 'X-Requested-With': 'XMLHttpRequest' 1644 }, 1645 body: JSON.stringify({ 1646 line: line, 1647 quantity: qty, 1648 properties: properties 1649 }) 1650 }); 1651 case 1: 1652 response = _context3.v; 1653 _context3.n = 2; 1654 return response.json(); 1655 case 2: 1656 cart = _context3.v; 1657 app.hydrate({ 1658 cart: cart 1659 }); 1660 if (emitUpdate) { 1661 (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)(); 1662 app.emit('cart:updated', { 1663 cart: cart 1664 }); 1665 } 1666 return _context3.a(2, cart); 1667 } 1668 }, _callee3); 1669 })); 1670 return function changeItem(_x2) { 1671 return _ref5.apply(this, arguments); 1672 }; 1673}(); 1674var updateItem = function updateItem(_ref6) { 1675 var line = _ref6.line,
1676 qty = _ref6.qty, 1677 _ref6$properties = _ref6.properties, 1678 properties = _ref6$properties === void 0 ? null : _ref6$properties, 1679 _ref6$emitUpdate = _ref6.emitUpdate, 1680 emitUpdate = _ref6$emitUpdate === void 0 ? true : _ref6$emitUpdate; 1681 return changeItem({ 1682 line: line, 1683 qty: qty, 1684 properties: properties, 1685 emitUpdate: emitUpdate 1686 }); 1687}; 1688var removeItem = function removeItem(_ref7) { 1689 var line = _ref7.line, 1690 _ref7$emitUpdate = _ref7.emitUpdate, 1691 emitUpdate = _ref7$emitUpdate === void 0 ? true : _ref7$emitUpdate; 1692 return updateItem({ 1693 line: line, 1694 qty: 0, 1695 emitUpdate: emitUpdate 1696 }); 1697}; 1698var updateAllCartQuantities = /*#__PURE__*/function () { 1699 var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(array) { 1700 var response, cart; 1701 return _regenerator().w(function (_context4) { 1702 while (1) switch (_context4.n) { 1703 case 0: 1704 _context4.n = 1; 1705 return fetch('/cart/update.js', { 1706 method: 'POST', 1707 credentials: 'include', 1708 headers: { 1709 'Content-Type': 'application/json', 1710 'X-Requested-With': 'XMLHttpRequest' 1711 }, 1712 body: JSON.stringify({ 1713 updates: array 1714 }) 1715 }); 1716 case 1: 1717 response = _context4.v; 1718 _context4.n = 2; 1719 return response.json(); 1720 case 2: 1721 cart = _context4.v; 1722 (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)(); 1723 app.hydrate({ 1724 cart: cart 1725 }); 1726 app.emit('cart:updated', { 1727 cart: cart 1728 }); 1729 case 3: 1730 return _context4.a(2); 1731 } 1732 }, _callee4); 1733 })); 1734 return function updateAllCartQuantities(_x3) { 1735 return _ref8.apply(this, arguments); 1736 }; 1737}(); 1738var clearCart = /*#__PURE__*/function () { 1739 var _ref9 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5() { 1740 var response, cart; 1741 return _regenerator().w(function (_context5) { 1742 while (1) switch (_context5.n) { 1743 case 0: 1744 _context5.n = 1; 1745 return fetch('/cart/clear.js', { 1746 method: 'POST', 1747 credentials: 'include', 1748 headers: { 1749 'Content-Type': 'application/json', 1750 'X-Requested-With': 'XMLHttpRequest' 1751 } 1752 }); 1753 case 1: 1754 response = _context5.v; 1755 _context5.n = 2; 1756 return response.json(); 1757 case 2: 1758 cart = _context5.v; 1759 (0,_lib_upsell_gift__WEBPACK_IMPORTED_MODULE_0__.clearAllUpsellTriggers)(); 1760 app.hydrate({ 1761 cart: cart 1762 }); 1763 app.emit('cart:updated', { 1764 cart: cart 1765 }); 1766 case 3: 1767 return _context5.a(2); 1768 } 1769 }, _callee5); 1770 })); 1771 return function clearCart() { 1772 return _ref9.apply(this, arguments); 1773 }; 1774}(); 1775//# sourceURL=[module] 1776//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUNDLE9BQU8sQ0FBQztZQUFFWCxJQUFJLEVBQUVBO1VBQUssQ0FBQyxDQUFDO1VBQzNCVSxHQUFHLENBQUNFLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFBRVosSUFBSSxFQUFFQTtVQUFLLENBQUMsQ0FBQztRQUFBO1VBQUEsT0FBQXdDLFNBQUEsQ0FBQXRHLENBQUE7TUFBQTtJQUFBLEdBQUFxRyxRQUFBO0VBQUEsQ0FDM0M7RUFBQSxnQkFoQktGLFNBQVNBLENBQUE7SUFBQSxPQUFBQyxLQUFBLENBQUF0RSxLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBLEdBZ0JkIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2NhcnQuanM/OTY0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGVhckFsbFVwc2VsbFRyaWdnZXJzIH0gZnJvbSAnQC9saWIvdXBzZWxsLWdpZnQnXG5cbmNvbnN0IGZldGNoQ2FydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvY2FydC5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgcmV0dXJuIGRhdGFcbn1cblxuY29uc3QgYWRkVmFyaWFudCA9IGFzeW5jICh7XG4gICAgdmFyaWFudElkOiBpZCxcbiAgICBxdHk6IHF1YW50aXR5LFxuICAgIHByb3BlcnRpZXMgPSBudWxsLFxuICAgIHNlbGxpbmdfcGxhbiA9IG51bGwsXG4gICAgY2FsbGJhY2ssXG4gICAgb25FcnJvcixcbiAgICBlbWl0VXBkYXRlID0gdHJ1ZSxcbiAgICB1cGRhdGVDcm9zc1NlbGwgPSB0cnVlLFxufSkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9jYXJ0L2FkZC5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIHF1YW50aXR5LCBwcm9wZXJ0aWVzLCBzZWxsaW5nX3BsYW4gfSksXG4gICAgfSlcblxuICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgIGlmIChpdGVtLnN0YXR1cykge1xuICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgICAgb25FcnJvcihpdGVtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQoaXRlbS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcbiAgICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2FydCA9IGF3YWl0IGZldGNoQ2FydCgpXG4gICAgICAgIGFwcC5oeWRyYXRlKHsgY2FydDogY2FydCB9KVxuXG4gICAgICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgICAgICBjbGVhckFsbFVwc2VsbFRyaWdnZXJzKClcbiAgICAgICAgICAgIGFwcC5lbWl0KCdjYXJ0OnVwZGF0ZWQnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUNyb3NzU2VsbCkgYXBwLmVtaXQoJ2Nyb3NzU2VsbDp1cGRhdGUnKVxuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKClcblxuICAgICAgICByZXR1cm4geyBpdGVtLCBjYXJ0IH1cbiAgICB9XG59XG5cbmNvbnN0IGNoYW5nZUl0ZW0gPSBhc3luYyAoeyBsaW5lLCBxdHksIHByb3BlcnRpZXMgPSBudWxsLCBlbWl0VXBkYXRlID0gdHJ1ZSB9KSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQvY2hhbmdlLmpzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBsaW5lLCBxdWFudGl0eTogcXR5LCBwcm9wZXJ0aWVzIH0pLFxuICAgIH0pXG5cbiAgICBjb25zdCBjYXJ0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICBhcHAuaHlkcmF0ZSh7IGNhcnQ6IGNhcnQgfSlcblxuICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICAgIGNsZWFyQWxsVXBzZWxsVHJpZ2dlcnMoKVxuICAgICAgICBhcHAuZW1pdCgnY2FydDp1cGRhdGVkJywgeyBjYXJ0OiBjYXJ0IH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhcnRcbn1cblxuY29uc3QgdXBkYXRlSXRlbSA9ICh7IGxpbmUsIHF0eSwgcHJvcGVydGllcyA9IG51bGwsIGVtaXRVcGRhdGUgPSB0cnVlIH0pID0+IHtcbiAgICByZXR1cm4gY2hhbmdlSXRlbSh7IGxpbmUsIHF0eSwgcHJvcGVydGllcywgZW1pdFVwZGF0ZSB9KVxufVxuXG5jb25zdCByZW1vdmVJdGVtID0gKHsgbGluZSwgZW1pdFVwZGF0ZSA9IHRydWUgfSkgPT4ge1xuICAgIHJldHVybiB1cGRhdGVJdGVtKHsgbGluZSwgcXR5OiAwLCBlbWl0VXBkYXRlIH0pXG59XG5cbmNvbnN0IHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzID0gYXN5bmMgKGFycmF5KSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2NhcnQvdXBkYXRlLmpzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1
1776ZXN0JyxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1cGRhdGVzOiBhcnJheSB9KSxcbiAgICB9KVxuXG4gICAgY29uc3QgY2FydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgY2xlYXJBbGxVcHNlbGxUcmlnZ2VycygpXG5cbiAgICBhcHAuaHlkcmF0ZSh7IGNhcnQ6IGNhcnQgfSlcbiAgICBhcHAuZW1pdCgnY2FydDp1cGRhdGVkJywgeyBjYXJ0OiBjYXJ0IH0pXG59XG5cbmNvbnN0IGNsZWFyQ2FydCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvY2FydC9jbGVhci5qcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnWC1SZXF1ZXN0ZWQtV2l0aCc6ICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IGNhcnQgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgIGNsZWFyQWxsVXBzZWxsVHJpZ2dlcnMoKVxuXG4gICAgYXBwLmh5ZHJhdGUoeyBjYXJ0OiBjYXJ0IH0pXG4gICAgYXBwLmVtaXQoJ2NhcnQ6dXBkYXRlZCcsIHsgY2FydDogY2FydCB9KVxufVxuXG5leHBvcnQgeyBmZXRjaENhcnQsIGFkZFZhcmlhbnQsIGNoYW5nZUl0ZW0sIHVwZGF0ZUl0ZW0sIHJlbW92ZUl0ZW0sIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzLCBjbGVhckNhcnQgfVxuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyIsImZldGNoQ2FydCIsIl9yZWYiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJkYXRhIiwiX2NvbnRleHQiLCJmZXRjaCIsIm1ldGhvZCIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImpzb24iLCJhZGRWYXJpYW50IiwiX3JlZjMiLCJfY2FsbGVlMiIsIl9yZWYyIiwiaWQiLCJxdWFudGl0eSIsIl9yZWYyJHByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwiX3JlZjIkc2VsbGluZ19wbGFuIiwic2VsbGluZ19wbGFuIiwiY2FsbGJhY2siLCJvbkVycm9yIiwiX3JlZjIkZW1pdFVwZGF0ZSIsImVtaXRVcGRhdGUiLCJfcmVmMiR1cGRhdGVDcm9zc1NlbGwiLCJ1cGRhdGVDcm9zc1NlbGwiLCJpdGVtIiwiY2FydCIsIl9jb250ZXh0MiIsInZhcmlhbnRJZCIsInF0eSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiYWxlcnQiLCJkZXNjcmlwdGlvbiIsImFwcCIsImh5ZHJhdGUiLCJlbWl0IiwiX3giLCJjaGFuZ2VJdGVtIiwiX3JlZjUiLCJfY2FsbGVlMyIsIl9yZWY0IiwibGluZSIsIl9yZWY0JHByb3BlcnRpZXMiLCJfcmVmNCRlbWl0VXBkYXRlIiwiX2NvbnRleHQzIiwiX3gyIiwidXBkYXRlSXRlbSIsIl9yZWY2IiwiX3JlZjYkcHJvcGVydGllcyIsIl9yZWY2JGVtaXRVcGRhdGUiLCJyZW1vdmVJdGVtIiwiX3JlZjciLCJfcmVmNyRlbWl0VXBkYXRlIiwidXBkYXRlQWxsQ2FydFF1YW50aXRpZXMiLCJfcmVmOCIsIl9jYWxsZWU0IiwiYXJyYXkiLCJfY29udGV4dDQiLCJ1cGRhdGVzIiwiX3gzIiwiY2xlYXJDYXJ0IiwiX3JlZjkiLCJfY2FsbGVlNSIsIl9jb250ZXh0NSJdLCJzb3VyY2VSb290IjoiIn0= 1777//# sourceURL=webpack-internal:///./src/scripts/lib/cart.js 1778 1779}`)},"./src/scripts/lib/consent.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1780/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1781/* harmony export */ consentEvents: () => (/* binding */ consentEvents), 1782/* harmony export */ hasConsent: () => (/* binding */ hasConsent) 1783/* harmony export */ }); 1784var consentEvents = ['CookieScriptAccept', 'CookieScriptAcceptAll', 'CookieScriptReject', 'CookieScriptConsentUpdated']; 1785var getCustomerPrivacyConsent = function getCustomerPrivacyConsent(category) { 1786 var _window$Shopify, _customerPrivacy$getT; 1787 var customerPrivacy = (_window$Shopify = window.Shopify) === null || _window$Shopify === void 0 ? void 0 : _window$Shopify.customerPrivacy; 1788 if (!customerPrivacy) return null; 1789 var methodMap = { 1790 cookie_cat_functional: 'preferencesProcessingAllowed', 1791 cookie_cat_statistic: 'analyticsProcessingAllowed', 1792 cookie_cat_marketing: 'marketingAllowed', 1793 cookie_cat_category: 'preferencesProcessingAllowed' 1794 }; 1795 var method = methodMap[category]; 1796 if (method && typeof customerPrivacy[method] === 'function') { 1797 return Boolean(customerPrivacy[method]()); 1798 } 1799 var consent = (_customerPrivacy$getT = customerPrivacy.getTrackingConsent) === null || _customerPrivacy$getT === void 0 ? void 0 : _customerPrivacy$getT.call(customerPrivacy); 1800 if (!consent) return null; 1801 if (typeof consent === 'string') { 1802 return consent.toLowerCase() === 'yes'; 1803 } 1804 var map = { 1805 cookie_cat_functional: 'preferences', 1806 cookie_cat_statistic: 'analytics', 1807 cookie_cat_marketing: 'marketing', 1808 cookie_cat_category: 'preferences' 1809 }; 1810 var key = map[category]; 1811 return key ? Boolean(consent[key]) : null; 1812}; 1813var getCookieScriptConsent = function getCookieScriptConsent(category) { 1814 var _window$CookieScript, _window$CookieScript$; 1815 var state = (_window$CookieScript = window.CookieScript) === null || _window$CookieScript === void 0 || (_window$CookieScript = _window$CookieScript.instance) === null || _window$CookieScript === void 0 || (_window$CookieScript$ = _window$CookieScript.currentState) === null || _window$CookieScript$ === void 0 ? void 0 : _window$CookieScript$.call(_window$CookieScript); 1816 if (!state || !Array.isArray(state.categories)) return null; 1817 if (state.action === 'reject') return false;
1818 var map = { 1819 cookie_cat_functional: 'functionality', 1820 cookie_cat_statistic: 'performance', 1821 cookie_cat_marketing: 'targeting', 1822 cookie_cat_category: 'functionality' 1823 }; 1824 var key = map[category]; 1825 return key ? state.categories.includes(key) : null; 1826}; 1827var hasConsent = function hasConsent(category) { 1828 var customerConsent = getCustomerPrivacyConsent(category); 1829 if (customerConsent !== null) return customerConsent; 1830 var cookieScriptConsent = getCookieScriptConsent(category); 1831 if (cookieScriptConsent !== null) return cookieScriptConsent; 1832 return false; 1833};//# sourceURL=[module] 1834//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxHQUFHLElBQUk7QUFDdEQsQ0FBQztBQUVNLElBQU1hLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFJL0IsUUFBUSxFQUFLO0VBQ3BDLElBQU1nQyxlQUFlLEdBQUdqQyx5QkFBeUIsQ0FBQ0MsUUFBUSxDQUFDO0VBQzNELElBQUlnQyxlQUFlLEtBQUssSUFBSSxFQUFFLE9BQU9BLGVBQWU7RUFFcEQsSUFBTUMsbUJBQW1CLEdBQUdkLHNCQUFzQixDQUFDbkIsUUFBUSxDQUFDO0VBQzVELElBQUlpQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsT0FBT0EsbUJBQW1CO0VBRTVELE9BQU8sS0FBSztBQUNoQixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2NvbnNlbnQuanM/YWU5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29uc2VudEV2ZW50cyA9IFtcbiAgICAnQ29va2llU2NyaXB0QWNjZXB0JyxcbiAgICAnQ29va2llU2NyaXB0QWNjZXB0QWxsJyxcbiAgICAnQ29va2llU2NyaXB0UmVqZWN0JyxcbiAgICAnQ29va2llU2NyaXB0Q29uc2VudFVwZGF0ZWQnXG5dXG5cbmNvbnN0IGdldEN1c3RvbWVyUHJpdmFjeUNvbnNlbnQgPSAoY2F0ZWdvcnkpID0+IHtcbiAgICBjb25zdCBjdXN0b21lclByaXZhY3kgPSB3aW5kb3cuU2hvcGlmeT8uY3VzdG9tZXJQcml2YWN5XG4gICAgaWYgKCFjdXN0b21lclByaXZhY3kpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgICAgIGNvb2tpZV9jYXRfZnVuY3Rpb25hbDogJ3ByZWZlcmVuY2VzUHJvY2Vzc2luZ0FsbG93ZWQnLFxuICAgICAgICBjb29raWVfY2F0X3N0YXRpc3RpYzogJ2FuYWx5dGljc1Byb2Nlc3NpbmdBbGxvd2VkJyxcbiAgICAgICAgY29va2llX2NhdF9tYXJrZXRpbmc6ICdtYXJrZXRpbmdBbGxvd2VkJyxcbiAgICAgICAgY29va2llX2NhdF9jYXRlZ29yeTogJ3ByZWZlcmVuY2VzUHJvY2Vzc2luZ0FsbG93ZWQnXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kID0gbWV0aG9kTWFwW2NhdGVnb3J5XVxuICAgIGlmIChtZXRob2QgJiYgdHlwZW9mIGN1c3RvbWVyUHJpdmFjeVttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgI
1834HJldHVybiBCb29sZWFuKGN1c3RvbWVyUHJpdmFjeVttZXRob2RdKCkpXG4gICAgfVxuXG4gICAgY29uc3QgY29uc2VudCA9IGN1c3RvbWVyUHJpdmFjeS5nZXRUcmFja2luZ0NvbnNlbnQ/LigpXG4gICAgaWYgKCFjb25zZW50KSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiBjb25zZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY29uc2VudC50b0xvd2VyQ2FzZSgpID09PSAneWVzJ1xuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgY29va2llX2NhdF9mdW5jdGlvbmFsOiAncHJlZmVyZW5jZXMnLFxuICAgICAgICBjb29raWVfY2F0X3N0YXRpc3RpYzogJ2FuYWx5dGljcycsXG4gICAgICAgIGNvb2tpZV9jYXRfbWFya2V0aW5nOiAnbWFya2V0aW5nJyxcbiAgICAgICAgY29va2llX2NhdF9jYXRlZ29yeTogJ3ByZWZlcmVuY2VzJ1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBtYXBbY2F0ZWdvcnldXG4gICAgcmV0dXJuIGtleSA/IEJvb2xlYW4oY29uc2VudFtrZXldKSA6IG51bGxcbn1cblxuY29uc3QgZ2V0Q29va2llU2NyaXB0Q29uc2VudCA9IChjYXRlZ29yeSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gd2luZG93LkNvb2tpZVNjcmlwdD8uaW5zdGFuY2U/LmN1cnJlbnRTdGF0ZT8uKClcbiAgICBpZiAoIXN0YXRlIHx8ICFBcnJheS5pc0FycmF5KHN0YXRlLmNhdGVnb3JpZXMpKSByZXR1cm4gbnVsbFxuICAgIGlmIChzdGF0ZS5hY3Rpb24gPT09ICdyZWplY3QnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgY29va2llX2NhdF9mdW5jdGlvbmFsOiAnZnVuY3Rpb25hbGl0eScsXG4gICAgICAgIGNvb2tpZV9jYXRfc3RhdGlzdGljOiAncGVyZm9ybWFuY2UnLFxuICAgICAgICBjb29raWVfY2F0X21hcmtldGluZzogJ3RhcmdldGluZycsXG4gICAgICAgIGNvb2tpZV9jYXRfY2F0ZWdvcnk6ICdmdW5jdGlvbmFsaXR5J1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBtYXBbY2F0ZWdvcnldXG4gICAgcmV0dXJuIGtleSA/IHN0YXRlLmNhdGVnb3JpZXMuaW5jbHVkZXMoa2V5KSA6IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0NvbnNlbnQgPSAoY2F0ZWdvcnkpID0+IHtcbiAgICBjb25zdCBjdXN0b21lckNvbnNlbnQgPSBnZXRDdXN0b21lclByaXZhY3lDb25zZW50KGNhdGVnb3J5KVxuICAgIGlmIChjdXN0b21lckNvbnNlbnQgIT09IG51bGwpIHJldHVybiBjdXN0b21lckNvbnNlbnRcblxuICAgIGNvbnN0IGNvb2tpZVNjcmlwdENvbnNlbnQgPSBnZXRDb29raWVTY3JpcHRDb25zZW50KGNhdGVnb3J5KVxuICAgIGlmIChjb29raWVTY3JpcHRDb25zZW50ICE9PSBudWxsKSByZXR1cm4gY29va2llU2NyaXB0Q29uc2VudFxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG4iXSwibmFtZXMiOlsiY29uc2VudEV2ZW50cyIsImdldEN1c3RvbWVyUHJpdmFjeUNvbnNlbnQiLCJjYXRlZ29yeSIsIl93aW5kb3ckU2hvcGlmeSIsIl9jdXN0b21lclByaXZhY3kkZ2V0VCIsImN1c3RvbWVyUHJpdmFjeSIsIndpbmRvdyIsIlNob3BpZnkiLCJtZXRob2RNYXAiLCJjb29raWVfY2F0X2Z1bmN0aW9uYWwiLCJjb29raWVfY2F0X3N0YXRpc3RpYyIsImNvb2tpZV9jYXRfbWFya2V0aW5nIiwiY29va2llX2NhdF9jYXRlZ29yeSIsIm1ldGhvZCIsIkJvb2xlYW4iLCJjb25zZW50IiwiZ2V0VHJhY2tpbmdDb25zZW50IiwiY2FsbCIsInRvTG93ZXJDYXNlIiwibWFwIiwia2V5IiwiZ2V0Q29va2llU2NyaXB0Q29uc2VudCIsIl93aW5kb3ckQ29va2llU2NyaXB0IiwiX3dpbmRvdyRDb29raWVTY3JpcHQkIiwic3RhdGUiLCJDb29raWVTY3JpcHQiLCJpbnN0YW5jZSIsImN1cnJlbnRTdGF0ZSIsIkFycmF5IiwiaXNBcnJheSIsImNhdGVnb3JpZXMiLCJhY3Rpb24iLCJpbmNsdWRlcyIsImhhc0NvbnNlbnQiLCJjdXN0b21lckNvbnNlbnQiLCJjb29raWVTY3JpcHRDb25zZW50Il0sInNvdXJjZVJvb3QiOiIifQ== 1835//# sourceURL=webpack-internal:///./src/scripts/lib/consent.js 1836 1837}`)},"./src/scripts/lib/currency.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1838/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1839/* harmony export */ formatMoney: () => (/* binding */ formatMoney) 1840/* harmony export */ }); 1841/** 1842 * Format money values based on your shop currency settings 1843 * @param {Number|string} cents - value in cents or dollar amount e.g. 300 cents 1844 * or 3.00 dollars 1845 * @param {String} format - shop money_format setting 1846 * @return {String} value - formatted value 1847 */ 1848 1849function formatMoney(cents) { 1850 var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : theme.money.format; 1851 if (typeof cents === 'string') { 1852 cents = cents.replace('.', ''); 1853 } 1854 var value = ''; 1855 var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/; 1856 function formatWithDelimiters(number, precision, thousands, decimal) { 1857 if (typeof precision == 'undefined') { 1858 precision = 2; 1859 } 1860 thousands = theme.money.thousandsSeperator; 1861 decimal = thousands == ',' ? '.' : ','; 1862 if (isNaN(number) || number == null) { 1863 return 0; 1864 } 1865 number = (number / 100).toFixed(precision); 1866 var parts = number.split('.'); 1867 var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands); 1868 var centsAmount = parts[1] ? decimal + parts[1] : ''; 1869 return dollarsAmount + centsAmount; 1870 } 1871 switch (format.match(placeholderRegex)[1]) { 1872 case 'amount': 1873 value = formatWithDelimiters(cents, 2); 1874 break; 1875 case 'amount_with_comma_separator': 1876 value = formatWithDelimiters(cents, 2); 1877 break; 1878 case 'amount_no_decimals': 1879 value = formatWithDelimiters(cents, 0); 1880 break; 1881 case 'amount_with_space_separator': 1882 value = formatWithDelimiters(cents, 2); 1883 break; 1884 case 'amount_no_decimals_with_comma_separator': 1885 value = formatWithDelimiters(cents, 0); 1886 break; 1887 case 'amount_no_decimals_with_space_separator': 1888 value = formatWithDelimiters(cents, 0); 1889 break; 1890 } 1891 return format.replace(placeholderRegex, value); 1892}//# sourceURL=[module] 1893//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvY3VycmVuY3kuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNBLFdBQVdBLENBQUNDLEtBQUssRUFBK0I7RUFBQSxJQUE3QkMsTUFBTSxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR0csS0FBSyxDQUFDQyxLQUFLLENBQUNMLE1BQU07RUFDMUQsSUFBSSxPQUFPRCxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzNCQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ08sT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDbEM7RUFFQSxJQUFJQyxLQUFLLEdBQUcsRUFBRTtFQUNkLElBQU1DLGdCQUFnQixHQUFHLHFCQUFxQjtFQUU5QyxTQUFTQyxvQkFBb0JBLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRTtJQUNqRSxJQUFJLE9BQU9GLFNBQVMsSUFBSSxXQUFXLEVBQUU7TUFDakNBLFNBQVMsR0FBRyxDQUFDO0lBQ2pCO0lBRUFDLFNBQVMsR0FBR1IsS0FBSyxDQUFDQyxLQUFLLENBQUNTLGtCQUFrQjtJQUMxQ0QsT0FBTyxHQUFJRCxTQUFTLElBQUksR0FBRyxHQU
1893FJLEdBQUcsR0FBRyxHQUFHO0lBRXhDLElBQUlHLEtBQUssQ0FBQ0wsTUFBTSxDQUFDLElBQUlBLE1BQU0sSUFBSSxJQUFJLEVBQUU7TUFDakMsT0FBTyxDQUFDO0lBQ1o7SUFFQUEsTUFBTSxHQUFHLENBQUNBLE1BQU0sR0FBRyxHQUFHLEVBQUVNLE9BQU8sQ0FBQ0wsU0FBUyxDQUFDO0lBRTFDLElBQU1NLEtBQUssR0FBR1AsTUFBTSxDQUFDUSxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQy9CLElBQU1DLGFBQWEsR0FBR0YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxHQUFHTSxTQUFTLENBQUM7SUFDcEYsSUFBTVEsV0FBVyxHQUFHSCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdKLE9BQU8sR0FBR0ksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFFdEQsT0FBT0UsYUFBYSxHQUFHQyxXQUFXO0VBQ3RDO0VBRUEsUUFBUXBCLE1BQU0sQ0FBQ3FCLEtBQUssQ0FBQ2IsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxRQUFRO01BQ1RELEtBQUssR0FBR0Usb0JBQW9CLENBQUNWLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDdEM7SUFDSixLQUFLLDZCQUE2QjtNQUM5QlEsS0FBSyxHQUFHRSxvQkFBb0IsQ0FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztNQUN0QztJQUNKLEtBQUssb0JBQW9CO01BQ3JCUSxLQUFLLEdBQUdFLG9CQUFvQixDQUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO01BQ3RDO0lBQ0osS0FBSyw2QkFBNkI7TUFDOUJRLEtBQUssR0FBR0Usb0JBQW9CLENBQUNWLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDdEM7SUFDSixLQUFLLHlDQUF5QztNQUMxQ1EsS0FBSyxHQUFHRSxvQkFBb0IsQ0FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztNQUN0QztJQUNKLEtBQUsseUNBQXlDO01BQzFDUSxLQUFLLEdBQUdFLG9CQUFvQixDQUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO01BQ3RDO0VBQ1I7RUFFQSxPQUFPQyxNQUFNLENBQUNNLE9BQU8sQ0FBQ0UsZ0JBQWdCLEVBQUVELEtBQUssQ0FBQztBQUNsRCIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9jdXJyZW5jeS5qcz9lNWYyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9ybWF0IG1vbmV5IHZhbHVlcyBiYXNlZCBvbiB5b3VyIHNob3AgY3VycmVuY3kgc2V0dGluZ3NcbiAqIEBwYXJhbSAge051bWJlcnxzdHJpbmd9IGNlbnRzIC0gdmFsdWUgaW4gY2VudHMgb3IgZG9sbGFyIGFtb3VudCBlLmcuIDMwMCBjZW50c1xuICogb3IgMy4wMCBkb2xsYXJzXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZvcm1hdCAtIHNob3AgbW9uZXlfZm9ybWF0IHNldHRpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gdmFsdWUgLSBmb3JtYXR0ZWQgdmFsdWVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TW9uZXkoY2VudHMsIGZvcm1hdCA9IHRoZW1lLm1vbmV5LmZvcm1hdCkge1xuICAgIGlmICh0eXBlb2YgY2VudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNlbnRzID0gY2VudHMucmVwbGFjZSgnLicsICcnKVxuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9ICcnXG4gICAgY29uc3QgcGxhY2Vob2xkZXJSZWdleCA9IC9cXHtcXHtcXHMqKFxcdyspXFxzKlxcfVxcfS9cblxuICAgIGZ1bmN0aW9uIGZvcm1hdFdpdGhEZWxpbWl0ZXJzKG51bWJlciwgcHJlY2lzaW9uLCB0aG91c2FuZHMsIGRlY2ltYWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IDJcbiAgICAgICAgfVxuXG4gICAgICAgIHRob3VzYW5kcyA9IHRoZW1lLm1vbmV5LnRob3VzYW5kc1NlcGVyYXRvclxuICAgICAgICBkZWNpbWFsID0gKHRob3VzYW5kcyA9PSAnLCcpID8gJy4nIDogJywnXG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgbnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cblxuICAgICAgICBudW1iZXIgPSAobnVtYmVyIC8gMTAwKS50b0ZpeGVkKHByZWNpc2lvbilcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IG51bWJlci5zcGxpdCgnLicpXG4gICAgICAgIGNvbnN0IGRvbGxhcnNBbW91bnQgPSBwYXJ0c1swXS5yZXBsYWNlKC8oXFxkKSg/PShcXGRcXGRcXGQpKyg/IVxcZCkpL2csICckMScgKyB0aG91c2FuZHMpXG4gICAgICAgIGNvbnN0IGNlbnRzQW1vdW50ID0gcGFydHNbMV0gPyBkZWNpbWFsICsgcGFydHNbMV0gOiAnJ1xuXG4gICAgICAgIHJldHVybiBkb2xsYXJzQW1vdW50ICsgY2VudHNBbW91bnRcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZvcm1hdC5tYXRjaChwbGFjZWhvbGRlclJlZ2V4KVsxXSkge1xuICAgICAgICBjYXNlICdhbW91bnQnOlxuICAgICAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAyKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzJzpcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdhbW91bnRfd2l0aF9zcGFjZV9zZXBhcmF0b3InOlxuICAgICAgICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICAgICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAwKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzX3dpdGhfc3BhY2Vfc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDApXG4gICAgICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZShwbGFjZWhvbGRlclJlZ2V4LCB2YWx1ZSlcbn1cbiJdLCJuYW1lcyI6WyJmb3JtYXRNb25leSIsImNlbn
1893RzIiwiZm9ybWF0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidGhlbWUiLCJtb25leSIsInJlcGxhY2UiLCJ2YWx1ZSIsInBsYWNlaG9sZGVyUmVnZXgiLCJmb3JtYXRXaXRoRGVsaW1pdGVycyIsIm51bWJlciIsInByZWNpc2lvbiIsInRob3VzYW5kcyIsImRlY2ltYWwiLCJ0aG91c2FuZHNTZXBlcmF0b3IiLCJpc05hTiIsInRvRml4ZWQiLCJwYXJ0cyIsInNwbGl0IiwiZG9sbGFyc0Ftb3VudCIsImNlbnRzQW1vdW50IiwibWF0Y2giXSwic291cmNlUm9vdCI6IiJ9 1894//# sourceURL=webpack-internal:///./src/scripts/lib/currency.js 1895 1896}`)},"./src/scripts/lib/faithpilot.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1897/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1898/* harmony export */ renderFaithpilotItems: () => (/* binding */ renderFaithpilotItems) 1899/* harmony export */ }); 1900function renderFaithpilotItems(items, container, limit) { 1901 var truncate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; 1902 if (!limit) limit = items.length; 1903 loopify(items).slice(0, limit).forEach(function (i) { 1904 var _date; 1905 var date = i.date.length ? new Date(i.date) : null; 1906 var options = { 1907 year: 'numeric', 1908 month: 'long', 1909 day: 'numeric' 1910 }; 1911 date = ((_date = date) === null || _date === void 0 ? void 0 : _date.toLocaleDateString(window.theme.config.locale, options)) || ''; 1912 var truncateLength = truncate ? 100 : i.quote.length; 1913 var quoteTruncated = i.quote.length > truncateLength ? i.quote.slice(0, truncateLength).concat('...') : i.quote; 1914 var starCount = parseInt(i.stars); 1915 var iconName; 1916 switch (starCount) { 1917 case 1: 1918 iconName = 'faithpilotStarRed'; 1919 break; 1920 case 2: 1921 iconName = 'faithpilotStarOrange'; 1922 break; 1923 case 3: 1924 iconName = 'faithpilotStarYellow'; 1925 break; 1926 case 4: 1927 iconName = 'faithpilotStarLight'; 1928 break; 1929 case 5: 1930 iconName = 'faithpilotStarDark'; 1931 break; 1932 default: 1933 } 1934 var starsHtml = window.theme.icons[iconName].repeat(starCount); 1935 if (starCount < 5) { 1936 for (var _i = 0; _i < 5 - starCount; _i++) { 1937 starsHtml += window.theme.icons.faithpilotStarVoid; 1938 } 1939 } 1940 var div = document.createElement('div'); 1941 container.appendChild(div); 1942 div.outerHTML = window.theme.faithpilot.reviewItem.replaceAll('%title%', i.title).replaceAll('%date%', date).replaceAll('%content%', i.quote).replaceAll('%contentTruncated%', quoteTruncated).replaceAll('%stars%', starsHtml); 1943 }); 1944}//# sourceURL=[module] 1945//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvZmFpdGhwaWxvdC5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EscUJBQXFCQSxDQUFDQyxLQUFLLEVBQUVDLFNBQVMsRUFBRUMsS0FBSyxFQUFtQjtFQUFBLElBQWpCQyxRQUFRLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDMUUsSUFBSSxDQUFDRixLQUFLLEVBQUVBLEtBQUssR0FBR0YsS0FBSyxDQUFDSyxNQUFNO0VBRWhDRSxPQUFPLENBQUNQLEtBQUssQ0FBQyxDQUFDUSxLQUFLLENBQUMsQ0FBQyxFQUFDTixLQUFLLENBQUMsQ0FBQ08sT0FBTyxDQUFDLFVBQUFDLENBQUMsRUFBSTtJQUFBLElBQUFDLEtBQUE7SUFDdkMsSUFBSUMsSUFBSSxHQUFHRixDQUFDLENBQUNFLElBQUksQ0FBQ1AsTUFBTSxHQUFHLElBQUlRLElBQUksQ0FBQ0gsQ0FBQyxDQUFDRSxJQUFJLENBQUMsR0FBRyxJQUFJO0lBQ2xELElBQU1FLE9BQU8sR0FBRztNQUFFQyxJQUFJLEVBQUUsU0FBUztNQUFFQyxLQUFLLEVBQUUsTUFBTTtNQUFFQyxHQUFHLEVBQUU7SUFBVSxDQUFDO0lBQ2xFTCxJQUFJLEdBQUcsRUFBQUQsS0FBQSxHQUFBQyxJQUFJLGNBQUFELEtBQUEsdUJBQUpBLEtBQUEsQ0FBTU8sa0JBQWtCLENBQUNDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDQyxNQUFNLENBQUNDLE1BQU0sRUFBRVIsT0FBTyxDQUFDLEtBQUksRUFBRTtJQUUxRSxJQUFNUyxjQUFjLEdBQUdwQixRQUFRLEdBQUcsR0FBRyxHQUFHTyxDQUFDLENBQUNjLEtBQUssQ0FBQ25CLE1BQU07SUFDdEQsSUFBTW9CLGNBQWMsR0FBR2YsQ0FBQyxDQUFDYyxLQUFLLENBQUNuQixNQUFNLEdBQUdrQixjQUFjLEdBQUdiLENBQUMsQ0FBQ2MsS0FBSyxDQUFDaEIsS0FBSyxDQUFDLENBQUMsRUFBQ2UsY0FBYyxDQUFDLENBQUNHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBR2hCLENBQUMsQ0FBQ2MsS0FBSztJQUVoSCxJQUFNRyxTQUFTLEdBQUdDLFFBQVEsQ0FBQ2xCLENBQUMsQ0FBQ21CLEtBQUssQ0FBQztJQUNuQyxJQUFJQyxRQUFRO0lBRVosUUFBUUgsU0FBUztNQUNiLEtBQUssQ0FBQztRQUNGRyxRQUFRLEdBQUcsbUJBQW1CO1FBQzlCO01BQ0osS0FBSyxDQUFDO1FBQ0ZBLFFBQVEsR0FBRyxzQkFBc0I7UUFDakM7TUFDSixLQUFLLENBQUM7UUFDRkEsUUFBUSxHQUFHLHNCQUFzQjtRQUNqQzt
1945NQUNKLEtBQUssQ0FBQztRQUNGQSxRQUFRLEdBQUcscUJBQXFCO1FBQ2hDO01BQ0osS0FBSyxDQUFDO1FBQ0ZBLFFBQVEsR0FBRyxvQkFBb0I7UUFDL0I7TUFDSjtJQUVKO0lBRUEsSUFBSUMsU0FBUyxHQUFHWixNQUFNLENBQUNDLEtBQUssQ0FBQ1ksS0FBSyxDQUFDRixRQUFRLENBQUMsQ0FBQ0csTUFBTSxDQUFDTixTQUFTLENBQUM7SUFFOUQsSUFBSUEsU0FBUyxHQUFHLENBQUMsRUFBRTtNQUNmLEtBQUssSUFBSWpCLEVBQUMsR0FBRyxDQUFDLEVBQUVBLEVBQUMsR0FBRyxDQUFDLEdBQUdpQixTQUFTLEVBQUVqQixFQUFDLEVBQUUsRUFBRTtRQUNwQ3FCLFNBQVMsSUFBSVosTUFBTSxDQUFDQyxLQUFLLENBQUNZLEtBQUssQ0FBQ0Usa0JBQWtCO01BQ3REO0lBQ0o7SUFFQSxJQUFNQyxHQUFHLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUN6Q3BDLFNBQVMsQ0FBQ3FDLFdBQVcsQ0FBQ0gsR0FBRyxDQUFDO0lBRTFCQSxHQUFHLENBQUNJLFNBQVMsR0FBR3BCLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDb0IsVUFBVSxDQUFDQyxVQUFVLENBQ2pDQyxVQUFVLENBQUMsU0FBUyxFQUFFaEMsQ0FBQyxDQUFDaUMsS0FBSyxDQUFDLENBQzlCRCxVQUFVLENBQUMsUUFBUSxFQUFFOUIsSUFBSSxDQUFDLENBQzFCOEIsVUFBVSxDQUFDLFdBQVcsRUFBRWhDLENBQUMsQ0FBQ2MsS0FBSyxDQUFDLENBQ2hDa0IsVUFBVSxDQUFDLG9CQUFvQixFQUFFakIsY0FBYyxDQUFDLENBQ2hEaUIsVUFBVSxDQUFDLFNBQVMsRUFBRVgsU0FBUyxDQUFDO0VBQ3JELENBQUMsQ0FBQztBQUNOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2ZhaXRocGlsb3QuanM/ZTE4NiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVuZGVyRmFpdGhwaWxvdEl0ZW1zKGl0ZW1zLCBjb250YWluZXIsIGxpbWl0LCB0cnVuY2F0ZSA9IHRydWUpIHtcbiAgICBpZiAoIWxpbWl0KSBsaW1pdCA9IGl0ZW1zLmxlbmd0aFxuXG4gICAgbG9vcGlmeShpdGVtcykuc2xpY2UoMCxsaW1pdCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgbGV0IGRhdGUgPSBpLmRhdGUubGVuZ3RoID8gbmV3IERhdGUoaS5kYXRlKSA6IG51bGxcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9XG4gICAgICAgIGRhdGUgPSBkYXRlPy50b0xvY2FsZURhdGVTdHJpbmcod2luZG93LnRoZW1lLmNvbmZpZy5sb2NhbGUsIG9wdGlvbnMpIHx8ICcnXG5cbiAgICAgICAgY29uc3QgdHJ1bmNhdGVMZW5ndGggPSB0cnVuY2F0ZSA/IDEwMCA6IGkucXVvdGUubGVuZ3RoXG4gICAgICAgIGNvbnN0IHF1b3RlVHJ1bmNhdGVkID0gaS5xdW90ZS5sZW5ndGggPiB0cnVuY2F0ZUxlbmd0aCA/IGkucXVvdGUuc2xpY2UoMCx0cnVuY2F0ZUxlbmd0aCkuY29uY2F0KCcuLi4nKSA6IGkucXVvdGVcblxuICAgICAgICBjb25zdCBzdGFyQ291bnQgPSBwYXJzZUludChpLnN0YXJzKVxuICAgICAgICBsZXQgaWNvbk5hbWVcbiAgICAgICAgXG4gICAgICAgIHN3aXRjaCAoc3RhckNvdW50KSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgaWNvbk5hbWUgPSAnZmFpdGhwaWxvdFN0YXJSZWQnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpY29uTmFtZSA9ICdmYWl0aHBpbG90U3Rhck9yYW5nZSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGljb25OYW1lID0gJ2ZhaXRocGlsb3RTdGFyWWVsbG93J1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgaWNvbk5hbWUgPSAnZmFpdGhwaWxvdFN0YXJMaWdodCdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIGljb25OYW1lID0gJ2ZhaXRocGlsb3RTdGFyRGFyaydcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJzSHRtbCA9IHdpbmRvdy50aGVtZS5pY29uc1tpY29uTmFtZV0ucmVwZWF0KHN0YXJDb3VudClcblxuICAgICAgICBpZiAoc3RhckNvdW50IDwgNSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1IC0gc3RhckNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFyc0h0bWwgKz0gd2luZG93LnRoZW1lLmljb25zLmZhaXRocGlsb3RTdGFyVm9pZF
vendor: 7,696 bytes, lines 1945-1990
1945xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdilcblxuICAgICAgICBkaXYub3V0ZXJIVE1MID0gd2luZG93LnRoZW1lLmZhaXRocGlsb3QucmV2aWV3SXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJyV0aXRsZSUnLCBpLnRpdGxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoJyVkYXRlJScsIGRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnJWNvbnRlbnQlJywgaS5xdW90ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCclY29udGVudFRydW5jYXRlZCUnLCBxdW90ZVRydW5jYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCclc3RhcnMlJywgc3RhcnNIdG1sKVxuICAgIH0pXG59Il0sIm5hbWVzIjpbInJlbmRlckZhaXRocGlsb3RJdGVtcyIsIml0ZW1zIiwiY29udGFpbmVyIiwibGltaXQiLCJ0cnVuY2F0ZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImxvb3BpZnkiLCJzbGljZSIsImZvckVhY2giLCJpIiwiX2RhdGUiLCJkYXRlIiwiRGF0ZSIsIm9wdGlvbnMiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJ3aW5kb3ciLCJ0aGVtZSIsImNvbmZpZyIsImxvY2FsZSIsInRydW5jYXRlTGVuZ3RoIiwicXVvdGUiLCJxdW90ZVRydW5jYXRlZCIsImNvbmNhdCIsInN0YXJDb3VudCIsInBhcnNlSW50Iiwic3RhcnMiLCJpY29uTmFtZSIsInN0YXJzSHRtbCIsImljb25zIiwicmVwZWF0IiwiZmFpdGhwaWxvdFN0YXJWb2lkIiwiZGl2IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiYXBwZW5kQ2hpbGQiLCJvdXRlckhUTUwiLCJmYWl0aHBpbG90IiwicmV2aWV3SXRlbSIsInJlcGxhY2VBbGwiLCJ0aXRsZSJdLCJzb3VyY2VSb290IjoiIn0= 1946//# sourceURL=webpack-internal:///./src/scripts/lib/faithpilot.js 1947 1948}`)},"./src/scripts/lib/fetch-paginated-items.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 1949/* harmony export */ __webpack_require__.d(__webpack_exports__, { 1950/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 1951/* harmony export */ }); 1952function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 1953function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 1954function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 1955function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 1956function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 1957function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } 1958function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 1959function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 1960function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 1961function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 1962/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/function () { 1963 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(url) { 1964 var pageSize, 1965 items, 1966 hasMore, 1967 page, 1968 response, 1969 data, 1970 _args = arguments; 1971 return _regenerator().w(function (_context) { 1972 while (1) switch (_context.n) { 1973 case 0: 1974 pageSize = _args.length > 1 && _args[1] !== undefined ? _args[1] : 250; 1975 items = []; 1976 hasMore = true; 1977 page = 1; 1978 case 1: 1979 _context.n = 2; 1980 return fetch("".concat(url, "&page=").concat(page)); 1981 case 2: 1982 response = _context.v; 1983 _context.n = 3; 1984 return response.json(); 1985 case 3: 1986 data = _context.v; 1987 items.push.apply(items, _toConsumableArray(data)); 1988 page += 1; 1989 if (data.length < pageSize) { 1990 hasMore = false;
1991 } 1992 case 4: 1993 if (hasMore) { 1994 _context.n = 1; 1995 break; 1996 } 1997 case 5: 1998 return _context.a(2, items); 1999 } 2000 }, _callee); 2001 })); 2002 return function (_x) { 2003 return _ref.apply(this, arguments); 2004 }; 2005}());//# sourceURL=[module] 2006//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvZmV0Y2gtcGFnaW5hdGVkLWl0ZW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9BQUFpQixDQUFBLElBQUFGLENB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QUEsQ0FBQWhFLENBQUEsRUFBQUQsQ0FBQSxZQUFBa0UsTUFBQTlELENBQUEsSUFBQXVELGtCQUFBLENBQUF0QyxDQUFBLEVBQUFuQixDQUFBLEVBQUFJLENBQUEsRUFBQTRELEtBQUEsRUFBQUMsTUFBQSxVQUFBL0QsQ0FBQSxjQUFBK0QsT0FBQS9ELENBQUEsSUFBQXVELGtCQUFBLENBQUF0QyxDQUFBLEVBQUFuQixDQUFBLEVBQUFJLENBQUEsRUFBQTRELEtBQUEsRUFBQUMsTUFBQSxXQUFBL0QsQ0FBQSxLQUFBOEQsS0FBQTtBQURBO0VBQUEsSUFBQUUsSUFBQSxHQUFBTCxpQkFBQSxjQUFBM0IsWUFBQSxHQUFBRSxDQUFBLENBQWUsU0FBQStCLFFBQU9DLEdBQUc7SUFBQSxJQUFBQyxRQUFBO01BQUFDLEtBQUE7TUFBQUMsT0FBQTtNQUFBQyxJQUFBO01BQUFDLFFBQUE7TUFBQUMsSUFBQTtNQUFBQyxLQUFBLEdBQUFiLFNBQUE7SUFBQSxPQUFBNUIsWUFBQSxHQUFBQyxDQUFBLFdBQUF5QyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQTFFLENBQUE7UUFBQTtVQUFFbUUsUUFBUSxHQUFBTSxLQUFBLENBQUFyRCxNQUFBLFFBQUFxRCxLQUFBLFFBQUFFLFNBQUEsR0FBQUYsS0FBQSxNQUFHLEdBQUc7VUFDakNMLEtBQUssR0FBRyxFQUFFO1VBRVpDLE9BQU8sR0FBRyxJQUFJO1VBQ2RDLElBQUksR0FBRyxDQUFDO1F
2006BQUE7VUFBQUksUUFBQSxDQUFBMUUsQ0FBQTtVQUFBLE9BR2E0RSxLQUFLLElBQUFDLE1BQUEsQ0FBSVgsR0FBRyxZQUFBVyxNQUFBLENBQVNQLElBQUksQ0FBRSxDQUFDO1FBQUE7VUFBN0NDLFFBQVEsR0FBQUcsUUFBQSxDQUFBMUQsQ0FBQTtVQUFBMEQsUUFBQSxDQUFBMUUsQ0FBQTtVQUFBLE9BQ0t1RSxRQUFRLENBQUNPLElBQUksQ0FBQyxDQUFDO1FBQUE7VUFBNUJOLElBQUksR0FBQUUsUUFBQSxDQUFBMUQsQ0FBQTtVQUNWb0QsS0FBSyxDQUFDVyxJQUFJLENBQUFsQixLQUFBLENBQVZPLEtBQUssRUFBQTNCLGtCQUFBLENBQVMrQixJQUFJLEVBQUM7VUFDbkJGLElBQUksSUFBSSxDQUFDO1VBRVQsSUFBSUUsSUFBSSxDQUFDcEQsTUFBTSxHQUFHK0MsUUFBUSxFQUFFO1lBQzFCRSxPQUFPLEdBQUcsS0FBSztVQUNqQjtRQUFDO1VBQUEsSUFDTUEsT0FBTztZQUFBSyxRQUFBLENBQUExRSxDQUFBO1lBQUE7VUFBQTtRQUFBO1VBQUEsT0FBQTBFLFFBQUEsQ0FBQXpELENBQUEsSUFFVG1ELEtBQUs7TUFBQTtJQUFBLEdBQUFILE9BQUE7RUFBQSxDQUNiO0VBQUEsaUJBQUFlLEVBQUE7SUFBQSxPQUFBaEIsSUFBQSxDQUFBSCxLQUFBLE9BQUFELFNBQUE7RUFBQTtBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL2ZldGNoLXBhZ2luYXRlZC1pdGVtcy5qcz8xYzdhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGFzeW5jICh1cmwsIHBhZ2VTaXplID0gMjUwKSA9PiB7XG4gIGNvbnN0IGl0ZW1zID0gW107XG5cbiAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICBsZXQgcGFnZSA9IDE7XG5cbiAgZG8ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfSZwYWdlPSR7cGFnZX1gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGl0ZW1zLnB1c2goLi4uZGF0YSk7XG4gICAgcGFnZSArPSAxO1xuXG4gICAgaWYgKGRhdGEubGVuZ3RoIDwgcGFnZVNpemUpIHtcbiAgICAgIGhhc01vcmUgPSBmYWxzZTtcbiAgICB9XG4gIH0gd2hpbGUgKGhhc01vcmUpO1xuXG4gIHJldHVybiBpdGVtcztcbn07Il0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiX2FycmF5V2l0aG91dEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVNwcmVhZCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJpc0FycmF5IiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiX3JlZiIsIl9jYWxsZWUiLCJ1cmwiLCJwYWdlU2l6ZSIsIml0ZW1zIiwiaGFzTW9yZSIsInBhZ2UiLCJyZXNwb25zZSIsImRhdGEiLCJfYXJncyIsIl9jb250ZXh0IiwidW5kZWZpbmVkIiwiZmV0Y2giLCJjb25jYXQiLCJqc29uIiwicHVzaCIsIl94Il0sInNvdXJjZVJvb3QiOiIifQ== 2007//# sourceURL=webpack-internal:///./src/scripts/lib/fetch-paginated-items.js 2008 2009}`)},"./src/scripts/lib/images.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2010/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2011/* harmony export */ getSizedImageUrl: () => (/* binding */ getSizedImageUrl), 2012/* harmony export */ imageSize: () => (/* binding */ imageSize), 2013/* harmony export */ loadImage: () => (/* binding */ loadImage), 2014/* harmony export */ preload: () => (/* binding */ preload), 2015/* harmony export */ removeProtocol: () => (/* binding */ removeProtocol) 2016/* harmony export */ }); 2017/** 2018 * Preloads an image in memory and uses the browsers cache to store it until needed. 2019 * 2020 * @param {Array} images - A list of image urls 2021 * @param {String} size - A shopify image size attribute 2022 */ 2023function preload(images, size) { 2024 if (typeof images === 'string') { 2025 images = [images]; 2026 } 2027 for (var i = 0; i < images.length; i++) { 2028 var image = images[i]; 2029 loadImage(getSizedImageUrl(image, size)); 2030 } 2031} 2032 2033/** 2034 * Loads and caches an image in the browsers cache. 2035 * @param {string} path - An image url 2036 */ 2037function loadImage(path) { 2038 /* eslint-disable */ 2039 new Image().src = path; 2040 /* eslint-enable */ 2041} 2042 2043/** 2044 * Find the Shopify image attribute size 2045 * 2046 * @param {string} src 2047 * @returns {null} 2048 */ 2049function imageSize(src) { 2050 /* eslint-disable */ 2051 var match = src.match(/.+_((pico|icon|thumb|small|compact|medium|large|grande)|\\d{1,4}x\\d{0,4}|x\\d{1,4})(@\\dx)?\\./); 2052 /* esling-enable */ 2053 2054 if (match) { 2055 return match[1]; 2056 } else { 2057 return null; 2058 } 2059} 2060 2061/** 2062 * Adds a Shopify size attribute to a URL 2063 * 2064 * @param src 2065 * @param size 2066 * @returns {*} 2067 */ 2068function getSizedImageUrl(src, size) { 2069 if (size === null) { 2070 return src; 2071 } 2072 if (size === 'master') { 2073 return removeProtocol(src); 2074 } 2075 var match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif|webp)(\\?v=\\d+)?$/i); 2076 if (match) { 2077 var prefix = src.split(match[0]); 2078 var suffix = match[0]; 2079 return removeProtocol(prefix[0] + '_' + size + suffix); 2080 } else { 2081 return null; 2082 } 2083} 2084function removeProtocol(path) { 2085 return path.replace(/http(s)?:/, ''); 2086}//# sourceURL=[module] 2087//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvaW1hZ2VzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsT0FBT0EsQ0FBQ0MsTUFBTSxFQUFFQyxJQUFJLEVBQUU7RUFDbEMsSUFBSSxPQUFPRCxNQUFNLEtBQUssUUFBUSxFQUFFO0lBQzVCQSxN
2087QUFNLEdBQUcsQ0FBQ0EsTUFBTSxDQUFDO0VBQ3JCO0VBRUEsS0FBSyxJQUFJRSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdGLE1BQU0sQ0FBQ0csTUFBTSxFQUFFRCxDQUFDLEVBQUUsRUFBRTtJQUNwQyxJQUFJRSxLQUFLLEdBQUdKLE1BQU0sQ0FBQ0UsQ0FBQyxDQUFDO0lBQ3JCRyxTQUFTLENBQUNDLGdCQUFnQixDQUFDRixLQUFLLEVBQUVILElBQUksQ0FBQyxDQUFDO0VBQzVDO0FBQ0o7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxTQUFTQSxDQUFDRSxJQUFJLEVBQUU7RUFDNUI7RUFDQSxJQUFJQyxLQUFLLENBQUMsQ0FBQyxDQUFDQyxHQUFHLEdBQUdGLElBQUk7RUFDdEI7QUFDSjs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxTQUFTQSxDQUFDRCxHQUFHLEVBQUU7RUFDM0I7RUFDQSxJQUFJRSxLQUFLLEdBQUdGLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLDRGQUE0RixDQUFDO0VBQ25IOztFQUVBLElBQUlBLEtBQUssRUFBRTtJQUNQLE9BQU9BLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbkIsQ0FBQyxNQUFNO0lBQ0gsT0FBTyxJQUFJO0VBQ2Y7QUFDSjs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNMLGdCQUFnQkEsQ0FBQ0csR0FBRyxFQUFFUixJQUFJLEVBQUU7RUFDeEMsSUFBSUEsSUFBSSxLQUFLLElBQUksRUFBRTtJQUNmLE9BQU9RLEdBQUc7RUFDZDtFQUVBLElBQUlSLElBQUksS0FBSyxRQUFRLEVBQUU7SUFDbkIsT0FBT1csY0FBYyxDQUFDSCxHQUFHLENBQUM7RUFDOUI7RUFFQSxJQUFJRSxLQUFLLEdBQUdGLEdBQUcsQ0FBQ0UsS0FBSyxDQUFDLDJEQUEyRCxDQUFDO0VBRWxGLElBQUlBLEtBQUssRUFBRTtJQUNQLElBQUlFLE1BQU0sR0FBR0osR0FBRyxDQUFDSyxLQUFLLENBQUNILEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJSSxNQUFNLEdBQUdKLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFckIsT0FBT0MsY0FBYyxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHWixJQUFJLEdBQUdjLE1BQU0sQ0FBQztFQUMxRCxDQUFDLE1BQU07SUFDSCxPQUFPLElBQUk7RUFDZjtBQUNKO0FBRU8sU0FBU0gsY0FBY0EsQ0FBQ0wsSUFBSSxFQUFFO0VBQ2pDLE9BQU9BLElBQUksQ0FBQ1MsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7QUFDeEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIvaW1hZ2VzLmpzPzFjMjgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcmVsb2FkcyBhbiBpbWFnZSBpbiBtZW1vcnkgYW5kIHVzZXMgdGhlIGJyb3dzZXJzIGNhY2hlIHRvIHN0b3JlIGl0IHVudGlsIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZXMgLSBBIGxpc3Qgb2YgaW1hZ2UgdXJsc1xuICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSBBIHNob3BpZnkgaW1hZ2Ugc2l6ZSBhdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWxvYWQoaW1hZ2VzLCBzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBpbWFnZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGltYWdlcyA9IFtpbWFnZXNdXG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGltYWdlID0gaW1hZ2VzW2ldXG4gICAgICAgIGxvYWRJbWFnZShnZXRTaXplZEltYWdlVXJsKGltYWdlLCBzaXplKSlcbiAgICB9XG59XG5cblxuLyoqXG4gKiBMb2FkcyBhbmQgY2FjaGVzIGFuIGltYWdlIGluIHRoZSBicm93c2VycyBjYWNoZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQW4gaW1hZ2UgdXJsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2UocGF0aCkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgbmV3IEltYWdlKCkuc3JjID0gcGF0aFxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuXG4vKipcbiAqIEZpbmQgdGhlIFNob3BpZnkgaW1hZ2UgYXR0cmlidXRlIHNpemVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcmV0dXJucyB7bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlU2l6ZShzcmMpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHZhciBtYXRjaCA9IHNyYy5tYXRjaCgvLitfKChwaWNvfGljb258dGh1bWJ8c21hbGx8Y29tcGFjdHxtZWRpdW18bGFyZ2V8Z3JhbmRlKXxcXGR7MSw0fXhcXGR7MCw0fXx4XFxkezEsNH0pKEBcXGR4KT9cXC4vKVxuICAgIC8qIGVzbGluZy1lbmFibGUgKi9cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cbn1cblxuXG4vKipcbiAqIEFkZHMgYSBTaG9waWZ5IHNpemUgYXR0cmlidXRlIHRvIGEgVVJMXG4gKlxuICogQHBhcmFtIHNyY1xuICogQHBhcmFtIHNpemVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2l6ZWRJbWFnZVVybChzcmMsIHNpemUpIHtcbiAgICBpZiAoc2l6ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3JjXG4gICAgfVxuXG4gICAgaWYgKHNpemUgPT09ICdtYXN0ZXInKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVQcm90b2NvbChzcmMpXG4gICAgfVxuXG4gICAgdmFyIG1hdGNoID0gc3JjLm1hdGNoKC9cXC4oanBnfGpwZWd8Z2lmfHBuZ3xibXB8Yml0bWFwfHRpZmZ8dGlmfHdlYnApKFxcP3Y9XFxkKyk/JC9pKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHZhciBwcmVmaXggPSBzcmMuc3BsaXQobWF0Y2hbMF0pXG4gICAgICAgIHZhciBzdWZmaXggPSBtYXRjaFswXVxuXG4gICAgICAgIHJldHVybiByZW1vdmVQcm90b2NvbChwcmVmaXhbMF0gKyAnXycgKyBzaXplICsgc3VmZml4KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJvdG9jb2wocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL2h0dHAocyk/Oi8sICcnKVxufVxuIl0sIm5hbWVzIjpbInByZWxvYWQiLCJpbWFnZXMiLCJzaXplIiwiaSIsImxlbmd0aCIsImltYWdlIiwibG9hZEltYWdlIiwiZ2V0U2l6ZWRJbWFnZVVybCIsInBhdGgiLCJJbWFnZSIsInNyYyIsImltYWdlU2l6ZSIsIm1hdGNoIiwicmVtb3ZlUHJvdG9jb2wiLCJwcmVmaXgiLCJzcGxpdCIsInN1ZmZpeCIsInJlcGxhY2UiXSwic291cmNlUm9vdCI6IiJ9 2088//# sourceURL=webpack-internal:///./src/scripts/lib/images.js 2089 2090}`)},"./src/scripts/lib/keen-slider.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2091/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2092/* harmony export */ addClasses: () => (/* binding */ addClasses), 2093/* harmony export */ initArrows: () => (/* binding */ initArrows), 2094/* harmony export */ initDots: () => (/* binding */ initDots), 2095/* harmony export */ initSliderWrapper: () => (/* binding */ initSliderWrapper), 2096/* harmony export */ updateArrows: () => (/* binding */ updateArrows), 2097/* harmony export */ updateDots: () => (/* binding */ updateDots) 2098/* harmony export */ }); 2099function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 2100function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 2101function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 2102function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } 2103function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 2104function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 2105/*******************************************************************************************************************************************/ 2106/* Prepare Slides 2107/*******************************************************************************************************************************************/
2108function addClasses(sliderElement) { 2109 sliderElement.classList.add('keen-slider'); 2110 var slides = _toConsumableArray(sliderElement.children); 2111 slides.forEach(function (slide) { 2112 return slide.classList.add('keen-slider__slide'); 2113 }); 2114} 2115 2116/*******************************************************************************************************************************************/ 2117/* Init Slider Wrapper 2118/*******************************************************************************************************************************************/ 2119function initSliderWrapper(wrapper) { 2120 var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'is-initialized'; 2121 wrapper.classList.add(className); 2122} 2123 2124/*******************************************************************************************************************************************/ 2125/* Arrows 2126/*******************************************************************************************************************************************/ 2127function initArrows(sliderInstance, prev, next) { 2128 prev.addEventListener('click', function () { 2129 sliderInstance.prev(); 2130 }); 2131 next.addEventListener('click', function () { 2132 sliderInstance.next(); 2133 }); 2134} 2135function updateArrows(sliderInstance, prev, next) { 2136 var disabledClass = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'is-disabled'; 2137 var _sliderInstance$detai = sliderInstance.details(), 2138 relativeSlide = _sliderInstance$detai.relativeSlide, 2139 size = _sliderInstance$detai.size, 2140 slidesPerView = _sliderInstance$detai.slidesPerView; 2141 relativeSlide === 0 ? prev.classList.add(disabledClass) : prev.classList.remove(disabledClass); 2142 relativeSlide >= Math.ceil(size - slidesPerView) ? next.classList.add(disabledClass) : next.classList.remove(disabledClass); 2143} 2144 2145/*******************************************************************************************************************************************/ 2146/* Dots 2147/*******************************************************************************************************************************************/ 2148function initDots(sliderInstance, sliderElement, dotsWrapper) { 2149 var dotClass = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'dot'; 2150 var slides = _toConsumableArray(sliderElement.children); 2151 slides.forEach(function (slide, i) { 2152 var dot = document.createElement('button'); 2153 dot.type = 'button'; 2154 dot.classList.add(dotClass); 2155 dotsWrapper.appendChild(dot); 2156 dot.addEventListener('click', function () { 2157 sliderInstance.moveToSlide(i); 2158 }); 2159 }); 2160} 2161function updateDots(sliderInstance, dotsWrapper) { 2162 var activeClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'is-active'; 2163 var _sliderInstance$detai2 = sliderInstance.details(), 2164 relativeSlide = _sliderInstance$detai2.relativeSlide; 2165 var dots = _toConsumableArray(dotsWrapper.children); 2166 dots.forEach(function (dot, i) { 2167 i === relativeSlide ? dot.classList.add(activeClass) : dot.classList.remove(activeClass); 2168 }); 2169}//# sourceURL=[module] 2170//# sourceMappingURL=data:application/json;charset=utf-8;base64,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sR0FBRyxDQUFDNkIsUUFBUSxDQUFDO0lBQzNCRCxXQUFXLENBQUNPLFdBQVcsQ0FBQ0osR0FBRyxDQUFDO0lBQzVCQSxHQUFHLENBQUNmLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFNO01BQUVILGNBQWMsQ0FBQ3VCLFdBQVcsQ0FBQ04sQ0FBQyxDQUFDO0lBQUMsQ0FBQyxDQUFDO0VBQzFFLENBQUMsQ0FBQztBQUNOO0FBRU8sU0FBU08sVUFBVUEsQ0FBQ3hCLGNBQWMsRUFBRWUsV0FBVyxFQUE2QjtFQUFBLElBQTNCVSxXQUFXLEdBQUE3QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxXQUFXO0VBQzdFLElBQUE4QixzQkFBQSxHQUEwQjFCLGNBQWMsQ0FBQ08sT0FBTyxDQUFDLENBQUM7SUFBMUNDLGFBQWEsR0FBQWtCLHNCQUFBLENBQWJsQixhQUFhO0VBQ3JCLElBQU1tQixJQUFJLEdBQUF0QyxrQkFBQSxDQUFPMEIsV0FBVyxDQUFDekIsUUFBUSxDQUFDO0VBQ3RDcUMsSUFBSSxDQUFDcEMsT0FBTyxDQUFDLFVBQUMyQixHQUFHLEVBQUVELENBQUMsRUFBSztJQUNyQkEsQ0FBQyxLQUFLVCxhQUFhLEdBQ2pCVSxHQUFHLENBQUNoQyxTQUFTLENBQUNDLEdBQUcsQ0FBQ3NDLFdBQVcsQ0FBQyxHQUM5QlAsR0FBRyxDQUFDaEMsU0FBUyxDQUFDeUIsTUFBTSxDQUFDYyxXQUFXLENBQUM7RUFDdkMsQ0FBQyxDQUFDO0FBQ04iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIva2Vlbi1zbGlkZXIuanM/MjAwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIFByZXBhcmUgU2xpZGVzXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDbGFzc2VzKHNsaWRlckVsZW1lbnQpIHtcbiAgICBzbGlkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2tlZW4tc2xpZGVyJylcblxuICAgIGNvbnN0IHNsaWRlcyA9IFsuLi5zbGlkZXJFbGVtZW50LmNoaWxkcmVuXVxuICAgIHNsaWRlcy5mb3JFYWNoKHNsaWRlID0+IHNsaWRlLmNsYXNzTGlzdC5hZGQoJ2tlZW4tc2xpZGVyX19zbGlkZScpKVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogSW5pdCBTbGlkZXIgV3JhcHBlclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFNsaWRlcldyYXBwZXIod3JhcHBlciwgY2xhc3NOYW1lID0gJ2lzLWluaXRpYWxpemVkJykge1xuICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBBcnJvd3Ncbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRBcnJvd3Moc2xpZGVySW5zdGFuY2UsIHByZXYsIG5leHQpIHtcbiAgICBwcmV2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzbGlkZXJJbnN0YW5jZS5wcmV2KCkgfSlcbiAgICBuZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzbGlkZXJJbnN0YW5jZS5uZXh0KCkgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFycm93cyhzbGlkZXJJbnN0YW5jZSwgcHJldiwgbmV4dCwgZGlzYWJsZWRDbGFzcyA9ICdpcy1kaXNhYmxlZCcpIHtcbiAgICBjb25zdCB7IHJlbGF0aXZlU2xpZGUsIHNpemUsIHNsaWRlc1BlclZpZXcgfSA9IHNsaWRlckluc3RhbmNlLmRldGFpbHMoKVxuXG4gICAgcmVsYXRpdmVTbGlkZSA9PT0gMFxuICAgID8gcHJldi5jbGFzc0xpc3QuYWRkKGRpc2FibGVkQ2xhc3MpXG4gICAgOiBwcmV2LmNsYXNzTGlzdC5yZW1vdmUoZGlzYWJsZWRDbGFzcylcbiAgICBcbiAgICByZWxhdGl2ZVNsaWRlID49IE1hdGguY2VpbChzaXplIC0gc2xpZGVzUGVyVmlldylcbiAgICA/IG5leHQuY2xhc3NMaXN0LmFkZChkaXNhYmxlZENsYXNzKVxuICAgIDogbm
2170V4dC5jbGFzc0xpc3QucmVtb3ZlKGRpc2FibGVkQ2xhc3MpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBEb3RzXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RG90cyhzbGlkZXJJbnN0YW5jZSwgc2xpZGVyRWxlbWVudCwgZG90c1dyYXBwZXIsIGRvdENsYXNzID0gJ2RvdCcpIHtcbiAgICBjb25zdCBzbGlkZXMgPSBbLi4uc2xpZGVyRWxlbWVudC5jaGlsZHJlbl1cbiAgICBzbGlkZXMuZm9yRWFjaCgoc2xpZGUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJylcbiAgICAgICAgZG90LnR5cGUgPSAnYnV0dG9uJ1xuICAgICAgICBkb3QuY2xhc3NMaXN0LmFkZChkb3RDbGFzcylcbiAgICAgICAgZG90c1dyYXBwZXIuYXBwZW5kQ2hpbGQoZG90KVxuICAgICAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNsaWRlckluc3RhbmNlLm1vdmVUb1NsaWRlKGkpIH0pXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURvdHMoc2xpZGVySW5zdGFuY2UsIGRvdHNXcmFwcGVyLCBhY3RpdmVDbGFzcyA9ICdpcy1hY3RpdmUnKSB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVNsaWRlIH0gPSBzbGlkZXJJbnN0YW5jZS5kZXRhaWxzKClcbiAgICBjb25zdCBkb3RzID0gWy4uLmRvdHNXcmFwcGVyLmNoaWxkcmVuXVxuICAgIGRvdHMuZm9yRWFjaCgoZG90LCBpKSA9PiB7XG4gICAgICAgIGkgPT09IHJlbGF0aXZlU2xpZGVcbiAgICAgICAgPyBkb3QuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcylcbiAgICAgICAgOiBkb3QuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcylcbiAgICB9KVxufSJdLCJuYW1lcyI6WyJhZGRDbGFzc2VzIiwic2xpZGVyRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsInNsaWRlcyIsIl90b0NvbnN1bWFibGVBcnJheSIsImNoaWxkcmVuIiwiZm9yRWFjaCIsInNsaWRlIiwiaW5pdFNsaWRlcldyYXBwZXIiLCJ3cmFwcGVyIiwiY2xhc3NOYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiaW5pdEFycm93cyIsInNsaWRlckluc3RhbmNlIiwicHJldiIsIm5leHQiLCJhZGRFdmVudExpc3RlbmVyIiwidXBkYXRlQXJyb3dzIiwiZGlzYWJsZWRDbGFzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaSIsImRldGFpbHMiLCJyZWxhdGl2ZVNsaWRlIiwic2l6ZSIsInNsaWRlc1BlclZpZXciLCJyZW1vdmUiLCJNYXRoIiwiY2VpbCIsImluaXREb3RzIiwiZG90c1dyYXBwZXIiLCJkb3RDbGFzcyIsImkiLCJkb3QiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwiYXBwZW5kQ2hpbGQiLCJtb3ZlVG9TbGlkZSIsInVwZGF0ZURvdHMiLCJhY3RpdmVDbGFzcyIsIl9zbGlkZXJJbnN0YW5jZSRkZXRhaTIiLCJkb3RzIl0sInNvdXJjZVJvb3QiOiIifQ== 2171//# sourceURL=webpack-internal:///./src/scripts/lib/keen-slider.js 2172 2173}`)},"./src/scripts/lib/load-script.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2174/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2175/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 2176/* harmony export */ }); 2177function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } 2178function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 2179function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 2180function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 2181function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } 2182function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } 2183var queue = {}; 2184var loaded = {}; 2185/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (source, attributes) { 2186 return new Promise(function (resolve, reject) { 2187 var isLoaded = Object.prototype.hasOwnProperty.call(loaded, source); 2188 var isQueued = Object.prototype.hasOwnProperty.call(queue, source); 2189 if (isLoaded) { 2190 resolve(loaded[source]); 2191 return; 2192 } 2193 if (isQueued) { 2194 queue[source].addEventListener('load', function (event) { 2195 resolve(event.target); 2196 }, { 2197 once: true 2198 }); 2199 return; 2200 } 2201 var script = document.createElement('script'); 2202 script.src = source; 2203 script.async = true; 2204 if (attributes) {
2205 Object.entries(attributes).forEach(function (property) { 2206 var _property = _slicedToArray(property, 2), 2207 attribute = _property[0], 2208 value = _property[1]; 2209 script.setAttribute(attribute, value); 2210 }); 2211 } 2212 script.onload = function () { 2213 resolve(script); 2214 loaded[source] = script; 2215 delete queue[source]; 2216 }; 2217 script.onerror = function (event) { 2218 reject(event); 2219 delete queue[source]; 2220 }; 2221 queue[source] = script; 2222 document.head.appendChild(script); 2223 }); 2224}); 2225(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });//# sourceURL=[module] 2226//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvbG9hZC1zY3JpcHQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLElBQU1BLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBTUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVqQixpRUFBZSxVQUFDQyxNQUFNLEVBQUVDLFVBQVU7RUFBQSxPQUNoQyxJQUFJQyxPQUFPLENBQUMsVUFBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUs7SUFDL0IsSUFBTUMsUUFBUSxHQUFHQyxNQUFNLENBQUNDLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNWLE1BQU0sRUFBRUMsTUFBTSxDQUFDO0lBQ3JFLElBQU1VLFFBQVEsR0FBR0osTUFBTSxDQUFDQyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDWCxLQUFLLEVBQUVFLE1BQU0sQ0FBQztJQUVwRSxJQUFJSyxRQUFRLEVBQUU7TUFDWkYsT0FBTyxDQUFDSixNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDO01BRXZCO0lBQ0Y7SUFFQSxJQUFJVSxRQUFRLEVBQUU7TUFDWlosS0FBSyxDQUFDRSxNQUFNLENBQUMsQ0FBQ1csZ0JBQWdCLENBQzVCLE1BQU0sRUFDTixVQUFDQyxLQUFLLEVBQUs7UUFDVFQsT0FBTyxDQUFDUyxLQUFLLENBQUNDLE1BQU0sQ0FBQztNQUN2QixDQUFDLEVBQ0Q7UUFBRUMsSUFBSSxFQUFFO01BQUssQ0FDZixDQUFDO01BRUQ7SUFDRjtJQUVBLElBQU1DLE1BQU0sR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQy9DRixNQUFNLENBQUNHLEdBQUcsR0FBR2xCLE1BQU07SUFDbkJlLE1BQU0sQ0FBQ0ksS0FBSyxHQUFHLElBQUk7SUFFbkIsSUFBSWxCLFVBQVUsRUFBRTtNQUNkSyxNQUFNLENBQUNjLE9BQU8sQ0FBQ25CLFVBQVUsQ0FBQyxDQUFDb0IsT0FBTyxDQUFDLFVBQUNDLFFBQVEsRUFBSztRQUMvQyxJQUFBQyxTQUFBLEdBQUFDLGNBQUEsQ0FBMkJGLFFBQVE7VUFBNUJHLFNBQVMsR0FBQUYsU0FBQTtVQUFFRyxLQUFLLEdBQUFILFNBQUE7UUFFdkJSLE1BQU0sQ0FBQ1ksWUFBWSxDQUFDRixTQUFTLEVBQUVDLEtBQUssQ0FBQztNQUN2QyxDQUFDLENBQUM7SUFDSjtJQUVBWCxNQUFNLENBQUNhLE1BQU0sR0FBRyxZQUFNO01BQ3BCekIsT0FBTyxDQUFDWSxNQUFNLENBQUM7TUFFZmhCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLEdBQUdlLE1BQU07TUFDdkIsT0FBT2pCLEtBQUssQ0FBQ0UsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFRGUsTUFBTSxDQUFDYyxPQUFPLEdBQUcsVUFBQ2pCLEtBQUssRUFBSztNQUMxQlIsTUFBTSxDQUFDUSxLQUFLLENBQUM7TUFFYixPQUFPZCxLQUFLLENBQUNFLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBRURGLEtBQUssQ0FBQ0UsTUFBTSxDQUFDLEdBQUdlLE1BQU07SUFDdEJDLFFBQVEsQ0FBQ2MsSUFBSSxDQUFDQyxXQUFXLENBQUNoQixNQUFNLENBQUM7RUFDbkMsQ0FBQyxDQUFDO0FBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9sb2FkLXNjcmlwdC5qcz9iZDJiIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHF1ZXVlID0ge307XG5jb25zdCBsb2FkZWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgKHNvdXJjZSwgYXR0cmlidXRlcykgPT5cbiAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGlzTG9hZGVkID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvYWRlZCwgc291cmNlKTtcbiAgICBjb25zdCBpc1F1ZXVlZCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChxdW
2226V1ZSwgc291cmNlKTtcblxuICAgIGlmIChpc0xvYWRlZCkge1xuICAgICAgcmVzb2x2ZShsb2FkZWRbc291cmNlXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNRdWV1ZWQpIHtcbiAgICAgIHF1ZXVlW3NvdXJjZV0uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2xvYWQnLFxuICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgb25jZTogdHJ1ZSB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNyYyA9IHNvdXJjZTtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuXG4gICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGNvbnN0IFthdHRyaWJ1dGUsIHZhbHVlXSA9IHByb3BlcnR5O1xuXG4gICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShzY3JpcHQpO1xuXG4gICAgICBsb2FkZWRbc291cmNlXSA9IHNjcmlwdDtcbiAgICAgIGRlbGV0ZSBxdWV1ZVtzb3VyY2VdO1xuICAgIH07XG5cbiAgICBzY3JpcHQub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgcmVqZWN0KGV2ZW50KTtcblxuICAgICAgZGVsZXRlIHF1ZXVlW3NvdXJjZV07XG4gICAgfTtcblxuICAgIHF1ZXVlW3NvdXJjZV0gPSBzY3JpcHQ7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9KTtcbiJdLCJuYW1lcyI6WyJxdWV1ZSIsImxvYWRlZCIsInNvdXJjZSIsImF0dHJpYnV0ZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImlzTG9hZGVkIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXNRdWV1ZWQiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJ0YXJnZXQiLCJvbmNlIiwic2NyaXB0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3JjIiwiYXN5bmMiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInByb3BlcnR5IiwiX3Byb3BlcnR5IiwiX3NsaWNlZFRvQXJyYXkiLCJhdHRyaWJ1dGUiLCJ2YWx1ZSIsInNldEF0dHJpYnV0ZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiXSwic291cmNlUm9vdCI6IiJ9 2227//# sourceURL=webpack-internal:///./src/scripts/lib/load-script.js 2228 2229}`)},"./src/scripts/lib/product-card.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2230/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2231/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__), 2232/* harmony export */ getBadges: () => (/* binding */ getBadges), 2233/* harmony export */ getCheapestVariant: () => (/* binding */ getCheapestVariant), 2234/* harmony export */ variantHasSaving: () => (/* binding */ variantHasSaving) 2235/* harmony export */ }); 2236/* harmony import */ var _lib_images_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/images.js */ "./src/scripts/lib/images.js"); 2237/* harmony import */ var _lib_currency_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/currency.js */ "./src/scripts/lib/currency.js"); 2238function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 2239function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 2240function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } 2241function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } 2242function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 2243function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } 2244 2245 2246var getCheapestVariant = function getCheapestVariant(product) { 2247 return product.variants.sort(function (_ref, _ref2) { 2248 var a = _ref.price; 2249 var b = _ref2.price; 2250 if (parseInt(a) < parseInt(b)) return -1;else if (parseInt(a) > parseInt(b)) return 1; 2251 return 0; 2252 })[0]; 2253}; 2254var variantHasSaving = function variantHasSaving(variant) { 2255 return variant.compare_at_price && parseInt(variant.compare_at_price) > parseInt(variant.price); 2256}; 2257var getSaveBadgeHtml = function getSaveBadgeHtml(product) { 2258 var html = ''; 2259 var variantsWithSaving = product.variants.filter(function (variant) { 2260 return variantHasSaving(variant); 2261 }); 2262 var savePercentages = variantsWithSaving.map(function (variant) { 2263 var saving = parseInt(variant.compare_at_price) - parseInt(variant.price); 2264 var percentage = Math.round(saving / parseInt(variant.compare_at_price) * 100); 2265 return percentage; 2266 }); 2267 if (savePercentages.length) { 2268 var sameForAll = savePercentages.length == product.variants.length; 2269 html = window.theme.product.badges[savePercentages.length > 1 || savePercentages.length && !sameForAll ? 'saveupto' : 'save'].replace('%percentage%', Math.max.apply(Math, _toConsumableArray(savePercentages))); 2270 } 2271 return html; 2272}; 2273var getBadges = function getBadges(product) { 2274 // manual badges 2275 var TOP_VALUES = [].concat(_toConsumableArray(theme.product.badgeValues.top), ['preorder', 'sold-out']); 2276 var BOTTOM_LEFT_VALUES = theme.product.badgeValues.bottomLeft; 2277 var BOTTOM_RIGHT_VALUES = theme.product.badgeValues.bottomRight; 2278 var values = product.tags.filter(function (tag) { 2279 return tag.slice(0, 6) === 'badge_'; 2280 }).map(function (tag) { 2281 return tag.slice(6); 2282 }); 2283 if (product.tags.find(function (tag) { 2284 return tag === 'sold_out'; 2285 }) || !product.variants.find(function (variant) { 2286 return variant.available; 2287 })) values.push('sold-out'); 2288 if (product.tags.find(function (tag) { 2289 return tag.slice(0, 9) === 'preorder_'; 2290 })) values.push('preorder'); 2291 var valuesTop = values.filter(function (value) { 2292 return TOP_VALUES.includes(value); 2293 });
2294 var valuesBottomLeft = values.filter(function (value) { 2295 return BOTTOM_LEFT_VALUES.includes(value); 2296 }); 2297 var valuesBottomRight = values.filter(function (value) { 2298 return BOTTOM_RIGHT_VALUES.includes(value); 2299 }); 2300 var htmlTop = valuesTop.map(function (value) { 2301 return theme.product.badges[value]; 2302 }).join(''); 2303 var htmlBottomLeft = valuesBottomLeft.map(function (value) { 2304 return theme.product.badges[value]; 2305 }).join(''); 2306 var htmlBottomRight = valuesBottomRight.map(function (value) { 2307 return theme.product.badges[value]; 2308 }).join(''); 2309 2310 // price related badges 2311 htmlTop += getSaveBadgeHtml(product); 2312 return "<div class=\\"product-card__badges\\">\\n <div class=\\"product-card__badges__top\\">\\n <div class=\\"product-card__badges__list\\">".concat(htmlTop, "</div>\\n </div>\\n \\n <div class=\\"product-card__badges__bottom\\">\\n <div class=\\"product-card__badges__list product-card__badges__list--column\\">").concat(htmlBottomLeft, "</div>\\n <div class=\\"product-card__badges__list\\">").concat(htmlBottomRight, "</div>\\n </div>\\n </div>"); 2313}; 2314/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (product) { 2315 var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; 2316 var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, 2317 _ref3$showQuickBuy = _ref3.showQuickBuy, 2318 showQuickBuy = _ref3$showQuickBuy === void 0 ? false : _ref3$showQuickBuy; 2319 var getClasses = function getClasses() { 2320 return classes; 2321 }; 2322 var getTitle = function getTitle() { 2323 return product.title; 2324 }; 2325 var getImages = function getImages() { 2326 var imgPrimary = product.media[0]; 2327 var imgSecondary = product.media.find(function (medium) { 2328 var _medium$alt; 2329 return ((_medium$alt = medium.alt) === null || _medium$alt === void 0 ? void 0 : _medium$alt.toLowerCase()) === 'hover_image'; 2330 }) || product.media[0]; 2331 var imgPrimarySrc = imgPrimary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgPrimary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgPrimary.src)), ''), '720x') : ''; 2332 var imgSecondarySrc = imgSecondary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgSecondary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgSecondary.src)), ''), '720x') : ''; 2333 var imgPrimaryLazySrc = imgPrimary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgPrimary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgPrimary.src)), ''), '1x') : ''; 2334 var imgSecondaryLazySrc = imgSecondary ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(imgSecondary.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(imgSecondary.src)), ''), '1x') : ''; 2335 return "<img src=\\"".concat(imgPrimaryLazySrc, "\\" data-src=\\"").concat(imgPrimarySrc, "\\" class=\\"product-card__image product-card__image--primary lazyload\\" alt=\\"Hairlust - ").concat(getTitle(), "\\">\\n <img src=\\"").concat(imgSecondaryLazySrc, "\\" data-src=\\"").concat(imgSecondarySrc, "\\" class=\\"product-card__image product-card__image--secondary lazyload\\" alt=\\"Hairlust - ").concat(getTitle(), "\\"></img>"); 2336 }; 2337 var getPrices = function getPrices() { 2338 var cheapestVariant = getCheapestVariant(product); 2339 var compareAtPrice = cheapestVariant.compare_at_price && parseInt(cheapestVariant.compare_at_price) > parseInt(cheapestVariant.price) ? (0,_lib_currency_js__WEBPACK_IMPORTED_MODULE_1__.formatMoney)(cheapestVariant.compare_at_price) : null; 2340 return "<p class=\\"price price--compare js-comparePrice\\">".concat(compareAtPrice || '', "</p>\\n <p class=\\"price price--current js-currentPrice\\">").concat((0,_lib_currency_js__WEBPACK_IMPORTED_MODULE_1__.formatMoney)(product.price), "</p>"); 2341 }; 2342 var getUrl = function getUrl() { 2343 return product.url; 2344 }; 2345 var getDescription = function getDescription() { 2346 var _product$description; 2347 return ((_product$description = product.description) === null || _product$description === void 0 || (_product$description = _product$description.split('[description_mini_start]').filter(function (element) { 2348 return element; 2349 })[0]) === null || _product$description === void 0 || (_product$description = _product$description.split('[description_mini_end]').filter(function (element) { 2350 return element; 2351 })[0]) === null || _product$description === void 0 ? void 0 : _product$description.replace(/<p>/, '').replace(/<\\/p>/, '')) || ''; 2352 }; 2353 var getLinkedProducts = function getLinkedProducts() { 2354 var _product$linked; 2355 // Bail if no linked products 2356 if (!(product !== null && product !== void 0 && (_product$linked = product.linked) !== null && _product$linked !== void 0 && _product$linked.length)) return ''; 2357 2358 // Bail if hidden 2359 if (product.meta.hide_thumbnails) return ''; 2360 var maxLimit = 5; 2361 var orgLength = product.linked.length; 2362 var sortProducts = function sortProducts(products, handle) { 2363 var product = products.find(function (item) { 2364 return item.handle === handle; 2365 }); 2366 if (product) { 2367 products.splice(products.indexOf(product), 1); 2368 products.unshift(product); 2369 } 2370 return products; 2371 };
2372 var itemsMarkup = function itemsMarkup() { 2373 var html = ''; 2374 var linkedProducts = sortProducts(product.linked, product.handle).slice(0, maxLimit); 2375 var plusCounter = function plusCounter() { 2376 return "<span class=\\"product-card__linked-item-extra\\">+".concat(orgLength - maxLimit, "</span>"); 2377 }; 2378 linkedProducts.forEach(function (item, index) { 2379 var lazySrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='; 2380 var img = item.img ? (0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.getSizedImageUrl)(item.img.src.replace("_".concat((0,_lib_images_js__WEBPACK_IMPORTED_MODULE_0__.imageSize)(item.img.src)), ''), '300x') : ''; 2381 var classNames = ''; 2382 if (item.handle === product.handle) classNames += ' is-current'; 2383 if (index + 1 === maxLimit) classNames += ' has-overlay'; 2384 html += "\\n <a href=\\"".concat(item.url, "\\" class=\\"product-card__linked-item ").concat(classNames, "\\">\\n <div class=\\"image-wrapper\\">\\n <img src=\\"").concat(lazySrc, "\\" data-src=\\"").concat(img, "\\" class=\\"lazyload\\" alt=\\"").concat(getTitle(), "\\">\\n </div>\\n\\n ").concat(index + 1 === maxLimit ? plusCounter() : '', "\\n </a>\\n "); 2385 }); 2386 return html; 2387 }; 2388 return itemsMarkup(); 2389 }; 2390 var getQuickBuyButton = function getQuickBuyButton(placement) { 2391 if (!showQuickBuy) return ''; 2392 var variant = product.variants.find(function (v) { 2393 return v.available; 2394 }); 2395 if (!variant) return ''; 2396 var template = placement === 'overlay' ? theme.product.quickBuyButtonOverlayTemplate : theme.product.quickBuyButtonInlineTemplate; 2397 return template.replace('%variantId%', variant.id); 2398 }; 2399 return theme.product.productCardTemplate.replace('%classes%', getClasses()).replace('%images%', getImages()).replace('%badges%', getBadges(product)).replace('%prices%', getPrices()).replace(/%productTitle%/g, getTitle()).replace('%productDescription%', getDescription()).replace(/%productUrl%/g, getUrl()).replace('%linkedProducts%', getLinkedProducts()).replace('%quickBuyButtonOverlay%', getQuickBuyButton('overlay')).replace('%quickBuyButtonInline%', getQuickBuyButton('inline')); 2400}); 2401(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true }); 2402//# sourceURL=[module] 2403//# sourceMappingURL=data:application/json;charset=utf-8;base64,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BQyxDQUN2QzJCLE9BQU8sQ0FBQyxVQUFVLEVBQUVtRCxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2hDbkQsT0FBTyxDQUFDLGlCQUFpQixFQUFFb0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUN0Q3BDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRXdELGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FDakR4RCxPQUFPLENBQUMsZUFBZSxFQUFFc0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNsQ3RELE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTZELGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUNoRDdELE9BQU8sQ0FBQyx5QkFBeUIsRUFBRW1GLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ2hFbkYsT0FBTyxDQUFDLHdCQUF3QixFQUFFbUYsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vc3JjL3NjcmlwdHMvbGliL3Byb2R1Y3QtY2FyZC5qcz84MTg2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNpemVkSW1hZ2VVcmwsIGltYWdlU2l6ZSB9IGZyb20gJ0AvbGliL2ltYWdlcy5qcyc7XG5pbXBvcnQgeyBmb3JtYXRNb25leSB9IGZyb20gJ0AvbGliL2N1cnJlbmN5LmpzJztcblxuY29uc3QgZ2V0Q2hlYXBlc3RWYXJpYW50ID0gKHByb2R1Y3QpID0+IHtcbiAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMuc29ydCgoeyBwcmljZTogYSB9LCB7IHByaWNlOiBifSkgPT4ge1xuICAgIGlmIChwYXJzZUludChhKSA8IHBhcnNlSW50KGIpKSByZXR1cm4gLTE7XG4gICAgZWxzZSBpZiAocGFyc2VJbnQoYSkgPiBwYXJzZUludChiKSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH0pWzBdO1xufTtcblxuY29uc3QgdmFyaWFudEhhc1NhdmluZyA9ICh2YXJpYW50KSA9PiB7XG4gIHJldHVybiB2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UgJiYgKHBhcnNlSW50KHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSkgPiBwYXJzZUludCh2YXJpYW50LnByaWNlKSk7XG59O1xuXG5jb25zdCBnZXRTYXZlQmFkZ2VIdG1sID0gKHByb2R1Y3QpID0+IHtcbiAgbGV0IGh0bWwgPSAnJztcblxuICBjb25zdCB2YXJpYW50c1dpdGhTYXZpbmcgPSBwcm9kdWN0LnZhcmlhbnRzLmZpbHRlcigodmFyaWFudCkgPT4gKFxuICAgIHZhcmlhbnRIYXNTYXZpbmcodmFyaWFudClcbiAgKSk7XG5cbiAgY29uc3Qgc2F2ZVBlcmNlbnRhZ2VzID0gdmFyaWFudHNXaXRoU2F2aW5nLm1hcCgodmFyaWFudCkgPT4ge1xuICAgIGNvbnN0IHNhdmluZyA9IHBhcnNlSW50KHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSkgLSBwYXJzZUludCh2YXJpYW50LnByaWNlKTtcbiAgICBjb25zdCBwZXJjZW50YWdlID0gTWF0aC5yb3VuZChzYXZpbmcgLyBwYXJzZUludCh2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UpICogMTAwKTtcblxuICAgIHJldHVybiBwZXJjZW50YWdlO1xuICB9KTtcblxuICBpZiAoc2F2ZVBlcmNlbnRhZ2VzLmxlbmd0aCkge1xuICAgIGNvbnN0IHNhbWVGb3JBbGwgPSBzYXZlUGVyY2VudGFnZXMubGVuZ3RoID09IHByb2R1Y3QudmFyaWFudHMubGVuZ3RoO1xuXG4gICAgaH
2403RtbCA9IHdpbmRvdy50aGVtZS5wcm9kdWN0LmJhZGdlc1tcbiAgICAgIChzYXZlUGVyY2VudGFnZXMubGVuZ3RoID4gMSkgfHwgKHNhdmVQZXJjZW50YWdlcy5sZW5ndGggJiYgIXNhbWVGb3JBbGwpXG4gICAgICAgID8gJ3NhdmV1cHRvJ1xuICAgICAgICA6ICdzYXZlJ1xuICAgICAgXS5yZXBsYWNlKCclcGVyY2VudGFnZSUnLCBNYXRoLm1heCguLi5zYXZlUGVyY2VudGFnZXMpKTtcbiAgfVxuXG4gIHJldHVybiBodG1sO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJhZGdlcyA9IChwcm9kdWN0KSA9PiB7XG4gIC8vIG1hbnVhbCBiYWRnZXNcbiAgY29uc3QgVE9QX1ZBTFVFUyA9IFsuLi50aGVtZS5wcm9kdWN0LmJhZGdlVmFsdWVzLnRvcCwgJ3ByZW9yZGVyJywgJ3NvbGQtb3V0J107XG4gIGNvbnN0IEJPVFRPTV9MRUZUX1ZBTFVFUyA9IHRoZW1lLnByb2R1Y3QuYmFkZ2VWYWx1ZXMuYm90dG9tTGVmdDtcbiAgY29uc3QgQk9UVE9NX1JJR0hUX1ZBTFVFUyA9IHRoZW1lLnByb2R1Y3QuYmFkZ2VWYWx1ZXMuYm90dG9tUmlnaHQ7XG5cbiAgY29uc3QgdmFsdWVzID0gcHJvZHVjdC50YWdzLmZpbHRlcigodGFnKSA9PiB0YWcuc2xpY2UoMCwgNikgPT09ICdiYWRnZV8nKS5tYXAoKHRhZykgPT4gdGFnLnNsaWNlKDYpKTtcbiAgaWYgKHByb2R1Y3QudGFncy5maW5kKCh0YWcpID0+IHRhZyA9PT0gJ3NvbGRfb3V0JykgfHwgIXByb2R1Y3QudmFyaWFudHMuZmluZCgodmFyaWFudCkgPT4gdmFyaWFudC5hdmFpbGFibGUpKSB2YWx1ZXMucHVzaCgnc29sZC1vdXQnKTtcbiAgaWYgKHByb2R1Y3QudGFncy5maW5kKCh0YWcpID0+IHRhZy5zbGljZSgwLCA5KSA9PT0gJ3ByZW9yZGVyXycpKSB2YWx1ZXMucHVzaCgncHJlb3JkZXInKTtcblxuICBjb25zdCB2YWx1ZXNUb3AgPSB2YWx1ZXMuZmlsdGVyKCh2YWx1ZSkgPT4gVE9QX1ZBTFVFUy5pbmNsdWRlcyh2YWx1ZSkpO1xuICBjb25zdCB2YWx1ZXNCb3R0b21MZWZ0ID0gdmFsdWVzLmZpbHRlcigodmFsdWUpID0+IEJPVFRPTV9MRUZUX1ZBTFVFUy5pbmNsdWRlcyh2YWx1ZSkpO1xuICBjb25zdCB2YWx1ZXNCb3R0b21SaWdodCA9IHZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiBCT1RUT01fUklHSFRfVkFMVUVTLmluY2x1ZGVzKHZhbHVlKSk7XG5cbiAgbGV0IGh0bWxUb3AgPSB2YWx1ZXNUb3AubWFwKCh2YWx1ZSkgPT4gdGhlbWUucHJvZHVjdC5iYWRnZXNbdmFsdWVdKS5qb2luKCcnKTtcbiAgY29uc3QgaHRtbEJvdHRvbUxlZnQgPSB2YWx1ZXNCb3R0b21MZWZ0Lm1hcCgodmFsdWUpID0+IHRoZW1lLnByb2R1Y3QuYmFkZ2VzW3ZhbHVlXSkuam9pbignJyk7XG4gIGNvbnN0IGh0bWxCb3R0b21SaWdodCA9IHZhbHVlc0JvdHRvbVJpZ2h0Lm1hcCgodmFsdWUpID0+IHRoZW1lLnByb2R1Y3QuYmFkZ2VzW3ZhbHVlXSkuam9pbignJyk7XG5cbiAgLy8gcHJpY2UgcmVsYXRlZCBiYWRnZXNcbiAgaHRtbFRvcCArPSBnZXRTYXZlQmFkZ2VIdG1sKHByb2R1Y3QpO1xuXG4gIHJldHVybiBgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX190b3BcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmRfX2JhZGdlc19fbGlzdFwiPiR7aHRtbFRvcH08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkX19iYWRnZXNfX2JvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0IHByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0LS1jb2x1bW5cIj4ke2h0bWxCb3R0b21MZWZ0fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fYmFkZ2VzX19saXN0XCI+JHtodG1sQm90dG9tUmlnaHR9PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAocHJvZHVjdCwgY2xhc3NlcyA9ICcnLCB7IHNob3dRdWlja0J1eSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICBjb25zdCBnZXRDbGFzc2VzID0gKCkgPT4ge1xuICAgIHJldHVybiBjbGFzc2VzO1xuICB9O1xuXG4gIGNvbnN0IGdldFRpdGxlID0gKCkgPT4ge1xuICAgIHJldHVybiBwcm9kdWN0LnRpdGxlO1xuICB9O1xuXG4gIGNvbnN0IGdldEltYWdlcyA9ICgpID0+IHtcbiAgICBjb25zdCBpbWdQcmltYXJ5ID0gcHJvZHVjdC5tZWRpYVswXTtcbiAgICBjb25zdCBpbWdTZWNvbmRhcnkgPSBwcm9kdWN0Lm1lZGlhLmZpbmQoKG1lZGl1bSkgPT4gbWVkaXVtLmFsdD8udG9Mb3dlckNhc2UoKSA9PT0gJ2hvdmVyX2ltYWdlJykgfHwgcHJvZHVjdC5tZWRpYVswXTtcblxuICAgIGNvbnN0IGltZ1ByaW1hcnlTcmMgPSBpbWdQcmltYXJ5ID8gZ2V0U2l6ZWRJbWFnZVVybChpbWdQcmltYXJ5LnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaW1nUHJpbWFyeS5zcmMpfWAsICcnKSwgJzcyMHgnKSA6ICcnO1xuICAgIGNvbnN0IGltZ1NlY29uZGFyeVNyYyA9IGltZ1NlY29uZGFyeSA/IGdldFNpemVkSW1hZ2VVcmwoaW1nU2Vjb25kYXJ5LnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaW1nU2Vjb25kYXJ5LnNyYyl9YCwgJycpLCAnNzIweCcpIDogJyc7XG5cbiAgICBjb25zdCBpbWdQcmltYXJ5TGF6eVNyYyA9IGltZ1ByaW1hcnkgPyBnZXRTaXplZEltYWdlVXJsKGltZ1ByaW1hcnkuc3JjLnJlcGxhY2UoYF8ke2ltYWdlU2l6ZShpbWdQcmltYXJ5LnNyYyl9YCwgJycpLCAnMXgnKSA6ICcnO1xuICAgIGNvbnN0IGltZ1NlY29uZGFyeUxhenlTcmMgPSBpbWdTZWNvbmRhcnkgPyBnZXRTaXplZEltYWdlVXJsKGltZ1NlY29uZGFyeS5zcmMucmVwbGFjZShgXyR7aW1hZ2VTaXplKGltZ1NlY29uZGFyeS5zcmMpfWAsICcnKSwgJzF4JykgOiAnJztcblxuICAgIHJldHVybiBgPGltZyBzcmM9XCIke2ltZ1ByaW1hcnlMYXp5U3JjfVwiIGRhdGEtc3JjPVwiJHtpbWdQcmltYXJ5U3JjfVwiIGNsYXNzPVwicHJvZHVjdC1jYXJkX19pbWFnZSBwcm9kdWN0LWNhcmRfX2ltYWdlLS1wcmltYXJ5IGxhenlsb2FkXCIgYWx0PVwiSGFpcmx1c3QgLSAke2dldFRpdGxlKCl9XCI+XG4gICAgPGltZyBzcmM9XCIke2ltZ1NlY29uZGFyeUxhenlTcmN9XCIgZGF0YS1zcmM9XCIke2ltZ1NlY29uZGFyeVNyY31cIiBjbGFzcz1cInByb2R1Y3QtY2FyZF9faW1hZ2UgcHJvZHVjdC1jYXJkX19pbWFnZS0tc2Vjb25kYXJ5IGxhenlsb2FkXCIgYWx0PVwiSGFpcmx1c3QgLSAke2dldFRpdGxlKCl9XCI+PC9pbWc+YDtcbiAgfTtcblxuICBjb25zdCBnZXRQcmljZXMgPSAoKSA9PiB7XG4gICAgY29uc3QgY2hlYXBlc3RWYXJpYW50ID0gZ2V0Q2hlYXBlc3RWYXJpYW50KHByb2R1Y3QpO1xuXG4gICAgY29uc3QgY29tcGFyZUF0UHJpY2UgPSBjaGVhcGVzdFZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSAmJiAocGFyc2VJbnQoY2hlYXBlc3RWYXJpYW50LmNvbXBhcmVfYXRfcHJpY2UpID4gcGFyc2VJbnQoY2hlYXBlc3RWYXJpYW50LnByaWNlKSlcbiAgICAgPyBmb3JtYXRNb25leShjaGVhcGVzdFZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSlcbiAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIGA8cCBjbGFzcz1cInByaWNlIHByaWNlLS1jb21wYXJlIGpzLWNvbXBhcmVQcmljZVwiPiR7Y29tcGFyZUF0UHJpY2UgfHwgJyd9PC9wPlxuICAgIDxwIGNsYXNzPVwicHJpY2UgcHJpY2UtLWN1cnJlbnQganMtY3VycmVudFByaWNlXCI+JHtmb3JtYXRNb25leShwcm9kdWN0LnByaWNlKX08L3A+YDtcbiAgfTtcblxuICBjb25zdCBnZXRVcmwgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHByb2R1Y3QudXJsO1xuICB9O1xuXG4gIGNvbnN0IGdldERlc2NyaXB0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybi
2403Bwcm9kdWN0LmRlc2NyaXB0aW9uPy5zcGxpdCgnW2Rlc2NyaXB0aW9uX21pbmlfc3RhcnRdJylcbiAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQpWzBdXG4gICAgICA/LnNwbGl0KCdbZGVzY3JpcHRpb25fbWluaV9lbmRdJylcbiAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQpWzBdXG4gICAgICA/LnJlcGxhY2UoLzxwPi8sICcnKVxuICAgICAgLnJlcGxhY2UoLzxcXC9wPi8sICcnKSB8fCAnJztcbiAgfTtcblxuICBjb25zdCBnZXRMaW5rZWRQcm9kdWN0cyA9ICgpID0+IHtcbiAgICAvLyBCYWlsIGlmIG5vIGxpbmtlZCBwcm9kdWN0c1xuICAgIGlmICghcHJvZHVjdD8ubGlua2VkPy5sZW5ndGgpIHJldHVybiAnJ1xuXG4gICAgLy8gQmFpbCBpZiBoaWRkZW5cbiAgICBpZiAocHJvZHVjdC5tZXRhLmhpZGVfdGh1bWJuYWlscykgcmV0dXJuICcnXG5cbiAgICBjb25zdCBtYXhMaW1pdCA9IDVcbiAgICBjb25zdCBvcmdMZW5ndGggPSBwcm9kdWN0LmxpbmtlZC5sZW5ndGhcblxuICAgIGNvbnN0IHNvcnRQcm9kdWN0cyA9IChwcm9kdWN0cywgaGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0ID0gcHJvZHVjdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5oYW5kbGUgPT09IGhhbmRsZSlcblxuICAgICAgaWYgKHByb2R1Y3QpIHtcbiAgICAgICAgcHJvZHVjdHMuc3BsaWNlKHByb2R1Y3RzLmluZGV4T2YocHJvZHVjdCksIDEpXG4gICAgICAgIHByb2R1Y3RzLnVuc2hpZnQocHJvZHVjdClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb2R1Y3RzXG4gICAgfTtcblxuICAgIGNvbnN0IGl0ZW1zTWFya3VwID0gKCkgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJ1xuXG4gICAgICBjb25zdCBsaW5rZWRQcm9kdWN0cyA9IHNvcnRQcm9kdWN0cyhwcm9kdWN0LmxpbmtlZCwgcHJvZHVjdC5oYW5kbGUpLnNsaWNlKDAsIG1heExpbWl0KVxuXG4gICAgICBjb25zdCBwbHVzQ291bnRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cInByb2R1Y3QtY2FyZF9fbGlua2VkLWl0ZW0tZXh0cmFcIj4mcGx1czske29yZ0xlbmd0aCAtIG1heExpbWl0fTwvc3Bhbj5gXG4gICAgICB9XG5cbiAgICAgIGxpbmtlZFByb2R1Y3RzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhenlTcmMgPSAnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PSdcbiAgICAgICAgY29uc3QgaW1nID0gaXRlbS5pbWcgPyBnZXRTaXplZEltYWdlVXJsKGl0ZW0uaW1nLnNyYy5yZXBsYWNlKGBfJHtpbWFnZVNpemUoaXRlbS5pbWcuc3JjKX1gLCAnJyksICczMDB4JykgOiAnJ1xuXG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gJydcbiAgICAgICAgaWYgKGl0ZW0uaGFuZGxlID09PSBwcm9kdWN0LmhhbmRsZSkgY2xhc3NOYW1lcyArPSAnIGlzLWN1cnJlbnQnXG4gICAgICAgIGlmIChpbmRleCArIDEgPT09IG1heExpbWl0KSBjbGFzc05hbWVzICs9ICcgaGFzLW92ZXJsYXknXG5cbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGEgaHJlZj1cIiR7aXRlbS51cmx9XCIgY2xhc3M9XCJwcm9kdWN0LWNhcmRfX2xpbmtlZC1pdGVtICR7Y2xhc3NOYW1lc31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiJHtsYXp5U3JjfVwiIGRhdGEtc3JjPVwiJHtpbWd9XCIgY2xhc3M9XCJsYXp5bG9hZFwiIGFsdD1cIiR7Z2V0VGl0bGUoKX1cIj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAke2luZGV4ICsgMSA9PT0gbWF4TGltaXQgPyBwbHVzQ291bnRlcigpIDogJyd9XG4gICAgICAgICAgPC9hPlxuICAgICAgICBgXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGh0bWxcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXNNYXJrdXAoKVxuICB9XG5cbiAgY29uc3QgZ2V0UXVpY2tCdXlCdXR0b24gPSAocGxhY2VtZW50KSA9PiB7XG4gICAgaWYgKCFzaG93UXVpY2tCdXkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzLmZpbmQoKHYpID0+IHYuYXZhaWxhYmxlKTtcbiAgICBpZiAoIXZhcmlhbnQpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gcGxhY2VtZW50ID09PSAnb3ZlcmxheSdcbiAgICAgID8gdGhlbWUucHJvZHVjdC5xdWlja0J1eUJ1dHRvbk92ZXJsYXlUZW1wbGF0ZVxuICAgICAgOiB0aGVtZS5wcm9kdWN0LnF1aWNrQnV5QnV0dG9uSW5saW5lVGVtcGxhdGU7XG5cbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgnJXZhcmlhbnRJZCUnLCB2YXJpYW50LmlkKTtcbiAgfTtcblxuICByZXR1cm4gdGhlbWUucHJvZHVjdC5wcm9kdWN0Q2FyZFRlbXBsYXRlXG4gICAgLnJlcGxhY2UoJyVjbGFzc2VzJScsIGdldENsYXNzZXMoKSlcbiAgICAucmVwbGFjZSgnJWltYWdlcyUnLCBnZXRJbWFnZXMoKSlcbiAgICAucmVwbGFjZSgnJWJhZGdlcyUnLCBnZXRCYWRnZXMocHJvZHVjdCkpXG4gICAgLnJlcGxhY2UoJyVwcmljZXMlJywgZ2V0UHJpY2VzKCkpXG4gICAgLnJlcGxhY2UoLyVwcm9kdWN0VGl0bGUlL2csIGdldFRpdGxlKCkpXG4gICAgLnJlcGxhY2UoJyVwcm9kdWN0RGVzY3JpcHRpb24lJywgZ2V0RGVzY3JpcHRpb24oKSlcbiAgICAucmVwbGFjZSgvJXByb2R1Y3RVcmwlL2csIGdldFVybCgpKVxuICAgIC5yZXBsYWNlKCclbGlua2VkUHJvZHVjdHMlJywgZ2V0TGlua2VkUHJvZHVjdHMoKSlcbiAgICAucmVwbGFjZSgnJXF1aWNrQnV5QnV0dG9uT3ZlcmxheSUnLCBnZXRRdWlja0J1eUJ1dHRvbignb3ZlcmxheScpKVxuICAgIC5yZXBsYWNlKCclcXVpY2tCdXlCdXR0b25JbmxpbmUlJywgZ2V0UXVpY2tCdXlCdXR0b24oJ2lubGluZScpKTtcbn07XG5cbmV4cG9ydCB7IGdldENoZWFwZXN0VmFyaWFudCwgdmFyaWFudEhhc1NhdmluZyB9O1xuIl0sIm5hbWVzIjpbImdldFNpemVkSW1hZ2VVcmwiLCJpbWFnZVNpemUiLCJmb3JtYXRNb25leSIsImdldENoZWFwZXN0VmFyaWFudCIsInByb2R1Y3QiLCJ2YXJpYW50cyIsInNvcnQiLCJfcmVmIiwiX3JlZjIiLCJhIiwicHJpY2UiLCJiIiwicGFyc2VJbnQiLCJ2YXJpYW50SGFzU2F2aW5nIiwidmFyaWFudCIsImNvbXBhcmVfYXRfcHJpY2UiLCJnZXRTYXZlQmFkZ2VIdG1sIiwiaHRtbCIsInZhcmlhbnRzV2l0aFNhdmluZyIsImZpbHRlciIsInNhdmVQZXJjZW50YWdlcyIsIm1hcCIsInNhdmluZyIsInBlcmNlbnRhZ2UiLCJNYXRoIiwicm91bmQiLCJsZW5ndGgiLCJzYW1lRm9yQWxsIiwid2luZG93IiwidGhlbWUiLCJiYWRnZXMiLCJyZXBsYWNlIiwibWF4IiwiYXBwbHkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJnZXRCYWRnZXMiLCJUT1BfVkFMVUVTIiwiY29uY2F0IiwiYmFkZ2VWYWx1ZXMiLCJ0b3AiLCJCT1RUT01fTEVGVF9WQUxVRVMiLCJib3R0b21MZWZ0IiwiQk9UVE9NX1JJR0hUX1ZBTFVFUyIsImJvdHRvbVJpZ2h0IiwidmFsdWVzIiwidGFncyIsInRhZyIsInNsaWNlIiwiZmluZCIsImF2YWlsYWJsZSIsInB1c2giLCJ2YWx1ZXNUb3AiLCJ2YWx1ZSIsImluY2x1ZGVzIiwidmFsdWVzQm90dG9tTGVmdCIsInZhbHVlc0JvdHRvbVJpZ2h0IiwiaHRtbFRvcCIsImpvaW4iLCJodG1sQm90dG9tTGVmdCIsImh0bWxCb3R0b21SaWdodCIsImNsYXNzZXMiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfcmVmMyIsIl9yZWYzJHNob3dRdWlja0J1eSIsInNob3dRdWlja0J1eSIsImdldENsYXNzZXMiLCJnZXRUaXRsZSIsInRpdGxlIiwiZ2V0SW1hZ2VzIiwiaW1nUHJpbWFyeSIsIm1lZGlhIiwiaW1nU2Vjb25kYXJ5IiwibWVkaXVtIiwiX21lZGl1bSRhbHQiLCJhbHQiLCJ0b0xvd2VyQ2FzZSIsImltZ1ByaW
24031hcnlTcmMiLCJzcmMiLCJpbWdTZWNvbmRhcnlTcmMiLCJpbWdQcmltYXJ5TGF6eVNyYyIsImltZ1NlY29uZGFyeUxhenlTcmMiLCJnZXRQcmljZXMiLCJjaGVhcGVzdFZhcmlhbnQiLCJjb21wYXJlQXRQcmljZSIsImdldFVybCIsInVybCIsImdldERlc2NyaXB0aW9uIiwiX3Byb2R1Y3QkZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsInNwbGl0IiwiZWxlbWVudCIsImdldExpbmtlZFByb2R1Y3RzIiwiX3Byb2R1Y3QkbGlua2VkIiwibGlua2VkIiwibWV0YSIsImhpZGVfdGh1bWJuYWlscyIsIm1heExpbWl0Iiwib3JnTGVuZ3RoIiwic29ydFByb2R1Y3RzIiwicHJvZHVjdHMiLCJoYW5kbGUiLCJpdGVtIiwic3BsaWNlIiwiaW5kZXhPZiIsInVuc2hpZnQiLCJpdGVtc01hcmt1cCIsImxpbmtlZFByb2R1Y3RzIiwicGx1c0NvdW50ZXIiLCJmb3JFYWNoIiwiaW5kZXgiLCJsYXp5U3JjIiwiaW1nIiwiY2xhc3NOYW1lcyIsImdldFF1aWNrQnV5QnV0dG9uIiwicGxhY2VtZW50IiwidiIsInRlbXBsYXRlIiwicXVpY2tCdXlCdXR0b25PdmVybGF5VGVtcGxhdGUiLCJxdWlja0J1eUJ1dHRvbklubGluZVRlbXBsYXRlIiwiaWQiLCJwcm9kdWN0Q2FyZFRlbXBsYXRlIl0sInNvdXJjZVJvb3QiOiIifQ== 2404//# sourceURL=webpack-internal:///./src/scripts/lib/product-card.js 2405 2406}`)},"./src/scripts/lib/string-memory.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2407/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2408/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 2409/* harmony export */ }); 2410function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 2411function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 2412function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 2413function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 2414function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 2415function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } 2416function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } 2417function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } 2418function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 2419function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } 2420var StringMemory = /*#__PURE__*/function () { 2421 function StringMemory(storage) { 2422 _classCallCheck(this, StringMemory); 2423 this.storage = storage; 2424 this.prefix = 'memory'; 2425 } 2426 return _createClass(StringMemory, [{ 2427 key: "get", 2428 value: function () { 2429 var _get = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(key, callback) { 2430 var _len, 2431 args, 2432 _key, 2433 result, 2434 _args = arguments; 2435 return _regenerator().w(function (_context) { 2436 while (1) switch (_context.n) { 2437 case 0: 2438 for (_len = _args.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { 2439 args[_key - 2] = _args[_key]; 2440 } 2441 if (!this.storage.getItem(this.getKeyName(key))) { 2442 _context.n = 2; 2443 break; 2444 } 2445 if (false) // removed by dead control flow 2446{} 2447 // eslint-disable-next-line no-console 2448 console.log("Fetched key \\"".concat(key, "\\" correctly, but did not return the stored response. Use production environment to enable.")); 2449 return _context.a(2, callback.apply(void 0, args)); 2450 case 1: 2451 return _context.a(2, this.storage.getItem(this.getKeyName(key))); 2452 case 2: 2453 _context.n = 3; 2454 return callback.apply(void 0, args); 2455 case 3: 2456 result = _context.v; 2457 if (typeof result === 'string') { 2458 this.storage.setItem(this.getKeyName(key), result); 2459 } else { 2460 // eslint-disable-next-line no-console 2461 console.warn('Response of callback must of type string to be stored. Result was not stored'); 2462 } 2463 return _context.a(2, result); 2464 } 2465 }, _callee, this); 2466 })); 2467 function get(_x, _x2) { 2468 return _get.apply(this, arguments); 2469 } 2470 return get; 2471 }() 2472 }, { 2473 key: "delete", 2474 value: function _delete(key) { 2475 this.storage.removeItem(this.getKeyName(key)); 2476 } 2477 }, { 2478 key: "getKeyName", 2479 value: function getKeyName(key) { 2480 return "".concat(this.prefix, "-").concat(key); 2481 } 2482 }]); 2483}(); 2484/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (storage) { 2485 return new StringMemory(storage); 2486}); 2487(Object.getOwnPropertyDescriptor(__WEBPACK_DEFAULT_EXPORT__, "name") || {}
2487).writable || Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true });//# sourceURL=[module] 2488//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxNQUFNO2dCQUNMO2dCQUNBUyxPQUFPLENBQUNJLElBQUksQ0FBQyw4RUFBOEUsQ0FBQztjQUM5RjtjQUFDLE9BQUFYLFFBQUEsQ0FBQXRELENBQUEsSUFFTW9ELE1BQU07VUFBQTtRQUFBLEdBQUFMLE9BQUE7TUFBQSxDQUNkO01BQUEsU0F4QkttQixHQUFHQSxDQUFBQyxFQUFBLEVBQUFDLEdBQUE7UUFBQSxPQUFBdEIsSUFBQSxDQUFBaEIsS0FBQSxPQUFBRCxTQUFBO01BQUE7TUFBQSxPQUFIcUMsR0FBRztJQUFBO0VBQUE7SUFBQTlCLEdBQUE7SUFBQTVCLEtBQUEsRUEwQlQsU0FBQTZELE9BQU1BLENBQUNqQyxHQUFHLEVBQUU7TUFDVixJQUFJLENBQUNRLE9BQU8sQ0FBQzBCLFVBQVUsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQ3JCLEdBQUcsQ0FBQyxDQUFDO0lBQy9DO0VBQUM7SUFBQUEsR0FBQTtJQUFBNUIsS0FBQSxFQUVELFNBQUFpRCxVQUFVQSxDQUFDckIsR0FBRyxFQUFFO01BQ2QsVUFBQTJCLE1BQUEsQ0FBVSxJQUFJLENBQUNsQixNQUFNLE9BQUFrQixNQUFBLENBQUkzQixHQUFHO0lBQzlCO0VBQUM7QUFBQTtBQUdILGlFQUFlLFVBQUNRLE9BQU87RUFBQSxPQUFLLElBQUlELFlBQVksQ0FBQ0MsT0FBTyxDQUFDO0FBQUE7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi9zdHJpbmctbWVtb3J5LmpzP2VjNzAiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgU3RyaW5nTWVtb3J5IHtcbiAgY29uc3RydWN0b3Ioc3RvcmFnZSkge1xuICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7XG4gICAgdGhpcy5wcmVmaXggPSAnbWVtb3J5Jztcblx0fVxuXG4gIGFzeW5jIGdldChrZXksIGNhbGxiYWNrLCAuLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBGZXRjaGVkIGtleSBcIiR7a2V5fVwiIGNvcnJlY3RseSwgYnV0IGRpZCBub3QgcmV0dXJuIHRoZSBzdG9yZWQgcmVzcG9uc2UuIFVzZSBwcm9kdWN0aW9uIGVudmlyb25tZW50IHRvIGVuYWJsZS5gXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soLi4uYXJncylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKC4uLmFyZ3MpXG5cbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0S2V5TmFtZShrZXkpLCByZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlIG9mIGNhbGxiYWNrIG11c3Qgb2YgdHlwZSBzdHJpbmcgdG8gYmUgc3RvcmVkLiBSZXN1bHQgd2FzIG5vdCBzdG9yZWQnKVxuICAgIH1cblxuICAgI
vendor: 5,403 bytes, lines 2488-2511
2488HJldHVybiByZXN1bHRcbiAgfVxuXG4gIGRlbGV0ZShrZXkpIHtcbiAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmdldEtleU5hbWUoa2V5KSlcbiAgfVxuXG4gIGdldEtleU5hbWUoa2V5KSB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2tleX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0b3JhZ2UpID0+IG5ldyBTdHJpbmdNZW1vcnkoc3RvcmFnZSlcbiJdLCJuYW1lcyI6WyJlIiwidCIsInIiLCJTeW1ib2wiLCJuIiwiaXRlcmF0b3IiLCJvIiwidG9TdHJpbmdUYWciLCJpIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInAiLCJ5IiwiRyIsInYiLCJhIiwiZCIsImJpbmQiLCJsZW5ndGgiLCJsIiwiVHlwZUVycm9yIiwiY2FsbCIsImRvbmUiLCJ2YWx1ZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiZGlzcGxheU5hbWUiLCJfcmVnZW5lcmF0b3IiLCJ3IiwibSIsImRlZmluZVByb3BlcnR5IiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJfdHlwZW9mIiwidG9QcmltaXRpdmUiLCJTdHJpbmciLCJOdW1iZXIiLCJTdHJpbmdNZW1vcnkiLCJzdG9yYWdlIiwicHJlZml4IiwiX2dldCIsIl9jYWxsZWUiLCJjYWxsYmFjayIsIl9sZW4iLCJhcmdzIiwiX2tleSIsInJlc3VsdCIsIl9hcmdzIiwiX2NvbnRleHQiLCJBcnJheSIsImdldEl0ZW0iLCJnZXRLZXlOYW1lIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY29uc29sZSIsImxvZyIsImNvbmNhdCIsInNldEl0ZW0iLCJ3YXJuIiwiZ2V0IiwiX3giLCJfeDIiLCJkZWxldGUiLCJyZW1vdmVJdGVtIl0sInNvdXJjZVJvb3QiOiIifQ== 2489//# sourceURL=webpack-internal:///./src/scripts/lib/string-memory.js 2490 2491}`)},"./src/scripts/lib/upsell-gift.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2492/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2493/* harmony export */ addUpsellTrigger: () => (/* binding */ addUpsellTrigger), 2494/* harmony export */ canAddFreeGift: () => (/* binding */ canAddFreeGift), 2495/* harmony export */ checkForDeprecatedGifts: () => (/* binding */ checkForDeprecatedGifts), 2496/* harmony export */ clearAllUpsellTriggers: () => (/* binding */ clearAllUpsellTriggers), 2497/* harmony export */ deleteUpsellTrigger: () => (/* binding */ deleteUpsellTrigger), 2498/* harmony export */ doesProductContainTriggers: () => (/* binding */ doesProductContainTriggers), 2499/* harmony export */ getGiftAdded: () => (/* binding */ getGiftAdded), 2500/* harmony export */ getUpsellTriggers: () => (/* binding */ getUpsellTriggers), 2501/* harmony export */ giftAdded: () => (/* binding */ giftAdded), 2502/* harmony export */ invalidGiftPopup: () => (/* binding */ invalidGiftPopup), 2503/* harmony export */ upsellConfig: () => (/* binding */ upsellConfig), 2504/* harmony export */ upsellGiftInCart: () => (/* binding */ upsellGiftInCart), 2505/* harmony export */ upsellGiftValidation: () => (/* binding */ upsellGiftValidation), 2506/* harmony export */ upsellTriggersContains: () => (/* binding */ upsellTriggersContains) 2507/* harmony export */ }); 2508/* harmony import */ var _lib_cart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/cart */ "./src/scripts/lib/cart.js"); 2509/* harmony import */ var _lib_images__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/images */ "./src/scripts/lib/images.js"); 2510/* harmony import */ var _lib_currency__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/currency */ "./src/scripts/lib/currency.js"); 2511function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf;
2511 var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 2512function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 2513function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 2514function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 2515 2516 2517 2518 2519//Config containing translations, icons and threshold for getting a free gift 2520var upsellConfig = { 2521 required_cart_total: window.theme.cart.upsellGiftAmount, 2522 translations: window.theme.strings.upSell, 2523 icons: { 2524 close: window.theme.icons.close, 2525 gift: window.theme.icons.gift, 2526 checkmark: window.theme.icons.checkmarkSmall, 2527 add_btn: window.theme.icons.addBtn 2528 } 2529}; 2530 2531//We use this array as a global state, that keeps track of all current triggers 2532//It is going to contain all triggers as seperate strings, also including duplicates 2533var triggers = []; 2534 2535//We use this as a global state 2536//This variable helps prevent multiple gift products from being added to the cart 2537var gift_added = false; 2538 2539//Functions that lets us interact with our global states from other components 2540var giftAdded = function giftAdded() { 2541 gift_added = true; 2542}; 2543var getGiftAdded = function getGiftAdded() { 2544 return gift_added; 2545}; 2546var getUpsellTriggers = function getUpsellTriggers() { 2547 return triggers; 2548}; 2549var addUpsellTrigger = function addUpsellTrigger(trigger) { 2550 triggers.push(trigger); 2551}; 2552var deleteUpsellTrigger = function deleteUpsellTrigger(trigger) { 2553 triggers = triggers.filter(function (entry) { 2554 return entry !== trigger; 2555 }); 2556}; 2557var clearAllUpsellTriggers = function clearAllUpsellTriggers() { 2558 triggers = []; 2559}; 2560var upsellTriggersContains = function upsellTriggersContains(line_item) { 2561 var upsellTriggers = getUpsellTriggers(); 2562 if (upsellTriggers.length == 0) return false; 2563 if (upsellTriggers.find(function (trigger) { 2564 return trigger == line_item.handle; 2565 })) return true; 2566}; 2567var checkForDeprecatedGifts = function checkForDeprecatedGifts(cart) { 2568 if (!upsellGiftInCart()) return; 2569 var giftProduct = upsellGiftInCart(); 2570 if (upsellTriggersContains(giftProduct) && canAddFreeGift()) return; 2571 var cartQuantities = cart.items.map(function (line_item) { 2572 var _line_item$properties; 2573 if ((_line_item$properties = line_item.properties) !== null && _line_item$properties !== void 0 && _line_item$properties._upsell_gift) return 0; 2574 return line_item.quantity; 2575 }); 2576 (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.updateAllCartQuantities)(cartQuantities).then(function () { 2577 invalidGiftPopup(giftProduct); 2578 }); 2579}; 2580var upsellGiftInCart = function upsellGiftInCart() { 2581 var line_items = app.getState().cart.items; 2582 return line_items.find(function (line_item) { 2583 var _line_item$properties2; 2584 return (_line_item$properties2 = line_item.properties) === null || _line_item$properties2 === void 0 ? void 0 : _line_item$properties2._upsell_gift; 2585 }); 2586}; 2587var canAddFreeGift = function canAddFreeGift() { 2588 var subtract = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; 2589 var cart_total = app.getState().cart.total_price; 2590 return cart_total - subtract >= upsellConfig.required_cart_total; 2591}; 2592var doesProductContainTriggers = /*#__PURE__*/function () { 2593 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(product, line_item_index) {
2594 var productContainsTriggers, line_items, getProductTriggers; 2595 return _regenerator().w(function (_context) { 2596 while (1) switch (_context.n) { 2597 case 0: 2598 productContainsTriggers = product.tags.find(function (tag) { 2599 return tag.includes('upsell_gift:'); 2600 }); 2601 if (productContainsTriggers) { 2602 _context.n = 1; 2603 break; 2604 } 2605 return _context.a(2); 2606 case 1: 2607 line_items = app.getState().cart.items; 2608 getProductTriggers = product.tags.filter(function (tag) { 2609 return tag.includes('upsell_gift:'); 2610 }).map(function (trigger) { 2611 return trigger.split(':')[1]; 2612 }); 2613 getProductTriggers.forEach(function (trigger) { 2614 addUpsellTrigger(trigger); 2615 }); 2616 line_items[line_item_index - 1]['upsellTriggers'] = getProductTriggers; // Shopify line index is 1-based 2617 return _context.a(2, new Promise(function (resolve) { 2618 resolve(getProductTriggers); 2619 })); 2620 } 2621 }, _callee); 2622 })); 2623 return function doesProductContainTriggers(_x, _x2) { 2624 return _ref.apply(this, arguments); 2625 }; 2626}(); 2627var upsellGiftValidation = /*#__PURE__*/function () { 2628 var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(cart, line_item_index) { 2629 var _lineItem$properties, _lineItem$upsellTrigg2; 2630 var allTriggers, giftProduct, lineItem, lineItemTriggers, lineItemPrice, numberOfTriggers; 2631 return _regenerator().w(function (_context2) { 2632 while (1) switch (_context2.n) { 2633 case 0: 2634 allTriggers = getUpsellTriggers(); 2635 giftProduct = upsellGiftInCart(); 2636 lineItem = cart.items[line_item_index - 1]; // Shopify line index is 1-based 2637 //Remove all gift options that are not available from the cart drawer list 2638 lineItemTriggers = allTriggers.filter(function (entry) { 2639 var _lineItem$upsellTrigg; 2640 return (_lineItem$upsellTrigg = lineItem.upsellTriggers) === null || _lineItem$upsellTrigg === void 0 ? void 0 : _lineItem$upsellTrigg.some(function (trigger) { 2641 return trigger.includes(entry); 2642 }); 2643 }); 2644 lineItemTriggers.forEach(function (trigger) { 2645 var numberOfTriggers = allTriggers.filter(function (entry) { 2646 return entry.includes(trigger); 2647 }); 2648 if (numberOfTriggers.length == 1) app.emit('upsell:clear', { 2649 handle: trigger 2650 }); 2651 }); 2652 2653 //If there is no gift product in the cart, we just remove the line item 2654 if (giftProduct) { 2655 _context2.n = 1; 2656 break; 2657 } 2658 return _context2.a(2, removeSingleItem(line_item_index)); 2659 case 1: 2660 if (!((_lineItem$properties = lineItem.properties) !== null && _lineItem$properties !== void 0 && _lineItem$properties._upsell_gift)) { 2661 _context2.n = 2; 2662 break; 2663 } 2664 return _context2.a(2, removeSingleItem(line_item_index)); 2665 case 2: 2666 lineItemPrice = lineItem.price * lineItem.quantity; //If the item being removed is just a normal product without any triggers 2667 if ((_lineItem$upsellTrigg2 = lineItem.upsellTriggers) !== null && _lineItem$upsellTrigg2 !== void 0 && _lineItem$upsellTrigg2.find(function (trigger) { 2668 return trigger == giftProduct.handle; 2669 })) { 2670 _context2.n = 4; 2671 break; 2672 } 2673 if (!canAddFreeGift(lineItemPrice)) { 2674 _context2.n = 3; 2675 break; 2676 } 2677 return _context2.a(2, (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({ 2678 line: line_item_index 2679 })); 2680 case 3: 2681 return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct)); 2682 case 4: 2683 //If the item being removed is the trigger product 2684 numberOfTriggers = cart.items.filter(function (x) { 2685 var _x$upsellTriggers; 2686 return (_x$upsellTriggers = x.upsellTriggers) === null || _x$upsellTriggers === void 0 ? void 0 : _x$upsellTriggers.includes(giftProduct.handle); 2687 }); 2688 if (!(numberOfTriggers.length <= 1)) { 2689 _context2.n = 5; 2690 break; 2691 } 2692 return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct)); 2693 case 5: 2694 if (!canAddFreeGift(lineItemPrice)) { 2695 _context2.n = 6; 2696 break; 2697 } 2698 return _context2.a(2, (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({ 2699 line: line_item_index 2700 })); 2701 case 6: 2702 return _context2.a(2, removeMultipleQuantities(cart, line_item_index, giftProduct)); 2703 case 7: 2704 return _context2.a(2); 2705 } 2706 }, _callee2); 2707 })); 2708 return function upsellGiftValidation(_x3, _x4) { 2709 return _ref2.apply(this, arguments); 2710 }; 2711}(); 2712var removeSingleItem = function removeSingleItem(line_item_index) { 2713 (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.removeItem)({ 2714 line: line_item_index 2715 }); 2716 gift_added = false;
2717}; 2718var removeMultipleQuantities = function removeMultipleQuantities(cart, line_item_index, line_item) { 2719 var cartQuantities = cart.items.map(function (line_item, index) { 2720 var _line_item$properties3; 2721 if ((_line_item$properties3 = line_item.properties) !== null && _line_item$properties3 !== void 0 && _line_item$properties3._upsell_gift) return 0; 2722 if (index == line_item_index - 1) return 0; // Shopify line index is 1-based 2723 return line_item.quantity; 2724 }); 2725 (0,_lib_cart__WEBPACK_IMPORTED_MODULE_0__.updateAllCartQuantities)(cartQuantities).then(function () { 2726 invalidGiftPopup(line_item); 2727 }); 2728 gift_added = false; 2729}; 2730var invalidGiftPopup = function invalidGiftPopup(line_item) { 2731 var popup = "\\n <div class=\\"gift__popup\\" aria-hidden=\\"true\\">\\n <div class=\\"gift__popup--content\\">\\n <div class=\\"gift__popup--close\\" data-close>\\n ".concat(upsellConfig.icons.close, "\\n </div>\\n <h2>").concat(upsellConfig.translations.popup_title, "</h2>\\n <ul>\\n <li class=\\"cart-item\\">\\n <div class=\\"cart-item__main\\">\\n <figure class=\\"cart-item__image\\">\\n <div class=\\"image-wrapper\\">\\n <img class=\\"lazyload\\" data-src=\\"").concat((0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.getSizedImageUrl)(line_item.image.replace('.' + (0,_lib_images__WEBPACK_IMPORTED_MODULE_1__.imageSize)(line_item.image), ''), '120x120'), "\\">\\n </div>\\n </figure>\\n\\n <div class=\\"cart-item__info\\">\\n <p class=\\"cart-item__title\\">").concat(line_item.product_title, "</p>\\n\\n <p class=\\"cart-item__variant\\">\\n <span>").concat(line_item.quantity, " x</span>\\n ").concat(line_item.variant_title ? "<span>".concat(line_item.variant_title, "</span>") : '', "\\n </p>\\n\\n <p class=\\"cart-item__prices\\">\\n <span class=\\"price--gift\\">").concat(upsellConfig.icons.gift, " ").concat(upsellConfig.translations.gift_label, "</span>\\n <span class=\\"price--compare\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(line_item.price), "</span>\\n <span class=\\"price--current\\">").concat((0,_lib_currency__WEBPACK_IMPORTED_MODULE_2__.formatMoney)(0), "</span>\\n </p>\\n </div>\\n </div>\\n </li>\\n </ul>\\n </div>\\n <div class=\\"gift__popup--overlay\\" data-close></div>\\n </div>\\n "); 2732 document.body.insertAdjacentHTML('beforeend', popup); 2733 var popupElement = document.querySelector('.gift__popup'); 2734 popupElement.setAttribute('aria-hidden', false); 2735 var popupElementCloseBtns = popupElement.querySelectorAll('[data-close]'); 2736 popupElementCloseBtns.forEach(function (btn) { 2737 return btn.addEventListener('click', function () { 2738 popupElement.remove(); 2739 }); 2740 }); 2741};//# sourceURL=[module] 2742//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UFDMkMsR0FBRztJQUFBLE9BQzlCQSxHQUFHLENBQUNDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFNO01BQ2hDTixZQUFZLENBQUNPLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQztFQUFBLENBQ04sQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc2NyaXB0cy9saWIvdXBzZWxsLWdpZnQuanM/ZDBhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW1vdmVJdGVtLCB1cGRhdGVBbGxDYXJ0UXVhbnRpdGllcyB9IGZyb20gJ0AvbGliL2NhcnQnXG5pbXBvcnQgeyBnZXRTaXplZEltYWdlVXJsLCBpbWFnZVNpemUgfSBmcm9tICdAL2xpYi9pbWFnZXMnXG5pbXBvcnQgeyBmb3JtYXRNb25leSB9IGZyb20gJ0AvbGliL2N1cnJlbmN5J1xuXG4vL0NvbmZpZyBjb250YWluaW5nIHRyYW5zbGF0aW9ucywgaWNvbnMgYW5kIHR
2742ocmVzaG9sZCBmb3IgZ2V0dGluZyBhIGZyZWUgZ2lmdFxuZXhwb3J0IGNvbnN0IHVwc2VsbENvbmZpZyA9IHtcbiAgICByZXF1aXJlZF9jYXJ0X3RvdGFsOiB3aW5kb3cudGhlbWUuY2FydC51cHNlbGxHaWZ0QW1vdW50LFxuICAgIHRyYW5zbGF0aW9uczogd2luZG93LnRoZW1lLnN0cmluZ3MudXBTZWxsLFxuICAgIGljb25zOiB7XG4gICAgICAgIGNsb3NlOiB3aW5kb3cudGhlbWUuaWNvbnMuY2xvc2UsXG4gICAgICAgIGdpZnQ6IHdpbmRvdy50aGVtZS5pY29ucy5naWZ0LFxuICAgICAgICBjaGVja21hcms6IHdpbmRvdy50aGVtZS5pY29ucy5jaGVja21hcmtTbWFsbCxcbiAgICAgICAgYWRkX2J0bjogd2luZG93LnRoZW1lLmljb25zLmFkZEJ0bixcbiAgICB9LFxufVxuXG4vL1dlIHVzZSB0aGlzIGFycmF5IGFzIGEgZ2xvYmFsIHN0YXRlLCB0aGF0IGtlZXBzIHRyYWNrIG9mIGFsbCBjdXJyZW50IHRyaWdnZXJzXG4vL0l0IGlzIGdvaW5nIHRvIGNvbnRhaW4gYWxsIHRyaWdnZXJzIGFzIHNlcGVyYXRlIHN0cmluZ3MsIGFsc28gaW5jbHVkaW5nIGR1cGxpY2F0ZXNcbmxldCB0cmlnZ2VycyA9IFtdXG5cbi8vV2UgdXNlIHRoaXMgYXMgYSBnbG9iYWwgc3RhdGVcbi8vVGhpcyB2YXJpYWJsZSBoZWxwcyBwcmV2ZW50IG11bHRpcGxlIGdpZnQgcHJvZHVjdHMgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgY2FydFxubGV0IGdpZnRfYWRkZWQgPSBmYWxzZVxuXG4vL0Z1bmN0aW9ucyB0aGF0IGxldHMgdXMgaW50ZXJhY3Qgd2l0aCBvdXIgZ2xvYmFsIHN0YXRlcyBmcm9tIG90aGVyIGNvbXBvbmVudHNcbmV4cG9ydCBjb25zdCBnaWZ0QWRkZWQgPSAoKSA9PiB7XG4gICAgZ2lmdF9hZGRlZCA9IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEdpZnRBZGRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gZ2lmdF9hZGRlZFxufVxuXG5leHBvcnQgY29uc3QgZ2V0VXBzZWxsVHJpZ2dlcnMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRyaWdnZXJzXG59XG5cbmV4cG9ydCBjb25zdCBhZGRVcHNlbGxUcmlnZ2VyID0gKHRyaWdnZXIpID0+IHtcbiAgICB0cmlnZ2Vycy5wdXNoKHRyaWdnZXIpXG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVcHNlbGxUcmlnZ2VyID0gKHRyaWdnZXIpID0+IHtcbiAgICB0cmlnZ2VycyA9IHRyaWdnZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB0cmlnZ2VyKVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyA9ICgpID0+IHtcbiAgICB0cmlnZ2VycyA9IFtdXG59XG5cbmV4cG9ydCBjb25zdCB1cHNlbGxUcmlnZ2Vyc0NvbnRhaW5zID0gKGxpbmVfaXRlbSkgPT4ge1xuICAgIGNvbnN0IHVwc2VsbFRyaWdnZXJzID0gZ2V0VXBzZWxsVHJpZ2dlcnMoKVxuICAgIGlmICh1cHNlbGxUcmlnZ2Vycy5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHVwc2VsbFRyaWdnZXJzLmZpbmQoKHRyaWdnZXIpID0+IHRyaWdnZXIgPT0gbGluZV9pdGVtLmhhbmRsZSkpIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvckRlcHJlY2F0ZWRHaWZ0cyA9IChjYXJ0KSA9PiB7XG4gICAgaWYgKCF1cHNlbGxHaWZ0SW5DYXJ0KCkpIHJldHVyblxuICAgIGNvbnN0IGdpZnRQcm9kdWN0ID0gdXBzZWxsR2lmdEluQ2FydCgpXG5cbiAgICBpZiAodXBzZWxsVHJpZ2dlcnNDb250YWlucyhnaWZ0UHJvZHVjdCkgJiYgY2FuQWRkRnJlZUdpZnQoKSkgcmV0dXJuXG4gICAgY29uc3QgY2FydFF1YW50aXRpZXMgPSBjYXJ0Lml0ZW1zLm1hcCgobGluZV9pdGVtKSA9PiB7XG4gICAgICAgIGlmIChsaW5lX2l0ZW0ucHJvcGVydGllcz8uX3Vwc2VsbF9naWZ0KSByZXR1cm4gMFxuICAgICAgICByZXR1cm4gbGluZV9pdGVtLnF1YW50aXR5XG4gICAgfSlcblxuICAgIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzKGNhcnRRdWFudGl0aWVzKS50aGVuKCgpID0+IHtcbiAgICAgICAgaW52YWxpZEdpZnRQb3B1cChnaWZ0UHJvZHVjdClcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgdXBzZWxsR2lmdEluQ2FydCA9ICgpID0+IHtcbiAgICBjb25zdCBsaW5lX2l0ZW1zID0gYXBwLmdldFN0YXRlKCkuY2FydC5pdGVtc1xuICAgIHJldHVybiBsaW5lX2l0ZW1zLmZpbmQoKGxpbmVfaXRlbSkgPT4gbGluZV9pdGVtLnByb3BlcnRpZXM/Ll91cHNlbGxfZ2lmdClcbn1cblxuZXhwb3J0IGNvbnN0IGNhbkFkZEZyZWVHaWZ0ID0gKHN1YnRyYWN0ID0gMCkgPT4ge1xuICAgIGNvbnN0IGNhcnRfdG90YWwgPSBhcHAuZ2V0U3RhdGUoKS5jYXJ0LnRvdGFsX3ByaWNlXG4gICAgcmV0dXJuIGNhcnRfdG90YWwgLSBzdWJ0cmFjdCA+PSB1cHNlbGxDb25maWcucmVxdWlyZWRfY2FydF90b3RhbFxufVxuXG5leHBvcnQgY29uc3QgZG9lc1Byb2R1Y3RDb250YWluVHJpZ2dlcnMgPSBhc3luYyAocHJvZHVjdCwgbGluZV9pdGVtX2luZGV4KSA9PiB7XG4gICAgY29uc3QgcHJvZHVjdENvbnRhaW5zVHJpZ2dlcnMgPSBwcm9kdWN0LnRhZ3MuZmluZCgodGFnKSA9PiB0YWcuaW5jbHVkZXMoJ3Vwc2VsbF9naWZ0OicpKVxuICAgIGlmICghcHJvZHVjdENvbnRhaW5zVHJpZ2dlcnMpIHJldHVyblxuXG4gICAgY29uc3QgbGluZV9pdGVtcyA9IGFwcC5nZXRTdGF0ZSgpLmNhcnQuaXRlbXNcbiAgICBjb25zdCBnZXRQcm9kdWN0VHJpZ2dlcnMgPSBwcm9kdWN0LnRhZ3NcbiAgICAgICAgLmZpbHRlcigodGFnKSA9PiB0YWcuaW5jbHVkZXMoJ3Vwc2VsbF9naWZ0OicpKVxuICAgICAgICAubWFwKCh0cmlnZ2VyKSA9PiB0cmlnZ2VyLnNwbGl0KCc6JylbMV0pXG5cbiAgICBnZXRQcm9kdWN0VHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICBhZGRVcHNlbGxUcmlnZ2VyKHRyaWdnZXIpXG4gICAgfSlcbiAgICBsaW5lX2l0ZW1zW2xpbmVfaXRlbV9pbmRleCAtIDFdWyd1cHNlbGxUcmlnZ2VycyddID0gZ2V0UHJvZHVjdFRyaWdnZXJzIC8vIFNob3BpZnkgbGluZSBpbmRleCBpcyAxLWJhc2VkXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgcmVzb2x2ZShnZXRQcm9kdWN0VHJpZ2dlcnMpXG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHVwc2VsbEdpZnRWYWxpZGF0aW9uID0gYXN5bmMgKGNhcnQsIGxpbmVfaXRlbV9pbmRleCkgPT4ge1xuICAgIGNvbnN0IGFsbFRyaWdnZXJzID0gZ2V0VXBzZWxsVHJpZ2dlcnMoKVxuICAgIGNvbnN0IGdpZnRQcm9kdWN0ID0gdXBzZWxsR2lmdEluQ2FydCgpXG4gICAgY29uc3QgbGluZUl0ZW
27420gPSBjYXJ0Lml0ZW1zW2xpbmVfaXRlbV9pbmRleCAtIDFdIC8vIFNob3BpZnkgbGluZSBpbmRleCBpcyAxLWJhc2VkXG5cbiAgICAvL1JlbW92ZSBhbGwgZ2lmdCBvcHRpb25zIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgZnJvbSB0aGUgY2FydCBkcmF3ZXIgbGlzdFxuICAgIGNvbnN0IGxpbmVJdGVtVHJpZ2dlcnMgPSBhbGxUcmlnZ2Vycy5maWx0ZXIoKGVudHJ5KSA9PlxuICAgICAgICBsaW5lSXRlbS51cHNlbGxUcmlnZ2Vycz8uc29tZSgodHJpZ2dlcikgPT4gdHJpZ2dlci5pbmNsdWRlcyhlbnRyeSkpXG4gICAgKVxuICAgIGxpbmVJdGVtVHJpZ2dlcnMuZm9yRWFjaCgodHJpZ2dlcikgPT4ge1xuICAgICAgICBjb25zdCBudW1iZXJPZlRyaWdnZXJzID0gYWxsVHJpZ2dlcnMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaW5jbHVkZXModHJpZ2dlcikpXG4gICAgICAgIGlmIChudW1iZXJPZlRyaWdnZXJzLmxlbmd0aCA9PSAxKSBhcHAuZW1pdCgndXBzZWxsOmNsZWFyJywgeyBoYW5kbGU6IHRyaWdnZXIgfSlcbiAgICB9KVxuXG4gICAgLy9JZiB0aGVyZSBpcyBubyBnaWZ0IHByb2R1Y3QgaW4gdGhlIGNhcnQsIHdlIGp1c3QgcmVtb3ZlIHRoZSBsaW5lIGl0ZW1cbiAgICBpZiAoIWdpZnRQcm9kdWN0KSByZXR1cm4gcmVtb3ZlU2luZ2xlSXRlbShsaW5lX2l0ZW1faW5kZXgpXG5cbiAgICAvL0lmIHRoaXMgbGluZSBpdGVtIGlzIHRoaXMgZnJlZSBnaWZ0LCB3ZSBqdXN0IHJlbW92ZSBpdFxuICAgIGlmIChsaW5lSXRlbS5wcm9wZXJ0aWVzPy5fdXBzZWxsX2dpZnQpIHJldHVybiByZW1vdmVTaW5nbGVJdGVtKGxpbmVfaXRlbV9pbmRleClcblxuICAgIGNvbnN0IGxpbmVJdGVtUHJpY2UgPSBsaW5lSXRlbS5wcmljZSAqIGxpbmVJdGVtLnF1YW50aXR5XG5cbiAgICAvL0lmIHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQgaXMganVzdCBhIG5vcm1hbCBwcm9kdWN0IHdpdGhvdXQgYW55IHRyaWdnZXJzXG4gICAgaWYgKCFsaW5lSXRlbS51cHNlbGxUcmlnZ2Vycz8uZmluZCgodHJpZ2dlcikgPT4gdHJpZ2dlciA9PSBnaWZ0UHJvZHVjdC5oYW5kbGUpKSB7XG4gICAgICAgIC8vQ2hlY2sgaWYgd2UgY2FuIHJlbW92ZSB0aGUgaXRlbSB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBnaWZ0IHByb2R1Y3QgaW4gY2FydFxuICAgICAgICBpZiAoY2FuQWRkRnJlZUdpZnQobGluZUl0ZW1QcmljZSkpIHJldHVybiByZW1vdmVJdGVtKHsgbGluZTogbGluZV9pdGVtX2luZGV4IH0pXG4gICAgICAgIHJldHVybiByZW1vdmVNdWx0aXBsZVF1YW50aXRpZXMoY2FydCwgbGluZV9pdGVtX2luZGV4LCBnaWZ0UHJvZHVjdClcbiAgICB9IGVsc2Uge1xuICAgICAgICAvL0lmIHRoZSBpdGVtIGJlaW5nIHJlbW92ZWQgaXMgdGhlIHRyaWdnZXIgcHJvZHVjdFxuICAgICAgICBjb25zdCBudW1iZXJPZlRyaWdnZXJzID0gY2FydC5pdGVtcy5maWx0ZXIoKHgpID0+IHgudXBzZWxsVHJpZ2dlcnM/LmluY2x1ZGVzKGdpZnRQcm9kdWN0LmhhbmRsZSkpXG4gICAgICAgIGlmIChudW1iZXJPZlRyaWdnZXJzLmxlbmd0aCA8PSAxKSByZXR1cm4gcmVtb3ZlTXVsdGlwbGVRdWFudGl0aWVzKGNhcnQsIGxpbmVfaXRlbV9pbmRleCwgZ2lmdFByb2R1Y3QpXG4gICAgICAgIGlmIChjYW5BZGRGcmVlR2lmdChsaW5lSXRlbVByaWNlKSkgcmV0dXJuIHJlbW92ZUl0ZW0oeyBsaW5lOiBsaW5lX2l0ZW1faW5kZXggfSlcbiAgICAgICAgcmV0dXJuIHJlbW92ZU11bHRpcGxlUXVhbnRpdGllcyhjYXJ0LCBsaW5lX2l0ZW1faW5kZXgsIGdpZnRQcm9kdWN0KVxuICAgIH1cbn1cblxuY29uc3QgcmVtb3ZlU2luZ2xlSXRlbSA9IChsaW5lX2l0ZW1faW5kZXgpID0+IHtcbiAgICByZW1vdmVJdGVtKHsgbGluZTogbGluZV9pdGVtX2luZGV4IH0pXG4gICAgZ2lmdF9hZGRlZCA9IGZhbHNlXG59XG5cbmNvbnN0IHJlbW92ZU11bHRpcGxlUXVhbnRpdGllcyA9IChjYXJ0LCBsaW5lX2l0ZW1faW5kZXgsIGxpbmVfaXRlbSkgPT4ge1xuICAgIGNvbnN0IGNhcnRRdWFudGl0aWVzID0gY2FydC5pdGVtcy5tYXAoKGxpbmVfaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGxpbmVfaXRlbS5wcm9wZXJ0aWVzPy5fdXBzZWxsX2dpZnQpIHJldHVybiAwXG4gICAgICAgIGlmIChpbmRleCA9PSBsaW5lX2l0ZW1faW5kZXggLSAxKSByZXR1cm4gMCAvLyBTaG9waWZ5IGxpbmUgaW5kZXggaXMgMS1iYXNlZFxuICAgICAgICByZXR1cm4gbGluZV9pdGVtLnF1YW50aXR5XG4gICAgfSlcblxuICAgIHVwZGF0ZUFsbENhcnRRdWFudGl0aWVzKGNhcnRRdWFudGl0aWVzKS50aGVuKCgpID0+IHtcbiAgICAgICAgaW52YWxpZEdpZnRQb3B1cChsaW5lX2l0ZW0pXG4gICAgfSlcblxuICAgIGdpZnRfYWRkZWQgPSBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaW52YWxpZEdpZnRQb3B1cCA9IChsaW5lX2l0ZW0pID0+IHtcbiAgICBjb25zdCBwb3B1cCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnaWZ0X19wb3B1cC0tY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXAtLWNsb3NlXCIgZGF0YS1jbG9zZT5cbiAgICAgICAgICAke3Vwc2VsbENvbmZpZy5pY29ucy5jbG9zZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoMj4ke3Vwc2VsbENvbmZpZy50cmFuc2xhdGlvbnMucG9wdXBfdGl0bGV9PC9oMj5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImNhcnQtaXRlbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbV9fbWFpblwiPlxuICAgICAgICAgICAgICA8ZmlndXJlIGNsYXNzPVwiY2FydC1pdGVtX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwibGF6eWxvYWRcIiBkYXRhLXNyYz1cIiR7Z2V0U2l6ZWRJbWFnZVVybChcbiAgICAgICAgICAgICAgICAgICAgICBsaW5lX2l0ZW0uaW1hZ2UucmVwbGFjZSgnLicgKyBpbWFnZVNpemUobGluZV9pdGVtLmltYWdlKSwgJycpLFxuICAgICAgICAgICAgICAgICAgICAgICcxMjB4MTIwJ1xuICAgICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9maWd1cmU+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtaXRlbV9faW5mb1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJ0LWl0ZW1fX3Rp
2742dGxlXCI+JHtsaW5lX2l0ZW0ucHJvZHVjdF90aXRsZX08L3A+XG5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FydC1pdGVtX192YXJpYW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtsaW5lX2l0ZW0ucXVhbnRpdHl9IHg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgJHtsaW5lX2l0ZW0udmFyaWFudF90aXRsZSA/IGA8c3Bhbj4ke2xpbmVfaXRlbS52YXJpYW50X3RpdGxlfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FydC1pdGVtX19wcmljZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZS0tZ2lmdFwiPiR7dXBzZWxsQ29uZmlnLmljb25zLmdpZnR9ICR7dXBzZWxsQ29uZmlnLnRyYW5zbGF0aW9ucy5naWZ0X2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZS0tY29tcGFyZVwiPiR7Zm9ybWF0TW9uZXkobGluZV9pdGVtLnByaWNlKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpY2UtLWN1cnJlbnRcIj4ke2Zvcm1hdE1vbmV5KDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2lmdF9fcG9wdXAtLW92ZXJsYXlcIiBkYXRhLWNsb3NlPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIHBvcHVwKVxuICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5naWZ0X19wb3B1cCcpXG4gICAgcG9wdXBFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBmYWxzZSlcbiAgICBjb25zdCBwb3B1cEVsZW1lbnRDbG9zZUJ0bnMgPSBwb3B1cEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY2xvc2VdJylcbiAgICBwb3B1cEVsZW1lbnRDbG9zZUJ0bnMuZm9yRWFjaCgoYnRuKSA9PlxuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgfSlcbiAgICApXG59XG4iXSwibmFtZXMiOlsiZSIsInQiLCJyIiwiU3ltYm9sIiwibiIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiaSIsImMiLCJwcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJ1IiwiT2JqZWN0IiwiY3JlYXRlIiwiX3JlZ2VuZXJhdG9yRGVmaW5lMiIsImYiLCJwIiwieSIsIkciLCJ2IiwiYSIsImQiLCJiaW5kIiwibGVuZ3RoIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJkb25lIiwidmFsdWUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJyZW1vdmVJdGVtIiwidXBkYXRlQWxsQ2FydFF1YW50aXRpZXMiLCJnZXRTaXplZEltYWdlVXJsIiwiaW1hZ2VTaXplIiwiZm9ybWF0TW9uZXkiLCJ1cHNlbGxDb25maWciLCJyZXF1aXJlZF9jYXJ0X3RvdGFsIiwid2luZG93IiwidGhlbWUiLCJjYXJ0IiwidXBzZWxsR2lmdEFtb3VudCIsInRyYW5zbGF0aW9ucyIsInN0cmluZ3MiLCJ1cFNlbGwiLCJpY29ucyIsImNsb3NlIiwiZ2lmdCIsImNoZWNrbWFyayIsImNoZWNrbWFya1NtYWxsIiwiYWRkX2J0biIsImFkZEJ0biIsInRyaWdnZXJzIiwiZ2lmdF9hZGRlZCIsImdpZnRBZGRlZCIsImdldEdpZnRBZGRlZCIsImdldFVwc2VsbFRyaWdnZXJzIiwiYWRkVXBzZWxsVHJpZ2dlciIsInRyaWdnZXIiLCJwdXNoIiwiZGVsZXRlVXBzZWxsVHJpZ2dlciIsImZpbHRlciIsImVudHJ5IiwiY2xlYXJBbGxVcHNlbGxUcmlnZ2VycyIsInVwc2VsbFRyaWdnZXJzQ29udGFpbnMiLCJsaW5lX2l0ZW0iLCJ1cHNlbGxUcmlnZ2VycyIsImZpbmQiLCJoYW5kbGUiLCJjaGVja0ZvckRlcHJlY2F0ZWRHaWZ0cyIsInVwc2VsbEdpZnRJbkNhcnQiLCJnaWZ0UHJvZHVjdCIsImNhbkFkZEZyZWVHaWZ0IiwiY2FydFF1YW50aXRpZXMiLCJpdGVtcyIsIm1hcCIsIl9saW5lX2l0ZW0kcHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJfdXBzZWxsX2dpZnQiLCJxdWFudGl0eSIsImludmFsaWRHaWZ0UG9wdXAiLCJsaW5lX2l0ZW1zIiwiYXBwIiwiZ2V0U3RhdGUiLCJfbGluZV9pdGVtJHByb3BlcnRpZXMyIiwic3VidHJhY3QiLCJ1bmRlZmluZWQiLCJjYXJ0X3RvdGFsIiwidG90YWxfcHJpY2UiLCJkb2VzUHJvZHVjdENvbnRhaW5UcmlnZ2VycyIsIl9yZWYiLCJfY2FsbGVlIiwicHJvZHVjdCIsImxpbmVfaXRlbV9pbmRleCIsInByb2R1Y3RDb250YWluc1RyaWdnZXJzIiwiZ2V0UHJvZHVjdFRyaWdnZXJzIiwiX2NvbnRleHQiLCJ0YWdzIiwidGFnIiwiaW5jbHVkZXMiLCJzcGxpdCIsImZvckVhY2giLCJfeCIsIl94MiIsInVwc2VsbEdpZnRWYWxpZGF0aW9uIiwiX3JlZjIiLCJfY2FsbGVlMiIsIl9saW5lSXRlbSRwcm9wZXJ0aWVzIiwiX2xpbmVJdGVtJHVwc2VsbFRyaWdnMiIsImFsbFRyaWdnZXJzIiwibGluZUl0ZW0iLCJsaW5lSXRlbVRyaWdnZXJzIiwibGluZUl0ZW1QcmljZSIsIm51bWJlck9mVHJpZ2dlcnMiLCJfY29udGV4dDIiLCJfbGluZUl0ZW0kdXBzZWxsVHJpZ2ciLCJzb21lIiwiZW1pdCIsInJlbW92ZVNpbmdsZUl0ZW0iLCJwcmljZSIsImxpbmUiLCJyZW1vdmVNdWx0aXBsZVF1YW50aXRpZXMiLCJ4IiwiX3gkdXBzZWxsVHJpZ2dlcnMiLCJfeDMiLCJfeDQiLCJpbmRleCIsIl9saW5lX2l0ZW0kcHJvcGVydGllczMiLCJwb3B1cCIsImNvbmNhdCIsInBvcHVwX3RpdGxlIiwiaW1hZ2UiLCJyZXBsYWNlIiwicHJvZHVjdF90aXRsZSIsInZhcmlhbnRfdGl0bGUiLCJnaWZ0X2xhYmVsIiwiZG9jdW1lbnQiLCJib2R5IiwiaW5zZXJ0QWRqYWNlbnRIVE1MIiwicG9wdXBFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInNldEF0dHJpYnV0ZSIsInBvcHVwRWxlbWVudENsb3NlQnRucyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJidG4iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlIl0sInNvdXJjZVJvb3QiOiIifQ== 2743//# sourceURL=webpack-internal:///./src/scripts/lib/upsell-gift.js 2744 2745}`)},"./src/scripts/lib/utility-functions.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 2746/* harmony export */ __webpack_require__.d(__webpack_exports__, { 2747/* harmony export */ awaitVendorScript: () => (/* binding */ awaitVendorScript), 2748/* harmony export */ clear: () => (/* binding */ clear), 2749/* harmony export */ clearInputs: () => (/* binding */ clearInputs), 2750/* harmony export */ compare: () => (/* binding */ compare), 2751/* harmony export */ debounce: () => (/* binding */ debounce), 2752/* harmony export */ disableBtn: () => (/* binding */ disableBtn), 2753/* harmony export */ enableBtn: () => (/* binding */ enableBtn), 2754/* harmony export */ fixRoot: () =>
vendor: 5,605 bytes, lines 2754-2781
2754 (/* binding */ fixRoot), 2755/* harmony export */ getCookie: () => (/* binding */ getCookie), 2756/* harmony export */ loadChatBotScript: () => (/* binding */ loadChatBotScript), 2757/* harmony export */ loopify: () => (/* binding */ loopify), 2758/* harmony export */ repaint: () => (/* binding */ repaint), 2759/* harmony export */ setCookie: () => (/* binding */ setCookie), 2760/* harmony export */ smoothScroll: () => (/* binding */ smoothScroll), 2761/* harmony export */ sortAlphabetically: () => (/* binding */ sortAlphabetically), 2762/* harmony export */ sortByArray: () => (/* binding */ sortByArray), 2763/* harmony export */ toggleBtn: () => (/* binding */ toggleBtn), 2764/* harmony export */ toggleDisplay: () => (/* binding */ toggleDisplay), 2765/* harmony export */ unfixRoot: () => (/* binding */ unfixRoot), 2766/* harmony export */ wrapIFrames: () => (/* binding */ wrapIFrames), 2767/* harmony export */ zelektor: () => (/* binding */ zelektor) 2768/* harmony export */ }); 2769/* harmony import */ var _lib_load_script__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/lib/load-script */ "./src/scripts/lib/load-script.js"); 2770/* harmony import */ var tinkerbell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tinkerbell */ "./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js"); 2771function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } 2772function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } 2773function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } 2774function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } 2775 2776 2777/*******************************************************************************************************************************************/ 2778/* Await Vendor Script 2779/*******************************************************************************************************************************************/ 2780function awaitVendorScript(name, callback, comp) { 2781 var done = false;
2782 if (window.vendorScriptsLoaded) { 2783 done = true; 2784 callback(); 2785 } else { 2786 app.on('script:loaded', function (state, script) { 2787 if (script === name) { 2788 done = true; 2789 callback(); 2790 } 2791 }); 2792 app.on('scripts:allLoaded', function () { 2793 if (!done) callback(); 2794 }); 2795 } 2796} 2797 2798/******************************************************************************************************************************************* 2799* Zelektor 2800*******************************************************************************************************************************************/ 2801function zelektor() { 2802 var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body; 2803 var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'js-'; 2804 var elements = [].slice.call(container.querySelectorAll("[class*=\\"".concat(prefix, "\\"]"))); 2805 return elements.reduce(function (res, el) { 2806 [].slice.call(el.classList).forEach(function (className) { 2807 if (className.slice(0, prefix.length) === prefix) { 2808 var key = className.slice(prefix.length, className.length); 2809 res[key] = res.hasOwnProperty(key) ? res[key].constructor === Array ? res[key].concat(el) : [res[key], el] : el; 2810 } 2811 }); 2812 return res; 2813 }, {}); 2814} 2815 2816/******************************************************************************************************************************************* 2817* Loopify 2818********************************************************************************************************************************************/ 2819function loopify(el) { 2820 return el ? [].concat(el) : []; 2821} 2822 2823/******************************************************************************************************************************************* 2824* Sort Alphabetically 2825*******************************************************************************************************************************************/ 2826function sortAlphabetically(items) { 2827 return items.sort(function (a, b) { 2828 if (a.title.toLowerCase() < b.title.toLowerCase()) return -1; 2829 if (a.title.toLowerCase() > b.title.toLowerCase()) return 1; 2830 return 0; 2831 }); 2832} 2833 2834/** 2835 * Sort by array 2836 */ 2837var sortByArray = function sortByArray(array, orderArray) { 2838 var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; 2839 return array.sort(function (a, b) { 2840 var A = a[key] || a; 2841 var B = b[key] || b; 2842 if (orderArray.includes(A) && orderArray.includes(B)) { 2843 if (orderArray.indexOf(A) > orderArray.indexOf(B)) return 1; 2844 if (orderArray.indexOf(A) < orderArray.indexOf(B)) return -1; 2845 return 0; 2846 } 2847 if (!orderArray.includes(A) && orderArray.includes(B)) return 1; 2848 if (orderArray.includes(A) && !orderArray.includes(B)) return -1; 2849 return 0; 2850 }); 2851}; 2852 2853/******************************************************************************************************************************************* 2854* Compare 2855*******************************************************************************************************************************************/ 2856function compare(a, b, num) { 2857 var comparison = 0; 2858 if (a > b) comparison = 1;else if (a < b) comparison = -1; 2859 return comparison * num; 2860} 2861 2862/******************************************************************************************************************************************* 2863* Smooth Scroll 2864*******************************************************************************************************************************************/ 2865 2866function smoothScroll(target) { 2867 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 2868 function getOffset(node) { 2869 return node.getBoundingClientRect().top + (options.element ? options.element.scrollTop : window.pageYOffset); 2870 } 2871 if (!target) return; 2872 var end = getOffset(target) + (options.offset || 0); 2873 var duration = options.duration || 500; 2874 var element = options.element || window; 2875 return duration ? (0,tinkerbell__WEBPACK_IMPORTED_MODULE_1__["default"])(!options.element || options.element === window ? element.pageYOffset : element.scrollTop, end, duration, function (t, b, c, d) { 2876 if ((t /= d / 2) < 1) return c / 2 * t * t + b; 2877 return -c / 2 * (--t * (t - 2) - 1) + b; 2878 })(function (p) { 2879 return element.scrollTo(options.horizontal ? p : 0, !options.horizontal ? p : 0); 2880 }) : element.scrollTo(0, end); 2881} 2882 2883/******************************************************************************************************************************************* 2884* Toggle Display 2885*******************************************************************************************************************************************/ 2886function toggleDisplay(el) { 2887 el.style.display === 'none' ? el.style.display = '' : el.style.display = 'none'; 2888} 2889 2890/******************************************************************************************************************************************* 2891* Button Functions 2892*******************************************************************************************************************************************/ 2893function toggleBtn(btn, isDisabled, text, textElSelector) { 2894 isDisabled ? disableBtn(btn) : enableBtn(btn); 2895 if (text && textElSelector) { 2896 btn.querySelector(textElSelector).innerText = text; 2897 return; 2898 } 2899 if (text) btn.innerText = text; 2900} 2901function disableBtn(btn) { 2902 btn.disabled = true; 2903 btn.classList.add('is-disabled'); 2904} 2905function enableBtn(btn) { 2906 btn.disabled = false;
2907 btn.classList.remove('is-disabled'); 2908} 2909 2910/******************************************************************************************************************************************* 2911* Cookie Functions 2912*******************************************************************************************************************************************/ 2913function setCookie(name, val, days) { 2914 var expires = ''; 2915 if (days) { 2916 var date = new Date(); 2917 date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); 2918 expires = date.toUTCString(); 2919 } 2920 document.cookie = "".concat(name, "=").concat(val || '', "; expires=").concat(expires, "; path=/"); 2921} 2922function getCookie(name) { 2923 var nameEq = "".concat(name, "="); 2924 var ca = document.cookie.split(';'); 2925 for (var i = 0; i < ca.length; i++) { 2926 var c = ca[i]; 2927 while (c.charAt(0) === ' ') c = c.substring(1, c.length); 2928 if (c.indexOf(nameEq) === 0) return c.substring(nameEq.length, c.length); 2929 } 2930 return null; 2931} 2932 2933/******************************************************************************************************************************************* 2934* Clear Inputs 2935*******************************************************************************************************************************************/ 2936function clearInputs(parent) { 2937 parent.querySelectorAll('input').forEach(function (i) { 2938 i.val = ''; 2939 }); 2940 parent.querySelectorAll('select').forEach(function (s) { 2941 if (s.options[0]) s.val = s.options[0].val; 2942 }); 2943} 2944 2945/*******************************************************************************************************************************************/ 2946/* Wrap Iframes 2947/*******************************************************************************************************************************************/ 2948function wrapIFrames(container) { 2949 var iframes = container.querySelectorAll('iframe'); 2950 if (!iframes.length) return; 2951 iframes.forEach(function (iframe) { 2952 var outerWrapper = document.createElement('div'); 2953 var wrapper = document.createElement('div'); 2954 wrapper.classList.add('iframe-wrapper'); 2955 if (iframe.src.includes('youtube') || iframe.src.includes('vimeo')) { 2956 wrapper.classList.add('iframe-wrapper--aspect'); 2957 var paddingTop = 56.25; 2958 if (iframe.width && iframe.height) { 2959 paddingTop = parseInt(iframe.height) / parseInt(iframe.width) * 100; 2960 } 2961 wrapper.style.paddingTop = "".concat(paddingTop, "%"); 2962 } 2963 if (iframe.src.includes('pinterest')) { 2964 outerWrapper.style.maxWidth = '350px'; 2965 outerWrapper.style.margin = 'auto'; 2966 } 2967 outerWrapper.appendChild(wrapper); 2968 iframe.parentElement.insertBefore(outerWrapper, iframe); 2969 wrapper.appendChild(iframe); 2970 2971 // If consent text, put that inside wrapper too 2972 var nextSibling = outerWrapper.nextElementSibling; 2973 if (nextSibling !== null && nextSibling !== void 0 && nextSibling.classList.contains('iframe-consent-text')) { 2974 outerWrapper.appendChild(nextSibling); 2975 } 2976 }); 2977} 2978 2979/*******************************************************************************************************************************************/ 2980/* Fix / Unfix Root 2981/*******************************************************************************************************************************************/ 2982function fixRoot() { 2983 document.documentElement.style.overflow = 'hidden'; 2984 2985 // OLD SOLUTION 2986 // const docEl = document.documentElement 2987 // const scrollPos = docEl.style.top && docEl.style.top != '' 2988 // ? parseInt(docEl.style.top.replace('-', '').replace('px', '')) 2989 // : window.scrollY 2990 2991 // docEl.style.position = 'fixed' 2992 // docEl.style.top = \`-\${scrollPos}px\` 2993 // docEl.style.width = '100%' 2994 // docEl.style.overflowY = 'scroll' 2995 // docEl.dataset.scrollPos = scrollPos 2996} 2997function unfixRoot() { 2998 document.documentElement.style.overflow = ''; 2999 3000 // OLD SOLUTION 3001 // const docEl = document.documentElement 3002 3003 // docEl.style.position = '' 3004 // docEl.style.top = '' 3005 // docEl.style.width = '' 3006 // docEl.style.overflowY = '' 3007 3008 // const { scrollPos } = docEl.dataset 3009 // window.scrollTo(0, scrollPos) 3010} 3011 3012/*******************************************************************************************************************************************/ 3013/* Debounce 3014/*******************************************************************************************************************************************/ 3015function debounce(func) {
3016 var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; 3017 var inDebounce; 3018 return function () { 3019 var context = this; 3020 var args = arguments; 3021 clearTimeout(inDebounce); 3022 inDebounce = setTimeout(function () { 3023 return func.apply(context, args); 3024 }, delay); 3025 }; 3026} 3027 3028/** 3029 * Repaint node 3030 * @param {HTML element} node 3031 */ 3032var repaint = function repaint(node) { 3033 void node.offsetHeight; 3034}; 3035var clear = function clear(node) { 3036 while (node.firstChild) { 3037 node.removeChild(node.firstChild); 3038 } 3039}; 3040var loadChatBotScript = /*#__PURE__*/function () { 3041 var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { 3042 var _window$theme; 3043 return _regenerator().w(function (_context) { 3044 while (1) switch (_context.n) { 3045 case 0: 3046 if ((_window$theme = window.theme) !== null && _window$theme !== void 0 && (_window$theme = _window$theme.chatbot) !== null && _window$theme !== void 0 && _window$theme.id) { 3047 _context.n = 1; 3048 break; 3049 } 3050 console.error('Chatbot missing ID from theme settings'); 3051 return _context.a(2); 3052 case 1: 3053 ; 3054 (0,_lib_load_script__WEBPACK_IMPORTED_MODULE_0__["default"])(('https:' == document.location.protocol ? 'https://' : 'http://') + 'cdn.chatbot.com/widget/plugin.js'); 3055 case 2: 3056 return _context.a(2); 3057 } 3058 }, _callee); 3059 })); 3060 return function loadChatBotScript() { 3061 return _ref.apply(this, arguments); 3062 }; 3063}();//# sourceURL=[module] 3064//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2NyaXB0cy9saWIvdXRpbGl0eS1mdW5jdGlvbnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBQ0EsdUtBQUFBLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQUMsQ0FBQSxHQUFBRixDQUFBLENBQUFHLFFBQUEsa0JBQUFDLENBQUEsR0FBQUosQ0FBQSxDQUFBSyxXQUFBLDhCQUFBQyxFQUFBTixDQUFBLEVBQUFFLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQUwsQ0FBQSxJQUFBQSxDQUFBLENBQUFNLFNBQUEsWUFBQUMsU0FBQSxHQUFBUCxDQUFBLEdBQUFPLFNBQUEsRUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLE1BQUEsQ0FBQUwsQ0FBQSxDQUFBQyxTQUFBLFVBQUFLLG1CQUFBLENBQUFILENBQUEsdUJBQUFWLENBQUEsRUFBQUUsQ0FBQSxFQUFBRSxDQUFBLFFBQUFFLENBQUEsRUFBQUMsQ0FBQSxFQUFBRyxDQUFBLEVBQUFJLENBQUEsTUFBQUMsQ0FBQSxHQUFBWCxDQUFBLFFBQUFZLENBQUEsT0FBQUMsQ0FBQSxLQUFBRixDQUFBLEtBQUFiLENBQUEsS0FBQWdCLENBQUEsRUFBQXBCLENBQUEsRUFBQXFCLENBQUEsRUFBQUMsQ0FBQSxFQUFBTixDQUFBLEVBQUFNLENBQUEsQ0FBQUMsSUFBQSxDQUFBdkIsQ0FBQSxNQUFBc0IsQ0FBQSxXQUFBQSxFQUFBckIsQ0FBQSxFQUFBQyxDQUFBLFdBQUFNLENBQUEsR0FBQVAsQ0FBQSxFQUFBUSxDQUFBLE1BQUFHLENBQUEsR0FBQVosQ0FBQSxFQUFBbUIsQ0FBQSxDQUFBZixDQUFBLEdBQUFGLENBQUEsRUFBQW1CLENBQUEsZ0JBQUFDLEVBQUFwQixDQUFBLEVBQUFFLENBQUEsU0FBQUssQ0FBQSxHQUFBUCxDQUFBLEVBQUFVLENBQUEsR0FBQVIsQ0FBQSxFQUFBSCxDQUFBLE9B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FBQUEsQ0FBY0csT0FBTyxjQUFBSCxhQUFBLGVBQXJCQSxhQUFBLENBQXVCSSxFQUFFO1lBQUFILFFBQUEsQ0FBQTVMLENBQUE7WUFBQTtVQUFBO1VBQzVCZ00sT0FBTyxDQUFDQyxLQUFLLENBQUMsd0NBQXdDLENBQUM7VUFBQSxPQUFBTCxRQUFBLENBQUEzSyxDQUFBO1FBQUE7VUFFeEQ7VUFFRGlDLDREQUFVLENBQUMsQ0FBQyxRQUFRLElBQUljLFFBQVEsQ0FBQ2tJLFFBQVEsQ0FBQ0MsUUFBUSxHQUFHLFVBQVUsR0FBRyxTQUFTLElBQUksa0NBQWtDLENBQUM7UUFBQztVQUFBLE9BQUFQLFFBQUEsQ0FBQTNLLENBQUE7TUFBQTtJQUFBLEdBQUF5SyxPQUFBO0VBQUEsQ0FDcEg7RUFBQSxnQkFQWUYsaUJBQWlCQSxDQUFBO0lBQUEsT0FBQUMsSUFBQSxDQUFBMUksS0FBQSxPQUFBRCxTQUFBO0VBQUE7QUFBQSxHQU83QiIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL3NyYy9zY3JpcHRzL2xpYi91dGlsaXR5LWZ1bmN0aW9ucy5qcz9mYTg4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2FkU2NyaXB0IGZyb20gJ0AvbGliL2xvYWQtc2NyaXB0J1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIEF3YWl
30640IFZlbmRvciBTY3JpcHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGF3YWl0VmVuZG9yU2NyaXB0KG5hbWUsIGNhbGxiYWNrLCBjb21wKSB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZVxuXG4gICAgaWYgKHdpbmRvdy52ZW5kb3JTY3JpcHRzTG9hZGVkKSB7XG4gICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcHAub24oJ3NjcmlwdDpsb2FkZWQnLCAoc3RhdGUsIHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjcmlwdCA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGFwcC5vbignc2NyaXB0czphbGxMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRvbmUpIGNhbGxiYWNrKClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogWmVsZWt0b3JcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gemVsZWt0b3IoY29udGFpbmVyID0gZG9jdW1lbnQuYm9keSwgcHJlZml4ID0gJ2pzLScpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdLnNsaWNlLmNhbGwoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFtjbGFzcyo9XCIke3ByZWZpeH1cIl1gKSlcblxuXHRyZXR1cm4gZWxlbWVudHMucmVkdWNlKChyZXMsIGVsKSA9PiB7XG5cdFx0W10uc2xpY2UuY2FsbChlbC5jbGFzc0xpc3QpLmZvckVhY2goY2xhc3NOYW1lID0+IHtcblx0XHRcdGlmIChjbGFzc05hbWUuc2xpY2UoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBjbGFzc05hbWUuc2xpY2UocHJlZml4Lmxlbmd0aCwgY2xhc3NOYW1lLmxlbmd0aClcblxuXHRcdFx0XHRyZXNba2V5XSA9IHJlcy5oYXNPd25Qcm9wZXJ0eShrZXkpID9cblx0XHRcdFx0XHRyZXNba2V5XS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgP1xuXHRcdFx0XHRcdHJlc1trZXldLmNvbmNhdChlbCkgOlxuXHRcdFx0XHRcdFtyZXNba2V5XSwgZWxdXG5cdFx0XHRcdDogZWxcblx0XHRcdH1cbiAgICAgICAgfSlcblxuXHRcdHJldHVybiByZXNcblx0fSwge30pXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogTG9vcGlmeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gbG9vcGlmeShlbCkge1xuICAgIHJldHVybiBlbCA/IFtdLmNvbmNhdChlbCkgOiBbXVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIFNvcnQgQWxwaGFiZXRpY2FsbHlcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gc29ydEFscGhhYmV0aWNhbGx5KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEudGl0bGUudG9Mb3dlckNhc2UoKSA8IGIudGl0bGUudG9Mb3dlckNhc2UoKSkgcmV0dXJuIC0xXG4gICAgICAgIGlmIChhLnRpdGxlLnRvTG93ZXJDYXNlKCkgPiBiLnRpdGxlLnRvTG93ZXJDYXNlKCkpIHJldHVybiAxXG4gICAgICAgIHJldHVybiAwXG4gICAgfSlcbn1cblxuXG4vKipcbiAqIFNvcnQgYnkgYXJyYXlcbiAqL1xuZXhwb3J0IGNvbnN0IHNvcnRCeUFycmF5ID0gKGFycmF5LCBvcmRlckFycmF5LCBrZXkgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIGFycmF5LnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBBID0gYVtrZXldIHx8IGE7XG4gICAgY29uc3QgQiA9IGJba2V5XSB8fCBiO1xuXG4gICAgaWYgKG9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgb3JkZXJBcnJheS5pbmNsdWRlcyhCKSkge1xuICAgICAgICBpZiAob3JkZXJBcnJheS5pbmRleE9mKEEpID4gb3JkZXJBcnJheS5pbmRleE9mKEIpKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKG9yZGVyQXJyYXkuaW5kZXhPZihBKSA8IG9yZGVyQXJyYXkuaW5kZXhPZihCKSkgcmV0dXJuIC0xO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoIW9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgb3JkZXJBcnJheS5pbmNsdWRlcyhCKSkgcmV0dXJuIDE7XG4gICAgaWYgKG9yZGVyQXJyYXkuaW5jbHVkZXMoQSkgJiYgIW9yZGVyQXJyYXkuaW5jbHVkZXMoQikpIHJldHVybiAtMTtcblxuICAgIHJldHVybiAwO1xuICB9KTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogQ29tcGFyZVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGEsIGIsIG51bSkge1xuICAgIGxldCBjb21wYXJpc29uID0gMFxuXG4gICAgaWYgKGEgPiBiKVxuICAgICAgICBjb21wYXJpc29uID0gMVxuICAgIGVsc2UgaWYgKCBh
3064IDwgYiApXG4gICAgICAgIGNvbXBhcmlzb24gPSAtMVxuXG4gICAgcmV0dXJuIGNvbXBhcmlzb24gKiBudW1cbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBTbW9vdGggU2Nyb2xsXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuaW1wb3J0IHRpbmtlcmJlbGwgZnJvbSAndGlua2VyYmVsbCdcbmV4cG9ydCBmdW5jdGlvbiBzbW9vdGhTY3JvbGwodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcbiAgICBmdW5jdGlvbiBnZXRPZmZzZXQobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAob3B0aW9ucy5lbGVtZW50ID8gb3B0aW9ucy5lbGVtZW50LnNjcm9sbFRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldClcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuXG5cbiAgICBjb25zdCBlbmQgPSBnZXRPZmZzZXQodGFyZ2V0KSArIChvcHRpb25zLm9mZnNldCB8fCAwKVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uIHx8IDUwMFxuICAgIGNvbnN0IGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQgfHwgd2luZG93XG5cbiAgICByZXR1cm4gZHVyYXRpb24gPyAoXG4gICAgICAgIHRpbmtlcmJlbGwoIW9wdGlvbnMuZWxlbWVudCB8fCBvcHRpb25zLmVsZW1lbnQgPT09IHdpbmRvdyA/IGVsZW1lbnQucGFnZVlPZmZzZXQgOiBlbGVtZW50LnNjcm9sbFRvcCwgZW5kLCBkdXJhdGlvbiwgKHQsIGIsIGMsIGQpID0+IHtcbiAgICAgICAgaWYgKCh0IC89IGQgLyAyKSA8IDEpIHJldHVybiBjIC8gMiAqIHQgKiB0ICsgYlxuICAgICAgICByZXR1cm4gLWMgLyAyICogKCgtLXQpICogKHQgLSAyKSAtIDEpICsgYlxuICAgICAgICB9KShwID0+IGVsZW1lbnQuc2Nyb2xsVG8ob3B0aW9ucy5ob3Jpem9udGFsID8gcCA6IDAsICFvcHRpb25zLmhvcml6b250YWwgPyBwIDogMCkpXG4gICAgKSA6IChcbiAgICAgICAgZWxlbWVudC5zY3JvbGxUbygwLCBlbmQpXG4gICAgKVxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIFRvZ2dsZSBEaXNwbGF5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZURpc3BsYXkoZWwpIHtcbiAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgP1xuICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJyA6XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEJ1dHRvbiBGdW5jdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQnRuKGJ0biwgaXNEaXNhYmxlZCwgdGV4dCwgdGV4dEVsU2VsZWN0b3IpIHtcbiAgICBpc0Rpc2FibGVkXG4gICAgPyBkaXNhYmxlQnRuKGJ0bilcbiAgICA6IGVuYWJsZUJ0bihidG4pXG5cbiAgICBpZiAodGV4dCAmJiB0ZXh0RWxTZWxlY3Rvcil7XG4gICAgICAgIGJ0bi5xdWVyeVNlbGVjdG9yKHRleHRFbFNlbGVjdG9yKS5pbm5lclRleHQgPSB0ZXh0XG4gICAgICAgIHJldHVyblxuICAgI
3064H1cblxuXHRpZiAodGV4dCkgYnRuLmlubmVyVGV4dCA9IHRleHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVCdG4oYnRuKSB7XG5cdGJ0bi5kaXNhYmxlZCA9IHRydWVcblx0YnRuLmNsYXNzTGlzdC5hZGQoJ2lzLWRpc2FibGVkJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUJ0bihidG4pIHtcblx0YnRuLmRpc2FibGVkID0gZmFsc2Vcblx0YnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRpc2FibGVkJylcbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBDb29raWUgRnVuY3Rpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShuYW1lLCB2YWwsIGRheXMpIHtcbiAgICBsZXQgZXhwaXJlcyA9ICcnXG4gICAgaWYgKGRheXMpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyoyNCo2MCo2MCoxMDAwKSlcbiAgICAgICAgZXhwaXJlcyA9IGRhdGUudG9VVENTdHJpbmcoKVxuICAgIH1cbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke3ZhbCB8fCAnJ307IGV4cGlyZXM9JHtleHBpcmVzfTsgcGF0aD0vYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgICBjb25zdCBuYW1lRXEgPSBgJHtuYW1lfT1gXG4gICAgdmFyIGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjID0gY2FbaV1cbiAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApID09PSAnICcpIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aClcbiAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRXEpID09PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVxLmxlbmd0aCwgYy5sZW5ndGgpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogQ2xlYXIgSW5wdXRzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFySW5wdXRzKHBhcmVudCkge1xuICAgIHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGkudmFsID0gJydcbiAgICB9KVxuXG4gICAgcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NlbGVjdCcpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIGlmIChzLm9wdGlvbnNbMF0pIHMudmFsID0gcy5vcHRpb25zWzBdLnZhbFxuICAgIH0pXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBXcmFwIElmcmFtZXNcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJRnJhbWVzKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGlmcmFtZXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJylcbiAgICBpZiAoIWlmcmFtZXMubGVuZ3RoKSByZXR1cm5cblxuICAgIGlmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgICBjb25zdCBvdXRlcldyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdpZnJhbWUtd3JhcHBlcicpXG5cbiAgICAgICAgaWYgKGlmcmFtZS5zcmMuaW5jbHVkZXMoJ3lvdXR1YmUnKSB8fCBpZnJhbWUuc3JjLmluY2x1ZGVzKCd2aW1lbycpKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2lmcmFtZS13cmFwcGVyLS1hc3BlY3QnKVxuICAgICAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSA1Ni4yNVxuXG4gICAgICAgICAgICBpZiAoaWZyYW1lLndpZHRoICYmIGlmcmFtZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wID0gcGFyc2VJbnQoaWZyYW1lLmhlaWdodCkgLyBwYXJzZUludChpZnJhbWUud2lkdGgpICogMTAwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZ1RvcCA9IGAke3BhZGRpbmdUb3B9JWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZnJhbWUuc3JjLmluY2x1ZGVzKCdwaW50ZXJlc3QnKSkge1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLnN0eWxlLm1heFdpZHRoID0gJzM1MHB4J1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLnN0eWxlLm1hcmdpbiA9ICdhdXRvJ1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJXcmFwcGVyLmFwcGVuZENoaWxkKHdyYXBwZXIpXG4gICAgICAgIGlmcmFtZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShvdXRlcldyYXBwZXIsIGlmcmFtZSlcblxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGlmcmFtZSlcblxuICAgICAgICAvLyBJZiBjb25zZW50IHRleHQsIHB1dCB0aGF0IGluc2lkZSB3cmFwcGVyIHRvb1xuICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG91dGVyV3JhcHBlci5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgaWYgKG5leHRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2lmcmFtZS1jb25zZW50LXRleHQnKSkge1xuICAgICAgICAgICAgb3V0ZXJXcmFwcGVyLmFwcGVuZENoaWxkKG5leHRTaWJsaW5nKVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIEZpeCAvIFVuZml4IFJvb3Rcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeFJvb3QoKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAvLyBPTEQgU09MVVRJT05cbiAgICAvLyBjb25zdCBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuICAgIC8vIGNvbnN0IHNjcm9sbFBvcyA9ICAgZG9jRWwuc3R5bGUudG9wICYmIGRvY0VsLnN0eWxlLnRvcCAhPSAnJ1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChkb2NFbC5zdHlsZS50b3AucmVwbGFjZSgnLScsICcnKS5yZXBsYWNlKCdweCcsICcnKSlcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIDogd2luZG93LnNjcm9sbFlcblxuICAgIC8vIGRvY0VsLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgIC8vIGRvY0VsLnN0eWxlLnRvcCA9IGAtJHtzY3JvbGxQb3N9cHhgXG4gICAgLy8gZG9jRWwuc3R5bGUud2lkdGggPSAnMTAwJS
3064dcbiAgICAvLyBkb2NFbC5zdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJ1xuICAgIC8vIGRvY0VsLmRhdGFzZXQuc2Nyb2xsUG9zID0gc2Nyb2xsUG9zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZpeFJvb3QoKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cbiAgICAvLyBPTEQgU09MVVRJT05cbiAgICAvLyBjb25zdCBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFxuXG4gICAgLy8gZG9jRWwuc3R5bGUucG9zaXRpb24gPSAnJ1xuICAgIC8vIGRvY0VsLnN0eWxlLnRvcCA9ICcnXG4gICAgLy8gZG9jRWwuc3R5bGUud2lkdGggPSAnJ1xuICAgIC8vIGRvY0VsLnN0eWxlLm92ZXJmbG93WSA9ICcnXG5cbiAgICAvLyBjb25zdCB7IHNjcm9sbFBvcyB9ID0gZG9jRWwuZGF0YXNldFxuICAgIC8vIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGxQb3MpXG59XG5cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBEZWJvdW5jZVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgZGVsYXkgPSAxMDApIHtcbiAgICBsZXQgaW5EZWJvdW5jZVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXNcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHNcbiAgICAgIGNsZWFyVGltZW91dChpbkRlYm91bmNlKVxuICAgICAgaW5EZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKSwgZGVsYXkpXG4gICAgfVxufVxuXG4vKipcbiAqIFJlcGFpbnQgbm9kZVxuICogQHBhcmFtIHtIVE1MIGVsZW1lbnR9IG5vZGVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcGFpbnQgPSAobm9kZSkgPT4ge1xuICAgIHZvaWQgKG5vZGUub2Zmc2V0SGVpZ2h0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGVhciA9IChub2RlKSA9PiB7XG4gIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkQ2hhdEJvdFNjcmlwdCA9IGFzeW5jICgpID0+IHtcbiAgaWYgKCF3aW5kb3cudGhlbWU/LmNoYXRib3Q/LmlkKSB7XG4gICAgY29uc29sZS5lcnJvcignQ2hhdGJvdCBtaXNzaW5nIElEIGZyb20gdGhlbWUgc2V0dGluZ3MnKVxuICAgIHJldHVybjtcbiAgfTtcblxuICBsb2FkU2NyaXB0KCgnaHR0cHM6JyA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA/ICdodHRwczovLycgOiAnaHR0cDovLycpICsgJ2Nkbi5jaGF0Ym90LmNvbS93aWRnZXQvcGx1Z2luLmpzJyk7XG59O1xuIl0sIm5hbWVzIjpbImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsIm8iLCJ0b1N0cmluZ1RhZyIsImkiLCJjIiwicHJvdG90eXBlIiwiR2VuZXJhdG9yIiwidSIsIk9iamVjdCIsImNyZWF0ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJmIiwicCIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJjYWxsIiwiZG9uZSIsInZhbHVlIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJkaXNwbGF5TmFtZSIsIl9yZWdlbmVyYXRvciIsInciLCJtIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwibG9hZFNjcmlwdCIsImF3YWl0VmVuZG9yU2NyaXB0IiwibmFtZSIsImNhbGxiYWNrIiwiY29tcCIsIndpbmRvdyIsInZlbmRvclNjcmlwdHNMb2FkZWQiLCJhcHAiLCJvbiIsInN0YXRlIiwic2NyaXB0IiwiemVsZWt0b3IiLCJjb250YWluZXIiLCJ1bmRlZmluZWQiLCJkb2N1bWVudCIsImJvZHkiLCJwcmVmaXgiLCJlbGVtZW50cyIsInNsaWNlIiwicXVlcnlTZWxlY3RvckFsbCIsImNvbmNhdCIsInJlZHVjZSIsInJlcyIsImVsIiwiY2xhc3NMaXN0IiwiZm9yRWFjaCIsImNsYXNzTmFtZSIsImtleSIsImhhc093blByb3BlcnR5IiwiY29uc3RydWN0b3IiLCJBcnJheSIsImxvb3BpZnkiLCJzb3J0QWxwaGFiZXRpY2FsbHkiLCJpdGVtcyIsInNvcnQiLCJiIiwidGl0bGUiLCJ0b0xvd2VyQ2FzZSIsInNvcnRCeUFycmF5IiwiYXJyYXkiLCJvcmRlckFycmF5IiwiQSIsIkIiLCJpbmNsdWRlcyIsImluZGV4T2YiLCJjb21wYXJlIiwibnVtIiwiY29tcGFyaXNvbiIsInRpbmtlcmJlbGwiLCJzbW9vdGhTY3JvbGwiLCJ0YXJnZXQiLCJvcHRpb25zIiwiZ2V0T2Zmc2V0Iiwibm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvcCIsImVsZW1lbnQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImVuZCIsIm9mZnNldCIsImR1cmF0aW9uIiwic2Nyb2xsVG8iLCJob3Jpem9udGFsIiwidG9nZ2xlRGlzcGxheSIsInN0eWxlIiwiZGlzcGxheSIsInRvZ2dsZUJ0biIsImJ0biIsImlzRGlzYWJsZWQiLCJ0ZXh0IiwidGV4dEVsU2VsZWN0b3IiLCJkaXNhYmxlQnRuIiwiZW5hYmxlQnRuIiwicXVlcnlTZWxlY3RvciIsImlubmVyVGV4dCIsImRpc2FibGVkIiwiYWRkIiwicmVtb3ZlIiwic2V0Q29va2llIiwidmFsIiwiZGF5cyIsImV4cGlyZXMiLCJkYXRlIiwiRGF0ZSIsInNldFRpbWUiLCJnZXRUaW1lIiwidG9VVENTdHJpbmciLCJjb29raWUiLCJnZXRDb29raWUiLCJuYW1lRXEiLCJjYSIsInNwbGl0IiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiY2xlYXJJbnB1dHMiLCJwYXJlbnQiLCJzIiwid3JhcElGcmFtZXMiLCJpZnJhbWVzIiwiaWZyYW1lIiwib3V0ZXJXcmFwcGVyIiwiY3JlYXRlRWxlbWVudCIsIndyYXBwZXIiLCJzcmMiLCJwYWRkaW5nVG9wIiwid2lkdGgiLCJoZWlnaHQiLCJwYXJzZUludCIsIm1heFdpZHRoIiwibWFyZ2luIiwiYXBwZW5kQ2hpbGQiLCJwYXJlbnRFbGVtZW50IiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ
vendor: 28,951 bytes, lines 3064-3730
3064jb250YWlucyIsImZpeFJvb3QiLCJkb2N1bWVudEVsZW1lbnQiLCJvdmVyZmxvdyIsInVuZml4Um9vdCIsImRlYm91bmNlIiwiZnVuYyIsImRlbGF5IiwiaW5EZWJvdW5jZSIsImNvbnRleHQiLCJhcmdzIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInJlcGFpbnQiLCJvZmZzZXRIZWlnaHQiLCJjbGVhciIsImZpcnN0Q2hpbGQiLCJyZW1vdmVDaGlsZCIsImxvYWRDaGF0Qm90U2NyaXB0IiwiX3JlZiIsIl9jYWxsZWUiLCJfd2luZG93JHRoZW1lIiwiX2NvbnRleHQiLCJ0aGVtZSIsImNoYXRib3QiLCJpZCIsImNvbnNvbGUiLCJlcnJvciIsImxvY2F0aW9uIiwicHJvdG9jb2wiXSwic291cmNlUm9vdCI6IiJ9 3065//# sourceURL=webpack-internal:///./src/scripts/lib/utility-functions.js 3066 3067}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 3068/* harmony export */ __webpack_require__.d(__webpack_exports__, { 3069/* harmony export */ CSSPlugin: () => (/* binding */ CSSPlugin), 3070/* harmony export */ _createElement: () => (/* binding */ _createElement), 3071/* harmony export */ _getBBox: () => (/* binding */ _getBBox), 3072/* harmony export */ checkPrefix: () => (/* binding */ _checkPropPrefix), 3073/* harmony export */ "default": () => (/* binding */ CSSPlugin) 3074/* harmony export */ }); 3075/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js"); 3076/*! 3077 * CSSPlugin 3.15.0 3078 * https://gsap.com 3079 * 3080 * Copyright 2008-2026, GreenSock. All rights reserved. 3081 * Subject to the terms at https://gsap.com/standard-license 3082 * @author: Jack Doyle, [email protected] 3083*/ 3084 3085/* eslint-disable */ 3086 3087 3088var _win, 3089 _doc, 3090 _docElement, 3091 _pluginInitted, 3092 _tempDiv, 3093 _tempDivStyler, 3094 _recentSetterPlugin, 3095 _reverting, 3096 _windowExists = function _windowExists() { 3097 return typeof window !== "undefined"; 3098}, 3099 _transformProps = {}, 3100 _RAD2DEG = 180 / Math.PI, 3101 _DEG2RAD = Math.PI / 180, 3102 _atan2 = Math.atan2, 3103 _bigNum = 1e8, 3104 _capsExp = /([A-Z])/g, 3105 _horizontalExp = /(left|right|width|margin|padding|x)/i, 3106 _complexExp = /[\\s,\\(]\\S/, 3107 _propertyAliases = { 3108 autoAlpha: "opacity,visibility", 3109 scale: "scaleX,scaleY", 3110 alpha: "opacity" 3111}, 3112 _renderCSSProp = function _renderCSSProp(ratio, data) { 3113 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 3114}, 3115 _renderPropWithEnd = function _renderPropWithEnd(ratio, data) { 3116 return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data); 3117}, 3118 _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) { 3119 return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data); 3120}, 3121 //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0) 3122_renderCSSPropWithBeginningAndEnd = function _renderCSSPropWithBeginningAndEnd(ratio, data) { 3123 return data.set(data.t, data.p, ratio === 1 ? data.e : ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data); 3124}, 3125 //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0) 3126_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) { 3127 var value = data.s + data.c * ratio; 3128 data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data); 3129}, 3130 _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) { 3131 return data.set(data.t, data.p, ratio ? data.e : data.b, data); 3132}, 3133 _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) { 3134 return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data); 3135}, 3136 _setterCSSStyle = function _setterCSSStyle(target, property, value) { 3137 return target.style[property] = value; 3138}, 3139 _setterCSSProp = function _setterCSSProp(target, property, value) { 3140 return target.style.setProperty(property, value); 3141}, 3142 _setterTransform = function _setterTransform(target, property, value) { 3143 return target._gsap[property] = value; 3144}, 3145 _setterScale = function _setterScale(target, property, value) { 3146 return target._gsap.scaleX = target._gsap.scaleY = value; 3147}, 3148 _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) { 3149 var cache = target._gsap; 3150 cache.scaleX = cache.scaleY = value; 3151 cache.renderTransform(ratio, cache); 3152}, 3153 _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) { 3154 var cache = target._gsap; 3155 cache[property] = value; 3156 cache.renderTransform(ratio, cache); 3157}, 3158 _transformProp = "transform", 3159 _transformOriginProp = _transformProp + "Origin", 3160 _saveStyle = function _saveStyle(property, isNotCSS) { 3161 var _this = this; 3162 3163 var target = this.target, 3164 style = target.style, 3165 cache = target._gsap; 3166 3167 if (property in _transformProps && style) { 3168 this.tfm = this.tfm || {}; 3169 3170 if (property !== "transform") { 3171 property = _propertyAliases[property] || property; 3172 ~property.indexOf(",") ? property.split(",").forEach(function (a) { 3173 return _this.tfm[a] = _get(target, a); 3174 }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property); // note: scale would map to "scaleX,scaleY", thus we loop and apply them both. 3175 3176 property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin); 3177 } else { 3178 return _propertyAliases.transform.split(",").forEach(function (p) { 3179 return _saveStyle.call(_this, p, isNotCSS); 3180 }); 3181 } 3182 3183 if (this.props.indexOf(_transformProp) >= 0) { 3184 return; 3185 } 3186 3187 if (cache.svg) { 3188 this.svgo = target.getAttribute("data-svg-origin"); 3189 this.props.push(_transformOriginProp, isNotCSS, ""); 3190 } 3191 3192 property = _transformProp; 3193 } 3194 3195 (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]); 3196}, 3197 _removeIndependentTransforms = function _removeIndependentTransforms(style) { 3198 if (style.translate) { 3199 style.removeProperty("translate"); 3200 style.removeProperty("scale"); 3201 style.removeProperty("rotate"); 3202 } 3203}, 3204 _revertStyle = function _revertStyle() { 3205 var props = this.props, 3206 target = this.target, 3207 style = target.style, 3208 cache = target._gsap, 3209 i, 3210 p; 3211 3212 for (i = 0; i < props.length; i += 3) { 3213 // stored like this: property, isNotCSS, value 3214 if (!props[i + 1]) { 3215 props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === "--" ? props[i] : props[i].replace(_capsExp, "-$1").toLowerCase()); 3216 } else if (props[i + 1] === 2) { 3217 // non-CSS value (function-based) 3218 target[props[i]](props[i + 2]); 3219 } else { 3220 // non-CSS value (not function-based) 3221 target[props[i]] = props[i + 2]; 3222 } 3223 } 3224 3225 if (this.tfm) { 3226 for (p in this.tfm) { 3227 cache[p] = this.tfm[p]; 3228 } 3229 3230 if (cache.svg) { 3231 cache.renderTransform(); 3232 target.setAttribute("data-svg-origin", this.svgo || ""); 3233 } 3234 3235 i = _reverting(); 3236 3237 if ((!i || !i.isStart) && !style[_transformProp]) { 3238 _removeIndependentTransforms(style); 3239 3240 if (cache.zOrigin && style[_transformOriginProp]) { 3241 style[_transformOriginProp] += " " + cache.zOrigin + "px"; // since we're uncaching, we must put the zOrigin back into the transformOrigin so that we can pull it out accurately when we parse again. Otherwise, we'd lose the z portion of the origin since we extract it to protect from Safari bugs. 3242 3243 cache.zOrigin = 0; 3244 cache.renderTransform(); 3245 } 3246 3247 cache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization. 3248 } 3249 } 3250}, 3251 _getStyleSaver = function _getStyleSaver(target, properties) { 3252 var saver = { 3253 target: target, 3254 props: [], 3255 revert: _revertStyle, 3256 save: _saveStyle 3257 }; 3258 target._gsap || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once. 3259 3260 properties && target.style && target.nodeType && properties.split(",").forEach(function (p) { 3261 return saver.save(p); 3262 }); // make sure it's a DOM node too. 3263 3264 return saver; 3265}, 3266 _supports3D, 3267 _createElement = function _createElement(type, ns) { 3268 var e = _doc.createElementNS ? _doc.createElementNS((ns || "http://www.w3.org/1999/xhtml").replace(/^https/, "http"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making "style" inaccessible. 3269 3270 return e && e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://gsap.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/). 3271}, 3272 _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) { 3273 var cs = getComputedStyle(target); 3274 return cs[property] || cs.getPropertyValue(property.replace(_capsExp, "-$1").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || ""; //css variables may not need caps swapped out for dashes and lowercase. 3275}, 3276 _prefixes = "O,Moz,ms,Ms,Webkit".split(","), 3277 _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) { 3278 var e = element || _tempDiv, 3279 s = e.style, 3280 i = 5; 3281 3282 if (property in s && !preferPrefix) { 3283 return property; 3284 } 3285 3286 property = property.charAt(0).toUpperCase() + property.substr(1); 3287 3288 while (i-- && !(_prefixes[i] + property in s)) {} 3289 3290 return i < 0 ? null : (i === 3 ? "ms" : i >= 0 ? _prefixes[i] : "") + property; 3291}, 3292 _initCore = function _initCore() { 3293 if (_windowExists() && window.document) { 3294 _win = window; 3295 _doc = _win.document; 3296 _docElement = _doc.documentElement; 3297 _tempDiv = _createElement("div") || { 3298 style: {} 3299 }; 3300 _tempDivStyler = _createElement("div"); 3301 _transformProp = _checkPropPrefix(_transformProp); 3302 _transformOriginProp = _transformProp + "Origin"; 3303 _tempDiv.style.cssText = "border-width:0;line-height:0;position:absolute;padding:0"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets. 3304 3305 _supports3D = !!_checkPropPrefix("perspective"); 3306 _reverting = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.reverting; 3307 _pluginInitted = 1; 3308 } 3309}, 3310 _getReparentedCloneBBox = function _getReparentedCloneBBox(target) { 3311 //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it). 3312 var owner = target.ownerSVGElement, 3313 svg = _createElement("svg", owner && owner.getAttribute("xmlns") || "http://www.w3.org/2000/svg"), 3314 clone = target.cloneNode(true), 3315 bbox; 3316 3317 clone.style.display = "block"; 3318 svg.appendChild(clone); 3319 3320 _docElement.appendChild(svg); 3321 3322 try { 3323 bbox = clone.getBBox(); 3324 } catch (e) {} 3325 3326 svg.removeChild(clone); 3327 3328 _docElement.removeChild(svg); 3329 3330 return bbox; 3331}, 3332 _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) { 3333 var i = attributesArray.length; 3334 3335 while (i--) { 3336 if (target.hasAttribute(attributesArray[i])) { 3337 return target.getAttribute(attributesArray[i]); 3338 } 3339 } 3340}, 3341 _getBBox = function _getBBox(target) { 3342 var bounds, cloned; 3343 3344 try { 3345 bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118 3346 } catch (error) { 3347 bounds = _getReparentedCloneBBox(target); 3348 cloned = 1; 3349 } 3350 3351 bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case. 3352 3353 return bounds && !bounds.width && !bounds.x && !bounds.y ? { 3354 x: +_getAttributeFallbacks(target, ["x", "cx", "x1"]) || 0, 3355 y: +_getAttributeFallbacks(target, ["y", "cy", "y1"]) || 0, 3356 width: 0, 3357 height: 0 3358 } : bounds; 3359}, 3360 _isSVG = function _isSVG(e) { 3361 return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e)); 3362}, 3363 //reports if the element is an SVG on which getBBox() actually works 3364_removeProperty = function _removeProperty(target, property) { 3365 if (property) { 3366 var style = target.style, 3367 first2Chars; 3368 3369 if (property in _transformProps && property !== _transformOriginProp) { 3370 property = _transformProp; 3371 } 3372 3373 if (style.removeProperty) { 3374 first2Chars = property.substr(0, 2); 3375 3376 if (first2Chars === "ms" || property.substr(0, 6) === "webkit") { 3377 //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example) 3378 property = "-" + property; 3379 } 3380 3381 style.removeProperty(first2Chars === "--" ? property : property.replace(_capsExp, "-$1").toLowerCase()); 3382 } else { 3383 //note: old versions of IE use "removeAttribute()" instead of "removeProperty()" 3384 style.removeAttribute(property); 3385 } 3386 } 3387}, 3388 _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) { 3389 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue); 3390 plugin._pt = pt; 3391 pt.b = beginning; 3392 pt.e = end; 3393 3394 plugin._props.push(property); 3395 3396 return pt; 3397}, 3398 _nonConvertibleUnits = { 3399 deg: 1, 3400 rad: 1, 3401 turn: 1 3402}, 3403 _nonStandardLayouts = { 3404 grid: 1, 3405 flex: 1 3406}, 3407 //takes a single value like 20px and converts it to the unit specified, like "%", returning only the numeric amount. 3408_convertToUnit = function _convertToUnit(target, property, value, unit) { 3409 var curValue = parseFloat(value) || 0, 3410 curUnit = (value + "").trim().substr((curValue + "").length) || "px", 3411 // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim() 3412 style = _tempDiv.style, 3413 horizontal = _horizontalExp.test(property), 3414 isRootSVG = target.tagName.toLowerCase() === "svg", 3415 measureProperty = (isRootSVG ? "client" : "offset") + (horizontal ? "Width" : "Height"), 3416 amount = 100, 3417 toPixels = unit === "px", 3418 toPercent = unit === "%", 3419 px, 3420 parent, 3421 cache, 3422 isSVG; 3423 3424 if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) { 3425 return curValue; 3426 } 3427 3428 curUnit !== "px" && !toPixels && (curValue = _convertToUnit(target, property, value, "px")); 3429 isSVG = target.getCTM && _isSVG(target); 3430 3431 if ((toPercent || curUnit === "%") && (_transformProps[property] || ~property.indexOf("adius"))) { 3432 px = isSVG ? target.getBBox()[horizontal ? "width" : "height"] : target[measureProperty]; 3433 return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(toPercent ? curValue / px * amount : curValue / 100 * px); 3434 } 3435 3436 style[horizontal ? "width" : "height"] = amount + (toPixels ? curUnit : unit); 3437 parent = unit !== "rem" && ~property.indexOf("adius") || unit === "em" && target.appendChild && !isRootSVG ? target : target.parentNode; 3438 3439 if (isSVG) { 3440 parent = (target.ownerSVGElement || {}).parentNode; 3441 } 3442 3443 if (!parent || parent === _doc || !parent.appendChild) { 3444 parent = _doc.body; 3445 } 3446 3447 cache = parent._gsap; 3448 3449 if (cache && toPercent && cache.width && horizontal && cache.time === _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._ticker.time && !cache.uncache) { 3450 return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(curValue / cache.width * amount); 3451 } else { 3452 if (toPercent && (property === "height" || property === "width")) { 3453 // if we're dealing with width/height that's inside a container with padding and/or it's a flexbox/grid container, we must apply it to the target itself rather than the _tempDiv in order to ensure complete accuracy, factoring in the parent's padding. 3454 var v = target.style[property]; 3455 target.style[property] = amount + unit; 3456 px = target[measureProperty]; 3457 v ? target.style[property] = v : _removeProperty(target, property); 3458 } else { 3459 (toPercent || curUnit === "%") && !_nonStandardLayouts[_getComputedProperty(parent, "display")] && (style.position = _getComputedProperty(target, "position")); 3460 parent === target && (style.position = "static"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that. 3461 3462 parent.appendChild(_tempDiv); 3463 px = _tempDiv[measureProperty]; 3464 parent.removeChild(_tempDiv); 3465 style.position = "absolute"; 3466 } 3467 3468 if (horizontal && toPercent) { 3469 cache = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getCache)(parent); 3470 cache.time = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._ticker.time; 3471 cache.width = parent[measureProperty]; 3472 } 3473 } 3474 3475 return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0); 3476}, 3477 _get = function _get(target, property, unit, uncache) { 3478 var value; 3479 _pluginInitted || _initCore(); 3480 3481 if (property in _propertyAliases && property !== "transform") { 3482 property = _propertyAliases[property]; 3483 3484 if (~property.indexOf(",")) { 3485 property = property.split(",")[0]; 3486 } 3487 } 3488 3489 if (_transformProps[property] && property !== "transform") { 3490 value = _parseTransform(target, uncache); 3491 value = property !== "transformOrigin" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + " " + value.zOrigin + "px"; 3492 } else { 3493 value = target.style[property]; 3494 3495 if (!value || value === "auto" || uncache || ~(value + "").indexOf("calc(")) { 3496 value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getProperty)(target, property) || (property === "opacity" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius 3497 } 3498 } 3499 3500 return unit && !~(value + "").trim().indexOf(" ") ? _convertToUnit(target, property, value, unit) + unit : value; 3501}, 3502 _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) { 3503 // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 3504 if (!start || start === "none") { 3505 // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style ("clipPath" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as "none" whereas WebkitClipPath reports accurately like "ellipse(100% 0% at 50% 0%)", so in this case we must SWITCH to using the prefixed property instead. See https://gsap.com/forums/topic/18310-clippath-doesnt-work-on-ios/ 3506 var p = _checkPropPrefix(prop, target, 1), 3507 s = p && _getComputedProperty(target, p, 1); 3508 3509 if (s && s !== start) { 3510 prop = p; 3511 start = s; 3512 } else if (prop === "borderColor") { 3513 start = _getComputedProperty(target, "borderTopColor"); // Firefox bug: always reports "borderColor" as "", so we must fall back to borderTopColor. See https://gsap.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/ 3514 } 3515 } 3516 3517 var pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, target.style, prop, 0, 1, _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._renderComplexString), 3518 index = 0, 3519 matchIndex = 0, 3520 a, 3521 result, 3522 startValues, 3523 startNum, 3524 color, 3525 startValue, 3526 endValue, 3527 endNum, 3528 chunk, 3529 endUnit, 3530 startUnit, 3531 endValues; 3532 pt.b = start; 3533 pt.e = end; 3534 start += ""; // ensure values are strings 3535 3536 end += ""; 3537 3538 if (end.substring(0, 6) === "var(--") { 3539 end = _getComputedProperty(target, end.substring(4, end.indexOf(")"))); 3540 } 3541 3542 if (end === "auto") { 3543 startValue = target.style[prop]; 3544 target.style[prop] = end; 3545 end = _getComputedProperty(target, prop) || end; 3546 startValue ? target.style[prop] = startValue : _removeProperty(target, prop); 3547 } 3548 3549 a = [start, end]; 3550 3551 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorStringFilter)(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow(). 3552 3553 3554 start = a[0]; 3555 end = a[1]; 3556 startValues = start.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp) || []; 3557 endValues = end.match(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp) || []; 3558 3559 if (endValues.length) { 3560 while (result = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp.exec(end)) { 3561 endValue = result[0]; 3562 chunk = end.substring(index, result.index); 3563 3564 if (color) { 3565 color = (color + 1) % 5; 3566 } else if (chunk.substr(-5) === "rgba(" || chunk.substr(-5) === "hsla(") { 3567 color = 1; 3568 } 3569 3570 if (endValue !== (startValue = startValues[matchIndex++] || "")) { 3571 startNum = parseFloat(startValue) || 0; 3572 startUnit = startValue.substr((startNum + "").length); 3573 endValue.charAt(1) === "=" && (endValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, endValue) + startUnit); 3574 endNum = parseFloat(endValue); 3575 endUnit = endValue.substr((endNum + "").length); 3576 index = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numWithUnitExp.lastIndex - endUnit.length; 3577 3578 if (!endUnit) { 3579 //if something like "perspective:300" is passed in and we must add a unit to the end 3580 endUnit = endUnit || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[prop] || startUnit; 3581 3582 if (index === end.length) { 3583 end += endUnit; 3584 pt.e += endUnit; 3585 } 3586 } 3587 3588 if (startUnit !== endUnit) { 3589 startNum = _convertToUnit(target, prop, startValue, endUnit) || 0; 3590 } // these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 3591 3592 3593 pt._pt = { 3594 _next: pt._pt, 3595 p: chunk || matchIndex === 1 ? chunk : ",", 3596 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 3597 s: startNum, 3598 c: endNum - startNum, 3599 m: color && color < 4 || prop === "zIndex" ? Math.round : 0 3600 }; 3601 } 3602 } 3603 3604 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 3605 } else { 3606 pt.r = prop === "display" && end === "none" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue; 3607 } 3608 3609 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 3610 3611 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus "this" would refer to the plugin. 3612 3613 return pt; 3614}, 3615 _keywordToPercent = { 3616 top: "0%", 3617 bottom: "100%", 3618 left: "0%", 3619 right: "100%", 3620 center: "50%" 3621}, 3622 _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) { 3623 var split = value.split(" "), 3624 x = split[0], 3625 y = split[1] || "50%"; 3626 3627 if (x === "top" || x === "bottom" || y === "left" || y === "right") { 3628 //the user provided them in the wrong order, so flip them 3629 value = x; 3630 x = y; 3631 y = value; 3632 } 3633 3634 split[0] = _keywordToPercent[x] || x; 3635 split[1] = _keywordToPercent[y] || y; 3636 return split.join(" "); 3637}, 3638 _renderClearProps = function _renderClearProps(ratio, data) { 3639 if (data.tween && data.tween._time === data.tween._dur) { 3640 var target = data.t, 3641 style = target.style, 3642 props = data.u, 3643 cache = target._gsap, 3644 prop, 3645 clearTransforms, 3646 i; 3647 3648 if (props === "all" || props === true) { 3649 style.cssText = ""; 3650 clearTransforms = 1; 3651 } else { 3652 props = props.split(","); 3653 i = props.length; 3654 3655 while (--i > -1) { 3656 prop = props[i]; 3657 3658 if (_transformProps[prop]) { 3659 clearTransforms = 1; 3660 prop = prop === "transformOrigin" ? _transformOriginProp : _transformProp; 3661 } 3662 3663 _removeProperty(target, prop); 3664 } 3665 } 3666 3667 if (clearTransforms) { 3668 _removeProperty(target, _transformProp); 3669 3670 if (cache) { 3671 cache.svg && target.removeAttribute("transform"); 3672 style.scale = style.rotate = style.translate = "none"; 3673 3674 _parseTransform(target, 1); // force all the cached values back to "normal"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values. 3675 3676 3677 cache.uncache = 1; 3678 3679 _removeIndependentTransforms(style); 3680 } 3681 } 3682 } 3683}, 3684 // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list. 3685_specialProps = { 3686 clearProps: function clearProps(plugin, target, property, endValue, tween) { 3687 if (tween.data !== "isFromStart") { 3688 var pt = plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, 0, 0, _renderClearProps); 3689 pt.u = endValue; 3690 pt.pr = -10; 3691 pt.tween = tween; 3692 3693 plugin._props.push(property); 3694 3695 return 1; 3696 } 3697 } 3698 /* className feature (about 0.4kb gzipped). 3699 , className(plugin, target, property, endValue, tween) { 3700 let _renderClassName = (ratio, data) => { 3701 data.css.render(ratio, data.css); 3702 if (!ratio || ratio === 1) { 3703 let inline = data.rmv, 3704 target = data.t, 3705 p; 3706 target.setAttribute("class", ratio ? data.e : data.b); 3707 for (p in inline) { 3708 _removeProperty(target, p); 3709 } 3710 } 3711 }, 3712 _getAllStyles = (target) => { 3713 let styles = {}, 3714 computed = getComputedStyle(target), 3715 p; 3716 for (p in computed) { 3717 if (isNaN(p) && p !== "cssText" && p !== "length") { 3718 styles[p] = computed[p]; 3719 } 3720 } 3721 _setDefaults(styles, _parseTransform(target, 1)); 3722 return styles; 3723 }, 3724 startClassList = target.getAttribute("class"), 3725 style = target.style, 3726 cssText = style.cssText, 3727 cache = target._gsap, 3728 classPT = cache.classPT, 3729 inlineToRemoveAtEnd = {}, 3730 data = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== "=") ? endValue : startClassList.replace(new RegExp("(?:\\\\s|^)" + endValue.substr(2) + "(?![\\
vendor: 2,299 bytes, lines 3730-3777
3730\\w-])"), "") + ((endValue.charAt(0) === "+") ? " " + endValue.substr(2) : "")}, 3731 changingVars = {}, 3732 startVars = _getAllStyles(target), 3733 transformRelated = /(transform|perspective)/i, 3734 endVars, p; 3735 if (classPT) { 3736 classPT.r(1, classPT.d); 3737 _removeLinkedListItem(classPT.d.plugin, classPT, "_pt"); 3738 } 3739 target.setAttribute("class", data.e); 3740 endVars = _getAllStyles(target, true); 3741 target.setAttribute("class", startClassList); 3742 for (p in endVars) { 3743 if (endVars[p] !== startVars[p] && !transformRelated.test(p)) { 3744 changingVars[p] = endVars[p]; 3745 if (!style[p] && style[p] !== "0") { 3746 inlineToRemoveAtEnd[p] = 1; 3747 } 3748 } 3749 } 3750 cache.classPT = plugin._pt = new PropTween(plugin._pt, target, "className", 0, 0, _renderClassName, data, 0, -11); 3751 if (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://gsap.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/. 3752 style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity). 3753 } 3754 _parseTransform(target, true); //to clear the caching of transforms 3755 data.css = new gsap.plugins.css(); 3756 data.css.init(target, changingVars, tween); 3757 plugin._props.push(...data.css._props); 3758 return 1; 3759 } 3760 */ 3761 3762}, 3763 3764/* 3765 * -------------------------------------------------------------------------------------- 3766 * TRANSFORMS 3767 * -------------------------------------------------------------------------------------- 3768 */ 3769_identity2DMatrix = [1, 0, 0, 1, 0, 0], 3770 _rotationalProperties = {}, 3771 _isNullTransform = function _isNullTransform(value) { 3772 return value === "matrix(1, 0, 0, 1, 0, 0)" || value === "none" || !value; 3773}, 3774 _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) { 3775 var matrixString = _getComputedProperty(target, _transformProp); 3776 3777 return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_
vendor: 3,835 bytes, lines 3777-3843
3777gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._numExp).map(_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round); 3778}, 3779 _getMatrix = function _getMatrix(target, force2D) { 3780 var cache = target._gsap || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getCache)(target), 3781 style = target.style, 3782 matrix = _getComputedTransformMatrixAsArray(target), 3783 parent, 3784 nextSibling, 3785 temp, 3786 addedToDOM; 3787 3788 if (cache.svg && target.getAttribute("transform")) { 3789 temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix. 3790 3791 matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f]; 3792 return matrix.join(",") === "1,0,0,1,0,0" ? _identity2DMatrix : matrix; 3793 } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) { 3794 //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397 3795 //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px). 3796 temp = style.display; 3797 style.display = "block"; 3798 parent = target.parentNode; 3799 3800 if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) { 3801 // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375. Note: position: fixed elements report a null offsetParent but they could also be invisible because they're in an ancestor with display: none, so we check getBoundingClientRect(). We only want to alter the DOM if we absolutely have to because it can cause iframe content to reload, like a Vimeo video. 3802 addedToDOM = 1; //flag 3803 3804 nextSibling = target.nextElementSibling; 3805 3806 _docElement.appendChild(target); //we must add it to the DOM in order to get values properly 3807 3808 } 3809 3810 matrix = _getComputedTransformMatrixAsArray(target); 3811 temp ? style.display = temp : _removeProperty(target, "display"); 3812 3813 if (addedToDOM) { 3814 nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target); 3815 } 3816 } 3817 3818 return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix; 3819}, 3820 _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) { 3821 var cache = target._gsap, 3822 matrix = matrixArray || _getMatrix(target, true), 3823 xOriginOld = cache.xOrigin || 0, 3824 yOriginOld = cache.yOrigin || 0, 3825 xOffsetOld = cache.xOffset || 0, 3826 yOffsetOld = cache.yOffset || 0, 3827 a = matrix[0], 3828 b = matrix[1], 3829 c = matrix[2], 3830 d = matrix[3], 3831 tx = matrix[4], 3832 ty = matrix[5], 3833 originSplit = origin.split(" "), 3834 xOrigin = parseFloat(originSplit[0]) || 0, 3835 yOrigin = parseFloat(originSplit[1]) || 0, 3836 bounds, 3837 determinant, 3838 x, 3839 y; 3840 3841 if (!originIsAbsolute) { 3842 bounds = _getBBox(target); 3843 xOrigin = bounds.x + (~originSplit[0].indexOf("%") ? xOrigin / 100 * boun
vendor: 9,144 bytes, lines 3843-4084
3843ds.width : xOrigin); 3844 yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf("%") ? yOrigin / 100 * bounds.height : yOrigin); // if (!("xOrigin" in cache) && (xOrigin || yOrigin)) { // added in 3.12.3, reverted in 3.12.4; requires more exploration 3845 // xOrigin -= bounds.x; 3846 // yOrigin -= bounds.y; 3847 // } 3848 } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) { 3849 //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero. 3850 x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant; 3851 y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant; 3852 xOrigin = x; 3853 yOrigin = y; // theory: we only had to do this for smoothing and it assumes that the previous one was not originIsAbsolute. 3854 } 3855 3856 if (smooth || smooth !== false && cache.smooth) { 3857 tx = xOrigin - xOriginOld; 3858 ty = yOrigin - yOriginOld; 3859 cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx; 3860 cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty; 3861 } else { 3862 cache.xOffset = cache.yOffset = 0; 3863 } 3864 3865 cache.xOrigin = xOrigin; 3866 cache.yOrigin = yOrigin; 3867 cache.smooth = !!smooth; 3868 cache.origin = origin; 3869 cache.originIsAbsolute = !!originIsAbsolute; 3870 target.style[_transformOriginProp] = "0px 0px"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value). 3871 3872 if (pluginToAddPropTweensTo) { 3873 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOrigin", xOriginOld, xOrigin); 3874 3875 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOrigin", yOriginOld, yOrigin); 3876 3877 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "xOffset", xOffsetOld, cache.xOffset); 3878 3879 _addNonTweeningPT(pluginToAddPropTweensTo, cache, "yOffset", yOffsetOld, cache.yOffset); 3880 } 3881 3882 target.setAttribute("data-svg-origin", xOrigin + " " + yOrigin); 3883}, 3884 _parseTransform = function _parseTransform(target, uncache) { 3885 var cache = target._gsap || new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.GSCache(target); 3886 3887 if ("x" in cache && !uncache && !cache.uncache) { 3888 return cache; 3889 } 3890 3891 var style = target.style, 3892 invertedScaleX = cache.scaleX < 0, 3893 px = "px", 3894 deg = "deg", 3895 cs = getComputedStyle(target), 3896 origin = _getComputedProperty(target, _transformOriginProp) || "0", 3897 x, 3898 y, 3899 z, 3900 scaleX, 3901 scaleY, 3902 rotation, 3903 rotationX, 3904 rotationY, 3905 skewX, 3906 skewY, 3907 perspective, 3908 xOrigin, 3909 yOrigin, 3910 matrix, 3911 angle, 3912 cos, 3913 sin, 3914 a, 3915 b, 3916 c, 3917 d, 3918 a12, 3919 a22, 3920 t1, 3921 t2, 3922 t3, 3923 a13, 3924 a23, 3925 a33, 3926 a42, 3927 a43, 3928 a32; 3929 x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0; 3930 scaleX = scaleY = 1; 3931 cache.svg = !!(target.getCTM && _isSVG(target)); 3932 3933 if (cs.translate) { 3934 // accommodate independent transforms by combining them into normal ones. 3935 if (cs.translate !== "none" || cs.scale !== "none" || cs.rotate !== "none") { 3936 style[_transformProp] = (cs.translate !== "none" ? "translate3d(" + (cs.translate + " 0 0").split(" ").slice(0, 3).join(", ") + ") " : "") + (cs.rotate !== "none" ? "rotate(" + cs.rotate + ") " : "") + (cs.scale !== "none" ? "scale(" + cs.scale.split(" ").join(",") + ") " : "") + (cs[_transformProp] !== "none" ? cs[_transformProp] : ""); 3937 } 3938 3939 style.scale = style.rotate = style.translate = "none"; 3940 } 3941 3942 matrix = _getMatrix(target, cache.svg); 3943 3944 if (cache.svg) { 3945 if (cache.uncache) { 3946 // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + "px " + (cache.yOrigin - bbox.y) + "px". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things. 3947 t2 = target.getBBox(); 3948 origin = cache.xOrigin - t2.x + "px " + (cache.yOrigin - t2.y) + "px"; 3949 t1 = ""; 3950 } else { 3951 t1 = !uncache && target.getAttribute("data-svg-origin"); // Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly. 3952 } 3953 3954 _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix); 3955 } 3956 3957 xOrigin = cache.xOrigin || 0; 3958 yOrigin = cache.yOrigin || 0; 3959 3960 if (matrix !== _identity2DMatrix) { 3961 a = matrix[0]; //a11 3962 3963 b = matrix[1]; //a21 3964 3965 c = matrix[2]; //a31 3966 3967 d = matrix[3]; //a41 3968 3969 x = a12 = matrix[4]; 3970 y = a22 = matrix[5]; //2D matrix 3971 3972 if (matrix.length === 6) { 3973 scaleX = Math.sqrt(a * a + b * b); 3974 scaleY = Math.sqrt(d * d + c * c); 3975 rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist). 3976 3977 skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0; 3978 skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD))); 3979 3980 if (cache.svg) { 3981 x -= xOrigin - (xOrigin * a + yOrigin * c); 3982 y -= yOrigin - (xOrigin * b + yOrigin * d); 3983 } //3D matrix 3984 3985 } else { 3986 a32 = matrix[6]; 3987 a42 = matrix[7]; 3988 a13 = matrix[8]; 3989 a23 = matrix[9]; 3990 a33 = matrix[10]; 3991 a43 = matrix[11]; 3992 x = matrix[12]; 3993 y = matrix[13]; 3994 z = matrix[14]; 3995 angle = _atan2(a32, a33); 3996 rotationX = angle * _RAD2DEG; //rotationX 3997 3998 if (angle) { 3999 cos = Math.cos(-angle); 4000 sin = Math.sin(-angle); 4001 t1 = a12 * cos + a13 * sin; 4002 t2 = a22 * cos + a23 * sin; 4003 t3 = a32 * cos + a33 * sin; 4004 a13 = a12 * -sin + a13 * cos; 4005 a23 = a22 * -sin + a23 * cos; 4006 a33 = a32 * -sin + a33 * cos; 4007 a43 = a42 * -sin + a43 * cos; 4008 a12 = t1; 4009 a22 = t2; 4010 a32 = t3; 4011 } //rotationY 4012 4013 4014 angle = _atan2(-c, a33); 4015 rotationY = angle * _RAD2DEG; 4016 4017 if (angle) { 4018 cos = Math.cos(-angle); 4019 sin = Math.sin(-angle); 4020 t1 = a * cos - a13 * sin; 4021 t2 = b * cos - a23 * sin; 4022 t3 = c * cos - a33 * sin; 4023 a43 = d * sin + a43 * cos; 4024 a = t1; 4025 b = t2; 4026 c = t3; 4027 } //rotationZ 4028 4029 4030 angle = _atan2(b, a); 4031 rotation = angle * _RAD2DEG; 4032 4033 if (angle) { 4034 cos = Math.cos(angle); 4035 sin = Math.sin(angle); 4036 t1 = a * cos + b * sin; 4037 t2 = a12 * cos + a22 * sin; 4038 b = b * cos - a * sin; 4039 a22 = a22 * cos - a12 * sin; 4040 a = t1; 4041 a12 = t2; 4042 } 4043 4044 if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) { 4045 //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here. 4046 rotationX = rotation = 0; 4047 rotationY = 180 - rotationY; 4048 } 4049 4050 scaleX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(Math.sqrt(a * a + b * b + c * c)); 4051 scaleY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(Math.sqrt(a22 * a22 + a32 * a32)); 4052 angle = _atan2(a12, a22); 4053 skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0; 4054 perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0; 4055 } 4056 4057 if (cache.svg) { 4058 //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline). 4059 t1 = target.getAttribute("transform"); 4060 cache.forceCSS = target.setAttribute("transform", "") || !_isNullTransform(_getComputedProperty(target, _transformProp)); 4061 t1 && target.setAttribute("transform", t1); 4062 } 4063 } 4064 4065 if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) { 4066 if (invertedScaleX) { 4067 scaleX *= -1; 4068 skewX += rotation <= 0 ? 180 : -180; 4069 rotation += rotation <= 0 ? 180 : -180; 4070 } else { 4071 scaleY *= -1; 4072 skewX += skewX <= 0 ? 180 : -180; 4073 } 4074 } 4075 4076 uncache = uncache || cache.uncache; 4077 cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px; 4078 cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px; 4079 cache.z = z + px; 4080 cache.scaleX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(scaleX); 4081 cache.scaleY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(scaleY); 4082 cache.rotation = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotation) + deg; 4083 cache.rotationX = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotationX) + deg; 4084 cache.rotationY = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(rotationY) + deg;
vendor: 1,166 bytes, lines 4085-4109
4085 cache.skewX = skewX + deg; 4086 cache.skewY = skewY + deg; 4087 cache.transformPerspective = perspective + px; 4088 4089 if (cache.zOrigin = parseFloat(origin.split(" ")[2]) || !uncache && cache.zOrigin || 0) { 4090 style[_transformOriginProp] = _firstTwoOnly(origin); 4091 } 4092 4093 cache.xOffset = cache.yOffset = 0; 4094 cache.force3D = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.force3D; 4095 cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms; 4096 cache.uncache = 0; 4097 return cache; 4098}, 4099 _firstTwoOnly = function _firstTwoOnly(value) { 4100 return (value = value.split(" "))[0] + " " + value[1]; 4101}, 4102 //for handling transformOrigin values, stripping out the 3rd dimension 4103_addPxTranslate = function _addPxTranslate(target, start, value) { 4104 var unit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(start); 4105 return (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(parseFloat(start) + parseFloat(_convertToUnit(target, "x", value + "px", unit))) + unit; 4106}, 4107 _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) { 4108 cache.z = "0px"; 4109 cache.rotationY = cache.rotationX = "0deg";
vendor: 9,614 bytes, lines 4110-4379
4110 cache.force3D = 0; 4111 4112 _renderCSSTransforms(ratio, cache); 4113}, 4114 _zeroDeg = "0deg", 4115 _zeroPx = "0px", 4116 _endParenthesis = ") ", 4117 _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) { 4118 var _ref = cache || this, 4119 xPercent = _ref.xPercent, 4120 yPercent = _ref.yPercent, 4121 x = _ref.x, 4122 y = _ref.y, 4123 z = _ref.z, 4124 rotation = _ref.rotation, 4125 rotationY = _ref.rotationY, 4126 rotationX = _ref.rotationX, 4127 skewX = _ref.skewX, 4128 skewY = _ref.skewY, 4129 scaleX = _ref.scaleX, 4130 scaleY = _ref.scaleY, 4131 transformPerspective = _ref.transformPerspective, 4132 force3D = _ref.force3D, 4133 target = _ref.target, 4134 zOrigin = _ref.zOrigin, 4135 transforms = "", 4136 use3D = force3D === "auto" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually) 4137 4138 4139 if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) { 4140 var angle = parseFloat(rotationY) * _DEG2RAD, 4141 a13 = Math.sin(angle), 4142 a33 = Math.cos(angle), 4143 cos; 4144 4145 angle = parseFloat(rotationX) * _DEG2RAD; 4146 cos = Math.cos(angle); 4147 x = _addPxTranslate(target, x, a13 * cos * -zOrigin); 4148 y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin); 4149 z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin); 4150 } 4151 4152 if (transformPerspective !== _zeroPx) { 4153 transforms += "perspective(" + transformPerspective + _endParenthesis; 4154 } 4155 4156 if (xPercent || yPercent) { 4157 transforms += "translate(" + xPercent + "%, " + yPercent + "%) "; 4158 } 4159 4160 if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) { 4161 transforms += z !== _zeroPx || use3D ? "translate3d(" + x + ", " + y + ", " + z + ") " : "translate(" + x + ", " + y + _endParenthesis; 4162 } 4163 4164 if (rotation !== _zeroDeg) { 4165 transforms += "rotate(" + rotation + _endParenthesis; 4166 } 4167 4168 if (rotationY !== _zeroDeg) { 4169 transforms += "rotateY(" + rotationY + _endParenthesis; 4170 } 4171 4172 if (rotationX !== _zeroDeg) { 4173 transforms += "rotateX(" + rotationX + _endParenthesis; 4174 } 4175 4176 if (skewX !== _zeroDeg || skewY !== _zeroDeg) { 4177 transforms += "skew(" + skewX + ", " + skewY + _endParenthesis; 4178 } 4179 4180 if (scaleX !== 1 || scaleY !== 1) { 4181 transforms += "scale(" + scaleX + ", " + scaleY + _endParenthesis; 4182 } 4183 4184 target.style[_transformProp] = transforms || "translate(0, 0)"; 4185}, 4186 _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) { 4187 var _ref2 = cache || this, 4188 xPercent = _ref2.xPercent, 4189 yPercent = _ref2.yPercent, 4190 x = _ref2.x, 4191 y = _ref2.y, 4192 rotation = _ref2.rotation, 4193 skewX = _ref2.skewX, 4194 skewY = _ref2.skewY, 4195 scaleX = _ref2.scaleX, 4196 scaleY = _ref2.scaleY, 4197 target = _ref2.target, 4198 xOrigin = _ref2.xOrigin, 4199 yOrigin = _ref2.yOrigin, 4200 xOffset = _ref2.xOffset, 4201 yOffset = _ref2.yOffset, 4202 forceCSS = _ref2.forceCSS, 4203 tx = parseFloat(x), 4204 ty = parseFloat(y), 4205 a11, 4206 a21, 4207 a12, 4208 a22, 4209 temp; 4210 4211 rotation = parseFloat(rotation); 4212 skewX = parseFloat(skewX); 4213 skewY = parseFloat(skewY); 4214 4215 if (skewY) { 4216 //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees. 4217 skewY = parseFloat(skewY); 4218 skewX += skewY; 4219 rotation += skewY; 4220 } 4221 4222 if (rotation || skewX) { 4223 rotation *= _DEG2RAD; 4224 skewX *= _DEG2RAD; 4225 a11 = Math.cos(rotation) * scaleX; 4226 a21 = Math.sin(rotation) * scaleX; 4227 a12 = Math.sin(rotation - skewX) * -scaleY; 4228 a22 = Math.cos(rotation - skewX) * scaleY; 4229 4230 if (skewX) { 4231 skewY *= _DEG2RAD; 4232 temp = Math.tan(skewX - skewY); 4233 temp = Math.sqrt(1 + temp * temp); 4234 a12 *= temp; 4235 a22 *= temp; 4236 4237 if (skewY) { 4238 temp = Math.tan(skewY); 4239 temp = Math.sqrt(1 + temp * temp); 4240 a11 *= temp; 4241 a21 *= temp; 4242 } 4243 } 4244 4245 a11 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a11); 4246 a21 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a21); 4247 a12 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a12); 4248 a22 = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(a22); 4249 } else { 4250 a11 = scaleX; 4251 a22 = scaleY; 4252 a21 = a12 = 0; 4253 } 4254 4255 if (tx && !~(x + "").indexOf("px") || ty && !~(y + "").indexOf("px")) { 4256 tx = _convertToUnit(target, "x", x, "px"); 4257 ty = _convertToUnit(target, "y", y, "px"); 4258 } 4259 4260 if (xOrigin || yOrigin || xOffset || yOffset) { 4261 tx = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset); 4262 ty = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset); 4263 } 4264 4265 if (xPercent || yPercent) { 4266 //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the translation to simulate it. 4267 temp = target.getBBox(); 4268 tx = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(tx + xPercent / 100 * temp.width); 4269 ty = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._round)(ty + yPercent / 100 * temp.height); 4270 } 4271 4272 temp = "matrix(" + a11 + "," + a21 + "," + a12 + "," + a22 + "," + tx + "," + ty + ")"; 4273 target.setAttribute("transform", temp); 4274 forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!) 4275}, 4276 _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) { 4277 var cap = 360, 4278 isString = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isString)(endValue), 4279 endNum = parseFloat(endValue) * (isString && ~endValue.indexOf("rad") ? _RAD2DEG : 1), 4280 change = endNum - startNum, 4281 finalValue = startNum + change + "deg", 4282 direction, 4283 pt; 4284 4285 if (isString) { 4286 direction = endValue.split("_")[1]; 4287 4288 if (direction === "short") { 4289 change %= cap; 4290 4291 if (change !== change % (cap / 2)) { 4292 change += change < 0 ? cap : -cap; 4293 } 4294 } 4295 4296 if (direction === "cw" && change < 0) { 4297 change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap; 4298 } else if (direction === "ccw" && change > 0) { 4299 change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap; 4300 } 4301 } 4302 4303 plugin._pt = pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd); 4304 pt.e = finalValue; 4305 pt.u = "deg"; 4306 4307 plugin._props.push(property); 4308 4309 return pt; 4310}, 4311 _assign = function _assign(target, source) { 4312 // Internet Explorer doesn't have Object.assign(), so we recreate it here. 4313 for (var p in source) { 4314 target[p] = source[p]; 4315 } 4316 4317 return target; 4318}, 4319 _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) { 4320 //for handling cases where someone passes in a whole transform string, like transform: "scale(2, 3) rotate(20deg) translateY(30em)" 4321 var startCache = _assign({}, target._gsap), 4322 exclude = "perspective,force3D,transformOrigin,svgOrigin", 4323 style = target.style, 4324 endCache, 4325 p, 4326 startValue, 4327 endValue, 4328 startNum, 4329 endNum, 4330 startUnit, 4331 endUnit; 4332 4333 if (startCache.svg) { 4334 startValue = target.getAttribute("transform"); 4335 target.setAttribute("transform", ""); 4336 style[_transformProp] = transforms; 4337 endCache = _parseTransform(target, 1); 4338 4339 _removeProperty(target, _transformProp); 4340 4341 target.setAttribute("transform", startValue); 4342 } else { 4343 startValue = getComputedStyle(target)[_transformProp]; 4344 style[_transformProp] = transforms; 4345 endCache = _parseTransform(target, 1); 4346 style[_transformProp] = startValue; 4347 } 4348 4349 for (p in _transformProps) { 4350 startValue = startCache[p]; 4351 endValue = endCache[p]; 4352 4353 if (startValue !== endValue && exclude.indexOf(p) < 0) { 4354 //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case. 4355 startUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue); 4356 endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue); 4357 startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue); 4358 endNum = parseFloat(endValue); 4359 plugin._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp); 4360 plugin._pt.u = endUnit || 0; 4361 4362 plugin._props.push(p); 4363 } 4364 } 4365 4366 _assign(endCache, startCache); 4367}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc. 4368 4369 4370(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)("padding,margin,Width,Radius", function (name, index) { 4371 var t = "Top", 4372 r = "Right", 4373 b = "Bottom", 4374 l = "Left", 4375 props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) { 4376 return index < 2 ? name + side : "border" + side + name; 4377 }); 4378 4379 _specialProps[index >
4379 1 ? "border" + name : name] = function (plugin, target, property, endValue, tween) { 4380 var a, vars; 4381 4382 if (arguments.length < 4) { 4383 // getter, passed target, property, and unit (from _get()) 4384 a = props.map(function (prop) { 4385 return _get(plugin, prop, property); 4386 }); 4387 vars = a.join(" "); 4388 return vars.split(a[0]).length === 5 ? a[0] : vars; 4389 } 4390 4391 a = (endValue + "").split(" "); 4392 vars = {}; 4393 props.forEach(function (prop, i) { 4394 return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0]; 4395 }); 4396 plugin.init(target, vars, tween); 4397 }; 4398}); 4399 4400var CSSPlugin = { 4401 name: "css", 4402 register: _initCore, 4403 targetTest: function targetTest(target) { 4404 return target.style && target.nodeType; 4405 }, 4406 init: function init(target, vars, tween, index, targets) { 4407 var props = this._props, 4408 style = target.style, 4409 startAt = tween.vars.startAt, 4410 startValue, 4411 endValue, 4412 endNum, 4413 startNum, 4414 type, 4415 specialProp, 4416 p, 4417 startUnit, 4418 endUnit, 4419 relative, 4420 isTransformRelated, 4421 transformPropTween, 4422 cache, 4423 smooth, 4424 hasPriority, 4425 inlineProps, 4426 finalTransformValue; 4427 _pluginInitted || _initCore(); // we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps 4428 4429 this.styles = this.styles || _getStyleSaver(target); 4430 inlineProps = this.styles.props; 4431 this.tween = tween; 4432 4433 for (p in vars) { 4434 if (p === "autoRound") { 4435 continue; 4436 } 4437 4438 endValue = vars[p]; 4439 4440 if (_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._plugins[p] && (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._checkPlugin)(p, vars, tween, index, target, targets)) { 4441 // plugins 4442 continue; 4443 } 4444 4445 type = typeof endValue; 4446 specialProp = _specialProps[p]; 4447 4448 if (type === "function") { 4449 endValue = endValue.call(tween, index, target, targets); 4450 type = typeof endValue; 4451 } 4452 4453 if (type === "string" && ~endValue.indexOf("random(")) { 4454 endValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._replaceRandom)(endValue); 4455 } 4456 4457 if (specialProp) { 4458 specialProp(this, target, p, endValue, tween) && (hasPriority = 1); 4459 } else if (p.substr(0, 2) === "--") { 4460 //CSS variable 4461 startValue = (getComputedStyle(target).getPropertyValue(p) + "").trim(); 4462 endValue += ""; 4463 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorExp.lastIndex = 0; 4464 4465 if (!_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._colorExp.test(startValue)) { 4466 // colors don't have units 4467 startUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue); 4468 endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue); 4469 endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit); 4470 } 4471 4472 this.add(style, "setProperty", startValue, endValue, index, targets, 0, 0, p); 4473 props.push(p); 4474 inlineProps.push(p, 0, style[p]); 4475 } else if (type !== "undefined") { 4476 if (startAt && p in startAt) { 4477 // in case someone hard-codes a complex value as the start, like top: "calc(2vh / 2)". Without this, it'd use the computed value (always in px) 4478 startValue = typeof startAt[p] === "function" ? startAt[p].call(tween, index, target, targets) : startAt[p]; 4479 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isString)(startValue) && ~startValue.indexOf("random(") && (startValue = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._replaceRandom)(startValue)); 4480 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(startValue + "") || startValue === "auto" || (startValue += _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[p] || (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(_get(target, p)) || ""); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work. 4481 4482 (startValue + "").charAt(1) === "=" && (startValue = _get(target, p)); // can't work with relative values 4483 } else { 4484 startValue = _get(target, p); 4485 } 4486 4487 startNum = parseFloat(startValue); 4488 relative = type === "string" && endValue.charAt(1) === "=" && endValue.substr(0, 2); 4489 relative && (endValue = endValue.substr(2)); 4490 endNum = parseFloat(endValue); 4491 4492 if (p in _propertyAliases) { 4493 if (p === "autoAlpha") { 4494 //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened. 4495 if (startNum === 1 && _get(target, "visibility") === "hidden" && endNum) { 4496 //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience) 4497 startNum = 0; 4498 } 4499 4500 inlineProps.push("visibility", 0, style.visibility); 4501 4502 _addNonTweeningPT(this, style, "visibility", startNum ? "inherit" : "hidden", endNum ? "inherit" : "hidden", !endNum); 4503 } 4504 4505 if (p !== "scale" && p !== "transform") { 4506 p = _propertyAliases[p]; 4507 ~p.indexOf(",") && (p = p.split(",")[0]); 4508 } 4509 } 4510
vendor: 4,710 bytes, lines 4511-4590
4511 isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED --- 4512 4513 if (isTransformRelated) { 4514 this.styles.save(p); 4515 finalTransformValue = endValue; // this is always the same as endValue except when it's a var(--) value, in which case we need to calculate the end value. 4516 4517 if (type === "string" && endValue.substring(0, 6) === "var(--") { 4518 endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(")"))); 4519 4520 if (endValue.substring(0, 5) === "calc(") { 4521 var origPerspective = target.style.perspective; 4522 target.style.perspective = endValue; 4523 endValue = _getComputedProperty(target, "perspective"); 4524 origPerspective ? target.style.perspective = origPerspective : _removeProperty(target, "perspective"); 4525 } 4526 4527 endNum = parseFloat(endValue); 4528 } 4529 4530 if (!transformPropTween) { 4531 cache = target._gsap; 4532 cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:"translateX(50vw)"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here. 4533 4534 smooth = vars.smoothOrigin !== false && cache.smooth; 4535 transformPropTween = this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning) 4536 4537 transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween. 4538 } 4539 4540 if (p === "scale") { 4541 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, cache, "scaleY", cache.scaleY, (relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp); 4542 this._pt.u = 0; 4543 props.push("scaleY", p); 4544 p += "X"; 4545 } else if (p === "transformOrigin") { 4546 inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]); 4547 endValue = _convertKeywordsToPercentages(endValue); //in case something like "left top" or "bottom right" is passed in. Convert to percentages. 4548 4549 if (cache.svg) { 4550 _applySVGOrigin(target, endValue, 0, smooth, 0, this); 4551 } else { 4552 endUnit = parseFloat(endValue.split(" ")[2]) || 0; //handle the zOrigin separately! 4553 4554 endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, "zOrigin", cache.zOrigin, endUnit); 4555 4556 _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue)); 4557 } 4558 4559 continue; 4560 } else if (p === "svgOrigin") { 4561 _applySVGOrigin(target, endValue, 1, smooth, 0, this); 4562 4563 continue; 4564 } else if (p in _rotationalProperties) { 4565 _addRotationalPropTween(this, cache, p, startNum, relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, relative + endValue) : endValue); 4566 4567 continue; 4568 } else if (p === "smoothOrigin") { 4569 _addNonTweeningPT(this, cache, "smooth", cache.smooth, endValue); 4570 4571 continue; 4572 } else if (p === "force3D") { 4573 cache[p] = endValue; 4574 continue; 4575 } else if (p === "transform") { 4576 _addRawTransformPTs(this, endValue, target); 4577 4578 continue; 4579 } 4580 } else if (!(p in style)) { 4581 p = _checkPropPrefix(p) || p; 4582 } 4583 4584 if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) { 4585 startUnit = (startValue + "").substr((startNum + "").length); 4586 endNum || (endNum = 0); // protect against NaN 4587 4588 endUnit = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.getUnit)(endValue) || (p in _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units ? _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[p] : startUnit); 4589 startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit)); 4590 this._pt = new _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._parseRelative)(startNum, relative + endNum) : endNum) - startNum,
4590!isTransformRelated && (endUnit === "px" || p === "zIndex") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp); 4591 this._pt.u = endUnit || 0; 4592 4593 if (isTransformRelated && finalTransformValue !== endValue) { 4594 this._pt.b = startValue; 4595 this._pt.e = finalTransformValue; 4596 this._pt.r = _renderCSSPropWithBeginningAndEnd; 4597 } else if (startUnit !== endUnit && endUnit !== "%") { 4598 //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a "b" (beginning) property and point to a render method that handles that. (performance optimization) 4599 this._pt.b = startValue; 4600 this._pt.r = _renderCSSPropWithBeginning; 4601 } 4602 } else if (!(p in style)) { 4603 if (p in target) { 4604 //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that. 4605 this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets); 4606 } else if (p !== "parseTransform") { 4607 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._missingPlugin)(p, endValue); 4608 4609 continue; 4610 } 4611 } else { 4612 _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue); 4613 } 4614 4615 isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === "function" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p])); 4616 props.push(p); 4617 } 4618 } 4619 4620 hasPriority && (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._sortPropTweensByPriority)(this); 4621 }, 4622 render: function render(ratio, data) { 4623 if (data.tween._time || !_reverting()) { 4624 var pt = data._pt; 4625 4626 while (pt) { 4627 pt.r(ratio, pt.d); 4628 pt = pt._next; 4629 } 4630 } else { 4631 data.styles.revert(); 4632 } 4633 }, 4634 get: _get, 4635 aliases: _propertyAliases, 4636 getSetter: function getSetter(target, property, plugin) { 4637 //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like "x" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer. 4638 var p = _propertyAliases[property]; 4639 p && p.indexOf(",") < 0 && (property = p); 4640 return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, "x")) ? plugin && _recentSetterPlugin === plugin ? property === "scale" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === "scale" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._isUndefined)(target.style[property]) ? _setterCSSStyle : ~property.indexOf("-") ? _setterCSSProp : (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._getSetter)(target, property); 4641 }, 4642 core: { 4643 _removeProperty: _removeProperty, 4644 _getMatrix: _getMatrix 4645 } 4646}; 4647_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.utils.checkPrefix = _checkPropPrefix; 4648_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.core.getStyleSaver = _getStyleSaver; 4649 4650(function (positionAndScale, rotation, others, aliases) { 4651 var all = (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(positionAndScale + "," + rotation + "," + others, function (name) { 4652 _transformProps[name] = 1; 4653 }); 4654 4655 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(rotation, function (name) { 4656 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[name] = "deg"; 4657 _rotationalProperties[name] = 1; 4658 }); 4659 4660 _propertyAliases[all[13]] = positionAndScale + "," + rotation; 4661 4662 (0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)(aliases, function (name) { 4663 var split = name.split(":"); 4664 _propertyAliases[split[1]] = all[split[0]]; 4665 }); 4666})("x,y,z,scale,scaleX,scaleY,xPercent,yPercent", "rotation,rotationX,rotationY,skewX,skewY", "transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective", "0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY"); 4667 4668(0,_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._forEachName)("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective", function (name) { 4669 _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__._config.units[name] = "px"; 4670}); 4671 4672_gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.registerPlugin(CSSPlugin); 4673//# sourceURL=[module] 4674//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvQ1NTUGx1Z2luLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
4674BRUE7QUFFd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNkVBQTZFOztBQUVwRjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjLGtCQUFrQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUVBQW1FOztBQUVuRTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsK0NBQUksd0JBQXdCOztBQUU5QztBQUNBO0FBQ0EsR0FBRyxHQUFHOztBQUVOO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSwwSkFBMEo7O0FBRTFKLHNEQUFzRDtBQUN0RCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLHdPQUF3TztBQUN4TyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjLGtCQUFrQixZQUFZOztBQUV6RjtBQUNBLGlCQUFpQiwrQ0FBSTtBQUNyQjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0EsK0JBQStCO0FBQy9CLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUEscUdBQXFHOztBQUVyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxlQUFlLG9EQUFTO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcscURBQU07QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsd0VBQXdFLGtEQUFPO0FBQy9FLFdBQVcscURBQU07QUFDakIsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsd0RBQVM7QUFDdkIsbUJBQW1CLGtEQUFPO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLHFEQUFNO0FBQ2YsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBLHNJQUFzSSwyREFBWSx3REFBd0Q7QUFDMU07QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhEQUE4RDtBQUM5RDtBQUNBOztBQUVBLGVBQWUsb0RBQVMscUNBQXFDLCtEQUFvQjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxFQUFFLGlFQUFrQixLQUFLOzs7QUFHekI7QUFDQTtBQUNBLDRCQUE0QiwwREFBZTtBQUMzQyx3QkFBd0IsMERBQWU7O0FBRXZDO0FBQ0Esb0JBQW9CLDBEQUFlO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCw2REFBYztBQUNoRTtBQUNBO0FBQ0EsZ0JBQWdCLDBEQUFlOztBQUUvQjtBQUNBO0FBQ0EsK0JBQStCLGtEQUFPOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1RUFBdUU7QUFDdkUsSUFBSTtBQUNKO0FBQ0E7O0FBRUEsRUFBRSxrREFBTywwQkFBMEI7O0FBRW5DLGlCQUFpQjs7QUFFakI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0F
4674BRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7O0FBR3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9EQUFTO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixZQUFZLHlRQUF5UTtBQUNyUixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEMsNkJBQTZCO0FBQzdCO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUEsMkZBQTJGLGtEQUFPLE1BQU0saURBQU07QUFDOUcsQ0FBQztBQUNEO0FBQ0EsOEJBQThCLHdEQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCOztBQUVBLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVIQUF1SCx3REFBd0Qsd0NBQXdDO0FBQ3ZOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0Esa0NBQWtDLGtEQUFPOztBQUV6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLCtEQUErRDtBQUMvRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7O0FBRW5CLG1CQUFtQjs7QUFFbkIsbUJBQW1COztBQUVuQixtQkFBbUI7O0FBRW5CO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7O0FBRXZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLHFEQUFNO0FBQ3JCLGVBQWUscURBQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixxREFBTTtBQUN2QixpQkFBaUIscURBQU07QUFDdkIsbUJBQW1CLHFEQUFNO0FBQ3pCLG9CQUFvQixxREFBTTtBQUMxQixvQkFBb0IscURBQU07QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixrREFBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsYUFBYSxzREFBTztBQUNwQixTQUFTLHFEQUFNO0FBQ2YsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFOzs7QUFHOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
4674BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxxREFBTTtBQUNoQixVQUFVLHFEQUFNO0FBQ2hCLFVBQVUscURBQU07QUFDaEIsVUFBVSxxREFBTTtBQUNoQixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHFEQUFNO0FBQ2YsU0FBUyxxREFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscURBQU07QUFDZixTQUFTLHFEQUFNO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLGlCQUFpQix3REFBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0Isb0RBQVM7QUFDakM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLHNEQUFPO0FBQ3pCLGdCQUFnQixzREFBTztBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCLG9EQUFTO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdILDJEQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs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7QUFDZDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQsMkRBQVk7QUFDWixFQUFFLGtEQUFPO0FBQ1QsQ0FBQzs7QUFFRCwrQ0FBSSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9DU1NQbHVnaW4uanM/ZTVlYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENTU1BsdWdpbiAzLjE1LjBcbiAqIGh0dHBzOi8vZ3NhcC5jb21cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOC0yMDI2LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwczovL2dzYXAuY29tL3N0YW5kYXJkLWxpY2Vuc2VcbiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbVxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7
4674IGdzYXAsIF9nZXRQcm9wZXJ0eSwgX251bUV4cCwgX251bVdpdGhVbml0RXhwLCBnZXRVbml0LCBfaXNTdHJpbmcsIF9pc1VuZGVmaW5lZCwgX3JlbmRlckNvbXBsZXhTdHJpbmcsIF9yZWxFeHAsIF9mb3JFYWNoTmFtZSwgX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eSwgX2NvbG9yU3RyaW5nRmlsdGVyLCBfY2hlY2tQbHVnaW4sIF9yZXBsYWNlUmFuZG9tLCBfcGx1Z2lucywgR1NDYWNoZSwgUHJvcFR3ZWVuLCBfY29uZmlnLCBfdGlja2VyLCBfcm91bmQsIF9taXNzaW5nUGx1Z2luLCBfZ2V0U2V0dGVyLCBfZ2V0Q2FjaGUsIF9jb2xvckV4cCwgX3BhcnNlUmVsYXRpdmUsIF9zZXREZWZhdWx0cywgX3JlbW92ZUxpbmtlZExpc3RJdGVtIC8vZm9yIHRoZSBjb21tZW50ZWQtb3V0IGNsYXNzTmFtZSBmZWF0dXJlLlxufSBmcm9tIFwiLi9nc2FwLWNvcmUuanNcIjtcblxudmFyIF93aW4sXG4gICAgX2RvYyxcbiAgICBfZG9jRWxlbWVudCxcbiAgICBfcGx1Z2luSW5pdHRlZCxcbiAgICBfdGVtcERpdixcbiAgICBfdGVtcERpdlN0eWxlcixcbiAgICBfcmVjZW50U2V0dGVyUGx1Z2luLFxuICAgIF9yZXZlcnRpbmcsXG4gICAgX3dpbmRvd0V4aXN0cyA9IGZ1bmN0aW9uIF93aW5kb3dFeGlzdHMoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xufSxcbiAgICBfdHJhbnNmb3JtUHJvcHMgPSB7fSxcbiAgICBfUkFEMkRFRyA9IDE4MCAvIE1hdGguUEksXG4gICAgX0RFRzJSQUQgPSBNYXRoLlBJIC8gMTgwLFxuICAgIF9hdGFuMiA9IE1hdGguYXRhbjIsXG4gICAgX2JpZ051bSA9IDFlOCxcbiAgICBfY2Fwc0V4cCA9IC8oW0EtWl0pL2csXG4gICAgX2hvcml6b250YWxFeHAgPSAvKGxlZnR8cmlnaHR8d2lkdGh8bWFyZ2lufHBhZGRpbmd8eCkvaSxcbiAgICBfY29tcGxleEV4cCA9IC9bXFxzLFxcKF1cXFMvLFxuICAgIF9wcm9wZXJ0eUFsaWFzZXMgPSB7XG4gIGF1dG9BbHBoYTogXCJvcGFjaXR5LHZpc2liaWxpdHlcIixcbiAgc2NhbGU6IFwic2NhbGVYLHNjYWxlWVwiLFxuICBhbHBoYTogXCJvcGFjaXR5XCJcbn0sXG4gICAgX3JlbmRlckNTU1Byb3AgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTUHJvcChyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIE1hdGgucm91bmQoKGRhdGEucyArIGRhdGEuYyAqIHJhdGlvKSAqIDEwMDAwKSAvIDEwMDAwICsgZGF0YS51LCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlclByb3BXaXRoRW5kID0gZnVuY3Rpb24gX3JlbmRlclByb3BXaXRoRW5kKHJhdGlvLCBkYXRhKSB7XG4gIHJldHVybiBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgcmF0aW8gPT09IDEgPyBkYXRhLmUgOiBNYXRoLnJvdW5kKChkYXRhLnMgKyBkYXRhLmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCArIGRhdGEudSwgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJDU1NQcm9wV2l0aEJlZ2lubmluZyA9IGZ1bmN0aW9uIF9yZW5kZXJDU1NQcm9wV2l0aEJlZ2lubmluZyhyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvID8gTWF0aC5yb3VuZCgoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pICogMTAwMDApIC8gMTAwMDAgKyBkYXRhLnUgOiBkYXRhLmIsIGRhdGEpO1xufSxcbiAgICAvL2lmIHVuaXRzIGNoYW5nZSwgd2UgbmVlZCBhIHdheSB0byByZW5kZXIgdGhlIG9yaWdpbmFsIHVuaXQvdmFsdWUgd2hlbiB0aGUgdHdlZW4gZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgKHJhdGlvOjApXG5fcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmdBbmRFbmQgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmdBbmRFbmQocmF0aW8sIGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCByYXRpbyA9PT0gMSA/IGRhdGEuZSA6IHJhdGlvID8gTWF0aC5yb3VuZCgoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pICogMTAwMDApIC8gMTAwMDAgKyBkYXRhLnUgOiBkYXRhLmIsIGRhdGEpO1xufSxcbiAgICAvL2lmIHVuaXRzIGNoYW5nZSwgd2UgbmVlZCBhIHdheSB0byByZW5kZXIgdGhlIG9yaWdpbmFsIHVuaXQvdmFsdWUgd2hlbiB0aGUgdHdlZW4gZ29lcyBhbGwgdGhlIHdheSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgKHJhdGlvOjApXG5fcmVuZGVyUm91bmRlZENTU1Byb3AgPSBmdW5jdGlvbiBfcmVuZGVyUm91bmRlZENTU1Byb3AocmF0aW8sIGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YS5zICsgZGF0YS5jICogcmF0aW87XG4gIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCB+fih2YWx1ZSArICh2YWx1ZSA8IDAgPyAtLjUgOiAuNSkpICsgZGF0YS51LCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlck5vblR3ZWVuaW5nVmFsdWUgPSBmdW5jdGlvbiBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZShyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvID8gZGF0YS5lIDogZGF0YS5iLCBkYXRhKTtcbn0sXG4gICAgX3JlbmRlck5vblR3ZWVuaW5nVmFsdWVPbmx5QXRFbmQgPSBmdW5jdGlvbiBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZChyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvICE9PSAxID8gZGF0YS5iIDogZGF0YS5lLCBkYXRhKTtcbn0sXG4gICAgX3NldHRlckNTU1N0eWxlID0gZnVuY3Rpb24gX3NldHRlckNTU1N0eWxlKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXQuc3R5bGVbcHJvcGVydHldID0gdmFsdWU7XG59LFxuICAgIF9zZXR0ZXJDU1NQcm9wID0gZnVuY3Rpb24gX3NldHRlckNTU1Byb3AodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgcmV0dXJuIHRhcmdldC5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xufSxcbiAgICBfc2V0dGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gX3NldHRlclRyYW5zZm9ybSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xuICByZXR1cm4gdGFyZ2V0Ll9nc2FwW3Byb3BlcnR5XSA9IHZhbHVlO1xufSxcbiAgICBfc2V0dGVyU2NhbGUgPSBmdW5jdGlvbiBfc2V0dGVyU2NhbGUodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgcmV0dXJuIHRhcmdldC5fZ3NhcC5zY2FsZVggPSB0YXJnZXQuX2dzYXAuc2NhbGVZID0gdmFsdWU7XG59LFxuICAgIF9zZXR0ZXJTY2FsZVdpdGhSZW5kZXIgPSBmdW5jdGlvbiBfc2V0dGVyU2NhbGVXaXRoUmVuZGVyKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBkYXRhLCByYXRpbykge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXA7XG4gIGNhY2hlLnNjYWxlWCA9IGNhY2hlLnNjYWxlWSA9IHZhbHVlO1xuICBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0ocmF0aW8sIGNhY2hlKTtcbn0sXG4gICAgX3NldHRlclRyYW5zZm9ybV
4674dpdGhSZW5kZXIgPSBmdW5jdGlvbiBfc2V0dGVyVHJhbnNmb3JtV2l0aFJlbmRlcih0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgZGF0YSwgcmF0aW8pIHtcbiAgdmFyIGNhY2hlID0gdGFyZ2V0Ll9nc2FwO1xuICBjYWNoZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgY2FjaGUucmVuZGVyVHJhbnNmb3JtKHJhdGlvLCBjYWNoZSk7XG59LFxuICAgIF90cmFuc2Zvcm1Qcm9wID0gXCJ0cmFuc2Zvcm1cIixcbiAgICBfdHJhbnNmb3JtT3JpZ2luUHJvcCA9IF90cmFuc2Zvcm1Qcm9wICsgXCJPcmlnaW5cIixcbiAgICBfc2F2ZVN0eWxlID0gZnVuY3Rpb24gX3NhdmVTdHlsZShwcm9wZXJ0eSwgaXNOb3RDU1MpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQsXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIGNhY2hlID0gdGFyZ2V0Ll9nc2FwO1xuXG4gIGlmIChwcm9wZXJ0eSBpbiBfdHJhbnNmb3JtUHJvcHMgJiYgc3R5bGUpIHtcbiAgICB0aGlzLnRmbSA9IHRoaXMudGZtIHx8IHt9O1xuXG4gICAgaWYgKHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICBwcm9wZXJ0eSA9IF9wcm9wZXJ0eUFsaWFzZXNbcHJvcGVydHldIHx8IHByb3BlcnR5O1xuICAgICAgfnByb3BlcnR5LmluZGV4T2YoXCIsXCIpID8gcHJvcGVydHkuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnRmbVthXSA9IF9nZXQodGFyZ2V0LCBhKTtcbiAgICAgIH0pIDogdGhpcy50Zm1bcHJvcGVydHldID0gY2FjaGUueCA/IGNhY2hlW3Byb3BlcnR5XSA6IF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSk7IC8vIG5vdGU6IHNjYWxlIHdvdWxkIG1hcCB0byBcInNjYWxlWCxzY2FsZVlcIiwgdGh1cyB3ZSBsb29wIGFuZCBhcHBseSB0aGVtIGJvdGguXG5cbiAgICAgIHByb3BlcnR5ID09PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCAmJiAodGhpcy50Zm0uek9yaWdpbiA9IGNhY2hlLnpPcmlnaW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb3BlcnR5QWxpYXNlcy50cmFuc2Zvcm0uc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIF9zYXZlU3R5bGUuY2FsbChfdGhpcywgcCwgaXNOb3RDU1MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuaW5kZXhPZihfdHJhbnNmb3JtUHJvcCkgPj0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIHRoaXMuc3ZnbyA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN2Zy1vcmlnaW5cIik7XG4gICAgICB0aGlzLnByb3BzLnB1c2goX3RyYW5zZm9ybU9yaWdpblByb3AsIGlzTm90Q1NTLCBcIlwiKTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eSA9IF90cmFuc2Zvcm1Qcm9wO1xuICB9XG5cbiAgKHN0eWxlIHx8IGlzTm90Q1NTKSAmJiB0aGlzLnByb3BzLnB1c2gocHJvcGVydHksIGlzTm90Q1NTLCBzdHlsZVtwcm9wZXJ0eV0pO1xufSxcbiAgICBfcmVtb3ZlSW5kZXBlbmRlbnRUcmFuc2Zvcm1zID0gZnVuY3Rpb24gX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyhzdHlsZSkge1xuICBpZiAoc3R5bGUudHJhbnNsYXRlKSB7XG4gICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ0cmFuc2xhdGVcIik7XG4gICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJzY2FsZVwiKTtcbiAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShcInJvdGF0ZVwiKTtcbiAgfVxufSxcbiAgICBfcmV2ZXJ0U3R5bGUgPSBmdW5jdGlvbiBfcmV2ZXJ0U3R5bGUoKSB7XG4gIHZhciBwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCxcbiAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXG4gICAgICBpLFxuICAgICAgcDtcblxuICBmb3IgKGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAvLyBzdG9yZWQgbGlrZSB0aGlzOiBwcm9wZXJ0eSwgaXNOb3RDU1MsIHZhbHVlXG4gICAgaWYgKCFwcm9wc1tpICsgMV0pIHtcbiAgICAgIHByb3BzW2kgKyAyXSA/IHN0eWxlW3Byb3BzW2ldXSA9IHByb3BzW2kgKyAyXSA6IHN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BzW2ldLnN1YnN0cigwLCAyKSA9PT0gXCItLVwiID8gcHJvcHNbaV0gOiBwcm9wc1tpXS5yZXBsYWNlKF9jYXBzRXhwLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzW2kgKyAxXSA9PT0gMikge1xuICAgICAgLy8gbm9uLUNTUyB2YWx1ZSAoZnVuY3Rpb24tYmFzZWQpXG4gICAgICB0YXJnZXRbcHJvcHNbaV1dKHByb3BzW2kgKyAyXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vbi1DU1MgdmFsdWUgKG5vdCBmdW5jdGlvbi1iYXNlZClcbiAgICAgIHRhcmdldFtwcm9wc1tpXV0gPSBwcm9wc1tpICsgMl07XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGZtKSB7XG4gICAgZm9yIChwIGluIHRoaXMudGZtKSB7XG4gICAgICBjYWNoZVtwXSA9IHRoaXMudGZtW3BdO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybSgpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB0aGlzLnN2Z28gfHwgXCJcIik7XG4gICAgfVxuXG4gICAgaSA9IF9yZXZlcnRpbmcoKTtcblxuICAgIGlmICgoIWkgfHwgIWkuaXNTdGFydCkgJiYgIXN0eWxlW190cmFuc2Zvcm1Qcm9wXSkge1xuICAgICAgX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyhzdHlsZSk7XG5cbiAgICAgIGlmIChjYWNoZS56T3JpZ2luICYmIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSkge1xuICAgICAgICBzdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0gKz0gXCIgXCIgKyBjYWNoZS56T3JpZ2luICsgXCJweFwiOyAvLyBzaW5jZSB3ZSdyZSB1bmNhY2hpbmcsIHdlIG11c3QgcHV0IHRoZSB6T3JpZ2luIGJhY2sgaW50byB0aGUgdHJhbnNmb3JtT3JpZ2luIHNvIHRoYXQgd2UgY2FuIHB1bGwgaXQgb3V0IGFjY3VyYXRlbHkgd2hlbiB3ZSBwYXJzZSBhZ2Fpbi4gT3RoZXJ3aXNlLCB3ZSdkIGxvc2UgdGhlIHogcG9ydGlvbiBvZiB0aGUgb3JpZ2luIHNpbmNlIHdlIGV4dHJhY3QgaXQgdG8gcHJvdGVjdCBmcm9tIFNhZmFyaSBidWdzLlxuXG4gICAgICAgIGNhY2hlLnpP
4674cmlnaW4gPSAwO1xuICAgICAgICBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0oKTtcbiAgICAgIH1cblxuICAgICAgY2FjaGUudW5jYWNoZSA9IDE7IC8vIGlmIGl0J3MgYSBzdGFydEF0IHRoYXQncyBiZWluZyByZXZlcnRlZCBpbiB0aGUgX2luaXRUd2VlbigpIG9mIHRoZSBjb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHVuY2FjaGUgdHJhbnNmb3Jtcy4gVGhpcyBpcyBwdXJlbHkgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gICAgfVxuICB9XG59LFxuICAgIF9nZXRTdHlsZVNhdmVyID0gZnVuY3Rpb24gX2dldFN0eWxlU2F2ZXIodGFyZ2V0LCBwcm9wZXJ0aWVzKSB7XG4gIHZhciBzYXZlciA9IHtcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcm9wczogW10sXG4gICAgcmV2ZXJ0OiBfcmV2ZXJ0U3R5bGUsXG4gICAgc2F2ZTogX3NhdmVTdHlsZVxuICB9O1xuICB0YXJnZXQuX2dzYXAgfHwgZ3NhcC5jb3JlLmdldENhY2hlKHRhcmdldCk7IC8vIGp1c3QgbWFrZSBzdXJlIHRoZXJlJ3MgYSBfZ3NhcCBjYWNoZSBkZWZpbmVkIGJlY2F1c2Ugd2UgcmVhZCBmcm9tIGl0IGluIF9zYXZlU3R5bGUoKSBhbmQgaXQncyBtb3JlIGVmZmljaWVudCB0byBqdXN0IGNoZWNrIGl0IGhlcmUgb25jZS5cblxuICBwcm9wZXJ0aWVzICYmIHRhcmdldC5zdHlsZSAmJiB0YXJnZXQubm9kZVR5cGUgJiYgcHJvcGVydGllcy5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBzYXZlci5zYXZlKHApO1xuICB9KTsgLy8gbWFrZSBzdXJlIGl0J3MgYSBET00gbm9kZSB0b28uXG5cbiAgcmV0dXJuIHNhdmVyO1xufSxcbiAgICBfc3VwcG9ydHMzRCxcbiAgICBfY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50KHR5cGUsIG5zKSB7XG4gIHZhciBlID0gX2RvYy5jcmVhdGVFbGVtZW50TlMgPyBfZG9jLmNyZWF0ZUVsZW1lbnROUygobnMgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIpLnJlcGxhY2UoL15odHRwcy8sIFwiaHR0cFwiKSwgdHlwZSkgOiBfZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vc29tZSBzZXJ2ZXJzIHN3YXAgaW4gaHR0cHMgZm9yIGh0dHAgaW4gdGhlIG5hbWVzcGFjZSB3aGljaCBjYW4gYnJlYWsgdGhpbmdzLCBtYWtpbmcgXCJzdHlsZVwiIGluYWNjZXNzaWJsZS5cblxuICByZXR1cm4gZSAmJiBlLnN0eWxlID8gZSA6IF9kb2MuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy9zb21lIGVudmlyb25tZW50cyB3b24ndCBhbGxvdyBhY2Nlc3MgdG8gdGhlIGVsZW1lbnQncyBzdHlsZSB3aGVuIGNyZWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSBpbiB3aGljaCBjYXNlIHdlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNyZWF0ZUVsZW1lbnQoKSB0byB3b3JrIGFyb3VuZCB0aGUgaXNzdWUuIEFsc28gbm90ZSB0aGF0IHdoZW4gR1NBUCBpcyBlbWJlZGRlZCBkaXJlY3RseSBpbnNpZGUgYW4gU1ZHIGZpbGUsIGNyZWF0ZUVsZW1lbnQoKSB3b24ndCBhbGxvdyBhY2Nlc3MgdG8gdGhlIHN0eWxlIG9iamVjdCBpbiBGaXJlZm94IChzZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjAyMTUtcHJvYmxlbS11c2luZy10d2Vlbm1heC1pbi1zdGFuZGFsb25lLXNlbGYtY29udGFpbmluZy1zdmctZmlsZS1lcnItY2Fubm90LXNldC1wcm9wZXJ0eS1jc3N0ZXh0LW9mLXVuZGVmaW5lZC8pLlxufSxcbiAgICBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHNraXBQcmVmaXhGYWxsYmFjaykge1xuICB2YXIgY3MgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gIHJldHVybiBjc1twcm9wZXJ0eV0gfHwgY3MuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eS5yZXBsYWNlKF9jYXBzRXhwLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKSB8fCBjcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSB8fCAhc2tpcFByZWZpeEZhbGxiYWNrICYmIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX2NoZWNrUHJvcFByZWZpeChwcm9wZXJ0eSkgfHwgcHJvcGVydHksIDEpIHx8IFwiXCI7IC8vY3NzIHZhcmlhYmxlcyBtYXkgbm90IG5lZWQgY2FwcyBzd2FwcGVkIG91dCBmb3IgZGFzaGVzIGFuZCBsb3dlcmNhc2UuXG59LFxuICAgIF9wcmVmaXhlcyA9IFwiTyxNb3osbXMsTXMsV2Via2l0XCIuc3BsaXQoXCIsXCIpLFxuICAgIF9jaGVja1Byb3BQcmVmaXggPSBmdW5jdGlvbiBfY2hlY2tQcm9wUHJlZml4KHByb3BlcnR5LCBlbGVtZW50LCBwcmVmZXJQcmVmaXgpIHtcbiAgdmFyIGUgPSBlbGVtZW50IHx8IF90ZW1wRGl2LFxuICAgICAgcyA9IGUuc3R5bGUsXG4gICAgICBpID0gNTtcblxuICBpZiAocHJvcGVydHkgaW4gcyAmJiAhcHJlZmVyUHJlZml4KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9XG5cbiAgcHJvcGVydHkgPSBwcm9wZXJ0eS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cigxKTtcblxuICB3aGlsZSAoaS0tICYmICEoX3ByZWZpeGVzW2ldICsgcHJvcGVydHkgaW4gcykpIHt9XG5cbiAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IChpID09PSAzID8gXCJtc1wiIDogaSA+PSAwID8gX3ByZWZpeGVzW2ldIDogXCJcIikgKyBwcm9wZXJ0eTtcbn0sXG4gICAgX2luaXRDb3JlID0gZnVuY3Rpb24gX2luaXRDb3JlKCkge1xuICBpZiAoX3dpbmRvd0V4aXN0cygpICYmIHdpbmRvdy5kb2N1bWVudCkge1xuICAgIF93aW4gPSB3aW5kb3c7XG4gICAgX2RvYyA9IF93aW4uZG9jdW1lbnQ7XG4gICAgX2RvY0VsZW1lbnQgPSBfZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICBfdGVtcERpdiA9IF9jcmVhdGVFbGVtZW50KFwiZGl2XCIpIHx8IHtcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG4gICAgX3RlbXBEaXZTdHlsZXIgPSBfY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBfdHJhbnNmb3JtUHJvcCA9IF9jaGVja1Byb3BQcmVmaXgoX3RyYW5zZm9ybVByb3ApO1xuICAgIF90cmFuc2Zvcm1PcmlnaW5Qcm9wID0gX3RyYW5zZm9ybVByb3AgKyBcIk9yaWdpblwiO1xuICAgIF90ZW1wRGl2LnN0eWxlLmNzc1RleHQgPSBcImJvcmRlci13aWR0aDowO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7cGFkZGluZzowXCI7IC8vbWFrZSBzdXJlIHRvIG92ZXJyaWRlIGNlcnRhaW4gcHJvcGVydGllcyB0aGF0IG1heSBjb250YW1pbmF0ZSBtZWFzdXJlbWVudHMsIGluIGNhc2UgdGhlIHVzZXIgaGFzIG92ZXJyZWFjaGluZyBzdHlsZSBzaGVldHMuXG5cbiAgICBfc3VwcG9ydHMzRCA9ICEhX2NoZWNrUHJvcFByZWZpeChcInBlcnNwZWN0aXZlXCIpO1xuICAgIF9yZXZlcnRpbmcgPSBnc2FwLmNvcmUucmV2ZXJ0aW5nO1xuICAgIF9wbHVnaW5Jbml0dGVkID0gMTtcbiAgfVxufSxcbiAgICBfZ2V0UmVwYXJlbnRlZENsb25lQkJveCA9IGZ1bmN0aW9uIF9nZXRSZXBhcmVudGVkQ2xvbmVCQm94KHRhcmdldCkge1xuICAvL3dvcmtzIGFyb3VuZCBpc3N1ZXMgaW4gc29tZSBicm93c2VycyAobGlrZSBGaXJlZm94KSB0aGF0IGRvbid0IGNvcnJlY3RseSByZXBvcnQgZ2V0QkJveCgpIG9uIFNWRyBlbGVtZW50cyBpbnNpZGUgYSA8ZGVmcz4gZWxlbWVudCBhbmQvb3IgPG1hc2s+LiBXZSB0cnkgY3JlYXRpbmcgYW4gU1ZHLCBhZGRpbmcgaXQgdG8gdGhlIGRvY3VtZW50RWxlbWVudCBhbmQgdG9zcyB0aGUgZWxlbWVudCBpbiB0aG
4674VyZSBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBwYXJ0IG9mIHRoZSByZW5kZXJpbmcgdHJlZSwgdGhlbiBncmFiIHRoZSBiYm94IGFuZCBpZiBpdCB3b3Jrcywgd2UgYWN0dWFsbHkgc3dhcCBvdXQgdGhlIG9yaWdpbmFsIGdldEJCb3goKSBtZXRob2QgZm9yIG91ciBvd24gdGhhdCBkb2VzIHRoZXNlIGV4dHJhIHN0ZXBzIHdoZW5ldmVyIGdldEJCb3ggaXMgbmVlZGVkLiBUaGlzIGhlbHBzIGVuc3VyZSB0aGF0IHBlcmZvcm1hbmNlIGlzIG9wdGltYWwgKG9ubHkgZG8gYWxsIHRoZXNlIGV4dHJhIHN0ZXBzIHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuLi5tb3N0IGVsZW1lbnRzIGRvbid0IG5lZWQgaXQpLlxuICB2YXIgb3duZXIgPSB0YXJnZXQub3duZXJTVkdFbGVtZW50LFxuICAgICAgc3ZnID0gX2NyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgb3duZXIgJiYgb3duZXIuZ2V0QXR0cmlidXRlKFwieG1sbnNcIikgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSxcbiAgICAgIGNsb25lID0gdGFyZ2V0LmNsb25lTm9kZSh0cnVlKSxcbiAgICAgIGJib3g7XG5cbiAgY2xvbmUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgc3ZnLmFwcGVuZENoaWxkKGNsb25lKTtcblxuICBfZG9jRWxlbWVudC5hcHBlbmRDaGlsZChzdmcpO1xuXG4gIHRyeSB7XG4gICAgYmJveCA9IGNsb25lLmdldEJCb3goKTtcbiAgfSBjYXRjaCAoZSkge31cblxuICBzdmcucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuXG4gIF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHN2Zyk7XG5cbiAgcmV0dXJuIGJib3g7XG59LFxuICAgIF9nZXRBdHRyaWJ1dGVGYWxsYmFja3MgPSBmdW5jdGlvbiBfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgYXR0cmlidXRlc0FycmF5KSB7XG4gIHZhciBpID0gYXR0cmlidXRlc0FycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgaWYgKHRhcmdldC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlc0FycmF5W2ldKSkge1xuICAgICAgcmV0dXJuIHRhcmdldC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlc0FycmF5W2ldKTtcbiAgICB9XG4gIH1cbn0sXG4gICAgX2dldEJCb3ggPSBmdW5jdGlvbiBfZ2V0QkJveCh0YXJnZXQpIHtcbiAgdmFyIGJvdW5kcywgY2xvbmVkO1xuXG4gIHRyeSB7XG4gICAgYm91bmRzID0gdGFyZ2V0LmdldEJCb3goKTsgLy9GaXJlZm94IHRocm93cyBlcnJvcnMgaWYgeW91IHRyeSBjYWxsaW5nIGdldEJCb3goKSBvbiBhbiBTVkcgZWxlbWVudCB0aGF0J3Mgbm90IHJlbmRlcmVkIC
4674hsaWtlIGluIGEgPHN5bWJvbD4gb3IgPGRlZnM+KS4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjEyMTE4XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgYm91bmRzID0gX2dldFJlcGFyZW50ZWRDbG9uZUJCb3godGFyZ2V0KTtcbiAgICBjbG9uZWQgPSAxO1xuICB9XG5cbiAgYm91bmRzICYmIChib3VuZHMud2lkdGggfHwgYm91bmRzLmhlaWdodCkgfHwgY2xvbmVkIHx8IChib3VuZHMgPSBfZ2V0UmVwYXJlbnRlZENsb25lQkJveCh0YXJnZXQpKTsgLy9zb21lIGJyb3dzZXJzIChsaWtlIEZpcmVmb3gpIG1pc3JlcG9ydCB0aGUgYm91bmRzIGlmIHRoZSBlbGVtZW50IGhhcyB6ZXJvIHdpZHRoIGFuZCBoZWlnaHQgKGl0IGp1c3QgYXNzdW1lcyBpdCdzIGF0IHg6MCwgeTowKSwgdGh1cyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGdyYWIgdGhlIHBvc2l0aW9uIGluIHRoYXQgY2FzZS5cblxuICByZXR1cm4gYm91bmRzICYmICFib3VuZHMud2lkdGggJiYgIWJvdW5kcy54ICYmICFib3VuZHMueSA/IHtcbiAgICB4OiArX2dldEF0dHJpYnV0ZUZhbGxiYWNrcyh0YXJnZXQsIFtcInhcIiwgXCJjeFwiLCBcIngxXCJdKSB8fCAwLFxuICAgIHk6ICtfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgW1wieVwiLCBcImN5XCIsIFwieTFcIl0pIHx8IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH0gOiBib3VuZHM7XG59LFxuICAgIF9pc1NWRyA9IGZ1bmN0aW9uIF9pc1NWRyhlKSB7XG4gIHJldHVybiAhIShlLmdldENUTSAmJiAoIWUucGFyZW50Tm9kZSB8fCBlLm93bmVyU1ZHRWxlbWVudCkgJiYgX2dldEJCb3goZSkpO1xufSxcbiAgICAvL3JlcG9ydHMgaWYgdGhlIGVsZW1lbnQgaXMgYW4gU1ZHIG9uIHdoaWNoIGdldEJCb3goKSBhY3R1YWxseSB3b3Jrc1xuX3JlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24gX3JlbW92ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHkpIHtcbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgdmFyIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgICBmaXJzdDJDaGFycztcblxuICAgIGlmIChwcm9wZXJ0eSBpbiBfdHJhbnNmb3JtUHJvcHMgJiYgcHJvcGVydHkgIT09IF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSB7XG4gICAgICBwcm9wZXJ0eSA9IF90cmFuc2Zvcm1Qcm9wO1xuICAgIH1cblxuICAgIGlmIChzdHlsZS5yZW1vdmVQcm9wZXJ0eSkge1xuICAgICAgZmlyc3QyQ2hhcnMgPSBwcm9wZXJ0eS5zdWJzdHIoMCwgMik7XG5cbiAgICAgIGlmIChmaXJzdDJDaGFycyA9PT0gXCJtc1wiIHx8IHByb3BlcnR5LnN1YnN0cigwLCA2KSA9PT0gXCJ3ZWJraXRcIikge1xuICAgICAgICAvL01pY3Jvc29mdCBhbmQgc29tZSBXZWJraXQgYnJvd3NlcnMgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3RhbmRhcmQgb2YgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBwcmVmaXggY2hhcmFjdGVyLCBzbyB3ZSBhZGp1c3Qgc28gdGhhdCB3aGVuIHdlIHByZWZpeCB0aGUgY2FwcyB3aXRoIGEgZGFzaCwgaXQncyBjb3JyZWN0IChvdGhlcndpc2UgaXQnZCBiZSBcIm1zLXRyYW5zZm9ybVwiIGluc3RlYWQgb2YgXCItbXMtdHJhbnNmb3JtXCIgZm9yIElFOSwgZm9yIGV4YW1wbGUpXG4gICAgICAgIHByb3BlcnR5ID0gXCItXCIgKyBwcm9wZXJ0eTtcbiAgICAgIH1cblxuICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoZmlyc3QyQ2hhcnMgPT09IFwiLS1cIiA/IHByb3BlcnR5IDogcHJvcGVydHkucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90ZTogb2xkIHZlcnNpb25zIG9mIElFIHVzZSBcInJlbW92ZUF0dHJpYnV0ZSgpXCIgaW5zdGVhZCBvZiBcInJlbW92ZVByb3BlcnR5KClcIlxuICAgICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbn0sXG4gICAgX2FkZE5vblR3ZWVuaW5nUFQgPSBmdW5jdGlvbiBfYWRkTm9uVHdlZW5pbmdQVChwbHVnaW4sIHRhcmdldCwgcHJvcGVydHksIGJlZ2lubmluZywgZW5kLCBvbmx5U2V0QXRFbmQpIHtcbiAgdmFyIHB0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIHByb3BlcnR5LCAwLCAxLCBvbmx5U2V0QXRFbmQgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlKTtcbiAgcGx1Z2luLl9wdCA9IHB0O1xuICBwdC5iID0gYmVnaW5uaW5nO1xuICBwdC5lID0gZW5kO1xuXG4gIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgcmV0dXJuIHB0O1xufSxcbiAgICBfbm9uQ29udmVydGlibGVVbml0cyA9IHtcbiAgZGVnOiAxLFxuICByYWQ6IDEsXG4gIHR1cm46IDFcbn0sXG4gICAgX25vblN0YW5kYXJkTGF5b3V0cyA9IHtcbiAgZ3JpZDogMSxcbiAgZmxleDogMVxufSxcbiAgICAvL3Rha2VzIGEgc2luZ2xlIHZhbHVlIGxpa2UgMjBweCBhbmQgY29udmVydHMgaXQgdG8gdGhlIHVuaXQgc3BlY2lmaWVkLCBsaWtlIFwiJVwiLCByZXR1cm5pbmcgb25seSB0aGUgbnVtZXJpYyBhbW91bnQuXG5fY29udmVydFRvVW5pdCA9IGZ1bmN0aW9uIF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCB1bml0KSB7XG4gIHZhciBjdXJWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpIHx8IDAsXG4gICAgICBjdXJVbml0ID0gKHZhbHVlICsgXCJcIikudHJpbSgpLnN1YnN0cigoY3VyVmFsdWUgKyBcIlwiKS5sZW5ndGgpIHx8IFwicHhcIixcbiAgICAgIC8vIHNvbWUgYnJvd3NlcnMgbGVhdmUgZXh0cmEgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIENTUyB2YXJpYWJsZXMsIGhlbmNlIHRoZSBuZWVkIHRvIHRyaW0oKVxuICBzdHlsZSA9IF90ZW1wRGl2LnN0eWxlLFxuICAgICAgaG9yaXpvbnRhbCA9IF9ob3Jpem9udGFsRXhwLnRlc3QocHJvcGVydHkpLFxuICAgICAgaXNSb290U1ZHID0gdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIixcbiAgICAgIG1lYXN1cmVQcm9wZXJ0eSA9IChpc1Jvb3RTVkcgPyBcImNsaWVudFwiIDogXCJvZmZzZXRcIikgKyAoaG9yaXpvbnRhbCA/IFwiV2lkdGhcIiA6IFwiSGVpZ2h0XCIpLFxuICAgICAgYW1vdW50ID0gMTAwLFxuICAgICAgdG9QaXhlbHMgPSB1bml0ID09PSBcInB4XCIsXG4gICAgICB0b1BlcmNlbnQgPSB1bml0ID09PSBcIiVcIixcbiAgICAgIHB4LFxuICAgICAgcGFyZW50LFxuICAgICAgY2FjaGUsXG4gICAgICBpc1NWRztcblxuICBpZiAodW5pdCA9PT0gY3VyVW5pdCB8fCAhY3VyVmFsdWUgfHwgX25vbkNvbnZlcnRpYmxlVW5pdHNbdW5pdF0gfHwgX25vbkNvbnZlcnRpYmxlVW5pdHNbY3VyVW5pdF0pIHtcbiAgICByZXR1cm4gY3VyVmFsdWU7XG4gIH1cblxuICBjdXJVbml0ICE9PSBcInB4XCIgJiYgIXRvUGl4ZWxzICYmIChjdXJWYWx1ZSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBcInB4XCIpKTtcbiAgaXNTVkcgPSB0YXJnZXQuZ2V0Q1RNICYmIF9pc1NWRyh0YXJnZXQpO1xuXG4gIGlmICgodG9QZXJjZW50IHx8IGN1clVuaXQgPT09IFwiJVwiKSAmJiAoX3RyYW5zZm9ybVByb3BzW3Byb3BlcnR5XSB8fCB+cHJvcGVydHkuaW5kZXhPZihcImFkaXVzXCIpKSkge1xuICAgIHB4ID0gaXNTVkcgPyB0YXJnZXQuZ2V0QkJveCgpW2hvcml6b250YWwgPyBcIndpZHRoXCIgOiBcImhlaWdodFwiXSA6IHRhcmdldFttZWFzdXJlUHJvcGVydHldO1xuICAgIHJldHVybi
4674Bfcm91bmQodG9QZXJjZW50ID8gY3VyVmFsdWUgLyBweCAqIGFtb3VudCA6IGN1clZhbHVlIC8gMTAwICogcHgpO1xuICB9XG5cbiAgc3R5bGVbaG9yaXpvbnRhbCA/IFwid2lkdGhcIiA6IFwiaGVpZ2h0XCJdID0gYW1vdW50ICsgKHRvUGl4ZWxzID8gY3VyVW5pdCA6IHVuaXQpO1xuICBwYXJlbnQgPSB1bml0ICE9PSBcInJlbVwiICYmIH5wcm9wZXJ0eS5pbmRleE9mKFwiYWRpdXNcIikgfHwgdW5pdCA9PT0gXCJlbVwiICYmIHRhcmdldC5hcHBlbmRDaGlsZCAmJiAhaXNSb290U1ZHID8gdGFyZ2V0IDogdGFyZ2V0LnBhcmVudE5vZGU7XG5cbiAgaWYgKGlzU1ZHKSB7XG4gICAgcGFyZW50ID0gKHRhcmdldC5vd25lclNWR0VsZW1lbnQgfHwge30pLnBhcmVudE5vZGU7XG4gIH1cblxuICBpZiAoIXBhcmVudCB8fCBwYXJlbnQgPT09IF9kb2MgfHwgIXBhcmVudC5hcHBlbmRDaGlsZCkge1xuICAgIHBhcmVudCA9IF9kb2MuYm9keTtcbiAgfVxuXG4gIGNhY2hlID0gcGFyZW50Ll9nc2FwO1xuXG4gIGlmIChjYWNoZSAmJiB0b1BlcmNlbnQgJiYgY2FjaGUud2lkdGggJiYgaG9yaXpvbnRhbCAmJiBjYWNoZS50aW1lID09PSBfdGlja2VyLnRpbWUgJiYgIWNhY2hlLnVuY2FjaGUpIHtcbiAgICByZXR1cm4gX3JvdW5kKGN1clZhbHVlIC8gY2FjaGUud2lkdGggKiBhbW91bnQpO1xuICB9IGVsc2Uge1xuICAgIGlmICh0b1BlcmNlbnQgJiYgKHByb3BlcnR5ID09PSBcImhlaWdodFwiIHx8IHByb3BlcnR5ID09PSBcIndpZHRoXCIpKSB7XG4gICAgICAvLyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggd2lkdGgvaGVpZ2h0IHRoYXQncyBpbnNpZGUgYSBjb250YWluZXIgd2l0aCBwYWRkaW5nIGFuZC9vciBpdCdzIGEgZmxleGJveC9ncmlkIGNvbnRhaW5lciwgd2UgbXVzdCBhcHBseSBpdCB0byB0aGUgdGFyZ2V0IGl0c2VsZiByYXRoZXIgdGhhbiB0aGUgX3RlbXBEaXYgaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBsZXRlIGFjY3VyYWN5LCBmYWN0b3JpbmcgaW4gdGhlIHBhcmVudCdzIHBhZGRpbmcuXG4gICAgICB2Y
4674XIgdiA9IHRhcmdldC5zdHlsZVtwcm9wZXJ0eV07XG4gICAgICB0YXJnZXQuc3R5bGVbcHJvcGVydHldID0gYW1vdW50ICsgdW5pdDtcbiAgICAgIHB4ID0gdGFyZ2V0W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgICB2ID8gdGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSA9IHYgOiBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICh0b1BlcmNlbnQgfHwgY3VyVW5pdCA9PT0gXCIlXCIpICYmICFfbm9uU3RhbmRhcmRMYXlvdXRzW19nZXRDb21wdXRlZFByb3BlcnR5KHBhcmVudCwgXCJkaXNwbGF5XCIpXSAmJiAoc3R5bGUucG9zaXRpb24gPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIFwicG9zaXRpb25cIikpO1xuICAgICAgcGFyZW50ID09PSB0YXJnZXQgJiYgKHN0eWxlLnBvc2l0aW9uID0gXCJzdGF0aWNcIik7IC8vIGxpa2UgZm9yIGJvcmRlclJhZGl1cywgaWYgaXQncyBhICUgd2UgbXVzdCBoYXZlIGl0IHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgaXRzZWxmIGJ1dCB0aGF0IG1heSBub3QgaGF2ZSBwb3NpdGlvbjogcmVsYXRpdmUgb3IgcG9zaXRpb246IGFic29sdXRlIGluIHdoaWNoIGNhc2UgaXQnZCBnbyB1cCB0aGUgY2hhaW4gdW50aWwgaXQgZmluZHMgaXRzIG9mZnNldFBhcmVudCAoYmFkKS4gcG9zaXRpb246IHN0YXRpYyBwcm90ZWN0cyBhZ2FpbnN0IHRoYXQuXG5cbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChfdGVtcERpdik7XG4gICAgICBweCA9IF90ZW1wRGl2W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoX3RlbXBEaXYpO1xuICAgICAgc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgfVxuXG4gICAgaWYgKGhvcml6b250YWwgJiYgdG9QZXJjZW50KSB7XG4gICAgICBjYWNoZSA9IF9nZXRDYWNoZShwYXJlbnQpO1xuICAgICAgY2FjaGUudGltZSA9IF90aWNrZXIudGltZTtcbiAgICAgIGNhY2hlLndpZHRoID0gcGFyZW50W21lYXN1cmVQcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9yb3VuZCh0b1BpeGVscyA/IHB4ICogY3VyVmFsdWUgLyBhbW91bnQgOiBweCAmJiBjdXJWYWx1ZSA/IGFtb3VudCAvIHB4ICogY3VyVmFsdWUgOiAwKTtcbn0sXG4gICAgX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkge1xuICB2YXIgdmFsdWU7XG4gIF9wbHVnaW5Jbml0dGVkIHx8IF9pbml0Q29yZSgpO1xuXG4gIGlmIChwcm9wZXJ0eSBpbiBfcHJvcGVydHlBbGlhc2VzICYmIHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgcHJvcGVydHkgPSBfcHJvcGVydHlBbGlhc2VzW3Byb3BlcnR5XTtcblxuICAgIGlmICh+cHJvcGVydHkuaW5kZXhPZihcIixcIikpIHtcbiAgICAgIHByb3BlcnR5ID0gcHJvcGVydHkuc3BsaXQoXCIsXCIpWzBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfdHJhbnNmb3JtUHJvcHNbcHJvcGVydHldICYmIHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgdmFsdWUgPSBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB1bmNhY2hlKTtcbiAgICB2YWx1ZSA9IHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybU9yaWdpblwiID8gdmFsdWVbcHJvcGVydHldIDogdmFsdWUuc3ZnID8gdmFsdWUub3JpZ2luIDogX2ZpcnN0VHdvT25seShfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSkgKyBcIiBcIiArIHZhbHVlLnpPcmlnaW4gKyBcInB4XCI7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0YXJnZXQuc3R5bGVbcHJvcGVydHldO1xuXG4gICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gXCJhdXRvXCIgfHwgdW5jYWNoZSB8fCB+KHZhbHVlICsgXCJcIikuaW5kZXhPZihcImNhbGMoXCIpKSB7XG4gICAgICB2YWx1ZSA9IF9zcGVjaWFsUHJvcHNbcHJvcGVydHldICYmIF9zcGVjaWFsUHJvcHNbcHJvcGVydHldKHRhcmdldCwgcHJvcGVydHksIHVuaXQpIHx8IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHkpIHx8IF9nZXRQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5KSB8fCAocHJvcGVydHkgPT09IFwib3BhY2l0eVwiID8gMSA6IDApOyAvLyBub3RlOiBzb21lIGJyb3dzZXJzLCBsaWtlIEZpcmVmb3gsIGRvbid0IHJlcG9ydCBib3JkZXJSYWRpdXMgY29ycmVjdGx5ISBJbnN0ZWFkLCBpdCBvbmx5IHJlcG9ydHMgZXZlcnkgY29ybmVyIGxpa2UgIGJvcmRlclRvcExlZnRSYWRpdXNcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5pdCAmJiAhfih2YWx1ZSArIFwiXCIpLnRyaW0oKS5pbmRleE9mKFwiIFwiKSA/IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCB1bml0KSArIHVuaXQgOiB2YWx1ZTtcbn0sXG4gICAgX3R3ZWVuQ29tcGxleENTU1N0cmluZyA9IGZ1bmN0aW9uIF90d2VlbkNvbXBsZXhDU1NTdHJpbmcodGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kKSB7XG4gIC8vIG5vdGU6IHdlIGNhbGwgX3R3ZWVuQ29tcGxleENTU1N0cmluZy5jYWxsKHBsdWdpbkluc3RhbmNlLi4uKSB0byBlbnN1cmUgdGhhdCBpdCdzIHNjb3BlZCBwcm9wZXJseS4gV2UgbWF5IGNhbGwgaXQgZnJvbSB3aXRoaW4gYSBwbHVnaW4gdG9vLCB0aHVzIFwidGhpc1wiIHdvdWxkIHJlZmVyIHRvIHRoZSBwbHVnaW4uXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPT09IFwibm9uZVwiKSB7XG4gICAgLy8gc29tZSBicm93c2VycyBsaWtlIFNhZmFyaSBhY3R1YWxseSBQUkVGRVIgdGhlIHByZWZpeGVkIHByb3BlcnR5IGFuZCBtaXMtcmVwb3J0IHRoZSB1bnByZWZpeGVkIHZhbHVlIGxpa2UgY2xpcFBhdGggKEJVRykuIEluIG90aGVyIHdvcmRzLCBldmVuIHRob3VnaCBjbGlwUGF0aCBleGlzdHMgaW4gdGhlIHN0eWxlIChcImNsaXBQYXRoXCIgaW4gdGFyZ2V0LnN0eWxlKSBhbmQgaXQncyBzZXQgaW4gdGhlIENTUyBwcm9wZXJseSAoYWxvbmcgd2l0aCAtd2Via2l0LWNsaXAtcGF0aCksIFNhZmFyaSByZXBvcnRzIGNsaXBQYXRoIGFzIFwibm9uZVwiIHdoZXJlYXMgV2Via2l0Q2xpcFBhdGggcmVwb3J0cyBhY2N1cmF0ZWx5IGxpa2UgXCJlbGxpcHNlKDEwMCUgMCUgYXQgNTAlIDAlKVwiLCBzbyBpbiB0aGlzIGNhc2Ugd2UgbXVzdCBTV0lUQ0ggdG8gdXNpbmcgdGhlIHByZWZpeGVkIHByb3BlcnR5IGluc3RlYWQuIFNlZSBodHRwczovL2dzYXAuY29tL2ZvcnVtcy90b3BpYy8xODMxMC1jbGlwcGF0aC1kb2VzbnQtd29yay1vbi1pb3MvXG4gICAgdmFyIHAgPSBfY2hlY2tQcm9wUHJlZml4KHByb3AsIHRhcmdldCwgMSksXG4gICAgICAgI
4674HMgPSBwICYmIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcCwgMSk7XG5cbiAgICBpZiAocyAmJiBzICE9PSBzdGFydCkge1xuICAgICAgcHJvcCA9IHA7XG4gICAgICBzdGFydCA9IHM7XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSBcImJvcmRlckNvbG9yXCIpIHtcbiAgICAgIHN0YXJ0ID0gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBcImJvcmRlclRvcENvbG9yXCIpOyAvLyBGaXJlZm94IGJ1ZzogYWx3YXlzIHJlcG9ydHMgXCJib3JkZXJDb2xvclwiIGFzIFwiXCIsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvIGJvcmRlclRvcENvbG9yLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjQ1ODMtaG93LXRvLXJldHVybi1jb2xvcnMtdGhhdC1pLWhhZC1hZnRlci1yZXZlcnNlL1xuICAgIH1cbiAgfVxuXG4gIHZhciBwdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIHRhcmdldC5zdHlsZSwgcHJvcCwgMCwgMSwgX3JlbmRlckNvbXBsZXhTdHJpbmcpLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbWF0Y2hJbmRleCA9IDAsXG4gICAgICBhLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RhcnRWYWx1ZXMsXG4gICAgICBzdGFydE51bSxcbiAgICAgIGNvbG9yLFxuICAgICAgc3RhcnRWYWx1ZSxcbiAgICAgIGVuZFZhbHVlLFxuICAgICAgZW5kTnVtLFxuICAgICAgY2h1bmssXG4gICAgICBlbmRVbml0LFxuICAgICAgc3RhcnRVbml0LFxuICAgICAgZW5kVmFsdWVzO1xuICBwdC5iID0gc3RhcnQ7XG4gIHB0LmUgPSBlbmQ7XG4gIHN0YXJ0ICs9IFwiXCI7IC8vIGVuc3VyZSB2YWx1ZXMgYXJlIHN0cmluZ3NcblxuICBlbmQgKz0gXCJcIjtcblxuICBpZiAoZW5kLnN1YnN0cmluZygwLCA2KSA9PT0gXCJ2YXIoLS1cIikge1xuICAgIGVuZCA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgZW5kLnN1YnN0cmluZyg0LCBlbmQuaW5kZXhPZihcIilcIikpKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgc3RhcnRWYWx1ZSA9IHRhcmdldC5zdHlsZVtwcm9wXTtcbiAgICB0YXJnZXQuc3R5bGVbcHJvcF0gPSBlbmQ7XG4gICAgZW5kID0gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBwcm9wKSB8fCBlbmQ7XG4gICAgc3RhcnRWYWx1ZSA/IHRhcmdldC5zdHlsZVtwcm9wXSA9IHN0YXJ0VmFsdWUgOiBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcbiAgfVxuXG4gIGEgPSBbc3RhcnQsIGVuZF07XG5cbiAgX2NvbG9yU3RyaW5nRmlsdGVyKGEpOyAvLyBwYXNzIGFuIGFycmF5IHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzIGFuZCBsZXQgdGhlIGZpbHRlciBkbyB3aGF0ZXZlciBpdCBuZWVkcyB0byB0aGUgdmFsdWVzLiBJZiBjb2xvcnMgYXJlIGZvdW5kLCBpdCByZXR1cm5zIHRydWUgYW5kIHRoZW4gd2UgbXVzdCBtYXRjaCB3aGVyZSB0aGUgY29sb3Igc2hvd3MgdXAgb3JkZXItd2lzZSBiZWNhdXNlIGZvciB0aGluZ3MgbGlrZSBib3hTaGFkb3csIHNvbWV0aW1lcyB0aGUgYnJvd3NlciBwcm92aWRlcyB0aGUgY29tcHV0ZWQgdmFsdWVzIHdpdGggdGhlIGNvbG9yIEZJUlNULCBidXQgdGhlIHVzZXIgcHJvdmlkZXMgaXQgd2l0aCB0aGUgY29sb3IgTEFTVCwgc28gZmxpcCB0aGVtIGlmIG5lY2Vzc2FyeS4gU2FtZSBmb3IgZHJvcC1zaGFkb3coKS5cblxuXG4gIHN0YXJ0ID0gYVswXTtcbiAgZW5kID0gYVsxXTtcbiAgc3RhcnRWYWx1ZXMgPSBzdGFydC5tYXRjaChfbnVtV2l0aFVuaXRFeHApIHx8IFtdO1xuICBlbmRWYWx1ZXMgPSBlbmQubWF0Y2goX251bVdpdGhVbml0RXhwKSB8fCBbXTtcblxuICBpZiAoZW5kVmFsdWVzLmxlbmd0aCkge1xuICAgIHdoaWxlIChyZXN1bHQgPSBfbnVtV2l0aFVuaXRFeHAuZXhlYyhlbmQpKSB7XG4gICAgICBlbmRWYWx1ZSA9IHJlc3VsdFswXTtcbiAgICAgIGNodW5rID0gZW5kLnN1YnN0cmluZyhpbmRleCwgcmVzdWx0LmluZGV4KTtcblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIGNvbG9yID0gKGNvbG9yICsgMSkgJSA1O1xuICAgICAgfSBlbHNlIGlmIChjaHVuay5zdWJzdHIoLTUpID09PSBcInJnYmEoXCIgfHwgY2h1bmsuc3Vic3RyKC01KSA9PT0gXCJoc2xhKFwiKSB7XG4gICAgICAgIGNvbG9yID0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZFZhbHVlICE9PSAoc3RhcnRWYWx1ZSA9IHN0YXJ0VmFsdWVzW21hdGNoSW5kZXgrK10gfHwgXCJcIikpIHtcbiAgICAgICAgc3RhcnROdW0gPSBwYXJzZUZsb2F0KHN0YXJ0VmFsdWUpIHx8IDA7XG4gICAgICAgIHN0YXJ0VW5pdCA9IHN0YXJ0VmFsdWUuc3Vic3RyKChzdGFydE51bSArIFwiXCIpLmxlbmd0aCk7XG4gICAgICAgIGVuZFZhbHVlLmNoYXJBdCgxKSA9PT0gXCI9XCIgJiYgKGVuZFZhbHVlID0gX3BhcnNlUmVsYXRpdmUoc3RhcnROdW0sIG
4674VuZFZhbHVlKSArIHN0YXJ0VW5pdCk7XG4gICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgICBlbmRVbml0ID0gZW5kVmFsdWUuc3Vic3RyKChlbmROdW0gKyBcIlwiKS5sZW5ndGgpO1xuICAgICAgICBpbmRleCA9IF9udW1XaXRoVW5pdEV4cC5sYXN0SW5kZXggLSBlbmRVbml0Lmxlbmd0aDtcblxuICAgICAgICBpZiAoIWVuZFVuaXQpIHtcbiAgICAgICAgICAvL2lmIHNvbWV0aGluZyBsaWtlIFwicGVyc3BlY3RpdmU6MzAwXCIgaXMgcGFzc2VkIGluIGFuZCB3ZSBtdXN0IGFkZCBhIHVuaXQgdG8gdGhlIGVuZFxuICAgICAgICAgIGVuZFVuaXQgPSBlbmRVbml0IHx8IF9jb25maWcudW5pdHNbcHJvcF0gfHwgc3RhcnRVbml0O1xuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBlbmQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbmQgKz0gZW5kVW5pdDtcbiAgICAgICAgICAgIHB0LmUgKz0gZW5kVW5pdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRVbml0ICE9PSBlbmRVbml0KSB7XG4gICAgICAgICAgc3RhcnROdW0gPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIHByb3AsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpIHx8IDA7XG4gICAgICAgIH0gLy8gdGhlc2UgbmVzdGVkIFByb3BUd2VlbnMgYXJlIGhhbmRsZWQgaW4gYSBzcGVjaWFsIHdheSAtIHdlJ2xsIG5ldmVyIGFjdHVhbGx5IGNhbGwgYSByZW5kZXIgb3Igc2V0dGVyIG1ldGhvZCBvbiB0aGVtLiBXZSdsbCBqdXN0IGxvb3AgdGhyb3VnaCB0aGVtIGluIHRoZSBwYXJlbnQgY29tcGxleCBzdHJpbmcgUHJvcFR3ZWVuJ3MgcmVuZGVyIG1ldGhvZC5cblxuXG4gICAgICAgIHB0Ll9wdCA9IHtcbiAgICAgICAgICBfbmV4dDogcHQuX3B0LFxuICAgICAgICAgIHA6IGNodW5rIHx8IG1hdGNoSW5kZXggPT09IDEgPyBjaHVuayA6IFwiLFwiLFxuICAgICAgICAgIC8vbm90ZTogU1ZHIHNwZWMgYWxsb3dzIG9taXNzaW9uIG9mIGNvbW1hL3NwYWNlIHdoZW4gYSBuZWdhdGl2ZSBzaWduIGlzIHdlZGdlZCBiZXR3ZWVuIHR3byBudW1iZXJzLCBsaWtlIDIuNS01LjMgaW5zdGVhZCBvZiAyLjUsLTUuMyBidXQgd2hlbiB0d2VlbmluZywgdGhlIG5lZ2F0aXZlIHZhbHVlIG1heSBzd2l0Y2ggdG8gcG9zaXRpdmUsIHNvIHdlIGluc2VydCB0aGUgY29tbWEganVzdCBpbiBjYXNlLlxuICAgICAgICAgIHM6IHN0YXJ0TnVtLFxuICAgICAgICAgIGM6IGVuZE51bSAtIHN0YXJ0TnVtLFxuICAgICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCB8fCBwcm9wID09PSBcInpJbmRleFwiID8gTWF0aC5yb3VuZCA6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdC5jID0gaW5kZXggPCBlbmQubGVuZ3RoID8gZW5kLnN1YnN0cmluZyhpbmRleCwgZW5kLmxlbmd0aCkgOiBcIlwiOyAvL3dlIHVzZSB0aGUgXCJjXCIgb2YgdGhlIFByb3BUd2VlbiB0byBzdG9yZSB0aGUgZmluYWwgcGFydCBvZiB0aGUgc3RyaW5nIChhZnRlciB0aGUgbGFzdCBudW1iZXIpXG4gIH0gZWxzZSB7XG4gICAgcHQuciA9IHByb3AgPT09IFwiZGlzcGxheVwiICYmIGVuZCA9PT0gXCJub25lXCIgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlO1xuICB9XG5cbiAgX3JlbEV4cC50ZXN0KGVuZCkgJiYgKHB0LmUgPSAwKTsgLy9pZiB0aGUgZW5kIHN0cmluZyBjb250YWlucyByZWxhdGl2ZSB2YWx1ZXMgb3IgZHluYW1pYyByYW5kb20oLi4uKSB2YWx1ZXMsIGRlbGV0ZSB0aGUgZW5kIGl0IHNvIHRoYXQgb24gdGhlIGZpbmFsIHJlbmRlciB3ZSBkb24ndCBhY3R1YWxseSBzZXQgaXQgdG8gdGhlIHN0cmluZyB3aXRoICs9IG9yIC09IGNoYXJhY3RlcnMgKGZvcmNlcyBpdCB0byB1c2UgdGhlIGNhbGN1bGF0ZWQgdmFsdWUpLlxuXG4gIHRoaXMuX3B0ID0gcHQ7IC8vc3RhcnQgdGhlIGxpbmtlZCBsaXN0IHdpdGggdGhpcyBuZXcgUHJvcFR3ZWVuLiBSZW1lbWJlciwgd2UgY2FsbCBfdHdlZW5Db21wbGV4Q1NTU3RyaW5nLmNhbGwocGx1Z2luSW5zdGFuY2UuLi4pIHRvIGVuc3VyZSB0aGF0IGl0J3Mgc2NvcGVkIHByb3Blcmx5LiBXZSBtYXkgY2FsbCBpdCBmcm9tIHdpdGhpbiBhbm90aGVyIHBsdWdpbiB0b28sIHRodXMgXCJ0aGlzXCIgd291bGQgcmVmZXIgdG8gdGhlIHBsdWdpbi5cblxuICByZXR1cm4gcHQ7XG59LFxuICAgIF9rZXl3b3JkVG9QZXJjZW50ID0ge1xuICB0b3A6IFwiMCVcIixcbiAgYm90dG9tOiBcIjEwMCVcIixcbiAgbGVmdDogXCIwJVwiLFxuICByaWdodDogXCIxMDAlXCIsXG4gIGNlbnRlcjogXCI1MCVcIlxufSxcbiAgICBfY29udmVydEtleXdvcmRzVG9QZXJjZW50YWdlcyA9IGZ1bmN0aW9uIF9jb252ZXJ0S2V5d29yZHNUb1BlcmNlbnRhZ2VzKHZhbHVlKSB7XG4gIHZhciBzcGxpdCA9IHZhbHVlLnNwbGl0KFwiIFwiKSxcbiAgICAgIHggPSBzcGxpdFswXSxcbiAgICAgIHkgPSBzcGxpdFsxXSB8fCBcIjUwJVwiO1xuXG4gIGlmICh4ID09PSBcInRvcFwiIHx8IHggPT09IFwiYm90dG9tXCIgfHwgeSA9PT0gXCJsZWZ0XCIgfHwgeSA9PT0gXCJyaWdodFwiKSB7XG4gICAgLy90aGUgdXNlciBwcm92aWRlZCB0aGVtIGluIHRoZSB3cm9uZyBvcmRlciwgc28gZmxpcCB0aGVtXG4gICAgdmFsdWUgPSB4O1xuICAgIHggPSB5O1xuICAgIHkgPSB2YWx1ZTtcbiAgfVxuXG4gIHNwbGl0WzBdID0gX2tleXdvcmRUb1BlcmNlbnRbeF0gfHwgeDtcbiAgc3BsaXRbMV0gPSBfa2V5d29yZFRvUGVyY2VudFt5XSB8fCB5O1xuICByZXR1cm4gc3BsaXQuam9pbihcIiBcIik7XG59LFxuICAgIF9yZW5kZXJDbGVhclByb3BzID0gZnVuY3Rpb24gX3JlbmRlckNsZWFyUHJvcHMocmF0aW8sIGRhdGEpIHtcbiAgaWYgKGRhdGEudHdlZW4gJiYgZGF0YS50d2Vlbi5fdGltZSA9PT0gZGF0YS50d2Vlbi5fZHVyKSB7XG4gICAgdmFyIHRhcmdldCA9IGRhdGEudCxcbiAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gICAgICAgIHByb3BzID0gZGF0YS51LFxuICAgICAgICBjYWNoZSA9IHRhcmdldC5fZ3NhcCxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2xlYXJUcmFuc2Zvcm1zLFxuICAgICAgICBpO1xuXG4gICAgaWYgKHByb3BzID09PSBcImFsbFwiIHx8IHByb3BzID09PSB0cnVlKSB7XG4gICAgICBzdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgIGNsZWFyVHJhbnNmb3JtcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3BzID0gcHJvcHMuc3BsaXQoXCIsXCIpO1xuICAgICAgaSA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKC0taSA+IC0xKSB7XG4gICAgICAgI
4674HByb3AgPSBwcm9wc1tpXTtcblxuICAgICAgICBpZiAoX3RyYW5zZm9ybVByb3BzW3Byb3BdKSB7XG4gICAgICAgICAgY2xlYXJUcmFuc2Zvcm1zID0gMTtcbiAgICAgICAgICBwcm9wID0gcHJvcCA9PT0gXCJ0cmFuc2Zvcm1PcmlnaW5cIiA/IF90cmFuc2Zvcm1PcmlnaW5Qcm9wIDogX3RyYW5zZm9ybVByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xlYXJUcmFuc2Zvcm1zKSB7XG4gICAgICBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBfdHJhbnNmb3JtUHJvcCk7XG5cbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjYWNoZS5zdmcgJiYgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcbiAgICAgICAgc3R5bGUuc2NhbGUgPSBzdHlsZS5yb3RhdGUgPSBzdHlsZS50cmFuc2xhdGUgPSBcIm5vbmVcIjtcblxuICAgICAgICBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCAxKTsgLy8gZm9yY2UgYWxsIHRoZSBjYWNoZWQgdmFsdWVzIGJhY2sgdG8gXCJub3JtYWxcIi9pZGVudGl0eSwgb3RoZXJ3aXNlIGlmIHRoZXJlJ3MgYW5vdGhlciB0d2VlbiB0aGF0J3MgYWxyZWFkeSBzZXQgdG8gcmVuZGVyIHRyYW5zZm9ybXMgb24gdGhpcyBlbGVtZW50LCBpdCBjb3VsZCBkaXNwbGF5IHRoZSB3cm9uZyB2YWx1ZXMuXG5cblxuICAgICAgICBjYWNoZS51bmNhY2hlID0gMTtcblxuICAgICAgICBfcmVtb3ZlSW5kZXBlbmRlbnRUcmFuc2Zvcm1zKHN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0sXG4gICAgLy8gbm90ZTogc3BlY2lhbFByb3BzIHNob3VsZCByZXR1cm4gMSBpZiAoYW5kIG9ubHkgaWYpIHRoZXkgaGF2ZSBhIG5vbi16ZXJvIHByaW9yaXR5LiBJdCBpbmRpY2F0ZXMgd2UgbmVlZCB0byBzb3J0IHRoZSBsaW5rZWQgbGlzdC5cbl9zcGVjaWFsUHJvcHMgPSB7XG4gIGNsZWFyUHJvcHM6IGZ1bmN0aW9uIGNsZWFyUHJvcHMocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBlbmRWYWx1ZSwgdHdlZW4pIHtcbiAgICBpZiAodHdlZW4uZGF0YSAhPT0gXCJpc0Zyb21TdGFydFwiKSB7XG4gICAgICB2Y
4674XIgcHQgPSBwbHVnaW4uX3B0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIHByb3BlcnR5LCAwLCAwLCBfcmVuZGVyQ2xlYXJQcm9wcyk7XG4gICAgICBwdC51ID0gZW5kVmFsdWU7XG4gICAgICBwdC5wciA9IC0xMDtcbiAgICAgIHB0LnR3ZWVuID0gdHdlZW47XG5cbiAgICAgIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuICAvKiBjbGFzc05hbWUgZmVhdHVyZSAoYWJvdXQgMC40a2IgZ3ppcHBlZCkuXG4gICwgY2xhc3NOYW1lKHBsdWdpbiwgdGFyZ2V0LCBwcm9wZXJ0eSwgZW5kVmFsdWUsIHR3ZWVuKSB7XG4gIFx0bGV0IF9yZW5kZXJDbGFzc05hbWUgPSAocmF0aW8sIGRhdGEpID0+IHtcbiAgXHRcdFx0ZGF0YS5jc3MucmVuZGVyKHJhdGlvLCBkYXRhLmNzcyk7XG4gIFx0XHRcdGlmICghcmF0aW8gfHwgcmF0aW8gPT09IDEpIHtcbiAgXHRcdFx0XHRsZXQgaW5saW5lID0gZGF0YS5ybXYsXG4gIFx0XHRcdFx0XHR0YXJnZXQgPSBkYXRhLnQsXG4gIFx0XHRcdFx0XHRwO1xuICBcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCByYXRpbyA/IGRhdGEuZSA6IGRhdGEuYik7XG4gIFx0XHRcdFx0Zm9yIChwIGluIGlubGluZSkge1xuICBcdFx0XHRcdFx0X3JlbW92ZVByb3BlcnR5KHRhcmdldCwgcCk7XG4gIFx0XHRcdFx0fVxuICBcdFx0XHR9XG4gIFx0XHR9LFxuICBcdFx0X2dldEFsbFN0eWxlcyA9ICh0YXJnZXQpID0+IHtcbiAgXHRcdFx0bGV0IHN0eWxlcyA9IHt9LFxuICBcdFx0XHRcdGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLFxuICBcdFx0XHRcdHA7XG4gIFx0XHRcdGZvciAocCBpbiBjb21wdXRlZCkge1xuICBcdFx0XHRcdGlmIChpc05hTihwKSAmJiBwICE9PSBcImNzc1RleHRcIiAmJiBwICE9PSBcImxlbmd0aFwiKSB7XG4gIFx0XHRcdFx0XHRzdHlsZXNbcF0gPSBjb21wdXRlZFtwXTtcbiAgXHRcdFx0XHR9XG4gIFx0XHRcdH1cbiAgXHRcdFx0X3NldERlZmF1bHRzKHN0eWxlcywgX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgMSkpO1xuICBcdFx0XHRyZXR1cm4gc3R5bGVzO1xuICBcdFx0fSxcbiAgXHRcdHN0YXJ0Q2xhc3NMaXN0ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLFxuICBcdFx0c3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gIFx0XHRjc3NUZXh0ID0gc3R5bGUuY3NzVGV4dCxcbiAgXHRcdGNhY2hlID0gdGFyZ2V0Ll9nc2FwLFxuICBcdFx0Y2xhc3NQVCA9IGNhY2hlLmNsYXNzUFQsXG4gIFx0XHRpbmxpbmVUb1JlbW92ZUF0RW5kID0ge30sXG4gIFx0XHRkYXRhID0ge3Q6dGFyZ2V0LCBwbHVnaW46cGx1Z2luLCBybXY6aW5saW5lVG9SZW1vdmVBdEVuZCwgYjpzdGFydENsYXNzTGlzdCwgZTooZW5kVmFsdWUuY2hhckF0KDEpICE9PSBcIj1cIikgPyBlbmRWYWx1ZSA6IHN0YXJ0Q2xhc3NMaXN0LnJlcGxhY2UobmV3IFJlZ0V4cChcIig/OlxcXFxzfF4pXCIgKyBlbmRWYWx1ZS5zdWJzdHIoMikgKyBcIig/IVtcXFxcdy1dKVwiKSwgXCJcIikgKyAoKGVuZFZhbHVlLmNoYXJBdCgwKSA9PT0gXCIrXCIpID8gXCIgXCIgKyBlbmRWYWx1ZS5zdWJzdHIoMikgOiBcIlwiKX0sXG4gIFx0XHRjaGFuZ2luZ1ZhcnMgPSB7fSxcbiAgXHRcdHN0YXJ0VmFycyA9IF9nZXRBbGxTdHlsZXModGFyZ2V0KSxcbiAgXHRcdHRyYW5zZm9ybVJlbGF0ZWQgPSAvKHRyYW5zZm9ybXxwZXJzcGVjdGl2ZSkvaSxcbiAgXHRcdGVuZFZhcnMsIHA7XG4gIFx0aWYgKGNsYXNzUFQpIHtcbiAgXHRcdGNsYXNzUFQucigxLCBjbGFzc1BULmQpO1xuICBcdFx0X3JlbW92ZUxpbmtlZExpc3RJdGVtKGNsYXNzUFQuZC5wbHVnaW4sIGNsYXNzUFQsIFwiX3B0XCIpO1xuICBcdH1cbiAgXHR0YXJnZXQuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgZGF0YS5lKTtcbiAgXHRlbmRWYXJzID0gX2dldEFsbFN0eWxlcyh0YXJnZXQsIHRydWUpO1xuICBcdHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBzdGFydENsYXNzTGlzdCk7XG4gIFx0Zm9yIChwIGluIGVuZFZhcnMpIHtcbiAgXHRcdGlmIChlbmRWYXJzW3BdICE9PSBzdGFydFZhcnNbcF0gJiYgIXRyYW5zZm9ybVJlbGF0ZWQudGVzdChwKSkge1xuICBcdFx0XHRjaGFuZ2luZ1ZhcnNbcF0gPSBlbmRWYXJzW3BdO1xuICBcdFx0XHRpZiAoIXN0eWxlW3BdICYmIHN0eWxlW3BdICE9PSBcIjBcIikge1xuICBcdFx0XHRcdGlubGluZVRvUmVtb3ZlQXRFbmRbcF0gPSAxO1xuICBcdFx0XHR9XG4gIFx0XHR9XG4gIFx0fVxuICBcdGNhY2hlLmNsYXNzUFQgPSBwbHVnaW4uX3B0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIFwiY2xhc3NOYW1lXCIsIDAsIDAsIF9yZW5kZXJDbGFzc05hbWUsIGRhdGEsIDAsIC0xMSk7XG4gIFx0aWYgKHN0eWxlLmNzc1RleHQgIT09IGNzc1RleHQpIHsgLy9vbmx5IGFwcGx5IGlmIHRoaW5ncyBjaGFuZ2UuIE90aGVyd2lzZSwgaW4gY2FzZXMgbGlrZSBhIGJhY2tncm91bmQtaW1hZ2UgdGhhdCdzIHB1bGxlZCBkeW5hbWljYWxseSwgaXQgY291bGQgY2F1c2UgYSByZWZyZXNoLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9mb3J1bXMvdG9waWMvMjAzNjgtcG9zc2libGUtZ3NhcC1idWctc3dpdGNoaW5nLWNsYXNzbmFtZXMtaW4tY2hyb21lLy5cbiAgXHRcdHN0eWxlLmNzc1RleHQgPSBjc3NUZXh0OyAvL3dlIHJlY29yZGVkIGNzc1RleHQgYmVmb3JlIHdlIHN3YXBwZWQgY2xhc3NlcyBhbmQgcmFuIF9nZXRBbGxTdHlsZXMoKSBiZWNhdXNlIGluIGNhc2VzIHdoZW4gYSBjbGFzc05hbWUgdHdlZW4gaXMgb3ZlcndyaXR0ZW4sIHdlIHJlbW92ZSBhbGwgdGhlIHJlbGF0ZWQgdHdlZW5pbmcgcHJvcGVydGllcyBmcm9tIHRoYXQgY2xhc3MgY2hhbmdlIChvdGhlcndpc2UgY2xhc3Mtc3BlY2lmaWMgc3R1ZmYgY2FuJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyB3ZSd2ZSBkaXJlY3RseSBzZXQgb24gdGhlIHRhcmdldCdzIHN0eWxlIG9iamVjdCBkdWUgdG8gc3BlY2lmaWNpdHkpLlxuICBcdH1cbiAgXHRfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB0cnVlKTsgLy90byBjbGVhciB0aGUgY2FjaGluZyBvZiB0cmFuc2Zvcm1zXG4gIFx0ZGF0YS5jc3MgPSBuZXcgZ3NhcC5wbHVnaW5zLm
4674NzcygpO1xuICBcdGRhdGEuY3NzLmluaXQodGFyZ2V0LCBjaGFuZ2luZ1ZhcnMsIHR3ZWVuKTtcbiAgXHRwbHVnaW4uX3Byb3BzLnB1c2goLi4uZGF0YS5jc3MuX3Byb3BzKTtcbiAgXHRyZXR1cm4gMTtcbiAgfVxuICAqL1xuXG59LFxuXG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRSQU5TRk9STVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbl9pZGVudGl0eTJETWF0cml4ID0gWzEsIDAsIDAsIDEsIDAsIDBdLFxuICAgIF9yb3RhdGlvbmFsUHJvcGVydGllcyA9IHt9LFxuICAgIF9pc051bGxUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfaXNOdWxsVHJhbnNmb3JtKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gXCJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMClcIiB8fCB2YWx1ZSA9PT0gXCJub25lXCIgfHwgIXZhbHVlO1xufSxcbiAgICBfZ2V0Q29tcHV0ZWRUcmFuc2Zvcm1NYXRyaXhBc0FycmF5ID0gZnVuY3Rpb24gX2dldENvbXB1dGVkVHJhbnNmb3JtTWF0cml4QXNBcnJheSh0YXJnZXQpIHtcbiAgdmFyIG1hdHJpeFN0cmluZyA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybVByb3ApO1xuXG4gIHJldHVybiBfaXNOdWxsVHJhbnNmb3JtKG1hdHJpeFN0cmluZykgPyBfaWRlbnRpdHkyRE1hdHJpeCA6IG1hdHJpeFN0cmluZy5zdWJzdHIoNykubWF0Y2goX251bUV4cCkubWFwKF9yb3VuZCk7XG59LFxuICAgIF9nZXRNYXRyaXggPSBmdW5jdGlvbiBfZ2V0TWF0cml4KHRhcmdldCwgZm9yY2UyRCkge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAgfHwgX2dldENhY2hlKHRhcmdldCksXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIG1hdHJpeCA9IF9nZXRDb21wdXRlZFRyYW5zZm9ybU1hdHJpeEFzQXJyYXkodGFyZ2V0KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgdGVtcCxcbiAgICAgIGFkZGVkVG9ET007XG5cbiAgaWYgKGNhY2hlLnN2ZyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpKSB7XG4gICAgdGVtcCA9IHRhcmdldC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpLm1hdHJpeDsgLy9lbnN1cmVzIHRoYXQgZXZlbiBjb21wbGV4IHZhbHVlcyBsaWtlIFwidHJhbnNsYXRlKDUwLDYwKSByb3RhdGUoMTM1LDAsMClcIiBhcmUgcGFyc2VkIGJlY2F1c2UgaXQgbWFzaGVzIGl0IGludG8gYSBtYXRyaXguXG5cbiAgICBtYXRyaXggPSBbdGVtcC5hLCB0ZW1wLmIsIHRlbXAuYywgdGVtcC5kLCB0ZW1wLmUsIHRlbXAuZl07XG4gICAgcmV0dXJuIG1hdHJpeC5qb2luKFwiLFwiKSA9PT0gXCIxLDAsMCwxLDAsMFwiID8gX2lkZW50aXR5MkRNYXRyaXggOiBtYXRyaXg7XG4gIH0gZWxzZSBpZiAobWF0cml4ID09PSBfaWRlbnRpdHkyRE1hdHJpeCAmJiAhdGFyZ2V0Lm9mZnNldFBhcmVudCAmJiB0YXJnZXQgIT09IF9kb2NFbGVtZW50ICYmICFjYWNoZS5zdmcpIHtcbiAgICAvL25vdGU6IGlmIG9mZnNldFBhcmVudCBpcyBudWxsLCB0aGF0IG1lYW5zIHRoZSBlbGVtZW50IGlzbid0IGluIHRoZSBub3JtYWwgZG9jdW1lbnQgZmxvdywgbGlrZSBpZiBpdCBoYXMgZGlzcGxheTpub25lIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIGhhcyBkaXNwbGF5Om5vbmUpLiBGaXJlZm94IHJldHVybnMgbnVsbCBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSgpIGlmIHRoZSBlbGVtZW50IGlzIGluIGFuIGlmcmFtZSB0aGF0IGhhcyBkaXNwbGF5Om5vbmUuIGh0dHBzOi8vYnVnemlsbGEubW96
4674aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuICAgIC8vYnJvd3NlcnMgZG9uJ3QgcmVwb3J0IHRyYW5zZm9ybXMgYWNjdXJhdGVseSB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIERPTSBhbmQgaGFzIGEgZGlzcGxheSB2YWx1ZSB0aGF0J3Mgbm90IFwibm9uZVwiLiBGaXJlZm94IGFuZCBNaWNyb3NvZnQgYnJvd3NlcnMgaGF2ZSBhIHBhcnRpYWwgYnVnIHdoZXJlIHRoZXknbGwgcmVwb3J0IHRyYW5zZm9ybXMgZXZlbiBpZiBkaXNwbGF5Om5vbmUgQlVUIG5vdCBhbnkgcGVyY2VudGFnZS1iYXNlZCB2YWx1ZXMgbGlrZSB0cmFuc2xhdGUoLTUwJSwgOHB4KSB3aWxsIGJlIHJlcG9ydGVkIGFzIGlmIGl0J3MgdHJhbnNsYXRlKDAsIDhweCkuXG4gICAgdGVtcCA9IHN0eWxlLmRpc3BsYXk7XG4gICAgc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICBwYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50IHx8ICF0YXJnZXQub2Zmc2V0UGFyZW50ICYmICF0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpIHtcbiAgICAgIC8vIG5vdGU6IGluIDMuMy4wIHdlIHN3aXRjaGVkIHRhcmdldC5vZmZzZXRQYXJlbnQgdG8gX2RvYy5ib2R5LmNvbnRhaW5zKHRhcmdldCkgdG8gYXZvaWQgW3NvbWV0aW1lcyB1bm5lY2Vzc2FyeV0gTXV0YXRpb25PYnNlcnZlciBjYWxscyBidXQgdGhhdCB3YXNuJ3QgYWRlcXVhdGUgYmVjYXVzZSB0aGVyZSBhcmUgZWRnZSBjYXNlcyB3aGVyZSBuZXN0ZWQgcG9zaXRpb246IGZpeGVkIGVsZW1lbnRzIG5lZWQgdG8gZ2V0IHJlcGFyZW50ZWQgdG8gYWNjdXJhdGVseSBzZW5zZSB0cmFuc2Zvcm1zLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dyZWVuc29jay9HU0FQL2lzc3Vlcy8zODggYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbnNvY2svR1NBUC9pc3N1ZXMvMzc1LiBOb3RlOiBwb3NpdGlvbjogZml4ZWQgZWxlbWVudHMgcmVwb3J0IGEgbnVsbCBvZmZzZXRQYXJlbnQgYnV0IHRoZXkgY291bGQgYWxzbyBiZSBpbnZpc2libGUgYmVjYXVzZSB0aGV5J3JlIGluIGFuIGFuY2VzdG9yIHdpdGggZGlzcGxheTogbm9uZSwgc28gd2UgY2hlY2sgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuIFdlIG9ubHkgd2FudCB0byBhbHRlciB0aGUgRE9NIGlmIHdlIGFic29sdXRlbHkgaGF2ZSB0byBiZWNhdXNlIGl0IGNhbiBjYXVzZSBpZnJhbWUgY29udGVudCB0byByZWxvYWQsIGxpa2UgYSBWaW1lbyB2aWRlby5cbiAgICAgIGFkZGVkVG9ET00gPSAxOyAvL2ZsYWdcblxuICAgICAgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICBfZG9jRWxlbWVudC5hcHBlbmRDaGlsZCh0YXJnZXQpOyAvL3dlIG11c3QgYWRkIGl0IHRvIHRoZSBET00gaW4gb3JkZXIgdG8gZ2V0IHZhbHVlcyBwcm9wZXJseVxuXG4gICAgfVxuXG4gICAgbWF0cml4ID0gX2dldENvbXB1dGVkVHJhbnNmb3JtTWF0cml4QXNBcnJheSh0YXJnZXQpO1xuICAgIHRlbXAgPyBzdHlsZS5kaXNwbGF5ID0gdGVtcCA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIFwiZGlzcGxheVwiKTtcblxuICAgIGlmIChhZGRlZFRvRE9NKSB7XG4gICAgICBuZXh0U2libGluZyA/IHBhcmVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBuZXh0U2libGluZykgOiBwYXJlbnQgPyBwYXJlbnQuYXBwZW5kQ2hpbGQodGFyZ2V0KSA6IF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvcmNlMkQgJiYgbWF0cml4Lmxlbmd0aCA+IDYgPyBbbWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFs0XSwgbWF0cml4WzVdLCBtYXRyaXhbMTJdLCBtYXRyaXhbMTNdXSA6IG1hdHJpeDtcbn0sXG4gICAgX2FwcGx5U1ZHT3JpZ2luID0gZnVuY3Rpb24gX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgb3JpZ2luLCBvcmlnaW5Jc0Fic29sdXRlLCBzbW9vdGgsIG1hdHJpeEFycmF5LCBwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbykge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXG4gICAgICBtYXRyaXggPSBtYXRyaXhBcnJheSB8fCBfZ2V0TWF0cml4KHRhcmdldCwgdHJ1ZSksXG4gICAgICB4T3JpZ2luT2xkID0gY2FjaGUueE9yaWdpbiB8fCAwLFxuICAgICAgeU9yaWdpbk9sZCA9IGNhY2hlLnlPcmlnaW4gfHwgMCxcbiAgICAgIHhPZmZzZXRPbGQgPSBjYWNoZS54T2Zmc2V0IHx8IDAsXG4gICAgICB5T2Zmc2V0T2xkID0gY2FjaGUueU9mZnNldCB8fCAwLFxuICAgICAgYSA9IG1hdHJpeFswXSxcbiAgICAgIGIgPSBtYXRyaXhbMV0sXG4gICAgICBjID0gbWF0cml4WzJdLFxuICAgICAgZCA9IG1hdHJpeFszXSxcbiAgICAgIHR4ID0gbWF0cml4WzRdLFxuICAgICAgdHkgPSBtYXRyaXhbNV0sXG4gICAgICBvcmlnaW5TcGxpdCA9IG9yaWdpbi5zcGxpdChcIiBcIiksXG4gICAgICB4T3JpZ2luID0gcGFyc2VGbG9hdChvcmlnaW5TcGxpdFswXSkgfHwgMCxcbiAgICAgIHlPcmlnaW4gPSBwYXJzZUZsb2F0KG9yaWdpblNwbGl0WzFdKSB8fCAwLFxuICAgICAgYm91bmRzLFxuICAgICAgZGV0ZXJtaW5hbnQsXG4gICAgICB4LFxuICAgICAgeTtcblxuICBpZiAoIW9yaWdpbklzQWJzb2x1dGUpIHtcbiAgICBib3VuZHMgPSBfZ2V0QkJveCh0YXJnZXQpO1xuICAgIHhPcmlnaW4gPSBib3VuZHMueCArICh+b3JpZ2luU3BsaXRbMF0uaW5kZXhPZihcIiVcIikgPyB4T3JpZ2luIC8gMTAwICogYm91bmRzLndpZHRoIDogeE9yaWdpbik7XG4gICAgeU9yaWdpbiA9IGJvdW5kcy55ICsgKH4ob3JpZ2luU3BsaXRbMV0gfHwgb3JpZ2luU3BsaXRbMF0pLmluZGV4T2YoXCIlXCIpID8geU9yaWdpbiAvIDEwMCAqIGJvdW5kcy5oZWlnaHQgOiB5T3JpZ2luKTsgLy8gaWYgKCEoXCJ4T3JpZ2luXCIgaW4gY2FjaGUpICYmICh4T3JpZ2luIHx8IHlPcmlnaW4pKSB7IC8vIGFkZGVkIGluIDMuMTIuMywgcmV2ZXJ0ZWQgaW4gMy4xMi40OyByZXF1aXJlcyBtb3JlIGV4cGxvcmF0aW9uXG4gICAgLy8gXHR4T3JpZ2luIC09IGJvdW5kcy54O1xuICAgIC8vIFx0eU9yaWdpbiAtPSBib3VuZHMueTtcbiAgICAvLyB9XG4gIH0gZWxzZSBpZiAobWF0cml4ICE9PSBfaWRlbnRpdHkyRE1hdHJpeCAmJiAoZGV0ZXJtaW5hbnQgPSBhICogZCAtIGIgKiBjKSkge1xuICAgIC8vaWYgaXQncyB6ZXJvIChsaWtlIGlmIHNjYWxlWCBhbmQgc2NhbGVZIGFyZSB6ZXJvKSwgc2tpcCBpdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBkaXZpZGluZyBieSB6ZXJvLlxuICAgIHggPSB4T3JpZ2luICogKGQgLyBkZXRlcm1pbmFudCkgKyB5T3Jp
4674Z2luICogKC1jIC8gZGV0ZXJtaW5hbnQpICsgKGMgKiB0eSAtIGQgKiB0eCkgLyBkZXRlcm1pbmFudDtcbiAgICB5ID0geE9yaWdpbiAqICgtYiAvIGRldGVybWluYW50KSArIHlPcmlnaW4gKiAoYSAvIGRldGVybWluYW50KSAtIChhICogdHkgLSBiICogdHgpIC8gZGV0ZXJtaW5hbnQ7XG4gICAgeE9yaWdpbiA9IHg7XG4gICAgeU9yaWdpbiA9IHk7IC8vIHRoZW9yeTogd2Ugb25seSBoYWQgdG8gZG8gdGhpcyBmb3Igc21vb3RoaW5nIGFuZCBpdCBhc3N1bWVzIHRoYXQgdGhlIHByZXZpb3VzIG9uZSB3YXMgbm90IG9yaWdpbklzQWJzb2x1dGUuXG4gIH1cblxuICBpZiAoc21vb3RoIHx8IHNtb290aCAhPT0gZmFsc2UgJiYgY2FjaGUuc21vb3RoKSB7XG4gICAgdHggPSB4T3JpZ2luIC0geE9yaWdpbk9sZDtcbiAgICB0eSA9IHlPcmlnaW4gLSB5T3JpZ2luT2xkO1xuICAgIGNhY2hlLnhPZmZzZXQgPSB4T2Zmc2V0T2xkICsgKHR4ICogYSArIHR5ICogYykgLSB0eDtcbiAgICBjYWNoZS55T2Zmc2V0ID0geU9mZnNldE9sZCArICh0eCAqIGIgKyB0eSAqIGQpIC0gdHk7XG4gIH0gZWxzZSB7XG4gICAgY2FjaGUueE9mZnNldCA9IGNhY2hlLnlPZmZzZXQgPSAwO1xuICB9XG5cbiAgY2FjaGUueE9yaWdpbiA9IHhPcmlnaW47XG4gIGNhY2hlLnlPcmlnaW4gPSB5T3JpZ2luO1xuICBjYWNoZS5zbW9vdGggPSAhIXNtb290aDtcbiAgY2FjaGUub3JpZ2luID0gb3JpZ2luO1xuICBjYWNoZS5vcmlnaW5Jc0Fic29sdXRlID0gISFvcmlnaW5Jc0Fic29sdXRlO1xuICB0YXJnZXQuc3R5bGVbX3RyYW5zZm9ybU9yaWdpblByb3BdID0gXCIwcHggMHB4XCI7IC8vb3RoZXJ3aXNlLCBpZiBzb21lb25lIHNldHMgIGFuIG9yaWdpbiB2aWEgQ1NTLCBpdCB3aWxsIGxpa2VseSBpbnRlcmZlcmUgd2l0aCB0aGUgU1ZHIHRyYW5zZm9ybSBhdHRyaWJ1dGUgb25lcyAoYmVjYXVzZSByZW1lbWJlciwgd2UncmUgYmFraW5nIHRoZSBvcmlnaW4gaW50byB0aGUgbWF0cml4KCkgdmFsdWUpLlxuXG4gIGlmIChwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbykge1xuICAgIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvLCBjYWNoZSwgXCJ4T3JpZ2luXCIsIHhPcmlnaW5PbGQsIHhPcmlnaW4pO1xuXG4gICAgX2FkZE5vblR3ZWVuaW5nUFQocGx1Z2luVG9BZGRQcm9wVHdlZW5zVG8sIGNhY2hlLCBcInlPcmlnaW5cIiwgeU9yaWdpbk9sZCwgeU9yaWdpbik7XG5cbiAgICBfYWRkTm9uVHdlZW5pbmdQVChwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbywgY2FjaGUsIFwieE9mZnNldFwiLCB4T2Zmc2V0T2xkLCBjYWNoZS54T2Zmc2V0KTtcblxuICAgIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvLCBjYWNoZSwgXCJ5T2Zmc2V0XCIsIHlPZmZzZXRPbGQsIGNhY2hlLnlPZmZzZXQpO1xuICB9XG5cbiAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB4T3JpZ2luICsgXCIgXCIgKyB5T3JpZ2luKTtcbn0sXG4gICAgX3BhcnNlVHJhbnNmb3JtID0gZnVuY3Rpb24gX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgdW5jYWNoZSkge1xuICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAgfHwgbmV3IEdTQ2FjaGUodGFyZ2V0KTtcblxuICBpZiAoXCJ4XCIgaW4gY2FjaGUgJiYgIXVuY2FjaGUgJiYgIWNhY2hlLnVuY2FjaGUpIHtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH1cblxuICB2YXIgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXG4gICAgICBpbnZlcnRlZFNjYWxlWCA9IGNhY2hlLnNjYWxlWCA8IDAsXG4gICAgICBweCA9IFwicHhcIixcbiAgICAgIGRlZyA9IFwiZGVnXCIsXG4gICAgICBjcyA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KSxcbiAgICAgIG9yaWdpbiA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybU9yaWdpblByb3ApIHx8IFwiMFwiLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB6LFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZLFxuICAgICAgcm90YXRpb24sXG4gICAgICByb3RhdGlvblgsXG4gICAgICByb3RhdGlvblksXG4gICAgICBza2V3WCxcbiAgICAgIHNrZXdZLFxuICAgICAgcGVyc3BlY3RpdmUsXG4gICAgICB4T3JpZ2luLFxuICAgICAgeU9yaWdpbixcbiAgICAgIG1hdHJpeCxcbiAgICAgIGFuZ2xlLFxuICAgICAgY29zLFxuICAgICAgc2luLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBjLFxuICAgICAgZCxcbiAgICAgIGExMixcbiAgICAgIGEyMixcbiAgICAgIHQxLFxuICAgICAgdDIsXG4gICAgICB0MyxcbiAgICAgIGExMyxcbiAgICAgIGEyMyxcbiAgICAgIGEzMyxcbiAgICAgIGE0MixcbiAgICAgIGE0MyxcbiAgICAgIGEzMjtcbiAgeCA9IHkgPSB6ID0gcm90YXRpb24gPSByb3RhdGlvblggPSByb3RhdGlvblkgPSBza2V3WCA9IHNrZXdZID0gcGVyc3BlY3RpdmUgPSAwO1xuICBzY2FsZVggPSBzY2FsZVkgPSAxO1xuICBjYWNoZS5zdmcgPSAhISh0YXJnZXQuZ2V0Q1RNICYmIF9pc1NWRyh0YXJnZXQpKTtcblxuICBpZiAoY3MudHJhbnNsYXRlKSB7XG4gICAgLy8gYWNjb21tb2RhdGUgaW5kZXBlbmRlbnQgdHJhbnNmb3JtcyBieSBjb21iaW5pbmcgdGhlbSBpbnRvIG5vcm1hbCBvbmVzLlxuICAgIGlmIChjcy50cmFuc2xhdGUgIT09IFwibm9uZVwiIHx8IGNzLnNjYWxlICE9PSBcIm5vbmVcIiB8fCBjcy5yb3RhdGUgIT09IFwibm9uZVwiKSB7XG4gICAgICBzdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSAoY3MudHJhbnNsYXRlICE9PSBcIm5vbmVcIiA/IFwidHJhbnNsYXRlM2QoXCIgKyAoY3MudHJhbnNsYXRlICsgXCIgMCAwXCIpLnNwbGl0KFwiIFwiKS5zbGljZSgwLCAzKS5qb2luKFwiLCBcIikgKyBcIikgXCIgOiBcIlwiKSArIChjcy5yb3RhdGUgIT09IFwibm9uZVwiID8gXCJyb3RhdGUoXCIgKyBjcy5yb3RhdGUgKyBcIikgXCIgOiBcIlwiKSArIChjcy5zY2FsZSAhPT0gXCJub25lXCIgPyBcInNjYWxlKFwiICsgY3Muc2NhbGUuc3BsaXQoXCIgXCIpLmpvaW4oXCIsXCIpICsgXCIpIFwiIDogXCJcIikgKyAoY3NbX3RyYW5zZm9ybVByb3BdICE9PSBcIm5vbmVcIiA/IGNzW190cmFuc2Zvcm1Qcm9wXSA6IFwiXCIpO1xuICAgIH1cblxuICAgI
4674HN0eWxlLnNjYWxlID0gc3R5bGUucm90YXRlID0gc3R5bGUudHJhbnNsYXRlID0gXCJub25lXCI7XG4gIH1cblxuICBtYXRyaXggPSBfZ2V0TWF0cml4KHRhcmdldCwgY2FjaGUuc3ZnKTtcblxuICBpZiAoY2FjaGUuc3ZnKSB7XG4gICAgaWYgKGNhY2hlLnVuY2FjaGUpIHtcbiAgICAgIC8vIGlmIGNhY2hlLnVuY2FjaGUgaXMgdHJ1ZSAoYW5kIG1heWJlIGlmIG9yaWdpbiBpcyAwLDApLCB3ZSBuZWVkIHRvIHNldCBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IChjYWNoZS54T3JpZ2luIC0gYmJveC54KSArIFwicHggXCIgKyAoY2FjaGUueU9yaWdpbiAtIGJib3gueSkgKyBcInB4XCIuIFByZXZpb3VzbHkgd2UgbGV0IHRoZSBkYXRhLXN2Zy1vcmlnaW4gc3RheSBpbnN0ZWFkLCBidXQgd2hlbiBpbnRyb2R1Y2luZyByZXZlcnQoKSwgaXQgY29tcGxpY2F0ZWQgdGhpbmdzLlxuICAgICAgdDIgPSB0YXJnZXQuZ2V0QkJveCgpO1xuICAgICAgb3JpZ2luID0gY2FjaGUueE9yaWdpbiAtIHQyLnggKyBcInB4IFwiICsgKGNhY2hlLnlPcmlnaW4gLSB0Mi55KSArIFwicHhcIjtcbiAgICAgIHQxID0gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdDEgPSAhdW5jYWNoZSAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdmctb3JpZ2luXCIpOyAvLyAgUmVtZW1iZXIsIHRvIHdvcmsgYXJvdW5kIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzIHdlIGFsd2F5cyBmb3JjZSBTVkcgZWxlbWVudHMnIHRyYW5zZm9ybU9yaWdpbiB0byAwLDAgYW5kIG9mZnNldCB0aGUgdHJhbnNsYXRpb24gYWNjb3JkaW5nbHkuXG4gICAgfVxuXG4gICAgX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgdDEgfHwgb3JpZ2luLCAhIXQxIHx8IGNhY2hlLm9yaWdpbklzQWJzb2x1dGUsIGNhY2hlLnNtb290aCAhPT0gZmFsc2UsIG1hdHJpeCk7XG4gIH1cblxuICB4T3JpZ2luID0gY2FjaGUueE9yaWdpbiB8fCAwO1xuICB5T3JpZ2luID0gY2FjaGUueU9yaWdpbiB8fCAwO1xuXG4gIGlmIChtYXRyaXggIT09IF9pZGVudGl0eTJETWF0cml4KSB7XG4gICAgYSA9IG1hdHJpeFswXTsgLy9hMTFcblxuICAgIGIgPSBtYXRyaXhbMV07IC8vYTIxXG5cbiAgICBjID0gbWF0cml4WzJdOyAvL2EzMVxuXG4gICAgZCA9IG1hdHJpeFszXTsgLy9hNDFcblxuICAgI
4674HggPSBhMTIgPSBtYXRyaXhbNF07XG4gICAgeSA9IGEyMiA9IG1hdHJpeFs1XTsgLy8yRCBtYXRyaXhcblxuICAgIGlmIChtYXRyaXgubGVuZ3RoID09PSA2KSB7XG4gICAgICBzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG4gICAgICBzY2FsZVkgPSBNYXRoLnNxcnQoZCAqIGQgKyBjICogYyk7XG4gICAgICByb3RhdGlvbiA9IGEgfHwgYiA/IF9hdGFuMihiLCBhKSAqIF9SQUQyREVHIDogMDsgLy9ub3RlOiBpZiBzY2FsZVggaXMgMCwgd2UgY2Fubm90IGFjY3VyYXRlbHkgbWVhc3VyZSByb3RhdGlvbi4gU2FtZSBmb3Igc2tld1ggd2l0aCBhIHNjYWxlWSBvZiAwLiBUaGVyZWZvcmUsIHdlIGRlZmF1bHQgdG8gdGhlIHByZXZpb3VzbHkgcmVjb3JkZWQgdmFsdWUgKG9yIHplcm8gaWYgdGhhdCBkb2Vzbid0IGV4aXN0KS5cblxuICAgICAgc2tld1ggPSBjIHx8IGQgPyBfYXRhbjIoYywgZCkgKiBfUkFEMkRFRyArIHJvdGF0aW9uIDogMDtcbiAgICAgIHNrZXdYICYmIChzY2FsZVkgKj0gTWF0aC5hYnMoTWF0aC5jb3Moc2tld1ggKiBfREVHMlJBRCkpKTtcblxuICAgICAgaWYgKGNhY2hlLnN2Zykge1xuICAgICAgICB4IC09IHhPcmlnaW4gLSAoeE9yaWdpbiAqIGEgKyB5T3JpZ2luICogYyk7XG4gICAgICAgIHkgLT0geU9yaWdpbiAtICh4T3JpZ2luICogYiArIHlPcmlnaW4gKiBkKTtcbiAgICAgIH0gLy8zRCBtYXRyaXhcblxuICAgIH0gZWxzZSB7XG4gICAgICBhMzIgPSBtYXRyaXhbNl07XG4gICAgICBhNDIgPSBtYXRyaXhbN107XG4gICAgICBhMTMgPSBtYXRyaXhbOF07XG4gICAgICBhMjMgPSBtYXRyaXhbOV07XG4gICAgICBhMzMgPSBtYXRyaXhbMTBdO1xuICAgICAgYTQzID0gbWF0cml4WzExXTtcbiAgICAgIHggPSBtYXRyaXhbMTJdO1xuICAgICAgeSA9IG1hdHJpeFsxM107XG4gICAgICB6ID0gbWF0cml4WzE0XTtcbiAgICAgIGFuZ2xlID0gX2F0YW4yKGEzMiwgYTMzKTtcbiAgICAgIHJvdGF0aW9uWCA9IGFuZ2xlICogX1JBRDJERUc7IC8vcm90YXRpb25YXG5cbiAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICAgICAgICBzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuICAgICAgICB0MSA9IGExMiAqIGNvcyArIGExMyAqIHNpbjtcbiAgICAgICAgdDIgPSBhMjIgKiBjb3MgKyBhMjMgKiBzaW47XG4gICAgICAgIHQzID0gYTMyICogY29zICsgYTMzICogc2luO1xuICAgICAgICBhMTMgPSBhMTIgKiAtc2luICsgYTEzICogY29zO1xuICAgICAgICBhMjMgPSBhMjIgKiAtc2luICsgYTIzICogY29zO1xuICAgICAgICBhMzMgPSBhMzIgKiAtc2luICsgYTMzICogY29zO1xuICAgICAgICBhNDMgPSBhNDIgKiAtc2luICsgYTQzICogY29zO1xuICAgICAgICBhMTIgPSB0MTtcbiAgICAgICAgYTIyID0gdDI7XG4gICAgICAgIGEzMiA9IHQzO1xuICAgICAgfSAvL3JvdGF0aW9uWVxuXG5cbiAgICAgIGFuZ2xlID0gX2F0YW4yKC1jLCBhMzMpO1xuICAgICAgcm90YXRpb25ZID0gYW5nbGUgKiBfUkFEMkRFRztcblxuICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XG4gICAgICAgIHNpbiA9IE1hdGguc2luKC1hbmdsZSk7XG4gICAgICAgIHQxID0gYSAqIGNvcyAtIGExMyAqIHNpbjtcbiAgICAgICAgdDIgPSBiICogY29zIC0gYTIzICogc2luO1xuICAgICAgICB0MyA9IGMgKiBjb3MgLSBhMzMgKiBzaW47XG4gICAgICAgIGE0MyA9IGQgKiBzaW4gKyBhNDMgKiBjb3M7XG4gICAgICAgIGEgPSB0MTtcbiAgICAgICAgYiA9IHQyO1xuICAgICAgICBjID0gdDM7XG4gICAgICB9IC8vcm90YXRpb25aXG5cblxuICAgICAgYW5nbGUgPSBfYXRhbjIoYiwgYSk7XG4gICAgICByb3RhdGlvbiA9IGFuZ2xlICogX1JBRDJERUc7XG5cbiAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgdDEgPSBhICogY29zICsgYiAqIHNpbjtcbiAgICAgICAgdDIgPSBhMTIgKiBjb3MgKyBhMjIgKiBzaW47XG4gICAgICAgIGIgPSBiICogY29zIC0gYSAqIHNpbjtcbiAgICAgICAgYTIyID0gYTIyICogY29zIC0gYTEyICogc2luO1xuICAgICAgICBhID0gdDE7XG4gICAgICAgIGExMiA9IHQyO1xuICAgICAgfVxuXG4gICAgICBpZiAocm90YXRpb25YICYmIE1hdGguYWJzKHJvdGF0aW9uWCkgKyBNYXRoLmFicyhyb3RhdGlvbikgPiAzNTkuOSkge1xuICAgICAgICAvL3doZW4gcm90YXRpb25ZIGlzIHNldCwgaXQgd2lsbCBvZnRlbiBiZSBwYXJzZWQgYXMgMTgwIGRlZ3JlZXMgZGlmZmVyZW50IHRoYW4gaXQgc2hvdWxkIGJlLCBhbmQgcm90YXRpb25YIGFuZCByb3RhdGlvbiBib3RoIGJlaW5nIDE4MCAoaXQgbG9va3MgdGhlIHNhbWUpLCBzbyB3ZSBhZGp1c3QgZm9yIHRoYXQgaGVyZS5cbiAgICAgICAgcm90YXRpb25YID0gcm90YXRpb24gPSAwO1xuICAgICAgICByb3RhdGlvblkgPSAxODAgLSByb3RhdGlvblk7XG4gICAgICB9XG5cbiAgICAgIHNjYWxlWCA9IF9yb3VuZChNYXRoLnNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSk7XG4gICAgICBzY2FsZVkgPSBfcm91bmQoTWF0aC5zcXJ0KGEyMiAqIGEyMiArIGEzMiAqIGEzMikpO1xuICAgICAgYW5nbGUgPSBfYXRhbjIoYTEyLCBhMjIpO1xuICAgICAgc2tld1ggPSBNYXRoLmFicyhhbmdsZSkgPiAwLjAwMDIgPyBhbmdsZSAqIF9SQUQyREVHIDogMDtcbiAgICAgIHBlcnNwZWN0aXZlID0gYTQzID8gMSAvIChhNDMgPCAwID8gLWE0MyA6IGE0MykgOiAwO1xuICAgIH1cblxuICAgIGlmIChjYWNoZS5zdmcpIHtcbiAgICAgIC8vc2Vuc2UgaWYgdGhlcmUgYXJlIENTUyB0cmFuc2Zvcm1zIGFwcGxpZWQgb24gYW4gU1ZHIGVsZW1lbnQgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IG92ZXJ3cml0ZSB0aGVtIHdoZW4gcmVuZGVyaW5nLiBUaGUgdHJhbnNmb3JtIGF0dHJpYnV0ZSBpcyBtb3JlIHJlbGlhYmxlIGNyb3NzLWJyb3dzZXIsIGJ1dCB3ZSBjYW4ndCBqdXN0IHJlbW92ZSB0aGUgQ1NTIG9uZXMgYmVjYXVzZSB0aGV5IG1heSBiZSBhcHBsaWVkIGluIGEgQ1NTIHJ1bGUgc29tZXdoZXJlIChub3QganVzdCBpbmxpbmUpLlxuICAgICAgdDEgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpO1xuICAgICAgY2FjaGUuZm9yY2VDU1MgPSB0YXJnZXQuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwiXCIpIHx8ICFfaXNOdWxsVHJhbnNmb3JtKF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgX3RyYW5zZm9ybVByb3ApKTtcbiAgICAgIHQxICYmIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdDEpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChNYXRoLmFicyhza2V3WCkgPiA5MCAmJiBNYXRoLmFicyhza2V3WCkgPCAyNzApIHtcbiAgICBpZiAoaW52ZXJ0ZWRTY2FsZVgpIHtcbiAgICAgIHNjYWxlWCAqPSAtMTtcbiAgICAgIHNrZXdYICs9IHJvdGF0aW9uIDw9IDAgPyAxODAgOiAtMTgwO1xuICAgICAgcm90YXRpb24gKz0gcm90YXRpb24gPD0gMCA/IDE4MCA6IC0xODA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlWSAqPSAtMTtcbiAgICAgIHNrZXdYICs9IHNrZXdYIDw9IDAgPyAxODAgOiAtMTgwO1xuICAgIH1cbiAgfVxuXG4gIHVuY2FjaGUgPSB1bmNhY2hlIHx8IGNhY2hlLnVuY2FjaGU7XG4gIGNhY2hlLnggPSB4IC0gKChjYWNoZS54UGVyY2VudCA9IHggJiYgKCF1bmNhY2hlICYmIGNhY2hlLnhQZXJjZW50IHx8IChNYXRoLnJvdW5kKHRhcmdldC5vZmZzZXRXaWR0aCAvIDIpID09PSBNYXRoLnJvdW5kKC14KSA/IC01MCA6IDApKSkgPyB0YXJnZXQub2Zmc2V0V2lkdGggKiBjYWNoZS54UGVyY2VudCAvIDEwMCA6IDApICsgcHg7XG4gIGNhY2hlLnkgPSB5IC0gKC
4674hjYWNoZS55UGVyY2VudCA9IHkgJiYgKCF1bmNhY2hlICYmIGNhY2hlLnlQZXJjZW50IHx8IChNYXRoLnJvdW5kKHRhcmdldC5vZmZzZXRIZWlnaHQgLyAyKSA9PT0gTWF0aC5yb3VuZCgteSkgPyAtNTAgOiAwKSkpID8gdGFyZ2V0Lm9mZnNldEhlaWdodCAqIGNhY2hlLnlQZXJjZW50IC8gMTAwIDogMCkgKyBweDtcbiAgY2FjaGUueiA9IHogKyBweDtcbiAgY2FjaGUuc2NhbGVYID0gX3JvdW5kKHNjYWxlWCk7XG4gIGNhY2hlLnNjYWxlWSA9IF9yb3VuZChzY2FsZVkpO1xuICBjYWNoZS5yb3RhdGlvbiA9IF9yb3VuZChyb3RhdGlvbikgKyBkZWc7XG4gIGNhY2hlLnJvdGF0aW9uWCA9IF9yb3VuZChyb3RhdGlvblgpICsgZGVnO1xuICBjYWNoZS5yb3RhdGlvblkgPSBfcm91bmQocm90YXRpb25ZKSArIGRlZztcbiAgY2FjaGUuc2tld1ggPSBza2V3WCArIGRlZztcbiAgY2FjaGUuc2tld1kgPSBza2V3WSArIGRlZztcbiAgY2FjaGUudHJhbnNmb3JtUGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZSArIHB4O1xuXG4gIGlmIChjYWNoZS56T3JpZ2luID0gcGFyc2VGbG9hdChvcmlnaW4uc3BsaXQoXCIgXCIpWzJdKSB8fCAhdW5jYWNoZSAmJiBjYWNoZS56T3JpZ2luIHx8IDApIHtcbiAgICBzdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0gPSBfZmlyc3RUd29Pbmx5KG9yaWdpbik7XG4gIH1cblxuICBjYWNoZS54T2Zmc2V0ID0gY2FjaGUueU9mZnNldCA9IDA7XG4gIGNhY2hlLmZvcmNlM0QgPSBfY29uZmlnLmZvcmNlM0Q7XG4gIGNhY2hlLnJlbmRlclRyYW5zZm9ybSA9IGNhY2hlLnN2ZyA/IF9yZW5kZXJTVkdUcmFuc2Zvcm1zIDogX3N1cHBvcnRzM0QgPyBfcmVuZGVyQ1NTVHJhbnNmb3JtcyA6IF9yZW5kZXJOb24zRFRyYW5zZm9ybXM7XG4gIGNhY2hlLnVuY2FjaGUgPSAwO1xuICByZXR1cm4gY2FjaGU7XG59LFxuICAgIF9maXJzdFR3b09ubHkgPSBmdW5jdGlvbiBfZmlyc3RUd29Pbmx5KHZhbHVlKSB7XG4gIHJldHVybiAodmFsdWUgPSB2YWx1ZS5zcGxpdChcIiBcIikpWzBdICsgXCIgXCIgKyB2YWx1ZVsxXTtcbn0sXG4gICAgLy9mb3IgaGFuZGxpbmcgdHJhbnNmb3JtT3JpZ2luIHZhbHVlcywgc3RyaXBwaW5nIG91dCB0aGUgM3JkIGRpbWVuc2lvblxuX2FkZFB4VHJhbnNsYXRlID0gZnVuY3Rpb24gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgc3RhcnQsIHZhbHVlKSB7XG4gIHZhciB1bml0ID0gZ2V0VW5pdChzdGFydCk7XG4gIHJldHVybiBfcm91bmQocGFyc2VGbG9hdChzdGFydCkgKyBwYXJzZUZsb2F0KF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgXCJ4XCIsIHZhbHVlICsgXCJweFwiLCB1bml0KSkpICsgdW5pdDtcbn0sXG4gICAgX3JlbmRlck5vbjNEVHJhbnNmb3JtcyA9IGZ1bmN0aW9uIF9yZW5kZXJOb24zRFRyYW5zZm9ybXMocmF0aW8sIGNhY2hlKSB7XG4gIGNhY2hlLnogPSBcIjBweFwiO1xuICBjYWNoZS5yb3RhdGlvblkgPSBjYWNoZS5yb3RhdGlvblggPSBcIjBkZWdcIjtcbiAgY2FjaGUuZm9yY2UzRCA9IDA7XG5cbiAgX3JlbmRlckNTU1RyYW5zZm9ybXMocmF0aW8sIGNhY2hlKTtcbn0sXG4gICAgX3plcm9EZWcgPSBcIjBkZWdcIixcbiAgICBfemVyb1B4ID0gXCIwcHhcIixcbiAgICBfZW5kUGFyZW50aGVzaXMgPSBcIikgXCIsXG4gICAgX3JlbmRlckNTU1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcbiAgdmFyIF9yZWYgPSBjYWNoZSB8fCB0aGlzLFxuICAgICAgeFBlcmNlbnQgPSBfcmVmLnhQZXJjZW50LFxuICAgICAgeVBlcmNlbnQgPSBfcmVmLnlQZXJjZW50LFxuICAgICAgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnksXG4gICAgICB6ID0gX3JlZi56LFxuICAgICAgcm90YXRpb24gPSBfcmVmLnJvdGF0aW9uLFxuICAgICAgcm90YXRpb25ZID0gX3JlZi5yb3RhdGlvblksXG4gICAgICByb3RhdGlvblggPSBfcmVmLnJvdGF0aW9uWCxcbiAgICAgIHNrZXdYID0gX3JlZi5za2V3WCxcbiAgICAgIHNrZXdZID0gX3JlZi5za2V3WSxcbiAgICAgIHNjYWxlWCA9IF9yZWYuc2NhbGVYLFxuICAgICAgc2NhbGVZID0gX3JlZi5zY2FsZVksXG4gICAgICB0cmFuc2Zvcm1QZXJzcGVjdGl2ZSA9IF9yZWYudHJhbnNmb3JtUGVyc3BlY3RpdmUsXG4gICAgICBmb3JjZTNEID0gX3JlZi5mb3JjZTNELFxuICAgICAgdGFyZ2V0ID0gX3JlZi50YXJnZXQsXG4gICAgICB6T3JpZ2luID0gX3JlZi56T3JpZ2luLFxuICAgICAgdHJhbnNmb3JtcyA9IFwiXCIsXG4gICAgICB1c2UzRCA9IGZvcmNlM0QgPT09IFwiYXV0b1wiICYmIHJhdGlvICYmIHJhdGlvICE9PSAxIHx8IGZvcmNlM0QgPT09IHRydWU7IC8vIFNhZmFyaSBoYXMgYSBidWcgdGhhdCBjYXVzZXMgaXQgbm90IHRvIHJlbmRlciAzRCB0cmFuc2Zvcm0tb3JpZ2luIHZhbHVlcyBwcm9wZXJseSwgc28gd2UgZm9yY2UgdGhlIHogb3JpZ2luIHRvIDAsIHJlY29yZCBpdCBpbiB0aGUgY2FjaGUsIGFuZCB0aGVuIGRvIHRoZSBtYXRoIGhlcmUgdG8gb2Zmc2V0IHRoZSB0cmFuc2xhdGUgdmFsdWVzIGFjY29yZGluZ2x5IChiYXNpY2FsbHkgZG8gdGhlIDNEIHRyYW5zZm9ybS1vcmlnaW4gcGFydCBtYW51YWxseSlcblxuXG4gIGlmICh6T3JpZ2luICYmIChyb3RhdGlvblggIT09IF96ZXJvRGVnIHx8IHJvdGF0aW9uWSAhPT0gX3plcm9EZWcpKSB7XG4gICAgdmFyIGFuZ2xlID0gcGFyc2VGbG9hdChyb3RhdGlvblkpICogX0RFRzJSQUQsXG4gICAgICAgIGExMyA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgYTMzID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICBjb3M7XG5cbiAgICBhbmdsZSA9IHBhcnNlRmxvYXQocm90YXRpb25YKSAqIF9ERUcyUkFEO1xuICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB4ID0gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgeCwgYTEzICogY29zICogLXpPcmlnaW4pO1xuICAgIHkgPSBfYWRkUHhUcmFuc2xhdGUodGFyZ2V0LCB5LCAtTWF0aC5zaW4oYW5nbGUpICogLXpPcmlnaW4pO1xuICAgIHogPSBfYWRkUHhUcmFuc2xhdGUodGFyZ2V0LCB6LCBhMzMgKiBjb3MgKiAtek9yaWdpbiArIHpPcmlnaW4pO1xuICB9XG5cbiAgaWYgKHRyYW5zZm9ybVBlcnNwZWN0aXZlICE9PSBfemVyb1B4KSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInBlcnNwZWN0aXZlKFwiICsgdHJhbnNmb3JtUGVyc3BlY3RpdmUgKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAoeFBlcmNlbnQgfHwgeVBlcmNlbnQpIHtcbiAgICB0cmFuc2Zvcm1zICs9IFwidHJhbnNsYXRlKFwiICsgeFBlcmNlbnQgKyBcIiUsIFwiICsgeVBlcmNlbnQgKyBcIiUpIFwiO1xuICB9XG5cbiAgaWYgKHVzZTNEIHx8IHggIT09IF96ZXJvUHggfHwgeSAhPT0gX3plcm9QeCB8fCB6ICE9PSBfemVyb1B4KSB7XG4gICAgdHJhbnNmb3JtcyArPSB6ICE9PSBfemVyb1B4IHx8IHVzZTNEID8gXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIFwiICsgeiArIFwiKSBcIiA6IFwidHJhbnNsYXRlKFwiICsgeCArIFwiLCBcIiArIHkgKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAocm90YXRpb24gIT09IF96ZXJvRGVnKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInJvdGF0ZShcIiArIHJvdGF0aW9uICsgX2VuZFBhcmVudGhlc2lzO1xuICB9XG5cbiAgaWYgKHJvdGF0aW9uWSAhPT0gX3plcm9EZWcpIHtcbiAgICB0cmFuc2Zvcm1zICs9IFwicm90YXRlWShcIiArIHJvdGF0aW9uWSArIF9lbmRQYXJlbnRoZXNpcztcbiAgfVxuXG4gIGlmIChyb3RhdGlvblggIT09IF96ZXJvRGVnKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInJvdGF0ZVgoXCIgKyByb3RhdGlvblggKyBfZW5kUGFyZW50aGVzaXM7XG4gIH1cblxuICBpZiAoc2tld1ggIT09IF96ZXJvRGVnIHx8IHNrZXdZICE9PSBfemVyb0RlZykge1xuICAgIHRyYW5zZm9ybXMgKz0gXCJza2V3KFwiICsgc2tld1ggKyBcIiwgXCIgKyBza2V3WSArIF9lbmRQYXJlbnRoZXNpcztcbiAgfVxuXG4gIGlmIChzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxKSB7XG4gICAgdHJhbnNmb3JtcyArPSBcInNjYWxlKFwiICsgc2NhbGVYICsgXCIsIFwiICsgc2NhbGVZICsgX2VuZFBhcmVudGhlc2lzO1xuICB9XG5cbiAgdGFyZ2V0LnN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXMgfHwgXCJ0cmFuc2xhdGUoMCwgMClcIjtcbn0sXG4gICAgX3JlbmRlclNWR1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyU1ZHVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcbiAgdmFyIF9yZWYyID0gY2FjaGUgfHwgdGhpcyxcbiAgICAgIHhQZXJjZW50ID0gX3JlZjIueFBlcmNlbnQsXG4gICAgICB5UGVyY2VudCA9IF9yZWYyLnlQZXJjZW50LFxuICAgICAgeCA9IF9yZWYyLngsXG4gICAgICB5ID0gX3JlZjIueSxcbiAgICAgIHJvdGF0aW9uID0gX3JlZjIucm90YXRpb24sXG4gICAgICBza2V3WCA9IF9yZWYyLnNrZXdYLFxuICAgICAgc2tld1kgPSBfcmVmMi5za2V3WSxcbiAgICAgIHNjYWxlWCA9IF9yZWYyLnNjYWxlWCxcbiAgICAgIHNjYWxlWSA9I
4674F9yZWYyLnNjYWxlWSxcbiAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgIHhPcmlnaW4gPSBfcmVmMi54T3JpZ2luLFxuICAgICAgeU9yaWdpbiA9IF9yZWYyLnlPcmlnaW4sXG4gICAgICB4T2Zmc2V0ID0gX3JlZjIueE9mZnNldCxcbiAgICAgIHlPZmZzZXQgPSBfcmVmMi55T2Zmc2V0LFxuICAgICAgZm9yY2VDU1MgPSBfcmVmMi5mb3JjZUNTUyxcbiAgICAgIHR4ID0gcGFyc2VGbG9hdCh4KSxcbiAgICAgIHR5ID0gcGFyc2VGbG9hdCh5KSxcbiAgICAgIGExMSxcbiAgICAgIGEyMSxcbiAgICAgIGExMixcbiAgICAgIGEyMixcbiAgICAgIHRlbXA7XG5cbiAgcm90YXRpb24gPSBwYXJzZUZsb2F0KHJvdGF0aW9uKTtcbiAgc2tld1ggPSBwYXJzZUZsb2F0KHNrZXdYKTtcbiAgc2tld1kgPSBwYXJzZUZsb2F0KHNrZXdZKTtcblxuICBpZiAoc2tld1kpIHtcbiAgICAvL2ZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBjb21iaW5lIGFsbCBza2V3aW5nIGludG8gdGhlIHNrZXdYIGFuZCByb3RhdGlvbiB2YWx1ZXMuIFJlbWVtYmVyLCBhIHNrZXdZIG9mIDEwIGRlZ3JlZXMgbG9va3MgdGhlIHNhbWUgYXMgYSByb3RhdGlvbiBvZiAxMCBkZWdyZWVzIHBsdXMgYSBza2V3WCBvZiAxMCBkZWdyZWVzLlxuICAgIHNrZXdZID0gcGFyc2VGbG9hdChza2V3WSk7XG4gICAgc2tld1ggKz0gc2tld1k7XG4gICAgcm90YXRpb24gKz0gc2tld1k7XG4gIH1cblxuICBpZiAocm90YXRpb24gfHwgc2tld1gpIHtcbiAgICByb3RhdGlvbiAqPSBfREVHMlJBRDtcbiAgICBza2V3WCAqPSBfREVHMlJBRDtcbiAgICBhMTEgPSBNYXRoLmNvcyhyb3RhdGlvbikgKiBzY2FsZVg7XG4gICAgYTIxID0gTWF0aC5zaW4ocm90YXRpb24pICogc2NhbGVYO1xuICAgIGExMiA9IE1hdGguc2luKHJvdGF0aW9uIC0gc2tld1gpICogLXNjYWxlWTtcbiAgICBhMjIgPSBNYXRoLmNvcyhyb3RhdGlvbiAtIHNrZXdYKSAqIHNjYWxlWTtcblxuICAgIGlmIChza2V3WCkge1xuICAgICAgc2tld1kgKj0gX0RFRzJSQUQ7XG4gICAgICB0ZW1wID0gTWF0aC50YW4oc2tld1ggLSBza2V3WSk7XG4gICAgICB0ZW1wID0gTWF0aC5zcXJ0KDEgKyB0ZW1wICogdGVtcCk7XG4gICAgICBhMTIgKj0gdGVtcDtcbiAgICAgIGEyMiAqPSB0ZW1wO1xuXG4gICAgICBpZiAoc2tld1kpIHtcbiAgICAgICAgdGVtcCA9IE1hdGgudGFuKHNrZXdZKTtcbiAgICAgICAgdGVtcCA9IE1hdGguc3FydCgxICsgdGVtcCAqIHRlbXApO1xuICAgICAgICBhMTEgKj0gdGVtcDtcbiAgICAgICAgYTIxICo9IHRlbXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYTExID0gX3JvdW5kKGExMSk7XG4gICAgYTIxID0gX3JvdW5kKGEyMSk7XG4gICAgYTEyID0gX3JvdW5kKGExMik7XG4gICAgYTIyID0gX3JvdW5kKGEyMik7XG4gIH0gZWxzZSB7XG4gICAgYTExID0gc2NhbGVYO1xuICAgIGEyMiA9IHNjYWxlWTtcbiAgICBhMjEgPSBhMTIgPSAwO1xuICB9XG5cbiAgaWYgKHR4ICYmICF+KHggKyBcIlwiKS5pbmRleE9mKFwicHhcIikgfHwgdHkgJiYgIX4oeSArIFwiXCIpLmluZGV4T2YoXCJweFwiKSkge1xuICAgIHR4ID0gX2NvbnZlcnRUb1VuaXQodGFyZ2V0LCBcInhcIiwgeCwgXCJweFwiKTtcbiAgICB0eSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgXCJ5XCIsIHksIFwicHhcIik7XG4gIH1cblxuICBpZiAoeE9yaWdpbiB8fCB5T3JpZ2luIHx8IHhPZmZzZXQgfHwgeU9mZnNldCkge1xuICAgIHR4ID0gX3JvdW5kKHR4ICsgeE9yaWdpbiAtICh4T3JpZ2luICogYTExICsgeU9yaWdpbiAqIGExMikgKyB4T2Zmc2V0KTtcbiAgICB0eSA9IF9yb3VuZCh0eSArIHlPcmlnaW4gLSAoeE9yaWdpbiAqIGEyMSArIHlPcmlnaW4gKiBhMjIpICsgeU9mZnNldCk7XG4gIH1cblxuICBpZiAoeFBlcmNlbnQgfHwgeVBlcmNlbnQpIHtcbiAgICAvL1RoZSBTVkcgc3BlYyBkb2Vzbid0IHN1cHBvcnQgcGVyY2VudGFnZS1iYXNlZCB0cmFuc2xhdGlvbiBpbiB0aGUgXCJ0cmFuc2Zvcm1cIiBhdHRyaWJ1dGUsIHNvIHdlIG1lcmdlIGl0IGludG8gdGhlIHRyYW5zbGF0aW9uIHRvIHNpbXVsYXRlIGl0LlxuICAgIHRlbXAgPSB0YXJnZXQuZ2V0QkJveCgpO1xuICAgIHR4ID0gX3JvdW5kKHR4ICsgeFBlcmNlbnQgLyAxMDAgKiB0ZW1wLndpZHRoKTtcbiAgICB0eSA9IF9yb3VuZCh0eSArIHlQZXJjZW50IC8gMTAwICogdGVtcC5oZWlnaHQpO1xuICB9XG5cbiAgdGVtcCA9IFwibWF0cml4KFwiICsgYTExICsgXCIsXCIgKyBhMjEgKyBcIixcIiArIGExMiArIFwiLFwiICsgYTIyICsgXCIsXCIgKyB0eCArIFwiLFwiICsgdHkgKyBcIilcIjtcbiAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB0ZW1wKTtcbiAgZm9yY2VDU1MgJiYgKHRhcmdldC5zdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSB0ZW1wKTsgLy9zb21lIGJyb3dzZXJzIHByaW9yaXRpemUgQ1NTIHRyYW5zZm9ybXMgb3ZlciB0aGUgdHJhbnNmb3JtIGF0dHJpYnV0ZS4gV2hlbiB3ZSBzZW5zZSB0aGF0IHRoZSB1c2VyIGhhcyBDU1MgdHJhbnNmb3JtcyBhcHBsaWVkLCB3ZSBtdXN0IG92ZXJ3cml0ZSB0aGVtIHRoaXMgd2F5IChvdGhlcndpc2Ugc29tZSBicm93c2VyIHNpbXBseSB3b24ndCByZW5kZXIgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgY2hhbmdlcyEpXG59LFxuICAgIF9hZGRSb3RhdGlvbmFsUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZFJvdGF0aW9uYWxQcm9wVHdlZW4ocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBzdGFydE51bSwgZW5kVmFsdWUpIHtcbiAgdmFyIGNhcCA9IDM2MCxcbiAgICAgIGlzU3RyaW5nID0gX2lzU3RyaW5nKGVuZFZhbHVlKSxcbiAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpICogKGlzU3RyaW5nICYmIH5lbmRWYWx1ZS5pbmRleE9mKFwicmFkXCIpID8gX1JBRDJERUcgOiAxKSxcbiAgICAgIGNoYW5nZSA9IGVuZE51bSAtIHN0YXJ0TnVtLFxuICAgICAgZmluYWxWYWx1ZSA9IHN0YXJ0TnVtICsgY2hhbmdlICsgXCJkZWdcIixcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHB0O1xuXG4gIGlmIChpc1N0cmluZykge1xuICAgIGRpcmVjdGlvbiA9IGVuZFZhbHVlLnNwbGl0KFwiX1wiKVsxXTtcblxuICAgIGlmIChkaXJlY3Rpb24gPT09IFwic2hvcnRcIikge1xuICAgICAgY2hhbmdlICU9IGNhcDtcblxuICAgICAgaWYgKGNoYW5nZSAhPT0gY2hhbmdlICUgKGNhcCAvIDIpKSB7XG4gICAgICAgIGNoYW5nZSArPSBjaGFuZ2UgPCAwID8gY2FwI
4674DogLWNhcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSBcImN3XCIgJiYgY2hhbmdlIDwgMCkge1xuICAgICAgY2hhbmdlID0gKGNoYW5nZSArIGNhcCAqIF9iaWdOdW0pICUgY2FwIC0gfn4oY2hhbmdlIC8gY2FwKSAqIGNhcDtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gXCJjY3dcIiAmJiBjaGFuZ2UgPiAwKSB7XG4gICAgICBjaGFuZ2UgPSAoY2hhbmdlIC0gY2FwICogX2JpZ051bSkgJSBjYXAgLSB+fihjaGFuZ2UgLyBjYXApICogY2FwO1xuICAgIH1cbiAgfVxuXG4gIHBsdWdpbi5fcHQgPSBwdCA9IG5ldyBQcm9wVHdlZW4ocGx1Z2luLl9wdCwgdGFyZ2V0LCBwcm9wZXJ0eSwgc3RhcnROdW0sIGNoYW5nZSwgX3JlbmRlclByb3BXaXRoRW5kKTtcbiAgcHQuZSA9IGZpbmFsVmFsdWU7XG4gIHB0LnUgPSBcImRlZ1wiO1xuXG4gIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XG5cbiAgcmV0dXJuIHB0O1xufSxcbiAgICBfYXNzaWduID0gZnVuY3Rpb24gX2Fzc2lnbih0YXJnZXQsIHNvdXJjZSkge1xuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBkb2Vzbid0IGhhdmUgT2JqZWN0LmFzc2lnbigpLCBzbyB3ZSByZWNyZWF0ZSBpdCBoZXJlLlxuICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgIHRhcmdldFtwXSA9IHNvdXJjZVtwXTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59LFxuICAgIF9hZGRSYXdUcmFuc2Zvcm1QVHMgPSBmdW5jdGlvbiBfYWRkUmF3VHJhbnNmb3JtUFRzKHBsdWdpbiwgdHJhbnNmb3JtcywgdGFyZ2V0KSB7XG4gIC8vZm9yIGhhbmRsaW5nIGNhc2VzIHdoZXJlIHNvbWVvbmUgcGFzc2VzIGluIGEgd2hvbGUgdHJhbnNmb3JtIHN0cmluZywgbGlrZSB0cmFuc2Zvcm06IFwic2NhbGUoMiwgMykgcm90YXRlKDIwZGVnKSB0cmFuc2xhdGVZKDMwZW0pXCJcbiAgdmFyIHN0YXJ0Q2FjaGUgPSBfYXNzaWduKHt9LCB0YXJnZXQuX2dzYXApLFxuICAgICAgZXhjbHVkZSA9IFwicGVyc3BlY3RpdmUsZm9yY2UzRCx0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luXCIsXG4gICAgICBzdHlsZSA9IHRhcmdldC5zdHlsZSxcbiAgICAgIGVuZENhY2hlLFxuICAgICAgcCxcbiAgICAgIHN0YXJ0VmFsdWUsXG4gICAgICBlbmRWYWx1ZSxcbiAgICAgIHN0YXJ0TnVtLFxuICAgICAgZW5kTnVtLFxuICAgICAgc3RhcnRVbml0LFxuICAgICAgZW5kVW5pdDtcblxuICBpZiAoc3RhcnRDYWNoZS5zdmcpIHtcbiAgICBzdGFydFZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcbiAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIFwiXCIpO1xuICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXM7XG4gICAgZW5kQ2FjaGUgPSBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCAxKTtcblxuICAgIF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1Qcm9wKTtcblxuICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgc3RhcnRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KVtfdHJhbnNmb3JtUHJvcF07XG4gICAgc3R5bGVbX3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtcztcbiAgICBlbmRDYWNoZSA9IF9wYXJzZVRyYW5zZm9ybSh0YXJnZXQsIDEpO1xuICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHN0YXJ0VmFsdWU7XG4gIH1cblxuICBmb3IgKHAgaW4gX3RyYW5zZm9ybVByb3BzKSB7XG4gICAgc3RhcnRWYWx1ZSA9IHN0YXJ0Q2FjaGVbcF07XG4gICAgZW5kVmFsdWUgPSBlbmRDYWNoZVtwXTtcblxuICAgIGlmIChzdGFydFZhbHVlICE9PSBlbmRWYWx1ZSAmJiBleGNsdWRlLmluZGV4T2YocCkgPCAwKSB7XG4gICAgICAvL3R3ZWVuaW5nIHRvIG5vIHBlcnNwZWN0aXZlIGdpdmVzIHZlcnkgdW5pbnR1aXRpdmUgcmVzdWx0cyAtIGp1c3Qga2VlcCB0aGUgc2FtZSBwZXJzcGVjdGl2ZSBpbiB0aGF0IGNhc2UuXG4gICAgICBzdGFydFVuaXQgPSBnZXRVbml0KHN0YXJ0VmFsdWUpO1xuICAgICAgZW5kVW5pdCA9IGdldFVuaXQoZW5kVmFsdWUpO1xuICAgICAgc3RhcnROdW0gPSBzdGFydFVuaXQgIT09IGVuZFVuaXQgPyBfY29udmVydFRvVW5pdCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpIDogcGFyc2VGbG9hdChzdGFydFZhbHVlKTtcbiAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgcGx1Z2luLl9wdCA9IG5ldyBQcm9wVHdlZW4ocGx1Z2luLl9wdCwgZW5kQ2FjaGUsIHAsIHN0YXJ0TnVtLCBlbmROdW0gLSBzdGFydE51bSwgX3JlbmRlckNTU1Byb3ApO1xuICAgICAgcGx1Z2luLl9wdC51ID0gZW5kVW5pdCB8fCAwO1xuXG4gICAgICBwbHVnaW4uX3Byb3BzLnB1c2gocCk7XG4gICAgfVxuICB9XG5cbiAgX2Fzc2lnbihlbmRDYWNoZSwgc3RhcnRDYWNoZSk7XG59OyAvLyBoYW5kbGUgc3BsaXR0aW5nIGFwYXJ0IHBhZGRpbmcsIG1hcmdpbiwgYm9yZGVyV2lkdGgsIGFuZCBib3JkZXJSYWRpdXMgaW50byB0aGVpciA0IGNvbXBvbmVudHMuIEZpcmVmb3gsIGZvciBleGFtcGxlLCB3b24ndCByZXBvcnQgYm9yZGVyUmFkaXVzIGNvcnJlY3RseSAtIGl0IHdpbGwgb25seSBkbyBib3JkZXJUb3BMZWZ0UmFkaXVzIGFuZCB0aGUgb3RoZXIgY29ybmVycy4gV2UgYWxzbyB3YW50IHRvIGhhbmRsZSBwYWRkaW5nVG9wLCBtYXJnaW5MZWZ0LCBib3JkZXJSaWdodFdpZHRoLCBldGMuXG5cblxuX2ZvckVhY2hOYW1lKFwicGFkZGluZyxtYXJnaW4sV2lkdGgsUmFkaXVzXCIsIGZ1bmN0aW9uIChuYW1lLCBpbmRleCkge1xuICB2YXIgdCA9IFwiVG9wXCIsXG4gICAgICByID0gXCJSaWdodFwiLFxuICAgICAgYiA9IFwiQm90dG9tXCIsXG4gICAgICBsID0gXCJMZWZ0XCIsXG4gICAgICBwcm9wcyA9IChpbmRleCA8IDMgPyBbdCwgciwgYiwgbF0gOiBbdCArIGwsIHQgKyByLCBiICsgciwgYiArIGxdKS5tYXAoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gaW5kZXggPCAyID8gbmFtZSArIHNpZGUgOiBcImJvcmRlclwiICsgc2lkZSArIG5hbWU7XG4gIH0pO1xuXG4gIF9zcGVjaWFsUHJvcHNbaW5kZXggPiAxID8gXCJib3JkZXJcIiArIG5hbWUgOiBuYW1lXSA9IGZ1bmN0aW9uIChwbHVnaW4sIHRhcmdldCwgcHJvcGVydHksIGVuZFZhbHVlLCB0d2Vlbikge1xuICAgIHZhciBhLCB2YXJzO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgICAvLyBnZXR0ZXIsIHBhc3NlZCB0YXJnZXQsIHByb3BlcnR5LCBhbmQgdW5pdCAoZnJvbSBfZ2V0KCkpXG4gICAgICBhID0gcHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgI
4674HJldHVybiBfZ2V0KHBsdWdpbiwgcHJvcCwgcHJvcGVydHkpO1xuICAgICAgfSk7XG4gICAgICB2YXJzID0gYS5qb2luKFwiIFwiKTtcbiAgICAgIHJldHVybiB2YXJzLnNwbGl0KGFbMF0pLmxlbmd0aCA9PT0gNSA/IGFbMF0gOiB2YXJzO1xuICAgIH1cblxuICAgIGEgPSAoZW5kVmFsdWUgKyBcIlwiKS5zcGxpdChcIiBcIik7XG4gICAgdmFycyA9IHt9O1xuICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHtcbiAgICAgIHJldHVybiB2YXJzW3Byb3BdID0gYVtpXSA9IGFbaV0gfHwgYVsoaSAtIDEpIC8gMiB8IDBdO1xuICAgIH0pO1xuICAgIHBsdWdpbi5pbml0KHRhcmdldCwgdmFycywgdHdlZW4pO1xuICB9O1xufSk7XG5cbmV4cG9ydCB2YXIgQ1NTUGx1Z2luID0ge1xuICBuYW1lOiBcImNzc1wiLFxuICByZWdpc3RlcjogX2luaXRDb3JlLFxuICB0YXJnZXRUZXN0OiBmdW5jdGlvbiB0YXJnZXRUZXN0KHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQuc3R5bGUgJiYgdGFyZ2V0Lm5vZGVUeXBlO1xuICB9LFxuICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXRzKSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5fcHJvcHMsXG4gICAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuICAgICAgICBzdGFydEF0ID0gdHdlZW4udmFycy5zdGFydEF0LFxuICAgICAgICBzdGFydFZhbHVlLFxuICAgICAgICBlbmRWYWx1ZSxcbiAgICAgICAgZW5kTnVtLFxuICAgICAgICBzdGFydE51bSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgc3BlY2lhbFByb3AsXG4gICAgICAgIHAsXG4gICAgICAgIHN0YXJ0VW5pdCxcbiAgICAgICAgZW5kVW5pdCxcbiAgICAgICAgcmVsYXRpdmUsXG4gICAgICAgIGlzVHJhbnNmb3JtUmVsYXRlZCxcbiAgICAgICAgdHJhbnNmb3JtUHJvcFR3ZWVuLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgc21vb3RoLFxuICAgICAgICBoYXNQcmlvcml0eSxcbiAgICAgICAgaW5saW5lUHJvcHMsXG4gICAgICAgIGZpbmFsVHJhbnNmb3JtVmFsdWU7XG4gICAgX3BsdWdpbkluaXR0ZWQgfHwgX2luaXRDb3JlKCk7IC8vIHdlIG1heSBjYWxsIGluaXQoKSBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBwbHVnaW4gaW5zdGFuY2UsIGxpa2Ugd2hlbiBhZGRpbmcgc3BlY2lhbCBwcm9wZXJ0aWVzLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSByZXZlcnQgZGF0YSBvciBpbmxpbmVQcm9wc1xuXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlcyB8fCBfZ2V0U3R5bGVTYXZlcih0YXJnZXQpO1xuICAgIGlubGluZVByb3BzID0gdGhpcy5zdHlsZXMucHJvcHM7XG4gICAgdGhpcy50d2VlbiA9IHR3ZWVuO1xuXG4gICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgIGlmIChwID09PSBcImF1dG9Sb3VuZFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBlbmRWYWx1ZSA9IHZhcnNbcF07XG5cbiAgICAgIGlmIChfcGx1Z2luc1twXSAmJiBfY2hlY2tQbHVnaW4ocCwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpKSB7XG4gICAgICAgIC8vIHBsdWdpbnNcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHR5cGUgPSB0eXBlb2YgZW5kVmFsdWU7XG4gICAgICBzcGVjaWFsUHJvcCA9IF9zcGVjaWFsUHJvcHNbcF07XG5cbiAgICAgIGlmICh0eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZW5kVmFsdWUgPSBlbmRWYWx1ZS5jYWxsKHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKTtcbiAgICAgICAgdHlwZSA9IHR5cGVvZiBlbmRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgfmVuZFZhbHVlLmluZGV4T2YoXCJyYW5kb20oXCIpKSB7XG4gICAgICAgIGVuZFZhbHVlID0gX3JlcGxhY2VSYW5kb20oZW5kVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlY2lhbFByb3ApIHtcbiAgICAgICAgc3BlY2lhbFByb3AodGhpcywgdGFyZ2V0LCBwLCBlbmRWYWx1ZSwgdHdlZW4pICYmIChoYXNQcmlvcml0eSA9IDEpO1xuICAgICAgfSBlbHNlIGlmIChwLnN1YnN0cigwLCAyKSA9PT0gXCItLVwiKSB7XG4gICAgICAgIC8vQ1NTIHZhcmlhYmxlXG4gICAgICAgIHN0YXJ0VmFsdWUgPSAoZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUocCkgKyBcIlwiKS50cmltKCk7XG4gICAgICAgIGVuZFZhbHVlICs9IFwiXCI7XG4gICAgICAgIF9jb2xvckV4cC5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAgIGlmICghX2NvbG9yRXhwLnRlc3Qoc3RhcnRWYWx1ZSkpIHtcbiAgICAgICAgICAvLyBjb2xvcnMgZG9uJ3QgaGF2ZSB1bml0c1xuICAgICAgICAgIHN0YXJ0VW5pdCA9IGdldFVuaXQoc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgZW5kVW5pdCA9IGdldFVuaXQoZW5kVmFsdWUpO1xuICAgICAgICAgIGVuZFVuaXQgPyBzdGFydFVuaXQgIT09IGVuZFVuaXQgJiYgKHN0YXJ0VmFsdWUgPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpICsgZW5kVW5pdCkgOiBzdGFydFVuaXQgJiYgKGVuZFZhbHVlICs9IHN0YXJ0VW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZChzdHlsZSwgXCJzZXRQcm9wZXJ0eVwiLCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgaW5kZXgsIHRhcmdldHMsIDAsIDAsIHApO1xuICAgICAgICBwcm9wcy5wdXNoKHApO1xuICAgICAgICBpbmxpbmVQcm9wcy5wdXNoKHAsIDAsIHN0eWxlW3BdKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoc3RhcnRBdCAmJiBwIGluIHN0YXJ0QXQpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIHNvbWVvbmUgaGFyZC1jb2RlcyBhIGNvbXBsZXggdmFsdWUgYXMgdGhlIHN0YXJ0LCBsaWtlIHRvcDogXCJjYWxjKDJ2aCAvIDIpXCIuIFdpdGhvdXQgdGhpcywgaXQnZCB1c2UgdGhlIGNvbXB1dGVkIHZhbHVlIChhbHdheXMgaW4gcHgpXG4gICAgICAgICAgc3RhcnRWYWx1ZSA9IHR5cGVvZiBzdGFydEF0W3BdID09PSBcImZ1bmN0aW9uXCIgPyBzdGFydEF0W3BdLmNhbGwodHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpIDogc3RhcnRBdFtwXTtcbiAgICAgICAgICBfaXNTdHJpbmcoc3RhcnRWYWx1ZSkgJiYgfnN0YXJ0VmFsdWUuaW5kZXhPZihcInJhbmRvbShcIikgJiYgKHN0YXJ0VmFsdWUgPSBfcmVwbGFjZVJhbmRvbShzdGFydFZhbHVlKSk7XG4gICAgICAgICAgZ2V0VW5pdChzdGFydFZhbHVlICsgXCJcIikgfHwgc3RhcnRWYWx1ZSA9PT0gXCJhdXRvXCIgfHwgKHN0YXJ0VmFsdWUgKz0gX2NvbmZpZy51bml0c1twXSB8fCBnZXRVbml0KF9nZXQodGFyZ2V0LCBwKSkgfHwgXCJcIik7IC8vIGZvciBjYXNlcyB3aGVuIHNvbWVvbmUgcGFzc2VzIGluIGEgdW5pdGxlc3MgdmFsdWUgbGlrZSB7eDogMTAwfTsgaWYgd2UgdHJ5IHNldHRpbmcgdHJhbnNsYXRlKDEwMCwgMHB4KSBpdCB3b24ndCB3b3JrLlxuXG4gICAgICAgICAgKHN0YXJ0VmFsdWUgKyBcIlwiKS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIChzdGFydFZhbHVlID0gX2dldCh0YXJnZXQsIHApKTsgLy8gY2FuJ3Qgd29yayB3aXRoIHJlbGF0aXZlIHZhbHVlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
4674HN0YXJ0VmFsdWUgPSBfZ2V0KHRhcmdldCwgcCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE51bSA9IHBhcnNlRmxvYXQoc3RhcnRWYWx1ZSk7XG4gICAgICAgIHJlbGF0aXZlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBlbmRWYWx1ZS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIGVuZFZhbHVlLnN1YnN0cigwLCAyKTtcbiAgICAgICAgcmVsYXRpdmUgJiYgKGVuZFZhbHVlID0gZW5kVmFsdWUuc3Vic3RyKDIpKTtcbiAgICAgICAgZW5kTnVtID0gcGFyc2VGbG9hdChlbmRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHAgaW4gX3Byb3BlcnR5QWxpYXNlcykge1xuICAgICAgICAgIGlmIChwID09PSBcImF1dG9BbHBoYVwiKSB7XG4gICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSB3aGVyZSB3ZSBjb250cm9sIHRoZSB2aXNpYmlsaXR5IGFsb25nIHdpdGggb3BhY2l0eS4gV2Ugc3RpbGwgYWxsb3cgdGhlIG9wYWNpdHkgdmFsdWUgdG8gcGFzcyB0aHJvdWdoIGFuZCBnZXQgdHdlZW5lZC5cbiAgICAgICAgICAgIGlmIChzdGFydE51bSA9PT0gMSAmJiBfZ2V0KHRhcmdldCwgXCJ2aXNpYmlsaXR5XCIpID09PSBcImhpZGRlblwiICYmIGVuZE51bSkge1xuICAgICAgICAgICAgICAvL2lmIHZpc2liaWxpdHkgaXMgaW5pdGlhbGx5IHNldCB0byBcImhpZGRlblwiLCB3ZSBzaG91bGQgaW50ZXJwcmV0IHRoYXQgYXMgaW50ZW50IHRvIG1ha2Ugb3BhY2l0eSAwIChhIGNvbnZlbmllbmNlKVxuICAgICAgICAgICAgICBzdGFydE51bSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlubGluZVByb3BzLnB1c2goXCJ2aXNpYmlsaXR5XCIsIDAsIHN0eWxlLnZpc2liaWxpdHkpO1xuXG4gICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBzdHlsZSwgXCJ2aXNpYmlsaXR5XCIsIHN0YXJ0TnVtID8gXCJpbmhlcml0XCIgOiBcImhpZGRlblwiLCBlbmROdW0gPyBcImluaGVyaXRcIiA6IFwiaGlkZGVuXCIsICFlbmROdW0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwICE9PSBcInNjYWxlXCIgJiYgcCAhPT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgcCA9IF9wcm9wZXJ0eUFsaWFzZXNbcF07XG4gICAgICAgICAgICB+cC5pbmRleE9mKFwiLFwiKSAmJiAocCA9IHAuc3BsaXQoXCIsXCIpWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpc1RyYW5zZm9ybVJlbGF0ZWQgPSBwIGluIF90cmFuc2Zvcm1Qcm9wczsgLy8tLS0gVFJBTlNGT1JNLVJFTEFURUQgLS0tXG5cbiAgICAgICAgaWYgKGlzVHJhbnNmb3JtUmVsYXRlZCkge1xuICAgICAgICAgIHRoaXMuc3R5bGVzLnNhdmUocCk7XG4gICAgICAgICAgZmluYWxUcmFuc2Zvcm1WYWx1ZSA9IGVuZFZhbHVlOyAvLyB0aGlzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyBlbmRWYWx1ZSBleGNlcHQgd2hlbiBpdCdzIGEgdmFyKC0tKSB2YWx1ZSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgZW5kIHZhbHVlLlxuXG4gICAgICAgICAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIgJiYgZW5kVmFsdWUuc3Vic3RyaW5nKDAsIDYpID09PSBcInZhcigtLVwiKSB7XG4gICAgICAgICAgICBlbmRWYWx1ZSA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgZW5kVmFsdWUuc3Vic3RyaW5nKDQsIGVuZFZhbHVlLmluZGV4T2YoXCIpXCIpKSk7XG5cbiAgICAgICAgICAgIGlmIChlbmRWYWx1ZS5zdWJzdHJpbmcoMCwgNSkgPT09IFwiY2FsYyhcIikge1xuICAgICAgICAgICAgICB2Y
4674XIgb3JpZ1BlcnNwZWN0aXZlID0gdGFyZ2V0LnN0eWxlLnBlcnNwZWN0aXZlO1xuICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUucGVyc3BlY3RpdmUgPSBlbmRWYWx1ZTtcbiAgICAgICAgICAgICAgZW5kVmFsdWUgPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIFwicGVyc3BlY3RpdmVcIik7XG4gICAgICAgICAgICAgIG9yaWdQZXJzcGVjdGl2ZSA/IHRhcmdldC5zdHlsZS5wZXJzcGVjdGl2ZSA9IG9yaWdQZXJzcGVjdGl2ZSA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIFwicGVyc3BlY3RpdmVcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdHJhbnNmb3JtUHJvcFR3ZWVuKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRhcmdldC5fZ3NhcDtcbiAgICAgICAgICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybSAmJiAhdmFycy5wYXJzZVRyYW5zZm9ybSB8fCBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB2YXJzLnBhcnNlVHJhbnNmb3JtKTsgLy8gaWYsIGZvciBleGFtcGxlLCBnc2FwLnNldCguLi4ge3RyYW5zZm9ybTpcInRyYW5zbGF0ZVgoNTB2dylcIn0pLCB0aGUgX2dldCgpIGNhbGwgZG9lc24ndCBwYXJzZSB0aGUgdHJhbnNmb3JtLCB0aHVzIGNhY2hlLnJlbmRlclRyYW5zZm9ybSB3b24ndCBiZSBzZXQgeWV0IHNvIGZvcmNlIHRoZSBwYXJzaW5nIG9mIHRoZSB0cmFuc2Zvcm0gaGVyZS5cblxuICAgICAgICAgICAgc21vb3RoID0gdmFycy5zbW9vdGhPcmlnaW4gIT09IGZhbHNlICYmIGNhY2hlLnNtb290aDtcbiAgICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2VlbiA9IHRoaXMuX3B0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgc3R5bGUsIF90cmFuc2Zvcm1Qcm9wLCAwLCAxLCBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0sIGNhY2hlLCAwLCAtMSk7IC8vdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgY3JlYXRlIHRoZSByZW5kZXJpbmcgUHJvcFR3ZWVuIHNvIHRoYXQgaXQgcnVucyBMQVNUIChpbiB0aGUgbGlua2VkIGxpc3QsIHdlIGtlZXAgYWRkaW5nIHRvIHRoZSBiZWdpbm5pbmcpXG5cbiAgICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2Vlbi5kZXAgPSAxOyAvL2ZsYWcgaXQgYXMgZGVwZW5kZW50IHNvIHRoYXQgaWYgdGhpbmdzIGdldCBraWxsZWQvb3ZlcndyaXR0ZW4gYW5kIHRoaXMgaXMgdGhlIG9ubHkgUHJvcFR3ZWVuIGxlZnQsIHdlIGNhbiBzYWZlbHkga2lsbCB0aGUgd2hvbGUgdHdlZW4uXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHAgPT09IFwic2NhbGVcIikge1xuICAgICAgICAgICAgdGhpcy5fcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCBjYWNoZSwgXCJzY2FsZVlcIiwgY2FjaGUuc2NhbGVZLCAocmVsYXRpdmUgPyBfcGFyc2VSZWxhdGl2ZShjYWNoZS5zY2FsZVksIHJlbGF0aXZlICsgZW5kTnVtKSA6IGVuZE51bSkgLSBjYWNoZS5zY2FsZVkgfHwgMCwgX3JlbmRlckNTU1Byb3ApO1xuICAgICAgICAgICAgdGhpcy5fcHQudSA9IDA7XG4gICAgICAgICAgICBwcm9wcy5wdXNoKFwic2NhbGVZXCIsIHApO1xuICAgICAgICAgICAgcCArPSBcIlhcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwidHJhbnNmb3JtT3JpZ2luXCIpIHtcbiAgICAgICAgICAgIGlubGluZVByb3BzLnB1c2goX3RyYW5zZm9ybU9yaWdpblByb3AsIDAsIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSk7XG4gICAgICAgICAgICBlbmRWYWx1ZSA9IF9jb252ZXJ0S2V5d29yZHNUb1BlcmNlbnRhZ2VzKGVuZFZhbHVlKTsgLy9pbiBjYXNlIHNvbWV0aGluZyBsaWtlIFwibGVmdCB0b3BcIiBvciBcImJvdHRvbSByaWdodFwiIGlzIHBhc3NlZCBpbi4gQ29udmVydCB0byBwZXJjZW50YWdlcy5cblxuICAgICAgICAgICAgaWYgKGNhY2hlLnN2Zykge1xuICAgICAgICAgICAgICBfYXBwbHlTVkdPcmlnaW4odGFyZ2V0LCBlbmRWYWx1ZSwgMCwgc21vb3RoLCAwLCB0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVuZFVuaXQgPSBwYXJzZUZsb2F0KGVuZFZhbHVlLnNwbGl0KFwiIFwiKVsyXSkgfHwgMDsgLy9oYW5kbGUgdGhlIHpPcmlnaW4gc2VwYXJhdGVseSFcblxuICAgICAgICAgICAgICBlbmRVbml0ICE9PSBjYWNoZS56T3JpZ2luICYmIF9hZGROb25Ud2VlbmluZ1BUKHRoaXMsIGNhY2hlLCBcInpPcmlnaW5cIiwgY2FjaGUuek9yaWdpbiwgZW5kVW5pdCk7XG5cbiAgICAgICAgICAgICAgX2FkZE5vblR3ZWVuaW5nUFQodGhpcywgc3R5bGUsIHAsIF9maXJzdFR3b09ubHkoc3RhcnRWYWx1ZSksIF9maXJzdFR3b09ubHkoZW5kVmFsdWUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInN2Z09yaWdpblwiKSB7XG4gICAgICAgICAgICBfYXBwbHlTVkdPcmlnaW4odGFyZ2V0LCBlbmRWYWx1ZSwgMSwgc21vb3RoLCAwLCB0aGlzKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwIGluIF9yb3RhdGlvbmFsUHJvcGVydGllcykge1xuICAgICAgICAgICAgX2FkZFJvdGF0aW9uYWxQcm9wVHdlZW4odGhpcywgY2FjaGUsIHAsIHN0YXJ0TnVtLCByZWxhdGl2ZSA/IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCByZWxhdGl2ZSArIGVuZFZhbHVlKSA6IGVuZFZhbHVlKTtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInNtb290aE9yaWdpblwiKSB7XG4gICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBjYWNoZSwgXCJzbW9vdGhcIiwgY2FjaGUuc21vb3RoLCBlbmRWYWx1ZSk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocCA9PT0gXCJmb3JjZTNEXCIpIHtcbiAgICAgICAgICAgIGNhY2hlW3BdID0gZW5kVmFsdWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIF9hZGRSYXdUcmFuc2Zvcm1QVHModGhpcywgZW5kVmFsdWUsIHRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgI
4674H1cbiAgICAgICAgfSBlbHNlIGlmICghKHAgaW4gc3R5bGUpKSB7XG4gICAgICAgICAgcCA9IF9jaGVja1Byb3BQcmVmaXgocCkgfHwgcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQgfHwgKGVuZE51bSB8fCBlbmROdW0gPT09IDApICYmIChzdGFydE51bSB8fCBzdGFydE51bSA9PT0gMCkgJiYgIV9jb21wbGV4RXhwLnRlc3QoZW5kVmFsdWUpICYmIHAgaW4gc3R5bGUpIHtcbiAgICAgICAgICBzdGFydFVuaXQgPSAoc3RhcnRWYWx1ZSArIFwiXCIpLnN1YnN0cigoc3RhcnROdW0gKyBcIlwiKS5sZW5ndGgpO1xuICAgICAgICAgIGVuZE51bSB8fCAoZW5kTnVtID0gMCk7IC8vIHByb3RlY3QgYWdhaW5zdCBOYU5cblxuICAgICAgICAgIGVuZFVuaXQgPSBnZXRVbml0KGVuZFZhbHVlKSB8fCAocCBpbiBfY29uZmlnLnVuaXRzID8gX2NvbmZpZy51bml0c1twXSA6IHN0YXJ0VW5pdCk7XG4gICAgICAgICAgc3RhcnRVbml0ICE9PSBlbmRVbml0ICYmIChzdGFydE51bSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgZW5kVW5pdCkpO1xuICAgICAgICAgIHRoaXMuX3B0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgaXNUcmFuc2Zvcm1SZWxhdGVkID8gY2FjaGUgOiBzdHlsZSwgcCwgc3RhcnROdW0sIChyZWxhdGl2ZSA/IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCByZWxhdGl2ZSArIGVuZE51bSkgOiBlbmROdW0pIC0gc3RhcnROdW0sICFpc1RyYW5zZm9ybVJlbGF0ZWQgJiYgKGVuZFVuaXQgPT09IFwicHhcIiB8fCBwID09PSBcInpJbmRleFwiKSAmJiB2YXJzLmF1dG9Sb3VuZCAhPT0gZmFsc2UgPyBfcmVuZGVyUm91bmRlZENTU1Byb3AgOiBfcmVuZGVyQ1NTUHJvcCk7XG4gICAgICAgICAgdGhpcy5fcHQudSA9IGVuZFVuaXQgfHwgMDtcblxuICAgICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQgJiYgZmluYWxUcmFuc2Zvcm1WYWx1ZSAhPT0gZW5kVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3B0LmIgPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcHQuZSA9IGZpbmFsVHJhbnNmb3JtVmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9wdC5yID0gX3JlbmRlckNTU1Byb3BXaXRoQmVnaW5uaW5nQW5kRW5kO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRVbml0ICE9PSBlbmRVbml0ICYmIGVuZFVuaXQgIT09IFwiJVwiKSB7XG4gICAgICAgICAgICAvL3doZW4gdGhlIHR3ZWVuIGdvZXMgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYmVnaW5uaW5nLCB3ZSBuZWVkIHRvIHJldmVydCBpdCB0byB0aGUgT0xEL09SSUdJTkFMIHZhbHVlICh3aXRoIHRob3NlIHVuaXRzKS4gV2UgcmVjb3JkIHRoYXQgYXMgYSBcImJcIiAoYmVnaW5uaW5nKSBwcm9wZXJ0eSBhbmQgcG9pbnQgdG8gYSByZW5kZXIgbWV0aG9kIHRoYXQgaGFuZGxlcyB0aGF0LiAocGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fcHQuYiA9IHN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9wdC5yID0gX3JlbmRlckNTU1Byb3BXaXRoQmVnaW5uaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKHAgaW4gc3R5bGUpKSB7XG4gICAgICAgICAgaWYgKHAgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAvL21heWJlIGl0J3Mgbm90IGEgc3R5bGUgLSBpdCBjb3VsZCBiZSBhIHByb3BlcnR5IGFkZGVkIGRpcmVjdGx5IHRvIGFuIGVsZW1lbnQgaW4gd2hpY2ggY2FzZSB3ZSdsb
4674CB0cnkgdG8gYW5pbWF0ZSB0aGF0LlxuICAgICAgICAgICAgdGhpcy5hZGQodGFyZ2V0LCBwLCBzdGFydFZhbHVlIHx8IHRhcmdldFtwXSwgcmVsYXRpdmUgPyByZWxhdGl2ZSArIGVuZFZhbHVlIDogZW5kVmFsdWUsIGluZGV4LCB0YXJnZXRzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHAgIT09IFwicGFyc2VUcmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgX21pc3NpbmdQbHVnaW4ocCwgZW5kVmFsdWUpO1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3R3ZWVuQ29tcGxleENTU1N0cmluZy5jYWxsKHRoaXMsIHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgcmVsYXRpdmUgPyByZWxhdGl2ZSArIGVuZFZhbHVlIDogZW5kVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNUcmFuc2Zvcm1SZWxhdGVkIHx8IChwIGluIHN0eWxlID8gaW5saW5lUHJvcHMucHVzaChwLCAwLCBzdHlsZVtwXSkgOiB0eXBlb2YgdGFyZ2V0W3BdID09PSBcImZ1bmN0aW9uXCIgPyBpbmxpbmVQcm9wcy5wdXNoKHAsIDIsIHRhcmdldFtwXSgpKSA6IGlubGluZVByb3BzLnB1c2gocCwgMSwgc3RhcnRWYWx1ZSB8fCB0YXJnZXRbcF0pKTtcbiAgICAgICAgcHJvcHMucHVzaChwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNQcmlvcml0eSAmJiBfc29ydFByb3BUd2VlbnNCeVByaW9yaXR5KHRoaXMpO1xuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihyYXRpbywgZGF0YSkge1xuICAgIGlmIChkYXRhLnR3ZWVuLl90aW1lIHx8ICFfcmV2ZXJ0aW5nKCkpIHtcbiAgICAgIHZhciBwdCA9IGRhdGEuX3B0O1xuXG4gICAgICB3aGlsZSAocHQpIHtcbiAgICAgICAgcHQucihyYXRpbywgcHQuZCk7XG4gICAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEuc3R5bGVzLnJldmVydCgpO1xuICAgIH1cbiAgfSxcbiAgZ2V0OiBfZ2V0LFxuICBhbGlhc2VzOiBfcHJvcGVydHlBbGlhc2VzLFxuICBnZXRTZXR0ZXI6IGZ1bmN0aW9uIGdldFNldHRlcih0YXJnZXQsIHByb3BlcnR5LCBwbHVnaW4pIHtcbiAgICAvL3JldHVybnMgYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRhcmdldCwgcHJvcGVydHksIHZhbHVlIGFuZCBhcHBsaWVzIGl0IGFjY29yZGluZ2x5LiBSZW1lbWJlciwgcHJvcGVydGllcyBsaWtlIFwieFwiIGFyZW4ndCBhcyBzaW1wbGUgYXMgdGFyZ2V0LnN0eWxlLnByb3BlcnR5ID0gdmFsdWUgYmVjYXVzZSB0aGV5J3ZlIGdvdCB0byBiZSBhcHBsaWVkIHRvIGEgcHJveHkgb2JqZWN0IGFuZCB0aGVuIG1lcmdlZCBpbnRvIGEgdHJhbnNmb3JtIHN0cmluZyBpbiBhIHJlbmRlcmVyLlxuICAgIHZhciBwID0gX3Byb3BlcnR5QWxpYXNlc1twcm9wZXJ0eV07XG4gICAgcCAmJiBwLmluZGV4T2YoXCIsXCIpIDwgMCAmJiAocHJvcGVydHkgPSBwKTtcbiAgICByZXR1cm4gcHJvcGVydHkgaW4gX3RyYW5zZm9ybVByb3BzICYmIHByb3BlcnR5ICE9PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCAmJiAodGFyZ2V0Ll9nc2FwLnggfHwgX2dldCh0YXJnZXQsIFwieFwiKSkgPyBwbHVnaW4gJiYgX3JlY2VudFNldHRlclBsdWdpbiA9PT0gcGx1Z2luID8gcHJvcGVydHkgPT09IFwic2NhbGVcIiA/IF9zZXR0ZXJTY2FsZSA6IF9zZXR0ZXJUcmFuc2Zvcm0gOiAoX3JlY2VudFNldHRlclBsdWdpbiA9IHBsdWdpbiB8fCB7fSkgJiYgKHByb3BlcnR5ID09PSBcInNjYWxlXCIgPyBfc2V0dGVyU2NhbGVXaXRoUmVuZGVyIDogX3NldHRlclRyYW5zZm9ybVdpdGhSZW5kZXIpIDogdGFyZ2V0LnN0eWxlICYmICFfaXNVbmRlZmluZWQodGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSkgPyBfc2V0dGVyQ1NTU3R5bGUgOiB+cHJvcGVydHkuaW5kZXhPZihcIi1cIikgPyBfc2V0dGVyQ1NTUHJvcCA6IF9nZXRTZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gIH0sXG4gIGNvcmU6IHtcbiAgICBfcmVtb3ZlUHJvcGVydHk6IF9yZW1vdmVQcm9wZXJ0eSxcbiAgICBfZ2V0TWF0cml4OiBfZ2V0TWF0cml4XG4gIH1cbn07XG5nc2FwLnV0aWxzLmNoZWNrUHJlZml4ID0gX2NoZWNrUHJvcFByZWZpeDtcbmdzYXAuY29yZS5nZXRTdHlsZVNhdmVyID0gX2dldFN0eWxlU2F2ZXI7XG5cbihmdW5jdGlvbiAocG9zaXRpb25BbmRTY2FsZSwgcm90YXRpb24sIG90aGVycywgYWxpYXNlcykge1xuICB2YXIgYWxsID0gX2ZvckVhY2hOYW1lKHBvc2l0aW9uQW5kU2NhbGUgKyBcIixcIiArIHJvdGF0aW9uICsgXCIsXCIgKyBvdGhlcnMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX3RyYW5zZm9ybVByb3BzW25hbWVdID0gMTtcbiAgfSk7XG5cbiAgX2ZvckVhY2hOYW1lKHJvdGF0aW9uLCBmdW5jdGlvbiAobmFtZSkge1xuICAgIF9jb25maWcudW5pdHNbbmFtZV0gPSBcImRlZ1wiO1xuICAgIF9yb3RhdGlvbmFsUHJvcGVydGllc1tuYW1lXSA9IDE7XG4gIH0pO1xuXG4gIF9wcm9wZXJ0eUFsaWFzZXNbYWxsWzEzXV0gPSBwb3NpdGlvbkFuZFNjYWxlICsgXCIsXCIgKyByb3RhdGlvbjtcblxuICBfZm9yRWFjaE5hbWUoYWxpYXNlcywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3BsaXQgPSBuYW1lLnNwbGl0KFwiOlwiKTtcbiAgICBfcHJvcGVydHlBbGlhc2VzW3NwbGl0WzFdXSA9IGFsbFtzcGxpdFswXV07XG4gIH0pO1xufSkoXCJ4LHkseixzY2FsZSxzY2FsZVgsc2NhbGVZLHhQZXJjZW50LHlQZXJjZW50XCIsIFwicm90YXRpb24scm90YXRpb25YLHJvdGF0aW9uWSxza2V3WCxza2V3WVwiLCBcInRyYW5zZm9ybSx0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luLGZvcmNlM0Qsc21vb3RoT3JpZ2luLHRyYW5zZm9ybVBlcnNwZWN0aXZlXCIsIFwiMDp0cmFuc2xhdGVYLDE6dHJhbnNsYXRlWSwyOnRyYW5zbGF0ZVosODpyb3RhdGUsODpyb3RhdGlvblosODpyb3RhdGVaLDk6cm90YXRlWCwxMDpyb3RhdGVZXCIpO1xuXG5fZm9yRWFjaE5hbWUoXCJ4LHkseix0b3AscmlnaHQsYm90dG9tLGxlZnQsd2lkdGgsaGVpZ2h0LGZvbnRTaXplLHBhZGRpbmcsbWFyZ2luLHBlcnNwZWN0aXZlXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIF9jb25maWcudW5pdHNbbmFtZV0gPSBcInB4XCI7XG59KTtcblxuZ3NhcC5yZWdpc3RlclBsdWdpbihDU1NQbHVnaW4pO1xuZXhwb3J0IHsgQ1NTUGx1Z2luIGFzIGRlZmF1bHQsIF9nZXRCQm94LCBfY3JlYXRlRWxlbWVudCwgX2NoZWNrUHJvcFByZWZpeCBhcyBjaGVja1ByZWZpeCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 4675//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js 4676 4677}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 4678/* harmony export */ __webpack_require__.d(__webpack_exports__, {
vendor: 10,476 bytes, lines 4679-4933
4679/* harmony export */ Observer: () => (/* binding */ Observer), 4680/* harmony export */ _getProxyProp: () => (/* binding */ _getProxyProp), 4681/* harmony export */ _getScrollFunc: () => (/* binding */ _getScrollFunc), 4682/* harmony export */ _getTarget: () => (/* binding */ _getTarget), 4683/* harmony export */ _getVelocityProp: () => (/* binding */ _getVelocityProp), 4684/* harmony export */ _horizontal: () => (/* binding */ _horizontal), 4685/* harmony export */ _isViewport: () => (/* binding */ _isViewport), 4686/* harmony export */ _proxies: () => (/* binding */ _proxies), 4687/* harmony export */ _scrollers: () => (/* binding */ _scrollers), 4688/* harmony export */ _vertical: () => (/* binding */ _vertical), 4689/* harmony export */ "default": () => (/* binding */ Observer) 4690/* harmony export */ }); 4691function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 4692 4693function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 4694 4695/*! 4696 * Observer 3.15.0 4697 * https://gsap.com 4698 * 4699 * @license Copyright 2008-2026, GreenSock. All rights reserved. 4700 * Subject to the terms at https://gsap.com/standard-license 4701 * @author: Jack Doyle, [email protected] 4702*/ 4703 4704/* eslint-disable */ 4705var gsap, 4706 _coreInitted, 4707 _clamp, 4708 _win, 4709 _doc, 4710 _docEl, 4711 _body, 4712 _isTouch, 4713 _pointerType, 4714 ScrollTrigger, 4715 _root, 4716 _normalizer, 4717 _eventTypes, 4718 _context, 4719 _getGSAP = function _getGSAP() { 4720 return gsap || typeof window !== "undefined" && (gsap = window.gsap) && gsap.registerPlugin && gsap; 4721}, 4722 _startup = 1, 4723 _observers = [], 4724 _scrollers = [], 4725 _proxies = [], 4726 _getTime = Date.now, 4727 _bridge = function _bridge(name, value) { 4728 return value; 4729}, 4730 _integrate = function _integrate() { 4731 var core = ScrollTrigger.core, 4732 data = core.bridge || {}, 4733 scrollers = core._scrollers, 4734 proxies = core._proxies; 4735 scrollers.push.apply(scrollers, _scrollers); 4736 proxies.push.apply(proxies, _proxies); 4737 _scrollers = scrollers; 4738 _proxies = proxies; 4739 4740 _bridge = function _bridge(name, value) { 4741 return data[name](value); 4742 }; 4743}, 4744 _getProxyProp = function _getProxyProp(element, property) { 4745 return ~_proxies.indexOf(element) && _proxies[_proxies.indexOf(element) + 1][property]; 4746}, 4747 _isViewport = function _isViewport(el) { 4748 return !!~_root.indexOf(el); 4749}, 4750 _addListener = function _addListener(element, type, func, passive, capture) { 4751 return element.addEventListener(type, func, { 4752 passive: passive !== false, 4753 capture: !!capture 4754 }); 4755}, 4756 _removeListener = function _removeListener(element, type, func, capture) { 4757 return element.removeEventListener(type, func, !!capture); 4758}, 4759 _scrollLeft = "scrollLeft", 4760 _scrollTop = "scrollTop", 4761 _onScroll = function _onScroll() { 4762 return _normalizer && _normalizer.isPressed || _scrollers.cache++; 4763}, 4764 _scrollCacheFunc = function _scrollCacheFunc(f, doNotCache) { 4765 var cachingFunc = function cachingFunc(value) { 4766 // since reading the scrollTop/scrollLeft/pageOffsetY/pageOffsetX can trigger a layout, this function allows us to cache the value so it only gets read fresh after a "scroll" event fires (or while we're refreshing because that can lengthen the page and alter the scroll position). when "soft" is true, that means don't actually set the scroll, but cache the new value instead (useful in ScrollSmoother) 4767 if (value || value === 0) { 4768 _startup && (_win.history.scrollRestoration = "manual"); // otherwise the new position will get overwritten by the browser onload. 4769 4770 var isNormalizing = _normalizer && _normalizer.isPressed; 4771 value = cachingFunc.v = Math.round(value) || (_normalizer && _normalizer.iOS ? 1 : 0); //TODO: iOS Bug: if you allow it to go to 0, Safari can start to report super strange (wildly inaccurate) touch positions! 4772 4773 f(value); 4774 cachingFunc.cacheID = _scrollers.cache; 4775 isNormalizing && _bridge("ss", value); // set scroll (notify ScrollTrigger so it can dispatch a "scrollStart" event if necessary 4776 } else if (doNotCache || _scrollers.cache !== cachingFunc.cacheID || _bridge("ref")) { 4777 cachingFunc.cacheID = _scrollers.cache; 4778 cachingFunc.v = f(); 4779 } 4780 4781 return cachingFunc.v + cachingFunc.offset; 4782 }; 4783 4784 cachingFunc.offset = 0; 4785 return f && cachingFunc; 4786}, 4787 _horizontal = { 4788 s: _scrollLeft, 4789 p: "left", 4790 p2: "Left", 4791 os: "right", 4792 os2: "Right", 4793 d: "width", 4794 d2: "Width", 4795 a: "x", 4796 sc: _scrollCacheFunc(function (value) { 4797 return arguments.length ? _win.scrollTo(value, _vertical.sc()) : _win.pageXOffset || _doc[_scrollLeft] || _docEl[_scrollLeft] || _body[_scrollLeft] || 0; 4798 }) 4799}, 4800 _vertical = { 4801 s: _scrollTop, 4802 p: "top", 4803 p2: "Top", 4804 os: "bottom", 4805 os2: "Bottom", 4806 d: "height", 4807 d2: "Height", 4808 a: "y", 4809 op: _horizontal, 4810 sc: _scrollCacheFunc(function (value) { 4811 return arguments.length ? _win.scrollTo(_horizontal.sc(), value) : _win.pageYOffset || _doc[_scrollTop] || _docEl[_scrollTop] || _body[_scrollTop] || 0; 4812 }) 4813}, 4814 _getTarget = function _getTarget(t, self) { 4815 return (self && self._ctx && self._ctx.selector || gsap.utils.toArray)(t)[0] || (typeof t === "string" && gsap.config().nullTargetWarn !== false ? console.warn("Element not found:", t) : null); 4816}, 4817 _isWithin = function _isWithin(element, list) { 4818 // check if the element is in the list or is a descendant of an element in the list. 4819 var i = list.length; 4820 4821 while (i--) { 4822 if (list[i] === element || list[i].contains(element)) { 4823 return true; 4824 } 4825 } 4826 4827 return false; 4828}, 4829 _getScrollFunc = function _getScrollFunc(element, _ref) { 4830 var s = _ref.s, 4831 sc = _ref.sc; 4832 // we store the scroller functions in an alternating sequenced Array like [element, verticalScrollFunc, horizontalScrollFunc, ...] so that we can minimize memory, maximize performance, and we also record the last position as a ".rec" property in order to revert to that after refreshing to ensure things don't shift around. 4833 _isViewport(element) && (element = _doc.scrollingElement || _docEl); 4834 4835 var i = _scrollers.indexOf(element), 4836 offset = sc === _vertical.sc ? 1 : 2; 4837 4838 !~i && (i = _scrollers.push(element) - 1); 4839 _scrollers[i + offset] || _addListener(element, "scroll", _onScroll); // clear the cache when a scroll occurs 4840 4841 var prev = _scrollers[i + offset], 4842 func = prev || (_scrollers[i + offset] = _scrollCacheFunc(_getProxyProp(element, s), true) || (_isViewport(element) ? sc : _scrollCacheFunc(function (value) { 4843 return arguments.length ? element[s] = value : element[s]; 4844 }))); 4845 func.target = element; 4846 prev || (func.smooth = gsap.getProperty(element, "scrollBehavior") === "smooth"); // only set it the first time (don't reset every time a scrollFunc is requested because perhaps it happens during a refresh() when it's disabled in ScrollTrigger. 4847 4848 return func; 4849}, 4850 _getVelocityProp = function _getVelocityProp(value, minTimeRefresh, useDelta) { 4851 var v1 = value, 4852 v2 = value, 4853 t1 = _getTime(), 4854 t2 = t1, 4855 min = minTimeRefresh || 50, 4856 dropToZeroTime = Math.max(500, min * 3), 4857 update = function update(value, force) { 4858 var t = _getTime(); 4859 4860 if (force || t - t1 > min) { 4861 v2 = v1; 4862 v1 = value; 4863 t2 = t1; 4864 t1 = t; 4865 } else if (useDelta) { 4866 v1 += value; 4867 } else { 4868 // not totally necessary, but makes it a bit more accurate by adjusting the v1 value according to the new slope. This way we're not just ignoring the incoming data. Removing for now because it doesn't seem to make much practical difference and it's probably not worth the kb. 4869 v1 = v2 + (value - v2) / (t - t2) * (t1 - t2); 4870 } 4871 }, 4872 reset = function reset() { 4873 v2 = v1 = useDelta ? 0 : v1; 4874 t2 = t1 = 0; 4875 }, 4876 getVelocity = function getVelocity(latestValue) { 4877 var tOld = t2, 4878 vOld = v2, 4879 t = _getTime(); 4880 4881 (latestValue || latestValue === 0) && latestValue !== v1 && update(latestValue); 4882 return t1 === t2 || t - t2 > dropToZeroTime ? 0 : (v1 + (useDelta ? vOld : -vOld)) / ((useDelta ? t : t1) - tOld) * 1000; 4883 }; 4884 4885 return { 4886 update: update, 4887 reset: reset, 4888 getVelocity: getVelocity 4889 }; 4890}, 4891 _getEvent = function _getEvent(e, preventDefault) { 4892 preventDefault && !e._gsapAllow && e.cancelable !== false && e.preventDefault(); 4893 return e.changedTouches ? e.changedTouches[0] : e; 4894}, 4895 _getAbsoluteMax = function _getAbsoluteMax(a) { 4896 var max = Math.max.apply(Math, a), 4897 min = Math.min.apply(Math, a); 4898 return Math.abs(max) >= Math.abs(min) ? max : min; 4899}, 4900 _setScrollTrigger = function _setScrollTrigger() { 4901 ScrollTrigger = gsap.core.globals().ScrollTrigger; 4902 ScrollTrigger && ScrollTrigger.core && _integrate(); 4903}, 4904 _initCore = function _initCore(core) { 4905 gsap = core || _getGSAP(); 4906 4907 if (!_coreInitted && gsap && typeof document !== "undefined" && document.body) { 4908 _win = window; 4909 _doc = document; 4910 _docEl = _doc.documentElement; 4911 _body = _doc.body; 4912 _root = [_win, _doc, _docEl, _body]; 4913 _clamp = gsap.utils.clamp; 4914 4915 _context = gsap.core.context || function () {}; 4916 4917 _pointerType = "onpointerenter" in _body ? "pointer" : "mouse"; // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer. 4918 4919 _isTouch = Observer.isTouch = _win.matchMedia && _win.matchMedia("(hover: none), (pointer: coarse)").matches ? 1 : "ontouchstart" in _win || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 ? 2 : 0; 4920 _eventTypes = Observer.eventTypes = ("ontouchstart" in _docEl ? "touchstart,touchmove,touchcancel,touchend" : !("onpointerdown" in _docEl) ? "mousedown,mousemove,mouseup,mouseup" : "pointerdown,pointermove,pointercancel,pointerup").split(","); 4921 setTimeout(function () { 4922 return _startup = 0; 4923 }, 500); 4924 _coreInitted = 1; 4925 } 4926 4927 ScrollTrigger || _setScrollTrigger(); // Observer might be initted BEFORE ScrollTrigger, so don't put this with the initting code. ScrollTrigger will call Observer.register() when it inits. 4928 4929 return _coreInitted; 4930}; 4931 4932_horizontal.op = _vertical; 4933_scrollers.cache = 0;
vendor: 16,441 bytes, lines 4934-5396
4934var Observer = /*#__PURE__*/function () { 4935 function Observer(vars) { 4936 this.init(vars); 4937 } 4938 4939 var _proto = Observer.prototype; 4940 4941 _proto.init = function init(vars) { 4942 _coreInitted || _initCore(gsap) || console.warn("Please gsap.registerPlugin(Observer)"); 4943 ScrollTrigger || _setScrollTrigger(); 4944 var tolerance = vars.tolerance, 4945 dragMinimum = vars.dragMinimum, 4946 type = vars.type, 4947 target = vars.target, 4948 lineHeight = vars.lineHeight, 4949 debounce = vars.debounce, 4950 preventDefault = vars.preventDefault, 4951 onStop = vars.onStop, 4952 onStopDelay = vars.onStopDelay, 4953 ignore = vars.ignore, 4954 wheelSpeed = vars.wheelSpeed, 4955 event = vars.event, 4956 onDragStart = vars.onDragStart, 4957 onDragEnd = vars.onDragEnd, 4958 onDrag = vars.onDrag, 4959 onPress = vars.onPress, 4960 onRelease = vars.onRelease, 4961 onRight = vars.onRight, 4962 onLeft = vars.onLeft, 4963 onUp = vars.onUp, 4964 onDown = vars.onDown, 4965 onChangeX = vars.onChangeX, 4966 onChangeY = vars.onChangeY, 4967 onChange = vars.onChange, 4968 onToggleX = vars.onToggleX, 4969 onToggleY = vars.onToggleY, 4970 onHover = vars.onHover, 4971 onHoverEnd = vars.onHoverEnd, 4972 onMove = vars.onMove, 4973 ignoreCheck = vars.ignoreCheck, 4974 isNormalizer = vars.isNormalizer, 4975 onGestureStart = vars.onGestureStart, 4976 onGestureEnd = vars.onGestureEnd, 4977 onWheel = vars.onWheel, 4978 onEnable = vars.onEnable, 4979 onDisable = vars.onDisable, 4980 onClick = vars.onClick, 4981 scrollSpeed = vars.scrollSpeed, 4982 capture = vars.capture, 4983 allowClicks = vars.allowClicks, 4984 lockAxis = vars.lockAxis, 4985 onLockAxis = vars.onLockAxis; 4986 this.target = target = _getTarget(target) || _docEl; 4987 this.vars = vars; 4988 ignore && (ignore = gsap.utils.toArray(ignore)); 4989 tolerance = tolerance || 1e-9; 4990 dragMinimum = dragMinimum || 0; 4991 wheelSpeed = wheelSpeed || 1; 4992 scrollSpeed = scrollSpeed || 1; 4993 type = type || "wheel,touch,pointer"; 4994 debounce = debounce !== false; 4995 lineHeight || (lineHeight = parseFloat(_win.getComputedStyle(_body).lineHeight) || 22); // note: browser may report "normal", so default to 22. 4996 4997 var id, 4998 onStopDelayedCall, 4999 dragged, 5000 moved, 5001 wheeled, 5002 locked, 5003 axis, 5004 self = this, 5005 prevDeltaX = 0, 5006 prevDeltaY = 0, 5007 passive = vars.passive || !preventDefault && vars.passive !== false, 5008 scrollFuncX = _getScrollFunc(target, _horizontal), 5009 scrollFuncY = _getScrollFunc(target, _vertical), 5010 scrollX = scrollFuncX(), 5011 scrollY = scrollFuncY(), 5012 limitToTouch = ~type.indexOf("touch") && !~type.indexOf("pointer") && _eventTypes[0] === "pointerdown", 5013 // for devices that accommodate mouse events and touch events, we need to distinguish. 5014 isViewport = _isViewport(target), 5015 ownerDoc = target.ownerDocument || _doc, 5016 deltaX = [0, 0, 0], 5017 // wheel, scroll, pointer/touch 5018 deltaY = [0, 0, 0], 5019 onClickTime = 0, 5020 clickCapture = function clickCapture() { 5021 return onClickTime = _getTime(); 5022 }, 5023 _ignoreCheck = function _ignoreCheck(e, isPointerOrTouch) { 5024 return (self.event = e) && ignore && _isWithin(e.target, ignore) || isPointerOrTouch && limitToTouch && e.pointerType !== "touch" || ignoreCheck && ignoreCheck(e, isPointerOrTouch); 5025 }, 5026 onStopFunc = function onStopFunc() { 5027 self._vx.reset(); 5028 5029 self._vy.reset(); 5030 5031 onStopDelayedCall.pause(); 5032 onStop && onStop(self); 5033 }, 5034 update = function update() { 5035 var dx = self.deltaX = _getAbsoluteMax(deltaX), 5036 dy = self.deltaY = _getAbsoluteMax(deltaY), 5037 changedX = Math.abs(dx) >= tolerance, 5038 changedY = Math.abs(dy) >= tolerance; 5039 5040 onChange && (changedX || changedY) && onChange(self, dx, dy, deltaX, deltaY); // in ScrollTrigger.normalizeScroll(), we need to know if it was touch/pointer so we need access to the deltaX/deltaY Arrays before we clear them out. 5041 5042 if (changedX) { 5043 onRight && self.deltaX > 0 && onRight(self); 5044 onLeft && self.deltaX < 0 && onLeft(self); 5045 onChangeX && onChangeX(self); 5046 onToggleX && self.deltaX < 0 !== prevDeltaX < 0 && onToggleX(self); 5047 prevDeltaX = self.deltaX; 5048 deltaX[0] = deltaX[1] = deltaX[2] = 0; 5049 } 5050 5051 if (changedY) { 5052 onDown && self.deltaY > 0 && onDown(self); 5053 onUp && self.deltaY < 0 && onUp(self); 5054 onChangeY && onChangeY(self); 5055 onToggleY && self.deltaY < 0 !== prevDeltaY < 0 && onToggleY(self); 5056 prevDeltaY = self.deltaY; 5057 deltaY[0] = deltaY[1] = deltaY[2] = 0; 5058 } 5059 5060 if (moved || dragged) { 5061 onMove && onMove(self); 5062 5063 if (dragged) { 5064 onDragStart && dragged === 1 && onDragStart(self); 5065 onDrag && onDrag(self); 5066 dragged = 0; 5067 } 5068 5069 moved = false; 5070 } 5071 5072 locked && !(locked = false) && onLockAxis && onLockAxis(self); 5073 5074 if (wheeled) { 5075 onWheel(self); 5076 wheeled = false; 5077 } 5078 5079 id = 0; 5080 }, 5081 onDelta = function onDelta(x, y, index) { 5082 deltaX[index] += x; 5083 deltaY[index] += y; 5084 5085 self._vx.update(x); 5086 5087 self._vy.update(y); 5088 5089 debounce ? id || (id = requestAnimationFrame(update)) : update(); 5090 }, 5091 onTouchOrPointerDelta = function onTouchOrPointerDelta(x, y) { 5092 if (lockAxis && !axis) { 5093 self.axis = axis = Math.abs(x) > Math.abs(y) ? "x" : "y"; 5094 locked = true; 5095 } 5096 5097 if (axis !== "y") { 5098 deltaX[2] += x; 5099 5100 self._vx.update(x, true); // update the velocity as frequently as possible instead of in the debounced function so that very quick touch-scrolls (flicks) feel natural. If it's the mouse/touch/pointer, force it so that we get snappy/accurate momentum scroll. 5101 5102 } 5103 5104 if (axis !== "x") { 5105 deltaY[2] += y; 5106 5107 self._vy.update(y, true); 5108 } 5109 5110 debounce ? id || (id = requestAnimationFrame(update)) : update(); 5111 }, 5112 _onDrag = function _onDrag(e) { 5113 if (_ignoreCheck(e, 1)) { 5114 return; 5115 } 5116 5117 e = _getEvent(e, preventDefault); 5118 var x = e.clientX, 5119 y = e.clientY, 5120 dx = x - self.x, 5121 dy = y - self.y, 5122 isDragging = self.isDragging; 5123 self.x = x; 5124 self.y = y; 5125 5126 if (isDragging || (dx || dy) && (Math.abs(self.startX - x) >= dragMinimum || Math.abs(self.startY - y) >= dragMinimum)) { 5127 dragged || (dragged = isDragging ? 2 : 1); // dragged: 0 = not dragging, 1 = first drag, 2 = normal drag 5128 5129 isDragging || (self.isDragging = true); 5130 onTouchOrPointerDelta(dx, dy); 5131 } 5132 }, 5133 _onPress = self.onPress = function (e) { 5134 if (_ignoreCheck(e, 1) || e && e.button) { 5135 return; 5136 } 5137 5138 self.axis = axis = null; 5139 onStopDelayedCall.pause(); 5140 self.isPressed = true; 5141 e = _getEvent(e); // note: may need to preventDefault(?) Won't side-scroll on iOS Safari if we do, though. 5142 5143 prevDeltaX = prevDeltaY = 0; 5144 self.startX = self.x = e.clientX; 5145 self.startY = self.y = e.clientY; 5146 5147 self._vx.reset(); // otherwise the t2 may be stale if the user touches and flicks super fast and releases in less than 2 requestAnimationFrame ticks, causing velocity to be 0. 5148 5149 5150 self._vy.reset(); 5151 5152 _addListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, passive, true); 5153 5154 self.deltaX = self.deltaY = 0; 5155 onPress && onPress(self); 5156 }, 5157 _onRelease = self.onRelease = function (e) { 5158 if (_ignoreCheck(e, 1)) { 5159 return; 5160 } 5161 5162 _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true); 5163 5164 var isTrackingDrag = !isNaN(self.y - self.startY), 5165 wasDragging = self.isDragging, 5166 isDragNotClick = wasDragging && (Math.abs(self.x - self.startX) > 3 || Math.abs(self.y - self.startY) > 3), 5167 // some touch devices need some wiggle room in terms of sensing clicks - the finger may move a few pixels. 5168 eventData = _getEvent(e); 5169 5170 if (!isDragNotClick && isTrackingDrag) { 5171 self._vx.reset(); 5172 5173 self._vy.reset(); //if (preventDefault && allowClicks && self.isPressed) { // check isPressed because in a rare edge case, the inputObserver in ScrollTrigger may stopPropagation() on the press/drag, so the onRelease may get fired without the onPress/onDrag ever getting called, thus it could trigger a click to occur on a link after scroll-dragging it. 5174 5175 5176 if (preventDefault && allowClicks) { 5177 gsap.delayedCall(0.08, function () { 5178 // some browsers (like Firefox) won't trust script-generated clicks, so if the user tries to click on a video to play it, for example, it simply won't work. Since a regular "click" event will most likely be generated anyway (one that has its isTrusted flag set to true), we must slightly delay our script-generated click so that the "real"/trusted one is prioritized. Remember, when there are duplicate events in quick succession, we suppress all but the first one. Some browsers don't even trigger the "real" one at all, so our synthetic one is a safety valve that ensures that no matter what, a click event does get dispatched. 5179 if (_getTime() - onClickTime > 300 && !e.defaultPrevented) { 5180 if (e.target.click) { 5181 //some browsers (like mobile Safari) don't properly trigger the click event 5182 e.target.click(); 5183 } else if (ownerDoc.createEvent) { 5184 var syntheticEvent = ownerDoc.createEvent("MouseEvents"); 5185 syntheticEvent.initMouseEvent("click", true, true, _win, 1, eventData.screenX, eventData.screenY, eventData.clientX, eventData.clientY, false, false, false, false, 0, null); 5186 e.target.dispatchEvent(syntheticEvent); 5187 } 5188 } 5189 }); 5190 } 5191 } 5192 5193 self.isDragging = self.isGesturing = self.isPressed = false; 5194 onStop && wasDragging && !isNormalizer && onStopDelayedCall.restart(true); 5195 dragged && update(); // in case debouncing, we don't want onDrag to fire AFTER onDragEnd(). 5196 5197 onDragEnd && wasDragging && onDragEnd(self); 5198 onRelease && onRelease(self, isDragNotClick); 5199 }, 5200 _onGestureStart = function _onGestureStart(e) { 5201 return e.touches && e.touches.length > 1 && (self.isGesturing = true) && onGestureStart(e, self.isDragging); 5202 }, 5203 _onGestureEnd = function _onGestureEnd() { 5204 return (self.isGesturing = false) || onGestureEnd(self); 5205 }, 5206 onScroll = function onScroll(e) { 5207 if (_ignoreCheck(e)) { 5208 return; 5209 } 5210 5211 var x = scrollFuncX(), 5212 y = scrollFuncY(); 5213 onDelta((x - scrollX) * scrollSpeed, (y - scrollY) * scrollSpeed, 1); 5214 scrollX = x; 5215 scrollY = y; 5216 onStop && onStopDelayedCall.restart(true); 5217 }, 5218 _onWheel = function _onWheel(e) { 5219 if (_ignoreCheck(e)) { 5220 return; 5221 } 5222 5223 e = _getEvent(e, preventDefault); 5224 onWheel && (wheeled = true); 5225 var multiplier = (e.deltaMode === 1 ? lineHeight : e.deltaMode === 2 ? _win.innerHeight : 1) * wheelSpeed; 5226 onDelta(e.deltaX * multiplier, e.deltaY * multiplier, 0); 5227 onStop && !isNormalizer && onStopDelayedCall.restart(true); 5228 }, 5229 _onMove = function _onMove(e) { 5230 if (_ignoreCheck(e)) { 5231 return; 5232 } 5233 5234 var x = e.clientX, 5235 y = e.clientY, 5236 dx = x - self.x, 5237 dy = y - self.y; 5238 self.x = x; 5239 self.y = y; 5240 moved = true; 5241 onStop && onStopDelayedCall.restart(true); 5242 (dx || dy) && onTouchOrPointerDelta(dx, dy); 5243 }, 5244 _onHover = function _onHover(e) { 5245 self.event = e; 5246 onHover(self); 5247 }, 5248 _onHoverEnd = function _onHoverEnd(e) { 5249 self.event = e; 5250 onHoverEnd(self); 5251 }, 5252 _onClick = function _onClick(e) { 5253 return _ignoreCheck(e) || _getEvent(e, preventDefault) && onClick(self); 5254 }; 5255 5256 onStopDelayedCall = self._dc = gsap.delayedCall(onStopDelay || 0.25, onStopFunc).pause(); 5257 self.deltaX = self.deltaY = 0; 5258 self._vx = _getVelocityProp(0, 50, true); 5259 self._vy = _getVelocityProp(0, 50, true); 5260 self.scrollX = scrollFuncX; 5261 self.scrollY = scrollFuncY; 5262 self.isDragging = self.isGesturing = self.isPressed = false; 5263 5264 _context(this); 5265 5266 self.enable = function (e) { 5267 if (!self.isEnabled) { 5268 _addListener(isViewport ? ownerDoc : target, "scroll", _onScroll); 5269 5270 type.indexOf("scroll") >= 0 && _addListener(isViewport ? ownerDoc : target, "scroll", onScroll, passive, capture); 5271 type.indexOf("wheel") >= 0 && _addListener(target, "wheel", _onWheel, passive, capture); 5272 5273 if (type.indexOf("touch") >= 0 && _isTouch || type.indexOf("pointer") >= 0) { 5274 _addListener(target, _eventTypes[0], _onPress, passive, capture); 5275 5276 _addListener(ownerDoc, _eventTypes[2], _onRelease); 5277 5278 _addListener(ownerDoc, _eventTypes[3], _onRelease); 5279 5280 allowClicks && _addListener(target, "click", clickCapture, true, true); 5281 onClick && _addListener(target, "click", _onClick); 5282 onGestureStart && _addListener(ownerDoc, "gesturestart", _onGestureStart); 5283 onGestureEnd && _addListener(ownerDoc, "gestureend", _onGestureEnd); 5284 onHover && _addListener(target, _pointerType + "enter", _onHover); 5285 onHoverEnd && _addListener(target, _pointerType + "leave", _onHoverEnd); 5286 onMove && _addListener(target, _pointerType + "move", _onMove); 5287 } 5288 5289 self.isEnabled = true; 5290 self.isDragging = self.isGesturing = self.isPressed = moved = dragged = false; 5291 5292 self._vx.reset(); 5293 5294 self._vy.reset(); 5295 5296 scrollX = scrollFuncX(); 5297 scrollY = scrollFuncY(); 5298 e && e.type && _onPress(e); 5299 onEnable && onEnable(self); 5300 } 5301 5302 return self; 5303 }; 5304 5305 self.disable = function () { 5306 if (self.isEnabled) { 5307 // only remove the _onScroll listener if there aren't any others that rely on the functionality. 5308 _observers.filter(function (o) { 5309 return o !== self && _isViewport(o.target); 5310 }).length || _removeListener(isViewport ? ownerDoc : target, "scroll", _onScroll); 5311 5312 if (self.isPressed) { 5313 self._vx.reset(); 5314 5315 self._vy.reset(); 5316 5317 _removeListener(isNormalizer ? target : ownerDoc, _eventTypes[1], _onDrag, true); 5318 } 5319 5320 _removeListener(isViewport ? ownerDoc : target, "scroll", onScroll, capture); 5321 5322 _removeListener(target, "wheel", _onWheel, capture); 5323 5324 _removeListener(target, _eventTypes[0], _onPress, capture); 5325 5326 _removeListener(ownerDoc, _eventTypes[2], _onRelease); 5327 5328 _removeListener(ownerDoc, _eventTypes[3], _onRelease); 5329 5330 _removeListener(target, "click", clickCapture, true); 5331 5332 _removeListener(target, "click", _onClick); 5333 5334 _removeListener(ownerDoc, "gesturestart", _onGestureStart); 5335 5336 _removeListener(ownerDoc, "gestureend", _onGestureEnd); 5337 5338 _removeListener(target, _pointerType + "enter", _onHover); 5339 5340 _removeListener(target, _pointerType + "leave", _onHoverEnd); 5341 5342 _removeListener(target, _pointerType + "move", _onMove); 5343 5344 self.isEnabled = self.isPressed = self.isDragging = false; 5345 onDisable && onDisable(self); 5346 } 5347 }; 5348 5349 self.kill = self.revert = function () { 5350 self.disable(); 5351 5352 var i = _observers.indexOf(self); 5353 5354 i >= 0 && _observers.splice(i, 1); 5355 _normalizer === self && (_normalizer = 0); 5356 }; 5357 5358 _observers.push(self); 5359 5360 isNormalizer && _isViewport(target) && (_normalizer = self); 5361 self.enable(event); 5362 }; 5363 5364 _createClass(Observer, [{ 5365 key: "velocityX", 5366 get: function get() { 5367 return this._vx.getVelocity(); 5368 } 5369 }, { 5370 key: "velocityY", 5371 get: function get() { 5372 return this._vy.getVelocity(); 5373 } 5374 }]); 5375 5376 return Observer; 5377}(); 5378Observer.version = "3.15.0"; 5379 5380Observer.create = function (vars) { 5381 return new Observer(vars); 5382}; 5383 5384Observer.register = _initCore; 5385 5386Observer.getAll = function () { 5387 return _observers.slice(); 5388}; 5389 5390Observer.getById = function (id) { 5391 return _observers.filter(function (o) { 5392 return o.vars.id === id; 5393 })[0]; 5394}; 5395 5396_getGSAP() && gsap.registerPlugin(Observer);
5397//# sourceURL=[module] 5398//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvT2JzZXJ2ZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBNEMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RDs7QUFFL1AsOERBQThELHNFQUFzRSw4REFBOEQ7O0FBRWxNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBLDZGQUE2Rjs7QUFFN0Y7QUFDQTtBQUNBLDZDQUE2QztBQUM3QyxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxvRkFBb0Y7O0FBRXBGO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Rjs7QUFFNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRkFBb0Y7O0FBRXBGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7O0FBRW5EO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7OztBQUd4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEIseURBQXlEOzs7QUFHbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
5398QUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9PYnNlcnZlci5qcz9lNmIwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci
53985rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyohXG4gKiBPYnNlcnZlciAzLjE1LjBcbiAqIGh0dHBzOi8vZ3NhcC5jb21cbiAqXG4gKiBAbGljZW5zZSBDb3B5cmlnaHQgMjAwOC0yMDI2LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhdCBodHRwczovL2dzYXAuY29tL3N0YW5kYXJkLWxpY2Vuc2VcbiAqIEBhdXRob3I6IEphY2sgRG95bGUsIGphY2tAZ3JlZW5zb2NrLmNvbVxuKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbnZhciBnc2FwLFxuICAgIF9jb3JlSW5pdHRlZCxcbiAgICBfY2xhbXAsXG4gICAgX3dpbixcbiAgICBfZG9jLFxuICAgIF9kb2NFbCxcbiAgICBfYm9keSxcbiAgICBfaXNUb3VjaCxcbiAgICBfcG9pbnRlclR5cGUsXG4gICAgU2Nyb2xsVHJpZ2dlcixcbiAgICBfcm9vdCxcbiAgICBfbm9ybWFsaXplcixcbiAgICBfZXZlbnRUeXBlcyxcbiAgICBfY29udGV4dCxcbiAgICBfZ2V0R1NBUCA9IGZ1bmN0aW9uIF9nZXRHU0FQKCkge1xuICByZXR1cm4gZ3NhcCB8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIChnc2FwID0gd2luZG93LmdzYXApICYmIGdzYXAucmVnaXN0ZXJQbHVnaW4gJiYgZ3NhcDtcbn0sXG4gICAgX3N0YXJ0dXAgPSAxLFxuICAgIF9vYnNlcnZlcnMgPSBbXSxcbiAgICBfc2Nyb2xsZXJzID0gW10sXG4gICAgX3Byb3hpZXMgPSBbXSxcbiAgICBfZ2V0VGltZSA9IERhdGUubm93LFxuICAgIF9icmlkZ2UgPSBmdW5jdGlvbiBfYnJpZGdlKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn0sXG4gICAgX2ludGVncmF0ZSA9IGZ1bmN0aW9uIF9pbnRlZ3JhdGUoKSB7XG4gIHZhciBjb3JlID0gU2Nyb2xsVHJpZ2dlci5jb3JlLFxuICAgICAgZGF0YSA9IGNvcmUuYnJpZGdlIHx8IHt9LFxuICAgICAgc2Nyb2xsZXJzID0gY29yZS5fc2Nyb2xsZXJzLFxuICAgICAgcHJveGllcyA9IGNvcmUuX3Byb3hpZXM7XG4gIHNjcm9sbGVycy5wdXNoLmFwcGx5KHNjcm9sbGVycywgX3Njcm9sbGVycyk7XG4gIHByb3hpZXMucHVzaC5hcHBseShwcm94aWVzLCBfcHJveGllcyk7XG4gIF9zY3JvbGxlcnMgPSBzY3JvbGxlcnM7XG4gIF9wcm94aWVzID0gcHJveGllcztcblxuICBfYnJpZGdlID0gZnVuY3Rpb24gX2JyaWRnZShuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiBkYXRhW25hbWVdKHZhbHVlKTtcbiAgfTtcbn0sXG4gICAgX2dldFByb3h5UHJvcCA9IGZ1bmN0aW9uIF9nZXRQcm94eVByb3AoZWxlbWVudCwgcHJvcGVydHkpIHtcbiAgcmV0dXJuIH5fcHJveGllcy5pbmRleE9mKGVsZW1lbnQpICYmIF9wcm94aWVzW19wcm94aWVzLmluZGV4T2YoZWxlbWVudCkgKyAxXVtwcm9wZXJ0eV07XG59LFxuICAgIF9pc1ZpZXdwb3J0ID0gZnVuY3Rpb24gX2lzVmlld3BvcnQoZWwpIHtcbiAgcmV0dXJuICEhfl9yb290LmluZGV4T2YoZWwpO1xufSxcbiAgICBfYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBfYWRkTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZnVuYywgcGFzc2l2ZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmMsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlICE9PSBmYWxzZSxcbiAgICBjYXB0dXJlOiAhIWNhcHR1cmVcbiAgfSk7XG59LFxuICAgIF9yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIF9yZW1vdmVMaXN0ZW5lcihlbGVtZW50LCB0eXBlLCBmdW5jLCBjYXB0dXJlKSB7XG4gIHJldHVybiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZnVuYywgISFjYXB0dXJlKTtcbn0sXG4gICAgX3Njcm9sbExlZnQgPSBcInNjcm9sbExlZnRcIixcbiAgICBfc2Nyb2xsVG9wID0gXCJzY3JvbGxUb3BcIixcbiAgICBfb25TY3JvbGwgPSBmdW5jdGlvbiBfb25TY3JvbGwoKSB7XG4gIHJldHVybiBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci5pc1ByZXNzZWQgfHwgX3Njcm9sbGVycy5jYWNoZSsrO1xufSxcbiAgICBfc2Nyb2xsQ2FjaGVGdW5jID0gZnVuY3Rpb24gX3Njcm9sbENhY2hlRnVuYyhmLCBkb05vdENhY2hlKSB7XG4gIHZhciBjYWNoaW5nRnVuYyA9IGZ1bmN0aW9uIGNhY2hpbmdGdW5jKHZhbHVlKSB7XG4gICAgLy8gc2luY2UgcmVhZGluZyB0aGUgc2Nyb2xsVG9wL3Njcm9sbExlZnQvcGFnZU9mZnNldFkvcGFnZU9mZnNldFggY2FuIHRyaWdnZXIgYSBsYXlvdXQsIHRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGNhY2hlIHRoZSB2YWx1ZSBzbyBpdCBvbmx5IGdldHMgcmVhZCBmcmVzaCBhZnRlciBhIFwic2Nyb2xsXCIgZXZlbnQgZmlyZXMgKG9yIHdoaWxlIHdlJ3JlIHJlZnJlc2hpbmcgYmVjYXVzZSB0aGF0IGNhbiBsZW5ndGhlbiB0aGUgcGFnZSBhbmQgYWx0ZXIgdGhlIHNjcm9sbCBwb3NpdGlvbikuIHdoZW4gXCJzb2Z0XCIgaXMgdHJ1ZSwgdGhhdCBtZWFucyBkb24ndCBhY3R1YWxseSBzZXQgdGhlIHNjcm9sbCwgYnV0IGNhY2hlIHRoZSBuZXcgdmFsdWUgaW5zdGVhZCAodXNlZnVsIGluIFNjcm9sbFNtb290aGVyKVxuICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgX3N0YXJ0dXAgJiYgKF93aW4uaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCIpOyAvLyBvdGhlcndpc2UgdGhlIG5ldyBwb3NpdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSB0aGUgYnJvd3NlciBvbmxvYWQuXG5cbiAgICAgIHZhciBpc05vcm1hbGl6aW5nID0gX25vcm1hbGl6ZXIgJiYgX25vcm1hbGl6ZXIuaXNQcmVzc2VkO1xuICAgICAgdmFsdWUgPSBjYWNoaW5nRnVuYy52ID0gTWF0aC5yb3VuZCh2YWx1ZSkgfHwgKF9ub3JtYWxpemVyICYmIF9ub3JtYWxpemVyLmlPUyA/IDEgOiAwKTsgLy9UT0RPOiBpT1MgQnVnOiBpZiB5b3UgYWxsb3cgaXQgdG8gZ28gdG8gMCwgU2FmYXJpIGNhbiBzdGFydCB0byByZXBvcnQgc3VwZXIgc3RyYW5nZSAod2lsZGx5IGluYWNjdXJhdGUpIHRvdWNoIHBvc2l0aW9ucyFcblxuICAgICAgZih2YWx1ZSk7XG4gICAgICBjYWNoaW5nRnVuYy5jYWNoZUlEID0gX3Njcm9sbGVycy5jYWNoZTtcbiAgICAgIGlzTm9ybWFsaXppbmcgJiYgX2JyaWRnZShcInNzXCIsIHZhbHVlKTsgLy8gc2V0IHNjcm9sbCAobm90aWZ5IFNjcm9sbFRyaWdnZXIgc28gaXQgY2FuIGRpc3BhdGNoIGEgXCJzY3JvbGxTdGFydFwiIGV2ZW50IGlmIG5lY2Vzc2FyeVxuICAgIH0gZWxzZSBpZiAoZG9Ob3RDYWNoZSB8fCBfc2Nyb2xsZXJzLmNhY2hlICE9PSBjYWNoaW5nRnVuYy5jYWNoZUlEIHx8IF9icmlkZ2UoXCJyZWZcIikpIHtcbiAgICAgIGNhY2hpbmdGdW5jLmNhY2hlSUQgPSBfc2Nyb2xsZXJzLmNhY2hlO1xuICAgICAgY2FjaGluZ0Z1bmMudiA9IGYoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGluZ0Z1bmMudiArIGNhY2hpbmdGdW5jLm9mZnNldDtcbiAgfTtcblxuICBjYWNoaW5nRnVuYy5vZmZzZXQgPSAwO1xuICByZXR1cm4gZiAmJiBjYWNoaW5nRnVuYztcbn0sXG4gICAgX2hvcml6b250YWwgPSB7XG4gIHM6IF9zY3JvbGxMZWZ0LFxuICBwOiBcImxlZnRcIixcbiAgcDI6IFwiTGVmdFwiLFxuICBvczogXCJyaWdodFwiLFxuICBvczI6IFwiUmlnaHRcIixcbiAgZDogXCJ3aWR0aFwiLFxuICBkMjogXCJXaWR0aFwiLFxuICBhOiBcInhcIixcbiAgc2M6IF9zY3JvbGxDYWNoZUZ1bmMoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBfd2luLnNjcm9sbFRvKHZhbHVlLCBfdmVydGljYWwuc2MoKSkgOiBfd2luLnBhZ2VYT2Zmc2V0IHx8IF9kb2NbX3Njcm9sbExlZnRdIHx8IF9kb2NFbFtfc2Nyb2xsTGVmdF0gfHwgX2JvZHlbX3Njcm9sbExlZnRdIHx8IDA7XG4gIH0pXG59LFxuICAgIF92ZXJ0aWNhbCA9IHtcbiAgczogX3Njcm9sbFRvcCxcbiAgcDogXCJ0b3BcIixcbiAgcDI6IFwiVG9wXCIsXG4gIG9zOiBcImJvdHRvbVwiLFxuICBvczI6IFwiQm90dG9tXCIsXG4gIGQ6IFwiaGVpZ2h0XCIsXG4gIGQyOiBcIkhlaWdodFwiLFxuICBhOiBcInlcIixcbiAgb3A6IF9ob3Jpem9udGFsLFxuICBzYzogX3Njcm9sbENhY2hlRnVuYyhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IF93aW4uc2Nyb2xsVG8oX2hvcml6b250YWwuc2MoKSwgdmFsdWUpIDogX3dpbi5wYWdlWU9mZnNldCB8fCBfZG9jW19zY3JvbGxUb3BdIHx8IF9kb2NFbFtfc2Nyb2xsVG9wXSB8fCBfYm9keVtfc2Nyb2xsVG9wXSB8fCAwO1xuICB9KVxufSxcbiAgICBfZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gX2dldFRhcmdldCh0LCBzZWxmKSB7XG4gIHJldHVybiAoc2VsZiAmJiBzZWxmLl9jdHggJiYgc2VsZi5fY3R4LnNlbGVjdG9yIHx8IGdzYXAudXRpbHMudG9BcnJheSkodClbMF0gfHwgKHR5cGVvZiB0ID09PSBcInN0cmluZ1wiICYmIGdzYXAuY29uZmlnKCkub
5398nVsbFRhcmdldFdhcm4gIT09IGZhbHNlID8gY29uc29sZS53YXJuKFwiRWxlbWVudCBub3QgZm91bmQ6XCIsIHQpIDogbnVsbCk7XG59LFxuICAgIF9pc1dpdGhpbiA9IGZ1bmN0aW9uIF9pc1dpdGhpbihlbGVtZW50LCBsaXN0KSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0IG9yIGlzIGEgZGVzY2VuZGFudCBvZiBhbiBlbGVtZW50IGluIHRoZSBsaXN0LlxuICB2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBpZiAobGlzdFtpXSA9PT0gZWxlbWVudCB8fCBsaXN0W2ldLmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59LFxuICAgIF9nZXRTY3JvbGxGdW5jID0gZnVuY3Rpb24gX2dldFNjcm9sbEZ1bmMoZWxlbWVudCwgX3JlZikge1xuICB2YXIgcyA9IF9yZWYucyxcbiAgICAgIHNjID0gX3JlZi5zYztcbiAgLy8gd2Ugc3RvcmUgdGhlIHNjcm9sbGVyIGZ1bmN0aW9ucyBpbiBhbiBhbHRlcm5hdGluZyBzZXF1ZW5jZWQgQXJyYXkgbGlrZSBbZWxlbWVudCwgdmVydGljYWxTY3JvbGxGdW5jLCBob3Jpem9udGFsU2Nyb2xsRnVuYywgLi4uXSBzbyB0aGF0IHdlIGNhbiBtaW5pbWl6ZSBtZW1vcnksIG1heGltaXplIHBlcmZvcm1hbmNlLCBhbmQgd2UgYWxzbyByZWNvcmQgdGhlIGxhc3QgcG9zaXRpb24gYXMgYSBcIi5yZWNcIiBwcm9wZXJ0eSBpbiBvcmRlciB0byByZXZlcnQgdG8gdGhhdCBhZnRlciByZWZyZXNoaW5nIHRvIGVuc3VyZSB0aGluZ3MgZG9uJ3Qgc2hpZnQgYXJvdW5kLlxuICBfaXNWaWV3cG9ydChlbGVtZW50KSAmJiAoZWxlbWVudCA9IF9kb2Muc2Nyb2xsaW5nRWxlbWVudCB8fCBfZG9jRWwpO1xuXG4gIHZhciBpID0gX3Njcm9sbGVycy5pbmRleE9mKGVsZW1lbnQpLFxuICAgICAgb2Zmc2V0ID0gc2MgPT09IF92ZXJ0aWNhbC5zYyA/IDEgOiAyO1xuXG4gICF+aSAmJiAoaSA9IF9zY3JvbGxlcnMucHVzaChlbGVtZW50KSAtIDEpO1xuICBfc2Nyb2xsZXJzW2kgKyBvZmZzZXRdIHx8IF9hZGRMaXN0ZW5lcihlbGVtZW50LCBcInNjcm9sbFwiLCBfb25TY3JvbGwpOyAvLyBjbGVhciB0aGUgY2FjaGUgd2hlbiBhIHNjcm9sbCBvY2N1cnNcblxuICB2YXIgcHJldiA9IF9zY3JvbGxlcnNbaSArIG9mZnNldF0sXG4gICAgICBmdW5jID0gcHJldiB8fCAoX3Njcm9sbGVyc1tpICsgb2Zmc2V0XSA9IF9zY3JvbGxDYWNoZUZ1bmMoX2dldFByb3h5UHJvcChlbGVtZW50LCBzKSwgdHJ1ZSkgfHwgKF9pc1ZpZXdwb3J0KGVsZW1lbnQpID8gc2MgOiBfc2Nyb2xsQ2FjaGVGdW5jKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZWxlbWVudFtzXSA9IHZhbHVlIDogZWxlbWVudFtzXTtcbiAgfSkpKTtcbiAgZnVuYy50YXJnZXQgPSBlbGVtZW50O1xuICBwcmV2IHx8IChmdW5jLnNtb290aCA9IGdzYXAuZ2V0UHJvcGVydHkoZWxlbWVudCwgXCJzY3JvbGxCZWhhdmlvclwiKSA9PT0gXCJzbW9vdGhcIik7IC8vIG9ubHkgc2V0IGl0IHRoZSBmaXJzdCB0aW1lIChkb24ndCByZXNldCBldmVyeSB0aW1lIGEgc2Nyb2xsRnVuYyBpcyByZXF1ZXN0ZWQgYmVjYXVzZSBwZXJoYXBzIGl0IGhhcHBlbnMgZHVyaW5nIGEgcmVmcmVzaCgpIHdoZW4gaXQncyBkaXNhYmxlZCBpbiBTY3JvbGxUcmlnZ2VyLlxuXG4gIHJldHVybiBmdW5jO1xufSxcbiAgICBfZ2V0VmVsb2NpdHlQcm9wID0gZnVuY3Rpb24gX2dldFZlbG9jaXR5UHJvcCh2YWx1ZSwgbWluVGltZVJlZnJlc2gsIHVzZURlbHRhKSB7XG4gIHZhciB2MSA9IHZhbHVlLFxuICAgICAgdjIgPSB2YWx1ZSxcbiAgICAgIHQxID0gX2dldFRpbWUoKSxcbiAgICAgIHQyID0gdDEsXG4gICAgICBtaW4gPSBtaW5UaW1lUmVmcmVzaCB8fCA1MCxcbiAgICAgIGRyb3BUb1plcm9UaW1lID0gTWF0aC5tYXgoNTAwLCBtaW4gKiAzKSxcbiAgICAgIHVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSh2YWx1ZSwgZm9yY2UpIHtcbiAgICB2YXIgdCA9IF9nZXRUaW1lKCk7XG5cbiAgICBpZiAoZm9yY2UgfHwgdCAtIHQxID4gbWluKSB7XG4gICAgICB2MiA9IHYxO1xuICAgICAgdjEgPSB2YWx1ZTtcbiAgICAgIHQyID0gdDE7XG4gICAgICB0MSA9IHQ7XG4gICAgfSBlbHNlIGlmICh1c2VEZWx0YSkge1xuICAgICAgdjEgKz0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCB0b3RhbGx5IG5lY2Vzc2FyeSwgYnV0IG1ha2VzIGl0IGEgYml0IG1vcmUgYWNjdXJhdGUgYnkgYWRqdXN0aW5nIHRoZSB2MSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzbG9wZS4gVGhpcyB3YXkgd2UncmUgbm90IGp1c3QgaWdub3JpbmcgdGhlIGluY29taW5nIGRhdGEuIFJlbW92aW5nIGZvciBub3cgYmVjYXVzZSBpdCBkb2Vzbid0IHNlZW0gdG8gbWFrZSBtdWNoIHByYWN0aWNhbCBkaWZmZXJlbmNlIGFuZCBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUga2IuXG4gICAgICB2MSA9IHYyICsgKHZhbHVlIC0gdjIpIC8gKHQgLSB0MikgKiAodDEgLSB0Mik7XG4gICAgfVxuICB9LFxuICAgICAgcmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB2MiA9IHYxID0gdXNlRGVsdGEgPyAwIDogdjE7XG4gICAgdDIgPSB0MSA9IDA7XG4gIH0sXG4gICAgICBnZXRWZWxvY2l0eSA9IGZ1bmN0aW9uIGdldFZlbG9jaXR5KGxhdGVzdFZhbHVlKSB7XG4gICAgdmFyIHRPbGQgPSB0MixcbiAgICAgICAgdk9sZCA9IHYyLFxuICAgICAgICB0ID0gX2dldFRpbWUoKTtcblxuICAgIChsYXRlc3RWYWx1ZSB8fCBsYXRlc3RWYWx1ZSA9PT0gMCkgJiYgbGF0ZXN0VmFsdWUgIT09IHYxICYmIHVwZGF0ZShsYXRlc3RWYWx1ZSk7XG4gICAgcmV0dXJuIHQxID09PSB0MiB8fCB0IC0gdDIgPiBkcm9wVG9aZXJvVGltZSA/IDAgOiAodjEgKyAodXNlRGVsdGEgPyB2T2xkIDogLXZPbGQpKSAvICgodXNlRGVsdGEgPyB0IDogdDEpIC0gdE9sZCkgKiAxMDAwO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgcmVzZXQ6IHJlc2V0LFxuICAgIGdldFZlbG9jaXR5OiBnZXRWZWxvY2l0eVxuICB9O1xufSxcbiAgICBfZ2V0RXZlbnQgPSBmdW5jdGlvbiBfZ2V0RXZlbnQoZSwgcHJldmVudERlZmF1bHQpIHtcbiAgcHJldmVudERlZmF1bHQgJiYgIWUuX2dzYXBBbGxvdyAmJiBlLmNhbmNlbGFibG
5398UgIT09IGZhbHNlICYmIGUucHJldmVudERlZmF1bHQoKTtcbiAgcmV0dXJuIGUuY2hhbmdlZFRvdWNoZXMgPyBlLmNoYW5nZWRUb3VjaGVzWzBdIDogZTtcbn0sXG4gICAgX2dldEFic29sdXRlTWF4ID0gZnVuY3Rpb24gX2dldEFic29sdXRlTWF4KGEpIHtcbiAgdmFyIG1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGEpLFxuICAgICAgbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgYSk7XG4gIHJldHVybiBNYXRoLmFicyhtYXgpID49IE1hdGguYWJzKG1pbikgPyBtYXggOiBtaW47XG59LFxuICAgIF9zZXRTY3JvbGxUcmlnZ2VyID0gZnVuY3Rpb24gX3NldFNjcm9sbFRyaWdnZXIoKSB7XG4gIFNjcm9sbFRyaWdnZXIgPSBnc2FwLmNvcmUuZ2xvYmFscygpLlNjcm9sbFRyaWdnZXI7XG4gIFNjcm9sbFRyaWdnZXIgJiYgU2Nyb2xsVHJpZ2dlci5jb3JlICYmIF9pbnRlZ3JhdGUoKTtcbn0sXG4gICAgX2luaXRDb3JlID0gZnVuY3Rpb24gX2luaXRDb3JlKGNvcmUpIHtcbiAgZ3NhcCA9IGNvcmUgfHwgX2dldEdTQVAoKTtcblxuICBpZiAoIV9jb3JlSW5pdHRlZCAmJiBnc2FwICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgX3dpbiA9IHdpbmRvdztcbiAgICBfZG9jID0gZG9jdW1lbnQ7XG4gICAgX2RvY0VsID0gX2RvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgX2JvZHkgPSBfZG9jLmJvZHk7XG4gICAgX3Jvb3QgPSBbX3dpbiwgX2RvYywgX2RvY0VsLCBfYm9keV07XG4gICAgX2NsYW1wID0gZ3NhcC51dGlscy5jbGFtcDtcblxuICAgIF9jb250ZXh0ID0gZ3NhcC5jb3JlLmNvbnRleHQgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgICBfcG9pbnRlclR5cGUgPSBcIm9ucG9pbnRlcmVudGVyXCIgaW4gX2JvZHkgPyBcInBvaW50ZXJcIiA6IFwibW91c2VcIjsgLy8gaXNUb3VjaCBpcyAwIGlmIG5vIHRvdWNoLCAxIGlmIE9OTFkgdG91Y2gsIGFuZCAyIGlmIGl0IGNhbiBhY2NvbW1vZGF0ZSB0b3VjaCBidXQgYWxzbyBvdGhlciB0eXBlcyBsaWtlIG1vdXNlL3BvaW50ZXIuXG5cbiAgICBfaXNUb3VjaCA9IE9ic2VydmVyLmlzVG91Y2ggPSBfd2luLm1hdGNoTWVkaWEgJiYgX3dpbi5tYXRjaE1lZGlhKFwiKGhvdmVyOiBub25lKSwgKHBvaW50ZXI6IGNvYXJzZSlcIikubWF0Y2hlcyA/IDEgOiBcIm9udG91Y2hzdGFydFwiIGluIF93aW4gfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCB8fCBuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDAgPyAyIDogMDtcbiAgICBfZXZlbnRUeXBlcyA9IE9ic2VydmVyLmV2ZW50VHlwZXMgPSAoXCJvbnRvdWNoc3RhcnRcIiBpbiBfZG9jRWwgPyBcInRvdWNoc3RhcnQsdG91Y2htb3ZlLHRvdWNoY2FuY2VsLHRvdWNoZW5kXCIgOiAhKFwib25wb2ludGVyZG93blwiIGluIF9kb2NFbCkgPyBcIm1vdXNlZG93bixtb3VzZW1vdmUsbW91c2V1cCxtb3VzZXVwXCIgOiBcInBvaW50ZXJkb3duLHBvaW50ZXJtb3ZlLHBvaW50ZXJjYW5jZWwscG9pbnRlcnVwXCIpLnNwbGl0KFwiLFwiKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfc3RhcnR1cCA9IDA7XG4gICAgfSwgNTAwKTtcbiAgICBfY29yZUluaXR0ZWQgPSAxO1xuICB9XG5cbiAgU2Nyb2xsVHJpZ2dlciB8fCBfc2V0U2Nyb2xsVHJpZ2dlcigpOyAvLyBPYnNlcnZlciBtaWdodCBiZSBpbml0dGVkIEJFRk9SRSBTY3JvbGxUcmlnZ2VyLCBzbyBkb24ndCBwdXQgdGhpcyB3aXRoIHRoZSBpbml0dGluZyBjb2RlLiBTY3JvbGxUcmlnZ2VyIHdpbGwgY2FsbCBPYnNlcnZlci5yZWdpc3RlcigpIHdoZW4gaXQgaW5pdHMuXG5cbiAgcmV0dXJuIF9jb3JlSW5pdHRlZDtcbn07XG5cbl9ob3Jpem9udGFsLm9wID0gX3ZlcnRpY2FsO1xuX3Njcm9sbGVycy5jYWNoZSA9IDA7XG5leHBvcnQgdmFyIE9ic2VydmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2ZXIodmFycykge1xuICAgIHRoaXMuaW5pdCh2YXJzKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBPYnNlcnZlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluaXQgPSBmdW5jdGlvbiBpbml0KHZhcnMpIHtcbiAgICBfY29yZUluaXR0ZWQgfHwgX2luaXRDb3JlKGdzYXApIHx8IGNvbnNvbGUud2FybihcIlBsZWFzZSBnc2FwLnJlZ2lzdGVyUGx1Z2luKE9ic2VydmVyKVwiKTtcbiAgICBTY3JvbGxUcmlnZ2VyIHx8IF9zZXRTY3JvbGxUcmlnZ2VyKCk7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHZhcnMudG9sZXJhbmNlLFxuICAgICAgICBkcmFnTWluaW11bSA9IHZhcnMuZHJhZ01pbmltdW0sXG4gICAgICAgIHR5cGUgPSB2YXJzLnR5cGUsXG4gICAgICAgIHRhcmdldCA9IHZhcnMudGFyZ2V0LFxuICAgICAgICBsaW5lSGVpZ2h0ID0gdmFycy5saW5lSGVpZ2h0LFxuICAgICAgICBkZWJvdW5jZSA9IHZhcnMuZGVib3VuY2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0ID0gdmFycy5wcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgb25TdG9wID0gdmFycy5vblN0b3AsXG4gICAgICAgIG9uU3RvcERlbGF5ID0gdmFycy5vblN0b3BEZWxheSxcbiAgICAgICAgaWdub3JlID0gdmFycy5pZ25vcmUsXG4gICAgICAgIHdoZWVsU3BlZWQgPSB2YXJzLndoZWVsU3BlZWQsXG4gICAgICAgIGV2ZW50ID0gdmFycy5ldmVudCxcbiAgICAgICAgb25EcmFnU3RhcnQgPSB2YXJzLm9uRHJhZ1N0YXJ0LFxuICAgICAgICBvbkRyYWdFbmQgPSB2YXJzLm9uRHJhZ0VuZCxcbiAgICAgICAgb25EcmFnID0gdmFycy5vbkRyYWcsXG4gICAgICAgIG9uUHJlc3MgPSB2YXJzLm9uUHJlc3MsXG4gICAgICAgIG9uUmVsZWFzZSA9IHZhcnMub25SZWxlYXNlLFxuICAgICAgICBvblJpZ2h0ID0gdmFycy5vblJpZ2h0LFxuICAgICAgICBvbkxlZnQgPSB2YXJzLm9uTGVmdCxcbiAgICAgICAgb25VcCA9IHZhcnMub25VcCxcbiAgICAgICAgb25Eb3duID0gdmFycy5vbkRvd24sXG4gICAgICAgIG9uQ2hhbmdlWCA9IHZhcnMub25DaGFuZ2VYLFxuICAgICAgICBvbkNoYW5nZVkgPSB2YXJzLm9uQ2hhbmdlWSxcbiAgICAgICAgb25DaGFuZ2UgPSB2YXJzLm9uQ2hhbmdlLFxuICAgICAgICBvblRvZ2dsZVggPSB2YXJzLm9uVG9nZ2xlWCxcbiAgICAgICAgb25Ub2dnbGVZID0gdmFycy5vblRvZ2dsZVksXG4gICAgICAgIG9uSG92ZXIgPSB2YXJzLm9uSG92ZXIsXG4gICAgICAgIG9uSG92ZXJFbmQgPSB2YXJzLm9uSG92ZXJFbmQsXG4gICAgICAgIG9uTW92ZSA9IHZhcnMub25Nb3ZlLFxuICAgICAgICBpZ25vcmVDaGVjayA9IHZhcnMuaWdub3JlQ2hlY2ssXG4gICAgICAgIGlzTm9ybWFsaXplciA9IHZhcnMuaXNOb3JtYWxpem
5398VyLFxuICAgICAgICBvbkdlc3R1cmVTdGFydCA9IHZhcnMub25HZXN0dXJlU3RhcnQsXG4gICAgICAgIG9uR2VzdHVyZUVuZCA9IHZhcnMub25HZXN0dXJlRW5kLFxuICAgICAgICBvbldoZWVsID0gdmFycy5vbldoZWVsLFxuICAgICAgICBvbkVuYWJsZSA9IHZhcnMub25FbmFibGUsXG4gICAgICAgIG9uRGlzYWJsZSA9IHZhcnMub25EaXNhYmxlLFxuICAgICAgICBvbkNsaWNrID0gdmFycy5vbkNsaWNrLFxuICAgICAgICBzY3JvbGxTcGVlZCA9IHZhcnMuc2Nyb2xsU3BlZWQsXG4gICAgICAgIGNhcHR1cmUgPSB2YXJzLmNhcHR1cmUsXG4gICAgICAgIGFsbG93Q2xpY2tzID0gdmFycy5hbGxvd0NsaWNrcyxcbiAgICAgICAgbG9ja0F4aXMgPSB2YXJzLmxvY2tBeGlzLFxuICAgICAgICBvbkxvY2tBeGlzID0gdmFycy5vbkxvY2tBeGlzO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0ID0gX2dldFRhcmdldCh0YXJnZXQpIHx8IF9kb2NFbDtcbiAgICB0aGlzLnZhcnMgPSB2YXJzO1xuICAgIGlnbm9yZSAmJiAoaWdub3JlID0gZ3NhcC51dGlscy50b0FycmF5KGlnbm9yZSkpO1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAxZS05O1xuICAgIGRyYWdNaW5pbXVtID0gZHJhZ01pbmltdW0gfHwgMDtcbiAgICB3aGVlbFNwZWVkID0gd2hlZWxTcGVlZCB8fCAxO1xuICAgIHNjcm9sbFNwZWVkID0gc2Nyb2xsU3BlZWQgfHwgMTtcbiAgICB0eXBlID0gdHlwZSB8fCBcIndoZWVsLHRvdWNoLHBvaW50ZXJcIjtcbiAgICBkZWJvdW5jZSA9IGRlYm91bmNlICE9PSBmYWxzZTtcbiAgICBsaW5lSGVpZ2h0IHx8IChsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChfd2luLmdldENvbXB1dGVkU3R5bGUoX2JvZHkpLmxpbmVIZWlnaHQpIHx8IDIyKTsgLy8gbm90ZTogYnJvd3NlciBtYXkgcmVwb3J0IFwibm9ybWFsXCIsIHNvIGRlZmF1bHQgdG8gMjIuXG5cbiAgICB2YXIgaWQsXG4gICAgICAgIG9uU3RvcERlbGF5ZWRDYWxsLFxuICAgICAgICBkcmFnZ2VkLFxuICAgICAgICBtb3ZlZCxcbiAgICAgICAgd2hlZWxlZCxcbiAgICAgICAgbG9ja2VkLFxuICAgICAgICBheGlzLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgcHJldkRlbHRhWCA9IDAsXG4gICAgICAgIHByZXZEZWx0YVkgPSAwLFxuICAgICAgICBwYXNzaXZlID0gdmFycy5wYXNzaXZlIHx8ICFwcmV2ZW50RGVmYXVsdCAmJiB2YXJzLnBhc3NpdmUgIT09IGZhbHNlLFxuICAgICAgICBzY3JvbGxGdW5jWCA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX2hvcml6b250YWwpLFxuICAgICAgICBzY3JvbGxGdW5jWSA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX3ZlcnRpY2FsKSxcbiAgICAgICAgc2Nyb2xsWCA9IHNjcm9sbEZ1bmNYKCksXG4gICAgICAgIHNjcm9sbFkgPSBzY3JvbGxGdW5jWSgpLFxuICAgICAgICBsaW1pdFRvVG91Y2ggPSB+dHlwZS5pbmRleE9mKFwidG91Y2hcIikgJiYgIX50eXBlLmluZGV4T2YoXCJwb2ludGVyXCIpICYmIF9ldmVudFR5cGVzWzBdID09PSBcInBvaW50ZXJkb3duXCIsXG4gICAgICAgIC8vIGZvciBkZXZpY2VzIHRoYXQgYWNjb21tb2RhdGUgbW91c2UgZXZlbnRzIGFuZCB0b3VjaCBldmVudHMsIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2guXG4gICAgaXNWaWV3cG9ydCA9IF9pc1ZpZXdwb3J0KHRhcmdldCksXG4gICAgICAgIG93bmVyRG9jID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgX2RvYyxcbiAgICAgICAgZGVsdGFYID0gWzAsIDAsIDBdLFxuICAgICAgICAvLyB3aGVlbCwgc2Nyb2xsLCBwb2ludGVyL3RvdWNoXG4gICAgZGVsdGFZID0gWzAsIDAsIDBdLFxuICAgICAgICBvbkNsaWNrVGltZSA9IDAsXG4gICAgICAgIGNsaWNrQ2FwdHVyZSA9IGZ1bmN0aW9uIGNsaWNrQ2FwdHVyZSgpIHtcbiAgICAgIHJldHVybiBvbkNsaWNrVGltZSA9IF9nZXRUaW1lKCk7XG4gICAgfSxcbiAgICAgICAgX2lnbm9yZUNoZWNrID0gZnVuY3Rpb24gX2lnbm9yZUNoZWNrKGUsIGlzUG9pbnRlck9yVG91Y2gpIHtcbiAgICAgIHJldHVybiAoc2VsZi5ldmVudCA9IGUpICYmIGlnbm9yZSAmJiBfaXNXaXRoaW4oZS50YXJnZXQsIGlnbm9yZSkgfHwgaXNQb2ludGVyT3JUb3VjaCAmJiBsaW1pdFRvVG91Y2ggJiYgZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiIHx8IGlnbm9yZUNoZWNrICYmIGlnbm9yZUNoZWNrKGUsIGlzUG9pbnRlck9yVG91Y2gpO1xuICAgIH0sXG4gICAgICAgIG9uU3RvcEZ1bmMgPSBmdW5jdGlvbiBvblN0b3BGdW5jKCkge1xuICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgc2VsZi5fdnkucmVzZXQoKTtcblxuICAgICAgb25TdG9wRGVsYXllZENhbGwucGF1c2UoKTtcbiAgICAgIG9uU3RvcCAmJiBvblN0b3Aoc2VsZik7XG4gICAgfSxcbiAgICAgICAgdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIGR4ID0gc2VsZi5kZWx0YVggPSBfZ2V0QWJzb2x1dGVNYXgoZGVsdGFYKSxcbiAgICAgICAgICBkeSA9IHNlbGYuZGVsdGFZID0gX2dldEFic29sdXRlTWF4KGRlbHRhWSksXG4gICAgICAgICAgY2hhbmdlZFggPSBNYXRoLmFicyhkeCkgPj0gdG9sZXJhbmNlLFxuICAgICAgICAgIGNoYW5nZWRZID0gTWF0aC5hYnMoZHkpID49IHRvbGVyYW5jZTtcblxuICAgICAgb25DaGFuZ2UgJiYgKGNoYW5nZWRYIHx8IGNoYW5nZWRZKSAmJiBvbkNoYW5nZShzZWxmLCBkeCwgZHksIGRlbHRhWCwgZGVsdGFZKTsgLy8gaW4gU2Nyb2xsVHJpZ2dlci5ub3JtYWxpemVTY3JvbGwoKSwgd2UgbmVlZCB0byBrbm93IGlmIGl0IHdhcyB0b3VjaC9wb2ludGVyIHNvIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBkZWx0YVgvZGVsdGFZIEFycmF5cyBiZWZvcmUgd2UgY2xlYXIgdGhlbSBvdXQuXG5cbiAgICAgIGlmIChjaGFuZ2VkWCkge1xuICAgICAgICBvblJpZ2h0ICYmIHNlbGYuZGVsdGFYID4gMCAmJiBvblJpZ2h0KHNlbGYpO1xuICAgICAgICBvbkxlZnQgJiYgc2VsZi5kZWx0YVggPCAwICYmIG9uTGVmdChzZWxmKTtcbiAgICAgICAgb25DaGFuZ2VYICYmIG9uQ2hhbmdlWChzZWxmKTtcbiAgICAgICAgb25Ub2dnbGVYICYmIHNlbGYuZGVsdGFYIDwgMCAhPT0gcHJldkRlbHRhWCA8IDAgJiYgb25Ub2dnbGVYKHNlbGYpO1xuICAgICAgICBwcmV2RGVsdGFYID0gc2VsZi5kZWx0YVg7XG4gICAgICAgIGRlbHRhWFswXSA9IGRlbHRhWFsxXSA9IGRlbHRhWFsyXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkWSkge1xuICAgICAgICBvbkRvd24gJiYgc2VsZi5kZWx0YVkgPiAwICYmIG9uRG93bihzZWxmKTtcbiAgICAgICAgb25VcCAmJiBzZWxmLmRlbHRhWSA8IDAgJiYgb25VcChzZWxmKTtcbiAgICAgICAgb25DaGFuZ2VZICYmIG9uQ2hhbmdlWShzZWxmKTtcbiAgICAgICAgb25Ub2dnbGVZICYmIHNlbGYuZGVsdGFZIDwgMCAhPT0gcHJldkRlbHRhWSA8IDAgJiYgb25Ub2dnbGVZKHNlbGYpO1xuICAgICAgICBwcmV2RGVsdGFZID0gc2VsZi5kZWx0YVk7XG4gICAgICAgIGRlbHRhWVswXSA9IGRlbHRhWVsxXSA9IGRlbHRhWVsyXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlZCB8fCBkcmFnZ2VkKSB7XG4gICAgICAgIG9uTW92ZSAmJi
5398Bvbk1vdmUoc2VsZik7XG5cbiAgICAgICAgaWYgKGRyYWdnZWQpIHtcbiAgICAgICAgICBvbkRyYWdTdGFydCAmJiBkcmFnZ2VkID09PSAxICYmIG9uRHJhZ1N0YXJ0KHNlbGYpO1xuICAgICAgICAgIG9uRHJhZyAmJiBvbkRyYWcoc2VsZik7XG4gICAgICAgICAgZHJhZ2dlZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBtb3ZlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsb2NrZWQgJiYgIShsb2NrZWQgPSBmYWxzZSkgJiYgb25Mb2NrQXhpcyAmJiBvbkxvY2tBeGlzKHNlbGYpO1xuXG4gICAgICBpZiAod2hlZWxlZCkge1xuICAgICAgICBvbldoZWVsKHNlbGYpO1xuICAgICAgICB3aGVlbGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlkID0gMDtcbiAgICB9LFxuICAgICAgICBvbkRlbHRhID0gZnVuY3Rpb24gb25EZWx0YSh4LCB5LCBpbmRleCkge1xuICAgICAgZGVsdGFYW2luZGV4XSArPSB4O1xuICAgICAgZGVsdGFZW2luZGV4XSArPSB5O1xuXG4gICAgICBzZWxmLl92eC51cGRhdGUoeCk7XG5cbiAgICAgIHNlbGYuX3Z5LnVwZGF0ZSh5KTtcblxuICAgICAgZGVib3VuY2UgPyBpZCB8fCAoaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKSkgOiB1cGRhdGUoKTtcbiAgICB9LFxuICAgICAgICBvblRvdWNoT3JQb2ludGVyRGVsdGEgPSBmdW5jdGlvbiBvblRvdWNoT3JQb2ludGVyRGVsdGEoeCwgeSkge1xuICAgICAgaWYgKGxvY2tBeGlzICYmICFheGlzKSB7XG4gICAgICAgIHNlbGYuYXhpcyA9IGF4aXMgPSBNYXRoLmFicyh4KSA+IE1hdGguYWJzKHkpID8gXCJ4XCIgOiBcInlcIjtcbiAgICAgICAgbG9ja2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMgIT09IFwieVwiKSB7XG4gICAgICAgIGRlbHRhWFsyXSArPSB4O1xuXG4gICAgICAgIHNlbGYuX3Z4LnVwZGF0ZSh4LCB0cnVlKTsgLy8gdXBkYXRlIHRoZSB2ZWxvY2l0eSBhcyBmcmVxdWVudGx5IGFzIHBvc3NpYmxlIGluc3RlYWQgb2YgaW4gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiBzbyB0aGF0IHZlcnkgcXVpY2sgdG91Y2gtc2Nyb2xscyAo
5398ZmxpY2tzKSBmZWVsIG5hdHVyYWwuIElmIGl0J3MgdGhlIG1vdXNlL3RvdWNoL3BvaW50ZXIsIGZvcmNlIGl0IHNvIHRoYXQgd2UgZ2V0IHNuYXBweS9hY2N1cmF0ZSBtb21lbnR1bSBzY3JvbGwuXG5cbiAgICAgIH1cblxuICAgICAgaWYgKGF4aXMgIT09IFwieFwiKSB7XG4gICAgICAgIGRlbHRhWVsyXSArPSB5O1xuXG4gICAgICAgIHNlbGYuX3Z5LnVwZGF0ZSh5LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgZGVib3VuY2UgPyBpZCB8fCAoaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlKSkgOiB1cGRhdGUoKTtcbiAgICB9LFxuICAgICAgICBfb25EcmFnID0gZnVuY3Rpb24gX29uRHJhZyhlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUsIDEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZSA9IF9nZXRFdmVudChlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICB2YXIgeCA9IGUuY2xpZW50WCxcbiAgICAgICAgICB5ID0gZS5jbGllbnRZLFxuICAgICAgICAgIGR4ID0geCAtIHNlbGYueCxcbiAgICAgICAgICBkeSA9IHkgLSBzZWxmLnksXG4gICAgICAgICAgaXNEcmFnZ2luZyA9IHNlbGYuaXNEcmFnZ2luZztcbiAgICAgIHNlbGYueCA9IHg7XG4gICAgICBzZWxmLnkgPSB5O1xuXG4gICAgICBpZiAoaXNEcmFnZ2luZyB8fCAoZHggfHwgZHkpICYmIChNYXRoLmFicyhzZWxmLnN0YXJ0WCAtIHgpID49IGRyYWdNaW5pbXVtIHx8IE1hdGguYWJzKHNlbGYuc3RhcnRZIC0geSkgPj0gZHJhZ01pbmltdW0pKSB7XG4gICAgICAgIGRyYWdnZWQgfHwgKGRyYWdnZWQgPSBpc0RyYWdnaW5nID8gMiA6IDEpOyAvLyBkcmFnZ2VkOiAwID0gbm90IGRyYWdnaW5nLCAxID0gZmlyc3QgZHJhZywgMiA9IG5vcm1hbCBkcmFnXG5cbiAgICAgICAgaXNEcmFnZ2luZyB8fCAoc2VsZi5pc0RyYWdnaW5nID0gdHJ1ZSk7XG4gICAgICAgIG9uVG91Y2hPclBvaW50ZXJEZWx0YShkeCwgZHkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAgIF9vblByZXNzID0gc2VsZi5vblByZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChfaWdub3JlQ2hlY2soZSwgMSkgfHwgZSAmJiBlLmJ1dHRvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuYXhpcyA9IGF4aXMgPSBudWxsO1xuICAgICAgb25TdG9wRGVsYXllZENhbGwucGF1c2UoKTtcbiAgICAgIHNlbGYuaXNQcmVzc2VkID0gdHJ1ZTtcbiAgICAgIGUgPSBfZ2V0RXZlbnQoZSk7IC8vIG5vdGU6IG1heSBuZWVkIHRvIHByZXZlbnREZWZhdWx0KD8pIFdvbid0IHNpZGUtc2Nyb2xsIG9uIGlPUyBTYWZhcmkgaWYgd2UgZG8sIHRob3VnaC5cblxuICAgICAgcHJldkRlbHRhWCA9IHByZXZEZWx0YVkgPSAwO1xuICAgICAgc2VsZi5zdGFydFggPSBzZWxmLnggPSBlLmNsaWVudFg7XG4gICAgICBzZWxmLnN0YXJ0WSA9IHNlbGYueSA9IGUuY2xpZW50WTtcblxuICAgICAgc2VsZi5fdngucmVzZXQoKTsgLy8gb3RoZXJ3aXNlIHRoZSB0MiBtYXkgYmUgc3RhbGUgaWYgdGhlIHVzZXIgdG91Y2hlcyBhbmQgZmxpY2tzIHN1cGVyIGZhc3QgYW5kIHJlbGVhc2VzIGluIGxlc3MgdGhhbiAyIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0aWNrcywgY2F1c2luZyB2ZWxvY2l0eSB0byBiZSAwLlxuXG5cbiAgICAgIHNlbGYuX3Z5LnJlc2V0KCk7XG5cbiAgICAgIF9hZGRMaXN0ZW5lcihpc05vcm1hbGl6ZXIgPyB0YXJnZXQgOiBvd25lckRvYywgX2V2ZW50VHlwZXNbMV0sIF9vbkRyYWcsIHBhc3NpdmUsIHRydWUpO1xuXG4gICAgICBzZWxmLmRlbHRhWCA9IHNlbGYuZGVsdGFZID0gMDtcbiAgICAgIG9uUHJlc3MgJiYgb25QcmVzcyhzZWxmKTtcbiAgICB9LFxuICAgICAgICBfb25SZWxlYXNlID0gc2VsZi5vblJlbGVhc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKF9pZ25vcmVDaGVjayhlLCAxKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9yZW1vdmVMaXN0ZW5lcihpc05vcm1hbGl6ZXIgPyB0YXJnZXQgOiBvd25lckRvYywgX2V2ZW50VHlwZXNbMV0sIF9vbkRyYWcsIHRydWUpO1xuXG4gICAgICB2Y
5398XIgaXNUcmFja2luZ0RyYWcgPSAhaXNOYU4oc2VsZi55IC0gc2VsZi5zdGFydFkpLFxuICAgICAgICAgIHdhc0RyYWdnaW5nID0gc2VsZi5pc0RyYWdnaW5nLFxuICAgICAgICAgIGlzRHJhZ05vdENsaWNrID0gd2FzRHJhZ2dpbmcgJiYgKE1hdGguYWJzKHNlbGYueCAtIHNlbGYuc3RhcnRYKSA+IDMgfHwgTWF0aC5hYnMoc2VsZi55IC0gc2VsZi5zdGFydFkpID4gMyksXG4gICAgICAgICAgLy8gc29tZSB0b3VjaCBkZXZpY2VzIG5lZWQgc29tZSB3aWdnbGUgcm9vbSBpbiB0ZXJtcyBvZiBzZW5zaW5nIGNsaWNrcyAtIHRoZSBmaW5nZXIgbWF5IG1vdmUgYSBmZXcgcGl4ZWxzLlxuICAgICAgZXZlbnREYXRhID0gX2dldEV2ZW50KGUpO1xuXG4gICAgICBpZiAoIWlzRHJhZ05vdENsaWNrICYmIGlzVHJhY2tpbmdEcmFnKSB7XG4gICAgICAgIHNlbGYuX3Z4LnJlc2V0KCk7XG5cbiAgICAgICAgc2VsZi5fdnkucmVzZXQoKTsgLy9pZiAocHJldmVudERlZmF1bHQgJiYgYWxsb3dDbGlja3MgJiYgc2VsZi5pc1ByZXNzZWQpIHsgLy8gY2hlY2sgaXNQcmVzc2VkIGJlY2F1c2UgaW4gYSByYXJlIGVkZ2UgY2FzZSwgdGhlIGlucHV0T2JzZXJ2ZXIgaW4gU2Nyb2xsVHJpZ2dlciBtYXkgc3RvcFByb3BhZ2F0aW9uKCkgb24gdGhlIHByZXNzL2RyYWcsIHNvIHRoZSBvblJlbGVhc2UgbWF5IGdldCBmaXJlZCB3aXRob3V0IHRoZSBvblByZXNzL29uRHJhZyBldmVyIGdldHRpbmcgY2FsbGVkLCB0aHVzIGl0IGNvdWxkIHRyaWdnZXIgYSBjbGljayB0byBvY2N1ciBvbiBhIGxpbmsgYWZ0ZXIgc2Nyb2xsLWRyYWdnaW5nIGl0LlxuXG5cbiAgICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmIGFsbG93Q2xpY2tzKSB7XG4gICAgICAgICAgZ3NhcC5kZWxheWVkQ2FsbCgwLjA4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBzb21lIGJyb3dzZXJzIChsaWtlIEZpcmVmb3gpIHdvbid0IHRydXN0IHNjcmlwdC1nZW5lcmF0ZWQgY2xpY2tzLCBzbyBpZiB0aGUgdXNlciB0cmllcyB0byBjbGljayBvbiBhIHZpZGVvIHRvIHBsYXkgaXQsIGZvciBleGFtcGxlLCBpdCBzaW1wbHkgd29uJ3Qgd29yay4gU2luY2UgYSByZWd1bGFyIFwiY2xpY2tcIiBldmVudCB3aWxsIG1vc3QgbGlrZWx5IGJlIGdlbmVyYXRlZCBhbnl3YXkgKG9uZSB0aGF0IGhhcyBpdHMgaXNUcnVzdGVkIGZsYWcgc2V0IHRvIHRydWUpLCB3ZSBtdXN0IHNsaWdodGx5IGRlbGF5IG91ciBzY3JpcHQtZ2VuZXJhdGVkIGNsaWNrIHNvIHRoYXQgdGhlIFwicmVhbFwiL3RydXN0ZWQgb25lIGlzIHByaW9yaXRpemVkLiBSZW1lbWJlciwgd2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlIGV2ZW50cyBpbiBxdWljayBzdWNjZXNzaW9uLCB3ZSBzdXBwcmVzcyBhbGwgYnV0IHRoZSBmaXJzdCBvbmUuIFNvbWUgYnJvd3NlcnMgZG9uJ3QgZXZlbiB0cmlnZ2VyIHRoZSBcInJlYWxcIiBvbmUgYXQgYWxsLCBzbyBvdXIgc3ludGhldGljIG9uZSBpcyBhIHNhZmV0eSB2YWx2ZSB0aGF0IGVuc3VyZXMgdGhhdCBubyBtYXR0ZXIgd2hhdCwgYSBjbGljayBldmVudCBkb2VzIGdldCBkaXNwYXRjaGVkLlxuICAgICAgICAgICAgaWYgKF9nZXRUaW1lKCkgLSBvbkNsaWNrVGltZSA+IDMwMCAmJiAhZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jbGljaykge1xuICAgICAgICAgICAgICAgIC8vc29tZSBicm93c2VycyAobGlrZSBtb2JpbGUgU2FmYXJpKSBkb24ndCBwcm9wZXJseSB0cmlnZ2VyIHRoZSBjbGljayBldmVudFxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsaWNrKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3duZXJEb2MuY3JlYXRlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB2Y
5398XIgc3ludGhldGljRXZlbnQgPSBvd25lckRvYy5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO1xuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50LmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwgdHJ1ZSwgdHJ1ZSwgX3dpbiwgMSwgZXZlbnREYXRhLnNjcmVlblgsIGV2ZW50RGF0YS5zY3JlZW5ZLCBldmVudERhdGEuY2xpZW50WCwgZXZlbnREYXRhLmNsaWVudFksIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcbiAgICAgICAgICAgICAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KHN5bnRoZXRpY0V2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlbGYuaXNEcmFnZ2luZyA9IHNlbGYuaXNHZXN0dXJpbmcgPSBzZWxmLmlzUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgb25TdG9wICYmIHdhc0RyYWdnaW5nICYmICFpc05vcm1hbGl6ZXIgJiYgb25TdG9wRGVsYXllZENhbGwucmVzdGFydCh0cnVlKTtcbiAgICAgIGRyYWdnZWQgJiYgdXBkYXRlKCk7IC8vIGluIGNhc2UgZGVib3VuY2luZywgd2UgZG9uJ3Qgd2FudCBvbkRyYWcgdG8gZmlyZSBBRlRFUiBvbkRyYWdFbmQoKS5cblxuICAgICAgb25EcmFnRW5kICYmIHdhc0RyYWdnaW5nICYmIG9uRHJhZ0VuZChzZWxmKTtcbiAgICAgIG9uUmVsZWFzZSAmJiBvblJlbGVhc2Uoc2VsZiwgaXNEcmFnTm90Q2xpY2spO1xuICAgIH0sXG4gICAgICAgIF9vbkdlc3R1cmVTdGFydCA9IGZ1bmN0aW9uIF9vbkdlc3R1cmVTdGFydChlKSB7XG4gICAgICByZXR1cm4gZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxICYmIChzZWxmLmlzR2VzdHVyaW5nID0gdHJ1ZSkgJiYgb25HZXN0dXJlU3RhcnQoZSwgc2VsZi5pc0RyYWdnaW5nKTtcbiAgICB9LFxuICAgICAgICBfb25HZXN0dXJlRW5kID0gZnVuY3Rpb24gX29uR2VzdHVyZUVuZCgpIHtcbiAgICAgIHJldHVybiAoc2VsZi5pc0dlc3R1cmluZyA9IGZhbHNlKSB8fCBvbkdlc3R1cmVFbmQoc2VsZik7XG4gICAgfSxcbiAgICAgICAgb25TY3JvbGwgPSBmdW5jdGlvbiBvblNjcm9sbChlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHggPSBzY3JvbGxGdW5jWCgpLFxuICAgICAgICAgIHkgPSBzY3JvbGxGdW5jWSgpO1xuICAgICAgb25EZWx0YSgoeCAtIHNjcm9sbFgpICogc2Nyb2xsU3BlZWQsICh5IC0gc2Nyb2xsWSkgKiBzY3JvbGxTcGVlZCwgMSk7XG4gICAgICBzY3JvbGxYID0geDtcbiAgICAgIHNjcm9sbFkgPSB5O1xuICAgICAgb25TdG9wICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSxcbiAgICAgICAgX29uV2hlZWwgPSBmdW5jdGlvbiBfb25XaGVlbChlKSB7XG4gICAgICBpZiAoX2lnbm9yZUNoZWNrKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZSA9IF9nZXRFdmVudChlLCBwcmV2ZW50RGVmYXVsdCk7XG4gICAgICBvbldoZWVsICYmICh3aGVlbGVkID0gdHJ1ZSk7XG4gICAgICB2Y
5398XIgbXVsdGlwbGllciA9IChlLmRlbHRhTW9kZSA9PT0gMSA/IGxpbmVIZWlnaHQgOiBlLmRlbHRhTW9kZSA9PT0gMiA/IF93aW4uaW5uZXJIZWlnaHQgOiAxKSAqIHdoZWVsU3BlZWQ7XG4gICAgICBvbkRlbHRhKGUuZGVsdGFYICogbXVsdGlwbGllciwgZS5kZWx0YVkgKiBtdWx0aXBsaWVyLCAwKTtcbiAgICAgIG9uU3RvcCAmJiAhaXNOb3JtYWxpemVyICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSxcbiAgICAgICAgX29uTW92ZSA9IGZ1bmN0aW9uIF9vbk1vdmUoZSkge1xuICAgICAgaWYgKF9pZ25vcmVDaGVjayhlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciB4ID0gZS5jbGllbnRYLFxuICAgICAgICAgIHkgPSBlLmNsaWVudFksXG4gICAgICAgICAgZHggPSB4IC0gc2VsZi54LFxuICAgICAgICAgIGR5ID0geSAtIHNlbGYueTtcbiAgICAgIHNlbGYueCA9IHg7XG4gICAgICBzZWxmLnkgPSB5O1xuICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgb25TdG9wICYmIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgICAoZHggfHwgZHkpICYmIG9uVG91Y2hPclBvaW50ZXJEZWx0YShkeCwgZHkpO1xuICAgIH0sXG4gICAgICAgIF9vbkhvdmVyID0gZnVuY3Rpb24gX29uSG92ZXIoZSkge1xuICAgICAgc2VsZi5ldmVudCA9IGU7XG4gICAgICBvbkhvdmVyKHNlbGYpO1xuICAgIH0sXG4gICAgICAgIF9vbkhvdmVyRW5kID0gZnVuY3Rpb24gX29uSG92ZXJFbmQoZSkge1xuICAgICAgc2VsZi5ldmVudCA9IGU7XG4gICAgICBvbkhvdmVyRW5kKHNlbGYpO1xuICAgIH0sXG4gICAgICAgIF9vbkNsaWNrID0gZnVuY3Rpb24gX29uQ2xpY2soZSkge1xuICAgICAgcmV0dXJuIF9pZ25vcmVDaGVjayhlKSB8fCBfZ2V0RXZlbnQoZSwgcHJldmVudERlZmF1bHQpICYmIG9uQ2xpY2soc2VsZik7XG4gICAgfTtcblxuICAgIG9uU3RvcERlbGF5ZWRDYWxsID0gc2VsZi5fZGMgPSBnc2FwLmRlbGF5ZWRDYWxsKG9uU3RvcERlbGF5IHx8IDAuMjUsIG9uU3RvcEZ1bmMpLnBhdXNlKCk7XG4gICAgc2VsZi5kZWx0YVggPSBzZWxmLmRlbHRhWSA9IDA7XG4gICAgc2VsZi5fdnggPSBfZ2V0VmVsb2NpdHlQcm9wKDAsIDUwLCB0cnVlKTtcbiAgICBzZWxmLl92eSA9IF9nZXRWZWxvY2l0eVByb3AoMCwgNTAsIHRydWUpO1xuICAgIHNlbGYuc2Nyb2xsWCA9IHNjcm9sbEZ1bmNYO1xuICAgIHNlbGYuc2Nyb2xsWSA9IHNjcm9sbEZ1bmNZO1xuICAgIHNlbGYuaXNEcmFnZ2luZyA9IHNlbGYuaXNHZXN0dXJpbmcgPSBzZWxmLmlzUHJlc3NlZCA9IGZhbHNlO1xuXG4gICAgX2NvbnRleHQodGhpcyk7XG5cbiAgICBzZWxmLmVuYWJsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIXNlbGYuaXNFbmFibGVkKSB7XG4gICAgICAgIF9hZGRMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG5cbiAgICAgICAgdHlwZS5pbmRleE9mKFwic2Nyb2xsXCIpID49IDAgJiYgX2FkZExpc3RlbmVyKGlzVmlld3BvcnQgPyBvd25lckRvYyA6IHRhcmdldCwgXCJzY3JvbGxcIiwgb25TY3JvbGwsIHBhc3NpdmUsIGNhcHR1cmUpO1xuICAgICAgICB0eXBlLmluZGV4T2YoXCJ3aGVlbFwiKSA+PSAwICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIFwid2hlZWxcIiwgX29uV2hlZWwsIHBhc3NpdmUsIGNhcHR1cmUpO1xuXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoXCJ0b3VjaFwiKSA+PSAwICYmIF9pc1RvdWNoIHx8IHR5cGUuaW5kZXhPZihcInBvaW50ZXJcIikgPj0gMCkge1xuICAgICAgICAgIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9ldmVudFR5cGVzWzBdLCBfb25QcmVzcywgcGFzc2l2ZSwgY2FwdHVyZSk7XG5cbiAgICAgICAgICBfYWRkTGlzdGVuZXIob3duZXJEb2MsIF9ldmVudFR5cGVzWzJdLCBfb25SZWxlYXNlKTtcblxuICAgICAgICAgIF9hZGRMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbM10sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgICAgYWxsb3dDbGlja3MgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgXCJjbGlja1wiLCBjbGlja0NhcHR1cmUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG9uQ2xpY2sgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgXCJjbGlja1wiLCBfb25DbGljayk7XG4gICAgICAgICAgb25HZXN0dXJlU3RhcnQgJiYgX2FkZExpc3RlbmVyKG93bmVyRG9jLCBcImdlc3R1cmVzdGFydFwiLCBfb25HZXN0dXJlU3RhcnQpO1xuICAgICAgICAgIG9uR2VzdHVyZUVuZCAmJiBfYWRkTGlzdGVuZXIob3duZXJEb2MsIFwiZ2VzdHVyZWVuZFwiLCBfb25HZXN0dXJlRW5kKTtcbiAgICAgICAgICBvbkhvdmVyICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9wb2ludGVyVHlwZSArIFwiZW50ZXJcIiwgX29uSG92ZXIpO1xuICAgICAgICAgIG9uSG92ZXJFbmQgJiYgX2FkZExpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJsZWF2ZVwiLCBfb25Ib3ZlckVuZCk7XG4gICAgICAgICAgb25Nb3ZlICYmIF9hZGRMaXN0ZW5lcih0YXJnZXQsIF9wb2ludGVyVHlwZSArIFwibW92ZVwiLCBfb25Nb3ZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5pc0RyYWdnaW5nID0gc2VsZi5pc0dlc3R1cmluZyA9IHNlbGYuaXNQcmVzc2VkID0gbW92ZWQgPSBkcmFnZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgICBzZWxmLl92eS5yZXNldCgpO1xuXG4gICAgICAgIHNjcm9sbFggPSBzY3JvbGxGdW5jWCgpO1xuICAgICAgICBzY3JvbGxZID0gc2Nyb2xsRnVuY1koKTtcbiAgICAgICAgZSAmJiBlLnR5cGUgJiYgX29uUHJlc3MoZSk7XG4gICAgICAgIG9uRW5hYmxlICYmIG9uRW5hYmxlKHNlbGYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuXG4gICAgc2VsZi5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuaXNFbmFibGVkKSB7XG4gICAgICAgIC8vIG9ubHkgcmVtb3ZlIHRoZSBfb25TY3JvbGwgbGlzdGVuZXIgaWYgdGhlcmUgYXJlbid0IGFueSBvdGhlcnMgdGhhdCByZWx5IG9uIHRoZSBmdW5jdGlvbmFsaXR5LlxuICAgICAgICBfb2JzZXJ2ZXJzLmZpbHRlcihmdW5jdGlvbiAobykge1xuICAgICAgICAgI
vendor: 8,319 bytes, lines 5398-5527
5398HJldHVybiBvICE9PSBzZWxmICYmIF9pc1ZpZXdwb3J0KG8udGFyZ2V0KTtcbiAgICAgICAgfSkubGVuZ3RoIHx8IF9yZW1vdmVMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG5cbiAgICAgICAgaWYgKHNlbGYuaXNQcmVzc2VkKSB7XG4gICAgICAgICAgc2VsZi5fdngucmVzZXQoKTtcblxuICAgICAgICAgIHNlbGYuX3Z5LnJlc2V0KCk7XG5cbiAgICAgICAgICBfcmVtb3ZlTGlzdGVuZXIoaXNOb3JtYWxpemVyID8gdGFyZ2V0IDogb3duZXJEb2MsIF9ldmVudFR5cGVzWzFdLCBfb25EcmFnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihpc1ZpZXdwb3J0ID8gb3duZXJEb2MgOiB0YXJnZXQsIFwic2Nyb2xsXCIsIG9uU2Nyb2xsLCBjYXB0dXJlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBcIndoZWVsXCIsIF9vbldoZWVsLCBjYXB0dXJlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBfZXZlbnRUeXBlc1swXSwgX29uUHJlc3MsIGNhcHR1cmUpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbMl0sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihvd25lckRvYywgX2V2ZW50VHlwZXNbM10sIF9vblJlbGVhc2UpO1xuXG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcih0YXJnZXQsIFwiY2xpY2tcIiwgY2xpY2tDYXB0dXJlLCB0cnVlKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBcImNsaWNrXCIsIF9vbkNsaWNrKTtcblxuICAgICAgICBfcmVtb3ZlTGlzdGVuZXIob3duZXJEb2MsIFwiZ2VzdHVyZXN0YXJ0XCIsIF9vbkdlc3R1cmVTdGFydCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKG93bmVyRG9jLCBcImdlc3R1cmVlbmRcIiwgX29uR2VzdHVyZUVuZCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJlbnRlclwiLCBfb25Ib3Zlcik7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJsZWF2ZVwiLCBfb25Ib3ZlckVuZCk7XG5cbiAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHRhcmdldCwgX3BvaW50ZXJUeXBlICsgXCJtb3ZlXCIsIF9vbk1vdmUpO1xuXG4gICAgICAgIHNlbGYuaXNFbmFibGVkID0gc2VsZi5pc1ByZXNzZWQgPSBzZWxmLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgb25EaXNhYmxlICYmIG9uRGlzYWJsZShzZWxmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5raWxsID0gc2VsZi5yZXZlcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRpc2FibGUoKTtcblxuICAgICAgdmFyIGkgPSBfb2JzZXJ2ZXJzLmluZGV4T2Yoc2VsZik7XG5cbiAgICAgIGkgPj0gMCAmJiBfb2JzZXJ2ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIF9ub3JtYWxpemVyID09PSBzZWxmICYmIChfbm9ybWFsaXplciA9IDApO1xuICAgIH07XG5cbiAgICBfb2JzZXJ2ZXJzLnB1c2goc2VsZik7XG5cbiAgICBpc05vcm1hbGl6ZXIgJiYgX2lzVmlld3BvcnQodGFyZ2V0KSAmJiAoX25vcm1hbGl6ZXIgPSBzZWxmKTtcbiAgICBzZWxmLmVuYWJsZShldmVudCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKE9ic2VydmVyLCBbe1xuICAgIGtleTogXCJ2ZWxvY2l0eVhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl92eC5nZXRWZWxvY2l0eSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2ZWxvY2l0eVlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl92eS5nZXRWZWxvY2l0eSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBPYnNlcnZlcjtcbn0oKTtcbk9ic2VydmVyLnZlcnNpb24gPSBcIjMuMTUuMFwiO1xuXG5PYnNlcnZlci5jcmVhdGUgPSBmdW5jdGlvbiAodmFycykge1xuICByZXR1cm4gbmV3IE9ic2VydmVyKHZhcnMpO1xufTtcblxuT2JzZXJ2ZXIucmVnaXN0ZXIgPSBfaW5pdENvcmU7XG5cbk9ic2VydmVyLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9vYnNlcnZlcnMuc2xpY2UoKTtcbn07XG5cbk9ic2VydmVyLmdldEJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIF9vYnNlcnZlcnMuZmlsdGVyKGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8udmFycy5pZCA9PT0gaWQ7XG4gIH0pWzBdO1xufTtcblxuX2dldEdTQVAoKSAmJiBnc2FwLnJlZ2lzdGVyUGx1Z2luKE9ic2VydmVyKTtcbmV4cG9ydCB7IE9ic2VydmVyIGFzIGRlZmF1bHQsIF9pc1ZpZXdwb3J0LCBfc2Nyb2xsZXJzLCBfZ2V0U2Nyb2xsRnVuYywgX2dldFByb3h5UHJvcCwgX3Byb3hpZXMsIF9nZXRWZWxvY2l0eVByb3AsIF92ZXJ0aWNhbCwgX2hvcml6b250YWwsIF9nZXRUYXJnZXQgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= 5399//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js 5400 5401}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 5402/* harmony export */ __webpack_require__.d(__webpack_exports__, { 5403/* harmony export */ ScrollTrigger: () => (/* binding */ ScrollTrigger), 5404/* harmony export */ "default": () => (/* binding */ ScrollTrigger) 5405/* harmony export */ }); 5406/* harmony import */ var _Observer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Observer.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/Observer.js"); 5407/*! 5408 * ScrollTrigger 3.15.0 5409 * https://gsap.com 5410 * 5411 * @license Copyright 2008-2026, GreenSock. All rights reserved. 5412 * Subject to the terms at https://gsap.com/standard-license 5413 * @author: Jack Doyle, [email protected] 5414*/ 5415 5416/* eslint-disable */ 5417 5418 5419var gsap, 5420 _coreInitted, 5421 _win, 5422 _doc, 5423 _docEl, 5424 _body, 5425 _root, 5426 _resizeDelay, 5427 _toArray, 5428 _clamp, 5429 _time2, 5430 _syncInterval, 5431 _refreshing, 5432 _pointerIsDown, 5433 _transformProp, 5434 _i, 5435 _prevWidth, 5436 _prevHeight, 5437 _autoRefresh, 5438 _sort, 5439 _suppressOverwrites, 5440 _ignoreResize, 5441 _normalizer, 5442 _ignoreMobileResize, 5443 _baseScreenHeight, 5444 _baseScreenWidth, 5445 _fixIOSBug, 5446 _context, 5447 _scrollRestoration, 5448 _div100vh, 5449 _100vh, 5450 _isReverted, 5451 _clampingMax, 5452 _limitCallbacks, 5453 // if true, we'll only trigger callbacks if the active state toggles, so if you scroll immediately past both the start and end positions of a ScrollTrigger (thus inactive to inactive), neither its onEnter nor onLeave will be called. This is useful during startup. 5454_startup = 1, 5455 _getTime = Date.now, 5456 _time1 = _getTime(), 5457 _lastScrollTime = 0, 5458 _enabled = 0, 5459 _parseClamp = function _parseClamp(value, type, self) { 5460 var clamp = _isString(value) && (value.substr(0, 6) === "clamp(" || value.indexOf("max") > -1); 5461 self["_" + type + "Clamp"] = clamp; 5462 return clamp ? value.substr(6, value.length - 7) : value; 5463}, 5464 _keepClamp = function _keepClamp(value, clamp) { 5465 return clamp && (!_isString(value) || value.substr(0, 6) !== "clamp(") ? "clamp(" + value + ")" : value; 5466}, 5467 _rafBugFix = function _rafBugFix() { 5468 return _enabled && requestAnimationFrame(_rafBugFix); 5469}, 5470 // in some browsers (like Firefox), screen repaints weren't consistent unless we had SOMETHING queued up in requestAnimationFrame()! So this just creates a super simple loop to keep it alive and smooth out repaints. 5471_pointerDownHandler = function _pointerDownHandler() { 5472 return _pointerIsDown = 1; 5473}, 5474 _pointerUpHandler = function _pointerUpHandler() { 5475 return _pointerIsDown = 0; 5476}, 5477 _passThrough = function _passThrough(v) { 5478 return v; 5479}, 5480 _round = function _round(value) { 5481 return Math.round(value * 100000) / 100000 || 0; 5482}, 5483 _windowExists = function _windowExists() { 5484 return typeof window !== "undefined"; 5485}, 5486 _getGSAP = function _getGSAP() { 5487 return gsap || _windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap; 5488}, 5489 _isViewport = function _isViewport(e) { 5490 return !!~_root.indexOf(e); 5491}, 5492 _getViewportDimension = function _getViewportDimension(dimensionProperty) { 5493 return (dimensionProperty === "Height" ? _100vh : _win["inner" + dimensionProperty]) || _docEl["client" + dimensionProperty] || _body["client" + dimensionProperty]; 5494}, 5495 _getBoundsFunc = function _getBoundsFunc(element) { 5496 return (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(element, "getBoundingClientRect") || (_isViewport(element) ? function () { 5497 _winOffsets.width = _win.innerWidth; 5498 _winOffsets.height = _100vh; 5499 return _winOffsets; 5500 } : function () { 5501 return _getBounds(element); 5502 }); 5503}, 5504 _getSizeFunc = function _getSizeFunc(scroller, isViewport, _ref) { 5505 var d = _ref.d, 5506 d2 = _ref.d2, 5507 a = _ref.a; 5508 return (a = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "getBoundingClientRect")) ? function () { 5509 return a()[d]; 5510 } : function () { 5511 return (isViewport ? _getViewportDimension(d2) : scroller["client" + d2]) || 0; 5512 }; 5513}, 5514 _getOffsetsFunc = function _getOffsetsFunc(element, isViewport) { 5515 return !isViewport || ~_Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.indexOf(element) ? _getBoundsFunc(element) : function () { 5516 return _winOffsets; 5517 }; 5518}, 5519 _maxScroll = function _maxScroll(element, _ref2) { 5520 var s = _ref2.s, 5521 d2 = _ref2.d2, 5522 d = _ref2.d, 5523 a = _ref2.a; 5524 return Math.max(0, (s = "scroll" + d2) && (a = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(element, s)) ? a() - _getBoundsFunc(element)()[d] : _isViewport(element) ? (_docEl[s] || _body[s]) - _getViewportDimension(d2) : element[s] - element["offset" + d2]); 5525}, 5526 _iterateAutoRefresh = function _iterateAutoRefresh(func, events) { 5527 for (var i = 0; i < _autoRefresh.length; i += 3) {
vendor: 7,374 bytes, lines 5528-5748
5528 (!events || ~events.indexOf(_autoRefresh[i + 1])) && func(_autoRefresh[i], _autoRefresh[i + 1], _autoRefresh[i + 2]); 5529 } 5530}, 5531 _isString = function _isString(value) { 5532 return typeof value === "string"; 5533}, 5534 _isFunction = function _isFunction(value) { 5535 return typeof value === "function"; 5536}, 5537 _isNumber = function _isNumber(value) { 5538 return typeof value === "number"; 5539}, 5540 _isObject = function _isObject(value) { 5541 return typeof value === "object"; 5542}, 5543 _endAnimation = function _endAnimation(animation, reversed, pause) { 5544 return animation && animation.progress(reversed ? 0 : 1) && pause && animation.pause(); 5545}, 5546 _callback = function _callback(self, func, extraParam) { 5547 if (self.enabled) { 5548 var result = self._ctx ? self._ctx.add(function () { 5549 return func(self, extraParam); 5550 }) : func(self, extraParam); 5551 result && result.totalTime && (self.callbackAnimation = result); 5552 } 5553}, 5554 _abs = Math.abs, 5555 _left = "left", 5556 _top = "top", 5557 _right = "right", 5558 _bottom = "bottom", 5559 _width = "width", 5560 _height = "height", 5561 _Right = "Right", 5562 _Left = "Left", 5563 _Top = "Top", 5564 _Bottom = "Bottom", 5565 _padding = "padding", 5566 _margin = "margin", 5567 _Width = "Width", 5568 _Height = "Height", 5569 _px = "px", 5570 _getComputedStyle = function _getComputedStyle(element) { 5571 return _win.getComputedStyle(element.nodeType === Node.DOCUMENT_NODE ? element.scrollingElement : element); 5572}, 5573 _makePositionable = function _makePositionable(element) { 5574 // if the element already has position: absolute or fixed, leave that, otherwise make it position: relative 5575 var position = _getComputedStyle(element).position; 5576 5577 element.style.position = position === "absolute" || position === "fixed" ? position : "relative"; 5578}, 5579 _setDefaults = function _setDefaults(obj, defaults) { 5580 for (var p in defaults) { 5581 p in obj || (obj[p] = defaults[p]); 5582 } 5583 5584 return obj; 5585}, 5586 _getBounds = function _getBounds(element, withoutTransforms) { 5587 var tween = withoutTransforms && _getComputedStyle(element)[_transformProp] !== "matrix(1, 0, 0, 1, 0, 0)" && gsap.to(element, { 5588 x: 0, 5589 y: 0, 5590 xPercent: 0, 5591 yPercent: 0, 5592 rotation: 0, 5593 rotationX: 0, 5594 rotationY: 0, 5595 scale: 1, 5596 skewX: 0, 5597 skewY: 0 5598 }).progress(1), 5599 bounds = element.getBoundingClientRect ? element.getBoundingClientRect() : element.scrollingElement.getBoundingClientRect(); 5600 tween && tween.progress(0).kill(); 5601 return bounds; 5602}, 5603 _getSize = function _getSize(element, _ref3) { 5604 var d2 = _ref3.d2; 5605 return element["offset" + d2] || element["client" + d2] || 0; 5606}, 5607 _getLabelRatioArray = function _getLabelRatioArray(timeline) { 5608 var a = [], 5609 labels = timeline.labels, 5610 duration = timeline.duration(), 5611 p; 5612 5613 for (p in labels) { 5614 a.push(labels[p] / duration); 5615 } 5616 5617 return a; 5618}, 5619 _getClosestLabel = function _getClosestLabel(animation) { 5620 return function (value) { 5621 return gsap.utils.snap(_getLabelRatioArray(animation), value); 5622 }; 5623}, 5624 _snapDirectional = function _snapDirectional(snapIncrementOrArray) { 5625 var snap = gsap.utils.snap(snapIncrementOrArray), 5626 a = Array.isArray(snapIncrementOrArray) && snapIncrementOrArray.slice(0).sort(function (a, b) { 5627 return a - b; 5628 }); 5629 return a ? function (value, direction, threshold) { 5630 if (threshold === void 0) { 5631 threshold = 1e-3; 5632 } 5633 5634 var i; 5635 5636 if (!direction) { 5637 return snap(value); 5638 } 5639 5640 if (direction > 0) { 5641 value -= threshold; // to avoid rounding errors. If we're too strict, it might snap forward, then immediately again, and again. 5642 5643 for (i = 0; i < a.length; i++) { 5644 if (a[i] >= value) { 5645 return a[i]; 5646 } 5647 } 5648 5649 return a[i - 1]; 5650 } else { 5651 i = a.length; 5652 value += threshold; 5653 5654 while (i--) { 5655 if (a[i] <= value) { 5656 return a[i]; 5657 } 5658 } 5659 } 5660 5661 return a[0]; 5662 } : function (value, direction, threshold) { 5663 if (threshold === void 0) { 5664 threshold = 1e-3; 5665 } 5666 5667 var snapped = snap(value); 5668 return !direction || Math.abs(snapped - value) < threshold || snapped - value < 0 === direction < 0 ? snapped : snap(direction < 0 ? value - snapIncrementOrArray : value + snapIncrementOrArray); 5669 }; 5670}, 5671 _getLabelAtDirection = function _getLabelAtDirection(timeline) { 5672 return function (value, st) { 5673 return _snapDirectional(_getLabelRatioArray(timeline))(value, st.direction); 5674 }; 5675}, 5676 _multiListener = function _multiListener(func, element, types, callback) { 5677 return types.split(",").forEach(function (type) { 5678 return func(element, type, callback); 5679 }); 5680}, 5681 _addListener = function _addListener(element, type, func, nonPassive, capture) { 5682 return element.addEventListener(type, func, { 5683 passive: !nonPassive, 5684 capture: !!capture 5685 }); 5686}, 5687 _removeListener = function _removeListener(element, type, func, capture) { 5688 return element.removeEventListener(type, func, !!capture); 5689}, 5690 _wheelListener = function _wheelListener(func, el, scrollFunc) { 5691 scrollFunc = scrollFunc && scrollFunc.wheelHandler; 5692 5693 if (scrollFunc) { 5694 func(el, "wheel", scrollFunc); 5695 func(el, "touchmove", scrollFunc); 5696 } 5697}, 5698 _markerDefaults = { 5699 startColor: "green", 5700 endColor: "red", 5701 indent: 0, 5702 fontSize: "16px", 5703 fontWeight: "normal" 5704}, 5705 _defaults = { 5706 toggleActions: "play", 5707 anticipatePin: 0 5708}, 5709 _keywords = { 5710 top: 0, 5711 left: 0, 5712 center: 0.5, 5713 bottom: 1, 5714 right: 1 5715}, 5716 _offsetToPx = function _offsetToPx(value, size) { 5717 if (_isString(value)) { 5718 var eqIndex = value.indexOf("="), 5719 relative = ~eqIndex ? +(value.charAt(eqIndex - 1) + 1) * parseFloat(value.substr(eqIndex + 1)) : 0; 5720 5721 if (~eqIndex) { 5722 value.indexOf("%") > eqIndex && (relative *= size / 100); 5723 value = value.substr(0, eqIndex - 1); 5724 } 5725 5726 value = relative + (value in _keywords ? _keywords[value] * size : ~value.indexOf("%") ? parseFloat(value) * size / 100 : parseFloat(value) || 0); 5727 } 5728 5729 return value; 5730}, 5731 _createMarker = function _createMarker(type, name, container, direction, _ref4, offset, matchWidthEl, containerAnimation) { 5732 var startColor = _ref4.startColor, 5733 endColor = _ref4.endColor, 5734 fontSize = _ref4.fontSize, 5735 indent = _ref4.indent, 5736 fontWeight = _ref4.fontWeight; 5737 5738 var e = _doc.createElement("div"), 5739 useFixedPosition = _isViewport(container) || (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(container, "pinType") === "fixed", 5740 isScroller = type.indexOf("scroller") !== -1, 5741 parent = useFixedPosition ? _body : container.tagName === "IFRAME" ? container.contentDocument.body : container, 5742 isStart = type.indexOf("start") !== -1, 5743 color = isStart ? startColor : endColor, 5744 css = "border-color:" + color + ";font-size:" + fontSize + ";color:" + color + ";font-weight:" + fontWeight + ";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;"; 5745 5746 css += "position:" + ((isScroller || containerAnimation) && useFixedPosition ? "fixed;" : "absolute;"); 5747 (isScroller || containerAnimation || !useFixedPosition) && (css += (direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical ? _right : _bottom) + ":" + (offset + parseFloat(indent)) + "px;"); 5748 matchWidthEl && (css += "box-sizing:border-box;text-align:left;
vendor: 12,135 bytes, lines 5748-6043
5748width:" + matchWidthEl.offsetWidth + "px;"); 5749 e._isStart = isStart; 5750 e.setAttribute("class", "gsap-marker-" + type + (name ? " marker-" + name : "")); 5751 e.style.cssText = css; 5752 e.innerText = name || name === 0 ? type + "-" + name : type; 5753 parent.children[0] ? parent.insertBefore(e, parent.children[0]) : parent.appendChild(e); 5754 e._offset = e["offset" + direction.op.d2]; 5755 5756 _positionMarker(e, 0, direction, isStart); 5757 5758 return e; 5759}, 5760 _positionMarker = function _positionMarker(marker, start, direction, flipped) { 5761 var vars = { 5762 display: "block" 5763 }, 5764 side = direction[flipped ? "os2" : "p2"], 5765 oppositeSide = direction[flipped ? "p2" : "os2"]; 5766 marker._isFlipped = flipped; 5767 vars[direction.a + "Percent"] = flipped ? -100 : 0; 5768 vars[direction.a] = flipped ? "1px" : 0; 5769 vars["border" + side + _Width] = 1; 5770 vars["border" + oppositeSide + _Width] = 0; 5771 vars[direction.p] = start + "px"; 5772 gsap.set(marker, vars); 5773}, 5774 _triggers = [], 5775 _ids = {}, 5776 _rafID, 5777 _sync = function _sync() { 5778 return _getTime() - _lastScrollTime > 34 && (_rafID || (_rafID = requestAnimationFrame(_updateAll))); 5779}, 5780 _onScroll = function _onScroll() { 5781 // previously, we tried to optimize performance by batching/deferring to the next requestAnimationFrame(), but discovered that Safari has a few bugs that make this unworkable (especially on iOS). See https://codepen.io/GreenSock/pen/16c435b12ef09c38125204818e7b45fc?editors=0010 and https://codepen.io/GreenSock/pen/JjOxYpQ/3dd65ccec5a60f1d862c355d84d14562?editors=0010 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503?editors=0010 5782 if (!_normalizer || !_normalizer.isPressed || _normalizer.startX > _body.clientWidth) { 5783 // if the user is dragging the scrollbar, allow it. 5784 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; 5785 5786 if (_normalizer) { 5787 _rafID || (_rafID = requestAnimationFrame(_updateAll)); 5788 } else { 5789 _updateAll(); // Safari in particular (on desktop) NEEDS the immediate update rather than waiting for a requestAnimationFrame() whereas iOS seems to benefit from waiting for the requestAnimationFrame() tick, at least when normalizing. See https://codepen.io/GreenSock/pen/qBYozqO?editors=0110 5790 5791 } 5792 5793 _lastScrollTime || _dispatch("scrollStart"); 5794 _lastScrollTime = _getTime(); 5795 } 5796}, 5797 _setBaseDimensions = function _setBaseDimensions() { 5798 _baseScreenWidth = _win.innerWidth; 5799 _baseScreenHeight = _win.innerHeight; 5800}, 5801 _onResize = function _onResize(force) { 5802 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; 5803 (force === true || !_refreshing && !_ignoreResize && !_doc.fullscreenElement && !_doc.webkitFullscreenElement && (!_ignoreMobileResize || _baseScreenWidth !== _win.innerWidth || Math.abs(_win.innerHeight - _baseScreenHeight) > _win.innerHeight * 0.25)) && _resizeDelay.restart(true); 5804}, 5805 // ignore resizes triggered by refresh() 5806_listeners = {}, 5807 _emptyArray = [], 5808 _softRefresh = function _softRefresh() { 5809 return _removeListener(ScrollTrigger, "scrollEnd", _softRefresh) || _refreshAll(true); 5810}, 5811 _dispatch = function _dispatch(type) { 5812 return _listeners[type] && _listeners[type].map(function (f) { 5813 return f(); 5814 }) || _emptyArray; 5815}, 5816 _savedStyles = [], 5817 // when ScrollTrigger.saveStyles() is called, the inline styles are recorded in this Array in a sequential format like [element, cssText, gsCache, media]. This keeps it very memory-efficient and fast to iterate through. 5818_revertRecorded = function _revertRecorded(media) { 5819 for (var i = 0; i < _savedStyles.length; i += 5) { 5820 if (!media || _savedStyles[i + 4] && _savedStyles[i + 4].query === media) { 5821 _savedStyles[i].style.cssText = _savedStyles[i + 1]; 5822 _savedStyles[i].getBBox && _savedStyles[i].setAttribute("transform", _savedStyles[i + 2] || ""); 5823 _savedStyles[i + 3].uncache = 1; 5824 } 5825 } 5826}, 5827 _recordScrollPositions = function _recordScrollPositions() { 5828 return _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) { 5829 return _isFunction(obj) && ++obj.cacheID && (obj.rec = obj()); 5830 }); 5831}, 5832 // record the current scroll position. Also force the clearing of the cache because some browsers take a little while to dispatch the "scroll" event and the user may have changed the scroll position and then called ScrollTrigger.refresh() right away 5833_revertAll = function _revertAll(kill, media) { 5834 var trigger; 5835 5836 for (_i = 0; _i < _triggers.length; _i++) { 5837 trigger = _triggers[_i]; 5838 5839 if (trigger && (!media || trigger._ctx === media)) { 5840 if (kill) { 5841 trigger.kill(1); 5842 } else { 5843 trigger.revert(true, true); 5844 } 5845 } 5846 } 5847 5848 _isReverted = true; 5849 media && _revertRecorded(media); 5850 media || _dispatch("revert"); 5851}, 5852 _clearScrollMemory = function _clearScrollMemory(scrollRestoration, force) { 5853 // zero-out all the recorded scroll positions. Don't use _triggers because if, for example, .matchMedia() is used to create some ScrollTriggers and then the user resizes and it removes ALL ScrollTriggers, and then go back to a size where there are ScrollTriggers, it would have kept the position(s) saved from the initial state. 5854 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; 5855 (force || !_refreshingAll) && _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) { 5856 return _isFunction(obj) && obj.cacheID++ && (obj.rec = 0); 5857 }); 5858 _isString(scrollRestoration) && (_win.history.scrollRestoration = _scrollRestoration = scrollRestoration); 5859}, 5860 _refreshingAll, 5861 _refreshID = 0, 5862 _queueRefreshID, 5863 _queueRefreshAll = function _queueRefreshAll() { 5864 // we don't want to call _refreshAll() every time we create a new ScrollTrigger (for performance reasons) - it's better to batch them. Some frameworks dynamically load content and we can't rely on the window's "load" or "DOMContentLoaded" events to trigger it. 5865 if (_queueRefreshID !== _refreshID) { 5866 var id = _queueRefreshID = _refreshID; 5867 requestAnimationFrame(function () { 5868 return id === _refreshID && _refreshAll(true); 5869 }); 5870 } 5871}, 5872 _refresh100vh = function _refresh100vh() { 5873 _body.appendChild(_div100vh); 5874 5875 _100vh = !_normalizer && _div100vh.offsetHeight || _win.innerHeight; 5876 5877 _body.removeChild(_div100vh); 5878}, 5879 _hideAllMarkers = function _hideAllMarkers(hide) { 5880 return _toArray(".gsap-marker-start, .gsap-marker-end, .gsap-marker-scroller-start, .gsap-marker-scroller-end").forEach(function (el) { 5881 return el.style.display = hide ? "none" : "block"; 5882 }); 5883}, 5884 _refreshAll = function _refreshAll(force, skipRevert) { 5885 _docEl = _doc.documentElement; // some frameworks like Astro may cache the <body> and replace it during routing, so we'll just re-record the _docEl and _body for safety (otherwise, the markers may not get added properly). 5886 5887 _body = _doc.body; 5888 _root = [_win, _doc, _docEl, _body]; 5889 5890 if (_lastScrollTime && !force && !_isReverted) { 5891 _addListener(ScrollTrigger, "scrollEnd", _softRefresh); 5892 5893 return; 5894 } 5895 5896 _refresh100vh(); 5897 5898 _refreshingAll = ScrollTrigger.isRefreshing = true; 5899 _isReverted || _recordScrollPositions(); 5900 5901 var refreshInits = _dispatch("refreshInit"); 5902 5903 _sort && ScrollTrigger.sort(); 5904 skipRevert || _revertAll(); 5905 5906 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) { 5907 if (_isFunction(obj)) { 5908 obj.smooth && (obj.target.style.scrollBehavior = "auto"); // smooth scrolling interferes 5909 5910 obj(0); 5911 } 5912 }); 5913 5914 _triggers.slice(0).forEach(function (t) { 5915 return t.refresh(); 5916 }); // don't loop with _i because during a refresh() someone could call ScrollTrigger.update() which would iterate through _i resulting in a skip. 5917 5918 5919 _isReverted = false; 5920 5921 _triggers.forEach(function (t) { 5922 // nested pins (pinnedContainer) with pinSpacing may expand the container, so we must accommodate that here. 5923 if (t._subPinOffset && t.pin) { 5924 var prop = t.vars.horizontal ? "offsetWidth" : "offsetHeight", 5925 original = t.pin[prop]; 5926 t.revert(true, 1); 5927 t.adjustPinSpacing(t.pin[prop] - original); 5928 t.refresh(); 5929 } 5930 }); 5931 5932 _clampingMax = 1; // pinSpacing might be propping a page open, thus when we .setPositions() to clamp a ScrollTrigger's end we should leave the pinSpacing alone. That's what this flag is for. 5933 5934 _hideAllMarkers(true); 5935 5936 _triggers.forEach(function (t) { 5937 // the scroller's max scroll position may change after all the ScrollTriggers refreshed (like pinning could push it down), so we need to loop back and correct any with end: "max". Same for anything with a clamped end 5938 var max = _maxScroll(t.scroller, t._dir), 5939 endClamp = t.vars.end === "max" || t._endClamp && t.end > max, 5940 startClamp = t._startClamp && t.start >= max; 5941 5942 (endClamp || startClamp) && t.setPositions(startClamp ? max - 1 : t.start, endClamp ? Math.max(startClamp ? max : t.start + 1, max) : t.end, true); 5943 }); 5944 5945 _hideAllMarkers(false); 5946 5947 _clampingMax = 0; 5948 refreshInits.forEach(function (result) { 5949 return result && result.render && result.render(-1); 5950 }); // if the onRefreshInit() returns an animation (typically a gsap.set()), revert it. This makes it easy to put things in a certain spot before refreshing for measurement purposes, and then put things back. 5951 5952 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (obj) { 5953 if (_isFunction(obj)) { 5954 obj.smooth && requestAnimationFrame(function () { 5955 return obj.target.style.scrollBehavior = "smooth"; 5956 }); 5957 obj.rec && obj(obj.rec); 5958 } 5959 }); 5960 5961 _clearScrollMemory(_scrollRestoration, 1); 5962 5963 _resizeDelay.pause(); 5964 5965 _refreshID++; 5966 _refreshingAll = 2; 5967 5968 _updateAll(2); 5969 5970 _triggers.forEach(function (t) { 5971 return _isFunction(t.vars.onRefresh) && t.vars.onRefresh(t); 5972 }); 5973 5974 _refreshingAll = ScrollTrigger.isRefreshing = false; 5975 5976 _dispatch("refresh"); 5977}, 5978 _lastScroll = 0, 5979 _direction = 1, 5980 _primary, 5981 _updateAll = function _updateAll(force) { 5982 if (force === 2 || !_refreshingAll && !_isReverted) { 5983 // _isReverted could be true if, for example, a matchMedia() is in the process of executing. We don't want to update during the time everything is reverted. 5984 ScrollTrigger.isUpdating = true; 5985 _primary && _primary.update(0); // ScrollSmoother uses refreshPriority -9999 to become the primary that gets updated before all others because it affects the scroll position. 5986 5987 var l = _triggers.length, 5988 time = _getTime(), 5989 recordVelocity = time - _time1 >= 50, 5990 scroll = l && _triggers[0].scroll(); 5991 5992 _direction = _lastScroll > scroll ? -1 : 1; 5993 _refreshingAll || (_lastScroll = scroll); 5994 5995 if (recordVelocity) { 5996 if (_lastScrollTime && !_pointerIsDown && time - _lastScrollTime > 200) { 5997 _lastScrollTime = 0; 5998 5999 _dispatch("scrollEnd"); 6000 } 6001 6002 _time2 = _time1; 6003 _time1 = time; 6004 } 6005 6006 if (_direction < 0) { 6007 _i = l; 6008 6009 while (_i-- > 0) { 6010 _triggers[_i] && _triggers[_i].update(0, recordVelocity); 6011 } 6012 6013 _direction = 1; 6014 } else { 6015 for (_i = 0; _i < l; _i++) { 6016 _triggers[_i] && _triggers[_i].update(0, recordVelocity); 6017 } 6018 } 6019 6020 ScrollTrigger.isUpdating = false; 6021 } 6022 6023 _rafID = 0; 6024}, 6025 _propNamesToCopy = [_left, _top, _bottom, _right, _margin + _Bottom, _margin + _Right, _margin + _Top, _margin + _Left, "display", "flexShrink", "float", "zIndex", "gridColumnStart", "gridColumnEnd", "gridRowStart", "gridRowEnd", "gridArea", "justifySelf", "alignSelf", "placeSelf", "order"], 6026 _stateProps = _propNamesToCopy.concat([_width, _height, "boxSizing", "max" + _Width, "max" + _Height, "position", _margin, _padding, _padding + _Top, _padding + _Right, _padding + _Bottom, _padding + _Left]), 6027 _swapPinOut = function _swapPinOut(pin, spacer, state) { 6028 _setState(state); 6029 6030 var cache = pin._gsap; 6031 6032 if (cache.spacerIsNative) { 6033 _setState(cache.spacerState); 6034 } else if (pin._gsap.swappedIn) { 6035 var parent = spacer.parentNode; 6036 6037 if (parent) { 6038 parent.insertBefore(pin, spacer); 6039 parent.removeChild(spacer); 6040 } 6041 } 6042 6043 pin._gsap.swappedIn = false;
vendor: 9,748 bytes, lines 6044-6276
6044}, 6045 _swapPinIn = function _swapPinIn(pin, spacer, cs, spacerState) { 6046 if (!pin._gsap.swappedIn) { 6047 var i = _propNamesToCopy.length, 6048 spacerStyle = spacer.style, 6049 pinStyle = pin.style, 6050 p; 6051 6052 while (i--) { 6053 p = _propNamesToCopy[i]; 6054 spacerStyle[p] = cs[p]; 6055 } 6056 6057 spacerStyle.position = cs.position === "absolute" ? "absolute" : "relative"; 6058 cs.display === "inline" && (spacerStyle.display = "inline-block"); 6059 pinStyle[_bottom] = pinStyle[_right] = "auto"; 6060 spacerStyle.flexBasis = cs.flexBasis || "auto"; 6061 spacerStyle.overflow = "visible"; 6062 spacerStyle.boxSizing = "border-box"; 6063 spacerStyle[_width] = _getSize(pin, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal) + _px; 6064 spacerStyle[_height] = _getSize(pin, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical) + _px; 6065 spacerStyle[_padding] = pinStyle[_margin] = pinStyle[_top] = pinStyle[_left] = "0"; 6066 6067 _setState(spacerState); 6068 6069 pinStyle[_width] = pinStyle["max" + _Width] = cs[_width]; 6070 pinStyle[_height] = pinStyle["max" + _Height] = cs[_height]; 6071 pinStyle[_padding] = cs[_padding]; 6072 6073 if (pin.parentNode !== spacer) { 6074 pin.parentNode.insertBefore(spacer, pin); 6075 spacer.appendChild(pin); 6076 } 6077 6078 pin._gsap.swappedIn = true; 6079 } 6080}, 6081 _capsExp = /([A-Z])/g, 6082 _setState = function _setState(state) { 6083 if (state) { 6084 var style = state.t.style, 6085 l = state.length, 6086 i = 0, 6087 p, 6088 value; 6089 (state.t._gsap || gsap.core.getCache(state.t)).uncache = 1; // otherwise transforms may be off 6090 6091 for (; i < l; i += 2) { 6092 value = state[i + 1]; 6093 p = state[i]; 6094 6095 if (value) { 6096 style[p] = value; 6097 } else if (style[p]) { 6098 style.removeProperty(p.replace(_capsExp, "-$1").toLowerCase()); 6099 } 6100 } 6101 } 6102}, 6103 _getState = function _getState(element) { 6104 // returns an Array with alternating values like [property, value, property, value] and a "t" property pointing to the target (element). Makes it fast and cheap. 6105 var l = _stateProps.length, 6106 style = element.style, 6107 state = [], 6108 i = 0; 6109 6110 for (; i < l; i++) { 6111 state.push(_stateProps[i], style[_stateProps[i]]); 6112 } 6113 6114 state.t = element; 6115 return state; 6116}, 6117 _copyState = function _copyState(state, override, omitOffsets) { 6118 var result = [], 6119 l = state.length, 6120 i = omitOffsets ? 8 : 0, 6121 // skip top, left, right, bottom if omitOffsets is true 6122 p; 6123 6124 for (; i < l; i += 2) { 6125 p = state[i]; 6126 result.push(p, p in override ? override[p] : state[i + 1]); 6127 } 6128 6129 result.t = state.t; 6130 return result; 6131}, 6132 _winOffsets = { 6133 left: 0, 6134 top: 0 6135}, 6136 // // potential future feature (?) Allow users to calculate where a trigger hits (scroll position) like getScrollPosition("#id", "top bottom") 6137// _getScrollPosition = (trigger, position, {scroller, containerAnimation, horizontal}) => { 6138// scroller = _getTarget(scroller || _win); 6139// let direction = horizontal ? _horizontal : _vertical, 6140// isViewport = _isViewport(scroller); 6141// _getSizeFunc(scroller, isViewport, direction); 6142// return _parsePosition(position, _getTarget(trigger), _getSizeFunc(scroller, isViewport, direction)(), direction, _getScrollFunc(scroller, direction)(), 0, 0, 0, _getOffsetsFunc(scroller, isViewport)(), isViewport ? 0 : parseFloat(_getComputedStyle(scroller)["border" + direction.p2 + _Width]) || 0, 0, containerAnimation ? containerAnimation.duration() : _maxScroll(scroller), containerAnimation); 6143// }, 6144_parsePosition = function _parsePosition(value, trigger, scrollerSize, direction, scroll, marker, markerScroller, self, scrollerBounds, borderWidth, useFixedPosition, scrollerMax, containerAnimation, clampZeroProp) { 6145 _isFunction(value) && (value = value(self)); 6146 6147 if (_isString(value) && value.substr(0, 3) === "max") { 6148 value = scrollerMax + (value.charAt(4) === "=" ? _offsetToPx("0" + value.substr(3), scrollerSize) : 0); 6149 } 6150 6151 var time = containerAnimation ? containerAnimation.time() : 0, 6152 p1, 6153 p2, 6154 element; 6155 containerAnimation && containerAnimation.seek(0); 6156 isNaN(value) || (value = +value); // convert a string number like "45" to an actual number 6157 6158 if (!_isNumber(value)) { 6159 _isFunction(trigger) && (trigger = trigger(self)); 6160 var offsets = (value || "0").split(" "), 6161 bounds, 6162 localOffset, 6163 globalOffset, 6164 display; 6165 element = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(trigger, self) || _body; 6166 bounds = _getBounds(element) || {}; 6167 6168 if ((!bounds || !bounds.left && !bounds.top) && _getComputedStyle(element).display === "none") { 6169 // if display is "none", it won't report getBoundingClientRect() properly 6170 display = element.style.display; 6171 element.style.display = "block"; 6172 bounds = _getBounds(element); 6173 display ? element.style.display = display : element.style.removeProperty("display"); 6174 } 6175 6176 localOffset = _offsetToPx(offsets[0], bounds[direction.d]); 6177 globalOffset = _offsetToPx(offsets[1] || "0", scrollerSize); 6178 value = bounds[direction.p] - scrollerBounds[direction.p] - borderWidth + localOffset + scroll - globalOffset; 6179 markerScroller && _positionMarker(markerScroller, globalOffset, direction, scrollerSize - globalOffset < 20 || markerScroller._isStart && globalOffset > 20); 6180 scrollerSize -= scrollerSize - globalOffset; // adjust for the marker 6181 } else { 6182 containerAnimation && (value = gsap.utils.mapRange(containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, 0, scrollerMax, value)); 6183 markerScroller && _positionMarker(markerScroller, scrollerSize, direction, true); 6184 } 6185 6186 if (clampZeroProp) { 6187 self[clampZeroProp] = value || -0.001; 6188 value < 0 && (value = 0); 6189 } 6190 6191 if (marker) { 6192 var position = value + scrollerSize, 6193 isStart = marker._isStart; 6194 p1 = "scroll" + direction.d2; 6195 6196 _positionMarker(marker, position, direction, isStart && position > 20 || !isStart && (useFixedPosition ? Math.max(_body[p1], _docEl[p1]) : marker.parentNode[p1]) <= position + 1); 6197 6198 if (useFixedPosition) { 6199 scrollerBounds = _getBounds(markerScroller); 6200 useFixedPosition && (marker.style[direction.op.p] = scrollerBounds[direction.op.p] - direction.op.m - marker._offset + _px); 6201 } 6202 } 6203 6204 if (containerAnimation && element) { 6205 p1 = _getBounds(element); 6206 containerAnimation.seek(scrollerMax); 6207 p2 = _getBounds(element); 6208 containerAnimation._caScrollDist = p1[direction.p] - p2[direction.p]; 6209 value = value / containerAnimation._caScrollDist * scrollerMax; 6210 } 6211 6212 containerAnimation && containerAnimation.seek(time); 6213 return containerAnimation ? value : Math.round(value); 6214}, 6215 _prefixExp = /(webkit|moz|length|cssText|inset)/i, 6216 _reparent = function _reparent(element, parent, top, left) { 6217 if (element.parentNode !== parent) { 6218 var style = element.style, 6219 p, 6220 cs; 6221 6222 if (parent === _body) { 6223 element._stOrig = style.cssText; // record original inline styles so we can revert them later 6224 6225 cs = _getComputedStyle(element); 6226 6227 for (p in cs) { 6228 // must copy all relevant styles to ensure that nothing changes visually when we reparent to the <body>. Skip the vendor prefixed ones. 6229 if (!+p && !_prefixExp.test(p) && cs[p] && typeof style[p] === "string" && p !== "0") { 6230 style[p] = cs[p]; 6231 } 6232 } 6233 6234 style.top = top; 6235 style.left = left; 6236 } else { 6237 style.cssText = element._stOrig; 6238 } 6239 6240 gsap.core.getCache(element).uncache = 1; 6241 parent.appendChild(element); 6242 } 6243}, 6244 _interruptionTracker = function _interruptionTracker(getValueFunc, initialValue, onInterrupt) { 6245 var last1 = initialValue, 6246 last2 = last1; 6247 return function (value) { 6248 var current = Math.round(getValueFunc()); // round because in some [very uncommon] Windows environments, scroll can get reported with decimals even though it was set without. 6249 6250 if (current !== last1 && current !== last2 && Math.abs(current - last1) > 3 && Math.abs(current - last2) > 3) { 6251 // if the user scrolls, kill the tween. iOS Safari intermittently misreports the scroll position, it may be the most recently-set one or the one before that! When Safari is zoomed (CMD-+), it often misreports as 1 pixel off too! So if we set the scroll position to 125, for example, it'll actually report it as 124. 6252 value = current; 6253 onInterrupt && onInterrupt(); 6254 } 6255 6256 last2 = last1; 6257 last1 = Math.round(value); 6258 return last1; 6259 }; 6260}, 6261 _shiftMarker = function _shiftMarker(marker, direction, value) { 6262 var vars = {}; 6263 vars[direction.p] = "+=" + value; 6264 gsap.set(marker, vars); 6265}, 6266 // _mergeAnimations = animations => { 6267// let tl = gsap.timeline({smoothChildTiming: true}).startTime(Math.min(...animations.map(a => a.globalTime(0)))); 6268// animations.forEach(a => {let time = a.totalTime(); tl.add(a); a.totalTime(time); }); 6269// tl.smoothChildTiming = false; 6270// return tl; 6271// }, 6272// returns a function that can be used to tween the scroll position in the direction provided, and when doing so it'll add a .tween property to the FUNCTION itself, and remove it when the tween completes or gets killed. This gives us a way to have multiple ScrollTriggers use a central function for any given scroller and see if there's a scroll tween running (which would affect if/how things get updated) 6273_getTweenCreator = function _getTweenCreator(scroller, direction) { 6274 var getScroll = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, direction), 6275 prop = "_scroll" + direction.p2, 6276 // add a tweenable property to the scroller that's a getter/setter function, like _scrollTop or _scrollLeft. This way, if someone does gsap.killTweensOf(scroller) it'll
vendor: 4,505 bytes, lines 6276-6385
6276kill the scroll tween. 6277 getTween = function getTween(scrollTo, vars, initialValue, change1, change2) { 6278 var tween = getTween.tween, 6279 onComplete = vars.onComplete, 6280 modifiers = {}; 6281 initialValue = initialValue || getScroll(); 6282 6283 var checkForInterruption = _interruptionTracker(getScroll, initialValue, function () { 6284 tween.kill(); 6285 getTween.tween = 0; 6286 }); 6287 6288 change2 = change1 && change2 || 0; // if change1 is 0, we set that to the difference and ignore change2. Otherwise, there would be a compound effect. 6289 6290 change1 = change1 || scrollTo - initialValue; 6291 tween && tween.kill(); 6292 vars[prop] = scrollTo; 6293 vars.inherit = false; 6294 vars.modifiers = modifiers; 6295 6296 modifiers[prop] = function () { 6297 return checkForInterruption(initialValue + change1 * tween.ratio + change2 * tween.ratio * tween.ratio); 6298 }; 6299 6300 vars.onUpdate = function () { 6301 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; 6302 getTween.tween && _updateAll(); // if it was interrupted/killed, like in a context.revert(), don't force an updateAll() 6303 }; 6304 6305 vars.onComplete = function () { 6306 getTween.tween = 0; 6307 onComplete && onComplete.call(tween); 6308 }; 6309 6310 tween = getTween.tween = gsap.to(scroller, vars); 6311 return tween; 6312 }; 6313 6314 scroller[prop] = getScroll; 6315 6316 getScroll.wheelHandler = function () { 6317 return getTween.tween && getTween.tween.kill() && (getTween.tween = 0); 6318 }; 6319 6320 _addListener(scroller, "wheel", getScroll.wheelHandler); // Windows machines handle mousewheel scrolling in chunks (like "3 lines per scroll") meaning the typical strategy for cancelling the scroll isn't as sensitive. It's much more likely to match one of the previous 2 scroll event positions. So we kill any snapping as soon as there's a wheel event. 6321 6322 6323 ScrollTrigger.isTouch && _addListener(scroller, "touchmove", getScroll.wheelHandler); 6324 return getTween; 6325}; 6326 6327var ScrollTrigger = /*#__PURE__*/function () { 6328 function ScrollTrigger(vars, animation) { 6329 _coreInitted || ScrollTrigger.register(gsap) || console.warn("Please gsap.registerPlugin(ScrollTrigger)"); 6330 6331 _context(this); 6332 6333 this.init(vars, animation); 6334 } 6335 6336 var _proto = ScrollTrigger.prototype; 6337 6338 _proto.init = function init(vars, animation) { 6339 this.progress = this.start = 0; 6340 this.vars && this.kill(true, true); // in case it's being initted again 6341 6342 if (!_enabled) { 6343 this.update = this.refresh = this.kill = _passThrough; 6344 return; 6345 } 6346 6347 vars = _setDefaults(_isString(vars) || _isNumber(vars) || vars.nodeType ? { 6348 trigger: vars 6349 } : vars, _defaults); 6350 6351 var _vars = vars, 6352 onUpdate = _vars.onUpdate, 6353 toggleClass = _vars.toggleClass, 6354 id = _vars.id, 6355 onToggle = _vars.onToggle, 6356 onRefresh = _vars.onRefresh, 6357 scrub = _vars.scrub, 6358 trigger = _vars.trigger, 6359 pin = _vars.pin, 6360 pinSpacing = _vars.pinSpacing, 6361 invalidateOnRefresh = _vars.invalidateOnRefresh, 6362 anticipatePin = _vars.anticipatePin, 6363 onScrubComplete = _vars.onScrubComplete, 6364 onSnapComplete = _vars.onSnapComplete, 6365 once = _vars.once, 6366 snap = _vars.snap, 6367 pinReparent = _vars.pinReparent, 6368 pinSpacer = _vars.pinSpacer, 6369 containerAnimation = _vars.containerAnimation, 6370 fastScrollEnd = _vars.fastScrollEnd, 6371 preventOverlaps = _vars.preventOverlaps, 6372 direction = vars.horizontal || vars.containerAnimation && vars.horizontal !== false ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical, 6373 isToggle = !scrub && scrub !== 0, 6374 scroller = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.scroller || _win), 6375 scrollerCache = gsap.core.getCache(scroller), 6376 isViewport = _isViewport(scroller), 6377 useFixedPosition = ("pinType" in vars ? vars.pinType : (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "pinType") || isViewport && "fixed") === "fixed", 6378 callbacks = [vars.onEnter, vars.onLeave, vars.onEnterBack, vars.onLeaveBack], 6379 toggleActions = isToggle && vars.toggleActions.split(" "), 6380 markers = "markers" in vars ? vars.markers : _defaults.markers, 6381 borderWidth = isViewport ? 0 : parseFloat(_getComputedStyle(scroller)["border" + direction.p2 + _Width]) || 0, 6382 self = this, 6383 onRefreshInit = vars.onRefreshInit && function () { 6384 return vars.onRefreshInit(self); 6385 },
vendor: 7,186 bytes, lines 6386-6545
6386 getScrollerSize = _getSizeFunc(scroller, isViewport, direction), 6387 getScrollerOffsets = _getOffsetsFunc(scroller, isViewport), 6388 lastSnap = 0, 6389 lastRefresh = 0, 6390 prevProgress = 0, 6391 scrollFunc = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, direction), 6392 tweenTo, 6393 pinCache, 6394 snapFunc, 6395 scroll1, 6396 scroll2, 6397 start, 6398 end, 6399 markerStart, 6400 markerEnd, 6401 markerStartTrigger, 6402 markerEndTrigger, 6403 markerVars, 6404 executingOnRefresh, 6405 change, 6406 pinOriginalState, 6407 pinActiveState, 6408 pinState, 6409 spacer, 6410 offset, 6411 pinGetter, 6412 pinSetter, 6413 pinStart, 6414 pinChange, 6415 spacingStart, 6416 spacerState, 6417 markerStartSetter, 6418 pinMoves, 6419 markerEndSetter, 6420 cs, 6421 snap1, 6422 snap2, 6423 scrubTween, 6424 scrubSmooth, 6425 snapDurClamp, 6426 snapDelayedCall, 6427 prevScroll, 6428 prevAnimProgress, 6429 caMarkerSetter, 6430 customRevertReturn; // for the sake of efficiency, _startClamp/_endClamp serve like a truthy value indicating that clamping was enabled on the start/end, and ALSO store the actual pre-clamped numeric value. We tap into that in ScrollSmoother for speed effects. So for example, if start="clamp(top bottom)" results in a start of -100 naturally, it would get clamped to 0 but -100 would be stored in _startClamp. 6431 6432 6433 self._startClamp = self._endClamp = false; 6434 self._dir = direction; 6435 anticipatePin *= 45; 6436 self.scroller = scroller; 6437 self.scroll = containerAnimation ? containerAnimation.time.bind(containerAnimation) : scrollFunc; 6438 scroll1 = scrollFunc(); 6439 self.vars = vars; 6440 animation = animation || vars.animation; 6441 6442 if ("refreshPriority" in vars) { 6443 _sort = 1; 6444 vars.refreshPriority === -9999 && (_primary = self); // used by ScrollSmoother 6445 } 6446 6447 scrollerCache.tweenScroll = scrollerCache.tweenScroll || { 6448 top: _getTweenCreator(scroller, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical), 6449 left: _getTweenCreator(scroller, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal) 6450 }; 6451 self.tweenTo = tweenTo = scrollerCache.tweenScroll[direction.p]; 6452 6453 self.scrubDuration = function (value) { 6454 scrubSmooth = _isNumber(value) && value; 6455 6456 if (!scrubSmooth) { 6457 scrubTween && scrubTween.progress(1).kill(); 6458 scrubTween = 0; 6459 } else { 6460 scrubTween ? scrubTween.duration(value) : scrubTween = gsap.to(animation, { 6461 ease: "expo", 6462 totalProgress: "+=0", 6463 inherit: false, 6464 duration: scrubSmooth, 6465 paused: true, 6466 onComplete: function onComplete() { 6467 return onScrubComplete && onScrubComplete(self); 6468 } 6469 }); 6470 } 6471 }; 6472 6473 if (animation) { 6474 animation.vars.lazy = false; 6475 animation._initted && !self.isReverted || animation.vars.immediateRender !== false && vars.immediateRender !== false && animation.duration() && animation.render(0, true, true); // special case: if this ScrollTrigger gets re-initted, a from() tween with a stagger could get initted initially and then reverted on the re-init which means it'll need to get rendered again here to properly display things. Otherwise, See https://gsap.com/forums/topic/36777-scrollsmoother-splittext-nextjs/ and https://codepen.io/GreenSock/pen/eYPyPpd?editors=0010 6476 6477 self.animation = animation.pause(); 6478 animation.scrollTrigger = self; 6479 self.scrubDuration(scrub); 6480 snap1 = 0; 6481 id || (id = animation.vars.id); 6482 } 6483 6484 if (snap) { 6485 // TODO: potential idea: use legitimate CSS scroll snapping by pushing invisible elements into the DOM that serve as snap positions, and toggle the document.scrollingElement.style.scrollSnapType onToggle. See https://codepen.io/GreenSock/pen/JjLrgWM for a quick proof of concept. 6486 if (!_isObject(snap) || snap.push) { 6487 snap = { 6488 snapTo: snap 6489 }; 6490 } 6491 6492 "scrollBehavior" in _body.style && gsap.set(isViewport ? [_body, _docEl] : scroller, { 6493 scrollBehavior: "auto" 6494 }); // smooth scrolling doesn't work with snap. 6495 6496 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.forEach(function (o) { 6497 return _isFunction(o) && o.target === (isViewport ? _doc.scrollingElement || _docEl : scroller) && (o.smooth = false); 6498 }); // note: set smooth to false on both the vertical and horizontal scroll getters/setters 6499 6500 6501 snapFunc = _isFunction(snap.snapTo) ? snap.snapTo : snap.snapTo === "labels" ? _getClosestLabel(animation) : snap.snapTo === "labelsDirectional" ? _getLabelAtDirection(animation) : snap.directional !== false ? function (value, st) { 6502 return _snapDirectional(snap.snapTo)(value, _getTime() - lastRefresh < 500 ? 0 : st.direction); 6503 } : gsap.utils.snap(snap.snapTo); 6504 snapDurClamp = snap.duration || { 6505 min: 0.1, 6506 max: 2 6507 }; 6508 snapDurClamp = _isObject(snapDurClamp) ? _clamp(snapDurClamp.min, snapDurClamp.max) : _clamp(snapDurClamp, snapDurClamp); 6509 snapDelayedCall = gsap.delayedCall(snap.delay || scrubSmooth / 2 || 0.1, function () { 6510 var scroll = scrollFunc(), 6511 refreshedRecently = _getTime() - lastRefresh < 500, 6512 tween = tweenTo.tween; 6513 6514 if ((refreshedRecently || Math.abs(self.getVelocity()) < 10) && !tween && !_pointerIsDown && lastSnap !== scroll) { 6515 var progress = (scroll - start) / change, 6516 totalProgress = animation && !isToggle ? animation.totalProgress() : progress, 6517 velocity = refreshedRecently ? 0 : (totalProgress - snap2) / (_getTime() - _time2) * 1000 || 0, 6518 change1 = gsap.utils.clamp(-progress, 1 - progress, _abs(velocity / 2) * velocity / 0.185), 6519 naturalEnd = progress + (snap.inertia === false ? 0 : change1), 6520 endValue, 6521 endScroll, 6522 _snap = snap, 6523 onStart = _snap.onStart, 6524 _onInterrupt = _snap.onInterrupt, 6525 _onComplete = _snap.onComplete; 6526 endValue = snapFunc(naturalEnd, self); 6527 _isNumber(endValue) || (endValue = naturalEnd); // in case the function didn't return a number, fall back to using the naturalEnd 6528 6529 endScroll = Math.max(0, Math.round(start + endValue * change)); 6530 6531 if (scroll <= end && scroll >= start && endScroll !== scroll) { 6532 if (tween && !tween._initted && tween.data <= _abs(endScroll - scroll)) { 6533 // there's an overlapping snap! So we must figure out which one is closer and let that tween live. 6534 return; 6535 } 6536 6537 if (snap.inertia === false) { 6538 change1 = endValue - progress; 6539 } 6540 6541 tweenTo(endScroll, { 6542 duration: snapDurClamp(_abs(Math.max(_abs(naturalEnd - totalProgress), _abs(endValue - totalProgress)) * 0.185 / velocity / 0.05 || 0)), 6543 ease: snap.ease || "power3", 6544 data: _abs(endScroll - scroll), 6545 // record the distance so that if another snap tween occurs (conflict) we
vendor: 4,285 bytes, lines 6545-6616
6545can prioritize the closest snap. 6546 onInterrupt: function onInterrupt() { 6547 return snapDelayedCall.restart(true) && _onInterrupt && _callback(self, _onInterrupt); 6548 }, 6549 onComplete: function onComplete() { 6550 self.update(); 6551 lastSnap = scrollFunc(); 6552 6553 if (animation && !isToggle) { 6554 // the resolution of the scrollbar is limited, so we should correct the scrubbed animation's playhead at the end to match EXACTLY where it was supposed to snap 6555 scrubTween ? scrubTween.resetTo("totalProgress", endValue, animation._tTime / animation._tDur) : animation.progress(endValue); 6556 } 6557 6558 snap1 = snap2 = animation && !isToggle ? animation.totalProgress() : self.progress; 6559 onSnapComplete && onSnapComplete(self); 6560 _onComplete && _callback(self, _onComplete); 6561 } 6562 }, scroll, change1 * change, endScroll - scroll - change1 * change); 6563 onStart && _callback(self, onStart, tweenTo.tween); 6564 } 6565 } else if (self.isActive && lastSnap !== scroll) { 6566 snapDelayedCall.restart(true); 6567 } 6568 }).pause(); 6569 } 6570 6571 id && (_ids[id] = self); 6572 trigger = self.trigger = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(trigger || pin !== true && pin); // if a trigger has some kind of scroll-related effect applied that could contaminate the "y" or "x" position (like a ScrollSmoother effect), we needed a way to temporarily revert it, so we use the stRevert property of the gsCache. It can return another function that we'll call at the end so it can return to its normal state. 6573 6574 customRevertReturn = trigger && trigger._gsap && trigger._gsap.stRevert; 6575 customRevertReturn && (customRevertReturn = customRevertReturn(self)); 6576 pin = pin === true ? trigger : (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(pin); 6577 _isString(toggleClass) && (toggleClass = { 6578 targets: trigger, 6579 className: toggleClass 6580 }); 6581 6582 if (pin) { 6583 pinSpacing === false || pinSpacing === _margin || (pinSpacing = !pinSpacing && pin.parentNode && pin.parentNode.style && _getComputedStyle(pin.parentNode).display === "flex" ? false : _padding); // if the parent is display: flex, don't apply pinSpacing by default. We should check that pin.parentNode is an element (not shadow dom window) 6584 6585 self.pin = pin; 6586 pinCache = gsap.core.getCache(pin); 6587 6588 if (!pinCache.spacer) { 6589 // record the spacer and pinOriginalState on the cache in case someone tries pinning the same element with MULTIPLE ScrollTriggers - we don't want to have multiple spacers or record the "original" pin state after it has already been affected by another ScrollTrigger. 6590 if (pinSpacer) { 6591 pinSpacer = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(pinSpacer); 6592 pinSpacer && !pinSpacer.nodeType && (pinSpacer = pinSpacer.current || pinSpacer.nativeElement); // for React & Angular 6593 6594 pinCache.spacerIsNative = !!pinSpacer; 6595 pinSpacer && (pinCache.spacerState = _getState(pinSpacer)); 6596 } 6597 6598 pinCache.spacer = spacer = pinSpacer || _doc.createElement("div"); 6599 spacer.classList.add("pin-spacer"); 6600 id && spacer.classList.add("pin-spacer-" + id); 6601 pinCache.pinState = pinOriginalState = _getState(pin); 6602 } else { 6603 pinOriginalState = pinCache.pinState; 6604 } 6605 6606 vars.force3D !== false && gsap.set(pin, { 6607 force3D: true 6608 }); 6609 self.spacer = spacer = pinCache.spacer; 6610 cs = _getComputedStyle(pin); 6611 spacingStart = cs[pinSpacing + direction.os2]; 6612 pinGetter = gsap.getProperty(pin); 6613 pinSetter = gsap.quickSetter(pin, direction.a, _px); // pin.firstChild && !_maxScroll(pin, direction) && (pin.style.overflow = "hidden"); // protects from collapsing margins, but can have unintended consequences as demonstrated here: https://codepen.io/GreenSock/pen/1e42c7a73bfa409d2cf1e184e7a4248d so it was removed in favor of just telling people to set up their CSS to avoid the collapsing margins (overflow: hidden | auto is just one option. Another is border-top: 1px solid transparent). 6614 6615 _swapPinIn(pin, spacer, cs); 6616
vendor: 13,030 bytes, lines 6617-6879
6617 pinState = _getState(pin); 6618 } 6619 6620 if (markers) { 6621 markerVars = _isObject(markers) ? _setDefaults(markers, _markerDefaults) : _markerDefaults; 6622 markerStartTrigger = _createMarker("scroller-start", id, scroller, direction, markerVars, 0); 6623 markerEndTrigger = _createMarker("scroller-end", id, scroller, direction, markerVars, 0, markerStartTrigger); 6624 offset = markerStartTrigger["offset" + direction.op.d2]; 6625 6626 var content = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)((0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "content") || scroller); 6627 6628 markerStart = this.markerStart = _createMarker("start", id, content, direction, markerVars, offset, 0, containerAnimation); 6629 markerEnd = this.markerEnd = _createMarker("end", id, content, direction, markerVars, offset, 0, containerAnimation); 6630 containerAnimation && (caMarkerSetter = gsap.quickSetter([markerStart, markerEnd], direction.a, _px)); 6631 6632 if (!useFixedPosition && !(_Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.length && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getProxyProp)(scroller, "fixedMarkers") === true)) { 6633 _makePositionable(isViewport ? _body : scroller); 6634 6635 gsap.set([markerStartTrigger, markerEndTrigger], { 6636 force3D: true 6637 }); 6638 markerStartSetter = gsap.quickSetter(markerStartTrigger, direction.a, _px); 6639 markerEndSetter = gsap.quickSetter(markerEndTrigger, direction.a, _px); 6640 } 6641 } 6642 6643 if (containerAnimation) { 6644 var oldOnUpdate = containerAnimation.vars.onUpdate, 6645 oldParams = containerAnimation.vars.onUpdateParams; 6646 containerAnimation.eventCallback("onUpdate", function () { 6647 self.update(0, 0, 1); 6648 oldOnUpdate && oldOnUpdate.apply(containerAnimation, oldParams || []); 6649 }); 6650 } 6651 6652 self.previous = function () { 6653 return _triggers[_triggers.indexOf(self) - 1]; 6654 }; 6655 6656 self.next = function () { 6657 return _triggers[_triggers.indexOf(self) + 1]; 6658 }; 6659 6660 self.revert = function (revert, temp) { 6661 if (!temp) { 6662 return self.kill(true); 6663 } // for compatibility with gsap.context() and gsap.matchMedia() which call revert() 6664 6665 6666 var r = revert !== false || !self.enabled, 6667 prevRefreshing = _refreshing; 6668 6669 if (r !== self.isReverted) { 6670 if (r) { 6671 prevScroll = Math.max(scrollFunc(), self.scroll.rec || 0); // record the scroll so we can revert later (repositioning/pinning things can affect scroll position). In the static refresh() method, we first record all the scroll positions as a reference. 6672 6673 prevProgress = self.progress; 6674 prevAnimProgress = animation && animation.progress(); 6675 } 6676 6677 markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) { 6678 return m.style.display = r ? "none" : "block"; 6679 }); 6680 6681 if (r) { 6682 _refreshing = self; 6683 self.update(r); // make sure the pin is back in its original position so that all the measurements are correct. do this BEFORE swapping the pin out 6684 } 6685 6686 if (pin && (!pinReparent || !self.isActive)) { 6687 if (r) { 6688 _swapPinOut(pin, spacer, pinOriginalState); 6689 } else { 6690 _swapPinIn(pin, spacer, _getComputedStyle(pin), spacerState); 6691 } 6692 } 6693 6694 r || self.update(r); // when we're restoring, the update should run AFTER swapping the pin into its pin-spacer. 6695 6696 _refreshing = prevRefreshing; // restore. We set it to true during the update() so that things fire properly in there. 6697 6698 self.isReverted = r; 6699 } 6700 }; 6701 6702 self.refresh = function (soft, force, position, pinOffset) { 6703 // position is typically only defined if it's coming from setPositions() - it's a way to skip the normal parsing. pinOffset is also only from setPositions() and is mostly related to fancy stuff we need to do in ScrollSmoother with effects 6704 if ((_refreshing || !self.enabled) && !force) { 6705 return; 6706 } 6707 6708 if (pin && soft && _lastScrollTime) { 6709 _addListener(ScrollTrigger, "scrollEnd", _softRefresh); 6710 6711 return; 6712 } 6713 6714 !_refreshingAll && onRefreshInit && onRefreshInit(self); 6715 _refreshing = self; 6716 6717 if (tweenTo.tween && !position) { 6718 // we skip this if a position is passed in because typically that's from .setPositions() and it's best to allow in-progress snapping to continue. 6719 tweenTo.tween.kill(); 6720 tweenTo.tween = 0; 6721 } 6722 6723 scrubTween && scrubTween.pause(); 6724 6725 if (invalidateOnRefresh && animation) { 6726 animation.revert({ 6727 kill: false 6728 }).invalidate(); 6729 animation.getChildren ? animation.getChildren(true, true, false).forEach(function (t) { 6730 return t.vars.immediateRender && t.render(0, true, true); 6731 }) : animation.vars.immediateRender && animation.render(0, true, true); // any from() or fromTo() tweens should render immediately (well, unless they have immediateRender: false) 6732 } 6733 6734 self.isReverted || self.revert(true, true); 6735 self._subPinOffset = false; // we'll set this to true in the sub-pins if we find any 6736 6737 var size = getScrollerSize(), 6738 scrollerBounds = getScrollerOffsets(), 6739 max = containerAnimation ? containerAnimation.duration() : _maxScroll(scroller, direction), 6740 isFirstRefresh = change <= 0.01 || !change, 6741 offset = 0, 6742 otherPinOffset = pinOffset || 0, 6743 parsedEnd = _isObject(position) ? position.end : vars.end, 6744 parsedEndTrigger = vars.endTrigger || trigger, 6745 parsedStart = _isObject(position) ? position.start : vars.start || (vars.start === 0 || !trigger ? 0 : pin ? "0 0" : "0 100%"), 6746 pinnedContainer = self.pinnedContainer = vars.pinnedContainer && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.pinnedContainer, self), 6747 triggerIndex = trigger && Math.max(0, _triggers.indexOf(self)) || 0, 6748 i = triggerIndex, 6749 cs, 6750 bounds, 6751 scroll, 6752 isVertical, 6753 override, 6754 curTrigger, 6755 curPin, 6756 oppositeScroll, 6757 initted, 6758 revertedPins, 6759 forcedOverflow, 6760 markerStartOffset, 6761 markerEndOffset; 6762 6763 if (markers && _isObject(position)) { 6764 // if we alter the start/end positions with .setPositions(), it generally feeds in absolute NUMBERS which don't convey information about where to line up the markers, so to keep it intuitive, we record how far the trigger positions shift after applying the new numbers and then offset by that much in the opposite direction. We do the same to the associated trigger markers too of course. 6765 markerStartOffset = gsap.getProperty(markerStartTrigger, direction.p); 6766 markerEndOffset = gsap.getProperty(markerEndTrigger, direction.p); 6767 } 6768 6769 while (i-- > 0) { 6770 // user might try to pin the same element more than once, so we must find any prior triggers with the same pin, revert them, and determine how long they're pinning so that we can offset things appropriately. Make sure we revert from last to first so that things "rewind" properly. 6771 curTrigger = _triggers[i]; 6772 curTrigger.end || curTrigger.refresh(0, 1) || (_refreshing = self); // if it's a timeline-based trigger that hasn't been fully initialized yet because it's waiting for 1 tick, just force the refresh() here, otherwise if it contains a pin that's supposed to affect other ScrollTriggers further down the page, they won't be adjusted properly. 6773 6774 curPin = curTrigger.pin; 6775 6776 if (curPin && (curPin === trigger || curPin === pin || curPin === pinnedContainer) && !curTrigger.isReverted) { 6777 revertedPins || (revertedPins = []); 6778 revertedPins.unshift(curTrigger); // we'll revert from first to last to make sure things reach their end state properly 6779 6780 curTrigger.revert(true, true); 6781 } 6782 6783 if (curTrigger !== _triggers[i]) { 6784 // in case it got removed. 6785 triggerIndex--; 6786 i--; 6787 } 6788 } 6789 6790 _isFunction(parsedStart) && (parsedStart = parsedStart(self)); 6791 parsedStart = _parseClamp(parsedStart, "start", self); 6792 start = _parsePosition(parsedStart, trigger, size, direction, scrollFunc(), markerStart, markerStartTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._startClamp && "_startClamp") || (pin ? -0.001 : 0); 6793 _isFunction(parsedEnd) && (parsedEnd = parsedEnd(self)); 6794 6795 if (_isString(parsedEnd) && !parsedEnd.indexOf("+=")) { 6796 if (~parsedEnd.indexOf(" ")) { 6797 parsedEnd = (_isString(parsedStart) ? parsedStart.split(" ")[0] : "") + parsedEnd; 6798 } else { 6799 offset = _offsetToPx(parsedEnd.substr(2), size); 6800 parsedEnd = _isString(parsedStart) ? parsedStart : (containerAnimation ? gsap.utils.mapRange(0, containerAnimation.duration(), containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, start) : start) + offset; // _parsePosition won't factor in the offset if the start is a number, so do it here. 6801 6802 parsedEndTrigger = trigger; 6803 } 6804 } 6805 6806 parsedEnd = _parseClamp(parsedEnd, "end", self); 6807 end = Math.max(start, _parsePosition(parsedEnd || (parsedEndTrigger ? "100% 0" : max), parsedEndTrigger, size, direction, scrollFunc() + offset, markerEnd, markerEndTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._endClamp && "_endClamp")) || -0.001; 6808 offset = 0; 6809 i = triggerIndex; 6810 6811 while (i--) { 6812 curTrigger = _triggers[i] || {}; 6813 curPin = curTrigger.pin; 6814 6815 if (curPin && curTrigger.start - curTrigger._pinPush <= start && !containerAnimation && curTrigger.end > 0) { 6816 cs = curTrigger.end - (self._startClamp ? Math.max(0, curTrigger.start) : curTrigger.start); 6817 6818 if ((curPin === trigger && curTrigger.start - curTrigger._pinPush < start || curPin === pinnedContainer) && isNaN(parsedStart)) { 6819 // numeric start values shouldn't be offset at all - treat them as absolute 6820 offset += cs * (1 - curTrigger.progress); 6821 } 6822 6823 curPin === pin && (otherPinOffset += cs); 6824 } 6825 } 6826 6827 start += offset; 6828 end += offset; 6829 self._startClamp && (self._startClamp += offset); 6830 6831 if (self._endClamp && !_refreshingAll) { 6832 self._endClamp = end || -0.001; 6833 end = Math.min(end, _maxScroll(scroller, direction)); 6834 } 6835 6836 change = end - start || (start -= 0.01) && 0.001; 6837 6838 if (isFirstRefresh) { 6839 // on the very first refresh(), the prevProgress couldn't have been accurate yet because the start/end were never calculated, so we set it here. Before 3.11.5, it could lead to an inaccurate scroll position restoration with snapping. 6840 prevProgress = gsap.utils.clamp(0, 1, gsap.utils.normalize(start, end, prevScroll)); 6841 } 6842 6843 self._pinPush = otherPinOffset; 6844 6845 if (markerStart && offset) { 6846 // offset the markers if necessary 6847 cs = {}; 6848 cs[direction.a] = "+=" + offset; 6849 pinnedContainer && (cs[direction.p] = "-=" + scrollFunc()); 6850 gsap.set([markerStart, markerEnd], cs); 6851 } 6852 6853 if (pin && !(_clampingMax && self.end >= _maxScroll(scroller, direction))) { 6854 cs = _getComputedStyle(pin); 6855 isVertical = direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical; 6856 scroll = scrollFunc(); // recalculate because the triggers can affect the scroll 6857 6858 pinStart = parseFloat(pinGetter(direction.a)) + otherPinOffset; 6859 6860 if (!max && end > 1) { 6861 // makes sure the scroller has a scrollbar, otherwise if something has width: 100%, for example, it would be too big (exclude the scrollbar). See https://gsap.com/forums/topic/25182-scrolltrigger-width-of-page-increase-where-markers-are-set-to-false/ 6862 forcedOverflow = (isViewport ? _doc.scrollingElement || _docEl : scroller).style; 6863 forcedOverflow = { 6864 style: forcedOverflow, 6865 value: forcedOverflow["overflow" + direction.a.toUpperCase()] 6866 }; 6867 6868 if (isViewport && _getComputedStyle(_body)["overflow" + direction.a.toUpperCase()] !== "scroll") { 6869 // avoid an extra scrollbar if BOTH <html> and <body> have overflow set to "scroll" 6870 forcedOverflow.style["overflow" + direction.a.toUpperCase()] = "scroll"; 6871 } 6872 } 6873 6874 _swapPinIn(pin, spacer, cs); 6875 6876 pinState = _getState(pin); // transforms will interfere with the top/left/right/bottom placement, so remove them temporarily. getBoundingClientRect() factors in transforms. 6877 6878 bounds = _getBounds(pin, true); 6879 oppositeScroll = useFixedPosition && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(scroller, isVertical ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__.
vendor: 14,242 bytes, lines 6879-7138
6879_vertical)(); 6880 6881 if (pinSpacing) { 6882 spacerState = [pinSpacing + direction.os2, change + otherPinOffset + _px]; 6883 spacerState.t = spacer; 6884 i = pinSpacing === _padding ? _getSize(pin, direction) + change + otherPinOffset : 0; 6885 6886 if (i) { 6887 spacerState.push(direction.d, i + _px); // for box-sizing: border-box (must include padding). 6888 6889 spacer.style.flexBasis !== "auto" && (spacer.style.flexBasis = i + _px); 6890 } 6891 6892 _setState(spacerState); 6893 6894 if (pinnedContainer) { 6895 // in ScrollTrigger.refresh(), we need to re-evaluate the pinContainer's size because this pinSpacing may stretch it out, but we can't just add the exact distance because depending on layout, it may not push things down or it may only do so partially. 6896 _triggers.forEach(function (t) { 6897 if (t.pin === pinnedContainer && t.vars.pinSpacing !== false) { 6898 t._subPinOffset = true; 6899 } 6900 }); 6901 } 6902 6903 useFixedPosition && scrollFunc(prevScroll); 6904 } else { 6905 i = _getSize(pin, direction); 6906 i && spacer.style.flexBasis !== "auto" && (spacer.style.flexBasis = i + _px); 6907 } 6908 6909 if (useFixedPosition) { 6910 override = { 6911 top: bounds.top + (isVertical ? scroll - start : oppositeScroll) + _px, 6912 left: bounds.left + (isVertical ? oppositeScroll : scroll - start) + _px, 6913 boxSizing: "border-box", 6914 position: "fixed" 6915 }; 6916 override[_width] = override["max" + _Width] = Math.ceil(bounds.width) + _px; 6917 override[_height] = override["max" + _Height] = Math.ceil(bounds.height) + _px; 6918 override[_margin] = override[_margin + _Top] = override[_margin + _Right] = override[_margin + _Bottom] = override[_margin + _Left] = "0"; 6919 override[_padding] = cs[_padding]; 6920 override[_padding + _Top] = cs[_padding + _Top]; 6921 override[_padding + _Right] = cs[_padding + _Right]; 6922 override[_padding + _Bottom] = cs[_padding + _Bottom]; 6923 override[_padding + _Left] = cs[_padding + _Left]; 6924 pinActiveState = _copyState(pinOriginalState, override, pinReparent); 6925 _refreshingAll && scrollFunc(0); 6926 } 6927 6928 if (animation) { 6929 // the animation might be affecting the transform, so we must jump to the end, check the value, and compensate accordingly. Otherwise, when it becomes unpinned, the pinSetter() will get set to a value that doesn't include whatever the animation did. 6930 initted = animation._initted; // if not, we must invalidate() after this step, otherwise it could lock in starting values prematurely. 6931 6932 _suppressOverwrites(1); 6933 6934 animation.render(animation.duration(), true, true); 6935 pinChange = pinGetter(direction.a) - pinStart + change + otherPinOffset; 6936 pinMoves = Math.abs(change - pinChange) > 1; 6937 useFixedPosition && pinMoves && pinActiveState.splice(pinActiveState.length - 2, 2); // transform is the last property/value set in the state Array. Since the animation is controlling that, we should omit it. 6938 6939 animation.render(0, true, true); 6940 initted || animation.invalidate(true); 6941 animation.parent || animation.totalTime(animation.totalTime()); // if, for example, a toggleAction called play() and then refresh() happens and when we render(1) above, it would cause the animation to complete and get removed from its parent, so this makes sure it gets put back in. 6942 6943 _suppressOverwrites(0); 6944 } else { 6945 pinChange = change; 6946 } 6947 6948 forcedOverflow && (forcedOverflow.value ? forcedOverflow.style["overflow" + direction.a.toUpperCase()] = forcedOverflow.value : forcedOverflow.style.removeProperty("overflow-" + direction.a)); 6949 } else if (trigger && scrollFunc() && !containerAnimation) { 6950 // it may be INSIDE a pinned element, so walk up the tree and look for any elements with _pinOffset to compensate because anything with pinSpacing that's already scrolled would throw off the measurements in getBoundingClientRect() 6951 bounds = trigger.parentNode; 6952 6953 while (bounds && bounds !== _body) { 6954 if (bounds._pinOffset) { 6955 start -= bounds._pinOffset; 6956 end -= bounds._pinOffset; 6957 } 6958 6959 bounds = bounds.parentNode; 6960 } 6961 } 6962 6963 revertedPins && revertedPins.forEach(function (t) { 6964 return t.revert(false, true); 6965 }); 6966 self.start = start; 6967 self.end = end; 6968 scroll1 = scroll2 = _refreshingAll ? prevScroll : scrollFunc(); // reset velocity 6969 6970 if (!containerAnimation && !_refreshingAll) { 6971 scroll1 < prevScroll && scrollFunc(prevScroll); 6972 self.scroll.rec = 0; 6973 } 6974 6975 self.revert(false, true); 6976 lastRefresh = _getTime(); 6977 6978 if (snapDelayedCall) { 6979 lastSnap = -1; // just so snapping gets re-enabled, clear out any recorded last value 6980 // self.isActive && scrollFunc(start + change * prevProgress); // previously this line was here to ensure that when snapping kicks in, it's from the previous progress but in some cases that's not desirable, like an all-page ScrollTrigger when new content gets added to the page, that'd totally change the progress. 6981 6982 snapDelayedCall.restart(true); 6983 } 6984 6985 _refreshing = 0; 6986 animation && isToggle && (animation._initted || prevAnimProgress) && animation.progress() !== prevAnimProgress && animation.progress(prevAnimProgress || 0, true).render(animation.time(), true, true); // must force a re-render because if saveStyles() was used on the target(s), the styles could have been wiped out during the refresh(). 6987 6988 if (isFirstRefresh || prevProgress !== self.progress || containerAnimation || invalidateOnRefresh || animation && !animation._initted) { 6989 // ensures that the direction is set properly (when refreshing, progress is set back to 0 initially, then back again to wherever it needs to be) and that callbacks are triggered. 6990 animation && !isToggle && (animation._initted || prevProgress || animation.vars.immediateRender !== false) && animation.totalProgress(containerAnimation && start < -0.001 && !prevProgress ? gsap.utils.normalize(start, end, 0) : prevProgress, true); // to avoid issues where animation callbacks like onStart aren't triggered. 6991 6992 self.progress = isFirstRefresh || (scroll1 - start) / change === prevProgress ? 0 : prevProgress; 6993 } 6994 6995 pin && pinSpacing && (spacer._pinOffset = Math.round(self.progress * pinChange)); 6996 scrubTween && scrubTween.invalidate(); 6997 6998 if (!isNaN(markerStartOffset)) { 6999 // numbers were passed in for the position which are absolute, so instead of just putting the markers at the very bottom of the viewport, we figure out how far they shifted down (it's safe to assume they were originally positioned in closer relation to the trigger element with values like "top", "center", a percentage or whatever, so we offset that much in the opposite direction to basically revert them to the relative position thy were at previously. 7000 markerStartOffset -= gsap.getProperty(markerStartTrigger, direction.p); 7001 markerEndOffset -= gsap.getProperty(markerEndTrigger, direction.p); 7002 7003 _shiftMarker(markerStartTrigger, direction, markerStartOffset); 7004 7005 _shiftMarker(markerStart, direction, markerStartOffset - (pinOffset || 0)); 7006 7007 _shiftMarker(markerEndTrigger, direction, markerEndOffset); 7008 7009 _shiftMarker(markerEnd, direction, markerEndOffset - (pinOffset || 0)); 7010 } 7011 7012 isFirstRefresh && !_refreshingAll && self.update(); // edge case - when you reload a page when it's already scrolled down, some browsers fire a "scroll" event before DOMContentLoaded, triggering an updateAll(). If we don't update the self.progress as part of refresh(), then when it happens next, it may record prevProgress as 0 when it really shouldn't, potentially causing a callback in an animation to fire again. 7013 7014 if (onRefresh && !_refreshingAll && !executingOnRefresh) { 7015 // when refreshing all, we do extra work to correct pinnedContainer sizes and ensure things don't exceed the maxScroll, so we should do all the refreshes at the end after all that work so that the start/end values are corrected. 7016 executingOnRefresh = true; 7017 onRefresh(self); 7018 executingOnRefresh = false; 7019 } 7020 }; 7021 7022 self.getVelocity = function () { 7023 return (scrollFunc() - scroll2) / (_getTime() - _time2) * 1000 || 0; 7024 }; 7025 7026 self.endAnimation = function () { 7027 _endAnimation(self.callbackAnimation); 7028 7029 if (animation) { 7030 scrubTween ? scrubTween.progress(1) : !animation.paused() ? _endAnimation(animation, animation.reversed()) : isToggle || _endAnimation(animation, self.direction < 0, 1); 7031 } 7032 }; 7033 7034 self.labelToScroll = function (label) { 7035 return animation && animation.labels && (start || self.refresh() || start) + animation.labels[label] / animation.duration() * change || 0; 7036 }; 7037 7038 self.getTrailing = function (name) { 7039 var i = _triggers.indexOf(self), 7040 a = self.direction > 0 ? _triggers.slice(0, i).reverse() : _triggers.slice(i + 1); 7041 7042 return (_isString(name) ? a.filter(function (t) { 7043 return t.vars.preventOverlaps === name; 7044 }) : a).filter(function (t) { 7045 return self.direction > 0 ? t.end <= start : t.start >= end; 7046 }); 7047 }; 7048 7049 self.update = function (reset, recordVelocity, forceFake) { 7050 if (containerAnimation && !forceFake && !reset) { 7051 return; 7052 } 7053 7054 var scroll = _refreshingAll === true ? prevScroll : self.scroll(), 7055 p = reset ? 0 : (scroll - start) / change, 7056 clipped = p < 0 ? 0 : p > 1 ? 1 : p || 0, 7057 prevProgress = self.progress, 7058 isActive, 7059 wasActive, 7060 toggleState, 7061 action, 7062 stateChanged, 7063 toggled, 7064 isAtMax, 7065 isTakingAction; 7066 7067 if (recordVelocity) { 7068 scroll2 = scroll1; 7069 scroll1 = containerAnimation ? scrollFunc() : scroll; 7070 7071 if (snap) { 7072 snap2 = snap1; 7073 snap1 = animation && !isToggle ? animation.totalProgress() : clipped; 7074 } 7075 } // anticipate the pinning a few ticks ahead of time based on velocity to avoid a visual glitch due to the fact that most browsers do scrolling on a separate thread (not synced with requestAnimationFrame). 7076 7077 7078 if (anticipatePin && pin && !_refreshing && !_startup && _lastScrollTime) { 7079 if (!clipped && start < scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) { 7080 clipped = 0.0001; 7081 } else if (clipped === 1 && end > scroll + (scroll - scroll2) / (_getTime() - _time2) * anticipatePin) { 7082 clipped = 0.9999; 7083 } 7084 } 7085 7086 if (clipped !== prevProgress && self.enabled) { 7087 isActive = self.isActive = !!clipped && clipped < 1; 7088 wasActive = !!prevProgress && prevProgress < 1; 7089 toggled = isActive !== wasActive; 7090 stateChanged = toggled || !!clipped !== !!prevProgress; // could go from start all the way to end, thus it didn't toggle but it did change state in a sense (may need to fire a callback) 7091 7092 self.direction = clipped > prevProgress ? 1 : -1; 7093 self.progress = clipped; 7094 7095 if (stateChanged && !_refreshing) { 7096 toggleState = clipped && !prevProgress ? 0 : clipped === 1 ? 1 : prevProgress === 1 ? 2 : 3; // 0 = enter, 1 = leave, 2 = enterBack, 3 = leaveBack (we prioritize the FIRST encounter, thus if you scroll really fast past the onEnter and onLeave in one tick, it'd prioritize onEnter. 7097 7098 if (isToggle) { 7099 action = !toggled && toggleActions[toggleState + 1] !== "none" && toggleActions[toggleState + 1] || toggleActions[toggleState]; // if it didn't toggle, that means it shot right past and since we prioritize the "enter" action, we should switch to the "leave" in this case (but only if one is defined) 7100 7101 isTakingAction = animation && (action === "complete" || action === "reset" || action in animation); 7102 } 7103 } 7104 7105 preventOverlaps && (toggled || isTakingAction) && (isTakingAction || scrub || !animation) && (_isFunction(preventOverlaps) ? preventOverlaps(self) : self.getTrailing(preventOverlaps).forEach(function (t) { 7106 return t.endAnimation(); 7107 })); 7108 7109 if (!isToggle) { 7110 if (scrubTween && !_refreshing && !_startup) { 7111 scrubTween._dp._time - scrubTween._start !== scrubTween._time && scrubTween.render(scrubTween._dp._time - scrubTween._start); // if there's a scrub on both the container animation and this one (or a ScrollSmoother), the update order would cause this one not to have rendered yet, so it wouldn't make any progress before we .restart() it heading toward the new progress so it'd appear stuck thus we force a render here. 7112 7113 if (scrubTween.resetTo) { 7114 scrubTween.resetTo("totalProgress", clipped, animation._tTime / animation._tDur); 7115 } else { 7116 // legacy support (courtesy), before 3.10.0 7117 scrubTween.vars.totalProgress = clipped; 7118 scrubTween.invalidate().restart(); 7119 } 7120 } else if (animation) { 7121 animation.totalProgress(clipped, !!(_refreshing && (lastRefresh || reset))); 7122 } 7123 } 7124 7125 if (pin) { 7126 reset && pinSpacing && (spacer.style[pinSpacing + direction.os2] = spacingStart); 7127 7128 if (!useFixedPosition) { 7129 pinSetter(_round(pinStart + pinChange * clipped)); 7130 } else if (stateChanged) { 7131 isAtMax = !reset && clipped > prevProgress && end + 1 > scroll && scroll + 1 >= _maxScroll(scroller, direction); // if it's at the VERY end of the page, don't switch away from position: fixed because it's pointless and it could cause a brief flash when the user scrolls back up (when it gets pinned again) 7132 7133 if (pinReparent) { 7134 if (!reset && (isActive || isAtMax)) { 7135 var bounds = _getBounds(pin, true), 7136 _offset = scroll - start; 7137 7138 _reparent(pin, _body, bounds.top + (direction === _
7138Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical ? _offset : 0) + _px, bounds.left + (direction === _Observer_js__WEBPACK_IMPORTED_MODULE_0__.
vendor: 8,830 bytes, lines 7138-7346
7138_vertical ? 0 : _offset) + _px); 7139 } else { 7140 _reparent(pin, spacer); 7141 } 7142 } 7143 7144 _setState(isActive || isAtMax ? pinActiveState : pinState); 7145 7146 pinMoves && clipped < 1 && isActive || pinSetter(pinStart + (clipped === 1 && !isAtMax ? pinChange : 0)); 7147 } 7148 } 7149 7150 snap && !tweenTo.tween && !_refreshing && !_startup && snapDelayedCall.restart(true); 7151 toggleClass && (toggled || once && clipped && (clipped < 1 || !_limitCallbacks)) && _toArray(toggleClass.targets).forEach(function (el) { 7152 return el.classList[isActive || once ? "add" : "remove"](toggleClass.className); 7153 }); // classes could affect positioning, so do it even if reset or refreshing is true. 7154 7155 onUpdate && !isToggle && !reset && onUpdate(self); 7156 7157 if (stateChanged && !_refreshing) { 7158 if (isToggle) { 7159 if (isTakingAction) { 7160 if (action === "complete") { 7161 animation.pause().totalProgress(1); 7162 } else if (action === "reset") { 7163 animation.restart(true).pause(); 7164 } else if (action === "restart") { 7165 animation.restart(true); 7166 } else { 7167 animation[action](); 7168 } 7169 } 7170 7171 onUpdate && onUpdate(self); 7172 } 7173 7174 if (toggled || !_limitCallbacks) { 7175 // on startup, the page could be scrolled and we don't want to fire callbacks that didn't toggle. For example onEnter shouldn't fire if the ScrollTrigger isn't actually entered. 7176 onToggle && toggled && _callback(self, onToggle); 7177 callbacks[toggleState] && _callback(self, callbacks[toggleState]); 7178 once && (clipped === 1 ? self.kill(false, 1) : callbacks[toggleState] = 0); // a callback shouldn't be called again if once is true. 7179 7180 if (!toggled) { 7181 // it's possible to go completely past, like from before the start to after the end (or vice-versa) in which case BOTH callbacks should be fired in that order 7182 toggleState = clipped === 1 ? 1 : 3; 7183 callbacks[toggleState] && _callback(self, callbacks[toggleState]); 7184 } 7185 } 7186 7187 if (fastScrollEnd && !isActive && Math.abs(self.getVelocity()) > (_isNumber(fastScrollEnd) ? fastScrollEnd : 2500)) { 7188 _endAnimation(self.callbackAnimation); 7189 7190 scrubTween ? scrubTween.progress(1) : _endAnimation(animation, action === "reverse" ? 1 : !clipped, 1); 7191 } 7192 } else if (isToggle && onUpdate && !_refreshing) { 7193 onUpdate(self); 7194 } 7195 } // update absolutely-positioned markers (only if the scroller isn't the viewport) 7196 7197 7198 if (markerEndSetter) { 7199 var n = containerAnimation ? scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0) : scroll; 7200 markerStartSetter(n + (markerStartTrigger._isFlipped ? 1 : 0)); 7201 markerEndSetter(n); 7202 } 7203 7204 caMarkerSetter && caMarkerSetter(-scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0)); 7205 }; 7206 7207 self.enable = function (reset, refresh) { 7208 if (!self.enabled) { 7209 self.enabled = true; 7210 7211 _addListener(scroller, "resize", _onResize); 7212 7213 isViewport || _addListener(scroller, "scroll", _onScroll); 7214 onRefreshInit && _addListener(ScrollTrigger, "refreshInit", onRefreshInit); 7215 7216 if (reset !== false) { 7217 self.progress = prevProgress = 0; 7218 scroll1 = scroll2 = lastSnap = scrollFunc(); 7219 } 7220 7221 refresh !== false && self.refresh(); 7222 } 7223 }; 7224 7225 self.getTween = function (snap) { 7226 return snap && tweenTo ? tweenTo.tween : scrubTween; 7227 }; 7228 7229 self.setPositions = function (newStart, newEnd, keepClamp, pinOffset) { 7230 // doesn't persist after refresh()! Intended to be a way to override values that were set during refresh(), like you could set it in onRefresh() 7231 if (containerAnimation) { 7232 // convert ratios into scroll positions. Remember, start/end values on ScrollTriggers that have a containerAnimation refer to the time (in seconds), NOT scroll positions. 7233 var st = containerAnimation.scrollTrigger, 7234 duration = containerAnimation.duration(), 7235 _change = st.end - st.start; 7236 7237 newStart = st.start + _change * newStart / duration; 7238 newEnd = st.start + _change * newEnd / duration; 7239 } 7240 7241 self.refresh(false, false, { 7242 start: _keepClamp(newStart, keepClamp && !!self._startClamp), 7243 end: _keepClamp(newEnd, keepClamp && !!self._endClamp) 7244 }, pinOffset); 7245 self.update(); 7246 }; 7247 7248 self.adjustPinSpacing = function (amount) { 7249 if (spacerState && amount) { 7250 var i = spacerState.indexOf(direction.d) + 1; 7251 spacerState[i] = parseFloat(spacerState[i]) + amount + _px; 7252 spacerState[1] = parseFloat(spacerState[1]) + amount + _px; 7253 7254 _setState(spacerState); 7255 } 7256 }; 7257 7258 self.disable = function (reset, allowAnimation) { 7259 reset !== false && self.revert(true, true); 7260 7261 if (self.enabled) { 7262 self.enabled = self.isActive = false; 7263 allowAnimation || scrubTween && scrubTween.pause(); 7264 prevScroll = 0; 7265 pinCache && (pinCache.uncache = 1); 7266 onRefreshInit && _removeListener(ScrollTrigger, "refreshInit", onRefreshInit); 7267 7268 if (snapDelayedCall) { 7269 snapDelayedCall.pause(); 7270 tweenTo.tween && tweenTo.tween.kill() && (tweenTo.tween = 0); 7271 } 7272 7273 if (!isViewport) { 7274 var i = _triggers.length; 7275 7276 while (i--) { 7277 if (_triggers[i].scroller === scroller && _triggers[i] !== self) { 7278 return; //don't remove the listeners if there are still other triggers referencing it. 7279 } 7280 } 7281 7282 _removeListener(scroller, "resize", _onResize); 7283 7284 isViewport || _removeListener(scroller, "scroll", _onScroll); 7285 } 7286 } 7287 }; 7288 7289 self.kill = function (revert, allowAnimation) { 7290 self.disable(revert, allowAnimation); 7291 scrubTween && !allowAnimation && scrubTween.kill(); 7292 id && delete _ids[id]; 7293 7294 var i = _triggers.indexOf(self); 7295 7296 i >= 0 && _triggers.splice(i, 1); 7297 i === _i && _direction > 0 && _i--; // if we're in the middle of a refresh() or update(), splicing would cause skips in the index, so adjust... 7298 // if no other ScrollTrigger instances of the same scroller are found, wipe out any recorded scroll position. Otherwise, in a single page application, for example, it could maintain scroll position when it really shouldn't. 7299 7300 i = 0; 7301 7302 _triggers.forEach(function (t) { 7303 return t.scroller === self.scroller && (i = 1); 7304 }); 7305 7306 i || _refreshingAll || (self.scroll.rec = 0); 7307 7308 if (animation) { 7309 animation.scrollTrigger = null; 7310 revert && animation.revert({ 7311 kill: false 7312 }); 7313 allowAnimation || animation.kill(); 7314 } 7315 7316 markerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(function (m) { 7317 return m.parentNode && m.parentNode.removeChild(m); 7318 }); 7319 _primary === self && (_primary = 0); 7320 7321 if (pin) { 7322 pinCache && (pinCache.uncache = 1); 7323 i = 0; 7324 7325 _triggers.forEach(function (t) { 7326 return t.pin === pin && i++; 7327 }); 7328 7329 i || (pinCache.spacer = 0); // if there aren't any more ScrollTriggers with the same pin, remove the spacer, otherwise it could be contaminated with old/stale values if the user re-creates a ScrollTrigger for the same element. 7330 } 7331 7332 vars.onKill && vars.onKill(self); 7333 }; 7334 7335 _triggers.push(self); 7336 7337 self.enable(false, false); 7338 customRevertReturn && customRevertReturn(self); 7339 7340 if (animation && animation.add && !change) { 7341 // if the animation is a timeline, it may not have been populated yet, so it wouldn't render at the proper place on the first refresh(), thus we should schedule one for the next tick. If "change" is defined, we know it must be re-enabling, thus we can refresh() right away. 7342 var updateFunc = self.update; // some browsers may fire a scroll event BEFORE a tick elapses and/or the DOMContentLoaded fires. So there's a chance update() will be called BEFORE a refresh() has happened on a Timeline-attached ScrollTrigger which means the start/end won't be calculated yet. We don't want to add conditional logic inside the update() method (like check to see if end is defined and if not, force a refresh()) because that's a function that gets hit a LOT (performance). So we swap out the real update() method for this one that'll re-attach it the first time it gets called and of course forces a refresh(). 7343 7344 self.update = function () { 7345 self.update = updateFunc; 7346 _
vendor: 14,990 bytes, lines 7346-7711
7346Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; // otherwise a cached scroll position may get used in the refresh() in a very rare scenario, like if ScrollTriggers are created inside a DOMContentLoaded event and the queued requestAnimationFrame() fires beforehand. See https://gsap.com/community/forums/topic/41267-scrolltrigger-breaks-on-refresh-when-using-domcontentloaded/ 7347 7348 start || end || self.refresh(); 7349 }; 7350 7351 gsap.delayedCall(0.01, self.update); 7352 change = 0.01; 7353 start = end = 0; 7354 } else { 7355 self.refresh(); 7356 } 7357 7358 pin && _queueRefreshAll(); // pinning could affect the positions of other things, so make sure we queue a full refresh() 7359 }; 7360 7361 ScrollTrigger.register = function register(core) { 7362 if (!_coreInitted) { 7363 gsap = core || _getGSAP(); 7364 _windowExists() && window.document && ScrollTrigger.enable(); 7365 _coreInitted = _enabled; 7366 } 7367 7368 return _coreInitted; 7369 }; 7370 7371 ScrollTrigger.defaults = function defaults(config) { 7372 if (config) { 7373 for (var p in config) { 7374 _defaults[p] = config[p]; 7375 } 7376 } 7377 7378 return _defaults; 7379 }; 7380 7381 ScrollTrigger.disable = function disable(reset, kill) { 7382 _enabled = 0; 7383 7384 _triggers.forEach(function (trigger) { 7385 return trigger[kill ? "kill" : "disable"](reset); 7386 }); 7387 7388 _removeListener(_win, "wheel", _onScroll); 7389 7390 _removeListener(_doc, "scroll", _onScroll); 7391 7392 clearInterval(_syncInterval); 7393 7394 _removeListener(_doc, "touchcancel", _passThrough); 7395 7396 _removeListener(_body, "touchstart", _passThrough); 7397 7398 _multiListener(_removeListener, _doc, "pointerdown,touchstart,mousedown", _pointerDownHandler); 7399 7400 _multiListener(_removeListener, _doc, "pointerup,touchend,mouseup", _pointerUpHandler); 7401 7402 _resizeDelay.kill(); 7403 7404 _iterateAutoRefresh(_removeListener); 7405 7406 for (var i = 0; i < _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.length; i += 3) { 7407 _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 1]); 7408 7409 _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 2]); 7410 } 7411 }; 7412 7413 ScrollTrigger.enable = function enable() { 7414 _win = window; 7415 _doc = document; 7416 _docEl = _doc.documentElement; 7417 _body = _doc.body; 7418 7419 if (gsap) { 7420 _toArray = gsap.utils.toArray; 7421 _clamp = gsap.utils.clamp; 7422 _context = gsap.core.context || _passThrough; 7423 _suppressOverwrites = gsap.core.suppressOverwrites || _passThrough; 7424 _scrollRestoration = _win.history.scrollRestoration || "auto"; 7425 _lastScroll = _win.pageYOffset || 0; 7426 gsap.core.globals("ScrollTrigger", ScrollTrigger); // must register the global manually because in Internet Explorer, functions (classes) don't have a "name" property. 7427 7428 if (_body) { 7429 _enabled = 1; 7430 _div100vh = document.createElement("div"); // to solve mobile browser address bar show/hide resizing, we shouldn't rely on window.innerHeight. Instead, use a <div> with its height set to 100vh and measure that since that's what the scrolling is based on anyway and it's not affected by address bar showing/hiding. 7431 7432 _div100vh.style.height = "100vh"; 7433 _div100vh.style.position = "absolute"; 7434 7435 _refresh100vh(); 7436 7437 _rafBugFix(); 7438 7439 _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.register(gsap); // isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer. 7440 7441 ScrollTrigger.isTouch = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch; 7442 _fixIOSBug = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent); // since 2017, iOS has had a bug that causes event.clientX/Y to be inaccurate when a scroll occurs, thus we must alternate ignoring every other touchmove event to work around it. See https://bugs.webkit.org/show_bug.cgi?id=181954 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503 7443 7444 _ignoreMobileResize = _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch === 1; 7445 7446 _addListener(_win, "wheel", _onScroll); // mostly for 3rd party smooth scrolling libraries. 7447 7448 7449 _root = [_win, _doc, _docEl, _body]; 7450 7451 if (gsap.matchMedia) { 7452 ScrollTrigger.matchMedia = function (vars) { 7453 var mm = gsap.matchMedia(), 7454 p; 7455 7456 for (p in vars) { 7457 mm.add(p, vars[p]); 7458 } 7459 7460 return mm; 7461 }; 7462 7463 gsap.addEventListener("matchMediaInit", function () { 7464 _recordScrollPositions(); 7465 7466 _revertAll(); 7467 }); 7468 gsap.addEventListener("matchMediaRevert", function () { 7469 return _revertRecorded(); 7470 }); 7471 gsap.addEventListener("matchMedia", function () { 7472 _refreshAll(0, 1); 7473 7474 _dispatch("matchMedia"); 7475 }); 7476 gsap.matchMedia().add("(orientation: portrait)", function () { 7477 // when orientation changes, we should take new base measurements for the ignoreMobileResize feature. 7478 _setBaseDimensions(); 7479 7480 return _setBaseDimensions; 7481 }); 7482 } else { 7483 console.warn("Requires GSAP 3.11.0 or later"); 7484 } 7485 7486 _setBaseDimensions(); 7487 7488 _addListener(_doc, "scroll", _onScroll); // some browsers (like Chrome), the window stops dispatching scroll events on the window if you scroll really fast, but it's consistent on the document! 7489 7490 7491 var bodyHasStyle = _body.hasAttribute("style"), 7492 bodyStyle = _body.style, 7493 border = bodyStyle.borderTopStyle, 7494 AnimationProto = gsap.core.Animation.prototype, 7495 bounds, 7496 i; 7497 7498 AnimationProto.revert || Object.defineProperty(AnimationProto, "revert", { 7499 value: function value() { 7500 return this.time(-0.01, true); 7501 } 7502 }); // only for backwards compatibility (Animation.revert() was added after 3.10.4) 7503 7504 bodyStyle.borderTopStyle = "solid"; // works around an issue where a margin of a child element could throw off the bounds of the _body, making it seem like there's a margin when there actually isn't. The border ensures that the bounds are accurate. 7505 7506 bounds = _getBounds(_body); 7507 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical.m = Math.round(bounds.top + _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical.sc()) || 0; // accommodate the offset of the <body> caused by margins and/or padding 7508 7509 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal.m = Math.round(bounds.left + _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal.sc()) || 0; 7510 border ? bodyStyle.borderTopStyle = border : bodyStyle.removeProperty("border-top-style"); 7511 7512 if (!bodyHasStyle) { 7513 // SSR frameworks like Next.js complain if this attribute gets added. 7514 _body.setAttribute("style", ""); // it's not enough to just removeAttribute() - we must first set it to empty, otherwise Next.js complains. 7515 7516 7517 _body.removeAttribute("style"); 7518 } // TODO: (?) maybe move to leveraging the velocity mechanism in Observer and skip intervals. 7519 7520 7521 _syncInterval = setInterval(_sync, 250); 7522 gsap.delayedCall(0.5, function () { 7523 return _startup = 0; 7524 }); 7525 7526 _addListener(_doc, "touchcancel", _passThrough); // some older Android devices intermittently stop dispatching "touchmove" events if we don't listen for "touchcancel" on the document. 7527 7528 7529 _addListener(_body, "touchstart", _passThrough); //works around Safari bug: https://gsap.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/ 7530 7531 7532 _multiListener(_addListener, _doc, "pointerdown,touchstart,mousedown", _pointerDownHandler); 7533 7534 _multiListener(_addListener, _doc, "pointerup,touchend,mouseup", _pointerUpHandler); 7535 7536 _transformProp = gsap.utils.checkPrefix("transform"); 7537 7538 _stateProps.push(_transformProp); 7539 7540 _coreInitted = _getTime(); 7541 _resizeDelay = gsap.delayedCall(0.2, _refreshAll).pause(); 7542 _autoRefresh = [_doc, "visibilitychange", function () { 7543 var w = _win.innerWidth, 7544 h = _win.innerHeight; 7545 7546 if (_doc.hidden) { 7547 _prevWidth = w; 7548 _prevHeight = h; 7549 } else if (_prevWidth !== w || _prevHeight !== h) { 7550 _onResize(); 7551 } 7552 }, _doc, "DOMContentLoaded", _refreshAll, _win, "load", _refreshAll, _win, "resize", _onResize]; 7553 7554 _iterateAutoRefresh(_addListener); 7555 7556 _triggers.forEach(function (trigger) { 7557 return trigger.enable(0, 1); 7558 }); 7559 7560 for (i = 0; i < _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.length; i += 3) { 7561 _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 1]); 7562 7563 _wheelListener(_removeListener, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i], _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers[i + 2]); 7564 } 7565 } else if (_doc) { 7566 var onLoad = function onLoad() { 7567 ScrollTrigger.enable(); 7568 7569 _doc.removeEventListener("DOMContentLoaded", onLoad); 7570 }; 7571 7572 _doc.addEventListener("DOMContentLoaded", onLoad); 7573 } 7574 } 7575 }; 7576 7577 ScrollTrigger.config = function config(vars) { 7578 "limitCallbacks" in vars && (_limitCallbacks = !!vars.limitCallbacks); 7579 var ms = vars.syncInterval; 7580 ms && clearInterval(_syncInterval) || (_syncInterval = ms) && setInterval(_sync, ms); 7581 "ignoreMobileResize" in vars && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize); 7582 7583 if ("autoRefreshEvents" in vars) { 7584 _iterateAutoRefresh(_removeListener) || _iterateAutoRefresh(_addListener, vars.autoRefreshEvents || "none"); 7585 _ignoreResize = (vars.autoRefreshEvents + "").indexOf("resize") === -1; 7586 } 7587 }; 7588 7589 ScrollTrigger.scrollerProxy = function scrollerProxy(target, vars) { 7590 var t = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(target), 7591 i = _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.indexOf(t), 7592 isViewport = _isViewport(t); 7593 7594 if (~i) { 7595 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.splice(i, isViewport ? 6 : 2); 7596 } 7597 7598 if (vars) { 7599 isViewport ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.unshift(_win, vars, _body, vars, _docEl, vars) : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies.unshift(t, vars); 7600 } 7601 }; 7602 7603 ScrollTrigger.clearMatchMedia = function clearMatchMedia(query) { 7604 _triggers.forEach(function (t) { 7605 return t._ctx && t._ctx.query === query && t._ctx.kill(true, true); 7606 }); 7607 }; 7608 7609 ScrollTrigger.isInViewport = function isInViewport(element, ratio, horizontal) { 7610 var bounds = (_isString(element) ? (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element) : element).getBoundingClientRect(), 7611 offset = bounds[horizontal ? _width : _height] * ratio || 0; 7612 return horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win.innerHeight; 7613 }; 7614 7615 ScrollTrigger.positionInViewport = function positionInViewport(element, referencePoint, horizontal) { 7616 _isString(element) && (element = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element)); 7617 var bounds = element.getBoundingClientRect(), 7618 size = bounds[horizontal ? _width : _height], 7619 offset = referencePoint == null ? size / 2 : referencePoint in _keywords ? _keywords[referencePoint] * size : ~referencePoint.indexOf("%") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0; 7620 return horizontal ? (bounds.left + offset) / _win.innerWidth : (bounds.top + offset) / _win.innerHeight; 7621 }; 7622 7623 ScrollTrigger.killAll = function killAll(allowListeners) { 7624 _triggers.slice(0).forEach(function (t) { 7625 return t.vars.id !== "ScrollSmoother" && t.kill(); 7626 }); 7627 7628 if (allowListeners !== true) { 7629 var listeners = _listeners.killAll || []; 7630 _listeners = {}; 7631 listeners.forEach(function (f) { 7632 return f(); 7633 }); 7634 } 7635 }; 7636 7637 return ScrollTrigger; 7638}(); 7639ScrollTrigger.version = "3.15.0"; 7640 7641ScrollTrigger.saveStyles = function (targets) { 7642 return targets ? _toArray(targets).forEach(function (target) { 7643 // saved styles are recorded in a consecutive alternating Array, like [element, cssText, transform attribute, cache, matchMedia, ...] 7644 if (target && target.style) { 7645 var i = _savedStyles.indexOf(target); 7646 7647 i >= 0 && _savedStyles.splice(i, 5); 7648 7649 _savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute("transform"), gsap.core.getCache(target), _context()); 7650 } 7651 }) : _savedStyles; 7652}; 7653 7654ScrollTrigger.revert = function (soft, media) { 7655 return _revertAll(!soft, media); 7656}; 7657 7658ScrollTrigger.create = function (vars, animation) { 7659 return new ScrollTrigger(vars, animation); 7660}; 7661 7662ScrollTrigger.refresh = function (safe) { 7663 return safe ? _onResize(true) : (_coreInitted || ScrollTrigger.register()) && _refreshAll(true); 7664}; 7665 7666ScrollTrigger.update = function (force) { 7667 return ++_Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache && _updateAll(force === true ? 2 : 0); 7668}; 7669 7670ScrollTrigger.clearScrollMemory = _clearScrollMemory; 7671 7672ScrollTrigger.maxScroll = function (element, horizontal) { 7673 return _maxScroll(element, horizontal ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical); 7674}; 7675 7676ScrollTrigger.getScrollFunc = function (element, horizontal) { 7677 return (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)((0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(element), horizontal ? _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal : _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical); 7678}; 7679 7680ScrollTrigger.getById = function (id) { 7681 return _ids[id]; 7682}; 7683 7684ScrollTrigger.getAll = function () { 7685 return _triggers.filter(function (t) { 7686 return t.vars.id !== "ScrollSmoother"; 7687 }); 7688}; // it's common for people to ScrollTrigger.getAll(t => t.kill()) on page routes, for example, and we don't want it to ruin smooth scrolling by killing the main ScrollSmoother one. 7689 7690 7691ScrollTrigger.isScrolling = function () { 7692 return !!_lastScrollTime; 7693}; 7694 7695ScrollTrigger.snapDirectional = _snapDirectional; 7696 7697ScrollTrigger.addEventListener = function (type, callback) { 7698 var a = _listeners[type] || (_listeners[type] = []); 7699 ~a.indexOf(callback) || a.push(callback); 7700}; 7701 7702ScrollTrigger.removeEventListener = function (type, callback) { 7703 var a = _listeners[type], 7704 i = a && a.indexOf(callback); 7705 i >= 0 && a.splice(i, 1); 7706}; 7707 7708ScrollTrigger.batch = function (targets, vars) { 7709 var result = [], 7710 varsCopy = {}, 7711 interval = vars.interval || 0.016,
vendor: 5,654 bytes, lines 7712-7850
7712 batchMax = vars.batchMax || 1e9, 7713 proxyCallback = function proxyCallback(type, callback) { 7714 var elements = [], 7715 triggers = [], 7716 delay = gsap.delayedCall(interval, function () { 7717 callback(elements, triggers); 7718 elements = []; 7719 triggers = []; 7720 }).pause(); 7721 return function (self) { 7722 elements.length || delay.restart(true); 7723 elements.push(self.trigger); 7724 triggers.push(self); 7725 batchMax <= elements.length && delay.progress(1); 7726 }; 7727 }, 7728 p; 7729 7730 for (p in vars) { 7731 varsCopy[p] = p.substr(0, 2) === "on" && _isFunction(vars[p]) && p !== "onRefreshInit" ? proxyCallback(p, vars[p]) : vars[p]; 7732 } 7733 7734 if (_isFunction(batchMax)) { 7735 batchMax = batchMax(); 7736 7737 _addListener(ScrollTrigger, "refresh", function () { 7738 return batchMax = vars.batchMax(); 7739 }); 7740 } 7741 7742 _toArray(targets).forEach(function (target) { 7743 var config = {}; 7744 7745 for (p in varsCopy) { 7746 config[p] = varsCopy[p]; 7747 } 7748 7749 config.trigger = target; 7750 result.push(ScrollTrigger.create(config)); 7751 }); 7752 7753 return result; 7754}; // to reduce file size. clamps the scroll and also returns a duration multiplier so that if the scroll gets chopped shorter, the duration gets curtailed as well (otherwise if you're very close to the top of the page, for example, and swipe up really fast, it'll suddenly slow down and take a long time to reach the top). 7755 7756 7757var _clampScrollAndGetDurationMultiplier = function _clampScrollAndGetDurationMultiplier(scrollFunc, current, end, max) { 7758 current > max ? scrollFunc(max) : current < 0 && scrollFunc(0); 7759 return end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1; 7760}, 7761 _allowNativePanning = function _allowNativePanning(target, direction) { 7762 if (direction === true) { 7763 target.style.removeProperty("touch-action"); 7764 } else { 7765 target.style.touchAction = direction === true ? "auto" : direction ? "pan-" + direction + (_Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch ? " pinch-zoom" : "") : "none"; // note: Firefox doesn't support it pinch-zoom properly, at least in addition to a pan-x or pan-y. 7766 } 7767 7768 target === _docEl && _allowNativePanning(_body, direction); 7769}, 7770 _overflow = { 7771 auto: 1, 7772 scroll: 1 7773}, 7774 _nestedScroll = function _nestedScroll(_ref5) { 7775 var event = _ref5.event, 7776 target = _ref5.target, 7777 axis = _ref5.axis; 7778 7779 var node = (event.changedTouches ? event.changedTouches[0] : event).target, 7780 cache = node._gsap || gsap.core.getCache(node), 7781 time = _getTime(), 7782 cs; 7783 7784 if (!cache._isScrollT || time - cache._isScrollT > 2000) { 7785 // cache for 2 seconds to improve performance. 7786 while (node && node !== _body && (node.scrollHeight <= node.clientHeight && node.scrollWidth <= node.clientWidth || !(_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]))) { 7787 node = node.parentNode; 7788 } 7789 7790 cache._isScroll = node && node !== target && !_isViewport(node) && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]); 7791 cache._isScrollT = time; 7792 } 7793 7794 if (cache._isScroll || axis === "x") { 7795 event.stopPropagation(); 7796 event._gsapAllow = true; 7797 } 7798}, 7799 // capture events on scrollable elements INSIDE the <body> and allow those by calling stopPropagation() when we find a scrollable ancestor 7800_inputObserver = function _inputObserver(target, type, inputs, nested) { 7801 return _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.create({ 7802 target: target, 7803 capture: true, 7804 debounce: false, 7805 lockAxis: true, 7806 type: type, 7807 onWheel: nested = nested && _nestedScroll, 7808 onPress: nested, 7809 onDrag: nested, 7810 onScroll: nested, 7811 onEnable: function onEnable() { 7812 return inputs && _addListener(_doc, _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.eventTypes[0], _captureInputs, false, true); 7813 }, 7814 onDisable: function onDisable() { 7815 return _removeListener(_doc, _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.eventTypes[0], _captureInputs, true); 7816 } 7817 }); 7818}, 7819 _inputExp = /(input|label|select|textarea)/i, 7820 _inputIsFocused, 7821 _captureInputs = function _captureInputs(e) { 7822 var isInput = _inputExp.test(e.target.tagName); 7823 7824 if (isInput || _inputIsFocused) { 7825 e._gsapAllow = true; 7826 _inputIsFocused = isInput; 7827 } 7828}, 7829 _getScrollNormalizer = function _getScrollNormalizer(vars) { 7830 _isObject(vars) || (vars = {}); 7831 vars.preventDefault = vars.isNormalizer = vars.allowClicks = true; 7832 vars.type || (vars.type = "wheel,touch"); 7833 vars.debounce = !!vars.debounce; 7834 vars.id = vars.id || "normalizer"; 7835 7836 var _vars2 = vars, 7837 normalizeScrollX = _vars2.normalizeScrollX, 7838 momentum = _vars2.momentum, 7839 allowNestedScroll = _vars2.allowNestedScroll, 7840 onRelease = _vars2.onRelease, 7841 self, 7842 maxY, 7843 target = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.target) || _docEl, 7844 smoother = gsap.core.globals().ScrollSmoother, 7845 smootherInstance = smoother && smoother.get(), 7846 content = _fixIOSBug && (vars.content && (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getTarget)(vars.content) || smootherInstance && vars.content !== false && !smootherInstance.smooth() && smootherInstance.content()), 7847 scrollFuncY = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical), 7848 scrollFuncX = (0,_Observer_js__WEBPACK_IMPORTED_MODULE_0__._getScrollFunc)(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal), 7849 scale = 1, 7850 initialScale = (_Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer.isTouch && _win.visualVie
vendor: 11,530 bytes, lines 7850-8110
7850wport ? _win.visualViewport.scale * _win.visualViewport.width : _win.outerWidth) / _win.innerWidth, 7851 wheelRefresh = 0, 7852 resolveMomentumDuration = _isFunction(momentum) ? function () { 7853 return momentum(self); 7854 } : function () { 7855 return momentum || 2.8; 7856 }, 7857 lastRefreshID, 7858 skipTouchMove, 7859 inputObserver = _inputObserver(target, vars.type, true, allowNestedScroll), 7860 resumeTouchMove = function resumeTouchMove() { 7861 return skipTouchMove = false; 7862 }, 7863 scrollClampX = _passThrough, 7864 scrollClampY = _passThrough, 7865 updateClamps = function updateClamps() { 7866 maxY = _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical); 7867 scrollClampY = _clamp(_fixIOSBug ? 1 : 0, maxY); 7868 normalizeScrollX && (scrollClampX = _clamp(0, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal))); 7869 lastRefreshID = _refreshID; 7870 }, 7871 removeContentOffset = function removeContentOffset() { 7872 content._gsap.y = _round(parseFloat(content._gsap.y) + scrollFuncY.offset) + "px"; 7873 content.style.transform = "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, " + parseFloat(content._gsap.y) + ", 0, 1)"; 7874 scrollFuncY.offset = scrollFuncY.cacheID = 0; 7875 }, 7876 ignoreDrag = function ignoreDrag() { 7877 if (skipTouchMove) { 7878 requestAnimationFrame(resumeTouchMove); 7879 7880 var offset = _round(self.deltaY / 2), 7881 scroll = scrollClampY(scrollFuncY.v - offset); 7882 7883 if (content && scroll !== scrollFuncY.v + scrollFuncY.offset) { 7884 scrollFuncY.offset = scroll - scrollFuncY.v; 7885 7886 var y = _round((parseFloat(content && content._gsap.y) || 0) - scrollFuncY.offset); 7887 7888 content.style.transform = "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, " + y + ", 0, 1)"; 7889 content._gsap.y = y + "px"; 7890 scrollFuncY.cacheID = _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache; 7891 7892 _updateAll(); 7893 } 7894 7895 return true; 7896 } 7897 7898 scrollFuncY.offset && removeContentOffset(); 7899 skipTouchMove = true; 7900 }, 7901 tween, 7902 startScrollX, 7903 startScrollY, 7904 onStopDelayedCall, 7905 onResize = function onResize() { 7906 // if the window resizes, like on an iPhone which Apple FORCES the address bar to show/hide even if we event.preventDefault(), it may be scrolling too far now that the address bar is showing, so we must dynamically adjust the momentum tween. 7907 updateClamps(); 7908 7909 if (tween.isActive() && tween.vars.scrollY > maxY) { 7910 scrollFuncY() > maxY ? tween.progress(1) && scrollFuncY(maxY) : tween.resetTo("scrollY", maxY); 7911 } 7912 }; 7913 7914 content && gsap.set(content, { 7915 y: "+=0" 7916 }); // to ensure there's a cache (element._gsap) 7917 7918 vars.ignoreCheck = function (e) { 7919 return _fixIOSBug && e.type === "touchmove" && ignoreDrag(e) || scale > 1.05 && e.type !== "touchstart" || self.isGesturing || e.touches && e.touches.length > 1; 7920 }; 7921 7922 vars.onPress = function () { 7923 skipTouchMove = false; 7924 var prevScale = scale; 7925 scale = _round((_win.visualViewport && _win.visualViewport.scale || 1) / initialScale); 7926 tween.pause(); 7927 prevScale !== scale && _allowNativePanning(target, scale > 1.01 ? true : normalizeScrollX ? false : "x"); 7928 startScrollX = scrollFuncX(); 7929 startScrollY = scrollFuncY(); 7930 updateClamps(); 7931 lastRefreshID = _refreshID; 7932 }; 7933 7934 vars.onRelease = vars.onGestureStart = function (self, wasDragging) { 7935 scrollFuncY.offset && removeContentOffset(); 7936 7937 if (!wasDragging) { 7938 onStopDelayedCall.restart(true); 7939 } else { 7940 _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers.cache++; // make sure we're pulling the non-cached value 7941 // alternate algorithm: durX = Math.min(6, Math.abs(self.velocityX / 800)), dur = Math.max(durX, Math.min(6, Math.abs(self.velocityY / 800))); dur = dur * (0.4 + (1 - _power4In(dur / 6)) * 0.6)) * (momentumSpeed || 1) 7942 7943 var dur = resolveMomentumDuration(), 7944 currentScroll, 7945 endScroll; 7946 7947 if (normalizeScrollX) { 7948 currentScroll = scrollFuncX(); 7949 endScroll = currentScroll + dur * 0.05 * -self.velocityX / 0.227; // the constant .227 is from power4(0.05). velocity is inverted because scrolling goes in the opposite direction. 7950 7951 dur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._horizontal)); 7952 tween.vars.scrollX = scrollClampX(endScroll); 7953 } 7954 7955 currentScroll = scrollFuncY(); 7956 endScroll = currentScroll + dur * 0.05 * -self.velocityY / 0.227; // the constant .227 is from power4(0.05) 7957 7958 dur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _Observer_js__WEBPACK_IMPORTED_MODULE_0__._vertical)); 7959 tween.vars.scrollY = scrollClampY(endScroll); 7960 tween.invalidate().duration(dur).play(0.01); 7961 7962 if (_fixIOSBug && tween.vars.scrollY >= maxY || currentScroll >= maxY - 1) { 7963 // iOS bug: it'll show the address bar but NOT fire the window "resize" event until the animation is done but we must protect against overshoot so we leverage an onUpdate to do so. 7964 gsap.to({}, { 7965 onUpdate: onResize, 7966 duration: dur 7967 }); 7968 } 7969 } 7970 7971 onRelease && onRelease(self); 7972 }; 7973 7974 vars.onWheel = function () { 7975 tween._ts && tween.pause(); 7976 7977 if (_getTime() - wheelRefresh > 1000) { 7978 // after 1 second, refresh the clamps otherwise that'll only happen when ScrollTrigger.refresh() is called or for touch-scrolling. 7979 lastRefreshID = 0; 7980 wheelRefresh = _getTime(); 7981 } 7982 }; 7983 7984 vars.onChange = function (self, dx, dy, xArray, yArray) { 7985 _refreshID !== lastRefreshID && updateClamps(); 7986 dx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) : scrollFuncX() + dx - xArray[1])); // for more precision, we track pointer/touch movement from the start, otherwise it'll drift. 7987 7988 if (dy) { 7989 scrollFuncY.offset && removeContentOffset(); 7990 var isTouch = yArray[2] === dy, 7991 y = isTouch ? startScrollY + self.startY - self.y : scrollFuncY() + dy - yArray[1], 7992 yClamped = scrollClampY(y); 7993 isTouch && y !== yClamped && (startScrollY += yClamped - y); 7994 scrollFuncY(yClamped); 7995 } 7996 7997 (dy || dx) && _updateAll(); 7998 }; 7999 8000 vars.onEnable = function () { 8001 _allowNativePanning(target, normalizeScrollX ? false : "x"); 8002 8003 ScrollTrigger.addEventListener("refresh", onResize); 8004 8005 _addListener(_win, "resize", onResize); 8006 8007 if (scrollFuncY.smooth) { 8008 scrollFuncY.target.style.scrollBehavior = "auto"; 8009 scrollFuncY.smooth = scrollFuncX.smooth = false; 8010 } 8011 8012 inputObserver.enable(); 8013 }; 8014 8015 vars.onDisable = function () { 8016 _allowNativePanning(target, true); 8017 8018 _removeListener(_win, "resize", onResize); 8019 8020 ScrollTrigger.removeEventListener("refresh", onResize); 8021 inputObserver.kill(); 8022 }; 8023 8024 vars.lockAxis = vars.lockAxis !== false; 8025 self = new _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer(vars); 8026 self.iOS = _fixIOSBug; // used in the Observer getCachedScroll() function to work around an iOS bug that wreaks havoc with TouchEvent.clientY if we allow scroll to go all the way back to 0. 8027 8028 _fixIOSBug && !scrollFuncY() && scrollFuncY(1); // iOS bug causes event.clientY values to freak out (wildly inaccurate) if the scroll position is exactly 0. 8029 8030 _fixIOSBug && gsap.ticker.add(_passThrough); // prevent the ticker from sleeping 8031 8032 onStopDelayedCall = self._dc; 8033 tween = gsap.to(self, { 8034 ease: "power4", 8035 paused: true, 8036 inherit: false, 8037 scrollX: normalizeScrollX ? "+=0.1" : "+=0", 8038 scrollY: "+=0.1", 8039 modifiers: { 8040 scrollY: _interruptionTracker(scrollFuncY, scrollFuncY(), function () { 8041 return tween.pause(); 8042 }) 8043 }, 8044 onUpdate: _updateAll, 8045 onComplete: onStopDelayedCall.vars.onComplete 8046 }); // we need the modifier to sense if the scroll position is altered outside of the momentum tween (like with a scrollTo tween) so we can pause() it to prevent conflicts. 8047 8048 return self; 8049}; 8050 8051ScrollTrigger.sort = function (func) { 8052 if (_isFunction(func)) { 8053 return _triggers.sort(func); 8054 } 8055 8056 var scroll = _win.pageYOffset || 0; 8057 ScrollTrigger.getAll().forEach(function (t) { 8058 return t._sortY = t.trigger ? scroll + t.trigger.getBoundingClientRect().top : t.start + _win.innerHeight; 8059 }); 8060 return _triggers.sort(func || function (a, b) { 8061 return (a.vars.refreshPriority || 0) * -1e6 + (a.vars.containerAnimation ? 1e6 : a._sortY) - ((b.vars.containerAnimation ? 1e6 : b._sortY) + (b.vars.refreshPriority || 0) * -1e6); 8062 }); // anything with a containerAnimation should refresh last. 8063}; 8064 8065ScrollTrigger.observe = function (vars) { 8066 return new _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer(vars); 8067}; 8068 8069ScrollTrigger.normalizeScroll = function (vars) { 8070 if (typeof vars === "undefined") { 8071 return _normalizer; 8072 } 8073 8074 if (vars === true && _normalizer) { 8075 return _normalizer.enable(); 8076 } 8077 8078 if (vars === false) { 8079 _normalizer && _normalizer.kill(); 8080 _normalizer = vars; 8081 return; 8082 } 8083 8084 var normalizer = vars instanceof _Observer_js__WEBPACK_IMPORTED_MODULE_0__.Observer ? vars : _getScrollNormalizer(vars); 8085 _normalizer && _normalizer.target === normalizer.target && _normalizer.kill(); 8086 _isViewport(normalizer.target) && (_normalizer = normalizer); 8087 return normalizer; 8088}; 8089 8090ScrollTrigger.core = { 8091 // smaller file size way to leverage in ScrollSmoother and Observer 8092 _getVelocityProp: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._getVelocityProp, 8093 _inputObserver: _inputObserver, 8094 _scrollers: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._scrollers, 8095 _proxies: _Observer_js__WEBPACK_IMPORTED_MODULE_0__._proxies, 8096 bridge: { 8097 // when normalizeScroll sets the scroll position (ss = setScroll) 8098 ss: function ss() { 8099 _lastScrollTime || _dispatch("scrollStart"); 8100 _lastScrollTime = _getTime(); 8101 }, 8102 // a way to get the _refreshing value in Observer 8103 ref: function ref() { 8104 return _refreshing; 8105 } 8106 } 8107}; 8108_getGSAP() && gsap.registerPlugin(ScrollTrigger); 8109//# sourceURL=[module] 8110//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvU2Nyb2xsVHJpZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ29KOztBQUVwSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLFNBQVMsMkRBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMkRBQWE7QUFDM0I7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHlCQUF5QixrREFBUTtBQUNqQztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsMkRBQWE7QUFDOUQsQ0FBQztBQUNEO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtB
8110QUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQixrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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BQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOOztBQUVBO0FBQ0EsYUFBYSxrREFBUTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsa0RBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQiwwREFBZ0I7QUFDcEM7QUFDQSxjQUFjLG9EQUFVO0FBQ3hCLFlBQVksa0RBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9nc2FwQDMuMTUuMC9ub2RlX21vZHVsZXMvZ3NhcC9TY3JvbGxUcmlnZ2VyLmpzP2I0ODciXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBTY3JvbGxUcmlnZ2VyIDMuMTUuMFxuICogaHR0cHM6Ly9nc2FwLmNvbVxuICpcbiAqIEBsaWNlbnNlIENvcHlyaWdodCAyMDA4LTIwMjYsIEdyZWVuU29jay4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFN1YmplY3QgdG8gdGhlIHRlcm1zIGF0IGh0dHBzOi8vZ3NhcC5jb20vc3RhbmRhcmQtbGljZW5zZVxuICogQGF1dGhvcjogSmFjayBEb3lsZSwgamFja0BncmVlbnNvY2suY29tXG4qL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgT2JzZXJ2ZXIsIF9nZXRUYXJnZXQsIF92ZXJ0aWNhbCwgX2hvcml6b250YWwsIF9zY3JvbGxlcnMsIF9wcm94aWVzLCBfZ2V0U2Nyb2xsRnVuYywgX2dldFByb3h5UHJvcCwgX2dldFZlbG9jaXR5UHJvcCB9IGZyb20gXCIuL09ic2VydmVyLmpzXCI7XG5cbnZhciBnc2FwLFxuICAgIF9jb3JlSW5pdHRlZCxcbiAgICBfd2luLFxuICAgIF9kb2MsXG4gICAgX2RvY0VsLFxuICAgIF9ib2R5LFxuICAgIF9yb290LFxuICAgIF9yZXNpemVEZWxheSxcbiAgICBfdG9BcnJheSxcbiAgICBfY2xhbXAsXG4gICAgX3RpbWUyLFxuICAgIF9zeW5jSW50ZXJ2YWwsXG4gICAgX3JlZnJlc2hpbmcsXG4gICAgX3BvaW50ZXJJc0Rvd24sXG4gICAgX3RyYW5zZm9ybVByb3AsXG4gICAgX2ksXG4gICAgX3ByZXZXaWR0aCxcbiAgICBfcHJldkhlaWdodCxcbiAgICBfYXV0b1JlZnJlc2gsXG4gICAgX3NvcnQsXG4gICAgX3N1cHByZXNzT3ZlcndyaXRlcyxcbiAgICBfaWdub3JlUmVzaXplLFxuICAgIF9ub3JtYWxpemVyLFxuICAgIF9pZ25vcmVNb2JpbGVSZXNpemUsXG4gICAgX2Jhc2VTY3JlZW5IZWlnaHQsXG4gICAgX2Jhc2VTY3JlZW5XaWR0aCxcbiAgICBfZml4SU9TQnVnLFxuICAgIF9jb250ZXh0LFxuICAgIF9zY3JvbGxSZXN0b3JhdGlvbixcbiAgICBfZGl2MTAwdmgsXG4gICAgXzEwMHZoLFxuICAgIF9pc1JldmVydGVkLFxuICAgIF9jbGFtcGluZ01heCxcbiAgICBfbGltaXRDYWxsYmFja3MsXG4gICAgLy8gaWYgdHJ1ZSwgd2UnbGwgb25seSB0cmlnZ2VyIGNhbGxiYWNrcyBpZiB0aGUgYWN0aXZlIHN0YXRlIHRvZ2dsZXMsIHNvIGlmIHlvdSBzY3JvbGwgaW1tZWRpYXRlbHkgcGFzdCBib3RoIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiBhIFNjcm9sbFRyaWdnZXIgKHRodXMgaW5hY3RpdmUgdG8gaW5hY3RpdmUpLCBuZWl0aGVyIGl0cyBvbkVudGVyIG5vciBvbkxlYXZlIHdpbGwgYmUgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgc3RhcnR1cC5cbl9zdGFydHVwID0gMSxcbiAgICBfZ2V0VGltZSA9IERhdGUubm93LFxuICAgIF90aW1lMSA9IF9nZXRUaW1lKCksXG4gICAgX2xhc3RTY3JvbGxUaW1lID0gMCxcbiAgICBfZW5hYmxlZCA9IDAsXG4gICAgX3BhcnNlQ2xhbXAgPSBmdW5jdGlvbiBfcGFyc2VDbGFtcCh2YWx1ZSwgdHlwZSwgc2VsZikge1xuICB2YXIgY2xhbXAgPSBfaXNTdHJpbmcodmFsdWUpICYmICh2YWx1ZS5zdWJzdHIoMCwgNikgPT09IFwiY2xhbXAoXCIgfHwgdmFsdWUuaW5kZXhPZihcIm1heFwiKSA+IC0xKTtcbiAgc2VsZltcIl9cIiArIHR5cGUgKyBcIkNsYW1wXCJdID0gY2xhbXA7XG4gIHJldHVybiBjbGFtcCA/IHZhbHVlLnN1YnN0cig2LCB2YWx1ZS5sZW5ndGggLSA3KSA6IHZhbHVlO1xufSxcbiAgICBfa2VlcENsYW1wID0gZnVuY3Rpb24gX2tlZXBDbGFtcCh2YWx1ZSwgY2xhbXApIHtcbiAgcmV0dXJuIGNsYW1wICYmICghX2lzU3RyaW5nKHZhbHVlKSB8fCB2YWx1ZS
81105zdWJzdHIoMCwgNikgIT09IFwiY2xhbXAoXCIpID8gXCJjbGFtcChcIiArIHZhbHVlICsgXCIpXCIgOiB2YWx1ZTtcbn0sXG4gICAgX3JhZkJ1Z0ZpeCA9IGZ1bmN0aW9uIF9yYWZCdWdGaXgoKSB7XG4gIHJldHVybiBfZW5hYmxlZCAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3JhZkJ1Z0ZpeCk7XG59LFxuICAgIC8vIGluIHNvbWUgYnJvd3NlcnMgKGxpa2UgRmlyZWZveCksIHNjcmVlbiByZXBhaW50cyB3ZXJlbid0IGNvbnNpc3RlbnQgdW5sZXNzIHdlIGhhZCBTT01FVEhJTkcgcXVldWVkIHVwIGluIHJlcXVlc3RBbmltYXRpb25GcmFtZSgpISBTbyB0aGlzIGp1c3QgY3JlYXRlcyBhIHN1cGVyIHNpbXBsZSBsb29wIHRvIGtlZXAgaXQgYWxpdmUgYW5kIHNtb290aCBvdXQgcmVwYWludHMuXG5fcG9pbnRlckRvd25IYW5kbGVyID0gZnVuY3Rpb24gX3BvaW50ZXJEb3duSGFuZGxlcigpIHtcbiAgcmV0dXJuIF9wb2ludGVySXNEb3duID0gMTtcbn0sXG4gICAgX3BvaW50ZXJVcEhhbmRsZXIgPSBmdW5jdGlvbiBfcG9pbnRlclVwSGFuZGxlcigpIHtcbiAgcmV0dXJuIF9wb2ludGVySXNEb3duID0gMDtcbn0sXG4gICAgX3Bhc3NUaHJvdWdoID0gZnVuY3Rpb24gX3Bhc3NUaHJvdWdoKHYpIHtcbiAgcmV0dXJuIHY7XG59LFxuICAgIF9yb3VuZCA9IGZ1bmN0aW9uIF9yb3VuZCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMDAwMCkgLyAxMDAwMDAgfHwgMDtcbn0sXG4gICAgX3dpbmRvd0V4aXN0cyA9IGZ1bmN0aW9uIF93aW5kb3dFeGlzdHMoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xufSxcbiAgICBfZ2V0R1NBUCA9IGZ1bmN0aW9uIF9nZXRHU0FQKCkge1xuICByZXR1cm4gZ3NhcCB8fCBfd2luZG93RXhpc3RzKCkgJiYgKGdzYXAgPSB3aW5kb3cuZ3NhcCkgJiYgZ3NhcC5yZWdpc3RlclBsdWdpbiAmJiBnc2FwO1xufSxcbiAgICBfaXNWaWV3cG9ydCA9IGZ1bmN0aW9uIF9pc1ZpZXdwb3J0KGUpIHtcbiAgcmV0dXJuICEhfl9yb290LmluZGV4T2YoZSk7XG59LFxuICAgIF9nZXRWaWV3cG9ydERpbWVuc2lvbiA9IGZ1bmN0aW9uIF9nZXRWaWV3cG9ydERpbWVuc2lvbihkaW1lbnNpb25Qcm9wZXJ0eSkge1xuICByZXR1cm4gKGRpbWVuc2lvblByb3BlcnR5ID09PSBcIkhlaWdodFwiID8gXzEwMHZoIDogX3dpbltcImlubmVyXCIgKyBkaW1lbnNpb25Qcm9wZXJ0eV0pIHx8IF9kb2NFbFtcImNsaWVudFwiICsgZGltZW5zaW9uUHJvcGVydHldIHx8IF9ib2R5W1wiY2xpZW50XCIgKyBkaW1lbnNpb25Qcm9wZXJ0eV07XG59LFxuICAgIF9nZXRCb3VuZHNGdW5jID0gZnVuY3Rpb24gX2dldEJvdW5kc0Z1bmMoZWxlbWVudCkge1xuICByZXR1cm4gX2dldFByb3h5UHJvcChlbGVtZW50LCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiKSB8fCAoX2lzVmlld3BvcnQoZWxlbWVudCkgPyBmdW5jdGlvbiAoKSB7XG4gICAgX3dpbk9mZnNldHMud2lkdGggPSBfd2luLmlubmVyV2lkdGg7XG4gICAgX3dpbk9mZnNldHMuaGVpZ2h0ID0gXzEwMHZoO1xuICAgIHJldHVybiBfd2luT2Zmc2V0cztcbiAgfSA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2dldEJvdW5kcyhlbGVtZW50KTtcbiAgfSk7XG59LFxuICAgIF9nZXRTaXplRnVuYyA9IGZ1bmN0aW9uIF9nZXRTaXplRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCwgX3JlZikge1xuICB2YXIgZCA9IF9yZWYuZCxcbiAgICAgIGQyID0gX3JlZi5kMixcbiAgICAgIGEgPSBfcmVmLmE7XG4gIHJldHVybiAoYSA9IF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0XCIpKSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYSgpW2RdO1xuICB9IDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoaXNWaWV3cG9ydCA/IF9nZXRWaWV3cG9ydERpbWVuc2lvbihkMikgOiBzY3JvbGxlcltcImNsaWVudFwiICsgZDJdKSB8fCAwO1xuICB9O1xufSxcbiAgICBfZ2V0T2Zmc2V0c0Z1bmMgPSBmdW5jdGlvbiBfZ2V0T2Zmc2V0c0Z1bmMoZWxlbWVudCwgaXNWaWV3cG9ydCkge1xuICByZXR1cm4gIWlzVmlld3BvcnQgfHwgfl9wcm94aWVzLmluZGV4T2YoZWxlbWVudCkgPyBfZ2V0Qm91bmRzRnVuYyhlbGVtZW50KSA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3dpbk9mZnNldHM7XG4gIH07XG59LFxuICAgIF9tYXhTY3JvbGwgPSBmdW5jdGlvbiBfbWF4U2Nyb2xsKGVsZW1lbnQsIF9yZWYyKSB7XG4gIHZhciBzID0gX3JlZjIucyxcbiAgICAgIGQyID0gX3JlZjIuZDIsXG4gICAgICBkID0gX3JlZjIuZCxcbiAgICAgIGEgPSBfcmVmMi5hO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgKHMgPSBcInNjcm9sbFwiICsgZDIpICYmIChhID0gX2dldFByb3h5UHJvcChlbGVtZW50LCBzKSkgPyBhKCkgLSBfZ2V0Qm91bmRzRnVuYyhlbGVtZW50KSgpW2RdIDogX2lzVmlld3BvcnQoZWxlbWVudCkgPyAoX2RvY0VsW3NdIHx8IF9ib2R5W3NdKSAtIF9nZXRWaWV3cG9ydERpbWVuc2lvbihkMikgOiBlbGVtZW50W3NdIC0gZWxlbWVudFtcIm9mZnNldFwiICsgZDJdKTtcbn0sXG4gICAgX2l0ZXJhdGVBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uIF9pdGVyYXRlQXV0b1JlZnJlc2goZnVuYywgZXZlbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgX2F1dG9SZWZyZXNoLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgKCFldmVudHMgfHwgfmV2ZW50cy5pbmRleE9mKF9hdXRvUmVmcmVzaFtpICsgMV0pKSAmJiBmdW5jKF9hdXRvUmVmcmVzaFtpXSwgX2F1dG9SZWZyZXNoW2kgKyAxXSwgX2F1dG9SZWZyZXNoW2kgKyAyXSk7XG4gIH1cbn0sXG4gICAgX2lzU3RyaW5nID0gZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59LFxuICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24gX2lzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufSxcbiAgICBfaXNOdW1iZXIgPSBmdW5jdGlvbiBfaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbn0sXG4gICAgX2lzT2JqZWN0ID0gZnVuY3Rpb24gX2lzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybi
8110B0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59LFxuICAgIF9lbmRBbmltYXRpb24gPSBmdW5jdGlvbiBfZW5kQW5pbWF0aW9uKGFuaW1hdGlvbiwgcmV2ZXJzZWQsIHBhdXNlKSB7XG4gIHJldHVybiBhbmltYXRpb24gJiYgYW5pbWF0aW9uLnByb2dyZXNzKHJldmVyc2VkID8gMCA6IDEpICYmIHBhdXNlICYmIGFuaW1hdGlvbi5wYXVzZSgpO1xufSxcbiAgICBfY2FsbGJhY2sgPSBmdW5jdGlvbiBfY2FsbGJhY2soc2VsZiwgZnVuYywgZXh0cmFQYXJhbSkge1xuICBpZiAoc2VsZi5lbmFibGVkKSB7XG4gICAgdmFyIHJlc3VsdCA9IHNlbGYuX2N0eCA/IHNlbGYuX2N0eC5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgZXh0cmFQYXJhbSk7XG4gICAgfSkgOiBmdW5jKHNlbGYsIGV4dHJhUGFyYW0pO1xuICAgIHJlc3VsdCAmJiByZXN1bHQudG90YWxUaW1lICYmIChzZWxmLmNhbGxiYWNrQW5pbWF0aW9uID0gcmVzdWx0KTtcbiAgfVxufSxcbiAgICBfYWJzID0gTWF0aC5hYnMsXG4gICAgX2xlZnQgPSBcImxlZnRcIixcbiAgICBfdG9wID0gXCJ0b3BcIixcbiAgICBfcmlnaHQgPSBcInJpZ2h0XCIsXG4gICAgX2JvdHRvbSA9IFwiYm90dG9tXCIsXG4gICAgX3dpZHRoID0gXCJ3aWR0aFwiLFxuICAgIF9oZWlnaHQgPSBcImhlaWdodFwiLFxuICAgIF9SaWdodCA9IFwiUmlnaHRcIixcbiAgICBfTGVmdCA9IFwiTGVmdFwiLFxuICAgIF9Ub3AgPSBcIlRvcFwiLFxuICAgIF9Cb3R0b20gPSBcIkJvdHRvbVwiLFxuICAgIF9wYWRkaW5nID0gXCJwYWRkaW5nXCIsXG4gICAgX21hcmdpbiA9IFwibWFyZ2luXCIsXG4gICAgX1dpZHRoID0gXCJXaWR0aFwiLFxuICAgIF9IZWlnaHQgPSBcIkhlaWdodFwiLFxuICAgIF9weCA9IFwicHhcIixcbiAgICBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIF93aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX05PREUgPyBlbGVtZW50LnNjcm9sbGluZ0VsZW1lbnQgOiBlbGVtZW50KTtcbn0sXG4gICAgX21ha2VQb3NpdGlvbmFibGUgPSBmdW5jdGlvbiBfbWFrZVBvc2l0aW9uYWJsZShlbGVtZW50KSB7XG4gIC8vIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzIHBvc2l0aW9uOiBhYnNvbHV0ZSBvciBmaXhlZCwgbGVhdmUgdGhhdCwgb3RoZXJ3aXNlIG1ha2UgaXQgcG9zaXRpb246IHJlbGF0aXZlXG4gIHZhciBwb3NpdGlvbiA9IF9nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uO1xuXG4gIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgPyBwb3NpdGlvbiA6IFwicmVsYXRpdmVcIjtcbn0sXG4gICAgX3NldERlZmF1bHRzID0gZnVuY3Rpb24gX3NldERlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHtcbiAgZm9yICh2YXIgcCBpbiBkZWZhdWx0cykge1xuICAgIHAgaW4gb2JqIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfZ2V0Qm91bmRzID0gZnVuY3Rpb24gX2dldEJvdW5kcyhlbGVtZW50LCB3aXRob3V0VHJhbnNmb3Jtcykge1xuICB2YXIgdHdlZW4gPSB3aXRob3V0VHJhbnNmb3JtcyAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVtfdHJhbnNmb3JtUHJvcF0gIT09IFwibWF0cml4KDEsIDAsIDAsIDEsIDAsIDApXCIgJiYgZ3NhcC50byhlbGVtZW50LCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHhQZXJjZW50OiAwLFxuICAgIHlQZXJjZW50OiAwLFxuICAgIHJvdGF0aW9uOiAwLFxuICAgIHJvdGF0aW9uWDogMCxcbiAgICByb3RhdGlvblk6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgc2tld1g6IDAsXG4gICAgc2tld1k6IDBcbiAgfSkucHJvZ3Jlc3MoMSksXG4gICAgICBib3VuZHMgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBlbGVtZW50LnNjcm9sbGluZ0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHR3ZWVuICYmIHR3ZWVuLnByb2dyZXNzKDApLmtpbGwoKTtcbiAgcmV0dXJuIGJvdW5kcztcbn0sXG4gICAgX2dldFNpemUgPSBmdW5jdGlvbiBfZ2V0U2l6ZShlbGVtZW50LCBfcmVmMykge1xuICB2YXIgZDIgPSBfcmVmMy5kMjtcbiAgcmV0dXJuIGVsZW1lbnRbXCJvZmZzZXRcIiArIGQyXSB8fCBlbGVtZW50W1wiY2xpZW50XCIgKyBkMl0gfHwgMDtcbn0sXG4gICAgX2dldExhYmVsUmF0aW9BcnJheSA9IGZ1bmN0aW9uIF9nZXRMYWJlbFJhdGlvQXJyYXkodGltZWxpbmUpIHtcbiAgdmFyIGEgPSBbXSxcbiAgICAgIGxhYmVscyA9IHRpbWVsaW5lLmxhYmVscyxcbiAgICAgIGR1cmF0aW9uID0gdGltZWxpbmUuZHVyYXRpb24oKSxcbiAgICAgIHA7XG5cbiAgZm9yIChwIGluIGxhYmVscykge1xuICAgIGEucHVzaChsYWJlbHNbcF0gLyBkdXJhdGlvbik7XG4gIH1cblxuICByZXR1cm4gYTtcbn0sXG4gICAgX2dldENsb3Nlc3RMYWJlbCA9IGZ1bmN0aW9uIF9nZXRDbG9zZXN0TGFiZWwoYW5pbWF0aW9uKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZ3NhcC51dGlscy5zbmFwKF9nZXRMYWJlbFJhdGlvQXJyYXkoYW5pbWF0aW9uKSwgdmFsdWUpO1xuICB9O1xufSxcbiAgICBfc25hcERpcmVjdGlvbmFsID0gZnVuY3Rpb24gX3NuYXBEaXJlY3Rpb25hbChzbmFwSW5jcmVtZW50T3JBcnJheSkge1xuICB2YXIgc25hcCA9IGdzYXAudXRpbHMuc25hcChzbmFwSW5jcmVtZW50T3JBcnJheSksXG4gICAgICBhID0gQXJyYXkuaXNBcnJheShzbmFwSW5jcmVtZW50T3JBcnJheSkgJiYgc25hcEluY3JlbWVudE9yQXJyYXkuc2xpY2UoMCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7XG4gIHJldHVybiBhID8gZnVuY3Rpb24gKHZhbHVlLCBkaXJlY3Rpb24sIHRocmVzaG9sZCkge1xuICAgIGlmICh0aHJlc2hvbGQgPT09IHZvaWQgMCkge1xuICAgICAgdGhyZXNob2xkID0gMWUtMztcbiAgICB9XG5cbiAgICB2YXIgaTtcblxuICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc25hcCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiA+IDApIHtcbiAgICAgIHZhbHVlIC09IHRocmVzaG9sZDsgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzLiBJZiB3ZSdyZSB0b28gc3RyaWN0LCBpdCBtaWdodCBzbmFwIGZvcndhcmQsIHRoZW4gaW1tZWRpYXRlbHkgYWdhaW4sIGFuZCBhZ2Fpbi5cblxuICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFbaV0gPj0gdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYVtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYVtpIC0gMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGkgPSBhLmxlbmd0aDtcbiAgICAgIHZhbHVlICs9IHRocmVzaG9sZDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAoYVtpXSA8PSB2YWx1ZSkge1xuICAgICAgICAgI
8110HJldHVybiBhW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFbMF07XG4gIH0gOiBmdW5jdGlvbiAodmFsdWUsIGRpcmVjdGlvbiwgdGhyZXNob2xkKSB7XG4gICAgaWYgKHRocmVzaG9sZCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJlc2hvbGQgPSAxZS0zO1xuICAgIH1cblxuICAgIHZhciBzbmFwcGVkID0gc25hcCh2YWx1ZSk7XG4gICAgcmV0dXJuICFkaXJlY3Rpb24gfHwgTWF0aC5hYnMoc25hcHBlZCAtIHZhbHVlKSA8IHRocmVzaG9sZCB8fCBzbmFwcGVkIC0gdmFsdWUgPCAwID09PSBkaXJlY3Rpb24gPCAwID8gc25hcHBlZCA6IHNuYXAoZGlyZWN0aW9uIDwgMCA/IHZhbHVlIC0gc25hcEluY3JlbWVudE9yQXJyYXkgOiB2YWx1ZSArIHNuYXBJbmNyZW1lbnRPckFycmF5KTtcbiAgfTtcbn0sXG4gICAgX2dldExhYmVsQXREaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0TGFiZWxBdERpcmVjdGlvbih0aW1lbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlLCBzdCkge1xuICAgIHJldHVybiBfc25hcERpcmVjdGlvbmFsKF9nZXRMYWJlbFJhdGlvQXJyYXkodGltZWxpbmUpKSh2YWx1ZSwgc3QuZGlyZWN0aW9uKTtcbiAgfTtcbn0sXG4gICAgX211bHRpTGlzdGVuZXIgPSBmdW5jdGlvbiBfbXVsdGlMaXN0ZW5lcihmdW5jLCBlbGVtZW50LCB0eXBlcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHR5cGVzLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIGZ1bmMoZWxlbWVudCwgdHlwZSwgY2FsbGJhY2spO1xuICB9KTtcbn0sXG4gICAgX2FkZExpc3RlbmVyID0gZnVuY3Rpb24gX2FkZExpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGZ1bmMsIG5vblBhc3NpdmUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmdW5jLCB7XG4gICAgcGFzc2l2ZTogIW5vblBhc3NpdmUsXG4gICAgY2FwdHVyZTogISFjYXB0dXJlXG4gIH0pO1xufSxcbiAgICBfcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiBfcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZnVuYywgY2FwdHVyZSkge1xuICByZXR1cm4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmMsICEhY2FwdHVyZSk7XG59LFxuICAgIF93aGVlbExpc3RlbmVyID0gZnVuY3Rpb24gX3doZWVsTGlzdGVuZXIoZnVuYywgZWwsIHNjcm9sbEZ1bmMpIHtcbiAgc2Nyb2xsRnVuYyA9IHNjcm9sbEZ1bmMgJiYgc2Nyb2xsRnVuYy53aGVlbEhhbmRsZXI7XG5cbiAgaWYgKHNjcm9sbEZ1bmMpIHtcbiAgICBmdW5jKGVsLCBcIndoZWVsXCIsIHNjcm9sbEZ1bmMpO1xuICAgIGZ1bmMoZWwsIFwidG91Y2htb3ZlXCIsIHNjcm9sbEZ1bmMpO1xuICB9XG59LFxuICAgIF9tYXJrZXJEZWZhdWx0cyA9IHtcbiAgc3RhcnRDb2xvcjogXCJncmVlblwiLFxuICBlbmRDb2xvcjogXCJyZWRcIixcbiAgaW5kZW50OiAwLFxuICBmb250U2l6ZTogXCIxNnB4XCIsXG4gIGZvbnRXZWlnaHQ6IFwibm9ybWFsXCJcbn0sXG4gICAgX2RlZmF1bHRzID0ge1xuICB0b2dnbGVBY3Rpb25zOiBcInBsYXlcIixcbiAgYW50aWNpcGF0ZVBpbjogMFxufSxcbiAgICBfa2V5d29yZHMgPSB7XG4gIHRvcDogMCxcbiAgbGVmdDogMCxcbiAgY2VudGVyOiAwLjUsXG4gIGJvdHRvbTogMSxcbiAgcmlnaHQ6IDFcbn0sXG4gICAgX29mZnNldFRvUHggPSBmdW5jdGlvbiBfb2Zmc2V0VG9QeCh2YWx1ZSwgc2l6ZSkge1xuICBpZiAoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBlcUluZGV4ID0gdmFsdWUuaW5kZXhPZihcIj1cIiksXG4gICAgICAgIHJlbGF0aXZlID0gfmVxSW5kZXggPyArKHZhbHVlLmNoYXJBdChlcUluZGV4IC0gMSkgKyAxKSAqIHBhcnNlRmxvYXQodmFsdWUuc3Vic3RyKGVxSW5kZXggKyAxKSkgOiAwO1xuXG4gICAgaWYgKH5lcUluZGV4KSB7XG4gICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IGVxSW5kZXggJiYgKHJlbGF0aXZlICo9IHNpemUgLyAxMDApO1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHIoMCwgZXFJbmRleCAtIDEpO1xuICAgIH1cblxuICAgIHZhbHVlID0gcmVsYXRpdmUgKyAodmFsdWUgaW4gX2tleXdvcmRzID8gX2tleXdvcmRzW3ZhbHVlXSAqIHNpemUgOiB+dmFsdWUuaW5kZXhPZihcIiVcIikgPyBwYXJzZUZsb2F0KHZhbHVlKSAqIHNpemUgLyAxMDAgOiBwYXJzZUZsb2F0KHZhbHVlKSB8fCAwKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn0sXG4gICAgX2NyZWF0ZU1hcmtlciA9IGZ1bmN0aW9uIF9jcmVhdGVNYXJrZXIodHlwZSwgbmFtZSwgY29udGFpbmVyLCBkaXJlY3Rpb24sIF9yZWY0LCBvZmZzZXQsIG1hdGNoV2lkdGhFbCwgY29udGFpbmVyQW5pbWF0aW9uKSB7XG4gIHZhciBzdGFydENvbG9yID0gX3JlZjQuc3RhcnRDb2xvcixcbiAgICAgIGVuZENvbG9yID0gX3JlZjQuZW5kQ29sb3IsXG4gICAgICBmb250U2l6ZSA9IF9yZWY0LmZvbnRTaXplLFxuICAgICAgaW5kZW50ID0gX3JlZjQuaW5kZW50LFxuICAgICAgZm9udFdlaWdodCA9IF9yZWY0LmZvbnRXZWlnaHQ7XG5cbiAgdmFyIGUgPSBfZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICB1c2VGaXhlZFBvc2l0aW9uID0gX2lzVmlld3BvcnQoY29udGFpbmVyKSB8fCBfZ2V0UHJveHlQcm9wKGNvbnRhaW5lciwgXCJwaW5UeXBlXCIpID09PSBcImZpeGVkXCIsXG4gICAgICBpc1Njcm9sbGVyID0gdHlwZS5pbmRleE9mKFwic2Nyb2xsZXJcIikgIT09IC0xLFxuICAgICAgcGFyZW50ID0gdXNlRml4ZWRQb3NpdGlvbiA/IF9ib2R5IDogY29udGFpbmVyLnRhZ05hbWUgPT09IFwiSUZSQU1FXCIgPyBjb250YWluZXIuY29udGVudERvY3VtZW50LmJvZHkgOiBjb250YWluZXIsXG4gICAgICBpc1N0YXJ0ID0gdHlwZS5pbmRleE9mKFwic3RhcnRcIikgIT09IC0xLFxuICAgICAgY29sb3IgPSBpc1N0YXJ0ID8gc3RhcnRDb2xvciA6IGVuZENvbG9yLFxuICAgICAgY3NzID0gXCJib3JkZXItY29sb3I6XCIgKyBjb2xvciArIFwiO2ZvbnQtc2l6ZTpcIiArIGZvbnRTaXplICsgXCI7Y29sb3I6XCIgKyBjb2xvciArIFwiO2ZvbnQtd2VpZ2h0OlwiICsgZm9udFdlaWdodCArIFwiO3BvaW50ZXItZXZlbnRzOm5vbmU7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsQXJpYWw7ei1pbmRleDoxMDAwO3BhZGRpbmc6NHB4IDhweDtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7XCI7XG5cbiAgY3NzICs9IFwicG9zaXRpb246XCIgKyAoKGlzU2Nyb2xsZXIgfHwgY29udGFpbmVyQW5pbWF0aW9uKSAmJiB1c2VGaXhlZFBvc2l0aW9uID8gXCJmaXhlZDtcIiA6IFwiYWJzb2x1dGU7XCIpO1xuICAoaXNTY3JvbGxlciB8fCBjb250YWluZXJBbmltYXRpb24gfHwgIXVzZUZpeGVkUG9zaXRpb24pICYmIChjc3MgKz0gKGRpcmVjdGlvbiA9PT0gX3ZlcnRpY2FsID8gX3JpZ2h0IDogX2JvdHRvbSkgKyBcIjpcIiArIChvZmZzZXQgKyBwYXJzZU
8110Zsb2F0KGluZGVudCkpICsgXCJweDtcIik7XG4gIG1hdGNoV2lkdGhFbCAmJiAoY3NzICs9IFwiYm94LXNpemluZzpib3JkZXItYm94O3RleHQtYWxpZ246bGVmdDt3aWR0aDpcIiArIG1hdGNoV2lkdGhFbC5vZmZzZXRXaWR0aCArIFwicHg7XCIpO1xuICBlLl9pc1N0YXJ0ID0gaXNTdGFydDtcbiAgZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImdzYXAtbWFya2VyLVwiICsgdHlwZSArIChuYW1lID8gXCIgbWFya2VyLVwiICsgbmFtZSA6IFwiXCIpKTtcbiAgZS5zdHlsZS5jc3NUZXh0ID0gY3NzO1xuICBlLmlubmVyVGV4dCA9IG5hbWUgfHwgbmFtZSA9PT0gMCA/IHR5cGUgKyBcIi1cIiArIG5hbWUgOiB0eXBlO1xuICBwYXJlbnQuY2hpbGRyZW5bMF0gPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGUsIHBhcmVudC5jaGlsZHJlblswXSkgOiBwYXJlbnQuYXBwZW5kQ2hpbGQoZSk7XG4gIGUuX29mZnNldCA9IGVbXCJvZmZzZXRcIiArIGRpcmVjdGlvbi5vcC5kMl07XG5cbiAgX3Bvc2l0aW9uTWFya2VyKGUsIDAsIGRpcmVjdGlvbiwgaXNTdGFydCk7XG5cbiAgcmV0dXJuIGU7XG59LFxuICAgIF9wb3NpdGlvbk1hcmtlciA9IGZ1bmN0aW9uIF9wb3NpdGlvbk1hcmtlcihtYXJrZXIsIHN0YXJ0LCBkaXJlY3Rpb24sIGZsaXBwZWQpIHtcbiAgdmFyIHZhcnMgPSB7XG4gICAgZGlzcGxheTogXCJibG9ja1wiXG4gIH0sXG4gICAgICBzaWRlID0gZGlyZWN0aW9uW2ZsaXBwZWQgPyBcIm9zMlwiIDogXCJwMlwiXSxcbiAgICAgIG9wcG9zaXRlU2lkZSA9IGRpcmVjdGlvbltmbGlwcGVkID8gXCJwMlwiIDogXCJvczJcIl07XG4gIG1hcmtlci5faXNGbGlwcGVkID0gZmxpcHBlZDtcbiAgdmFyc1tkaXJlY3Rpb24uYSArIFwiUGVyY2VudFwiXSA9IGZsaXBwZWQgPyAtMTAwIDogMDtcbiAgdmFyc1tkaXJlY3Rpb24uYV0gPSBmbGlwcGVkID8gXCIxcHhcIiA6IDA7XG4gIHZhcnNbXCJib3JkZXJcIiArIHNpZGUgKyBfV2lkdGhdID0gMTtcbiAgdmFyc1tcImJvcmRlclwiICsgb3Bwb3NpdGVTaWRlICsgX1dpZHRoXSA9IDA7XG4gIHZhcnNbZGlyZWN0aW9uLnBdID0gc3RhcnQgKyBcInB4XCI7XG4gIGdzYXAuc2V0KG1hcmtlciwgdmFycyk7XG59LFxuICAgIF90cmlnZ2VycyA9IFtdLFxuICAgIF9pZHMgPSB7fSxcbiAgICBfcmFmSUQsXG4gICAgX3N5bmMgPSBmdW5jdGlvbiBfc3luYygpIHtcbiAgcmV0dXJuIF9nZXRUaW1lKCkgLSBfbGFzdFNjcm9sbFRpbWUgPiAzNCAmJiAoX3JhZklEIHx8IChfcmFmSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3VwZGF0ZUFsbCkpKTtcbn0sXG4gICAgX29uU2Nyb2xsID0gZnVuY3Rpb24gX29uU2Nyb2xsKCkge1xuICAvLyBwcmV2aW91c2x5LCB3ZSB0cmllZCB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSBieSBiYXRjaGluZy9kZWZlcnJpbmcgdG8gdGhlIG5leHQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCksIGJ1dCBkaXNjb3ZlcmVkIHRoYXQgU2FmYXJpIGhhcyBhIGZldyBidWdzIHRoYXQgbWFrZSB0aGlzIHVud29ya2FibGUgKGVzcGVjaWFsbHkgb24gaU9TKS4gU2VlIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuLzE2YzQzNWIxMmVmMDljMzgxMjUyMDQ4MThlN2I0NWZjP2VkaXRvcnM9MDAxMCBhbmQgaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vSmpPeFlwUS8zZGQ2NWNjZWM1YTYwZjFkODYyYzM1NWQ4NGQxNDU2Mj9lZGl0b3JzPTAwMTAgYW5kIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuL0V4YnJQTmEvMDg3Y2VmMTk3ZGMzNTQ0NWEwOTUxZTg5MzVjNDE1MDM/ZWRpdG9ycz0wMDEwXG4gIGlmICghX25vcm1hbGl6ZXIgfHwgIV9ub3JtYWxpemVyLmlzUHJlc3NlZCB8fCBfbm9ybWFsaXplci5zdGFydFggPiBfYm9keS5jbGllbnRXaWR0aCkge1xuICAgIC8vIGlmIHRoZSB1c2VyIGlzIGRyYWdnaW5nIHRoZSBzY3JvbGxiYXIsIGFsbG93IGl0LlxuICAgIF9zY3JvbGxlcnMuY2FjaGUrKztcblxuICAgIGlmIChfbm9ybWFsaXplcikge1xuICAgICAgX3JhZklEIHx8IChfcmFmSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3VwZGF0ZUFsbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdXBkYXRlQWxsKCk7IC8vIFNhZmFyaSBpbiBwYXJ0aWN1bGFyIChvbiBkZXNrdG9wKSBORUVEUyB0aGUgaW1tZWRpYXRlIHVwZGF0ZSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSgpIHdoZXJlYXMgaU9TIHNlZW1zIHRvIGJlbmVmaXQgZnJvbSB3YWl0aW5nIGZvciB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCkgdGljaywgYXQgbGVhc3Qgd2hlbiBub3JtYWxpemluZy4gU2VlIGh0dHBzOi8vY29kZXBlbi5pby9HcmVlblNvY2svcGVuL3FCWW96cU8/ZWRpdG9ycz0wMTEwXG5cbiAgICB9XG5cbiAgICBfbGFzdFNjcm9sbFRpbWUgfHwgX2Rpc3BhdGNoKFwic2Nyb2xsU3RhcnRcIik7XG4gICAgX2xhc3RTY3JvbGxUaW1lID0gX2dldFRpbWUoKTtcbiAgfVxufSxcbiAgICBfc2V0QmFzZURpbWVuc2lvbnMgPSBmdW5jdGlvbiBfc2V0QmFzZURpbWVuc2lvbnMoKSB7XG4gIF9iYXNlU2NyZWVuV2lkdGggPSBfd2luLmlubmVyV2lkdGg7XG4gIF9iYXNlU2NyZWVuSGVpZ2h0ID0gX3dpbi5pbm5lckhlaWdodDtcbn0sXG4gICAgX29uUmVzaXplID0gZnVuY3Rpb24gX29uUmVzaXplKGZvcmNlKSB7XG4gIF9zY3JvbGxlcnMuY2FjaGUrKztcbiAgKGZvcmNlID09PSB0cnVlIHx8ICFfcmVmcmVzaGluZyAmJiAhX2lnbm9yZVJlc2l6ZSAmJiAhX2RvYy5mdWxsc2NyZWVuRWxlbWVudCAmJiAhX2RvYy53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCAmJiAoIV9pZ25vcmVNb2JpbGVSZXNpemUgfHwgX2Jhc2VTY3JlZW5XaWR0aCAhPT0gX3dpbi5pbm5lcldpZHRoIHx8IE1hdGguYWJzKF93aW4uaW5uZXJIZWlnaHQgLSBfYmFzZVNjcmVlbkhlaWdodCkgPiBfd2luLmlubmVySGVpZ2h0ICogMC4yNSkpICYmIF9yZXNpemVEZWxheS5yZXN0YXJ0KHRydWUpO1xufSxcbiAgICAvLyBpZ25vcmUgcmVzaXplcyB0cmlnZ2VyZWQgYnkgcmVmcmVzaCgpXG5fbGlzdGVuZXJzID0ge30sXG4gICAgX2VtcHR5QXJyYXkgPSBbXSxcbiAgICBfc29mdFJlZnJlc2ggPSBmdW5jdGlvbiBfc29mdFJlZnJlc2goKSB7XG4gIHJldHVybi
8110BfcmVtb3ZlTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJzY3JvbGxFbmRcIiwgX3NvZnRSZWZyZXNoKSB8fCBfcmVmcmVzaEFsbCh0cnVlKTtcbn0sXG4gICAgX2Rpc3BhdGNoID0gZnVuY3Rpb24gX2Rpc3BhdGNoKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnNbdHlwZV0gJiYgX2xpc3RlbmVyc1t0eXBlXS5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gZigpO1xuICB9KSB8fCBfZW1wdHlBcnJheTtcbn0sXG4gICAgX3NhdmVkU3R5bGVzID0gW10sXG4gICAgLy8gd2hlbiBTY3JvbGxUcmlnZ2VyLnNhdmVTdHlsZXMoKSBpcyBjYWxsZWQsIHRoZSBpbmxpbmUgc3R5bGVzIGFyZSByZWNvcmRlZCBpbiB0aGlzIEFycmF5IGluIGEgc2VxdWVudGlhbCBmb3JtYXQgbGlrZSBbZWxlbWVudCwgY3NzVGV4dCwgZ3NDYWNoZSwgbWVkaWFdLiBUaGlzIGtlZXBzIGl0IHZlcnkgbWVtb3J5LWVmZmljaWVudCBhbmQgZmFzdCB0byBpdGVyYXRlIHRocm91Z2guXG5fcmV2ZXJ0UmVjb3JkZWQgPSBmdW5jdGlvbiBfcmV2ZXJ0UmVjb3JkZWQobWVkaWEpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBfc2F2ZWRTdHlsZXMubGVuZ3RoOyBpICs9IDUpIHtcbiAgICBpZiAoIW1lZGlhIHx8IF9zYXZlZFN0eWxlc1tpICsgNF0gJiYgX3NhdmVkU3R5bGVzW2kgKyA0XS5xdWVyeSA9PT0gbWVkaWEpIHtcbiAgICAgIF9zYXZlZFN0eWxlc1tpXS5zdHlsZS5jc3NUZXh0ID0gX3NhdmVkU3R5bGVzW2kgKyAxXTtcbiAgICAgIF9zYXZlZFN0eWxlc1tpXS5nZXRCQm94ICYmIF9zYXZlZFN0eWxlc1tpXS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgX3NhdmVkU3R5bGVzW2kgKyAyXSB8fCBcIlwiKTtcbiAgICAgIF9zYXZlZFN0eWxlc1tpICsgM10udW5jYWNoZSA9IDE7XG4gICAgfVxuICB9XG59LFxuICAgIF9yZWNvcmRTY3JvbGxQb3NpdGlvbnMgPSBmdW5jdGlvbiBfcmVjb3JkU2Nyb2xsUG9zaXRpb25zKCkge1xuICByZXR1cm4gX3Njcm9sbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gX2lzRnVuY3Rpb24ob2JqKSAmJiArK29iai5jYWNoZUlEICYmIChvYmoucmVjID0gb2JqKCkpO1xuICB9KTtcbn0sXG4gICAgLy8gcmVjb3JkIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4gQWxzbyBmb3JjZSB0aGUgY2xlYXJpbmcgb2YgdGhlIGNhY2hlIGJlY2F1c2Ugc29tZSBicm93c2VycyB0YWtlIGEgbGl0dGxlIHdoaWxlIHRvIGRpc3BhdGNoIHRoZSBcInNjcm9sbFwiIGV2ZW50IGFuZCB0aGUgdXNlciBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIHRoZW4gY2FsbGVkIFNjcm9sbFRyaWdnZXIucmVmcmVzaCgpIHJpZ2h0IGF3YXlcbl9yZXZlcnRBbGwgPSBmdW5jdGlvbiBfcmV2ZXJ0QWxsKGtpbGwsIG1lZGlhKSB7XG4gIHZhciB0cmlnZ2VyO1xuXG4gIGZvciAoX2kgPSAwOyBfaSA8IF90cmlnZ2Vycy5sZW5ndGg7IF9pKyspIHtcbiAgICB0cmlnZ2VyID0gX3RyaWdnZXJzW19pXTtcblxuICAgIGlmICh0cmlnZ2VyICYmICghbWVkaWEgfHwgdHJpZ2dlci5fY3R4ID09PSBtZWRpYSkpIHtcbiAgICAgIGlmIChraWxsKSB7XG4gICAgICAgIHRyaWdnZXIua2lsbCgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXIucmV2ZXJ0KHRydWUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pc1JldmVydGVkID0gdHJ1ZTtcbiAgbWVkaWEgJiYgX3JldmVydFJlY29yZGVkKG1lZGlhKTtcbiAgbWVkaWEgfHwgX2Rpc3BhdGNoKFwicmV2ZXJ0XCIpO1xufSxcbiAgICBfY2xlYXJTY3JvbGxNZW1vcnkgPSBmdW5jdGlvbiBfY2xlYXJTY3JvbGxNZW1vcnkoc2Nyb2xsUmVzdG9yYXRpb24sIGZvcmNlKSB7XG4gIC8vIHplcm8tb3V0IGFsbCB0aGUgcmVjb3JkZWQgc2Nyb2xsIHBvc2l0aW9ucy4gRG9uJ3QgdXNlIF90cmlnZ2VycyBiZWNhdXNlIGlmLCBmb3IgZXhhbXBsZSwgLm1hdGNoTWVkaWEoKSBpcyB1c2VkIHRvIGNyZWF0ZSBzb21lIFNjcm9sbFRyaWdnZXJzIGFuZCB0aGVuIHRoZSB1c2VyIHJlc2l6ZXMgYW5kIGl0IHJlbW92ZXMgQUxMIFNjcm9sbFRyaWdnZXJzLCBhbmQgdGhlbiBnbyBiYWNrIHRvIGEgc2l6ZSB3aGVyZSB0aGVyZSBhcmUgU2Nyb2xsVHJpZ2dlcnMsIGl0IHdvdWxkIGhhdmUga2VwdCB0aGUgcG9zaXRpb24ocykgc2F2ZWQgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgX3Njcm9sbGVycy5jYWNoZSsrO1xuICAoZm9yY2UgfHwgIV9yZWZyZXNoaW5nQWxsKSAmJiBfc2Nyb2xsZXJzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBfaXNGdW5jdGlvbihvYmopICYmIG9iai5jYWNoZUlEKysgJiYgKG9iai5yZWMgPSAwKTtcbiAgfSk7XG4gIF9pc1N0cmluZyhzY3JvbGxSZXN0b3JhdGlvbikgJiYgKF93aW4uaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IF9zY3JvbGxSZXN0b3JhdGlvbiA9IHNjcm9sbFJlc3RvcmF0aW9uKTtcbn0sXG4gICAgX3JlZnJlc2hpbmdBbGwsXG4gICAgX3JlZnJlc2hJRCA9IDAsXG4gICAgX3F1ZXVlUmVmcmVzaElELFxuICAgIF9xdWV1ZVJlZnJlc2hBbGwgPSBmdW5jdGlvbiBfcXVldWVSZWZyZXNoQWxsKCkge1xuICAvLyB3ZSBkb24ndCB3YW50IHRvIGNhbGwgX3JlZnJlc2hBbGwoKSBldmVyeSB0aW1lIHdlIGNyZWF0ZSBhIG5ldyBTY3JvbGxUcmlnZ2VyIChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucykgLSBpdCdzIGJldHRlciB0byBiYXRjaCB0aGVtLiBTb21lIGZyYW1ld29ya3MgZHluYW1pY2FsbHkgbG9hZCBjb250ZW50IGFuZCB3ZSBjYW4ndCByZWx5IG9uIHRoZSB3aW5kb3cncyBcImxvYWRcIiBvciBcIkRPTUNvbnRlbnRMb2FkZWRcIiBldmVudHMgdG8gdHJpZ2dlciBpdC5cbiAgaWYgKF9xdWV1ZVJlZnJlc2hJRCAhPT0gX3JlZnJlc2hJRCkge1xuICAgIHZhciBpZCA9IF9xdWV1ZVJlZnJlc2hJRCA9IF9yZWZyZXNoSUQ7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZCA9PT0gX3JlZnJlc2hJRCAmJiBfcmVmcmVzaEFsbCh0cnVlKTtcbiAgICB9KTtcbiAgfVxufSxcbiAgICBfcmVmcmVzaDEwMHZoID0gZnVuY3Rpb24gX3JlZnJlc2gxMDB2aCgpIHtcbiAgX2JvZHkuYXBwZW5kQ2hpbGQoX2RpdjEwMHZoKTtcblxuICBfMTAwdmggPSAhX25vcm1hbGl6ZXIgJiYgX2RpdjEwMHZoLm9mZnNldEhlaWdodCB8fCBfd2luLmlubmVySGVpZ2h0O1xuXG4gIF9ib2R5LnJlbW92ZUNoaWxkKF9kaXYxMDB2aCk7XG59LFxuICAgIF9oaWRlQWxsTWFya2VycyA9IGZ1bmN0aW9uIF9oaWRlQWxsTWFya2VycyhoaWRlKSB7XG4gIHJldHVybi
8110BfdG9BcnJheShcIi5nc2FwLW1hcmtlci1zdGFydCwgLmdzYXAtbWFya2VyLWVuZCwgLmdzYXAtbWFya2VyLXNjcm9sbGVyLXN0YXJ0LCAuZ3NhcC1tYXJrZXItc2Nyb2xsZXItZW5kXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgcmV0dXJuIGVsLnN0eWxlLmRpc3BsYXkgPSBoaWRlID8gXCJub25lXCIgOiBcImJsb2NrXCI7XG4gIH0pO1xufSxcbiAgICBfcmVmcmVzaEFsbCA9IGZ1bmN0aW9uIF9yZWZyZXNoQWxsKGZvcmNlLCBza2lwUmV2ZXJ0KSB7XG4gIF9kb2NFbCA9IF9kb2MuZG9jdW1lbnRFbGVtZW50OyAvLyBzb21lIGZyYW1ld29ya3MgbGlrZSBBc3RybyBtYXkgY2FjaGUgdGhlIDxib2R5PiBhbmQgcmVwbGFjZSBpdCBkdXJpbmcgcm91dGluZywgc28gd2UnbGwganVzdCByZS1yZWNvcmQgdGhlIF9kb2NFbCBhbmQgX2JvZHkgZm9yIHNhZmV0eSAob3RoZXJ3aXNlLCB0aGUgbWFya2VycyBtYXkgbm90IGdldCBhZGRlZCBwcm9wZXJseSkuXG5cbiAgX2JvZHkgPSBfZG9jLmJvZHk7XG4gIF9yb290ID0gW193aW4sIF9kb2MsIF9kb2NFbCwgX2JvZHldO1xuXG4gIGlmIChfbGFzdFNjcm9sbFRpbWUgJiYgIWZvcmNlICYmICFfaXNSZXZlcnRlZCkge1xuICAgIF9hZGRMaXN0ZW5lcihTY3JvbGxUcmlnZ2VyLCBcInNjcm9sbEVuZFwiLCBfc29mdFJlZnJlc2gpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlZnJlc2gxMDB2aCgpO1xuXG4gIF9yZWZyZXNoaW5nQWxsID0gU2Nyb2xsVHJpZ2dlci5pc1JlZnJlc2hpbmcgPSB0cnVlO1xuICBfaXNSZXZlcnRlZCB8fCBfcmVjb3JkU2Nyb2xsUG9zaXRpb25zKCk7XG5cbiAgdmFyIHJlZnJlc2hJbml0cyA9IF9kaXNwYXRjaChcInJlZnJlc2hJbml0XCIpO1xuXG4gIF9zb3J0ICYmIFNjcm9sbFRyaWdnZXIuc29ydCgpO1xuICBza2lwUmV2ZXJ0IHx8IF9yZXZlcnRBbGwoKTtcblxuICBfc2Nyb2xsZXJzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChfaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICBvYmouc21vb3RoICYmIChvYmoudGFyZ2V0LnN0eWxlLnNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCIpOyAvLyBzbW9vdGggc2Nyb2xsaW5nIGludGVyZmVyZXNcblxuICAgICAgb2JqKDApO1xuICAgIH1cbiAgfSk7XG5cbiAgX3RyaWdnZXJzLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5yZWZyZXNoKCk7XG4gIH0pOyAvLyBkb24ndCBsb29wIHdpdGggX2kgYmVjYXVzZSBkdXJpbmcgYSByZWZyZXNoKCkgc29tZW9uZSBjb3VsZCBjYWxsIFNjcm9sbFRyaWdnZXIudXBkYXRlKCkgd2hpY2ggd291bGQgaXRlcmF0ZSB0aHJvdWdoIF9pIHJlc3VsdGluZyBpbiBhIHNraXAuXG5cblxuICBfaXNSZXZlcnRlZCA9IGZhbHNlO1xuXG4gIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgLy8gbmVzdGVkIHBpbnMgKHBpbm5lZENvbnRhaW5lcikgd2l0aCBwaW5TcGFjaW5nIG1heSBleHBhbmQgdGhlIGNvbnRhaW5lciwgc28gd2UgbXVzdCBhY2NvbW1vZGF0ZSB0aGF0IGhlcmUuXG4gICAgaWYgKHQuX3N1YlBpbk9mZnNldCAmJiB0LnBpbikge1xuICAgICAgdmFyIHByb3AgPSB0LnZhcnMuaG9yaXpvbn
8110RhbCA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCIsXG4gICAgICAgICAgb3JpZ2luYWwgPSB0LnBpbltwcm9wXTtcbiAgICAgIHQucmV2ZXJ0KHRydWUsIDEpO1xuICAgICAgdC5hZGp1c3RQaW5TcGFjaW5nKHQucGluW3Byb3BdIC0gb3JpZ2luYWwpO1xuICAgICAgdC5yZWZyZXNoKCk7XG4gICAgfVxuICB9KTtcblxuICBfY2xhbXBpbmdNYXggPSAxOyAvLyBwaW5TcGFjaW5nIG1pZ2h0IGJlIHByb3BwaW5nIGEgcGFnZSBvcGVuLCB0aHVzIHdoZW4gd2UgLnNldFBvc2l0aW9ucygpIHRvIGNsYW1wIGEgU2Nyb2xsVHJpZ2dlcidzIGVuZCB3ZSBzaG91bGQgbGVhdmUgdGhlIHBpblNwYWNpbmcgYWxvbmUuIFRoYXQncyB3aGF0IHRoaXMgZmxhZyBpcyBmb3IuXG5cbiAgX2hpZGVBbGxNYXJrZXJzKHRydWUpO1xuXG4gIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgLy8gdGhlIHNjcm9sbGVyJ3MgbWF4IHNjcm9sbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGFmdGVyIGFsbCB0aGUgU2Nyb2xsVHJpZ2dlcnMgcmVmcmVzaGVkIChsaWtlIHBpbm5pbmcgY291bGQgcHVzaCBpdCBkb3duKSwgc28gd2UgbmVlZCB0byBsb29wIGJhY2sgYW5kIGNvcnJlY3QgYW55IHdpdGggZW5kOiBcIm1heFwiLiBTYW1lIGZvciBhbnl0aGluZyB3aXRoIGEgY2xhbXBlZCBlbmRcbiAgICB2YXIgbWF4ID0gX21heFNjcm9sbCh0LnNjcm9sbGVyLCB0Ll9kaXIpLFxuICAgICAgICBlbmRDbGFtcCA9IHQudmFycy5lbmQgPT09IFwibWF4XCIgfHwgdC5fZW5kQ2xhbXAgJiYgdC5lbmQgPiBtYXgsXG4gICAgICAgIHN0YXJ0Q2xhbXAgPSB0Ll9zdGFydENsYW1wICYmIHQuc3RhcnQgPj0gbWF4O1xuXG4gICAgKGVuZENsYW1wIHx8IHN0YXJ0Q2xhbXApICYmIHQuc2V0UG9zaXRpb25zKHN0YXJ0Q2xhbXAgPyBtYXggLSAxIDogdC5zdGFydCwgZW5kQ2xhbXAgPyBNYXRoLm1heChzdGFydENsYW1wID8gbWF4IDogdC5zdGFydCArIDEsIG1heCkgOiB0LmVuZCwgdHJ1ZSk7XG4gIH0pO1xuXG4gIF9oaWRlQWxsTWFya2VycyhmYWxzZSk7XG5cbiAgX2NsYW1waW5nTWF4ID0gMDtcbiAgcmVmcmVzaEluaXRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LnJlbmRlciAmJiByZXN1bHQucmVuZGVyKC0xKTtcbiAgfSk7IC8vIGlmIHRoZSBvblJlZnJlc2hJbml0KCkgcmV0dXJucyBhbiBhbmltYXRpb24gKHR5cGljYWxseSBhIGdzYXAuc2V0KCkpLCByZXZlcnQgaXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBwdXQgdGhpbmdzIGluIGEgY2VydGFpbiBzcG90IGJlZm9yZSByZWZyZXNoaW5nIGZvciBtZWFzdXJlbWVudCBwdXJwb3NlcywgYW5kIHRoZW4gcHV0IHRoaW5ncyBiYWNrLlxuXG4gIF9zY3JvbGxlcnMuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgaWYgKF9pc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgIG9iai5zbW9vdGggJiYgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9iai50YXJnZXQuc3R5bGUuc2Nyb2xsQmVoYXZpb3IgPSBcInNtb290aFwiO1xuICAgICAgfSk7XG4gICAgICBvYmoucmVjICYmIG9iaihvYmoucmVjKTtcbiAgICB9XG4gIH0pO1xuXG4gIF9jbGVhclNjcm9sbE1lbW9yeShfc2Nyb2xsUmVzdG9yYXRpb24sIDEpO1xuXG4gIF9yZXNpemVEZWxheS5wYXVzZSgpO1xuXG4gIF9yZWZyZXNoSUQrKztcbiAgX3JlZnJlc2hpbmdBbGwgPSAyO1xuXG4gIF91cGRhdGVBbGwoMik7XG5cbiAgX3RyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gX2lzRnVuY3Rpb24odC52YXJzLm9uUmVmcmVzaCkgJiYgdC52YXJzLm9uUmVmcmVzaCh0KTtcbiAgfSk7XG5cbiAgX3JlZnJlc2hpbmdBbGwgPSBTY3JvbGxUcmlnZ2VyLmlzUmVmcmVzaGluZyA9IGZhbHNlO1xuXG4gIF9kaXNwYXRjaChcInJlZnJlc2hcIik7XG59LFxuICAgIF9sYXN0U2Nyb2xsID0gMCxcbiAgICBfZGlyZWN0aW9uID0gMSxcbiAgICBfcHJpbWFyeSxcbiAgICBfdXBkYXRlQWxsID0gZnVuY3Rpb24gX3VwZGF0ZUFsbChmb3JjZSkge1xuICBpZiAoZm9yY2UgPT09IDIgfHwgIV9yZWZyZXNoaW5nQWxsICYmICFfaXNSZXZlcnRlZCkge1xuICAgIC8vIF9pc1JldmVydGVkIGNvdWxkIGJlIHRydWUgaWYsIGZvciBleGFtcGxlLCBhIG1hdGNoTWVkaWEoKSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBleGVjdXRpbmcuIFdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIGR1cmluZyB0aGUgdGltZSBldmVyeXRoaW5nIGlzIHJldmVydGVkLlxuICAgIFNjcm9sbFRyaWdnZXIuaXNVcGRhdGluZyA9IHRydWU7XG4gICAgX3ByaW1hcnkgJiYgX3ByaW1hcnkudXBkYXRlKDApOyAvLyBTY3JvbGxTbW9vdGhlciB1c2VzIHJlZnJlc2hQcmlvcml0eSAtOTk5OSB0byBiZWNvbWUgdGhlIHByaW1hcnkgdGhhdCBnZXRzIHVwZGF0ZWQgYmVmb3JlIGFsbCBvdGhlcnMgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBzY3JvbGwgcG9zaXRpb24uXG5cbiAgICB2YXIgbCA9IF90cmlnZ2Vycy5sZW5ndGgsXG4gICAgICAgIHRpbWUgPSBfZ2V0VGltZSgpLFxuICAgICAgICByZWNvcmRWZWxvY2l0eSA9IHRpbWUgLSBfdGltZTEgPj0gNTAsXG4gICAgICAgIHNjcm9sbCA9IGwgJiYgX3RyaWdnZXJzWzBdLnNjcm9sbCgpO1xuXG4gICAgX2RpcmVjdGlvbiA9IF9sYXN0U2Nyb2xsID4gc2Nyb2xsID8gLTEgOiAxO1xuICAgIF9yZWZyZXNoaW5nQWxsIHx8IChfbGFzdFNjcm9sbCA9IHNjcm9sbCk7XG5cbiAgICBpZiAocmVjb3JkVmVsb2NpdHkpIHtcbiAgICAgIGlmIChfbGFzdFNjcm9sbFRpbWUgJiYgIV9wb2ludGVySXNEb3duICYmIHRpbWUgLSBfbGFzdFNjcm9sbFRpbWUgPiAyMDApIHtcbiAgICAgICAgX2xhc3RTY3JvbGxUaW1lID0gMDtcblxuICAgICAgICBfZGlzcGF0Y2goXCJzY3JvbGxFbmRcIik7XG4gICAgICB9XG5cbiAgICAgIF90aW1lMiA9IF90aW1lMTtcbiAgICAgIF90aW1lMSA9IHRpbWU7XG4gICAgfVxuXG4gICAgaWYgKF9kaXJlY3Rpb24gPCAwKSB7XG4gICAgICBfaSA9IGw7XG5cbiAgICAgIHdoaWxlIChfaS0tID4gMCkge1xuICAgICAgICBfdHJpZ2dlcnNbX2ldICYmIF90cmlnZ2Vyc1tfaV0udXBkYXRlKDAsIHJlY29yZFZlbG9jaXR5KTtcbiAgICAgIH1cblxuICAgICAgX2RpcmVjdGlvbiA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoX2kgPSAwOyBfaSA8IGw7IF9pKyspIHtcbiAgICAgICAgX3RyaWdnZXJzW19pXSAmJiBfdHJpZ2dlcnNbX2ldLnVwZGF0ZSgwLCByZWNvcmRWZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgU2Nyb2xsVHJpZ2dlci5pc1VwZGF0aW5nID0gZmFsc2U7XG4gIH1cblxuICBfcmFmSUQgPSAwO1xufSxcbiAgICBfcHJv
8110cE5hbWVzVG9Db3B5ID0gW19sZWZ0LCBfdG9wLCBfYm90dG9tLCBfcmlnaHQsIF9tYXJnaW4gKyBfQm90dG9tLCBfbWFyZ2luICsgX1JpZ2h0LCBfbWFyZ2luICsgX1RvcCwgX21hcmdpbiArIF9MZWZ0LCBcImRpc3BsYXlcIiwgXCJmbGV4U2hyaW5rXCIsIFwiZmxvYXRcIiwgXCJ6SW5kZXhcIiwgXCJncmlkQ29sdW1uU3RhcnRcIiwgXCJncmlkQ29sdW1uRW5kXCIsIFwiZ3JpZFJvd1N0YXJ0XCIsIFwiZ3JpZFJvd0VuZFwiLCBcImdyaWRBcmVhXCIsIFwianVzdGlmeVNlbGZcIiwgXCJhbGlnblNlbGZcIiwgXCJwbGFjZVNlbGZcIiwgXCJvcmRlclwiXSxcbiAgICBfc3RhdGVQcm9wcyA9IF9wcm9wTmFtZXNUb0NvcHkuY29uY2F0KFtfd2lkdGgsIF9oZWlnaHQsIFwiYm94U2l6aW5nXCIsIFwibWF4XCIgKyBfV2lkdGgsIFwibWF4XCIgKyBfSGVpZ2h0LCBcInBvc2l0aW9uXCIsIF9tYXJnaW4sIF9wYWRkaW5nLCBfcGFkZGluZyArIF9Ub3AsIF9wYWRkaW5nICsgX1JpZ2h0LCBfcGFkZGluZyArIF9Cb3R0b20sIF9wYWRkaW5nICsgX0xlZnRdKSxcbiAgICBfc3dhcFBpbk91dCA9IGZ1bmN0aW9uIF9zd2FwUGluT3V0KHBpbiwgc3BhY2VyLCBzdGF0ZSkge1xuICBfc2V0U3RhdGUoc3RhdGUpO1xuXG4gIHZhciBjYWNoZSA9IHBpbi5fZ3NhcDtcblxuICBpZiAoY2FjaGUuc3BhY2VySXNOYXRpdmUpIHtcbiAgICBfc2V0U3RhdGUoY2FjaGUuc3BhY2VyU3RhdGUpO1xuICB9IGVsc2UgaWYgKHBpbi5fZ3NhcC5zd2FwcGVkSW4pIHtcbiAgICB2YXIgcGFyZW50ID0gc3BhY2VyLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHBpbiwgc3BhY2VyKTtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChzcGFjZXIpO1xuICAgIH1cbiAgfVxuXG4gIHBpbi5fZ3NhcC5zd2FwcGVkSW4gPSBmYWxzZTtcbn0sXG4gICAgX3N3YXBQaW5JbiA9IGZ1bmN0aW9uIF9zd2FwUGluSW4ocGluLCBzcGFjZXIsIGNzLCBzcGFjZXJTdGF0ZSkge1xuICBpZiAoIXBpbi5fZ3NhcC5zd2FwcGVkSW4pIHtcbiAgICB2YXIgaSA9IF9wcm9wTmFtZXNUb0NvcHkubGVuZ3RoLFxuICAgICAgICBzcGFjZXJTdHlsZSA9IHNwYWNlci5zdHlsZSxcbiAgICAgICAgcGluU3R5bGUgPSBwaW4uc3R5bGUsXG4gICAgICAgIHA7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBwID0gX3Byb3BOYW1lc1RvQ29weVtpXTtcbiAgICAgIHNwYWNlclN0eWxlW3BdID0gY3NbcF07XG4gICAgfVxuXG4gICAgc3BhY2VyU3R5bGUucG9zaXRpb24gPSBjcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiID8gXCJhYnNvbHV0ZVwiIDogXCJyZWxhdGl2ZVwiO1xuICAgIGNzLmRpc3BsYXkgPT09IFwiaW5saW5lXCIgJiYgKHNwYWNlclN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiKTtcbiAgICBwaW5TdHlsZVtfYm90dG9tXSA9IHBpblN0eWxlW19yaWdodF0gPSBcImF1dG9cIjtcbiAgICBzcGFjZXJTdHlsZS5mbGV4QmFzaXMgPSBjcy5mbGV4QmFzaXMgfHwgXCJhdXRvXCI7XG4gICAgc3BhY2VyU3R5bGUub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcbiAgICBzcGFjZXJTdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcbiAgICBzcGFjZXJTdHlsZVtfd2lkdGhdID0gX2dldFNpemUocGluLCBfaG9yaXpvbnRhbCkgKyBfcHg7XG4gICAgc3BhY2VyU3R5bGVbX2hlaWdodF0gPSBfZ2V0U2l6ZShwaW4sIF92ZXJ0aWNhbCkgKyBfcHg7XG4gICAgc3BhY2VyU3R5bGVbX3BhZGRpbmddID0gcGluU3R5bGVbX21hcmdpbl0gPSBwaW5TdHlsZVtfdG9wXSA9IHBpblN0eWxlW19sZWZ0XSA9IFwiMFwiO1xuXG4gICAgX3NldFN0YXRlKHNwYWNlclN0YXRlKTtcblxuICAgIHBpblN0eWxlW193aWR0aF0gPSBwaW5TdHlsZVtcIm1heFwiICsgX1dpZHRoXSA9IGNzW193aWR0aF07XG4gICAgcGluU3R5bGVbX2hlaWdodF0gPSBwaW5TdHlsZVtcIm1heFwiICsgX0hlaWdodF0gPSBjc1tfaGVpZ2h0XTtcbiAgICBwaW5TdHlsZVtfcGFkZGluZ10gPSBjc1tfcGFkZGluZ107XG5cbiAgICBpZiAocGluLnBhcmVudE5vZGUgIT09IHNwYWNlcikge1xuICAgICAgcGluLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNwYWNlciwgcGluKTtcbiAgICAgIHNwYWNlci5hcHBlbmRDaGlsZChwaW4pO1xuICAgIH1cblxuICAgIHBpbi5fZ3NhcC5zd2FwcGVkSW4gPSB0cnVlO1xuICB9XG59LFxuICAgIF9jYXBzRXhwID0gLyhbQS1aXSkvZyxcbiAgICBfc2V0U3RhdGUgPSBmdW5jdGlvbiBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgaWYgKHN0YXRl
8110KSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUudC5zdHlsZSxcbiAgICAgICAgbCA9IHN0YXRlLmxlbmd0aCxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHAsXG4gICAgICAgIHZhbHVlO1xuICAgIChzdGF0ZS50Ll9nc2FwIHx8IGdzYXAuY29yZS5nZXRDYWNoZShzdGF0ZS50KSkudW5jYWNoZSA9IDE7IC8vIG90aGVyd2lzZSB0cmFuc2Zvcm1zIG1heSBiZSBvZmZcblxuICAgIGZvciAoOyBpIDwgbDsgaSArPSAyKSB7XG4gICAgICB2YWx1ZSA9IHN0YXRlW2kgKyAxXTtcbiAgICAgIHAgPSBzdGF0ZVtpXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHN0eWxlW3BdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlW3BdKSB7XG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KHAucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59LFxuICAgIF9nZXRTdGF0ZSA9IGZ1bmN0aW9uIF9nZXRTdGF0ZShlbGVtZW50KSB7XG4gIC8vIHJldHVybnMgYW4gQXJyYXkgd2l0aCBhbHRlcm5hdGluZyB2YWx1ZXMgbGlrZSBbcHJvcGVydHksIHZhbHVlLCBwcm9wZXJ0eSwgdmFsdWVdIGFuZCBhIFwidFwiIHByb3BlcnR5IHBvaW50aW5nIHRvIHRoZSB0YXJnZXQgKGVsZW1lbnQpLiBNYWtlcyBpdCBmYXN0IGFuZCBjaGVhcC5cbiAgdmFyIGwgPSBfc3RhdGVQcm9wcy5sZW5ndGgsXG4gICAgICBzdHlsZSA9IGVsZW1lbnQuc3R5bGUsXG4gICAgICBzdGF0ZSA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBzdGF0ZS5wdXNoKF9zdGF0ZVByb3BzW2ldLCBzdHlsZVtfc3RhdGVQcm9wc1tpXV0pO1xuICB9XG5cbiAgc3RhdGUudCA9IGVsZW1lbnQ7XG4gIHJldHVybiBzdGF0ZTtcbn0sXG4gICAgX2NvcHlTdGF0ZSA9IGZ1bmN0aW9uIF9jb3B5U3RhdGUoc3RhdGUsIG92ZXJyaWRlLCBvbWl0T2Zmc2V0cykge1xuICB2YXIgcmVzdWx0ID0gW10sXG4gICAgICBsID0gc3RhdGUubGVuZ3RoLFxuICAgICAgaSA9IG9taXRPZmZzZXRzID8gOCA6IDAsXG4gICAgICAvLyBza2lwIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBpZiBvbWl0T2Zmc2V0cyBpcyB0cnVlXG4gIHA7XG5cbiAgZm9yICg7IGkgPCBsOyBpICs9IDIpIHtcbiAgICBwID0gc3RhdGVbaV07XG4gICAgcmVzdWx0LnB1c2gocCwgcCBpbiBvdmVycmlkZSA/IG92ZXJyaWRlW3BdIDogc3RhdGVbaSArIDFdKTtcbiAgfVxuXG4gIHJlc3VsdC50ID0gc3RhdGUudDtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sXG4gICAgX3dpbk9mZnNldHMgPSB7XG4gIGxlZnQ6IDAsXG4gIHRvcDogMFxufSxcbiAgICAvLyAvLyBwb3RlbnRpYWwgZnV0dXJlIGZlYXR1cmUgKD8pIEFsbG93IHVzZXJzIHRvIGNhbGN1bGF0ZSB3aGVyZSBhIHRyaWdnZXIgaGl0cyAoc2Nyb2xsIHBvc2l0aW9uKSBsaWtlIGdldFNjcm9sbFBvc2l0aW9uKFwiI2lkXCIsIFwidG9wIGJvdHRvbVwiKVxuLy8gX2dldFNjcm9sbFBvc2l0aW9uID0gKHRyaWdnZXIsIHBvc2l0aW9uLCB7c2Nyb2xsZXIsIGNvbnRhaW5lckFuaW1hdGlvbiwgaG9yaXpvbnRhbH0pID0+IHtcbi8vIFx0c2Nyb2xsZXIgPSBfZ2V0VGFyZ2V0KHNjcm9sbGVyIHx8IF93aW4pO1xuLy8gXHRsZXQgZGlyZWN0aW9uID0gaG9yaXpvbnRhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsLFxuLy8gXHRcdGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydChzY3JvbGxlcik7XG4vLyBcdF9nZXRTaXplRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCwgZGlyZWN0aW9uKTtcbi8vIFx0cmV0dXJuIF9wYXJzZVBvc2l0aW9uKHBvc2l0aW9uLCBfZ2V0VGFyZ2V0KHRyaWdnZXIpLCBfZ2V0U2l6ZUZ1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQsIGRpcmVjdGlvbikoKSwgZGlyZWN0aW9uLCBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgZGlyZWN0aW9uKSgpLCAwLCAwLCAwLCBfZ2V0T2Zmc2V0c0Z1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQpKCksIGlzVmlld3BvcnQgPyAwIDogcGFyc2VGbG9hdChfZ2V0Q29tcHV0ZWRTdHlsZShzY3JvbGxlcilbXCJib3JkZXJcIiArIGRpcmVjdGlvbi5wMiArIF9XaWR0aF0pIHx8IDAsIDAsIGNvbnRhaW5lckFuaW1hdGlvbiA/IGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpIDogX21heFNjcm9sbChzY3JvbGxlciksIGNvbnRhaW5lckFuaW1hdGlvbik7XG4vLyB9LFxuX3BhcnNlUG9zaXRpb24gPSBmdW5jdGlvbiBfcGFyc2VQb3NpdGlvbih2YWx1ZSwgdHJpZ2dlciwgc2Nyb2xsZXJTaXplLCBkaXJlY3Rpb24sIHNjcm9sbCwgbWFya2VyLCBtYXJrZXJTY3JvbGxlciwgc2VsZiwgc2Nyb2xsZXJCb3VuZHMsIGJvcmRlcldpZHRoLCB1c2VGaXhlZFBvc2l0aW9uLCBzY3JvbGxlck1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBjbGFtcFplcm9Qcm9wKSB7XG4gIF9pc0Z1bmN0aW9uKHZhbHVlKSAmJiAodmFsdWUgPSB2YWx1ZShzZWxmKSk7XG5cbiAgaWYgKF9pc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUuc3Vic3RyKDAsIDMpID09PSBcIm1heFwiKSB7XG4gICAgdmFsdWUgPSBzY3JvbGxlck1heCArICh2YWx1ZS5jaGFyQXQoNCkgPT09IFwiPVwiID8gX29mZnNldFRvUHgoXCIwXCIgKyB2YWx1ZS5zdWJzdHIoMyksIHNjcm9sbGVyU2l6ZSkgOiAwKTtcbiAgfVxuXG4gIHZhciB0aW1lID0gY29udGFpbmVyQW5pbWF0aW9uID8gY29udGFpbmVyQW5pbWF0aW9uLnRpbWUoKSA6IDAsXG4gICAgICBwMSxcbiAgICAgIHAyLFxuICAgICAgZWxlbWVudDtcbiAgY29udGFpbmVyQW5pbWF0aW9uICYmIGNvbnRhaW5lckFuaW1hdGlvbi5zZWVrKDApO1xuICBpc05hTih2YWx1ZSkgfHwgKHZhbHVlID0gK3ZhbHVlKTsgLy8gY29udmVydCBhIHN0cmluZyBudW1iZXIgbGlrZSBcIjQ1XCIgdG8gYW4gYWN0dWFsIG51bWJlclxuXG4gIGlmICghX2lzTnVtYmVyKHZhbHVlKSkge1xuICAgIF9pc0Z1bmN0aW9uKHRyaWdnZXIpICYmICh0cmlnZ2VyID0gdHJpZ2dlcihzZWxmKSk7XG4gICAgdmFyIG9mZnNldHMgPSAodmFsdWUgfHwgXCIwXCIpLnNwbGl0KFwiIFwiKSxcbiAgICAgICAgYm91bmRzLFxuICAgICAgICBsb2NhbE9mZnNldCxcbiAgICAgICAgZ2xvYmFsT2Zmc2V0LFxuICAgICAgICBkaXNwbGF5O1xuICAgIGVsZW1lbnQgPSBfZ2V0VGFyZ2V0KHRyaWdnZXIsIHNlbGYpIHx8IF9ib2R5O1xuICAgIGJvdW5kcyA9IF9nZXRCb3VuZHMoZWxlbWVudCkgfHwge307XG5cbiAgICBpZiAoKCFib3VuZHMgfHwgIWJvdW5kcy5sZWZ0ICYmICFib3VuZHMudG9wKSAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgLy8gaWYgZGlzcGxheSBpcyBcIm5vbmVcIiwgaXQgd29uJ3QgcmVwb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHByb3Blcmx5XG4gICAgICBkaXNwbGF5ID0gZWxlbWVudC5zdHlsZS5kaXNwbGF5O1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgYm91bmRzID0gX2dldEJvdW5kcyhlbGVtZW50KTtcbiAgICAgIGRpc3BsYXkgPyBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5IDogZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcImRpc3BsYXlcIik7XG4gICAgfVxuXG4gICAgbG9jYWxPZmZzZXQgPSBfb2Zmc2V0VG9QeChvZmZzZXRzWzBdLCBib3VuZHNbZGlyZWN0aW9uLmRdKTtcbiAgICBnbG9iYWxPZmZzZXQgPSBfb2Zmc2V0VG9QeChvZmZzZXRzWzFdIHx8IFwiMFwiLCBzY3JvbGxlclNpemUpO1xuICAgIHZhbHVlID0gYm91bmRzW2R
8110pcmVjdGlvbi5wXSAtIHNjcm9sbGVyQm91bmRzW2RpcmVjdGlvbi5wXSAtIGJvcmRlcldpZHRoICsgbG9jYWxPZmZzZXQgKyBzY3JvbGwgLSBnbG9iYWxPZmZzZXQ7XG4gICAgbWFya2VyU2Nyb2xsZXIgJiYgX3Bvc2l0aW9uTWFya2VyKG1hcmtlclNjcm9sbGVyLCBnbG9iYWxPZmZzZXQsIGRpcmVjdGlvbiwgc2Nyb2xsZXJTaXplIC0gZ2xvYmFsT2Zmc2V0IDwgMjAgfHwgbWFya2VyU2Nyb2xsZXIuX2lzU3RhcnQgJiYgZ2xvYmFsT2Zmc2V0ID4gMjApO1xuICAgIHNjcm9sbGVyU2l6ZSAtPSBzY3JvbGxlclNpemUgLSBnbG9iYWxPZmZzZXQ7IC8vIGFkanVzdCBmb3IgdGhlIG1hcmtlclxuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lckFuaW1hdGlvbiAmJiAodmFsdWUgPSBnc2FwLnV0aWxzLm1hcFJhbmdlKGNvbnRhaW5lckFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyLnN0YXJ0LCBjb250YWluZXJBbmltYXRpb24uc2Nyb2xsVHJpZ2dlci5lbmQsIDAsIHNjcm9sbGVyTWF4LCB2YWx1ZSkpO1xuICAgIG1hcmtlclNjcm9sbGVyICYmIF9wb3NpdGlvbk1hcmtlcihtYXJrZXJTY3JvbGxlciwgc2Nyb2xsZXJTaXplLCBkaXJlY3Rpb24sIHRydWUpO1xuICB9XG5cbiAgaWYgKGNsYW1wWmVyb1Byb3ApIHtcbiAgICBzZWxmW2NsYW1wWmVyb1Byb3BdID0gdmFsdWUgfHwgLTAuMDAxO1xuICAgIHZhbHVlIDwgMCAmJiAodmFsdWUgPSAwKTtcbiAgfVxuXG4gIGlmIChtYXJrZXIpIHtcbiAgICB2YXIgcG9zaXRpb24gPSB2YWx1ZSArIHNjcm9sbGVyU2l6ZSxcbiAgICAgICAgaXNTdGFydCA9IG1hcmtlci5faXNTdGFydDtcbiAgICBwMSA9IFwic2Nyb2xsXCIgKyBkaXJlY3Rpb24uZDI7XG5cbiAgICBfcG9zaXRpb25NYXJrZXIobWFya2VyLCBwb3NpdGlvbiwgZGlyZWN0aW9uLCBpc1N0YXJ0ICYmIHBvc2l0aW9uID4gMjAgfHwgIWlzU3RhcnQgJiYgKHVzZUZpeGVkUG9zaXRpb24gPyBNYXRoLm1heChfYm9keVtwMV0sIF9kb2NFbFtwMV0pIDogbWFya2VyLnBhcmVudE5vZGVbcDFdKSA8PSBwb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKHVzZUZpeGVkUG9zaXRpb24pIHtcbiAgICAgIHNjcm9sbGVyQm91bmRzID0gX2dldEJvdW5kcyhtYXJrZXJTY3JvbGxlcik7XG4gICAgICB1c2VGaXhlZFBvc2l0aW9uICYmIChtYXJrZXIuc3R5bGVbZGlyZWN0aW9uLm9wLnBdID0gc2Nyb2xsZXJCb3VuZHNbZGlyZWN0aW9uLm9wLnBdIC0gZGlyZWN0aW9uLm9wLm0gLSBtYXJrZXIuX29mZnNldCArIF9weCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lckFuaW1hdGlvbiAmJiBlbGVtZW50KSB7XG4gICAgcDEgPSBfZ2V0Qm91bmRzKGVsZW1lbnQpO1xuICAgIGNvbnRhaW5lckFuaW1hdGlvbi5zZWVrKHNjcm9sbGVyTWF4KTtcbiAgICBwMiA9IF9nZXRCb3VuZHMoZWxlbWVudCk7XG4gICAgY29udGFpbmVyQW5pbWF0aW9uLl9jYVNjcm9sbERpc3QgPSBwMVtkaXJlY3Rpb24ucF0gLSBwMltkaXJlY3Rpb24ucF07XG4gICAgdmFsdWUgPSB2YWx1ZSAvIGNvbnRhaW5lckFuaW1hdGlvbi5fY2FTY3JvbGxEaXN0ICogc2Nyb2xsZXJNYXg7XG4gIH1cblxuICBjb250YWluZXJBbmltYXRpb24gJiYgY29udGFpbmVyQW5pbWF0aW9uLnNlZWsodGltZSk7XG4gIHJldHVybiBjb250YWluZXJBbmltYXRpb24gPyB2YWx1ZSA6IE1hdGgucm91bmQodmFsdWUpO1xufSxcbiAgICBfcHJlZml4RXhwID0gLyh3ZWJraXR8bW96fGxlbmd0aHxjc3NUZXh0fGluc2V0KS9pLFxuICAgIF9yZXBhcmVudCA9IGZ1bmN0aW9uIF9yZXBhcmVudChlbGVtZW50LCBwYXJlbnQsIHRvcCwgbGVmdCkge1xuICBpZiAoZWxlbWVudC5wYXJlbnROb2RlICE9PSBwYXJlbnQpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGVtZW50LnN0eWxlLFxuICAgICAgICBwLFxuICAgICAgICBjcztcblxuICAgIGlmIChwYXJlbnQgPT09IF9ib2R5KSB7XG4gICAgICBlbGVtZW50Ll9zdE9yaWcgPSBzdHlsZS5jc3NUZXh0OyAvLyByZWNvcmQgb3JpZ2luYWwgaW5saW5lIHN0eWxlcyBzbyB3ZSBjYW4gcmV2ZXJ0IHRoZW0gbGF0ZXJcblxuICAgICAgY3MgPSBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgICAgZm9yIChwIGluIGNzKSB7XG4gICAgICAgIC8vIG11c3QgY29weSBhbGwgcmVsZXZhbnQgc3R5bGVzIHRvIGVuc3VyZSB0aGF0IG5vdGhpbmcgY2hhbmdlcyB2aXN1YWxseSB3aGVuIHdlIHJlcGFyZW50IHRvIHRoZSA8Ym9keT4uIFNraXAgdGhlIHZlbmRvciBwcmVmaXhlZCBvbmVzLlxuICAgICAgICBpZiAoIStwICYmICFfcHJlZml4RXhwLnRlc3QocCkgJiYgY3NbcF0gJiYgdHlwZW9mIHN0eWxlW3BdID09PSBcInN0cmluZ1wiICYmIHAgIT09IFwiMFwiKSB7XG4gICAgICAgICAgc3R5bGVbcF0gPSBjc1twXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdHlsZS50b3AgPSB0b3A7XG4gICAgICBzdHlsZS5sZWZ0ID0gbGVmdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuY3NzVGV4dCA9IGVsZW1lbnQuX3N0T3JpZztcbiAgICB9XG5cbiAgICBnc2FwLmNvcmUuZ2V0Q2FjaGUoZWxlbWVudCkudW5jYWNoZSA9IDE7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICB9XG59LFxuICAgIF9pbnRlcnJ1cHRpb25UcmFja2VyID0gZnVuY3Rpb24gX2ludGVycnVwdGlvblRyYWNrZXIoZ2V0VmFsdWVGdW5jLCBpbml0aWFsVmFsdWUsIG9uSW50ZXJydXB0KSB7XG4gIHZhciBsYXN0MSA9IGluaXRpYWxWYWx1ZSxcbiAgICAgIGxhc3QyID0gbGFzdDE7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQoZ2V0VmFsdWVGdW5jKCkpOyAvLyByb3VuZCBiZWNhdXNlIGluIHNvbWUgW3ZlcnkgdW5jb21tb25dIFdpbmRvd3MgZW52aXJvbm1lbnRzLCBzY3JvbGwgY2FuIGdldCByZXBvcnRlZCB3aXRoIGRlY2ltYWxzIGV2ZW4gdGhvdWdoIGl0IHdhcyBzZXQgd2l0aG91dC5cblxuICAgIGlmIChjdXJyZW50ICE9PSBsYXN0MSAmJiBjdXJyZW50ICE9PSBsYXN0MiAmJiBNYXRoLmFicyhjdXJyZW50IC0gbGFzdDEpID4gMyAmJiBNYXRoLmFicyhjdXJyZW50IC0gbGFzdDIpID4gMykge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgc2Nyb2xscywga2lsbCB0aGUgdHdlZW4uIGlPUyBTYWZhcmkgaW50ZXJtaXR0ZW50bHkgbWlzcmVwb3J0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBpdCBtYXkgYmUgdGhlIG1vc3QgcmVjZW50bHktc2V0IG9uZSBvciB0aGUgb25lIGJlZm9yZSB0aGF0ISBXaGVuIFNhZmFyaSBpcyB6b29tZWQgKENNRC0rKSwgaXQgb2Z0ZW4gbWlzcmVwb3J0cyBhcyAxIHBpeGVsIG9mZiB0b28hIFNvIGlmIHdlIHNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIHRvIDEyNSwgZm9yIGV4YW1wbGUsIGl0J2xsIGFjdHVhbGx5IHJlcG9ydCBpdCBhcyAxMjQuXG4gICAgICB2YWx1ZSA9IGN1cnJlbnQ7XG4gICAgICBvbkludGVycnVwdCAmJiBvbkludGVycnVwdCgpO1xuICAgIH1cblxuICAgIGxhc3QyID0gbGFzdDE7XG4gICAgbGFzdDEgPSBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICByZXR1cm4gbGFzdDE7XG4gIH07XG59LFxuICAgIF9zaGlmdE1hcmtlciA9IGZ1bmN0aW9uIF9zaGlmdE1hcmtlcihtYXJrZXIsIGRpcmVjdGlvbiwgdmFsdWUpIHtcbiAgdmFyIHZhcnMgPSB7fTtcbiAgdmFyc1tkaXJlY3Rpb24ucF0gPSBcIis9XCIgKyB2YWx1ZTtcbiAgZ3NhcC5zZXQobWFya2VyLCB2YXJzKTtcbn0sXG4gICAgLy8gX21lcmdlQW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMgPT4ge1xuLy8gXHRsZXQgdGwgPSBnc2FwLnRpbWVsaW5lKHtzbW9vdGhDaGlsZFRpbWluZzogdHJ1ZX0pLnN0YXJ0VGltZShNYXRoLm1pbiguLi5hbmltYXRpb25zLm1hcChhID0+IGEuZ2xvYmFsVGltZSgwKSkpKTtcbi8vIFx0YW5pbWF0aW9ucy5mb3JFYWNoKGEgPT4ge2xldCB0aW1lID0gYS50b3RhbFRpbWUoKTsgdGwuYWRkKGEpOyBhLnRvdGFsVGltZS
8110h0aW1lKTsgfSk7XG4vLyBcdHRsLnNtb290aENoaWxkVGltaW5nID0gZmFsc2U7XG4vLyBcdHJldHVybiB0bDtcbi8vIH0sXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byB0d2VlbiB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBkaXJlY3Rpb24gcHJvdmlkZWQsIGFuZCB3aGVuIGRvaW5nIHNvIGl0J2xsIGFkZCBhIC50d2VlbiBwcm9wZXJ0eSB0byB0aGUgRlVOQ1RJT04gaXRzZWxmLCBhbmQgcmVtb3ZlIGl0IHdoZW4gdGhlIHR3ZWVuIGNvbXBsZXRlcyBvciBnZXRzIGtpbGxlZC4gVGhpcyBnaXZlcyB1cyBhIHdheSB0byBoYXZlIG11bHRpcGxlIFNjcm9sbFRyaWdnZXJzIHVzZSBhIGNlbnRyYWwgZnVuY3Rpb24gZm9yIGFueSBnaXZlbiBzY3JvbGxlciBhbmQgc2VlIGlmIHRoZXJlJ3MgYSBzY3JvbGwgdHdlZW4gcnVubmluZyAod2hpY2ggd291bGQgYWZmZWN0IGlmL2hvdyB0aGluZ3MgZ2V0IHVwZGF0ZWQpXG5fZ2V0VHdlZW5DcmVhdG9yID0gZnVuY3Rpb24gX2dldFR3ZWVuQ3JlYXRvcihzY3JvbGxlciwgZGlyZWN0aW9uKSB7XG4gIHZhciBnZXRTY3JvbGwgPSBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgZGlyZWN0aW9uKSxcbiAgICAgIHByb3AgPSBcIl9zY3JvbGxcIiArIGRpcmVjdGlvbi5wMixcbiAgICAgIC8vIGFkZCBhIHR3ZWVuYWJsZSBwcm9wZXJ0eSB0byB0aGUgc2Nyb2xsZXIgdGhhdCdzIGEgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiwgbGlrZSBfc2Nyb2xsVG9wIG9yIF9zY3JvbGxMZWZ0LiBUaGlzIHdheSwgaWYgc29tZW9uZSBkb2VzIGdzYXAua2lsbFR3ZWVuc09mKHNjcm9sbGVyKSBpdCdsbCBraWxsIHRoZSBzY3JvbGwgdHdlZW4uXG4gIGdldFR3ZWVuID0gZnVuY3Rpb24gZ2V0VHdlZW4oc2Nyb2xsVG8sIHZhcnMsIGluaXRpYWxWYWx1ZSwgY2hhbmdlMSwgY2hhbmdlMikge1xuICAgIHZhciB0d2VlbiA9IGdldFR3ZWVuLnR3ZWVuLFxuICAgICAgICBvbkNvbXBsZXRlID0gdmFycy5vbkNvbXBsZXRlLFxuICAgICAgICBtb2RpZmllcnMgPSB7fTtcbiAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUgfHwgZ2V0U2Nyb2xsKCk7XG5cbiAgICB2YXIgY2hlY2tGb3JJbnRlcnJ1cHRpb24gPSBfaW50ZXJydXB0aW9uVHJhY2tlcihnZXRTY3JvbGwsIGluaXRpYWxWYWx1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgdHdlZW4ua2lsbCgpO1xuICAgICAgZ2V0VHdlZW4udHdlZW4gPSAwO1xuICAgIH0pO1xuXG4gICAgY2hhbmdlMiA9IGNoYW5nZTEgJiYgY2hhbmdlMiB8fCAwOyAvLyBpZiBjaGFuZ2UxIGlzIDAsIHdlIHNldCB0aGF0IHRvIHRoZSBkaWZmZXJlbmNlIGFuZCBpZ25vcmUgY2hhbmdlMi4gT3RoZXJ3aXNlLCB0aGVyZSB3b3VsZCBiZSBhIGNvbXBvdW5kIGVmZmVjdC5cblxuICAgIGNoYW5nZTEgPSBjaGFuZ2UxIHx8IHNjcm9sbFRvIC0gaW5pdGlhbFZhbHVlO1xuICAgIHR3ZWVuICYmIHR3ZWVuLmtpbGwoKTtcbiAgICB2YXJzW3Byb3BdID0gc2Nyb2xsVG87XG4gICAgdmFycy5pbmhlcml0ID0gZmFsc2U7XG4gICAgdmFycy5tb2RpZmllcnMgPSBtb2RpZmllcnM7XG5cbiAgICBtb2RpZmllcnNbcHJvcF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2hlY2tGb3JJbnRlcnJ1cHRpb24oaW5pdGlhbFZhbHVlICsgY2hhbmdlMSAqIHR3ZWVuLnJhdGlvICsgY2hhbmdlMiAqIHR3ZWVuLnJhdGlvICogdHdlZW4ucmF0aW8pO1xuICAgIH07XG5cbiAgICB2YXJzLm9uVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3Njcm9sbGVycy5jYWNoZSsrO1xuICAgICAgZ2V0VHdlZW4udHdlZW4gJiYgX3VwZGF0ZUFsbCgpOyAvLyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQva2lsbGVkLCBsaWtlIGluIGEgY29udGV4dC5yZXZlcnQoKSwgZG9uJ3QgZm9yY2UgYW4gdXBkYXRlQWxsKClcbiAgICB9O1xuXG4gICAgdmFycy5vbkNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0VHdlZW4udHdlZW4gPSAwO1xuICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlLmNhbGwodHdlZW4pO1xuICAgIH07XG5cbiAgICB0d2VlbiA9IGdldFR3ZWVuLnR3ZWVuID0gZ3NhcC50byhzY3JvbGxlciwgdmFycyk7XG4gICAgcmV0dXJuIHR3ZWVuO1xuICB9O1xuXG4gIHNjcm9sbGVyW3Byb3BdID0gZ2V0U2Nyb2xsO1xuXG4gIGdldFNjcm9sbC53aGVlbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFR3ZWVuLnR3ZWVuICYmIGdldFR3ZWVuLnR3ZWVuLmtpbGwoKSAmJiAoZ2V0VHdlZW4udHdlZW4gPSAwKTtcbiAgfTtcblxuICBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwid2hlZWxcIiwgZ2V0U2Nyb2xsLndoZWVsSGFuZGxlcik7IC8vIFdpbmRvd3MgbWFjaGluZXMgaGFuZGxlIG1vdXNld2hlZWwgc2Nyb2xsaW5nIGluIGNodW5rcyAobGlrZSBcIjMgbGluZXMgcGVyIHNjcm9sbFwiKSBtZWFuaW5nIHRoZSB0eXBpY2FsIHN0cmF0ZWd5IGZvciBjYW5jZWxsaW5nIHRoZSBzY3JvbGwgaXNuJ3QgYXMgc2Vuc2l0aXZlLiBJdCdzIG11Y2ggbW9yZSBsaWtlbHkgdG8gbWF0Y2ggb25lIG9mIHRoZSBwcmV2aW91cyAyIHNjcm9sbCBldmVudCBwb3NpdGlvbnMuIFNvIHdlIGtpbGwgYW55IHNuYXBwaW5nIGFzIHNvb24gYXMgdGhlcmUncyBhIHdoZWVsIGV2ZW50LlxuXG5cbiAgU2Nyb2xsVHJpZ2dlci5pc1RvdWNoICYmIF9hZGRMaXN0ZW5lcihzY3JvbGxlciwgXCJ0b3VjaG1vdmVcIiwgZ2V0U2Nyb2xsLndoZWVsSGFuZGxlcik7XG4gIHJldHVybiBnZXRUd2Vlbjtcbn07XG5cbmV4cG9ydCB2YXIgU2Nyb2xsVHJpZ2dlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNjcm9sbFRyaWdnZXIodmFycywgYW5pbWF0aW9uKSB7XG4gICAgX2NvcmVJbml0dGVkIHx8IFNjcm9sbFRyaWdnZXIucmVnaXN0ZXIoZ3NhcCkgfHwgY29uc29sZS53YXJuKFwiUGxlYXNlIGdzYXAucmVnaXN0ZXJQbHVnaW4oU2Nyb2xsVHJpZ2dlcilcIik7XG5cbiAgICBfY29udGV4dCh0aGlzKTtcblxuICAgIHRoaXMuaW5pdCh2YXJzLCBhbmltYXRpb24pO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNjcm9sbFRyaWdnZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbml0ID0gZnVuY3Rpb24gaW5pdCh2YXJzLCBhbmltYXRpb24pIHtcbiAgICB0aGlzLnByb2dyZXNzID0gdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy52YXJzICYmIHRoaXMua2lsbCh0cnVlLCB0cnVlKTsgLy8gaW4gY2FzZSBpdCdzIGJlaW5nIGluaXR0ZWQgYWdhaW5cblxuICAgIGlmICghX2VuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlID0gdGhpcy5yZWZyZXNoID0gdGh
8110pcy5raWxsID0gX3Bhc3NUaHJvdWdoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhcnMgPSBfc2V0RGVmYXVsdHMoX2lzU3RyaW5nKHZhcnMpIHx8IF9pc051bWJlcih2YXJzKSB8fCB2YXJzLm5vZGVUeXBlID8ge1xuICAgICAgdHJpZ2dlcjogdmFyc1xuICAgIH0gOiB2YXJzLCBfZGVmYXVsdHMpO1xuXG4gICAgdmFyIF92YXJzID0gdmFycyxcbiAgICAgICAgb25VcGRhdGUgPSBfdmFycy5vblVwZGF0ZSxcbiAgICAgICAgdG9nZ2xlQ2xhc3MgPSBfdmFycy50b2dnbGVDbGFzcyxcbiAgICAgICAgaWQgPSBfdmFycy5pZCxcbiAgICAgICAgb25Ub2dnbGUgPSBfdmFycy5vblRvZ2dsZSxcbiAgICAgICAgb25SZWZyZXNoID0gX3ZhcnMub25SZWZyZXNoLFxuICAgICAgICBzY3J1YiA9IF92YXJzLnNjcnViLFxuICAgICAgICB0cmlnZ2VyID0gX3ZhcnMudHJpZ2dlcixcbiAgICAgICAgcGluID0gX3ZhcnMucGluLFxuICAgICAgICBwaW5TcGFjaW5nID0gX3ZhcnMucGluU3BhY2luZyxcbiAgICAgICAgaW52YWxpZGF0ZU9uUmVmcmVzaCA9IF92YXJzLmludmFsaWRhdGVPblJlZnJlc2gsXG4gICAgICAgIGFudGljaXBhdGVQaW4gPSBfdmFycy5hbnRpY2lwYXRlUGluLFxuICAgICAgICBvblNjcnViQ29tcGxldGUgPSBfdmFycy5vblNjcnViQ29tcGxldGUsXG4gICAgICAgIG9uU25hcENvbXBsZXRlID0gX3ZhcnMub25TbmFwQ29tcGxldGUsXG4gICAgICAgIG9uY2UgPSBfdmFycy5vbmNlLFxuICAgICAgICBzbmFwID0gX3ZhcnMuc25hcCxcbiAgICAgICAgcGluUmVwYXJlbnQgPSBfdmFycy5waW5SZXBhcmVudCxcbiAgICAgICAgcGluU3BhY2VyID0gX3ZhcnMucGluU3BhY2VyLFxuICAgICAgICBjb250YWluZXJBbmltYXRpb24gPSBfdmFycy5jb250YWluZXJBbmltYXRpb24sXG4gICAgICAgIGZhc3RTY3JvbGxFbmQgPSBfdmFycy5mYXN0U2Nyb2xsRW5kLFxuICAgICAgICBwcmV2ZW50T3ZlcmxhcHMgPSBfdmFycy5wcmV2ZW50T3ZlcmxhcHMsXG4gICAgICAgIGRpcmVjdGlvbiA9IHZhcnMuaG9yaXpvbn
8110RhbCB8fCB2YXJzLmNvbnRhaW5lckFuaW1hdGlvbiAmJiB2YXJzLmhvcml6b250YWwgIT09IGZhbHNlID8gX2hvcml6b250YWwgOiBfdmVydGljYWwsXG4gICAgICAgIGlzVG9nZ2xlID0gIXNjcnViICYmIHNjcnViICE9PSAwLFxuICAgICAgICBzY3JvbGxlciA9IF9nZXRUYXJnZXQodmFycy5zY3JvbGxlciB8fCBfd2luKSxcbiAgICAgICAgc2Nyb2xsZXJDYWNoZSA9IGdzYXAuY29yZS5nZXRDYWNoZShzY3JvbGxlciksXG4gICAgICAgIGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydChzY3JvbGxlciksXG4gICAgICAgIHVzZUZpeGVkUG9zaXRpb24gPSAoXCJwaW5UeXBlXCIgaW4gdmFycyA/IHZhcnMucGluVHlwZSA6IF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwicGluVHlwZVwiKSB8fCBpc1ZpZXdwb3J0ICYmIFwiZml4ZWRcIikgPT09IFwiZml4ZWRcIixcbiAgICAgICAgY2FsbGJhY2tzID0gW3ZhcnMub25FbnRlciwgdmFycy5vbkxlYXZlLCB2YXJzLm9uRW50ZXJCYWNrLCB2YXJzLm9uTGVhdmVCYWNrXSxcbiAgICAgICAgdG9nZ2xlQWN0aW9ucyA9IGlzVG9nZ2xlICYmIHZhcnMudG9nZ2xlQWN0aW9ucy5zcGxpdChcIiBcIiksXG4gICAgICAgIG1hcmtlcnMgPSBcIm1hcmtlcnNcIiBpbiB2YXJzID8gdmFycy5tYXJrZXJzIDogX2RlZmF1bHRzLm1hcmtlcnMsXG4gICAgICAgIGJvcmRlcldpZHRoID0gaXNWaWV3cG9ydCA/IDAgOiBwYXJzZUZsb2F0KF9nZXRDb21wdXRlZFN0eWxlKHNjcm9sbGVyKVtcImJvcmRlclwiICsgZGlyZWN0aW9uLnAyICsgX1dpZHRoXSkgfHwgMCxcbiAgICAgICAgc2VsZiA9IHRoaXMsXG4gICAgICAgIG9uUmVmcmVzaEluaXQgPSB2YXJzLm9uUmVmcmVzaEluaXQgJiYgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHZhcnMub25SZWZyZXNoSW5pdChzZWxmKTtcbiAgICB9LFxuICAgICAgICBnZXRTY3JvbGxlclNpemUgPSBfZ2V0U2l6ZUZ1bmMoc2Nyb2xsZXIsIGlzVmlld3BvcnQsIGRpcmVjdGlvbiksXG4gICAgICAgIGdldFNjcm9sbGVyT2Zmc2V0cyA9IF9nZXRPZmZzZXRzRnVuYyhzY3JvbGxlciwgaXNWaWV3cG9ydCksXG4gICAgICAgIGxhc3RTbmFwID0gMCxcbiAgICAgICAgbGFzdFJlZnJlc2ggPSAwLFxuICAgICAgICBwcmV2UHJvZ3Jlc3MgPSAwLFxuICAgICAgICBzY3JvbGxGdW5jID0gX2dldFNjcm9sbEZ1bmMoc2Nyb2xsZXIsIGRpcmVjdGlvbiksXG4gICAgICAgIHR3ZWVuVG8sXG4gICAgICAgIHBpbkNhY2hlLFxuICAgICAgICBzbmFwRnVuYyxcbiAgICAgICAgc2Nyb2xsMSxcbiAgICAgICAgc2Nyb2xsMixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgbWFya2VyU3RhcnQsXG4gICAgICAgIG1hcmtlckVuZCxcbiAgICAgICAgbWFya2VyU3RhcnRUcmlnZ2VyLFxuICAgICAgICBtYXJrZXJFbmRUcmlnZ2VyLFxuICAgICAgICBtYXJrZXJWYXJzLFxuICAgICAgICBleGVjdXRpbmdPblJlZnJlc2gsXG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgcGluT3JpZ2luYWxTdGF0ZSxcbiAgICAgICAgcGluQWN0aXZlU3RhdGUsXG4gICAgICAgIHBpblN0YXRlLFxuICAgICAgICBzcGFjZXIsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgcGluR2V0dGVyLFxuICAgICAgICBwaW5TZXR0ZXIsXG4gICAgICAgIHBpblN0YXJ0LFxuICAgICAgICBwaW5DaGFuZ2UsXG4gICAgICAgIHNwYWNpbmdTdGFydCxcbiAgICAgICAgc3BhY2VyU3RhdGUsXG4gICAgICAgIG1hcmtlclN0YXJ0U2V0dGVyLFxuICAgICAgICBwaW5Nb3ZlcyxcbiAgICAgICAgbWFya2VyRW5kU2V0dGVyLFxuICAgICAgICBjcyxcbiAgICAgICAgc25hcDEsXG4gICAgICAgIHNuYXAyLFxuICAgICAgICBzY3J1YlR3ZWVuLFxuICAgICAgICBzY3J1YlNtb290aCxcbiAgICAgICAgc25hcER1ckNsYW1wLFxuICAgICAgICBzbmFwRGVsYXllZENhbGwsXG4gICAgICAgIHByZXZTY3JvbGwsXG4gICAgICAgIHByZXZBbmltUHJvZ3Jlc3MsXG4gICAgICAgIGNhTWFya2VyU2V0dGVyLFxuICAgICAgICBjdXN0b21SZXZlcnRSZXR1cm47IC8vIGZvciB0aGUgc2FrZSBvZiBlZmZpY2llbmN5LCBfc3RhcnRDbGFtcC9fZW5kQ2xhbXAgc2VydmUgbGlrZSBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgY2xhbXBpbmcgd2FzIGVuYWJsZWQgb24gdGhlIHN0YXJ0L2VuZCwgYW5kIEFMU08gc3RvcmUgdGhlIGFjdHVhbCBwcmUtY2xhbXBlZCBudW1lcmljIHZhbHVlLiBXZSB0YXAgaW50byB0aGF0IGluIFNjcm9sbFNtb290aGVyIGZvciBzcGVlZCBlZmZlY3RzLiBTbyBmb3IgZXhhbXBsZSwgaWYgc3RhcnQ9XCJjbGFtcCh0b3AgYm90dG9tKVwiIHJlc3VsdHMgaW4gYSBzdGFydCBvZiAtMTAwIG5hdHVyYWxseSwgaXQgd291bGQgZ2V0IGNsYW1wZWQgdG8gMCBidXQgLTEwMCB3b3VsZCBiZSBzdG9yZWQgaW4gX3N0YXJ0Q2xhbXAuXG5cblxuICAgIHNlbGYuX3N0YXJ0Q2xhbXAgPSBzZWxmLl9lbmRDbGFtcCA9IGZhbHNlO1xuICAgIHNlbGYuX2RpciA9IGRpcmVjdGlvbjtcbiAgICBhbnRpY2lwYXRlUGluICo9IDQ1O1xuICAgIHNlbGYuc2Nyb2xsZXIgPSBzY3JvbGxlcjtcbiAgICBzZWxmLnNjcm9sbCA9IGNvbnRhaW5lckFuaW1hdGlvbiA/IGNvbnRhaW5lckFuaW1hdGlvbi50aW1lLmJpbmQoY29udGFpbmVyQW5pbWF0aW9uKSA6IHNjcm9sbEZ1bmM7XG4gICAgc2Nyb2xsMSA9IHNjcm9sbEZ1bmMoKTtcbiAgICBzZWxmLnZhcnMgPSB2YXJzO1xuICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbiB8fCB2YXJzLmFuaW1hdGlvbjtcblxuICAgIGlmIChcInJlZnJlc2hQcmlvcml0eVwiIGluIHZhcnMpIHtcbiAgICAgIF9zb3J0ID0gMTtcbiAgICAgIHZhcnMucmVmcmVzaFByaW9yaXR5ID09PSAtOTk5OSAmJiAoX3ByaW1hcnkgPSBzZWxmKTsgLy8gdXNlZCBieSBTY3JvbGxTbW9vdGhlclxuICAgIH1cblxuICAgIHNjcm9sbGVyQ2FjaGUudHdlZW5TY3JvbGwgPSBzY3JvbGxlckNhY2hlLnR3ZWVuU2Nyb2xsIHx8IHtcbiAgICAgIHRvcDogX2dldFR3ZWVuQ3JlYXRvcihzY3JvbGxlciwgX3ZlcnRpY2FsKSxcbiAgICAgIGxlZnQ6IF9nZXRUd2VlbkNyZWF0b3Ioc2Nyb2xsZXIsIF9ob3Jpem9udGFsKVxuICAgIH07XG4gICAgc2VsZi50d2VlblRvID0gdHdlZW5UbyA9IHNjcm9sbGVyQ2FjaGUudHdlZW5TY3JvbGxbZGlyZWN0aW9uLnBdO1xuXG4gICAgc2VsZi5zY3J1YkR1cmF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBzY3J1YlNtb290aCA9IF9pc051bWJlcih2YWx1ZSkgJiYgdmFsdWU7XG5cbiAgICAgIGlmICghc2NydWJTbW9vdGgpIHtcbiAgICAgICAgc2NydWJUd2VlbiAmJiBzY3J1YlR3ZWVuLnByb2dyZXNzKDEpLmtpbGwoKTtcbiAgICAgICAgc2NydWJUd2VlbiA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY3J1YlR3ZWVuID8gc2NydWJUd2Vlbi5kdXJhdGlvbih2YWx1ZSkgOiBzY3J1YlR3ZWVuID0gZ3NhcC50byhhbmltYXRpb24sIHtcbiAgICAgICAgICBlYXNlOiBcImV4cG9cIixcbiAgICAgICAgICB0b3RhbFByb2dyZXNzOiBcIis9MFwiLFxuICAgICAgICAgIGluaGVyaXQ6IGZhbHNlLFxuICAgICAgICAgIGR1cmF0aW9uOiBzY3J1YlNtb290aCxcbiAgICAgICAgICBwYXVzZWQ6IHRydWUsXG4gICAgICAgICAgb25Db21wbGV0ZTogZnVuY3Rpb24gb25Db21wbGV0ZSgpIHtcbiAgICAgICAgICAgI
8110HJldHVybiBvblNjcnViQ29tcGxldGUgJiYgb25TY3J1YkNvbXBsZXRlKHNlbGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhbmltYXRpb24pIHtcbiAgICAgIGFuaW1hdGlvbi52YXJzLmxhenkgPSBmYWxzZTtcbiAgICAgIGFuaW1hdGlvbi5faW5pdHRlZCAmJiAhc2VsZi5pc1JldmVydGVkIHx8IGFuaW1hdGlvbi52YXJzLmltbWVkaWF0ZVJlbmRlciAhPT0gZmFsc2UgJiYgdmFycy5pbW1lZGlhdGVSZW5kZXIgIT09IGZhbHNlICYmIGFuaW1hdGlvbi5kdXJhdGlvbigpICYmIGFuaW1hdGlvbi5yZW5kZXIoMCwgdHJ1ZSwgdHJ1ZSk7IC8vIHNwZWNpYWwgY2FzZTogaWYgdGhpcyBTY3JvbGxUcmlnZ2VyIGdldHMgcmUtaW5pdHRlZCwgYSBmcm9tKCkgdHdlZW4gd2l0aCBhIHN0YWdnZXIgY291bGQgZ2V0IGluaXR0ZWQgaW5pdGlhbGx5IGFuZCB0aGVuIHJldmVydGVkIG9uIHRoZSByZS1pbml0IHdoaWNoIG1lYW5zIGl0J2xsIG5lZWQgdG8gZ2V0IHJlbmRlcmVkIGFnYWluIGhlcmUgdG8gcHJvcGVybHkgZGlzcGxheSB0aGluZ3MuIE90aGVyd2lzZSwgU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzM2Nzc3LXNjcm9sbHNtb290aGVyLXNwbGl0dGV4dC1uZXh0anMvIGFuZCBodHRwczovL2NvZGVwZW4uaW8vR3JlZW5Tb2NrL3Blbi9lWVB5UHBkP2VkaXRvcnM9MDAxMFxuXG4gICAgICBzZWxmLmFuaW1hdGlvbiA9IGFuaW1hdGlvbi5wYXVzZSgpO1xuICAgICAgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIgPSBzZWxmO1xuICAgICAgc2VsZi5zY3J1YkR1cmF0aW9uKHNjcnViKTtcbiAgICAgIHNuYXAxID0gMDtcbiAgICAgIGlkIHx8IChpZCA9IGFuaW1hdGlvbi52YXJzLmlkKTtcbiAgICB9XG5cbiAgICBpZiAoc25hcCkge1xuICAgICAgLy8gVE9ETzogcG90ZW50aWFsIGlkZWE6IHVzZSBsZWdpdGltYXRlIENTUyBzY3JvbGwgc25hcHBpbmcgYnkgcHVzaGluZyBpbnZpc2libGUgZWxlbWVudHMgaW50byB0aGUgRE9NIHRoYXQgc2VydmUgYXMgc25hcCBwb3NpdGlvbnMsIGFuZCB0b2dnbGUgdGhlIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc3R5bGUuc2Nyb2xsU25hcFR5cGUgb25Ub2dnbGUuIFNlZSBodHRwczovL2NvZGVwZW4uaW8vR3JlZW5Tb2NrL3Blbi9KakxyZ1dNIGZvciBhIHF1aWNrIHByb29mIG9mIGNvbmNlcHQuXG4gICAgICBpZiAoIV9pc09iamVjdChzbmFwKSB8fCBzbmFwLnB1c2gpIHtcbiAgICAgICAgc25hcCA9IHtcbiAgICAgICAgICBzbmFwVG86IHNuYXBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgXCJzY3JvbGxCZWhhdmlvclwiIGluIF9ib2R5LnN0eWxlICYmIGdzYXAuc2V0KGlzVmlld3BvcnQgPyBbX2JvZHksIF9kb2NFbF0gOiBzY3JvbGxlciwge1xuICAgICAgICBzY3JvbGxCZWhhdmlvcjogXCJhdXRvXCJcbiAgICAgIH0pOyAvLyBzbW9vdGggc2Nyb2xsaW5nIGRvZXNuJ3Qgd29yayB3aXRoIHNuYXAuXG5cbiAgICAgIF9zY3JvbGxlcnMuZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gX2lzRnVuY3Rpb24obykgJiYgby50YXJnZXQgPT09IChpc1ZpZXdwb3J0ID8gX2RvYy5zY3JvbGxpbmdFbGVtZW50IHx8IF9kb2NFbCA6IHNjcm9sbGVyKSAmJiAoby5zbW9vdGggPSBmYWxzZSk7XG4gICAgICB9KTsgLy8gbm90ZTogc2V0IHNtb290aCB0byBmYWxzZSBvbiBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY3JvbGwgZ2V0dGVycy9zZXR0ZXJzXG5cblxuICAgICAgc25hcEZ1bmMgPSBfaXNGdW5jdGlvbihzbmFwLnNuYXBUbykgPyBzbmFwLnNuYXBUbyA6IHNuYXAuc25hcFRvID09PSBcImxhYmVsc1wiID8gX2dldENsb3Nlc3RMYWJlbChhbmltYXRpb24pIDogc25hcC5zbmFwVG8gPT09IFwibGFiZWxzRGlyZWN0aW9uYWxcIiA/IF9nZXRMYWJlbEF0RGlyZWN0aW9uKGFuaW1hdGlvbikgOiBzbmFwLmRpcmVjdGlvbmFsICE9PSBmYWxzZSA/IGZ1bmN0aW9uICh2YWx1ZSwgc3QpIHtcbiAgICAgICAgcmV0dXJuIF9zbmFwRGlyZWN0aW9uYWwoc25hcC5zbmFwVG8pKHZhbHVlLCBfZ2V0VGltZSgpIC0gbGFzdFJlZnJlc2ggPCA1MDAgPyAwIDogc3QuZGlyZWN0aW9uKTtcbiAgICAgIH0gOiBnc2FwLnV0aWxzLnNuYXAoc25hcC5zbmFwVG8pO1xuICAgICAgc25hcER1ckNsYW1wID0gc25hcC5kdXJhdGlvbiB8fCB7XG4gICAgICAgIG1pbjogMC4xLFxuICAgICAgICBtYXg6IDJcbiAgICAgIH07XG4gICAgICBzbmFwRHVyQ2xhbXAgPSBfaXNPYmplY3Qoc25hcER1ckNsYW1wKSA/IF9jbGFtcChzbmFwRHVyQ2xhbXAubWluLCBzbmFwRHVyQ2xhbXAubWF4KSA6IF9jbGFtcChzbmFwRHVyQ2xhbXAsIHNuYXBEdXJDbGFtcCk7XG4gICAgICBzbmFwRGVsYXllZENhbGwgPSBnc2FwLmRlbGF5ZWRDYWxsKHNuYXAuZGVsYXkgfHwgc2NydWJTbW9vdGggLyAyIHx8IDAuMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
8110XIgc2Nyb2xsID0gc2Nyb2xsRnVuYygpLFxuICAgICAgICAgICAgcmVmcmVzaGVkUmVjZW50bHkgPSBfZ2V0VGltZSgpIC0gbGFzdFJlZnJlc2ggPCA1MDAsXG4gICAgICAgICAgICB0d2VlbiA9IHR3ZWVuVG8udHdlZW47XG5cbiAgICAgICAgaWYgKChyZWZyZXNoZWRSZWNlbnRseSB8fCBNYXRoLmFicyhzZWxmLmdldFZlbG9jaXR5KCkpIDwgMTApICYmICF0d2VlbiAmJiAhX3BvaW50ZXJJc0Rvd24gJiYgbGFzdFNuYXAgIT09IHNjcm9sbCkge1xuICAgICAgICAgIHZhciBwcm9ncmVzcyA9IChzY3JvbGwgLSBzdGFydCkgLyBjaGFuZ2UsXG4gICAgICAgICAgICAgIHRvdGFsUHJvZ3Jlc3MgPSBhbmltYXRpb24gJiYgIWlzVG9nZ2xlID8gYW5pbWF0aW9uLnRvdGFsUHJvZ3Jlc3MoKSA6IHByb2dyZXNzLFxuICAgICAgICAgICAgICB2ZWxvY2l0eSA9IHJlZnJlc2hlZFJlY2VudGx5ID8gMCA6ICh0b3RhbFByb2dyZXNzIC0gc25hcDIpIC8gKF9nZXRUaW1lKCkgLSBfdGltZTIpICogMTAwMCB8fCAwLFxuICAgICAgICAgICAgICBjaGFuZ2UxID0gZ3NhcC51dGlscy5jbGFtcCgtcHJvZ3Jlc3MsIDEgLSBwcm9ncmVzcywgX2Ficyh2ZWxvY2l0eSAvIDIpICogdmVsb2NpdHkgLyAwLjE4NSksXG4gICAgICAgICAgICAgIG5hdHVyYWxFbmQgPSBwcm9ncmVzcyArIChzbmFwLmluZXJ0aWEgPT09IGZhbHNlID8gMCA6IGNoYW5nZTEpLFxuICAgICAgICAgICAgICBlbmRWYWx1ZSxcbiAgICAgICAgICAgICAgZW5kU2Nyb2xsLFxuICAgICAgICAgICAgICBfc25hcCA9IHNuYXAsXG4gICAgICAgICAgICAgIG9uU3RhcnQgPSBfc25hcC5vblN0YXJ0LFxuICAgICAgICAgICAgICBfb25JbnRlcnJ1cHQgPSBfc25hcC5vbkludGVycnVwdCxcbiAgICAgICAgICAgICAgX29uQ29tcGxldGUgPSBfc25hcC5vbkNvbXBsZXRlO1xuICAgICAgICAgIGVuZFZhbHVlID0gc25hcEZ1bmMobmF0dXJhbEVuZCwgc2VsZik7XG4gICAgICAgICAgX2lzTnVtYmVyKGVuZFZhbHVlKSB8fCAoZW5kVmFsdWUgPSBuYXR1cmFsRW5kKTsgLy8gaW4gY2FzZSB0aGUgZnVuY3Rpb24gZGlkbid0IHJldHVybiBhIG51bWJlciwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBuYXR1cmFsRW5kXG5cbiAgICAgICAgICBlbmRTY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHN0YXJ0ICsgZW5kVmFsdWUgKiBjaGFuZ2UpKTtcblxuICAgICAgICAgIGlmIChzY3JvbGwgPD0gZW5kICYmIHNjcm9sbCA+PSBzdGFydCAmJiBlbmRTY3JvbGwgIT09IHNjcm9sbCkge1xuICAgICAgICAgICAgaWYgKHR3ZWVuICYmICF0d2Vlbi5faW5pdHRlZCAmJiB0d2Vlbi5kYXRhIDw9IF9hYnMoZW5kU2Nyb2xsIC0gc2Nyb2xsKSkge1xuICAgICAgICAgICAgICAvLyB0aGVyZSdzIGFuIG92ZXJsYXBwaW5nIHNuYXAhIFNvIHdlIG11c3QgZmlndXJlIG91dCB3aGljaCBvbmUgaXMgY2xvc2VyIGFuZCBsZXQgdGhhdCB0d2VlbiBsaXZlLlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzbmFwLmluZXJ0aWEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGNoYW5nZTEgPSBlbmRWYWx1ZSAtIHByb2dyZXNzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0d2VlblRvKGVuZFNjcm9sbCwge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogc25hcER1ckNsYW1wKF9hYnMoTWF0aC5tYXgoX2FicyhuYXR1cmFsRW5kIC0gdG90YWxQcm9ncmVzcyksIF9hYnMoZW5kVmFsdWUgLSB0b3RhbFByb2dyZXNzKSkgKiAwLjE4NSAvIHZlbG9jaXR5IC8gMC4wNSB8fCAwKSksXG4gICAgICAgICAgICAgIGVhc2U6IHNuYXAuZWFzZSB8fCBcInBvd2VyM1wiLFxuICAgICAgICAgICAgICBkYXRhOiBfYWJzKGVuZFNjcm9sbCAtIHNjcm9sbCksXG4gICAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgZGlzdGFuY2Ugc28gdGhhdCBpZiBhbm90aGVyIHNuYXAgdHdlZW4gb2NjdXJzIChjb25mbGljdCkgd2UgY2FuIHByaW9yaXRpemUgdGhlIGNsb3Nlc3Qgc25hcC5cbiAgICAgICAgICAgICAgb25JbnRlcnJ1cHQ6IGZ1bmN0aW9uIG9uSW50ZXJydXB0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzbmFwRGVsYXllZENhbGwucmVzdGFydCh0cnVlKSAmJiBfb25JbnRlcnJ1cHQgJiYgX2NhbGxiYWNrKHNlbGYsIF9vbkludGVycnVwdCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uQ29tcGxldGU6IGZ1bmN0aW9uIG9uQ29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICBsYXN0U25hcCA9IHNjcm9sbEZ1bmMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb24gJiYgIWlzVG9nZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgc2Nyb2xsYmFyIGlzIGxpbWl0ZWQsIHNvIHdlIHNob3VsZCBjb3JyZWN0IHRoZSBzY3J1YmJlZCBhbmltYXRpb24ncyBwbGF5aGVhZCBhdCB0aGUgZW5kIHRvIG1hdGNoIEVYQUNUTFkgd2hlcmUgaXQgd2FzIHN1cHBvc2VkIHRvIHNuYXBcbiAgICAgICAgICAgICAgICAgIHNjcnViVHdlZW4gPyBzY3J1YlR3ZWVuLnJlc2V0VG8oXCJ0b3RhbFByb2dyZXNzXCIsIGVuZFZhbHVlLCBhbmltYXRpb24uX3RUaW1lIC8gYW5pbWF0aW9uLl90RHVyKSA6IGFuaW1hdGlvbi5wcm9ncmVzcyhlbmRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc25hcDEgPSBzbmFwMiA9IGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgPyBhbmltYXRpb24udG90YWxQcm9ncmVzcygpIDogc2VsZi5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICBvblNuYXBDb21wbGV0ZSAmJiBvblNuYXBDb21wbGV0ZShzZWxmKTtcbiAgICAgICAgICAgICAgICBfb25Db21wbGV0ZSAmJiBfY2FsbGJhY2soc2VsZiwgX29uQ29tcGxldGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBzY3JvbGwsIGNoYW5nZTEgKiBjaGFuZ2UsIGVuZFNjcm9sbCAtIHNjcm9sbCAtIGNoYW5nZTEgKiBjaGFuZ2UpO1xuICAgICAgICAgICAgb25TdGFydCAmJiBfY2FsbGJhY2soc2VsZiwgb25TdGFydCwgdHdlZW5Uby50d2Vlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNlbGYuaXNBY3RpdmUgJiYgbGFzdFNuYXAgIT09IHNjcm9sbCkge1xuICAgICAgICAgI
8110HNuYXBEZWxheWVkQ2FsbC5yZXN0YXJ0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KS5wYXVzZSgpO1xuICAgIH1cblxuICAgIGlkICYmIChfaWRzW2lkXSA9IHNlbGYpO1xuICAgIHRyaWdnZXIgPSBzZWxmLnRyaWdnZXIgPSBfZ2V0VGFyZ2V0KHRyaWdnZXIgfHwgcGluICE9PSB0cnVlICYmIHBpbik7IC8vIGlmIGEgdHJpZ2dlciBoYXMgc29tZSBraW5kIG9mIHNjcm9sbC1yZWxhdGVkIGVmZmVjdCBhcHBsaWVkIHRoYXQgY291bGQgY29udGFtaW5hdGUgdGhlIFwieVwiIG9yIFwieFwiIHBvc2l0aW9uIChsaWtlIGEgU2Nyb2xsU21vb3RoZXIgZWZmZWN0KSwgd2UgbmVlZGVkIGEgd2F5IHRvIHRlbXBvcmFyaWx5IHJldmVydCBpdCwgc28gd2UgdXNlIHRoZSBzdFJldmVydCBwcm9wZXJ0eSBvZiB0aGUgZ3NDYWNoZS4gSXQgY2FuIHJldHVybiBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgd2UnbGwgY2FsbCBhdCB0aGUgZW5kIHNvIGl0IGNhbiByZXR1cm4gdG8gaXRzIG5vcm1hbCBzdGF0ZS5cblxuICAgIGN1c3RvbVJldmVydFJldHVybiA9IHRyaWdnZXIgJiYgdHJpZ2dlci5fZ3NhcCAmJiB0cmlnZ2VyLl9nc2FwLnN0UmV2ZXJ0O1xuICAgIGN1c3RvbVJldmVydFJldHVybiAmJiAoY3VzdG9tUmV2ZXJ0UmV0dXJuID0gY3VzdG9tUmV2ZXJ0UmV0dXJuKHNlbGYpKTtcbiAgICBwaW4gPSBwaW4gPT09IHRydWUgPyB0cmlnZ2VyIDogX2dldFRhcmdldChwaW4pO1xuICAgIF9pc1N0cmluZyh0b2dnbGVDbGFzcykgJiYgKHRvZ2dsZUNsYXNzID0ge1xuICAgICAgdGFyZ2V0czogdHJpZ2dlcixcbiAgICAgIGNsYXNzTmFtZTogdG9nZ2xlQ2xhc3NcbiAgICB9KTtcblxuICAgIGlmIChwaW4pIHtcbiAgICAgIHBpblNwYWNpbmcgPT09IGZhbHNlIHx8IHBpblNwYWNpbmcgPT09IF9tYXJnaW4gfHwgKHBpblNwYWNpbmcgPSAhcGluU3BhY2luZyAmJiBwaW4ucGFyZW50Tm9kZSAmJiBwaW4ucGFyZW50Tm9kZS5zdHlsZSAmJiBfZ2V0Q29tcHV0ZWRTdHlsZShwaW4ucGFyZW50Tm9kZSkuZGlzcGxheSA9PT0gXCJmbGV4XCIgPyBmYWxzZSA6IF9wYWRkaW5nKTsgLy8gaWYgdGhlIHBhcmVudCBpcyBkaXNwbGF5OiBmbGV4LCBkb24ndCBhcHBseSBwaW5TcGFjaW5nIGJ5IGRlZmF1bHQuIFdlIHNob3VsZCBjaGVjayB0aGF0IHBpbi5wYXJlbnROb2RlIGlzIGFuIGVsZW1lbnQgKG5vdCBzaGFkb3cgZG9tIHdpbmRvdylcblxuICAgICAgc2VsZi5waW4gPSBwaW47XG4gICAgICBwaW5DYWNoZSA9IGdzYXAuY29yZS5nZXRDYWNoZShwaW4pO1xuXG4gICAgICBpZiAoIXBpbkNhY2hlLnNwYWNlcikge1xuICAgICAgICAvLyByZWNvcmQgdGhlIHNwYWNlciBhbmQgcGluT3JpZ2luYWxTdGF0ZSBvbiB0aGUgY2FjaGUgaW4gY2FzZSBzb21lb25lIHRyaWVzIHBpbm5pbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIE1VTFRJUExFIFNjcm9sbFRyaWdnZXJzIC0gd2UgZG9uJ3Qgd2FudCB0byBoYXZlIG11bHRpcGxlIHNwYWNlcnMgb3IgcmVjb3JkIHRoZSBcIm9yaWdpbmFsXCIgcGluIHN0YXRlIGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWZmZWN0ZWQgYnkgYW5vdGhlciBTY3JvbGxUcmlnZ2VyLlxuICAgICAgICBpZiAocGluU3BhY2VyKSB7XG4gICAgICAgICAgcGluU3BhY2VyID0gX2dldFRhcmdldChwaW5TcGFjZXIpO1xuICAgICAgICAgIHBpblNwYWNlciAmJiAhcGluU3BhY2VyLm5vZGVUeXBlICYmIChwaW5TcGFjZXIgPSBwaW5TcGFjZXIuY3VycmVudCB8fCBwaW5TcGFjZXIubmF0aXZlRWxlbWVudCk7IC8vIGZvciBSZWFjdCAmIEFuZ3VsYXJcblxuICAgICAgICAgIHBpbkNhY2hlLnNwYWNlcklzTmF0aXZlID0gISFwaW5TcGFjZXI7XG4gICAgICAgICAgcGluU3BhY2VyICYmIChwaW5DYWNoZS5zcGFjZXJTdGF0ZSA9IF9nZXRTdGF0ZShwaW5TcGFjZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBpbkNhY2hlLnNwYWNlciA9IHNwYWNlciA9IHBpblNwYWNlciB8fCBfZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHNwYWNlci5jbGFzc0xpc3QuYWRkKFwicGluLXNwYWNlclwiKTtcbiAgICAgICAgaWQgJiYgc3BhY2VyLmNsYXNzTGlzdC5hZGQoXCJwaW4tc3BhY2VyLVwiICsgaWQpO1xuICAgICAgICBwaW5DYWNoZS5waW5TdGF0ZSA9IHBpbk9yaWdpbmFsU3RhdGUgPSBfZ2V0U3RhdGUocGluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBpbk9yaWdpbmFsU3RhdGUgPSBwaW5DYWNoZS5waW5TdGF0ZTtcbiAgICAgIH1cblxuICAgICAgdmFycy5mb3JjZTNEICE9PSBmYWxzZSAmJiBnc2FwLnNldChwaW4sIHtcbiAgICAgICAgZm9yY2UzRDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBzZWxmLnNwYWNlciA9IHNwYWNlciA9IHBpbkNhY2hlLnNwYWNlcjtcbiAgICAgIGNzID0gX2dldENvbXB1dGVkU3R5bGUocGluKTtcbiAgICAgIHNwYWNpbmdTdGFydCA9IGNzW3BpblNwYWNpbmcgKyBkaXJlY3Rpb24ub3MyXTtcbiAgICAgIHBpbkdldHRlciA9IGdzYXAuZ2V0UHJvcGVydHkocGluKTtcbiAgICAgIHBpblNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIocGluLCBkaXJlY3Rpb24uYSwgX3B4KTsgLy8gcGluLmZpcnN0Q2hpbGQgJiYgIV9tYXhTY3JvbGwocGluLCBkaXJlY3Rpb24pICYmIChwaW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiKTsgLy8gcHJvdGVjdHMgZnJvbSBjb2xsYXBzaW5nIG1hcmdpbnMsIGJ1dCBjYW4gaGF2ZSB1bmludGVuZGVkIGNvbnNlcXVlbmNlcyBhcyBkZW1vbnN0cmF0ZWQgaGVyZTogaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vMWU0MmM3YTczYmZhNDA5ZDJjZjFlMTg0ZTdhNDI0OGQgc28gaXQgd2FzIHJlbW92ZWQgaW4gZmF2b3Igb2YganVzdCB0ZWxsaW5nIHBlb3BsZSB0byBzZXQgdXAgdGhlaXIgQ1NTIHRvIGF2b2lkIHRoZSBjb2xsYXBzaW5nIG1hcmdpbnMgKG92ZXJmbG93OiBoaWRkZW4gfCBhdXRvIGlzIGp1c3Qgb25lIG9wdGlvbi4gQW5vdGhlciBpcyBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQpLlxuXG4gICAgICBfc3dhcFBpbkluKHBpbiwgc3BhY2VyLCBjcyk7XG5cbiAgICAgIHBpblN0YXRlID0gX2dldFN0YXRlKHBpbik7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlcnMpIHtcbiAgICAgIG1hcmtlclZhcnMgPSBfaXNPYmplY3QobWFya2VycykgPyBfc2V0RGVmYXVsdHMobWFya2VycywgX21hcmtlckRlZmF1bHRzKSA6IF9tYXJrZXJEZWZhdWx0cztcbiAgICAgIG1hcmtlclN0YXJ0V
8110HJpZ2dlciA9IF9jcmVhdGVNYXJrZXIoXCJzY3JvbGxlci1zdGFydFwiLCBpZCwgc2Nyb2xsZXIsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgMCk7XG4gICAgICBtYXJrZXJFbmRUcmlnZ2VyID0gX2NyZWF0ZU1hcmtlcihcInNjcm9sbGVyLWVuZFwiLCBpZCwgc2Nyb2xsZXIsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgMCwgbWFya2VyU3RhcnRUcmlnZ2VyKTtcbiAgICAgIG9mZnNldCA9IG1hcmtlclN0YXJ0VHJpZ2dlcltcIm9mZnNldFwiICsgZGlyZWN0aW9uLm9wLmQyXTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBfZ2V0VGFyZ2V0KF9nZXRQcm94eVByb3Aoc2Nyb2xsZXIsIFwiY29udGVudFwiKSB8fCBzY3JvbGxlcik7XG5cbiAgICAgIG1hcmtlclN0YXJ0ID0gdGhpcy5tYXJrZXJTdGFydCA9IF9jcmVhdGVNYXJrZXIoXCJzdGFydFwiLCBpZCwgY29udGVudCwgZGlyZWN0aW9uLCBtYXJrZXJWYXJzLCBvZmZzZXQsIDAsIGNvbnRhaW5lckFuaW1hdGlvbik7XG4gICAgICBtYXJrZXJFbmQgPSB0aGlzLm1hcmtlckVuZCA9IF9jcmVhdGVNYXJrZXIoXCJlbmRcIiwgaWQsIGNvbnRlbnQsIGRpcmVjdGlvbiwgbWFya2VyVmFycywgb2Zmc2V0LCAwLCBjb250YWluZXJBbmltYXRpb24pO1xuICAgICAgY29udGFpbmVyQW5pbWF0aW9uICYmIChjYU1hcmtlclNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIoW21hcmtlclN0YXJ0LCBtYXJrZXJFbmRdLCBkaXJlY3Rpb24uYSwgX3B4KSk7XG5cbiAgICAgIGlmICghdXNlRml4ZWRQb3NpdGlvbiAmJiAhKF9wcm94aWVzLmxlbmd0aCAmJiBfZ2V0UHJveHlQcm9wKHNjcm9sbGVyLCBcImZpeGVkTWFya2Vyc1wiKSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgX21ha2VQb3NpdGlvbmFibGUoaXNWaWV3cG9ydCA/IF9ib2R5IDogc2Nyb2xsZXIpO1xuXG4gICAgICAgIGdzYXAuc2V0KFttYXJrZXJTdGFydFRyaWdnZXIsIG1hcmtlckVuZFRyaWdnZXJdLCB7XG4gICAgICAgICAgZm9yY2UzRDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgbWFya2VyU3RhcnRTZXR0ZXIgPSBnc2FwLnF1aWNrU2V0dGVyKG1hcmtlclN0YXJ0VHJpZ2dlciwgZGlyZWN0aW9uLmEsIF9weCk7XG4gICAgICAgIG1hcmtlckVuZFNldHRlciA9IGdzYXAucXVpY2tTZXR0ZXIobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLmEsIF9weCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lckFuaW1hdGlvbikge1xuICAgICAgdmFyIG9sZE9uVXBkYXRlID0gY29udGFpbmVyQW5pbWF0aW9uLnZhcnMub25VcGRhdGUsXG4gICAgICAgICAgb2xkUGFyYW1zID0gY29udGFpbmVyQW5pbWF0aW9uLnZhcnMub25VcGRhdGVQYXJhbXM7XG4gICAgICBjb250YWluZXJBbmltYXRpb24uZXZlbnRDYWxsYmFjayhcIm9uVXBkYXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGUoMCwgMCwgMSk7XG4gICAgICAgIG9sZE9uVXBkYXRlICYmIG9sZE9uVXBkYXRlLmFwcGx5KGNvbnRhaW5lckFuaW1hdGlvbiwgb2xkUGFyYW1zIHx8IFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlbGYucHJldmlvdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RyaWdnZXJzW190cmlnZ2Vycy5pbmRleE9mKHNlbGYpIC0gMV07XG4gICAgfTtcblxuICAgIHNlbGYubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdHJpZ2dlcnNbX3RyaWdnZXJzLmluZGV4T2Yoc2VsZikgKyAxXTtcbiAgICB9O1xuXG4gICAgc2VsZi5yZXZlcnQgPSBmdW5jdGlvbiAocmV2ZXJ0LCB0ZW1wKSB7XG4gICAgICBpZiAoIXRlbXApIHtcbiAgICAgICAgcmV0dXJuIHNlbGYua2lsbCh0cnVlKTtcbiAgICAgIH0gLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBnc2FwLmNvbnRleHQoKSBhbmQgZ3NhcC5tYXRjaE1lZGlhKCkgd2hpY2ggY2FsbCByZXZlcnQoKVxuXG5cbiAgICAgIHZhciByID0gcmV2ZXJ0ICE9PSBmYWxzZSB8fCAhc2VsZi5lbmFibGVkLFxuICAgICAgICAgIHByZXZSZWZyZXNoaW5nID0gX3JlZnJlc2hpbmc7XG5cbiAgICAgIGlmIChyICE9PSBzZWxmLmlzUmV2ZXJ0ZWQpIHtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICBwcmV2U2Nyb2xsID0gTWF0aC5tYXgoc2Nyb2xsRnVuYygpLCBzZWxmLnNjcm9sbC5yZWMgfHwgMCk7IC8vIHJlY29yZCB0aGUgc2Nyb2xsIHNvIHdlIGNhbiByZXZlcnQgbGF0ZXIgKHJlcG9zaXRpb25pbmcvcGlubmluZyB0aGluZ3MgY2FuIGFmZmVjdCBzY3JvbGwgcG9zaXRpb24pLiBJbiB0aGUgc3RhdGljIHJlZnJlc2goKSBtZXRob2QsIHdlIGZpcnN0IHJlY29yZCBhbGwgdGhlIHNjcm9sbCBwb3NpdGlvbnMgYXMgYSByZWZlcmVuY2UuXG5cbiAgICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzO1xuICAgICAgICAgIHByZXZBbmltUHJvZ3Jlc3MgPSBhbmltYXRpb24gJiYgYW5pbWF0aW9uLnByb2dyZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrZXJTdGFydCAmJiBbbWFya2VyU3RhcnQsIG1hcmtlckVuZCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBtYXJrZXJFbmRUcmlnZ2VyXS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uc3R5bGUuZGlzcGxheSA9IHIgPyBcIm5vbmVcIiA6IFwiYmxvY2tcIjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICBfcmVmcmVzaGluZyA9IHNlbGY7XG4gICAgICAgICAgc2VsZi51cGRhdGUocik7IC8vIG1ha2Ugc3VyZSB0aGUgcGluIGlzIGJhY2sgaW4gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIHNvIHRoYXQgYWxsIHRoZSBtZWFzdXJlbWVudHMgYXJlIGNvcnJlY3QuIGRvIHRoaXMgQkVGT1JFIHN3YXBwaW5nIHRoZSBwaW4gb3V0XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGluICYmICghcGluUmVwYXJlbnQgfHwgIXNlbGYuaXNBY3RpdmUpKSB7XG4gICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgIF9zd2FwUGluT3V0KHBpbiwgc3BhY2VyLCBwaW5PcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3N3YXBQaW5JbihwaW4sIHNwYWNlciwgX2dldENvbXB1dGVkU3R5bGUocGluKSwgc3BhY2VyU3RhdGUpO1xuICAgICAgICAgI
8110H1cbiAgICAgICAgfVxuXG4gICAgICAgIHIgfHwgc2VsZi51cGRhdGUocik7IC8vIHdoZW4gd2UncmUgcmVzdG9yaW5nLCB0aGUgdXBkYXRlIHNob3VsZCBydW4gQUZURVIgc3dhcHBpbmcgdGhlIHBpbiBpbnRvIGl0cyBwaW4tc3BhY2VyLlxuXG4gICAgICAgIF9yZWZyZXNoaW5nID0gcHJldlJlZnJlc2hpbmc7IC8vIHJlc3RvcmUuIFdlIHNldCBpdCB0byB0cnVlIGR1cmluZyB0aGUgdXBkYXRlKCkgc28gdGhhdCB0aGluZ3MgZmlyZSBwcm9wZXJseSBpbiB0aGVyZS5cblxuICAgICAgICBzZWxmLmlzUmV2ZXJ0ZWQgPSByO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZWxmLnJlZnJlc2ggPSBmdW5jdGlvbiAoc29mdCwgZm9yY2UsIHBvc2l0aW9uLCBwaW5PZmZzZXQpIHtcbiAgICAgIC8vIHBvc2l0aW9uIGlzIHR5cGljYWxseSBvbmx5IGRlZmluZWQgaWYgaXQncyBjb21pbmcgZnJvbSBzZXRQb3NpdGlvbnMoKSAtIGl0J3MgYSB3YXkgdG8gc2tpcCB0aGUgbm9ybWFsIHBhcnNpbmcuIHBpbk9mZnNldCBpcyBhbHNvIG9ubHkgZnJvbSBzZXRQb3NpdGlvbnMoKSBhbmQgaXMgbW9zdGx5IHJlbGF0ZWQgdG8gZmFuY3kgc3R1ZmYgd2UgbmVlZCB0byBkbyBpbiBTY3JvbGxTbW9vdGhlciB3aXRoIGVmZmVjdHNcbiAgICAgIGlmICgoX3JlZnJlc2hpbmcgfHwgIXNlbGYuZW5hYmxlZCkgJiYgIWZvcmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBpbiAmJiBzb2Z0ICYmIF9sYXN0U2Nyb2xsVGltZSkge1xuICAgICAgICBfYWRkTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJzY3JvbGxFbmRcIiwgX3NvZnRSZWZyZXNoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICFfcmVmcmVzaGluZ0FsbCAmJiBvblJlZnJlc2hJbml0ICYmIG9uUmVmcmVzaEluaXQoc2VsZik7XG4gICAgICBfcmVmcmVzaGluZyA9IHNlbGY7XG5cbiAgICAgIGlmICh0d2VlblRvLnR3ZWVuICYmICFwb3NpdGlvbikge1xuICAgICAgICAvLyB3ZSBza2lwIHRoaXMgaWYgYSBwb3NpdGlvbiBpcyBwYXNzZWQgaW4gYmVjYXVzZSB0eXBpY2FsbHkgdGhhdCdzIGZyb20gLnNldFBvc2l0aW9ucygpIGFuZCBpdCdzIGJlc3QgdG8gYWxsb3cgaW4tcHJvZ3Jlc3Mgc25hcHBpbmcgdG8gY29udGludWUuXG4gICAgICAgIHR3ZWVuVG8udHdlZW4ua2lsbCgpO1xuICAgICAgICB0d2VlblRvLnR3ZWVuID0gMDtcbiAgICAgIH1cblxuICAgICAgc2NydWJUd2VlbiAmJiBzY3J1YlR3ZWVuLnBhdXNlKCk7XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlT25SZWZyZXNoICYmIGFuaW1hdGlvbikge1xuICAgICAgICBhbmltYXRpb24ucmV2ZXJ0KHtcbiAgICAgICAgICBraWxsOiBmYWxzZVxuICAgICAgICB9KS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIGFuaW1hdGlvbi5nZXRDaGlsZHJlbiA/IGFuaW1hdGlvbi5nZXRDaGlsZHJlbih0cnVlLCB0cnVlLCBmYWxzZSkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnZhcnMuaW1tZWRpYXRlUmVuZGVyICYmIHQucmVuZGVyKDAsIHRydWUsIHRydWUpO1xuICAgICAgICB9KSA6IGFuaW1hdGlvbi52YXJzLmltbWVkaWF0ZVJlbmRlciAmJiBhbmltYXRpb24ucmVuZGVyKDAsIHRydWUsIHRydWUpOyAvLyBhbnkgZnJvbSgpIG9yIGZyb21UbygpIHR3ZWVucyBzaG91bGQgcmVuZGVyIGltbWVkaWF0ZWx5ICh3ZWxsLCB1bmxlc3MgdGhleSBoYXZlIGltbWVkaWF0ZVJlbmRlcjogZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIHNlbGYuaXNSZXZlcnRlZCB8fCBzZWxmLnJldmVydCh0cnVlLCB0cnVlKTtcbiAgICAgIHNlbGYuX3N1YlBpbk9mZnNldCA9IGZhbHNlOyAvLyB3ZSdsbCBzZXQgdGhpcyB0byB0cnVlIGluIHRoZSBzdWItcGlucyBpZiB3ZSBmaW5kIGFueVxuXG4gICAgICB2Y
8110XIgc2l6ZSA9IGdldFNjcm9sbGVyU2l6ZSgpLFxuICAgICAgICAgIHNjcm9sbGVyQm91bmRzID0gZ2V0U2Nyb2xsZXJPZmZzZXRzKCksXG4gICAgICAgICAgbWF4ID0gY29udGFpbmVyQW5pbWF0aW9uID8gY29udGFpbmVyQW5pbWF0aW9uLmR1cmF0aW9uKCkgOiBfbWF4U2Nyb2xsKHNjcm9sbGVyLCBkaXJlY3Rpb24pLFxuICAgICAgICAgIGlzRmlyc3RSZWZyZXNoID0gY2hhbmdlIDw9IDAuMDEgfHwgIWNoYW5nZSxcbiAgICAgICAgICBvZmZzZXQgPSAwLFxuICAgICAgICAgIG90aGVyUGluT2Zmc2V0ID0gcGluT2Zmc2V0IHx8IDAsXG4gICAgICAgICAgcGFyc2VkRW5kID0gX2lzT2JqZWN0KHBvc2l0aW9uKSA/IHBvc2l0aW9uLmVuZCA6IHZhcnMuZW5kLFxuICAgICAgICAgIHBhcnNlZEVuZFRyaWdnZXIgPSB2YXJzLmVuZFRyaWdnZXIgfHwgdHJpZ2dlcixcbiAgICAgICAgICBwYXJzZWRTdGFydCA9IF9pc09iamVjdChwb3NpdGlvbikgPyBwb3NpdGlvbi5zdGFydCA6IHZhcnMuc3RhcnQgfHwgKHZhcnMuc3RhcnQgPT09IDAgfHwgIXRyaWdnZXIgPyAwIDogcGluID8gXCIwIDBcIiA6IFwiMCAxMDAlXCIpLFxuICAgICAgICAgIHBpbm5lZENvbnRhaW5lciA9IHNlbGYucGlubmVkQ29udGFpbmVyID0gdmFycy5waW5uZWRDb250YWluZXIgJiYgX2dldFRhcmdldCh2YXJzLnBpbm5lZENvbnRhaW5lciwgc2VsZiksXG4gICAgICAgICAgdHJpZ2dlckluZGV4ID0gdHJpZ2dlciAmJiBNYXRoLm1heCgwLCBfdHJpZ2dlcnMuaW5kZXhPZihzZWxmKSkgfHwgMCxcbiAgICAgICAgICBpID0gdHJpZ2dlckluZGV4LFxuICAgICAgICAgIGNzLFxuICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICBzY3JvbGwsXG4gICAgICAgICAgaXNWZXJ0aWNhbCxcbiAgICAgICAgICBvdmVycmlkZSxcbiAgICAgICAgICBjdXJUcmlnZ2VyLFxuICAgICAgICAgIGN1clBpbixcbiAgICAgICAgICBvcHBvc2l0ZVNjcm9sbCxcbiAgICAgICAgICBpbml0dGVkLFxuICAgICAgICAgIHJldmVydGVkUGlucyxcbiAgICAgICAgICBmb3JjZWRPdmVyZmxvdyxcbiAgICAgICAgICBtYXJrZXJTdGFydE9mZnNldCxcbiAgICAgICAgICBtYXJrZXJFbmRPZmZzZXQ7XG5cbiAgICAgIGlmIChtYXJrZXJzICYmIF9pc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgLy8gaWYgd2UgYWx0ZXIgdGhlIHN0YXJ0L2VuZCBwb3NpdGlvbnMgd2l0aCAuc2V0UG9zaXRpb25zKCksIGl0IGdlbmVyYWxseSBmZWVkcyBpbiBhYnNvbHV0ZSBOVU1CRVJTIHdoaWNoIGRvbid0IGNvbnZleSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0byBsaW5lIHVwIHRoZSBtYXJrZXJzLCBzbyB0byBrZWVwIGl0IGludHVpdGl2ZSwgd2UgcmVjb3JkIGhvdyBmYXIgdGhlIHRyaWdnZXIgcG9zaXRpb25zIHNoaWZ0IGFmdGVyIGFwcGx5aW5nIHRoZSBuZXcgbnVtYmVycyBhbmQgdGhlbiBvZmZzZXQgYnkgdGhhdCBtdWNoIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uIFdlIGRvIHRoZSBzYW1lIHRvIHRoZSBhc3NvY2lhdGVkIHRyaWdnZXIgbWFya2VycyB0b28gb2YgY291cnNlLlxuICAgICAgICBtYXJrZXJTdGFydE9mZnNldCA9IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyU3RhcnRUcmlnZ2VyLCBkaXJlY3Rpb24ucCk7XG4gICAgICAgIG1hcmtlckVuZE9mZnNldCA9IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLnApO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAvLyB1c2VyIG1pZ2h0IHRyeSB0byBwaW4gdGhlIHNhbWUgZWxlbWVudCBtb3JlIHRoYW4gb25jZSwgc28gd2UgbXVzdCBmaW5kIGFueSBwcmlvciB0cmlnZ2VycyB3aXRoIHRoZSBzYW1lIHBpbiwgcmV2ZXJ0IHRoZW0sIGFuZCBkZXRlcm1pbmUgaG93IGxvbmcgdGhleSdyZSBwaW5uaW5nIHNvIHRoYXQgd2UgY2FuIG9mZnNldCB0aGluZ3MgYXBwcm9wcmlhdGVseS4gTWFrZSBzdXJlIHdlIHJldmVydCBmcm9tIGxhc3QgdG8gZmlyc3Qgc28gdGhhdCB0aGluZ3MgXCJyZXdpbmRcIiBwcm9wZXJseS5cbiAgICAgICAgY3VyVHJpZ2dlciA9IF90cmlnZ2Vyc1tpXTtcbiAgICAgICAgY3VyVHJpZ2dlci5lbmQgfHwgY3VyVHJpZ2dlci5yZWZyZXNoKDAsIDEpIHx8IChfcmVmcmVzaGluZyA9IHNlbGYpOyAvLyBpZiBpdCdzIGEgdGltZWxpbmUtYmFzZWQgdHJpZ2dlciB0aGF0IGhhc24ndCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIHlldCBiZWNhdXNlIGl0J3Mgd2FpdGluZyBmb3IgMSB0aWNrLCBqdXN0IGZvcmNlIHRoZSByZWZyZXNoKCkgaGVyZSwgb3RoZXJ3aXNlIGlmIGl0IGNvbnRhaW5zIGEgcGluIHRoYXQncyBzdXBwb3NlZCB0byBhZmZlY3Qgb3RoZXIgU2Nyb2xsVHJpZ2dlcnMgZnVydGhlciBkb3duIHRoZSBwYWdlLCB0aGV5IHdvbid0IGJlIGFkanVzdGVkIHByb3Blcmx5LlxuXG4gICAgICAgIGN1clBpbiA9IGN1clRyaWdnZXIucGluO1xuXG4gICAgICAgIGlmIChjdXJQaW4gJiYgKGN1clBpbiA9PT0gdHJpZ2dlciB8fCBjdXJQaW4gPT09IHBpbiB8fCBjdXJQaW4gPT09IHBpbm5lZENvbnRhaW5lcikgJiYgIWN1clRyaWdnZXIuaXNSZXZlcnRlZCkge1xuICAgICAgICAgIHJldmVydGVkUGlucyB8fCAocmV2ZXJ0ZWRQaW5zID0gW10pO1xuICAgICAgICAgIHJldmVydGVkUGlucy51bnNoaWZ0KGN1clRyaWdnZXIpOyAvLyB3ZSdsbCByZXZlcnQgZnJvbSBmaXJzdCB0byBsYXN0IHRvIG1ha2Ugc3VyZSB0aGluZ3MgcmVhY2ggdGhlaXIgZW5kIHN0YXRlIHByb3Blcmx5XG5cbiAgICAgICAgICBjdXJUcmlnZ2VyLnJldmVydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJUcmlnZ2VyICE9PSBfdHJpZ2dlcnNbaV0pIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIGl0IGdvdCByZW1vdmVkLlxuICAgICAgICAgIHRyaWdnZXJJbmRleC0tO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfaXNGdW5jdGlvbihwYXJzZWRTdGFydCkgJiYgKHBhcnNlZFN0YXJ0ID0gcGFyc2VkU3RhcnQoc2VsZikpO1xuICAgICAgcGFyc2VkU3RhcnQgPSBfcGFyc2VDbGFtcChwYXJzZWRTdGFydCwgXCJzdGFydFwiLCBzZWxmKTtcbiAgICAgIHN0YXJ0ID0gX3BhcnNlUG9zaXRpb24ocGFyc2VkU3RhcnQsIHRyaWdnZXIsIHNpemUsIGRpcmVjdGlvbiwgc2Nyb2xsRnVuYygpLCBtYXJrZXJTdGFydCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBzZWxmLCBzY3JvbGxlckJvdW5kcywgYm9yZGVyV2lkdGgsIHVzZUZpeGVkUG9zaXRpb24sIG1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBzZWxmLl9zdGFydENsYW1wICYmIFwiX3N0YXJ0Q2xhbXBcIikgfHwgKHBpbiA/IC0wLjAwMSA6IDApO1xuICAgICAgX2lzRnVuY3Rpb24ocGFyc2VkRW5kKSAmJiAocGFyc2VkRW5kID0gcGFyc2VkRW5kKHNlbGYpKTtcblxuICAgICAgaWYgKF9pc1N0cmluZyhwYXJzZWRFbmQpICYmICFwYXJzZWRFbmQuaW5kZXhPZihcIis9XCIpKSB7XG4gICAgICAgIGlmICh+cGFyc2VkRW5kLmluZGV4T2YoXCIgXCIpKSB7XG4gICAgICAgICAgcGFyc2VkRW5kID0gKF9pc1N0cmluZyhwYXJzZWRTdGFydCkgPyBwYXJzZWRTdGFydC5zcGxpdChcIiBcIilbMF0gOiBcIlwiKSArIHBhcnNlZEVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSBfb2Zmc2V0VG9QeChwYXJzZWRFbmQuc3Vic3RyKDIpLCBzaXplKTtcbiAgICAgICAgICBwYXJzZWRFbmQgPSBfaXNTdHJpbmcocGFyc2VkU3RhcnQpID8gcGFyc2VkU3RhcnQgOiAoY29udGFpbmVyQW5pbWF0aW9uID8gZ3NhcC51dGlscy5tYXBSYW5nZSgwLCBjb250YWluZXJBbmltYXRpb24uZHVyYXRpb24oKSwgY29udGFpbmVyQW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIuc3RhcnQsIGNvbnRhaW5lckFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyLmVuZCwgc3RhcnQpIDogc3RhcnQpICsgb2Zmc2V0OyAvLyBfcGFyc2VQb3NpdGlvbiB3b24ndCBmYWN0b3IgaW4gdGhlIG9mZnNldCBpZiB0aGUgc3RhcnQgaXMgYSBudW1iZXIsIHNvIGRvIGl0IGhlcmUuXG5cbiAgICAgICAgICBwYXJzZWRFbmRUcmlnZ2VyID0gdHJpZ2dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYXJzZWRFbmQgPSBfcGFyc2VDbGFtcChwYXJzZWRFbmQsIFwiZW5kXCIsIHNlbGYpO1xuICAgICAgZW5kID0gTWF0aC5tYXgoc3RhcnQsIF9wYXJzZVBvc2l0aW9uKHBhcnNlZEVuZCB8fCAocGFyc2VkRW5kVHJpZ2dlciA/IFwiMTAwJSAwXCIgOiBtYXgpLCBwYXJzZWRFbmRUcmlnZ2VyLCBzaXplLCBkaXJlY3Rpb24sIHNjcm9sbEZ1bmMoKSArIG9mZnNldCwgbWFya2VyRW5kLCBtYXJrZXJFbmRUcmlnZ2VyLCBzZWxmLCBzY3JvbGxlckJvdW5kcywgYm9yZGVyV2lkdGgsIHVzZUZpeGVkUG9zaXRpb24sIG1heCwgY29udGFpbmVyQW5pbWF0aW9uLCBzZWxmLl9lbmRDbGFtcCAmJiBcIl9lbmRDbGFtcFwiKSkgfHwgLTAuMDAxO1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgIGkgPSB0cmlnZ2VySW5kZXg7XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY3VyVHJpZ2dlciA9IF90cmlnZ2Vyc1tpXSB8fCB7fTtcbiAgICAgICAgY3VyUGluID0gY3VyVHJpZ2dlci5waW47XG5cbiAgICAgICAgaWYgKGN1clBpbiAmJiBjdXJUcmlnZ2VyLnN0YXJ0IC0gY3VyVHJpZ2dlci5fcGluUHVzaCA8PSBzdGFydCAmJiAhY29udGFpbmVyQW5pbWF0aW9uICYmIGN1clRyaWdnZXIuZW5kID4gMCkge1xuICAgICAgICAgIGNzID0gY3VyVHJpZ2dlci5lbmQgLSAoc2VsZi5fc3RhcnRDbGFtcCA/IE1hdGgubWF4KDAsIGN1clRyaWdnZXIuc3RhcnQpIDogY3VyVHJpZ2dlci5zdGFydCk7XG5cbiAgICAgICAgICBpZiAoKGN1clBpbiA9PT0gdHJpZ2dlciAmJiBjdXJUcmlnZ2VyLnN0YXJ0IC0gY3VyVHJpZ2dlci5fcGluUHVzaCA8IHN0YXJ0IHx8IGN1clBpbiA9PT0gcGlubmVkQ29udGFpbmVyKSAmJiBpc05hTihwYXJzZWRTdGFydCkpIHtcbiAgICAgICAgICAgIC8vIG51bWVyaWMgc3RhcnQgdmFsdWVzIHNob3VsZG4ndCBiZSBvZmZzZXQgYXQgYWxsIC0gdHJlYXQgdGhlbSBhcyBhYnNvbHV0ZVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGNzICogKDEgLSBjdXJUcmlnZ2VyLnByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJQaW4gPT
811009IHBpbiAmJiAob3RoZXJQaW5PZmZzZXQgKz0gY3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0ICs9IG9mZnNldDtcbiAgICAgIGVuZCArPSBvZmZzZXQ7XG4gICAgICBzZWxmLl9zdGFydENsYW1wICYmIChzZWxmLl9zdGFydENsYW1wICs9IG9mZnNldCk7XG5cbiAgICAgIGlmIChzZWxmLl9lbmRDbGFtcCAmJiAhX3JlZnJlc2hpbmdBbGwpIHtcbiAgICAgICAgc2VsZi5fZW5kQ2xhbXAgPSBlbmQgfHwgLTAuMDAxO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbikpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2UgPSBlbmQgLSBzdGFydCB8fCAoc3RhcnQgLT0gMC4wMSkgJiYgMC4wMDE7XG5cbiAgICAgIGlmIChpc0ZpcnN0UmVmcmVzaCkge1xuICAgICAgICAvLyBvbiB0aGUgdmVyeSBmaXJzdCByZWZyZXNoKCksIHRoZSBwcmV2UHJvZ3Jlc3MgY291bGRuJ3QgaGF2ZSBiZWVuIGFjY3VyYXRlIHlldCBiZWNhdXNlIHRoZSBzdGFydC9lbmQgd2VyZSBuZXZlciBjYWxjdWxhdGVkLCBzbyB3ZSBzZXQgaXQgaGVyZS4gQmVmb3JlIDMuMTEuNSwgaXQgY291bGQgbGVhZCB0byBhbiBpbmFjY3VyYXRlIHNjcm9sbCBwb3NpdGlvbiByZXN0b3JhdGlvbiB3aXRoIHNuYXBwaW5nLlxuICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBnc2FwLnV0aWxzLmNsYW1wKDAsIDEsIGdzYXAudXRpbHMubm9ybWFsaXplKHN0YXJ0LCBlbmQsIHByZXZTY3JvbGwpKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fcGluUHVzaCA9IG90aGVyUGluT2Zmc2V0O1xuXG4gICAgICBpZiAobWFya2VyU3RhcnQgJiYgb2Zmc2V0KSB7XG4gICAgICAgIC8vIG9mZnNldCB0aGUgbWFya2VycyBpZiBuZWNlc3NhcnlcbiAgICAgICAgY3MgPSB7fTtcbiAgICAgICAgY3NbZGlyZWN0aW9uLmFdID0gXCIrPVwiICsgb2Zmc2V0O1xuICAgICAgICBwaW5uZWRDb250YWluZXIgJiYgKGNzW2RpcmVjdGlvbi5wXSA9IFwiLT1cIiArIHNjcm9sbEZ1bmMoKSk7XG4gICAgICAgIGdzYXAuc2V0KFttYXJrZXJTdGFydCwgbWFya2VyRW5kXSwgY3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGluICYmICEoX2NsYW1waW5nTWF4ICYmIHNlbGYuZW5kID49IF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbikpKSB7XG4gICAgICAgIGNzID0gX2dldENvbXB1dGVkU3R5bGUocGluKTtcbiAgICAgICAgaXNWZXJ0aWNhbCA9IGRpcmVjdGlvbiA9PT0gX3ZlcnRpY2FsO1xuICAgICAgICBzY3JvbGwgPSBzY3JvbGxGdW5jKCk7IC8vIHJlY2FsY3VsYXRlIGJlY2F1c2UgdGhlIHRyaWdnZXJzIGNhbiBhZmZlY3QgdGhlIHNjcm9sbFxuXG4gICAgICAgIHBpblN0YXJ0ID0gcGFyc2VGbG9hdChwaW5HZXR0ZXIoZGlyZWN0aW9uLmEpKSArIG90aGVyUGluT2Zmc2V0O1xuXG4gICAgICAgIGlmICghbWF4ICYmIGVuZCA+IDEpIHtcbiAgICAgICAgICAvLyBtYWtlcyBzdXJlIHRoZSBzY3JvbGxlciBoYXMgYSBzY3JvbGxiYXIsIG90aGVyd2lzZSBpZiBzb21ldGhpbmcgaGFzIHdpZHRoOiAxMDAlLCBmb3IgZXhhbXBsZSwgaXQgd291bGQgYmUgdG9vIGJpZyAoZXhjbHVkZSB0aGUgc2Nyb2xsYmFyKS4gU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzI1MTgyLXNjcm9sbHRyaWdnZXItd2lkdGgtb2YtcGFnZS1pbmNyZWFzZS13aGVyZS1tYXJrZXJzLWFyZS1zZXQtdG8tZmFsc2UvXG4gICAgICAgICAgZm9yY2VkT3ZlcmZsb3cgPSAoaXNWaWV3cG9ydCA/IF9kb2Muc2Nyb2xsaW5nRWxlbWVudCB8fCBfZG9jRWwgOiBzY3JvbGxlcikuc3R5bGU7XG4gICAgICAgICAgZm9yY2VkT3ZlcmZsb3cgPSB7XG4gICAgICAgICAgICBzdHlsZTogZm9yY2VkT3ZlcmZsb3csXG4gICAgICAgICAgICB2YWx1ZTogZm9yY2VkT3ZlcmZsb3dbXCJvdmVyZmxvd1wiICsgZGlyZWN0aW9uLmEudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGlzVmlld3BvcnQgJiYgX2dldENvbXB1dGVkU3R5bGUoX2JvZHkpW1wib3ZlcmZsb3dcIiArIGRpcmVjdGlvbi5hLnRvVXBwZXJDYXNlKCldICE9PSBcInNjcm9sbFwiKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBhbiBleHRyYSBzY3JvbGxiYXIgaWYgQk9USCA8aHRtbD4gYW5kIDxib2R5PiBoYXZlIG92ZXJmbG93IHNldCB0byBcInNjcm9sbFwiXG4gICAgICAgICAgICBmb3JjZWRPdmVyZmxvdy5zdHlsZVtcIm92ZXJmbG93XCIgKyBkaXJlY3Rpb24uYS50b1VwcGVyQ2FzZSgpXSA9IFwic2Nyb2xsXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3N3YXBQaW5JbihwaW4sIHNwYWNlciwgY3MpO1xuXG4gICAgICAgIHBpblN0YXRlID0gX2dldFN0YXRlKHBpbik7IC8vIHRyYW5zZm9ybXMgd2lsbCBpbnRlcmZlcmUgd2l0aCB0aGUgdG9wL2xlZnQvcmlnaHQvYm90dG9tIHBsYWNlbWVudCwgc28gcmVtb3ZlIHRoZW0gdGVtcG9yYXJpbHkuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGZhY3RvcnMgaW4gdHJhbnNmb3Jtcy5cblxuICAgICAgICBib3VuZHMgPSBfZ2V0Qm91bmRzKHBpbiwgdHJ1ZSk7XG4gICAgICAgIG9wcG9zaXRlU2Nyb2xsID0gdXNlRml4ZWRQb3NpdGlvbiAmJiBfZ2V0U2Nyb2xsRnVuYyhzY3JvbGxlciwgaXNWZXJ0aWNhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsKSgpO1xuXG4gICAgICAgIGlmIChwaW5TcGFjaW5nKSB7XG4gICAgICAgICAgc3BhY2VyU3RhdGUgPSBbcGluU3BhY2luZyArIGRpcmVjdGlvbi5vczIsIGNoYW5nZSArIG90aGVyUGluT2Zmc2V0ICsgX3B4XTtcbiAgICAgICAgICBzcGFjZXJTdGF0ZS50ID0gc3BhY2VyO1xuICAgICAgICAgIGkgPSBwaW5TcGFjaW5nID09PSBfcGFkZGluZyA/IF9nZXRTaXplKHBpbiwgZGlyZWN0aW9uKSArIGNoYW5nZSArIG90aGVyUGluT2Zmc2V0IDogMDtcblxuICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBzcGFjZXJTdGF0ZS5wdXNoKGRpcmVjdGlvbi5kLCBpICsgX3B4KTsgLy8gZm9yIGJveC1zaXppbmc6IGJvcmRlci1ib3ggKG11c3QgaW5jbHVkZSBwYWRkaW5nKS5cblxuICAgICAgICAgICAgc3BhY2VyLnN0eWxlLmZsZXhCYXNpcyAhPT0gXCJhdXRvXCIgJiYgKHNwYWNlci5zdHlsZS5mbGV4QmFzaXMgPSBpICsgX3B4KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfc2V0U3RhdGUoc3BhY2VyU3RhdGUpO1xuXG4gICAgICAgICAgaWYgKHBpbm5lZENvbnRhaW5lcikge1xuICAgICAgICAgICAgLy8gaW4gU2Nyb2xsVHJpZ2dlci5yZWZyZXNoKCksIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhlIHBpbkNvbnRhaW5lcidzIHNpemUgYmVjYXVzZSB0aGlzIHBpblNwYWNpbmcgbWF5IHN0cmV0Y2ggaXQgb3V0LCBidXQgd2UgY2FuJ3QganVzdCBhZGQgdGhlIGV4YWN0IGRpc3R
8110hbmNlIGJlY2F1c2UgZGVwZW5kaW5nIG9uIGxheW91dCwgaXQgbWF5IG5vdCBwdXNoIHRoaW5ncyBkb3duIG9yIGl0IG1heSBvbmx5IGRvIHNvIHBhcnRpYWxseS5cbiAgICAgICAgICAgIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgIGlmICh0LnBpbiA9PT0gcGlubmVkQ29udGFpbmVyICYmIHQudmFycy5waW5TcGFjaW5nICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHQuX3N1YlBpbk9mZnNldCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVzZUZpeGVkUG9zaXRpb24gJiYgc2Nyb2xsRnVuYyhwcmV2U2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gX2dldFNpemUocGluLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIGkgJiYgc3BhY2VyLnN0eWxlLmZsZXhCYXNpcyAhPT0gXCJhdXRvXCIgJiYgKHNwYWNlci5zdHlsZS5mbGV4QmFzaXMgPSBpICsgX3B4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VGaXhlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgb3ZlcnJpZGUgPSB7XG4gICAgICAgICAgICB0b3A6IGJvdW5kcy50b3AgKyAoaXNWZXJ0aWNhbCA/IHNjcm9sbCAtIHN0YXJ0IDogb3Bwb3NpdGVTY3JvbGwpICsgX3B4LFxuICAgICAgICAgICAgbGVmdDogYm91bmRzLmxlZnQgKyAoaXNWZXJ0aWNhbCA/IG9wcG9zaXRlU2Nyb2xsIDogc2Nyb2xsIC0gc3RhcnQpICsgX3B4LFxuICAgICAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCJcbiAgICAgICAgICB9O1xuICAgICAgICAgIG92ZXJyaWRlW193aWR0aF0gPSBvdmVycmlkZVtcIm1heFwiICsgX1dpZHRoXSA9IE1hdGguY2VpbChib3VuZHMud2lkdGgpICsgX3B4O1xuICAgICAgICAgIG92ZXJyaWRlW19oZWlnaHRdID0gb3ZlcnJpZGVbXCJtYXhcIiArIF9IZWlnaHRdID0gTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQpICsgX3B4O1xuICAgICAgICAgIG92ZXJyaWRlW19tYXJnaW5dID0gb3ZlcnJpZGVbX21hcmdpbiArIF9Ub3BdID0gb3ZlcnJpZGVbX21hcmdpbiArIF9SaWdodF0gPSBvdmVycmlkZVtfbWFyZ2luICsgX0JvdHRvbV0gPSBvdmVycmlkZVtfbWFyZ2luICsgX0xlZnRdID0gXCIwXCI7XG4gICAgICAgICAgb3ZlcnJpZGVbX3BhZGRpbmddID0gY3NbX3BhZGRpbmddO1xuICAgICAgICAgIG92ZXJyaWRlW19wYWRkaW5nICsgX1RvcF0gPSBjc1tfcGFkZGluZyArIF9Ub3BdO1xuICAgICAgICAgIG92ZXJyaWRlW19wYWRkaW5nICsgX1JpZ2h0XSA9IGNzW19wYWRkaW5nICsgX1JpZ2h0XTtcbiAgICAgICAgICBvdmVycmlkZVtfcGFkZGluZyArIF9Cb3R0b21dID0gY3NbX3BhZGRpbmcgKyBfQm90dG9tXTtcbiAgICAgICAgICBvdmVycmlkZVtfcGFkZGluZyArIF9MZWZ0XSA9IGNzW19wYWRkaW5nICsgX0xlZnRdO1xuICAgICAgICAgIHBpbkFjdGl2ZVN0YXRlID0gX2NvcHlTdGF0ZShwaW5PcmlnaW5hbFN0YXRlLCBvdmVycmlkZSwgcGluUmVwYXJlbnQpO1xuICAgICAgICAgIF9yZWZyZXNoaW5nQWxsICYmIHNjcm9sbEZ1bmMoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBtaWdodCBiZSBhZmZlY3RpbmcgdGhlIHRyYW5zZm9ybSwgc28gd2UgbXVzdCBqdW1wIHRvIHRoZSBlbmQsIGNoZWNrIHRoZSB2YWx1ZSwgYW5kIGNvbXBlbnNhdGUgYWNjb3JkaW5nbHkuIE90aGVyd2lzZSwgd2hlbiBpdCBiZWNvbWVzIHVucGlubmVkLCB0aGUgcGluU2V0dGVyKCkgd2lsbCBnZXQgc2V0IHRvIGEgdmFsdWUgdGhhdCBkb2Vzbid0IGluY2x1ZGUgd2hhdGV2ZXIgdGhlIGFuaW1hdGlvbiBkaWQuXG4gICAgICAgICAgaW5pdHRlZCA9IGFuaW1hdGlvbi5faW5pdHRlZDsgLy8gaWYgbm90LCB3ZSBtdXN0IGludmFsaWRhdGUoKSBhZnRlciB0aGlzIHN0ZXAsIG90aGVyd2lzZSBpdCBjb3VsZCBsb2NrIGluIHN0YXJ0aW5nIHZhbHVlcyBwcmVtYXR1cmVseS5cblxuICAgICAgICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMoMSk7XG5cbiAgICAgICAgICBhbmltYXRpb24ucmVuZGVyKGFuaW1hdGlvbi5kdXJhdGlvbigpLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBwaW5DaGFuZ2UgPSBwaW5HZXR0ZXIoZGlyZWN0aW9uLmEpIC0gcGluU3RhcnQgKyBjaGFuZ2UgKyBvdGhlclBpbk9mZnNldDtcbiAgICAgICAgICBwaW5Nb3ZlcyA9IE1hdGguYWJzKGNoYW5nZSAtIHBpbkNoYW5nZSkgPiAxO1xuICAgICAgICAgIHVzZUZpeGVkUG9zaXRpb24gJiYgcGluTW92ZXMgJiYgcGluQWN0aXZlU3RhdGUuc3BsaWNlKHBpbkFjdGl2ZVN0YXRlLmxlbmd0aCAtIDIsIDIpOyAvLyB0cmFuc2Zvcm0gaXMgdGhlIGxhc3QgcHJvcGVydHkvdmFsdWUgc2V0IGluIHRoZSBzdGF0ZSBBcnJheS4gU2luY2UgdGhlIGFuaW1hdGlvbiBpcyBjb250cm9sbGluZyB0aGF0LCB3ZSBzaG91bGQgb21pdCBpdC5cblxuICAgICAgICAgIGFuaW1hdGlvbi5yZW5kZXIoMCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgaW5pdHRlZCB8fCBhbmltYXRpb24uaW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgICAgICBhbmltYXRpb24ucGFyZW50IHx8IGFuaW1hdGlvbi50b3RhbFRpbWUoYW5pbWF0aW9uLnRvdGFsVGltZSgpKTsgLy8gaWYsIGZvciBleGFtcGxlLCBhIHRvZ2dsZUFjdGlvbiBjYWxsZWQgcGxheSgpIGFuZCB0aGVuIHJlZnJlc2goKSBoYXBwZW5zIGFuZCB3aGVuIHdlIHJlbmRlcigxKSBhYm92ZSwgaXQgd291bGQgY2F1c2UgdGhlIGFuaW1hdGlvbiB0byBjb21wbGV0ZSBhbmQgZ2V0IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LCBzbyB0aGlzIG1ha2VzIHN1cmUgaXQgZ2V0cyBwdXQgYmFjayBpbi5cblxuICAgICAgICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGluQ2hhbmdlID0gY2hhbmdlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yY2VkT3ZlcmZsb3cgJiYgKGZvcmNlZE92ZXJmbG93LnZhbHVlID8gZm9yY2VkT3ZlcmZsb3cuc3R5bGVbXCJvdmVyZmxvd1wiICsgZGlyZWN0aW9uLmEudG9VcHBlckNhc2UoKV0gPSBmb3JjZWRPdmVyZmxvdy52YWx1ZSA6IGZvcmNlZE92ZXJmbG93LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwib3ZlcmZsb3ctXCIgKyBkaXJlY3Rpb24uYSkpO1xuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICYmIHNjcm9sbEZ1bmMoKSAmJiAhY29udGFpbmVyQW5pbWF0aW9uKSB7XG4gICAgICAgIC8vIGl0IG1heSBiZSBJTlNJREUgYS
8110BwaW5uZWQgZWxlbWVudCwgc28gd2FsayB1cCB0aGUgdHJlZSBhbmQgbG9vayBmb3IgYW55IGVsZW1lbnRzIHdpdGggX3Bpbk9mZnNldCB0byBjb21wZW5zYXRlIGJlY2F1c2UgYW55dGhpbmcgd2l0aCBwaW5TcGFjaW5nIHRoYXQncyBhbHJlYWR5IHNjcm9sbGVkIHdvdWxkIHRocm93IG9mZiB0aGUgbWVhc3VyZW1lbnRzIGluIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGJvdW5kcyA9IHRyaWdnZXIucGFyZW50Tm9kZTtcblxuICAgICAgICB3aGlsZSAoYm91bmRzICYmIGJvdW5kcyAhPT0gX2JvZHkpIHtcbiAgICAgICAgICBpZiAoYm91bmRzLl9waW5PZmZzZXQpIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IGJvdW5kcy5fcGluT2Zmc2V0O1xuICAgICAgICAgICAgZW5kIC09IGJvdW5kcy5fcGluT2Zmc2V0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJvdW5kcyA9IGJvdW5kcy5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldmVydGVkUGlucyAmJiByZXZlcnRlZFBpbnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5yZXZlcnQoZmFsc2UsIHRydWUpO1xuICAgICAgfSk7XG4gICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICBzZWxmLmVuZCA9IGVuZDtcbiAgICAgIHNjcm9sbDEgPSBzY3JvbGwyID0gX3JlZnJlc2hpbmdBbGwgPyBwcmV2U2Nyb2xsIDogc2Nyb2xsRnVuYygpOyAvLyByZXNldCB2ZWxvY2l0eVxuXG4gICAgICBpZiAoIWNvbnRhaW5lckFuaW1hdGlvbiAmJiAhX3JlZnJlc2hpbmdBbGwpIHtcbiAgICAgICAgc2Nyb2xsMSA8IHByZXZTY3JvbGwgJiYgc2Nyb2xsRnVuYyhwcmV2U2Nyb2xsKTtcbiAgICAgICAgc2VsZi5zY3JvbGwucmVjID0gMDtcbiAgICAgIH1cblxuICAgICAgc2VsZi5yZXZlcnQoZmFsc2UsIHRydWUpO1xuICAgICAgbGFzdFJlZnJlc2ggPSBfZ2V0VGltZSgpO1xuXG4gICAgICBpZiAoc25hcERlbGF5ZWRDYWxsKSB7XG4gICAgICAgIGxhc3RTbmFwID0gLTE7IC8vIGp1c3Qgc28gc25hcHBpbmcgZ2V0cyByZS1lbmFibGVkLCBjbGVhciBvdXQgYW55IHJlY29yZGVkIGxhc3QgdmFsdWVcbiAgICAgICAgLy8gc2VsZi5pc0FjdGl2ZSAmJiBzY3JvbGxGdW5jKHN0YXJ0ICsgY2hhbmdlICogcHJldlByb2dyZXNzKTsgLy8gcHJldmlvdXNseSB0aGlzIGxpbmUgd2FzIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2hlbiBzbmFwcGluZyBraWNrcyBpbiwgaXQncyBmcm9tIHRoZSBwcmV2aW91cyBwcm9ncmVzcyBidXQgaW4gc29tZSBjYXNlcyB0aGF0J3Mgbm90IGRlc2lyYWJsZSwgbGlrZSBhbiBhbGwtcGFnZSBTY3JvbGxUcmlnZ2VyIHdoZW4gbmV3IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgcGFnZSwgdGhhdCdkIHRvdGFsbHkgY2hhbmdlIHRoZSBwcm9ncmVzcy5cblxuICAgICAgICBzbmFwRGVsYXllZENhbGwucmVzdGFydCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgX3JlZnJlc2hpbmcgPSAwO1xuICAgICAgYW5pbWF0aW9uICYmIGlzVG9nZ2xlICYmIChhbmltYXRpb24uX2luaXR0ZWQgfHwgcHJldkFuaW1Qcm9ncmVzcykgJiYgYW5pbWF0aW9uLnByb2dyZXNzKCkgIT09IHByZXZBbmltUHJvZ3Jlc3MgJiYgYW5pbWF0aW9uLnByb2dyZXNzKHByZXZBbmltUHJvZ3Jlc3MgfHwgMCwgdHJ1ZSkucmVuZGVyKGFuaW1hdGlvbi50aW1lKCksIHRydWUsIHRydWUpOyAvLyBtdXN0IGZvcmNlIGEgcmUtcmVuZGVyIGJlY2F1c2UgaWYgc2F2ZVN0eWxlcygpIHdhcyB1c2VkIG9uIHRoZSB0YXJnZXQocyksIHRoZSBzdHlsZXMgY291bGQgaGF2ZSBiZWVuIHdpcGVkIG91dCBkdXJpbmcgdGhlIHJlZnJlc2goKS5cblxuICAgICAgaWYgKGlzRmlyc3RSZWZyZXNoIHx8IHByZXZQcm9ncmVzcyAhPT0gc2VsZi5wcm9ncmVzcyB8fCBjb250YWluZXJBbmltYXRpb24gfHwgaW52YWxpZGF0ZU9uUmVmcmVzaCB8fCBhbmltYXRpb24gJiYgIWFuaW1hdGlvbi5faW5pdHRlZCkge1xuICAgICAgICAvLyBlbnN1cmVzIHRoYXQgdGhlIGRpcmVjdGlvbiBpcyBzZXQgcHJvcGVybHkgKHdoZW4gcmVmcmVzaGluZywgcHJvZ3Jlc3MgaXMgc2V0IGJhY2sgdG8gMCBpbml0aWFsbHksIHRoZW4gYmFjayBhZ2FpbiB0byB3aGVyZXZlciBpdCBuZWVkcyB0byBiZSkgYW5kIHRoYXQgY2FsbGJhY2tzIGFyZSB0cmlnZ2VyZWQuXG4gICAgICAgIGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgJiYgKGFuaW1hdGlvbi5faW5pdHRlZCB8fCBwcmV2UHJvZ3Jlc3MgfHwgYW5pbWF0aW9uLnZhcnMuaW1tZWRpYXRlUmVuZGVyICE9PSBmYWxzZSkgJiYgYW5pbWF0aW9uLnRvdGFsUHJvZ3Jlc3MoY29udGFpbmVyQW5pbWF0aW9uICYmIHN0YXJ0IDwgLTAuMDAxICYmICFwcmV2UHJvZ3Jlc3MgPyBnc2FwLnV0aWxzLm5vcm1hbGl6ZShzdGFydCwgZW5kLCAwKSA6IHByZXZQcm9ncmVzcywgdHJ1ZSk7IC8vIHRvIGF2b2lkIGlzc3VlcyB3aGVyZSBhbmltYXRpb24gY2FsbGJhY2tzIGxpa2Ugb25TdGFydCBhcmVuJ3QgdHJpZ2dlcmVkLlxuXG4gICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBpc0ZpcnN0UmVmcmVzaCB8fCAoc2Nyb2xsMSAtIHN0YXJ0KSAvIGNoYW5nZSA9PT0gcHJldlByb2dyZXNzID8gMCA6IHByZXZQcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgcGluICYmIHBpblNwYWNpbmcgJiYgKHNwYWNlci5fcGluT2Zmc2V0ID0gTWF0aC5yb3VuZChzZWxmLnByb2dyZXNzICogcGluQ2hhbmdlKSk7XG4gICAgICBzY3J1YlR3ZWVuICYmIHNjcnViVHdlZW4uaW52YWxpZGF0ZSgpO1xuXG4gICAgICBpZiAoIWlzTmFOKG1hcmtlclN0YXJ0T2Zmc2V0KSkge1xuICAgICAgICAvLyBudW1iZXJzIHdlcmUgcGFzc2VkIGluIGZvciB0aGUgcG9zaXRpb24gd2hpY2ggYXJlIGFic29sdXRlLCBzbyBpbnN0ZWFkIG9mIGp1c3QgcHV0dGluZyB0aGUgbWFya2VycyBhdCB0aGUgdmVyeSBib3R0b20gb2YgdGhlIHZpZXdwb3J0LCB3ZSBmaWd1cmUgb3V0IGhvdyBmYXIgdGhleSBzaGlmdGVkIGRvd24gKGl0J3Mgc2FmZSB0byBhc3N1bWUgdGhleSB3ZXJlIG9yaWdpbmFsbHkgcG9zaXRpb25lZCBpbiBjbG9zZXIgcmVsYXRpb24gdG8gdGhlIHRyaWdnZXIgZWxlbWVudCB3aXRoIHZhbHVlcyBsaWtlIFwidG9wXCIsIFwiY2VudGVyXCIsIGEgcGVyY2VudGFnZSBvciB3aGF0ZXZlciwgc28gd2Ugb2Zmc2V0IHRoYXQgbXVjaCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIHRvIGJhc2ljYWxseSByZXZlcnQgdGhlbSB0byB0aGUgcmVsYXRpdmUgcG9zaXRpb24gdGh5IHdlcmUgYXQgcHJldmlvdXNseS5cbiAgICAgICAgbWFya2VyU3RhcnRPZmZzZXQgLT0gZ3NhcC5nZXRQcm9wZXJ0eShtYXJrZXJTdGFydFRyaWdnZXIsIGRpcmVjdGlvbi5wKTtcbiAgICAgICAgbWFya2VyRW5kT2Zmc2V0IC09IGdzYXAuZ2V0UHJvcGVydHkobWFya2VyRW5kVHJpZ2dlciwgZGlyZWN0aW9uLnApO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJTdGFydFRyaWdnZXIsIGRpcmVjdGlvbiwgbWFya2VyU3RhcnRPZmZzZXQpO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJTdGFydCwgZGlyZWN0aW9uLCBtYXJrZXJTdGFydE9mZnNldCAtIChwaW5PZmZzZXQgfHwgMCkpO1xuXG4gICAgICAgIF9zaGlmdE1hcmtlcihtYXJrZXJFbmRUcmlnZ2VyLCBkaXJlY3Rpb24sIG1hcmtlckVuZE9mZnNldCk7XG5cbiAgICAgICAgX3NoaWZ0TWFya2VyKG1hcmtlckVuZCwgZGlyZWN0aW9uLCBtYXJrZXJFbmRPZmZzZXQgLSAocGluT2Zmc2V0IHx8IDApKTtcbiAgICAgIH1cblxuICAgICAgaXNGaXJzdFJlZnJlc2ggJiYgIV9yZWZyZXNoaW5nQWxsICYmIHNlbGYudXBkYXRlKCk7IC8vIGVkZ2UgY2FzZSAtIHdoZW4geW91IHJlbG9hZCBh
8110IHBhZ2Ugd2hlbiBpdCdzIGFscmVhZHkgc2Nyb2xsZWQgZG93biwgc29tZSBicm93c2VycyBmaXJlIGEgXCJzY3JvbGxcIiBldmVudCBiZWZvcmUgRE9NQ29udGVudExvYWRlZCwgdHJpZ2dlcmluZyBhbiB1cGRhdGVBbGwoKS4gSWYgd2UgZG9uJ3QgdXBkYXRlIHRoZSBzZWxmLnByb2dyZXNzIGFzIHBhcnQgb2YgcmVmcmVzaCgpLCB0aGVuIHdoZW4gaXQgaGFwcGVucyBuZXh0LCBpdCBtYXkgcmVjb3JkIHByZXZQcm9ncmVzcyBhcyAwIHdoZW4gaXQgcmVhbGx5IHNob3VsZG4ndCwgcG90ZW50aWFsbHkgY2F1c2luZyBhIGNhbGxiYWNrIGluIGFuIGFuaW1hdGlvbiB0byBmaXJlIGFnYWluLlxuXG4gICAgICBpZiAob25SZWZyZXNoICYmICFfcmVmcmVzaGluZ0FsbCAmJiAhZXhlY3V0aW5nT25SZWZyZXNoKSB7XG4gICAgICAgIC8vIHdoZW4gcmVmcmVzaGluZyBhbGwsIHdlIGRvIGV4dHJhIHdvcmsgdG8gY29ycmVjdCBwaW5uZWRDb250YWluZXIgc2l6ZXMgYW5kIGVuc3VyZSB0aGluZ3MgZG9uJ3QgZXhjZWVkIHRoZSBtYXhTY3JvbGwsIHNvIHdlIHNob3VsZCBkbyBhbGwgdGhlIHJlZnJlc2hlcyBhdCB0aGUgZW5kIGFmdGVyIGFsbCB0aGF0IHdvcmsgc28gdGhhdCB0aGUgc3RhcnQvZW5kIHZhbHVlcyBhcmUgY29ycmVjdGVkLlxuICAgICAgICBleGVjdXRpbmdPblJlZnJlc2ggPSB0cnVlO1xuICAgICAgICBvblJlZnJlc2goc2VsZik7XG4gICAgICAgIGV4ZWN1dGluZ09uUmVmcmVzaCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZWxmLmdldFZlbG9jaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIChzY3JvbGxGdW5jKCkgLSBzY3JvbGwyKSAvIChfZ2V0VGltZSgpIC0gX3RpbWUyKSAqIDEwMDAgfHwgMDtcbiAgICB9O1xuXG4gICAgc2VsZi5lbmRBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfZW5kQW5pbWF0aW9uKHNlbGYuY2FsbGJhY2tBbmltYXRpb24pO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHNjcnViVHdlZW4gPyBzY3J1YlR3ZWVuLnByb2dyZXNzKDEpIDogIWFuaW1hdGlvbi5wYXVzZWQoKSA/IF9lbmRBbmltYXRpb24oYW5pbWF0aW9uLCBhbmltYXRpb24ucmV2ZXJzZWQoKSkgOiBpc1RvZ2dsZSB8fCBfZW5kQW5pbWF0aW9uKGFuaW1hdGlvbiwgc2VsZi5kaXJlY3Rpb24gPCAwLCAxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5sYWJlbFRvU2Nyb2xsID0gZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICByZXR1cm4gYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5sYWJlbHMgJiYgKHN0YXJ0IHx8IHNlbGYucmVmcmVzaCgpIHx8IHN0YXJ0KSArIGFuaW1hdGlvbi5sYWJlbHNbbGFiZWxdIC8gYW5pbWF0aW9uLmR1cmF0aW9uKCkgKiBjaGFuZ2UgfHwgMDtcbiAgICB9O1xuXG4gICAgc2VsZi5nZXRUcmFpbGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2Y
8110XIgaSA9IF90cmlnZ2Vycy5pbmRleE9mKHNlbGYpLFxuICAgICAgICAgIGEgPSBzZWxmLmRpcmVjdGlvbiA+IDAgPyBfdHJpZ2dlcnMuc2xpY2UoMCwgaSkucmV2ZXJzZSgpIDogX3RyaWdnZXJzLnNsaWNlKGkgKyAxKTtcblxuICAgICAgcmV0dXJuIChfaXNTdHJpbmcobmFtZSkgPyBhLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC52YXJzLnByZXZlbnRPdmVybGFwcyA9PT0gbmFtZTtcbiAgICAgIH0pIDogYSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBzZWxmLmRpcmVjdGlvbiA+IDAgPyB0LmVuZCA8PSBzdGFydCA6IHQuc3RhcnQgPj0gZW5kO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNlbGYudXBkYXRlID0gZnVuY3Rpb24gKHJlc2V0LCByZWNvcmRWZWxvY2l0eSwgZm9yY2VGYWtlKSB7XG4gICAgICBpZiAoY29udGFpbmVyQW5pbWF0aW9uICYmICFmb3JjZUZha2UgJiYgIXJlc2V0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNjcm9sbCA9IF9yZWZyZXNoaW5nQWxsID09PSB0cnVlID8gcHJldlNjcm9sbCA6IHNlbGYuc2Nyb2xsKCksXG4gICAgICAgICAgcCA9IHJlc2V0ID8gMCA6IChzY3JvbGwgLSBzdGFydCkgLyBjaGFuZ2UsXG4gICAgICAgICAgY2xpcHBlZCA9IHAgPCAwID8gMCA6IHAgPiAxID8gMSA6IHAgfHwgMCxcbiAgICAgICAgICBwcmV2UHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzLFxuICAgICAgICAgIGlzQWN0aXZlLFxuICAgICAgICAgIHdhc0FjdGl2ZSxcbiAgICAgICAgICB0b2dnbGVTdGF0ZSxcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgc3RhdGVDaGFuZ2VkLFxuICAgICAgICAgIHRvZ2dsZWQsXG4gICAgICAgICAgaXNBdE1heCxcbiAgICAgICAgICBpc1Rha2luZ0FjdGlvbjtcblxuICAgICAgaWYgKHJlY29yZFZlbG9jaXR5KSB7XG4gICAgICAgIHNjcm9sbDIgPSBzY3JvbGwxO1xuICAgICAgICBzY3JvbGwxID0gY29udGFpbmVyQW5pbWF0aW9uID8gc2Nyb2xsRnVuYygpIDogc2Nyb2xsO1xuXG4gICAgICAgIGlmIChzbmFwKSB7XG4gICAgICAgICAgc25hcDIgPSBzbmFwMTtcbiAgICAgICAgICBzbmFwMSA9IGFuaW1hdGlvbiAmJiAhaXNUb2dnbGUgPyBhbmltYXRpb24udG90YWxQcm9ncmVzcygpIDogY2xpcHBlZDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBhbnRpY2lwYXRlIHRoZSBwaW5uaW5nIGEgZmV3IHRpY2tzIGFoZWFkIG9mIHRpbWUgYmFzZWQgb24gdmVsb2NpdHkgdG8gYXZvaWQgYSB2aXN1YWwgZ2xpdGNoIGR1ZSB0byB0aGUgZmFjdCB0aGF0IG1vc3QgYnJvd3NlcnMgZG8gc2Nyb2xsaW5nIG9uIGEgc2VwYXJhdGUgdGhyZWFkIChub3Qgc3luY2VkIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lKS5cblxuXG4gICAgICBpZiAoYW50aWNpcGF0ZVBpbiAmJiBwaW4gJiYgIV9yZWZyZXNoaW5nICYmICFfc3RhcnR1cCAmJiBfbGFzdFNjcm9sbFRpbWUpIHtcbiAgICAgICAgaWYgKCFjbGlwcGVkICYmIHN0YXJ0IDwgc2Nyb2xsICsgKHNjcm9sbCAtIHNjcm9sbDIpIC8gKF9nZXRUaW1lKCkgLSBfdGltZTIpICogYW50aWNpcGF0ZVBpbikge1xuICAgICAgICAgIGNsaXBwZWQgPSAwLjAwMDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY2xpcHBlZCA9PT0gMSAmJiBlbmQgPiBzY3JvbGwgKyAoc2Nyb2xsIC0gc2Nyb2xsMikgLyAoX2dldFRpbWUoKSAtIF90aW1lMikgKiBhbnRpY2lwYXRlUGluKSB7XG4gICAgICAgICAgY2xpcHBlZCA9IDAuOTk5OTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2xpcHBlZCAhPT0gcHJldlByb2dyZXNzICYmIHNlbGYuZW5hYmxlZCkge1xuICAgICAgICBpc0FjdGl2ZSA9IHNlbGYuaXNBY3RpdmUgPSAhIWNsaXBwZWQgJiYgY2xpcHBlZCA8IDE7XG4gICAgICAgIHdhc0FjdGl2ZSA9ICEhcHJldlByb2dyZXNzICYmIHByZXZQcm9ncmVzcyA8IDE7XG4gICAgICAgIHRvZ2dsZWQgPSBpc0FjdGl2ZSAhPT0gd2FzQWN0aXZlO1xuICAgICAgICBzdGF0ZUNoYW5nZWQgPSB0b2dnbGVkIHx8ICEhY2xpcHBlZCAhPT0gISFwcmV2UHJvZ3Jlc3M7IC8vIGNvdWxkIGdvIGZyb20gc3RhcnQgYWxsIHRoZSB3YXkgdG8gZW5kLCB0aHVzIGl0IGRpZG4ndCB0b2dnbGUgYnV0IGl0IGRpZCBjaGFuZ2Ugc3RhdGUgaW4gYSBzZW5zZSAobWF5IG5lZWQgdG8gZmlyZSBhIGNhbGxiYWNrKVxuXG4gICAgICAgIHNlbGYuZGlyZWN0aW9uID0gY2xpcHBlZCA+IHByZXZQcm9ncmVzcyA/IDEgOiAtMTtcbiAgICAgICAgc2VsZi5wcm9ncmVzcyA9IGNsaXBwZWQ7XG5cbiAgICAgICAgaWYgKHN0YXRlQ2hhbmdlZCAmJiAhX3JlZnJlc2hpbmcpIHtcbiAgICAgICAgICB0b2dnbGVTdGF0ZSA9IGNsaXBwZWQgJiYgIXByZXZQcm9ncmVzcyA/IDAgOiBjbGlwcGVkID09PSAxID8gMSA6IHByZXZQcm9ncmVzcyA9PT0gMSA/IDIgOiAzOyAvLyAwID0gZW50ZXIsIDEgPSBsZWF2ZSwgMiA9IGVudGVyQmFjaywgMyA9IGxlYXZlQmFjayAod2UgcHJpb3JpdGl6ZSB0aGUgRklSU1QgZW5jb3VudGVyLCB0aHVzIGlmIHlvdSBzY3JvbGwgcmVhbGx5IGZhc3QgcGFzdCB0aGUgb25FbnRlciBhbmQgb25MZWF2ZSBpbiBvbmUgdGljaywgaXQnZCBwcmlvcml0aXplIG9uRW50ZXIuXG5cbiAgICAgICAgICBpZiAoaXNUb2dnbGUpIHtcbiAgICAgICAgICAgIGFjdGlvbiA9ICF0b2dnbGVkICYmIHRvZ2dsZUFjdGlvbnNbdG9nZ2xlU3RhdGUgKyAxXSAhPT0gXCJub25lXCIgJiYgdG9nZ2xlQWN0aW9uc1t0b2dnbGVTdGF0ZSArIDFdIHx8IHRvZ2dsZUFjdGlvbnNbdG9nZ2xlU3RhdGVdOyAvLyBpZiBpdCBkaWRuJ3QgdG9nZ2xlLCB0aGF0IG1lYW5zIGl0IHNob3QgcmlnaHQgcGFzdCBhbmQgc2luY2Ugd2UgcHJpb3JpdGl6ZSB0aGUgXCJlbnRlclwiIGFjdGlvbiwgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGUgXCJsZWF2ZVwiIGluIHRoaXMgY2FzZSAoYnV0IG9ubHkgaWYgb25lIGlzIGRlZmluZWQpXG5cbiAgICAgICAgICAgIGlzVGFraW5nQWN0aW9uID0gYW5pbWF0aW9uICYmIChhY3Rpb24gPT09IFwiY29tcGxldGVcIiB8fCBhY3Rpb24gPT09IFwicmVzZXRcIiB8fCBhY3Rpb24gaW4gYW5pbWF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgI
8110H1cblxuICAgICAgICBwcmV2ZW50T3ZlcmxhcHMgJiYgKHRvZ2dsZWQgfHwgaXNUYWtpbmdBY3Rpb24pICYmIChpc1Rha2luZ0FjdGlvbiB8fCBzY3J1YiB8fCAhYW5pbWF0aW9uKSAmJiAoX2lzRnVuY3Rpb24ocHJldmVudE92ZXJsYXBzKSA/IHByZXZlbnRPdmVybGFwcyhzZWxmKSA6IHNlbGYuZ2V0VHJhaWxpbmcocHJldmVudE92ZXJsYXBzKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQuZW5kQW5pbWF0aW9uKCk7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIWlzVG9nZ2xlKSB7XG4gICAgICAgICAgaWYgKHNjcnViVHdlZW4gJiYgIV9yZWZyZXNoaW5nICYmICFfc3RhcnR1cCkge1xuICAgICAgICAgICAgc2NydWJUd2Vlbi5fZHAuX3RpbWUgLSBzY3J1YlR3ZWVuLl9zdGFydCAhPT0gc2NydWJUd2Vlbi5fdGltZSAmJiBzY3J1YlR3ZWVuLnJlbmRlcihzY3J1YlR3ZWVuLl9kcC5fdGltZSAtIHNjcnViVHdlZW4uX3N0YXJ0KTsgLy8gaWYgdGhlcmUncyBhIHNjcnViIG9uIGJvdGggdGhlIGNvbnRhaW5lciBhbmltYXRpb24gYW5kIHRoaXMgb25lIChvciBhIFNjcm9sbFNtb290aGVyKSwgdGhlIHVwZGF0ZSBvcmRlciB3b3VsZCBjYXVzZSB0aGlzIG9uZSBub3QgdG8gaGF2ZSByZW5kZXJlZCB5ZXQsIHNvIGl0IHdvdWxkbid0IG1ha2UgYW55IHByb2dyZXNzIGJlZm9yZSB3ZSAucmVzdGFydCgpIGl0IGhlYWRpbmcgdG93YXJkIHRoZSBuZXcgcHJvZ3Jlc3Mgc28gaXQnZCBhcHBlYXIgc3R1Y2sgdGh1cyB3ZSBmb3JjZSBhIHJlbmRlciBoZXJlLlxuXG4gICAgICAgICAgICBpZiAoc2NydWJUd2Vlbi5yZXNldFRvKSB7XG4gICAgICAgICAgICAgIHNjcnViVHdlZW4ucmVzZXRUbyhcInRvdGFsUHJvZ3Jlc3NcIiwgY2xpcHBlZCwgYW5pbWF0aW9uLl90VGltZSAvIGFuaW1hdGlvbi5fdER1cik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBsZWdhY3kgc3VwcG9ydCAoY291cnRlc3kpLCBiZWZvcmUgMy4xMC4wXG4gICAgICAgICAgICAgIHNjcnViVHdlZW4udmFycy50b3RhbFByb2dyZXNzID0gY2xpcHBlZDtcbiAgICAgICAgICAgICAgc2NydWJUd2Vlbi5pbnZhbGlkYXRlKCkucmVzdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBhbmltYXRpb24udG90YWxQcm9ncmVzcyhjbGlwcGVkLCAhIShfcmVmcmVzaGluZyAmJiAobGFzdFJlZnJlc2ggfHwgcmVzZXQpKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpbikge1xuICAgICAgICAgIHJlc2V0ICYmIHBpblNwYWNpbmcgJiYgKHNwYWNlci5zdHlsZVtwaW5TcGFjaW5nICsgZGlyZWN0aW9uLm9zMl0gPSBzcGFjaW5nU3RhcnQpO1xuXG4gICAgICAgICAgaWYgKCF1c2VGaXhlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBwaW5TZXR0ZXIoX3JvdW5kKHBpblN0YXJ0ICsgcGluQ2hhbmdlICogY2xpcHBlZCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICBpc0F0TWF4ID0gIXJlc2V0ICYmIGNsaXBwZWQgPiBwcmV2UHJvZ3Jlc3MgJiYgZW5kICsgMSA+IHNjcm9sbCAmJiBzY3JvbGwgKyAxID49IF9tYXhTY3JvbGwoc2Nyb2xsZXIsIGRpcmVjdGlvbik7IC8vIGlmIGl0J3MgYXQgdGhlIFZFUlkgZW5kIG9mIHRoZSBwYWdlLCBkb24ndCBzd2l0Y2ggYXdheSBmcm9tIHBvc2l0aW9uOiBmaXhlZCBiZWNhdXNlIGl0J3MgcG9pbnRsZXNzIGFuZCBpdCBjb3VsZCBjYXVzZSBhIGJyaWVmIGZsYXNoIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBiYWNrIHVwICh3aGVuIGl0IGdldHMgcGlubmVkIGFnYWluKVxuXG4gICAgICAgICAgICBpZiAocGluUmVwYXJlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCFyZXNldCAmJiAoaXNBY3RpdmUgfHwgaXNBdE1heCkpIHtcbiAgICAgICAgICAgICAgICB2Y
8110XIgYm91bmRzID0gX2dldEJvdW5kcyhwaW4sIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0ID0gc2Nyb2xsIC0gc3RhcnQ7XG5cbiAgICAgICAgICAgICAgICBfcmVwYXJlbnQocGluLCBfYm9keSwgYm91bmRzLnRvcCArIChkaXJlY3Rpb24gPT09IF92ZXJ0aWNhbCA/IF9vZmZzZXQgOiAwKSArIF9weCwgYm91bmRzLmxlZnQgKyAoZGlyZWN0aW9uID09PSBfdmVydGljYWwgPyAwIDogX29mZnNldCkgKyBfcHgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9yZXBhcmVudChwaW4sIHNwYWNlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3NldFN0YXRlKGlzQWN0aXZlIHx8IGlzQXRNYXggPyBwaW5BY3RpdmVTdGF0ZSA6IHBpblN0YXRlKTtcblxuICAgICAgICAgICAgcGluTW92ZXMgJiYgY2xpcHBlZCA8IDEgJiYgaXNBY3RpdmUgfHwgcGluU2V0dGVyKHBpblN0YXJ0ICsgKGNsaXBwZWQgPT09IDEgJiYgIWlzQXRNYXggPyBwaW5DaGFuZ2UgOiAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc25hcCAmJiAhdHdlZW5Uby50d2VlbiAmJiAhX3JlZnJlc2hpbmcgJiYgIV9zdGFydHVwICYmIHNuYXBEZWxheWVkQ2FsbC5yZXN0YXJ0KHRydWUpO1xuICAgICAgICB0b2dnbGVDbGFzcyAmJiAodG9nZ2xlZCB8fCBvbmNlICYmIGNsaXBwZWQgJiYgKGNsaXBwZWQgPCAxIHx8ICFfbGltaXRDYWxsYmFja3MpKSAmJiBfdG9BcnJheSh0b2dnbGVDbGFzcy50YXJnZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbaXNBY3RpdmUgfHwgb25jZSA/IFwiYWRkXCIgOiBcInJlbW92ZVwiXSh0b2dnbGVDbGFzcy5jbGFzc05hbWUpO1xuICAgICAgICB9KTsgLy8gY2xhc3NlcyBjb3VsZCBhZmZlY3QgcG9zaXRpb25pbmcsIHNvIGRvIGl0IGV2ZW4gaWYgcmVzZXQgb3IgcmVmcmVzaGluZyBpcyB0cnVlLlxuXG4gICAgICAgIG9uVXBkYXRlICYmICFpc1RvZ2dsZSAmJiAhcmVzZXQgJiYgb25VcGRhdGUoc2VsZik7XG5cbiAgICAgICAgaWYgKHN0YXRlQ2hhbmdlZCAmJiAhX3JlZnJlc2hpbmcpIHtcbiAgICAgICAgICBpZiAoaXNUb2dnbGUpIHtcbiAgICAgICAgICAgIGlmIChpc1Rha2luZ0FjdGlvbikge1xuICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSBcImNvbXBsZXRlXCIpIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24ucGF1c2UoKS50b3RhbFByb2dyZXNzKDEpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gXCJyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLnJlc3RhcnQodHJ1ZSkucGF1c2UoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwicmVzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLnJlc3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uW2FjdGlvbl0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvblVwZGF0ZSAmJiBvblVwZGF0ZShzZWxmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodG9nZ2xlZCB8fCAhX2xpbWl0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAvLyBvbiBzdGFydHVwLCB0aGUgcGFnZSBjb3VsZCBiZSBzY3JvbGxlZCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBmaXJlIGNhbGxiYWNrcyB0aGF0IGRpZG4ndCB0b2dnbGUuIEZvciBleGFtcGxlIG9uRW50ZXIgc2hvdWxkbid0IGZpcmUgaWYgdGhlIFNjcm9sbFRyaWdnZXIgaXNuJ3QgYWN0dWFsbHkgZW50ZXJlZC5cbiAgICAgICAgICAgIG9uVG9nZ2xlICYmIHRvZ2dsZWQgJiYgX2NhbGxiYWNrKHNlbGYsIG9uVG9nZ2xlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrc1t0b2dnbGVTdGF0ZV0gJiYgX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrc1t0b2dnbGVTdGF0ZV0pO1xuICAgICAgICAgICAgb25jZSAmJiAoY2xpcHBlZCA9PT0gMSA/IHNlbGYua2lsbChmYWxzZSwgMSkgOiBjYWxsYmFja3NbdG9nZ2xlU3RhdGVdID0gMCk7IC8vIGEgY2FsbGJhY2sgc2hvdWxkbid0IGJlIGNhbGxlZCBhZ2FpbiBpZiBvbmNlIGlzIHRydWUuXG5cbiAgICAgICAgICAgIGlmICghdG9nZ2xlZCkge1xuICAgICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRvIGdvIGNvbXBsZXRlbHkgcGFzdCwgbGlrZSBmcm9tIGJlZm9yZSB0aGUgc3RhcnQgdG8gYWZ0ZXIgdGhlIGVuZCAob3IgdmljZS12ZXJzYSkgaW4gd2hpY2ggY2FzZSBCT1RIIGNhbGxiYWNrcyBzaG91bGQgYmUgZmlyZWQgaW4gdGhhdCBvcmRlclxuICAgICAgICAgICAgICB0b2dnbGVTdGF0ZSA9IGNsaXBwZWQgPT09IDEgPyAxIDogMztcbiAgICAgICAgICAgICAgY2FsbGJhY2tzW3RvZ2dsZVN0YXRlXSAmJiBfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2tzW3RvZ2dsZVN0YXRlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZhc3RTY3JvbGxFbmQgJiYgIWlzQWN0aXZlICYmIE1hdGguYWJzKHNlbGYuZ2V0VmVsb2NpdHkoKSkgPiAoX2lzTnVtYmVyKGZhc3RTY3JvbGxFbmQpID8gZmFzdFNjcm9sbEVuZCA6IDI1MDApKSB7XG4gICAgICAgICAgICBfZW5kQW5pbWF0aW9uKHNlbGYuY2FsbGJhY2tBbmltYXRpb24pO1xuXG4gICAgICAgICAgICBzY3J1YlR3ZWVuID8gc2NydWJUd2Vlbi5wcm9ncmVzcygxKSA6IF9lbmRBbmltYXRpb24oYW5pbWF0aW9uLCBhY3Rpb24gPT09IFwicmV2ZXJzZVwiID8gMSA6ICFjbGlwcGVkLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNUb2dnbGUgJiYgb25VcGRhdGUgJiYgIV9yZWZyZXNoaW5nKSB7XG4gICAgICAgICAgb25VcGRhdGUoc2VsZik7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gdXBkYXRlIGFic29sdXRlbHktcG9zaXRpb25lZCBtYXJrZXJzIChvbmx5IGlmIHRoZSBzY3JvbGxlciBpc24ndCB0aGUgdmlld3BvcnQpXG5cblxuICAgICAgaWYgKG1hcmtlckVuZFNldHRlcikge1xuICAgICAgICB2Y
8110XIgbiA9IGNvbnRhaW5lckFuaW1hdGlvbiA/IHNjcm9sbCAvIGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpICogKGNvbnRhaW5lckFuaW1hdGlvbi5fY2FTY3JvbGxEaXN0IHx8IDApIDogc2Nyb2xsO1xuICAgICAgICBtYXJrZXJTdGFydFNldHRlcihuICsgKG1hcmtlclN0YXJ0VHJpZ2dlci5faXNGbGlwcGVkID8gMSA6IDApKTtcbiAgICAgICAgbWFya2VyRW5kU2V0dGVyKG4pO1xuICAgICAgfVxuXG4gICAgICBjYU1hcmtlclNldHRlciAmJiBjYU1hcmtlclNldHRlcigtc2Nyb2xsIC8gY29udGFpbmVyQW5pbWF0aW9uLmR1cmF0aW9uKCkgKiAoY29udGFpbmVyQW5pbWF0aW9uLl9jYVNjcm9sbERpc3QgfHwgMCkpO1xuICAgIH07XG5cbiAgICBzZWxmLmVuYWJsZSA9IGZ1bmN0aW9uIChyZXNldCwgcmVmcmVzaCkge1xuICAgICAgaWYgKCFzZWxmLmVuYWJsZWQpIHtcbiAgICAgICAgc2VsZi5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwicmVzaXplXCIsIF9vblJlc2l6ZSk7XG5cbiAgICAgICAgaXNWaWV3cG9ydCB8fCBfYWRkTGlzdGVuZXIoc2Nyb2xsZXIsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG4gICAgICAgIG9uUmVmcmVzaEluaXQgJiYgX2FkZExpc3RlbmVyKFNjcm9sbFRyaWdnZXIsIFwicmVmcmVzaEluaXRcIiwgb25SZWZyZXNoSW5pdCk7XG5cbiAgICAgICAgaWYgKHJlc2V0ICE9PSBmYWxzZSkge1xuICAgICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBwcmV2UHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgIHNjcm9sbDEgPSBzY3JvbGwyID0gbGFzdFNuYXAgPSBzY3JvbGxGdW5jKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZWZyZXNoICE9PSBmYWxzZSAmJiBzZWxmLnJlZnJlc2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5nZXRUd2VlbiA9IGZ1bmN0aW9uIChzbmFwKSB7XG4gICAgICByZXR1cm4gc25hcCAmJiB0d2VlblRvID8gdHdlZW5Uby50d2VlbiA6IHNjcnViVHdlZW47XG4gICAgfTtcblxuICAgIHNlbGYuc2V0UG9zaXRpb25zID0gZnVuY3Rpb24gKG5ld1N0YXJ0LCBuZXdFbmQsIGtlZXBDbGFtcCwgcGluT2Zmc2V0KSB7XG4gICAgICAvLyBkb2Vzbid0IHBlcnNpc3QgYWZ0ZXIgcmVmcmVzaCgpISBJbnRlbmRlZCB0byBiZSBhIHdheSB0byBvdmVycmlkZSB2YWx1ZXMgdGhhdCB3ZXJlIHNldCBkdXJpbmcgcmVmcmVzaCgpLCBsaWtlIHlvdSBjb3VsZCBzZXQgaXQgaW4gb25SZWZyZXNoKClcbiAgICAgIGlmIChjb250YWluZXJBbmltYXRpb24pIHtcbiAgICAgICAgLy8gY29udmVydCByYXRpb3MgaW50byBzY3JvbGwgcG9zaXRpb25zLiBSZW1lbWJlciwgc3RhcnQvZW5kIHZhbHVlcyBvbiBTY3JvbGxUcmlnZ2VycyB0aGF0IGhhdmUgYSBjb250YWluZXJBbmltYXRpb24gcmVmZXIgdG8gdGhlIHRpbWUgKGluIHNlY29uZHMpLCBOT1Qgc2Nyb2xsIHBvc2l0aW9ucy5cbiAgICAgICAgdmFyIHN0ID0gY29udGFpbmVyQW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIsXG4gICAgICAgICAgICBkdXJhdGlvbiA9IGNvbnRhaW5lckFuaW1hdGlvbi5kdXJhdGlvbigpLFxuICAgICAgICAgICAgX2NoYW5nZSA9IHN0LmVuZCAtIHN0LnN0YXJ0O1xuXG4gICAgICAgIG5ld1N0YXJ0ID0gc3Quc3RhcnQgKyBfY2hhbmdlICogbmV3U3RhcnQgLyBkdXJhdGlvbjtcbiAgICAgICAgbmV3RW5kID0gc3Quc3RhcnQgKyBfY2hhbmdlICogbmV3RW5kIC8gZHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHNlbGYucmVmcmVzaChmYWxzZSwgZmFsc2UsIHtcbiAgICAgICAgc3RhcnQ6IF9rZWVwQ2xhbXAobmV3U3RhcnQsIGtlZXBDbGFtcCAmJiAhIXNlbGYuX3N0YXJ0Q2xhbXApLFxuICAgICAgICBlbmQ6IF9rZWVwQ2xhbXAobmV3RW5kLCBrZWVwQ2xhbXAgJiYgISFzZWxmLl9lbmRDbGFtcClcbiAgICAgIH0sIHBpbk9mZnNldCk7XG4gICAgICBzZWxmLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBzZWxmLmFkanVzdFBpblNwYWNpbmcgPSBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICBpZiAoc3BhY2VyU3RhdGUgJiYgYW1vdW50KSB7XG4gICAgICAgIHZhciBpID0gc3BhY2VyU3RhdGUuaW5kZXhPZihkaXJlY3Rpb24uZCkgKyAxO1xuICAgICAgICBzcGFjZXJTdGF0ZVtpXSA9IHBhcnNlRmxvYXQoc3BhY2VyU3RhdGVbaV0pICsgYW1vdW50ICsgX3B4O1xuICAgICAgICBzcGFjZXJTdGF0ZVsxXSA9IHBhcnNlRmxvYXQoc3BhY2VyU3RhdGVbMV0pICsgYW1vdW50ICsgX3B4O1xuXG4gICAgICAgIF9zZXRTdGF0ZShzcGFjZXJTdGF0ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNlbGYuZGlzYWJsZSA9IGZ1bmN0aW9uIChyZXNldCwgYWxsb3dBbmltYXRpb24pIHtcbiAgICAgIHJlc2V0ICE9PSBmYWxzZSAmJiBzZWxmLnJldmVydCh0cnVlLCB0cnVlKTtcblxuICAgICAgaWYgKHNlbGYuZW5hYmxlZCkge1xuICAgICAgICBzZWxmLmVuYWJsZWQgPSBzZWxmLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGFsbG93QW5pbWF0aW9uIHx8IHNjcnViVHdlZW4gJiYgc2NydWJUd2Vlbi5wYXVzZSgpO1xuICAgICAgICBwcmV2U2Nyb2xsID0gMDtcbiAgICAgICAgcGluQ2FjaGUgJiYgKHBpbkNhY2hlLnVuY2FjaGUgPSAxKTtcbiAgICAgICAgb25SZWZyZXNoSW5pdCAmJiBfcmVtb3ZlTGlzdGVuZXIoU2Nyb2xsVHJpZ2dlciwgXCJyZWZyZXNoSW5pdFwiLCBvblJlZnJlc2hJbml0KTtcblxuICAgICAgICBpZiAoc25hcERlbGF5ZWRDYWxsKSB7XG4gICAgICAgICAgc25hcERlbGF5ZWRDYWxsLnBhdXNlKCk7XG4gICAgICAgICAgdHdlZW5Uby50d2VlbiAmJiB0d2VlblRvLnR3ZWVuLmtpbGwoKSAmJiAodHdlZW5Uby50d2VlbiA9IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZpZXdwb3J0KSB7XG4gICAgICAgICAgdmFyIGkgPSBfdHJpZ2dlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKF90cmlnZ2Vyc1tpXS5zY3JvbGxlciA9PT0gc2Nyb2xsZXIgJiYgX3RyaWdnZXJzW2ldICE9PSBzZWxmKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy9kb24ndCByZW1vdmUgdGhlIGxpc3RlbmVycyBpZiB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdHJpZ2dlcnMgcmVmZXJlbmNpbmcgaXQuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3JlbW92ZUxpc3RlbmVyKHNjcm9sbGVyLCBcInJlc2l6ZVwiLCBfb25S
8110ZXNpemUpO1xuXG4gICAgICAgICAgaXNWaWV3cG9ydCB8fCBfcmVtb3ZlTGlzdGVuZXIoc2Nyb2xsZXIsIFwic2Nyb2xsXCIsIF9vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2VsZi5raWxsID0gZnVuY3Rpb24gKHJldmVydCwgYWxsb3dBbmltYXRpb24pIHtcbiAgICAgIHNlbGYuZGlzYWJsZShyZXZlcnQsIGFsbG93QW5pbWF0aW9uKTtcbiAgICAgIHNjcnViVHdlZW4gJiYgIWFsbG93QW5pbWF0aW9uICYmIHNjcnViVHdlZW4ua2lsbCgpO1xuICAgICAgaWQgJiYgZGVsZXRlIF9pZHNbaWRdO1xuXG4gICAgICB2YXIgaSA9IF90cmlnZ2Vycy5pbmRleE9mKHNlbGYpO1xuXG4gICAgICBpID49IDAgJiYgX3RyaWdnZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIGkgPT09IF9pICYmIF9kaXJlY3Rpb24gPiAwICYmIF9pLS07IC8vIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSByZWZyZXNoKCkgb3IgdXBkYXRlKCksIHNwbGljaW5nIHdvdWxkIGNhdXNlIHNraXBzIGluIHRoZSBpbmRleCwgc28gYWRqdXN0Li4uXG4gICAgICAvLyBpZiBubyBvdGhlciBTY3JvbGxUcmlnZ2VyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzY3JvbGxlciBhcmUgZm91bmQsIHdpcGUgb3V0IGFueSByZWNvcmRlZCBzY3JvbGwgcG9zaXRpb24uIE90aGVyd2lzZSwgaW4gYSBzaW5nbGUgcGFnZSBhcHBsaWNhdGlvbiwgZm9yIGV4YW1wbGUsIGl0IGNvdWxkIG1haW50YWluIHNjcm9sbCBwb3NpdGlvbiB3aGVuIGl0IHJlYWxseSBzaG91bGRuJ3QuXG5cbiAgICAgIGkgPSAwO1xuXG4gICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zY3JvbGxlciA9PT0gc2VsZi5zY3JvbGxlciAmJiAoaSA9IDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGkgfHwgX3JlZnJlc2hpbmdBbGwgfHwgKHNlbGYuc2Nyb2xsLnJlYyA9IDApO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIGFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyID0gbnVsbDtcbiAgICAgICAgcmV2ZXJ0ICYmIGFuaW1hdGlvbi5yZXZlcnQoe1xuICAgICAgICAgIGtpbGw6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBhbGxvd0FuaW1hdGlvbiB8fCBhbmltYXRpb24ua2lsbCgpO1xuICAgICAgfVxuXG4gICAgICBtYXJrZXJTdGFydCAmJiBbbWFya2VyU3RhcnQsIG1hcmtlckVuZCwgbWFya2VyU3RhcnRUcmlnZ2VyLCBtYXJrZXJFbmRUcmlnZ2VyXS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHJldHVybiBtLnBhcmVudE5vZGUgJiYgbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG0pO1xuICAgICAgfSk7XG4gICAgICBfcHJpbWFyeSA9PT0gc2VsZiAmJiAoX3ByaW1hcnkgPSAwKTtcblxuICAgICAgaWYgKHBpbikge1xuICAgICAgICBwaW5DYWNoZSAmJiAocGluQ2FjaGUudW5jYWNoZSA9IDEpO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB0LnBpbiA9PT0gcGluICYmIGkrKztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaSB8fCAocGluQ2FjaGUuc3BhY2VyID0gMCk7IC8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgbW9yZSBTY3JvbGxUcmlnZ2VycyB3aXRoIHRoZSBzYW1lIHBpbiwgcmVtb3ZlIHRoZSBzcGFjZXIsIG90aGVyd2lzZSBpdCBjb3VsZCBiZSBjb250YW1pbmF0ZWQgd2l0aCBvbGQvc3RhbGUgdmFsdWVzIGlmIHRoZSB1c2VyIHJlLWNyZWF0ZXMgYSBTY3JvbGxUcmlnZ2VyIGZvciB0aGUgc2FtZSBlbGVtZW50LlxuICAgICAgfVxuXG4gICAgICB2Y
8110XJzLm9uS2lsbCAmJiB2YXJzLm9uS2lsbChzZWxmKTtcbiAgICB9O1xuXG4gICAgX3RyaWdnZXJzLnB1c2goc2VsZik7XG5cbiAgICBzZWxmLmVuYWJsZShmYWxzZSwgZmFsc2UpO1xuICAgIGN1c3RvbVJldmVydFJldHVybiAmJiBjdXN0b21SZXZlcnRSZXR1cm4oc2VsZik7XG5cbiAgICBpZiAoYW5pbWF0aW9uICYmIGFuaW1hdGlvbi5hZGQgJiYgIWNoYW5nZSkge1xuICAgICAgLy8gaWYgdGhlIGFuaW1hdGlvbiBpcyBhIHRpbWVsaW5lLCBpdCBtYXkgbm90IGhhdmUgYmVlbiBwb3B1bGF0ZWQgeWV0LCBzbyBpdCB3b3VsZG4ndCByZW5kZXIgYXQgdGhlIHByb3BlciBwbGFjZSBvbiB0aGUgZmlyc3QgcmVmcmVzaCgpLCB0aHVzIHdlIHNob3VsZCBzY2hlZHVsZSBvbmUgZm9yIHRoZSBuZXh0IHRpY2suIElmIFwiY2hhbmdlXCIgaXMgZGVmaW5lZCwgd2Uga25vdyBpdCBtdXN0IGJlIHJlLWVuYWJsaW5nLCB0aHVzIHdlIGNhbiByZWZyZXNoKCkgcmlnaHQgYXdheS5cbiAgICAgIHZhciB1cGRhdGVGdW5jID0gc2VsZi51cGRhdGU7IC8vIHNvbWUgYnJvd3NlcnMgbWF5IGZpcmUgYSBzY3JvbGwgZXZlbnQgQkVGT1JFIGEgdGljayBlbGFwc2VzIGFuZC9vciB0aGUgRE9NQ29udGVudExvYWRlZCBmaXJlcy4gU28gdGhlcmUncyBhIGNoYW5jZSB1cGRhdGUoKSB3aWxsIGJlIGNhbGxlZCBCRUZPUkUgYSByZWZyZXNoKCkgaGFzIGhhcHBlbmVkIG9uIGEgVGltZWxpbmUtYXR0YWNoZWQgU2Nyb2xsVHJpZ2dlciB3aGljaCBtZWFucyB0aGUgc3RhcnQvZW5kIHdvbid0IGJlIGNhbGN1bGF0ZWQgeWV0LiBXZSBkb24ndCB3YW50IHRvIGFkZCBjb25kaXRpb25hbCBsb2dpYyBpbnNpZGUgdGhlIHVwZGF0ZSgpIG1ldGhvZCAobGlrZSBjaGVjayB0byBzZWUgaWYgZW5kIGlzIGRlZmluZWQgYW5kIGlmIG5vdCwgZm9yY2UgYSByZWZyZXNoKCkpIGJlY2F1c2UgdGhhdCdzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIGhpdCBh
8110IExPVCAocGVyZm9ybWFuY2UpLiBTbyB3ZSBzd2FwIG91dCB0aGUgcmVhbCB1cGRhdGUoKSBtZXRob2QgZm9yIHRoaXMgb25lIHRoYXQnbGwgcmUtYXR0YWNoIGl0IHRoZSBmaXJzdCB0aW1lIGl0IGdldHMgY2FsbGVkIGFuZCBvZiBjb3Vyc2UgZm9yY2VzIGEgcmVmcmVzaCgpLlxuXG4gICAgICBzZWxmLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGUgPSB1cGRhdGVGdW5jO1xuICAgICAgICBfc2Nyb2xsZXJzLmNhY2hlKys7IC8vIG90aGVyd2lzZSBhIGNhY2hlZCBzY3JvbGwgcG9zaXRpb24gbWF5IGdldCB1c2VkIGluIHRoZSByZWZyZXNoKCkgaW4gYSB2ZXJ5IHJhcmUgc2NlbmFyaW8sIGxpa2UgaWYgU2Nyb2xsVHJpZ2dlcnMgYXJlIGNyZWF0ZWQgaW5zaWRlIGEgRE9NQ29udGVudExvYWRlZCBldmVudCBhbmQgdGhlIHF1ZXVlZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSBmaXJlcyBiZWZvcmVoYW5kLiBTZWUgaHR0cHM6Ly9nc2FwLmNvbS9jb21tdW5pdHkvZm9ydW1zL3RvcGljLzQxMjY3LXNjcm9sbHRyaWdnZXItYnJlYWtzLW9uLXJlZnJlc2gtd2hlbi11c2luZy1kb21jb250ZW50bG9hZGVkL1xuXG4gICAgICAgIHN0YXJ0IHx8IGVuZCB8fCBzZWxmLnJlZnJlc2goKTtcbiAgICAgIH07XG5cbiAgICAgIGdzYXAuZGVsYXllZENhbGwoMC4wMSwgc2VsZi51cGRhdGUpO1xuICAgICAgY2hhbmdlID0gMC4wMTtcbiAgICAgIHN0YXJ0ID0gZW5kID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcGluICYmIF9xdWV1ZVJlZnJlc2hBbGwoKTsgLy8gcGlubmluZyBjb3VsZCBhZmZlY3QgdGhlIHBvc2l0aW9ucyBvZiBvdGhlciB0aGluZ3MsIHNvIG1ha2Ugc3VyZSB3ZSBxdW
8110V1ZSBhIGZ1bGwgcmVmcmVzaCgpXG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGNvcmUpIHtcbiAgICBpZiAoIV9jb3JlSW5pdHRlZCkge1xuICAgICAgZ3NhcCA9IGNvcmUgfHwgX2dldEdTQVAoKTtcbiAgICAgIF93aW5kb3dFeGlzdHMoKSAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgU2Nyb2xsVHJpZ2dlci5lbmFibGUoKTtcbiAgICAgIF9jb3JlSW5pdHRlZCA9IF9lbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiBfY29yZUluaXR0ZWQ7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5kZWZhdWx0cyA9IGZ1bmN0aW9uIGRlZmF1bHRzKGNvbmZpZykge1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gY29uZmlnKSB7XG4gICAgICAgIF9kZWZhdWx0c1twXSA9IGNvbmZpZ1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2RlZmF1bHRzO1xuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuZGlzYWJsZSA9IGZ1bmN0aW9uIGRpc2FibGUocmVzZXQsIGtpbGwpIHtcbiAgICBfZW5hYmxlZCA9IDA7XG5cbiAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgcmV0dXJuIHRyaWdnZXJba2lsbCA/IFwia2lsbFwiIDogXCJkaXNhYmxlXCJdKHJlc2V0KTtcbiAgICB9KTtcblxuICAgIF9yZW1vdmVMaXN0ZW5lcihfd2luLCBcIndoZWVsXCIsIF9vblNjcm9sbCk7XG5cbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2RvYywgXCJzY3JvbGxcIiwgX29uU2Nyb2xsKTtcblxuICAgIGNsZWFySW50ZXJ2YWwoX3N5bmNJbnRlcnZhbCk7XG5cbiAgICBfcmVtb3ZlTGlzdGVuZXIoX2RvYywgXCJ0b3VjaGNhbmNlbFwiLCBfcGFzc1Rocm91Z2gpO1xuXG4gICAgX3JlbW92ZUxpc3RlbmVyKF9ib2R5LCBcInRvdWNoc3RhcnRcIiwgX3Bhc3NUaHJvdWdoKTtcblxuICAgIF9tdWx0aUxpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVyZG93bix0b3VjaHN0YXJ0LG1vdXNlZG93blwiLCBfcG9pbnRlckRvd25IYW5kbGVyKTtcblxuICAgIF9tdWx0aUxpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVydXAsdG91Y2hlbmQsbW91c2V1cFwiLCBfcG9pbnRlclVwSGFuZGxlcik7XG5cbiAgICBfcmVzaXplRGVsYXkua2lsbCgpO1xuXG4gICAgX2l0ZXJhdGVBdXRvUmVmcmVzaChfcmVtb3ZlTGlzdGVuZXIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfc2Nyb2xsZXJzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICBfd2hlZWxMaXN0ZW5lcihfcmVtb3ZlTGlzdGVuZXIsIF9zY3JvbGxlcnNbaV0sIF9zY3JvbGxlcnNbaSArIDFdKTtcblxuICAgICAgX3doZWVsTGlzdGVuZXIoX3JlbW92ZUxpc3RlbmVyLCBfc2Nyb2xsZXJzW2ldLCBfc2Nyb2xsZXJzW2kgKyAyXSk7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIF93aW4gPSB3aW5kb3c7XG4gICAgX2RvYyA9IGRvY3VtZW50O1xuICAgIF9kb2NFbCA9IF9kb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgIF9ib2R5ID0gX2RvYy5ib2R5O1xuXG4gICAgaWYgKGdzYXApIHtcbiAgICAgIF90b0FycmF5ID0gZ3NhcC51dGlscy50b0FycmF5O1xuICAgICAgX2NsYW1wID0gZ3NhcC51dGlscy5jbGFtcDtcbiAgICAgIF9jb250ZXh0ID0gZ3NhcC5jb3JlLmNvbnRleHQgfHwgX3Bhc3NUaHJvdWdoO1xuICAgICAgX3N1cHByZXNzT3ZlcndyaXRlcyA9IGdzYXAuY29yZS5zdXBwcmVzc092ZXJ3cml0ZXMgfHwgX3Bhc3NUaHJvdWdoO1xuICAgICAgX3Njcm9sbFJlc3RvcmF0aW9uID0gX3dpbi5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uIHx8IFwiYXV0b1wiO1xuICAgICAgX2xhc3RTY3JvbGwgPSBfd2luLnBhZ2VZT2Zmc2V0IHx8IDA7XG4gICAgICBnc2FwLmNvcmUuZ2xvYmFscyhcIlNjcm9sbFRyaWdnZXJcIiwgU2Nyb2xsVHJpZ2dlcik7IC8vIG11c3QgcmVnaXN0ZXIgdGhlIGdsb2JhbCBtYW51YWxseSBiZWNhdXNlIGluIEludGVybmV0IEV4cGxvcmVyLCBmdW5jdGlvbnMgKGNsYXNzZXMpIGRvbid0IGhhdmUgYSBcIm5hbWVcIiBwcm9wZXJ0eS5cblxuICAgICAgaWYgKF9ib2R5KSB7XG4gICAgICAgIF9lbmFibGVkID0gMTtcbiAgICAgICAgX2RpdjEwMHZoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gdG8gc29sdmUgbW9iaWxlIGJyb3dzZXIgYWRkcmVzcyBiYXIgc2hvdy9oaWRlIHJlc2l6aW5nLCB3ZSBzaG91bGRuJ3QgcmVseSBvbiB3aW5kb3cuaW5uZXJIZWlnaHQuIEluc3RlYWQsIHVzZSBhIDxkaXY+IHdpdGggaXRzIGhlaWdodCBzZXQgdG8gMTAwdmggYW5kIG1lYXN1cmUgdGhhdCBzaW5jZSB0aGF0J3Mgd2hhdCB0aGUgc2Nyb2xsaW5nIGlzIGJhc2VkIG9uIGFueXdheSBhbmQgaXQncyBub3QgYWZmZWN0ZWQgYnkgYWRkcmVzcyBiYXIgc2hvd2luZy9oaWRpbmcuXG5cbiAgICAgICAgX2RpdjEwMHZoLnN0eWxlLmhlaWdodCA9IFwiMTAwdmhcIjtcbiAgICAgICAgX2RpdjEwMHZoLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXG4gICAgICAgIF9yZWZyZXNoMTAwdmgoKTtcblxuICAgICAgICBfcmFmQnVnRml4KCk7XG5cbiAgICAgICAgT2JzZXJ2ZXIucmVnaXN0ZXIoZ3NhcCk7IC8vIGlzVG91Y2ggaXMgMCBpZiBubyB0b3VjaCwgMSBpZiBPTkxZIHRvdWNoLCBhbmQgMiBpZiBpdCBjYW4gYWNjb21tb2RhdGUgdG91Y2ggYnV0IGFsc28gb3RoZXIgdHlwZXMgbGlrZSBtb3VzZS9wb2ludGVyLlxuXG4gICAgICAgIFNjcm9sbFRyaWdnZXIuaXNUb3VjaCA9IE9ic2VydmVyLmlzVG91Y2g7XG4gICAgICAgIF9maXhJT1NCdWcgPSBPYnNlcnZlci5pc1RvdWNoICYmIC8oaVBhZHxpUGhvbmV8aVBvZHxNYWMpL2cudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsgLy8gc2luY2UgMjAxNywgaU9TIGhhcyBoYWQgYSBidWcgdGhhdCBjYXVzZXMgZXZlbnQuY2xpZW50WC9ZIHRvIGJlIGluYWNjdXJhdGUgd2hlbiBhIHNjcm9sbCBvY2N1cnMsIHRodXMgd2UgbXVzdCBhbHRlcm5hdGUgaWdub3JpbmcgZXZlcnkgb3RoZXIgdG91Y2htb3ZlIGV2ZW50IHRvIHdvcmsgYXJvdW5kIGl0LiBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MTk1NCBhbmQgaHR0cHM6Ly9jb2RlcGVuLmlvL0dyZWVuU29jay9wZW4vRXhiclBOYS8wODdjZWYxOTdkYzM1NDQ1YTA5NTFlODkzNWM0MTUwM1xuXG4gICAgICAgIF9pZ25vcmVNb2JpbGVSZXNpemUgPSBPYnNlcnZlci5pc1RvdWNoID09PSAxO1xuXG4gICAgICAgIF9hZGRMaXN0ZW5lcihfd2luLCBcIndoZWVsXCIsIF9vblNjcm9sbCk7IC8vIG1vc3RseSBmb3IgM3JkIHBhcnR5IHNtb290aCBzY3JvbGxpbmcgbGlicmFyaWVzLlxuXG5cbiAgICAgICAgX3Jvb3QgPSBbX3dpbiwgX2RvYywgX2RvY0VsLCBfYm9keV07XG5cbiAgICAgICAgaWYgKGdzYXAubWF0Y2hNZWRpYSkge1xuICAgICAgICAgIFNjcm9sbFRyaWdnZXIubWF0Y2hNZWRpYSA9IGZ1bmN0aW9uICh2YXJzKSB7XG4gICAgICAgICAgICB2Y
8110XIgbW0gPSBnc2FwLm1hdGNoTWVkaWEoKSxcbiAgICAgICAgICAgICAgICBwO1xuXG4gICAgICAgICAgICBmb3IgKHAgaW4gdmFycykge1xuICAgICAgICAgICAgICBtbS5hZGQocCwgdmFyc1twXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtbTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYUluaXRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3JlY29yZFNjcm9sbFBvc2l0aW9ucygpO1xuXG4gICAgICAgICAgICBfcmV2ZXJ0QWxsKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYVJldmVydFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldmVydFJlY29yZGVkKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZ3NhcC5hZGRFdmVudExpc3RlbmVyKFwibWF0Y2hNZWRpYVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfcmVmcmVzaEFsbCgwLCAxKTtcblxuICAgICAgICAgICAgX2Rpc3BhdGNoKFwibWF0Y2hNZWRpYVwiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBnc2FwLm1hdGNoTWVkaWEoKS5hZGQoXCIob3JpZW50YXRpb246IHBvcnRyYWl0KVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyB3aGVuIG9yaWVudGF0aW9uIGNoYW5nZXMsIHdlIHNob3VsZCB0YWtlIG5ldyBiYXNlIG1lYXN1cmVtZW50cyBmb3IgdGhlIGlnbm9yZU1vYmlsZVJlc2l6ZSBmZWF0dXJlLlxuICAgICAgICAgICAgX3NldEJhc2VEaW1lbnNpb25zKCk7XG5cbiAgICAgICAgICAgIHJldHVybiBfc2V0QmFzZURpbWVuc2lvbnM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiUmVxdWlyZXMgR1NBUCAzLjExLjAgb3IgbGF0ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBfc2V0QmFzZURpbWVuc2lvbnMoKTtcblxuICAgICAgICBfYWRkTGlzdGVuZXIoX2RvYywgXCJzY3JvbGxcIiwgX29uU2Nyb2xsKTsgLy8gc29tZSBicm93c2VycyAobGlrZSBDaHJvbWUpLCB0aGUgd2luZG93IHN0b3BzIGRpc3BhdGNoaW5nIHNjcm9sbCBldmVudHMgb24gdGhlIHdpbmRvdyBpZiB5b3Ugc2Nyb2xsIHJlYWxseSBmYXN0LCBidXQgaXQncyBjb25zaXN0ZW50IG9uIHRoZSBkb2N1bWVudCFcblxuXG4gICAgICAgIHZhciBib2R5SGFzU3R5bGUgPSBfYm9keS5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSxcbiAgICAgICAgICAgIGJvZHlTdHlsZSA9IF9ib2R5LnN0eWxlLFxuICAgICAgICAgICAgYm9yZGVyID0gYm9keVN0eWxlLmJvcmRlclRvcFN0eWxlLFxuICAgICAgICAgICAgQW5pbWF0aW9uUHJvdG8gPSBnc2FwLmNvcmUuQW5pbWF0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgQW5pbWF0aW9uUHJvdG8ucmV2ZXJ0IHx8IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbmltYXRpb25Qcm90bywgXCJyZXZlcnRcIiwge1xuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWUoLTAuMDEsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChBbmltYXRpb24ucmV2ZXJ0KCkgd2FzIGFkZGVkIGFmdGVyIDMuMTAuNClcblxuICAgICAgICBib2R5U3R5bGUuYm9yZGVyVG9wU3R5bGUgPSBcInNvbGlkXCI7IC8vIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBhIG1hcmdpbiBvZiBhIGNoaWxkIGVsZW1lbnQgY291bGQgdGhyb3cgb2ZmIHRoZSBib3VuZHMgb2YgdGhlIF9ib2R5LCBtYWtpbmcgaXQgc2VlbSBsaWtlIHRoZXJlJ3MgYSBtYXJnaW4gd2hlbiB0aGVyZSBhY3R1YWxseSBpc24ndC4gVGhlIGJvcmRlciBlbnN1cmVzIHRoYXQgdGhlIGJvdW5kcyBhcmUgYWNjdXJhdGUuXG5cbiAgICAgICAgYm91bmRzID0gX2dldEJvdW5kcyhfYm9keSk7XG4gICAgICAgIF92ZXJ0aWNhbC5tID0gTWF0aC5yb3VuZChib3VuZHMudG9wICsgX3ZlcnRpY2FsLnNjKCkpIHx8IDA7IC8vIGFjY29tbW9kYXRlIHRoZSBvZmZzZXQgb2YgdGhlIDxib2R5PiBjYXVzZWQgYnkgbWFyZ2lucyBhbmQvb3IgcGFkZGluZ1xuXG4gICAgICAgIF9ob3Jpem9udGFsLm0gPSBNYXRoLnJvdW5kKGJvdW5kcy5sZWZ0ICsgX2hvcml6b250YWwuc2MoKSkgfHwgMDtcbiAgICAgICAgYm9yZGVyID8gYm9keVN0eWxlLmJvcmRlclRvcFN0eWxlID0gYm9yZGVyIDogYm9keVN0eWxlLnJlbW92ZVByb3BlcnR5KFwiYm9yZGVyLXRvcC1zdHlsZVwiKTtcblxuICAgICAgICBpZiAoIWJvZHlIYXNTdHlsZSkge1xuICAgICAgICAgIC8vIFNTUiBmcmFtZXdvcmtzIGxpa2UgTmV4dC5qcyBjb21wbGFpbiBpZiB0aGlzIGF0dHJpYnV0ZSBnZXRzIGFkZGVkLlxuICAgICAgICAgIF9ib2R5LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiXCIpOyAvLyBpdCdzIG5vdCBlbm91Z2ggdG8ganVzdCByZW1vdmVBdHRyaWJ1dGUoKSAtIHdlIG11c3QgZmlyc3Qgc2V0IGl0IHRvIGVtcHR5LCBvdGhlcndpc2UgTmV4dC5qcyBjb21wbGFpbnMuXG5cblxuICAgICAgICAgIF9ib2R5LnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IC8vIFRPRE86ICg/KSBtYXliZSBtb3ZlIHRvIGxldmVyYWdpbmcgdGhlIHZlbG9jaXR5IG1lY2hhbmlzbSBpbiBPYnNlcnZlciBhbmQgc2tpcCBpbnRlcnZhbHMuXG5cblxuICAgICAgICBfc3luY0ludGVydmFsID0gc2V0SW50ZXJ2YWwoX3N5bmMsIDI1MCk7XG4gICAgICAgIGdzYXAuZGVsYXllZENhbGwoMC41LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9zdGFydHVwID0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX2FkZExpc3RlbmVyKF9kb2MsIFwidG91Y2hjYW5jZWxcIiwgX3Bhc3NUaHJvdWdoKTsgLy8gc29tZSBvbGRlciBBbmRyb2lkIGRldmljZXMgaW50ZXJtaXR0ZW50bHkgc3RvcCBkaXNwYXRjaGluZyBcInRvdWNobW92ZVwiIGV2ZW50cyBpZiB3ZSBkb24ndCBsaXN0ZW4gZm9yIFwidG91Y2hjYW5jZWxcIiBvbiB0aGUgZG9jdW1lbnQuXG5cblxuICAgICAgICBfYWRkTGlzdGVuZXIoX2JvZHksIFwidG91Y2hzdGFydFwiLCBfcGFzc1Rocm91Z2gpOyAvL3dvcmtzIGFyb3VuZCBTYWZhcmkgYnVnOiBodHRwczovL2dzYXAuY29tL2ZvcnVtcy90b3BpYy8yMTQ1MC1kcmFnZ2FibGUtaW4taWZyYW1lLW9uLW1vYmlsZS1pcy1idWdneS9cblxuXG4gICAgICAgIF9tdWx0aUxpc3RlbmVyKF9hZGRMaXN0ZW5lciwgX2RvYywgXCJwb2ludGVyZG93bix0b3VjaHN0YXJ0LG1vdXNlZG93blwiLCBfcG9pbnRlckRvd25IYW5kbGVyKTtcblxuICAgICAgICBfbXVsdGlMaXN0ZW5lcihfYWRkTGlzdGVuZXIsIF9kb2MsIFwicG9pbnRlcnVwLH
8110RvdWNoZW5kLG1vdXNldXBcIiwgX3BvaW50ZXJVcEhhbmRsZXIpO1xuXG4gICAgICAgIF90cmFuc2Zvcm1Qcm9wID0gZ3NhcC51dGlscy5jaGVja1ByZWZpeChcInRyYW5zZm9ybVwiKTtcblxuICAgICAgICBfc3RhdGVQcm9wcy5wdXNoKF90cmFuc2Zvcm1Qcm9wKTtcblxuICAgICAgICBfY29yZUluaXR0ZWQgPSBfZ2V0VGltZSgpO1xuICAgICAgICBfcmVzaXplRGVsYXkgPSBnc2FwLmRlbGF5ZWRDYWxsKDAuMiwgX3JlZnJlc2hBbGwpLnBhdXNlKCk7XG4gICAgICAgIF9hdXRvUmVmcmVzaCA9IFtfZG9jLCBcInZpc2liaWxpdHljaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB3ID0gX3dpbi5pbm5lcldpZHRoLFxuICAgICAgICAgICAgICBoID0gX3dpbi5pbm5lckhlaWdodDtcblxuICAgICAgICAgIGlmIChfZG9jLmhpZGRlbikge1xuICAgICAgICAgICAgX3ByZXZXaWR0aCA9IHc7XG4gICAgICAgICAgICBfcHJldkhlaWdodCA9IGg7XG4gICAgICAgICAgfSBlbHNlIGlmIChfcHJldldpZHRoICE9PSB3IHx8IF9wcmV2SGVpZ2h0ICE9PSBoKSB7XG4gICAgICAgICAgICBfb25SZXNpemUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9kb2MsIFwiRE9NQ29udGVudExvYWRlZFwiLCBfcmVmcmVzaEFsbCwgX3dpbiwgXCJsb2FkXCIsIF9yZWZyZXNoQWxsLCBfd2luLCBcInJlc2l6ZVwiLCBfb25SZXNpemVdO1xuXG4gICAgICAgIF9pdGVyYXRlQXV0b1JlZnJlc2goX2FkZExpc3RlbmVyKTtcblxuICAgICAgICBfdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyLmVuYWJsZSgwLCAxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IF9zY3JvbGxlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICBfd2hlZWxMaXN0ZW5lcihfcmVtb3ZlTGlzdGVuZXIsIF9zY3JvbGxlcnNbaV0sIF9zY3JvbGxlcnNbaSArIDFdKTtcblxuICAgICAgICAgIF93aGVlbExpc3RlbmVyKF9yZW1vdmVMaXN0ZW5lciwgX3Njcm9sbGVyc1tpXSwgX3Njcm9sbGVyc1tpICsgMl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF9kb2MpIHtcbiAgICAgICAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uIG9uTG9hZCgpIHtcbiAgICAgICAgICBTY3JvbGxUcmlnZ2VyLmVuYWJsZSgpO1xuXG4gICAgICAgICAgX2RvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBvbkxvYWQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIF9kb2MuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgb25Mb2FkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5jb25maWcgPSBmdW5jdGlvbiBjb25maWcodmFycykge1xuICAgIFwibGltaXRDYWxsYmFja3NcIiBpbiB2YXJzICYmIChfbGltaXRDYWxsYmFja3MgPSAhIXZhcnMubGltaXRDYWxsYmFja3MpO1xuICAgIHZhciBtcyA9IHZhcnMuc3luY0ludGVydmFsO1xuICAgIG1zICYmIGNsZWFySW50ZXJ2YWwoX3N5bmNJbnRlcnZhbCkgfHwgKF9zeW5jSW50ZXJ2YWwgPSBtcykgJiYgc2V0SW50ZXJ2YWwoX3N5bmMsIG1zKTtcbiAgICBcImlnbm9yZU1vYmlsZVJlc2l6ZVwiIGluIHZhcnMgJiYgKF9pZ25vcmVNb2JpbGVSZXNpemUgPSBTY3JvbGxUcmlnZ2VyLmlzVG91Y2ggPT09IDEgJiYgdmFycy5pZ25vcmVNb2JpbGVSZXNpemUpO1xuXG4gICAgaWYgKFwiYXV0b1JlZnJlc2hFdmVudHNcIiBpbiB2YXJzKSB7XG4gICAgICBfaXRlcmF0ZUF1dG9SZWZyZXNoKF9yZW1vdmVMaXN0ZW5lcikgfHwgX2l0ZXJhdGVBdXRvUmVmcmVzaChfYWRkTGlzdGVuZXIsIHZhcnMuYXV0b1JlZnJlc2hFdmVudHMgfHwgXCJub25lXCIpO1xuICAgICAgX2lnbm9yZVJlc2l6ZSA9ICh2YXJzLmF1dG9SZWZyZXNoRXZlbnRzICsgXCJcIikuaW5kZXhPZihcInJlc2l6ZVwiKSA9PT0gLTE7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIuc2Nyb2xsZXJQcm94eSA9IGZ1bmN0aW9uIHNjcm9sbGVyUHJveHkodGFyZ2V0LCB2YXJzKSB7XG4gICAgdmFyIHQgPSBfZ2V0VGFyZ2V0KHRhcmdldCksXG4gICAgICAgIGkgPSBfc2Nyb2xsZXJzLmluZGV4T2YodCksXG4gICAgICAgIGlzVmlld3BvcnQgPSBfaXNWaWV3cG9ydCh0KTtcblxuICAgIGlmICh+aSkge1xuICAgICAgX3Njcm9sbGVycy5zcGxpY2UoaSwgaXNWaWV3cG9ydCA/IDYgOiAyKTtcbiAgICB9XG5cbiAgICBpZiAodmFycykge1xuICAgICAgaXNWaWV3cG9ydCA/IF9wcm94aWVzLnVuc2hpZnQoX3dpbiwgdmFycywgX2JvZHksIHZhcnMsIF9kb2NFbCwgdmFycykgOiBfcHJveGllcy51bnNoaWZ0KHQsIHZhcnMpO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxUcmlnZ2VyLmNsZWFyTWF0Y2hNZWRpYSA9IGZ1bmN0aW9uIGNsZWFyTWF0Y2hNZWRpYShxdWVyeSkge1xuICAgIF90cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5fY3R4ICYmIHQuX2N0eC5xdWVyeSA9PT0gcXVlcnkgJiYgdC5fY3R4LmtpbGwodHJ1ZSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5pc0luVmlld3BvcnQgPSBmdW5jdGlvbiBpc0luVmlld3BvcnQoZWxlbWVudCwgcmF0aW8sIGhvcml6b250YWwpIHtcbiAgICB2YXIgYm91bmRzID0gKF9pc1N0cmluZyhlbGVtZW50KSA/IF9nZXRUYXJnZXQoZWxlbWVudCkgOiBlbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgb2Zmc2V0ID0gYm91bmRzW2hvcml6b250YWwgPyBfd2lkdGggOiBfaGVpZ2h0XSAqIHJhdGlvIHx8IDA7XG4gICAgcmV0dXJuIGhvcml6b250YWwgPyBib3VuZHMucmlnaHQgLSBvZmZzZXQgPiAwICYmIGJvdW5kcy5sZWZ0ICsgb2Zmc2V0IDwgX3dpbi5pbm5lcldpZHRoIDogYm91bmRzLmJvdHRvbSAtIG9mZnNldCA+IDAgJiYgYm91bmRzLnRvcCArIG9mZnNldCA8IF93aW4uaW5uZXJIZWlnaHQ7XG4gIH07XG5cbiAgU2Nyb2xsVHJpZ2dlci5wb3NpdGlvbkluVmlld3BvcnQgPSBmdW5jdGlvbiBwb3NpdGlvbkluVmlld3BvcnQoZWxlbWVudCwgcmVmZXJlbmNlUG9pbnQsIGhvcml6b250YWwpIHtcbiAgICBfaXNTdHJpbmcoZWxlbWVudCkgJiYgKGVsZW1lbnQgPSBfZ2V0VGFyZ2V0KGVsZW1lbnQpKTtcbiAgICB2YXIgYm91bmRzID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgc2l6ZSA9IGJvdW5kc1tob3Jpem9udGFsID8gX3dpZHRoIDogX2hlaWdodF0sXG4gICAgICAgIG9mZnNldCA9IHJlZmVyZW5jZVBvaW50ID09IG51bGwgPyBzaXplIC8gMiA6IHJlZmVyZW5jZVBvaW50IGluIF9rZXl3b3JkcyA/IF9rZXl3b3Jkc1tyZWZlcmVuY2VQb2ludF0gKiBzaXplIDogfnJlZmVyZW5jZVBvaW50LmluZGV4T2YoXCIlXCIpID8gcGFyc2VGbG9hdChyZWZlcmVuY2VQb2ludCkgKiBzaXplIC8gMTAwIDogcGFyc2VGbG9hdChyZWZlcmVuY2VQb2ludCkgfHwgMDtcbiAgICByZXR1cm4gaG9yaXpvbn
8110RhbCA/IChib3VuZHMubGVmdCArIG9mZnNldCkgLyBfd2luLmlubmVyV2lkdGggOiAoYm91bmRzLnRvcCArIG9mZnNldCkgLyBfd2luLmlubmVySGVpZ2h0O1xuICB9O1xuXG4gIFNjcm9sbFRyaWdnZXIua2lsbEFsbCA9IGZ1bmN0aW9uIGtpbGxBbGwoYWxsb3dMaXN0ZW5lcnMpIHtcbiAgICBfdHJpZ2dlcnMuc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQudmFycy5pZCAhPT0gXCJTY3JvbGxTbW9vdGhlclwiICYmIHQua2lsbCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGFsbG93TGlzdGVuZXJzICE9PSB0cnVlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gX2xpc3RlbmVycy5raWxsQWxsIHx8IFtdO1xuICAgICAgX2xpc3RlbmVycyA9IHt9O1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsVHJpZ2dlcjtcbn0oKTtcblNjcm9sbFRyaWdnZXIudmVyc2lvbiA9IFwiMy4xNS4wXCI7XG5cblNjcm9sbFRyaWdnZXIuc2F2ZVN0eWxlcyA9IGZ1bmN0aW9uICh0YXJnZXRzKSB7XG4gIHJldHVybiB0YXJnZXRzID8gX3RvQXJyYXkodGFyZ2V0cykuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgLy8gc2F2ZWQgc3R5bGVzIGFyZSByZWNvcmRlZCBpbiBhIGNvbnNlY3V0aXZlIGFsdGVybmF0aW5nIEFycmF5LCBsaWtlIFtlbGVtZW50LCBjc3NUZXh0LCB0cmFuc2Zvcm0gYXR0cmlidXRlLCBjYWNoZSwgbWF0Y2hNZWRpYSwgLi4uXVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LnN0eWxlKSB7XG4gICAgICB2Y
8110XIgaSA9IF9zYXZlZFN0eWxlcy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAgIGkgPj0gMCAmJiBfc2F2ZWRTdHlsZXMuc3BsaWNlKGksIDUpO1xuXG4gICAgICBfc2F2ZWRTdHlsZXMucHVzaCh0YXJnZXQsIHRhcmdldC5zdHlsZS5jc3NUZXh0LCB0YXJnZXQuZ2V0QkJveCAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIpLCBnc2FwLmNvcmUuZ2V0Q2FjaGUodGFyZ2V0KSwgX2NvbnRleHQoKSk7XG4gICAgfVxuICB9KSA6IF9zYXZlZFN0eWxlcztcbn07XG5cblNjcm9sbFRyaWdnZXIucmV2ZXJ0ID0gZnVuY3Rpb24gKHNvZnQsIG1lZGlhKSB7XG4gIHJldHVybiBfcmV2ZXJ0QWxsKCFzb2Z0LCBtZWRpYSk7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLmNyZWF0ZSA9IGZ1bmN0aW9uICh2YXJzLCBhbmltYXRpb24pIHtcbiAgcmV0dXJuIG5ldyBTY3JvbGxUcmlnZ2VyKHZhcnMsIGFuaW1hdGlvbik7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLnJlZnJlc2ggPSBmdW5jdGlvbiAoc2FmZSkge1xuICByZXR1cm4gc2FmZSA/IF9vblJlc2l6ZSh0cnVlKSA6IChfY29yZUluaXR0ZWQgfHwgU2Nyb2xsVHJpZ2dlci5yZWdpc3RlcigpKSAmJiBfcmVmcmVzaEFsbCh0cnVlKTtcbn07XG5cblNjcm9sbFRyaWdnZXIudXBkYXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gIHJldHVybiArK19zY3JvbGxlcnMuY2FjaGUgJiYgX3VwZGF0ZUFsbChmb3JjZSA9PT0gdHJ1ZSA/IDIgOiAwKTtcbn07XG5cblNjcm9sbFRyaWdnZXIuY2xlYXJTY3JvbGxNZW1vcnkgPSBfY2xlYXJTY3JvbGxNZW1vcnk7XG5cblNjcm9sbFRyaWdnZXIubWF4U2Nyb2xsID0gZnVuY3Rpb24gKGVsZW1lbnQsIGhvcml6b250YWwpIHtcbiAgcmV0dXJuIF9tYXhTY3JvbGwoZWxlbWVudCwgaG9yaXpvbnRhbCA/IF9ob3Jpem9udGFsIDogX3ZlcnRpY2FsKTtcbn07XG5cblNjcm9sbFRyaWdnZXIuZ2V0U2Nyb2xsRnVuYyA9IGZ1bmN0aW9uIChlbGVtZW50LCBob3Jpem9udGFsKSB7XG4gIHJldHVybiBfZ2V0U2Nyb2xsRnVuYyhfZ2V0VGFyZ2V0KGVsZW1lbnQpLCBob3Jpem9udGFsID8gX2hvcml6b250YWwgOiBfdmVydGljYWwpO1xufTtcblxuU2Nyb2xsVHJpZ2dlci5nZXRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBfaWRzW2lkXTtcbn07XG5cblNjcm9sbFRyaWdnZXIuZ2V0QWxsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX3RyaWdnZXJzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnZhcnMuaWQgIT09IFwiU2Nyb2xsU21vb3RoZXJcIjtcbiAgfSk7XG59OyAvLyBpdCdzIGNvbW1vbiBmb3IgcGVvcGxlIHRvIFNjcm9sbFRyaWdnZXIuZ2V0QWxsKHQgPT4gdC5raWxsKCkpIG9uIHBhZ2Ugcm91dGVzLCBmb3IgZXhhbXBsZSwgYW5kIHdlIGRvbid0IHdhbnQgaXQgdG8gcnVpbiBzbW9vdGggc2Nyb2xsaW5nIGJ5IGtpbGxpbmcgdGhlIG1haW4gU2Nyb2xsU21vb3RoZXIgb25lLlxuXG5cblNjcm9sbFRyaWdnZXIuaXNTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhIV9sYXN0U2Nyb2xsVGltZTtcbn07XG5cblNjcm9sbFRyaWdnZXIuc25hcERpcmVjdGlvbmFsID0gX3NuYXBEaXJlY3Rpb25hbDtcblxuU2Nyb2xsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGNhbGxiYWNrKSB7XG4gIHZhciBhID0gX2xpc3RlbmVyc1t0eXBlXSB8fCAoX2xpc3RlbmVyc1t0eXBlXSA9IFtdKTtcbiAgfmEuaW5kZXhPZihjYWxsYmFjaykgfHwgYS5wdXNoKGNhbGxiYWNrKTtcbn07XG5cblNjcm9sbFRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBjYWxsYmFjaykge1xuICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0sXG4gICAgICBpID0gYSAmJiBhLmluZGV4T2YoY2FsbGJhY2spO1xuICBpID49IDAgJiYgYS5zcGxpY2UoaSwgMSk7XG59O1xuXG5TY3JvbGxUcmlnZ2VyLmJhdGNoID0gZnVuY3Rpb24gKHRhcmdldHMsIHZhcnMpIHtcbiAgdmFyIHJlc3VsdCA9IFtdLFxuICAgICAgdmFyc0NvcHkgPSB7fSxcbiAgICAgIGludGVydmFsID0gdmFycy5pbnRlcnZhbCB8fCAwLjAxNixcbiAgICAgIGJhdGNoTWF4ID0gdmFycy5iYXRjaE1heCB8fCAxZTksXG4gICAgICBwcm94eUNhbGxiYWNrID0gZnVuY3Rpb24gcHJveHlDYWxsYmFjayh0eXBlLCBjYWxsYmFjaykge1xuICAgIHZhciBlbGVtZW50cyA9IFtdLFxuICAgICAgICB0cmlnZ2VycyA9IFtdLFxuICAgICAgICBkZWxheSA9IGdzYXAuZGVsYXllZENhbGwoaW50ZXJ2YWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKGVsZW1lbnRzLCB0cmlnZ2Vycyk7XG4gICAgICBlbGVtZW50cyA9IFtdO1xuICAgICAgdHJpZ2dlcnMgPSBbXTtcbiAgICB9KS5wYXVzZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZikge1xuICAgICAgZWxlbWVudHMubGVuZ3RoIHx8IGRlbGF5LnJlc3RhcnQodHJ1ZSk7XG4gICAgICBlbGVtZW50cy5wdXNoKHNlbGYudHJpZ2dlcik7XG4gICAgICB0cmlnZ2Vycy5wdXNoKHNlbGYpO1xuICAgICAgYmF0Y2hNYXggPD0gZWxlbWVudHMubGVuZ3RoICYmIGRlbGF5LnByb2dyZXNzKDEpO1xuICAgIH07XG4gIH0sXG4gICAgICBwO1xuXG4gIGZvciAocCBpbiB2YXJzKSB7XG4gICAgdmFyc0NvcHlbcF0gPSBwLnN1YnN0cigwLCAyKSA9PT0gXCJvblwiICYmIF9pc0Z1bmN0aW9uKHZhcnNbcF0pICYmIHAgIT09IFwib25SZWZyZXNoSW5pdFwiID8gcHJveHlDYWxsYmFjayhwLCB2YXJzW3BdKSA6IHZhcnNbcF07XG4gIH1cblxuICBpZiAoX2lzRnVuY3Rpb24oYmF0Y2hNYXgpKSB7XG4gICAgYmF0Y2hNYXggPSBiYXRjaE1heCgpO1xuXG4gICAgX2FkZExpc3RlbmVyKFNjcm9sbFRyaWdnZXIsIFwicmVmcmVzaFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYmF0Y2hNYXggPSB2YXJzLmJhdGNoTWF4KCk7XG4gICAgfSk7XG4gIH1cblxuICBfdG9BcnJheSh0YXJnZXRzKS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB2YXIgY29uZmlnID0ge307XG5cbiAgICBmb3IgKHAgaW4gdmFyc0NvcHkpIHtcbiAgICAgIGNvbmZpZ1twXSA9IHZhcnNDb3B5W3BdO1xuICAgIH1cblxuICAgIGNvbmZpZy50cmlnZ2VyID0gdGFyZ2V0O1xuICAgIHJlc3VsdC5wdXNoKFNjcm9sbFRyaWdnZXIuY3JlYXRlKGNvbmZpZykpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTsgLy8gdG8gcmVkdWNlIGZpbGUgc2l6ZS4gY2xhbXBzIHRoZSBzY3JvbGwgYW5kIGFsc28gcmV0dXJucyBhIGR1cmF0aW9uIG11bHRpcGxpZXIgc28gdGhhdCBpZiB0aGUgc2Nyb2xsIGdldHMgY2hvcHBlZCBzaG9ydGVyLCB0aGUgZHVyYXRpb24gZ2V0cyBjdXJ0YWlsZWQgYXMgd2VsbCAob3RoZXJ3aXNlIGlmIHlvdSdyZSB2ZXJ5IGNsb3NlIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2UsIGZvciBleGFtcGxlLCBhbmQgc3dpcGUgdXAgcmVhbGx5IGZhc3QsIGl0J2xsIHN1ZGRlbmx5IHNsb3cgZG93biBhbmQgdGFrZSBhIGxvbmcgdGltZSB0byByZWFjaCB0aGUgdG9wKS5cblxuXG52YXIgX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyID0gZnVuY3Rpb24gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmMsIGN1cnJlbnQsIGVuZCwgbWF4KSB7XG4gIGN1cnJlbnQgPiBtYXggPyBzY3JvbGxGdW5jKG1heCkgOiBjdXJyZW50IDwgMCAmJiBzY3JvbGxGdW5jKDApO1xuICByZXR1cm4gZW5kID4gbWF4ID8gKG1heCAtIGN1cnJlbnQpIC8gKGVuZCAtIGN1cnJlbnQpIDogZW5kIDwgMCA/IGN1cnJlbnQgLyAoY3VycmVudCAtIGVuZCkgOiAxO1xufSxcbiAgICBfYWxsb3dOYXRpdmVQYW5uaW5nID0gZnVuY3Rpb24gX2FsbG93TmF0aXZlUGFubmluZyh0YXJnZXQsIGRpcmVjdGlvbikge1xuICBpZiAoZGlyZWN0aW9uID09PSB0cnVlKSB7XG4gICAgdGFyZ2V0LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidG9
81101Y2gtYWN0aW9uXCIpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5zdHlsZS50b3VjaEFjdGlvbiA9IGRpcmVjdGlvbiA9PT0gdHJ1ZSA/IFwiYXV0b1wiIDogZGlyZWN0aW9uID8gXCJwYW4tXCIgKyBkaXJlY3Rpb24gKyAoT2JzZXJ2ZXIuaXNUb3VjaCA/IFwiIHBpbmNoLXpvb21cIiA6IFwiXCIpIDogXCJub25lXCI7IC8vIG5vdGU6IEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IGl0IHBpbmNoLXpvb20gcHJvcGVybHksIGF0IGxlYXN0IGluIGFkZGl0aW9uIHRvIGEgcGFuLXggb3IgcGFuLXkuXG4gIH1cblxuICB0YXJnZXQgPT09IF9kb2NFbCAmJiBfYWxsb3dOYXRpdmVQYW5uaW5nKF9ib2R5LCBkaXJlY3Rpb24pO1xufSxcbiAgICBfb3ZlcmZsb3cgPSB7XG4gIGF1dG86IDEsXG4gIHNjcm9sbDogMVxufSxcbiAgICBfbmVzdGVkU2Nyb2xsID0gZnVuY3Rpb24gX25lc3RlZFNjcm9sbChfcmVmNSkge1xuICB2YXIgZXZlbnQgPSBfcmVmNS5ldmVudCxcbiAgICAgIHRhcmdldCA9IF9yZWY1LnRhcmdldCxcbiAgICAgIGF4aXMgPSBfcmVmNS5heGlzO1xuXG4gIHZhciBub2RlID0gKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCkudGFyZ2V0LFxuICAgICAgY2FjaGUgPSBub2RlLl9nc2FwIHx8IGdzYXAuY29yZS5nZXRDYWNoZShub2RlKSxcbiAgICAgIHRpbWUgPSBfZ2V0VGltZSgpLFxuICAgICAgY3M7XG5cbiAgaWYgKCFjYWNoZS5faXNTY3JvbGxUIHx8IHRpbWUgLSBjYWNoZS5faXNTY3JvbGxUID4gMjAwMCkge1xuICAgIC8vIGNhY2hlIGZvciAyIHNlY29uZHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBfYm9keSAmJiAobm9kZS5zY3JvbGxIZWlnaHQgPD0gbm9kZS5jbGllbnRIZWlnaHQgJiYgbm9kZS5zY3JvbGxXaWR0aCA8PSBub2RlLmNsaWVudFdpZHRoIHx8ICEoX292ZXJmbG93WyhjcyA9IF9nZXRDb21wdXRlZFN0eWxlKG5vZGUpKS5vdmVyZmxvd1ldIHx8IF9vdmVyZmxvd1tjcy5vdmVyZmxvd1hdKSkpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgY2FjaGUuX2lzU2Nyb2xsID0gbm9kZSAmJiBub2RlICE9PSB0YXJnZXQgJiYgIV9pc1ZpZXdwb3J0KG5vZGUpICYmIChfb3ZlcmZsb3dbKGNzID0gX2dldENvbXB1dGVkU3R5bGUobm9kZSkpLm92ZXJmbG93WV0gfHwgX292ZXJmbG93W2NzLm92ZXJmbG93WF0pO1xuICAgIGNhY2hlLl9pc1Njcm9sbFQgPSB0aW1lO1xuICB9XG5cbiAgaWYgKGNhY2hlLl9pc1Njcm9sbCB8fCBheGlzID09PSBcInhcIikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50Ll9nc2FwQWxsb3cgPSB0cnVlO1xuICB9XG59LFxuICAgIC8vIGNhcHR1cmUgZXZlbnRzIG9uIHNjcm9sbGFibGUgZWxlbWVudHMgSU5TSURFIHRoZSA8Ym9keT4gYW5kIGFsbG93IHRob3NlIGJ5IGNhbGxpbmcgc3RvcFByb3BhZ2F0aW9uKCkgd2hlbiB3ZSBmaW5kIGEgc2Nyb2xsYWJsZSBhbmNlc3RvclxuX2lucHV0T2JzZXJ2ZXIgPSBmdW5jdGlvbiBfaW5wdXRPYnNlcnZlcih0YXJnZXQsIHR5cGUsIGlucHV0cywgbmVzdGVkKSB7XG4gIHJldHVybiBPYnNlcnZlci5jcmVhdGUoe1xuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgZGVib3VuY2U6IGZhbHNlLFxuICAgIGxvY2tBeGlzOiB0cnVlLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgb25XaGVlbDogbmVzdGVkID0gbmVzdGVkICYmIF9uZXN0ZWRTY3JvbGwsXG4gICAgb25QcmVzczogbmVzdGVkLFxuICAgIG9uRHJhZzogbmVzdGVkLFxuICAgIG9uU2Nyb2xsOiBuZXN0ZWQsXG4gICAgb25FbmFibGU6IGZ1bmN0aW9uIG9uRW5hYmxlKCkge1xuICAgICAgcmV0dXJuIGlucHV0cyAmJiBfYWRkTGlzdGVuZXIoX2RvYywgT2JzZXJ2ZXIuZXZlbnRUeXBlc1swXSwgX2NhcHR1cmVJbnB1dHMsIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIG9uRGlzYWJsZTogZnVuY3Rpb24gb25EaXNhYmxlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmVMaXN0ZW5lcihfZG9jLCBPYnNlcnZlci5ldmVudFR5cGVzWzBdLCBfY2FwdHVyZUlucHV0cywgdHJ1ZSk7XG4gICAgfVxuICB9KTtcbn0sXG4gICAgX2lucHV0RXhwID0gLyhpbnB1dHxsYWJlbHxzZWxlY3R8dGV4dGFyZWEpL2ksXG4gICAgX2lucHV0SXNGb2N1c2VkLFxuICAgIF9jYXB0dXJlSW5wdXRzID0gZnVuY3Rpb24gX2NhcHR1cmVJbnB1dHMoZSkge1xuICB2YXIgaXNJbnB1dCA9IF9pbnB1dEV4cC50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpO1xuXG4gIGlmIChpc0lucHV0IHx8IF9pbnB1dElzRm9jdXNlZCkge1xuICAgIGUuX2dzYXBBbGxvdyA9IHRydWU7XG4gICAgX2lucHV0SXNGb2N1c2VkID0gaXNJbnB1dDtcbiAgfVxufSxcbiAgICBfZ2V0U2Nyb2xsTm9ybWFsaXplciA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxOb3JtYWxpemVyKHZhcnMpIHtcbiAgX2lzT2JqZWN0KHZhcnMpIHx8ICh2YXJzID0ge30pO1xuICB2YXJzLnByZXZlbnREZWZhdWx0ID0gdmFycy5pc05vcm1hbGl6ZXIgPSB2YXJzLmFsbG93Q2xpY2tzID0gdHJ1ZTtcbiAgdmFycy50eXBlIHx8ICh2YXJzLnR5cGUgPSBcIndoZWVsLHRvdWNoXCIpO1xuICB2YXJzLmRlYm91bmNlID0gISF2YXJzLmRlYm91bmNlO1xuICB2YXJzLmlkID0gdmFycy5pZCB8fCBcIm5vcm1hbGl6ZXJcIjtcblxuICB2YXIgX3ZhcnMyID0gdmFycyxcbiAgICAgIG5vcm1hbGl6ZVNjcm9sbFggPSBfdmFyczIubm9ybWFsaXplU2Nyb2xsWCxcbiAgICAgIG1vbWVudHVtID0gX3ZhcnMyLm1vbWVudHVtLFxuICAgICAgYWxsb3dOZXN0ZWRTY3JvbGwgPSBfdmFyczIuYWxsb3dOZXN0ZWRTY3JvbGwsXG4gICAgICBvblJlbGVhc2UgPSBfdmFyczIub25SZWxlYXNlLFxuICAgICAgc2VsZixcbiAgICAgIG1heFksXG4gICAgICB0YXJnZXQgPSBfZ2V0VGFyZ2V0KHZhcnMudGFyZ2V0KSB8fCBfZG9jRWwsXG4gICAgICBzbW9vdGhlciA9IGdzYXAuY29yZS5nbG9iYWxzKCkuU2Nyb2xsU21vb3RoZXIsXG4gICAgICBzbW9vdGhlckluc3RhbmNlID0gc21vb3RoZXIgJiYgc21vb3RoZXIuZ2V0KCksXG4gICAgICBjb250ZW50ID0gX2ZpeElPU0J1ZyAmJiAodmFycy5jb250ZW50ICYmIF9nZXRUYXJnZXQodmFycy5jb250ZW50KSB8fCBzbW9vdGhlckluc3RhbmNlICYmIHZhcnMuY29udGVudCAhPT0gZmFsc2UgJiYgIXNtb290aGVySW5zdGFuY2Uuc21vb3RoKCkgJiYgc21vb3RoZXJJbnN0YW5jZS5jb250ZW50KCkpLFxuICAgICAgc2Nyb2xsRnVuY1kgPSBfZ2V0U2Nyb2xsRnVuYyh0YXJnZXQsIF92ZXJ0aWNhbCksXG4gICAgICBzY3JvbGxGdW5jWCA9IF9nZXRTY3JvbGxGdW5jKHRhcmdldCwgX2hvcml6b250YWwpLFxuICAgICAgc2NhbGUgPSAxLFxuICAgICAgaW5pdGlhbFNjYWxlID0gKE9ic2VydmVyLmlzVG91Y2ggJiYgX3dpbi52aXN1YWxWaWV3cG9ydCA/IF93aW4udmlzdWFsVmlld3BvcnQuc2NhbGUgKiBfd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogX3dpbi5vdXRlcldpZHRoKSAvIF93aW4uaW5uZXJXaWR0aCxcbiAgICAgIHdoZWVsUmVmcmVzaCA9IDAsXG4gICAgICByZXNvbHZlTW9tZW50dW1EdXJhdGlvbiA9I
8110F9pc0Z1bmN0aW9uKG1vbWVudHVtKSA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW9tZW50dW0oc2VsZik7XG4gIH0gOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG1vbWVudHVtIHx8IDIuODtcbiAgfSxcbiAgICAgIGxhc3RSZWZyZXNoSUQsXG4gICAgICBza2lwVG91Y2hNb3ZlLFxuICAgICAgaW5wdXRPYnNlcnZlciA9IF9pbnB1dE9ic2VydmVyKHRhcmdldCwgdmFycy50eXBlLCB0cnVlLCBhbGxvd05lc3RlZFNjcm9sbCksXG4gICAgICByZXN1bWVUb3VjaE1vdmUgPSBmdW5jdGlvbiByZXN1bWVUb3VjaE1vdmUoKSB7XG4gICAgcmV0dXJuIHNraXBUb3VjaE1vdmUgPSBmYWxzZTtcbiAgfSxcbiAgICAgIHNjcm9sbENsYW1wWCA9IF9wYXNzVGhyb3VnaCxcbiAgICAgIHNjcm9sbENsYW1wWSA9IF9wYXNzVGhyb3VnaCxcbiAgICAgIHVwZGF0ZUNsYW1wcyA9IGZ1bmN0aW9uIHVwZGF0ZUNsYW1wcygpIHtcbiAgICBtYXhZID0gX21heFNjcm9sbCh0YXJnZXQsIF92ZXJ0aWNhbCk7XG4gICAgc2Nyb2xsQ2xhbXBZID0gX2NsYW1wKF9maXhJT1NCdWcgPyAxIDogMCwgbWF4WSk7XG4gICAgbm9ybWFsaXplU2Nyb2xsWCAmJiAoc2Nyb2xsQ2xhbXBYID0gX2NsYW1wKDAsIF9tYXhTY3JvbGwodGFyZ2V0LCBfaG9yaXpvbnRhbCkpKTtcbiAgICBsYXN0UmVmcmVzaElEID0gX3JlZnJlc2hJRDtcbiAgfSxcbiAgICAgIHJlbW92ZUNvbnRlbnRPZmZzZXQgPSBmdW5jdGlvbiByZW1vdmVDb250ZW50T2Zmc2V0KCkge1xuICAgIGNvbnRlbnQuX2dzYXAueSA9IF9yb3VuZChwYXJzZUZsb2F0KGNvbnRlbnQuX2dzYXAueSkgKyBzY3JvbGxGdW5jWS5vZmZzZXQpICsgXCJweFwiO1xuICAgIGNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gXCJtYXRyaXgzZCgxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCBcIiArIHBhcnNlRmxvYXQoY29udGVudC5fZ3NhcC55KSArIFwiLCAwLCAxKVwiO1xuICAgIHNjcm9sbEZ1bmNZLm9mZnNldCA9IHNjcm9sbEZ1bmNZLmNhY2hlSUQgPSAwO1xuICB9LFxuICAgICAgaWdub3JlRHJhZyA9IGZ1bmN0aW9uIGlnbm9yZURyYWcoKSB7XG4gICAgaWYgKHNraXBUb3VjaE1vdmUpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZXN1bWVUb3VjaE1vdmUpO1xuXG4gICAgICB2Y
8110XIgb2Zmc2V0ID0gX3JvdW5kKHNlbGYuZGVsdGFZIC8gMiksXG4gICAgICAgICAgc2Nyb2xsID0gc2Nyb2xsQ2xhbXBZKHNjcm9sbEZ1bmNZLnYgLSBvZmZzZXQpO1xuXG4gICAgICBpZiAoY29udGVudCAmJiBzY3JvbGwgIT09IHNjcm9sbEZ1bmNZLnYgKyBzY3JvbGxGdW5jWS5vZmZzZXQpIHtcbiAgICAgICAgc2Nyb2xsRnVuY1kub2Zmc2V0ID0gc2Nyb2xsIC0gc2Nyb2xsRnVuY1kudjtcblxuICAgICAgICB2YXIgeSA9IF9yb3VuZCgocGFyc2VGbG9hdChjb250ZW50ICYmIGNvbnRlbnQuX2dzYXAueSkgfHwgMCkgLSBzY3JvbGxGdW5jWS5vZmZzZXQpO1xuXG4gICAgICAgIGNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gXCJtYXRyaXgzZCgxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCBcIiArIHkgKyBcIiwgMCwgMSlcIjtcbiAgICAgICAgY29udGVudC5fZ3NhcC55ID0geSArIFwicHhcIjtcbiAgICAgICAgc2Nyb2xsRnVuY1kuY2FjaGVJRCA9IF9zY3JvbGxlcnMuY2FjaGU7XG5cbiAgICAgICAgX3VwZGF0ZUFsbCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzY3JvbGxGdW5jWS5vZmZzZXQgJiYgcmVtb3ZlQ29udGVudE9mZnNldCgpO1xuICAgIHNraXBUb3VjaE1vdmUgPSB0cnVlO1xuICB9LFxuICAgICAgdHdlZW4sXG4gICAgICBzdGFydFNjcm9sbFgsXG4gICAgICBzdGFydFNjcm9sbFksXG4gICAgICBvblN0b3BEZWxheWVkQ2FsbCxcbiAgICAgIG9uUmVzaXplID0gZnVuY3Rpb24gb25SZXNpemUoKSB7XG4gICAgLy8gaWYgdGhlIHdpbmRvdyByZXNpemVzLCBsaWtlIG9uIGFuIGlQaG9uZSB3aGljaCBBcHBsZSBGT1JDRVMgdGhlIGFkZHJlc3MgYmFyIHRvIHNob3cvaGlkZSBldmVuIGlmIHdlIGV2ZW50LnByZXZlbnREZWZhdWx0KCksIGl0IG1heSBiZSBzY3JvbGxpbmcgdG9vIGZhciBub3cgdGhhdCB0aGUgYWRkcmVzcyBiYXIgaXMgc2hvd2luZywgc28gd2UgbXVzdCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG1vbWVudHVtIHR3ZWVuLlxuICAgIHVwZGF0ZUNsYW1wcygpO1xuXG4gICAgaWYgKHR3ZWVuLmlzQWN0aXZlKCkgJiYgdHdlZW4udmFycy5zY3JvbGxZID4gbWF4WSkge1xuICAgICAgc2Nyb2xsRnVuY1koKSA+IG1heFkgPyB0d2Vlbi5wcm9ncmVzcygxKSAmJiBzY3JvbGxGdW5jWShtYXhZKSA6IHR3ZWVuLnJlc2V0VG8oXCJzY3JvbGxZXCIsIG1heFkpO1xuICAgIH1cbiAgfTtcblxuICBjb250ZW50ICYmIGdzYXAuc2V0KGNvbnRlbnQsIHtcbiAgICB5OiBcIis9MFwiXG4gIH0pOyAvLyB0byBlbnN1cmUgdGhlcmUncyBhIGNhY2hlIChlbGVtZW50Ll9nc2FwKVxuXG4gIHZhcnMuaWdub3JlQ2hlY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBfZml4SU9TQnVnICYmIGUudHlwZSA9PT0gXCJ0b3VjaG1vdmVcIiAmJiBpZ25vcmVEcmFnKGUpIHx8IHNjYWxlID4gMS4wNSAmJiBlLnR5cGUgIT09IFwidG91Y2hzdGFydFwiIHx8IHNlbGYuaXNHZXN0dXJpbmcgfHwgZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPiAxO1xuICB9O1xuXG4gIHZhcnMub25QcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBza2lwVG91Y2hNb3ZlID0gZmFsc2U7XG4gICAgdmFyIHByZXZTY2FsZSA9IHNjYWxlO1xuICAgIHNjYWxlID0gX3JvdW5kKChfd2luLnZpc3VhbFZpZXdwb3J0ICYmIF93aW4udmlzdWFsVmlld3BvcnQuc2NhbGUgfHwgMSkgLyBpbml0aWFsU2NhbGUpO1xuICAgIHR3ZWVuLnBhdXNlKCk7XG4gICAgcHJldlNjYWxlICE9PSBzY2FsZSAmJiBfYWxsb3dOYXRpdmVQYW5uaW5nKHRhcmdldCwgc2NhbGUgPiAxLjAxID8gdHJ1ZSA6IG5vcm1hbGl6ZVNjcm9sbFggPyBmYWxzZSA6IFwieFwiKTtcbiAgICBzdGFydFNjcm9sbFggPSBzY3JvbGxGdW5jWCgpO1xuICAgIHN0YXJ0U2Nyb2xsWSA9IHNjcm9sbEZ1bmNZKCk7XG4gICAgdXBkYXRlQ2xhbXBzKCk7XG4gICAgbGFzdFJlZnJlc2hJRCA9IF9yZWZyZXNoSUQ7XG4gIH07XG5cbiAgdmFycy5vblJlbGVhc2UgPSB2YXJzLm9uR2VzdHVyZVN0YXJ0ID0gZnVuY3Rpb24gKHNlbGYsIHdhc0RyYWdnaW5nKSB7XG4gICAgc2Nyb2xsRnVuY1kub2Zmc2V0ICYmIHJlbW92ZUNvbnRlbnRPZmZzZXQoKTtcblxuICAgIGlmICghd2FzRHJhZ2dpbmcpIHtcbiAgICAgIG9uU3RvcERlbGF5ZWRDYWxsLnJlc3RhcnQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zY3JvbGxlcnMuY2FjaGUrKzsgLy8gbWFrZSBzdXJlIHdlJ3JlIHB1bGxpbmcgdGhlIG5vbi1jYWNoZWQgdmFsdWVcbiAgICAgIC8vIGFsdGVybmF0ZSBhbGdvcml0aG06IGR1clggPSBNYXRoLm1pbig2LCBNYXRoLmFicyhzZWxmLnZlbG9jaXR5WCAvIDgwMCkpLFx0ZHVyID0gTWF0aC5tYXgoZHVyWCwgTWF0aC5taW4oNiwgTWF0aC5hYnMoc2VsZi52ZWxvY2l0eVkgLyA4MDApKSk7IGR1ciA9IGR1ciAqICgwLjQgKyAoMSAtIF9wb3dlcjRJbihkdXIgLyA2KSkgKiAwLjYpKSAqIChtb21lbnR1bVNwZWVkIHx8IDEpXG5cbiAgICAgIHZhciBkdXIgPSByZXNvbHZlTW9tZW50dW1EdXJhdGlvbigpLFxuICAgICAgICAgIGN1cnJlbnRTY3JvbGwsXG4gICAgICAgICAgZW5kU2Nyb2xsO1xuXG4gICAgICBpZiAobm9ybWFsaXplU2Nyb2xsWCkge1xuICAgICAgICBjdXJyZW50U2Nyb2xsID0gc2Nyb2xsRnVuY1goKTtcbiAgICAgICAgZW5kU2Nyb2xsID0gY3VycmVudFNjcm9sbCArIGR1ciAqIDAuMDUgKiAtc2VsZi52ZWxvY2l0eVggLyAwLjIyNzsgLy8gdGhlIGNvbnN0YW50IC4yMjcgaXMgZnJvbSBwb3dlcjQoMC4wNSkuIHZlbG9jaXR5IGlzIGludmVydGVkIGJlY2F1c2Ugc2Nyb2xsaW5nIGdvZXMgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi5cblxuICAgICAgICBkdXIgKj0gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmNYLCBjdXJyZW50U2Nyb2xsLCBlbmRTY3JvbGwsIF9tYXhTY3JvbGwodGFyZ2V0LCBfaG9yaXpvbnRhbCkpO1xuICAgICAgICB0d2Vlbi52YXJzLnNjcm9sbFggPSBzY3JvbGxDbGFtcFgoZW5kU2Nyb2xsKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFNjcm9sbCA9IHNjcm9sbEZ1bmNZKCk7XG4gICAgICBlbmRTY3JvbGwgP
8110SBjdXJyZW50U2Nyb2xsICsgZHVyICogMC4wNSAqIC1zZWxmLnZlbG9jaXR5WSAvIDAuMjI3OyAvLyB0aGUgY29uc3RhbnQgLjIyNyBpcyBmcm9tIHBvd2VyNCgwLjA1KVxuXG4gICAgICBkdXIgKj0gX2NsYW1wU2Nyb2xsQW5kR2V0RHVyYXRpb25NdWx0aXBsaWVyKHNjcm9sbEZ1bmNZLCBjdXJyZW50U2Nyb2xsLCBlbmRTY3JvbGwsIF9tYXhTY3JvbGwodGFyZ2V0LCBfdmVydGljYWwpKTtcbiAgICAgIHR3ZWVuLnZhcnMuc2Nyb2xsWSA9IHNjcm9sbENsYW1wWShlbmRTY3JvbGwpO1xuICAgICAgdHdlZW4uaW52YWxpZGF0ZSgpLmR1cmF0aW9uKGR1cikucGxheSgwLjAxKTtcblxuICAgICAgaWYgKF9maXhJT1NCdWcgJiYgdHdlZW4udmFycy5zY3JvbGxZID49IG1heFkgfHwgY3VycmVudFNjcm9sbCA+PSBtYXhZIC0gMSkge1xuICAgICAgICAvLyBpT1MgYnVnOiBpdCdsbCBzaG93IHRoZSBhZGRyZXNzIGJhciBidXQgTk9UIGZpcmUgdGhlIHdpbmRvdyBcInJlc2l6ZVwiIGV2ZW50IHVudGlsIHRoZSBhbmltYXRpb24gaXMgZG9uZSBidXQgd2UgbXVzdCBwcm90ZWN0IGFnYWluc3Qgb3ZlcnNob290IHNvIHdlIGxldmVyYWdlIGFuIG9uVXBkYXRlIHRvIGRvIHNvLlxuICAgICAgICBnc2FwLnRvKHt9LCB7XG4gICAgICAgICAgb25VcGRhdGU6IG9uUmVzaXplLFxuICAgICAgICAgIGR1cmF0aW9uOiBkdXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25SZWxlYXNlICYmIG9uUmVsZWFzZShzZWxmKTtcbiAgfTtcblxuICB2YXJzLm9uV2hlZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHdlZW4uX3RzICYmIHR3ZWVuLnBhdXNlKCk7XG5cbiAgICBpZiAoX2dldFRpbWUoKSAtIHdoZWVsUmVmcmVzaCA+IDEwMDApIHtcbiAgICAgIC8vIGFmdGVyIDEgc2Vjb25kLCByZWZyZXNoIHRoZSBjbGFtcHMgb3RoZXJ3aXNlIHRoYXQnbGwgb25seSBoYXBwZW4gd2hlbiBTY3JvbGxUcmlnZ2VyLnJlZnJlc2goKSBpcyBjYWxsZWQgb3IgZm9yIHRvdWNoLXNjcm9sbGluZy5cbiAgICAgIGxhc3RSZWZyZXNoSUQgPSAwO1xuICAgICAgd2hlZWxSZWZyZXNoID0gX2dldFRpbWUoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFycy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChzZWxmLCBkeCwgZHksIHhBcnJheSwgeUFycmF5KSB7XG4gICAgX3JlZnJlc2hJRCAhPT0gbGFzdFJlZnJlc2hJRCAmJiB1cGRhdGVDbGFtcHMoKTtcbiAgICBkeCAmJiBub3JtYWxpemVTY3JvbGxYICYmIHNjcm9sbEZ1bmNYKHNjcm9sbENsYW1wWCh4QXJyYXlbMl0gPT09IGR4ID8gc3RhcnRTY3JvbGxYICsgKHNlbGYuc3RhcnRYIC0gc2VsZi54KSA6IHNjcm9sbEZ1bmNYKCkgKyBkeCAtIHhBcnJheVsxXSkpOyAvLyBmb3IgbW9yZSBwcmVjaXNpb24sIHdlIHRyYWNrIHBvaW50ZXIvdG91Y2ggbW92ZW1lbnQgZnJvbSB0aGUgc3RhcnQsIG90aGVyd2lzZSBpdCdsbCBkcmlmdC5cblxuICAgIGlmIChkeSkge1xuICAgICAgc2Nyb2xsRnVuY1kub2Zmc2V0ICYmIHJlbW92ZUNvbnRlbnRPZmZzZXQoKTtcbiAgICAgIHZhciBpc1RvdWNoID0geUFycmF5WzJdID09PSBkeSxcbiAgICAgICAgICB5ID0gaXNUb3VjaCA/IHN0YXJ0U2Nyb2xsWSArIHNlbGYuc3RhcnRZIC0gc2VsZi55IDogc2Nyb2xsRnVuY1koKSArIGR5IC0geUFycmF5WzFdLFxuICAgICAgICAgIHlDbGFtcGVkID0gc2Nyb2xsQ2xhbXBZKHkpO1xuICAgICAgaXNUb3VjaCAmJiB5ICE9PSB5Q2xhbXBlZCAmJiAoc3RhcnRTY3JvbGxZICs9IHlDbGFtcGVkIC0geSk7XG4gICAgICBzY3JvbGxGdW5jWSh5Q2xhbXBlZCk7XG4gICAgfVxuXG4gICAgKGR5IHx8IGR4KSAmJiBfdXBkYXRlQWxsKCk7XG4gIH07XG5cbiAgdmFycy5vbkVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfYWxsb3dOYXRpdmVQYW5uaW5nKHRhcmdldCwgbm9ybWFsaXplU2Nyb2xsWCA/IGZhbHNlIDogXCJ4XCIpO1xuXG4gICAgU2Nyb2xsVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwicmVmcmVzaFwiLCBvblJlc2l6ZSk7XG5cbiAgICBfYWRkTGlzdGVuZXIoX3dpbiwgXCJyZXNpemVcIiwgb25SZXNpemUpO1xuXG4gICAgaWYgKHNjcm9sbEZ1bmNZLnNtb290aCkge1xuICAgICAgc2Nyb2xsRnVuY1kudGFyZ2V0LnN0eWxlLnNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCI7XG4gICAgICBzY3JvbGxGdW5jWS5zbW9vdGggPSBzY3JvbGxGdW5jWC5zbW9vdGggPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpbnB1dE9ic2VydmVyLmVuYWJsZSgpO1xuICB9O1xuXG4gIHZhcnMub25EaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIF9hbGxvd05hdGl2ZVBhbm5pbmcodGFyZ2V0LCB0cnVlKTtcblxuICAgIF9yZW1vdmVMaXN0ZW5lcihfd2luLCBcInJlc2l6ZVwiLCBvblJlc2l6ZSk7XG5cbiAgICBTY3JvbGxUcmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZWZyZXNoXCIsIG9uUmVzaXplKTtcbiAgICBpbnB1dE9ic2VydmVyLmtpbGwoKTtcbiAgfTtcblxuICB2YXJzLmxvY2tBeGlzID0gdmFycy5sb2NrQXhpcyAhPT0gZmFsc2U7XG4gIHNlbGYgPSBuZXcgT2JzZXJ2ZXIodmFycyk7XG4gIHNlbGYuaU9TID0gX2ZpeElPU0J1ZzsgLy8gdXNlZCBpbiB0aGUgT2JzZXJ2ZXIgZ2V0Q2FjaGVkU2Nyb2xsKCkgZnVuY3Rpb24gdG8gd29yayBhcm91bmQgYW4gaU9TIGJ1ZyB0aGF0IHdyZWFrcyBoYXZvYyB3aXRoIFRvdWNoRXZlbnQuY2xpZW50WSBpZiB3ZSBhbGxvdyBzY3JvbGwgdG8gZ28gYWxsIHRoZSB3YXkgYmFjayB0byAwLlxuXG4gIF9maXhJT1NCdWcgJiYgIXNjcm9sbEZ1bmNZKCkgJiYgc2Nyb2xsRnVuY1koMSk7IC8vIGlPUyBidWcgY2F1c2VzIGV2ZW50LmNsaWVudFkgdmFsdWVzIHRvIGZyZWFrIG91dCAod2lsZGx5IGluYWNjdXJhdGUpIGlmIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgZXhhY3RseSAwLlxuXG4gIF9maXhJT1NCdWcgJiYgZ3NhcC50aWNrZXIuYWRkKF9wYXNzVGhyb3VnaCk7IC8vIHByZXZlbnQgdGhlIHRpY2tlciBmcm9tIHNsZWVwaW5nXG5cbiAgb25TdG9wRGVsYXllZENhbGwgPSBzZWxmLl9kYztcbiAgdHdlZW4gPSBnc2FwLnRvKHNlbGYsIHtcbiAgICBlYXNlOiBcInBvd2VyNFwiLFxuICAgIHBhdXNlZDogdHJ1ZSxcbiAgICBpbmhlcml0OiBmYWxzZSxcbiAgICBzY3JvbGxYOiBub3JtYWxpem
8110VTY3JvbGxYID8gXCIrPTAuMVwiIDogXCIrPTBcIixcbiAgICBzY3JvbGxZOiBcIis9MC4xXCIsXG4gICAgbW9kaWZpZXJzOiB7XG4gICAgICBzY3JvbGxZOiBfaW50ZXJydXB0aW9uVHJhY2tlcihzY3JvbGxGdW5jWSwgc2Nyb2xsRnVuY1koKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHdlZW4ucGF1c2UoKTtcbiAgICAgIH0pXG4gICAgfSxcbiAgICBvblVwZGF0ZTogX3VwZGF0ZUFsbCxcbiAgICBvbkNvbXBsZXRlOiBvblN0b3BEZWxheWVkQ2FsbC52YXJzLm9uQ29tcGxldGVcbiAgfSk7IC8vIHdlIG5lZWQgdGhlIG1vZGlmaWVyIHRvIHNlbnNlIGlmIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgYWx0ZXJlZCBvdXRzaWRlIG9mIHRoZSBtb21lbnR1bSB0d2VlbiAobGlrZSB3aXRoIGEgc2Nyb2xsVG8gdHdlZW4pIHNvIHdlIGNhbiBwYXVzZSgpIGl0IHRvIHByZXZlbnQgY29uZmxpY3RzLlxuXG4gIHJldHVybiBzZWxmO1xufTtcblxuU2Nyb2xsVHJpZ2dlci5zb3J0ID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKF9pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuIF90cmlnZ2Vycy5zb3J0KGZ1bmMpO1xuICB9XG5cbiAgdmFyIHNjcm9sbCA9IF93aW4ucGFnZVlPZmZzZXQgfHwgMDtcbiAgU2Nyb2xsVHJpZ2dlci5nZXRBbGwoKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX3NvcnRZID0gdC50cmlnZ2VyID8gc2Nyb2xsICsgdC50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA6IHQuc3RhcnQgKyBfd2luLmlubmVySGVpZ2h0O1xuICB9KTtcbiAgcmV0dXJuIF90cmlnZ2Vycy5zb3J0KGZ1bmMgfHwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gKGEudmFycy5yZWZyZXNoUHJpb3JpdHkgfHwgMCkgKiAtMWU2ICsgKGEudmFycy5jb250YWluZXJBbmltYXRpb24gPyAxZTYgOiBhLl9zb3J0WSkgLSAoKGIudmFycy5jb250YWluZXJBbmltYXRpb24gPyAxZTYgOiBiLl9zb3J0WSkgKyAoYi52YXJzLnJlZnJlc2hQcmlvcml0eSB8fCAwKSAqIC0xZTYpO1xuICB9KTsgLy8gYW55dGhpbmcgd2l0aCBhIGNvbnRhaW5lckFuaW1hdGlvbiBzaG91bGQgcmVmcmVzaCBsYXN0LlxufTtcblxuU2Nyb2xsVHJpZ2dlci5vYnNlcnZlID0gZnVuY3Rpb24gKHZhcnMpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZlcih2YXJzKTtcbn07XG5cblNjcm9sbFRyaWdnZXIubm9ybWFsaXplU2Nyb2xsID0gZnVuY3Rpb24gKHZhcnMpIHtcbiAgaWYgKHR5cGVvZiB2YXJzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIF9ub3JtYWxpemVyO1xuICB9XG5cbiAgaWYgKHZhcnMgPT09IHRydWUgJiYgX25vcm1hbGl6ZXIpIHtcbiAgICByZXR1cm4gX25vcm1hbGl6ZXIuZW5hYmxlKCk7XG4gIH1cblxuICBpZiAodmFycyA9PT0gZmFsc2UpIHtcbiAgICBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci5raWxsKCk7XG4gICAgX25vcm1hbGl6ZXIgPSB2YXJzO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVyID0gdmFycyBpbnN0YW5jZW9mIE9ic2VydmVyID8gdmFycyA6IF9nZXRTY3JvbGxOb3JtYWxpemVyKHZhcnMpO1xuICBfbm9ybWFsaXplciAmJiBfbm9ybWFsaXplci50YXJnZXQgPT09IG5vcm1hbGl6ZXIudGFyZ2V0ICYmIF9ub3JtYWxpemVyLmtpbGwoKTtcbiAgX2lzVmlld3BvcnQobm9ybWFsaXplci50YXJnZXQpICYmIChfbm9ybWFsaXplciA9IG5vcm1hbGl6ZXIpO1xuICByZXR1cm4gbm9ybWFsaXplcjtcbn07XG5cblNjcm9sbFRyaWdnZXIuY29yZSA9IHtcbiAgLy8gc21hbGxlciBmaWxlIHNpemUgd2F5IHRvIGxldmVyYWdlIGluIFNjcm9sbFNtb290aGVyIGFuZCBPYnNlcnZlclxuICBfZ2V0VmVsb2NpdHlQcm9wOiBfZ2V0VmVsb2NpdHlQcm9wLFxuICBfaW5wdXRPYnNlcnZlcjogX2lucHV0T2JzZXJ2ZXIsXG4gIF9zY3JvbGxlcnM6IF9zY3JvbGxlcnMsXG4gIF9wcm94aWVzOiBfcHJveGllcyxcbiAgYnJpZGdlOiB7XG4gICAgLy8gd2hlbiBub3JtYWxpemVTY3JvbGwgc2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uIChzcyA9IHNldFNjcm9sbClcbiAgICBzczogZnVuY3Rpb24gc3MoKSB7XG4gICAgICBfbGFzdFNjcm9sbFRpbWUgfHwgX2Rpc3BhdGNoKFwic2Nyb2xsU3RhcnRcIik7XG4gICAgICBfbGFzdFNjcm9sbFRpbWUgPSBfZ2V0VGltZSgpO1xuICAgIH0sXG4gICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBfcmVmcmVzaGluZyB2YWx1ZSBpbiBPYnNlcnZlclxuICAgIHJlZjogZnVuY3Rpb24gcmVmKCkge1xuICAgICAgcmV0dXJuIF9yZWZyZXNoaW5nO1xuICAgIH1cbiAgfVxufTtcbl9nZXRHU0FQKCkgJiYgZ3NhcC5yZWdpc3RlclBsdWdpbihTY3JvbGxUcmlnZ2VyKTtcbmV4cG9ydCB7IFNjcm9sbFRyaWdnZXIgYXMgZGVmYXVsdCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 8111//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/ScrollTrigger.js 8112 8113}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 8114/* harmony export */ __webpack_require__.d(__webpack_exports__, { 8115/* harmony export */ Animation: () => (/* binding */ Animation), 8116/* harmony export */ Back: () => (/* binding */ Back), 8117/* harmony export */ Bounce: () => (/* binding */ Bounce), 8118/* harmony export */ Circ: () => (/* binding */ Circ), 8119/* harmony export */ Cubic: () => (/* binding */ Cubic), 8120/* harmony export */ Elastic: () => (/* binding */ Elastic), 8121/* harmony export */ Expo: () => (/* binding */ Expo), 8122/* harmony export */ GSCache: () => (/* binding */ GSCache), 8123/* harmony export */ Linear: () => (/* binding */ Linear), 8124/* harmony export */ Power0: () => (/* binding */ Power0), 8125/* harmony export */ Power1: () => (/* binding */ Power1),
vendor: 5,881 bytes, lines 8126-8251
8126/* harmony export */ Power2: () => (/* binding */ Power2), 8127/* harmony export */ Power3: () => (/* binding */ Power3), 8128/* harmony export */ Power4: () => (/* binding */ Power4), 8129/* harmony export */ PropTween: () => (/* binding */ PropTween), 8130/* harmony export */ Quad: () => (/* binding */ Quad), 8131/* harmony export */ Quart: () => (/* binding */ Quart), 8132/* harmony export */ Quint: () => (/* binding */ Quint), 8133/* harmony export */ Sine: () => (/* binding */ Sine), 8134/* harmony export */ SteppedEase: () => (/* binding */ SteppedEase), 8135/* harmony export */ Strong: () => (/* binding */ Strong), 8136/* harmony export */ Timeline: () => (/* binding */ Timeline), 8137/* harmony export */ TimelineLite: () => (/* binding */ Timeline), 8138/* harmony export */ TimelineMax: () => (/* binding */ Timeline), 8139/* harmony export */ Tween: () => (/* binding */ Tween), 8140/* harmony export */ TweenLite: () => (/* binding */ Tween), 8141/* harmony export */ TweenMax: () => (/* binding */ Tween), 8142/* harmony export */ _checkPlugin: () => (/* binding */ _checkPlugin), 8143/* harmony export */ _colorExp: () => (/* binding */ _colorExp), 8144/* harmony export */ _colorStringFilter: () => (/* binding */ _colorStringFilter), 8145/* harmony export */ _config: () => (/* binding */ _config), 8146/* harmony export */ _forEachName: () => (/* binding */ _forEachName), 8147/* harmony export */ _getCache: () => (/* binding */ _getCache), 8148/* harmony export */ _getProperty: () => (/* binding */ _getProperty), 8149/* harmony export */ _getSetter: () => (/* binding */ _getSetter), 8150/* harmony export */ _isString: () => (/* binding */ _isString), 8151/* harmony export */ _isUndefined: () => (/* binding */ _isUndefined), 8152/* harmony export */ _missingPlugin: () => (/* binding */ _missingPlugin), 8153/* harmony export */ _numExp: () => (/* binding */ _numExp), 8154/* harmony export */ _numWithUnitExp: () => (/* binding */ _numWithUnitExp), 8155/* harmony export */ _parseRelative: () => (/* binding */ _parseRelative), 8156/* harmony export */ _plugins: () => (/* binding */ _plugins), 8157/* harmony export */ _relExp: () => (/* binding */ _relExp), 8158/* harmony export */ _removeLinkedListItem: () => (/* binding */ _removeLinkedListItem), 8159/* harmony export */ _renderComplexString: () => (/* binding */ _renderComplexString), 8160/* harmony export */ _replaceRandom: () => (/* binding */ _replaceRandom), 8161/* harmony export */ _round: () => (/* binding */ _round), 8162/* harmony export */ _roundModifier: () => (/* binding */ _roundModifier), 8163/* harmony export */ _setDefaults: () => (/* binding */ _setDefaults), 8164/* harmony export */ _sortPropTweensByPriority: () => (/* binding */ _sortPropTweensByPriority), 8165/* harmony export */ _ticker: () => (/* binding */ _ticker), 8166/* harmony export */ clamp: () => (/* binding */ clamp), 8167/* harmony export */ "default": () => (/* binding */ gsap), 8168/* harmony export */ distribute: () => (/* binding */ distribute), 8169/* harmony export */ getUnit: () => (/* binding */ getUnit), 8170/* harmony export */ gsap: () => (/* binding */ gsap), 8171/* harmony export */ interpolate: () => (/* binding */ interpolate), 8172/* harmony export */ mapRange: () => (/* binding */ mapRange), 8173/* harmony export */ normalize: () => (/* binding */ normalize), 8174/* harmony export */ pipe: () => (/* binding */ pipe), 8175/* harmony export */ random: () => (/* binding */ random), 8176/* harmony export */ selector: () => (/* binding */ selector), 8177/* harmony export */ shuffle: () => (/* binding */ shuffle), 8178/* harmony export */ snap: () => (/* binding */ snap), 8179/* harmony export */ splitColor: () => (/* binding */ splitColor), 8180/* harmony export */ toArray: () => (/* binding */ toArray), 8181/* harmony export */ unitize: () => (/* binding */ unitize), 8182/* harmony export */ wrap: () => (/* binding */ wrap), 8183/* harmony export */ wrapYoyo: () => (/* binding */ wrapYoyo) 8184/* harmony export */ }); 8185function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } 8186 8187function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } 8188 8189/*! 8190 * GSAP 3.15.0 8191 * https://gsap.com 8192 * 8193 * @license Copyright 2008-2026, GreenSock. All rights reserved. 8194 * Subject to the terms at https://gsap.com/standard-license 8195 * @author: Jack Doyle, [email protected] 8196*/ 8197 8198/* eslint-disable */ 8199var _config = { 8200 autoSleep: 120, 8201 force3D: "auto", 8202 nullTargetWarn: 1, 8203 units: { 8204 lineHeight: "" 8205 } 8206}, 8207 _defaults = { 8208 duration: .5, 8209 overwrite: false, 8210 delay: 0 8211}, 8212 _suppressOverwrites, 8213 _reverting, 8214 _context, 8215 _bigNum = 1e8, 8216 _tinyNum = 1 / _bigNum, 8217 _2PI = Math.PI * 2, 8218 _HALF_PI = _2PI / 4, 8219 _gsID = 0, 8220 _sqrt = Math.sqrt, 8221 _cos = Math.cos, 8222 _sin = Math.sin, 8223 _isString = function _isString(value) { 8224 return typeof value === "string"; 8225}, 8226 _isFunction = function _isFunction(value) { 8227 return typeof value === "function"; 8228}, 8229 _isNumber = function _isNumber(value) { 8230 return typeof value === "number"; 8231}, 8232 _isUndefined = function _isUndefined(value) { 8233 return typeof value === "undefined"; 8234}, 8235 _isObject = function _isObject(value) { 8236 return typeof value === "object"; 8237}, 8238 _isNotFalse = function _isNotFalse(value) { 8239 return value !== false; 8240}, 8241 _windowExists = function _windowExists() { 8242 return typeof window !== "undefined"; 8243}, 8244 _isFuncOrString = function _isFuncOrString(value) { 8245 return _isFunction(value) || _isString(value); 8246}, 8247 _isTypedArray = typeof ArrayBuffer === "function" && ArrayBuffer.isView || function () {}, 8248 // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView(). 8249_isArray = Array.isArray, 8250 _randomExp = /random\\([^)]+\\)/g, 8251 _commaDelimExp = /,\\s*/g,
8252 _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi, 8253 //only numbers (including negatives and decimals) but NOT relative values. 8254_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g, 8255 //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8. 8256_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g, 8257 _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi, 8258 //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too. 8259_relExp = /[+-]=-?[.\\d]+/, 8260 _delimitedValueExp = /[^,'"\\[\\]\\s]+/gi, 8261 // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters. 8262_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\
vendor: 44,728 bytes, lines 8262-9421
8262\s*$/i, 8263 _globalTimeline, 8264 _win, 8265 _coreInitted, 8266 _doc, 8267 _globals = {}, 8268 _installScope = {}, 8269 _coreReady, 8270 _install = function _install(scope) { 8271 return (_installScope = _merge(scope, _globals)) && gsap; 8272}, 8273 _missingPlugin = function _missingPlugin(property, value) { 8274 return console.warn("Invalid property", property, "set to", value, "Missing plugin? gsap.registerPlugin()"); 8275}, 8276 _warn = function _warn(message, suppress) { 8277 return !suppress && console.warn(message); 8278}, 8279 _addGlobal = function _addGlobal(name, obj) { 8280 return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals; 8281}, 8282 _emptyFunc = function _emptyFunc() { 8283 return 0; 8284}, 8285 _startAtRevertConfig = { 8286 suppressEvents: true, 8287 isStart: true, 8288 kill: false 8289}, 8290 _revertConfigNoKill = { 8291 suppressEvents: true, 8292 kill: false 8293}, 8294 _revertConfig = { 8295 suppressEvents: true 8296}, 8297 _reservedProps = {}, 8298 _lazyTweens = [], 8299 _lazyLookup = {}, 8300 _lastRenderedFrame, 8301 _plugins = {}, 8302 _effects = {}, 8303 _nextGCFrame = 30, 8304 _harnessPlugins = [], 8305 _callbackNames = "", 8306 _harness = function _harness(targets) { 8307 var target = targets[0], 8308 harnessPlugin, 8309 i; 8310 _isObject(target) || _isFunction(target) || (targets = [targets]); 8311 8312 if (!(harnessPlugin = (target._gsap || {}).harness)) { 8313 // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization) 8314 i = _harnessPlugins.length; 8315 8316 while (i-- && !_harnessPlugins[i].targetTest(target)) {} 8317 8318 harnessPlugin = _harnessPlugins[i]; 8319 } 8320 8321 i = targets.length; 8322 8323 while (i--) { 8324 targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1); 8325 } 8326 8327 return targets; 8328}, 8329 _getCache = function _getCache(target) { 8330 return target._gsap || _harness(toArray(target))[0]._gsap; 8331}, 8332 _getProperty = function _getProperty(target, property, v) { 8333 return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v; 8334}, 8335 _forEachName = function _forEachName(names, func) { 8336 return (names = names.split(",")).forEach(func) || names; 8337}, 8338 //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code). 8339_round = function _round(value) { 8340 return Math.round(value * 100000) / 100000 || 0; 8341}, 8342 _roundPrecise = function _roundPrecise(value) { 8343 return Math.round(value * 10000000) / 10000000 || 0; 8344}, 8345 // increased precision mostly for timing values. 8346_parseRelative = function _parseRelative(start, value) { 8347 var operator = value.charAt(0), 8348 end = parseFloat(value.substr(2)); 8349 start = parseFloat(start); 8350 return operator === "+" ? start + end : operator === "-" ? start - end : operator === "*" ? start * end : start / end; 8351}, 8352 _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) { 8353 //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search. 8354 var l = toFind.length, 8355 i = 0; 8356 8357 for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {} 8358 8359 return i < l; 8360}, 8361 _lazyRender = function _lazyRender() { 8362 var l = _lazyTweens.length, 8363 a = _lazyTweens.slice(0), 8364 i, 8365 tween; 8366 8367 _lazyLookup = {}; 8368 _lazyTweens.length = 0; 8369 8370 for (i = 0; i < l; i++) { 8371 tween = a[i]; 8372 tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0); 8373 } 8374}, 8375 _isRevertWorthy = function _isRevertWorthy(animation) { 8376 return !!(animation._initted || animation._startAt || animation.add); 8377}, 8378 _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) { 8379 _lazyTweens.length && !_reverting && _lazyRender(); 8380 animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation))); 8381 _lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render. 8382}, 8383 _numericIfPossible = function _numericIfPossible(value) { 8384 var n = parseFloat(value); 8385 return (n || n === 0) && (value + "").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value; 8386}, 8387 _passThrough = function _passThrough(p) { 8388 return p; 8389}, 8390 _setDefaults = function _setDefaults(obj, defaults) { 8391 for (var p in defaults) { 8392 p in obj || (obj[p] = defaults[p]); 8393 } 8394 8395 return obj; 8396}, 8397 _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) { 8398 return function (obj, defaults) { 8399 for (var p in defaults) { 8400 p in obj || p === "duration" && excludeDuration || p === "ease" || (obj[p] = defaults[p]); 8401 } 8402 }; 8403}, 8404 _merge = function _merge(base, toMerge) { 8405 for (var p in toMerge) { 8406 base[p] = toMerge[p]; 8407 } 8408 8409 return base; 8410}, 8411 _mergeDeep = function _mergeDeep(base, toMerge) { 8412 for (var p in toMerge) { 8413 p !== "__proto__" && p !== "constructor" && p !== "prototype" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]); 8414 } 8415 8416 return base; 8417}, 8418 _copyExcluding = function _copyExcluding(obj, excluding) { 8419 var copy = {}, 8420 p; 8421 8422 for (p in obj) { 8423 p in excluding || (copy[p] = obj[p]); 8424 } 8425 8426 return copy; 8427}, 8428 _inheritDefaults = function _inheritDefaults(vars) { 8429 var parent = vars.parent || _globalTimeline, 8430 func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults; 8431 8432 if (_isNotFalse(vars.inherit)) { 8433 while (parent) { 8434 func(vars, parent.vars.defaults); 8435 parent = parent.parent || parent._dp; 8436 } 8437 } 8438 8439 return vars; 8440}, 8441 _arraysMatch = function _arraysMatch(a1, a2) { 8442 var i = a1.length, 8443 match = i === a2.length; 8444 8445 while (match && i-- && a1[i] === a2[i]) {} 8446 8447 return i < 0; 8448}, 8449 _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) { 8450 if (firstProp === void 0) { 8451 firstProp = "_first"; 8452 } 8453 8454 if (lastProp === void 0) { 8455 lastProp = "_last"; 8456 } 8457 8458 var prev = parent[lastProp], 8459 t; 8460 8461 if (sortBy) { 8462 t = child[sortBy]; 8463 8464 while (prev && prev[sortBy] > t) { 8465 prev = prev._prev; 8466 } 8467 } 8468 8469 if (prev) { 8470 child._next = prev._next; 8471 prev._next = child; 8472 } else { 8473 child._next = parent[firstProp]; 8474 parent[firstProp] = child; 8475 } 8476 8477 if (child._next) { 8478 child._next._prev = child; 8479 } else { 8480 parent[lastProp] = child; 8481 } 8482 8483 child._prev = prev; 8484 child.parent = child._dp = parent; 8485 return child; 8486}, 8487 _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) { 8488 if (firstProp === void 0) { 8489 firstProp = "_first"; 8490 } 8491 8492 if (lastProp === void 0) { 8493 lastProp = "_last"; 8494 } 8495 8496 var prev = child._prev, 8497 next = child._next; 8498 8499 if (prev) { 8500 prev._next = next; 8501 } else if (parent[firstProp] === child) { 8502 parent[firstProp] = next; 8503 } 8504 8505 if (next) { 8506 next._prev = prev; 8507 } else if (parent[lastProp] === child) { 8508 parent[lastProp] = prev; 8509 } 8510 8511 child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list. 8512}, 8513 _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) { 8514 child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child); 8515 child._act = 0; 8516}, 8517 _uncache = function _uncache(animation, child) { 8518 if (animation && (!child || child._end > animation._dur || child._start < 0)) { 8519 // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end) 8520 var a = animation; 8521 8522 while (a) { 8523 a._dirty = 1; 8524 a = a.parent; 8525 } 8526 } 8527 8528 return animation; 8529}, 8530 _recacheAncestors = function _recacheAncestors(animation) { 8531 var parent = animation.parent; 8532 8533 while (parent && parent.parent) { 8534 //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though. 8535 parent._dirty = 1; 8536 parent.totalDuration(); 8537 parent = parent.parent; 8538 } 8539 8540 return animation; 8541}, 8542 _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) { 8543 return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force)); 8544}, 8545 _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) { 8546 return !animation || animation._ts && _hasNoPausedAncestors(animation.parent); 8547}, 8548 _elapsedCycleDuration = function _elapsedCycleDuration(animation) { 8549 return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0; 8550}, 8551 // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle. 8552_animationCycle = function _animationCycle(tTime, cycleDuration) { 8553 var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration)); 8554 return tTime && whole === tTime ? whole - 1 : whole; 8555}, 8556 _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) { 8557 return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur); 8558}, 8559 _setEnd = function _setEnd(animation) { 8560 return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0)); 8561}, 8562 _alignPlayhead = function _alignPlayhead(animation, totalTime) { 8563 // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for. 8564 var parent = animation._dp; 8565 8566 if (parent && parent.smoothChildTiming && animation._ts) { 8567 animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts)); 8568 8569 _setEnd(animation); 8570 8571 parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here. 8572 } 8573 8574 return animation; 8575}, 8576 8577/* 8578_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => { 8579 let cycleDuration = duration + repeatDelay, 8580 time = _round(clampedTotalTime % cycleDuration); 8581 if (time > duration) { 8582 time = duration; 8583 } 8584 return (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time; 8585}, 8586*/ 8587_postAddChecks = function _postAddChecks(timeline, child) { 8588 var t; 8589 8590 if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) { 8591 // in case, for example, the _start is moved on a tween that has already rendered, or if it's being inserted into a timeline BEFORE where the playhead is currently. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning. Special case: if it's a timeline (has .add() method) and no duration, we can skip rendering because the user may be populating it AFTER adding it to a parent timeline (unconventional, but possible, and we wouldn't want it to get removed if the parent's autoRemoveChildren is true). 8592 t = _parentToChildTotalTime(timeline.rawTime(), child); 8593 8594 if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) { 8595 child.render(t, true); 8596 } 8597 } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate. 8598 8599 8600 if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) { 8601 //in case any of the ancestors had completed but should now be enabled... 8602 if (timeline._dur < timeline.duration()) { 8603 t = timeline; 8604 8605 while (t._dp) { 8606 t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead. 8607 8608 t = t._dp; 8609 } 8610 } 8611 8612 timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order. 8613 } 8614}, 8615 _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) { 8616 child.parent && _removeFromParent(child); 8617 child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay); 8618 child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0)); 8619 8620 _addLinkedListItem(timeline, child, "_first", "_last", timeline._sort ? "_start" : 0); 8621 8622 _isFromOrFromStart(child) || (timeline._recent = child); 8623 skipChecks || _postAddChecks(timeline, child); 8624 timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back) 8625 8626 return timeline; 8627}, 8628 _scrollTrigger = function _scrollTrigger(animation, trigger) { 8629 return (_globals.ScrollTrigger || _missingPlugin("scrollTrigger", trigger)) && _globals.ScrollTrigger.create(trigger, animation); 8630}, 8631 _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) { 8632 _initTween(tween, time, tTime); 8633 8634 if (!tween._initted) { 8635 return 1; 8636 } 8637 8638 if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) { 8639 _lazyTweens.push(tween); 8640 8641 tween._lazy = [tTime, suppressEvents]; 8642 return 1; 8643 } 8644}, 8645 _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) { 8646 var parent = _ref.parent; 8647 return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent)); 8648}, 8649 // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0 8650_isFromOrFromStart = function _isFromOrFromStart(_ref2) { 8651 var data = _ref2.data; 8652 return data === "isFromStart" || data === "isStart"; 8653}, 8654 _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) { 8655 var prevRatio = tween.ratio, 8656 ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1, 8657 // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the "startAt" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any "from" and "fromTo" startAt tweens are rendered the first time at a ratio of 1. 8658 repeatDelay = tween._rDelay, 8659 tTime = 0, 8660 pt, 8661 iteration, 8662 prevIteration; 8663 8664 if (repeatDelay && tween._repeat) { 8665 // in case there's a zero-duration tween that has a repeat with a repeatDelay 8666 tTime = _clamp(0, tween._tDur, totalTime); 8667 iteration = _animationCycle(tTime, repeatDelay); 8668 tween._yoyo && iteration & 1 && (ratio = 1 - ratio); 8669 8670 if (iteration !== _animationCycle(tween._tTime, repeatDelay)) { 8671 // if iteration changed 8672 prevRatio = 1 - ratio; 8673 tween.vars.repeatRefresh && tween._initted && tween.invalidate(); 8674 } 8675 } 8676 8677 if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) { 8678 if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) { 8679 // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately. 8680 return; 8681 } 8682 8683 prevIteration = tween._zTime; 8684 tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 8685 8686 suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates. 8687 8688 tween.ratio = ratio; 8689 tween._from && (ratio = 1 - ratio); 8690 tween._time = 0; 8691 tween._tTime = tTime; 8692 pt = tween._pt; 8693 8694 while (pt) { 8695 pt.r(ratio, pt.d); 8696 pt = pt._next; 8697 } 8698 8699 totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true); 8700 tween._onUpdate && !suppressEvents && _callback(tween, "onUpdate"); 8701 tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, "onRepeat"); 8702 8703 if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) { 8704 ratio && _removeFromParent(tween, 1); 8705 8706 if (!suppressEvents && !_reverting) { 8707 _callback(tween, ratio ? "onComplete" : "onReverseComplete", true); 8708 8709 tween._prom && tween._prom(); 8710 } 8711 } 8712 } else if (!tween._zTime) { 8713 tween._zTime = totalTime; 8714 } 8715}, 8716 _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) { 8717 var child; 8718 8719 if (time > prevTime) { 8720 child = animation._first; 8721 8722 while (child && child._start <= time) { 8723 if (child.data === "isPause" && child._start > prevTime) { 8724 return child; 8725 } 8726 8727 child = child._next; 8728 } 8729 } else { 8730 child = animation._last; 8731 8732 while (child && child._start >= time) { 8733 if (child.data === "isPause" && child._start < prevTime) { 8734 return child; 8735 } 8736 8737 child = child._prev; 8738 } 8739 } 8740}, 8741 _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) { 8742 var repeat = animation._repeat, 8743 dur = _roundPrecise(duration) || 0, 8744 totalProgress = animation._tTime / animation._tDur; 8745 totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur); 8746 animation._dur = dur; 8747 animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat); 8748 totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress); 8749 animation.parent && _setEnd(animation); 8750 skipUncache || _uncache(animation.parent, animation); 8751 return animation; 8752}, 8753 _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) { 8754 return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur); 8755}, 8756 _zeroPosition = { 8757 _start: 0, 8758 endTime: _emptyFunc, 8759 totalDuration: _emptyFunc 8760}, 8761 _parsePosition = function _parsePosition(animation, position, percentAnimation) { 8762 var labels = animation.labels, 8763 recent = animation._recent || _zeroPosition, 8764 clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur, 8765 //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead. 8766 i, 8767 offset, 8768 isPercent; 8769 8770 if (_isString(position) && (isNaN(position) || position in labels)) { 8771 //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value). 8772 offset = position.charAt(0); 8773 isPercent = position.substr(-1) === "%"; 8774 i = position.indexOf("="); 8775 8776 if (offset === "<" || offset === ">") { 8777 i >= 0 && (position = position.replace(/=/, "")); 8778 return (offset === "<" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1); 8779 } 8780 8781 if (i < 0) { 8782 position in labels || (labels[position] = clippedDuration); 8783 return labels[position]; 8784 } 8785 8786 offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1)); 8787 8788 if (isPercent && percentAnimation) { 8789 offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration(); 8790 } 8791 8792 return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset; 8793 } 8794 8795 return position == null ? clippedDuration : +position; 8796}, 8797 _createTweenType = function _createTweenType(type, params, timeline) { 8798 var isLegacy = _isNumber(params[1]), 8799 varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1), 8800 vars = params[varsIndex], 8801 irVars, 8802 parent; 8803 8804 isLegacy && (vars.duration = params[1]); 8805 vars.parent = timeline; 8806 8807 if (type) { 8808 irVars = vars; 8809 parent = timeline; 8810 8811 while (parent && !("immediateRender" in irVars)) { 8812 // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed. 8813 irVars = parent.vars.defaults || {}; 8814 parent = _isNotFalse(parent.vars.inherit) && parent.parent; 8815 } 8816 8817 vars.immediateRender = _isNotFalse(irVars.immediateRender); 8818 type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // "from" vars 8819 } 8820 8821 return new Tween(params[0], vars, params[varsIndex + 1]); 8822}, 8823 _conditionalReturn = function _conditionalReturn(value, func) { 8824 return value || value === 0 ? func(value) : func; 8825}, 8826 _clamp = function _clamp(min, max, value) { 8827 return value < min ? min : value > max ? max : value; 8828}, 8829 getUnit = function getUnit(value, v) { 8830 return !_isString(value) || !(v = _unitExp.exec(value)) ? "" : v[1]; 8831}, 8832 // note: protect against padded numbers as strings, like "100.100". That shouldn't return "00" as the unit. If it's numeric, return no unit. 8833clamp = function clamp(min, max, value) { 8834 return _conditionalReturn(value, function (v) { 8835 return _clamp(min, max, v); 8836 }); 8837}, 8838 _slice = [].slice, 8839 _isArrayLike = function _isArrayLike(value, nonEmpty) { 8840 return value && _isObject(value) && "length" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win; 8841}, 8842 _flatten = function _flatten(ar, leaveStrings, accumulator) { 8843 if (accumulator === void 0) { 8844 accumulator = []; 8845 } 8846 8847 return ar.forEach(function (value) { 8848 var _accumulator; 8849 8850 return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value); 8851 }) || accumulator; 8852}, 8853 // takes any value and returns an Array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects. 8854toArray = function toArray(value, scope, leaveStrings) { 8855 return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : []; 8856}, 8857 selector = function selector(value) { 8858 value = toArray(value)[0] || _warn("Invalid scope") || {}; 8859 return function (v) { 8860 var el = value.current || value.nativeElement || value; 8861 return toArray(v, el.querySelectorAll ? el : el === value ? _warn("Invalid scope") || _doc.createElement("div") : value); 8862 }; 8863}, 8864 shuffle = function shuffle(a) { 8865 return a.sort(function () { 8866 return .5 - Math.random(); 8867 }); 8868}, 8869 // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = (Math.random() * i) | 0, v = a[--i], a[i] = a[j], a[j] = v); return a; 8870// for distributing values across an Array. Can accept a number, a function or (most commonly) an object which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. 8871distribute = function distribute(v) { 8872 if (_isFunction(v)) { 8873 return v; 8874 } 8875 8876 var vars = _isObject(v) ? v : { 8877 each: v 8878 }, 8879 //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total "amount" that's chunked out among them all. 8880 ease = _parseEase(vars.ease), 8881 from = vars.from || 0, 8882 base = parseFloat(vars.base) || 0, 8883 cache = {}, 8884 isDecimal = from > 0 && from < 1, 8885 ratios = isNaN(from) || isDecimal, 8886 axis = vars.axis, 8887 ratioX = from, 8888 ratioY = from; 8889 8890 if (_isString(from)) { 8891 ratioX = ratioY = { 8892 center: .5, 8893 edges: .5, 8894 end: 1 8895 }[from] || 0; 8896 } else if (!isDecimal && ratios) { 8897 ratioX = from[0]; 8898 ratioY = from[1]; 8899 } 8900 8901 return function (i, target, a) { 8902 var l = (a || vars).length, 8903 distances = cache[l], 8904 originX, 8905 originY, 8906 x, 8907 y, 8908 d, 8909 j, 8910 max, 8911 min, 8912 wrapAt; 8913 8914 if (!distances) { 8915 wrapAt = vars.grid === "auto" ? 0 : (vars.grid || [1, _bigNum])[1]; 8916 8917 if (!wrapAt) { 8918 max = -_bigNum; 8919 8920 while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {} 8921 8922 wrapAt < l && wrapAt--; 8923 } 8924 8925 distances = cache[l] = []; 8926 originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt; 8927 originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0; 8928 max = 0; 8929 min = _bigNum; 8930 8931 for (j = 0; j < l; j++) { 8932 x = j % wrapAt - originX; 8933 y = originY - (j / wrapAt | 0); 8934 distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === "y" ? y : x); 8935 d > max && (max = d); 8936 d < min && (min = d); 8937 } 8938 8939 from === "random" && shuffle(distances); 8940 distances.max = max - min; 8941 distances.min = min; 8942 distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === "y" ? l / wrapAt : wrapAt) || 0) * (from === "edges" ? -1 : 1); 8943 distances.b = l < 0 ? base - l : base; 8944 distances.u = getUnit(vars.amount || vars.each) || 0; //unit 8945 8946 ease = ease && l < 0 ? _invertEase(ease) : ease; 8947 } 8948 8949 l = (distances[i] - distances.min) / distances.max || 0; 8950 return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors 8951 }; 8952}, 8953 _roundModifier = function _roundModifier(v) { 8954 //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc. 8955 var p = Math.pow(10, ((v + "").split(".")[1] || "").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed()) 8956 8957 return function (raw) { 8958 var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p); 8959 8960 return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151! 8961 }; 8962}, 8963 snap = function snap(snapTo, value) { 8964 var isArray = _isArray(snapTo), 8965 radius, 8966 is2D; 8967 8968 if (!isArray && _isObject(snapTo)) { 8969 radius = isArray = snapTo.radius || _bigNum; 8970 8971 if (snapTo.values) { 8972 snapTo = toArray(snapTo.values); 8973 8974 if (is2D = !_isNumber(snapTo[0])) { 8975 radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop. 8976 } 8977 } else { 8978 snapTo = _roundModifier(snapTo.increment); 8979 } 8980 } 8981 8982 return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) { 8983 is2D = snapTo(raw); 8984 return Math.abs(is2D - raw) <= radius ? is2D : raw; 8985 } : function (raw) { 8986 var x = parseFloat(is2D ? raw.x : raw), 8987 y = parseFloat(is2D ? raw.y : 0), 8988 min = _bigNum, 8989 closest = 0, 8990 i = snapTo.length, 8991 dx, 8992 dy; 8993 8994 while (i--) { 8995 if (is2D) { 8996 dx = snapTo[i].x - x; 8997 dy = snapTo[i].y - y; 8998 dx = dx * dx + dy * dy; 8999 } else { 9000 dx = Math.abs(snapTo[i] - x); 9001 } 9002 9003 if (dx < min) { 9004 min = dx; 9005 closest = i; 9006 } 9007 } 9008 9009 closest = !radius || min <= radius ? snapTo[closest] : raw; 9010 return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw); 9011 }); 9012}, 9013 random = function random(min, max, roundingIncrement, returnFunction) { 9014 return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () { 9015 return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + "").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction; 9016 }); 9017}, 9018 pipe = function pipe() { 9019 for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) { 9020 functions[_key] = arguments[_key]; 9021 } 9022 9023 return function (value) { 9024 return functions.reduce(function (v, f) { 9025 return f(v); 9026 }, value); 9027 }; 9028}, 9029 unitize = function unitize(func, unit) { 9030 return function (value) { 9031 return func(parseFloat(value)) + (unit || getUnit(value)); 9032 }; 9033}, 9034 normalize = function normalize(min, max, value) { 9035 return mapRange(min, max, 0, 1, value); 9036}, 9037 _wrapArray = function _wrapArray(a, wrapper, value) { 9038 return _conditionalReturn(value, function (index) { 9039 return a[~~wrapper(index)]; 9040 }); 9041}, 9042 wrap = function wrap(min, max, value) { 9043 // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP). 9044 var range = max - min; 9045 return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) { 9046 return (range + (value - min) % range) % range + min; 9047 }); 9048}, 9049 wrapYoyo = function wrapYoyo(min, max, value) { 9050 var range = max - min, 9051 total = range * 2; 9052 return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) { 9053 value = (total + (value - min) % total) % total || 0; 9054 return min + (value > range ? total - value : value); 9055 }); 9056}, 9057 _replaceRandom = function _replaceRandom(s) { 9058 return s.replace(_randomExp, function (match) { 9059 //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500]) 9060 var arIndex = match.indexOf("[") + 1, 9061 values = match.substring(arIndex || 7, arIndex ? match.indexOf("]") : match.length - 1).split(_commaDelimExp); 9062 return random(arIndex ? values : +values[0], arIndex ? 0 : +values[1], +values[2] || 1e-5); 9063 }); 9064}, 9065 mapRange = function mapRange(inMin, inMax, outMin, outMax, value) { 9066 var inRange = inMax - inMin, 9067 outRange = outMax - outMin; 9068 return _conditionalReturn(value, function (value) { 9069 return outMin + ((value - inMin) / inRange * outRange || 0); 9070 }); 9071}, 9072 interpolate = function interpolate(start, end, progress, mutate) { 9073 var func = isNaN(start + end) ? 0 : function (p) { 9074 return (1 - p) * start + p * end; 9075 }; 9076 9077 if (!func) { 9078 var isString = _isString(start), 9079 master = {}, 9080 p, 9081 i, 9082 interpolators, 9083 l, 9084 il; 9085 9086 progress === true && (mutate = 1) && (progress = null); 9087 9088 if (isString) { 9089 start = { 9090 p: start 9091 }; 9092 end = { 9093 p: end 9094 }; 9095 } else if (_isArray(start) && !_isArray(end)) { 9096 interpolators = []; 9097 l = start.length; 9098 il = l - 2; 9099 9100 for (i = 1; i < l; i++) { 9101 interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them. 9102 } 9103 9104 l--; 9105 9106 func = function func(p) { 9107 p *= l; 9108 var i = Math.min(il, ~~p); 9109 return interpolators[i](p - i); 9110 }; 9111 9112 progress = end; 9113 } else if (!mutate) { 9114 start = _merge(_isArray(start) ? [] : {}, start); 9115 } 9116 9117 if (!interpolators) { 9118 for (p in end) { 9119 _addPropTween.call(master, start, p, "get", end[p]); 9120 } 9121 9122 func = function func(p) { 9123 return _renderPropTweens(p, master) || (isString ? start.p : start); 9124 }; 9125 } 9126 } 9127 9128 return _conditionalReturn(progress, func); 9129}, 9130 _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) { 9131 //used for nextLabel() and previousLabel() 9132 var labels = timeline.labels, 9133 min = _bigNum, 9134 p, 9135 distance, 9136 label; 9137 9138 for (p in labels) { 9139 distance = labels[p] - fromTime; 9140 9141 if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) { 9142 label = p; 9143 min = distance; 9144 } 9145 } 9146 9147 return label; 9148}, 9149 _callback = function _callback(animation, type, executeLazyFirst) { 9150 var v = animation.vars, 9151 callback = v[type], 9152 prevContext = _context, 9153 context = animation._ctx, 9154 params, 9155 scope, 9156 result; 9157 9158 if (!callback) { 9159 return; 9160 } 9161 9162 params = v[type + "Params"]; 9163 scope = v.callbackScope || animation; 9164 executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values. 9165 9166 context && (_context = context); 9167 result = params ? callback.apply(scope, params) : callback.call(scope); 9168 _context = prevContext; 9169 return result; 9170}, 9171 _interrupt = function _interrupt(animation) { 9172 _removeFromParent(animation); 9173 9174 animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting); 9175 animation.progress() < 1 && _callback(animation, "onInterrupt"); 9176 return animation; 9177}, 9178 _quickTween, 9179 _registerPluginQueue = [], 9180 _createPlugin = function _createPlugin(config) { 9181 if (!config) return; 9182 config = !config.name && config["default"] || config; // UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}. 9183 9184 if (_windowExists() || config.headless) { 9185 // edge case: some build tools may pass in a null/undefined value 9186 var name = config.name, 9187 isFunc = _isFunction(config), 9188 Plugin = name && !isFunc && config.init ? function () { 9189 this._props = []; 9190 } : config, 9191 //in case someone passes in an object that's not a plugin, like CustomEase 9192 instanceDefaults = { 9193 init: _emptyFunc, 9194 render: _renderPropTweens, 9195 add: _addPropTween, 9196 kill: _killPropTweensOf, 9197 modifier: _addPluginModifier, 9198 rawVars: 0 9199 }, 9200 statics = { 9201 targetTest: 0, 9202 get: 0, 9203 getSetter: _getSetter, 9204 aliases: {}, 9205 register: 0 9206 }; 9207 9208 _wake(); 9209 9210 if (config !== Plugin) { 9211 if (_plugins[name]) { 9212 return; 9213 } 9214 9215 _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods 9216 9217 9218 _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods 9219 9220 9221 _plugins[Plugin.prop = name] = Plugin; 9222 9223 if (config.targetTest) { 9224 _harnessPlugins.push(Plugin); 9225 9226 _reservedProps[name] = 1; 9227 } 9228 9229 name = (name === "css" ? "CSS" : name.charAt(0).toUpperCase() + name.substr(1)) + "Plugin"; //for the global name. "motionPath" should become MotionPathPlugin 9230 } 9231 9232 _addGlobal(name, Plugin); 9233 9234 config.register && config.register(gsap, Plugin, PropTween); 9235 } else { 9236 _registerPluginQueue.push(config); 9237 } 9238}, 9239 9240/* 9241 * -------------------------------------------------------------------------------------- 9242 * COLORS 9243 * -------------------------------------------------------------------------------------- 9244 */ 9245_255 = 255, 9246 _colorLookup = { 9247 aqua: [0, _255, _255], 9248 lime: [0, _255, 0], 9249 silver: [192, 192, 192], 9250 black: [0, 0, 0], 9251 maroon: [128, 0, 0], 9252 teal: [0, 128, 128], 9253 blue: [0, 0, _255], 9254 navy: [0, 0, 128], 9255 white: [_255, _255, _255], 9256 olive: [128, 128, 0], 9257 yellow: [_255, _255, 0], 9258 orange: [_255, 165, 0], 9259 gray: [128, 128, 128], 9260 purple: [128, 0, 128], 9261 green: [0, 128, 0], 9262 red: [_255, 0, 0], 9263 pink: [_255, 192, 203], 9264 cyan: [0, _255, _255], 9265 transparent: [_255, _255, _255, 0] 9266}, 9267 // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc: 9268// let ctx = _doc.createElement("canvas").getContext("2d"); 9269// _forEachName("aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)}); 9270_hue = function _hue(h, m1, m2) { 9271 h += h < 0 ? 1 : h > 1 ? -1 : 0; 9272 return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0; 9273}, 9274 splitColor = function splitColor(v, toHSL, forceAlpha) { 9275 var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0, 9276 r, 9277 g, 9278 b, 9279 h, 9280 s, 9281 l, 9282 max, 9283 min, 9284 d, 9285 wasHSL; 9286 9287 if (!a) { 9288 if (v.substr(-1) === ",") { 9289 //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value. 9290 v = v.substr(0, v.length - 1); 9291 } 9292 9293 if (_colorLookup[v]) { 9294 a = _colorLookup[v]; 9295 } else if (v.charAt(0) === "#") { 9296 if (v.length < 6) { 9297 //for shorthand like #9F0 or #9F0F (could have alpha) 9298 r = v.charAt(1); 9299 g = v.charAt(2); 9300 b = v.charAt(3); 9301 v = "#" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : ""); 9302 } 9303 9304 if (v.length === 9) { 9305 // hex with alpha, like #fd5e53ff 9306 a = parseInt(v.substr(1, 6), 16); 9307 return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255]; 9308 } 9309 9310 v = parseInt(v.substr(1), 16); 9311 a = [v >> 16, v >> 8 & _255, v & _255]; 9312 } else if (v.substr(0, 3) === "hsl") { 9313 a = wasHSL = v.match(_strictNumExp); 9314 9315 if (!toHSL) { 9316 h = +a[0] % 360 / 360; 9317 s = +a[1] / 100; 9318 l = +a[2] / 100; 9319 g = l <= .5 ? l * (s + 1) : l + s - l * s; 9320 r = l * 2 - g; 9321 a.length > 3 && (a[3] *= 1); //cast as number 9322 9323 a[0] = _hue(h + 1 / 3, r, g); 9324 a[1] = _hue(h, r, g); 9325 a[2] = _hue(h - 1 / 3, r, g); 9326 } else if (~v.indexOf("=")) { 9327 //if relative values are found, just return the raw strings with the relative prefixes in place. 9328 a = v.match(_numExp); 9329 forceAlpha && a.length < 4 && (a[3] = 1); 9330 return a; 9331 } 9332 } else { 9333 a = v.match(_strictNumExp) || _colorLookup.transparent; 9334 } 9335 9336 a = a.map(Number); 9337 } 9338 9339 if (toHSL && !wasHSL) { 9340 r = a[0] / _255; 9341 g = a[1] / _255; 9342 b = a[2] / _255; 9343 max = Math.max(r, g, b); 9344 min = Math.min(r, g, b); 9345 l = (max + min) / 2; 9346 9347 if (max === min) { 9348 h = s = 0; 9349 } else { 9350 d = max - min; 9351 s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 9352 h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4; 9353 h *= 60; 9354 } 9355 9356 a[0] = ~~(h + .5); 9357 a[1] = ~~(s * 100 + .5); 9358 a[2] = ~~(l * 100 + .5); 9359 } 9360 9361 forceAlpha && a.length < 4 && (a[3] = 1); 9362 return a; 9363}, 9364 _colorOrderData = function _colorOrderData(v) { 9365 // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a "c" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors() 9366 var values = [], 9367 c = [], 9368 i = -1; 9369 v.split(_colorExp).forEach(function (v) { 9370 var a = v.match(_numWithUnitExp) || []; 9371 values.push.apply(values, a); 9372 c.push(i += a.length + 1); 9373 }); 9374 values.c = c; 9375 return values; 9376}, 9377 _formatColors = function _formatColors(s, toHSL, orderMatchData) { 9378 var result = "", 9379 colors = (s + result).match(_colorExp), 9380 type = toHSL ? "hsla(" : "rgba(", 9381 i = 0, 9382 c, 9383 shell, 9384 d, 9385 l; 9386 9387 if (!colors) { 9388 return s; 9389 } 9390 9391 colors = colors.map(function (color) { 9392 return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : color.join(",")) + ")"; 9393 }); 9394 9395 if (orderMatchData) { 9396 d = _colorOrderData(s); 9397 c = orderMatchData.c; 9398 9399 if (c.join(result) !== d.c.join(result)) { 9400 shell = s.replace(_colorExp, "1").split(_numWithUnitExp); 9401 l = shell.length - 1; 9402 9403 for (; i < l; i++) { 9404 result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + "0,0,0,0)" : (d.length ? d : colors.length ? colors : orderMatchData).shift()); 9405 } 9406 } 9407 } 9408 9409 if (!shell) { 9410 shell = s.split(_colorExp); 9411 l = shell.length - 1; 9412 9413 for (; i < l; i++) { 9414 result += shell[i] + colors[i]; 9415 } 9416 } 9417 9418 return result + shell[l]; 9419}, 9420 _colorExp = function () { 9421 var s = "(?:\\
9421\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b", 9422 //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc., 9423 p; 9424 9425 for (p in _colorLookup) { 9426 s += "|" + p + "\\\\b"; 9427 } 9428 9429 return new RegExp(s + ")", "gi"); 9430}(), 9431 _hslExp = /hsl[a]?\\(/, 9432 _colorStringFilter = function _colorStringFilter(a) { 9433 var combined = a.join(" "), 9434 toHSL; 9435 _colorExp.lastIndex = 0; 9436 9437 if (_colorExp.test(combined)) { 9438 toHSL = _hslExp.test(combined); 9439 a[1] = _formatColors(a[1], toHSL); 9440 a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value. 9441 9442 return true; 9443 } 9444}, 9445 9446/* 9447 * -------------------------------------------------------------------------------------- 9448 * TICKER 9449 * -------------------------------------------------------------------------------------- 9450 */ 9451_tickerActive, 9452 _ticker = function () { 9453 var _getTime = Date.now, 9454 _lagThreshold = 500, 9455 _adjustedLag = 33, 9456 _startTime = _getTime(), 9457 _lastUpdate = _startTime, 9458 _gap = 1000 / 240, 9459 _nextTime = _gap, 9460 _listeners = [], 9461 _id, 9462 _req, 9463 _raf, 9464 _self, 9465 _delta, 9466 _i, 9467 _tick = function _tick(v) {
vendor: 3,476 bytes, lines 9468-9579
9468 var elapsed = _getTime() - _lastUpdate, 9469 manual = v === true, 9470 overlap, 9471 dispatch, 9472 time, 9473 frame; 9474 9475 (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag); 9476 _lastUpdate += elapsed; 9477 time = _lastUpdate - _startTime; 9478 overlap = time - _nextTime; 9479 9480 if (overlap > 0 || manual) { 9481 frame = ++_self.frame; 9482 _delta = time - _self.time * 1000; 9483 _self.time = time = time / 1000; 9484 _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap); 9485 dispatch = 1; 9486 } 9487 9488 manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise. 9489 9490 if (dispatch) { 9491 for (_i = 0; _i < _listeners.length; _i++) { 9492 // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop. 9493 _listeners[_i](time, _delta, frame, v); 9494 } 9495 } 9496 }; 9497 9498 _self = { 9499 time: 0, 9500 frame: 0, 9501 tick: function tick() { 9502 _tick(true); 9503 }, 9504 deltaRatio: function deltaRatio(fps) { 9505 return _delta / (1000 / (fps || 60)); 9506 }, 9507 wake: function wake() { 9508 if (_coreReady) { 9509 if (!_coreInitted && _windowExists()) { 9510 _win = _coreInitted = window; 9511 _doc = _win.document || {}; 9512 _globals.gsap = gsap; 9513 (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version); 9514 9515 _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {}); 9516 9517 _registerPluginQueue.forEach(_createPlugin); 9518 } 9519 9520 _raf = typeof requestAnimationFrame !== "undefined" && requestAnimationFrame; 9521 _id && _self.sleep(); 9522 9523 _req = _raf || function (f) { 9524 return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0); 9525 }; 9526 9527 _tickerActive = 1; 9528 9529 _tick(2); 9530 } 9531 }, 9532 sleep: function sleep() { 9533 (_raf ? cancelAnimationFrame : clearTimeout)(_id); 9534 _tickerActive = 0; 9535 _req = _emptyFunc; 9536 }, 9537 lagSmoothing: function lagSmoothing(threshold, adjustedLag) { 9538 _lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited 9539 9540 _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold); 9541 }, 9542 fps: function fps(_fps) { 9543 _gap = 1000 / (_fps || 240); 9544 _nextTime = _self.time * 1000 + _gap; 9545 }, 9546 add: function add(callback, once, prioritize) { 9547 var func = once ? function (t, d, f, v) { 9548 callback(t, d, f, v); 9549 9550 _self.remove(func); 9551 } : callback; 9552 9553 _self.remove(callback); 9554 9555 _listeners[prioritize ? "unshift" : "push"](func); 9556 9557 _wake(); 9558 9559 return func; 9560 }, 9561 remove: function remove(callback, i) { 9562 ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--; 9563 }, 9564 _listeners: _listeners 9565 }; 9566 return _self; 9567}(), 9568 _wake = function _wake() { 9569 return !_tickerActive && _ticker.wake(); 9570}, 9571 //also ensures the core classes are initialized. 9572 9573/* 9574* ------------------------------------------------- 9575* EASING 9576* ------------------------------------------------- 9577*/ 9578_easeMap = {}, 9579 _customEaseExp = /^[\\d.\\-M][\\d.\\-,\
vendor: 7,316 bytes, lines 9579-9782
9579\s]/, 9580 _quotesExp = /["']/g, 9581 _parseObjectInString = function _parseObjectInString(value) { 9582 //takes a string like "{wiggles:10, type:anticipate})" and turns it into a real object. Notice it ends in ")" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability. 9583 var obj = {}, 9584 split = value.substr(1, value.length - 3).split(":"), 9585 key = split[0], 9586 i = 1, 9587 l = split.length, 9588 index, 9589 val, 9590 parsedVal; 9591 9592 for (; i < l; i++) { 9593 val = split[i]; 9594 index = i !== l - 1 ? val.lastIndexOf(",") : val.length; 9595 parsedVal = val.substr(0, index); 9596 obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, "").trim() : +parsedVal; 9597 key = val.substr(index + 1).trim(); 9598 } 9599 9600 return obj; 9601}, 9602 _valueInParentheses = function _valueInParentheses(value) { 9603 var open = value.indexOf("(") + 1, 9604 close = value.indexOf(")"), 9605 nested = value.indexOf("(", open); 9606 return value.substring(open, ~nested && nested < close ? value.indexOf(")", close + 1) : close); 9607}, 9608 _configEaseFromString = function _configEaseFromString(name) { 9609 //name can be a string like "elastic.out(1,0.5)", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE). 9610 var split = (name + "").split("("), 9611 ease = _easeMap[split[0]]; 9612 return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf("{") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(",").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE("", name) : ease; 9613}, 9614 _invertEase = function _invertEase(ease) { 9615 return function (p) { 9616 return 1 - ease(1 - p); 9617 }; 9618}, 9619 _parseEase = function _parseEase(ease, defaultEase) { 9620 return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase; 9621}, 9622 _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) { 9623 if (easeOut === void 0) { 9624 easeOut = function easeOut(p) { 9625 return 1 - easeIn(1 - p); 9626 }; 9627 } 9628 9629 if (easeInOut === void 0) { 9630 easeInOut = function easeInOut(p) { 9631 return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2; 9632 }; 9633 } 9634 9635 var ease = { 9636 easeIn: easeIn, 9637 easeOut: easeOut, 9638 easeInOut: easeInOut 9639 }, 9640 lowercaseName; 9641 9642 _forEachName(names, function (name) { 9643 _easeMap[name] = _globals[name] = ease; 9644 _easeMap[lowercaseName = name.toLowerCase()] = easeOut; 9645 9646 for (var p in ease) { 9647 _easeMap[lowercaseName + (p === "easeIn" ? ".in" : p === "easeOut" ? ".out" : ".inOut")] = _easeMap[name + "." + p] = ease[p]; 9648 } 9649 }); 9650 9651 return ease; 9652}, 9653 _easeInOutFromOut = function _easeInOutFromOut(easeOut) { 9654 return function (p) { 9655 return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2; 9656 }; 9657}, 9658 _configElastic = function _configElastic(type, amplitude, period) { 9659 var p1 = amplitude >= 1 ? amplitude : 1, 9660 //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1. 9661 p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1), 9662 p3 = p2 / _2PI * (Math.asin(1 / p1) || 0), 9663 easeOut = function easeOut(p) { 9664 return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1; 9665 }, 9666 ease = type === "out" ? easeOut : type === "in" ? function (p) { 9667 return 1 - easeOut(1 - p); 9668 } : _easeInOutFromOut(easeOut); 9669 9670 p2 = _2PI / p2; //precalculate to optimize 9671 9672 ease.config = function (amplitude, period) { 9673 return _configElastic(type, amplitude, period); 9674 }; 9675 9676 return ease; 9677}, 9678 _configBack = function _configBack(type, overshoot) { 9679 if (overshoot === void 0) { 9680 overshoot = 1.70158; 9681 } 9682 9683 var easeOut = function easeOut(p) { 9684 return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0; 9685 }, 9686 ease = type === "out" ? easeOut : type === "in" ? function (p) { 9687 return 1 - easeOut(1 - p); 9688 } : _easeInOutFromOut(easeOut); 9689 9690 ease.config = function (overshoot) { 9691 return _configBack(type, overshoot); 9692 }; 9693 9694 return ease; 9695}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 9696// _weightedEase = ratio => { 9697// let y = 0.5 + ratio / 2; 9698// return p => (2 * (1 - p) * p * y + p * p); 9699// }, 9700// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear. 9701// _weightedEaseStrong = ratio => { 9702// ratio = .5 + ratio / 2; 9703// let o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio), 9704// b = ratio - o, 9705// c = ratio + o; 9706// return p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p; 9707// }; 9708 9709 9710_forEachName("Linear,Quad,Cubic,Quart,Quint,Strong", function (name, i) { 9711 var power = i < 5 ? i + 1 : i; 9712 9713 _insertEase(name + ",Power" + (power - 1), i ? function (p) { 9714 return Math.pow(p, power); 9715 } : function (p) { 9716 return p; 9717 }, function (p) { 9718 return 1 - Math.pow(1 - p, power); 9719 }, function (p) { 9720 return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2; 9721 }); 9722}); 9723 9724_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn; 9725 9726_insertEase("Elastic", _configElastic("in"), _configElastic("out"), _configElastic()); 9727 9728(function (n, c) { 9729 var n1 = 1 / c, 9730 n2 = 2 * n1, 9731 n3 = 2.5 * n1, 9732 easeOut = function easeOut(p) { 9733 return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375; 9734 }; 9735 9736 _insertEase("Bounce", function (p) { 9737 return 1 - easeOut(1 - p); 9738 }, easeOut); 9739})(7.5625, 2.75); 9740 9741_insertEase("Expo", function (p) { 9742 return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p); 9743}); // previously 2 ** (10 * (p - 1)) but that doesn't end up with the value quite at the right spot so we do a blended ease to ensure it lands where it should perfectly. 9744 9745 9746_insertEase("Circ", function (p) { 9747 return -(_sqrt(1 - p * p) - 1); 9748}); 9749 9750_insertEase("Sine", function (p) { 9751 return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1; 9752}); 9753 9754_insertEase("Back", _configBack("in"), _configBack("out"), _configBack()); 9755 9756_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = { 9757 config: function config(steps, immediateStart) { 9758 if (steps === void 0) { 9759 steps = 1; 9760 } 9761 9762 var p1 = 1 / steps, 9763 p2 = steps + (immediateStart ? 0 : 1), 9764 p3 = immediateStart ? 1 : 0, 9765 max = 1 - _tinyNum; 9766 return function (p) { 9767 return ((p2 * _clamp(0, max, p) | 0) + p3) * p1; 9768 }; 9769 } 9770}; 9771_defaults.ease = _easeMap["quad.out"]; 9772 9773_forEachName("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt", function (name) { 9774 return _callbackNames += name + "," + name + "Params,"; 9775}); 9776/* 9777 * -------------------------------------------------------------------------------------- 9778 * CACHE 9779 * -------------------------------------------------------------------------------------- 9780 */ 9781 9782
9783var GSCache = function GSCache(target, harness) { 9784 this.id = _gsID++; 9785 target._gsap = this; 9786 this.target = target; 9787 this.harness = harness; 9788 this.get = harness ? harness.get : _getProperty; 9789 this.set = harness ? harness.getSetter : _getSetter; 9790}; 9791/* 9792 * -------------------------------------------------------------------------------------- 9793 * ANIMATION 9794 * -------------------------------------------------------------------------------------- 9795 */ 9796
vendor: 108,904 bytes, lines 9797-12604
9797var Animation = /*#__PURE__*/function () { 9798 function Animation(vars) { 9799 this.vars = vars; 9800 this._delay = +vars.delay || 0; 9801 9802 if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) { 9803 // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start. 9804 this._rDelay = vars.repeatDelay || 0; 9805 this._yoyo = !!vars.yoyo || !!vars.yoyoEase; 9806 } 9807 9808 this._ts = 1; 9809 9810 _setDuration(this, +vars.duration, 1, 1); 9811 9812 this.data = vars.data; 9813 9814 if (_context) { 9815 this._ctx = _context; 9816 9817 _context.data.push(this); 9818 } 9819 9820 _tickerActive || _ticker.wake(); 9821 } 9822 9823 var _proto = Animation.prototype; 9824 9825 _proto.delay = function delay(value) { 9826 if (value || value === 0) { 9827 this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay); 9828 this._delay = value; 9829 return this; 9830 } 9831 9832 return this._delay; 9833 }; 9834 9835 _proto.duration = function duration(value) { 9836 return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur; 9837 }; 9838 9839 _proto.totalDuration = function totalDuration(value) { 9840 if (!arguments.length) { 9841 return this._tDur; 9842 } 9843 9844 this._dirty = 0; 9845 return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1)); 9846 }; 9847 9848 _proto.totalTime = function totalTime(_totalTime, suppressEvents) { 9849 _wake(); 9850 9851 if (!arguments.length) { 9852 return this._tTime; 9853 } 9854 9855 var parent = this._dp; 9856 9857 if (parent && parent.smoothChildTiming && this._ts) { 9858 _alignPlayhead(this, _totalTime); 9859 9860 !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent. 9861 //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed. 9862 9863 while (parent && parent.parent) { 9864 if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) { 9865 parent.totalTime(parent._tTime, true); 9866 } 9867 9868 parent = parent.parent; 9869 } 9870 9871 if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) { 9872 //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in. 9873 _addToTimeline(this._dp, this, this._start - this._delay); 9874 } 9875 } 9876 9877 if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !this._initted && this._dur && _totalTime || !_totalTime && !this._initted && (this.add || this._ptLookup)) { 9878 // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional) 9879 this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause 9880 //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit) 9881 // this._lock = 1; 9882 9883 _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0; 9884 //} 9885 9886 } 9887 9888 return this; 9889 }; 9890 9891 _proto.time = function time(value, suppressEvents) { 9892 return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START! 9893 }; 9894 9895 _proto.totalProgress = function totalProgress(value, suppressEvents) { 9896 return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0; 9897 }; 9898 9899 _proto.progress = function progress(value, suppressEvents) { 9900 return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0; 9901 }; 9902 9903 _proto.iteration = function iteration(value, suppressEvents) { 9904 var cycleDuration = this.duration() + this._rDelay; 9905 9906 return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1; 9907 } // potential future addition: 9908 // isPlayingBackwards() { 9909 // let animation = this, 9910 // orientation = 1; // 1 = forward, -1 = backward 9911 // while (animation) { 9912 // orientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1; 9913 // animation = animation.parent; 9914 // } 9915 // return orientation < 0; 9916 // } 9917 ; 9918 9919 _proto.timeScale = function timeScale(value, suppressEvents) { 9920 if (!arguments.length) { 9921 return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed. 9922 } 9923 9924 if (this._rts === value) { 9925 return this; 9926 } 9927 9928 var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation. 9929 // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called. 9930 //(+value < 0 && this._rts >= 0) && _callback(this, "onReverse", true); 9931 // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes. 9932 9933 this._rts = +value || 0; 9934 this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused. 9935 9936 this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false); 9937 9938 _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here. 9939 9940 9941 return _recacheAncestors(this); 9942 }; 9943 9944 _proto.paused = function paused(value) { 9945 if (!arguments.length) { 9946 return this._ps; 9947 } // possible future addition - if an animation is removed from its parent and then .restart() or .play() or .resume() is called, perhaps we should force it back into the globalTimeline but be careful because what if it's already at its end? We don't want it to just persist forever and not get released for GC. 9948 // !this.parent && !value && this._tTime < this._tDur && this !== _globalTimeline && _globalTimeline.add(this); 9949 9950 9951 if (this._ps !== value) { 9952 this._ps = value; 9953 9954 if (value) { 9955 this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming. 9956 9957 this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the "real" timeScale as _rts (recorded time scale) 9958 } else { 9959 _wake(); 9960 9961 this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated. 9962 9963 this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise. 9964 } 9965 } 9966 9967 return this; 9968 }; 9969 9970 _proto.startTime = function startTime(value) { 9971 if (arguments.length) { 9972 this._start = _roundPrecise(value); 9973 var parent = this.parent || this._dp; 9974 parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, this._start - this._delay); 9975 return this; 9976 } 9977 9978 return this._start; 9979 }; 9980 9981 _proto.endTime = function endTime(includeRepeats) { 9982 return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1); 9983 }; 9984 9985 _proto.rawTime = function rawTime(wrapRepeats) { 9986 var parent = this.parent || this._dp; // _dp = detached parent 9987 9988 return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this); 9989 }; 9990 9991 _proto.revert = function revert(config) { 9992 if (config === void 0) { 9993 config = _revertConfig; 9994 } 9995 9996 var prevIsReverting = _reverting; 9997 _reverting = config; 9998 9999 if (_isRevertWorthy(this)) { 10000 this.timeline && this.timeline.revert(config); 10001 this.totalTime(-0.01, config.suppressEvents); 10002 } 10003 10004 this.data !== "nested" && config.kill !== false && this.kill(); 10005 _reverting = prevIsReverting; 10006 return this; 10007 }; 10008 10009 _proto.globalTime = function globalTime(rawTime) { 10010 var animation = this, 10011 time = arguments.length ? rawTime : animation.rawTime(); 10012 10013 while (animation) { 10014 time = animation._start + time / (Math.abs(animation._ts) || 1); 10015 animation = animation._dp; 10016 } 10017 10018 return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). "_sat" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert(). 10019 }; 10020 10021 _proto.repeat = function repeat(value) { 10022 if (arguments.length) { 10023 this._repeat = value === Infinity ? -2 : value; 10024 return _onUpdateTotalDuration(this); 10025 } 10026 10027 return this._repeat === -2 ? Infinity : this._repeat; 10028 }; 10029 10030 _proto.repeatDelay = function repeatDelay(value) { 10031 if (arguments.length) { 10032 var time = this._time; 10033 this._rDelay = value; 10034 10035 _onUpdateTotalDuration(this); 10036 10037 return time ? this.time(time) : this; 10038 } 10039 10040 return this._rDelay; 10041 }; 10042 10043 _proto.yoyo = function yoyo(value) { 10044 if (arguments.length) { 10045 this._yoyo = value; 10046 return this; 10047 } 10048 10049 return this._yoyo; 10050 }; 10051 10052 _proto.seek = function seek(position, suppressEvents) { 10053 return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents)); 10054 }; 10055 10056 _proto.restart = function restart(includeDelay, suppressEvents) { 10057 this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents)); 10058 this._dur || (this._zTime = -_tinyNum); // ensures onComplete fires on a zero-duration animation that gets restarted. 10059 10060 return this; 10061 }; 10062 10063 _proto.play = function play(from, suppressEvents) { 10064 from != null && this.seek(from, suppressEvents); 10065 return this.reversed(false).paused(false); 10066 }; 10067 10068 _proto.reverse = function reverse(from, suppressEvents) { 10069 from != null && this.seek(from || this.totalDuration(), suppressEvents); 10070 return this.reversed(true).paused(false); 10071 }; 10072 10073 _proto.pause = function pause(atTime, suppressEvents) { 10074 atTime != null && this.seek(atTime, suppressEvents); 10075 return this.paused(true); 10076 }; 10077 10078 _proto.resume = function resume() { 10079 return this.paused(false); 10080 }; 10081 10082 _proto.reversed = function reversed(value) { 10083 if (arguments.length) { 10084 !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum. 10085 10086 return this; 10087 } 10088 10089 return this._rts < 0; 10090 }; 10091 10092 _proto.invalidate = function invalidate() { 10093 this._initted = this._act = 0; 10094 this._zTime = -_tinyNum; 10095 return this; 10096 }; 10097 10098 _proto.isActive = function isActive() { 10099 var parent = this.parent || this._dp, 10100 start = this._start, 10101 rawTime; 10102 return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum); 10103 }; 10104 10105 _proto.eventCallback = function eventCallback(type, callback, params) { 10106 var vars = this.vars; 10107 10108 if (arguments.length > 1) { 10109 if (!callback) { 10110 delete vars[type]; 10111 } else { 10112 vars[type] = callback; 10113 params && (vars[type + "Params"] = params); 10114 type === "onUpdate" && (this._onUpdate = callback); 10115 } 10116 10117 return this; 10118 } 10119 10120 return vars[type]; 10121 }; 10122 10123 _proto.then = function then(onFulfilled) { 10124 var self = this, 10125 prevProm = self._prom; 10126 return new Promise(function (resolve) { 10127 var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough, 10128 _resolve = function _resolve() { 10129 var _then = self.then; 10130 self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322) 10131 10132 prevProm && prevProm(); 10133 _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then); 10134 resolve(f); 10135 self.then = _then; 10136 }; 10137 10138 if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) { 10139 _resolve(); 10140 } else { 10141 self._prom = _resolve; 10142 } 10143 }); 10144 }; 10145 10146 _proto.kill = function kill() { 10147 _interrupt(this); 10148 }; 10149 10150 return Animation; 10151}(); 10152 10153_setDefaults(Animation.prototype, { 10154 _time: 0, 10155 _start: 0, 10156 _end: 0, 10157 _tTime: 0, 10158 _tDur: 0, 10159 _dirty: 0, 10160 _repeat: 0, 10161 _yoyo: false, 10162 parent: null, 10163 _initted: false, 10164 _rDelay: 0, 10165 _ts: 1, 10166 _dp: 0, 10167 ratio: 0, 10168 _zTime: -_tinyNum, 10169 _prom: 0, 10170 _ps: false, 10171 _rts: 1 10172}); 10173/* 10174 * ------------------------------------------------- 10175 * TIMELINE 10176 * ------------------------------------------------- 10177 */ 10178 10179 10180var Timeline = /*#__PURE__*/function (_Animation) { 10181 _inheritsLoose(Timeline, _Animation); 10182 10183 function Timeline(vars, position) { 10184 var _this; 10185 10186 if (vars === void 0) { 10187 vars = {}; 10188 } 10189 10190 _this = _Animation.call(this, vars) || this; 10191 _this.labels = {}; 10192 _this.smoothChildTiming = !!vars.smoothChildTiming; 10193 _this.autoRemoveChildren = !!vars.autoRemoveChildren; 10194 _this._sort = _isNotFalse(vars.sortChildren); 10195 _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position); 10196 vars.reversed && _this.reverse(); 10197 vars.paused && _this.paused(true); 10198 vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger); 10199 return _this; 10200 } 10201 10202 var _proto2 = Timeline.prototype; 10203 10204 _proto2.to = function to(targets, vars, position) { 10205 _createTweenType(0, arguments, this); 10206 10207 return this; 10208 }; 10209 10210 _proto2.from = function from(targets, vars, position) { 10211 _createTweenType(1, arguments, this); 10212 10213 return this; 10214 }; 10215 10216 _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) { 10217 _createTweenType(2, arguments, this); 10218 10219 return this; 10220 }; 10221 10222 _proto2.set = function set(targets, vars, position) { 10223 vars.duration = 0; 10224 vars.parent = this; 10225 _inheritDefaults(vars).repeatDelay || (vars.repeat = 0); 10226 vars.immediateRender = !!vars.immediateRender; 10227 new Tween(targets, vars, _parsePosition(this, position), 1); 10228 return this; 10229 }; 10230 10231 _proto2.call = function call(callback, params, position) { 10232 return _addToTimeline(this, Tween.delayedCall(0, callback, params), position); 10233 } //ONLY for backward compatibility! Maybe delete? 10234 ; 10235 10236 _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 10237 vars.duration = duration; 10238 vars.stagger = vars.stagger || stagger; 10239 vars.onComplete = onCompleteAll; 10240 vars.onCompleteParams = onCompleteAllParams; 10241 vars.parent = this; 10242 new Tween(targets, vars, _parsePosition(this, position)); 10243 return this; 10244 }; 10245 10246 _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) { 10247 vars.runBackwards = 1; 10248 _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender); 10249 return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams); 10250 }; 10251 10252 _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) { 10253 toVars.startAt = fromVars; 10254 _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender); 10255 return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams); 10256 }; 10257 10258 _proto2.render = function render(totalTime, suppressEvents, force) { 10259 var prevTime = this._time, 10260 tDur = this._dirty ? this.totalDuration() : this._tDur, 10261 dur = this._dur, 10262 tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime), 10263 // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example. 10264 crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur), 10265 time, 10266 child, 10267 next, 10268 iteration, 10269 cycleDuration, 10270 prevPaused, 10271 pauseTween, 10272 timeScale, 10273 prevStart, 10274 prevIteration, 10275 yoyo, 10276 isYoyo; 10277 this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur); 10278 10279 if (tTime !== this._tTime || force || crossingStart) { 10280 if (prevTime !== this._time && dur) { 10281 //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump). 10282 tTime += this._time - prevTime; 10283 totalTime += this._time - prevTime; 10284 } 10285 10286 time = tTime; 10287 prevStart = this._start; 10288 timeScale = this._ts; 10289 prevPaused = !timeScale; 10290 10291 if (crossingStart) { 10292 dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. 10293 10294 (totalTime || !suppressEvents) && (this._zTime = totalTime); 10295 } 10296 10297 if (this._repeat) { 10298 //adjust the time for repeats and yoyos 10299 yoyo = this._yoyo; 10300 cycleDuration = dur + this._rDelay; 10301 10302 if (this._repeat < -1 && totalTime < 0) { 10303 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 10304 } 10305 10306 time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 10307 10308 if (tTime === tDur) { 10309 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 10310 iteration = this._repeat; 10311 time = dur; 10312 } else { 10313 prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency) 10314 10315 iteration = ~~prevIteration; 10316 10317 if (iteration && iteration === prevIteration) { 10318 time = dur; 10319 iteration--; 10320 } 10321 10322 time > dur && (time = dur); 10323 } 10324 10325 prevIteration = _animationCycle(this._tTime, cycleDuration); 10326 !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://gsap.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the "repeatDelay" portion 10327 10328 if (yoyo && iteration & 1) { 10329 time = dur - time; 10330 isYoyo = 1; 10331 } 10332 /* 10333 make sure children at the end/beginning of the timeline are rendered properly. If, for example, 10334 a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which 10335 would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there 10336 could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So 10337 we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must 10338 ensure that zero-duration tweens at the very beginning or end of the Timeline work. 10339 */ 10340 10341 10342 if (iteration !== prevIteration && !this._lock) { 10343 var rewinding = yoyo && prevIteration & 1, 10344 doesWrap = rewinding === (yoyo && iteration & 1); 10345 iteration < prevIteration && (rewinding = !rewinding); 10346 prevTime = rewinding ? 0 : tTime % dur ? dur : tTime; // if the playhead is landing exactly at the end of an iteration, use that totalTime rather than only the duration, otherwise it'll skip the 2nd render since it's effectively at the same time. 10347 10348 this._lock = 1; 10349 this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0; 10350 this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate. 10351 10352 !suppressEvents && this.parent && _callback(this, "onRepeat"); 10353 10354 if (this.vars.repeatRefresh && !isYoyo) { 10355 this.invalidate()._lock = 1; 10356 prevIteration = iteration; // otherwise, the onStart() may fire on the 2nd iteration. 10357 } 10358 10359 if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) { 10360 // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well. 10361 return this; 10362 } 10363 10364 dur = this._dur; // in case the duration changed in the onRepeat 10365 10366 tDur = this._tDur; 10367 10368 if (doesWrap) { 10369 this._lock = 2; 10370 prevTime = rewinding ? dur : -0.0001; 10371 this.render(prevTime, true); 10372 this.vars.repeatRefresh && !isYoyo && this.invalidate(); 10373 } 10374 10375 this._lock = 0; 10376 10377 if (!this._ts && !prevPaused) { 10378 return this; 10379 } 10380 } 10381 } 10382 10383 if (this._hasPause && !this._forcing && this._lock < 2) { 10384 pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time)); 10385 10386 if (pauseTween) { 10387 tTime -= time - (time = pauseTween._start); 10388 } 10389 } 10390 10391 this._tTime = tTime; 10392 this._time = time; 10393 this._act = !!timeScale; // as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 10394 10395 if (!this._initted) { 10396 this._onUpdate = this.vars.onUpdate; 10397 this._initted = 1; 10398 this._zTime = totalTime; 10399 prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}). 10400 } 10401 10402 if (!prevTime && tTime && dur && !suppressEvents && !prevIteration) { 10403 _callback(this, "onStart"); 10404 10405 if (this._tTime !== tTime) { 10406 // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart. 10407 return this; 10408 } 10409 } 10410 10411 if (time >= prevTime && totalTime >= 0) { 10412 child = this._first; 10413 10414 while (child) { 10415 next = child._next; 10416 10417 if ((child._act || time >= child._start) && child._ts && pauseTween !== child) { 10418 if (child.parent !== this) { 10419 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 10420 return this.render(totalTime, suppressEvents, force); 10421 } 10422 10423 child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force); 10424 10425 if (time !== this._time || !this._ts && !prevPaused) { 10426 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 10427 pauseTween = 0; 10428 next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that the next time render() is called it'll be forced (to render any remaining children) 10429 10430 break; 10431 } 10432 } 10433 10434 child = next; 10435 } 10436 } else { 10437 child = this._last; 10438 var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values. 10439 10440 while (child) { 10441 next = child._prev; 10442 10443 if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) { 10444 if (child.parent !== this) { 10445 // an extreme edge case - the child's render could do something like kill() the "next" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe. 10446 return this.render(totalTime, suppressEvents, force); 10447 } 10448 10449 child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child)); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert. 10450 10451 if (time !== this._time || !this._ts && !prevPaused) { 10452 //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete 10453 pauseTween = 0; 10454 next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children) 10455 10456 break; 10457 } 10458 } 10459 10460 child = next; 10461 } 10462 } 10463 10464 if (pauseTween && !suppressEvents) { 10465 this.pause(); 10466 pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1; 10467 10468 if (this._ts) { 10469 //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened). 10470 this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift. 10471 10472 _setEnd(this); 10473 10474 return this.render(totalTime, suppressEvents, force); 10475 } 10476 } 10477 10478 this._onUpdate && !suppressEvents && _callback(this, "onUpdate", true); 10479 if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) { 10480 // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks. 10481 (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 10482 10483 if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) { 10484 _callback(this, tTime === tDur && totalTime >= 0 ? "onComplete" : "onReverseComplete", true); 10485 10486 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 10487 } 10488 } 10489 } 10490 10491 return this; 10492 }; 10493 10494 _proto2.add = function add(child, position) { 10495 var _this2 = this; 10496 10497 _isNumber(position) || (position = _parsePosition(this, position, child)); 10498 10499 if (!(child instanceof Animation)) { 10500 if (_isArray(child)) { 10501 child.forEach(function (obj) { 10502 return _this2.add(obj, position); 10503 }); 10504 return this; 10505 } 10506 10507 if (_isString(child)) { 10508 return this.addLabel(child, position); 10509 } 10510 10511 if (_isFunction(child)) { 10512 child = Tween.delayedCall(0, child); 10513 } else { 10514 return this; 10515 } 10516 } 10517 10518 return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child! 10519 }; 10520 10521 _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) { 10522 if (nested === void 0) { 10523 nested = true; 10524 } 10525 10526 if (tweens === void 0) { 10527 tweens = true; 10528 } 10529 10530 if (timelines === void 0) { 10531 timelines = true; 10532 } 10533 10534 if (ignoreBeforeTime === void 0) { 10535 ignoreBeforeTime = -_bigNum; 10536 } 10537 10538 var a = [], 10539 child = this._first; 10540 10541 while (child) { 10542 if (child._start >= ignoreBeforeTime) { 10543 if (child instanceof Tween) { 10544 tweens && a.push(child); 10545 } else { 10546 timelines && a.push(child); 10547 nested && a.push.apply(a, child.getChildren(true, tweens, timelines)); 10548 } 10549 } 10550 10551 child = child._next; 10552 } 10553 10554 return a; 10555 }; 10556 10557 _proto2.getById = function getById(id) { 10558 var animations = this.getChildren(1, 1, 1), 10559 i = animations.length; 10560 10561 while (i--) { 10562 if (animations[i].vars.id === id) { 10563 return animations[i]; 10564 } 10565 } 10566 }; 10567 10568 _proto2.remove = function remove(child) { 10569 if (_isString(child)) { 10570 return this.removeLabel(child); 10571 } 10572 10573 if (_isFunction(child)) { 10574 return this.killTweensOf(child); 10575 } 10576 10577 child.parent === this && _removeLinkedListItem(this, child); 10578 10579 if (child === this._recent) { 10580 this._recent = this._last; 10581 } 10582 10583 return _uncache(this); 10584 }; 10585 10586 _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) { 10587 if (!arguments.length) { 10588 return this._tTime; 10589 } 10590 10591 this._forcing = 1; 10592 10593 if (!this._dp && this._ts) { 10594 //special case for the global timeline (or any other that has no parent or detached parent). 10595 this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts)); 10596 } 10597 10598 _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents); 10599 10600 this._forcing = 0; 10601 return this; 10602 }; 10603 10604 _proto2.addLabel = function addLabel(label, position) { 10605 this.labels[label] = _parsePosition(this, position); 10606 return this; 10607 }; 10608 10609 _proto2.removeLabel = function removeLabel(label) { 10610 delete this.labels[label]; 10611 return this; 10612 }; 10613 10614 _proto2.addPause = function addPause(position, callback, params) { 10615 var t = Tween.delayedCall(0, callback || _emptyFunc, params); 10616 t.data = "isPause"; 10617 this._hasPause = 1; 10618 return _addToTimeline(this, t, _parsePosition(this, position)); 10619 }; 10620 10621 _proto2.removePause = function removePause(position) { 10622 var child = this._first; 10623 position = _parsePosition(this, position); 10624 10625 while (child) { 10626 if (child._start === position && child.data === "isPause") { 10627 _removeFromParent(child); 10628 } 10629 10630 child = child._next; 10631 } 10632 }; 10633 10634 _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) { 10635 var tweens = this.getTweensOf(targets, onlyActive), 10636 i = tweens.length; 10637 10638 while (i--) { 10639 _overwritingTween !== tweens[i] && tweens[i].kill(targets, props); 10640 } 10641 10642 return this; 10643 }; 10644 10645 _proto2.getTweensOf = function getTweensOf(targets, onlyActive) { 10646 var a = [], 10647 parsedTargets = toArray(targets), 10648 child = this._first, 10649 isGlobalTime = _isNumber(onlyActive), 10650 // a number is interpreted as a global time. If the animation spans 10651 children; 10652 10653 while (child) { 10654 if (child instanceof Tween) { 10655 if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) { 10656 // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted. 10657 a.push(child); 10658 } 10659 } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) { 10660 a.push.apply(a, children); 10661 } 10662 10663 child = child._next; 10664 } 10665 10666 return a; 10667 } // potential future feature - targets() on timelines 10668 // targets() { 10669 // let result = []; 10670 // this.getChildren(true, true, false).forEach(t => result.push(...t.targets())); 10671 // return result.filter((v, i) => result.indexOf(v) === i); 10672 // } 10673 ; 10674 10675 _proto2.tweenTo = function tweenTo(position, vars) { 10676 vars = vars || {}; 10677 10678 var tl = this, 10679 endTime = _parsePosition(tl, position), 10680 _vars = vars, 10681 startAt = _vars.startAt, 10682 _onStart = _vars.onStart, 10683 onStartParams = _vars.onStartParams, 10684 immediateRender = _vars.immediateRender, 10685 initted, 10686 tween = Tween.to(tl, _setDefaults({ 10687 ease: vars.ease || "none", 10688 lazy: false, 10689 immediateRender: false, 10690 time: endTime, 10691 overwrite: "auto", 10692 duration: vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum, 10693 onStart: function onStart() { 10694 tl.pause(); 10695 10696 if (!initted) { 10697 var duration = vars.duration || Math.abs((endTime - (startAt && "time" in startAt ? startAt.time : tl._time)) / tl.timeScale()); 10698 tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true); 10699 initted = 1; 10700 } 10701 10702 _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it. 10703 } 10704 }, vars)); 10705 10706 return immediateRender ? tween.render(0) : tween; 10707 }; 10708 10709 _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) { 10710 return this.tweenTo(toPosition, _setDefaults({ 10711 startAt: { 10712 time: _parsePosition(this, fromPosition) 10713 } 10714 }, vars)); 10715 }; 10716 10717 _proto2.recent = function recent() { 10718 return this._recent; 10719 }; 10720 10721 _proto2.nextLabel = function nextLabel(afterTime) { 10722 if (afterTime === void 0) { 10723 afterTime = this._time; 10724 } 10725 10726 return _getLabelInDirection(this, _parsePosition(this, afterTime)); 10727 }; 10728 10729 _proto2.previousLabel = function previousLabel(beforeTime) { 10730 if (beforeTime === void 0) { 10731 beforeTime = this._time; 10732 } 10733 10734 return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1); 10735 }; 10736 10737 _proto2.currentLabel = function currentLabel(value) { 10738 return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum); 10739 }; 10740 10741 _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) { 10742 if (ignoreBeforeTime === void 0) { 10743 ignoreBeforeTime = 0; 10744 } 10745 10746 var child = this._first, 10747 labels = this.labels, 10748 p; 10749 amount = _roundPrecise(amount); 10750 10751 while (child) { 10752 if (child._start >= ignoreBeforeTime) { 10753 child._start += amount; 10754 child._end += amount; 10755 } 10756 10757 child = child._next; 10758 } 10759 10760 if (adjustLabels) { 10761 for (p in labels) { 10762 if (labels[p] >= ignoreBeforeTime) { 10763 labels[p] += amount; 10764 } 10765 } 10766 } 10767 10768 return _uncache(this); 10769 }; 10770 10771 _proto2.invalidate = function invalidate(soft) { 10772 var child = this._first; 10773 this._lock = 0; 10774 10775 while (child) { 10776 child.invalidate(soft); 10777 child = child._next; 10778 } 10779 10780 return _Animation.prototype.invalidate.call(this, soft); 10781 }; 10782 10783 _proto2.clear = function clear(includeLabels) { 10784 if (includeLabels === void 0) { 10785 includeLabels = true; 10786 } 10787 10788 var child = this._first, 10789 next; 10790 10791 while (child) { 10792 next = child._next; 10793 this.remove(child); 10794 child = next; 10795 } 10796 10797 this._dp && (this._time = this._tTime = this._pTime = 0); 10798 includeLabels && (this.labels = {}); 10799 return _uncache(this); 10800 }; 10801 10802 _proto2.totalDuration = function totalDuration(value) { 10803 var max = 0, 10804 self = this, 10805 child = self._last, 10806 prevStart = _bigNum, 10807 prev, 10808 start, 10809 parent; 10810 10811 if (arguments.length) { 10812 return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value)); 10813 } 10814 10815 if (self._dirty) { 10816 parent = self.parent; 10817 10818 while (child) { 10819 prev = child._prev; //record it here in case the tween changes position in the sequence... 10820 10821 child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it. 10822 10823 start = child._start; 10824 10825 if (start > prevStart && self._sort && child._ts && !self._lock) { 10826 //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence 10827 self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add(). 10828 10829 _addToTimeline(self, child, start - child._delay, 1)._lock = 0; 10830 } else { 10831 prevStart = start; 10832 } 10833 10834 if (start < 0 && child._ts) { 10835 //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found. 10836 max -= start; 10837 10838 if (!parent && !self._dp || parent && parent.smoothChildTiming) { 10839 self._start += _roundPrecise(start / self._ts); 10840 self._time -= start; 10841 self._tTime -= start; 10842 } 10843 10844 self.shiftChildren(-start, false, -1e999); 10845 prevStart = 0; 10846 } 10847 10848 child._end > max && child._ts && (max = child._end); 10849 child = prev; 10850 } 10851 10852 _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1); 10853 10854 self._dirty = 0; 10855 } 10856 10857 return self._tDur; 10858 }; 10859 10860 Timeline.updateRoot = function updateRoot(time) { 10861 if (_globalTimeline._ts) { 10862 _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline)); 10863 10864 _lastRenderedFrame = _ticker.frame; 10865 } 10866 10867 if (_ticker.frame >= _nextGCFrame) { 10868 _nextGCFrame += _config.autoSleep || 120; 10869 var child = _globalTimeline._first; 10870 if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) { 10871 while (child && !child._ts) { 10872 child = child._next; 10873 } 10874 10875 child || _ticker.sleep(); 10876 } 10877 } 10878 }; 10879 10880 return Timeline; 10881}(Animation); 10882 10883_setDefaults(Timeline.prototype, { 10884 _lock: 0, 10885 _hasPause: 0, 10886 _forcing: 0 10887}); 10888 10889var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) { 10890 //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 10891 var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter), 10892 index = 0, 10893 matchIndex = 0, 10894 result, 10895 startNums, 10896 color, 10897 endNum, 10898 chunk, 10899 startNum, 10900 hasRandom, 10901 a; 10902 pt.b = start; 10903 pt.e = end; 10904 start += ""; //ensure values are strings 10905 10906 end += ""; 10907 10908 if (hasRandom = ~end.indexOf("random(")) { 10909 end = _replaceRandom(end); 10910 } 10911 10912 if (stringFilter) { 10913 a = [start, end]; 10914 stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. 10915 10916 start = a[0]; 10917 end = a[1]; 10918 } 10919 10920 startNums = start.match(_complexStringNumExp) || []; 10921 10922 while (result = _complexStringNumExp.exec(end)) { 10923 endNum = result[0]; 10924 chunk = end.substring(index, result.index); 10925 10926 if (color) { 10927 color = (color + 1) % 5; 10928 } else if (chunk.substr(-5) === "rgba(") { 10929 color = 1; 10930 } 10931 10932 if (endNum !== startNums[matchIndex++]) { 10933 startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method. 10934 10935 pt._pt = { 10936 _next: pt._pt, 10937 p: chunk || matchIndex === 1 ? chunk : ",", 10938 //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case. 10939 s: startNum, 10940 c: endNum.charAt(1) === "=" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum, 10941 m: color && color < 4 ? Math.round : 0 10942 }; 10943 index = _complexStringNumExp.lastIndex; 10944 } 10945 } 10946 10947 pt.c = index < end.length ? end.substring(index, end.length) : ""; //we use the "c" of the PropTween to store the final part of the string (after the last number) 10948 10949 pt.fp = funcParam; 10950 10951 if (_relExp.test(end) || hasRandom) { 10952 pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value). 10953 } 10954 10955 this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus "this" would refer to the plugin. 10956 10957 return pt; 10958}, 10959 _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) { 10960 _isFunction(end) && (end = end(index || 0, target, targets)); 10961 var currentValue = target[prop], 10962 parsedStart = start !== "get" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf("set") || !_isFunction(target["get" + prop.substr(3)]) ? prop : "get" + prop.substr(3)](funcParam) : target[prop](), 10963 setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc, 10964 pt; 10965 10966 if (_isString(end)) { 10967 if (~end.indexOf("random(")) { 10968 end = _replaceRandom(end); 10969 } 10970 10971 if (end.charAt(1) === "=") { 10972 pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0); 10973 10974 if (pt || pt === 0) { 10975 // to avoid isNaN, like if someone passes in a value like "!= whatever" 10976 end = pt; 10977 } 10978 } 10979 } 10980 10981 if (!optional || parsedStart !== end || _forceAllPropTweens) { 10982 if (!isNaN(parsedStart * end) && end !== "") { 10983 // fun fact: any number multiplied by "" is evaluated as the number 0! 10984 pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === "boolean" ? _renderBoolean : _renderPlain, 0, setter); 10985 funcParam && (pt.fp = funcParam); 10986 modifier && pt.modifier(modifier, this, target); 10987 return this._pt = pt; 10988 } 10989 10990 !currentValue && !(prop in target) && _missingPlugin(prop, end); 10991 return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam); 10992 } 10993}, 10994 //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with "random()" in them. It does NOT process relative values. 10995_processVars = function _processVars(vars, index, target, targets, tween) { 10996 _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets)); 10997 10998 if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) { 10999 return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars; 11000 } 11001 11002 var copy = {}, 11003 p; 11004 11005 for (p in vars) { 11006 copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets); 11007 } 11008 11009 return copy; 11010}, 11011 _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) { 11012 var plugin, pt, ptLookup, i; 11013 11014 if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) { 11015 tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority); 11016 11017 if (tween !== _quickTween) { 11018 ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger. 11019 11020 i = plugin._props.length; 11021 11022 while (i--) { 11023 ptLookup[plugin._props[i]] = pt; 11024 } 11025 } 11026 } 11027 11028 return plugin; 11029}, 11030 _overwritingTween, 11031 //store a reference temporarily so we can avoid overwriting itself. 11032_forceAllPropTweens, 11033 _initTween = function _initTween(tween, time, tTime) { 11034 var vars = tween.vars, 11035 ease = vars.ease, 11036 startAt = vars.startAt, 11037 immediateRender = vars.immediateRender, 11038 lazy = vars.lazy, 11039 onUpdate = vars.onUpdate, 11040 runBackwards = vars.runBackwards, 11041 yoyoEase = vars.yoyoEase, 11042 keyframes = vars.keyframes, 11043 autoRevert = vars.autoRevert, 11044 dur = tween._dur, 11045 prevStartAt = tween._startAt, 11046 targets = tween._targets, 11047 parent = tween.parent, 11048 fullTargets = parent && parent.data === "nested" ? parent.vars.targets : targets, 11049 autoOverwrite = tween._overwrite === "auto" && !_suppressOverwrites, 11050 tl = tween.timeline, 11051 reverseEase = vars.easeReverse || yoyoEase, 11052 cleanVars, 11053 i, 11054 p, 11055 pt, 11056 target, 11057 hasPriority, 11058 gsData, 11059 harness, 11060 plugin, 11061 ptLookup, 11062 index, 11063 harnessVars, 11064 overwritten; 11065 tl && (!keyframes || !ease) && (ease = "none"); 11066 tween._ease = _parseEase(ease, _defaults.ease); 11067 tween._rEase = reverseEase && (_parseEase(reverseEase) || tween._ease); 11068 tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens. 11069 11070 if (tween._from) tween.ratio = 1; 11071 11072 if (!tl || keyframes && !vars.stagger) { 11073 //if there's an internal timeline, skip all the parsing because we passed that task down the chain. 11074 harness = targets[0] ? _getCache(targets[0]).harness : 0; 11075 harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an "x" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example. 11076 11077 cleanVars = _copyExcluding(vars, _reservedProps); 11078 11079 if (prevStartAt) { 11080 prevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet. 11081 11082 time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a "startAt" (not "from()" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin) 11083 // don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for "startAt" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded. 11084 11085 prevStartAt._lazy = 0; 11086 } 11087 11088 if (startAt) { 11089 _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({ 11090 data: "isStart", 11091 overwrite: false, 11092 parent: parent, 11093 immediateRender: true, 11094 lazy: !prevStartAt && _isNotFalse(lazy), 11095 startAt: null, 11096 delay: 0, 11097 onUpdate: onUpdate && function () { 11098 return _callback(tween, "onUpdate"); 11099 }, 11100 stagger: 0 11101 }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from); 11102 11103 11104 tween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set. 11105 11106 tween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween 11107 11108 time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween. 11109 11110 if (immediateRender) { 11111 if (dur && time <= 0 && tTime <= 0) { 11112 // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly. 11113 time && (tween._zTime = time); 11114 return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting. 11115 } 11116 } 11117 } else if (runBackwards && dur) { 11118 // from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards) 11119 if (!prevStartAt) { 11120 time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0 11121 11122 p = _setDefaults({ 11123 overwrite: false, 11124 data: "isFromStart", 11125 //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in. 11126 lazy: immediateRender && !prevStartAt && _isNotFalse(lazy), 11127 immediateRender: immediateRender, 11128 //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after) 11129 stagger: 0, 11130 parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(".class", {y: gsap.utils.wrap([-100,100]), stagger: 0.5}) 11131 11132 }, cleanVars); 11133 harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}}) 11134 11135 _removeFromParent(tween._startAt = Tween.set(targets, p)); 11136 11137 tween._startAt._dp = 0; // don't allow it to get put back into root timeline! 11138 11139 tween._startAt._sat = tween; // used in globalTime() 11140 11141 time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true)); 11142 tween._zTime = time; 11143 11144 if (!immediateRender) { 11145 _initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded 11146 11147 } else if (!time) { 11148 return; 11149 } 11150 } 11151 } 11152 11153 tween._pt = tween._ptCache = 0; 11154 lazy = dur && _isNotFalse(lazy) || lazy && !dur; 11155 11156 for (i = 0; i < targets.length; i++) { 11157 target = targets[i]; 11158 gsData = target._gsap || _harness(targets)[i]._gsap; 11159 tween._ptLookup[i] = ptLookup = {}; 11160 _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end) 11161 11162 index = fullTargets === targets ? i : fullTargets.indexOf(target); 11163 11164 if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) { 11165 tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority); 11166 11167 plugin._props.forEach(function (name) { 11168 ptLookup[name] = pt; 11169 }); 11170 11171 plugin.priority && (hasPriority = 1); 11172 } 11173 11174 if (!harness || harnessVars) { 11175 for (p in cleanVars) { 11176 if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) { 11177 plugin.priority && (hasPriority = 1); 11178 } else { 11179 ptLookup[p] = pt = _addPropTween.call(tween, target, p, "get", cleanVars[p], index, fullTargets, 0, vars.stringFilter); 11180 } 11181 } 11182 } 11183 11184 tween._op && tween._op[i] && tween.kill(target, tween._op[i]); 11185 11186 if (autoOverwrite && tween._pt) { 11187 _overwritingTween = tween; 11188 11189 _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!! 11190 11191 11192 overwritten = !tween.parent; 11193 _overwritingTween = 0; 11194 } 11195 11196 tween._pt && lazy && (_lazyLookup[gsData.id] = 1); 11197 } 11198 11199 hasPriority && _sortPropTweensByPriority(tween); 11200 tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down. 11201 } 11202 11203 tween._onUpdate = onUpdate; 11204 tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick. 11205 11206 keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the "before" state for any staggered/delayed animations thus when the following tween initializes, it'll use the "before" state instead of the "after" state as the initial values. 11207}, 11208 _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) { 11209 var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property], 11210 pt, 11211 rootPT, 11212 lookup, 11213 i; 11214 11215 if (!ptCache) { 11216 ptCache = tween._ptCache[property] = []; 11217 lookup = tween._ptLookup; 11218 i = tween._targets.length; 11219 11220 while (i--) { 11221 pt = lookup[i][property]; 11222 11223 if (pt && pt.d && pt.d._pt) { 11224 // it's a plugin, so find the nested PropTween 11225 pt = pt.d._pt; 11226 11227 while (pt && pt.p !== property && pt.fp !== property) { 11228 // "fp" is functionParam for things like setting CSS variables which require .setProperty("--var-name", value) 11229 pt = pt._next; 11230 } 11231 } 11232 11233 if (!pt) { 11234 // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this 11235 // if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo("x", 200) for example. 11236 _forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it. 11237 11238 tween.vars[property] = "+=0"; 11239 11240 _initTween(tween, time); 11241 11242 _forceAllPropTweens = 0; 11243 return skipRecursion ? _warn(property + " not eligible for reset. Try splitting into individual properties") : 1; // if someone tries to do a quickTo() on a special property like borderRadius which must get split into 4 different properties, that's not eligible for .resetTo(). 11244 } 11245 11246 ptCache.push(pt); 11247 } 11248 } 11249 11250 i = ptCache.length; 11251 11252 while (i--) { 11253 rootPT = ptCache[i]; 11254 pt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value. 11255 11256 pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c; 11257 pt.c = value - pt.s; 11258 rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value) 11259 11260 rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value) 11261 } 11262}, 11263 _addAliasesToVars = function _addAliasesToVars(targets, vars) { 11264 var harness = targets[0] ? _getCache(targets[0]).harness : 0, 11265 propertyAliases = harness && harness.aliases, 11266 copy, 11267 p, 11268 i, 11269 aliases; 11270 11271 if (!propertyAliases) { 11272 return vars; 11273 } 11274 11275 copy = _merge({}, vars); 11276 11277 for (p in propertyAliases) { 11278 if (p in copy) { 11279 aliases = propertyAliases[p].split(","); 11280 i = aliases.length; 11281 11282 while (i--) { 11283 copy[aliases[i]] = copy[p]; 11284 } 11285 } 11286 } 11287 11288 return copy; 11289}, 11290 // parses multiple formats, like {"0%": {x: 100}, {"50%": {x: -20}} and { x: {"0%": 100, "50%": -20} }, and an "ease" can be set on any object. We populate an "allProps" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a "t" (time), "v", (value), and "e" (ease) property. This allows us to piece together a timeline later. 11291_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) { 11292 var ease = obj.ease || easeEach || "power1.inOut", 11293 p, 11294 a; 11295 11296 if (_isArray(obj)) { 11297 a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease 11298 11299 obj.forEach(function (value, i) { 11300 return a.push({ 11301 t: i / (obj.length - 1) * 100, 11302 v: value, 11303 e: ease 11304 }); 11305 }); 11306 } else { 11307 for (p in obj) { 11308 a = allProps[p] || (allProps[p] = []); 11309 p === "ease" || a.push({ 11310 t: parseFloat(prop), 11311 v: obj[p], 11312 e: ease 11313 }); 11314 } 11315 } 11316}, 11317 _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) { 11318 return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf("random(") ? _replaceRandom(value) : value; 11319}, 11320 _staggerTweenProps = _callbackNames + "repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,easeReverse,autoRevert", 11321 _staggerPropsToSkip = {}; 11322 11323_forEachName(_staggerTweenProps + ",id,stagger,delay,duration,paused,scrollTrigger", function (name) { 11324 return _staggerPropsToSkip[name] = 1; 11325}); 11326/* 11327 * -------------------------------------------------------------------------------------- 11328 * TWEEN 11329 * -------------------------------------------------------------------------------------- 11330 */ 11331 11332 11333var Tween = /*#__PURE__*/function (_Animation2) { 11334 _inheritsLoose(Tween, _Animation2); 11335 11336 function Tween(targets, vars, position, skipInherit) { 11337 var _this3; 11338 11339 if (typeof vars === "number") { 11340 position.duration = vars; 11341 vars = position; 11342 position = null; 11343 } 11344 11345 _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this; 11346 var _this3$vars = _this3.vars, 11347 duration = _this3$vars.duration, 11348 delay = _this3$vars.delay, 11349 immediateRender = _this3$vars.immediateRender, 11350 stagger = _this3$vars.stagger, 11351 overwrite = _this3$vars.overwrite, 11352 keyframes = _this3$vars.keyframes, 11353 defaults = _this3$vars.defaults, 11354 scrollTrigger = _this3$vars.scrollTrigger, 11355 parent = vars.parent || _globalTimeline, 11356 parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : "length" in vars) ? [targets] : toArray(targets), 11357 tl, 11358 i, 11359 copy, 11360 l, 11361 p, 11362 curTarget, 11363 staggerFunc, 11364 staggerVarsToMerge; 11365 _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn("GSAP target " + targets + " not found. https://gsap.com", !_config.nullTargetWarn) || []; 11366 _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property 11367 11368 _this3._overwrite = overwrite; 11369 11370 if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) { 11371 vars = _this3.vars; 11372 var easeReverse = vars.easeReverse || vars.yoyoEase; 11373 tl = _this3.timeline = new Timeline({ 11374 data: "nested", 11375 defaults: defaults || {}, 11376 targets: parent && parent.data === "nested" ? parent.vars.targets : parsedTargets 11377 }); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets. 11378 11379 tl.kill(); 11380 tl.parent = tl._dp = _assertThisInitialized(_this3); 11381 tl._start = 0; 11382 11383 if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) { 11384 l = parsedTargets.length; 11385 staggerFunc = stagger && distribute(stagger); 11386 11387 if (_isObject(stagger)) { 11388 //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween. 11389 for (p in stagger) { 11390 if (~_staggerTweenProps.indexOf(p)) { 11391 staggerVarsToMerge || (staggerVarsToMerge = {}); 11392 staggerVarsToMerge[p] = stagger[p]; 11393 } 11394 } 11395 } 11396 11397 for (i = 0; i < l; i++) { 11398 copy = _copyExcluding(vars, _staggerPropsToSkip); 11399 copy.stagger = 0; 11400 easeReverse && (copy.easeReverse = easeReverse); 11401 staggerVarsToMerge && _merge(copy, staggerVarsToMerge); 11402 curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0. 11403 11404 copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets); 11405 copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay; 11406 11407 if (!stagger && l === 1 && copy.delay) { 11408 // if someone does delay:"random(1, 5)", repeat:-1, for example, the delay shouldn't be inside the repeat. 11409 _this3._delay = delay = copy.delay; 11410 _this3._start += delay; 11411 copy.delay = 0; 11412 } 11413 11414 tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0); 11415 tl._ease = _easeMap.none; 11416 } 11417 11418 tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally! 11419 } else if (keyframes) { 11420 _inheritDefaults(_setDefaults(tl.vars.defaults, { 11421 ease: "none" 11422 })); 11423 11424 tl._ease = _parseEase(keyframes.ease || vars.ease || "none"); 11425 var time = 0, 11426 a, 11427 kf, 11428 v; 11429 11430 if (_isArray(keyframes)) { 11431 keyframes.forEach(function (frame) { 11432 return tl.to(parsedTargets, frame, ">"); 11433 }); 11434 tl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method. 11435 } else { 11436 copy = {}; 11437 11438 for (p in keyframes) { 11439 p === "ease" || p === "easeEach" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach); 11440 } 11441 11442 for (p in copy) { 11443 a = copy[p].sort(function (a, b) { 11444 return a.t - b.t; 11445 }); 11446 time = 0; 11447 11448 for (i = 0; i < a.length; i++) { 11449 kf = a[i]; 11450 v = { 11451 ease: kf.e, 11452 duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration 11453 }; 11454 v[p] = kf.v; 11455 tl.to(parsedTargets, v, time); 11456 time += v.duration; 11457 } 11458 } 11459 11460 tl.duration() < duration && tl.to({}, { 11461 duration: duration - tl.duration() 11462 }); // in case keyframes didn't go to 100% 11463 } 11464 } 11465 11466 duration || _this3.duration(duration = tl.duration()); 11467 } else { 11468 _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain) 11469 } 11470 11471 if (overwrite === true && !_suppressOverwrites) { 11472 _overwritingTween = _assertThisInitialized(_this3); 11473 11474 _globalTimeline.killTweensOf(parsedTargets); 11475 11476 _overwritingTween = 0; 11477 } 11478 11479 _addToTimeline(parent, _assertThisInitialized(_this3), position); 11480 11481 vars.reversed && _this3.reverse(); 11482 vars.paused && _this3.paused(true); 11483 11484 if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== "nested") { 11485 _this3._tTime = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render) 11486 11487 _this3.render(Math.max(0, -delay) || 0); //in case delay is negative 11488 11489 } 11490 11491 scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger); 11492 return _this3; 11493 } 11494 11495 var _proto3 = Tween.prototype; 11496 11497 _proto3.render = function render(totalTime, suppressEvents, force) { 11498 var prevTime = this._time, 11499 tDur = this._tDur, 11500 dur = this._dur, 11501 isNegative = totalTime < 0, 11502 tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime, 11503 time, 11504 pt, 11505 iteration, 11506 cycleDuration, 11507 prevIteration, 11508 isYoyo, 11509 ratio, 11510 timeline; 11511 11512 if (!dur) { 11513 _renderZeroDurationTween(this, totalTime, suppressEvents, force); 11514 } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) { 11515 // this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0) 11516 time = tTime; 11517 timeline = this.timeline; 11518 11519 if (this._repeat) { 11520 //adjust the time for repeats and yoyos 11521 cycleDuration = dur + this._rDelay; 11522 11523 if (this._repeat < -1 && isNegative) { 11524 return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force); 11525 } 11526 11527 time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!) 11528 11529 if (tTime === tDur) { 11530 // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't) 11531 iteration = this._repeat; 11532 time = dur; 11533 } else { 11534 prevIteration = _roundPrecise(tTime / cycleDuration); // full decimal version of iterations, not the previous iteration (we're reusing prevIteration variable for efficiency) 11535 11536 iteration = ~~prevIteration; 11537 11538 if (iteration && iteration === prevIteration) { 11539 time = dur; 11540 iteration--; 11541 } else if (time > dur) { 11542 time = dur; 11543 } 11544 } 11545 11546 isYoyo = this._yoyo && iteration & 1; 11547 if (isYoyo) time = dur - time; 11548 prevIteration = _animationCycle(this._tTime, cycleDuration); 11549 11550 if (time === prevTime && !force && this._initted && iteration === prevIteration) { 11551 //could be during the repeatDelay part. No need to render and fire callbacks. 11552 this._tTime = tTime; 11553 return this; 11554 } 11555 11556 if (iteration !== prevIteration) { 11557 //repeatRefresh functionality 11558 if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) { 11559 // this._time will === cycleDuration when we render at EXACTLY the end of an iteration. Without this condition, it'd often do the repeatRefresh render TWICE (again on the very next tick). 11560 this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick. 11561 11562 this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0; 11563 } 11564 } 11565 } 11566 11567 if (!this._initted) { 11568 if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) { 11569 this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number. 11570 11571 return this; 11572 } 11573 11574 if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) { 11575 // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values. But we also don't want to dump if we're doing a repeatRefresh render! 11576 return this; 11577 } 11578 11579 if (dur !== this._dur) { 11580 // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should. 11581 return this.render(totalTime, suppressEvents, force); 11582 } 11583 } 11584 11585 if (this._rEase) { 11586 var inv = time < prevTime; 11587 11588 if (inv !== this._inv) { 11589 var segDur = inv ? prevTime : dur - prevTime; 11590 this._inv = inv; 11591 if (this._from) this.ratio = 1 - this.ratio; 11592 this._invRatio = this.ratio; 11593 this._invTime = prevTime; 11594 this._invRecip = segDur ? (inv ? -1 : 1) / segDur : 0; 11595 this._invScale = inv ? -this.ratio : 1 - this.ratio; 11596 this._invEase = inv ? this._rEase : this._ease; 11597 } 11598 11599 this.ratio = ratio = this._invRatio + this._invScale * this._invEase((time - this._invTime) * this._invRecip); 11600 } else { 11601 this.ratio = ratio = this._ease(time / dur); 11602 } 11603 11604 if (this._from) this.ratio = ratio = 1 - ratio; 11605 this._tTime = tTime; 11606 this._time = time; 11607 11608 if (!this._act && this._ts) { 11609 this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick. 11610 11611 this._lazy = 0; 11612 } 11613 11614 if (!prevTime && tTime && !suppressEvents && !prevIteration) { 11615 _callback(this, "onStart"); 11616 11617 if (this._tTime !== tTime) { 11618 // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart. 11619 return this; 11620 } 11621 } 11622 11623 pt = this._pt; 11624 11625 while (pt) { 11626 pt.r(ratio, pt.d); 11627 pt = pt._next; 11628 } 11629 11630 timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime); 11631 11632 if (this._onUpdate && !suppressEvents) { 11633 isNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete. 11634 11635 _callback(this, "onUpdate"); 11636 } 11637 11638 this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, "onRepeat"); 11639 11640 if ((tTime === this._tDur || !tTime) && this._tTime === tTime) { 11641 isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true); 11642 (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative. 11643 11644 if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) { 11645 // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play(); 11646 _callback(this, tTime === tDur ? "onComplete" : "onReverseComplete", true); 11647 11648 this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom(); 11649 } 11650 } 11651 } 11652 11653 return this; 11654 }; 11655 11656 _proto3.targets = function targets() { 11657 return this._targets; 11658 }; 11659 11660 _proto3.invalidate = function invalidate(soft) { 11661 // "soft" gives us a way to clear out everything EXCEPT the recorded pre-"from" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the "from" values would persist and then on the next render, the from() tweens would initialize and the current value would match the "from" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page. 11662 (!soft || !this.vars.runBackwards) && (this._startAt = 0); 11663 this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0; 11664 this._ptLookup = []; 11665 this.timeline && this.timeline.invalidate(soft); 11666 return _Animation2.prototype.invalidate.call(this, soft); 11667 }; 11668 11669 _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) { 11670 _tickerActive || _ticker.wake(); 11671 this._ts || this.play(); 11672 var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts), 11673 ratio; 11674 this._initted || _initTween(this, time); 11675 ratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet. 11676 // possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method. 11677 // if (_isObject(property)) { // performance optimization 11678 // for (p in property) { 11679 // if (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) { 11680 // return this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again. 11681 // } 11682 // } 11683 // } else { 11684 11685 if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) { 11686 return this.resetTo(property, value, start, startIsRelative, 1); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again. 11687 } //} 11688 11689 11690 _alignPlayhead(this, 0); 11691 11692 this.parent || _addLinkedListItem(this._dp, this, "_first", "_last", this._dp._sort ? "_start" : 0); 11693 return this.render(0); 11694 }; 11695 11696 _proto3.kill = function kill(targets, vars) { 11697 if (vars === void 0) { 11698 vars = "all"; 11699 } 11700 11701 if (!targets && (!vars || vars === "all")) { 11702 this._lazy = this._pt = 0; 11703 this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting); 11704 return this; 11705 } 11706 11707 if (this.timeline) { 11708 var tDur = this.timeline.totalDuration(); 11709 this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt. 11710 11711 this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to. 11712 11713 return this; 11714 } 11715 11716 var parsedTargets = this._targets, 11717 killingTargets = targets ? toArray(targets) : parsedTargets, 11718 propTweenLookup = this._ptLookup, 11719 firstPT = this._pt, 11720 overwrittenProps, 11721 curLookup, 11722 curOverwriteProps, 11723 props, 11724 p, 11725 pt, 11726 i; 11727 11728 if ((!vars || vars === "all") && _arraysMatch(parsedTargets, killingTargets)) { 11729 vars === "all" && (this._pt = 0); 11730 return _interrupt(this); 11731 } 11732 11733 overwrittenProps = this._op = this._op || []; 11734 11735 if (vars !== "all") { 11736 //so people can pass in a comma-delimited list of property names 11737 if (_isString(vars)) { 11738 p = {}; 11739 11740 _forEachName(vars, function (name) { 11741 return p[name] = 1; 11742 }); 11743 11744 vars = p; 11745 } 11746 11747 vars = _addAliasesToVars(parsedTargets, vars); 11748 } 11749 11750 i = parsedTargets.length; 11751 11752 while (i--) { 11753 if (~killingTargets.indexOf(parsedTargets[i])) { 11754 curLookup = propTweenLookup[i]; 11755 11756 if (vars === "all") { 11757 overwrittenProps[i] = vars; 11758 props = curLookup; 11759 curOverwriteProps = {}; 11760 } else { 11761 curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {}; 11762 props = vars; 11763 } 11764 11765 for (p in props) { 11766 pt = curLookup && curLookup[p]; 11767 11768 if (pt) { 11769 if (!("kill" in pt.d) || pt.d.kill(p) === true) { 11770 _removeLinkedListItem(this, pt, "_pt"); 11771 } 11772 11773 delete curLookup[p]; 11774 } 11775 11776 if (curOverwriteProps !== "all") { 11777 curOverwriteProps[p] = 1; 11778 } 11779 } 11780 } 11781 } 11782 11783 this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening. 11784 11785 return this; 11786 }; 11787 11788 Tween.to = function to(targets, vars) { 11789 return new Tween(targets, vars, arguments[2]); 11790 }; 11791 11792 Tween.from = function from(targets, vars) { 11793 return _createTweenType(1, arguments); 11794 }; 11795 11796 Tween.delayedCall = function delayedCall(delay, callback, params, scope) { 11797 return new Tween(callback, 0, { 11798 immediateRender: false, 11799 lazy: false, 11800 overwrite: false, 11801 delay: delay, 11802 onComplete: callback, 11803 onReverseComplete: callback, 11804 onCompleteParams: params, 11805 onReverseCompleteParams: params, 11806 callbackScope: scope 11807 }); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse) 11808 }; 11809 11810 Tween.fromTo = function fromTo(targets, fromVars, toVars) { 11811 return _createTweenType(2, arguments); 11812 }; 11813 11814 Tween.set = function set(targets, vars) { 11815 vars.duration = 0; 11816 vars.repeatDelay || (vars.repeat = 0); 11817 return new Tween(targets, vars); 11818 }; 11819 11820 Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) { 11821 return _globalTimeline.killTweensOf(targets, props, onlyActive); 11822 }; 11823 11824 return Tween; 11825}(Animation); 11826 11827_setDefaults(Tween.prototype, { 11828 _targets: [], 11829 _lazy: 0, 11830 _startAt: 0, 11831 _op: 0, 11832 _onInit: 0 11833}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners) 11834// _forEachName("to,from,fromTo,set,call,add,addLabel,addPause", name => { 11835// Tween.prototype[name] = function() { 11836// let tl = new Timeline(); 11837// return _addToTimeline(tl, this)[name].apply(tl, toArray(arguments)); 11838// } 11839// }); 11840//for backward compatibility. Leverage the timeline calls. 11841 11842 11843_forEachName("staggerTo,staggerFrom,staggerFromTo", function (name) { 11844 Tween[name] = function () { 11845 var tl = new Timeline(), 11846 params = _slice.call(arguments, 0); 11847 11848 params.splice(name === "staggerFromTo" ? 5 : 4, 0, 0); 11849 return tl[name].apply(tl, params); 11850 }; 11851}); 11852/* 11853 * -------------------------------------------------------------------------------------- 11854 * PROPTWEEN 11855 * -------------------------------------------------------------------------------------- 11856 */ 11857 11858 11859var _setterPlain = function _setterPlain(target, property, value) { 11860 return target[property] = value; 11861}, 11862 _setterFunc = function _setterFunc(target, property, value) { 11863 return target[property](value); 11864}, 11865 _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) { 11866 return target[property](data.fp, value); 11867}, 11868 _setterAttribute = function _setterAttribute(target, property, value) { 11869 return target.setAttribute(property, value); 11870}, 11871 _getSetter = function _getSetter(target, property) { 11872 return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain; 11873}, 11874 _renderPlain = function _renderPlain(ratio, data) { 11875 return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data); 11876}, 11877 _renderBoolean = function _renderBoolean(ratio, data) { 11878 return data.set(data.t, data.p, !!(data.s + data.c * ratio), data); 11879}, 11880 _renderComplexString = function _renderComplexString(ratio, data) { 11881 var pt = data._pt, 11882 s = ""; 11883 11884 if (!ratio && data.b) { 11885 //b = beginning string 11886 s = data.b; 11887 } else if (ratio === 1 && data.e) { 11888 //e = ending string 11889 s = data.e; 11890 } else { 11891 while (pt) { 11892 s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the "p" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors. 11893 11894 pt = pt._next; 11895 } 11896 11897 s += data.c; //we use the "c" of the PropTween to store the final chunk of non-numeric text. 11898 } 11899 11900 data.set(data.t, data.p, s, data); 11901}, 11902 _renderPropTweens = function _renderPropTweens(ratio, data) { 11903 var pt = data._pt; 11904 11905 while (pt) { 11906 pt.r(ratio, pt.d); 11907 pt = pt._next; 11908 } 11909}, 11910 _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) { 11911 var pt = this._pt, 11912 next; 11913 11914 while (pt) { 11915 next = pt._next; 11916 pt.p === property && pt.modifier(modifier, tween, target); 11917 pt = next; 11918 } 11919}, 11920 _killPropTweensOf = function _killPropTweensOf(property) { 11921 var pt = this._pt, 11922 hasNonDependentRemaining, 11923 next; 11924 11925 while (pt) { 11926 next = pt._next; 11927 11928 if (pt.p === property && !pt.op || pt.op === property) { 11929 _removeLinkedListItem(this, pt, "_pt"); 11930 } else if (!pt.dep) { 11931 hasNonDependentRemaining = 1; 11932 } 11933 11934 pt = next; 11935 } 11936 11937 return !hasNonDependentRemaining; 11938}, 11939 _setterWithModifier = function _setterWithModifier(target, property, value, data) { 11940 data.mSet(target, property, data.m.call(data.tween, value, data.mt), data); 11941}, 11942 _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) { 11943 var pt = parent._pt, 11944 next, 11945 pt2, 11946 first, 11947 last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin) 11948 11949 while (pt) { 11950 next = pt._next; 11951 pt2 = first; 11952 11953 while (pt2 && pt2.pr > pt.pr) { 11954 pt2 = pt2._next; 11955 } 11956 11957 if (pt._prev = pt2 ? pt2._prev : last) { 11958 pt._prev._next = pt; 11959 } else { 11960 first = pt; 11961 } 11962 11963 if (pt._next = pt2) { 11964 pt2._prev = pt; 11965 } else { 11966 last = pt; 11967 } 11968 11969 pt = next; 11970 } 11971 11972 parent._pt = first; 11973}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added) 11974 11975 11976var PropTween = /*#__PURE__*/function () { 11977 function PropTween(next, target, prop, start, change, renderer, data, setter, priority) { 11978 this.t = target; 11979 this.s = start; 11980 this.c = change; 11981 this.p = prop; 11982 this.r = renderer || _renderPlain; 11983 this.d = data || this; 11984 this.set = setter || _setterPlain; 11985 this.pr = priority || 0; 11986 this._next = next; 11987 11988 if (next) { 11989 next._prev = this; 11990 } 11991 } 11992 11993 var _proto4 = PropTween.prototype; 11994 11995 _proto4.modifier = function modifier(func, tween, target) { 11996 this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier) 11997 11998 this.set = _setterWithModifier; 11999 this.m = func; 12000 this.mt = target; //modifier target 12001 12002 this.tween = tween; 12003 }; 12004 12005 return PropTween; 12006}(); //Initialization tasks 12007 12008_forEachName(_callbackNames + "parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger,easeReverse", function (name) { 12009 return _reservedProps[name] = 1; 12010}); 12011 12012_globals.TweenMax = _globals.TweenLite = Tween; 12013_globals.TimelineLite = _globals.TimelineMax = Timeline; 12014_globalTimeline = new Timeline({ 12015 sortChildren: false, 12016 defaults: _defaults, 12017 autoRemoveChildren: true, 12018 id: "root", 12019 smoothChildTiming: true 12020}); 12021_config.stringFilter = _colorStringFilter; 12022 12023var _media = [], 12024 _listeners = {}, 12025 _emptyArray = [], 12026 _lastMediaTime = 0, 12027 _contextID = 0, 12028 _dispatch = function _dispatch(type) { 12029 return (_listeners[type] || _emptyArray).map(function (f) { 12030 return f(); 12031 }); 12032}, 12033 _onMediaChange = function _onMediaChange() { 12034 var time = Date.now(), 12035 matches = []; 12036 12037 if (time - _lastMediaTime > 2) { 12038 _dispatch("matchMediaInit"); 12039 12040 _media.forEach(function (c) { 12041 var queries = c.queries, 12042 conditions = c.conditions, 12043 match, 12044 p, 12045 anyMatch, 12046 toggled; 12047 12048 for (p in queries) { 12049 match = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the "matches" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate. 12050 12051 match && (anyMatch = 1); 12052 12053 if (match !== conditions[p]) { 12054 conditions[p] = match; 12055 toggled = 1; 12056 } 12057 } 12058 12059 if (toggled) { 12060 c.revert(); 12061 anyMatch && matches.push(c); 12062 } 12063 }); 12064 12065 _dispatch("matchMediaRevert"); 12066 12067 matches.forEach(function (c) { 12068 return c.onMatch(c, function (func) { 12069 return c.add(null, func); 12070 }); 12071 }); 12072 _lastMediaTime = time; 12073 12074 _dispatch("matchMedia"); 12075 } 12076}; 12077 12078var Context = /*#__PURE__*/function () { 12079 function Context(func, scope) { 12080 this.selector = scope && selector(scope); 12081 this.data = []; 12082 this._r = []; // returned/cleanup functions 12083 12084 this.isReverted = false; 12085 this.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because "this" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely 12086 12087 func && this.add(func); 12088 } 12089 12090 var _proto5 = Context.prototype; 12091 12092 _proto5.add = function add(name, func, scope) { 12093 // possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function. 12094 // if (name && _isFunction(name.revert)) { 12095 // this.data.push(name); 12096 // return (name._ctx = this); 12097 // } 12098 if (_isFunction(name)) { 12099 scope = func; 12100 func = name; 12101 name = _isFunction; 12102 } 12103 12104 var self = this, 12105 f = function f() { 12106 var prev = _context, 12107 prevSelector = self.selector, 12108 result; 12109 prev && prev !== self && prev.data.push(self); 12110 scope && (self.selector = selector(scope)); 12111 _context = self; 12112 result = func.apply(self, arguments); 12113 _isFunction(result) && self._r.push(result); 12114 _context = prev; 12115 self.selector = prevSelector; 12116 self.isReverted = false; 12117 return result; 12118 }; 12119 12120 self.last = f; 12121 return name === _isFunction ? f(self, function (func) { 12122 return self.add(null, func); 12123 }) : name ? self[name] = f : f; 12124 }; 12125 12126 _proto5.ignore = function ignore(func) { 12127 var prev = _context; 12128 _context = null; 12129 func(this); 12130 _context = prev; 12131 }; 12132 12133 _proto5.getTweens = function getTweens() { 12134 var a = []; 12135 this.data.forEach(function (e) { 12136 return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === "nested") && a.push(e); 12137 }); 12138 return a; 12139 }; 12140 12141 _proto5.clear = function clear() { 12142 this._r.length = this.data.length = 0; 12143 }; 12144 12145 _proto5.kill = function kill(revert, matchMedia) { 12146 var _this4 = this; 12147 12148 if (revert) { 12149 (function () { 12150 var tweens = _this4.getTweens(), 12151 i = _this4.data.length, 12152 t; 12153 12154 while (i--) { 12155 // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted. 12156 t = _this4.data[i]; 12157 12158 if (t.data === "isFlip") { 12159 t.revert(); 12160 t.getChildren(true, true, false).forEach(function (tween) { 12161 return tweens.splice(tweens.indexOf(tween), 1); 12162 }); 12163 } 12164 } // save as an object so that we can cache the globalTime for each tween to optimize performance during the sort 12165 12166 12167 tweens.map(function (t) { 12168 return { 12169 g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity, 12170 t: t 12171 }; 12172 }).sort(function (a, b) { 12173 return b.g - a.g || -Infinity; 12174 }).forEach(function (o) { 12175 return o.t.revert(revert); 12176 }); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the " || -1" in the sort keeps the order properly. 12177 12178 i = _this4.data.length; 12179 12180 while (i--) { 12181 // make sure we loop backwards so that, for example, SplitTexts that were created later on the same element get reverted first 12182 t = _this4.data[i]; 12183 12184 if (t instanceof Timeline) { 12185 if (t.data !== "nested") { 12186 t.scrollTrigger && t.scrollTrigger.revert(); 12187 t.kill(); // don't revert() the timeline because that's duplicating efforts since we already reverted all the tweens 12188 } 12189 } else { 12190 !(t instanceof Tween) && t.revert && t.revert(revert); 12191 } 12192 } 12193 12194 _this4._r.forEach(function (f) { 12195 return f(revert, _this4); 12196 }); 12197 12198 _this4.isReverted = true; 12199 })(); 12200 } else { 12201 this.data.forEach(function (e) { 12202 return e.kill && e.kill(); 12203 }); 12204 } 12205 12206 this.clear(); 12207 12208 if (matchMedia) { 12209 var i = _media.length; 12210 12211 while (i--) { 12212 // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead. 12213 _media[i].id === this.id && _media.splice(i, 1); 12214 } 12215 } 12216 } // killWithCleanup() { 12217 // this.kill(); 12218 // this._r.forEach(f => f(false, this)); 12219 // } 12220 ; 12221 12222 _proto5.revert = function revert(config) { 12223 this.kill(config || {}); 12224 }; 12225 12226 return Context; 12227}(); 12228 12229var MatchMedia = /*#__PURE__*/function () { 12230 function MatchMedia(scope) { 12231 this.contexts = []; 12232 this.scope = scope; 12233 _context && _context.data.push(this); 12234 } 12235 12236 var _proto6 = MatchMedia.prototype; 12237 12238 _proto6.add = function add(conditions, func, scope) { 12239 _isObject(conditions) || (conditions = { 12240 matches: conditions 12241 }); 12242 var context = new Context(0, scope || this.scope), 12243 cond = context.conditions = {}, 12244 mq, 12245 p, 12246 active; 12247 _context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context() 12248 12249 this.contexts.push(context); 12250 func = context.add("onMatch", func); 12251 context.queries = conditions; 12252 12253 for (p in conditions) { 12254 if (p === "all") { 12255 active = 1; 12256 } else { 12257 mq = _win.matchMedia(conditions[p]); 12258 12259 if (mq) { 12260 _media.indexOf(context) < 0 && _media.push(context); 12261 (cond[p] = mq.matches) && (active = 1); 12262 mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener("change", _onMediaChange); 12263 } 12264 } 12265 } 12266 12267 active && func(context, function (f) { 12268 return context.add(null, f); 12269 }); 12270 return this; 12271 } // refresh() { 12272 // let time = _lastMediaTime, 12273 // media = _media; 12274 // _lastMediaTime = -1; 12275 // _media = this.contexts; 12276 // _onMediaChange(); 12277 // _lastMediaTime = time; 12278 // _media = media; 12279 // } 12280 ; 12281 12282 _proto6.revert = function revert(config) { 12283 this.kill(config || {}); 12284 }; 12285 12286 _proto6.kill = function kill(revert) { 12287 this.contexts.forEach(function (c) { 12288 return c.kill(revert, true); 12289 }); 12290 }; 12291 12292 return MatchMedia; 12293}(); 12294/* 12295 * -------------------------------------------------------------------------------------- 12296 * GSAP 12297 * -------------------------------------------------------------------------------------- 12298 */ 12299 12300 12301var _gsap = { 12302 registerPlugin: function registerPlugin() { 12303 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 12304 args[_key2] = arguments[_key2]; 12305 } 12306 12307 args.forEach(function (config) { 12308 return _createPlugin(config); 12309 }); 12310 }, 12311 timeline: function timeline(vars) { 12312 return new Timeline(vars); 12313 }, 12314 getTweensOf: function getTweensOf(targets, onlyActive) { 12315 return _globalTimeline.getTweensOf(targets, onlyActive); 12316 }, 12317 getProperty: function getProperty(target, property, unit, uncache) { 12318 _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in 12319 12320 var getter = _getCache(target || {}).get, 12321 format = unit ? _passThrough : _numericIfPossible; 12322 12323 unit === "native" && (unit = ""); 12324 return !target ? target : !property ? function (property, unit, uncache) { 12325 return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 12326 } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache)); 12327 }, 12328 quickSetter: function quickSetter(target, property, unit) { 12329 target = toArray(target); 12330 12331 if (target.length > 1) { 12332 var setters = target.map(function (t) { 12333 return gsap.quickSetter(t, property, unit); 12334 }), 12335 l = setters.length; 12336 return function (value) { 12337 var i = l; 12338 12339 while (i--) { 12340 setters[i](value); 12341 } 12342 }; 12343 } 12344 12345 target = target[0] || {}; 12346 12347 var Plugin = _plugins[property], 12348 cache = _getCache(target), 12349 p = cache.harness && (cache.harness.aliases || {})[property] || property, 12350 // in case it's an alias, like "rotate" for "rotation". 12351 setter = Plugin ? function (value) { 12352 var p = new Plugin(); 12353 _quickTween._pt = 0; 12354 p.init(target, unit ? value + unit : value, _quickTween, 0, [target]); 12355 p.render(1, p); 12356 _quickTween._pt && _renderPropTweens(1, _quickTween); 12357 } : cache.set(target, p); 12358 12359 return Plugin ? setter : function (value) { 12360 return setter(target, p, unit ? value + unit : value, cache, 1); 12361 }; 12362 }, 12363 quickTo: function quickTo(target, property, vars) { 12364 var _setDefaults2; 12365 12366 var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = "+=0.1", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})), 12367 func = function func(value, start, startIsRelative) { 12368 return tween.resetTo(property, value, start, startIsRelative); 12369 }; 12370 12371 func.tween = tween; 12372 return func; 12373 }, 12374 isTweening: function isTweening(targets) { 12375 return _globalTimeline.getTweensOf(targets, true).length > 0; 12376 }, 12377 defaults: function defaults(value) { 12378 value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease)); 12379 return _mergeDeep(_defaults, value || {}); 12380 }, 12381 config: function config(value) { 12382 return _mergeDeep(_config, value || {}); 12383 }, 12384 registerEffect: function registerEffect(_ref3) { 12385 var name = _ref3.name, 12386 effect = _ref3.effect, 12387 plugins = _ref3.plugins, 12388 defaults = _ref3.defaults, 12389 extendTimeline = _ref3.extendTimeline; 12390 (plugins || "").split(",").forEach(function (pluginName) { 12391 return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + " effect requires " + pluginName + " plugin."); 12392 }); 12393 12394 _effects[name] = function (targets, vars, tl) { 12395 return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl); 12396 }; 12397 12398 if (extendTimeline) { 12399 Timeline.prototype[name] = function (targets, vars, position) { 12400 return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position); 12401 }; 12402 } 12403 }, 12404 registerEase: function registerEase(name, ease) { 12405 _easeMap[name] = _parseEase(ease); 12406 }, 12407 parseEase: function parseEase(ease, defaultEase) { 12408 return arguments.length ? _parseEase(ease, defaultEase) : _easeMap; 12409 }, 12410 getById: function getById(id) { 12411 return _globalTimeline.getById(id); 12412 }, 12413 exportRoot: function exportRoot(vars, includeDelayedCalls) { 12414 if (vars === void 0) { 12415 vars = {}; 12416 } 12417 12418 var tl = new Timeline(vars), 12419 child, 12420 next; 12421 tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming); 12422 12423 _globalTimeline.remove(tl); 12424 12425 tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself). 12426 12427 tl._time = tl._tTime = _globalTimeline._time; 12428 child = _globalTimeline._first; 12429 12430 while (child) { 12431 next = child._next; 12432 12433 if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) { 12434 _addToTimeline(tl, child, child._start - child._delay); 12435 } 12436 12437 child = next; 12438 } 12439 12440 _addToTimeline(_globalTimeline, tl, 0); 12441 12442 return tl; 12443 }, 12444 context: function context(func, scope) { 12445 return func ? new Context(func, scope) : _context; 12446 }, 12447 matchMedia: function matchMedia(scope) { 12448 return new MatchMedia(scope); 12449 }, 12450 matchMediaRefresh: function matchMediaRefresh() { 12451 return _media.forEach(function (c) { 12452 var cond = c.conditions, 12453 found, 12454 p; 12455 12456 for (p in cond) { 12457 if (cond[p]) { 12458 cond[p] = false; 12459 found = 1; 12460 } 12461 } 12462 12463 found && c.revert(); 12464 }) || _onMediaChange(); 12465 }, 12466 addEventListener: function addEventListener(type, callback) { 12467 var a = _listeners[type] || (_listeners[type] = []); 12468 ~a.indexOf(callback) || a.push(callback); 12469 }, 12470 removeEventListener: function removeEventListener(type, callback) { 12471 var a = _listeners[type], 12472 i = a && a.indexOf(callback); 12473 i >= 0 && a.splice(i, 1); 12474 }, 12475 utils: { 12476 wrap: wrap, 12477 wrapYoyo: wrapYoyo, 12478 distribute: distribute, 12479 random: random, 12480 snap: snap, 12481 normalize: normalize, 12482 getUnit: getUnit, 12483 clamp: clamp, 12484 splitColor: splitColor, 12485 toArray: toArray, 12486 selector: selector, 12487 mapRange: mapRange, 12488 pipe: pipe, 12489 unitize: unitize, 12490 interpolate: interpolate, 12491 shuffle: shuffle 12492 }, 12493 install: _install, 12494 effects: _effects, 12495 ticker: _ticker, 12496 updateRoot: Timeline.updateRoot, 12497 plugins: _plugins, 12498 globalTimeline: _globalTimeline, 12499 core: { 12500 PropTween: PropTween, 12501 globals: _addGlobal, 12502 Tween: Tween, 12503 Timeline: Timeline, 12504 Animation: Animation, 12505 getCache: _getCache, 12506 _removeLinkedListItem: _removeLinkedListItem, 12507 reverting: function reverting() { 12508 return _reverting; 12509 }, 12510 context: function context(toAdd) { 12511 if (toAdd && _context) { 12512 _context.data.push(toAdd); 12513 12514 toAdd._ctx = _context; 12515 } 12516 12517 return _context; 12518 }, 12519 suppressOverwrites: function suppressOverwrites(value) { 12520 return _suppressOverwrites = value; 12521 } 12522 } 12523}; 12524 12525_forEachName("to,from,fromTo,delayedCall,set,killTweensOf", function (name) { 12526 return _gsap[name] = Tween[name]; 12527}); 12528 12529_ticker.add(Timeline.updateRoot); 12530 12531_quickTween = _gsap.to({}, { 12532 duration: 0 12533}); // ---- EXTRA PLUGINS -------------------------------------------------------- 12534 12535var _getPluginPropTween = function _getPluginPropTween(plugin, prop) { 12536 var pt = plugin._pt; 12537 12538 while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) { 12539 pt = pt._next; 12540 } 12541 12542 return pt; 12543}, 12544 _addModifiers = function _addModifiers(tween, modifiers) { 12545 var targets = tween._targets, 12546 p, 12547 i, 12548 pt; 12549 12550 for (p in modifiers) { 12551 i = targets.length; 12552 12553 while (i--) { 12554 pt = tween._ptLookup[i][p]; 12555 12556 if (pt && (pt = pt.d)) { 12557 if (pt._pt) { 12558 // is a plugin 12559 pt = _getPluginPropTween(pt, p); 12560 } 12561 12562 pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p); 12563 } 12564 } 12565 } 12566}, 12567 _buildModifierPlugin = function _buildModifierPlugin(name, modifier) { 12568 return { 12569 name: name, 12570 headless: 1, 12571 rawVars: 1, 12572 //don't pre-process function-based values or "random()" strings. 12573 init: function init(target, vars, tween) { 12574 tween._onInit = function (tween) { 12575 var temp, p; 12576 12577 if (_isString(vars)) { 12578 temp = {}; 12579 12580 _forEachName(vars, function (name) { 12581 return temp[name] = 1; 12582 }); //if the user passes in a comma-delimited list of property names to roundProps, like "x,y", we round to whole numbers. 12583 12584 12585 vars = temp; 12586 } 12587 12588 if (modifier) { 12589 temp = {}; 12590 12591 for (p in vars) { 12592 temp[p] = modifier(vars[p]); 12593 } 12594 12595 vars = temp; 12596 } 12597 12598 _addModifiers(tween, vars); 12599 }; 12600 } 12601 }; 12602}; //register core plugins 12603 12604
vendor: 3,197 bytes, lines 12605-12666
12605var gsap = _gsap.registerPlugin({ 12606 name: "attr", 12607 init: function init(target, vars, tween, index, targets) { 12608 var p, pt, v; 12609 this.tween = tween; 12610 12611 for (p in vars) { 12612 v = target.getAttribute(p) || ""; 12613 pt = this.add(target, "setAttribute", (v || 0) + "", vars[p], index, targets, 0, 0, p); 12614 pt.op = p; 12615 pt.b = v; // record the beginning value so we can revert() 12616 12617 this._props.push(p); 12618 } 12619 }, 12620 render: function render(ratio, data) { 12621 var pt = data._pt; 12622 12623 while (pt) { 12624 _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b) 12625 12626 pt = pt._next; 12627 } 12628 } 12629}, { 12630 name: "endArray", 12631 headless: 1, 12632 init: function init(target, value) { 12633 var i = value.length; 12634 12635 while (i--) { 12636 this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1); 12637 } 12638 } 12639}, _buildModifierPlugin("roundProps", _roundModifier), _buildModifierPlugin("modifiers"), _buildModifierPlugin("snap", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way. 12640 12641Tween.version = Timeline.version = gsap.version = "3.15.0"; 12642_coreReady = 1; 12643_windowExists() && _wake(); 12644var Power0 = _easeMap.Power0, 12645 Power1 = _easeMap.Power1, 12646 Power2 = _easeMap.Power2, 12647 Power3 = _easeMap.Power3, 12648 Power4 = _easeMap.Power4, 12649 Linear = _easeMap.Linear, 12650 Quad = _easeMap.Quad, 12651 Cubic = _easeMap.Cubic, 12652 Quart = _easeMap.Quart, 12653 Quint = _easeMap.Quint, 12654 Strong = _easeMap.Strong, 12655 Elastic = _easeMap.Elastic, 12656 Back = _easeMap.Back, 12657 SteppedEase = _easeMap.SteppedEase, 12658 Bounce = _easeMap.Bounce, 12659 Sine = _easeMap.Sine, 12660 Expo = _easeMap.Expo, 12661 Circ = _easeMap.Circ; 12662 12663 //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it. 12664 12665//# sourceURL=[module] 12666//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvZ3NhcC1jb3JlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUF3Qyx1QkFBdUIseUZBQXlGOztBQUV4SixnREFBZ0QsMERBQTBELDJDQUEyQzs7QUFFcko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsNkZBQTZGO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRCx1QkFBdUI7QUFDdkI7QU
12666FDQSxvQkFBb0I7QUFDcEI7QUFDQSxpQkFBaUI7QUFDakIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsK0pBQStKO0FBQy9KO0FBQ0E7O0FBRUEsU0FBUywyQ0FBMkM7O0FBRXBEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLDJJQUEySTtBQUMzSTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBOztBQUVBLGlDQUFpQztBQUNqQztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUVBQWlFOztBQUVqRTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRTs7QUFFakUsc0VBQXNFOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkU7QUFDN0U7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0QsNEdBQTRHLEdBQUcsaUVBQWlFO0FBQ2hMLHNKQUFzSixtREFBbUQ7QUFDek07QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEd
12666BQUc7QUFDSCxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDtBQUNBOztBQUVBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7O0FBRUEsa0VBQWtFO0FBQ2xFO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSwyRUFBMkUsYUFBYTtBQUN4RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSC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FDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxJQUFJOztBQUVKLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUMsR0FBRzs7O0FBR0o7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QztBQUM5QywyQkFBMkI7QUFDM0I7O0FBRUEseURBQXlEO0FBQ3pEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3TUFBd007QUFDeE07O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEdBQTBHO0FBQzFHLHNHQUFzRztBQUN0RztBQUNBOztBQUVBO0FBQ0EsZ0VBQWdFOztBQUVoRTs7QUFFQSxtQkFBbUI7OztBQUduQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RTs7QUFFN0Usa0NBQWtDO0FBQ2xDLFFBQVE7QUFDUjs7QUFFQSw4QkFBOEI7O0FBRTlCLCtNQUErTTtBQUMvTTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkVBQTZFO0FBQzdFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
12666BRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixnRUFBZ0U7O0FBRWhFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnS0FBZ0s7O0FBRWhLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9COztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFEQUFxRCw2TkFBNk4sT0FBTyxXQUFXLEtBQUs7QUFDL1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1UEFBdVA7O0FBRXZQO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjs7QUFFcEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlIQUF5SDs7QUFFekg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsMEVBQTBFO0FBQzFFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0VBQWdFO0FBQ2hFO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0F
12666BRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRCQUE0Qjs7QUFFNUIsK0NBQStDOztBQUUvQzs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFOztBQUVyRTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxpQkFBaUI7O0FBRWpCO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QU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FBR0k7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EscUVBQXFFOztBQUVyRTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHVJQUF1STs7QUFFeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ21KO0FBQ3FILENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvZ3NhcC1jb3JlLmpzPzc0ODkiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybi
12666BzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKiFcbiAqIEdTQVAgMy4xNS4wXG4gKiBodHRwczovL2dzYXAuY29tXG4gKlxuICogQGxpY2Vuc2UgQ29weXJpZ2h0IDIwMDgtMjAyNiwgR3JlZW5Tb2NrLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cHM6Ly9nc2FwLmNvbS9zdGFuZGFyZC1saWNlbnNlXG4gKiBAYXV0aG9yOiBKYWNrIERveWxlLCBqYWNrQGdyZWVuc29jay5jb21cbiovXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG52YXIgX2NvbmZpZyA9IHtcbiAgYXV0b1NsZWVwOiAxMjAsXG4gIGZvcmNlM0Q6IFwiYXV0b1wiLFxuICBudWxsVGFyZ2V0V2FybjogMSxcbiAgdW5pdHM6IHtcbiAgICBsaW5lSGVpZ2h0OiBcIlwiXG4gIH1cbn0sXG4gICAgX2RlZmF1bHRzID0ge1xuICBkdXJhdGlvbjogLjUsXG4gIG92ZXJ3cml0ZTogZmFsc2UsXG4gIGRlbGF5OiAwXG59LFxuICAgIF9zdXBwcmVzc092ZXJ3cml0ZXMsXG4gICAgX3JldmVydGluZyxcbiAgICBfY29udGV4dCxcbiAgICBfYmlnTnVtID0gMWU4LFxuICAgIF90aW55TnVtID0gMSAvIF9iaWdOdW0sXG4gICAgXzJQSSA9IE1hdGguUEkgKiAyLFxuICAgIF9IQUxGX1BJID0gXzJQSSAvIDQsXG4gICAgX2dzSUQgPSAwLFxuICAgIF9zcXJ0ID0gTWF0aC5zcXJ0LFxuICAgIF9jb3MgPSBNYXRoLmNvcyxcbiAgICBfc2luID0gTWF0aC5zaW4sXG4gICAgX2lzU3RyaW5nID0gZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59LFxuICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24gX2lzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufSxcbiAgICBfaXNOdW1iZXIgPSBmdW5jdGlvbiBfaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbn0sXG4gICAgX2lzVW5kZWZpbmVkID0gZnVuY3Rpb24gX2lzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCI7XG59LFxuICAgIF9pc09iamVjdCA9IGZ1bmN0aW9uIF9pc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xufSxcbiAgICBfaXNOb3RGYWxzZSA9IGZ1bmN0aW9uIF9pc05vdEZhbHNlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gZmFsc2U7XG59LFxuICAgIF93aW5kb3dFeGlzdHMgPSBmdW5jdGlvbiBfd2luZG93RXhpc3RzKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbn0sXG4gICAgX2lzRnVuY09yU3RyaW5nID0gZnVuY3Rpb24gX2lzRnVuY09yU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBfaXNGdW5jdGlvbih2YWx1ZSkgfHwgX2lzU3RyaW5nKHZhbHVlKTtcbn0sXG4gICAgX2lzVHlwZWRBcnJheSA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIEFycmF5QnVmZmVyLmlzVmlldyB8fCBmdW5jdGlvbiAoKSB7fSxcbiAgICAvLyBub3RlOiBJRTEwIGhhcyBBcnJheUJ1ZmZlciwgYnV0IE5PVCBBcnJheUJ1ZmZlci5pc1ZpZXcoKS5cbl9pc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICBfcmFuZG9tRXhwID0gL3JhbmRvbVxcKFteKV0rXFwpL2csXG4gICAgX2NvbW1hRGVsaW1FeHAgPSAvLFxccyovZyxcbiAgICBfc3RyaWN0TnVtRXhwID0gLyg/Oi0/XFwuP1xcZHxcXC4pKy9naSxcbiAgICAvL29ubHkgbnVtYmVycyAoaW5jbHVkaW5nIG5lZ2F0aXZlcyBhbmQgZGVjaW1hbHMpIGJ1dCBOT1QgcmVsYXRpdmUgdmFsdWVzLlxuX251bUV4cCA9IC9bLSs9Ll0qXFxkK1suZVxcLStdKlxcZCpbZVxcLStdKlxcZCovZyxcbiAgICAvL2ZpbmRzIGFueSBudW1iZXJzLCBpbmNsdWRpbmcgb25lcyB0aGF0IHN0YXJ0IHdpdGggKz0gb3IgLT0sIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCBvbmVzIGluIHNjaWVudGlmaWMgbm90YXRpb24gbGlrZSAxZS04LlxuX251bVdpdGhVbml0RXhwID0gL1stKz0uXSpcXGQrWy5lLV0qXFxkKlthLXolXSovZyxcbiAgICBfY29tcGxleFN0cmluZ051bUV4cCA9IC9bLSs9Ll0qXFxkK1xcLj9cXGQqKD86ZS18ZVxcKyk/XFxkKi9naSxcbiAgICAvL2R1cGxpY2F0ZSBzbyB0aGF0IHdoaWxlIHdlJ3JlIGxvb3BpbmcgdGhyb3VnaCBtYXRjaGVzIGZyb20gZXhlYygpLCBpdCBkb2Vzbid0IGNvbnRhbWluYXRlIHRoZSBsYXN0SW5kZXggb2YgX251bUV4cCB3aGljaCB3ZSB1c2UgdG8gc2VhcmNoIGZvciBjb2xvcnMgdG9vLlxuX3JlbEV4cCA9IC9bKy1dPS0/Wy5cXGRdKy8sXG4gICAgX2RlbGltaXRlZFZhbHVlRXhwID0gL1teLCdcIlxcW1xcXVxcc10rL2dpLFxuICAgIC8vIHByZXZpb3VzbHkgL1sjXFwtKy5dKlxcYlthLXpcXGRcXC09KyUuXSsvZ2kgYnV0IGRpZG4ndCBjYXRjaCBzcGVjaWFsIGNoYXJhY3RlcnMuXG5fdW5pdEV4cCA9IC9eWytcXC09ZVxcc1xcZF0qXFxkK1suXFxkXSooW2Etel0qfCUpXFxzKiQvaSxcbiAgICBfZ2xvYmFsVGltZWxpbmUsXG4gICAgX3dpbixcbiAgICBfY29yZUluaXR0ZWQsXG4gICAgX2RvYyxcbiAgICBfZ2xvYmFscyA9IHt9LFxuICAgIF9pbnN0YWxsU2NvcGUgPSB7fSxcbiAgICBfY29yZVJlYWR5LFxuICAgIF9pbnN0YWxsID0gZnVuY3Rpb24gX2luc3RhbGwoc2NvcGUpIHtcbiAgcmV0dXJuIChfaW5zdGFsbFNjb3BlID0gX21lcmdlKHNjb3BlLCBfZ2xvYmFscykpICYmIGdzYXA7XG59LFxuICAgIF9taXNzaW5nUGx1Z2luID0gZnVuY3Rpb24gX21pc3NpbmdQbHVnaW4ocHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiBjb25zb2xlLndhcm4oXCJJbnZhbGlkIHByb3BlcnR5XCIsIHByb3BlcnR5LCBcInNldCB0b1wiLCB2YWx1ZSwgXCJNaXNzaW5nIHBsdWdpbj8gZ3NhcC5yZWdpc3RlclBsdWdpbigpXCIpO1xufSxcbiAgICBfd2FybiA9IGZ1bmN0aW9uIF93YXJuKG1lc3NhZ2UsIHN1cHByZXNzKSB7XG4gIHJldHVybiAhc3VwcHJlc3MgJiYgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xufSxcbiAgICBfYWRkR2xvYmFsID0gZnVuY3Rpb24gX2FkZEdsb2JhbChuYW1lLCBvYmopIHtcbiAgcmV0dXJuIG5hbWUgJiYgKF9nbG9iYWxzW25hbWVdID0gb2JqKSAmJiBfaW5zdGFsbFNjb3BlICYmIChfaW5zdGFsbFNjb3BlW25hbWVdID0gb2JqKSB8fCBfZ2xvYmFscztcbn0sXG4gICAgX2VtcHR5RnVuYyA9IGZ1bmN0aW9uIF9lbXB0eUZ1bmMoKSB7XG4gIHJldHVybiAwO1xufSxcbiAgICBfc3RhcnRBdFJldmVydENvbmZpZyA9IHtcbiAgc3VwcHJlc3NFdmVudHM6IHRydWUsXG4gIGlzU3RhcnQ6IHRydWUsXG4gIGtpbGw6IGZhbHNlXG59LFxuICAgIF9yZXZlcnRDb25maWdOb0tpbGwgPSB7XG4gIHN1cHByZXNzRXZlbnRzOiB0cnVlLFxuICBraWxsOiBmYWxzZVxufSxcbiAgICBfcmV2ZXJ0Q29uZmlnID0ge1xuICBzdXBwcmVzc0V2ZW50czogdHJ1ZVxufSxcbiAgICBfcmVzZXJ2ZWRQcm9wcyA9IHt9LFxuICAgIF9sYXp5VHdlZW5zID0gW10sXG4gICAgX2xhenlMb29rdXAgPSB7fSxcbiAgICBfbGFzdFJlbmRlcmVkRnJhbWUsXG4gICAgX3BsdWdpbnMgPSB7fSxcbiAgICBfZWZmZWN0cyA9IHt9LFxuICAgIF9uZXh0R0NGcmFtZSA9IDMwLFxuICAgIF9oYXJuZXNzUGx1Z2lucyA9IFtdLFxuICAgIF9jYWxsYmFja05hbWVzID0gXCJcIixcbiAgICBfaGFybmVzcyA9IGZ1bmN0aW9uIF9oYXJuZXNzKHRhcmdldHMpIHtcbiAgdmFyIHRhcmdldCA9IHRhcmdldHNbMF0sXG4gICAgICBoYXJuZXNzUGx1Z2luLFxuICAgICAgaTtcbiAgX2lzT2JqZWN0KHRhcmdldCkgfHwgX2lzRnVuY3Rpb24odGFyZ2V0KSB8fCAodGFyZ2V0cyA9IFt0YXJnZXRzXSk7XG5cbiAgaWYgKCEoaGFybmVzc1BsdWdpbiA9ICh0YXJnZXQuX2dzYXAgfHwge30pLmhhcm5lc3MpKSB7XG4gICAgLy8gZmluZCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggYSBoYXJuZXNzLiBXZSBhc3N1bWUgdGFyZ2V0cyBwYXNzZWQgaW50byBhbiBhbmltYXRpb24gd2lsbCBiZSBvZiBzaW1pbGFyIHR5cGUsIG1lYW5pbmcgdGhlIHNhbWUga2luZCBvZiBoYXJuZXNzIGNhbiBiZSB1c2VkIGZvciB0aGVtIGFsbCAocGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKVxuICAgIGkgPSBfaGFybmVzc1BsdWdpbnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSAmJiAhX2hhcm5lc3NQbHVnaW5zW2ldLnRhcmdldFRlc3QodGFyZ2V0KSkge31cblxuICAgIGhhcm5lc3NQbHVnaW4gPSBfaGFybmVzc1BsdWdpbnNbaV07XG4gIH1cblxuICBpID0gdGFyZ2V0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHRhcmdldHNbaV0gJiYgKHRhcmdldHNbaV0uX2dzYXAgfHwgKHRhcmdldHNbaV0uX2dzYXAgPSBuZXcgR1NDYWNoZSh0YXJnZXRzW2ldLCBoYXJuZXNzUGx1Z2luKSkpIHx8IHRhcmdldHMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59LFxuICAgIF9nZXRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRDYWNoZSh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC5fZ3NhcCB8fCBfaGFybmVzcyh0b0FycmF5KHRhcmdldCkpWzBdLl9nc2FwO1xufSxcbiAgICBfZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiBfZ2V0UHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgdikge1xuICByZXR1cm4gKHYgPSB0YXJnZXRbcHJv
12666cGVydHldKSAmJiBfaXNGdW5jdGlvbih2KSA/IHRhcmdldFtwcm9wZXJ0eV0oKSA6IF9pc1VuZGVmaW5lZCh2KSAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIHx8IHY7XG59LFxuICAgIF9mb3JFYWNoTmFtZSA9IGZ1bmN0aW9uIF9mb3JFYWNoTmFtZShuYW1lcywgZnVuYykge1xuICByZXR1cm4gKG5hbWVzID0gbmFtZXMuc3BsaXQoXCIsXCIpKS5mb3JFYWNoKGZ1bmMpIHx8IG5hbWVzO1xufSxcbiAgICAvL3NwbGl0IGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgbmFtZXMgaW50byBhbiBhcnJheSwgdGhlbiBydW4gYSBmb3JFYWNoKCkgZnVuY3Rpb24gYW5kIHJldHVybiB0aGUgc3BsaXQgYXJyYXkgKHRoaXMgaXMganVzdCBhIHdheSB0byBjb25zb2xpZGF0ZS9zaG9ydGVuIHNvbWUgY29kZSkuXG5fcm91bmQgPSBmdW5jdGlvbiBfcm91bmQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiAxMDAwMDApIC8gMTAwMDAwIHx8IDA7XG59LFxuICAgIF9yb3VuZFByZWNpc2UgPSBmdW5jdGlvbiBfcm91bmRQcmVjaXNlKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwMDAwMDApIC8gMTAwMDAwMDAgfHwgMDtcbn0sXG4gICAgLy8gaW5jcmVhc2VkIHByZWNpc2lvbiBtb3N0bHkgZm9yIHRpbWluZyB2YWx1ZXMuXG5fcGFyc2VSZWxhdGl2ZSA9IGZ1bmN0aW9uIF9wYXJzZVJlbGF0aXZlKHN0YXJ0LCB2YWx1ZSkge1xuICB2YXIgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMCksXG4gICAgICBlbmQgPSBwYXJzZUZsb2F0KHZhbHVlLnN1YnN0cigyKSk7XG4gIHN0YXJ0ID0gcGFyc2VGbG9hdChzdGFydCk7XG4gIHJldHVybiBvcGVyYXRvciA9PT0gXCIrXCIgPyBzdGFydCArIGVuZCA6IG9wZXJhdG9yID09PSBcIi1cIiA/IHN0YXJ0IC0gZW5kIDogb3BlcmF0b3IgPT09IFwiKlwiID8gc3RhcnQgKiBlbmQgOiBzdGFydCAvIGVuZDtcbn0sXG4gICAgX2FycmF5Q29udGFpbnNBbnkgPSBmdW5jdGlvbiBfYXJyYXlDb250YWluc0FueSh0b1NlYXJjaCwgdG9GaW5kKSB7XG4gIC8vc2VhcmNoZXMgb25lIGFycmF5IHRvIGZpbmQgbWF0Y2hlcyBmb3IgYW55IG9mIHRoZSBpdGVtcyBpbiB0aGUgdG9GaW5kIGFycmF5LiBBcyBzb29uIGFzIG9uZSBpcyBmb3VuZCwgaXQgcmV0dXJucyB0cnVlLiBJdCBkb2VzIE5PVCByZXR1cm4gYWxsIHRoZSBtYXRjaGVzOyBpdCdzIHNpbXBseSBhIGJvb2xlYW4gc2VhcmNoLlxuICB2YXIgbCA9IHRvRmluZC5sZW5ndGgsXG4gICAgICBpID0gMDtcblxuICBmb3IgKDsgdG9TZWFyY2guaW5kZXhPZih0b0ZpbmRbaV0pIDwgMCAmJiArK2kgPCBsOykge31cblxuICByZXR1cm4gaSA8IGw7XG59LFxuICAgIF9sYXp5UmVuZGVyID0gZnVuY3Rpb24gX2xhenlSZW5kZXIoKSB7XG4gIHZhciBsID0gX2xhenlUd2VlbnMubGVuZ3RoLFxuICAgICAgYSA9IF9sYXp5VHdlZW5zLnNsaWNlKDApLFxuICAgICAgaSxcbiAgICAgIHR3ZWVuO1xuXG4gIF9sYXp5TG9va3VwID0ge307XG4gIF9sYXp5VHdlZW5zLmxlbmd0aCA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHR3ZWVuID0gYVtpXTtcbiAgICB0d2VlbiAmJiB0d2Vlbi5fbGF6eSAmJiAodHdlZW4ucmVuZGVyKHR3ZWVuLl9sYXp5WzBdLCB0d2Vlbi5fbGF6eVsxXSwgdHJ1ZSkuX2xhenkgPSAwKTtcbiAgfVxufSxcbiAgICBfaXNSZXZlcnRXb3J0aHkgPSBmdW5jdGlvbiBfaXNSZXZlcnRXb3J0aHkoYW5pbWF0aW9uKSB7XG4gIHJldHVybiAhIShhbmltYXRpb24uX2luaXR0ZWQgfHwgYW5pbWF0aW9uLl9zdGFydEF0IHx8IGFuaW1hdGlvbi5hZGQpO1xufSxcbiAgICBfbGF6eVNhZmVSZW5kZXIgPSBmdW5jdGlvbiBfbGF6eVNhZmVSZW5kZXIoYW5pbWF0aW9uLCB0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcbiAgX2xhenlUd2VlbnMubGVuZ3RoICYmICFfcmV2ZXJ0aW5nICYmIF9sYXp5UmVuZGVyKCk7XG4gIGFuaW1hdGlvbi5yZW5kZXIodGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlIHx8ICEhKF9yZXZlcnRpbmcgJiYgdGltZSA8IDAgJiYgX2lzUmV2ZXJ0V29ydGh5KGFuaW1hdGlvbikpKTtcbiAgX2xhenlUd2VlbnMubGVuZ3RoICYmICFfcmV2ZXJ0aW5nICYmIF9sYXp5UmVuZGVyKCk7IC8vaW4gY2FzZSByZW5kZXJpbmcgY2F1c2VkIGFueSB0d2VlbnMgdG8gbGF6eS1pbml0LCB3ZSBzaG91bGQgcmVuZGVyIHRoZW0gYmVjYXVzZSB0eXBpY2FsbHkgd2hlbiBzb21lb25lIGNhbGxzIHNlZWsoKSBvciB0aW1lKCkgb3IgcHJvZ3Jlc3MoKSwgdGhleSBleHBlY3QgYW4gaW1tZWRpYXRlIHJlbmRlci5cbn0sXG4gICAgX251bWVyaWNJZlBvc3NpYmxlID0gZnVuY3Rpb24gX251bWVyaWNJZlBvc3NpYmxlKHZhbHVlKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gIHJldHVybiAobiB8fCBuID09PSAwKSAmJiAodmFsdWUgKyBcIlwiKS5tYXRjaChfZGVsaW1pdGVkVmFsdWVFeHApLmxlbmd0aCA8IDIgPyBuIDogX2lzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlO1xufSxcbiAgICBfcGFzc1Rocm91Z2ggPSBmdW5jdGlvbiBfcGFzc1Rocm91Z2gocCkge1xuICByZXR1cm4gcDtcbn0sXG4gICAgX3NldERlZmF1bHRzID0gZnVuY3Rpb24gX3NldERlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHtcbiAgZm9yICh2YXIgcCBpbiBkZWZhdWx0cykge1xuICAgIHAgaW4gb2JqIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfc2V0S2V5ZnJhbWVEZWZhdWx0cyA9IGZ1bmN0aW9uIF9zZXRLZXlmcmFtZURlZmF1bHRzKGV4Y2x1ZGVEdXJhdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgZGVmYXVsdHMpIHtcbiAgICBmb3IgKHZhciBwIGluIGRlZmF1bHRzKSB7XG4gICAgICBwIGluIG9iaiB8fCBwID09PSBcImR1cmF0aW9uXCIgJiYgZXhjbHVkZUR1cmF0aW9uIHx8IHAgPT09IFwiZWFzZVwiIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XG4gICAgfVxuICB9O1xufSxcbiAgICBfbWVyZ2UgPSBmdW5jdGlvbiBfbWVyZ2UoYmFzZSwgdG9NZXJnZSkge1xuICBmb3IgKHZhciBwIGluIHRvTWVyZ2UpIHtcbiAgICBiYXNlW3BdID0gdG9NZXJnZVtwXTtcbiAgfVxuXG4gIHJldHVybi
12666BiYXNlO1xufSxcbiAgICBfbWVyZ2VEZWVwID0gZnVuY3Rpb24gX21lcmdlRGVlcChiYXNlLCB0b01lcmdlKSB7XG4gIGZvciAodmFyIHAgaW4gdG9NZXJnZSkge1xuICAgIHAgIT09IFwiX19wcm90b19fXCIgJiYgcCAhPT0gXCJjb25zdHJ1Y3RvclwiICYmIHAgIT09IFwicHJvdG90eXBlXCIgJiYgKGJhc2VbcF0gPSBfaXNPYmplY3QodG9NZXJnZVtwXSkgPyBfbWVyZ2VEZWVwKGJhc2VbcF0gfHwgKGJhc2VbcF0gPSB7fSksIHRvTWVyZ2VbcF0pIDogdG9NZXJnZVtwXSk7XG4gIH1cblxuICByZXR1cm4gYmFzZTtcbn0sXG4gICAgX2NvcHlFeGNsdWRpbmcgPSBmdW5jdGlvbiBfY29weUV4Y2x1ZGluZyhvYmosIGV4Y2x1ZGluZykge1xuICB2YXIgY29weSA9IHt9LFxuICAgICAgcDtcblxuICBmb3IgKHAgaW4gb2JqKSB7XG4gICAgcCBpbiBleGNsdWRpbmcgfHwgKGNvcHlbcF0gPSBvYmpbcF0pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59LFxuICAgIF9pbmhlcml0RGVmYXVsdHMgPSBmdW5jdGlvbiBfaW5oZXJpdERlZmF1bHRzKHZhcnMpIHtcbiAgdmFyIHBhcmVudCA9IHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSxcbiAgICAgIGZ1bmMgPSB2YXJzLmtleWZyYW1lcyA/IF9zZXRLZXlmcmFtZURlZmF1bHRzKF9pc0FycmF5KHZhcnMua2V5ZnJhbWVzKSkgOiBfc2V0RGVmYXVsdHM7XG5cbiAgaWYgKF9pc05vdEZhbHNlKHZhcnMuaW5oZXJpdCkpIHtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBmdW5jKHZhcnMsIHBhcmVudC52YXJzLmRlZmF1bHRzKTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQgfHwgcGFyZW50Ll9kcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFycztcbn0sXG4gICAgX2FycmF5c01hdGNoID0gZnVuY3Rpb24gX2FycmF5c01hdGNoKGExLCBhMikge1xuICB2YXIgaSA9IGExLmxlbmd0aCxcbiAgICAgIG1hdGNoID0gaSA9PT0gYTIubGVuZ3RoO1xuXG4gIHdoaWxlIChtYXRjaCAmJiBpLS0gJiYgYTFbaV0gPT09IGEyW2ldKSB7fVxuXG4gIHJldHVybiBpIDwgMDtcbn0sXG4gICAgX2FkZExpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX2FkZExpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3AsIHNvcnRCeSkge1xuICBpZiAoZmlyc3RQcm9wID09PSB2b2lkIDApIHtcbiAgICBmaXJzdFByb3AgPSBcIl9maXJzdFwiO1xuICB9XG5cbiAgaWYgKGxhc3RQcm9wID09PSB2b2lkIDApIHtcbiAgICBsYXN0UHJvcCA9IFwiX2xhc3RcIjtcbiAgfVxuXG4gIHZhciBwcmV2ID0gcGFyZW50W2xhc3RQcm9wXSxcbiAgICAgIHQ7XG5cbiAgaWYgKHNvcnRCeSkge1xuICAgIHQgPSBjaGlsZFtzb3J0QnldO1xuXG4gICAgd2hpbGUgKHByZXYgJiYgcHJldltzb3J0QnldID4gdCkge1xuICAgICAgcHJldiA9IHByZXYuX3ByZXY7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXYpIHtcbiAgICBjaGlsZC5fbmV4dCA9IHByZXYuX25leHQ7XG4gICAgcHJldi5fbmV4dCA9IGNoaWxkO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkLl9uZXh0ID0gcGFyZW50W2ZpcnN0UHJvcF07XG4gICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBjaGlsZDtcbiAgfVxuXG4gIGlmIChjaGlsZC5fbmV4dCkge1xuICAgIGNoaWxkLl9uZXh0Ll9wcmV2ID0gY2hpbGQ7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50W2xhc3RQcm9wXSA9IGNoaWxkO1xuICB9XG5cbiAgY2hpbGQuX3ByZXYgPSBwcmV2O1xuICBjaGlsZC5wYXJlbnQgPSBjaGlsZC5fZHAgPSBwYXJlbnQ7XG4gIHJldHVybiBjaGlsZDtcbn0sXG4gICAgX3JlbW92ZUxpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX3JlbW92ZUxpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3ApIHtcbiAgaWYgKGZpcnN0UHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgZmlyc3RQcm9wID0gXCJfZmlyc3RcIjtcbiAgfVxuXG4gIGlmIChsYXN0UHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbGFzdFByb3AgPSBcIl9sYXN0XCI7XG4gIH1cblxuICB2YXIgcHJldiA9IGNoaWxkLl9wcmV2LFxuICAgICAgbmV4dCA9IGNoaWxkLl9uZXh0O1xuXG4gIGlmIChwcmV2KSB7XG4gICAgcHJldi5fbmV4dCA9IG5leHQ7XG4gIH0gZWxzZSBpZiAocGFyZW50W2ZpcnN0UHJvcF0gPT09IGNoaWxkKSB7XG4gICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0Ll9wcmV2ID0gcHJldjtcbiAgfSBlbHNlIGlmIChwYXJlbnRbbGFzdFByb3BdID09PSBjaGlsZCkge1xuICAgIHBhcmVudFtsYXN0UHJvcF0gPSBwcmV2O1xuICB9XG5cbiAgY2hpbGQuX25leHQgPSBjaGlsZC5fcHJldiA9IGNoaWxkLnBhcmVudCA9IG51bGw7IC8vIGRvbid0IGRlbGV0ZSB0aGUgX2RwIGp1c3Qgc28gd2UgY2FuIHJldmVydCBpZiBuZWNlc3NhcnkuIEJ1dCBwYXJlbnQgc2hvdWxkIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhlIGl0ZW0gaXNuJ3QgaW4gYSBsaW5rZWQgbGlzdC5cbn0sXG4gICAgX3JlbW92ZUZyb21QYXJlbnQgPSBmdW5jdGlvbiBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCwgb25seUlmUGFyZW50SGFzQXV0b1JlbW92ZSkge1xuICBjaGlsZC5wYXJlbnQgJiYgKCFvbmx5SWZQYXJlbnRIYXNBdXRvUmVtb3ZlIHx8IGNoaWxkLnBhcmVudC5hdXRvUmVtb3ZlQ2hpbGRyZW4pICYmIGNoaWxkLnBhcmVudC5yZW1vdmUgJiYgY2hpbGQucGFyZW50LnJlbW92ZShjaGlsZCk7XG4gIGNoaWxkLl9hY3QgPSAwO1xufSxcbiAgICBfdW5jYWNoZSA9IGZ1bmN0aW9uIF91bmNhY2hlKGFuaW1hdGlvbiwgY2hpbGQpIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiAoIWNoaWxkIHx8IGNoaWxkLl9lbmQgPiBhbmltYXRpb24uX2R1ciB8fCBjaGlsZC5fc3RhcnQgPCAwKSkge1xuICAgIC8vIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogaWYgYSBjaGlsZCBhbmltYXRpb24gaXMgcGFzc2VkIGluIHdlIHNob3VsZCBvbmx5IHVuY2FjaGUgaWYgdGhhdCBjaGlsZCBFWFRFTkRTIHRoZSBhbmltYXRpb24gKGl0cyBlbmQgdGltZSBpcyBiZXlvbmQgdGhlIGVuZClcbiAgICB2YXIgYSA9IGFuaW1hdGlvbjtcblxuICAgIHdoaWxlIChhKSB7XG4gICAgICBhLl9kaXJ0eSA9IDE7XG4gICAgICBhID0gYS5wYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFuaW1hdGlvbjtcbn0sXG4gICAgX3JlY2FjaGVBbmNlc3RvcnMgPSBmdW5jdGlvbiBfcmVjYWNoZUFuY2VzdG9ycyhhbmltYXRpb24pIHtcbiAgdmFyIHBhcmVudCA9IGFuaW1hdGlvbi5wYXJlbnQ7XG5cbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSB7XG4gICAgLy9zb21ldGltZXMgd2UgbXVzdCBmb3JjZSBhIHJlLXNvcnQgb2YgYWxsIGNoaWxkcmVuIGFuZCB1cGRhdGUgdGhlIGR1cmF0aW9uL3RvdGFsRHVyYXRpb24gb2YgYWxsIGFuY2VzdG9yIHRpbWVsaW5lcyBpbW1lZGlhdGVseSBpbiBjYXNlLCBmb3IgZXhhbXBsZSwgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciBsb29wLCBvbmUgdHdlZW4gYWx0ZXJzIGFub3RoZXIgdHdlZW4ncyB0aW1lU2NhbGUgd2hpY2ggc2hvdmVzIGl0cyBzdGFydFRpbWUgYmVmb3JlIDAsIGZvcmNpbmcgdGhlIHBhcmVudCB0aW1lbGluZSB0byBzaGlmdCBhcm91bmQgYW5kIHNoaWZ0Q2hpbGRyZW4oKSB3aGljaCBjb3VsZCBhZmZlY3QgdGhhdCBuZXh0IHR3ZWVuJ3MgcmVuZGVyIChzdGFydFRpbWUpLiBEb2Vzbid0IG1hdHRlciBmb3IgdGhlIHJvb3QgdGltZWxpbmUgdGhvdWdoLlxuICAgIHBhcmVudC5fZGlydHkgPSAxO1xuICAgIHBhcmVudC50b3RhbER1cmF0aW9uKCk7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgfVxuXG4gIHJldHVybi
12666BhbmltYXRpb247XG59LFxuICAgIF9yZXdpbmRTdGFydEF0ID0gZnVuY3Rpb24gX3Jld2luZFN0YXJ0QXQodHdlZW4sIHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG4gIHJldHVybiB0d2Vlbi5fc3RhcnRBdCAmJiAoX3JldmVydGluZyA/IHR3ZWVuLl9zdGFydEF0LnJldmVydChfcmV2ZXJ0Q29uZmlnTm9LaWxsKSA6IHR3ZWVuLnZhcnMuaW1tZWRpYXRlUmVuZGVyICYmICF0d2Vlbi52YXJzLmF1dG9SZXZlcnQgfHwgdHdlZW4uX3N0YXJ0QXQucmVuZGVyKHRvdGFsVGltZSwgdHJ1ZSwgZm9yY2UpKTtcbn0sXG4gICAgX2hhc05vUGF1c2VkQW5jZXN0b3JzID0gZnVuY3Rpb24gX2hhc05vUGF1c2VkQW5jZXN0b3JzKGFuaW1hdGlvbikge1xuICByZXR1cm4gIWFuaW1hdGlvbiB8fCBhbmltYXRpb24uX3RzICYmIF9oYXNOb1BhdXNlZEFuY2VzdG9ycyhhbmltYXRpb24ucGFyZW50KTtcbn0sXG4gICAgX2VsYXBzZWRDeWNsZUR1cmF0aW9uID0gZnVuY3Rpb24gX2VsYXBzZWRDeWNsZUR1cmF0aW9uKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uLl9yZXBlYXQgPyBfYW5pbWF0aW9uQ3ljbGUoYW5pbWF0aW9uLl90VGltZSwgYW5pbWF0aW9uID0gYW5pbWF0aW9uLmR1cmF0aW9uKCkgKyBhbmltYXRpb24uX3JEZWxheSkgKiBhbmltYXRpb24gOiAwO1xufSxcbiAgICAvLyBmZWVkIGluIHRoZSB0b3RhbFRpbWUgYW5kIGN5Y2xlRHVyYXRpb24gYW5kIGl0J2xsIHJldHVybiB0aGUgY3ljbGUgKGl0ZXJhdGlvbiBtaW51cyAxKSBhbmQgaWYgdGhlIHBsYXloZWFkIGlzIGV4YWN0bHkgYXQgdGhlIHZlcnkgRU5ELCBpdCB3aWxsIE5PVCBidW1wIHVwIHRvIHRoZSBuZXh0IGN5Y2xlLlxuX2FuaW1hdGlvbkN5Y2xlID0gZnVuY3Rpb24gX2FuaW1hdGlvbkN5Y2xlKHRUaW1lLCBjeWNsZUR1cmF0aW9uKSB7XG4gIHZhciB3aG9sZSA9IE1hdGguZmxvb3IodFRpbWUgPSBfcm91bmRQcmVjaXNlKHRUaW1lIC8gY3ljbGVEdXJhdGlvbikpO1xuICByZXR1cm4gdFRpbWUgJiYgd2hvbGUgPT09IHRUaW1lID8gd2hvbGUgLSAxIDogd2hvbGU7XG59LFxuICAgIF9wYXJlbnRUb0NoaWxkVG90YWxUaW1lID0gZnVuY3Rpb24gX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUocGFyZW50VGltZSwgY2hpbGQpIHtcbiAgcmV0dXJuIChwYXJlbnRUaW1lIC0gY2hpbGQuX3N0YXJ0KSAqIGNoaWxkLl90cyArIChjaGlsZC5fdHMgPj0gMCA/IDAgOiBjaGlsZC5fZGlydHkgPyBjaGlsZC50b3RhbER1cmF0aW9uKCkgOiBjaGlsZC5fdER1cik7XG59LFxuICAgIF9zZXRFbmQgPSBmdW5jdGlvbiBfc2V0RW5kKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uLl9lbmQgPSBfcm91bmRQcmVjaXNlKGFuaW1hdGlvbi5fc3RhcnQgKyAoYW5pbWF0aW9uLl90RHVyIC8gTWF0aC5hYnMoYW5pbWF0aW9uLl90cyB8fCBhbmltYXRpb24uX3J0cyB8fCBfdGlueU51bSkgfHwgMCkpO1xufSxcbiAgICBfYWxpZ25QbGF5aGVhZCA9IGZ1bmN0aW9uIF9hbGlnblBsYXloZWFkKGFuaW1hdGlvbiwgdG90YWxUaW1lKSB7XG4gIC8vIGFkanVzdHMgdGhlIGFuaW1hdGlvbidzIF9zdGFydCBhbmQgX2VuZCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHRvdGFsVGltZSAob25seSBpZiB0aGUgcGFyZW50J3Mgc21vb3RoQ2hpbGRUaW1pbmcgaXMgdHJ1ZSBhbmQgdGhlIGFuaW1hdGlvbiBpc24ndCBwYXVzZWQpLiBJdCBkb2Vzbid0IGRvIGFueSByZW5kZXJpbmcgb3IgZm9yY2luZyB0aGluZ3MgYmFjayBpbnRvIHBhcmVudCB0aW1lbGluZXMsIGV0Yy4gLSB0aGF0J3Mgd2hhdCB0b3RhbFRpbWUoKSBpcyBmb3IuXG4gIHZhciBwYXJlbnQgPSBhbmltYXRpb24uX2RwO1xuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50LnNtb290aENoaWxkVGltaW5nICYmIGFuaW1hdGlvbi5fdHMpIHtcbiAgICBhbmltYXRpb24uX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZShwYXJlbnQuX3RpbWUgLSAoYW5pbWF0aW9uLl90cyA+IDAgPyB0b3RhbFRpbWUgLyBhbmltYXRpb24uX3RzIDogKChhbmltYXRpb24uX2RpcnR5ID8gYW5pbWF0aW9uLnRvdGFsRHVyYXRpb24oKSA6IGFuaW1hdGlvbi5fdER1cikgLSB0b3RhbFRpbWUpIC8gLWFuaW1hdGlvbi5fdHMpKTtcblxuICAgIF9zZXRFbmQoYW5pbWF0aW9uKTtcblxuICAgIHBhcmVudC5fZGlydHkgfHwgX3VuY2FjaGUocGFyZW50LCBhbmltYXRpb24pOyAvL2ZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gSWYgdGhlIHBhcmVudCdzIGNhY2hlIGlzIGFscmVhZHkgZGlydHksIGl0IGFscmVhZHkgdG9vayBjYXJlIG9mIG1hcmtpbmcgdGhlIGFuY2VzdG9ycyBhcyBkaXJ0eSB0b28sIHNvIHNraXAgdGhlIGZ1bmN0aW9uIGNhbGwgaGVyZS5cbiAgfVxuXG4gIHJldHVybiBhbmltYXRpb247XG59LFxuXG4vKlxuX3RvdGFsVGltZVRvVGltZSA9IChjbGFtcGVkVG90YWxUaW1lLCBkdXJhdGlvbiwgcmVwZWF0LCByZXBlYXREZWxheSwgeW95bykgPT4ge1xuXHRsZXQgY3ljbGVEdXJhdGlvbiA9IGR1cmF0aW9uICsgcmVwZWF0RGVsYXksXG5cdFx0dGltZSA9IF9yb3VuZChjbGFtcGVkVG90YWxUaW1lICUgY3ljbGVEdXJhdGlvbik7XG5cdGlmICh0aW1lID4gZHVyYXRpb24pIHtcblx0XHR0aW1lID0gZHVyYXRpb247XG5cdH1cblx0cmV0dXJuICh5b3lvICYmICh+fihjbGFtcGVkVG90YWxUaW1lIC8gY3ljbGVEdXJhdGlvbikgJiAxKSkgPyBkdXJhdGlvbiAtIHRpbWUgOiB0aW1lO1xufSxcbiovXG5fcG9zdEFkZENoZWNrcyA9IGZ1bmN0aW9uIF9wb3N0QWRkQ2hlY2tzKHRpbWVsaW5lLCBjaGlsZCkge1xuICB2YXIgdDtcblxuICBpZiAoY2hpbGQuX3RpbWUgfHwgIWNoaWxkLl9kdXIgJiYgY2hpbGQuX2luaXR0ZWQgfHwgY2hpbGQuX3N0YXJ0IDwgdGltZWxpbmUuX3RpbWUgJiYgKGNoaWxkLl9kdXIgfHwgIWNoaWxkLmFkZCkpIHtcbiAgICAvLyBpbiBjYXNlLCBmb3IgZXhhbXBsZSwgdGhlIF9zdGFydCBpcyBtb3ZlZCBvbiBhIHR3ZWVuIHRoYXQgaGFzIGFscmVhZHkgcmVuZGVyZWQsIG9yIGlmIGl0J3MgYmVpbmcgaW5zZXJ0ZWQgaW50byBhIHRpbWVsaW5lIEJFRk9SRSB3aGVyZSB0aGUgcGxheWhlYWQgaXMgY3VycmVudGx5LiBJbWFnaW5lIGl0J3MgYXQgaXRzIGVuZCBzdGF0ZSwgdGhlbiB0aGUgc3RhcnRUaW1lIGlzIG1vdmVkIFdBWSBsYXRlciAoYWZ0ZXIgdGhlIGVuZCBvZiB0aGlzIHRpbWVsaW5lKSwgaXQgc2hvdWxkIHJlbmRlciBhdCBpdHMgYmVnaW5uaW5nLiBTcGVjaWFsIGNhc2U6IGlmIGl0J3MgYSB0aW1lbGluZSAoaGFzIC5hZGQoKSBtZXRob2QpIGFuZCBubyBkdXJhdGlvbiwgd2UgY2FuIHNraXAgcmVuZGVyaW5nIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGJlIHBvcHVsYXRpbmcgaXQgQUZURVIgYWRkaW5nIGl0IHRvIGEgcGFyZW50IHRpbWVsaW5lICh1bmNvbnZlbnRpb25hbCwgYnV0IHBvc3NpYmxlLCBhbmQgd2Ugd291bGRuJ3Qgd2FudCBpdCB0byBnZXQgcmVtb3ZlZCBpZiB0aGUgcGFyZW50J3MgYXV0b1JlbW92ZUNoaWxkcmVuIGlzIHRydWUpLlxuICAgIHQgPSBfcGFyZW50VG9DaGlsZFRvdGFsVGltZS
12666h0aW1lbGluZS5yYXdUaW1lKCksIGNoaWxkKTtcblxuICAgIGlmICghY2hpbGQuX2R1ciB8fCBfY2xhbXAoMCwgY2hpbGQudG90YWxEdXJhdGlvbigpLCB0KSAtIGNoaWxkLl90VGltZSA+IF90aW55TnVtKSB7XG4gICAgICBjaGlsZC5yZW5kZXIodCwgdHJ1ZSk7XG4gICAgfVxuICB9IC8vaWYgdGhlIHRpbWVsaW5lIGhhcyBhbHJlYWR5IGVuZGVkIGJ1dCB0aGUgaW5zZXJ0ZWQgdHdlZW4vdGltZWxpbmUgZXh0ZW5kcyB0aGUgZHVyYXRpb24sIHdlIHNob3VsZCBlbmFibGUgdGhpcyB0aW1lbGluZSBhZ2FpbiBzbyB0aGF0IGl0IHJlbmRlcnMgcHJvcGVybHkuIFdlIHNob3VsZCBhbHNvIGFsaWduIHRoZSBwbGF5aGVhZCB3aXRoIHRoZSBwYXJlbnQgdGltZWxpbmUncyB3aGVuIGFwcHJvcHJpYXRlLlxuXG5cbiAgaWYgKF91bmNhY2hlKHRpbWVsaW5lLCBjaGlsZCkuX2RwICYmIHRpbWVsaW5lLl9pbml0dGVkICYmIHRpbWVsaW5lLl90aW1lID49IHRpbWVsaW5lLl9kdXIgJiYgdGltZWxpbmUuX3RzKSB7XG4gICAgLy9pbiBjYXNlIGFueSBvZiB0aGUgYW5jZXN0b3JzIGhhZCBjb21wbGV0ZWQgYnV0IHNob3VsZCBub3cgYmUgZW5hYmxlZC4uLlxuICAgIGlmICh0aW1lbGluZS5fZHVyIDwgdGltZWxpbmUuZHVyYXRpb24oKSkge1xuICAgICAgdCA9IHRpbWVsaW5lO1xuXG4gICAgICB3aGlsZSAodC5fZHApIHtcbiAgICAgICAgdC5yYXdUaW1lKCkgPj0gMCAmJiB0LnRvdGFsVGltZSh0Ll90VGltZSk7IC8vbW92ZXMgdGhlIHRpbWVsaW5lIChzaGlmdHMgaXRzIHN0YXJ0VGltZSkgaWYgbmVjZXNzYXJ5LCBhbmQgYWxzbyBlbmFibGVzIGl0LiBJZiBpdCdzIGN1cnJlbnRseSB6ZXJvLCB0aG91Z2gsIGl0IG1heSBub3QgYmUgc2NoZWR1bGVkIHRvIHJlbmRlciB1bnRpbCBsYXRlciBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yY2UgaXQgdG8gYWxpZ24gd2l0aCB0aGUgY3VycmVudCBwbGF5aGVhZCBwb3NpdGlvbi4gT25seSBtb3ZlIHRvIGNhdGNoIHVwIHdpdGggdGhlIHBsYXloZWFkLlxuXG4gICAgICAgIHQgPSB0Ll9kcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aW1lbGluZS5felRpbWUgPSAtX3RpbnlOdW07IC8vIGhlbHBzIGVuc3VyZSB0aGF0IHRoZSBuZXh0IHJlbmRlcigpIHdpbGwgYmUgZm9yY2VkIChjcm9zc2luZ1N0YXJ0ID0gdHJ1ZSBpbiByZW5kZXIoKSksIGV2ZW4gaWYgdGhlIGR1cmF0aW9uIGhhc24ndCBjaGFuZ2VkICh3ZSdyZSBhZGRpbmcgYSBjaGlsZCB3aGljaCB3b3VsZCBuZWVkIHRvIGdldCByZW5kZXJlZCkuIERlZmluaXRlbHkgYW4gZWRnZSBjYXNlLiBOb3RlOiB3ZSBNVVNUIGRvIHRoaXMgQUZURVIgdGhlIGxvb3AgYWJvdmUgd2hlcmUgdGhlIHRvdGFsVGltZSgpIG1pZ2h0IHRyaWdnZXIgYSByZW5kZXIoKSBiZWNhdXNlIHRoaXMgX2FkZFRvVGltZWxpbmUoKSBtZXRob2QgZ2V0cyBjYWxsZWQgZnJvbSB0aGUgQW5pbWF0aW9uIGNvbnN0cnVjdG9yLCBCRUZPUkUgdHdlZW5zIGV2ZW4gcmVjb3JkIHRoZWlyIHRhcmdldHMsIGV0Yy4gc28gd2Ugd291bGRuJ3Qgd2FudCB0aGluZ3MgdG8gZ2V0IHRyaWdnZXJlZCBpbiB0aGUgd3Jvbmcgb3JkZXIuXG4gIH1cbn0sXG4gICAgX2FkZFRvVGltZWxpbmUgPSBmdW5jdGlvbiBfYWRkVG9UaW1lbGluZSh0aW1lbGluZSwgY2hpbGQsIHBvc2l0aW9uLCBza2lwQ2hlY2tzKSB7XG4gIGNoaWxkLnBhcmVudCAmJiBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCk7XG4gIGNoaWxkLl9zdGFydCA9IF9yb3VuZFByZWNpc2UoKF9pc051bWJlcihwb3NpdGlvbikgPyBwb3NpdGlvbiA6IHBvc2l0aW9uIHx8IHRpbWVsaW5lICE9PSBfZ2xvYmFsVGltZWxpbmUgPyBfcGFyc2VQb3NpdGlvbih0aW1lbGluZSwgcG9zaXRpb24sIGNoaWxkKSA6IHRpbWVsaW5lLl90aW1lKSArIGNoaWxkLl9kZWxheSk7XG4gIGNoaWxkLl9lbmQgPSBfcm91bmRQcmVjaXNlKGNoaWxkLl9zdGFydCArIChjaGlsZC50b3RhbER1cmF0aW9uKCkgLyBNYXRoLmFicyhjaGlsZC50aW1lU2NhbGUoKSkgfHwgMCkpO1xuXG4gIF9hZGRMaW5rZWRMaXN0SXRlbSh0aW1lbGluZSwgY2hpbGQsIFwiX2ZpcnN0XCIsIFwiX2xhc3RcIiwgdGltZWxpbmUuX3NvcnQgPyBcIl9zdGFydFwiIDogMCk7XG5cbiAgX2lzRnJvbU9yRnJvbVN0YXJ0KGNoaWxkKSB8fCAodGltZWxpbmUuX3JlY2VudCA9IGNoaWxkKTtcbiAgc2tpcENoZWNrcyB8fCBfcG9zdEFkZENoZWNrcyh0aW1lbGluZSwgY2hpbGQpO1xuICB0aW1lbGluZS5fdHMgPCAwICYmIF9hbGlnblBsYXloZWFkKHRpbWVsaW5lLCB0aW1lbGluZS5fdFRpbWUpOyAvLyBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBuZXcgY2hpbGQgbWFrZXMgaXQgbG9uZ2VyLCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIHBhcmVudCdzIF9zdGFydCAocHVzaCBpdCBiYWNrKVxuXG4gIHJldHVybiB0aW1lbGluZTtcbn0sXG4gICAgX3Njcm9sbFRyaWdnZXIgPSBmdW5jdGlvbiBfc2Nyb2xsVHJpZ2dlcihhbmltYXRpb24sIHRyaWdnZXIpIHtcbiAgcmV0dXJuIChfZ2xvYmFscy5TY3JvbGxUcmlnZ2VyIHx8IF9taXNzaW5nUGx1Z2luKFwic2Nyb2xsVHJpZ2dlclwiLCB0cmlnZ2VyKSkgJiYgX2dsb2JhbHMuU2Nyb2xsVHJpZ2dlci5jcmVhdGUodHJpZ2dlciwgYW5pbWF0aW9uKTtcbn0sXG4gICAgX2F0dGVtcHRJbml0VHdlZW4gPSBmdW5jdGlvbiBfYXR0ZW1wdEluaXRUd2Vlbih0d2VlbiwgdGltZSwgZm9yY2UsIHN1cHByZXNzRXZlbnRzLCB0VGltZSkge1xuICBfaW5pdFR3ZWVuKHR3ZWVuLCB0aW1lLCB0VGltZSk7XG5cbiAgaWYgKCF0d2Vlbi5faW5pdHRlZCkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKCFmb3JjZSAmJiB0d2Vlbi5fcHQgJiYgIV9yZXZlcnRpbmcgJiYgKHR3ZWVuLl9kdXIgJiYgdHdlZW4udmFycy5sYXp5ICE9PSBmYWxzZSB8fCAhdHdlZW4uX2R1ciAmJiB0d2Vlbi52YXJzLmxhenkpICYmIF9sYXN0UmVuZGVyZWRGcmFtZSAhPT0gX3RpY2tlci5mcmFtZSkge1xuICAgIF9sYXp5VHdlZW5zLnB1c2godHdlZW4pO1xuXG4gICAgdHdlZW4uX2xhenkgPSBbdFRpbWUsIHN1cHByZXNzRXZlbnRzXTtcbiAgICByZXR1cm4gMTtcbiAgfVxufSxcbiAgICBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0ID0gZnVuY3Rpb24gX3BhcmVudFBsYXloZWFkSXNCZWZvcmVTdGFydChfcmVmKSB7XG4gIHZhciBwYXJlbnQgPSBfcmVmLnBhcmVudDtcbiAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQuX3RzICYmIHBhcmVudC5faW5pdHRlZCAmJiAhcGFyZW50Ll9sb2NrICYmIChwYXJlbnQucmF3VGltZSgpIDwgMCB8fCBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0KHBhcmVudCkpO1xufSxcbiAgICAvLyBjaGVjayBwYXJlbnQncyBfbG9jayBiZWNhdXNlIHdoZW4gYSB0aW1lbGluZSByZXBlYXRzL3lveW9zIGFuZCBkb2VzIGl0cyBhcnRpZmljaWFsIHdyYXBwaW5nLCB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIHJhdGlvIGJhY2sgdG8gMFxuX2lzRnJvbU9yRnJvbVN0YXJ0ID0gZnVuY3Rpb24gX2lzRnJvbU9yRnJvbVN0YXJ0KF9yZWYyKSB7XG4gIHZhciBkYXRhID0gX3JlZjIuZGF0YTtcbiAgcmV0dXJuIGRhdGEgPT09IFwiaXNGcm9tU3RhcnRcIiB8fCBkYXRhID09PSBcImlzU3RhcnRcIjtcbn0sXG4gICAgX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuID0gZnVuY3Rpb24gX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuKHR3ZWVuLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuICB2YXIgcHJldlJhdGlvID0gdHdlZW4ucmF0aW8sXG4gICAgICByYXRpbyA9IHRvdGFsVGltZSA8IDAgfHwgIXRvdGFsVGltZSAmJiAoIXR3ZWVuLl9zdGFydCAmJiBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0KHR3ZWVuKSAmJiAhKCF0d2Vlbi5faW5pdHRlZCAmJiBfaXNGcm9tT3JGcm9tU3RhcnQodHdlZW4pKSB8fCAodHdlZW4uX3RzIDwgMCB8fCB0d2Vlbi5fZHAuX3RzIDwgMCkgJiYgIV9pc0Zyb21PckZyb21TdGFydCh0d2VlbikpID8gMCA6IDEsXG4gICAgICAvLyBpZiB0aGUgdHdlZW4gb3IgaXRzIHBhcmVudCBpcyByZXZlcnNlZCBhbmQgdGhlI
12666HRvdGFsVGltZSBpcyAwLCB3ZSBzaG91bGQgZ28gdG8gYSByYXRpbyBvZiAwLiBFZGdlIGNhc2U6IGlmIGEgZnJvbSgpIG9yIGZyb21UbygpIHN0YWdnZXIgdHdlZW4gaXMgcGxhY2VkIGxhdGVyIGluIGEgdGltZWxpbmUsIHRoZSBcInN0YXJ0QXRcIiB6ZXJvLWR1cmF0aW9uIHR3ZWVuIGNvdWxkIGluaXRpYWxseSByZW5kZXIgYXQgYSB0aW1lIHdoZW4gdGhlIHBhcmVudCB0aW1lbGluZSdzIHBsYXloZWFkIGlzIHRlY2huaWNhbGx5IEJFRk9SRSB3aGVyZSB0aGlzIHR3ZWVuIGlzLCBzbyBtYWtlIHN1cmUgdGhhdCBhbnkgXCJmcm9tXCIgYW5kIFwiZnJvbVRvXCIgc3RhcnRBdCB0d2VlbnMgYXJlIHJlbmRlcmVkIHRoZSBmaXJzdCB0aW1lIGF0IGEgcmF0aW8gb2YgMS5cbiAgcmVwZWF0RGVsYXkgPSB0d2Vlbi5fckRlbGF5LFxuICAgICAgdFRpbWUgPSAwLFxuICAgICAgcHQsXG4gICAgICBpdGVyYXRpb24sXG4gICAgICBwcmV2SXRlcmF0aW9uO1xuXG4gIGlmIChyZXBlYXREZWxheSAmJiB0d2Vlbi5fcmVwZWF0KSB7XG4gICAgLy8gaW4gY2FzZSB0aGVyZSdzIGEgemVyby1kdXJhdGlvbiB0d2VlbiB0aGF0IGhhcyBhIHJlcGVhdCB3aXRoIGEgcmVwZWF0RGVsYXlcbiAgICB0VGltZSA9IF9jbGFtcCgwLCB0d2Vlbi5fdER1ciwgdG90YWxUaW1lKTtcbiAgICBpdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodFRpbWUsIHJlcGVhdERlbGF5KTtcbiAgICB0d2Vlbi5feW95byAmJiBpdGVyYXRpb24gJiAxICYmIChyYXRpbyA9IDEgLSByYXRpbyk7XG5cbiAgICBpZiAoaXRlcmF0aW9uICE9PSBfYW5pbWF0aW9uQ3ljbGUodHdlZW4uX3RUaW1lLCByZXBlYXREZWxheSkpIHtcbiAgICAgIC8vIGlmIGl0ZXJhdGlvbiBjaGFuZ2VkXG4gICAgICBwcmV2UmF0aW8gPSAxIC0gcmF0aW87XG4gICAgICB0d2Vlbi52YXJzLnJlcGVhdFJlZnJlc2ggJiYgdHdlZW4uX2luaXR0ZWQgJiYgdHdlZW4uaW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyYXRpbyAhPT0gcHJldlJhdGlvIHx8IF9yZXZlcnRpbmcgfHwgZm9yY2UgfHwgdHdlZW4uX3pUaW1lID09PSBfdGlueU51bSB8fCAhdG90YWxUaW1lICYmIHR3ZWVuLl96VGltZSkge1xuICAgIGlmICghdHdlZW4uX2luaXR0ZWQgJiYgX2F0dGVtcHRJbml0VHdlZW4odHdlZW4sIHRvdGFsVGltZSwgZm9yY2UsIHN1cHByZXNzRXZlbnRzLCB0VGltZSkpIHtcbiAgICAgIC8vIGlmIHdlIHJlbmRlciB0aGUgdmVyeSBiZWdpbm5pbmcgKHRpbWUgPT0gMCkgb2YgYSBmcm9tVG8oKSwgd2UgbXVzdCBmb3JjZSB0aGUgcmVuZGVyIChub3JtYWwgdHdlZW5zIHdvdWxkbid0IG5lZWQgdG8gcmVuZGVyIGF0IGEgdGltZSBvZiAwIHdoZW4gdGhlIHByZXZUaW1lIHdhcyBhbHNvIDApLiBUaGlzIGlzIGFsc28gbWFuZGF0b3J5IHRvIG1ha2Ugc3VyZSBvdmVyd3JpdGluZyBraWNrcyBpbiBpbW1lZGlhdGVseS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcmV2SXRlcmF0aW9uID0gdHdlZW4uX3pUaW1lO1xuICAgIHR3ZWVuLl96VGltZSA9IHRvdGFsVGltZSB8fCAoc3VwcHJlc3NFdmVudHMgPyBfdGlueU51bSA6IDApOyAvLyB3aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC5cblxuICAgIHN1cHByZXNzRXZlbnRzIHx8IChzdXBwcmVzc0V2ZW50cyA9IHRvdGFsVGltZSAmJiAhcHJldkl0ZXJhdGlvbik7IC8vIGlmIGl0IHdhcyByZW5kZXJlZCBwcmV2aW91c2x5IGF0IGV4YWN0bHkgMCAoX3pUaW1lKSBhbmQgbm93IHRoZSBwbGF5aGVhZCBpcyBtb3ZpbmcgYXdheSwgRE9OJ1QgZmlyZSBjYWxsYmFja3Mgb3RoZXJ3aXNlIHRoZXknbGwgc2VlbSBsaWtlIGR1cGxpY2F0ZXMuXG5cbiAgICB0d2Vlbi5yYXRpbyA9IHJhdGlvO1xuICAgIHR3ZWVuLl9mcm9tICYmIChyYXRpbyA9IDEgLSByYXRpbyk7XG4gICAgdHdlZW4uX3RpbWUgPSAwO1xuICAgIHR3ZWVuLl90VGltZSA9IHRUaW1lO1xuICAgIHB0ID0gdHdlZW4uX3B0O1xuXG4gICAgd2hpbGUgKHB0KSB7XG4gICAgICBwdC5yKHJhdGlvLCBwdC5kKTtcbiAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgfVxuXG4gICAgdG90YWxUaW1lIDwgMCAmJiBfcmV3aW5kU3RhcnRBdCh0d2VlbiwgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgdHJ1ZSk7XG4gICAgdHdlZW4uX29uVXBkYXRlICYmICFzdXBwcmVzc0V2ZW50cyAmJiBfY2FsbGJhY2sodHdlZW4sIFwib25VcGRhdGVcIik7XG4gICAgdFRpbWUgJiYgdHdlZW4uX3JlcGVhdCAmJiAhc3VwcHJlc3NFdmVudHMgJiYgdHdlZW4ucGFyZW50ICYmIF9jYWxsYmFjayh0d2VlbiwgXCJvblJlcGVhdFwiKTtcblxuICAgIGlmICgodG90YWxUaW1lID49IHR3ZWVuLl90RHVyIHx8IHRvdGFsVGltZSA8IDApICYmIHR3ZWVuLnJhdGlvID09PSByYXRpbykge1xuICAgICAgcmF0aW8gJiYgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4sIDEpO1xuXG4gICAgICBpZiAoIXN1cHByZXNzRXZlbnRzICYmICFfcmV2ZXJ0aW5nKSB7XG4gICAgICAgIF9jYWxsYmFjayh0d2VlbiwgcmF0aW8gPyBcIm9uQ29tcGxldGVcIiA6IFwib25SZXZlcnNlQ29tcGxldGVcIiwgdHJ1ZSk7XG5cbiAgICAgICAgdHdlZW4uX3Byb20gJiYgdHdlZW4uX3Byb20oKTtcbiAgICAgIH1cbiAgICB9XG4gI
12666H0gZWxzZSBpZiAoIXR3ZWVuLl96VGltZSkge1xuICAgIHR3ZWVuLl96VGltZSA9IHRvdGFsVGltZTtcbiAgfVxufSxcbiAgICBfZmluZE5leHRQYXVzZVR3ZWVuID0gZnVuY3Rpb24gX2ZpbmROZXh0UGF1c2VUd2VlbihhbmltYXRpb24sIHByZXZUaW1lLCB0aW1lKSB7XG4gIHZhciBjaGlsZDtcblxuICBpZiAodGltZSA+IHByZXZUaW1lKSB7XG4gICAgY2hpbGQgPSBhbmltYXRpb24uX2ZpcnN0O1xuXG4gICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLl9zdGFydCA8PSB0aW1lKSB7XG4gICAgICBpZiAoY2hpbGQuZGF0YSA9PT0gXCJpc1BhdXNlXCIgJiYgY2hpbGQuX3N0YXJ0ID4gcHJldlRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLl9uZXh0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjaGlsZCA9IGFuaW1hdGlvbi5fbGFzdDtcblxuICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC5fc3RhcnQgPj0gdGltZSkge1xuICAgICAgaWYgKGNoaWxkLmRhdGEgPT09IFwiaXNQYXVzZVwiICYmIGNoaWxkLl9zdGFydCA8IHByZXZUaW1lKSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fcHJldjtcbiAgICB9XG4gIH1cbn0sXG4gICAgX3NldER1cmF0aW9uID0gZnVuY3Rpb24gX3NldER1cmF0aW9uKGFuaW1hdGlvbiwgZHVyYXRpb24sIHNraXBVbmNhY2hlLCBsZWF2ZVBsYXloZWFkKSB7XG4gIHZhciByZXBlYXQgPSBhbmltYXRpb24uX3JlcGVhdCxcbiAgICAgIGR1ciA9IF9yb3VuZFByZWNpc2UoZHVyYXRpb24pIHx8IDAsXG4gICAgICB0b3RhbFByb2dyZXNzID0gYW5pbWF0aW9uLl90VGltZSAvIGFuaW1hdGlvbi5fdER1cjtcbiAgdG90YWxQcm9ncmVzcyAmJiAhbGVhdmVQbGF5aGVhZCAmJiAoYW5pbWF0aW9uLl90aW1lICo9IGR1ciAvIGFuaW1hdGlvbi5fZHVyKTtcbiAgYW5pbWF0aW9uLl9kdXIgPSBkdXI7XG4gIGFuaW1hdGlvbi5fdER1ciA9ICFyZXBlYXQgPyBkdXIgOiByZXBlYXQgPCAwID8gMWUxMCA6IF9yb3VuZFByZWNpc2UoZHVyICogKHJlcGVhdCArIDEpICsgYW5pbWF0aW9uLl9yRGVsYXkgKiByZXBlYXQpO1xuICB0b3RhbFByb2dyZXNzID4gMCAmJiAhbGVhdmVQbGF5aGVhZCAmJiBfYWxpZ25QbGF5aGVhZChhbmltYXRpb24sIGFuaW1hdGlvbi5fdFRpbWUgPSBhbmltYXRpb24uX3REdXIgKiB0b3RhbFByb2dyZXNzKTtcbiAgYW5pbWF0aW9uLnBhcmVudCAmJiBfc2V0RW5kKGFuaW1hdGlvbik7XG4gIHNraXBVbmNhY2hlIHx8IF91bmNhY2hlKGFuaW1hdGlvbi5wYXJlbnQsIGFuaW1hdGlvbik7XG4gIHJldHVybiBhbmltYXRpb247XG59LFxuICAgIF9vblVwZGF0ZVRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbiBfb25VcGRhdGVUb3RhbER1cmF0aW9uKGFuaW1hdGlvbikge1xuICByZXR1cm4gYW5pbWF0aW9uIGluc3RhbmNlb2YgVGltZWxpbmUgPyBfdW5jYWNoZShhbmltYXRpb24pIDogX3NldER1cmF0aW9uKGFuaW1hdGlvbiwgYW5pbWF0aW9uLl9kdXIpO1xufSxcbiAgICBfemVyb1Bvc2l0aW9uID0ge1xuICBfc3RhcnQ6IDAsXG4gIGVuZFRpbWU6IF9lbXB0eUZ1bmMsXG4gIHRvdGFsRHVyYXRpb246IF9lbXB0eUZ1bmNcbn0sXG4gICAgX3BhcnNlUG9zaXRpb24gPSBmdW5jdGlvbiBfcGFyc2VQb3NpdGlvbihhbmltYXRpb24sIHBvc2l0aW9uLCBwZXJjZW50QW5pbWF0aW9uKSB7XG4gIHZhciBsYWJlbHMgPSBhbmltYXRpb24ubGFiZWxzLFxuICAgICAgcmVjZW50ID0gYW5pbWF0aW9uLl9yZWNlbnQgfHwgX3plcm9Qb3NpdGlvbixcbiAgICAgIGNsaXBwZWREdXJhdGlvbiA9IGFuaW1hdGlvbi5kdXJhdGlvbigpID49IF9iaWdOdW0gPyByZWNlbnQuZW5kVGltZShmYWxzZSkgOiBhbmltYXRpb24uX2R1cixcbiAgICAgIC8vaW4gY2FzZSB0aGVyZSdzIGEgY2hpbGQgdGhhdCBpbmZpbml0ZWx5IHJlcGVhdHMsIHVzZXJzIGFsbW9zdCBuZXZlciBpbnRlbmQgZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgb2YgYSBuZXcgY2hpbGQgdG8gYmUgYmFzZWQgb24gYSBTVVBFUiBsb25nIHZhbHVlIGxpa2UgdGhhdCBzbyB3ZSBjbGlwIGl0IGFuZCBhc3N1bWUgdGhlIG1vc3QgcmVjZW50bHktYWRkZWQgY2hpbGQncyBlbmRUaW1lIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gIGksXG4gICAgICBvZmZzZXQsXG4gICAgICBpc1BlcmNlbnQ7XG5cbiAgaWYgKF9pc1N0cmluZyhwb3NpdGlvbikgJiYgKGlzTmFOKHBvc2l0aW9uKSB8fCBwb3NpdGlvbiBpbiBsYWJlbHMpKSB7XG4gICAgLy9pZiB0aGUgc3RyaW5nIGlzIGEgbnVtYmVyIGxpa2UgXCIxXCIsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGEgbGFiZWwgd2l0aCB0aGF0IG5hbWUsIG90aGVyd2lzZSBpbnRlcnByZXQgaXQgYXMgYSBudW1iZXIgKGFic29sdXRlIHZhbHVlKS5cbiAgICBvZmZzZXQgPSBwb3NpdGlvbi5jaGFyQXQoMCk7XG4gICAgaXNQZXJjZW50ID0gcG9zaXRpb24uc3Vic3RyKC0xKSA9PT0gXCIlXCI7XG4gICAgaSA9IHBvc2l0aW9uLmluZGV4T2YoXCI9XCIpO1xuXG4gICAgaWYgKG9mZnNldCA9PT0gXCI8XCIgfHwgb2Zmc2V0ID09PSBcIj5cIikge1xuICAgICAgaSA+PSAwICYmIChwb3NpdGlvbiA9IHBvc2l0aW9uLnJlcGxhY2UoLz0vLCBcIlwiKSk7XG4gICAgICByZXR1cm4gKG9mZnNldCA9PT0gXCI8XCIgPyByZWNlbnQuX3N0YXJ0IDogcmVjZW50LmVuZFRpbWUocmVjZW50Ll9yZXBlYXQgPj0gMCkpICsgKHBhcnNlRmxvYXQocG9zaXRpb24uc3Vic3RyKDEpKSB8fCAwKSAqIChpc1BlcmNlbnQgPyAoaSA8IDAgPyByZWNlbnQgOiBwZXJjZW50QW5pbWF0aW9uKS50b3RhbER1cmF0aW9uKCkgLyAxMDAgOiAxKTtcbiAgICB9XG5cbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHBvc2l0aW9uIGluIGxhYmVscyB8fCAobGFiZWxzW3Bvc2l0aW9uXSA9IGNsaXBwZWREdXJhdGlvbik7XG4gICAgICByZXR1cm4gbGFiZWxzW3Bvc2l0aW9uXTtcbiAgICB9XG5cbiAgICBvZmZzZXQgPSBwYXJzZUZsb2F0KHBvc2l0aW9uLmNoYXJBdChpIC0gMSkgKyBwb3NpdGlvbi5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChpc1BlcmNlbnQgJiYgcGVyY2VudEFuaW1hdGlvbikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC8gMTAwICogKF9pc0FycmF5KHBlcmNlbnRBbmltYXRpb24pID8gcGVyY2VudEFuaW1hdGlvblswXSA6
12666IHBlcmNlbnRBbmltYXRpb24pLnRvdGFsRHVyYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaSA+IDEgPyBfcGFyc2VQb3NpdGlvbihhbmltYXRpb24sIHBvc2l0aW9uLnN1YnN0cigwLCBpIC0gMSksIHBlcmNlbnRBbmltYXRpb24pICsgb2Zmc2V0IDogY2xpcHBlZER1cmF0aW9uICsgb2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uID09IG51bGwgPyBjbGlwcGVkRHVyYXRpb24gOiArcG9zaXRpb247XG59LFxuICAgIF9jcmVhdGVUd2VlblR5cGUgPSBmdW5jdGlvbiBfY3JlYXRlVHdlZW5UeXBlKHR5cGUsIHBhcmFtcywgdGltZWxpbmUpIHtcbiAgdmFyIGlzTGVnYWN5ID0gX2lzTnVtYmVyKHBhcmFtc1sxXSksXG4gICAgICB2YXJzSW5kZXggPSAoaXNMZWdhY3kgPyAyIDogMSkgKyAodHlwZSA8IDIgPyAwIDogMSksXG4gICAgICB2YXJzID0gcGFyYW1zW3ZhcnNJbmRleF0sXG4gICAgICBpclZhcnMsXG4gICAgICBwYXJlbnQ7XG5cbiAgaXNMZWdhY3kgJiYgKHZhcnMuZHVyYXRpb24gPSBwYXJhbXNbMV0pO1xuICB2YXJzLnBhcmVudCA9IHRpbWVsaW5lO1xuXG4gIGlmICh0eXBlKSB7XG4gICAgaXJWYXJzID0gdmFycztcbiAgICBwYXJlbnQgPSB0aW1lbGluZTtcblxuICAgIHdoaWxlIChwYXJlbnQgJiYgIShcImltbWVkaWF0ZVJlbmRlclwiIGluIGlyVmFycykpIHtcbiAgICAgIC8vIGluaGVyaXRhbmNlIGhhc24ndCBoYXBwZW5lZCB5ZXQsIGJ1dCBzb21lb25lIG1heSBoYXZlIHNldCBhIGRlZmF1bHQgaW4gYW4gYW5jZXN0b3IgdGltZWxpbmUuIFdlIGNvdWxkIGRvIHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gX2lzTm90RmFsc2UoX2luaGVyaXREZWZhdWx0cyh2YXJzKS5pbW1lZGlhdGVSZW5kZXIpIGJ1dCB0aGF0J2QgZXhhY3QgYSBzbGlnaHQgcGVyZm9ybWFuY2UgcGVuYWx0eSBiZWNhdXNlIF9pbmhlcml0RGVmYXVsdHMoKSBhbHNvIHJ1bnMgaW4gdGhlIFR3ZWVuIGNvbnN0cnVjdG9yLiBXZSdyZSBwYXlpbmcgYSBzbWFsbCBrYiBwcmljZSBoZXJlIHRvIGdhaW4gc3BlZWQuXG4gICAgICBpclZhcnMgPSBwYXJlbnQudmFycy5kZWZhdWx0cyB8fCB7fTtcbiAgICAgIHBhcmVudCA9IF9pc05vdEZhbHNlKHBhcmVudC52YXJzLmluaGVyaXQpICYmIHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgdmFycy5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZShpclZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcbiAgICB0eXBlIDwgMiA/IHZhcnMucnVuQmFja3dhcmRzID0gMSA6
12666IHZhcnMuc3RhcnRBdCA9IHBhcmFtc1t2YXJzSW5kZXggLSAxXTsgLy8gXCJmcm9tXCIgdmFyc1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUd2VlbihwYXJhbXNbMF0sIHZhcnMsIHBhcmFtc1t2YXJzSW5kZXggKyAxXSk7XG59LFxuICAgIF9jb25kaXRpb25hbFJldHVybiA9IGZ1bmN0aW9uIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuYykge1xuICByZXR1cm4gdmFsdWUgfHwgdmFsdWUgPT09IDAgPyBmdW5jKHZhbHVlKSA6IGZ1bmM7XG59LFxuICAgIF9jbGFtcCA9IGZ1bmN0aW9uIF9jbGFtcChtaW4sIG1heCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIDwgbWluID8gbWluIDogdmFsdWUgPiBtYXggPyBtYXggOiB2YWx1ZTtcbn0sXG4gICAgZ2V0VW5pdCA9IGZ1bmN0aW9uIGdldFVuaXQodmFsdWUsIHYpIHtcbiAgcmV0dXJuICFfaXNTdHJpbmcodmFsdWUpIHx8ICEodiA9IF91bml0RXhwLmV4ZWModmFsdWUpKSA/IFwiXCIgOiB2WzFdO1xufSxcbiAgICAvLyBub3RlOiBwcm90ZWN0IGFnYWluc3QgcGFkZGVkIG51bWJlcnMgYXMgc3RyaW5ncywgbGlrZSBcIjEwMC4xMDBcIi4gVGhhdCBzaG91bGRuJ3QgcmV0dXJuIFwiMDBcIiBhcyB0aGUgdW5pdC4gSWYgaXQncyBudW1lcmljLCByZXR1cm4gbm8gdW5pdC5cbmNsYW1wID0gZnVuY3Rpb24gY2xhbXAobWluLCBtYXgsIHZhbHVlKSB7XG4gIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIF9jbGFtcChtaW4sIG1heCwgdik7XG4gIH0pO1xufSxcbiAgICBfc2xpY2UgPSBbXS5zbGljZSxcbiAgICBfaXNBcnJheUxpa2UgPSBmdW5jdGlvbiBfaXNBcnJheUxpa2UodmFsdWUsIG5vbkVtcHR5KSB7XG4gIHJldHVybiB2YWx1ZSAmJiBfaXNPYmplY3QodmFsdWUpICYmIFwibGVuZ3RoXCIgaW4gdmFsdWUgJiYgKCFub25FbXB0eSAmJiAhdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCAtIDEgaW4gdmFsdWUgJiYgX2lzT2JqZWN0KHZhbHVlWzBdKSkgJiYgIXZhbHVlLm5vZGVUeXBlICYmIHZhbHVlICE9PSBfd2luO1xufSxcbiAgICBfZmxhdHRlbiA9IGZ1bmN0aW9uIF9mbGF0dGVuKGFyLCBsZWF2ZVN0cmluZ3MsIGFjY3VtdWxhdG9yKSB7XG4gIGlmIChhY2N1bXVsYXRvciA9PT0gdm9pZCAwKSB7XG4gICAgYWNjdW11bGF0b3IgPSBbXTtcbiAgfVxuXG4gIHJldHVybiBhci5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBfYWNjdW11bGF0b3I7XG5cbiAgICByZXR1cm4gX2lzU3RyaW5nKHZhbHVlKSAmJiAhbGVhdmVTdHJpbmdzIHx8IF9pc0FycmF5TGlrZSh2YWx1ZSwgMSkgPyAoX2FjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IpLnB1c2guYXBwbHkoX2FjY3VtdWxhdG9yLCB0b0FycmF5KHZhbHVlKSkgOiBhY2N1bXVsYXRvci5wdXNoKHZhbHVlKTtcbiAgfSkgfHwgYWNjdW11bGF0b3I7XG59LFxuICAgIC8vIHRha2VzIGFueSB2YWx1ZSBhbmQgcmV0dXJucyBhbiBBcnJheS4gSWYgaXQncyBhIHN0cmluZyAoYW5kIGxlYXZlU3RyaW5ncyBpc24ndCB0cnVlKSwgaXQnbGwgdXNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKSBhbmQgY29udmVydCB0aGF0IHRvIGFuIGFycmF5LiBJdCdsbCBhbHNvIGFjY2VwdCBpdGVyYWJsZXMgbGlrZSBqUXVlcnkgb2JqZWN0cy5cbnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KHZhbHVlLCBzY29wZSwgbGVhdmVTdHJpbmdzKSB7XG4gIHJldHVybiBfY29udGV4dCAmJiAhc2NvcGUgJiYgX2NvbnRleHQuc2VsZWN0b3IgPyBfY29udGV4dC5zZWxlY3Rvcih2YWx1ZSkgOiBfaXNTdHJpbmcodmFsdWUpICYmICFsZWF2ZVN0cmluZ3MgJiYgKF9jb3JlSW5pdHRlZCB8fCAhX3dha2UoKSkgPyBfc2xpY2UuY2FsbCgoc2NvcGUgfHwgX2RvYykucXVlcnlTZWxlY3RvckFsbCh2YWx1ZSksIDApIDogX2lzQXJyYXkodmFsdWUpID8gX2ZsYXR0ZW4odmFsdWUsIGxlYXZlU3RyaW5ncykgOiBfaXNBcnJheUxpa2UodmFsdWUpID8gX3NsaWNlLmNhbGwodmFsdWUsIDApIDogdmFsdWUgPyBbdmFsdWVdIDogW107XG59LFxuICAgIHNlbGVjdG9yID0gZnVuY3Rpb24gc2VsZWN0b3IodmFsdWUpIHtcbiAgdmFsdWUgPSB0b0FycmF5KHZhbHVlKVswXSB8fCBfd2FybihcIkludmFsaWQgc2NvcGVcIikgfHwge307XG4gIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgIHZhciBlbCA9IHZhbHVlLmN1cnJlbnQgfHwgdmFsdWUubmF0aXZlRWxlbWVudCB8fCB2YWx1ZTtcbiAgICByZXR1cm4gdG9BcnJheSh2LCBlbC5xdWVyeVNlbGVjdG9yQWxsID8gZWwgOiBlbCA9PT0gdmFsdWUgPyBfd2FybihcIkludmFsaWQgc2NvcGVcIikgfHwgX2RvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpIDogdmFsdWUpO1xuICB9O1xufSxcbiAgICBzaHVmZmxlID0gZnVuY3Rpb24gc2h1ZmZsZShhKSB7XG4gIHJldHVybiBhLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAuNSAtIE1hdGgucmFuZG9tKCk7XG4gIH0pO1xufSxcbiAgICAvLyBhbHRlcm5hdGl2ZSB0aGF0J3MgYSBiaXQgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmx5IGRpdmVyc2UgYnV0IGJpZ2dlcjogICBmb3IgKGxldCBqLCB2LCBpID0gYS5sZW5ndGg7IGk7IGogPSAoTWF0aC5yYW5kb20oKSAqIGkpIHwgMCwgdiA9IGFbLS1pXSwgYVtpXSA9IGFbal0sIGFbal0gPSB2KTsgcmV0dXJuIGE7XG4vLyBmb3IgZGlzdHJpYnV0aW5nIHZhbHVlcyBhY3Jvc3MgYW4gQXJyYXkuIENhbiBhY2NlcHQgYSBudW1iZXIsIGEgZnVuY3Rpb24gb3IgKG1vc3QgY29tbW9ubHkpIGFuIG9iamVjdCB3aGljaCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6IHtiYXNlLCBhbW91bnQsIGZyb20sIGVhc2UsIGdyaWQsIGF4aXMsIGxlbmd0aCwgZWFjaH0uIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOiBpbmRleCwgdGFyZ2V0LCBhcnJheS5cbmRpc3RyaWJ1dGUgPSBmdW5jdGlvbiBkaXN0cmlidXRlKHYpIHtcbiAgaWYgKF9pc0Z1bmN0aW9uKHYpKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICB2YXIgdmFycyA9IF9pc09iamVjdCh2KSA/IHYgOiB7XG4gICAgZWFjaDogdlxuICB9LFxuICAgICAgLy9uOjEgaXMganVzdCB0byBpbmRpY2F0ZSB2IHdhcyBhIG51bWJlcjsgd2UgbGV2ZXJhZ2UgdGhhdCBsYXRlciB0byBzZXQgdiBhY2NvcmRpbmcgdG8gdGhlIGxlbmd0aCB3ZSBnZXQuIElmIGEgbnVtYmVyIGlzIHBhc3NlZCBpbiwgd2UgdHJlYXQgaXQgbGlrZSB0aGUgb2xkIHN0YWdn
12666ZXIgdmFsdWUgd2hlcmUgMC4xLCBmb3IgZXhhbXBsZSwgd291bGQgbWVhbiB0aGF0IHRoaW5ncyB3b3VsZCBiZSBkaXN0cmlidXRlZCB3aXRoIDAuMSBiZXR3ZWVuIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gYSB0b3RhbCBcImFtb3VudFwiIHRoYXQncyBjaHVua2VkIG91dCBhbW9uZyB0aGVtIGFsbC5cbiAgZWFzZSA9IF9wYXJzZUVhc2UodmFycy5lYXNlKSxcbiAgICAgIGZyb20gPSB2YXJzLmZyb20gfHwgMCxcbiAgICAgIGJhc2UgPSBwYXJzZUZsb2F0KHZhcnMuYmFzZSkgfHwgMCxcbiAgICAgIGNhY2hlID0ge30sXG4gICAgICBpc0RlY2ltYWwgPSBmcm9tID4gMCAmJiBmcm9tIDwgMSxcbiAgICAgIHJhdGlvcyA9IGlzTmFOKGZyb20pIHx8IGlzRGVjaW1hbCxcbiAgICAgIGF4aXMgPSB2YXJzLmF4aXMsXG4gICAgICByYXRpb1ggPSBmcm9tLFxuICAgICAgcmF0aW9ZID0gZnJvbTtcblxuICBpZiAoX2lzU3RyaW5nKGZyb20pKSB7XG4gICAgcmF0aW9YID0gcmF0aW9ZID0ge1xuICAgICAgY2VudGVyOiAuNSxcbiAgICAgIGVkZ2VzOiAuNSxcbiAgICAgIGVuZDogMVxuICAgIH1bZnJvbV0gfHwgMDtcbiAgfSBlbHNlIGlmICghaXNEZWNpbWFsICYmIHJhdGlvcykge1xuICAgIHJhdGlvWCA9IGZyb21bMF07XG4gICAgcmF0aW9ZID0gZnJvbVsxXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoaSwgdGFyZ2V0LCBhKSB7XG4gICAgdmFyIGwgPSAoYSB8fCB2YXJzKS5sZW5ndGgsXG4gICAgICAgIGRpc3RhbmNlcyA9IGNhY2hlW2xdLFxuICAgICAgICBvcmlnaW5YLFxuICAgICAgICBvcmlnaW5ZLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBkLFxuICAgICAgICBqLFxuICAgICAgICBtYXgsXG4gICAgICAgIG1pbixcbiAgICAgICAgd3JhcEF0O1xuXG4gICAgaWYgKCFkaXN0YW5jZXMpIHtcbiAgICAgIHdyYXBBdCA9IHZhcnMuZ3JpZCA9PT0gXCJhdXRvXCIgPyAwIDogKHZhcnMuZ3JpZCB8fCBbMSwgX2JpZ051bV0pWzFdO1xuXG4gICAgICBpZiAoIXdyYXBBdCkge1xuICAgICAgICBtYXggPSAtX2JpZ051bTtcblxuICAgICAgICB3aGlsZSAobWF4IDwgKG1heCA9IGFbd3JhcEF0KytdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpICYmIHdyYXBBdCA8IGwpIHt9XG5cbiAgICAgICAgd3JhcEF0IDwgbCAmJiB3cmFwQXQtLTtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VzID0gY2FjaGVbbF0gPSBbXTtcbiAgICAgIG9yaWdpblggPSByYXRpb3MgPyBNYXRoLm1pbih3cmFwQXQsIGwpICogcmF0aW9YIC0gLjUgOiBmcm9tICUgd3JhcEF0O1xuICAgICAgb3JpZ2luWSA9IHdyYXBBdCA9PT0gX2JpZ051bSA/IDAgOiByYXRpb3MgPyBsICogcmF0aW9ZIC8gd3JhcEF0IC0gLjUgOiBmcm9tIC8gd3JhcEF0IHwgMDtcbiAgICAgIG1heCA9IDA7XG4gICAgICBtaW4gPSBfYmlnTnVtO1xuXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbDsgaisrKSB7XG4gICAgICAgIHggPSBqICUgd3JhcEF0IC0gb3JpZ2luWDtcbiAgICAgICAgeSA9IG9yaWdpblkgLSAoaiAvIHdyYXBBdCB8IDApO1xuICAgICAgICBkaXN0YW5jZXNbal0gPSBkID0gIWF4aXMgPyBfc3FydCh4ICogeCArIHkgKiB5KSA6IE1hdGguYWJzKGF4aXMgPT09IFwieVwiID8geSA6IHgpO1xuICAgICAgICBkID4gbWF4ICYmIChtYXggPSBkKTtcbiAgICAgICAgZCA8IG1pbiAmJiAobWluID0gZCk7XG4gICAgICB9XG5cbiAgICAgIGZyb20gPT09IFwicmFuZG9tXCIgJiYgc2h1ZmZsZShkaXN0YW5jZXMpO1xuICAgICAgZGlzdGFuY2VzLm1heCA9IG1heCAtIG1pbjtcbiAgICAgIGRpc3RhbmNlcy5taW4gPSBtaW47XG4gICAgICBkaXN0YW5jZXMudiA9IGwgPSAocGFyc2VGbG9hdCh2YXJzLmFtb3VudCkgfHwgcGFyc2VGbG9hdCh2YXJzLmVhY2gpICogKHdyYXBBdCA+IGwgPyBsIC0gMSA6ICFheGlzID8gTWF0aC5tYXgod3JhcEF0LCBsIC8gd3JhcEF0KSA6IGF4aXMgPT09IFwieVwiID8gbCAvIHdyYXBBdCA6IHdyYXBBdCkgfHwgMCkgKiAoZnJvbSA9PT0gXCJlZGdlc1wiID8gLTEgOiAxKTtcbiAgICAgIGRpc3RhbmNlcy5iID0gbCA8IDAgPyBiYXNlIC0gbCA6IGJhc2U7XG4gICAgICBkaXN0YW5jZXMudSA9IGdldFVuaXQodmFycy5hbW91bnQgfHwgdmFycy5lYWNoKSB8fCAwOyAvL3VuaXRcblxuICAgICAgZWFzZSA9IGVhc2UgJiYgbCA8IDAgPyBfaW52ZXJ0RWFzZShlYXNlKSA6IGVhc2U7XG4gICAgfVxuXG4gICAgbCA9IChkaXN0YW5jZXNbaV0gLSBkaXN0YW5jZXMubWluKSAvIGRpc3RhbmNlcy5tYXggfHwgMDtcbiAgICByZXR1cm4gX3JvdW5kUHJlY2lzZShkaXN0YW5jZXMuYiArIChlYXNlID8gZWFzZShsKSA6IGwpICogZGlzdGFuY2VzLnYpICsgZGlzdGFuY2VzLnU7IC8vcm91bmQgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXG4gIH07XG59LFxuICAgIF9yb3VuZE1vZGlmaWVyID0gZnVuY3Rpb24gX3JvdW5kTW9kaWZpZXIodikge1xuICAvL3Bhc3MgaW4gMC4xIGdldCBhIGZ1bmN0aW9uIHRoYXQnbGwgcm91bmQgdG8gdGhlIG5lYXJlc3QgdGVudGgsIG9yIDUgdG8gcm91bmQgdG8gdGhlIGNsb3Nlc3QgNSwgb3IgMC4wMDEgdG8gdGhlIGNsb3Nlc3QgMTAwMHRoLCBldGMuXG4gIHZhciBwID0gTWF0aC5wb3coMTAsICgodiArIFwiXCIpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGgpOyAvL3RvIGF2b2lkIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChsaWtlIDI0ICogMC4xID09IDIuNDAwMDAwMDAwMDAwMDAwNCksIHdlIGNob3Agb2ZmIGF0IGEgc3BlY2lmaWMgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIChtdWNoIGZhc3RlciB0aGFuIHRvRml4ZWQoKSlcblxuICByZXR1cm4gZnVuY3Rpb24gKHJhdykge1xuICAgIHZhciBuID0gX3JvdW5kUHJlY2lzZShNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmF3KSAvIHYpICogdiAqIHApO1xuXG4gICAgcmV0dXJuIChuIC0gbiAlIDEpIC8gcCArIChfaXNOdW1iZXIocmF3KSA/IDAgOiBnZXRVbml0KHJhdykpOyAvLyBuIC0gbiAlIDEgcmVwbGFjZXMgTWF0aC5mbG9vcigpIGluIG9yZGVyIHRvIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMgcHJvcGVybHkuIEZvciBleGFtcGxlLCBNYXRoLmZsb29yKC0xNTAuMDAwMDAwMDAwMDAwMDMpIGlzIDE1MS
12666FcbiAgfTtcbn0sXG4gICAgc25hcCA9IGZ1bmN0aW9uIHNuYXAoc25hcFRvLCB2YWx1ZSkge1xuICB2YXIgaXNBcnJheSA9IF9pc0FycmF5KHNuYXBUbyksXG4gICAgICByYWRpdXMsXG4gICAgICBpczJEO1xuXG4gIGlmICghaXNBcnJheSAmJiBfaXNPYmplY3Qoc25hcFRvKSkge1xuICAgIHJhZGl1cyA9IGlzQXJyYXkgPSBzbmFwVG8ucmFkaXVzIHx8IF9iaWdOdW07XG5cbiAgICBpZiAoc25hcFRvLnZhbHVlcykge1xuICAgICAgc25hcFRvID0gdG9BcnJheShzbmFwVG8udmFsdWVzKTtcblxuICAgICAgaWYgKGlzMkQgPSAhX2lzTnVtYmVyKHNuYXBUb1swXSkpIHtcbiAgICAgICAgcmFkaXVzICo9IHJhZGl1czsgLy9wZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gc28gd2UgZG9uJ3QgaGF2ZSB0byBNYXRoLnNxcnQoKSBpbiB0aGUgbG9vcC5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc25hcFRvID0gX3JvdW5kTW9kaWZpZXIoc25hcFRvLmluY3JlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgIWlzQXJyYXkgPyBfcm91bmRNb2RpZmllcihzbmFwVG8pIDogX2lzRnVuY3Rpb24oc25hcFRvKSA/IGZ1bmN0aW9uIChyYXcpIHtcbiAgICBpczJEID0gc25hcFRvKHJhdyk7XG4gICAgcmV0dXJuIE1hdGguYWJzKGlzMkQgLSByYXcpIDw9IHJhZGl1cyA/IGlzMkQgOiByYXc7XG4gIH0gOiBmdW5jdGlvbiAocmF3KSB7XG4gICAgdmFyIHggPSBwYXJzZUZsb2F0KGlzMkQgPyByYXcueCA6IHJhdyksXG4gICAgICAgIHkgPSBwYXJzZUZsb2F0KGlzMkQgPyByYXcueSA6IDApLFxuICAgICAgICBtaW4gPSBfYmlnTnVtLFxuICAgICAgICBjbG9zZXN0ID0gMCxcbiAgICAgICAgaSA9IHNuYXBUby5sZW5ndGgsXG4gICAgICAgIGR4LFxuICAgICAgICBkeTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmIChpczJEKSB7XG4gICAgICAgIGR4ID0gc25hcFRvW2ldLnggLSB4O1xuICAgICAgICBkeSA9IHNuYXBUb1tpXS55IC0geTtcbiAgICAgICAgZHggPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGR4ID0gTWF0aC5hYnMoc25hcFRvW2ldIC0geCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkeCA8IG1pbikge1xuICAgICAgICBtaW4gPSBkeDtcbiAgICAgICAgY2xvc2VzdCA9IGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2VzdCA9ICFyYWRpdXMgfHwgbWluIDw9IHJhZGl1cyA/IHNuYXBUb1tjbG9zZXN0XSA6IHJhdztcbiAgICByZXR1cm4gaXMyRCB8fCBjbG9zZXN0ID09PSByYXcgfHwgX2lzTnVtYmVyKHJhdykgPyBjbG9zZXN0IDogY2xvc2VzdCArIGdldFVuaXQocmF3KTtcbiAgfSk7XG59LFxuICAgIHJhbmRvbSA9IGZ1bmN0aW9uIHJhbmRvbShtaW4sIG1heCwgcm91bmRpbmdJbmNyZW1lbnQsIHJldHVybkZ1bmN0aW9uKSB7XG4gIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4oX2lzQXJyYXkobWluKSA/ICFtYXggOiByb3VuZGluZ0luY3JlbWVudCA9PT0gdHJ1ZSA/ICEhKHJvdW5kaW5nSW5jcmVtZW50ID0gMCkgOiAhcmV0dXJuRnVuY3Rpb24sIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2lzQXJyYXkobWluKSA/IG1pblt+fihNYXRoLnJhbmRvbSgpICogbWluLmxlbmd0aCldIDogKHJvdW5kaW5nSW5jcmVtZW50ID0gcm91bmRpbmdJbmNyZW1lbnQgfHwgMWUtNSkgJiYgKHJldHVybkZ1bmN0aW9uID0gcm91bmRpbmdJbmNyZW1lbnQgPCAxID8gTWF0aC5wb3coMTAsIChyb3VuZGluZ0luY3JlbWVudCArIFwiXCIpLmxlbmd0aCAtIDIpIDogMSkgJiYgTWF0aC5mbG9vcihNYXRoLnJvdW5kKChtaW4gLSByb3VuZGluZ0luY3JlbWVudCAvIDIgKyBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIHJvdW5kaW5nSW5jcmVtZW50ICogLjk5KSkgLyByb3VuZGluZ0luY3JlbWVudCkgKiByb3VuZGluZ0luY3JlbWVudCAqIHJldHVybkZ1bmN0aW9uKSAvIHJldHVybkZ1bmN0aW9uO1xuICB9KTtcbn0sXG4gICAgcGlwZSA9IGZ1bmN0aW9uIHBpcGUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jdGlvbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3Rpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbnMucmVkdWNlKGZ1bmN0aW9uICh2LCBmKSB7XG4gICAgICByZXR1cm4gZih2KTtcbiAgICB9LCB2YWx1ZSk7XG4gIH07XG59LFxuICAgIHVuaXRpemUgPSBmdW5jdGlvbiB1bml0aXplKGZ1bmMsIHVuaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHBhcnNlRmxvYXQodmFsdWUpKSArICh1bml0IHx8IGdldFVuaXQodmFsdWUpKTtcbiAgfTtcbn0sXG4gICAgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKG1pbiwgbWF4LCB2YWx1ZSkge1xuICByZXR1cm4gbWFwUmFuZ2UobWluLCBtYXgsIDAsIDEsIHZhbHVlKTtcbn0sXG4gICAgX3dyYXBBcnJheSA9IGZ1bmN0aW9uIF93cmFwQXJyYXkoYSwgd3JhcHBlciwgdmFsdWUpIHtcbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgcmV0dXJuIGFbfn53cmFwcGVyKGluZGV4KV07XG4gIH0pO1xufSxcbiAgICB3cmFwID0gZnVuY3Rpb24gd3JhcChtaW4sIG1heCwgdmFsdWUpIHtcbiAgLy8gTk9URTogd3JhcCgpIENBTk5PVCBiZSBhbiBhcnJvdyBmdW5jdGlvbiEgQSB2ZXJ5IG9kZCBjb21waWxpbmcgYnVnIGNhdXNlcyBwcm9ibGVtcyAodW5yZWxhdGVkIHRvIEdTQVApLlxuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG4gIHJldHVybiBfaXNBcnJheShtaW4pID8gX3dyYXBBcnJheShtaW4sIHdyYXAoMCwgbWluLmxlbmd0aCksIG1heCkgOiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiAocmFuZ2UgKyAodmFsdWUgLSBtaW4pICUgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gIH0pO1xufSxcbiAgICB3cmFwWW95byA9IGZ1bmN0aW9uIHdyYXBZb3lvKG1pbiwgbWF4LCB2YWx1ZSkge1xuICB2YXIgcmFuZ2UgPSBtYXggLSBtaW4sXG4gICAgICB0b3RhbCA9IHJhbmdlICogMjtcbiAgcmV0dXJuIF9pc0FycmF5KG1pbikgPyBfd3JhcEFycmF5KG1pbiwgd3JhcFlveW8oMCwgbWluLmxlbmd0aCAtIDEpLCBtYXgpIDogX2NvbmRpdGlvbmFsUmV0dXJuKHZhbHVlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YWx1ZSA9ICh0b3RhbCArICh2YWx1ZSAtIG1pbikgJSB0b3RhbCkgJSB0b3RhbCB8fCAwO1xuICAgIHJldHVybi
12666BtaW4gKyAodmFsdWUgPiByYW5nZSA/IHRvdGFsIC0gdmFsdWUgOiB2YWx1ZSk7XG4gIH0pO1xufSxcbiAgICBfcmVwbGFjZVJhbmRvbSA9IGZ1bmN0aW9uIF9yZXBsYWNlUmFuZG9tKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZShfcmFuZG9tRXhwLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAvL3JlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiByYW5kb20oLi4uKSBpbiBhIHN0cmluZyB3aXRoIHRoZSBjYWxjdWxhdGVkIHJhbmRvbSB2YWx1ZS4gY2FuIGJlIGEgcmFuZ2UgbGlrZSByYW5kb20oLTEwMCwgMTAwLCA1KSBvciBhbiBhcnJheSBsaWtlIHJhbmRvbShbMCwgMTAwLCA1MDBdKVxuICAgIHZhciBhckluZGV4ID0gbWF0Y2guaW5kZXhPZihcIltcIikgKyAxLFxuICAgICAgICB2YWx1ZXMgPSBtYXRjaC5zdWJzdHJpbmcoYXJJbmRleCB8fCA3LCBhckluZGV4ID8gbWF0Y2guaW5kZXhPZihcIl1cIikgOiBtYXRjaC5sZW5ndGggLSAxKS5zcGxpdChfY29tbWFEZWxpbUV4cCk7XG4gICAgcmV0dXJuIHJhbmRvbShhckluZGV4ID8gdmFsdWVzIDogK3ZhbHVlc1swXSwgYXJJbmRleCA/IDAgOiArdmFsdWVzWzFdLCArdmFsdWVzWzJdIHx8IDFlLTUpO1xuICB9KTtcbn0sXG4gICAgbWFwUmFuZ2UgPSBmdW5jdGlvbiBtYXBSYW5nZShpbk1pbiwgaW5NYXgsIG91dE1pbiwgb3V0TWF4LCB2YWx1ZSkge1xuICB2YXIgaW5SYW5nZSA9IGluTWF4IC0gaW5NaW4sXG4gICAgICBvdXRSYW5nZSA9IG91dE1heCAtIG91dE1pbjtcbiAgcmV0dXJuIF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIG91dE1pbiArICgodmFsdWUgLSBpbk1pbikgLyBpblJhbmdlICogb3V0UmFuZ2UgfHwgMCk7XG4gIH0pO1xufSxcbiAgICBpbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGludGVycG9sYXRlKHN0YXJ0LCBlbmQsIHByb2dyZXNzLCBtdXRhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc05hTihzdGFydCArIGVuZCkgPyAwIDogZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gKDEgLSBwKSAqIHN0YXJ0ICsgcCAqIGVuZDtcbiAgfTtcblxuICBpZiAoIWZ1bmMpIHtcbiAgICB2YXIgaXNTdHJpbmcgPSBfaXNTdHJpbmcoc3RhcnQpLFxuICAgICAgICBtYXN0ZXIgPSB7fSxcbiAgICAgICAgcCxcbiAgICAgICAgaSxcbiAgICAgICAgaW50ZXJwb2xhdG9ycyxcbiAgICAgICAgbCxcbiAgICAgICAgaWw7XG5cbiAgICBwcm9ncmVzcyA9PT0gdHJ1ZSAmJiAobXV0YXRlID0gMSkgJiYgKHByb2dyZXNzID0gbnVsbCk7XG5cbiAgICBpZiAoaXNTdHJpbmcpIHtcbiAgICAgIHN0YXJ0ID0ge1xuICAgICAgICBwOiBzdGFydFxuICAgICAgfTtcbiAgICAgIGVuZCA9IHtcbiAgICAgICAgcDogZW5kXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX2lzQXJyYXkoc3RhcnQpICYmICFfaXNBcnJheShlbmQpKSB7XG4gICAgICBpbnRlcnBvbGF0b3JzID0gW107XG4gICAgICBsID0gc3RhcnQubGVuZ3RoO1xuICAgICAgaWwgPSBsIC0gMjtcblxuICAgICAgZm9yIChpID0gMTsgaSA8IGw7IGkrKykge1xuICAgICAgICBpbnRlcnBvbGF0b3JzLnB1c2goaW50ZXJwb2xhdGUoc3RhcnRbaSAtIDFdLCBzdGFydFtpXSkpOyAvL2J1aWxkIHRoZSBpbnRlcnBvbGF0b3JzIHVwIGZyb250IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHNvIHRoYXQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIG1hbnkgdGltZXMsIGl0IGNhbiBqdXN0IHJldXNlIHRoZW0uXG4gICAgICB9XG5cbiAgICAgIGwtLTtcblxuICAgICAgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMocCkge1xuICAgICAgICBwICo9IGw7XG4gICAgICAgIHZhciBpID0gTWF0aC5taW4oaWwsIH5+cCk7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0b3JzW2ldKHAgLSBpKTtcbiAgICAgIH07XG5cbiAgICAgIHByb2dyZXNzID0gZW5kO1xuICAgIH0gZWxzZSBpZiAoIW11dGF0ZSkge1xuICAgICAgc3RhcnQgPSBfbWVyZ2UoX2lzQXJyYXkoc3RhcnQpID8gW10gOiB7fSwgc3RhcnQpO1xuICAgIH1cblxuICAgIGlmICghaW50ZXJwb2xhdG9ycykge1xuICAgICAgZm9yIChwIGluIGVuZCkge1xuICAgICAgICBfYWRkUHJvcFR3ZWVuLmNhbGwobWFzdGVyLCBzdGFydCwgcCwgXCJnZXRcIiwgZW5kW3BdKTtcbiAgICAgIH1cblxuICAgICAgZnVuYyA9IGZ1bmN0aW9uIGZ1bmMocCkge1xuICAgICAgICByZXR1cm4gX3JlbmRlclByb3BUd2VlbnMocCwgbWFzdGVyKSB8fCAoaXNTdHJpbmcgPyBzdGFydC5wIDogc3RhcnQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2NvbmRpdGlvbmFsUmV0dXJuKHByb2dyZXNzLCBmdW5jKTtcbn0sXG4gICAgX2dldExhYmVsSW5EaXJlY3Rpb24gPSBmdW5jdGlvbiBfZ2V0TGFiZWxJbkRpcmVjdGlvbih0aW1lbGluZSwgZnJvbVRpbWUsIGJhY2t3YXJkKSB7XG4gIC8vdXNlZCBmb3IgbmV4dExhYmVsKCkgYW5kIHByZXZpb3VzTGFiZWwoKVxuICB2YXIgbGFiZWxzID0gdGltZWxpbmUubGFiZWxzLFxuICAgICAgbWluID0gX2JpZ051bSxcbiAgICAgIHAsXG4gICAgICBkaXN0YW5jZSxcbiAgICAgIGxhYmVsO1xuXG4gIGZvciAocCBpbiBsYWJlbHMpIHtcbiAgICBkaXN0YW5jZSA9IGxhYmVsc1twXSAtIGZyb21UaW1lO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgMCA9PT0gISFiYWNrd2FyZCAmJiBkaXN0YW5jZSAmJiBtaW4gPiAoZGlzdGFuY2UgPSBNYXRoLmFicyhkaXN0YW5jZSkpKSB7XG4gICAgICBsYWJlbCA9IHA7XG4gICAgICBtaW4gPSBkaXN0YW5jZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGFiZWw7XG59LFxuICAgIF9jYWxsYmFjayA9IGZ1bmN0aW9uIF9jYWxsYmFjayhhbmltYXRpb24sIHR5cGUsIGV4ZWN1dGVMYXp5Rmlyc3QpIHtcbiAgdmFyIHYgPSBhbmltYXRpb24udmFycyxcbiAgICAgIGNhbGxiYWNrID0gdlt0eXBlXSxcbiAgICAgIHByZXZDb250ZXh0ID0gX2NvbnRleHQsXG4gICAgICBjb250ZXh0ID0gYW5pbWF0aW9uLl9jdHgsXG4gICAgICBwYXJhbXMsXG4gICAgICBzY29wZSxcbiAgICAgIHJlc3VsdDtcblxuICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGFyYW1zID0gdlt0eXBlICsgXCJQYXJhbXNcIl07XG4gIHNjb3BlID0gdi5jYWxsYmFja1Njb3BlIHx8IGFuaW1hdGlvbjtcbiAgZXhlY3V0ZUxhenlGaXJzdCAmJiBfbGF6eVR3ZWVucy5sZW5ndGggJiYgX2xhenlSZW5kZXIoKTsgLy9pbiBjYXNlIHJlbmRlcmluZyBjYXVzZWQgYW55IHR3ZWVucyB0byBsYXp5LWluaXQsIHdlIHNob3VsZCByZW5kZXIgdGhlbSBiZWNhdXNlIHR5cGljYWxseSB3aGVuIGEgdGltZWxpbmUgZmluaXNoZXMsIHVzZXJzIGV4cGVjdCB0aGluZ3MgdG8gaGF2ZSByZW5kZXJlZCBmdWxseS4gSW1hZ2luZSBhbiBvblVwZGF0ZSBvbiBhIHRpbWVsaW5lIHRoYXQgcmVwb3J0cy9jaGVja3MgdHdlZW5lZCB2YWx1ZXMuXG5cbiAgY29udGV4dCAmJiAoX2NvbnRleHQgPSBjb250ZXh0KTtcbiAgcmVzdWx0ID0gcGFyYW1zID8gY2FsbGJhY2suYXBwbHkoc2NvcGUsIH
12666BhcmFtcykgOiBjYWxsYmFjay5jYWxsKHNjb3BlKTtcbiAgX2NvbnRleHQgPSBwcmV2Q29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdDtcbn0sXG4gICAgX2ludGVycnVwdCA9IGZ1bmN0aW9uIF9pbnRlcnJ1cHQoYW5pbWF0aW9uKSB7XG4gIF9yZW1vdmVGcm9tUGFyZW50KGFuaW1hdGlvbik7XG5cbiAgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIgJiYgYW5pbWF0aW9uLnNjcm9sbFRyaWdnZXIua2lsbCghIV9yZXZlcnRpbmcpO1xuICBhbmltYXRpb24ucHJvZ3Jlc3MoKSA8IDEgJiYgX2NhbGxiYWNrKGFuaW1hdGlvbiwgXCJvbkludGVycnVwdFwiKTtcbiAgcmV0dXJuIGFuaW1hdGlvbjtcbn0sXG4gICAgX3F1aWNrVHdlZW4sXG4gICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUgPSBbXSxcbiAgICBfY3JlYXRlUGx1Z2luID0gZnVuY3Rpb24gX2NyZWF0ZVBsdWdpbihjb25maWcpIHtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgY29uZmlnID0gIWNvbmZpZy5uYW1lICYmIGNvbmZpZ1tcImRlZmF1bHRcIl0gfHwgY29uZmlnOyAvLyBVTUQgcGFja2FnaW5nIHdyYXBzIHRoaW5ncyBvZGRseSwgc28gZm9yIGV4YW1wbGUgTW90aW9uUGF0aEhlbHBlciBiZWNvbWVzIHtNb3Rpb25QYXRoSGVscGVyOk1vdGlvblBhdGhIZWxwZXIsIGRlZmF1bHQ6TW90aW9uUGF0aEhlbHBlcn0uXG5cbiAgaWYgKF93aW5kb3dFeGlzdHMoKSB8fCBjb25maWcuaGVhZGxlc3MpIHtcbiAgICAvLyBlZGdlIGNhc2U6IHNvbWUgYnVpbGQgdG9vbHMgbWF5IHBhc3MgaW4gYSBudWxsL3VuZGVmaW5lZCB2YWx1ZVxuICAgIHZhciBuYW1lID0gY29uZmlnLm5hbWUsXG4gICAgICAgIGlzRnVuYyA9IF9pc0Z1bmN0aW9uKGNvbmZpZyksXG4gICAgICAgIFBsdWdpbiA9IG5hbWUgJiYgIWlzRnVuYyAmJiBjb25maWcuaW5pdCA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuX3Byb3BzID0gW107XG4gICAgfSA6IGNvbmZpZyxcbiAgICAgICAgLy9pbiBjYXNlIHNvbWVvbmUgcGFzc2VzIGluIGFuIG9iamVjdCB0aGF0J3Mgbm90IGEgcGx1Z2luLCBsaWtlIEN1c3RvbUVhc2VcbiAgICBpbnN0YW5jZURlZmF1bHRzID0ge1xuICAgICAgaW5pdDogX2VtcHR5RnVuYyxcbiAgICAgIHJlbmRlcjogX3JlbmRlclByb3BUd2VlbnMsXG4gICAgICBhZGQ6IF9hZGRQcm9wVHdlZW4sXG4gICAgICBraWxsOiBfa2lsbFByb3BUd2VlbnNPZixcbiAgICAgIG1vZGlmaWVyOiBfYWRkUGx1Z2luTW9kaWZpZXIsXG4gICAgICByYXdWYXJzOiAwXG4gICAgfSxcbiAgICAgICAgc3RhdGljcyA9IHtcbiAgICAgIHRhcmdldFRlc3Q6IDAsXG4gICAgICBnZXQ6IDAsXG4gICAgICBnZXRTZXR0ZXI6IF9nZXRTZXR0ZXIsXG4gICAgICBhbGlhc2VzOiB7fSxcbiAgICAgIHJlZ2lzdGVyOiAwXG4gICAgfTtcblxuICAgIF93YWtlKCk7XG5cbiAgICBpZiAoY29uZmlnICE9PSBQbHVnaW4pIHtcbiAgICAgIGlmIChfcGx1Z2luc1tuYW1lXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9zZXREZWZhdWx0cyhQbHVnaW4sIF9zZXREZWZhdWx0cyhfY29weUV4Y2x1ZGluZyhjb25maWcsIGluc3RhbmNlRGVmYXVsdHMpLCBzdGF0aWNzKSk7IC8vc3RhdGljIG1ldGhvZHNcblxuXG4gICAgICBfbWVyZ2UoUGx1Z2luLnByb3RvdHlwZSwgX21lcmdlKGluc3RhbmNlRGVmYXVsdHMsIF9jb3B5RXhjbHVkaW5nKGNvbmZpZywgc3RhdGljcykpKTsgLy9pbnN0YW5jZSBtZXRob2RzXG5cblxuICAgICAgX3BsdWdpbnNbUGx1Z2luLnByb3AgPSBuYW1lXSA9IFBsdWdpbjtcblxuICAgICAgaWYgKGNvbmZpZy50YXJnZXRUZXN0KSB7XG4gICAgICAgIF9oYXJuZXNzUGx1Z2lucy5wdXNoKFBsdWdpbik7XG5cbiAgICAgICAgX3Jlc2VydmVkUHJvcHNbbmFtZV0gPSAxO1xuICAgICAgfVxuXG4gICAgICBuYW1lID0gKG5hbWUgPT09IFwiY3NzXCIgPyBcIkNTU1wiIDogbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpKSArIFwiUGx1Z2luXCI7IC8vZm9yIHRoZSBnbG9iYWwgbmFtZS4gXCJtb3Rpb25QYXRoXCIgc2hvdWxkIGJlY29tZSBNb3Rpb25QYXRoUGx1Z2luXG4gICAgfVxuXG4gICAgX2FkZEdsb2JhbChuYW1lLCBQbHVnaW4pO1xuXG4gICAgY29uZmlnLnJlZ2lzdGVyICYmIGNvbmZpZy5yZWdpc3Rlcihnc2FwLCBQbHVnaW4sIFByb3BUd2Vlbik7XG4gIH0gZWxzZSB7XG4gICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUucHVzaChjb25maWcpO1xuICB9XG59LFxuXG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENPTE9SU1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXzI1NSA9IDI1NSxcbiAgICBfY29sb3JMb29rdXAgPSB7XG4gIGFxdWE6IFswLCBfMjU1LCBfMjU1XSxcbiAgbGltZTogWzAsIF8yNTUsIDBdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgYmxhY2s6IFswLCAwLCAwXSxcbiAgbWFyb29uOiBbMTI4LCAwLCAwXSxcbiAgdGVhbDogWzAsIDEyOCwgMTI4XSxcbiAgYmx1ZTogWzAsIDAsIF8yNTVdLFxuICBuYXZ5OiBbMCwgMCwgMTI4XSxcbiAgd2hpdGU6IFtfMjU1LCBfMjU1LCBfMjU1XSxcbiAgb2xpdmU6IFsxMjgsIDEyOCwgMF0sXG4gIHllbGxvdzogW18yNTUsIF8yNTUsIDBdLFxuICBvcmFuZ2U6IFtfMjU1LCAxNjUsIDBdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIHB1cnBsZTogWzEyOCwgMCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICByZWQ6IFtfMjU1LCAwLCAwXSxcbiAgcGluazogW18yNTUsIDE5MiwgMjAzXSxcbiAgY3lhbjogWzAsIF8yNTUsIF8yNTVdLFxuICB0cmFuc3BhcmVudDogW18yNTUsIF8yNTUsIF8yNTUsIDBdXG59LFxuICAgIC8vIHBvc3NpYmxlIGZ1dHVyZSBpZGVhIHRvIHJlcGxhY2UgdGhlIGhhcmQtY29kZWQgY29sb3IgbmFtZSB2YWx1ZXMgLSBwdXQgdGhpcyBpbiB0aGUgdGlja2VyLndha2UoKSB3aGVyZSB3ZSBzZXQgdGhlIF9kb2M6XG4vLyBsZXQgY3R4ID0gX2RvYy5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLmdldENvbnRleHQoXCIyZFwiKTtcbi8vIF9mb3JFYWNoTmFtZShcImFxdWEsbGltZSxzaWx2ZXIsYmxhY2ssbWFyb29uLHRlYWwsYmx1ZSxuYXZ5LHdoaXRlLG9saXZlLHllbGxvdyxvcmFuZ2UsZ3JheSxwdXJwbGUsZ3JlZW4scmVkLHBpbmssY3lhblwiLCBjb2xvciA9PiB7Y3R4LmZpbGxTdHlsZSA9IGNvbG9yOyBfY29sb3JMb29rdXBbY29sb3JdID0gc3BsaXRDb2xvcihjdHguZmlsbFN0eWxlKX0pO1xuX2h1ZSA9IGZ1bmN0aW9uIF9odWUoaCwgbTEsIG0yKSB7XG4gIGggKz0gaCA8IDAgPyAxIDogaCA+IDEgPyAtMSA6IDA7XG4gIHJldHVybiAoaCAqIDYgPCAxID8gbTEgKyAobTIgLSBtMSkgKiBoICogNiA6IGggPCAuNSA/IG0yIDogaCAqIDMgPCAyID8gbTEgKyAobTIgLSBtMSkgKiAoMiAvIDMgLSBoKSAqIDYgOiBtMSkgKiBfMjU1ICsgLjUgfCAwO1xufSxcbiAgICBzcGxpdENvbG9yID0gZnVuY3Rpb24gc3BsaXRDb2xvcih2LCB0b0hTTCwgZm9yY2VBbHBoYSkge1xuICB2YXIgYSA9ICF2ID8gX2NvbG9yTG9va3VwLmJsYWNrIDogX2lzTnVtYmVyKHYpID8gW3YgPj4gMTYsIHYgPj4gOCAmIF8yNTUsIHYgJiBfMjU1XSA6
12666IDAsXG4gICAgICByLFxuICAgICAgZyxcbiAgICAgIGIsXG4gICAgICBoLFxuICAgICAgcyxcbiAgICAgIGwsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBkLFxuICAgICAgd2FzSFNMO1xuXG4gIGlmICghYSkge1xuICAgIGlmICh2LnN1YnN0cigtMSkgPT09IFwiLFwiKSB7XG4gICAgICAvL3NvbWV0aW1lcyBhIHRyYWlsaW5nIGNvbW1hIGlzIGluY2x1ZGVkIGFuZCB3ZSBzaG91bGQgY2hvcCBpdCBvZmYgKHR5cGljYWxseSBmcm9tIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdmFsdWVzIGxpa2UgYSB0ZXh0U2hhZG93OlwiMnB4IDJweCAycHggYmx1ZSwgNXB4IDVweCA1cHggcmdiKDI1NSwwLDApXCIgLSBpbiB0aGlzIGV4YW1wbGUgXCJibHVlLFwiIGhhcyBhIHRyYWlsaW5nIGNvbW1hLiBXZSBjb3VsZCBzdHJpcCBpdCBvdXQgaW5zaWRlIHBhcnNlQ29tcGxleCgpIGJ1dCB3ZSdkIG5lZWQgdG8gZG8gaXQgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHZhbHVlcyBwbHVzIGl0IHdvdWxkbid0IHByb3ZpZGUgcHJvdGVjdGlvbiBmcm9tIG90aGVyIHBvdGVudGlhbCBzY2VuYXJpb3MgbGlrZSBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBzaW1pbGFyIHZhbHVlLlxuICAgICAgdiA9IHYuc3Vic3RyKDAsIHYubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKF9jb2xvckxvb2t1cFt2XSkge1xuICAgICAgYSA9IF9jb2xvckxvb2t1cFt2XTtcbiAgICB9IGVsc2UgaWYgKHYuY2hhckF0KDApID09PSBcIiNcIikge1xuICAgICAgaWYgKHYubGVuZ3RoIDwgNikge1xuICAgICAgICAvL2ZvciBzaG9ydGhhbmQgbGlrZSAjOUYwIG9yICM5RjBGIChjb3VsZCBoYXZlIGFscGhhKVxuICAgICAgICByID0gdi5jaGFyQXQoMSk7XG4gICAgICAgIGcgPSB2LmNoYXJBdCgyKTtcbiAgICAgICAgYiA9IHYuY2hhckF0KDMpO1xuICAgICAgICB2ID0gXCIjXCIgKyByICsgciArIGcgKyBnICsgYiArIGIgKyAodi5sZW5ndGggPT09IDUgPyB2LmNoYXJBdCg0KSArIHYuY2hhckF0KDQpIDogXCJcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh2Lmxlbmd0aCA9PT0gOSkge1xuICAgICAgICAvLyBoZXggd2l0aCBhbHBoYSwgbGlrZSAjZmQ1ZTUzZmZcbiAgICAgICAgYSA9IHBhcnNlSW50KHYuc3Vic3RyKDEsIDYpLCAxNik7XG4gICAgICAgIHJldHVybiBbYSA+PiAxNiwgYSA+PiA4ICYgXzI1NSwgYSAmIF8yNTUsIHBhcnNlSW50KHYuc3Vic3RyKDcpLCAxNikgLyAyNTVdO1xuICAgICAgfVxuXG4gICAgICB2ID0gcGFyc2VJbnQodi5zdWJzdHIoMSksIDE2KTtcbiAgICAgIGEgPSBbdiA+PiAxNiwgdiA+PiA4ICYgXzI1NSwgdiAmIF8yNTVdO1xuICAgIH0gZWxzZSBpZiAodi5zdWJzdHIoMCwgMykgPT09IFwiaHNsXCIpIHtcbiAgICAgIGEgPSB3YXNIU0wgPSB2Lm1hdGNoKF9zdHJpY3ROdW1FeHApO1xuXG4gICAgICBpZiAoIXRvSFNMKSB7XG4gICAgICAgIGggPSArYVswXSAlIDM2MCAvIDM2MDtcbiAgICAgICAgcyA9ICthWzFdIC8gMTAwO1xuICAgICAgICBsID0gK2FbMl0gLyAxMDA7XG4gICAgICAgIGcgPSBsIDw9IC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICByID0gbCAqIDIgLSBnO1xuICAgICAgICBhLmxlbmd0aCA+IDMgJiYgKGFbM10gKj0gMSk7IC8vY2FzdCBhcyBudW1iZXJcblxuICAgICAgICBhWzBdID0gX2h1ZShoICsgMSAvIDMsIHIsIGcpO1xuICAgICAgICBhWzFdID0gX2h1ZShoLCByLCBnKTtcbiAgICAgICAgYVsyXSA9IF9odWUoaCAtIDEgLyAzLCByLCBnKTtcbiAgICAgIH0gZWxzZSBpZiAofnYuaW5kZXhPZihcIj1cIikpIHtcbiAgICAgICAgLy9pZiByZWxhdGl2ZSB2YWx1ZXMgYXJlIGZvdW5kLCBqdXN0IHJldHVybiB0aGUgcmF3IHN0cmluZ3Mgd2l0aCB0aGUgcmVsYXRpdmUgcHJlZml4ZXMgaW4gcGxhY2UuXG4gICAgICAgIGEgPSB2Lm1hdGNoKF9udW1FeHApO1xuICAgICAgICBmb3JjZUFscGhhICYmIGEubGVuZ3RoIDwgNCAmJiAoYVszXSA9IDEpO1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IHYubWF0Y2goX3N0cmljdE51bUV4cCkgfHwgX2NvbG9yTG9va3VwLnRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIGEgPSBhLm1hcChOdW1iZXIpO1xuICB9XG5cbiAgaWYgKHRvSFNMICYmICF3YXNIU0wpIHtcbiAgICByID0gYVswXSAvIF8yNTU7XG4gICAgZyA9IGFbMV0gLyBfMjU1O1xuICAgIGIgPSBhWzJdIC8gXzI1NTtcbiAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICBoID0gcyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGQgPSBtYXggLSBtaW47XG4gICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICBoID0gbWF4ID09PSByID8gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkgOiBtYXggPT09IGcgPyAoYiAtIHIpIC8gZCArIDIgOiAociAtIGcpIC8gZCArIDQ7XG4gICAgICBoICo9IDYwO1xuICAgIH1cblxuICAgIGFbMF0gPSB+fihoICsgLjUpO1xuICAgIGFbMV0gPSB+fihzICogMTAwICsgLjUpO1xuICAgIGFbMl0gPSB+fihsICogMTAwICsgLjUpO1xuICB9XG5cbiAgZm9yY2VBbHBoYSAmJiBhLmxlbmd0aCA8IDQgJiYgKGFbM10gPSAxKTtcbiAgcmV0dXJuIGE7XG59LFxuICAgIF9jb2xvck9yZGVyRGF0YSA9IGZ1bmN0aW9uIF9jb2xvck9yZGVyRGF0YSh2KSB7XG4gIC8vIHN0cmlwcyBvdXQgdGhlIGNvbG9ycyBmcm9tIHRoZSBzdHJpbmcsIGZpbmRzIGFsbCB0aGUgbnVtZXJpYyBzbG90cyAod2l0aCB1bml0cykgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhvc2UuIFRoZSBBcnJheSBhbHNvIGhhcyBhIFwiY1wiIHByb3BlcnR5IHdoaWNoIGlzIGFuIEFycmF5IG9mIHRoZSBpbmRleCB2YWx1ZXMgd2hlcmUgdGhlIGNvbG9ycyBiZWxvbmcuIFRoaXMgaXMgdG8gaGVscCB3b3JrIGFyb3VuZCBpc3N1ZXMgd2hlcmUgdGhlcmUncyBhIG1pcy1tYXRjaGVkIG9yZGVyIG9mIGNvbG9yL251bWVyaWMgZGF0YSBsaWtlIGRyb3Atc2hhZG93KCNmMDAgMHB4IDFweCAycHgpIGFuZCBkcm9wLXNoYWRvdygweCAxcHggMnB4ICNmMDApLiBUaGlzIGlzIGJhc2ljYWxseSBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGluIF9mb3JtYXRDb2xvcnMoKVxuICB2YXIgdmFsdWVzID0gW10sXG4gICAgICBjID0gW10sXG4gICAgICBpID0gLTE7XG4gIHYuc3BsaXQoX2NvbG9yRXhwKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIGEgPSB2Lm1hdGNoKF9udW1XaXRoVW5pdEV4cCkgfHwgW107XG4gICAgdmFsdWVzLnB1c2guYXBwbHkodmFsdWVzLCBhKTtcbiAgICBjLnB1c2goaSArPSBhLmxlbmd0aCArIDEpO1xuICB9KTtcbiAgdmFsdWVzLmMgPSBjO1xuICByZXR1cm4gdmFsdWVzO1xufSxcbiAgICBfZm9ybWF0Q29sb3JzID0gZnVuY3Rpb24gX2Zvcm1hdENvbG9ycyhzLCB0b0hTTCwgb3JkZXJNYXRjaERhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IFwiXCIsXG4gICAgICBjb2xvcnMgPSAocyArIHJlc3VsdCkubWF0Y2goX2NvbG9yRXhwKSxcbiAgICAgIHR5cGUgPSB0b0hTTCA/IFwiaHNsYShcIiA6IFwicmdiYShcIixcbiAgICAgIGkgPSAwLFxuICAgICAgYyxcbiAgICAgIHNoZWxsLFxuICAgICAgZCxcbiAgICAgIGw7XG5cbiAgaWYgKCFjb2xvcnMpIHtcbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIGNvbG9ycyA9IGNvbG9ycy5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIChjb2xvciA9IHNwbGl0Q29sb3IoY29sb3IsIHRvSFNMLCAxKSkgJiYgdHlwZSArICh0b0hTTCA/IGNvbG9yWzBdICsgXCIsXCIgKyBjb2xvclsxXSArIFwiJSxcIiArIGNvbG9yWzJdICsgXCIlLFwiICsgY29sb3JbM10gOiBjb2xvci5qb2luKFwiLFwiKSkgKyBcIilcIjtcbiAgfSk7XG5cbiAgaWYgKG9yZGVyTWF0Y2hEYXRhKSB7XG4gICAgZCA9IF9jb2xvck9yZGVyRGF0YShzKTtcbiAgICBjID0gb3JkZXJNYXRjaERhdGEuYztcblxuICAgIGlmIChjLmpvaW4ocmVzdWx0KSAhPT0gZC5jLmpvaW4ocmVzdWx0KSkge1xuICAgICAgc2hlbGwgPSBzLnJlcGxhY2UoX2NvbG9yRXhwLCBcIjFcIikuc3BsaXQoX251bVdpdGhVbml0RXhwKTtcbiAgICAgIGwgPSBzaGVsbC5sZW5ndGggLSAxO1xuXG4gICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gc2hlbGxbaV0gKyAofmMuaW5kZXhPZihpKSA/IGNvbG9ycy5zaGlmdCgpIHx8IHR5cGUgKyBcIjA
12666sMCwwLDApXCIgOiAoZC5sZW5ndGggPyBkIDogY29sb3JzLmxlbmd0aCA/IGNvbG9ycyA6IG9yZGVyTWF0Y2hEYXRhKS5zaGlmdCgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXNoZWxsKSB7XG4gICAgc2hlbGwgPSBzLnNwbGl0KF9jb2xvckV4cCk7XG4gICAgbCA9IHNoZWxsLmxlbmd0aCAtIDE7XG5cbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgcmVzdWx0ICs9IHNoZWxsW2ldICsgY29sb3JzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgKyBzaGVsbFtsXTtcbn0sXG4gICAgX2NvbG9yRXhwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcyA9IFwiKD86XFxcXGIoPzooPzpyZ2J8cmdiYXxoc2x8aHNsYSlcXFxcKC4rP1xcXFwpKXxcXFxcQiMoPzpbMC05YS1mXXszLDR9KXsxLDJ9XFxcXGJcIixcbiAgICAgIC8vd2UnbGwgZHluYW1pY2FsbHkgYnVpbGQgdGhpcyBSZWd1bGFyIEV4cHJlc3Npb24gdG8gY29uc2VydmUgZmlsZSBzaXplLiBBZnRlciBidWlsZGluZyBpdCwgaXQgd2lsbCBiZSBhYmxlIHRvIGZpbmQgcmdiKCksIHJnYmEoKSwgIyAoaGV4YWRlY2ltYWwpLCBhbmQgbmFtZWQgY29sb3IgdmFsdWVzIGxpa2UgcmVkLCBibHVlLCBwdXJwbGUsIGV0Yy4sXG4gIHA7XG5cbiAgZm9yIChwIGluIF9jb2xvckxvb2t1cCkge1xuICAgIHMgKz0gXCJ8XCIgKyBwICsgXCJcXFxcYlwiO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocyArIFwiKVwiLCBcImdpXCIpO1xufSgpLFxuICAgIF9oc2xFeHAgPSAvaHNsW2FdP1xcKC8sXG4gICAgX2NvbG9yU3RyaW5nRmlsdGVyID0gZnVuY3Rpb24gX2NvbG9yU3RyaW5nRmlsdGVyKGEpIHtcbiAgdmFyIGNvbWJpbmVkID0gYS5qb2luKFwiIFwiKSxcbiAgICAgIHRvSFNMO1xuICBfY29sb3JFeHAubGFzdEluZGV4ID0gMDtcblxuICBpZiAoX2NvbG9yRXhwLnRlc3QoY29tYmluZWQpKSB7XG4gICAgdG9IU0wgPSBfaHNsRXhwLnRlc3QoY29tYmluZWQpO1xuICAgIGFbMV0gPSBfZm9ybWF0Q29sb3JzKGFbMV0sIHRvSFNMKTtcbiAgICBhWzBdID0gX2Zvcm1hdENvbG9ycyhhWzBdLCB0b0hTTCwgX2NvbG9yT3JkZXJEYXRhKGFbMV0pKTsgLy8gbWFrZSBzdXJlIHRoZSBvcmRlciBvZiBudW1iZXJzL2NvbG9ycyBtYXRjaCB3aXRoIHRoZSBFTkQgdmFsdWUuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSxcblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBUSUNLRVJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbl90aWNrZXJBY3RpdmUsXG4gICAgX3RpY2tlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9nZXRUaW1lID0gRGF0ZS5ub3csXG4gICAgICBfbGFnVGhyZXNob2xkID0gNTAwLFxuICAgICAgX2FkanVzdGVkTGFnID0gMzMsXG4gICAgICBfc3RhcnRUaW1lID0gX2dldFRpbWUoKSxcbiAgICAgIF9sYXN0VXBkYXRlID0gX3N0YXJ0VGltZSxcbiAgICAgIF9nYXAgPSAxMDAwIC8gMjQwLFxuICAgICAgX25leHRUaW1lID0gX2dhcCxcbiAgICAgIF9saXN0ZW5lcnMgPSBbXSxcbiAgICAgIF9pZCxcbiAgICAgIF9yZXEsXG4gICAgICBfcmFmLFxuICAgICAgX3NlbGYsXG4gICAgICBfZGVsdGEsXG4gICAgICBfaSxcbiAgICAgIF90aWNrID0gZnVuY3Rpb24gX3RpY2sodikge1xuICAgIHZhciBlbGFwc2VkID0gX2dldFRpbWUoKSAtIF9sYXN0VXBkYXRlLFxuICAgICAgICBtYW51YWwgPSB2ID09PSB0cnVlLFxuICAgICAgICBvdmVybGFwLFxuICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgdGltZSxcbiAgICAgICAgZnJhbWU7XG5cbiAgICAoZWxhcHNlZCA+IF9sYWdUaHJlc2hvbGQgfHwgZWxhcHNlZCA8IDApICYmIChfc3RhcnRUaW1lICs9IGVsYXBzZWQgLSBfYWRqdXN0ZWRMYWcpO1xuICAgIF9sYXN0VXBkYXRlICs9IGVsYXBzZWQ7XG4gICAgdGltZSA9IF9sYXN0VXBkYXRlIC0gX3N0YXJ0VGltZTtcbiAgICBvdmVybGFwID0gdGltZSAtIF9uZXh0VGltZTtcblxuICAgIGlmIChvdmVybGFwID4gMCB8fCBtYW51YWwpIHtcbiAgICAgIGZyYW1lID0gKytfc2VsZi5mcmFtZTtcbiAgICAgIF9kZWx0YSA9IHRpbWUgLSBfc2VsZi50aW1lICogMTAwMDtcbiAgICAgIF9zZWxmLnRpbWUgPSB0aW1lID0gdGltZSAvIDEwMDA7XG4gICAgICBfbmV4dFRpbWUgKz0gb3ZlcmxhcCArIChvdmVybGFwID49IF9nYXAgPyA0IDogX2dhcCAtIG92ZXJsYXApO1xuICAgICAgZGlzcGF0Y2ggPSAxO1xuICAgIH1cblxuICAgIG1hbnVhbCB8fCAoX2lkID0gX3JlcShfdGljaykpOyAvL21ha2Ugc3VyZSB0aGUgcmVxdWVzdCBpcyBtYWRlIGJlZm9yZSB3ZSBkaXNwYXRjaCB0aGUgXCJ0aWNrXCIgZXZlbnQgc28gdGhhdCB0aW1pbmcgaXMgbWFpbnRhaW5lZC4gT3RoZXJ3aXNlLCBpZiBwcm9jZXNzaW5nIHRoZSBcInRpY2tcIiByZXF1aXJlcyBhIGJ1bmNoIG9mIHRpbWUgKGxpa2UgMTVtcykgYW5kIHdlJ3JlIHVzaW5nIGEgc2V0VGltZW91dCgpIHRoYXQncyBiYXNlZCBvbiAxNi43bXMsIGl0J2QgdGVjaG5pY2FsbHkgdGFrZSAzMS43bXMgYmV0d2VlbiBmcmFtZXMgb3RoZXJ3aXNlLlxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBmb3IgKF9pID0gMDsgX2kgPCBfbGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAvLyB1c2UgX2kgYW5kIGNoZWNrIF9saXN0ZW5lcnMubGVuZ3RoIGluc3RlYWQgb2YgYSB2YXJpYWJsZSBiZWNhdXNlIGEgbGlzdGVuZXIgY291bGQgZ2V0IHJlbW92ZWQgZHVyaW5nIHRoZSBsb29wLCBhbmQgaWYgdGhhdCBoYXBwZW5zIHRvIGFuIGVsZW1lbnQgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGluZGV4LCBpdCdkIHRocm93IHRoaW5ncyBvZmYgaW4gdGhlIGxvb3AuXG4gICAgICAgIF9saXN0ZW5lcnNbX2ldKHRpbWUsIF9kZWx0YSwgZnJhbWUsIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfc2VsZiA9IHtcbiAgICB0aW1lOiAwLFxuICAgIGZyYW1lOiAwLFxuICAgIHRpY2s6IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgICBfdGljayh0cnVlKTtcbiAgICB9LFxuICAgIGRlbHRhUmF0aW86IGZ1bmN0aW9uIGRlbHRhUmF0aW8oZnBzKSB7XG4gICAgICByZXR1cm4gX2RlbHRhIC8gKDEwMDAgLyAoZnBzIHx8IDYwKSk7XG4gICAgfSxcbiAgICB3YWtlOiBmdW5jdGlvbiB3YWtlKCkge1xuICAgICAgaWYgKF9jb3JlUmVhZHkpIHtcbiAgICAgICAgaWYgKCFfY29yZUluaXR0ZWQgJiYgX3dpbmRvd0V4aXN0cygpKSB7XG4gICAgICAgICAgX3dpbiA9IF9jb3JlSW5pdHRlZCA9IHdpbmRvdztcbiAgICAgICAgICBfZG9jID0gX3dpbi5kb2N1bWVudCB8fCB7fTtcbiAgICAgICAgICBfZ2xvYmFscy5nc2FwID0gZ3NhcDtcbiAgICAgICAgICAoX3dpbi5nc2FwVmVyc2lvbnMgfHwgKF93aW4uZ3NhcFZlcnNpb25zID0gW10pKS5wdXNoKGdzYXAudmVyc2lvbik7XG5cbiAgICAgICAgICBfaW5zdGFsbChfaW5zdGFsbFNjb3BlIHx8IF93aW4uR3JlZW5Tb2NrR2xvYmFscyB8fCAhX3dpbi5nc2FwICYmIF93aW4gfHwge30pO1xuXG4gICAgICAgICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUuZm9yRWFjaChfY3JlYXRlUGx1Z2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9yYWYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICAgICAgX2lkICYmIF9zZWxmLnNsZWVwKCk7XG5cbiAgICAgICAgX3JlcSA9IF9yYWYgfHwgZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBfbmV4dFRpbWUgLSBfc2VsZi50aW1lICogMTAwMCArIDEgfCAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGlja2VyQWN0aXZlID0gMTtcblxuICAgICAgICBfdGljaygyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNsZWVwOiBmdW5jdGlvbiBzbGVlcCgpIHtcbiAgICAgIChfcmFmID8gY2FuY2VsQW5pbWF0aW9uRnJhbWUgOiBjbGVhclRpbWVvdXQpKF9pZCk7XG4gICAgICBfdGlja2VyQWN0aXZlID0gMDtcbiAgICAgIF9yZXEgPSBfZW1wdHlGdW5jO1xuICAgIH0sXG4gICAgbGFnU21vb3RoaW5nOiBmdW5jdGlvbiBsYWdTbW9vdGhpbmcodGhyZXNob2xkLCBhZGp1c3RlZExhZykge1xuICAgICAgX2xhZ1RocmVzaG9sZCA9IHRocmVzaG9sZCB8fCBJbmZpbml0eTsgLy8gemVybyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYmFzaWNhbGx5IHVubGltaXRlZFxuXG4gICAgICBfYWRqdXN0ZWRMYWcgPSBNYXRoLm1pbihhZGp1c3RlZExhZyB8fCAzMywgX2xhZ1RocmVzaG9sZCk7XG4gICAgfSxcbiAgICBmcHM6IGZ1bmN0aW9uIGZwcyhfZnBzKSB7XG4gICAgICBfZ2FwID0gMTAwMCAvIChfZnBzIHx8IDI0MCk7XG4gICAgICBfbmV4dFRpbWUgPSBfc2VsZi50aW1lICogMTAwMCArIF9nYXA7XG4gICAgfSxcbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChjYWxsYmFjaywgb25jZSwgcHJpb3JpdGl6ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBvbmNlID8gZnVuY3Rpb24gKHQsIGQsIGYsIHYpIHtcbiAgICAgICAgY2FsbGJhY2sodCwgZCwgZiwgdik7XG5cbiAgICAgICAgX3NlbGYucmVtb3ZlKGZ1bmMpO1xuICAgICAgfSA6IGNhbGxiYWNrO1xuXG4gICAgICBfc2VsZi5yZW1vdmUoY2FsbGJhY2spO1xuXG4gICAgICBfbGlzdGVuZXJzW3ByaW9yaXRpemUgPyBcInVuc2hpZnRcIiA6IFwicHVzaFwiXShmdW5jKTtcblxuICAgICAgX3dha2UoKTtcblxuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjYWxsYmFjaywgaSkge1xuICAgICAgfihpID0gX2xpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSkgJiYgX2xpc3RlbmVycy5zcGxpY2UoaSwgMSkgJiYgX2kgPj0gaSAmJi
12666BfaS0tO1xuICAgIH0sXG4gICAgX2xpc3RlbmVyczogX2xpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gX3NlbGY7XG59KCksXG4gICAgX3dha2UgPSBmdW5jdGlvbiBfd2FrZSgpIHtcbiAgcmV0dXJuICFfdGlja2VyQWN0aXZlICYmIF90aWNrZXIud2FrZSgpO1xufSxcbiAgICAvL2Fsc28gZW5zdXJlcyB0aGUgY29yZSBjbGFzc2VzIGFyZSBpbml0aWFsaXplZC5cblxuLypcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKiBFQVNJTkdcbiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKi9cbl9lYXNlTWFwID0ge30sXG4gICAgX2N1c3RvbUVhc2VFeHAgPSAvXltcXGQuXFwtTV1bXFxkLlxcLSxcXHNdLyxcbiAgICBfcXVvdGVzRXhwID0gL1tcIiddL2csXG4gICAgX3BhcnNlT2JqZWN0SW5TdHJpbmcgPSBmdW5jdGlvbiBfcGFyc2VPYmplY3RJblN0cmluZyh2YWx1ZSkge1xuICAvL3Rha2VzIGEgc3RyaW5nIGxpa2UgXCJ7d2lnZ2xlczoxMCwgdHlwZTphbnRpY2lwYXRlfSlcIiBhbmQgdHVybnMgaXQgaW50byBhIHJlYWwgb2JqZWN0LiBOb3RpY2UgaXQgZW5kcyBpbiBcIilcIiBhbmQgaW5jbHVkZXMgdGhlIHt9IHdyYXBwZXJzLiBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgcGFyc2luZyBlYXNlIGNvbmZpZ3MgYW5kIHByaW9yaXRpemVkIG9wdGltaXphdGlvbiByYXRoZXIgdGhhbiByZXVzYWJpbGl0eS5cbiAgdmFyIG9iaiA9IHt9LFxuICAgICAgc3BsaXQgPSB2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMykuc3BsaXQoXCI6XCIpLFxuICAgICAga2V5ID0gc3BsaXRbMF0sXG4gICAgICBpID0gMSxcbiAgICAgIGwgPSBzcGxpdC5sZW5ndGgsXG4gICAgICBpbmRleCxcbiAgICAgIHZhbCxcbiAgICAgIHBhcnNlZFZhbDtcblxuICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgIHZhbCA9IHNwbGl0W2ldO1xuICAgIGluZGV4ID0gaSAhPT0gbCAtIDEgPyB2YWwubGFzdEluZGV4T2YoXCIsXCIpIDogdmFsLmxlbmd0aDtcbiAgICBwYXJzZWRWYWwgPSB2YWwuc3Vic3RyKDAsIGluZGV4KTtcbiAgICBvYmpba2V5XSA9IGlzTmFOKHBhcnNlZFZhbCkgPyBwYXJzZWRWYWwucmVwbGFjZShfcXVvdGVzRXhwLCBcIlwiKS50cmltKCkgOiArcGFyc2VkVmFsO1xuICAgIGtleSA9IHZhbC5zdWJzdHIoaW5kZXggKyAxKS50cmltKCk7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSxcbiAgICBfdmFsdWVJblBhcmVudGhlc2VzID0gZnVuY3Rpb24gX3ZhbHVlSW5QYXJlbnRoZXNlcyh2YWx1ZSkge1xuICB2YXIgb3BlbiA9IHZhbHVlLmluZGV4T2YoXCIoXCIpICsgMSxcbiAgICAgIGNsb3NlID0gdmFsdWUuaW5kZXhPZihcIilcIiksXG4gICAgICBuZXN0ZWQgPSB2YWx1ZS5pbmRleE9mKFwiKFwiLCBvcGVuKTtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhvcGVuLCB+bmVzdGVkICYmIG5lc3RlZCA8IGNsb3NlID8gdmFsdWUuaW5kZXhPZihcIilcIiwgY2xvc2UgKyAxKSA6IGNsb3NlKTtcbn0sXG4gICAgX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nID0gZnVuY3Rpb24gX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nKG5hbWUpIHtcbiAgLy9uYW1lIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiZWxhc3RpYy5vdXQoMSwwLjUpXCIsIGFuZCBwYXNzIGluIF9lYXNlTWFwIGFzIG9iaiBhbmQgaXQnbGwgcGFyc2UgaXQgb3V0IGFuZCBjYWxsIHRoZSBhY3R1YWwgZnVuY3Rpb24gbGlrZSBfZWFzZU1hcC5FbGFzdGljLmVhc2VPdXQuY29uZmlnKDEsMC41KS4gSXQgd2lsbCBhbHNvIHBhcnNlIGN1c3RvbSBlYXNlIHN0cmluZ3MgYXMgbG9uZyBhcyBDdXN0b21FYXNlIGlzIGxvYWRlZCBhbmQgcmVnaXN0ZXJlZCAoaW50ZXJuYWxseSBhcyBfZWFzZU1hcC5fQ0UpLlxuICB2YXIgc3BsaXQgPSAobmFtZSArIFwiXCIpLnNwbGl0KFwiKFwiKSxcbiAgICAgIGVhc2UgPSBfZWFzZU1hcFtzcGxpdFswXV07XG4gIHJldHVybiBlYXNlICYmIHNwbGl0Lmxlbmd0aCA+IDEgJiYgZWFzZS5jb25maWcgPyBlYXNlLmNvbmZpZy5hcHBseShudWxsLCB+bmFtZS5pbmRleE9mKFwie1wiKSA/IFtfcGFyc2VPYmplY3RJblN0cmluZyhzcGxpdFsxXSldIDogX3ZhbHVlSW5QYXJlbnRoZXNlcyhuYW1lKS5zcGxpdChcIixcIikubWFwKF9udW1lcmljSWZQb3NzaWJsZSkpIDogX2Vhc2VNYXAuX0NFICYmIF9jdXN0b21FYXNlRXhwLnRlc3QobmFtZSkgPyBfZWFzZU1hcC5fQ0UoXCJcIiwgbmFtZSkgOiBlYXNlO1xufSxcbiAgICBfaW52ZXJ0RWFzZSA9IGZ1bmN0aW9uIF9pbnZlcnRFYXNlKGVhc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBlYXNlKDEgLSBwKTtcbiAgfTtcbn0sXG4gICAgX3BhcnNlRWFzZSA9IGZ1bmN0aW9uIF9wYXJzZUVhc2UoZWFzZSwgZGVmYXVsdEVhc2UpIHtcbiAgcmV0dXJuICFlYXNlID8gZGVmYXVsdEVhc2UgOiAoX2lzRnVuY3Rpb24oZWFzZSkgPyBlYXNlIDogX2Vhc2VNYXBbZWFzZV0gfHwgX2NvbmZpZ0Vhc2VGcm9tU3RyaW5nKGVhc2UpKSB8fCBkZWZhdWx0RWFzZTtcbn0sXG4gICAgX2luc2VydEVhc2UgPSBmdW5jdGlvbiBfaW5zZXJ0RWFzZShuYW1lcywgZWFzZUluLCBlYXNlT3V0LCBlYXNlSW5PdXQpIHtcbiAgaWYgKGVhc2VPdXQgPT09IHZvaWQgMCkge1xuICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICAgIHJldHVybiAxIC0gZWFzZUluKDEgLSBwKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVhc2VJbk91dCA9PT0gdm9pZCAwKSB7XG4gICAgZWFzZUluT3V0ID0gZnVuY3Rpb24gZWFzZUluT3V0KHApIHtcbiAgICAgIHJldHVybiBwIDwgLjUgPyBlYXNlSW4ocCAqIDIpIC8gMiA6IDEgLSBlYXNlSW4oKDEgLSBwKSAqIDIpIC8gMjtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGVhc2UgPSB7XG4gICAgZWFzZUluOiBlYXNlSW4sXG4gICAgZWFzZU91dDogZWFzZU91dCxcbiAgICBlYXNlSW5PdXQ6IGVhc2VJbk91dFxuICB9LFxuICAgICAgbG93ZXJjYXNlTmFtZTtcblxuICBfZm9yRWFjaE5hbWUobmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgX2Vhc2VNYXBbbmFtZV0gPSBfZ2xvYmFsc1tuYW1lXSA9IGVhc2U7XG4gICAgX2Vhc2VNYXBbbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKV0gPSBlYXNlT3V0O1xuXG4gICAgZm9yICh2YXIgcCBpbiBlYXNlKSB7XG4gICAgICBfZWFzZU1hcFtsb3dlcmNhc2VOYW1lICsgKHAgPT09IFwiZWFzZUluXCIgPyBcIi5pblwiIDogcCA9PT0gXCJlYXNlT3V0XCIgPyBcIi5vdXRcIiA6IFwiLmluT3V0XCIpXSA9IF9lYXNlTWFwW25hbWUgKyBcIi5cIiArIHBdID0gZWFzZVtwXTtcbiAgICB9XG4gI
12666H0pO1xuXG4gIHJldHVybiBlYXNlO1xufSxcbiAgICBfZWFzZUluT3V0RnJvbU91dCA9IGZ1bmN0aW9uIF9lYXNlSW5PdXRGcm9tT3V0KGVhc2VPdXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAgPCAuNSA/ICgxIC0gZWFzZU91dCgxIC0gcCAqIDIpKSAvIDIgOiAuNSArIGVhc2VPdXQoKHAgLSAuNSkgKiAyKSAvIDI7XG4gIH07XG59LFxuICAgIF9jb25maWdFbGFzdGljID0gZnVuY3Rpb24gX2NvbmZpZ0VsYXN0aWModHlwZSwgYW1wbGl0dWRlLCBwZXJpb2QpIHtcbiAgdmFyIHAxID0gYW1wbGl0dWRlID49IDEgPyBhbXBsaXR1ZGUgOiAxLFxuICAgICAgLy9ub3RlOiBpZiBhbXBsaXR1ZGUgaXMgPCAxLCB3ZSBzaW1wbHkgYWRqdXN0IHRoZSBwZXJpb2QgZm9yIGEgbW9yZSBuYXR1cmFsIGZlZWwuIE90aGVyd2lzZSB0aGUgbWF0aCBkb2Vzbid0IHdvcmsgcmlnaHQgYW5kIHRoZSBjdXJ2ZSBzdGFydHMgYXQgMS5cbiAgcDIgPSAocGVyaW9kIHx8ICh0eXBlID8gLjMgOiAuNDUpKSAvIChhbXBsaXR1ZGUgPCAxID8gYW1wbGl0dWRlIDogMSksXG4gICAgICBwMyA9IHAyIC8gXzJQSSAqIChNYXRoLmFzaW4oMSAvIHAxKSB8fCAwKSxcbiAgICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICByZXR1cm4gcCA9PT0gMSA/IDEgOiBwMSAqIE1hdGgucG93KDIsIC0xMCAqIHApICogX3NpbigocCAtIHAzKSAqIHAyKSArIDE7XG4gIH0sXG4gICAgICBlYXNlID0gdHlwZSA9PT0gXCJvdXRcIiA/IGVhc2VPdXQgOiB0eXBlID09PSBcImluXCIgPyBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiAxIC0gZWFzZU91dCgxIC0gcCk7XG4gIH0gOiBfZWFzZUluT3V0RnJvbU91dChlYXNlT3V0KTtcblxuICBwMiA9IF8yUEkgLyBwMjsgLy9wcmVjYWxjdWxhdGUgdG8gb3B0aW1pemVcblxuICBlYXNlLmNvbmZpZyA9IGZ1bmN0aW9uIChhbXBsaXR1ZGUsIHBlcmlvZCkge1xuICAgIHJldHVybiBfY29uZmlnRWxhc3RpYyh0eXBlLCBhbXBsaXR1ZGUsIHBlcmlvZCk7XG4gIH07XG5cbiAgcmV0dXJuIGVhc2U7XG59LFxuICAgIF9jb25maWdCYWNrID0gZnVuY3Rpb24gX2NvbmZpZ0JhY2sodHlwZSwgb3ZlcnNob290KSB7XG4gIGlmIChvdmVyc2hvb3QgPT09IHZvaWQgMCkge1xuICAgIG92ZXJzaG9vdCA9IDEuNzAxNTg7XG4gIH1cblxuICB2YXIgZWFzZU91dCA9IGZ1bmN0aW9uIGVhc2VPdXQocCkge1xuICAgIHJldHVybiBwID8gLS1wICogcCAqICgob3ZlcnNob290ICsgMSkgKiBwICsgb3ZlcnNob290KSArIDEgOiAwO1xuICB9LFxuICAgICAgZWFzZSA9IHR5cGUgPT09IFwib3V0XCIgPyBlYXNlT3V0IDogdHlwZSA9PT0gXCJpblwiID8gZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gMSAtIGVhc2VPdXQoMSAtIHApO1xuICB9IDogX2Vhc2VJbk91dEZyb21PdXQoZWFzZU91dCk7XG5cbiAgZWFzZS5jb25maWcgPSBmdW5jdGlvbiAob3ZlcnNob290KSB7XG4gICAgcmV0dXJuIF9jb25maWdCYWNrKHR5cGUsIG92ZXJzaG9vdCk7XG4gIH07XG5cbiAgcmV0dXJuIGVhc2U7XG59OyAvLyBhIGNoZWFwZXIgKGtiIGFuZCBjcHUpIGJ1dCBtb3JlIG1pbGQgd2F5IHRvIGdldCBhIHBhcmFtZXRlcml6ZWQgd2VpZ2h0ZWQgZWFzZSBieSBmZWVkaW5nIGluIGEgdmFsdWUgYmV0d2VlbiAtMSAoZWFzZUluKSBhbmQgMSAoZWFzZU91dCkgd2hlcmUgMCBpcyBsaW5lYXIuXG4vLyBfd2VpZ2h0ZWRFYXNlID0gcmF0aW8gPT4ge1xuLy8gXHRsZXQgeSA9IDAuNSArIHJhdGlvIC8gMjtcbi8vIFx0cmV0dXJuIHAgPT4gKDIgKiAoMSAtIHApICogcCAqIHkgKyBwICogcCk7XG4vLyB9LFxuLy8gYSBzdHJvbmdlciAoYnV0IG1vcmUgZXhwZW5zaXZlIGtiL2NwdSkgcGFyYW1ldGVyaXplZCB3ZWlnaHRlZCBlYXNlIHRoYXQgbGV0cyB5b3UgZmVlZCBpbiBhIHZhbHVlIGJldHdlZW4gLTEgKGVhc2VJbikgYW5kIDEgKGVhc2VPdXQpIHdoZXJlIDAgaXMgbGluZWFyLlxuLy8gX3dlaWdodGVkRWFzZVN0cm9uZyA9IHJhdGlvID0+IHtcbi8vIFx0cmF0aW8gPSAuNSArIHJhdGlvIC8gMjtcbi8vIFx0bGV0IG8gPSAxIC8gMyAqIChyYXRpbyA8IC41ID8gcmF0aW8gOiAxIC0gcmF0aW8pLFxuLy8gXHRcdGIgPSByYXRpbyAtIG8sXG4vLyBcdFx0YyA9IHJhdGlvICsgbztcbi8vIFx0cmV0dXJuIHAgPT4gcCA9PT0gMSA/IHAgOiAzICogYiAqICgxIC0gcCkgKiAoMSAtIHApICogcCArIDMgKiBjICogKDEgLSBwKSAqIHAgKiBwICsgcCAqIHAgKiBwO1xuLy8gfTtcblxuXG5fZm9yRWFjaE5hbWUoXCJMaW5lYXIsUXVhZCxDdWJpYyxRdWFydCxRdWludCxTdHJvbmdcIiwgZnVuY3Rpb24gKG5hbWUsIGkpIHtcbiAgdmFyIHBvd2VyID0gaSA8IDUgPyBpICsgMSA6IGk7XG5cbiAgX2luc2VydEVhc2UobmFtZSArIFwiLFBvd2VyXCIgKyAocG93ZXIgLSAxKSwgaSA/IGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHAsIHBvd2VyKTtcbiAgfSA6IGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHA7XG4gIH0sIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gcCwgcG93ZXIpO1xuICB9LCBmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwIDwgLjUgPyBNYXRoLnBvdyhwICogMiwgcG93ZXIpIC8gMiA6IDEgLSBNYXRoLnBvdygoMSAtIHApICogMiwgcG93ZXIpIC8gMjtcbiAgfSk7XG59KTtcblxuX2Vhc2VNYXAuTGluZWFyLmVhc2VOb25lID0gX2Vhc2VNYXAubm9uZSA9IF9lYXNlTWFwLkxpbmVhci5lYXNlSW47XG5cbl9pbnNlcnRFYXNlKFwiRWxhc3RpY1wiLCBfY29uZmlnRWxhc3RpYyhcImluXCIpLCBfY29uZmlnRWxhc3RpYyhcIm91dFwiKSwgX2NvbmZpZ0VsYXN0aWMoKSk7XG5cbihmdW5jdGlvbiAobiwgYykge1xuICB2YXIgbjEgPSAxIC8gYyxcbiAgICAgIG4yID0gMiAqIG4xLFxuICAgICAgbjMgPSAyLjUgKiBuMSxcbiAgICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcbiAgICByZXR1cm4gcCA8IG4xID8gbiAqIHAgKiBwIDogcCA8IG4yID8gbiAqIE1hdGgucG93KHAgLSAxLjUgLyBjLCAyKSArIC43NSA6IHAgPCBuMyA/IG4gKiAocCAtPSAyLjI1IC8gYykgKiBwICsgLjkzNzUgOiBuICogTWF0aC5wb3cocCAtIDIuNjI1IC8gYywgMikgKyAuOTg0Mzc1O1xuICB9O1xuXG4gIF9pbnNlcnRFYXNlKFwiQm91bmNlXCIsIGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIDEgLSBlYXNlT3V0KDEgLSBwKTtcbiAgfSwgZWFzZU91dCk7XG59KSg3LjU2MjUsIDIuNzUpO1xuXG5faW5zZXJ0RWFzZShcIkV4cG9cIiwgZnVuY3Rpb24gKHApIHtcbiAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogKHAgLSAxKSkgKiBwICsgcCAqIHAgKiBwICogcCAqIHAgKiBwICogKDEgLSBwKTtcbn0pOyAvLyBwcmV2aW91c2x5IDIgKiogKDEwICogKHAgLSAxKSkgYnV0IHRoYXQgZG9lc24ndCBlbmQgdXAgd2l0aCB0aGUgdmFsdWUgcXVpdGUgYXQgdGhlIHJpZ2h0IHNwb3Qgc28gd2UgZG8gYSBibGVuZGVkIGVhc2UgdG8gZW5zdXJlIGl0IGxhbmRzIHdoZXJlIGl0IHNob3VsZCBwZXJmZWN0bHkuXG5cblxuX2luc2VydEVhc2UoXCJDaXJjXCIsIGZ1bmN0aW9uIChwKSB7XG4gIHJldHVybiAtKF9zcXJ0KDEgLSBwICogcCkgLSAxKTtcbn0pO1xuXG5faW5zZXJ0RWFzZShcIlNpbmVcIiwgZnVuY3Rpb24gKHApIHtcbiAgcmV0dXJuIHAgPT09IDEgPyAxIDogLV9jb3MocCAqIF9IQUxGX1BJKSArIDE7XG59KTtcblxuX2luc2VydEVhc2UoXCJCYWNrXCIsIF9jb25maWdCYWNrKFwiaW5cIiksIF9jb25maWdCYWNrKFwib3V0XCIpLCBfY29uZmlnQmFjaygpKTtcblxuX2Vhc2VNYXAuU3RlcHBlZEVhc2UgPSBfZWFzZU1hcC5zdGVwcyA9IF9nbG9iYWxzLlN0ZXBwZWRFYXNlID0ge1xuICBjb25maWc6IGZ1bmN0aW9uIGNvbmZpZyhzdGVwcywgaW1tZWRpYXRlU3RhcnQpIHtcbiAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkge1xuICAgICAgc3RlcHMgPSAxO1xuICAgIH1cblxuICAgI
12666HZhciBwMSA9IDEgLyBzdGVwcyxcbiAgICAgICAgcDIgPSBzdGVwcyArIChpbW1lZGlhdGVTdGFydCA/IDAgOiAxKSxcbiAgICAgICAgcDMgPSBpbW1lZGlhdGVTdGFydCA/IDEgOiAwLFxuICAgICAgICBtYXggPSAxIC0gX3RpbnlOdW07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gKChwMiAqIF9jbGFtcCgwLCBtYXgsIHApIHwgMCkgKyBwMykgKiBwMTtcbiAgICB9O1xuICB9XG59O1xuX2RlZmF1bHRzLmVhc2UgPSBfZWFzZU1hcFtcInF1YWQub3V0XCJdO1xuXG5fZm9yRWFjaE5hbWUoXCJvbkNvbXBsZXRlLG9uVXBkYXRlLG9uU3RhcnQsb25SZXBlYXQsb25SZXZlcnNlQ29tcGxldGUsb25JbnRlcnJ1cHRcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9jYWxsYmFja05hbWVzICs9IG5hbWUgKyBcIixcIiArIG5hbWUgKyBcIlBhcmFtcyxcIjtcbn0pO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDQUNIRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbmV4cG9ydCB2YXIgR1NDYWNoZSA9IGZ1bmN0aW9uIEdTQ2FjaGUodGFyZ2V0LCBoYXJuZXNzKSB7XG4gIHRoaXMuaWQgPSBfZ3NJRCsrO1xuICB0YXJnZXQuX2dzYXAgPSB0aGlzO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgdGhpcy5oYXJuZXNzID0gaGFybmVzcztcbiAgdGhpcy5nZXQgPSBoYXJuZXNzID8gaGFybmVzcy5nZXQgOiBfZ2V0UHJvcGVydHk7XG4gIHRoaXMuc2V0ID0gaGFybmVzcyA/IGhhcm5lc3MuZ2V0U2V0dGVyIDogX2dldFNldHRlcjtcbn07XG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFOSU1BVElPTlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5leHBvcnQgdmFyIEFuaW1hdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuaW1hdGlvbih2YXJzKSB7XG4gICAgdGhpcy52YXJzID0gdmFycztcbiAgICB0aGlzLl9kZWxheSA9ICt2YXJzLmRlbGF5IHx8IDA7XG5cbiAgICBpZiAodGhpcy5fcmVwZWF0ID0gdmFycy5yZXBlYXQgPT09IEluZmluaXR5ID8gLTIgOiB2YXJzLnJlcGVhdCB8fCAwKSB7XG4gICAgICAvLyBUT0RPOiByZXBlYXQ6IEluZmluaXR5IG9uIGEgdGltZWxpbmUncyBjaGlsZHJlbiBtdXN0IGZsYWcgdGhhdCB0aW1lbGluZSBpbnRlcm5hbGx5IGFuZCBhZmZlY3QgaXRzIHRvdGFsRHVyYXRpb24sIG90aGVyd2lzZSBpdCdsbCBzdG9wIGluIHRoZSBuZWdhdGl2ZSBkaXJlY3Rpb24gd2hlbiByZWFjaGluZyB0aGUgc3RhcnQuXG4gICAgICB0aGlzLl9yRGVsYXkgPSB2YXJzLnJlcGVhdERlbGF5IHx8IDA7XG4gICAgICB0aGlzLl95b3lvID0gISF2YXJzLnlveW8gfHwgISF2YXJzLnlveW9FYXNlO1xuICAgIH1cblxuICAgIHRoaXMuX3RzID0gMTtcblxuICAgIF9zZXREdXJhdGlvbih0aGlzLCArdmFycy5kdXJhdGlvbiwgMSwgMSk7XG5cbiAgICB0aGlzLmRhdGEgPSB2YXJzLmRhdGE7XG5cbiAgICBpZiAoX2NvbnRleHQpIHtcbiAgICAgIHRoaXMuX2N0eCA9IF9jb250ZXh0O1xuXG4gICAgICBfY29udGV4dC5kYXRhLnB1c2godGhpcyk7XG4gICAgfVxuXG4gICAgX3RpY2tlckFjdGl2ZSB8fCBfdGlja2VyLndha2UoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBbmltYXRpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWxheSA9IGZ1bmN0aW9uIGRlbGF5KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5zbW9vdGhDaGlsZFRpbWluZyAmJiB0aGlzLnN0YXJ0VGltZSh0aGlzLl9zdGFydCArIHZhbHVlIC0gdGhpcy5fZGVsYXkpO1xuICAgICAgdGhpcy5fZGVsYXkgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kZWxheTtcbiAgfTtcblxuICBfcHJvdG8uZHVyYXRpb24gPSBmdW5jdGlvbiBkdXJhdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbER1cmF0aW9uKHRoaXMuX3JlcGVhdCA+IDAgPyB2YWx1ZSArICh2YWx1ZSArIHRoaXMuX3JEZWxheSkgKiB0aGlzLl9yZXBlYXQgOiB2YWx1ZSkgOiB0aGlzLnRvdGFsRHVyYXRpb24oKSAmJiB0aGlzLl9kdXI7XG4gIH07XG5cbiAgX3Byb3RvLnRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbiB0b3RhbER1cmF0aW9uKHZhbHVlKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdER1cjtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXJ0eSA9IDA7XG4gICAgcmV0dXJuIF9zZXREdXJhdGlvbih0aGlzLCB0aGlzLl9yZXBlYXQgPCAwID8gdmFsdWUgOiAodmFsdWUgLSB0aGlzLl9yZXBlYXQgKiB0aGlzLl9yRGVsYXkpIC8gKHRoaXMuX3JlcGVhdCArIDEpKTtcbiAgfTtcblxuICBfcHJvdG8udG90YWxUaW1lID0gZnVuY3Rpb24gdG90YWxUaW1lKF90b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgX3dha2UoKTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RUaW1lO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnQgPSB0aGlzLl9kcDtcblxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnNtb290aENoaWxkVGltaW5nICYmIHRoaXMuX3RzKSB7XG4gICAgICBfYWxpZ25QbGF5aGVhZCh0aGlzLCBfdG90YWxUaW1lKTtcblxuICAgICAgIXBhcmVudC5fZHAgfHwgcGFyZW50LnBhcmVudCB8fCBfcG9zdEFkZENoZWNrcyhwYXJlbnQsIHRoaXMpOyAvLyBlZGdlIGNhc2U6IGlmIHRoaXMgaXMgYSBjaGlsZCBvZiBhIHRpbWVsaW5lIHRoYXQgYWxyZWFkeSBjb21wbGV0ZWQsIGZvciBleGFtcGxlLCB3ZSBtdXN0IHJlLWFjdGl2YXRlIHRoZSBwYXJlbnQuXG4gICAgICAvL2luIGNhc2UgYW55IG9mIHRoZSBhbmNlc3RvciB0aW1lbGluZXMgaGFkIGNvbXBsZXRlZCBidXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkLCB3ZSBzaG91bGQgcmVzZXQgdGhlaXIgdG90YWxUaW1lKCkgd2hpY2ggd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHR
12666oZXkncmUgbGluZWQgdXAgcHJvcGVybHkgYW5kIGVuYWJsZWQuIFNraXAgZm9yIGFuaW1hdGlvbnMgdGhhdCBhcmUgb24gdGhlIHJvb3QgKHdhc3RlZnVsKS4gRXhhbXBsZTogYSBUaW1lbGluZUxpdGUuZXhwb3J0Um9vdCgpIGlzIHBlcmZvcm1lZCB3aGVuIHRoZXJlJ3MgYSBwYXVzZWQgdHdlZW4gb24gdGhlIHJvb3QsIHRoZSBleHBvcnQgd2lsbCBub3QgY29tcGxldGUgdW50aWwgdGhhdCB0d2VlbiBpcyB1bnBhdXNlZCwgYnV0IGltYWdpbmUgYSBjaGlsZCBnZXRzIHJlc3RhcnRlZCBsYXRlciwgYWZ0ZXIgYWxsIFt1bnBhdXNlZF0gdHdlZW5zIGhhdmUgY29tcGxldGVkLiBUaGUgc3RhcnQgb2YgdGhhdCBjaGlsZCB3b3VsZCBnZXQgcHVzaGVkIG91dCwgYnV0IG9uZSBvZiB0aGUgYW5jZXN0b3JzIG1heSBoYXZlIGNvbXBsZXRlZC5cblxuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGFyZW50Ll90aW1lICE9PSBwYXJlbnQuX3N0YXJ0ICsgKHBhcmVudC5fdHMgPj0gMCA/IHBhcmVudC5fdFRpbWUgLyBwYXJlbnQuX3RzIDogKHBhcmVudC50b3RhbER1cmF0aW9uKCkgLSBwYXJlbnQuX3RUaW1lKSAvIC1wYXJlbnQuX3RzKSkge1xuICAgICAgICAgIHBhcmVudC50b3RhbFRpbWUocGFyZW50Ll90VGltZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucGFyZW50ICYmIHRoaXMuX2RwLmF1dG9SZW1vdmVDaGlsZHJlbiAmJiAodGhpcy5fdHMgPiAwICYmIF90b3RhbFRpbWUgPCB0aGlzLl90RHVyIHx8IHRoaXMuX3RzIDwgMCAmJiBfdG90YWxUaW1lID4gMCB8fCAhdGhpcy5fdER1ciAmJiAhX3RvdGFsVGltZSkpIHtcbiAgICAgICAgLy9pZiB0aGUgYW5pbWF0aW9uIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgcHV0IGl0IGJhY2sgaW50byBpdHMgbGFzdCBwYXJlbnQgKHJlY29yZGVkIGFzIF9kcCBmb3IgZXhhY3RseSBjYXNlcyBsaWtlIHRoaXMpLiBMaW1pdCB0byBwYXJlbnRzIHdpdGggYXV0b1JlbW92ZUNoaWxkcmVuIChsaWtlIGdsb2JhbFRpbWVsaW5lKSBzbyB0aGF0IGlmIHRoZSB1c2VyIG1hbnVhbGx5IHJlbW92ZXMgYW4gYW5pbWF0aW9uIGZyb20gYSB0aW1lbGluZSBhbmQgdGhlbiBhbHRlcnMgaXRzIHBsYXloZWFkLCBpdCBkb2Vzbid0IGdldCBhZGRlZCBiYWNrIGluLlxuICAgICAgICBfYWRkVG9UaW1lbGluZSh0aGlzLl9kcCwgdGhpcywgdGhpcy5fc3RhcnQgLSB0aGlzLl9kZWxheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3RUaW1lICE9PSBfdG90YWxUaW1lIHx8ICF0aGlzLl9kdXIgJiYgIXN1cHByZXNzRXZlbnRzIHx8IHRoaXMuX2luaXR0ZWQgJiYgTWF0aC5hYnModGhpcy5felRpbWUpID09PSBfdGlueU51bSB8fCAhdGhpcy5faW5pdHRlZCAmJiB0aGlzLl9kdXIgJiYgX3RvdGFsVGltZSB8fCAhX3RvdGFsVGltZSAmJiAhdGhpcy5faW5pdHRlZCAmJiAodGhpcy5hZGQgfHwgdGhpcy5fcHRMb29rdXApKSB7XG4gICAgICAvLyBjaGVjayBmb3IgX3B0TG9va3VwIG9uIGEgVHdlZW4gaW5zdGFuY2UgdG8gZW5zdXJlIGl0IGhhcyBhY3R1YWxseSBmaW5pc2hlZCBiZWluZyBpbnN0YW50aWF0ZWQsIG90aGVyd2lzZSBpZiB0aGlzLnJldmVyc2UoKSBnZXRzIGNhbGxlZCBpbiB0aGUgQW5pbWF0aW9uIGNvbnN0cnVjdG9yLCBpdCBjb3VsZCB0cmlnZ2VyIGEgcmVuZGVyKCkgaGVyZSBldmVuIHRob3VnaCB0aGUgX3RhcmdldHMgd2VyZW4ndCBwb3B1bGF0ZWQsIHRodXMgd2hlbiBfaW5pdCgpIGlzIGNhbGxlZCB0aGVyZSB3b24ndCBiZSBhbnkgUHJvcFR3ZWVucyAoaXQnbGwgYWN0IGxpa2UgdGhlIHR3ZWVuIGlzIG5vbi1mdW5jdGlvbmFsKVxuICAgICAgdGhpcy5fdHMgfHwgKHRoaXMuX3BUaW1lID0gX3RvdGFsVGltZSk7IC8vIG90aGVyd2lzZSwgaWYgYW4gYW5pbWF0aW9uIGlzIHBhdXNlZCwgdGhlbiB0aGUgcGxheWhlYWQgaXMgbW92ZWQgYmFjayB0byB6ZXJvLCB0aGVuIHJlc3VtZWQsIGl0J2QgcmV2ZXJ0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHRpbWUgYXQgdGhlIHBhdXNlXG4gICAgICAvL2lmICghdGhpcy5fbG9jaykgeyAvLyBhdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbiAobm90IHN1cmUgd2UgbmVlZCB0aGlzIHlldCBvciBpZiBpdCdzIHdvcnRoIHRoZSBwZXJmb3JtYW5jZSBoaXQpXG4gICAgICAvLyAgIHRoaXMuX2xvY2sgPSAxO1xuXG4gICAgICBfbGF6eVNhZmVSZW5kZXIodGhpcywgX3RvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMpOyAvLyAgIHRoaXMuX2xvY2sgPSAwO1xuICAgICAgLy99XG5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8udGltZSA9IGZ1bmN0aW9uIHRpbWUodmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZShNYXRoLm1pbih0aGlzLnRvdGFsRHVyYXRpb24oKSwgdmFsdWUgKyBfZWxhcHNlZEN5Y2xlRHVyYXRpb24odGhpcykpICUgKHRoaXMuX2R1ciArIHRoaXMuX3JEZWxheSkgfHwgKHZhbHVlID8gdGhpcy5fZHVyIDogMCksIHN1cHByZXNzRXZlbnRzKSA6IHRoaXMuX3RpbWU7IC8vIG5vdGU6IGlmIHRoZSBtb2R1bHVzIHJlc3VsdHMgaW4gMCwgdGhlIHBsYXloZWFkIGNvdWxkIGJlIGV4YWN0bHkgYXQgdGhlIGVuZCBvciB0aGUgYmVnaW5uaW5nLCBhbmQgd2UgYWx3YXlzIGRlZmVyIHRvIHRoZSBFTkQgd2l0aCBhIG5vbi16ZXJvIHZhbHVlLCBvdGhlcndpc2UgaWYgeW91IHNldCB0aGUgdGltZSgpIHRvIHRoZSB2ZXJ5IGVuZCAoZHVyYXRpb24oKSksIGl0IHdvdWxkIHJlbmRlciBhdCB0aGUgU1RBUlQhXG4gIH07XG5cbiAgX3Byb3RvLnRvdGFsUHJvZ3Jlc3MgPSBmdW5jdGlvbiB0b3RhbFByb2dyZXNzKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbFRpbWUodGhpcy50b3RhbER1cmF0aW9uKCkgKiB2YWx1ZSwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy50b3RhbER1cmF0aW9uKCkgPyBNYXRoLm1pbigxLCB0aGlzLl90VGltZSAvIHRoaXMuX3REdXIp
12666IDogdGhpcy5yYXdUaW1lKCkgPj0gMCAmJiB0aGlzLl9pbml0dGVkID8gMSA6IDA7XG4gIH07XG5cbiAgX3Byb3RvLnByb2dyZXNzID0gZnVuY3Rpb24gcHJvZ3Jlc3ModmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZSh0aGlzLmR1cmF0aW9uKCkgKiAodGhpcy5feW95byAmJiAhKHRoaXMuaXRlcmF0aW9uKCkgJiAxKSA/IDEgLSB2YWx1ZSA6IHZhbHVlKSArIF9lbGFwc2VkQ3ljbGVEdXJhdGlvbih0aGlzKSwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy5kdXJhdGlvbigpID8gTWF0aC5taW4oMSwgdGhpcy5fdGltZSAvIHRoaXMuX2R1cikgOiB0aGlzLnJhd1RpbWUoKSA+IDAgPyAxIDogMDtcbiAgfTtcblxuICBfcHJvdG8uaXRlcmF0aW9uID0gZnVuY3Rpb24gaXRlcmF0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHZhciBjeWNsZUR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbigpICsgdGhpcy5fckRlbGF5O1xuXG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnRvdGFsVGltZSh0aGlzLl90aW1lICsgKHZhbHVlIC0gMSkgKiBjeWNsZUR1cmF0aW9uLCBzdXBwcmVzc0V2ZW50cykgOiB0aGlzLl9yZXBlYXQgPyBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pICsgMSA6IDE7XG4gIH0gLy8gcG90ZW50aWFsIGZ1dHVyZSBhZGRpdGlvbjpcbiAgLy8gaXNQbGF5aW5nQmFja3dhcmRzKCkge1xuICAvLyBcdGxldCBhbmltYXRpb24gPSB0aGlzLFxuICAvLyBcdFx0b3JpZW50YXRpb24gPSAxOyAvLyAxID0gZm9yd2FyZCwgLTEgPSBiYWNrd2FyZFxuICAvLyBcdHdoaWxlIChhbmltYXRpb24pIHtcbiAgLy8gXHRcdG9yaWVudGF0aW9uICo9IGFuaW1hdGlvbi5yZXZlcnNlZCgpIHx8IChhbmltYXRpb24ucmVwZWF0KCkgJiYgIShhbmltYXRpb24uaXRlcmF0aW9uKCkgJiAxKSkgPyAtMSA6IDE7XG4gIC8vIFx0XHRhbmltYXRpb24gPSBhbmltYXRpb24ucGFyZW50O1xuICAvLyBcdH1cbiAgLy8gXHRyZXR1cm4gb3JpZW50YXRpb24gPCAwO1xuICAvLyB9XG4gIDtcblxuICBfcHJvdG8udGltZVNjYWxlID0gZnVuY3Rpb24gdGltZVNjYWxlKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3J0cyA9PT0gLV90aW55TnVtID8gMCA6IHRoaXMuX3J0czsgLy8gcmVjb3JkZWQgdGltZVNjYWxlLiBTcGVjaWFsIGNhc2U6IGlmIHNvbWVvbmUgY2FsbHMgcmV2ZXJzZSgpIG9uIGFuIGFuaW1hdGlvbiB3aXRoIHRpbWVTY2FsZSBvZiAwLCB3ZSBhc3NpZ24gaXQgLV90aW55TnVtIHRvIHJlbWVtYmVyIGl0J3MgcmV2ZXJzZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3J0cyA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciB0VGltZSA9IHRoaXMucGFyZW50ICYmIHRoaXMuX3RzID8gX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGhpcy5wYXJlbnQuX3RpbWUsIHRoaXMpIDogdGhpcy5fdFRpbWU7IC8vIG1ha2Ugc3VyZSB0byBkbyB0aGUgcGFyZW50VG9DaGlsZFRvdGFsVGltZSgpIEJFRk9SRSBzZXR0aW5nIHRoZSBuZXcgX3RzIGJlY2F1c2UgdGhlIG9sZCBvbmUgbXVzdCBiZSB1c2VkIGluIHRoYXQgY2FsY3VsYXRpb24uXG4gICAgLy8gZnV0dXJlIGFkZGl0aW9uPyBVcCBzaWRlOiBmYXN0IGFuZCBtaW5pbWFsIGZpbGUgc2l6ZS4gRG93biBzaWRlOiBvbmx5IHdvcmtzIG9uIHRoaXMgYW5pbWF0aW9uOyBpZiBhIHRpbWVsaW5lIGlzIHJldmVyc2VkLCBmb3IgZXhhbXBsZSwgaXRzIGNoaWxkcmVucycgb25SZXZlcnNlIHdvdWxkbid0IGdldCBjYWxsZWQuXG4gICAgLy8oK3ZhbHVlIDwgMCAmJiB0aGlzLl9ydHMgPj0gMCkgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXZlcnNlXCIsIHRydWUpO1xuICAgIC8vIHByaW9yaXRpemUgcmVuZGVyaW5nIHdoZXJlIHRoZSBwYXJlbnQncyBwbGF5aGVhZCBsaW5lcyB1cCBpbnN0ZWFkIG9mIHRoaXMuX3RUaW1lIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgYSB0d2VlbiB0aGF0J3MgYW5pbWF0aW5nIGFub3RoZXIgdHdlZW4ncyB0aW1lU2NhbGUgaW4gdGhlIHNhbWUgcmVuZGVyaW5nIGxvb3AgKHNhbWUgcGFyZW50KSwgdGh1cyBpZiB0aGUgdGltZVNjYWxlIHR3ZWVuIHJlbmRlcnMgZmlyc3QsIGl0IHdvdWxkIGFsdGVyIF9zdGFydCBCRUZPUkUgX3RUaW1lIHdhcyBzZXQgb24gdGhhdCB0aWNrIChpbiB0aGUgcmVuZGVyaW5nIGxvb3ApLCBlZmZlY3RpdmVseSBmcmVlemluZyBpdCB1bnRpbCB0aGUgdGltZVNjYWxlIHR3ZWVuIGZpbmlzaGVzLlxuXG4gICAgdGhpcy5fcnRzID0gK3ZhbHVlIHx8IDA7XG4gICAgdGhpcy5fdHMgPSB0aGlzLl9wcyB8fCB2YWx1ZSA9PT0gLV90aW55TnVtID8gMCA6IHRoaXMuX3J0czsgLy8gX3RzIGlzIHRoZSBmdW5jdGlvbmFsIHRpbWVTY2FsZSB3aGljaCB3b3VsZCBiZSAwIGlmIHRoZSBhbmltYXRpb24gaXMgcGF1c2VkLlxuXG4gICAgdGhpcy50b3RhbFRpbWUoX2NsYW1wKC1NYXRoLmFicyh0aGlzLl9kZWxheSksIHRoaXMudG90YWxEdXJhdGlvbigpLCB0VGltZSksIHN1cHByZXNzRXZlbnRzICE9PSBmYWxzZSk7XG5cbiAgICBfc2V0RW5kKHRoaXMpOyAvLyBpZiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcgd2FzIGZhbHNlLCB0aGUgZW5kIHRpbWUgZGlkbid0IGdldCB1cGRhdGVkIGluIHRoZSBfYWxpZ25QbGF5aGVhZCgpIG1ldGhvZCwgc28gZG8gaXQgaGVyZS5cblxuXG4gICAgcmV0dXJuIF9yZWNhY2hlQW5jZXN0b3JzKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90by5wYXVzZWQgPSBmdW5jdGlvbiBwYXVzZWQodmFsdWUpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcztcbiAgICB9IC8vIHBvc3NpYmxlIGZ1dHVyZSBhZGRpdGlvbiAtIGlmIGFuIGFuaW1hdGlvbiBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBhbmQgdGhlbiAucmVzdGFydCgpIG9yIC5wbGF5KCkgb3IgLnJlc3VtZSgpIGlzIGNhbGxlZCwgcGVyaGFwcyB3ZSBzaG91bGQgZm9yY2UgaXQgYmFjayBpbnRvIHRoZSBnbG9iYWxUaW1lbGluZSBidXQgYmUgY2FyZWZ1bCBiZWNhdXNlIHdoYXQgaWYgaXQncyBhbHJlYWR5IGF0IGl0cyBlbmQ/IFdlIGRvbid0IHdhbnQgaXQgdG8ganVzdCBwZXJzaXN0IGZvcmV2ZXIgYW5kIG5vdCBnZXQgcmVsZWFzZWQgZm9yIEdDLlxuICAgIC8vICF0aGlzLnBhcmVudCAmJiAhdmFsdWUgJiYgdGhpcy5fdFRpbWUgPCB0aGlzLl90RHVyICYmIHRoaXMgIT09IF9nbG9iYWxUaW1lbGluZSAmJiBfZ2xvYmFsVGltZWxpbmUuYWRkKHRoaXMpO1xuXG5cbiAgICBpZiAodGhpcy5fcHMgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9wcyA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcFRpbWUgPSB0aGlzLl90VGltZSB8fCBNYXRoLm1heCgtdGhpcy5fZGVsYXksIHRoaXMucmF3VGltZSgpKTsgLy8gaWYgdGhlIHBhdXNlIG9jY3VycyBkdXJpbmcgdGhlIGRlbGF5IHBoYXNlLCBtYWtlIHN1cmUgdGhhdCdzIGZhY3RvcmVkIGluIHdoZW4gcmVzdW1pbmcuXG5cbiAgICAgICAgdGhpcy5fdHMgPSB0aGlzLl9hY3QgPSAwOyAvLyBfdHMgaXMgdGhlIGZ1bmN0aW9uYWwgdGltZVNjYWxlLCBzbyBhIHBhdXNlZCB0d2VlbiB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIGEgdGltZVNjYWxlIG9mIDAuIF
12666dlIHJlY29yZCB0aGUgXCJyZWFsXCIgdGltZVNjYWxlIGFzIF9ydHMgKHJlY29yZGVkIHRpbWUgc2NhbGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfd2FrZSgpO1xuXG4gICAgICAgIHRoaXMuX3RzID0gdGhpcy5fcnRzOyAvL29ubHkgZGVmZXIgdG8gX3BUaW1lIChwYXVzZVRpbWUpIGlmIHRUaW1lIGlzIHplcm8uIFJlbWVtYmVyLCBzb21lb25lIGNvdWxkIHBhdXNlKCkgYW4gYW5pbWF0aW9uLCB0aGVuIHNjcnViIHRoZSBwbGF5aGVhZCBhbmQgcmVzdW1lKCkuIElmIHRoZSBwYXJlbnQgZG9lc24ndCBoYXZlIHNtb290aENoaWxkVGltaW5nLCB3ZSByZW5kZXIgYXQgdGhlIHJhd1RpbWUoKSBiZWNhdXNlIHRoZSBzdGFydFRpbWUgd29uJ3QgZ2V0IHVwZGF0ZWQuXG5cbiAgICAgICAgdGhpcy50b3RhbFRpbWUodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LnNtb290aENoaWxkVGltaW5nID8gdGhpcy5yYXdUaW1lKCkgOiB0aGlzLl90VGltZSB8fCB0aGlzLl9wVGltZSwgdGhpcy5wcm9ncmVzcygpID09PSAxICYmIE1hdGguYWJzKHRoaXMuX3pUaW1lKSAhPT0gX3RpbnlOdW0gJiYgKHRoaXMuX3RUaW1lIC09IF90aW55TnVtKSk7IC8vIGVkZ2UgY2FzZTogYW5pbWF0aW9uLnByb2dyZXNzKDEpLnBhdXNlKCkucGxheSgpIHdvdWxkbid0IHJlbmRlciBhZ2FpbiBiZWNhdXNlIHRoZSBwbGF5aGVhZCBpcyBhbHJlYWR5IGF0IHRoZSBlbmQsIGJ1dCB0aGUgY2FsbCB0byB0b3RhbFRpbWUoKSBiZWxvdyB3aWxsIGFkZCBpdCBiYWNrIHRvIGl0cyBwYXJlbnQuLi5hbmQgbm90IHJlbW92ZSBpdCBhZ2FpbiAoc2luY2UgcmVtb3Zpbmcgb25seSBoYXBwZW5zIHVwb24gcmVuZGVyaW5nIGF0IGEgbmV3IHRpbWUpLiBPZmZzZXR0aW5nIHRoZSBfdFRpbWUgc2xpZ2h0bHkgaXMgZG9uZSBzaW1wbHkgdG8gY2F1c2UgdGhlIGZpbmFsIHJlbmRlciBpbiB0b3RhbFRpbWUoKSB0aGF0J2xsIHBvcCBpdCBvZmYgaXRzIHRpbWVsaW5lIChpZiBhdXRvUmVtb3ZlQ2hpbGRyZW4gaXMgdHJ1ZSwgb2YgY291cnNlKS4gQ2hlY2sgdG8gbWFrZSBzdXJlIF96VGltZSBpc24ndCAtX3RpbnlOdW0gdG8gYXZvaWQgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSBwbGF5aGVhZCBpcyBwdXNoZWQgdG8gdGhlIGVuZCBidXQgSU5TSURFIGEgdHdlZW4vY2FsbGJhY2ssIHRoZSB0aW1lbGluZSBpdHNlbGYgaXMgcGF1c2VkIHRodXMgaGFsdGluZyByZW5kZXJpbmcgYW5kIGxlYXZpbmcgYSBmZXcgdW5yZW5kZXJlZC4gV2hlbiByZXN1bWluZywgaXQgd291bGRuJ3QgcmVuZGVyIHRob3NlIG90aGVyd2lzZS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uc3RhcnRUaW1lID0gZnVuY3Rpb24gc3RhcnRUaW1lKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZSh2YWx1ZSk7XG4gICAgICB2Y
12666XIgcGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpcy5fZHA7XG4gICAgICBwYXJlbnQgJiYgKHBhcmVudC5fc29ydCB8fCAhdGhpcy5wYXJlbnQpICYmIF9hZGRUb1RpbWVsaW5lKHBhcmVudCwgdGhpcywgdGhpcy5fc3RhcnQgLSB0aGlzLl9kZWxheSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RhcnQ7XG4gIH07XG5cbiAgX3Byb3RvLmVuZFRpbWUgPSBmdW5jdGlvbiBlbmRUaW1lKGluY2x1ZGVSZXBlYXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0ICsgKF9pc05vdEZhbHNlKGluY2x1ZGVSZXBlYXRzKSA/IHRoaXMudG90YWxEdXJhdGlvbigpIDogdGhpcy5kdXJhdGlvbigpKSAvIE1hdGguYWJzKHRoaXMuX3RzIHx8IDEpO1xuICB9O1xuXG4gIF9wcm90by5yYXdUaW1lID0gZnVuY3Rpb24gcmF3VGltZSh3cmFwUmVwZWF0cykge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcDsgLy8gX2RwID0gZGV0YWNoZWQgcGFyZW50XG5cbiAgICByZXR1cm4gIXBhcmVudCA/IHRoaXMuX3RUaW1lIDogd3JhcFJlcGVhdHMgJiYgKCF0aGlzLl90cyB8fCB0aGlzLl9yZXBlYXQgJiYgdGhpcy5fdGltZSAmJiB0aGlzLnRvdGFsUHJvZ3Jlc3MoKSA8IDEpID8gdGhpcy5fdFRpbWUgJSAodGhpcy5fZHVyICsgdGhpcy5fckRlbGF5KSA6ICF0aGlzLl90cyA/IHRoaXMuX3RUaW1lIDogX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUocGFyZW50LnJhd1RpbWUod3JhcFJlcGVhdHMpLCB0aGlzKTtcbiAgfTtcblxuICBfcHJvdG8ucmV2ZXJ0ID0gZnVuY3Rpb24gcmV2ZXJ0KGNvbmZpZykge1xuICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgY29uZmlnID0gX3JldmVydENvbmZpZztcbiAgICB9XG5cbiAgICB2YXIgcHJldklzUmV2ZXJ0aW5nID0gX3JldmVydGluZztcbiAgICBfcmV2ZXJ0aW5nID0gY29uZmlnO1xuXG4gICAgaWYgKF9pc1JldmVydFdvcnRoeSh0aGlzKSkge1xuICAgICAgdGhpcy50aW1lbGluZSAmJiB0aGlzLnRpbWVsaW5lLnJldmVydChjb25maWcpO1xuICAgICAgdGhpcy50b3RhbFRpbWUoLTAuMDEsIGNvbmZpZy5zdXBwcmVzc0V2ZW50cyk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhICE9PSBcIm5lc3RlZFwiICYmIGNvbmZpZy5raWxsICE9PSBmYWxzZSAmJiB0aGlzLmtpbGwoKTtcbiAgICBfcmV2ZXJ0aW5nID0gcHJldklzUmV2ZXJ0aW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5nbG9iYWxUaW1lID0gZnVuY3Rpb24gZ2xvYmFsVGltZShyYXdUaW1lKSB7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMsXG4gICAgICAgIHRpbWUgPSBhcmd1bWVudHMubGVuZ3RoID8gcmF3VGltZSA6IGFuaW1hdGlvbi5yYXdUaW1lKCk7XG5cbiAgICB3aGlsZSAoYW5pbWF0aW9uKSB7XG4gICAgICB0aW1lID0gYW5pbWF0aW9uLl9zdGFydCArIHRpbWUgLyAoTWF0aC5hYnMoYW5pbWF0aW9uLl90cykgfHwgMSk7XG4gICAgICBhbmltYXRpb24gPSBhbmltYXRpb24uX2RwO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5wYXJlbnQgJiYgdGhpcy5fc2F0ID8gdGhpcy5fc2F0Lmdsb2JhbFRpbWUocmF3VGltZSkgOiB0aW1lOyAvLyB0aGUgX3N0YXJ0QXQgdHdlZW5zIGZvciAuZnJvbVRvKCkgYW5kIC5mcm9tKCkgdGhhdCBoYXZlIGltbWVkaWF0ZVJlbmRlciBzaG91bGQgYWx3YXlzIGJlIEZJUlNUIGluIHRoZSB0aW1lbGluZSAoaW1wb3J0YW50IGZvciBjb250ZXh0LnJldmVydCgpKS4gXCJfc2F0XCIgc3RhbmRzIGZvciBfc3RhcnRBdFR3ZWVuLCByZWZlcnJpbmcgdG8gdGhlIHBhcmVudCB0d2VlbiB0aGF0IGNyZWF0ZWQgdGhlIF9zdGFydEF0LiBXZSBtdXN0IGRpc2Nlcm4gaWYgdGhhdCB0d2VlbiBoYWQgaW1tZWRpYXRlUmVuZGVyIHNvIHRoYXQgd2UgY2FuIGtub3cgd2hldGhlciBvciBub3QgdG8gcHJpb3JpdGl6ZSBpdCBpbiByZXZlcnQoKS5cbiAgfTtcblxuICBfcHJvdG8ucmVwZWF0ID0gZnVuY3Rpb24gcmVwZWF0KHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3JlcGVhdCA9IHZhbHVlID09PSBJbmZpbml0eSA/IC0yIDogdmFsdWU7XG4gICAgICByZXR1cm4gX29uVXBkYXRlVG90YWxEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwZWF0ID09PSAtMiA/IEluZmluaXR5IDogdGhpcy5fcmVwZWF0O1xuICB9O1xuXG4gIF9wcm90by5yZXBlYXREZWxheSA9IGZ1bmN0aW9uIHJlcGVhdERlbGF5KHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciB0aW1lID0gdGhpcy5fdGltZTtcbiAgICAgIHRoaXMuX3JEZWxheSA9IHZhbHVlO1xuXG4gICAgICBfb25VcGRhdGVUb3RhbER1cmF0aW9uKHRoaXMpO1xuXG4gICAgICByZXR1cm4gdGltZSA/IHRoaXMudGltZSh0aW1lKSA6IHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JEZWxheTtcbiAgfTtcblxuICBfcHJvdG8ueW95byA9IGZ1bmN0aW9uIHlveW8odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5feW95byA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3lveW87XG4gIH07XG5cbiAgX3Byb3RvLnNlZWsgPSBmdW5jdGlvbiBzZWVrKHBvc2l0aW9uLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIHJldHVybiB0aGlzLnRvdGFsVGltZShfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiksIF9pc05vdEZhbHNlKHN1cHByZXNzRXZlbnRzKSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc3RhcnQgPSBmdW5jdGlvbiByZXN0YXJ0KGluY2x1ZGVEZWxheSwgc3VwcHJlc3NFdmVudHMpIHtcbiAgICB0aGlzLnBsYXkoKS50b3RhbFRpbWUoaW5jbHVkZURlbGF5ID8gLXRoaXMuX2RlbGF5IDogMCwgX2lzTm90RmFsc2Uoc3VwcHJlc3NFdmVudHMpKTtcbiAgICB0aGlzLl9kdXIgfHwgKHRoaXMuX3pUaW1lID0gLV90aW55TnVtKTsgLy8gZW5zdXJlcyBvbkNvbXBsZXRlIGZpcmVzIG9uIGEgemVyby1kdXJhdGlvbiBhbmltYXRpb24gdGhhdCBnZXRzIHJlc3RhcnRlZC5cblxuICAgI
12666HJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5wbGF5ID0gZnVuY3Rpb24gcGxheShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGZyb20gIT0gbnVsbCAmJiB0aGlzLnNlZWsoZnJvbSwgc3VwcHJlc3NFdmVudHMpO1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VkKGZhbHNlKS5wYXVzZWQoZmFsc2UpO1xuICB9O1xuXG4gIF9wcm90by5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGZyb20gIT0gbnVsbCAmJiB0aGlzLnNlZWsoZnJvbSB8fCB0aGlzLnRvdGFsRHVyYXRpb24oKSwgc3VwcHJlc3NFdmVudHMpO1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VkKHRydWUpLnBhdXNlZChmYWxzZSk7XG4gIH07XG5cbiAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoYXRUaW1lLCBzdXBwcmVzc0V2ZW50cykge1xuICAgIGF0VGltZSAhPSBudWxsICYmIHRoaXMuc2VlayhhdFRpbWUsIHN1cHByZXNzRXZlbnRzKTtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQodHJ1ZSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc3VtZSA9IGZ1bmN0aW9uIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQoZmFsc2UpO1xuICB9O1xuXG4gIF9wcm90by5yZXZlcnNlZCA9IGZ1bmN0aW9uIHJldmVyc2VkKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICEhdmFsdWUgIT09IHRoaXMucmV2ZXJzZWQoKSAmJiB0aGlzLnRpbWVTY2FsZSgtdGhpcy5fcnRzIHx8ICh2YWx1ZSA/IC1fdGlueU51bSA6IDApKTsgLy8gaW4gY2FzZSB0aW1lU2NhbGUgaXMgemVybywgcmV2ZXJzaW5nIHdvdWxkIGhhdmUgbm8gZWZmZWN0IHNvIHdlIHVzZSBfdGlueU51bS5cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3J0cyA8IDA7XG4gIH07XG5cbiAgX3Byb3RvLmludmFsaWRhdGUgPSBmdW5jdGlvbiBpbnZhbGlkYXRlKCkge1xuICAgIHRoaXMuX2luaXR0ZWQgPSB0aGlzLl9hY3QgPSAwO1xuICAgIHRoaXMuX3pUaW1lID0gLV90aW55TnVtO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5pc0FjdGl2ZSA9IGZ1bmN0aW9uIGlzQWN0aXZlKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcCxcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9zdGFydCxcbiAgICAgICAgcmF3VGltZTtcbiAgICByZXR1cm4gISEoIXBhcmVudCB8fCB0aGlzLl90cyAmJiB0aGlzLl9pbml0dGVkICYmIHBhcmVudC5pc0FjdGl2ZSgpICYmIChyYXdUaW1lID0gcGFyZW50LnJhd1RpbWUodHJ1ZSkpID49IHN0YXJ0ICYmIHJhd1RpbWUgPCB0aGlzLmVuZFRpbWUodHJ1ZSkgLSBfdGlueU51bSk7XG4gIH07XG5cbiAgX3Byb3RvLmV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbiBldmVudENhbGxiYWNrKHR5cGUsIGNhbGxiYWNrLCBwYXJhbXMpIHtcbiAgICB2YXIgdmFycyA9IHRoaXMudmFycztcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICBkZWxldGUgdmFyc1t0eXBlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNbdHlwZV0gPSBjYWxsYmFjaztcbiAgICAgICAgcGFyYW1zICYmICh2YXJzW3R5cGUgKyBcIlBhcmFtc1wiXSA9IHBhcmFtcyk7XG4gICAgICAgIHR5cGUgPT09IFwib25VcGRhdGVcIiAmJiAodGhpcy5fb25VcGRhdGUgPSBjYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB2YXJzW3R5cGVdO1xuICB9O1xuXG4gIF9wcm90by50aGVuID0gZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgcHJldlByb20gPSBzZWxmLl9wcm9tO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZS
12666hmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgdmFyIGYgPSBfaXNGdW5jdGlvbihvbkZ1bGZpbGxlZCkgPyBvbkZ1bGZpbGxlZCA6IF9wYXNzVGhyb3VnaCxcbiAgICAgICAgICBfcmVzb2x2ZSA9IGZ1bmN0aW9uIF9yZXNvbHZlKCkge1xuICAgICAgICB2YXIgX3RoZW4gPSBzZWxmLnRoZW47XG4gICAgICAgIHNlbGYudGhlbiA9IG51bGw7IC8vIHRlbXBvcmFyaWx5IG51bGwgdGhlIHRoZW4oKSBtZXRob2QgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbnNvY2svR1NBUC9pc3N1ZXMvMzIyKVxuXG4gICAgICAgIHByZXZQcm9tICYmIHByZXZQcm9tKCk7XG4gICAgICAgIF9pc0Z1bmN0aW9uKGYpICYmIChmID0gZihzZWxmKSkgJiYgKGYudGhlbiB8fCBmID09PSBzZWxmKSAmJiAoc2VsZi50aGVuID0gX3RoZW4pO1xuICAgICAgICByZXNvbHZlKGYpO1xuICAgICAgICBzZWxmLnRoZW4gPSBfdGhlbjtcbiAgICAgIH07XG5cbiAgICAgIGlmIChzZWxmLl9pbml0dGVkICYmIHNlbGYudG90YWxQcm9ncmVzcygpID09PSAxICYmIHNlbGYuX3RzID49IDAgfHwgIXNlbGYuX3RUaW1lICYmIHNlbGYuX3RzIDwgMCkge1xuICAgICAgICBfcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5fcHJvbSA9IF9yZXNvbHZlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5raWxsID0gZnVuY3Rpb24ga2lsbCgpIHtcbiAgICBfaW50ZXJydXB0KHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBBbmltYXRpb247XG59KCk7XG5cbl9zZXREZWZhdWx0cyhBbmltYXRpb24ucHJvdG90eXBlLCB7XG4gIF90aW1lOiAwLFxuICBfc3RhcnQ6IDAsXG4gIF9lbmQ6IDAsXG4gIF90VGltZTogMCxcbiAgX3REdXI6IDAsXG4gIF9kaXJ0eTogMCxcbiAgX3JlcGVhdDogMCxcbiAgX3lveW86IGZhbHNlLFxuICBwYXJlbnQ6IG51bGwsXG4gIF9pbml0dGVkOiBmYWxzZSxcbiAgX3JEZWxheTogMCxcbiAgX3RzOiAxLFxuICBfZHA6IDAsXG4gIHJhdGlvOiAwLFxuICBfelRpbWU6IC1fdGlueU51bSxcbiAgX3Byb206IDAsXG4gIF9wczogZmFsc2UsXG4gIF9ydHM6IDFcbn0pO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRJTUVMSU5FXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG5leHBvcnQgdmFyIFRpbWVsaW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5pbWF0aW9uKSB7XG4gIF9pbmhlcml0c0xvb3NlKFRpbWVsaW5lLCBfQW5pbWF0aW9uKTtcblxuICBmdW5jdGlvbiBUaW1lbGluZSh2YXJzLCBwb3NpdGlvbikge1xuICAgIHZhciBfdGhpcztcblxuICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcbiAgICAgIHZhcnMgPSB7fTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9BbmltYXRpb24uY2FsbCh0aGlzLCB2YXJzKSB8fCB0aGlzO1xuICAgIF90aGlzLmxhYmVscyA9IHt9O1xuICAgIF90aGlzLnNtb290aENoaWxkVGltaW5nID0gISF2YXJzLnNtb290aENoaWxkVGltaW5nO1xuICAgIF90aGlzLmF1dG9SZW1vdmVDaGlsZHJlbiA9ICEhdmFycy5hdXRvUmVtb3ZlQ2hpbGRyZW47XG4gICAgX3RoaXMuX3NvcnQgPSBfaXNOb3RGYWxzZSh2YXJzLnNvcnRDaGlsZHJlbik7XG4gICAgX2dsb2JhbFRpbWVsaW5lICYmIF9hZGRUb1RpbWVsaW5lKHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIHBvc2l0aW9uKTtcbiAgICB2YXJzLnJldmVyc2VkICYmIF90aGlzLnJldmVyc2UoKTtcbiAgICB2YXJzLnBhdXNlZCAmJiBfdGhpcy5wYXVzZWQodHJ1ZSk7XG4gICAgdmFycy5zY3JvbGxUcmlnZ2VyICYmIF9zY3JvbGxUcmlnZ2VyKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCB2YXJzLnNjcm9sbFRyaWdnZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gVGltZWxpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90bzIudG8gPSBmdW5jdGlvbiB0byh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xuICAgIF9jcmVhdGVUd2VlblR5cGUoMCwgYXJndW1lbnRzLCB0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuZnJvbSA9IGZ1bmN0aW9uIGZyb20odGFyZ2V0cywgdmFycywgcG9zaXRpb24pIHtcbiAgICBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cywgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8yLmZyb21UbyA9IGZ1bmN0aW9uIGZyb21Ubyh0YXJnZXRzLCBmcm9tVmFycywgdG9WYXJzLCBwb3NpdGlvbikge1xuICAgIF9jcmVhdGVUd2VlblR5cGUoMiwgYXJndW1lbnRzLCB0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uKSB7XG4gICAgdmFycy5kdXJhdGlvbiA9IDA7XG4gICAgdmFycy5wYXJlbnQgPSB0aGlzO1xuICAgIF9pbmhlcml0RGVmYXVsdHModmFycykucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XG4gICAgdmFycy5pbW1lZGlhdGVSZW5kZXIgPSAhIXZhcnMuaW1tZWRpYXRlUmVuZGVyO1xuICAgIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzLCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiksIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuY2FsbCA9IGZ1bmN0aW9uIGNhbGwoY2FsbGJhY2ssIHBhcmFtcywgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gX2FkZFRvVGltZWxpbmUodGhpcywgVHdlZW4uZGVsYXllZENhbGwoMCwgY2FsbGJhY2ssIHBhcmFtcyksIHBvc2l0aW9uKTtcbiAgfSAvL09OTFkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkhIE1heWJlIGRlbGV0ZT9cbiAgO1xuXG4gIF9wcm90bzIuc3RhZ2dlclRvID0gZnVuY3Rpb24gc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcykge1xuICAgIHZhcnMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICB2YXJzLnN0YWdnZXIgPSB2YXJzLnN0YWdnZXIgfHwgc3RhZ2dlcjtcbiAgICB2YXJzLm9uQ29tcGxldGUgPSBvbkNvbXBsZXRlQWxsO1xuICAgIHZhcnMub25Db21wbGV0ZVBhcmFtcyA9IG9uQ29tcGxldGVBbGxQYXJhbXM7XG4gICAgdmFycy5wYXJlbnQgPSB0aGlzO1xuICAgIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzLCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbikpO1xuICAgIHJldHVybi
12666B0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuc3RhZ2dlckZyb20gPSBmdW5jdGlvbiBzdGFnZ2VyRnJvbSh0YXJnZXRzLCBkdXJhdGlvbiwgdmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcbiAgICB2YXJzLnJ1bkJhY2t3YXJkcyA9IDE7XG4gICAgX2luaGVyaXREZWZhdWx0cyh2YXJzKS5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZSh2YXJzLmltbWVkaWF0ZVJlbmRlcik7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcyk7XG4gIH07XG5cbiAgX3Byb3RvMi5zdGFnZ2VyRnJvbVRvID0gZnVuY3Rpb24gc3RhZ2dlckZyb21Ubyh0YXJnZXRzLCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcbiAgICB0b1ZhcnMuc3RhcnRBdCA9IGZyb21WYXJzO1xuICAgIF9pbmhlcml0RGVmYXVsdHModG9WYXJzKS5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZSh0b1ZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcbiAgICByZXR1cm4gdGhpcy5zdGFnZ2VyVG8odGFyZ2V0cywgZHVyYXRpb24sIHRvVmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpO1xuICB9O1xuXG4gIF9wcm90bzIucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG4gICAgdmFyIHByZXZUaW1lID0gdGhpcy5fdGltZSxcbiAgICAgICAgdER1ciA9IHRoaXMuX2RpcnR5ID8gdGhpcy50b3RhbER1cmF0aW9uKCkgOiB0aGlzLl90RHVyLFxuICAgICAgICBkdXIgPSB0aGlzLl9kdXIsXG4gICAgICAgIHRUaW1lID0gdG90YWxUaW1lIDw9IDAgPyAwIDogX3JvdW5kUHJlY2lzZSh0b3RhbFRpbWUpLFxuICAgICAgICAvLyBpZiBhIHBhdXNlZCB0aW1lbGluZSBpcyByZXN1bWVkIChvciBpdHMgX3N0YXJ0IGlzIHVwZGF0ZWQgZm9yIGFub3RoZXIgcmVhc29uLi4ud2hpY2ggcm91bmRzIGl0KSwgdGhhdCBjb3VsZCByZXN1bHQgaW4gdGhlIHBsYXloZWFkIHNoaWZ0aW5nIGEgKip0aW55KiogYW1vdW50IGFuZCBhIHplcm8tZHVyYXRpb24gY2hpbGQgYXQgdGhhdCBzcG90IG1heSBnZXQgcmVuZGVyZWQgYXQgYSBkaWZmZXJlbnQgcmF0aW8sIGxpa2UgaXRzIHRvdGFsVGltZSBpbiByZW5kZXIoKSBtYXkgYmUgMWUtMTcgaW5zdGVhZCBvZiAwLCBmb3IgZXhhbXBsZS5cbiAgICBjcm9zc2luZ1N0YXJ0ID0gdGhpcy5felRpbWUgPCAwICE9PSB0b3RhbFRpbWUgPCAwICYmICh0aGlzLl9pbml0dGVkIHx8ICFkdXIpLFxuICAgICAgICB0aW1lLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgbmV4dCxcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjeWNsZUR1cmF0aW9uLFxuICAgICAgICBwcmV2UGF1c2VkLFxuICAgICAgICBwYXVzZVR3ZWVuLFxuICAgICAgICB0aW1lU2NhbGUsXG4gICAgICAgIHByZXZTdGFydCxcbiAgICAgICAgcHJldkl0ZXJhdGlvbixcbiAgICAgICAgeW95byxcbiAgICAgICAgaXNZb3lvO1xuICAgIHRoaXMgIT09IF9nbG9iYWxUaW1lbGluZSAmJiB0VGltZSA+IHREdXIgJiYgdG90YWxUaW1lID49IDAgJiYgKHRUaW1lID0gdER1cik7XG5cbiAgICBpZiAodFRpbWUgIT09IHRoaXMuX3RUaW1lIHx8IGZvcmNlIHx8IGNyb3NzaW5nU3RhcnQpIHtcbiAgICAgIGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSAmJiBkdXIpIHtcbiAgICAgICAgLy9pZiB0b3RhbER1cmF0aW9uKCkgZmluZHMgYSBjaGlsZCB3aXRoIGEgbmVnYXRpdmUgc3RhcnRUaW1lIGFuZCBzbW9vdGhDaGlsZFRpbWluZyBpcyB0cnVlLCB0aGluZ3MgZ2V0IHNoaWZ0ZWQgYXJvdW5kIGludGVybmFsbHkgc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHRpbWUgYWNjb3JkaW5nbHkuIEZvciBleGFtcGxlLCBpZiBhIHR3ZWVuIHN0YXJ0cyBhdCAtMzAgd2UgbXVzdCBzaGlmdCBFVkVSWVRISU5HIGZvcndhcmQgMzAgc2Vjb25kcyBhbmQgbW92ZSB0aGlzIHRpbWVsaW5lJ3Mgc3RhcnRUaW1lIGJhY2t3YXJkIGJ5IDMwIHNlY29uZHMgc28gdGhhdCB0aGluZ3MgYWxpZ24gd2l0aCB0aGUgcGxheWhlYWQgKG5vIGp1bXApLlxuICAgICAgICB0VGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbW
12666U7XG4gICAgICAgIHRvdGFsVGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbWU7XG4gICAgICB9XG5cbiAgICAgIHRpbWUgPSB0VGltZTtcbiAgICAgIHByZXZTdGFydCA9IHRoaXMuX3N0YXJ0O1xuICAgICAgdGltZVNjYWxlID0gdGhpcy5fdHM7XG4gICAgICBwcmV2UGF1c2VkID0gIXRpbWVTY2FsZTtcblxuICAgICAgaWYgKGNyb3NzaW5nU3RhcnQpIHtcbiAgICAgICAgZHVyIHx8IChwcmV2VGltZSA9IHRoaXMuX3pUaW1lKTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0aW1lbGluZSwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC5cblxuICAgICAgICAodG90YWxUaW1lIHx8ICFzdXBwcmVzc0V2ZW50cykgJiYgKHRoaXMuX3pUaW1lID0gdG90YWxUaW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlcGVhdCkge1xuICAgICAgICAvL2FkanVzdCB0aGUgdGltZSBmb3IgcmVwZWF0cyBhbmQgeW95b3NcbiAgICAgICAgeW95byA9IHRoaXMuX3lveW87XG4gICAgICAgIGN5Y2xlRHVyYXRpb24gPSBkdXIgKyB0aGlzLl9yRGVsYXk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlcGVhdCA8IC0xICYmIHRvdGFsVGltZSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50b3RhbFRpbWUoY3ljbGVEdXJhdGlvbiAqIDEwMCArIHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBfcm91bmRQcmVjaXNlKHRUaW1lICUgY3ljbGVEdXJhdGlvbik7IC8vcm91bmQgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzLiAoNCAlIDAuOCBzaG91bGQgYmUgMCBidXQgc29tZSBicm93c2VycyByZXBvcnQgaXQgYXMgMC43OTk5OTk5OSEpXG5cbiAgICAgICAgaWYgKHRUaW1lID09PSB0RHVyKSB7XG4gICAgICAgICAgLy8gdGhlIHREdXIgPT09IHRUaW1lIGlzIGZvciBlZGdlIGNhc2VzIHdoZXJlIHRoZXJlJ3MgYSBsZW5ndGh5IGRlY2ltYWwgb24gdGhlIGR1cmF0aW9uIGFuZCBpdCBtYXkgcmVhY2ggdGhlIHZlcnkgZW5kIGJ1dCB0aGUgdGltZSBpcyByZW5kZXJlZCBhcyBub3QtcXVpdGUtdGhlcmUgKHJlbWVtYmVyLCB0RHVyIGlzIHJvdW5kZWQgdG8gNCBkZWNpbWFscyB3aGVyZWFzIGR1ciBpc24ndClcbiAgICAgICAgICBpdGVyYXRpb24gPSB0aGlzLl9yZXBlYXQ7XG4gICAgICAgICAgdGltZSA9IGR1cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2SXRlcmF0aW9uID0gX3JvdW5kUHJlY2lzZSh0VGltZSAvIGN5Y2xlRHVyYXRpb24pOyAvLyBmdWxsIGRlY2ltYWwgdmVyc2lvbiBvZiBpdGVyYXRpb25zLCBub3QgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiAod2UncmUgcmV1c2luZyBwcmV2SXRlcmF0aW9uIHZhcmlhYmxlIGZvciBlZmZpY2llbmN5KVxuXG4gICAgICAgICAgaXRlcmF0aW9uID0gfn5wcmV2SXRlcmF0aW9uO1xuXG4gICAgICAgICAgaWYgKGl0ZXJhdGlvbiAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgICAgIHRpbWUgPSBkdXI7XG4gICAgICAgICAgICBpdGVyYXRpb24tLTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aW1lID4gZHVyICYmICh0aW1lID0gZHVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZJdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pO1xuICAgICAgICAhcHJldlRpbWUgJiYgdGhpcy5fdFRpbWUgJiYgcHJldkl0ZXJhdGlvbiAhPT0gaXRlcmF0aW9uICYmIHRoaXMuX3RUaW1lIC0gcHJldkl0ZXJhdGlvbiAqIGN5Y2xlRHVyYXRpb24gLSB0aGlzLl9kdXIgPD0gMCAmJiAocHJldkl0ZXJhdGlvbiA9IGl0ZXJhdGlvbik7IC8vIGVkZ2UgY2FzZSAtIGlmIHNvbWVvbmUgZG9lcyBhZGRQYXVzZSgpIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBhIHJlcGVhdGluZyB0aW1lbGluZSwgdGhhdCBwYXVzZSBpcyB0ZWNobmljYWxseSBhdCB0aGUgc2FtZSBzcG90IGFzIHRoZSBlbmQgd2hpY2ggY2F1c2VzIHRoaXMuX3RpbWUgdG8gZ2V0IHNldCB0byAwIHdoZW4gdGhlIHRvdGFsVGltZSB3b3VsZCBub3JtYWxseSBwbGFjZSB0aGUgcGxheWhlYWQgYXQgdGhlIGVuZC4gU2VlIGh0dHBzOi8vZ3NhcC5jb20vZm9ydW1zL3RvcGljLzIzODIzLWNsb3NpbmctbmF2LWFuaW1hdGlvbi1ub3Qtd29ya2luZy1vbi1pZS1hbmQtaXBob25lLTYtbWF5YmUtb3RoZXItb2xkZXItYnJvd3Nlci8/dGFiPWNvbW1lbnRzI2NvbW1lbnQtMTEzMDA1IGFsc28sIHRoaXMuX3RUaW1lIC0gcHJldkl0ZXJhdGlvbiAqIGN5Y2xlRHVyYXRpb24gLSB0aGlzLl9kdXIgPD0gMCBqdXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgaXQgd2Fzbid0IHByZXZpb3VzbHkgaW4gdGhlIFwicmVwZWF0RGVsYXlcIiBwb3J0aW9uXG5cbiAgICAgICAgaWYgKHlveW8gJiYgaXRlcmF0aW9uICYgMSkge1xuICAgICAgICAgIHRpbWUgPSBkdXIgLSB0aW1lO1xuICAgICAgICAgIGlzWW95byA9IDE7XG4gICAgICAgI
12666H1cbiAgICAgICAgLypcbiAgICAgICAgbWFrZSBzdXJlIGNoaWxkcmVuIGF0IHRoZSBlbmQvYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZSBhcmUgcmVuZGVyZWQgcHJvcGVybHkuIElmLCBmb3IgZXhhbXBsZSxcbiAgICAgICAgYSAzLXNlY29uZCBsb25nIHRpbWVsaW5lIHJlbmRlcmVkIGF0IDIuOSBzZWNvbmRzIHByZXZpb3VzbHksIGFuZCBub3cgcmVuZGVycyBhdCAzLjIgc2Vjb25kcyAod2hpY2hcbiAgICAgICAgd291bGQgZ2V0IHRyYW5zbGF0ZWQgdG8gMi44IHNlY29uZHMgaWYgdGhlIHRpbWVsaW5lIHlveW9zIG9yIDAuMiBzZWNvbmRzIGlmIGl0IGp1c3QgcmVwZWF0cyksIHRoZXJlXG4gICAgICAgIGNvdWxkIGJlIGEgY2FsbGJhY2sgb3IgYSBzaG9ydCB0d2VlbiB0aGF0J3MgYXQgMi45NSBvciAzIHNlY29uZHMgaW4gd2hpY2ggd291bGRuJ3QgcmVuZGVyLiBTb1xuICAgICAgICB3ZSBuZWVkIHRvIHB1c2ggdGhlIHRpbWVsaW5lIHRvIHRoZSBlbmQgKGFuZC9vciBiZWdpbm5pbmcgZGVwZW5kaW5nIG9uIGl0cyB5b3lvIHZhbHVlKS4gQWxzbyB3ZSBtdXN0XG4gICAgICAgIGVuc3VyZSB0aGF0IHplcm8tZHVyYXRpb24gdHdlZW5zIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIFRpbWVsaW5lIHdvcmsuXG4gICAgICAgICovXG5cblxuICAgICAgICBpZiAoaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uICYmICF0aGlzLl9sb2NrKSB7XG4gICAgICAgICAgdmFyIHJld2luZGluZyA9IHlveW8gJiYgcHJldkl0ZXJhdGlvbiAmIDEsXG4gICAgICAgICAgICAgIGRvZXNXcmFwID0gcmV3aW5kaW5nID09PSAoeW95byAmJiBpdGVyYXRpb24gJiAxKTtcbiAgICAgICAgICBpdGVyYXRpb24gPCBwcmV2SXRlcmF0aW9uICYmIChyZXdpbmRpbmcgPSAhcmV3aW5kaW5nKTtcbiAgICAgICAgICBwcmV2VGltZSA9IHJld2luZGluZyA/IDAgOiB0VGltZSAlIGR1ciA/IGR1ciA6IHRUaW1lOyAvLyBpZiB0aGUgcGxheWhlYWQgaXMgbGFuZGluZyBleGFjdGx5IGF0IHRoZSBlbmQgb2YgYW4gaXRlcmF0aW9uLCB1c2UgdGhhdCB0b3RhbFRpbWUgcmF0aGVyIHRoYW4gb25seSB0aGUgZHVyYXRpb24sIG90aGVyd2lzZSBpdCdsbCBza2lwIHRoZSAybmQgcmVuZGVyIHNpbmNlIGl0J3MgZWZmZWN0aXZlbHkgYXQgdGhlIHNhbWUgdGltZS5cblxuICAgICAgICAgIHRoaXMuX2xvY2sgPSAxO1xuICAgICAgICAgIHRoaXMucmVuZGVyKHByZXZUaW1lIHx8IChpc1lveW8gPyAwIDogX3JvdW5kUHJlY2lzZShpdGVyYXRpb24gKiBjeWNsZUR1cmF0aW9uKSksIHN1cHByZXNzRXZlbnRzLCAhZHVyKS5fbG9jayA9IDA7XG4gICAgICAgICAgdGhpcy5fdFRpbWUgPSB0VGltZTsgLy8gaWYgYSB1c2VyIGdldHMgdGhlIGl0ZXJhdGlvbigpIGluc2lkZSB0aGUgb25SZXBlYXQsIGZvciBleGFtcGxlLCBpdCBzaG91bGQgYmUgYWNjdXJhdGUuXG5cbiAgICAgICAgICAhc3VwcHJlc3NFdmVudHMgJiYgdGhpcy5wYXJlbnQgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXBlYXRcIik7XG5cbiAgICAgICAgICBpZiAodGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgIWlzWW95bykge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCkuX2xvY2sgPSAxO1xuICAgICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IGl0ZXJhdGlvbjsgLy8gb3RoZXJ3aXNlLCB0aGUgb25TdGFydCgpIG1heSBmaXJlIG9uIHRoZSAybmQgaXRlcmF0aW9uLlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcmV2VGltZSAmJiBwcmV2VGltZSAhPT0gdGhpcy5fdGltZSB8fCBwcmV2UGF1c2VkICE9PSAhdGhpcy5fdHMgfHwgdGhpcy52YXJzLm9uUmVwZWF0ICYmICF0aGlzLnBhcmVudCAmJiAhdGhpcy5fYWN0KSB7XG4gICAgICAgICAgICAvLyBpZiBwcmV2VGltZSBpcyAwIGFuZCB3ZSByZW5kZXIgYXQgdGhlIHZlcnkgZW5kLCBfdGltZSB3aWxsIGJlIHRoZSBlbmQsIHRodXMgd29uJ3QgbWF0Y2guIFNvIGluIHRoaXMgZWRnZSBjYXNlLCBwcmV2VGltZSB3b24ndCBtYXRjaCBfdGltZSBidXQgdGhhdCdzIG9rYXkuIElmIGl0IGdldHMga2lsbGVkIGluIHRoZSBvblJlcGVhdCwgZWplY3QgYXMgd2VsbC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGR1ciA9IHRoaXMuX2R1cjsgLy8gaW4gY2FzZSB0aGUgZHVyYXRpb24gY2hhbmdlZCBpbiB0aGUgb25SZXBlYXRcblxuICAgICAgICAgIHREdXIgPSB0aGlzLl90RHVyO1xuXG4gICAgICAgICAgaWYgKGRvZXNXcmFwKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NrID0gMjtcbiAgICAgICAgICAgIHByZXZUaW1lID0gcmV3aW5kaW5nID8gZHVyIDogLTAuMDAwMTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKHByZXZUaW1lLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMudmFycy5yZXBlYXRSZWZyZXNoICYmICFpc1lveW8gJiYgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbG9jayA9IDA7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuX3RzICYmICFwcmV2UGF1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2hhc1BhdXNlICYmICF0aGlzLl9mb3JjaW5nICYmIHRoaXMuX2xvY2sgPCAyKSB7XG4gICAgICAgIHBhdXNlVHdlZW4gPSBfZmluZE5leHRQYXVzZVR3ZWVuKHRoaXMsIF9yb3VuZFByZWNpc2UocHJldlRpbWUpLCBfcm91bmRQcmVjaXNlKHRpbWUpKTtcblxuICAgICAgICBpZiAocGF1c2VUd2Vlbikge1xuICAgICAgICAgIHRUaW1lIC09IHRpbWUgLSAodGltZSA9IHBhdXNlVHdlZW4uX3N0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl90VGltZSA9IHRUaW1lO1xuICAgICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgICB0aGlzLl9hY3QgPSAhIXRpbWVTY2FsZTsgLy8gYXMgbG9uZyBhcyBpdCdzIG5vdCBwYXVzZWQsIGZvcmNlIGl0IHRvIGJlIGFjdGl2ZSBzbyB0aGF0IGlmIHRoZSB1c2VyIHJlbmRlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcmVudCB0aW1lbGluZSwgaXQnbGwgYmUgZm9yY2VkIHRvIHJlLXJlbmRlciBvbiB0aGUgbmV4dCB0aWNrLlxuXG4gICAgICBpZiAoIXRoaXMuX2luaXR0ZWQpIHtcbiAgICAgICAgdGhpcy5fb25VcGRhdGUgPSB0aGlzLnZhcnMub25VcGRhdGU7XG4gICAgICAgI
12666HRoaXMuX2luaXR0ZWQgPSAxO1xuICAgICAgICB0aGlzLl96VGltZSA9IHRvdGFsVGltZTtcbiAgICAgICAgcHJldlRpbWUgPSAwOyAvLyB1cG9uIGluaXQsIHRoZSBwbGF5aGVhZCBzaG91bGQgYWx3YXlzIGdvIGZvcndhcmQ7IHNvbWVvbmUgY291bGQgaW52YWxpZGF0ZSgpIGEgY29tcGxldGVkIHRpbWVsaW5lIGFuZCB0aGVuIGlmIHRoZXkgcmVzdGFydCgpLCB0aGF0IHdvdWxkIG1ha2UgY2hpbGQgdHdlZW5zIHJlbmRlciBpbiByZXZlcnNlIG9yZGVyIHdoaWNoIGNvdWxkIGxvY2sgaW4gdGhlIHdyb25nIHN0YXJ0aW5nIHZhbHVlcyBpZiB0aGV5IGJ1aWxkIG9uIGVhY2ggb3RoZXIsIGxpa2UgdGwudG8ob2JqLCB7eDogMTAwfSkudG8ob2JqLCB7eDogMH0pLlxuICAgICAgfVxuXG4gICAgICBpZiAoIXByZXZUaW1lICYmIHRUaW1lICYmIGR1ciAmJiAhc3VwcHJlc3NFdmVudHMgJiYgIXByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgX2NhbGxiYWNrKHRoaXMsIFwib25TdGFydFwiKTtcblxuICAgICAgICBpZiAodGhpcy5fdFRpbWUgIT09IHRUaW1lKSB7XG4gICAgICAgICAgLy8gaW4gY2FzZSB0aGUgb25TdGFydCB0cmlnZ2VyZWQgYSByZW5kZXIgYXQgYSBkaWZmZXJlbnQgc3BvdCwgZWplY3QuIExpa2UgaWYgc29tZW9uZSBkaWQgYW5pbWF0aW9uLnBhdXNlKDAuNSkgb3Igc29tZXRoaW5nIGluc2lkZSB0aGUgb25TdGFydC5cbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGltZSA+PSBwcmV2VGltZSAmJiB0b3RhbFRpbWUgPj0gMCkge1xuICAgICAgICBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcblxuICAgICAgICAgIGlmICgoY2hpbGQuX2FjdCB8fCB0aW1lID49IGNoaWxkLl9zdGFydCkgJiYgY2hpbGQuX3RzICYmIHBhdXNlVHdlZW4gIT09IGNoaWxkKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICAgIC8vIGFuIGV4dHJlbWUgZWRnZSBjYXNlIC0gdGhlIGNoaWxkJ3MgcmVuZGVyIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGtpbGwoKSB0aGUgXCJuZXh0XCIgb25lIGluIHRoZSBsaW5rZWQgbGlzdCwgb3IgcmVwYXJlbnQgaXQuIEluIHRoYXQgY2FzZSB3ZSBtdXN0IHJlLWluaXRpYXRlIHRoZSB3aG9sZSByZW5kZXIgdG8gYmUgc2FmZS5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hpbGQucmVuZGVyKGNoaWxkLl90cyA+IDAgPyAodGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMgOiAoY2hpbGQuX2RpcnR5ID8gY2hpbGQudG90YWxEdXJhdGlvbigpIDogY2hpbGQuX3REdXIpICsgKHRpbWUgLSBjaGlsZC5fc3RhcnQpICogY2hpbGQuX3RzLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuXG4gICAgICAgICAgICBpZiAodGltZSAhPT0gdGhpcy5fdGltZSB8fCAhdGhpcy5fdHMgJiYgIXByZXZQYXVzZWQpIHtcbiAgICAgICAgICAgICAgLy9pbiBjYXNlIGEgdHdlZW4gcGF1c2VzIG9yIHNlZWtzIHRoZSB0aW1lbGluZSB3aGVuIHJlbmRlcmluZywgbGlrZSBpbnNpZGUgb2YgYW4gb25VcGRhdGUvb25Db21wbGV0ZVxuICAgICAgICAgICAgICBwYXVzZVR3ZWVuID0gMDtcbiAgICAgICAgICAgICAgbmV4dCAmJiAodFRpbWUgKz0gdGhpcy5felRpbWUgPSAtX3RpbnlOdW0pOyAvLyBpdCBkaWRuJ3QgZmluaXNoIHJlbmRlcmluZywgc28gZmxhZyB6VGltZSBhcyBuZWdhdGl2ZSBzbyB0aGF0IHRoZSBuZXh0IHRpbWUgcmVuZGVyKCkgaXMgY2FsbGVkIGl0J2xsIGJlIGZvcmNlZCAodG8gcmVuZGVyIGFueSByZW1haW5pbmcgY2hpbGRyZW4pXG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZCA9IHRoaXMuX2xhc3Q7XG4gICAgICAgIHZhciBhZGp1c3RlZFRpbWUgPSB0b3RhbFRpbWUgPCAwID8gdG90YWxUaW1lIDogdGltZTsgLy93aGVuIHRoZSBwbGF5aGVhZCBnb2VzIGJhY2t3YXJkIGJleW9uZCB0aGUgc3RhcnQgb2YgdGhpcyB0aW1lbGluZSwgd2UgbXVzdCBwYXNzIHRoYXQgaW5mb3JtYXRpb24gZG93biB0byB0aGUgY2hpbGQgYW5pbWF0aW9ucyBzbyB0aGF0IHplcm8tZHVyYXRpb24gdHdlZW5zIGtub3cgd2hldGhlciB0byByZW5kZXIgdGhlaXIgc3RhcnRpbmcgb3IgZW5kaW5nIHZhbHVlcy5cblxuICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICBuZXh0ID0gY2hpbGQuX3ByZXY7XG5cbiAgICAgICAgICBpZiAoKGNoaWxkLl9hY3QgfHwgYWRqdXN0ZWRUaW1lIDw9IGNoaWxkLl9lbmQpICYmIGNoaWxkLl90cyAmJiBwYXVzZVR3ZWVuICE9PSBjaGlsZCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAvLyBhbiBleHRyZW1lIGVkZ2UgY2FzZSAtIHRoZSBjaGlsZCdzIHJlbmRlciBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSBraWxsKCkgdGhlIFwibmV4dFwiIG9uZSBpbiB0aGUgbGlua2VkIGxpc3QsIG9yIHJlcGFyZW50IGl0LiBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZS1pbml0aWF0ZSB0aGUgd2hvbGUgcmVuZGVyIHRvIGJlIHNhZmUuXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcih0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkLnJlbmRlcihjaGlsZC5fdHMgPiAwID8gKGFkanVzdGVkVGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMgOiAoY2hpbGQuX2RpcnR5ID8gY2hpbGQudG90YWxEdXJhdGlvbigpIDogY2hpbGQuX3REdXIpICsgKGFkanVzdGVkVGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSB8fCBfcmV2ZXJ0aW5nICYmIF9pc1JldmVydFdvcnRoeShjaGlsZCkpOyAvLyBpZiByZX
12666ZlcnRpbmcsIHdlIHNob3VsZCBhbHdheXMgZm9yY2UgcmVuZGVycyBvZiBpbml0dGVkIHR3ZWVucyAoYnV0IHJlbWVtYmVyIHRoYXQgLmZyb21UbygpIG9yIC5mcm9tKCkgbWF5IGhhdmUgYSBfc3RhcnRBdCBidXQgbm90IF9pbml0dGVkIHlldCkuIElmLCBmb3IgZXhhbXBsZSwgYSAuZnJvbVRvKCkgdHdlZW4gd2l0aCBhIHN0YWdnZXIgKHdoaWNoIGNyZWF0ZXMgYW4gaW50ZXJuYWwgdGltZWxpbmUpIGdldHMgcmV2ZXJ0ZWQgQkVGT1JFIHNvbWUgb2YgaXRzIGNoaWxkIHR3ZWVucyByZW5kZXIgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBtYXkgbm90IHByb3Blcmx5IHRyaWdnZXIgdGhlbSB0byByZXZlcnQuXG5cbiAgICAgICAgICAgIGlmICh0aW1lICE9PSB0aGlzLl90aW1lIHx8ICF0aGlzLl90cyAmJiAhcHJldlBhdXNlZCkge1xuICAgICAgICAgICAgICAvL2luIGNhc2UgYSB0d2VlbiBwYXVzZXMgb3Igc2Vla3MgdGhlIHRpbWVsaW5lIHdoZW4gcmVuZGVyaW5nLCBsaWtlIGluc2lkZSBvZiBhbiBvblVwZGF0ZS9vbkNvbXBsZXRlXG4gICAgICAgICAgICAgIHBhdXNlVHdlZW4gPSAwO1xuICAgICAgICAgICAgICBuZXh0ICYmICh0VGltZSArPSB0aGlzLl96VGltZSA9IGFkanVzdGVkVGltZSA/IC1fdGlueU51bSA6IF90aW55TnVtKTsgLy8gaXQgZGlkbid0IGZpbmlzaCByZW5kZXJpbmcsIHNvIGFkanVzdCB6VGltZSBzbyB0aGF0IHNvIHRoYXQgdGhlIG5leHQgdGltZSByZW5kZXIoKSBpcyBjYWxsZWQgaXQnbGwgYmUgZm9yY2VkICh0byByZW5kZXIgYW55IHJlbWFpbmluZyBjaGlsZHJlbilcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhdXNlVHdlZW4gJiYgIXN1cHByZXNzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgcGF1c2VUd2Vlbi5yZW5kZXIodGltZSA+PSBwcmV2VGltZSA/IDAgOiAtX3RpbnlOdW0pLl96VGltZSA9IHRpbWUgPj0gcHJldlRpbW
12666UgPyAxIDogLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RzKSB7XG4gICAgICAgICAgLy90aGUgY2FsbGJhY2sgcmVzdW1lZCBwbGF5YmFjayEgU28gc2luY2Ugd2UgbWF5IGhhdmUgaGVsZCBiYWNrIHRoZSBwbGF5aGVhZCBkdWUgdG8gd2hlcmUgdGhlIHBhdXNlIGlzIHBvc2l0aW9uZWQsIGdvIGFoZWFkIGFuZCBqdW1wIHRvIHdoZXJlIGl0J3MgU1VQUE9TRUQgdG8gYmUgKGlmIG5vIHBhdXNlIGhhcHBlbmVkKS5cbiAgICAgICAgICB0aGlzLl9zdGFydCA9IHByZXZTdGFydDsgLy9pZiB0aGUgcGF1c2Ugd2FzIGF0IGFuIGVhcmxpZXIgdGltZSBhbmQgdGhlIHVzZXIgcmVzdW1lZCBpbiB0aGUgY2FsbGJhY2ssIGl0IGNvdWxkIHJlcG9zaXRpb24gdGhlIHRpbWVsaW5lIChjaGFuZ2luZyBpdHMgc3RhcnRUaW1lKSwgdGhyb3dpbmcgdGhpbmdzIG9mZiBzbGlnaHRseSwgc28gd2UgbWFrZSBzdXJlIHRoZSBfc3RhcnQgZG9lc24ndCBzaGlmdC5cblxuICAgICAgICAgIF9zZXRFbmQodGhpcyk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIodG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29uVXBkYXRlICYmICFzdXBwcmVzc0V2ZW50cyAmJiBfY2FsbGJhY2sodGhpcywgXCJvblVwZGF0ZVwiLCB0cnVlKTtcbiAgICAgIGlmICh0VGltZSA9PT0gdER1ciAmJiB0aGlzLl90VGltZSA+PSB0aGlzLnRvdGFsRHVyYXRpb24oKSB8fCAhdFRpbWUgJiYgcHJldlRpbWUpIGlmIChwcmV2U3RhcnQgPT09IHRoaXMuX3N0YXJ0IHx8IE1hdGguYWJzKHRpbWVTY2FsZSkgIT09IE1hdGguYWJzKHRoaXMuX3RzKSkgaWYgKCF0aGlzLl9sb2NrKSB7XG4gICAgICAgIC8vIHJlbWVtYmVyLCBhIGNoaWxkJ3MgY2FsbGJhY2sgbWF5IGFsdGVyIHRoaXMgdGltZWxpbmUncyBwbGF5aGVhZCBvciB0aW1lU2NhbGUgd2hpY2ggaXMgd2h5IHdlIG5lZWQgdG8gYWRkIHNvbWUgb2YgdGhlc2UgY2hlY2tzLlxuICAgICAgICAodG90YWxUaW1lIHx8ICFkdXIpICYmICh0VGltZSA9PT0gdER1ciAmJiB0aGlzLl90cyA+IDAgfHwgIXRUaW1lICYmIHRoaXMuX3RzIDwgMCkgJiYgX3JlbW92ZUZyb21QYXJlbnQodGhpcywgMSk7IC8vIGRvbid0IHJlbW92ZSBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBwbGF5aGVhZCBpc24ndCBhdCAwLCBvdGhlcndpc2UgdGwucHJvZ3Jlc3MoMSkucmV2ZXJzZSgpIHdvbid0IHdvcmsuIE9ubHkgcmVtb3ZlIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCB0aGUgZW5kIGFuZCB0aW1lU2NhbGUgaXMgcG9zaXRpdmUsIG9yIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCAwIGFuZCB0aGUgdGltZVNjYWxlIGlzIG5lZ2F0aXZlLlxuXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgISh0b3RhbFRpbWUgPCAwICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8ICF0RHVyKSkge1xuICAgICAgICAgIF9jYWxsYmFjayh0aGlzLCB0VGltZSA9PT0gdER1ciAmJiB0b3RhbFRpbWUgPj0gMCA/IFwib25Db21wbGV0ZVwiIDogXCJvblJldmVyc2VDb21wbGV0ZVwiLCB0cnVlKTtcblxuICAgICAgICAgIHRoaXMuX3Byb20gJiYgISh0VGltZSA8IHREdXIgJiYgdGhpcy50aW1lU2NhbGUoKSA+IDApICYmIHRoaXMuX3Byb20oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuYWRkID0gZnVuY3Rpb24gYWRkKGNoaWxkLCBwb3NpdGlvbikge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgX2lzTnVtYmVyKHBvc2l0aW9uKSB8fCAocG9zaXRpb24gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgQW5pbWF0aW9uKSkge1xuICAgICAgaWYgKF9pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICBjaGlsZC5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLmFkZChvYmosIHBvc2l0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2lzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMYWJlbChjaGlsZCwgcG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2lzRnVuY3Rpb24oY2hpbGQpKSB7XG4gICAgICAgIGNoaWxkID0gVHdlZW4uZGVsYXllZENhbGwoMCwgY2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMgIT09IGNoaWxkID8gX2FkZFRvVGltZWxpbmUodGhpcywgY2hpbGQsIHBvc2l0aW9uKSA6IHRoaXM7IC8vZG9uJ3QgYWxsb3cgYSB0aW1lbGluZSB0byBiZSBhZGRlZCB0byBpdHNlbGYgYXMgYSBjaGlsZCFcbiAgfTtcblxuICBfcHJvdG8yLmdldENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obmVzdGVkLCB0d2VlbnMsIHRpbWVsaW5lcywgaWdub3JlQmVmb3JlVGltZSkge1xuICAgIGlmIChuZXN0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgbmVzdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHdlZW5zID09PSB2b2lkIDApIHtcbiAgICAgIHR3ZWVucyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVsaW5lcyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aW1lbGluZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpZ25vcmVCZWZvcmVUaW1lID09PSB2b2lkIDApIHtcbiAgICAgIGlnbm9yZUJlZm9yZVRpbWUgPSAtX2JpZ051bTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IFtdLFxuICAgICAgICBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVHdlZW4pIHtcbiAgICAgICAgICB0d2VlbnMgJiYgYS5wdXNoKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aW1lbGluZXMgJiYgYS5wdXNoKGNoaWxkKTtcbiAgICAgICAgICBuZXN0ZWQgJiYgYS5wdXNoLmFwcGx5KGEsIGNoaWxkLmdldENoaWxkcmVuKHRydWUsIHR3ZWVucywgdGltZWxpbmVzKSk7XG4gICAgICAgI
12666H1cbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICBfcHJvdG8yLmdldEJ5SWQgPSBmdW5jdGlvbiBnZXRCeUlkKGlkKSB7XG4gICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmdldENoaWxkcmVuKDEsIDEsIDEpLFxuICAgICAgICBpID0gYW5pbWF0aW9ucy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBpZiAoYW5pbWF0aW9uc1tpXS52YXJzLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gYW5pbWF0aW9uc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvMi5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoY2hpbGQpIHtcbiAgICBpZiAoX2lzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlTGFiZWwoY2hpbGQpO1xuICAgIH1cblxuICAgIGlmIChfaXNGdW5jdGlvbihjaGlsZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmtpbGxUd2VlbnNPZihjaGlsZCk7XG4gICAgfVxuXG4gICAgY2hpbGQucGFyZW50ID09PSB0aGlzICYmIF9yZW1vdmVMaW5rZWRMaXN0SXRlbSh0aGlzLCBjaGlsZCk7XG5cbiAgICBpZiAoY2hpbGQgPT09IHRoaXMuX3JlY2VudCkge1xuICAgICAgdGhpcy5fcmVjZW50ID0gdGhpcy5fbGFzdDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3VuY2FjaGUodGhpcyk7XG4gIH07XG5cbiAgX3Byb3RvMi50b3RhbFRpbWUgPSBmdW5jdGlvbiB0b3RhbFRpbWUoX3RvdGFsVGltZTIsIHN1cHByZXNzRXZlbnRzKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdFRpbWU7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9yY2luZyA9IDE7XG5cbiAgICBpZiAoIXRoaXMuX2RwICYmIHRoaXMuX3RzKSB7XG4gICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgdGhlIGdsb2JhbCB0aW1lbGluZSAob3IgYW55IG90aGVyIHRoYXQgaGFzIG5vIHBhcmVudCBvciBkZXRhY2hlZCBwYXJlbnQpLlxuICAgICAgdGhpcy5fc3RhcnQgPSBfcm91bmRQcmVjaXNlKF90aWNrZXIudGltZSAtICh0aGlzLl90cyA+IDAgPyBfdG90YWxUaW1lMiAvIHRoaXMuX3RzIDogKHRoaXMudG90YWxEdXJhdGlvbigpIC0gX3RvdGFsVGltZTIpIC8gLXRoaXMuX3RzKSk7XG4gICAgfVxuXG4gICAgX0FuaW1hdGlvbi5wcm90b3R5cGUudG90YWxUaW1lLmNhbGwodGhpcywgX3RvdGFsVGltZTIsIHN1cHByZXNzRXZlbnRzKTtcblxuICAgIHRoaXMuX2ZvcmNpbmcgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90bzIuYWRkTGFiZWwgPSBmdW5jdGlvbiBhZGRMYWJlbChsYWJlbCwgcG9zaXRpb24pIHtcbiAgICB0aGlzLmxhYmVsc1tsYWJlbF0gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvMi5yZW1vdmVMYWJlbCA9IGZ1bmN0aW9uIHJlbW92ZUxhYmVsKGxhYmVsKSB7XG4gICAgZGVsZXRlIHRoaXMubGFiZWxzW2xhYmVsXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8yLmFkZFBhdXNlID0gZnVuY3Rpb24gYWRkUGF1c2UocG9zaXRpb24sIGNhbGxiYWNrLCBwYXJhbXMpIHtcbiAgICB2YXIgdCA9IFR3ZWVuLmRlbGF5ZWRDYWxsKDAsIGNhbGxiYWNrIHx8IF9lbXB0eUZ1bmMsIHBhcmFtcyk7XG4gICAgdC5kYXRhID0gXCJpc1BhdXNlXCI7XG4gICAgdGhpcy5faGFzUGF1c2UgPSAxO1xuICAgIHJldHVybiBfYWRkVG9UaW1lbGluZSh0aGlzLCB0LCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbikpO1xuICB9O1xuXG4gIF9wcm90bzIucmVtb3ZlUGF1c2UgPSBmdW5jdGlvbiByZW1vdmVQYXVzZShwb3NpdGlvbikge1xuICAgIHZhciBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuICAgIHBvc2l0aW9uID0gX3BhcnNlUG9zaXRpb24odGhpcywgcG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID09PSBwb3NpdGlvbiAmJiBjaGlsZC5kYXRhID09PSBcImlzUGF1c2VcIikge1xuICAgICAgICBfcmVtb3ZlRnJvbVBhcmVudChjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzIua2lsbFR3ZWVuc09mID0gZnVuY3Rpb24ga2lsbFR3ZWVuc09mKHRhcmdldHMsIHByb3BzLCBvbmx5QWN0aXZlKSB7XG4gICAgdmFyIHR3ZWVucyA9IHRoaXMuZ2V0VHdlZW5zT2YodGFyZ2V0cywgb25seUFjdGl2ZSksXG4gICAgICAgIGkgPSB0d2VlbnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgX292ZXJ3cml0aW5nVHdlZW4gIT09IHR3ZWVuc1tpXSAmJiB0d2VlbnNbaV0ua2lsbCh0YXJnZXRzLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX3Byb3RvMi5nZXRUd2VlbnNPZiA9IGZ1bmN0aW9uIGdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpIHtcbiAgICB2YXIgYSA9IFtdLFxuICAgICAgICBwYXJzZWRUYXJnZXRzID0gdG9BcnJheSh0YXJnZXRzKSxcbiAgICAgICAgY2hpbGQgPSB0aGlzLl9maXJzdCxcbiAgICAgICAgaXNHbG9iYWxUaW1lID0gX2lzTnVtYmVyKG9ubHlBY3RpdmUpLFxuICAgICAgICAvLyBhIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyBhIGdsb2JhbCB0aW1lLiBJZiB0aGUgYW5pbWF0aW9uIHNwYW5zXG4gICAgY2hpbGRyZW47XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuKSB7XG4gICAgICAgIGlmIChfYXJyYXlDb250YWluc0FueShjaGlsZC5fdGFyZ2V0cywgcGFyc2VkVGFyZ2V0cykgJiYgKGlzR2xvYmFsVGltZSA/ICghX292ZXJ3cml0aW5nVHdlZW4gfHwgY2hpbGQuX2luaXR0ZWQgJiYgY2hpbGQuX3RzKSAmJiBjaGlsZC5nbG9iYWxUaW1lKDApIDw9IG9ubHlBY3RpdmUgJiYgY2hpbGQuZ2xvYmFsVGltZShjaGlsZC50b3RhbER1cmF0aW9uKCkpID4gb25seUFjdGl2ZSA6ICFvbmx5QWN0aXZlIHx8IGNoaWxkLmlzQWN0aXZlKCkpKSB7XG4gICAgICAgICAgLy8gbm90ZTogaWYgdGhpcyBpcyBmb3Igb3ZlcndyaXRpbmcsIGl0IHNob3VsZCBvbmx5IGJlIGZvciB0d2VlbnMgdGhhdCBhcmVuJ3QgcGF1c2VkIGFuZCBhcmUgaW5pdHRlZC5cbiAgICAgICAgICBhLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChjaGlsZHJlbiA9IGNoaWxkLmdldFR3ZWVuc09mKHBhcnNlZFRhcmdldHMsIG9ubHlBY3RpdmUpKS5sZW5ndGgpIHtcbiAgICAgICAgYS5wdXNoLmFwcGx5KGEsIGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfSAvLyBwb3RlbnRpYWwgZnV0dXJlIGZlYXR1cmUgLSB0YXJnZXRzKCkgb24gdGltZWxpbmVzXG4gIC8vIHRhcmdldHMoKSB7XG4gIC8vIFx0bGV0IHJlc3VsdCA9IFtdO1xuICAvLyBcdHRoaXMuZ2V0Q2hpbGRyZW4odHJ1ZSwgdHJ1ZSwgZmFsc2UpLmZvckVhY2godCA9PiByZXN1bHQucHVzaCguLi50LnRhcmdldHMoKSkpO1xuICAvLyBcdHJldHVybi
12666ByZXN1bHQuZmlsdGVyKCh2LCBpKSA9PiByZXN1bHQuaW5kZXhPZih2KSA9PT0gaSk7XG4gIC8vIH1cbiAgO1xuXG4gIF9wcm90bzIudHdlZW5UbyA9IGZ1bmN0aW9uIHR3ZWVuVG8ocG9zaXRpb24sIHZhcnMpIHtcbiAgICB2YXJzID0gdmFycyB8fCB7fTtcblxuICAgIHZhciB0bCA9IHRoaXMsXG4gICAgICAgIGVuZFRpbWUgPSBfcGFyc2VQb3NpdGlvbih0bCwgcG9zaXRpb24pLFxuICAgICAgICBfdmFycyA9IHZhcnMsXG4gICAgICAgIHN0YXJ0QXQgPSBfdmFycy5zdGFydEF0LFxuICAgICAgICBfb25TdGFydCA9IF92YXJzLm9uU3RhcnQsXG4gICAgICAgIG9uU3RhcnRQYXJhbXMgPSBfdmFycy5vblN0YXJ0UGFyYW1zLFxuICAgICAgICBpbW1lZGlhdGVSZW5kZXIgPSBfdmFycy5pbW1lZGlhdGVSZW5kZXIsXG4gICAgICAgIGluaXR0ZWQsXG4gICAgICAgIHR3ZWVuID0gVHdlZW4udG8odGwsIF9zZXREZWZhdWx0cyh7XG4gICAgICBlYXNlOiB2YXJzLmVhc2UgfHwgXCJub25lXCIsXG4gICAgICBsYXp5OiBmYWxzZSxcbiAgICAgIGltbWVkaWF0ZVJlbmRlcjogZmFsc2UsXG4gICAgICB0aW1lOiBlbmRUaW1lLFxuICAgICAgb3ZlcndyaXRlOiBcImF1dG9cIixcbiAgICAgIGR1cmF0aW9uOiB2YXJzLmR1cmF0aW9uIHx8IE1hdGguYWJzKChlbmRUaW1lIC0gKHN0YXJ0QXQgJiYgXCJ0aW1lXCIgaW4gc3RhcnRBdCA/IHN0YXJ0QXQudGltZSA6IHRsLl90aW1lKSkgLyB0bC50aW1lU2NhbGUoKSkgfHwgX3RpbnlOdW0sXG4gICAgICBvblN0YXJ0OiBmdW5jdGlvbiBvblN0YXJ0KCkge1xuICAgICAgICB0bC5wYXVzZSgpO1xuXG4gICAgICAgIGlmICghaW5pdHRlZCkge1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHZhcnMuZHVyYXRpb24gfHwgTWF0aC5hYnMoKGVuZFRpbWUgLSAoc3RhcnRBdCAmJiBcInRpbWVcIiBpbiBzdGFydEF0ID8gc3RhcnRBdC50aW1lIDogdGwuX3RpbWUpKSAvIHRsLnRpbWVTY2FsZSgpKTtcbiAgICAgICAgICB0d2Vlbi5fZHVyICE9PSBkdXJhdGlvbiAmJiBfc2V0RHVyYXRpb24odHdlZW4sIGR1cmF0aW9uLCAwLCAxKS5yZW5kZXIodHdlZW4uX3RpbWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGluaXR0ZWQgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgX29uU3RhcnQgJiYgX29uU3RhcnQuYXBwbHkodHdlZW4sIG9uU3RhcnRQYXJhbXMgfHwgW10pOyAvL2luIGNhc2UgdGhlIHVzZXIgaGFkIGFuIG9uU3RhcnQgaW4gdGhlIHZhcnMgLSB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBpdC5cbiAgICAgIH1cbiAgICB9LCB2YXJzKSk7XG5cbiAgICByZXR1cm4gaW1tZWRpYXRlUmVuZGVyID8gdHdlZW4ucmVuZGVyKDApIDogdHdlZW47XG4gIH07XG5cbiAgX3Byb3RvMi50d2VlbkZyb21UbyA9IGZ1bmN0aW9uIHR3ZWVuRnJvbVRvKGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbiwgdmFycykge1xuICAgIHJldHVybiB0aGlzLnR3ZWVuVG8odG9Qb3NpdGlvbiwgX3NldERlZmF1bHRzKHtcbiAgICAgIHN0YXJ0QXQ6IHtcbiAgICAgICAgdGltZTogX3BhcnNlUG9zaXRpb24odGhpcywgZnJvbVBvc2l0aW9uKVxuICAgICAgfVxuICAgIH0sIHZhcnMpKTtcbiAgfTtcblxuICBfcHJvdG8yLnJlY2VudCA9IGZ1bmN0aW9uIHJlY2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjZW50O1xuICB9O1xuXG4gIF9wcm90bzIubmV4dExhYmVsID0gZnVuY3Rpb24gbmV4dExhYmVsKGFmdGVyVGltZSkge1xuICAgIGlmIChhZnRlclRpbWUgPT09IHZvaWQgMCkge1xuICAgICAgYWZ0ZXJUaW1lID0gdGhpcy5fdGltZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2dldExhYmVsSW5EaXJlY3Rpb24odGhpcywgX3BhcnNlUG9zaXRpb24odGhpcywgYWZ0ZXJUaW1lKSk7XG4gIH07XG5cbiAgX3Byb3RvMi5wcmV2aW91c0xhYmVsID0gZnVuY3Rpb24gcHJldmlvdXNMYWJlbChiZWZvcmVUaW1lKSB7XG4gICAgaWYgKGJlZm9yZVRpbWUgPT09IHZvaWQgMCkge1xuICAgICAgYmVmb3JlVGltZSA9IHRoaXMuX3RpbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9nZXRMYWJlbEluRGlyZWN0aW9uKHRoaXMsIF9wYXJzZVBvc2l0aW9uKHRoaXMsIGJlZm9yZVRpbWUpLCAxKTtcbiAgfTtcblxuICBfcHJvdG8yLmN1cnJlbnRMYWJlbCA9IGZ1bmN0aW9uIGN1cnJlbnRMYWJlbCh2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy5zZWVrKHZhbHVlLCB0cnVlKSA6IHRoaXMucHJldmlvdXNMYWJlbCh0aGlzLl90aW1lICsgX3RpbnlOdW0pO1xuICB9O1xuXG4gIF9wcm90bzIuc2hpZnRDaGlsZHJlbiA9IGZ1bmN0aW9uIHNoaWZ0Q2hpbGRyZW4oYW1vdW50LCBhZGp1c3RMYWJlbHMsIGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICBpZiAoaWdub3JlQmVmb3JlVGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZ25vcmVCZWZvcmVUaW1lID0gMDtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSB0aGlzLl9maXJzdCxcbiAgICAgICAgbGFiZWxzID0gdGhpcy5sYWJlbHMsXG4gICAgICAgIHA7XG4gICAgYW1vdW50ID0gX3JvdW5kUHJlY2lzZShhbW91bnQpO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX3N0YXJ0ID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgY2hpbGQuX3N0YXJ0ICs9IGFtb3VudDtcbiAgICAgICAgY2hpbGQuX2VuZCArPSBhbW91bnQ7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XG4gICAgfVxuXG4gICAgaWYgKGFkanVzdExhYmVscykge1xuICAgICAgZm9yIChwIGluIGxhYmVscykge1xuICAgICAgICBpZiAobGFiZWxzW3BdID49IGlnbm9yZUJlZm9yZVRpbWUpIHtcbiAgICAgICAgICBsYWJlbHNbcF0gKz0gYW1vdW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIF91bmNhY2hlKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90bzIuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUoc29mdCkge1xuICAgIHZhciBjaGlsZCA9IHRoaXMuX2ZpcnN0O1xuICAgIHRoaXMuX2xvY2sgPSAwO1xuXG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBjaGlsZC5pbnZhbGlkYXRlKHNvZnQpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gX0FuaW1hdGlvbi5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMsIHNvZnQpO1xuICB9O1xuXG4gIF9wcm90bzIuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcihpbmNsdWRlTGFiZWxzKSB7XG4gICAgaWYgKGluY2x1ZGVMYWJlbHMgPT09IHZvaWQgMCkge1xuICAgICAgaW5jbHVkZUxhYmVscyA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gdGhpcy5fZmlyc3QsXG4gICAgICAgIG5leHQ7XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcbiAgICAgIHRoaXMucmVtb3ZlKGNoaWxkKTtcbiAgICAgIGNoaWxkID0gbmV4dDtcbiAgICB9XG5cbiAgICB0aGlzLl9kcCAmJiAodGhpcy5fdGltZSA9IHRoaXMuX3RUaW1lID0gdGhpcy5fcFRpbWUgPSAwKTtcbiAgICBpbmNsdWRlTGFiZWxzICYmICh0aGlzLmxhYmVscyA9IHt9KTtcbiAgICByZXR1cm4gX3VuY2FjaGUodGhpcyk7XG4gIH07XG5cbiAgX3Byb3RvMi50b3RhbER1cmF0aW9uID0gZnVuY3Rpb24gdG90YWxEdXJhdGlvbih2YWx1ZSkge1xuICAgIHZhciBtYXggPSAwLFxuICAgICAgICBzZWxmID0gdGhpcyxcbiAgICAgICAgY2hpbGQgPSBzZWxmLl9sYXN0LFxuICAgICAgICBwcmV2U3RhcnQgPSBfYmlnTnVtLFxuICAgICAgICBwcmV2LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybi
12666BzZWxmLnRpbWVTY2FsZSgoc2VsZi5fcmVwZWF0IDwgMCA/IHNlbGYuZHVyYXRpb24oKSA6IHNlbGYudG90YWxEdXJhdGlvbigpKSAvIChzZWxmLnJldmVyc2VkKCkgPyAtdmFsdWUgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLl9kaXJ0eSkge1xuICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBwcmV2ID0gY2hpbGQuX3ByZXY7IC8vcmVjb3JkIGl0IGhlcmUgaW4gY2FzZSB0aGUgdHdlZW4gY2hhbmdlcyBwb3NpdGlvbiBpbiB0aGUgc2VxdWVuY2UuLi5cblxuICAgICAgICBjaGlsZC5fZGlydHkgJiYgY2hpbGQudG90YWxEdXJhdGlvbigpOyAvL2NvdWxkIGNoYW5nZSB0aGUgdHdlZW4uX3N0YXJ0VGltZSwgc28gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24ncyBjYWNoZSBpcyBjbGVhbiBiZWZvcmUgYW5hbHl6aW5nIGl0LlxuXG4gICAgICAgIHN0YXJ0ID0gY2hpbGQuX3N0YXJ0O1xuXG4gICAgICAgIGlmIChzdGFydCA+IHByZXZTdGFydCAmJiBzZWxmLl9zb3J0ICYmIGNoaWxkLl90cyAmJiAhc2VsZi5fbG9jaykge1xuICAgICAgICAgIC8vaW4gY2FzZSBvbmUgb2YgdGhlIHR3ZWVucyBzaGlmdGVkIG91dCBvZiBvcmRlciwgaXQgbmVlZHMgdG8gYmUgcmUtaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc2VxdWVuY2VcbiAgICAgICAgICBzZWxmLl9sb2NrID0gMTsgLy9wcmV2ZW50IGVuZGxlc3MgcmVjdXJzaXZlIGNhbGxzIC0gdGhlcmUgYXJlIG1ldGhvZHMgdGhhdCBnZXQgdHJpZ2dlcmVkIHRoYXQgY2hlY2sgZHVyYXRpb24vdG90YWxEdXJhdGlvbiB3aGVuIHdlIGFkZCgpLlxuXG4gICAgICAgICAgX2FkZFRvVGltZWxpbmUoc2VsZiwgY2hpbGQsIHN0YXJ0IC0gY2hpbGQuX2RlbGF5LCAxKS5fbG9jayA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldlN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgPCAwICYmIGNoaWxkLl90cykge1xuICAgICAgICAgIC8vY2hpbGRyZW4gYXJlbid0IGFsbG93ZWQgdG8gaGF2ZSBuZWdhdGl2ZSBzdGFydFRpbWVzIHVubGVzcyBzbW9vdGhDaGlsZFRpbWluZyBpcyB0cnVlLCBzbyBhZGp1c3QgaGVyZSBpZiBvbmUgaXMgZm91bmQuXG4gICAgICAgICAgbWF4IC09IHN0YXJ0O1xuXG4gICAgICAgICAgaWYgKCFwYXJlbnQgJiYgIXNlbGYuX2RwIHx8IHBhcmVudCAmJiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0YXJ0ICs9IF9yb3VuZFByZWNpc2Uoc3RhcnQgLyBzZWxmLl90cyk7XG4gICAgICAgICAgICBzZWxmLl90aW1lIC09IHN0YXJ0O1xuICAgICAgICAgICAgc2VsZi5fdFRpbWUgLT0gc3RhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5zaGlmdENoaWxkcmVuKC1zdGFydCwgZmFsc2UsIC0xZTk5OSk7XG4gICAgICAgICAgcHJldlN0YXJ0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLl9lbmQgPiBtYXggJiYgY2hpbGQuX3RzICYmIChtYXggPSBjaGlsZC5fZW5kKTtcbiAgICAgICAgY2hpbGQgPSBwcmV2O1xuICAgICAgfVxuXG4gICAgICBfc2V0RHVyYXRpb24oc2VsZiwgc2VsZiA9PT0gX2dsb2JhbFRpbWVsaW5lICYmIHNlbGYuX3RpbWUgPiBtYXggPyBzZWxmLl90aW1lIDogbWF4LCAxLCAxKTtcblxuICAgICAgc2VsZi5fZGlydHkgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLl90RHVyO1xuICB9O1xuXG4gIFRpbWVsaW5lLnVwZGF0ZVJvb3QgPSBmdW5jdGlvbiB1cGRhdGVSb290KHRpbWUpIHtcbiAgICBpZiAoX2dsb2JhbFRpbWVsaW5lLl90cykge1xuICAgICAgX2xhenlTYWZlUmVuZGVyKF9nbG9iYWxUaW1lbGluZSwgX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGltZSwgX2dsb2JhbFRpbWVsaW5lKSk7XG5cbiAgICAgIF9sYXN0UmVuZGVyZWRGcmFtZSA9IF90aWNrZXIuZnJhbWU7XG4gICAgfVxuXG4gICAgaWYgKF90aWNrZXIuZnJhbWUgPj0gX25leHRHQ0ZyYW1lKSB7XG4gICAgICBfbmV4dEdDRnJhbWUgKz0gX2NvbmZpZy5hdXRvU2xlZXAgfHwgMTIwO1xuICAgICAgdmFyIGNoaWxkID0gX2dsb2JhbFRpbWVsaW5lLl9maXJzdDtcbiAgICAgIGlmICghY2hpbGQgfHwgIWNoaWxkLl90cykgaWYgKF9jb25maWcuYXV0b1NsZWVwICYmIF90aWNrZXIuX2xpc3RlbmVycy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHdoaWxlIChjaGlsZCAmJiAhY2hpbGQuX3RzKSB7XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkIHx8IF90aWNrZXIuc2xlZXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFRpbWVsaW5lO1xufShBbmltYXRpb24pO1xuXG5fc2V0RGVmYXVsdHMoVGltZWxpbmUucHJvdG90eXBlLCB7XG4gIF9sb2NrOiAwLFxuICBfaGFzUGF1c2U6IDAsXG4gIF9mb3JjaW5nOiAwXG59KTtcblxudmFyIF9hZGRDb21wbGV4U3RyaW5nUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZENvbXBsZXhTdHJpbmdQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBzZXR0ZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtKSB7XG4gIC8vbm90ZTogd2UgY2FsbCBfYWRkQ29tcGxleFN0cmluZ1Byb3BUd2Vlbi5jYWxsKHR3ZWVuSW5zdGFuY2UuLi4pIHRvIGVuc3VyZSB0aGF0IGl0J3Mgc2NvcGVkIHByb3Blcmx5LiBXZSBtYXkgY2FsbCBpdCBmcm9tIHdpdGhpbiBhIHBsdWdpbiB0b28sIHRodXMgXCJ0aGlzXCIgd291bGQgcmVmZXIgdG8gdGhlIHBsdWdpbi5cbiAgdmFyIHB0ID0gbmV3IFByb3BUd2Vlbih0aGlzLl9wdCwgdGFyZ2V0LCBwcm9wLCAwLCAxLCBfcmVuZGVyQ29tcGxleFN0cmluZywgbnVsbCwgc2V0dGVyKSxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIG1hdGNoSW5kZXggPSAwLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RhcnROdW1zLFxuICAgICAgY29sb3IsXG4gICAgICBlbmROdW0sXG4gICAgICBjaHVuayxcbiAgICAgIHN0YXJ0TnVtLFxuICAgICAgaGFzUmFuZG9tLFxuICAgICAgYTtcbiAgcHQuYiA9IHN0YXJ0O1xuICBwdC5lID0gZW5kO1xuICBzdGFydCArPSBcIlwiOyAvL2Vuc3VyZSB2YWx1ZXMgYXJlIHN0cmluZ3NcblxuICBlbmQgKz0gXCJcIjtcblxuICBpZiAoaGFzUmFuZG9tID0gfmVuZC5pbmRleE9mKFwicmFuZG9tKFwiKSkge1xuICAgIGVuZCA9IF9yZXBsYWNlUmFuZG9tKGVuZCk7XG4gIH1cblxuICBpZiAoc3RyaW5nRmlsdGVyKSB7XG4gICAgYSA9IFtzdGFydCwgZW5kXTtcbiAgICBzdHJpbmdGaWx0ZXIoYSwgdGFyZ2V0LCBwcm9wKTsgLy9wYXNzIGFuIGFycmF5IHdpdGggdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzIGFuZCBsZXQgdGhlIGZpbHRlciBkbyB3aGF0ZXZlciBpdCBuZWVkcyB0byB0aGUgdmFsdWVzLlxuXG4gICAgc3RhcnQgPSBhWzBdO1xuICAgIGVuZCA9IGFbMV07XG4gIH1cblxuICBzdGFydE51bXMgPSBzdGFydC5tYXRjaChfY29tcGxleFN0cmluZ051bUV4cCkgfHwgW107XG5cbiAgd2hpbGUgKHJlc3VsdCA9IF9jb21wbGV4U3RyaW5nTnVtRXhwLmV4ZWMoZW5kKSkge1xuICAgIGVuZE51bSA9IHJlc3VsdFswXTtcbiAgICBjaHVuayA9IGVuZC5zdWJzdHJpbmcoaW5kZXgsIHJlc3VsdC5pbmRleCk7XG5cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGNvbG9yID0gKGNvbG9yICsgMSkgJSA1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmsuc3Vic3RyKC01KSA9PT0gXCJyZ2JhKFwiKSB7XG4gICAgICBjb2xvciA9IDE7XG4gICAgfVxuXG4gICAgaWYgKGVuZE51bSAhPT0gc3RhcnROdW1zW21hdGNoSW5kZXgrK10pIHtcbiAgICAgIHN0YXJ0TnVtID0gcGFyc2VGbG9hdChzdGFydE51bXNbbWF0Y2hJbmRleCAtIDFdKSB8fCAwOyAvL3RoZXNlIG5lc3RlZCBQcm9wVHdlZW5zIGFyZSBoYW5kbGVkIGluIGEgc3BlY2lhbCB3YXkgLSB3ZSdsb
12666CBuZXZlciBhY3R1YWxseSBjYWxsIGEgcmVuZGVyIG9yIHNldHRlciBtZXRob2Qgb24gdGhlbS4gV2UnbGwganVzdCBsb29wIHRocm91Z2ggdGhlbSBpbiB0aGUgcGFyZW50IGNvbXBsZXggc3RyaW5nIFByb3BUd2VlbidzIHJlbmRlciBtZXRob2QuXG5cbiAgICAgIHB0Ll9wdCA9IHtcbiAgICAgICAgX25leHQ6IHB0Ll9wdCxcbiAgICAgICAgcDogY2h1bmsgfHwgbWF0Y2hJbmRleCA9PT0gMSA/IGNodW5rIDogXCIsXCIsXG4gICAgICAgIC8vbm90ZTogU1ZHIHNwZWMgYWxsb3dzIG9taXNzaW9uIG9mIGNvbW1hL3NwYWNlIHdoZW4gYSBuZWdhdGl2ZSBzaWduIGlzIHdlZGdlZCBiZXR3ZWVuIHR3byBudW1iZXJzLCBsaWtlIDIuNS01LjMgaW5zdGVhZCBvZiAyLjUsLTUuMyBidXQgd2hlbiB0d2VlbmluZywgdGhlIG5lZ2F0aXZlIHZhbHVlIG1heSBzd2l0Y2ggdG8gcG9zaXRpdmUsIHNvIHdlIGluc2VydCB0aGUgY29tbWEganVzdCBpbiBjYXNlLlxuICAgICAgICBzOiBzdGFydE51bSxcbiAgICAgICAgYzogZW5kTnVtLmNoYXJBdCgxKSA9PT0gXCI9XCIgPyBfcGFyc2VSZWxhdGl2ZShzdGFydE51bSwgZW5kTnVtKSAtIHN0YXJ0TnVtIDogcGFyc2VGbG9hdChlbmROdW0pIC0gc3RhcnROdW0sXG4gICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCA/IE1hdGgucm91bmQgOiAwXG4gICAgICB9O1xuICAgICAgaW5kZXggPSBfY29tcGxleFN0cmluZ051bUV4cC5sYXN0SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcHQuYyA9IGluZGV4IDwgZW5kLmxlbmd0aCA/IGVuZC5zdWJzdHJpbmcoaW5kZXgsIGVuZC5sZW5ndGgpIDogXCJcIjsgLy93ZSB1c2UgdGhlIFwiY1wiIG9mIHRoZSBQcm9wVHdlZW4gdG8gc3RvcmUgdGhlIGZpbmFsIHBhcnQgb2YgdGhlIHN0cmluZyAoYWZ0ZXIgdGhlIGxhc3QgbnVtYmVyKVxuXG4gIHB0LmZwID0gZnVuY1BhcmFtO1xuXG4gIGlmIChfcmVsRXhwLnRlc3QoZW5kKSB8fCBoYXNSYW5kb20pIHtcbiAgICBwdC5lID0gMDsgLy9pZiB0aGUgZW5kIHN0cmluZyBjb250YWlucyByZWxhdGl2ZSB2YWx1ZXMgb3IgZHluYW1pYyByYW5kb20oLi4uKSB2YWx1ZXMsIGRlbGV0ZSB0aGUgZW5kIGl0IHNvIHRoYXQgb24gdGhlIGZpbmFsIHJlbmRlciB3ZSBkb24ndCBhY3R1YWxseSBzZXQgaXQgdG8gdGhlIHN0cmluZyB3aXRoICs9IG9yIC09IGNoYXJhY3RlcnMgKGZvcmNlcyBpdCB0byB1c2UgdGhlIGNhbGN1bGF0ZWQgdmFsdWUpLlxuICB9XG5cbiAgdGhpcy5fcHQgPSBwdDsgLy9zdGFydCB0aGUgbGlua2VkIGxpc3Qgd2l0aCB0aGlzIG5ldyBQcm9wVHdlZW4uIFJlbWVtYmVyLCB3ZSBjYWxsIF9hZGRDb21wbGV4U3RyaW5nUHJvcFR3ZWVuLmNhbGwodHdlZW5JbnN0YW5jZS4uLikgdG8gZW5zdXJlIHRoYXQgaXQncyBzY29wZWQgcHJvcGVybHkuIFdlIG1heSBjYWxsIGl0IGZyb20gd2l0aGluIGEgcGx1Z2luIHRvbywgdGh1cyBcInRoaXNcIiB3b3VsZCByZWZlciB0byB0aGUgcGx1Z2luLlxuXG4gIHJldHVybiBwdDtcbn0sXG4gICAgX2FkZFByb3BUd2VlbiA9IGZ1bmN0aW9uIF9hZGRQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBpbmRleCwgdGFyZ2V0cywgbW9kaWZpZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtLCBvcHRpb25hbCkge1xuICBfaXNGdW5jdGlvbihlbmQpICYmIChlbmQgPSBlbmQoaW5kZXggfHwgMCwgdGFyZ2V0LCB0YXJnZXRzKSk7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB0YXJnZXRbcHJvcF0sXG4gICAgICBwYXJzZWRTdGFydCA9IHN0YXJ0ICE9PSBcImdldFwiID8gc3RhcnQgOiAhX2lzRnVuY3Rpb24oY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IGZ1bmNQYXJhbSA/IHRhcmdldFtwcm9wLmluZGV4T2YoXCJzZXRcIikgfHwgIV9pc0Z1bmN0aW9uKHRhcmdldFtcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKSA/IHByb3AgOiBcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKGZ1bmNQYXJhbSkgOiB0YXJnZXRbcHJvcF0oKSxcbiAgICAgIHNldHRlciA9ICFfaXNGdW5jdGlvbihjdXJyZW50VmFsdWUpID8gX3NldHRlclBsYWluIDogZnVuY1BhcmFtID8gX3NldHRlckZ1bmNXaXRoUGFyYW0gOiBfc2V0dGVyRnVuYyxcbiAgICAgIHB0O1xuXG4gIGlmIChfaXNTdHJpbmcoZW5kKSkge1xuICAgIGlmICh+ZW5kLmluZGV4T2YoXCJyYW5kb20oXCIpKSB7XG4gICAgICBlbmQgPSBfcmVwbGFjZVJhbmRvbShlbmQpO1xuICAgIH1cblxuICAgIGlmIChlbmQuY2hhckF0KDEpID09PSBcIj1cIikge1xuICAgICAgcHQgPSBfcGFyc2VSZWxhdGl2ZShwYXJzZWRTdGFydCwgZW5kKSArIChnZXRVbml0KHBhcnNlZFN0YXJ0KSB8fCAwKTtcblxuICAgICAgaWYgKHB0IHx8IHB0ID09PSAwKSB7XG4gICAgICAgIC8vIHRvIGF2b2lkIGlzTmFOLCBsaWtlIGlmIHNvbWVvbmUgcGFzc2VzIGluIGEgdmFsdWUgbGlrZSBcIiE9IHdoYXRldmVyXCJcbiAgICAgICAgZW5kID0gcHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRpb25hbCB8fCBwYXJzZWRTdGFydCAhPT0gZW5kIHx8IF9mb3JjZUFsbFByb3BUd2VlbnMpIHtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZFN0YXJ0ICogZW5kKSAmJiBlbmQgIT09IFwiXCIpIHtcbiAgICAgIC8vIGZ1biBmYWN0OiBhbnkgbnVtYmVyIG11bHRpcGxpZWQgYnkgXCJcIiBpcyBldmFsdWF0ZWQgYXMgdGhlIG51bWJlciAwIVxuICAgICAgcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCB0YXJnZXQsIHByb3AsICtwYXJzZWRTdGFydCB8fCAwLCBlbmQgLSAocGFyc2VkU3RhcnQgfHwgMCksIHR5cGVvZiBjdXJyZW50VmFsdWUgPT09IFwiYm9vbGVhblwiID8gX3JlbmRlckJvb2xlYW4gOiBfcmVuZGVyUGxhaW4sIDAsIHNldHRlcik7XG4gICAgICBmdW5jUGFyYW0gJiYgKHB0LmZwID0gZnVuY1BhcmFtKTtcbiAgICAgIG1vZGlmaWVyICYmIHB0Lm1vZGlmaWVyKG1vZGlmaWVyLCB0aGlzLCB0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRoaXMuX3B0ID0gcHQ7XG4gICAgfVxuXG4gICAgIWN1cnJlbnRWYWx1ZSAmJiAhKHByb3AgaW4gdGFyZ2V0KSAmJiBfbWlzc2luZ1BsdWdpbihwcm9wLCBlbmQpO1xuICAgIHJldHVybiBfYWRkQ29tcGxleFN0cmluZ1Byb3BUd2Vlbi5jYWxsKHRoaXMsIHRhcmdldCwgcHJvcCwgcGFyc2VkU3RhcnQsIGVuZCwgc2V0dGVyLCBzdHJpbmdGaWx0ZXIgfHwgX2NvbmZpZy5zdHJpbmdGaWx0ZXIsIGZ1bmNQYXJhbSk7XG4gIH1cbn0sXG4gICAgLy9jcmVhdGVzIGEgY29weSBvZiB0aGUgdmFycyBvYmplY3QgYW5kIHByb2Nlc3NlcyBhbnkgZnVuY3Rpb24tYmFzZWQgdmFsdWVzIChwdXR0aW5nIHRoZSByZXN1bHRpbmcgdmFsdWVzIGRpcmVjdGx5IGludG8gdGhlIGNvcHkpIGFzIHdlbGwgYXMgc3RyaW5ncyB3aXRoIFwicmFuZG9tKClcIiBpbiB0aG
12666VtLiBJdCBkb2VzIE5PVCBwcm9jZXNzIHJlbGF0aXZlIHZhbHVlcy5cbl9wcm9jZXNzVmFycyA9IGZ1bmN0aW9uIF9wcm9jZXNzVmFycyh2YXJzLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2Vlbikge1xuICBfaXNGdW5jdGlvbih2YXJzKSAmJiAodmFycyA9IF9wYXJzZUZ1bmNPclN0cmluZyh2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgdGFyZ2V0cykpO1xuXG4gIGlmICghX2lzT2JqZWN0KHZhcnMpIHx8IHZhcnMuc3R5bGUgJiYgdmFycy5ub2RlVHlwZSB8fCBfaXNBcnJheSh2YXJzKSB8fCBfaXNUeXBlZEFycmF5KHZhcnMpKSB7XG4gICAgcmV0dXJuIF9pc1N0cmluZyh2YXJzKSA/IF9wYXJzZUZ1bmNPclN0cmluZyh2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgdGFyZ2V0cykgOiB2YXJzO1xuICB9XG5cbiAgdmFyIGNvcHkgPSB7fSxcbiAgICAgIHA7XG5cbiAgZm9yIChwIGluIHZhcnMpIHtcbiAgICBjb3B5W3BdID0gX3BhcnNlRnVuY09yU3RyaW5nKHZhcnNbcF0sIHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufSxcbiAgICBfY2hlY2tQbHVnaW4gPSBmdW5jdGlvbiBfY2hlY2tQbHVnaW4ocHJvcGVydHksIHZhcnMsIHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKSB7XG4gIHZhciBwbHVnaW4sIHB0LCBwdExvb2t1cCwgaTtcblxuICBpZiAoX3BsdWdpbnNbcHJvcGVydHldICYmIChwbHVnaW4gPSBuZXcgX3BsdWdpbnNbcHJvcGVydHldKCkpLmluaXQodGFyZ2V0LCBwbHVnaW4ucmF3VmFycyA/IHZhcnNbcHJvcGVydHldIDogX3Byb2Nlc3NWYXJzKHZhcnNbcHJvcGVydHldLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2VlbiksIHR3ZWVuLCBpbmRleCwgdGFyZ2V0cykgIT09IGZhbHNlKSB7XG4gICAgdHdlZW4uX3B0ID0gcHQgPSBuZXcgUHJvcFR3ZWVuKHR3ZWVuLl9wdCwgdGFyZ2V0LCBwcm9wZXJ0eSwgMCwgMSwgcGx1Z2luLnJlbmRlciwgcGx1Z2luLCAwLCBwbHVnaW4ucHJpb3JpdHkpO1xuXG4gICAgaWYgKHR3ZWVuICE9PSBfcXVpY2tUd2Vlbikge1xuICAgICAgcHRMb29rdXAgPSB0d2Vlbi5fcHRMb29rdXBbdHdlZW4uX3RhcmdldHMuaW5kZXhPZih0YXJnZXQpXTsgLy9ub3RlOiB3ZSBjYW4ndCB1c2UgdHdlZW4uX3B0TG9va3VwW2luZGV4XSBiZWNhdXNlIGZvciBzdGFnZ2VyZWQgdHdlZW5zLCB0aGUgaW5kZXggZnJvbSB0aGUgZnVsbFRhcmdldHMgYXJyYXkgd29uJ3QgbWF0Y2ggd2hhdCBpdCBpcyBpbiBlYWNoIGluZGl2aWR1YWwgdHdlZW4gdGhhdCBzcGF3bnMgZnJvbSB0aGUgc3RhZ2dlci5cblxuICAgICAgaSA9IHBsdWdpbi5fcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHB0TG9va3VwW3BsdWdpbi5fcHJvcHNbaV1dID0gcHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBsdWdpbjtcbn0sXG4gICAgX292ZXJ3cml0aW5nVHdlZW4sXG4gICAgLy9zdG9yZSBhIHJlZmVyZW5jZSB0ZW1wb3JhcmlseSBzbyB3ZSBjYW4gYXZvaWQgb3ZlcndyaXRpbmcgaXRzZWxmLlxuX2ZvcmNlQWxsUHJvcFR3ZWVucyxcbiAgICBfaW5pdFR3ZWVuID0gZnVuY3Rpb24gX2luaXRUd2Vlbih0d2VlbiwgdGltZSwgdFRpbWUpIHtcbiAgdmFyIHZhcnMgPSB0d2Vlbi52YXJzLFxuICAgICAgZWFzZSA9IHZhcnMuZWFzZSxcbiAgICAgIHN0YXJ0QXQgPSB2YXJzLnN0YXJ0QXQsXG4gICAgICBpbW1lZGlhdGVSZW5kZXIgPSB2YXJzLmltbWVkaWF0ZVJlbmRlcixcbiAgICAgIGxhenkgPSB2YXJzLmxhenksXG4gICAgICBvblVwZGF0ZSA9IHZhcnMub25VcGRhdGUsXG4gICAgICBydW5CYWNrd2FyZHMgPSB2YXJzLnJ1bkJhY2t3YXJkcyxcbiAgICAgIHlveW9FYXNlID0gdmFycy55b3lvRWFzZSxcbiAgICAgIGtleWZyYW1lcyA9IHZhcnMua2V5ZnJhbWVzLFxuICAgICAgYXV0b1JldmVydCA9IHZhcnMuYXV0b1JldmVydCxcbiAgICAgIGR1ciA9IHR3ZWVuLl9kdXIsXG4gICAgICBwcmV2U3RhcnRBdCA9IHR3ZWVuLl9zdGFydEF0LFxuICAgICAgdGFyZ2V0cyA9IHR3ZWVuLl90YXJnZXRzLFxuICAgICAgcGFyZW50ID0gdHdlZW4ucGFyZW50LFxuICAgICAgZnVsbFRhcmdldHMgPSBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogdGFyZ2V0cyxcbiAgICAgIGF1dG9PdmVyd3JpdGUgPSB0d2Vlbi5fb3ZlcndyaXRlID09PSBcImF1dG9cIiAmJiAhX3N1cHByZXNzT3ZlcndyaXRlcyxcbiAgICAgIHRsID0gdHdlZW4udGltZWxpbmUsXG4gICAgICByZXZlcnNlRWFzZSA9IHZhcnMuZWFzZVJldmVyc2UgfHwgeW95b0Vhc2UsXG4gICAgICBjbGVhblZhcnMsXG4gICAgICBpLFxuICAgICAgcCxcbiAgICAgIHB0LFxuICAgICAgdGFyZ2V0LFxuICAgICAgaGFzUHJpb3JpdHksXG4gICAgICBnc0RhdGEsXG4gICAgICBoYXJuZXNzLFxuICAgICAgcGx1Z2luLFxuICAgICAgcHRMb29rdXAsXG4gICAgICBpbmRleCxcbiAgICAgIGhhcm5lc3NWYXJzLFxuICAgICAgb3ZlcndyaXR0ZW47XG4gIHRsICYmICgha2V5ZnJhbWVzIHx8ICFlYXNlKSAmJiAoZWFzZSA9IFwibm9uZVwiKTtcbiAgdHdlZW4uX2Vhc2UgPSBfcGFyc2VFYXNlKGVhc2UsIF9kZWZhdWx0cy5lYXNlKTtcbiAgdHdlZW4uX3JFYXNlID0gcmV2ZXJzZUVhc2UgJiYgKF9wYXJzZUVhc2UocmV2ZXJzZUVhc2UpIHx8IHR3ZWVuLl9lYXNlKTtcbiAgdHdlZW4uX2Zyb20gPSAhdGwgJiYgISF2YXJzLnJ1bkJhY2t3YXJkczsgLy9uZXN0ZWQgdGltZWxpbmVzIHNob3VsZCBuZXZlciBydW4gYmFja3dhcmRzIC0gdGhlIGJhY2t3YXJkcy1uZXNzIGlzIGluIHRoZSBjaGlsZCB0d2VlbnMuXG5cbiAgaWYgKHR3ZWVuLl9mcm9tKSB0d2Vlbi5yYXRpbyA9IDE7XG5cbiAgaWYgKCF0bCB8fCBrZXlmcmFtZXMgJiYgIXZhcnMuc3RhZ2dlcikge1xuICAgIC8vaWYgdGhlcmUncyBhbiBpbnRlcm5hbCB0aW1lbGluZSwgc2tpcCBhbGwgdGhlIHBhcnNpbmcgYmVjYXVzZSB3ZSBwYXNzZWQgdGhhdCB0YXNrIGRvd24gdGhlIGNoYWluLlxuICAgIGhhcm5lc3MgPSB0YXJnZXRzWzBdID8gX2dldENhY2hlKHRhcmdldHNbMF0pLmhhcm5lc3MgOiAwO1xuICAgIGhhcm5lc3NWYXJzID0gaGFybmVzcyAmJiB2YXJzW2hhcm5lc3MucHJvcF07IC8vc29tZW9uZSBtYXkgbmVlZCB0byBzcGVjaWZ5IENTUy1zcGVjaWZpYyB2YWx1ZXMgQU5EIG5vbi1DU1MgdmFsdWVzLCBsaWtlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBcInhcIiBwcm9wZXJ0eSBwbHVzIGl0J3MgYSBzdGFuZGFyZCBET00gZWxlbWVudC4gV2UgYWxsb3cgcGVvcGxlIHRvIGRpc3Rpbmd1aXNoIGJ5IHdyYXBwaW5nIHBsdWdpbi1zcGVjaWZpYyBzdHVmZiBpbiBhIGNzczp7fSBvYmplY3QgZm9yIGV4YW1wbGUuXG5cbiAgICBjbGVhblZhcnMgPSBfY29weUV4Y2x1ZGluZyh2YXJzLCBfcmVzZXJ2ZWRQcm9wcyk7XG5cbiAgICBpZiAocHJldlN0YXJ0QXQpIHtcbiAgICAgIHByZXZTdGFydEF0Ll96VGltZSA8IDAgJiYgcHJldlN0YXJ0QXQucHJvZ3Jlc3MoMSk7IC8vIGluIGNhc2UgaXQncyBhIGxhenkgc3RhcnRBdCB0aGF0IGhhc24ndCByZW5kZXJlZCB5ZXQuXG5cbiAgICAgIHRpbWUgPCAwICYmIHJ1bkJhY2t3YXJkcyAmJiBpbW1lZGlhdGVSZW5kZXIgJiYgIWF1dG9SZXZlcnQgPyBwcmV2U3RhcnRBdC5yZW5kZXIoLTEsIHRydWUpIDogcHJldlN0YXJ0QXQucmV2ZXJ0KHJ1bkJhY2t3YXJkcyAmJiBkdXIgPyBfcmV2ZXJ0Q29uZmlnTm9LaWxsIDogX3N0YXJ0QXRSZXZlcnRDb25maWcpOyAvLyBpZiBpdCdzIGEgXCJzdGFydEF0XCIgKG5vdCBcImZyb20oKVwiIG9yIHJ1bkJhY2t3YXJkczogdHJ1ZSksIHdlIG9ubHkgbmVlZCB0byBkbyBhIHNoYWxsb3cgcmV2ZXJ0IChrZWVwIHRyYW5zZm9ybXMgY2FjaGVkIGluIENTU1BsdWdpbilcbiAgICAgIC8vIGRvbid0IGp1c3QgX3JlbW92ZUZyb21QYXJlbnQocHJldlN0YXJ0QXQucmVuZGVyKC0xLCB0cnVlKSkgYmVjYXVzZSB0aGF0J2xsIGxlYXZlIGlubGluZSBzdHlsZXMuIFdlJ3JlIGNyZWF0aW5nIGEgbmV3IF9zdGFydEF0IGZvciBcInN0YXJ0QXRcIiB0d2VlbnMgdGhhdCByZS1jYXB0dXJlIHRoaW5ncyB0byBlbnN1cmUgdGhhdCBpZiB0aGUgcHJlLXR3ZWVuIHZhbHVlcyBjaGFuZ2VkIHNpbmNlIHRoZSB0d2VlbiB3YXMgY3JlYXRlZCwgdGhleSdyZSByZWNvcmRlZC5cblxuICAgICAgcHJldlN0YXJ0QXQuX2xhenkgPSAwO1xuICAgIH1cblxuICAgIGlmIChzdGFydEF0KSB7XG4gICAgICBfcmVtb3ZlRnJvbVBhcmVudCh0d2Vlbi5fc3RhcnRBdCA9IFR3ZWVuLnNldCh0YXJnZXRzLCBfc2V0RGVmYXVsdHMoe1xuICAgICAgICBkYXRhOiBcImlzU3RhcnRcIixcbiAgICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGltbWVkaWF0ZVJlbmRlcjogdHJ1ZSxcbiAgICAgICAgbGF6eTogIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxuICAgICAgICBzdGFydEF0OiBudWxsLFxuICAgICAgICBkZWxheTogMCxcbiAgICAgICAgb25VcGRhdGU6IG9uVXBkYXRlICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX2NhbGxiYWNrKHR3ZWVuLCBcIm9uVXBkYXRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBzdGFnZ2VyOiAwXG4gICAgICB9LCBzdGFydEF0KSkpOyAvL2NvcHkgdGhlI
12666HByb3BlcnRpZXMvdmFsdWVzIGludG8gYSBuZXcgb2JqZWN0IHRvIGF2b2lkIGNvbGxpc2lvbnMsIGxpa2UgdmFyIHRvID0ge3g6MH0sIGZyb20gPSB7eDo1MDB9OyB0aW1lbGluZS5mcm9tVG8oZSwgZnJvbSwgdG8pLmZyb21UbyhlLCB0bywgZnJvbSk7XG5cblxuICAgICAgdHdlZW4uX3N0YXJ0QXQuX2RwID0gMDsgLy8gZG9uJ3QgYWxsb3cgaXQgdG8gZ2V0IHB1dCBiYWNrIGludG8gcm9vdCB0aW1lbGluZSEgTGlrZSB3aGVuIHJldmVydCgpIGlzIGNhbGxlZCBhbmQgdG90YWxUaW1lKCkgZ2V0cyBzZXQuXG5cbiAgICAgIHR3ZWVuLl9zdGFydEF0Ll9zYXQgPSB0d2VlbjsgLy8gdXNlZCBpbiBnbG9iYWxUaW1lKCkuIF9zYXQgc3RhbmRzIGZvciBfc3RhcnRBdFR3ZWVuXG5cbiAgICAgIHRpbWUgPCAwICYmIChfcmV2ZXJ0aW5nIHx8ICFpbW1lZGlhdGVSZW5kZXIgJiYgIWF1dG9SZXZlcnQpICYmIHR3ZWVuLl9zdGFydEF0LnJldmVydChfcmV2ZXJ0Q29uZmlnTm9LaWxsKTsgLy8gcmFyZSBlZGdlIGNhc2UsIGxpa2UgaWYgYSByZW5kZXIgaXMgZm9yY2VkIGluIHRoZSBuZWdhdGl2ZSBkaXJlY3Rpb24gb2YgYSBub24taW5pdHRlZCB0d2Vlbi5cblxuICAgICAgaWYgKGltbWVkaWF0ZVJlbmRlcikge1xuICAgICAgICBpZiAoZHVyICYmIHRpbWUgPD0gMCAmJiB0VGltZSA8PSAwKSB7XG4gICAgICAgICAgLy8gY2hlY2sgdFRpbWUgaGVyZSBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIGEgeW95byB0d2VlbiB3aG9zZSBwbGF5aGVhZCBnZXRzIHB1c2hlZCB0byB0aGUgZW5kIGxpa2UgdHdlZW4ucHJvZ3Jlc3MoMSksIHdlIHNob3VsZCBhbGxvdyBpdCB0aHJvdWdoIHNvIHRoYXQgdGhlIG9uQ29tcGxldGUgZ2V0cyBmaXJlZCBwcm9wZXJseS5cbiAgICAgICAgICB0aW1lICYmICh0d2Vlbi5felRpbWUgPSB0aW1lKTtcbiAgICAgICAgICByZXR1cm47IC8vd2Ugc2tpcCBpbml0aWFsaXphdGlvbiBoZXJlIHNvIHRoYXQgb3ZlcndyaXRpbmcgZG9lc24ndCBvY2N1ciB1bnRpbCB0aGUgdHdlZW4gYWN0dWFsbHkgYmVnaW5zLiBPdGhlcndpc2UsIGlmIHlvdSBjcmVhdGUgc2V2ZXJhbCBpbW1lZGlhdGVSZW5kZXI6dHJ1ZSB0d2VlbnMgb2YgdGhlIHNhbWUgdGFyZ2V0L3Byb3BlcnRpZXMgdG8gZHJvcCBpbnRvIGEgVGltZWxpbmUsIHRoZSBsYXN0IG9uZSBjcmVhdGVkIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZmlyc3Qgb25lcyBiZWNhdXNlIHRoZXkgZGlkbid0IGdldCBwbGFjZWQgaW50byB0aGUgdGltZWxpbmUgeWV0IGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyIG9jY3VycyBhbmQga2lja3MgaW4gb3ZlcndyaXRpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJ1bkJhY2t3YXJkcyAmJiBkdXIpIHtcbiAgICAgIC8vIGZyb20oKSB0d2VlbnMgbXVzdCBiZSBoYW5kbGVkIHVuaXF1ZWx5OiB0aGVpciBiZWdpbm5pbmcgdmFsdWVzIG11c3QgYmUgcmVuZGVyZWQgYnV0IHdlIGRvbid0IHdhbnQgb3ZlcndyaXRpbmcgdG8gb2NjdXIgeWV0ICh3aGVuIHRpbWUgaXMgc3RpbGwgMCkuIFdhaXQgdW50aWwgdGhlIHR3ZWVuIGFjdHVhbGx5IGJlZ2lucyBiZWZvcmUgZG9pbmcgYWxsIHRoZSByb3V0aW5lcyBsaWtlIG92ZXJ3cml0aW5nLiBBdCB0aGF0IHRpbWUsIHdlIHNob3VsZCByZW5kZXIgYXQgdGhlIEVORCBvZiB0aGUgdHdlZW4gdG8gZW5zdXJlIHRoYXQgdGhpbmdzIGluaXRpYWxpemUgY29ycmVjdGx5IChyZW1lbWJlciwgZnJvbSgpIHR3ZWVucyBnbyBiYWNrd2FyZHMpXG4gICAgICBpZiAoIXByZXZTdGFydEF0KSB7XG4gICAgICAgIHRpbWUgJiYgKGltbWVkaWF0ZVJlbmRlciA9IGZhbHNlKTsgLy9pbiByYXJlIGNhc2VzIChsaWtlIGlmIGEgZnJvbSgpIHR3ZWVuIHJ1bnMgYW5kIHRoZW4gaXMgaW52YWxpZGF0ZSgpLWVkKSwgaW1tZWRpYXRlUmVuZGVyIGNvdWxkIGJlIHRydWUgYnV0IHRoZSBpbml0aWFsIGZvcmNlZC1yZW5kZXIgZ2V0cyBza2lwcGVkLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yY2UgdGhlIHJlbmRlciBpbiB0aGlzIGNvbnRleHQgd2hlbiB0aGUgX3RpbWUgaXMgZ3JlYXRlciB0aGFuIDBcblxuICAgICAgICBwID0gX3NldERlZmF1bHRzKHtcbiAgICAgICAgICBvdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgICAgIGRhdGE6IFwiaXNGcm9tU3RhcnRcIixcbiAgICAgICAgICAvL3dlIHRhZyB0aGUgdHdlZW4gd2l0aCBhcyBcImlzRnJvbVN0YXJ0XCIgc28gdGhhdCBpZiBbaW5zaWRlIGEgcGx1Z2luXSB3ZSBuZWVkIHRvIG9ubHkgZG8gc29tZXRoaW5nIGF0IHRoZSB2ZXJ5IEVORCBvZiBhIHR3ZWVuLCB3ZSBoYXZlIGEgd2F5IG9mIGlkZW50aWZ5aW5nIHRoaXMgdHdlZW4gYXMgbWVyZWx5IHRoZSBvbmUgdGhhdCdzIHNldHRpbmcgdGhlIGJlZ2lubmluZyB2YWx1ZXMgZm9yIGEgXCJmcm9tKClcIiB0d2Vlbi4gRm9yIGV4YW1wbGUsIGNsZWFyUHJvcHMgaW4gQ1NTUGx1Z2luIHNob3VsZCBvbmx5IGdldCBhcHBsaWVkIGF0IHRoZSB2ZXJ5IEVORCBvZiBhIHR3ZWVuIGFuZCB3aXRob3V0IHRoaXMgdGFnLCBmcm9tKC4uLntoZWlnaHQ6MTAwLCBjbGVhclByb3BzOlwiaGVpZ2h0XCIsIGRlbGF5OjF9KSB3b3VsZCB3aXBlIHRoZSBoZWlnaHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHdlZW4gYW5kIGFmdGVyIDEgc2Vjb25kLCBpdCdkIGtpY2sgYmFjayBpbi5cbiAgICAgICAgICBsYXp5OiBpbW1lZGlhdGVSZW5kZXIgJiYgIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxuICAgICAgICAgIGltbWVkaWF0ZVJlbmRlcjogaW1tZWRpYXRlUmVuZGVyLFxuICAgICAgICAgIC8vemVyby1kdXJhdGlvbiB0d2VlbnMgcmVuZGVyIGltbWVkaWF0ZWx5IGJ5IGRlZmF1bHQsIGJ1dCBpZiB3ZSdyZSBub3Qgc3BlY2lmaWNhbGx5IGluc3RydWN0ZWQgdG8gcmVuZGVyIHRoaXMgdHdlZW4gaW1tZWRpYXRlbHksIHdlIHNob3VsZCBza2lwIHRoaXMgYW5kIG1lcmVseSBfaW5pdCgpIHRvIHJlY29yZCB0aGUgc3RhcnRpbmcgdmFsdWVzIChyZW5kZXJpbmcgdGhlbSBpbW1lZGlhdGVseSB3b3VsZCBwdXNoIHRoZW0gdG8gY29tcGxldGlvbiB3aGljaCBpcyB3YXN0ZWZ1bCBpbiB0aGF0IGNhc2UgLSB3ZSdkIGhhdmUgdG8gcmVuZGVyKC0xKSBpbW1lZGlhdGVseSBhZnRlcilcbiAgICAgICAgICBzdGFnZ2VyOiAwLFxuICAgICAgICAgI
12666HBhcmVudDogcGFyZW50IC8vZW5zdXJlcyB0aGF0IG5lc3RlZCB0d2VlbnMgdGhhdCBoYWQgYSBzdGFnZ2VyIGFyZSBoYW5kbGVkIHByb3Blcmx5LCBsaWtlIGdzYXAuZnJvbShcIi5jbGFzc1wiLCB7eTogZ3NhcC51dGlscy53cmFwKFstMTAwLDEwMF0pLCBzdGFnZ2VyOiAwLjV9KVxuXG4gICAgICAgIH0sIGNsZWFuVmFycyk7XG4gICAgICAgIGhhcm5lc3NWYXJzICYmIChwW2hhcm5lc3MucHJvcF0gPSBoYXJuZXNzVmFycyk7IC8vIGluIGNhc2Ugc29tZW9uZSBkb2VzIHNvbWV0aGluZyBsaWtlIC5mcm9tKC4uLiwge2Nzczp7fX0pXG5cbiAgICAgICAgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4uX3N0YXJ0QXQgPSBUd2Vlbi5zZXQodGFyZ2V0cywgcCkpO1xuXG4gICAgICAgIHR3ZWVuLl9zdGFydEF0Ll9kcCA9IDA7IC8vIGRvbid0IGFsbG93IGl0IHRvIGdldCBwdXQgYmFjayBpbnRvIHJvb3QgdGltZWxpbmUhXG5cbiAgICAgICAgdHdlZW4uX3N0YXJ0QXQuX3NhdCA9IHR3ZWVuOyAvLyB1c2VkIGluIGdsb2JhbFRpbWUoKVxuXG4gICAgICAgIHRpbWUgPCAwICYmIChfcmV2ZXJ0aW5nID8gdHdlZW4uX3N0YXJ0QXQucmV2ZXJ0KF9yZXZlcnRDb25maWdOb0tpbGwpIDogdHdlZW4uX3N0YXJ0QXQucmVuZGVyKC0xLCB0cnVlKSk7XG4gICAgICAgIHR3ZWVuLl96VGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKCFpbW1lZGlhdGVSZW5kZXIpIHtcbiAgICAgICAgICBfaW5pdFR3ZWVuKHR3ZWVuLl9zdGFydEF0LCBfdGlueU51bSwgX3RpbnlOdW0pOyAvL2Vuc3VyZXMgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgYXJlIHJlY29yZGVkXG5cbiAgICAgICAgfSBlbHNlIGlmICghdGltZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHR3ZWVuLl9wdCA9IHR3ZWVuLl9wdENhY2hlID0gMDtcbiAgICBsYXp5ID0gZHVyICYmIF9pc05vdEZhbHNlKGxhenkpIHx8IGxhenkgJiYgIWR1cjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXRzW2ldO1xuICAgICAgZ3NEYXRhID0gdGFyZ2V0Ll9nc2FwIHx8IF9oYXJuZXNzKHRhcmdldHMpW2ldLl9nc2FwO1xuICAgICAgdHdlZW4uX3B0TG9va3VwW2ldID0gcHRMb29rdXAgPSB7fTtcbiAgICAgIF9sYXp5TG9va3VwW2dzRGF0YS5pZF0gJiYgX2xhenlUd2VlbnMubGVuZ3RoICYmIF9sYXp5UmVuZGVyKCk7IC8vaWYgb3RoZXIgdHdlZW5zIG9mIHRoZSBzYW1lIHRhcmdldCBoYXZlIHJlY2VudGx5IGluaXR0ZWQgYnV0IGhhdmVuJ3QgcmVuZGVyZWQgeWV0LCB3ZSd2ZSBnb3QgdG8gZm9yY2UgdGhlIHJlbmRlciBzbyB0aGF0IHRoZSBzdGFydGluZyB2YWx1ZXMgYXJlIGNvcnJlY3QgKGltYWdpbmUgcG9wdWxhdGluZyBhIHRpbWVsaW5lIHdpdGggYSBidW5jaCBvZiBzZXF1ZW50aWFsIHR3ZWVucyBhbmQgdGhlbiBqdW1waW5nIHRvIHRoZSBlbmQpXG5cbiAgICAgIGluZGV4ID0gZnVsbFRhcmdldHMgPT09IHRhcmdldHMgPyBpIDogZnVsbFRhcmdldHMuaW5kZXhPZih0YXJnZXQpO1xuXG4gICAgICBpZiAoaGFybmVzcyAmJiAocGx1Z2luID0gbmV3IGhhcm5lc3MoKSkuaW5pdCh0YXJnZXQsIGhhcm5lc3NWYXJzIHx8IGNsZWFuVmFycywgdHdlZW4sIGluZGV4LCBmdWxsVGFyZ2V0cykgIT09IGZhbHNlKSB7XG4gICAgICAgIHR3ZWVuLl9wdCA9IHB0ID0gbmV3IFByb3BUd2Vlbih0d2Vlbi5fcHQsIHRhcmdldCwgcGx1Z2luLm5hbWUsIDAsIDEsIHBsdWdpbi5yZW5kZXIsIHBsdWdpbiwgMCwgcGx1Z2luLnByaW9yaXR5KTtcblxuICAgICAgICBwbHVnaW4uX3Byb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBwdExvb2t1cFtuYW1lXSA9IHB0O1xuICAgICAgICB9KTtcblxuICAgICAgICBwbHVnaW4ucHJpb3JpdHkgJiYgKGhhc1ByaW9yaXR5ID0gMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFybmVzcyB8fCBoYXJuZXNzVmFycykge1xuICAgICAgICBmb3IgKHAgaW4gY2xlYW5WYXJzKSB7XG4gICAgICAgICAgaWYgKF9wbHVnaW5zW3BdICYmIChwbHVnaW4gPSBfY2hlY2tQbHVnaW4ocCwgY2xlYW5WYXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgZnVsbFRhcmdldHMpKSkge1xuICAgICAgICAgICAgcGx1Z2luLnByaW9yaXR5ICYmIChoYXNQcmlvcml0eSA9IDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdExvb2t1cFtwXSA9IHB0ID0gX2FkZFByb3BUd2Vlbi5jYWxsKHR3ZWVuLCB0YXJnZXQsIHAsIFwiZ2V0XCIsIGNsZWFuVmFyc1twXSwgaW5kZXgsIGZ1bGxUYXJnZXRzLCAwLCB2YXJzLnN0cmluZ0ZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHR3ZWVuLl9vcCAmJiB0d2Vlbi5fb3BbaV0gJiYgdHdlZW4ua2lsbCh0YXJnZXQsIHR3ZWVuLl9vcFtpXSk7XG5cbiAgICAgIGlmIChhdXRvT3ZlcndyaXRlICYmIHR3ZWVuLl9wdCkge1xuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IHR3ZWVuO1xuXG4gICAgICAgIF9nbG9iYWxUaW1lbGluZS5raWxsVHdlZW5zT2YodGFyZ2V0LCBwdExvb2t1cCwgdHdlZW4uZ2xvYmFsVGltZSh0aW1lKSk7IC8vIG1ha2Ugc3VyZSB0aGUgb3ZlcndyaXRpbmcgZG9lc24ndCBvdmVyd3JpdGUgVEhJUyB0d2VlbiEhIVxuXG5cbiAgICAgICAgb3ZlcndyaXR0ZW4gPSAhdHdlZW4ucGFyZW50O1xuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIHR3ZWVuLl9wdCAmJiBsYXp5ICYmIChfbGF6eUxvb2t1cFtnc0RhdGEuaWRdID0gMSk7XG4gICAgfVxuXG4gICAgaGFzUHJpb3JpdHkgJiYgX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eSh0d2Vlbik7XG4gICAgdHdlZW4uX29uSW5pdCAmJiB0d2Vlbi5fb25Jbml0KHR3ZWVuKTsgLy9wbHVnaW5zIGxpa2UgUm91bmRQcm9wcyBtdXN0IHdhaXQgdW50aWwgQUxMIG9mIHRoZSBQcm9wVHdlZW5zIGFyZSBpbnN0YW50aWF0ZWQuIEluIHRoZSBwbHVnaW4ncyBpbml0KCkgZnVuY3Rpb24sIGl0IHNldHMgdGhlIF9vbkluaXQgb24gdGhlIHR3ZWVuIGluc3RhbmNlLiBNYXkgbm90IGJlIHByZXR0eS9pbnR1aXRpdmUsIGJ1dCBpdCdzIGZhc3QgYW5kIGtlZXBzIGZpbGUgc2l6ZSBkb3duLlxuICB9XG5cbiAgdHdlZW4uX29uVXBkYXRlID0gb25VcGRhdGU7XG4gIHR3ZWVuLl9pbml0dGVkID0gKCF0d2Vlbi5fb3AgfHwgdHdlZW4uX3B0KSAmJiAhb3ZlcndyaXR0ZW47IC8vIGlmIG92ZXJ3cml0dGVuUHJvcHMgcmVzdWx0ZWQgaW4gdGhlIGVudGlyZSB0d2VlbiBiZWluZyBraWxsZWQsIGRvIE5PVCBmbGFnIGl0IGFzIGluaXR0ZWQgb3IgZWxzZSBpdCBtYXkgcmVuZGVyIGZvciBvbmUgdGljay5cblxuICBrZXlmcmFtZXMgJiYgdGltZSA8PSAwICYmIHRsLnJlbmRlcihfYmlnTnVtLCB0cnVlLCB0cnVlKTsgLy8gaWYgdGhlcmUncyBhIDAlIGtleWZyYW1lLCBpdCdsbCByZW5kZXIgaW4gdGhlIFwiYmVmb3JlXCIg
12666c3RhdGUgZm9yIGFueSBzdGFnZ2VyZWQvZGVsYXllZCBhbmltYXRpb25zIHRodXMgd2hlbiB0aGUgZm9sbG93aW5nIHR3ZWVuIGluaXRpYWxpemVzLCBpdCdsbCB1c2UgdGhlIFwiYmVmb3JlXCIgc3RhdGUgaW5zdGVhZCBvZiB0aGUgXCJhZnRlclwiIHN0YXRlIGFzIHRoZSBpbml0aWFsIHZhbHVlcy5cbn0sXG4gICAgX3VwZGF0ZVByb3BUd2VlbnMgPSBmdW5jdGlvbiBfdXBkYXRlUHJvcFR3ZWVucyh0d2VlbiwgcHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCByYXRpbywgdGltZSwgc2tpcFJlY3Vyc2lvbikge1xuICB2YXIgcHRDYWNoZSA9ICh0d2Vlbi5fcHQgJiYgdHdlZW4uX3B0Q2FjaGUgfHwgKHR3ZWVuLl9wdENhY2hlID0ge30pKVtwcm9wZXJ0eV0sXG4gICAgICBwdCxcbiAgICAgIHJvb3RQVCxcbiAgICAgIGxvb2t1cCxcbiAgICAgIGk7XG5cbiAgaWYgKCFwdENhY2hlKSB7XG4gICAgcHRDYWNoZSA9IHR3ZWVuLl9wdENhY2hlW3Byb3BlcnR5XSA9IFtdO1xuICAgIGxvb2t1cCA9IHR3ZWVuLl9wdExvb2t1cDtcbiAgICBpID0gdHdlZW4uX3RhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcHQgPSBsb29rdXBbaV1bcHJvcGVydHldO1xuXG4gICAgICBpZiAocHQgJiYgcHQuZCAmJiBwdC5kLl9wdCkge1xuICAgICAgICAvLyBpdCdzIGEgcGx1Z2luLCBzbyBmaW5kIHRoZSBuZXN0ZWQgUHJvcFR3ZWVuXG4gICAgICAgIHB0ID0gcHQuZC5fcHQ7XG5cbiAgICAgICAgd2hpbGUgKHB0ICYmIHB0LnAgIT09IHByb3BlcnR5ICYmIHB0LmZwICE9PSBwcm9wZXJ0eSkge1xuICAgICAgICAgIC8vIFwiZnBcIiBpcyBmdW5jdGlvblBhcmFtIGZvciB0aGluZ3MgbGlrZSBzZXR0aW5nIENTUyB2YXJpYWJsZXMgd2hpY2ggcmVxdWlyZSAuc2V0UHJvcGVydHkoXCItLXZhci1uYW1lXCIsIHZhbHVlKVxuICAgICAgICAgIHB0ID0gcHQuX25leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwdCkge1xuICAgICAgICAvLyB0aGVyZSBpcyBubyBQcm9wVHdlZW4gYXNzb2NpYXRlZCB3aXRoIHRoYXQgcHJvcGVydHksIHNvIHdlIG11c3QgRk9SQ0Ugb25lIHRvIGJlIGNyZWF0ZWQgYW5kIGRpdGNoIG91dCBvZiB0aGlzXG4gICAgICAgIC8vIGlmIHRoZSB0d2VlbiBoYXMgb3RoZXIgcHJvcGVydGllcyB0aGF0IGFscmVhZHkgcmVuZGVyZWQgYXQgbmV3IHBvc2l0aW9ucywgd2UnZCBub3JtYWxseSBoYXZlIHRvIHJld2luZCB0byBwdXQgdGhlbSBiYWNrIGxpa2UgdHdlZW4ucmVuZGVyKDAsIHRydWUpIGJlZm9yZSBmb3JjaW5nIGFuIF9pbml0VHdlZW4oKSwgYnV0IHRoYXQgY2FuIGNyZWF0ZSBhbm90aGVyIGVkZ2UgY2FzZSBsaWtlIHR3ZWVuaW5nIGEgdGltZWxpbmUncyBwcm9ncmVzcyB3b3VsZCB0cmlnZ2VyIG9uVXBkYXRlcyB0byBmaXJlIHdoaWNoIGNvdWxkIG1vdmUgb3RoZXIgdGhpbmdzIGFyb3VuZC4gSXQncyBiZXR0ZXIgdG8ganVzdCBpbmZvcm0gdXNlcnMgdGhhdCAucmVzZXRUbygpIHNob3VsZCBPTkxZIGJlIHVzZWQgZm9yIHR3ZWVucyB0aGF0IGFscmVhZHkgaGF2ZSB0aGF0IHByb3BlcnR5LiBGb3IgZXhhbXBsZSwgeW91IGNhbid0IGdzYXAudG8oLi4ueyB5OiAwIH0pIGFuZCB0aGVuIHR3ZWVuLnJlc3RUbyhcInhcIiwgMjAwKSBmb3IgZXhhbXBsZS5cbiAgICAgICAgX2ZvcmNlQWxsUHJvcFR3ZWVucyA9IDE7IC8vIG90aGVyd2lzZSwgd2hlbiB3ZSBfYWRkUHJvcFR3ZWVuKCkgYW5kIGl0IGZpbmRzIG5vIGNoYW5nZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgaXQgc2tpcHMgY3JlYXRpbmcgYSBQcm9wVHdlZW4gKGZvciBlZmZpY2llbmN5Li4ud2h5IHR3ZWVuIHdoZW4gdGhlcmUncyBubyBkaWZmZXJlbmNlPykgYnV0IGluIHRoaXMgY2FzZSB3ZSBORUVEIHRoYXQgUHJvcFR3ZWVuIGNyZWF0ZWQgc28gd2UgY2FuIGVkaXQgaXQuXG5cbiAgICAgICAgdHdlZW4udmFyc1twcm9wZXJ0eV0gPSBcIis9MFwiO1xuXG4gICAgICAgIF9pbml0VHdlZW4odHdlZW4sIHRpbWUpO1xuXG4gICAgICAgIF9mb3JjZUFsbFByb3BUd2VlbnMgPSAwO1xuICAgICAgICByZXR1cm4gc2tpcFJlY3Vyc2lvbiA/IF93YXJuKHByb3BlcnR5ICsgXCIgbm90IGVsaWdpYmxlIGZvciByZXNldC4gVHJ5IHNwbGl0dGluZyBpbnRvIGluZGl2aWR1YWwgcHJvcGVydGllc1wiKSA6IDE7IC8vIGlmIHNvbWVvbmUgdHJpZXMgdG8gZG8gYSBxdWlja1RvKCkgb24gYSBzcGVjaWFsIHByb3BlcnR5IGxpa2UgYm9yZGVyUmFkaXVzIHdoaWNoIG11c3QgZ2V0IHNwbGl0IGludG8gNCBkaWZmZXJlbnQgcHJvcGVydGllcywgdGhhdCdzIG5vdCBlbGlnaWJsZSBmb3IgLnJlc2V0VG8oKS5cbiAgICAgIH1cblxuICAgICAgcHRDYWNoZS5wdXNoKHB0KTtcbiAgICB9XG4gIH1cblxuICBpID0gcHRDYWNoZS5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHJvb3RQVCA9IHB0Q2FjaGVbaV07XG4gICAgcHQgPSByb290UFQuX3B0IHx8IHJvb3RQVDsgLy8gY29tcGxleCB2YWx1ZXMgbWF5IGhhdmUgbmVzdGVkIFByb3BUd2VlbnMuIFdlIG9ubHkgYWNjb21tb2RhdGUgdGhlIEZJUlNUIHZhbHVlLlxuXG4gICAgcHQucyA9IChzdGFydCB8fCBzdGFydCA9PT0gMCkgJiYgIXN0YXJ0SXNSZWxhdGl2ZSA/IHN0YXJ0IDogcHQucyArIChzdGFydCB8fCAwKSArIHJhdGlvICogcHQuYztcbiAgICBwdC5jID0gdmFsdWUgLSBwdC5zO1xuICAgIHJvb3RQVC5lICYmIChyb290UFQuZSA9IF9yb3VuZCh2YWx1ZSkgKyBnZXRVbml0KHJvb3RQVC5lKSk7IC8vIG1haW5seSBmb3IgQ1NTUGx1Z2luIChlbmQgdmFsdWUpXG5cbiAgICByb290UFQuYiAmJiAocm9vdFBULmIgPSBwdC5zICsgZ2V0VW5pdChyb290UFQuYikpOyAvLyAoYmVnaW5uaW5nIHZhbHVlKVxuICB9XG59LFxuICAgIF9hZGRBbGlhc2VzVG9WYXJzID0gZnVuY3Rpb24gX2FkZEFsaWFzZXNUb1ZhcnModGFyZ2V0cywgdmFycykge1xuICB2YXIgaGFybmVzcyA9IHRhcmdldHNbMF0gPyBfZ2V0Q2FjaGUodGFyZ2V0c1swXSkuaGFybmVzcyA6IDAsXG4gICAgICBwcm9wZXJ0eUFsaWFzZXMgPSBoYXJuZXNzICYmIGhhcm5lc3MuYWxpYXNlcyxcbiAgICAgIGNvcHksXG4gICAgICBwLFxuICAgICAgaSxcbiAgICAgIGFsaWFzZXM7XG5cbiAgaWYgKCFwcm9wZXJ0eUFsaWFzZXMpIHtcbiAgICByZXR1cm4gdmFycztcbiAgfVxuXG4gIGNvcHkgPSBfbWVyZ2Uoe30sIHZhcnMpO1xuXG4gIGZvciAocCBpbiBwcm9wZXJ0eUFsaWFzZXMpIHtcbiAgICBpZiAocCBpbiBjb3B5KSB7XG4gICAgICBhbGlhc2VzID0gcHJvcGVydHlBbGlhc2VzW3BdLnNwbGl0KFwiLFwiKTtcbiAgICAgIGkgPSBhbGlhc2VzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBjb3B5W2FsaWFzZXNbaV1dID0gY29weVtwXTtcbiAgICAgIH1cbiAgICB9XG4gI
12666H1cblxuICByZXR1cm4gY29weTtcbn0sXG4gICAgLy8gcGFyc2VzIG11bHRpcGxlIGZvcm1hdHMsIGxpa2Uge1wiMCVcIjoge3g6IDEwMH0sIHtcIjUwJVwiOiB7eDogLTIwfX0gYW5kIHsgeDoge1wiMCVcIjogMTAwLCBcIjUwJVwiOiAtMjB9IH0sIGFuZCBhbiBcImVhc2VcIiBjYW4gYmUgc2V0IG9uIGFueSBvYmplY3QuIFdlIHBvcHVsYXRlIGFuIFwiYWxsUHJvcHNcIiBvYmplY3Qgd2l0aCBhbiBBcnJheSBmb3IgZWFjaCBwcm9wZXJ0eSwgbGlrZSB7eDogW3t9LCB7fV0sIHk6W3t9LCB7fV19IHdpdGggZGF0YSBmb3IgZWFjaCBwcm9wZXJ0eSB0d2Vlbi4gVGhlIG9iamVjdHMgaGF2ZSBhIFwidFwiICh0aW1lKSwgXCJ2XCIsICh2YWx1ZSksIGFuZCBcImVcIiAoZWFzZSkgcHJvcGVydHkuIFRoaXMgYWxsb3dzIHVzIHRvIHBpZWNlIHRvZ2V0aGVyIGEgdGltZWxpbmUgbGF0ZXIuXG5fcGFyc2VLZXlmcmFtZSA9IGZ1bmN0aW9uIF9wYXJzZUtleWZyYW1lKHByb3AsIG9iaiwgYWxsUHJvcHMsIGVhc2VFYWNoKSB7XG4gIHZhciBlYXNlID0gb2JqLmVhc2UgfHwgZWFzZUVhY2ggfHwgXCJwb3dlcjEuaW5PdXRcIixcbiAgICAgIHAsXG4gICAgICBhO1xuXG4gIGlmIChfaXNBcnJheShvYmopKSB7XG4gICAgYSA9IGFsbFByb3BzW3Byb3BdIHx8IChhbGxQcm9wc1twcm9wXSA9IFtdKTsgLy8gdCA9IHRpbWUgKG91dCBvZiAxMDApLCB2ID0gdmFsdWUsIGUgPSBlYXNlXG5cbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgIHJldHVybiBhLnB1c2goe1xuICAgICAgICB0OiBpIC8gKG9iai5sZW5ndGggLSAxKSAqIDEwMCxcbiAgICAgICAgdjogdmFsdWUsXG4gICAgICAgIGU6IGVhc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZvciAocCBpbiBvYmopIHtcbiAgICAgIGEgPSBhbGxQcm9wc1twXSB8fCAoYWxsUHJvcHNbcF0gPSBbXSk7XG4gICAgICBwID09PSBcImVhc2VcIiB8fCBhLnB1c2goe1xuICAgICAgICB0OiBwYXJzZUZsb2F0KHByb3ApLFxuICAgICAgICB2OiBvYmpbcF0sXG4gICAgICAgIGU6IGVhc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSxcbiAgICBfcGFyc2VGdW5jT3JTdHJpbmcgPSBmdW5jdGlvbiBfcGFyc2VGdW5jT3JTdHJpbmcodmFsdWUsIHR3ZWVuLCBpLCB0YXJnZXQsIHRhcmdldHMpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwodHdlZW4sIGksIHRhcmdldCwgdGFyZ2V0cykgOiBfaXNTdHJpbmcodmFsdWUpICYmIH52YWx1ZS5pbmRleE9mKFwicmFuZG9tKFwiKSA/IF9yZXBsYWNlUmFuZG9tKHZhbHVlKSA6IHZhbHVlO1xufSxcbiAgICBfc3RhZ2dlclR3ZWVuUHJvcHMgPSBfY2FsbGJhY2tOYW1lcyArIFwicmVwZWF0LHJlcGVhdERlbGF5LHlveW8scmVwZWF0UmVmcmVzaCx5b3lvRWFzZSxlYXNlUmV2ZXJzZSxhdXRvUmV2ZXJ0XCIsXG4gICAgX3N0YWdnZXJQcm9wc1RvU2tpcCA9IHt9O1xuXG5fZm9yRWFjaE5hbWUoX3N0YWdnZXJUd2VlblByb3BzICsgXCIsaWQsc3RhZ2dlcixkZWxheSxkdXJhdGlvbixwYXVzZWQsc2Nyb2xsVHJpZ2dlclwiLCBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gX3N0YWdnZXJQcm9wc1RvU2tpcFtuYW1lXSA9IDE7XG59KTtcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVFdFRU5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG5leHBvcnQgdmFyIFR3ZWVuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQW5pbWF0aW9uMikge1xuICBfaW5oZXJpdHNMb29zZShUd2VlbiwgX0FuaW1hdGlvbjIpO1xuXG4gIGZ1bmN0aW9uIFR3ZWVuKHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uLCBza2lwSW5oZXJpdCkge1xuICAgIHZhciBfdGhpczM7XG5cbiAgICBpZiAodHlwZW9mIHZhcnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHBvc2l0aW9uLmR1cmF0aW9uID0gdmFycztcbiAgICAgIHZhcnMgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICBfdGhpczMgPSBfQW5pbWF0aW9uMi5jYWxsKHRoaXMsIHNraXBJbmhlcml0ID8gdmFycyA6IF9pbmhlcml0RGVmYXVsdHModmFycykpIHx8IHRoaXM7XG4gICAgdmFyIF90aGlzMyR2YXJzID0gX3RoaXMzLnZhcnMsXG4gICAgICAgIGR1cmF0aW9uID0gX3RoaXMzJHZhcnMuZHVyYXRpb24sXG4gICAgICAgIGRlbGF5ID0gX3RoaXMzJHZhcnMuZGVsYXksXG4gICAgICAgIGltbWVkaWF0ZVJlbmRlciA9IF90aGlzMyR2YXJzLmltbWVkaWF0ZVJlbmRlcixcbiAgICAgICAgc3RhZ2dlciA9IF90aGlzMyR2YXJzLnN0YWdnZXIsXG4gICAgICAgIG92ZXJ3cml0ZSA9IF90aGlzMyR2YXJzLm92ZXJ3cml0ZSxcbiAgICAgICAga2V5ZnJhbWVzID0gX3RoaXMzJHZhcnMua2V5ZnJhbWVzLFxuICAgICAgICBkZWZhdWx0cyA9IF90aGlzMyR2YXJzLmRlZmF1bHRzLFxuICAgICAgICBzY3JvbGxUcmlnZ2VyID0gX3RoaXMzJHZhcnMuc2Nyb2xsVHJpZ2dlcixcbiAgICAgICAgcGFyZW50ID0gdmFycy5wYXJlbnQgfHwgX2dsb2JhbFRpbWVsaW5lLFxuICAgICAgICBwYXJzZWRUYXJnZXRzID0gKF9pc0FycmF5KHRhcmdldHMpIHx8IF9pc1R5cGVkQXJyYXkodGFyZ2V0cykgPyBfaXNOdW1iZXIodGFyZ2V0c1swXSkgOiBcImxlbmd0aFwiIGluIHZhcnMpID8gW3RhcmdldHNdIDogdG9BcnJheSh0YXJnZXRzKSxcbiAgICAgICAgdGwsXG4gICAgICAgIGksXG4gICAgICAgIGNvcHksXG4gICAgICAgIGwsXG4gICAgICAgIHAsXG4gICAgICAgIGN1clRhcmdldCxcbiAgICAgICAgc3RhZ2dlckZ1bmMsXG4gICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZTtcbiAgICBfdGhpczMuX3RhcmdldHMgPSBwYXJzZWRUYXJnZXRzLmxlbmd0aCA/IF9oYXJuZXNzKHBhcnNlZFRhcmdldHMpIDogX3dhcm4oXCJHU0FQIHRhcmdldCBcIiArIHRhcmdldHMgKyBcIiBub3QgZm91bmQuIGh0dHBzOi8vZ3NhcC5jb21cIiwgIV9jb25maWcubnVsbFRhcmdldFdhcm4pIHx8IFtdO1xuICAgIF90aGlzMy5fcHRMb29rdXAgPSBbXTsgLy9Qcm9wVHdlZW4gbG9va3VwLiBBbiBhcnJheSBjb250YWluaW5nIGFuIG9iamVjdCBmb3IgZWFjaCB0YXJnZXQsIGhhdmluZyBrZXlzIGZvciBlYWNoIHR3ZWVuaW5nIHByb3BlcnR5XG5cbiAgICBfdGhpczMuX292ZXJ3cml0ZSA9IG92ZXJ3cml0ZTtcblxuICAgIGlmIChrZXlmcmFtZXMgfHwgc3RhZ2dlciB8fCBfaXNGdW5jT3JTdHJpbmc
12666oZHVyYXRpb24pIHx8IF9pc0Z1bmNPclN0cmluZyhkZWxheSkpIHtcbiAgICAgIHZhcnMgPSBfdGhpczMudmFycztcbiAgICAgIHZhciBlYXNlUmV2ZXJzZSA9IHZhcnMuZWFzZVJldmVyc2UgfHwgdmFycy55b3lvRWFzZTtcbiAgICAgIHRsID0gX3RoaXMzLnRpbWVsaW5lID0gbmV3IFRpbWVsaW5lKHtcbiAgICAgICAgZGF0YTogXCJuZXN0ZWRcIixcbiAgICAgICAgZGVmYXVsdHM6IGRlZmF1bHRzIHx8IHt9LFxuICAgICAgICB0YXJnZXRzOiBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogcGFyc2VkVGFyZ2V0c1xuICAgICAgfSk7IC8vIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHRhcmdldHMgYmVjYXVzZSBmb3Igc3RhZ2dlcnMgYW5kIGtleWZyYW1lcywgd2UgZW5kIHVwIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgdHdlZW4gZm9yIGVhY2ggYnV0IGZ1bmN0aW9uLWJhc2VkIHZhbHVlcyBuZWVkIHRvIGtub3cgdGhlIGluZGV4IGFuZCB0aGUgd2hvbGUgQXJyYXkgb2YgdGFyZ2V0cy5cblxuICAgICAgdGwua2lsbCgpO1xuICAgICAgdGwucGFyZW50ID0gdGwuX2RwID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpO1xuICAgICAgdGwuX3N0YXJ0ID0gMDtcblxuICAgICAgaWYgKHN0YWdnZXIgfHwgX2lzRnVuY09yU3RyaW5nKGR1cmF0aW9uKSB8fCBfaXNGdW5jT3JTdHJpbmcoZGVsYXkpKSB7XG4gICAgICAgIGwgPSBwYXJzZWRUYXJnZXRzLmxlbmd0aDtcbiAgICAgICAgc3RhZ2dlckZ1bmMgPSBzdGFnZ2VyICYmIGRpc3RyaWJ1dGUoc3RhZ2dlcik7XG5cbiAgICAgICAgaWYgKF9pc09iamVjdChzdGFnZ2VyKSkge1xuICAgICAgICAgIC8vdXNlcnMgY2FuIHBhc3MgaW4gY2FsbGJhY2tzIGxpa2Ugb25TdGFydC9vbkNvbXBsZXRlIGluIHRoZSBzdGFnZ2VyIG9iamVjdC4gVGhlc2Ugc2hvdWxkIGZpcmUgd2l0aCBlYWNoIGluZGl2aWR1YWwgdHdlZW4uXG4gICAgICAgICAgZm9yIChwIGluIHN0YWdnZXIpIHtcbiAgICAgICAgICAgIGlmICh+X3N0YWdnZXJUd2VlblByb3BzLmluZGV4T2YocCkpIHtcbiAgICAgICAgICAgICAgc3RhZ2dlclZhcnNUb01lcmdlIHx8IChzdGFnZ2VyVmFyc1RvTWVyZ2UgPSB7fSk7XG4gICAgICAgICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZVtwXSA9IHN0YWdnZXJbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvcHkgPSBfY29weUV4Y2x1ZGluZyh2YXJzLCBfc3RhZ2dlclByb3BzVG9Ta2lwKTtcbiAgICAgICAgICBjb3B5LnN0YWdnZXIgPSAwO1xuICAgICAgICAgIGVhc2VSZXZlcnNlICYmIChjb3B5LmVhc2VSZXZlcnNlID0gZWFzZVJldmVyc2UpO1xuICAgICAgICAgIHN0YWdnZXJWYXJzVG9NZXJnZSAmJiBfbWVyZ2UoY29weSwgc3RhZ2dlclZhcnNUb01lcmdlKTtcbiAgICAgICAgICBjdXJUYXJnZXQgPSBwYXJzZWRUYXJnZXRzW2ldOyAvL2Rvbid0IGp1c3QgY29weSBkdXJhdGlvbiBvciBkZWxheSBiZWNhdXNlIGlmIHRoZXkncmUgYSBzdHJpbmcgb3IgZnVuY3Rpb24sIHdlJ2QgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AgYmVjYXVzZSBfaXNGdW5jT3JTdHJpbmcoKSB3b3VsZCBldmFsdWF0ZSBhcyB0cnVlIGluIHRoZSBjaGlsZCB0d2VlbnMsIGVudGVyaW5nIHRoaXMgbG9vcCwgZXRjLiBTbyB3ZSBwYXJzZSB0aGUgdmFsdWUgc3RyYWlnaHQgZnJvbSB2YXJzIGFuZCBkZWZhdWx0IHRvIDAuXG5cbiAgICAgICAgICBjb3B5LmR1cmF0aW9uID0gK19wYXJzZUZ1bmNPclN0cmluZyhkdXJhdGlvbiwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBpLCBjdXJUYXJnZXQsIHBhcnNlZFRhcmdldHMpO1xuICAgICAgICAgIGNvcHkuZGVsYXkgPSAoK19wYXJzZUZ1bmNPclN0cmluZyhkZWxheSwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBpLCBjdXJUYXJnZXQsIHBhcnNlZFRhcmdldHMpIHx8IDApIC0gX3RoaXMzLl9kZWxheTtcblxuICAgICAgICAgIGlmICghc3RhZ2dlciAmJiBsID09PSAxICYmIGNvcHkuZGVsYXkpIHtcbiAgICAgICAgICAgIC8vIGlmIHNvbWVvbmUgZG9lcyBkZWxheTpcInJhbmRvbSgxLCA1KVwiLCByZXBlYXQ6LTEsIGZvciBleGFtcGxlLCB0aGUgZGVsYXkgc2hvdWxkbid0IGJlIGluc2lkZSB0aGUgcmVwZWF0LlxuICAgICAgICAgICAgX3RoaXMzLl9kZWxheSA9IGRlbGF5ID0gY29weS5kZWxheTtcbiAgICAgICAgICAgIF90aGlzMy5fc3RhcnQgKz0gZGVsYXk7XG4gICAgICAgICAgICBjb3B5LmRlbGF5ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0bC50byhjdXJUYXJnZXQsIGNvcHksIHN0YWdnZXJGdW5jID8gc3RhZ2dlckZ1bmMoaSwgY3VyVGFyZ2V0LCBwYXJzZWRUYXJnZXRzKSA6IDApO1xuICAgICAgICAgIHRsLl9lYXNlID0gX2Vhc2VNYXAubm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRsLmR1cmF0aW9uKCkgPyBkdXJhdGlvbiA9IGRlbGF5ID0gMCA6IF90aGlzMy50aW1lbGluZSA9IDA7IC8vIGlmIHRoZSB0aW1lbGluZSdzIGR1cmF0aW9uIGlzIDAsIHdlIGRvbid0IG5lZWQgYSB0aW1lbGluZSBpbnRlcm5hbGx5IVxuICAgICAgfSBlbHNlIGlmIChrZXlmcmFtZXMpIHtcbiAgICAgICAgX2luaGVyaXREZWZhdWx0cyhfc2V0RGVmYXVsdHModGwudmFycy5kZWZhdWx0cywge1xuICAgICAgICAgIGVhc2U6IFwibm9uZVwiXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0bC5fZWFzZSA9IF9wYXJzZUVhc2Uoa2V5ZnJhbWVzLmVhc2UgfHwgdmFycy5lYXNlIHx8IFwibm9uZVwiKTtcbiAgICAgICAgdmFyIHRpbWUgPSAwLFxuICAgICAgICAgICAgYSxcbiAgICAgICAgICAgIGtmLFxuICAgICAgICAgICAgdjtcblxuICAgICAgICBpZiAoX2lzQXJyYXkoa2V5ZnJhbWVzKSkge1xuICAgICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChmcmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRsLnRvKHBhcnNlZFRhcmdldHMsIGZyYW1lLCBcIj5cIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGwuZHVyYXRpb24oKTsgLy8gdG8gZW5zdXJlIHRsLl9kdXIgaXMgY2FjaGVkIGJlY2F1c2Ugd2UgdGFwIGludG8gaXQgZm9yIHBlcmZvcm1hbmNlIHB1cnBvc2VzIGluIHRoZSByZW5kZXIoKSBtZXRob2QuXG4gICAgICAgI
12666H0gZWxzZSB7XG4gICAgICAgICAgY29weSA9IHt9O1xuXG4gICAgICAgICAgZm9yIChwIGluIGtleWZyYW1lcykge1xuICAgICAgICAgICAgcCA9PT0gXCJlYXNlXCIgfHwgcCA9PT0gXCJlYXNlRWFjaFwiIHx8IF9wYXJzZUtleWZyYW1lKHAsIGtleWZyYW1lc1twXSwgY29weSwga2V5ZnJhbWVzLmVhc2VFYWNoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHAgaW4gY29weSkge1xuICAgICAgICAgICAgYSA9IGNvcHlbcF0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gYS50IC0gYi50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aW1lID0gMDtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAga2YgPSBhW2ldO1xuICAgICAgICAgICAgICB2ID0ge1xuICAgICAgICAgICAgICAgIGVhc2U6IGtmLmUsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IChrZi50IC0gKGkgPyBhW2kgLSAxXS50IDogMCkpIC8gMTAwICogZHVyYXRpb25cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdltwXSA9IGtmLnY7XG4gICAgICAgICAgICAgIHRsLnRvKHBhcnNlZFRhcmdldHMsIHYsIHRpbWUpO1xuICAgICAgICAgICAgICB0aW1lICs9IHYuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGwuZHVyYXRpb24oKSA8IGR1cmF0aW9uICYmIHRsLnRvKHt9LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gLSB0bC5kdXJhdGlvbigpXG4gICAgICAgICAgfSk7IC8vIGluIGNhc2Uga2V5ZnJhbWVzIGRpZG4ndCBnbyB0byAxMDAlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHVyYXRpb24gfHwgX3RoaXMzLmR1cmF0aW9uKGR1cmF0aW9uID0gdGwuZHVyYXRpb24oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMy50aW1lbGluZSA9IDA7IC8vc3BlZWQgb3B0aW1pemF0aW9uLCBmYXN0ZXIgbG9va3VwcyAobm8gZ29pbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbilcbiAgICB9XG5cbiAgICBpZiAob3ZlcndyaXRlID09PSB0cnVlICYmICFfc3VwcHJlc3NPdmVyd3JpdGVzKSB7XG4gICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKTtcblxuICAgICAgX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZihwYXJzZWRUYXJnZXRzKTtcblxuICAgICAgX292ZXJ3cml0aW5nVHdlZW4gPSAwO1xuICAgIH1cblxuICAgIF9hZGRUb1RpbWVsaW5lKHBhcmVudCwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBwb3NpdGlvbik7XG5cbiAgICB2YXJzLnJldmVyc2VkICYmIF90aGlzMy5yZXZlcnNlKCk7XG4gICAgdmFycy5wYXVzZWQgJiYgX3RoaXMzLnBhdXNlZCh0cnVlKTtcblxuICAgIGlmIChpbW1lZGlhdGVSZW5kZXIgfHwgIWR1cmF0aW9uICYmICFrZXlmcmFtZXMgJiYgX3RoaXMzLl9zdGFydCA9PT0gX3JvdW5kUHJlY2lzZShwYXJlbnQuX3RpbWUpICYmIF9pc05vdEZhbHNlKGltbWVkaWF0ZVJlbmRlcikgJiYgX2hhc05vUGF1c2VkQW5jZXN0b3JzKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKSkgJiYgcGFyZW50LmRhdGEgIT09IFwibmVzdGVkXCIpIHtcbiAgICAgIF90aGlzMy5fdFRpbWUgPSAtX3RpbnlOdW07IC8vZm9yY2VzIGEgcmVuZGVyIHdpdGhvdXQgaGF2aW5nIHRvIHNldCB0aGUgcmVuZGVyKCkgXCJmb3JjZVwiIHBhcmFtZXRlciB0byB0cnVlIGJlY2F1c2Ugd2Ugd2FudCB0byBhbGxvdyBsYXp5aW5nIGJ5IGRlZmF1bHQgKHVzaW5nIHRoZSBcImZvcmNlXCIgcGFyYW1ldGVyIGFsd2F5cyBmb3JjZXMgYW4gaW1tZWRpYXRlIGZ1bGwgcmVuZGVyKVxuXG4gICAgICBfdGhpczMucmVuZGVyKE1hdGgubWF4KDAsIC1kZWxheSkgfHwgMCk7IC8vaW4gY2FzZSBkZWxheSBpcyBuZWdhdGl2ZVxuXG4gICAgfVxuXG4gICAgc2Nyb2xsVHJpZ2dlciAmJiBfc2Nyb2xsVHJpZ2dlcihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzMyksIHNjcm9sbFRyaWdnZXIpO1xuICAgIHJldHVybiBfdGhpczM7XG4gIH1cblxuICB2YXIgX3Byb3RvMyA9IFR3ZWVuLnByb3RvdHlwZTtcblxuICBfcHJvdG8zLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcih0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuICAgIHZhciBwcmV2VGltZSA9IHRoaXMuX3RpbWUsXG4gICAgICAgIHREdXIgPSB0aGlzLl90RHVyLFxuICAgICAgICBkdXIgPSB0aGlzLl9kdXIsXG4gICAgICAgIGlzTmVnYXRpdmUgPSB0b3RhbFRpbWUgPCAwLFxuICAgICAgICB0VGltZSA9IHRvdGFsVGltZSA+IHREdXIgLSBfdGlueU51bSAmJiAhaXNOZWdhdGl2ZSA/IHREdXIgOiB0b3RhbFRpbWUgPCBfdGlueU51bSA/IDAgOiB0b3RhbFRpbWUsXG4gICAgICAgIHRpbWUsXG4gICAgICAgIHB0LFxuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIGN5Y2xlRHVyYXRpb24sXG4gICAgICAgIHByZXZJdGVyYXRpb24sXG4gICAgICAgIGlzWW95byxcbiAgICAgICAgcmF0aW8sXG4gICAgICAgIHRpbWVsaW5lO1xuXG4gICAgaWYgKCFkdXIpIHtcbiAgICAgIF9yZW5kZXJaZXJvRHVyYXRpb25Ud2Vlbih0aGlzLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgfSBlbHNlIGlmICh0VGltZSAhPT0gdGhpcy5fdFRpbWUgfHwgIXRvdGFsVGltZSB8fCBmb3JjZSB8fCAhdGhpcy5faW5pdHRlZCAmJiB0aGlzLl90VGltZSB8fCB0aGlzLl9zdGFydEF0ICYmIHRoaXMuX3pUaW1lIDwgMCAhPT0gaXNOZWdhdGl2ZSB8fCB0aGlzLl9sYXp5KSB7XG4gICAgICAvLyB0aGlzIHNlbnNlcyBpZiB3ZSdyZSBjcm9zc2luZyBvdmVyIHRoZSBzdGFydCB0aW1lLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgcmVjb3JkIF96VGltZSBhbmQgZm9yY2UgdGhlIHJlbmRlciwgYnV0IHdlIGRvIGl0IGluIHRoaXMgbGVuZ3RoeSBjb25kaXRpb25hbCB3YXkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHVzdWFsbHkgd2UgY2FuIHNraXAgdGhlIGNhbGN1bGF0aW9ucyk6IHRoaXMuX2luaXR0ZWQgJiYgKHRoaXMuX3pUaW1lIDwgMCkgIT09ICh0b3RhbFRpbWUgPCAwKVxuICAgICAgdGltZSA9IHRUaW1lO1xuICAgICAgdGltZWxpbmUgPSB0aGlzLnRpbWVsaW5lO1xuXG4gICAgICBpZiAodGhpcy5fcmVwZWF0KSB7XG4gICAgICAgIC8vYWRqdXN0IHRoZSB0aW1lIGZvciByZXBlYXRzIGFuZCB5b3lvc1xuICAgICAgICBjeWNsZUR1cmF0aW9uID0gZHVyICsgdGh
12666pcy5fckRlbGF5O1xuXG4gICAgICAgIGlmICh0aGlzLl9yZXBlYXQgPCAtMSAmJiBpc05lZ2F0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lKGN5Y2xlRHVyYXRpb24gKiAxMDAgKyB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gX3JvdW5kUHJlY2lzZSh0VGltZSAlIGN5Y2xlRHVyYXRpb24pOyAvL3JvdW5kIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGVycm9ycy4gKDQgJSAwLjggc2hvdWxkIGJlIDAgYnV0IHNvbWUgYnJvd3NlcnMgcmVwb3J0IGl0IGFzIDAuNzk5OTk5OTkhKVxuXG4gICAgICAgIGlmICh0VGltZSA9PT0gdER1cikge1xuICAgICAgICAgIC8vIHRoZSB0RHVyID09PSB0VGltZSBpcyBmb3IgZWRnZSBjYXNlcyB3aGVyZSB0aGVyZSdzIGEgbGVuZ3RoeSBkZWNpbWFsIG9uIHRoZSBkdXJhdGlvbiBhbmQgaXQgbWF5IHJlYWNoIHRoZSB2ZXJ5IGVuZCBidXQgdGhlIHRpbWUgaXMgcmVuZGVyZWQgYXMgbm90LXF1aXRlLXRoZXJlIChyZW1lbWJlciwgdER1ciBpcyByb3VuZGVkIHRvIDQgZGVjaW1hbHMgd2hlcmVhcyBkdXIgaXNuJ3QpXG4gICAgICAgICAgaXRlcmF0aW9uID0gdGhpcy5fcmVwZWF0O1xuICAgICAgICAgIHRpbWUgPSBkdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IF9yb3VuZFByZWNpc2UodFRpbWUgLyBjeWNsZUR1cmF0aW9uKTsgLy8gZnVsbCBkZWNpbWFsIHZlcnNpb24gb2YgaXRlcmF0aW9ucywgbm90IHRoZSBwcmV2aW91cyBpdGVyYXRpb24gKHdlJ3JlIHJldXN
12666pbmcgcHJldkl0ZXJhdGlvbiB2YXJpYWJsZSBmb3IgZWZmaWNpZW5jeSlcblxuICAgICAgICAgIGl0ZXJhdGlvbiA9IH5+cHJldkl0ZXJhdGlvbjtcblxuICAgICAgICAgIGlmIChpdGVyYXRpb24gJiYgaXRlcmF0aW9uID09PSBwcmV2SXRlcmF0aW9uKSB7XG4gICAgICAgICAgICB0aW1lID0gZHVyO1xuICAgICAgICAgICAgaXRlcmF0aW9uLS07XG4gICAgICAgICAgfSBlbHNlIGlmICh0aW1lID4gZHVyKSB7XG4gICAgICAgICAgICB0aW1lID0gZHVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlzWW95byA9IHRoaXMuX3lveW8gJiYgaXRlcmF0aW9uICYgMTtcbiAgICAgICAgaWYgKGlzWW95bykgdGltZSA9IGR1ciAtIHRpbWU7XG4gICAgICAgIHByZXZJdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodGhpcy5fdFRpbWUsIGN5Y2xlRHVyYXRpb24pO1xuXG4gICAgICAgIGlmICh0aW1lID09PSBwcmV2VGltZSAmJiAhZm9yY2UgJiYgdGhpcy5faW5pdHRlZCAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcbiAgICAgICAgICAvL2NvdWxkIGJlIGR1cmluZyB0aGUgcmVwZWF0RGVsYXkgcGFydC4gTm8gbmVlZCB0byByZW5kZXIgYW5kIGZpcmUgY2FsbGJhY2tzLlxuICAgICAgICAgIHRoaXMuX3RUaW1lID0gdFRpbWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uKSB7XG4gICAgICAgICAgLy9yZXBlYXRSZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICBpZiAodGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgIWlzWW95byAmJiAhdGhpcy5fbG9jayAmJiB0aW1lICE9PSBjeWNsZUR1cmF0aW9uICYmIHRoaXMuX2luaXR0ZWQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuX3RpbWUgd2lsbCA9PT0gY3ljbGVEdXJhdGlvbiB3aGVuIHdlIHJlbmRlciBhdCBFWEFDVExZIHRoZSBlbmQgb2YgYW4gaXRlcmF0aW9uLiBXaXRob3V0IHRoaXMgY29uZGl0aW9uLCBpdCdkIG9mdGVuIGRvIHRoZSByZXBlYXRSZWZyZXNoIHJlbmRlciBUV0lDRSAoYWdhaW4gb24gdGhlIHZlcnkgbmV4dCB0aWNrKS5cbiAgICAgICAgICAgIHRoaXMuX2xvY2sgPSBmb3JjZSA9IDE7IC8vZm9yY2UsIG90aGVyd2lzZSBpZiBsYXp5IGlzIHRydWUsIHRoZSBfYXR0ZW1wdEluaXRUd2VlbigpIHdpbGwgcmV0dXJuIGFuZCB3ZSdsbCBqdW1wIG91dCBhbmQgZ2V0IGNhdWdodCBib3VuY2luZyBvbiBlYWNoIHRpY2suXG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyKF9yb3VuZFByZWNpc2UoY3ljbGVEdXJhdGlvbiAqIGl0ZXJhdGlvbiksIHRydWUpLmludmFsaWRhdGUoKS5fbG9jayA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faW5pdHRlZCkge1xuICAgICAgICBpZiAoX2F0dGVtcHRJbml0VHdlZW4odGhpcywgaXNOZWdhdGl2ZSA/IHRvdGFsVGltZSA6IHRpbWUsIGZvcmNlLCBzdXBwcmVzc0V2ZW50cywgdFRpbWUpKSB7XG4gICAgICAgICAgdGhpcy5fdFRpbWUgPSAwOyAvLyBpbiBjb25zdHJ1Y3RvciBpZiBpbW1lZGlhdGVSZW5kZXIgaXMgdHJ1ZSwgd2Ugc2V0IF90VGltZSB0byAtX3RpbnlOdW0gdG8gaGF2ZSB0aGUgcGxheWhlYWQgY3Jvc3MgdGhlIHN0YXJ0aW5nIHBvaW50IGJ1dCB3ZSBjYW4ndCBsZWF2ZSBfdFRpbWUgYXMgYSBuZWdhdGl2ZSBudW1iZXIuXG5cbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSAmJiAhKGZvcmNlICYmIHRoaXMudmFycy5yZXBlYXRSZWZyZXNoICYmIGl0ZXJhdGlvbiAhPT0gcHJldkl0ZXJhdGlvbikpIHtcbiAgICAgICAgICAvLyByYXJlIGVkZ2UgY2FzZSAtIGR1cmluZyBpbml0aWFsaXphdGlvbiwgYW4gb25VcGRhdGUgaW4gdGhlIF9zdGFydEF0ICguZnJvbVRvKCkpIG1pZ2h0IGZvcmNlIHRoaXMgdHdlZW4gdG8gcmVuZGVyIGF0IGEgZGlmZmVyZW50IHNwb3QgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgZGl0Y2ggdGhpcyByZW5kZXIoKSBjYWxsIHNvIHRoYXQgaXQgZG9lc24ndCByZXZlcnQgdGhlIHZhbHVlcy4gQnV0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBkdW1wIGlmIHdlJ3JlIGRvaW5nIGEgcmVwZWF0UmVmcmVzaCByZW5kZXIhXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHVyICE9PSB0aGlzLl9kdXIpIHtcbiAgICAgICAgICAvLyB3aGlsZSBpbml0dGluZywgYSBwbHVnaW4gbGlrZSBJbmVydGlhUGx1Z2luIG1pZ2h0IGFsdGVyIHRoZSBkdXJhdGlvbiwgc28gcmVydW4gZnJvbSB0aGUgc3RhcnQgdG8gZW5zdXJlIGV2ZXJ5dGhpbmcgcmVuZGVycyBhcyBpdCBzaG91bGQuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fckVhc2UpIHtcbiAgICAgICAgdmFyIGludiA9IHRpbWUgPCBwcmV2VGltZTtcblxuICAgICAgICBpZiAoaW52ICE9PSB0aGlzLl9pbnYpIHtcbiAgICAgICAgICB2Y
12666XIgc2VnRHVyID0gaW52ID8gcHJldlRpbWUgOiBkdXIgLSBwcmV2VGltZTtcbiAgICAgICAgICB0aGlzLl9pbnYgPSBpbnY7XG4gICAgICAgICAgaWYgKHRoaXMuX2Zyb20pIHRoaXMucmF0aW8gPSAxIC0gdGhpcy5yYXRpbztcbiAgICAgICAgICB0aGlzLl9pbnZSYXRpbyA9IHRoaXMucmF0aW87XG4gICAgICAgICAgdGhpcy5faW52VGltZSA9IHByZXZUaW1lO1xuICAgICAgICAgIHRoaXMuX2ludlJlY2lwID0gc2VnRHVyID8gKGludiA/IC0xIDogMSkgLyBzZWdEdXIgOiAwO1xuICAgICAgICAgIHRoaXMuX2ludlNjYWxlID0gaW52ID8gLXRoaXMucmF0aW8gOiAxIC0gdGhpcy5yYXRpbztcbiAgICAgICAgICB0aGlzLl9pbnZFYXNlID0gaW52ID8gdGhpcy5fckVhc2UgOiB0aGlzLl9lYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yYXRpbyA9IHJhdGlvID0gdGhpcy5faW52UmF0aW8gKyB0aGlzLl9pbnZTY2FsZSAqIHRoaXMuX2ludkVhc2UoKHRpbWUgLSB0aGlzLl9pbnZUaW1lKSAqIHRoaXMuX2ludlJlY2lwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmF0aW8gPSByYXRpbyA9IHRoaXMuX2Vhc2UodGltZSAvIGR1cik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9mcm9tKSB0aGlzLnJhdGlvID0gcmF0aW8gPSAxIC0gcmF0aW87XG4gICAgICB0aGlzLl90VGltZSA9IHRUaW1lO1xuICAgICAgdGhpcy5fdGltZSA9IHRpbWU7XG5cbiAgICAgIGlmICghdGhpcy5fYWN0ICYmIHRoaXMuX3RzKSB7XG4gICAgICAgIHRoaXMuX2FjdCA9IDE7IC8vYXMgbG9uZyBhcyBpdCdzIG5vdCBwYXVzZWQsIGZvcmNlIGl0IHRvIGJlIGFjdGl2ZSBzbyB0aGF0IGlmIHRoZSB1c2VyIHJlbmRlcnMgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcmVudCB0aW1lbGluZSwgaXQnbGwgYmUgZm9yY2VkIHRvIHJlLXJlbmRlciBvbiB0aGUgbmV4dCB0aWNrLlxuXG4gICAgICAgIHRoaXMuX2xhenkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByZXZUaW1lICYmIHRUaW1lICYmICFzdXBwcmVzc0V2ZW50cyAmJiAhcHJldkl0ZXJhdGlvbikge1xuICAgICAgICBfY2FsbGJhY2sodGhpcywgXCJvblN0YXJ0XCIpO1xuXG4gICAgICAgIGlmICh0aGlzLl90VGltZSAhPT0gdFRpbWUpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBvblN0YXJ0IHRyaWdnZXJlZCBhIHJlbmRlciBhdCBhIGRpZmZlcmVudCBzcG90LCBlamVjdC4gTGlrZSBpZiBzb21lb25lIGRpZCBhbmltYXRpb24ucGF1c2UoMC41KSBvciBzb21ldGhpbmcgaW5zaWRlIHRoZSBvblN0YXJ0LlxuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB0ID0gdGhpcy5fcHQ7XG5cbiAgICAgIHdoaWxlIChwdCkge1xuICAgICAgICBwdC5yKHJhdGlvLCBwdC5kKTtcbiAgICAgICAgcHQgPSBwdC5fbmV4dDtcbiAgICAgIH1cblxuICAgICAgdGltZWxpbmUgJiYgdGltZWxpbmUucmVuZGVyKHRvdGFsVGltZSA8IDAgPyB0b3RhbFRpbWUgOiB0aW1lbGluZS5fZHVyICogdGltZWxpbmUuX2Vhc2UodGltZSAvIHRoaXMuX2R1ciksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkgfHwgdGhpcy5fc3RhcnRBdCAmJiAodGhpcy5felRpbWUgPSB0b3RhbFRpbWUpO1xuXG4gICAgICBpZiAodGhpcy5fb25VcGRhdGUgJiYgIXN1cHByZXNzRXZlbnRzKSB7XG4gICAgICAgIGlzTmVnYXRpdmUgJiYgX3Jld2luZFN0YXJ0QXQodGhpcywgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpOyAvL25vdGU6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSB0dWNrIHRoaXMgY29uZGl0aW9uYWwgbG9naWMgaW5zaWRlIGxlc3MgdHJhdmVsZWQgYXJlYXMgKG1vc3QgdHdlZW5zIGRvbid0IGhhdmUgYW4gb25VcGRhdGUpLiBXZSdkIGp1c3QgaGF2ZSBpdCBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgb25Db21wbGV0ZSwgYnV0IHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYmVmb3JlIGFueSBvblVwZGF0ZSBpcyBjYWxsZWQsIHNvIHdlIEFMU08gcHV0IGl0IGhlcmUgYW5kIHRoZW4gaWYgaXQncyBub3QgY2FsbGVkLCB3ZSBkbyBzbyBsYXRlciBuZWFyIHRoZSBvbkNvbXBsZXRlLlxuXG4gICAgICAgIF9jYWxsYmFjayh0aGlzLCBcIm9uVXBkYXRlXCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXBlYXQgJiYgaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uICYmIHRoaXMudmFycy5vblJlcGVhdCAmJiAhc3VwcHJlc3NFdmVudHMgJiYgdGhpcy5wYXJlbnQgJiYgX2NhbGxiYWNrKHRoaXMsIFwib25SZXBlYXRcIik7XG5cbiAgICAgIGlmICgodFRpbWUgPT09IHRoaXMuX3REdXIgfHwgIXRUaW1lKSAmJiB0aGlzLl90VGltZSA9PT0gdFRpbWUpIHtcbiAgICAgICAgaXNOZWdhdGl2ZSAmJiAhdGhpcy5fb25VcGRhdGUgJiYgX3Jld2luZFN0YXJ0QXQodGhpcywgdG90YWxUaW1lLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgKHRvdGFsVGltZSB8fCAhZHVyKSAmJiAodFRpbWUgPT09IHRoaXMuX3REdXIgJiYgdGhpcy5fdHMgPiAwIHx8ICF0VGltZSAmJiB0aGlzLl90cyA8IDApICYmIF9yZW1vdmVGcm9tUGFyZW50KHRoaXMsIDEpOyAvLyBkb24ndCByZW1vdmUgaWYgd2UncmUgcmVuZGVyaW5nIGF0IGV4YWN0bHkgYSB0aW1lIG9mIDAsIGFzIHRoZXJlIGNvdWxkIGJlIGF1dG9SZXZlcnQgdmFsdWVzIHRoYXQgc2hvdWxkIGdldCBzZXQgb24gdGhlIG5leHQgdGljayAoaWYgdGhlIHBsYXloZWFkIGdvZXMgYmFja3dhcmQgYmV5b25kIHRoZSBzdGFydFRpbWUsIG5lZ2F0aXZlIHRvdGFsVGltZSkuIERvbid0IHJlbW92ZSBpZiB0aGUgdGltZWxpbmUgaXMgcmV2ZXJzZWQgYW5kIHRoZSBwbGF5aGVhZCBpc24ndCBhdCAwLCBvdGhlcndpc2UgdGwucHJvZ3Jlc3MoMSkucmV2ZXJzZSgpIHdvbid0IHdvcmsuIE9ubHkgcmVtb3ZlIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCB0aGUgZW5kIGFuZCB0aW1lU2NhbGUgaXMgcG9zaXRpdmUsIG9yIGlmIHRoZSBwbGF5aGVhZCBpcyBhdCAwIGFuZCB0aGUgdGltZVNjYWxlIGlzIG5lZ2F0aXZlLlxuXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgIShpc05lZ2F0aXZlICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8IGlzWW95bykpIHtcbiAgICAgICAgICAvLyBpZiBwcmV2VGltZSBhbmQgdFRpbWUgYXJlIHplcm8sIHdlIHNob3VsZG4ndCBmaXJlIHRoZSBvblJldmVyc2VDb21wbGV0ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdzYXAudG8oLi4uIHtwYXVzZWQ6dHJ1ZX0pLnBsYXkoKTtcbiAgICAgICAgICBfY2FsbGJhY2sodGhpcywgdFRpbWUgPT09IHREdXIgPyBcIm9uQ29tcGxldGVcIiA6IFwib25SZXZlcnNlQ29tcGxldGVcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICB0aGlzLl9wcm9tICYmICEodFRpbWUgPCB0RHVyICYmIHRoaXMudGltZVNjYWxlKCkgPiAwKSAmJi
12666B0aGlzLl9wcm9tKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8zLnRhcmdldHMgPSBmdW5jdGlvbiB0YXJnZXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRzO1xuICB9O1xuXG4gIF9wcm90bzMuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUoc29mdCkge1xuICAgIC8vIFwic29mdFwiIGdpdmVzIHVzIGEgd2F5IHRvIGNsZWFyIG91dCBldmVyeXRoaW5nIEVYQ0VQVCB0aGUgcmVjb3JkZWQgcHJlLVwiZnJvbVwiIHBvcnRpb24gb2YgZnJvbSgpIHR3ZWVucy4gT3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSwgaWYgeW91IHR3ZWVuLnByb2dyZXNzKDEpLnJlbmRlcigwLCB0cnVlIHRydWUpLmludmFsaWRhdGUoKSwgdGhlIFwiZnJvbVwiIHZhbHVlcyB3b3VsZCBwZXJzaXN0IGFuZCB0aGVuIG9uIHRoZSBuZXh0IHJlbmRlciwgdGhlIGZyb20oKSB0d2VlbnMgd291bGQgaW5pdGlhbGl6ZSBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgd291bGQgbWF0Y2ggdGhlIFwiZnJvbVwiIHZhbHVlcywgdGh1cyBhbmltYXRlIGZyb20gdGhlIHNhbWUgdmFsdWUgdG8gdGhlIHNhbWUgdmFsdWUgKG5vIGFuaW1hdGlvbikuIFdlIHRhcCBpbnRvIHRoaXMgaW4gU2Nyb2xsVHJpZ2dlcidzIHJlZnJlc2goKSB3aGVyZSB3ZSBtdXN0IHB1c2ggYSB0d2VlbiB0byBjb21wbGV0aW9uIGFuZCB0aGVuIGJhY2sgYWdhaW4gYnV0IGhvbm9yIGl0cyBpbml0IHN0YXRlIGluIGNhc2UgdGhlIHR3ZWVuIGlzIGRlcGVuZGVudCBvbiBhbm90aGVyIHR3ZWVuIGZ1cnRoZXIgdXAgb24gdGhlIHBhZ2UuXG4gICAgKCFzb2Z0IHx8ICF0aGlzLnZhcnMucnVuQmFja3dhcmRzKSAmJiAodGhpcy5fc3RhcnRBdCA9IDApO1xuICAgIHRoaXMuX3B0ID0gdGhpcy5fb3AgPSB0aGlzLl9vblVwZGF0ZSA9IHRoaXMuX2xhenkgPSB0aGlzLnJhdGlvID0gMDtcbiAgICB0aGlzLl9wdExvb2t1cCA9IFtdO1xuICAgIHRoaXMudGltZWxpbmUgJiYgdGhpcy50aW1lbGluZS5pbnZhbGlkYXRlKHNvZnQpO1xuICAgIHJldHVybiBfQW5pbWF0aW9uMi5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMsIHNvZnQpO1xuICB9O1xuXG4gIF9wcm90bzMucmVzZXRUbyA9IGZ1bmN0aW9uIHJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCBza2lwUmVjdXJzaW9uKSB7XG4gICAgX3RpY2tlckFjdGl2ZSB8fCBfdGlja2VyLndha2UoKTtcbiAgICB0aGlzLl90cyB8fCB0aGlzLnBsYXkoKTtcbiAgICB2YXIgdGltZSA9IE1hdGgubWluKHRoaXMuX2R1ciwgKHRoaXMuX2RwLl90aW1lIC0gdGhpcy5fc3RhcnQpICogdGhpcy5fdHMpLFxuICAgICAgICByYXRpbztcbiAgICB0aGlzLl9pbml0dGVkIHx8IF9pbml0VHdlZW4odGhpcywgdGltZSk7XG4gICAgcmF0aW8gPSB0aGlzLl9lYXNlKHRpbWUgLyB0aGlzLl9kdXIpOyAvLyBkb24ndCBqdXN0IGdldCB0d2Vlbi5yYXRpbyBiZWNhdXNlIGl0IG1heSBub3QgaGF2ZSByZW5kZXJlZCB5ZXQuXG4gICAgLy8gcG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIHRvIGFsbG93IGFuIG9iamVjdCB3aXRoIG11bHRpcGxlIHZhbHVlcyB0byB1cGRhdGUsIGxpa2UgdHdlZW4ucmVzZXRUbyh7eDogMTAwLCB5OiAyMDB9KTsgQXQgdGhpcyBwb2ludCwgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZSBhZGRlZCBrYiBnaXZlbiB0aGUgZmFjdCB0aGF0IG1vc3QgdXNlcnMgd2lsbCBsaWtlbHkgb3B0IGZvciB0aGUgY29udmVuaWVudCBnc2FwLnF1aWNrVG8oKSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICAvLyBpZiAoX2lzT2JqZWN0KHByb3BlcnR5KSkgeyAvLyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAvLyBcdGZvciAocCBpbiBwcm9wZXJ0eSkge1xuICAgIC8vIFx0XHRpZiAoX3VwZGF0ZVByb3BUd2VlbnModGhpcywgcCwgcHJvcGVydHlbcF0sIHZhbHVlID8gdmFsdWVbcF0gOiBudWxsLCBzdGFydCwgcmF0aW8sIHRpbWUpKSB7XG4gICAgLy8gXHRcdFx0cmV0dXJuIHRoaXMucmVzZXRUbyhwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0LCBzdGFydElzUmVsYXRpdmUpOyAvLyBpZiBhIFByb3BUd2VlbiB3YXNuJ3QgZm91bmQgZm9yIHRoZSBwcm9wZXJ0eSwgaXQnbGwgZ2V0IGZvcmNlZCB3aXRoIGEgcmUtaW5pdGlhbGl6YXRpb24gc28gd2UgbmVlZCB0byBqdW1wIG91dCBhbmQgc3RhcnQgb3ZlciBhZ2Fpbi5cbiAgICAvLyBcdFx0fVxuICAgIC8vIFx0fVxuICAgIC8vIH0gZWxzZSB7XG5cbiAgICBpZiAoX3VwZGF0ZVByb3BUd2VlbnModGhpcywgcHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCByYXRpbywgdGltZSwgc2tpcFJlY3Vyc2lvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCAxKTsgLy8gaWYgYSBQcm9wVHdlZW4gd2Fzbid0IGZvdW5kIGZvciB0aGUgcHJvcGVydHksIGl0J2xsIGdldCBmb3JjZWQgd2l0aCBhIHJlLWluaXRpYWxpemF0aW9uIHNvIHdlIG5lZWQgdG8ganVtcCBvdXQgYW5kIHN0YXJ0IG92ZXIgYWdhaW4uXG4gICAgfSAvL31cblxuXG4gICAgX2FsaWduUGxheWhlYWQodGhpcywgMCk7XG5cbiAgICB0aGlzLnBhcmVudCB8fCBfYWRkTGlua2VkTGlzdEl0ZW0odGhpcy5fZHAsIHRoaXMsIFwiX2ZpcnN0XCIsIFwiX2xhc3RcIiwgdGhpcy5fZHAuX3NvcnQgPyBcIl9zdGFydFwiIDogMCk7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyKDApO1xuICB9O1xuXG4gIF9wcm90bzMua2lsbCA9IGZ1bmN0aW9uIGtpbGwodGFyZ2V0cywgdmFycykge1xuICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcbiAgICAgIHZhcnMgPSBcImFsbFwiO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0cyAmJiAoIXZhcnMgfHwgdmFycyA9PT0gXCJhbGxcIikpIHtcbiAgICAgIHRoaXMuX2xhenkgPSB0aGlzLl9wdCA9IDA7XG4gICAgICB0aGlzLnBhcmVudCA/IF9pbnRlcnJ1cHQodGhpcykgOiB0aGlzLnNjcm9sbFRyaWdnZXIgJiYgdGhpcy5zY3JvbGxUcmlnZ2VyLmtpbGwoISFfcmV2ZXJ0aW5nKTtcbiAgICAgIHJldHVybi
12666B0aGlzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRpbWVsaW5lKSB7XG4gICAgICB2YXIgdER1ciA9IHRoaXMudGltZWxpbmUudG90YWxEdXJhdGlvbigpO1xuICAgICAgdGhpcy50aW1lbGluZS5raWxsVHdlZW5zT2YodGFyZ2V0cywgdmFycywgX292ZXJ3cml0aW5nVHdlZW4gJiYgX292ZXJ3cml0aW5nVHdlZW4udmFycy5vdmVyd3JpdGUgIT09IHRydWUpLl9maXJzdCB8fCBfaW50ZXJydXB0KHRoaXMpOyAvLyBpZiBub3RoaW5nIGlzIGxlZnQgdHdlZW5pbmcsIGludGVycnVwdC5cblxuICAgICAgdGhpcy5wYXJlbnQgJiYgdER1ciAhPT0gdGhpcy50aW1lbGluZS50b3RhbER1cmF0aW9uKCkgJiYgX3NldER1cmF0aW9uKHRoaXMsIHRoaXMuX2R1ciAqIHRoaXMudGltZWxpbmUuX3REdXIgLyB0RHVyLCAwLCAxKTsgLy8gaWYgYSBuZXN0ZWQgdHdlZW4gaXMga2lsbGVkIHRoYXQgY2hhbmdlcyB0aGUgZHVyYXRpb24sIGl0IHNob3VsZCBhZmZlY3QgdGhpcyB0d2VlbidzIGR1cmF0aW9uLiBXZSBtdXN0IHVzZSB0aGUgcmF0aW8sIHRob3VnaCwgYmVjYXVzZSBzb21ldGltZXMgdGhlIGludGVybmFsIHRpbWVsaW5lIGlzIHN0cmV0Y2hlZCBsaWtlIGZvciBrZXlmcmFtZXMgd2hlcmUgdGhleSBkb24ndCBhbGwgYWRkIHVwIHRvIHdoYXRldmVyIHRoZSBwYXJlbnQgdHdlZW4ncyBkdXJhdGlvbiB3YXMgc2V0IHRvLlxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcGFyc2VkVGFyZ2V0cyA9IHRoaXMuX3RhcmdldHMsXG4gICAgICAgIGtpbGxpbmdUYXJnZXRzID0gdGFyZ2V0cyA/IHRvQXJyYXkodGFyZ2V0cykgOiBwYXJzZWRUYXJnZXRzLFxuICAgICAgICBwcm9wVHdlZW5Mb29rdXAgPSB0aGlzLl9wdExvb2t1cCxcbiAgICAgICAgZmlyc3RQVCA9IHRoaXMuX3B0LFxuICAgICAgICBvdmVyd3JpdHRlblByb3BzLFxuICAgICAgICBjdXJMb29rdXAsXG4gICAgICAgIGN1ck92ZXJ3cml0ZVByb3BzLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgcCxcbiAgICAgICAgcHQsXG4gICAgICAgIGk7XG5cbiAgICBpZiAoKCF2YXJzIHx8IHZhcnMgPT09IFwiYWxsXCIpICYmIF9hcnJheXNNYXRjaChwYXJzZWRUYXJnZXRzLCBraWxsaW5nVGFyZ2V0cykpIHtcbiAgICAgIHZhcnMgPT09IFwiYWxsXCIgJiYgKHRoaXMuX3B0ID0gMCk7XG4gICAgICByZXR1cm4gX2ludGVycnVwdCh0aGlzKTtcbiAgICB9XG5cbiAgICBvdmVyd3JpdHRlblByb3BzID0gdGhpcy5fb3AgPSB0aGlzLl9vcCB8fCBbXTtcblxuICAgIGlmICh2YXJzICE9PSBcImFsbFwiKSB7XG4gICAgICAvL3NvIHBlb3BsZSBjYW4gcGFzcyBpbiBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzXG4gICAgICBpZiAoX2lzU3RyaW5nKHZhcnMpKSB7XG4gICAgICAgIHAgPSB7fTtcblxuICAgICAgICBfZm9yRWFjaE5hbWUodmFycywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcFtuYW1lXSA9IDE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhcnMgPSBwO1xuICAgICAgfVxuXG4gICAgICB2Y
12666XJzID0gX2FkZEFsaWFzZXNUb1ZhcnMocGFyc2VkVGFyZ2V0cywgdmFycyk7XG4gICAgfVxuXG4gICAgaSA9IHBhcnNlZFRhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWYgKH5raWxsaW5nVGFyZ2V0cy5pbmRleE9mKHBhcnNlZFRhcmdldHNbaV0pKSB7XG4gICAgICAgIGN1ckxvb2t1cCA9IHByb3BUd2Vlbkxvb2t1cFtpXTtcblxuICAgICAgICBpZiAodmFycyA9PT0gXCJhbGxcIikge1xuICAgICAgICAgIG92ZXJ3cml0dGVuUHJvcHNbaV0gPSB2YXJzO1xuICAgICAgICAgIHByb3BzID0gY3VyTG9va3VwO1xuICAgICAgICAgIGN1ck92ZXJ3cml0ZVByb3BzID0ge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHMgPSBvdmVyd3JpdHRlblByb3BzW2ldID0gb3ZlcndyaXR0ZW5Qcm9wc1tpXSB8fCB7fTtcbiAgICAgICAgICBwcm9wcyA9IHZhcnM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHAgaW4gcHJvcHMpIHtcbiAgICAgICAgICBwdCA9IGN1ckxvb2t1cCAmJiBjdXJMb29rdXBbcF07XG5cbiAgICAgICAgICBpZiAocHQpIHtcbiAgICAgICAgICAgIGlmICghKFwia2lsbFwiIGluIHB0LmQpIHx8IHB0LmQua2lsbChwKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW0odGhpcywgcHQsIFwiX3B0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgY3VyTG9va3VwW3BdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJPdmVyd3JpdGVQcm9wcyAhPT0gXCJhbGxcIikge1xuICAgICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHNbcF0gPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXR0ZWQgJiYgIXRoaXMuX3B0ICYmIGZpcnN0UFQgJiYgX2ludGVycnVwdCh0aGlzKTsgLy9pZiBhbGwgdHdlZW5pbmcgcHJvcGVydGllcyBhcmUga2lsbGVkLCBraWxsIHRoZSB0d2Vlbi4gV2l0aG91dCB0aGlzIGxpbmUsIGlmIHRoZXJlJ3MgYSB0d2VlbiB3aXRoIG11bHRpcGxlIHRhcmdldHMgYW5kIHRoZW4geW91IGtpbGxUd2VlbnNPZigpIGVhY2ggdGFyZ2V0IGluZGl2aWR1YWxseSwgdGhlIHR3ZWVuIHdvdWxkIHRlY2huaWNhbGx5IHN0aWxsIHJlbWFpbiBhY3RpdmUgYW5kIGZpcmUgaXRzIG9uQ29tcGxldGUgZXZlbiB0aG91Z2ggdGhlcmUgYXJlbid0IGFueSBtb3JlIHByb3BlcnRpZXMgdHdlZW5pbmcuXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBUd2Vlbi50byA9IGZ1bmN0aW9uIHRvKHRhcmdldHMsIHZhcnMpIHtcbiAgICByZXR1cm4gbmV3IFR3ZWVuKHRhcmdldHMsIHZhcnMsIGFyZ3VtZW50c1syXSk7XG4gIH07XG5cbiAgVHdlZW4uZnJvbSA9IGZ1bmN0aW9uIGZyb20odGFyZ2V0cywgdmFycykge1xuICAgIHJldHVybiBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgVHdlZW4uZGVsYXllZENhbGwgPSBmdW5jdGlvbiBkZWxheWVkQ2FsbChkZWxheSwgY2FsbGJhY2ssIHBhcmFtcywgc2NvcGUpIHtcbiAgICByZXR1cm4gbmV3IFR3ZWVuKGNhbGxiYWNrLCAwLCB7XG4gICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxuICAgICAgbGF6eTogZmFsc2UsXG4gICAgICBvdmVyd3JpdGU6IGZhbHNlLFxuICAgICAgZGVsYXk6IGRlbGF5LFxuICAgICAgb25Db21wbGV0ZTogY2FsbGJhY2ssXG4gICAgICBvblJldmVyc2VDb21wbGV0ZTogY2FsbGJhY2ssXG4gICAgICBvbkNvbXBsZXRlUGFyYW1zOiBwYXJhbXMsXG4gICAgICBvblJldmVyc2VDb21wbGV0ZVBhcmFtczogcGFyYW1zLFxuICAgICAgY2FsbGJhY2tTY29wZTogc2NvcGVcbiAgICB9KTsgLy8gd2UgbXVzdCB1c2Ugb25SZXZlcnNlQ29tcGxldGUgdG9vIGZvciB0aGluZ3MgbGlrZSB0aW1lbGluZS5hZGQoKCkgPT4gey4uLn0pIHdoaWNoIHNob3VsZCBiZSB0cmlnZ2VyZWQgaW4gQk9USCBkaXJlY3Rpb25zIChmb3J3YXJkIGFuZCByZXZlcnNlKVxuICB9O1xuXG4gIFR3ZWVuLmZyb21UbyA9IGZ1bmN0aW9uIGZyb21Ubyh0YXJnZXRzLCBmcm9tVmFycywgdG9WYXJzKSB7XG4gICAgcmV0dXJuIF9jcmVhdGVUd2VlblR5cGUoMiwgYXJndW1lbnRzKTtcbiAgfTtcblxuICBUd2Vlbi5zZXQgPSBmdW5jdGlvbiBzZXQodGFyZ2V0cywgdmFycykge1xuICAgIHZhcnMuZHVyYXRpb24gPSAwO1xuICAgIHZhcnMucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XG4gICAgcmV0dXJuIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzKTtcbiAgfTtcblxuICBUd2Vlbi5raWxsVHdlZW5zT2YgPSBmdW5jdGlvbiBraWxsVHdlZW5zT2YodGFyZ2V0cywgcHJvcHMsIG9ubHlBY3RpdmUpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZih0YXJnZXRzLCBwcm9wcywgb25seUFjdGl2ZSk7XG4gIH07XG5cbiAgcmV0dXJuIFR3ZWVuO1xufShBbmltYXRpb24pO1xuXG5fc2V0RGVmYXVsdHMoVHdlZW4ucHJvdG90eXBlLCB7XG4gIF90YXJnZXRzOiBbXSxcbiAgX2xhenk6IDAsXG4gIF9zdGFydEF0OiAwLFxuICBfb3A6IDAsXG4gIF9vbkluaXQ6IDBcbn0pOyAvL2FkZCB0aGUgcGVydGluZW50IHRpbWVsaW5lIG1ldGhvZHMgdG8gVHdlZW4gaW5zdGFuY2VzIHNvIHRoYXQgdXNlcnMgY2FuIGNoYWluIGNvbnZlbmllbnRseSBhbmQgY3JlYXRlIGEgdGltZWxpbmUgYXV0b21hdGljYWxseS4gKHJlbW92ZWQgZHVlIHRvIGNvbmNlcm5zIHRoYXQgaXQnZCB1bHRpbWF0ZWx5IGFkZCB0byBtb3JlIGNvbmZ1c2lvbiBlc3BlY2lhbGx5IGZvciBiZWdpbm5lcnMpXG4vLyBfZm9yRWFjaE5hbWUoXCJ0byxmcm9tLGZyb21UbyxzZXQsY2FsbCxhZGQsYWRkTGFiZWwsYWRkUGF1c2VcIiwgbmFtZSA9PiB7XG4vLyBcdFR3ZWVuLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuLy8gXHRcdGxldCB0bCA9IG5ldyBUaW1lbGluZSgpO1xuLy8gXHRcdHJldHVybiBfYWRkVG9UaW1lbGluZSh0bCwgdGhpcylbbmFtZV0uYXBwbHkodGwsIHRvQXJyYXkoYXJndW1lbnRzKSk7XG4vLyBcdH1cbi8vIH0pO1xuLy9mb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gTGV2ZXJhZ2UgdGhlIHRpbWVsaW5lIGNhbGxzLlxuXG5cbl9mb3JFYWNoTmFtZShcInN0YWdnZXJUbyxzdGFnZ2VyRnJvbSxzdGFnZ2VyRnJvbVRvXCIsIGZ1bmN0aW9uIChuYW1lKSB7XG4gIFR3ZWVuW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bCA9IG5ldyBUaW1lbGluZSgpLFxuICAgICAgICBwYXJhbXMgPSBfc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgcGFyYW1zLnNwbGljZShuYW1lID09PSBcInN0YWdnZXJGcm9tVG9cIiA/IDUgOiA0LCAwLCAwKTtcbiAgICByZXR1cm4gdGxbbmFtZV0uYXBwbHkodGwsIHBhcmFtcyk7XG4gIH07XG59
12666KTtcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogUFJPUFRXRUVOXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxudmFyIF9zZXR0ZXJQbGFpbiA9IGZ1bmN0aW9uIF9zZXR0ZXJQbGFpbih0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xuICByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xufSxcbiAgICBfc2V0dGVyRnVuYyA9IGZ1bmN0aW9uIF9zZXR0ZXJGdW5jKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXRbcHJvcGVydHldKHZhbHVlKTtcbn0sXG4gICAgX3NldHRlckZ1bmNXaXRoUGFyYW0gPSBmdW5jdGlvbiBfc2V0dGVyRnVuY1dpdGhQYXJhbSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgZGF0YSkge1xuICByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XShkYXRhLmZwLCB2YWx1ZSk7XG59LFxuICAgIF9zZXR0ZXJBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfc2V0dGVyQXR0cmlidXRlKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHJldHVybiB0YXJnZXQuc2V0QXR0cmlidXRlKHByb3BlcnR5LCB2YWx1ZSk7XG59LFxuICAgIF9nZXRTZXR0ZXIgPSBmdW5jdGlvbiBfZ2V0U2V0dGVyKHRhcmdldCwgcHJvcGVydHkpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKHRhcmdldFtwcm9wZXJ0eV0pID8gX3NldHRlckZ1bmMgOiBfaXNVbmRlZmluZWQodGFyZ2V0W3Byb3BlcnR5XSkgJiYgdGFyZ2V0LnNldEF0dHJpYnV0ZSA/IF9zZXR0ZXJBdHRyaWJ1dGUgOiBfc2V0dGVyUGxhaW47XG59LFxuICAgIF9yZW5kZXJQbGFpbiA9IGZ1bmN0aW9uIF9yZW5kZXJQbGFpbihyYXRpbywgZGF0YSkge1xuICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIE1hdGgucm91bmQoKGRhdGEucyArIGRhdGEuYyAqIHJhdGlvKSAqIDEwMDAwMDApIC8gMTAwMDAwMCwgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJCb29sZWFuID0gZnVuY3Rpb24gX3JlbmRlckJvb2xlYW4ocmF0aW8sIGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCAhIShkYXRhLnMgKyBkYXRhLmMgKiByYXRpbyksIGRhdGEpO1xufSxcbiAgICBfcmVuZGVyQ29tcGxleFN0cmluZyA9IGZ1bmN0aW9uIF9yZW5kZXJDb21wbGV4U3RyaW5nKHJhdGlvLCBkYXRhKSB7XG4gIHZhciBwdCA9IGRhdGEuX3B0LFxuICAgICAgcyA9IFwiXCI7XG5cbiAgaWYgKCFyYXRpbyAmJiBkYXRhLmIpIHtcbiAgICAvL2IgPSBiZWdpbm5pbmcgc3RyaW5nXG4gICAgcyA9IGRhdGEuYjtcbiAgfSBlbHNlIGlmIChyYXRpbyA9PT0gMSAmJiBkYXRhLmUpIHtcbiAgICAvL2UgPSBlbmRpbmcgc3RyaW5nXG4gICAgcyA9IGRhdGEuZTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAocHQpIHtcbiAgICAgIHMgPSBwdC5wICsgKHB0Lm0gPyBwdC5tKHB0LnMgKyBwdC5jICogcmF0aW8pIDogTWF0aC5yb3VuZCgocHQucyArIHB0LmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCkgKyBzOyAvL3dlIHVzZSB0aGUgXCJwXCIgcHJvcGVydHkgZm9yIHRoZSB0ZXh0IGluYmV0d2VlbiAobGlrZSBhIHN1ZmZpeCkuIEFuZCBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBsZXggc3RyaW5nLCB0aGUgbW9kaWZpZXIgKG0pIGlzIHR5cGljYWxseSBqdXN0IE1hdGgucm91bmQoKSwgbGlrZSBmb3IgUkdCIGNvbG9ycy5cblxuICAgICAgcHQgPSBwdC5fbmV4dDtcbiAgICB9XG5cbiAgICBzICs9IGRhdGEuYzsgLy93ZSB1c2UgdGhlIFwiY1wiIG9mIHRoZSBQcm9wVHdlZW4gdG8gc3RvcmUgdGhlIGZpbmFsIGNodW5rIG9mIG5vbi1udW1lcmljIHRleHQuXG4gIH1cblxuICBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgcywgZGF0YSk7XG59LFxuICAgIF9yZW5kZXJQcm9wVHdlZW5zID0gZnVuY3Rpb24gX3JlbmRlclByb3BUd2VlbnMocmF0aW8sIGRhdGEpIHtcbiAgdmFyIHB0ID0gZGF0YS5fcHQ7XG5cbiAgd2hpbGUgKHB0KSB7XG4gICAgcHQucihyYXRpbywgcHQuZCk7XG4gICAgcHQgPSBwdC5fbmV4dDtcbiAgfVxufSxcbiAgICBfYWRkUGx1Z2luTW9kaWZpZXIgPSBmdW5jdGlvbiBfYWRkUGx1Z2luTW9kaWZpZXIobW9kaWZpZXIsIHR3ZWVuLCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gIHZhciBwdCA9IHRoaXMuX3B0LFxuICAgICAgbmV4dDtcblxuICB3aGlsZSAocHQpIHtcbiAgICBuZXh0ID0gcHQuX25leHQ7XG4gICAgcHQucCA9PT0gcHJvcGVydHkgJiYgcHQubW9kaWZpZXIobW9kaWZpZXIsIHR3ZWVuLCB0YXJnZXQpO1xuICAgIHB0ID0gbmV4dDtcbiAgfVxufSxcbiAgICBfa2lsbFByb3BUd2VlbnNPZiA9IGZ1bmN0aW9uIF9raWxsUHJvcFR3ZWVuc09mKHByb3BlcnR5KSB7XG4gIHZhciBwdCA9IHRoaXMuX3B0LFxuICAgICAgaGFzTm9uRGVwZW5kZW50UmVtYWluaW5nLFxuICAgICAgbmV4dDtcblxuICB3aGlsZSAocHQpIHtcbiAgICBuZXh0ID0gcHQuX25leHQ7XG5cbiAgICBpZiAocHQucCA9PT0gcHJvcGVydHkgJiYgIXB0Lm9wIHx8IHB0Lm9wID09PSBwcm9wZXJ0eSkge1xuICAgICAgX3JlbW92ZUxpbmtlZExpc3RJdGVtKHRoaXMsIHB0LCBcIl9wdFwiKTtcbiAgICB9IGVsc2UgaWYgKCFwdC5kZXApIHtcbiAgICAgIGhhc05vbkRlcGVuZGVudFJlbWFpbmluZyA9IDE7XG4gICAgfVxuXG4gICAgcHQgPSBuZXh0O1xuICB9XG5cbiAgcmV0dXJuICFoYXNOb25EZXBlbmRlbnRSZW1haW5pbmc7XG59LFxuICAgIF9zZXR0ZXJXaXRoTW9kaWZpZXIgPSBmdW5jdGlvbiBfc2V0dGVyV2l0aE1vZGlmaWVyKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCBkYXRhKSB7XG4gIGRhdGEubVNldCh0YXJnZXQsIHByb3BlcnR5LCBkYXRhLm0uY2FsbChkYXRhLnR3ZWVuLCB2YWx1ZSwgZGF0YS5tdCksIGRhdGEpO1xufSxcbiAgICBfc29ydFByb3BUd2VlbnNCeVByaW9yaXR5ID0gZnVuY3Rpb24gX3NvcnRQcm9wVHdlZW5zQnlQcmlvcml0eShwYXJlbnQpIHtcbiAgdmFyIHB0ID0gcGFyZW50Ll9wdCxcbiAgICAgIG5leHQsXG4gICAgICBwdDIsXG4gICAgICBmaXJzdCxcbiAgICAgIGxhc3Q7IC8vc29ydHMgdGhlIFByb3BUd2VlbiBsaW5rZWQgbGlzdCBpbiBvcmRlciBvZiBwcmlvcml0eSBiZWNhdXNlIHNvbWUgcGx1Z2lucyBuZWVkIHRvIGRvIHRoZWlyIHdvcmsgYWZ0ZXIgQUxMIG9mIHRoZSBQcm9wVHdlZW5zIHdlcmUgY3JlYXRlZCAobGlrZSBSb3VuZFByb3BzUGx1Z2luIGFuZCBNb2RpZmllcnNQbHVnaW4pXG5cbiAgd2hpbGUgKHB0KSB7XG4gICAgbmV4dCA9IHB0Ll9uZXh0O1xuICAgIHB0MiA9IGZpcnN0O1xuXG4gICAgd2hpbGUgKHB0MiAmJiBwdDIucHIgPiBwdC5wcikge1xuICAgICAgcHQyID0gcHQyLl9uZXh0O1xuICAgIH1cblxuICAgIGlmIChwdC5fcHJldiA9IHB0MiA/IHB0Mi5fcHJldiA6IGxhc3QpIHtcbiAgICAgIHB0Ll9wcmV2Ll9uZXh0ID0gcHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpcnN0ID0gcHQ7XG4gICAgfVxuXG4gICAgaWYgKHB0Ll9uZXh0ID0gcHQyKSB7XG4gICAgICBwdDIuX3ByZXYgPSBwdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IHB0O1xuICAgIH1cblxuICAgI
12666HB0ID0gbmV4dDtcbiAgfVxuXG4gIHBhcmVudC5fcHQgPSBmaXJzdDtcbn07IC8vUHJvcFR3ZWVuIGtleTogdCA9IHRhcmdldCwgcCA9IHByb3AsIHIgPSByZW5kZXJlciwgZCA9IGRhdGEsIHMgPSBzdGFydCwgYyA9IGNoYW5nZSwgb3AgPSBvdmVyd3JpdGVQcm9wZXJ0eSAoT05MWSBwb3B1bGF0ZWQgd2hlbiBpdCdzIGRpZmZlcmVudCB0aGFuIHApLCBwciA9IHByaW9yaXR5LCBfbmV4dC9fcHJldiBmb3IgdGhlIGxpbmtlZCBsaXN0IHNpYmxpbmdzLCBzZXQgPSBzZXR0ZXIsIG0gPSBtb2RpZmllciwgbVNldCA9IG1vZGlmaWVyU2V0dGVyICh0aGUgb3JpZ2luYWwgc2V0dGVyLCBiZWZvcmUgYSBtb2RpZmllciB3YXMgYWRkZWQpXG5cblxuZXhwb3J0IHZhciBQcm9wVHdlZW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQcm9wVHdlZW4obmV4dCwgdGFyZ2V0LCBwcm9wLCBzdGFydCwgY2hhbmdlLCByZW5kZXJlciwgZGF0YSwgc2V0dGVyLCBwcmlvcml0eSkge1xuICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICB0aGlzLnMgPSBzdGFydDtcbiAgICB0aGlzLmMgPSBjaGFuZ2U7XG4gICAgdGhpcy5wID0gcHJvcDtcbiAgICB0aGlzLnIgPSByZW5kZXJlciB8fCBfcmVuZGVyUGxhaW47XG4gICAgdGhpcy5kID0gZGF0YSB8fCB0aGlzO1xuICAgIHRoaXMuc2V0ID0gc2V0dGVyIHx8IF9zZXR0ZXJQbGFpbjtcbiAgICB0aGlzLnByID0gcHJpb3JpdHkgfHwgMDtcbiAgICB0aGlzLl9uZXh0ID0gbmV4dDtcblxuICAgIGlmIChuZXh0KSB7XG4gICAgICBuZXh0Ll9wcmV2ID0gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvNCA9IFByb3BUd2Vlbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNC5tb2RpZmllciA9IGZ1bmN0aW9uIG1vZGlmaWVyKGZ1bmMsIHR3ZWVuLCB0YXJnZXQpIHtcbiAgICB0aGlzLm1TZXQgPSB0aGlzLm1TZXQgfHwgdGhpcy5zZXQ7IC8vaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBzZXQgKGEgUHJvcFR3ZWVuIGNhbiBvbmx5IGhhdmUgb25lIG1vZGlmaWVyKVxuXG4gICAgdGhpcy5zZXQgPSBfc2V0dGVyV2l0aE1vZGlmaWVyO1xuICAgIHRoaXMubSA9IGZ1bmM7XG4gICAgdGhpcy5tdCA9IHRhcmdldDsgLy9tb2RpZmllciB0YXJnZXRcblxuICAgI
12666HRoaXMudHdlZW4gPSB0d2VlbjtcbiAgfTtcblxuICByZXR1cm4gUHJvcFR3ZWVuO1xufSgpOyAvL0luaXRpYWxpemF0aW9uIHRhc2tzXG5cbl9mb3JFYWNoTmFtZShfY2FsbGJhY2tOYW1lcyArIFwicGFyZW50LGR1cmF0aW9uLGVhc2UsZGVsYXksb3ZlcndyaXRlLHJ1bkJhY2t3YXJkcyxzdGFydEF0LHlveW8saW1tZWRpYXRlUmVuZGVyLHJlcGVhdCxyZXBlYXREZWxheSxkYXRhLHBhdXNlZCxyZXZlcnNlZCxsYXp5LGNhbGxiYWNrU2NvcGUsc3RyaW5nRmlsdGVyLGlkLHlveW9FYXNlLHN0YWdnZXIsaW5oZXJpdCxyZXBlYXRSZWZyZXNoLGtleWZyYW1lcyxhdXRvUmV2ZXJ0LHNjcm9sbFRyaWdnZXIsZWFzZVJldmVyc2VcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9yZXNlcnZlZFByb3BzW25hbWVdID0gMTtcbn0pO1xuXG5fZ2xvYmFscy5Ud2Vlbk1heCA9IF9nbG9iYWxzLlR3ZWVuTGl0ZSA9IFR3ZWVuO1xuX2dsb2JhbHMuVGltZWxpbmVMaXRlID0gX2dsb2JhbHMuVGltZWxpbmVNYXggPSBUaW1lbGluZTtcbl9nbG9iYWxUaW1lbGluZSA9IG5ldyBUaW1lbGluZSh7XG4gIHNvcnRDaGlsZHJlbjogZmFsc2UsXG4gIGRlZmF1bHRzOiBfZGVmYXVsdHMsXG4gIGF1dG9SZW1vdmVDaGlsZHJlbjogdHJ1ZSxcbiAgaWQ6IFwicm9vdFwiLFxuICBzbW9vdGhDaGlsZFRpbWluZzogdHJ1ZVxufSk7XG5fY29uZmlnLnN0cmluZ0ZpbHRlciA9IF9jb2xvclN0cmluZ0ZpbHRlcjtcblxudmFyIF9tZWRpYSA9IFtdLFxuICAgIF9saXN0ZW5lcnMgPSB7fSxcbiAgICBfZW1wdHlBcnJheSA9IFtdLFxuICAgIF9sYXN0TWVkaWFUaW1lID0gMCxcbiAgICBfY29udGV4dElEID0gMCxcbiAgICBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBfZGlzcGF0Y2godHlwZSkge1xuICByZXR1cm4gKF9saXN0ZW5lcnNbdHlwZV0gfHwgX2VtcHR5QXJyYXkpLm1hcChmdW5jdGlvbiAoZikge1xuICAgIHJldHVybiBmKCk7XG4gIH0pO1xufSxcbiAgICBfb25NZWRpYUNoYW5nZSA9IGZ1bmN0aW9uIF9vbk1lZGlhQ2hhbmdlKCkge1xuICB2YXIgdGltZSA9IERhdGUubm93KCksXG4gICAgICBtYXRjaGVzID0gW107XG5cbiAgaWYgKHRpbWUgLSBfbGFzdE1lZGlhVGltZSA+IDIpIHtcbiAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhSW5pdFwiKTtcblxuICAgIF9tZWRpYS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICB2Y
12666XIgcXVlcmllcyA9IGMucXVlcmllcyxcbiAgICAgICAgICBjb25kaXRpb25zID0gYy5jb25kaXRpb25zLFxuICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgIHAsXG4gICAgICAgICAgYW55TWF0Y2gsXG4gICAgICAgICAgdG9nZ2xlZDtcblxuICAgICAgZm9yIChwIGluIHF1ZXJpZXMpIHtcbiAgICAgICAgbWF0Y2ggPSBfd2luLm1hdGNoTWVkaWEocXVlcmllc1twXSkubWF0Y2hlczsgLy8gRmlyZWZveCBkb2Vzbid0IHVwZGF0ZSB0aGUgXCJtYXRjaGVzXCIgcHJvcGVydHkgb2YgdGhlIE1lZGlhUXVlcnlMaXN0IG9iamVjdCBjb3JyZWN0bHkgLSBpdCBvbmx5IGRvZXMgc28gYXMgaXQgY2FsbHMgaXRzIGNoYW5nZSBoYW5kbGVyIC0gc28gd2UgbXVzdCByZS1jcmVhdGUgYSBtZWRpYSBxdWVyeSBoZXJlIHRvIGVuc3VyZSBpdCdzIGFjY3VyYXRlLlxuXG4gICAgICAgIG1hdGNoICYmIChhbnlNYXRjaCA9IDEpO1xuXG4gICAgICAgIGlmIChtYXRjaCAhPT0gY29uZGl0aW9uc1twXSkge1xuICAgICAgICAgIGNvbmRpdGlvbnNbcF0gPSBtYXRjaDtcbiAgICAgICAgICB0b2dnbGVkID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodG9nZ2xlZCkge1xuICAgICAgICBjLnJldmVydCgpO1xuICAgICAgICBhbnlNYXRjaCAmJiBtYXRjaGVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhUmV2ZXJ0XCIpO1xuXG4gICAgbWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYy5vbk1hdGNoKGMsIGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIHJldHVybiBjLmFkZChudWxsLCBmdW5jKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF9sYXN0TWVkaWFUaW1lID0gdGltZTtcblxuICAgIF9kaXNwYXRjaChcIm1hdGNoTWVkaWFcIik7XG4gIH1cbn07XG5cbnZhciBDb250ZXh0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29udGV4dChmdW5jLCBzY29wZSkge1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzY29wZSAmJiBzZWxlY3RvcihzY29wZSk7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5fciA9IFtdOyAvLyByZXR1cm5lZC9jbGVhbnVwIGZ1bmN0aW9uc1xuXG4gICAgdGhpcy5pc1JldmVydGVkID0gZmFsc2U7XG4gICAgdGhpcy5pZCA9IF9jb250ZXh0SUQrKzsgLy8gdG8gd29yayBhcm91bmQgaXNzdWVzIHRoYXQgZnJhbWV3b3JrcyBsaWtlIFZ1ZSBjYXVzZSBieSBtYWtpbmcgdGhpbmdzIGludG8gUHJveGllcyB3aGljaCBtYWtlIGl0IGltcG9zc2libGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgX21lZGlhLmluZGV4T2YodGhpcykgYmVjYXVzZSBcInRoaXNcIiB3b3VsZCBubyBsb25nZXIgcmVmZXIgdG8gdGhlIENvbnRleHQgaW5zdGFuY2UgaXRzZWxmIC0gaXQnZCByZWZlciB0byBhIFByb3h5ISBXZSBuZWVkZWQgYSB3YXkgdG8gaWRlbnRpZnkgdGhlIGNvbnRleHQgdW5pcXVlbHlcblxuICAgIGZ1bmMgJiYgdGhpcy5hZGQoZnVuYyk7XG4gIH1cblxuICB2YXIgX3Byb3RvNSA9IENvbnRleHQucHJvdG90eXBlO1xuXG4gIF9wcm90bzUuYWRkID0gZnVuY3Rpb24gYWRkKG5hbWUsIGZ1bmMsIHNjb3BlKSB7XG4gICAgLy8gcG9zc2libGUgZnV0dXJlIGFkZGl0aW9uIGlmIHdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gYWRkKCkgYW4gYW5pbWF0aW9uIHRvIGEgY29udGV4dCBhbmQgZm9yIHdoYXRldmVyIHJlYXNvbiBjYW5ub3QgY3JlYXRlIHRoYXQgYW5pbWF0aW9uIGluc2lkZSBvZiBhIGNvbnRleHQuYWRkKCgpID0+IHsuLi59KSBmdW5jdGlvbi5cbiAgICAvLyBpZiAobmFtZSAmJiBfaXNGdW5jdGlvbihuYW1lLnJldmVydCkpIHtcbiAgICAvLyBcdHRoaXMuZGF0YS5wdXNoKG5hbWUpO1xuICAgIC8vIFx0cmV0dXJuIChuYW1lLl9jdHggPSB0aGlzKTtcbiAgICAvLyB9XG4gICAgaWYgKF9pc0Z1bmN0aW9uKG5hbWUpKSB7XG4gICAgICBzY29wZSA9IGZ1bmM7XG4gICAgICBmdW5jID0gbmFtZTtcbiAgICAgIG5hbWUgPSBfaXNGdW5jdGlvbjtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGYgPSBmdW5jdGlvbiBmKCkge1xuICAgICAgdmFyIHByZXYgPSBfY29udGV4dCxcbiAgICAgICAgICBwcmV2U2VsZWN0b3IgPSBzZWxmLnNlbGVjdG9yLFxuICAgICAgICAgIHJlc3VsdDtcbiAgICAgIHByZXYgJiYgcHJldiAhPT0gc2VsZiAmJiBwcmV2LmRhdGEucHVzaChzZWxmKTtcbiAgICAgIHNjb3BlICYmIChzZWxmLnNlbGVjdG9yID0gc2VsZWN0b3Ioc2NvcGUpKTtcbiAgICAgIF9jb250ZXh0ID0gc2VsZjtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgIF9pc0Z1bmN0aW9uKHJlc3VsdCkgJiYgc2VsZi5fci5wdXNoKHJlc3VsdCk7XG4gICAgICBfY29udGV4dCA9IHByZXY7XG4gICAgICBzZWxmLnNlbGVjdG9yID0gcHJldlNlbGVjdG9yO1xuICAgICAgc2VsZi5pc1JldmVydGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBzZWxmLmxhc3QgPSBmO1xuICAgIHJldHVybiBuYW1lID09PSBfaXNGdW5jdGlvbiA/IGYoc2VsZiwgZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZWxmLmFkZChudWxsLCBmdW5jKTtcbiAgICB9KSA6IG5hbWUgPyBzZWxmW25hbWVdID0gZiA6IGY7XG4gIH07XG5cbiAgX3Byb3RvNS5pZ25vcmUgPSBmdW5jdGlvbiBpZ25vcmUoZnVuYykge1xuICAgIHZhciBwcmV2ID0gX2NvbnRleHQ7XG4gICAgX2NvbnRleHQgPSBudWxsO1xuICAgIGZ1bmModGhpcyk7XG4gICAgX2NvbnRleHQgPSBwcmV2O1xuICB9O1xuXG4gIF9wcm90bzUuZ2V0VHdlZW5zID0gZnVuY3Rpb24gZ2V0VHdlZW5zKCkge1xuICAgIHZhciBhID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQ29udGV4dCA/IGEucHVzaC5hcHBseShhLCBlLmdldFR3ZWVucygpKSA6IGUgaW5zdGFuY2VvZiBUd2VlbiAmJiAhKGUucGFyZW50ICYmIGUucGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIpICYmIGEucHVzaChlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYTtcbiAgfTtcblxuICBfcHJvdG81LmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5fci5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoID0gMDtcbiAgfTtcblxuICBfcHJvdG81LmtpbGwgPSBmdW5jdGlvbiBraWxsKHJldmVydCwgbWF0Y2hNZWRpYSkge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgaWYgKHJldmVydCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR3ZWVucyA9IF90aGlzNC5nZXRUd2VlbnMoKSxcbiAgICAgICAgICAgIGkgPSBfdGhpczQuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICB0O1xuXG4gICAgICAgI
12666HdoaWxlIChpLS0pIHtcbiAgICAgICAgICAvLyBGbGlwIHBsdWdpbiB0d2VlbnMgYXJlIHZlcnkgZGlmZmVyZW50IGluIHRoYXQgdGhleSBzaG91bGQgYWN0dWFsbHkgYmUgcHVzaGVkIHRvIHRoZWlyIGVuZC4gVGhlIHBsdWdpbiByZXBsYWNlcyB0aGUgdGltZWxpbmUncyAucmV2ZXJ0KCkgbWV0aG9kIHRvIGRvIGV4YWN0bHkgdGhhdC4gQnV0IHdlIGFsc28gbmVlZCB0byByZW1vdmUgYW55IG9mIHRob3NlIG5lc3RlZCB0d2VlbnMgaW5zaWRlIHRoZSBmbGlwIHRpbWVsaW5lIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5kaXZpZHVhbGx5IHJldmVydGVkLlxuICAgICAgICAgIHQgPSBfdGhpczQuZGF0YVtpXTtcblxuICAgICAgICAgIGlmICh0LmRhdGEgPT09IFwiaXNGbGlwXCIpIHtcbiAgICAgICAgICAgIHQucmV2ZXJ0KCk7XG4gICAgICAgICAgICB0LmdldENoaWxkcmVuKHRydWUsIHRydWUsIGZhbHNlKS5mb3JFYWNoKGZ1bmN0aW9uICh0d2Vlbikge1xuICAgICAgICAgICAgICByZXR1cm4gdHdlZW5zLnNwbGljZSh0d2VlbnMuaW5kZXhPZih0d2VlbiksIDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIHNhdmUgYXMgYW4gb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGNhY2hlIHRoZSBnbG9iYWxUaW1lIGZvciBlYWNoIHR3ZWVuIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIGR1cmluZyB0aGUgc29ydFxuXG5cbiAgICAgICAgdHdlZW5zLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnOiB0Ll9kdXIgfHwgdC5fZGVsYXkgfHwgdC5fc2F0ICYmICF0Ll9zYXQudmFycy5pbW1lZGlhdGVSZW5kZXIgPyB0Lmdsb2JhbFRpbWUoMCkgOiAtSW5maW5pdHksXG4gICAgICAgICAgICB0OiB0XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBiLmcgLSBhLmcgfHwgLUluZmluaXR5O1xuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8udC5yZXZlcnQocmV2ZXJ0KTtcbiAgICAgICAgfSk7IC8vIG5vdGU6IGFsbCBvZiB0aGUgX3N0YXJ0QXQgdHdlZW5zIHNob3VsZCBiZSByZXZlcnRlZCBpbiByZXZlcnNlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGNyZWF0ZWQsIGFuZCB0aGV5J2xsIGFsbCBoYXZlIHRoZSBzYW1lIGdsb2JhbFRpbWUgKC0xKSBzbyB0aGUgXCIgfHwgLTFcIiBpbiB0aGUgc29ydCBrZWVwcyB0aGUgb3JkZXIgcHJvcGVybHkuXG5cbiAgICAgICAgaSA9IF90aGlzNC5kYXRhLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGxvb3AgYmFja3dhcmRzIHNvIHRoYXQsIGZvciBleGFtcGxlLCBTcGxpdFRleHRzIHRoYXQgd2VyZSBjcmVhdGVkIGxhdGVyIG9uIHRoZSBzYW1lIGVsZW1lbnQgZ2V0IHJldmVydGVkIGZpcnN0XG4gICAgICAgICAgdCA9IF90aGlzNC5kYXRhW2ldO1xuXG4gICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBUaW1lbGluZSkge1xuICAgICAgICAgICAgaWYgKHQuZGF0YSAhPT0gXCJuZXN0ZWRcIikge1xuICAgICAgICAgICAgICB0LnNjcm9sbFRyaWdnZXIgJiYgdC5zY3JvbGxUcmlnZ2VyLnJldmVydCgpO1xuICAgICAgICAgICAgICB0LmtpbGwoKTsgLy8gZG9uJ3QgcmV2ZXJ0KCkgdGhlIHRpbWVsaW5lIGJlY2F1c2UgdGhhdCdzIGR1cGxpY2F0aW5nIGVmZm9ydHMgc2luY2Ugd2UgYWxyZWFkeSByZXZlcnRlZCBhbGwgdGhlIHR3ZWVuc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAhKHQgaW5zdGFuY2VvZiBUd2VlbikgJiYgdC5yZXZlcnQgJiYgdC5yZXZlcnQocmV2ZXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuX3IuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICAgIHJldHVybiBmKHJldmVydCwgX3RoaXM0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXM0LmlzUmV2ZXJ0ZWQgPSB0cnVlO1xuICAgICAgfSkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUua2lsbCAmJiBlLmtpbGwoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcblxuICAgIGlmIChtYXRjaE1lZGlhKSB7XG4gICAgICB2Y
12666XIgaSA9IF9tZWRpYS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgLy8gcHJldmlvdXNseSwgd2UgY2hlY2tlZCBfbWVkaWEuaW5kZXhPZih0aGlzKSwgYnV0IHNvbWUgZnJhbWV3b3JrcyBsaWtlIFZ1ZSBlbmZvcmNlIFByb3h5IG9iamVjdHMgdGhhdCBtYWtlIGl0IGltcG9zc2libGUgdG8gZ2V0IHRoZSBwcm9wZXIgcmVzdWx0IHRoYXQgd2F5LCBzbyB3ZSBtdXN0IHVzZSBhIHVuaXF1ZSBJRCBudW1iZXIgaW5zdGVhZC5cbiAgICAgICAgX21lZGlhW2ldLmlkID09PSB0aGlzLmlkICYmIF9tZWRpYS5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIGtpbGxXaXRoQ2xlYW51cCgpIHtcbiAgLy8gXHR0aGlzLmtpbGwoKTtcbiAgLy8gXHR0aGlzLl9yLmZvckVhY2goZiA9PiBmKGZhbHNlLCB0aGlzKSk7XG4gIC8vIH1cbiAgO1xuXG4gIF9wcm90bzUucmV2ZXJ0ID0gZnVuY3Rpb24gcmV2ZXJ0KGNvbmZpZykge1xuICAgIHRoaXMua2lsbChjb25maWcgfHwge30pO1xuICB9O1xuXG4gIHJldHVybiBDb250ZXh0O1xufSgpO1xuXG52YXIgTWF0Y2hNZWRpYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hdGNoTWVkaWEoc2NvcGUpIHtcbiAgICB0aGlzLmNvbnRleHRzID0gW107XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIF9jb250ZXh0ICYmIF9jb250ZXh0LmRhdGEucHVzaCh0aGlzKTtcbiAgfVxuXG4gIHZhciBfcHJvdG82ID0gTWF0Y2hNZWRpYS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNi5hZGQgPSBmdW5jdGlvbiBhZGQoY29uZGl0aW9ucywgZnVuYywgc2NvcGUpIHtcbiAgICBfaXNPYmplY3QoY29uZGl0aW9ucykgfHwgKGNvbmRpdGlvbnMgPSB7XG4gICAgICBtYXRjaGVzOiBjb25kaXRpb25zXG4gICAgfSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCgwLCBzY29wZSB8fCB0aGlzLnNjb3BlKSxcbiAgICAgICAgY29uZCA9IGNvbnRleHQuY29uZGl0aW9ucyA9IHt9LFxuICAgICAgICBtcSxcbiAgICAgICAgcCxcbiAgICAgICAgYWN0aXZlO1xuICAgIF9jb250ZXh0ICYmICFjb250ZXh0LnNlbGVjdG9yICYmIChjb250ZXh0LnNlbGVjdG9yID0gX2NvbnRleHQuc2VsZWN0b3IpOyAvLyBpbiBjYXNlIGEgY29udGV4dCBpcyBjcmVhdGVkIGluc2lkZSBhIGNvbnRleHQuIExpa2UgYSBnc2FwLm1hdGNoTWVkaWEoKSB0aGF0J3MgaW5zaWRlIGEgc2NvcGVkIGdzYXAuY29udGV4dCgpXG5cbiAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgZnVuYyA9IGNvbnRleHQuYWRkKFwib25NYXRjaFwiLCBmdW5jKTtcbiAgICBjb250ZXh0LnF1
12666ZXJpZXMgPSBjb25kaXRpb25zO1xuXG4gICAgZm9yIChwIGluIGNvbmRpdGlvbnMpIHtcbiAgICAgIGlmIChwID09PSBcImFsbFwiKSB7XG4gICAgICAgIGFjdGl2ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtcSA9IF93aW4ubWF0Y2hNZWRpYShjb25kaXRpb25zW3BdKTtcblxuICAgICAgICBpZiAobXEpIHtcbiAgICAgICAgICBfbWVkaWEuaW5kZXhPZihjb250ZXh0KSA8IDAgJiYgX21lZGlhLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgKGNvbmRbcF0gPSBtcS5tYXRjaGVzKSAmJiAoYWN0aXZlID0gMSk7XG4gICAgICAgICAgbXEuYWRkTGlzdGVuZXIgPyBtcS5hZGRMaXN0ZW5lcihfb25NZWRpYUNoYW5nZSkgOiBtcS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIF9vbk1lZGlhQ2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFjdGl2ZSAmJiBmdW5jKGNvbnRleHQsIGZ1bmN0aW9uIChmKSB7XG4gICAgICByZXR1cm4gY29udGV4dC5hZGQobnVsbCwgZik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gcmVmcmVzaCgpIHtcbiAgLy8gXHRsZXQgdGltZSA9IF9sYXN0TWVkaWFUaW1lLFxuICAvLyBcdFx0bWVkaWEgPSBfbWVkaWE7XG4gIC8vIFx0X2xhc3RNZWRpYVRpbWUgPSAtMTtcbiAgLy8gXHRfbWVkaWEgPSB0aGlzLmNvbnRleHRzO1xuICAvLyBcdF9vbk1lZGlhQ2hhbmdlKCk7XG4gIC8vIFx0X2xhc3RNZWRpYVRpbWUgPSB0aW1lO1xuICAvLyBcdF9tZWRpYSA9IG1lZGlhO1xuICAvLyB9XG4gIDtcblxuICBfcHJvdG82LnJldmVydCA9IGZ1bmN0aW9uIHJldmVydChjb25maWcpIHtcbiAgICB0aGlzLmtpbGwoY29uZmlnIHx8IHt9KTtcbiAgfTtcblxuICBfcHJvdG82LmtpbGwgPSBmdW5jdGlvbiBraWxsKHJldmVydCkge1xuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMua2lsbChyZXZlcnQsIHRydWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBNYXRjaE1lZGlhO1xufSgpO1xuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHU0FQXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxudmFyIF9nc2FwID0ge1xuICByZWdpc3RlclBsdWdpbjogZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlUGx1Z2luKGNvbmZpZyk7XG4gICAgfSk7XG4gIH0sXG4gIHRpbWVsaW5lOiBmdW5jdGlvbiB0aW1lbGluZSh2YXJzKSB7XG4gICAgcmV0dXJuIG5ldyBUaW1lbGluZSh2YXJzKTtcbiAgfSxcbiAgZ2V0VHdlZW5zT2Y6IGZ1bmN0aW9uIGdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpO1xuICB9LFxuICBnZXRQcm9wZXJ0eTogZnVuY3Rpb24gZ2V0UHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkge1xuICAgIF9pc1N0cmluZyh0YXJnZXQpICYmICh0YXJnZXQgPSB0b0FycmF5KHRhcmdldClbMF0pOyAvL2luIGNhc2Ugc2VsZWN0b3IgdGV4dCBvciBhbiBhcnJheSBpcyBwYXNzZWQgaW5cblxuICAgIHZhciBnZXR0ZXIgPSBfZ2V0Q2FjaGUodGFyZ2V0IHx8IHt9KS5nZXQsXG4gICAgICAgIGZvcm1hdCA9IHVuaXQgPyBfcGFzc1Rocm91Z2ggOiBfbnVtZXJpY0lmUG9zc2libGU7XG5cbiAgICB1bml0ID09PSBcIm5hdGl2ZVwiICYmICh1bml0ID0gXCJcIik7XG4gICAgcmV0dXJuICF0YXJnZXQgPyB0YXJnZXQgOiAhcHJvcGVydHkgPyBmdW5jdGlvbiAocHJvcGVydHksIHVuaXQsIHVuY2FjaGUpIHtcbiAgICAgIHJldHVybiBmb3JtYXQoKF9wbHVnaW5zW3Byb3BlcnR5XSAmJiBfcGx1Z2luc1twcm9wZXJ0eV0uZ2V0IHx8IGdldHRlcikodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkpO1xuICAgIH0gOiBmb3JtYXQoKF9wbHVnaW5zW3Byb3BlcnR5XSAmJiBfcGx1Z2luc1twcm9wZXJ0eV0uZ2V0IHx8IGdldHRlcikodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkpO1xuICB9LFxuICBxdWlja1NldHRlcjogZnVuY3Rpb24gcXVpY2tTZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCkge1xuICAgIHRhcmdldCA9IHRvQXJyYXkodGFyZ2V0KTtcblxuICAgIGlmICh0YXJnZXQubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIHNldHRlcnMgPSB0YXJnZXQubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBnc2FwLnF1aWNrU2V0dGVyKHQsIHByb3BlcnR5LCB1bml0KTtcbiAgICAgIH0pLFxuICAgICAgICAgIGwgPSBzZXR0ZXJzLmxlbmd0aDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGkgPSBsO1xuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICBzZXR0ZXJzW2ldKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB0YXJnZXRbMF0gfHwge307XG5cbiAgICB2YXIgUGx1Z2luID0gX3BsdWdpbnNbcHJvcGVydHldLFxuICAgICAgICBjYWNoZSA9IF9nZXRDYWNoZSh0YXJnZXQpLFxuICAgICAgICBwID0gY2FjaGUuaGFybmVzcyAmJiAoY2FjaGUuaGFybmVzcy5hbGlhc2VzIHx8IHt9KVtwcm9wZXJ0eV0gfHwgcHJvcGVydHksXG4gICAgICAgIC8vIGluIGNhc2UgaXQncyBhbiBhbGlhcywgbGlrZSBcInJvdGF0ZVwiIGZvciBcInJvdGF0aW9uXCIuXG4gICAgc2V0dGVyID0gUGx1Z2luID8gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB2Y
12666XIgcCA9IG5ldyBQbHVnaW4oKTtcbiAgICAgIF9xdWlja1R3ZWVuLl9wdCA9IDA7XG4gICAgICBwLmluaXQodGFyZ2V0LCB1bml0ID8gdmFsdWUgKyB1bml0IDogdmFsdWUsIF9xdWlja1R3ZWVuLCAwLCBbdGFyZ2V0XSk7XG4gICAgICBwLnJlbmRlcigxLCBwKTtcbiAgICAgIF9xdWlja1R3ZWVuLl9wdCAmJiBfcmVuZGVyUHJvcFR3ZWVucygxLCBfcXVpY2tUd2Vlbik7XG4gICAgfSA6IGNhY2hlLnNldCh0YXJnZXQsIHApO1xuXG4gICAgcmV0dXJuIFBsdWdpbiA/IHNldHRlciA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHNldHRlcih0YXJnZXQsIHAsIHVuaXQgPyB2YWx1ZSArIHVuaXQgOiB2YWx1ZSwgY2FjaGUsIDEpO1xuICAgIH07XG4gIH0sXG4gIHF1aWNrVG86IGZ1bmN0aW9uIHF1aWNrVG8odGFyZ2V0LCBwcm9wZXJ0eSwgdmFycykge1xuICAgIHZhciBfc2V0RGVmYXVsdHMyO1xuXG4gICAgdmFyIHR3ZWVuID0gZ3NhcC50byh0YXJnZXQsIF9zZXREZWZhdWx0cygoX3NldERlZmF1bHRzMiA9IHt9LCBfc2V0RGVmYXVsdHMyW3Byb3BlcnR5XSA9IFwiKz0wLjFcIiwgX3NldERlZmF1bHRzMi5wYXVzZWQgPSB0cnVlLCBfc2V0RGVmYXVsdHMyLnN0YWdnZXIgPSAwLCBfc2V0RGVmYXVsdHMyKSwgdmFycyB8fCB7fSkpLFxuICAgICAgICBmdW5jID0gZnVuY3Rpb24gZnVuYyh2YWx1ZSwgc3RhcnQsIHN0YXJ0SXNSZWxhdGl2ZSkge1xuICAgICAgcmV0dXJuIHR3ZWVuLnJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlKTtcbiAgICB9O1xuXG4gICAgZnVuYy50d2VlbiA9IHR3ZWVuO1xuICAgIHJldHVybiBmdW5jO1xuICB9LFxuICBpc1R3ZWVuaW5nOiBmdW5jdGlvbiBpc1R3ZWVuaW5nKHRhcmdldHMpIHtcbiAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmdldFR3ZWVuc09mKHRhcmdldHMsIHRydWUpLmxlbmd0aCA+IDA7XG4gIH0sXG4gIGRlZmF1bHRzOiBmdW5jdGlvbiBkZWZhdWx0cyh2YWx1ZSkge1xuICAgIHZhbHVlICYmIHZhbHVlLmVhc2UgJiYgKHZhbHVlLmVhc2UgPSBfcGFyc2VFYXNlKHZhbHVlLmVhc2UsIF9kZWZhdWx0cy5lYXNlKSk7XG4gICAgcmV0dXJuIF9tZXJnZURlZXAoX2RlZmF1bHRzLCB2YWx1ZSB8fCB7fSk7XG4gIH0sXG4gIGNvbmZpZzogZnVuY3Rpb24gY29uZmlnKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9tZXJnZURlZXAoX2NvbmZpZywgdmFsdWUgfHwge30pO1xuICB9LFxuICByZWdpc3RlckVmZmVjdDogZnVuY3Rpb24gcmVnaXN0ZXJFZmZlY3QoX3JlZjMpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgIGVmZmVjdCA9IF9yZWYzLmVmZmVjdCxcbiAgICAgICAgcGx1Z2lucyA9IF9yZWYzLnBsdWdpbnMsXG4gICAgICAgIGRlZmF1bHRzID0gX3JlZjMuZGVmYXVsdHMsXG4gICAgICAgIGV4dGVuZFRpbWVsaW5lID0gX3JlZjMuZXh0ZW5kVGltZWxpbmU7XG4gICAgKHBsdWdpbnMgfHwgXCJcIikuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbk5hbWUpIHtcbiAgICAgIHJldHVybiBwbHVnaW5OYW1lICYmICFfcGx1Z2luc1twbHVnaW5OYW1lXSAmJiAhX2dsb2JhbHNbcGx1Z2luTmFtZV0gJiYgX3dhcm4obmFtZSArIFwiIGVmZmVjdCByZXF1aXJlcyBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4uXCIpO1xuICAgIH0pO1xuXG4gICAgX2VmZmVjdHNbbmFtZV0gPSBmdW5jdGlvbiAodGFyZ2V0cywgdmFycywgdGwpIHtcbiAgICAgIHJldHVybiBlZmZlY3QodG9BcnJheSh0YXJnZXRzKSwgX3NldERlZmF1bHRzKHZhcnMgfHwge30sIGRlZmF1bHRzKSwgdGwpO1xuICAgIH07XG5cbiAgICBpZiAoZXh0ZW5kVGltZWxpbmUpIHtcbiAgICAgIFRpbWVsaW5lLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uICh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQoX2VmZmVjdHNbbmFtZV0odGFyZ2V0cywgX2lzT2JqZWN0KHZhcnMpID8gdmFycyA6IChwb3NpdGlvbiA9IHZhcnMpICYmIHt9LCB0aGlzKSwgcG9zaXRpb24pO1xuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIHJlZ2lzdGVyRWFzZTogZnVuY3Rpb24gcmVnaXN0ZXJFYXNlKG5hbWUsIGVhc2UpIHtcbiAgICBfZWFzZU1hcFtuYW1lXSA9IF9wYXJzZUVhc2UoZWFzZSk7XG4gIH0sXG4gIHBhcnNlRWFzZTogZnVuY3Rpb24gcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBfcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSA6IF9lYXNlTWFwO1xuICB9LFxuICBnZXRCeUlkOiBmdW5jdGlvbiBnZXRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIF9nbG9iYWxUaW1lbGluZS5nZXRCeUlkKGlkKTtcbiAgfSxcbiAgZXhwb3J0Um9vdDogZnVuY3Rpb24gZXhwb3J0Um9vdCh2YXJzLCBpbmNsdWRlRGVsYXllZENhbGxzKSB7XG4gICAgaWYgKHZhcnMgPT09IHZvaWQgMCkge1xuICAgICAgdmFycyA9IHt9O1xuICAgIH1cblxuICAgIHZhciB0bCA9IG5ldyBUaW1lbGluZSh2YXJzKSxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIG5leHQ7XG4gICAgdGwuc21vb3RoQ2hpbGRUaW1pbmcgPSBfaXNOb3RGYWxzZSh2YXJzLnNtb290aENoaWxkVGltaW5nKTtcblxuICAgIF9nbG9iYWxUaW1lbGluZS5yZW1vdmUodGwpO1xuXG4gICAgdGwuX2RwID0gMDsgLy9vdGhlcndpc2UgaXQnbGwgZ2V0IHJlLWFjdGl2YXRlZCB3aGVuIGFkZGluZyBjaGlsZHJlbiBhbmQgYmUgcmUtaW50cm9kdWNlZCBpbnRvIF9nbG9iYWxUaW1lbGluZSdzIGxpbmtlZCBsaXN0ICh0aGVuIGFkZGVkIHRvIGl0c2VsZikuXG5cbiAgICB0bC5fdGltZSA9IHRsLl90VGltZSA9IF9nbG9iYWxUaW1lbGluZS5fdGltZTtcbiAgICBjaGlsZCA9IF9nbG9iYWxUaW1lbGluZS5fZmlyc3Q7XG5cbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcblxuICAgICAgaWYgKGluY2x1ZGVEZWxheWVkQ2FsbHMgfHwgISghY2hpbGQuX2R1ciAmJiBjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuICYmIGNoaWxkLnZhcnMub25Db21wbGV0ZSA9PT0gY2hpbGQuX3RhcmdldHNbMF0pKSB7XG4gICAgICAgIF9hZGRUb1RpbWVsaW5lKHRsLCBjaGlsZCwgY2hpbGQuX3N0YXJ0IC0gY2hpbGQuX2RlbGF5KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBuZXh0O1xuICAgIH1cblxuICAgIF9hZGRUb1RpbWVsaW5lKF9nbG9iYWxUaW1lbGluZSwgdGwsIDApO1xuXG4gICAgcmV0dXJuIHRsO1xuICB9LFxuICBjb250ZXh0OiBmdW5jdGlvbiBjb250ZXh0KGZ1bmMsIHNjb3BlKSB7XG4gICAgcmV0dXJuIGZ1bmMgPyBuZXcgQ29udGV4dChmdW5jLCBzY29wZSkgOiBfY29udGV4dDtcbiAgfSxcbiAgbWF0Y2hNZWRpYTogZnVuY3Rpb24gbWF0Y2hNZWRpYShzY29wZSkge1xuICAgIHJldHVybi
12666BuZXcgTWF0Y2hNZWRpYShzY29wZSk7XG4gIH0sXG4gIG1hdGNoTWVkaWFSZWZyZXNoOiBmdW5jdGlvbiBtYXRjaE1lZGlhUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gX21lZGlhLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgIHZhciBjb25kID0gYy5jb25kaXRpb25zLFxuICAgICAgICAgIGZvdW5kLFxuICAgICAgICAgIHA7XG5cbiAgICAgIGZvciAocCBpbiBjb25kKSB7XG4gICAgICAgIGlmIChjb25kW3BdKSB7XG4gICAgICAgICAgY29uZFtwXSA9IGZhbHNlO1xuICAgICAgICAgIGZvdW5kID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3VuZCAmJiBjLnJldmVydCgpO1xuICAgIH0pIHx8IF9vbk1lZGlhQ2hhbmdlKCk7XG4gIH0sXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0gfHwgKF9saXN0ZW5lcnNbdHlwZV0gPSBbXSk7XG4gICAgfmEuaW5kZXhPZihjYWxsYmFjaykgfHwgYS5wdXNoKGNhbGxiYWNrKTtcbiAgfSxcbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaykge1xuICAgIHZhciBhID0gX2xpc3RlbmVyc1t0eXBlXSxcbiAgICAgICAgaSA9IGEgJiYgYS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICBpID49IDAgJiYgYS5zcGxpY2UoaSwgMSk7XG4gIH0sXG4gIHV0aWxzOiB7XG4gICAgd3JhcDogd3JhcCxcbiAgICB3cmFwWW95bzogd3JhcFlveW8sXG4gICAgZGlzdHJpYnV0ZTogZGlzdHJpYnV0ZSxcbiAgICByYW5kb206IHJhbmRvbSxcbiAgICBzbmFwOiBzbmFwLFxuICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLFxuICAgIGdldFVuaXQ6IGdldFVuaXQsXG4gICAgY2xhbXA6IGNsYW1wLFxuICAgIHNwbGl0Q29sb3I6IHNwbGl0Q29sb3IsXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgbWFwUmFuZ2U6IG1hcFJhbmdlLFxuICAgIHBpcGU6IHBpcGUsXG4gICAgdW5pdGl6ZTogdW5pdGl6ZSxcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGUsXG4gICAgc2h1ZmZsZTogc2h1ZmZsZVxuICB9LFxuICBpbnN0YWxsOiBfaW5zdGFsbCxcbiAgZWZmZWN0czogX2VmZmVjdHMsXG4gIHRpY2tlcjogX3RpY2tlcixcbiAgdXBkYXRlUm9vdDogVGltZWxpbmUudXBkYXRlUm9vdCxcbiAgcGx1Z2luczogX3BsdWdpbnMsXG4gIGdsb2JhbFRpbWVsaW5lOiBfZ2xvYmFsVGltZWxpbmUsXG4gIGNvcmU6IHtcbiAgICBQcm9wVHdlZW46IFByb3BUd2VlbixcbiAgICBnbG9iYWxzOiBfYWRkR2xvYmFsLFxuICAgIFR3ZWVuOiBUd2VlbixcbiAgICBUaW1lbGluZTogVGltZWxpbmUsXG4gICAgQW5pbWF0aW9uOiBBbmltYXRpb24sXG4gICAgZ2V0Q2FjaGU6IF9nZXRDYWNoZSxcbiAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW06IF9yZW1vdmVMaW5rZWRMaXN0SXRlbSxcbiAgICByZXZlcnRpbmc6IGZ1bmN0aW9uIHJldmVydGluZygpIHtcbiAgICAgIHJldHVybiBfcmV2ZXJ0aW5nO1xuICAgIH0sXG4gICAgY29udGV4dDogZnVuY3Rpb24gY29udGV4dCh0b0FkZCkge1xuICAgICAgaWYgKHRvQWRkICYmIF9jb250ZXh0KSB7XG4gICAgICAgIF9jb250ZXh0LmRhdGEucHVzaCh0b0FkZCk7XG5cbiAgICAgICAgdG9BZGQuX2N0eCA9IF9jb250ZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2NvbnRleHQ7XG4gICAgfSxcbiAgICBzdXBwcmVzc092ZXJ3cml0ZXM6IGZ1bmN0aW9uIHN1cHByZXNzT3ZlcndyaXRlcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIF9zdXBwcmVzc092ZXJ3cml0ZXMgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbl9mb3JFYWNoTmFtZShcInRvLGZyb20sZnJvbVRvLGRlbGF5ZWRDYWxsLHNldCxraWxsVHdlZW5zT2ZcIiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF9nc2FwW25hbWVdID0gVHdlZW5bbmFtZV07XG59KTtcblxuX3RpY2tlci5hZGQoVGltZWxpbmUudXBkYXRlUm9vdCk7XG5cbl9xdWlja1R3ZWVuID0gX2dzYXAudG8oe30sIHtcbiAgZHVyYXRpb246IDBcbn0pOyAvLyAtLS0tIEVYVFJBIFBMVUdJTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIF9nZXRQbHVnaW5Qcm9wVHdlZW4gPSBmdW5jdGlvbiBfZ2V0UGx1Z2luUHJvcFR3ZWVuKHBsdWdpbiwgcHJvcCkge1xuICB2YXIgcHQgPSBwbHVnaW4uX3B0O1xuXG4gIHdoaWxlIChwdCAmJiBwdC5wICE9PSBwcm9wICYmIHB0Lm9wICE9PSBwcm9wICYmIHB0LmZwICE9PSBwcm9wKSB7XG4gICAgcHQgPSBwdC5fbmV4dDtcbiAgfVxuXG4gIHJldHVybiBwdDtcbn0sXG4gICAgX2FkZE1vZGlmaWVycyA9IGZ1bmN0aW9uIF9hZGRNb2RpZmllcnModHdlZW4sIG1vZGlmaWVycykge1xuICB2YXIgdGFyZ2V0cyA9IHR3ZWVuLl90YXJnZXRzLFxuICAgICAgcCxcbiAgICAgIGksXG4gICAgICBwdDtcblxuICBmb3IgKHAgaW4gbW9kaWZpZXJzKSB7XG4gICAgaSA9IHRhcmdldHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgcHQgPSB0d2Vlbi5fcHRMb29rdXBbaV1bcF07XG5cbiAgICAgIGlmIChwdCAmJiAocHQgPSBwdC5kKSkge1xuICAgICAgICBpZiAocHQuX3B0KSB7XG4gICAgICAgICAgLy8gaXMgYSBwbHVnaW5cbiAgICAgICAgICBwdCA9IF9nZXRQbHVnaW5Qcm9wVHdlZW4ocHQsIHApO1xuICAgICAgICB9XG5cbiAgICAgICAgcHQgJiYgcHQubW9kaWZpZXIgJiYgcHQubW9kaWZpZXIobW9kaWZpZXJzW3BdLCB0d2VlbiwgdGFyZ2V0c1tpXSwgcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59LFxuICAgIF9idWlsZE1vZGlmaWVyUGx1Z2luID0gZnVuY3Rpb24gX2J1aWxkTW9kaWZpZXJQbHVnaW4obmFtZSwgbW9kaWZpZXIpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGhlYWRsZXNzOiAxLFxuICAgIHJhd1ZhcnM6IDEsXG4gICAgLy9kb24ndCBwcmUtcHJvY2VzcyBmdW5jdGlvbi1iYXNlZCB2YWx1ZXMgb3IgXCJyYW5kb20oKVwiIHN0cmluZ3MuXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCh0YXJnZXQsIHZhcnMsIHR3ZWVuKSB7XG4gICAgICB0d2Vlbi5fb25Jbml0ID0gZnVuY3Rpb24gKHR3ZWVuKSB7XG4gICAgICAgI
12666HZhciB0ZW1wLCBwO1xuXG4gICAgICAgIGlmIChfaXNTdHJpbmcodmFycykpIHtcbiAgICAgICAgICB0ZW1wID0ge307XG5cbiAgICAgICAgICBfZm9yRWFjaE5hbWUodmFycywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZW1wW25hbWVdID0gMTtcbiAgICAgICAgICB9KTsgLy9pZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0byByb3VuZFByb3BzLCBsaWtlIFwieCx5XCIsIHdlIHJvdW5kIHRvIHdob2xlIG51bWJlcnMuXG5cblxuICAgICAgICAgIHZhcnMgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVyKSB7XG4gICAgICAgICAgdGVtcCA9IHt9O1xuXG4gICAgICAgICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgICAgICAgIHRlbXBbcF0gPSBtb2RpZmllcih2YXJzW3BdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXJzID0gdGVtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIF9hZGRNb2RpZmllcnModHdlZW4sIHZhcnMpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59OyAvL3JlZ2lzdGVyIGNvcmUgcGx1Z2luc1xuXG5cbmV4cG9ydCB2YXIgZ3NhcCA9IF9nc2FwLnJlZ2lzdGVyUGx1Z2luKHtcbiAgbmFtZTogXCJhdHRyXCIsXG4gIGluaXQ6IGZ1bmN0aW9uIGluaXQodGFyZ2V0LCB2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldHMpIHtcbiAgICB2YXIgcCwgcHQsIHY7XG4gICAgdGhpcy50d2VlbiA9IHR3ZWVuO1xuXG4gICAgZm9yIChwIGluIHZhcnMpIHtcbiAgICAgIHYgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHApIHx8IFwiXCI7XG4gICAgICBwdCA9IHRoaXMuYWRkKHRhcmdldCwgXCJzZXRBdHRyaWJ1dGVcIiwgKHYgfHwgMCkgKyBcIlwiLCB2YXJzW3BdLCBpbmRleCwgdGFyZ2V0cywgMCwgMCwgcCk7XG4gICAgICBwdC5vcCA9IHA7XG4gICAgICBwdC5iID0gdjsgLy8gcmVjb3JkIHRoZSBiZWdpbm5pbmcgdmFsdWUgc28gd2UgY2FuIHJldmVydCgpXG5cbiAgICAgIHRoaXMuX3Byb3BzLnB1c2gocCk7XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihyYXRpbywgZGF0YSkge1xuICAgIHZhciBwdCA9IGRhdGEuX3B0O1xuXG4gICAgd2hpbGUgKHB0KSB7XG4gICAgICBfcmV2ZXJ0aW5nID8gcHQuc2V0KHB0LnQsIHB0LnAsIHB0LmIsIHB0KSA6IHB0LnIocmF0aW8sIHB0LmQpOyAvLyBpZiByZXZlcnRpbmcsIGdvIGJhY2sgdG8gdGhlIG9yaWdpbmFsIChwdC5iKVxuXG4gICAgICBwdCA9IHB0Ll9uZXh0O1xuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiBcImVuZEFycmF5XCIsXG4gIGhlYWRsZXNzOiAxLFxuICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFsdWUpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkKHRhcmdldCwgaSwgdGFyZ2V0W2ldIHx8IDAsIHZhbHVlW2ldLCAwLCAwLCAwLCAwLCAwLCAxKTtcbiAgICB9XG4gIH1cbn0sIF9idWlsZE1vZGlmaWVyUGx1Z2luKFwicm91bmRQcm9wc1wiLCBfcm91bmRNb2RpZmllciksIF9idWlsZE1vZGlmaWVyUGx1Z2luKFwibW9kaWZpZXJzXCIpLCBfYnVpbGRNb2RpZmllclBsdWdpbihcInNuYXBcIiwgc25hcCkpIHx8IF9nc2FwOyAvL3RvIHByZXZlbnQgdGhlIGNvcmUgcGx1Z2lucyBmcm9tIGJlaW5nIGRyb3BwZWQgdmlhIGFnZ3Jlc3NpdmUgdHJlZSBzaGFraW5nLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gaW4gdGhpcyB3YXkuXG5cblR3ZWVuLnZlcnNpb24gPSBUaW1lbGluZS52ZXJzaW9uID0gZ3NhcC52ZXJzaW9uID0gXCIzLjE1LjBcIjtcbl9jb3JlUmVhZHkgPSAxO1xuX3dpbmRvd0V4aXN0cygpICYmIF93YWtlKCk7XG52YXIgUG93ZXIwID0gX2Vhc2VNYXAuUG93ZXIwLFxuICAgIFBvd2VyMSA9IF9lYXNlTWFwLlBvd2VyMSxcbiAgICBQb3dlcjIgPSBfZWFzZU1hcC5Qb3dlcjIsXG4gICAgUG93ZXIzID0gX2Vhc2VNYXAuUG93ZXIzLFxuICAgIFBvd2VyNCA9IF9lYXNlTWFwLlBvd2VyNCxcbiAgICBMaW5lYXIgPSBfZWFzZU1hcC5MaW5lYXIsXG4gICAgUXVhZCA9IF9lYXNlTWFwLlF1YWQsXG4gICAgQ3ViaWMgPSBfZWFzZU1hcC5DdWJpYyxcbiAgICBRdWFydCA9IF9lYXNlTWFwLlF1YXJ0LFxuICAgIFF1aW50ID0gX2Vhc2VNYXAuUXVpbnQsXG4gICAgU3Ryb25nID0gX2Vhc2VNYXAuU3Ryb25nLFxuICAgIEVsYXN0aWMgPSBfZWFzZU1hcC5FbGFzdGljLFxuICAgIEJhY2sgPSBfZWFzZU1hcC5CYWNrLFxuICAgIFN0ZXBwZWRFYXNlID0gX2Vhc2VNYXAuU3RlcHBlZEVhc2UsXG4gICAgQm91bmNlID0gX2Vhc2VNYXAuQm91bmNlLFxuICAgIFNpbmUgPSBfZWFzZU1hcC5TaW5lLFxuICAgIEV4cG8gPSBfZWFzZU1hcC5FeHBvLFxuICAgIENpcmMgPSBfZWFzZU1hcC5DaXJjO1xuZXhwb3J0IHsgUG93ZXIwLCBQb3dlcjEsIFBvd2VyMiwgUG93ZXIzLCBQb3dlcjQsIExpbmVhciwgUXVhZCwgQ3ViaWMsIFF1YXJ0LCBRdWludCwgU3Ryb25nLCBFbGFzdGljLCBCYWNrLCBTdGVwcGVkRWFzZSwgQm91bmNlLCBTaW5lLCBFeHBvLCBDaXJjIH07XG5leHBvcnQgeyBUd2VlbiBhcyBUd2Vlbk1heCwgVHdlZW4gYXMgVHdlZW5MaXRlLCBUaW1lbGluZSBhcyBUaW1lbGluZU1heCwgVGltZWxpbmUgYXMgVGltZWxpbmVMaXRlLCBnc2FwIGFzIGRlZmF1bHQsIHdyYXAsIHdyYXBZb3lvLCBkaXN0cmlidXRlLCByYW5kb20sIHNuYXAsIG5vcm1hbGl6ZSwgZ2V0VW5pdCwgY2xhbXAsIHNwbGl0Q29sb3IsIHRvQXJyYXksIHNlbGVjdG9yLCBtYXBSYW5nZSwgcGlwZSwgdW5pdGl6ZSwgaW50ZXJwb2xhdGUsIHNodWZmbGUgfTsgLy9leHBvcnQgc29tZSBpbnRlcm5hbCBtZXRob2RzL29yb2plY3RzIGZvciB1c2UgaW4gQ1NTUGx1Z2luIHNvIHRoYXQgd2UgY2FuIGV4dGVybmFsaXplIHRoYXQgZmlsZSBhbmQgYWxsb3cgY3VzdG9tIGJ1aWxkcyB0aGF0IGV4Y2x1ZGUgaXQuXG5cbmV4cG9ydCB7IF9nZXRQcm9wZXJ0eSwgX251bUV4cCwgX251bVdpdGhVbml0RXhwLCBfaXNTdHJpbmcsIF9pc1VuZGVmaW5lZCwgX3JlbmRlckNvbXBsZXhTdHJpbmcsIF9yZWxFeHAsIF9zZXREZWZhdWx0cywgX3JlbW92ZUxpbmtlZExpc3RJdGVtLCBfZm9yRWFjaE5hbWUsIF9zb3J0UHJvcFR3ZWVuc0J5UHJpb3JpdHksIF9jb2xvclN0cmluZ0ZpbHRlciwgX3JlcGxhY2VSYW5kb20sIF9jaGVja1BsdWdpbiwgX3BsdWdpbnMsIF90aWNrZXIsIF9jb25maWcsIF9yb3VuZE1vZGlmaWVyLCBfcm91bmQsIF9taXNzaW5nUGx1Z2luLCBfZ2V0U2V0dGVyLCBfZ2V0Q2FjaGUsIF9jb2xvckV4cCwgX3BhcnNlUmVsYXRpdmUgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= 12667//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js 12668 12669}`)},"./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 12670/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12671/* harmony export */ Back: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Back), 12672/* harmony export */ Bounce: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Bounce), 12673/* harmony export */ CSSPlugin: () => (/* reexport safe */ _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__.CSSPlugin), 12674/* harmony export */ Circ: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Circ), 12675/* harmony export */ Cubic: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Cubic), 12676/* harmony export */ Elastic: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Elastic), 12677/* harmony export */ Expo: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Expo), 12678/* harmony export */ Linear: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Linear), 12679/* harmony export */ Power0: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power0), 12680/* harmony export */ Power1: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power1),
12681/* harmony export */ Power2: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power2), 12682/* harmony export */ Power3: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power3), 12683/* harmony export */ Power4: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Power4), 12684/* harmony export */ Quad: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quad), 12685/* harmony export */ Quart: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quart), 12686/* harmony export */ Quint: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Quint), 12687/* harmony export */ Sine: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Sine), 12688/* harmony export */ SteppedEase: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.SteppedEase), 12689/* harmony export */ Strong: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.Strong), 12690/* harmony export */ TimelineLite: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TimelineLite), 12691/* harmony export */ TimelineMax: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TimelineMax), 12692/* harmony export */ TweenLite: () => (/* reexport safe */ _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.TweenLite), 12693/* harmony export */ TweenMax: () => (/* binding */ TweenMaxWithCSS), 12694/* harmony export */ "default": () => (/* binding */ gsapWithCSS), 12695/* harmony export */ gsap: () => (/* binding */ gsapWithCSS) 12696/* harmony export */ }); 12697/* harmony import */ var _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./gsap-core.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/gsap-core.js"); 12698/* harmony import */ var _CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CSSPlugin.js */ "./node_modules/.pnpm/[email protected]/node_modules/gsap/CSSPlugin.js"); 12699 12700 12701var gsapWithCSS = _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap.registerPlugin(_CSSPlugin_js__WEBPACK_IMPORTED_MODULE_1__.CSSPlugin) || _gsap_core_js__WEBPACK_IMPORTED_MODULE_0__.gsap, 12702 // to protect from tree shaking 12703TweenMaxWithCSS = gsapWithCSS.core.Tween; 12704//# sourceURL=[module] 12705//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vZ3NhcEAzLjE1LjAvbm9kZV9tb2R1bGVzL2dzYXAvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXFOO0FBQzFLO0FBQzNDLGtCQUFrQiwrQ0FBSSxnQkFBZ0Isb0RBQVMsS0FBSywrQ0FBSTtBQUN4RDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGdyYWZpa3IvZ3JhZmlrcnBsYXRlLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2dzYXBAMy4xNS4wL25vZGVfbW9kdWxlcy9nc2FwL2luZGV4LmpzPzE4ZjkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ3NhcCwgUG93ZXIwLCBQb3dlcjEsIFBvd2VyMiwgUG93ZXIzLCBQb3dlcjQsIExpbmVhciwgUXVhZCwgQ3ViaWMsIFF1YXJ0LCBRdWludCwgU3Ryb25nLCBFbGFzdGljLCBCYWNrLCBTdGVwcGVkRWFzZSwgQm91bmNlLCBTaW5lLCBFeHBvLCBDaXJjLCBUd2VlbkxpdGUsIFRpbWVsaW5lTGl
127050ZSwgVGltZWxpbmVNYXggfSBmcm9tIFwiLi9nc2FwLWNvcmUuanNcIjtcbmltcG9ydCB7IENTU1BsdWdpbiB9IGZyb20gXCIuL0NTU1BsdWdpbi5qc1wiO1xudmFyIGdzYXBXaXRoQ1NTID0gZ3NhcC5yZWdpc3RlclBsdWdpbihDU1NQbHVnaW4pIHx8IGdzYXAsXG4gICAgLy8gdG8gcHJvdGVjdCBmcm9tIHRyZWUgc2hha2luZ1xuVHdlZW5NYXhXaXRoQ1NTID0gZ3NhcFdpdGhDU1MuY29yZS5Ud2VlbjtcbmV4cG9ydCB7IGdzYXBXaXRoQ1NTIGFzIGdzYXAsIGdzYXBXaXRoQ1NTIGFzIGRlZmF1bHQsIENTU1BsdWdpbiwgVHdlZW5NYXhXaXRoQ1NTIGFzIFR3ZWVuTWF4LCBUd2VlbkxpdGUsIFRpbWVsaW5lTWF4LCBUaW1lbGluZUxpdGUsIFBvd2VyMCwgUG93ZXIxLCBQb3dlcjIsIFBvd2VyMywgUG93ZXI0LCBMaW5lYXIsIFF1YWQsIEN1YmljLCBRdWFydCwgUXVpbnQsIFN0cm9uZywgRWxhc3RpYywgQmFjaywgU3RlcHBlZEVhc2UsIEJvdW5jZSwgU2luZSwgRXhwbywgQ2lyYyB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 12706//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/gsap/index.js 12707 12708}`)},"./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 12709/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12710/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) 12711/* harmony export */ }); 12712/** 12713 * keen-slider 5.5.1 12714 * The HTML touch slider carousel with the most native feeling you will get. 12715 * https://keen-slider.io 12716 * Copyright 2020-2021 Eric Beyer <[email protected]> 12717 * License: MIT 12718 * Released on: 2021-06-10 12719 */ 12720 12721function t(t,n,e){return n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e,t}function n(t,n){var e=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable}))),e.push.apply(e,r)}return e}function e(e){for(var r=1;r<arguments.length;r++){var i=null!=arguments[r]?arguments[r]:{};r%2?n(Object(i),!0).forEach((function(n){t(e,n,i[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):n(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function r(t){return function(t){if(Array.isArray(t))return i(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,n){if(!t)return;if("string"==typeof t)return i(t,n);var e=Object.prototype.toString.call(t).slice(8,-1);"Object"===e&&t.constructor&&(e=t.constructor.name);if("Map"===e||"Set"===e)return Array.from(t);if("Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return i(t,n)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,n){(null==n||n>t.length)&&(n=t.length);for(var e=0,r=new Array(n);e<n;e++)r[e]=t[e];return r}function o(t){var n,i,o,a,f,s,l,d,h,v,p,m,b,g,w,y,M,O,S,A,j,k,x,P,E,T,D,C,L,V,X,Y,z,H,I=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},q="data-keen-slider-moves",F="data-keen-slider-v",W=[],_=null,N=!1,R=!1,U=0,$=[];function B(t,n,e){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};t.addEventListener(n,e,r),W.push([t,n,e,r])}function G(t){if(O&&S===Z(t)&&ft()){var e=nt(t).x;if(!rt(t)&&P)return K(t);P&&(Nt(),A=e,P=!1),t.cancelable&&t.preventDefault();var r=A-e;E+=Math.abs(r),!T&&E>5&&(T=!0,n.setAttribute(q,!0)),Yt(x(r,Jt)*(lt()?-1:1),t.timeStamp),A=e}}function J(t){O||!ft()||et(t.target)||(O=!0,P=!0,S=Z(t),T=!1,E=0,rt(t),pt(),M=v,A=nt(t).x,Yt(0,t.timeStamp),ut("dragStart"))}function K(t){O&&S===Z(t,!0)&&ft()&&(n.removeAttribute(q),O=!1,gt(),ut("dragEnd"))}function Q(t){return t.changedTouches}function Z(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=n?Q(t):tt(t);return e?e[0]?e[0].identifier:"error":"default"}function tt(t){return t.targetTouches}function nt(t){var n=tt(t);return{x:ht()?n?n[0].screenY:t.pageY:n?n[0].screenX:t.pageX,timestamp:t.timeStamp}}function et(t){return t.hasAttribute(y.preventEvent)}function rt(t){var n=tt(t);if(!n)return!0;var e=n[0],r=ht()?e.clientY:e.clientX,i=ht()?e.clientX:e.clientY,o=void 0!==j&&void 0!==k&&Math.abs(k-i)<=Math.abs(j-r);return j=r,k=i,o}function it(t){ft()&&O&&t.preventDefault()}function ot(){B(window,"orientationchange",Dt),B(window,"resize",(function(){return Tt()})),B(n,"dragstart",(function(t){ft()&&t.preventDefault()})),B(n,"mousedown",J),B(y.cancelOnLeave?n:window,"mousemove",G),y.cancelOnLeave&&B(n,"mouseleave",K),B(window,"mouseup",K),B(n,"touchstart",J,{passive:!0}),B(n,"touchmove",G,{passive:!1}),B(n,"touchend",K,{passive:!0}),B(n,"touchcancel",K,{passive:!0}),B(window,"wheel",it,{passive:!1})}function at(){W.forEach((function(t){t[0].removeEventListener(t[1],t[2],t[3])})),W=[]}function ut(t){y[t]&&y[t](Jt)}function ct(){return y.centered}function ft(){return void 0!==i?i:y.controls}function st(){return y.loop&&o>1}function lt(){return y.rtl}function dt(){return!y.loop&&y.rubberband}function ht(){return!!y.vertical}function vt(){D=window.requestAnimationFrame(mt)}function pt(){D&&(window.cancelAnimationFrame(D),D=null),C=null}function mt(t){C||(C=t);var n=t-C,e=bt(n);if(n>=V)return Yt(L-Y,!1),H?H():void ut("afterChange");var r=zt(e);if(0===r||st()||dt()||z){if(0!==r&&dt()&&!z)return St();Y+=e,Yt(e,!1),vt()}else Yt(e-r,!1)}function bt(t){return L*X(t/V)-Y}function gt(){switch(ut("beforeChange"),y.mode){case"free":Mt();break;case"free-snap":Ot();break;case"snap":default:wt()}}function wt(){yt((1===l&&0!==p?M:v)+Math.sign(p))}function yt(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:y.duration,r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o=function(t){return 1+--t*t*t*t*t};At(Ft(t=qt(t,r,i)),e,o,n)}function Mt(){if(0===b)return!(!zt(0)||st())&&yt(v);var t=y.friction/Math.pow(Math.abs(b),-.5);At(Math.pow(b,2)/t*Math.sign(b),6*Math.abs(b/t),(function(t){return 1-Math.pow(1-t,5)}))}function Ot(){if(0===b)return yt(v);var t=y.friction/Math.pow(Math.abs(b),-.5),n=Math.pow(b,2)/t*Math.sign(b),e=6*Math.abs(b/t),r=(U+n)/(s/l);At((-1===p?Math.floor(r):Math.ceil(r))*(s/l)-U,e,(function(t){return 1-Math.pow(1-t,5)}))}function St(){if(pt(),0===b)return yt(v,!0);var t=.04/Math.pow(Math.abs(b),-.5),n=Math.pow(b,2)/t*Math.sign(b),e=function(t){return--t*t*t+1},r=b;At(n,3*Math.abs(r/t),e,!0,(function(){At(Ft(qt(v)),500,e,!0)}))}function At(t,n,e,r,i){pt(),L=t,Y=0,V=n,X=e,z=r,H=i,C=null,vt()}function jt(e){var r=u(t);r.length&&(n=r[0],Tt(e),ot(),ut("mounted"))}function kt(){var t,n=I.breakpoints||[];for(var r in n)window.matchMedia(r).matches&&(t=r);if(t===_)return!0;var i=(_=t)?n[_]:I;i.breakpoints&&_&&delete i.breakpoints,y=e(e(e({},Gt),I),i),N=!0,h=null,ut("optionsChanged"),Et()}function xt(t){if("function"==typeof t)return t();var n=y.autoAdjustSlidesPerView;n||(o=Math.max(t,o));var e=st()&&n?o-1:o;return c(t,1,Math.max(e,1))}function Pt(){kt(),R=!0,ut("created")}function Et(t,n){t&&(I=t),n&&(_=null),Ct(),jt(n)}function Tt(t){var e=window.innerWidth;if(kt()&&(e!==h||t)){h=e;var r=y.slides;"number"==typeof r?(f=null,o=r):(f=u(r,n),o=f?f.length:0);var i=y.dragSpeed;x="function"==typeof i?i:function(t){return t*i},s=ht()?n.offsetHeight:n.offsetWidth,l=xt(y.slidesPerView),d=c(y.spacing,0,s/(l-1)-1),s+=d,a=ct()?(s/2-s/l/2)/s:0,Vt();var p=!R||N&&y.resetSlide?y.initial:v;Bt(st()?p:Ht(p)),ht()&&n.setAttribute(F,!0),N=!1}}function Dt(t){Tt(),setTimeout(Tt,500),setTimeout(Tt,2e3)}function Ct(){at(),Xt(),n&&n.hasAttribute(F)&&n.removeAttribute(F),ut("destroyed")}function Lt(){f&&f.forEach((function(t,n){var e=g[n].distance*s-n*(s/l-d/l-d/l*(l-1)),r=ht()?0:e,i=ht()?e:0,o="translate3d(".concat(r,"px, ").concat(i,"px, 0)");t.style.transform=o,t.style["-webkit-transform"]=o}))}function Vt(){f&&f.forEach((function(t){var n="calc(".concat(100/l,"% - ").concat(d/l*(l-1),"px)");ht()?(t.style["min-height"]=n,t.style["max-height"]=n):(t.style["min-width"]=n,t.style["max-width"]=n)}))}function Xt(){if(f){var t=["transform","-webkit-transform"];t=[].concat(r(t),ht?["min-height","max-height"]:["min-width","max-width"]),f.forEach((function(n){t.forEach((function(t){n.style.removeProperty(t)}))}))}}function Yt(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now();_t(t,e),n&&(t=Ut(t)),U+=t,Rt()}function zt(t){var n=s*(o-1*(ct()?1:l))/l,e=U+t;return e>n?e-n:e<0?e:0}function Ht(t){return c(t,0,o-1-(ct()?0:l-1))}function It(){var t=Math.abs(w),n=U<0?1-t:t;return{direction:p,progressTrack:n,progressSlides:n*o/(o-1),positions:g,position:U,speed:b,relativeSlide:(v%o+o)%o,absoluteSlide:v,size:o,slidesPerView:l,widthOrHeight:s}}function qt(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return st()?n?Wt(t,e):t:Ht(t)}function Ft(t){return-(-s/l*t+U)}function Wt(t,n){var e=(v%o+o)%o,r=e<(t=(t%o+o)%o)?-e-o+t:-(e-t),i=e>t?o-e+t:t-e,a=n?Math.abs(r)<=i?r:i:t<e?r:i;return v+a}function _t(t,n){clearTimeout(m);var e=Math.sign(t);if(e!==p&&Nt(),p=e,$.push({distance:t,time:n}),m=setTimeout((function(){$=[],b=0}),50),($=$.slice(-6)).length<=1||0===p)return b=0;var r=$.slice(0,-1).reduce((function(t,n){return t+n.distance}),0),i=$[$.length-1].time,o=$[0].time;b=c(r/(i-o),-10,10)}function Nt(){$=[]}function Rt(){w=st()?U%(s*o/l)/(s*o/l):U/(s*o/l),$t();for(var t=[],n=0;n<o;n++){var e=(1/o*n-(w<0&&st()?w+1:w))*o/l+a;st()&&(e+=e>(o-1)/l?-o/l:e<-o/l+1?o/l:0);var r=1/l,i=e+r,u=i<r?i/r:i>1?1-(i-1)*l/1:1;t.push({portion:u<0||u>1?0:u,distance:lt()?-1*e+1-r:e})}g=t,Lt(),ut("move")}function Ut(t){if(st())return t;var n=zt(t);if(!dt())return t-n;if(0===n)return t;var e;return t*(e=n/s,(1-Math.abs(e))*(1-Math.abs(e)))}function $t(){var t=Math.round(U/(s/l));t!==v&&(!st()&&(t<0||t>o-1)||(v=t,ut("slideChanged")))}function Bt(t){ut("beforeChange"),Yt(Ft(t),!1),ut("afterChange")}var Gt={autoAdjustSlidesPerView:!0,centered:!1,breakpoints:null,controls:!0,dragSpeed:1,friction:.0025,loop:!1,initial:0,duration:500,preventEvent:"data-keen-slider-pe",slides:".keen-slider__slide",vertical:!1,resetSlide:!1,slidesPerView:1,spacing:0,mode:"snap",rtl:!1,rubberband:!0,cancelOnLeave:!0},Jt={controls:function(t){i=t},destroy:Ct,refresh:function(t){Et(t,!0)},next:function(){yt(v+1,!0)},prev:function(){yt(v-1,!0)},moveToSlide:function(t,n){yt(t,!0,n)},moveToSlideRelative:function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],e=arguments.length>2?arguments[2]:void 0;yt(t,!0,e,!0,n)},resize:function(){Tt(!0)},details:function(){return It()},options:function(){var t=e({},y);return delete t.breakpoints,t}};return Pt(),Jt}function a(t){return Array.prototype.slice.call(t)}function u(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document;return"function"==typeof t?a(t()):"string"==typeof t?a(n.querySelectorAll(t)):t instanceof HTMLElement!=!1?[t]:t instanceof NodeList!=!1?t:[]}function c(t,n,e){return Math.min(Math.max(t,n),e)}Math.sign||(Math.sign=function(t){return(t>0)-(t<0)||+t});/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (o); 12722//# sourceMappingURL=keen-slider.esm.js.map 12723//# sourceURL=[module] 12724//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0va2Vlbi1zbGlkZXJANS41LjEvbm9kZV9tb2R1bGVzL2tlZW4tc2xpZGVyL2tlZW4tc2xpZGVyLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IseUNBQXlDLGtEQUFrRCxXQUFXLGdCQUFnQixxQkFBcUIsaUNBQWlDLHNDQUFzQyw0QkFBNEIsdURBQXVELHNCQUFzQixTQUFTLGNBQWMsWUFBWSxtQkFBbUIsS0FBSyx5Q0FBeUMseUNBQXlDLFlBQVkscUlBQXFJLGdFQUFnRSxHQUFHLFNBQVMsY0FBYyxtQkFBbUIsZ0NBQWdDLGlCQUFpQixpRkFBaUYsbUJBQW1CLGFBQWEsb0NBQW9DLG9EQUFvRCxvREFBb0QsNkNBQTZDLHFGQUFxRixnQkFBZ0IsNEpBQTRKLEdBQUcsZ0JBQWdCLG9DQUFvQywyQkFBMkIsSUFBSSxjQUFjLFNBQVMsY0FBYyxtSUFBbUksa0ZBQWtG
12724LGtCQUFrQixnRUFBZ0UsNENBQTRDLGNBQWMsc0JBQXNCLGNBQWMseUJBQXlCLG9EQUFvRCxVQUFVLDZGQUE2RixjQUFjLCtHQUErRyxjQUFjLHFFQUFxRSxjQUFjLHdCQUF3QixjQUFjLDZFQUE2RSxnREFBZ0QsZUFBZSx1QkFBdUIsZUFBZSxZQUFZLE9BQU8sNEVBQTRFLGVBQWUsc0NBQXNDLGVBQWUsWUFBWSxlQUFlLHdIQUF3SCxpQkFBaUIsZUFBZSw0QkFBNEIsY0FBYywrREFBK0QsWUFBWSxnQ0FBZ0MseUJBQXlCLCtJQUErSSxXQUFXLHFCQUFxQixXQUFXLG9CQUFvQixXQUFXLHVCQUF1QixXQUFXLHVCQUF1QixXQUFXLEVBQUUsY0FBYyx1QkFBdUIseUNBQXlDLFFBQVEsZUFBZSxlQUFlLGNBQWMsa0JBQWtCLGNBQWMsK0JBQStCLGNBQWMsbUJBQW1CLGNBQWMsYUFBYSxjQUFjLDRCQUE0QixjQUFjLG1CQUFtQixjQUFjLG1DQUFtQyxjQUFjLGtEQUFrRCxlQUFlLFNBQVMsa0JBQWtCLHVEQUF1RCxZQUFZLHlCQUF5QiwrQkFBK0IsbUJBQW1CLGdCQUFnQixlQUFlLGtCQUFrQixjQUFjLGtDQUFrQyxnQkFBZ0IsTUFBTSxxQkFBcUIsTUFBTSx5QkFBeUIsY0FBYyxvQ0FBb0MsaUJBQWlCLDBNQUEwTSxzQkFBc0IsMEJBQTBCLGNBQWMsc0NBQXNDLDJDQUEyQyw2REFBNkQseUJBQXlCLEdBQUcsY0FBYyxzQkFBc0IsMEdBQTBHLDhEQUE4RCx5QkFBeUIsR0FBRyxjQUFjLDhCQUE4QixpRkFBaUYsZ0JBQWdCLEtBQUssc0NBQXNDLHVCQUF1QixHQUFHLHVCQUF1Qix5Q0FBeUMsZUFBZSxXQUFXLDRDQUE0QyxjQUFjLDBCQUEwQixtREFBbUQsa0JBQWtCLG1CQUFtQixpREFBaUQsaURBQWlELGVBQWUsbUNBQW1DLGdDQUFnQyxxQkFBcUIsb0JBQW9CLDRCQUE0QixjQUFjLHdCQUF3QixpQkFBaUIsZ0NBQWdDLGVBQWUsd0JBQXdCLHFCQUFxQixJQUFJLGVBQWUsMERBQTBELGtCQUFrQixxQ0FBcUMsV0FBVyx1SEFBdUgsc0NBQXNDLGtEQUFrRCxlQUFlLDJDQUEyQyxjQUFjLHFFQUFxRSxjQUFjLDRCQUE0Qix1SEFBdUgsbURBQW1ELEdBQUcsY0FBYywwQkFBMEIsMkRBQTJELHVHQUF1RyxHQUFHLGNBQWMsTUFBTSx3Q0FBd0Msa0dBQWtHLHVCQUF1QiwwQkFBMEIsR0FBRyxJQUFJLGVBQWUscUlBQXFJLCtCQUErQixlQUFlLGlDQUFpQyx1QkFBdUIsZUFBZSwrQkFBK0IsY0FBYyw4QkFBOEIsT0FBTyxvS0FBb0ssZUFBZSx3SEFBd0gsOEJBQThCLGVBQWUsa0JBQWtCLGlCQUFpQiwrRkFBK0YsV0FBVyxpQkFBaUIsZ0JBQWdCLG1CQUFtQiwyQkFBMkIsa0JBQWtCLDJCQUEyQixTQUFTLGtEQUFrRCwwQ0FBMEMsb0JBQW9CLHNDQUFzQyxvQkFBb0IsY0FBYyxLQUFLLGNBQWMsd0NBQXdDLGlCQUFpQixJQUFJLEtBQUssc0NBQXNDLHlDQUF5Qyw0Q0FBNEMsUUFBUSw4Q0FBOEMsRUFBRSxvQkFBb0IsZUFBZSxpQkFBaUIsWUFBWSxvQkFBb0Isa0JBQWtCLE1BQU0saURBQWlELGNBQWMsMEJBQTBCLHVEQUF1RCxlQUFlLGtEQUFrRCxRQUFRLG9TQUFvUyxLQUFLLHFCQUFxQixJQUFJLGdDQUFnQyxTQUFTLGlCQUFpQixXQUFXLGlCQUFpQixXQUFXLDJCQUEyQixXQUFXLGlDQUFpQyx1R0FBdUcsZ0JBQWdCLG1CQUFtQixPQUFPLG9CQUFvQixZQUFZLG9CQUFvQixVQUFVLElBQUksZ0NBQWdDLGVBQWUsY0FBYyxxQ0FBcUMsY0FBYyxzRUFBc0UsOElBQThJLGtCQUFrQixpQ0FBaUMsa0NBQWtDLHNCQUFzQixFQUFFLGlFQUFlLENBQUMsRUFBQztBQUM1OFMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9ub2RlX21vZHVsZXMvLnBucG0va2Vlbi1zbGlkZXJANS41LjEvbm9kZV9tb2R1bGVzL2tlZW4tc2xpZGVyL2tlZW4tc2xpZGVyLmVzbS5qcz8xNGRkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICoga2Vlbi1zbGlkZXIgNS41LjFcbiAqIFRoZSBIVE1MIHRvdWNoIHNsaWRlciBjYXJvdXNlbCB3aXRoIHRoZSBtb3N0IG5hdGl2ZSBmZWVsaW5nIHlvdSB3aWxsIGdldC5cbiAqIGh0dHBzOi8va2Vlbi1zbGlkZXIuaW9cbiAqIENvcHlyaWdodCAyMDIwLTIwMjEgRXJpYyBCZXllciA8Y29udGFjdEBlcmljYmV5ZXIuZGU+XG4gKiBMaWNlbnNlOiBNSVRcbiAqIFJlbGVhc2VkIG9uOiAyMDIxLTA2LTEwXG4gKi9cblxuZnVuY3Rpb24gdCh0LG4sZSl7cmV0dXJuIG4gaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTplLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtuXT1lLHR9ZnVuY3Rpb24gbih0LG4pe3ZhciBlPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7biYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbikuZW51bWVyYWJsZX0pKSksZS5wdXNoLmFwcGx5KGUscil9cmV0dXJuIGV9ZnVuY3Rpb24gZShlKXtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgaT1udWxsIT1hcmd1bWVudHNbcl0/YXJndW1lbnRzW3JdOnt9O3IlMj9uKE9iamVjdChpKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dChlLG4saVtuXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhpKSk6bihPYmplY3QoaSkpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLHQpKX0pKX1yZXR1cm4gZX1mdW5jdGlvbiByKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBpKHQpfSh0KXx8ZnVuY3Rpb24odCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSlyZXR1cm4gQXJyYXkuZnJvbSh0KX0odCl8fGZ1bmN0aW9uKHQsbil7aWYoIXQpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBpKHQsbik7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO1wiT2JqZWN0XCI9PT1lJiZ0LmNvbnN0cnVjdG9yJiYoZT10LmNvbnN0cnVjdG9yLm5hbWUpO2lmKFwiTWFwXCI9PT1lfHxcIlNldFwiPT09ZSlyZXR1cm4gQXJyYXkuZnJvbSh0KTtpZihcIkFyZ3VtZW50c1wiPT09ZXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoZSkpcmV0dXJuIGkodCxuKX0odCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhh
12724dmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaSh0LG4peyhudWxsPT1ufHxuPnQubGVuZ3RoKSYmKG49dC5sZW5ndGgpO2Zvcih2YXIgZT0wLHI9bmV3IEFycmF5KG4pO2U8bjtlKyspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIG8odCl7dmFyIG4saSxvLGEsZixzLGwsZCxoLHYscCxtLGIsZyx3LHksTSxPLFMsQSxqLGsseCxQLEUsVCxELEMsTCxWLFgsWSx6LEgsST1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30scT1cImRhdGEta2Vlbi1zbGlkZXItbW92ZXNcIixGPVwiZGF0YS1rZWVuLXNsaWRlci12XCIsVz1bXSxfPW51bGwsTj0hMSxSPSExLFU9MCwkPVtdO2Z1bmN0aW9uIEIodCxuLGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTt0LmFkZEV2ZW50TGlzdGVuZXIobixlLHIpLFcucHVzaChbdCxuLGUscl0pfWZ1bmN0aW9uIEcodCl7aWYoTyYmUz09PVoodCkmJmZ0KCkpe3ZhciBlPW50KHQpLng7aWYoIXJ0KHQpJiZQKXJldHVybiBLKHQpO1AmJihOdCgpLEE9ZSxQPSExKSx0LmNhbmNlbGFibGUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgcj1BLWU7RSs9TWF0aC5hYnMociksIVQmJkU+NSYmKFQ9ITAsbi5zZXRBdHRyaWJ1dGUocSwhMCkpLFl0KHgocixKdCkqKGx0KCk/LTE6MSksdC50aW1lU3RhbXApLEE9ZX19ZnVuY3Rpb24gSih0KXtPfHwhZnQoKXx8ZXQodC50YXJnZXQpfHwoTz0hMCxQPSEwLFM9Wih0KSxUPSExLEU9MCxydCh0KSxwdCgpLE09dixBPW50KHQpLngsWXQoMCx0LnRpbWVTdGFtcCksdXQoXCJkcmFnU3RhcnRcIikpfWZ1bmN0aW9uIEsodCl7TyYmUz09PVoodCwhMCkmJmZ0KCkmJihuLnJlbW92ZUF0dHJpYnV0ZShxKSxPPSExLGd0KCksdXQoXCJkcmFnRW5kXCIpKX1mdW5jdGlvbiBRKHQpe3JldHVybiB0LmNoYW5nZWRUb3VjaGVzfWZ1bmN0aW9uIFoodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPW4/USh0KTp0dCh0KTtyZXR1cm4gZT9lWzBdP2VbMF0uaWRlbnRpZmllcjpcImVycm9yXCI6XCJkZWZhdWx0XCJ9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQudGFyZ2V0VG91Y2hlc31mdW5jdGlvbiBudCh0KXt2YXIgbj10dCh0KTtyZXR1cm57eDpodCgpP24/blswXS5zY3JlZW5ZOnQucGFnZVk6bj9uWzBdLnNjcmVlblg6dC5wYWdlWCx0aW1lc3RhbXA6dC50aW1lU3RhbXB9fWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSh5LnByZXZlbnRFdmVudCl9ZnVuY3Rpb24gcnQodCl7dmFyIG49dHQodCk7aWYoIW4pcmV0dXJuITA7dmFyIGU9blswXSxyPWh0KCk/ZS5jbGllbnRZOmUuY2xpZW50WCxpPWh0KCk/ZS5jbGllbnRYOmUuY2xpZW50WSxvPXZvaWQgMCE9PWomJnZvaWQgMCE9PWsmJk1hdGguYWJzKGstaSk8PU1hdGguYWJzKGotcik7cmV0dXJuIGo9cixrPWksb31mdW5jdGlvbiBpdCh0KXtmdCgpJiZPJiZ0LnByZXZlbn
12724REZWZhdWx0KCl9ZnVuY3Rpb24gb3QoKXtCKHdpbmRvdyxcIm9yaWVudGF0aW9uY2hhbmdlXCIsRHQpLEIod2luZG93LFwicmVzaXplXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR0KCl9KSksQihuLFwiZHJhZ3N0YXJ0XCIsKGZ1bmN0aW9uKHQpe2Z0KCkmJnQucHJldmVudERlZmF1bHQoKX0pKSxCKG4sXCJtb3VzZWRvd25cIixKKSxCKHkuY2FuY2VsT25MZWF2ZT9uOndpbmRvdyxcIm1vdXNlbW92ZVwiLEcpLHkuY2FuY2VsT25MZWF2ZSYmQihuLFwibW91c2VsZWF2ZVwiLEspLEIod2luZG93LFwibW91c2V1cFwiLEspLEIobixcInRvdWNoc3RhcnRcIixKLHtwYXNzaXZlOiEwfSksQihuLFwidG91Y2htb3ZlXCIsRyx7cGFzc2l2ZTohMX0pLEIobixcInRvdWNoZW5kXCIsSyx7cGFzc2l2ZTohMH0pLEIobixcInRvdWNoY2FuY2VsXCIsSyx7cGFzc2l2ZTohMH0pLEIod2luZG93LFwid2hlZWxcIixpdCx7cGFzc2l2ZTohMX0pfWZ1bmN0aW9uIGF0KCl7Vy5mb3JFYWNoKChmdW5jdGlvbih0KXt0WzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIodFsxXSx0WzJdLHRbM10pfSkpLFc9W119ZnVuY3Rpb24gdXQodCl7eVt0XSYmeVt0XShKdCl9ZnVuY3Rpb24gY3QoKXtyZXR1cm4geS5jZW50ZXJlZH1mdW5jdGlvbiBmdCgpe3JldHVybiB2b2lkIDAhPT1pP2k6eS5jb250cm9sc31mdW5jdGlvbiBzdCgpe3JldHVybiB5Lmxvb3AmJm8+MX1mdW5jdGlvbiBsdCgpe3JldHVybiB5LnJ0bH1mdW5jdGlvbiBkdCgpe3JldHVybiF5Lmxvb3AmJnkucnViYmVyYmFuZH1mdW5jdGlvbiBodCgpe3JldHVybiEheS52ZXJ0aWNhbH1mdW5jdGlvbiB2dCgpe0Q9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShtdCl9ZnVuY3Rpb24gcHQoKXtEJiYod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKEQpLEQ9bnVsbCksQz1udWxsfWZ1bmN0aW9uIG10KHQpe0N8fChDPXQpO3ZhciBuPXQtQyxlPWJ0KG4pO2lmKG4+PVYpcmV0dXJuIFl0KEwtWSwhMSksSD9IKCk6dm9pZCB1dChcImFmdGVyQ2hhbmdlXCIpO3ZhciByPXp0KGUpO2lmKDA9PT1yfHxzdCgpfHxkdCgpfHx6KXtpZigwIT09ciYmZHQoKSYmIXopcmV0dXJuIFN0KCk7WSs9ZSxZdChlLCExKSx2dCgpfWVsc2UgWXQoZS1yLCExKX1mdW5jdGlvbiBidCh0KXtyZXR1cm4gTCpYKHQvViktWX1mdW5jdGlvbiBndCgpe3N3aXRjaCh1dChcImJlZm9yZUNoYW5nZVwiKSx5Lm1vZGUpe2Nhc2VcImZyZWVcIjpNdCgpO2JyZWFrO2Nhc2VcImZyZWUtc25hcFwiOk90KCk7YnJlYWs7Y2FzZVwic25hcFwiOmRlZmF1bHQ6d3QoKX19ZnVuY3Rpb24gd3QoKXt5dCgoMT09PWwmJjAhPT1wP006dikrTWF0aC5zaWduKHApKX1mdW5jdGlvbiB5dCh0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp5LmR1cmF0aW9uLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXSxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF0sbz1mdW5jdGlvbih0KXtyZXR1cm4gMSstLXQqdCp0KnQqdH07QXQoRnQodD1xdCh0LHIsaSkpLGUsbyxuKX1mdW5jdGlvbiBNdCgpe2lmKDA9PT1iKXJldHVybiEoIXp0KDApfHxzdCgpKSYmeXQodik7dmFyIHQ9eS5mcmljdGlvbi9NYXRoLnBvdyhNYXRoLmFicyhiKSwtLjUpO0F0KE1hdGgucG93KGIsMikvdCpNYXRoLnNpZ24oYiksNipNYXRoLmFicyhiL3QpLChmdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsNSl9KSl9ZnVuY3Rpb24gT3QoKXtpZigwPT09YilyZXR1cm4geXQodik7dmFyIHQ9eS5mcmljdGlvbi9NYXRoLnBvdyhNYXRoLmFicyhiKSwtLjUpLG49TWF0aC5wb3coYiwyKS90Kk1hdGguc2lnbihiKSxlPTYqTWF0aC5hYnMoYi90KSxyPShVK24pLyhzL2wpO0F0KCgtMT09PXA/TWF0aC5mbG9vcihyKTpNYXRoLmNlaWwocikpKihzL2wpLVUsZSwoZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LDUpfSkpfWZ1bmN0aW9uIFN0KCl7aWYocHQoKSwwPT09YilyZXR1cm4geXQodiwhMCk7dmFyIHQ9LjA0L01hdGgucG93KE1hdGguYWJzKGIpLC0uNSksbj1NYXRoLnBvdyhiLDIpL3QqTWF0aC5zaWduKGIpLGU9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSxyPWI7QXQobiwzKk1hdGguYWJzKHIvdCksZSwhMCwoZnVuY3Rpb24oKXtBdChGdChxdCh2KSksNTAwLGUsITApfSkpfWZ1bmN0aW9uIEF0KHQsbixlLHIsaSl7cHQoKSxMPXQsWT0wLFY9bixYPWUsej1yLEg9aSxDPW51bGwsdnQoKX1mdW5jdGlvbiBqdChl
12724KXt2YXIgcj11KHQpO3IubGVuZ3RoJiYobj1yWzBdLFR0KGUpLG90KCksdXQoXCJtb3VudGVkXCIpKX1mdW5jdGlvbiBrdCgpe3ZhciB0LG49SS5icmVha3BvaW50c3x8W107Zm9yKHZhciByIGluIG4pd2luZG93Lm1hdGNoTWVkaWEocikubWF0Y2hlcyYmKHQ9cik7aWYodD09PV8pcmV0dXJuITA7dmFyIGk9KF89dCk/bltfXTpJO2kuYnJlYWtwb2ludHMmJl8mJmRlbGV0ZSBpLmJyZWFrcG9pbnRzLHk9ZShlKGUoe30sR3QpLEkpLGkpLE49ITAsaD1udWxsLHV0KFwib3B0aW9uc0NoYW5nZWRcIiksRXQoKX1mdW5jdGlvbiB4dCh0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0KXJldHVybiB0KCk7dmFyIG49eS5hdXRvQWRqdXN0U2xpZGVzUGVyVmlldztufHwobz1NYXRoLm1heCh0LG8pKTt2YXIgZT1zdCgpJiZuP28tMTpvO3JldHVybiBjKHQsMSxNYXRoLm1heChlLDEpKX1mdW5jdGlvbiBQdCgpe2t0KCksUj0hMCx1dChcImNyZWF0ZWRcIil9ZnVuY3Rpb24gRXQodCxuKXt0JiYoST10KSxuJiYoXz1udWxsKSxDdCgpLGp0KG4pfWZ1bmN0aW9uIFR0KHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoO2lmKGt0KCkmJihlIT09aHx8dCkpe2g9ZTt2YXIgcj15LnNsaWRlcztcIm51bWJlclwiPT10eXBlb2Ygcj8oZj1udWxsLG89cik6KGY9dShyLG4pLG89Zj9mLmxlbmd0aDowKTt2YXIgaT15LmRyYWdTcGVlZDt4PVwiZnVuY3Rpb25cIj09dHlwZW9mIGk/aTpmdW5jdGlvbih0KXtyZXR1cm4gdCppfSxzPWh0KCk/bi5vZmZzZXRIZWlnaHQ6bi5vZmZzZXRXaWR0aCxsPXh0KHkuc2xpZGVzUGVyVmlldyksZD1jKHkuc3BhY2luZywwLHMvKGwtMSktMSkscys9ZCxhPWN0KCk/KHMvMi1zL2wvMikvczowLFZ0KCk7dmFyIHA9IVJ8fE4mJnkucmVzZXRTbGlkZT95LmluaXRpYWw6djtCdChzdCgpP3A6SHQocCkpLGh0KCkmJm4uc2V0QXR0cmlidXRlKEYsITApLE49ITF9fWZ1bmN0aW9uIER0KHQpe1R0KCksc2V0VGltZW91dChUdCw1MDApLHNldFRpbWVvdXQoVHQsMmUzKX1mdW5jdGlvbiBDdCgpe2F0KCksWHQoKSxuJiZuLmhhc0F0dHJpYnV0ZShGKSYmbi5yZW1vdmVBdHRyaWJ1dGUoRiksdXQoXCJkZXN0cm95ZWRcIil9ZnVuY3Rpb24gTHQoKXtmJiZmLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGU9Z1tuXS5kaXN0YW5jZSpzLW4qKHMvbC1kL2wtZC9sKihsLTEpKSxyPWh0KCk/MDplLGk9aHQoKT9lOjAsbz1cInRyYW5zbGF0ZTNkKFwiLmNvbmNhdChyLFwicHgsIFwiKS5jb25jYXQoaSxcInB4LCAwKVwiKTt0LnN0eWxlLnRyYW5zZm9ybT1vLHQuc3R5bGVbXCItd2Via2l0LXRyYW5zZm9ybVwiXT1vfSkpfWZ1bmN0aW9uIFZ0KCl7ZiYmZi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj1cImNhbGMoXCIuY29uY2F0KDEwMC9sLFwiJSAtIFwiKS5jb25jYXQoZC9sKihsLTEpLFwicHgpXCIpO2h0KCk/KHQuc3R5bGVbXCJtaW4taGVpZ2h0XCJdPW4sdC5zdHlsZVtcIm1heC1oZWlnaHRcIl09bik6KHQuc3R5bGVbXCJtaW4td2lkdGhcIl09bix0LnN0eWxlW1wibWF4LXdpZHRoXCJdPW4pfSkpfWZ1bmN0aW9uIFh0KCl7aWYoZil7dmFyIHQ9W1widHJhbnNmb3JtXCIsXCItd2Via2l0LXRyYW5zZm9ybVwiXTt0PVtdLmNvbmNhdChyKHQpLGh0P1tcIm1pbi1oZWlnaHRcIixcIm1heC1oZWlnaHRcIl06W1wibWluLXdpZHRoXCIsXCJtYXgtd2lkdGhcIl0pLGYuZm9yRWFjaCgoZnVuY3Rpb24obil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSkpfSkpfX1mdW5jdGlvbiBZdCh0KXt2YXIgbj0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOkRhdGUubm93KCk7X3QodCxlKSxuJiYodD1VdCh0KSksVSs9dCxSdCgpfWZ1bmN0aW9uIHp0KHQpe3ZhciBuPXMqKG8tMSooY3QoKT8xOmwpKS9sLGU9VSt0O3JldHVybiBlPm4/ZS1uOmU8MD9lOjB9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIGModCwwLG8tMS0oY3QoKT8wOmwtMSkpfWZ1bmN0aW9uIEl0KCl7dmFyIHQ9TWF0aC5hYnModyksbj1VPDA/MS10OnQ7cmV0dXJue2RpcmVjdGlvbjpwLHByb2dyZXNzVHJhY2s6bixwcm9ncmVzc1NsaWRlczpuKm8vKG8tMSkscG9zaXRpb25zOmcscG9zaXRpb246VSxzcGVlZDpiLHJlbGF0aXZlU2xpZGU6KHYlbytvKSVvLGFic29sdXRlU2xpZGU6dixzaXplOm8sc2xpZGVzUGVyVmlldzpsLHdpZHRoT3JIZWlnaHQ6c319ZnVuY3Rpb24gcXQodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07cmV0dXJuIHN0KCk/bj9XdCh0LGUpOnQ6SHQodCl9ZnVuY3Rpb24gRnQodCl7cmV0dXJuLSgtcy9sKnQrVSl9ZnVuY3Rpb24gV3QodCxuKXt2YXIgZT0odiVvK28pJW8scj1lPCh0PSh0JW8rbyklbyk/LWUtbyt0Oi0oZS10KSxpPWU+dD9vLWUrdDp0LWUsYT1uP01hdGguYWJzKHIpPD1pP3I6aTp0PGU/cjppO3JldHVybiB2K2F9ZnVuY3Rpb24gX3QodCxuKXtjbGVhclRpbWVvdXQobSk7dmFyIGU9TWF0aC5zaWduKHQpO2lmKGUhPT1wJiZOdCgpLHA9ZSwkLnB1c2goe2Rpc3RhbmNlOnQsdGltZTpufSksbT1zZXRUaW1lb3V0KChmdW5jdGlvbigpeyQ9W10sYj0wfSksNTApLCgkPSQuc2xpY2UoLTYpKS5sZW5ndGg8PTF8fDA9PT1wKXJldHVybiBiPTA7dmFyIHI9JC5zbGljZSgwLC0xKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQrbi5kaXN0YW5jZX0pLDApLGk9JFskLmxlbmd0aC0xXS50aW1lLG89JFswXS50aW1lO2I9YyhyLyhpLW8pLC0xMCwxMCl9ZnVuY3Rpb24gTnQoKXskPVtdfWZ1bmN0aW9uIFJ0KCl7dz1zdCgpP1UlKHMqby9sKS8ocypvL2wpOlUvKHMqby9sKSwkdCgpO2Zvcih2YXIgdD1bXSxuPTA7bjxvO24rKyl7dmFyIGU9KDEvbypuLSh3PDAmJnN0KCk/dysxOncpKSpvL2wrYTtzdCgpJiYoZSs9ZT4oby0xKS9sPy1vL2w6ZTwtby9sKzE/by9sOjApO3ZhciByPTEvbCxpPWUrcix1PWk8cj9pL3I6aT4xPzEtKGktMSkqbC8xOjE7dC5wdXNoKHtwb3J0aW9uOnU8MHx8dT4xPzA6dSxkaXN0YW5jZTpsdCgpPy0xKmUrMS1yOmV9KX1nPXQsTHQoKSx1dChcIm1vdmVcIil9ZnVuY3Rpb24gVXQodCl7aWYoc3QoKSlyZXR1cm4gdDt2YXIgbj16dCh0KTtpZighZHQoKSlyZXR1cm4gdC1uO2lmKDA9PT1uKXJldHVybi
12724B0O3ZhciBlO3JldHVybiB0KihlPW4vcywoMS1NYXRoLmFicyhlKSkqKDEtTWF0aC5hYnMoZSkpKX1mdW5jdGlvbiAkdCgpe3ZhciB0PU1hdGgucm91bmQoVS8ocy9sKSk7dCE9PXYmJighc3QoKSYmKHQ8MHx8dD5vLTEpfHwodj10LHV0KFwic2xpZGVDaGFuZ2VkXCIpKSl9ZnVuY3Rpb24gQnQodCl7dXQoXCJiZWZvcmVDaGFuZ2VcIiksWXQoRnQodCksITEpLHV0KFwiYWZ0ZXJDaGFuZ2VcIil9dmFyIEd0PXthdXRvQWRqdXN0U2xpZGVzUGVyVmlldzohMCxjZW50ZXJlZDohMSxicmVha3BvaW50czpudWxsLGNvbnRyb2xzOiEwLGRyYWdTcGVlZDoxLGZyaWN0aW9uOi4wMDI1LGxvb3A6ITEsaW5pdGlhbDowLGR1cmF0aW9uOjUwMCxwcmV2ZW50RXZlbnQ6XCJkYXRhLWtlZW4tc2xpZGVyLXBlXCIsc2xpZGVzOlwiLmtlZW4tc2xpZGVyX19zbGlkZVwiLHZlcnRpY2FsOiExLHJlc2V0U2xpZGU6ITEsc2xpZGVzUGVyVmlldzoxLHNwYWNpbmc6MCxtb2RlOlwic25hcFwiLHJ0bDohMSxydWJiZXJiYW5kOiEwLGNhbmNlbE9uTGVhdmU6ITB9LEp0PXtjb250cm9sczpmdW5jdGlvbih0KXtpPXR9LGRlc3Ryb3k6Q3QscmVmcmVzaDpmdW5jdGlvbih0KXtFdCh0LCEwKX0sbmV4dDpmdW5jdGlvbigpe3l0KHYrMSwhMCl9LHByZXY6ZnVuY3Rpb24oKXt5dCh2LTEsITApfSxtb3ZlVG9TbGlkZTpmdW5jdGlvbih0LG4pe3l0KHQsITAsbil9LG1vdmVUb1NsaWRlUmVsYXRpdmU6ZnVuY3Rpb24odCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO3l0KHQsITAsZSwhMCxuKX0scmVzaXplOmZ1bmN0aW9uKCl7VHQoITApfSxkZXRhaWxzOmZ1bmN0aW9uKCl7cmV0dXJuIEl0KCl9LG9wdGlvbnM6ZnVuY3Rpb24oKXt2YXIgdD1lKHt9LHkpO3JldHVybiBkZWxldGUgdC5icmVha3BvaW50cyx0fX07cmV0dXJuIFB0KCksSnR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9ZnVuY3Rpb24gdSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ZG9jdW1lbnQ7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD9hKHQoKSk6XCJzdHJpbmdcIj09dHlwZW9mIHQ/YShuLnF1ZXJ5U2VsZWN0b3JBbGwodCkpOnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCE9ITE/W3RdOnQgaW5zdGFuY2VvZiBOb2RlTGlzdCE9ITE/dDpbXX1mdW5jdGlvbiBjKHQsbixlKXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodCxuKSxlKX1NYXRoLnNpZ258fChNYXRoLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuKHQ+MCktKHQ8MCl8fCt0fSk7ZXhwb3J0IGRlZmF1bHQgbztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtlZW4tc2xpZGVyLmVzbS5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 12725//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/keen-slider/keen-slider.esm.js 12726 12727}`)},"./src/styles/templates/blog/blog.scss"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 12728// extracted by mini-css-extract-plugin 12729//# sourceURL=[module] 12730//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3R5bGVzL3RlbXBsYXRlcy9ibG9nL2Jsb2cuc2NzcyIsIm1hcHBpbmdzIjoiO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AZ3JhZmlrci9ncmFmaWtycGxhdGUvLi9zcmMvc3R5bGVzL3RlbXBsYXRlcy9ibG9nL2Jsb2cuc2Nzcz82M2MwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 12731//# sourceURL=webpack-internal:///./src/styles/templates/blog/blog.scss 12732 12733}`)},"./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 12734/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12735/* harmony export */ component: () => (/* binding */ u), 12736/* harmony export */ picoapp: () => (/* binding */ c) 12737/* harmony export */ }); 12738var n=function(n){if("object"!=typeof(t=n)||Array.isArray(t))throw"state should be an object";var t},t=function(n,t,r,e){return(o=n,o.reduce(function(n,t,r){return n.indexOf(t)>-1?n:n.concat(t)},[])).reduce(function(n,r){return n.concat(t[r]||[])},[]).map(function(n){return n(r,e)});// removed by dead control flow 12739 var o; };function r(r){void 0===r&&(r={});var e={};return{getState:function(){return Object.assign({},r)},hydrate:function(o){return n(o),Object.assign(r,o),function(){var n=["*"].concat(Object.keys(o));t(n,e,r)}},on:function(n,t){return(n=[].concat(n)).map(function(n){return e[n]=(e[n]||[]).concat(t)}),function(){return n.map(function(n){return e[n].splice(e[n].indexOf(t),1)})}},emit:function(o,u,c){var i=("*"===o?[]:["*"]).concat(o);(u="function"==typeof u?u(r):u)&&(n(u),Object.assign(r,u),i=i.concat(Object.keys(u))),t(i,e,r,c)}}}r();var e=function(n){return"object"==typeof n&&!Array.isArray(n)},o=function(n){return"function"==typeof n};function u(n){return function(t,r){var e=[];return{subs:e,unmount:n(t,Object.assign({},r,{on:function(n,t){var o=r.on(n,t);return e.push(o),o}})),node:t}}}function c(n,t,u){void 0===n&&(n={}),void 0===t&&(t={}),void 0===u&&(u=[]);var c=r(t),i=[];return{on:c.on,emit:c.emit,getState:function(){return c.getState()},add:function(t){if(!e(t))throw"components should be an object";Object.assign(n,t)},use:function(n){if(!o(n))throw"plugins should be a function";u.push(n)},hydrate:function(n){return c.hydrate(n)},mount:function(t){void 0===t&&(t="data-component"),t=[].concat(t);for(var r=0;r<t.length;r++){for(var a=t[r],f=[].slice.call(document.querySelectorAll("["+a+"]")),s=function(){for(var t=f.pop(),r=t.getAttribute(a).split(/\\s
12739/),s=0;s<r.length;s++){var v=n[r[s]];if(v){t.removeAttribute(a);try{var d=u.reduce(function(n,r){var o=r(t,c);return e(o)?Object.assign(n,o):n},{}),m=v(t,Object.assign({},d,c));o(m.unmount)&&i.push(m)}catch(n){console.error(n),c.emit("error",{error:n}),c.hydrate({error:void 0})}}}};f.length;)s();c.emit("mount")}},unmount:function(){for(var n=i.length-1;n>-1;n--){var t=i[n],r=t.subs;(0,t.unmount)(t.node),r.map(function(n){return n()}),i.splice(n,1)}c.emit("unmount")}}} 12740//# sourceMappingURL=picoapp.es.js.map 12741//# sourceURL=[module] 12742//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vcGljb2FwcEAzLjYuMi9ub2RlX21vZHVsZXMvcGljb2FwcC9kaXN0L3BpY29hcHAuZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrQkFBa0IsNEVBQTRFLE1BQU0scUJBQXFCLG9DQUFvQyxxQ0FBcUMsMkJBQTJCLDBCQUEwQixxQkFBcUIsY0FBYyxFQUFFO0FBQUEsUUFBSyxFQUFFLGNBQWMsaUJBQWlCLEVBQUUsU0FBUyxPQUFPLG9CQUFvQix1QkFBdUIsSUFBSSxxQkFBcUIsMENBQTBDLG1DQUFtQyxVQUFVLGtCQUFrQix1Q0FBdUMsaUNBQWlDLGFBQWEseUJBQXlCLHNDQUFzQyxHQUFHLHNCQUFzQixtQ0FBbUMsbUdBQW1HLElBQUksa0JBQWtCLDRDQUE0QyxlQUFlLDRCQUE0QixjQUFjLHFCQUFxQixTQUFTLE9BQU8sbUNBQW1DLElBQUksaUJBQWlCLGdCQUFnQixvQkFBb0IsWUFBWSxrQkFBa0IsaUJBQWlCLG1CQUFtQixxQkFBcUIsZ0JBQWdCLE9BQU8sd0NBQXdDLG9CQUFvQixpQkFBaUIsK0NBQStDLG1CQUFtQixpQkFBaUIsNkNBQTZDLFVBQVUscUJBQXFCLG9CQUFvQixtQkFBbUIsZ0RBQWdELFlBQVksV0FBVyxLQUFLLGtGQUFrRixzREFBc0QsV0FBVyxLQUFLLGNBQWMsTUFBTSxxQkFBcUIsSUFBSSw2QkFBNkIsYUFBYSxpQ0FBaUMsR0FBRyx3QkFBd0IsT0FBTyx3QkFBd0IsU0FBUyxpQ0FBaUMsUUFBUSxhQUFhLGFBQWEsTUFBTSxTQUFTLEtBQUssaUJBQWlCLG9CQUFvQixxQkFBcUIsS0FBSyxLQUFLLG9CQUFvQix3Q0FBd0MsV0FBVyxnQkFBZ0Isb0JBQXdEO0FBQzFuRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS9waWNvYXBwQDMuNi4yL25vZGVfbW9kdWxlcy9waWNvYXBwL2Rpc3QvcGljb2FwcC5lcy5qcz9hYTliIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBuPWZ1bmN0aW9uKG4pe2lmKFwib2JqZWN0XCIhPXR5cGVvZih0PW4pfHxBcnJheS5pc0FycmF5KHQpKXRocm93XCJzdGF0ZSBzaG91bGQgYmUgYW4gb2JqZWN0XCI7dmFyIHR9LHQ9ZnVuY3Rpb24obix0LHIsZSl7cmV0dXJuKG89bixvLnJlZHVjZShmdW5jdGlvbihuLHQscil7cmV0dXJuIG4uaW5kZXhPZih0KT4tMT9uOm4uY29uY2F0KHQpfSxbXSkpLnJlZHVjZShmdW5jdGlvbihuLHIpe3JldHVybiBuLmNvbmNhdCh0W3JdfHxbXSl9LFtdKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ocixlKX0pO3ZhciBvfTtmdW5jdGlvbiByKHIpe3ZvaWQgMD09PXImJihyPXt9KTt2YXIgZT17fTtyZXR1cm57Z2V0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyKX0saHlkcmF0ZTpmdW5jdGlvbihvKXtyZXR1cm4gbihvKSxPYmplY3QuYXNzaWduKHIsbyksZnVuY3Rpb24oKXt2YXIgbj1bXCIqXCJdLmNvbmNhdChPYmplY3Qua2V5cyhvKSk7dChuLGUscil9fSxvbjpmdW5jdGlvbihuLHQpe3JldHVybihuPVtdLmNvbmNhdChuKSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBlW25dPShlW25dfHxbXSkuY29uY2F0KHQpfSksZnVuY3Rpb24oKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGVbbl0uc3BsaWNlKGVbbl0uaW5kZXhPZih0KSwxKX0pfX0sZW1pdDpmdW5jdGlvbihvLHUsYyl7dmFyIGk9KFwiKlwiPT09bz9bXTpbXCIqXCJdKS5jb25jYXQobyk7KHU9XCJmdW5jdGlvblwiPT10eXBlb2YgdT91KHIpOnUpJiYobih1KSxPYmplY3QuYXNzaWduKHIsdSksaT1pLmNvbmNhdChPYmplY3Qua2V5cyh1KSkpLHQoaSxlLHIsYyl9fX1yKCk7dmFyIGU9ZnVuY3Rpb24obil7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIG4mJiFBcnJheS5pc0FycmF5KG4pfSxvPWZ1bmN0aW9uKG4pe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG59O2Z1bmN0aW9uIHUobil7cmV0dXJuIGZ1bmN0aW9uKHQscil7dmFyIGU9W107cmV0dXJue3N1YnM6ZSx1bm1vdW50Om4odCxPYmplY3QuYXNzaWduKHt9LHIse29uOmZ1bmN0aW9uKG4sdCl7dmFyIG89ci5vbihuLHQpO3JldHVybiBlLnB1c2gobyksb319KSksbm9kZTp0fX19ZnVuY3Rpb24gYyhuLHQsdSl7dm9pZCAwPT09biYmKG49e30pLHZvaWQgMD09PXQmJih0PXt9KSx2b2lkIDA9PT11JiYodT1bXSk7dmFyIGM9cih0KSxpPVtdO3JldHVybntvbjpjLm9uLGVtaXQ6Yy5lbWl0LGdldFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZ2V0U3RhdGUoKX0sYWRkOmZ1bmN0aW9uKHQpe2lmKCFlKHQpKXRocm93XCJjb21wb25lbnRzIHNob3VsZCBiZSBhbiBvYmplY3RcIjtPYmplY3QuYXNzaWduKG4sdCl9LHVzZTpmdW5jdGlvbihuKXtpZighbyhuKSl0aHJvd1wicGx1Z2lucyBzaG91bGQgYmUgYSBmdW5jdGlvblwiO3UucHVzaChuKX0saHlkcmF0ZTpmdW5jdGlvbihuKXtyZXR1cm4gYy5oeWRyYXRlKG4pfSxtb3VudDpmdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD1cImRhdGEtY29tcG9uZW50XCIpLHQ9W10uY29uY2F0KHQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXtmb3IodmFyIGE9dFtyXSxmPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltcIithK1wiXVwiKSkscz1mdW5jdGlvbigpe2Zvcih2YXIgdD1mLnBvcCgpLHI9dC5nZXRBdHRyaWJ1dGUoYSkuc3BsaXQoL1xccy8pLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIHY9bltyW3NdXTtpZih2KXt0LnJlbW92ZUF0dHJpYnV0ZShhKTt0cnl7dmFyIGQ9dS5yZWR1Y2UoZnVuY3Rpb24obixyKXt2YXIgbz1yKHQsYyk7cmV0dXJuIGUobyk/T2JqZWN0LmFzc2lnbihuLG8pOm59LHt9KSxtPXYodCxPYmplY3QuYXNzaWduKHt9LGQsYykpO28obS51bm1vdW50KSYmaS5wdXNoKG0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IobiksYy5lbWl0KFwiZXJyb3JcIix7ZXJyb3I6bn0pLGMuaHlkcmF0ZSh7ZXJyb3I6dm9pZCAwfSl9fX19O2YubGVuZ3RoOylzKCk7Yy5lbWl0KFwibW91bnRcIil9fSx1bm1vdW50OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPWkubGVuZ3RoLTE7bj4tMTtuLS0pe3ZhciB0PWlbbl0scj10LnN1YnM7KDAsdC51bm1vdW50KSh0Lm5vZGUpLHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKCl9KSxpLnNwbGljZShuLDEpfWMuZW1pdChcInVubW91bnRcIil9fX1leHBvcnR7dSBhcyBjb21wb25lbnQsYyBhcyBwaWNvYXBwfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpY29hcHAuZXMuanMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= 12743//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/picoapp/dist/picoapp.es.js 12744 12745}`)},"./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js"(__unused_webpack_module,__webpack_exports__,__webpack_require__){eval(`{__webpack_require__.r(__webpack_exports__); 12746/* harmony export */ __webpack_require__.d(__webpack_exports__, { 12747/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) 12748/* harmony export */ }); 12749Object.defineProperty(__WEBPACK_DEFAULT_EXPORT__, "name", { value: "default", configurable: true }); 12750/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(n,t,r,u){return function(e,i){var o,a,c,f;return c=function m(d){return requestAnimationFrame(function(l){a||(a=l),o=l-a,f=Math.round(u(o,n,t-n,r)),(t>n?f<t&&d<=t:f>t&&d>=t)&&o<=r?(c=m(f),e(f)):(e(t),i&&i())})}(n),function(){cancelAnimationFrame(c)}}}; 12751//# sourceMappingURL=tinkerbell.es.js.map 12752//# sourceURL=[module] 12753//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvLnBucG0vdGlua2VyYmVsbEAwLjIuMC9ub2RlX21vZHVsZXMvdGlua2VyYmVsbC9kaXN0L3R
12753pbmtlcmJlbGwuZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBZSxvQ0FBUyxTQUFTLHFCQUFxQixZQUFZLHVCQUF1Qix5Q0FBeUMsc0dBQXNHLEVBQUUsZUFBZTtBQUN6UCIsInNvdXJjZXMiOlsid2VicGFjazovL0BncmFmaWtyL2dyYWZpa3JwbGF0ZS8uL25vZGVfbW9kdWxlcy8ucG5wbS90aW5rZXJiZWxsQDAuMi4wL25vZGVfbW9kdWxlcy90aW5rZXJiZWxsL2Rpc3QvdGlua2VyYmVsbC5lcy5qcz8wMGM5Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG4sdCxyLHUpe3JldHVybiBmdW5jdGlvbihlLGkpe3ZhciBvLGEsYyxmO3JldHVybiBjPWZ1bmN0aW9uIG0oZCl7cmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbihsKXthfHwoYT1sKSxvPWwtYSxmPU1hdGgucm91bmQodShvLG4sdC1uLHIpKSwodD5uP2Y8dCYmZDw9dDpmPnQmJmQ+PXQpJiZvPD1yPyhjPW0oZiksZShmKSk6KGUodCksaSYmaSgpKX0pfShuKSxmdW5jdGlvbigpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKGMpfX19O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGlua2VyYmVsbC5lcy5qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== 12754//# sourceURL=webpack-internal:///./node_modules/.pnpm/[email protected]/node_modules/tinkerbell/dist/tinkerbell.es.js 12755 12756}`)}},__webpack_module_cache__={};function __webpack_require__(moduleId){var cachedModule=__webpack_module_cache__[moduleId];if(cachedModule!==void 0)return cachedModule.exports;var module=__webpack_module_cache__[moduleId]={exports:{}};if(!(moduleId in __webpack_modules__)){delete __webpack_module_cache__[moduleId];var e=new Error("Cannot find module '"+moduleId+"'");throw e.code="MODULE_NOT_FOUND",e}return __webpack_modules__[moduleId](module,module.exports,__webpack_require__),module.exports}__webpack_require__.d=(exports,definition)=>{for(var key in definition)__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports,key)&&Object.defineProperty(exports,key,{enumerable:!0,get:definition[key]})},__webpack_require__.o=(obj,prop)=>Object.prototype.hasOwnProperty.call(obj,prop),__webpack_require__.r=exports=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__("./src/scripts/components/blog.js")})(); 12757//# sourceMappingURL=/cdn/shop/t/98/assets/blog.js.map?v=163347683708985164161788850462
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.