1(function(){var __webpack_modules__={
vendor: 18,178 bytes, line 1
1"./node_modules/@pixelunion/age-gate/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "PageAgeGate": () => (/* binding */ PageAgeGate),\n/* harmony export */ "SiteAgeGate": () => (/* binding */ SiteAgeGate)\n/* harmony export */ });\n\n/*!\n * @pixelunion/age-gate v1.2.0\n * (c) 2025 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, "prototype", {\n writable: false\n });\n return Constructor;\n}\n\nvar scrollLock = __webpack_require__(/*! scroll-lock */ "./node_modules/scroll-lock/dist/scroll-lock.js");\n\n// Bot patterns from isbot v5.1.32\'s patterns.json (copied as JavaScript array)\nvar botPatterns = [" daum[ /]", " deusu/", "(?:^|[^g])news(?!sapphire)", "(?<! (?:channel/|google/))google(?!(app|/google| pixel))", "(?<! cu)bots?(?:\\\\b|_)", "(?<!(?:lib))http", "(?<![hg]m)score", "(?<!cam)scan", "24x7", "@[a-z][\\\\w-]+\\\\.", "\\\\(\\\\)", "\\\\.com\\\\b", "\\\\bperl\\\\b", "\\\\btime/", "\\\\|", "^[\\\\w \\\\.\\\\-\\\\(?:\\\\):%]+(?:/v?\\\\d+(?:\\\\.\\\\d+)?(?:\\\\.\\\\d{1,10})*?)?(?:,|$)", "^[^ ]{50,}$", "^\\\\d+\\\\b", "^\\\\W", "^\\\\w*search\\\\b", "^\\\\w+/[\\\\w\\\\(\\\\)]*$", "^active", "^ad muncher", "^amaya", "^avsdevicesdk/", "^azure", "^biglotron", "^bot", "^bw/", "^clamav[ /]", "^client/", "^cobweb/", "^custom", "^ddg[_-]android", "^discourse", "^dispatch/\\\\d", "^downcast/", "^duckduckgo", "^email", "^facebook", "^getright/", "^gozilla/", "^hobbit", "^hotzonu", "^hwcdn/", "^igetter/", "^jeode/", "^jetty/", "^jigsaw", "^microsoft bits", "^movabletype", "^mozilla/\\\\d\\\\.\\\\d\\\\s[\\\\w\\\\.-]+$", "^mozilla/\\\\d\\\\.\\\\d\\\\s\\\\(compatible;?(?:\\\\s\\\\w+\\\\/\\\\d+\\\\.\\\\d+)?\\\\)$", "^navermailapp", "^netsurf", "^offline", "^openai/", "^owler", "^php", "^postman", "^python", "^rank", "^read", "^reed", "^rest", "^rss", "^snapchat", "^space bison", "^svn", "^swcd ", "^taringa", "^thumbor/", "^track", "^w3c", "^webbandit/", "^webcopier", "^wget", "^whatsapp", "^wordpress", "^xenu link sleuth", "^yahoo", "^yandex", "^zdm/\\\\d", "^zoom marketplace/", "agent\\\\b", "analyzer", "archive", "ask jeeves/teoma", "audit", "bit\\\\.ly/", "bluecoat drtr", "browsex", "burpcollaborator", "capture", "catch", "check\\\\b", "checker", "chrome-lighthouse", "chromeframe", "classifier", "cloudflare", "convertify", "crawl", "cypress/", "dareboost", "datanyze", "dejaclick", "detect", "dmbrowser", "download", "evc-batch/", "exaleadcloudview", "feed", "fetcher", "firephp", "functionize", "grab", "headless", "httrack", "hubspot marketing grader", "hydra", "ibisbrowser", "infrawatch", "insight", "inspect", "iplabel", "java(?!;)", "library", "linkcheck", "mail\\\\.ru/", "manager", "measure", "neustar wpm", "node\\\\b", "nutch", "offbyone", "onetrust", "optimize", "pageburst", "pagespeed", "parser", "phantomjs", "pingdom", "powermarks", "preview", "proxy", "ptst[ /]\\\\d", "retriever", "rexx;", "rigor", "rss\\\\b", "scrape", "server", "sogou", "sparkler/", "speedcurve", "spider", "splash", "statuscake", "supercleaner", "synapse", "synthetic", "tools", "torrent", "transcoder", "url", "validator", "virtuoso", "wappalyzer", "webglance", "webkit2png", "whatcms/", "xtate/"];\n\n//Check if the user agent is a bot/crawler\nfunction isBot(userAgent) {\n if (!userAgent) return false;\n\n // Create a single RegExp pattern from all patterns (same approach as isbot)\n var pattern = new RegExp(botPatterns.join(\'|\'), \'i\');\n return pattern.test(userAgent);\n}\nfunction getAge(birthdate) {\n var today = new Date();\n var age = today.getFullYear() - birthdate.getFullYear();\n var m = today.getMonth() - birthdate.getMonth();\n if (m < 0 || m === 0 && today.getDate() < birthdate.getDate()) {\n age--;\n }\n return age;\n}\nvar SiteAgeGate = /*#__PURE__*/function () {\n function SiteAgeGate(el) {\n _classCallCheck(this, SiteAgeGate);\n this._el = el;\n this._ageGateForm = el.querySelector(\'[data-age-gate]\');\n this._ageGateErrorEl = this._ageGateForm.querySelector(\'[data-age-gate-error]\');\n this._requiredAge = this._ageGateForm.dataset.requiredAge;\n this._el.addEventListener(\'age-gate:open\', this._open.bind(this));\n this._el.addEventListener(\'age-gate:close\', this._close.bind(this));\n this._ageGateForm.addEventListener(\'submit\', this._onFormSubmit.bind(this));\n if (isBot(navigator.userAgent)) {\n this._close();\n } else if (this._el.style.display === \'\') {\n this._open();\n }\n }\n _createClass(SiteAgeGate, [{\n key: "_open",\n value: function _open() {\n scrollLock.disablePageScroll();\n this._el.style.display = \'\';\n }\n }, {\n key: "_close",\n value: function _close() {\n scrollLock.enablePageScroll();\n this._el.style.display = \'none\';\n }\n }, {\n key: "_onFormSubmit",\n value: function _onFormSubmit(event) {\n event.preventDefault();\n event.stopPropagation();\n var data = new FormData(event.target);\n var day = data.get(\'day\');\n var month = data.get(\'month\');\n var year = data.get(\'year\');\n if (day === \'\' || month === \'\' || year === \'\') return;\n var age = getAge(new Date(year, month, day));\n if (age >= this._requiredAge) {\n this._close();\n sessionStorage.setItem(\'age-gate\', age);\n } else {\n this._ageGateErrorEl.style.display = \'\';\n }\n }\n }]);\n return SiteAgeGate;\n}();\n\nvar PageAgeGate = /*#__PURE__*/function () {\n function PageAgeGate() {\n _classCallCheck(this, PageAgeGate);\n this._ageGateEl = document.getElementById(\'age-gate-page\');\n }\n _createClass(PageAgeGate, [{\n key: "onSectionLoad",\n value: function onSectionLoad() {\n var openEvent = new CustomEvent(\'age-gate:open\');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(openEvent);\n }\n }\n }, {\n key: "onSectionSelect",\n value: function onSectionSelect() {\n var openEvent = new CustomEvent(\'age-gate:open\');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(openEvent);\n }\n }\n }, {\n key: "onSectionDeselect",\n value: function onSectionDeselect() {\n var closeEvent = new CustomEvent(\'age-gate:close\');\n if (this._ageGateEl) {\n this._ageGateEl.dispatchEvent(closeEvent);\n }\n }\n }]);\n return PageAgeGate;\n}();\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYWdlLWdhdGUvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL2FnZS1nYXRlL2Rpc3QvaW5kZXguZXMuanM/YWFmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qIVxuICogQHBpeGVsdW5pb24vYWdlLWdhdGUgdjEuMi4wXG4gKiAoYykgMjAyNSBQaXhlbCBVbmlvblxuICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbnZhciBzY3JvbGxMb2NrID0gcmVxdWlyZSgnc2Nyb2xsLWxvY2snKTtcblxuLy8gQm90IHBhdHRlcm5zIGZyb20gaXNib3QgdjUuMS4zMidzIHBhdHRlcm5zLmpzb24gKGNvcGllZCBhcyBKYXZhU2NyaXB0IGFycmF5KVxudmFyIGJvdFBhdHRlcm5zID0gW1wiIGRhdW1bIC9dXCIsIFwiIGRldXN1L1wiLCBcIig/Ol58W15nXSluZXdzKD8hc2FwcGhpcmUpXCIsIFwiKD88ISAoPzpjaGFubmVsL3xnb29nbGUvKSlnb29nbGUoPyEoYXBwfC9nb29nbGV8IHBpeGVsKSlcIiwgXCIoPzwhIGN1KWJvdHM/KD86XFxcXGJ8XylcIiwgXCIoPzwhKD86bGliKSlodHRwXCIsIFwiKD88IVtoZ11tKXNjb3JlXCIsIFwiKD88IWNhbSlzY2FuXCIsIFwiMjR4N1wiLCBcIkBbYS16XVtcXFxcdy1dK1xcXFwuXCIsIFwiXFxcXChcXFxcKVwiLCBcIlxcXFwuY29tXFxcXGJcIiwgXCJcXFxcYnBlcmxcXFxcYlwiLCBcIlxcXFxidGltZS9cIiwgXCJcXFxcfFwiLCBcIl5bXFxcXHcgXFxcXC5cXFxcLVxcXFwoPzpcXFxcKTolXSsoPzovdj9cXFxcZCsoPzpcXFxcLlxcXFxkKyk/KD86XFxcXC5cXFxcZHsxLDEwfSkqPyk/KD86LHwkKVwiLCBcIl5bXiBdezUwLH0kXCIsIFwiXlxcXFxkK1xcXFxiXCIsIFwiXlxcXFxXXCIsIFwiXlxcXFx3KnNlYXJjaFxcXFxiXCIsIFwiXlxcXFx3Ky9bXFxcXHdcXFxcKFxcXFwpXSokXCIsIFwiXmFjdGl2ZVwiLCBcIl5hZCBtdW5jaGVyXCIsIFwiXmFtYXlhXCIsIFwiXmF2c2RldmljZXNkay9cIiwgXCJeYXp1cmVcIiwgXCJeYmlnbG90cm9uXCIsIFwiXmJvdFwiLCBcIl5idy9cIiwgXCJeY2xhbWF2WyAvXVwiLCBcIl5jbGllbnQvXCIsIFwiXmNvYndlYi9cIiwgXCJeY3VzdG9tXCIsIFwiXmRkZ1tfLV1hbmRyb2lkXCIsIFwiXmRpc2NvdXJzZVwiLCBcIl5kaXNwYXRjaC9cXFxcZFwiLCBcIl5kb3duY2FzdC9cIiwgXCJeZHVja2R1Y2tnb1wiLCBcIl5lbWFpbFwiLCBcIl5mYWNlYm9va1wiLCBcIl5nZXRyaWdodC9cIiwgXCJeZ296aWxsYS9cIiwgXCJeaG9iYml0XCIsIFwiXmhvdHpvbnVcIiwgXCJeaHdjZG4vXCIsIFwiXmlnZXR0ZXIvXCIsIFwiXmplb2RlL1wiLCBcIl5qZXR0eS9cIiwgXCJeamlnc2F3XCIsIFwiXm1pY3Jvc29mdCBiaXRzXCIsIFwiXm1vdmFibGV0eXBlXCIsIFwiXm1vemlsbGEvXFxcXGRcXFxcLlxcXFxkXFxcXHNbXFxcXHdcXFxcLi1dKyRcIiwgXCJebW96aWxsYS9cXFxcZFxcXFwuXFxcXGRcXFxcc1xcXFwoY29tcGF0aWJsZTs/KD86XFxcXHNcXFxcdytcXFxcL1xcXFxkK1xcXFwuXFxcXGQrKT9cXFxcKSRcIiwgXCJebmF2ZXJtYWlsYXBwXCIsIFwiXm5ldHN1cmZcIiwgXCJeb2ZmbGluZVwiLCBcIl5vcGVuYWkvXCIsIFwiXm93bGVyXCIsIFwiXnBocFwiLCBcIl5wb3N0bWFuXCIsIFwiXnB5dGhvblwiLCBcIl5yYW5rXCIsIFwiXnJlYWRcIiwgXCJecmVlZFwiLCBcIl5yZXN0XCIsIFwiXnJzc1wiLCBcIl5zbmFwY2hhdFwiLCBcIl5zcGFjZSBiaXNvblwiLCBcIl5zdm5cIiwgXCJec3djZCBcIiwgXCJedGFyaW5nYVwiLCBcIl50aHVtYm9yL1wiLCBcIl50cmFja1wiLCBcIl53M2NcIiwgXCJed2ViYmFuZGl0L1wiLCBcIl53ZWJjb3BpZXJcIiwgXCJed2dldFwiLCBcIl53aGF0c2FwcFwiLCBcIl53b3JkcHJlc3NcIiwgXCJeeGVudSBsaW5rIHNsZXV0aFwiLCBcIl55YWhvb1wiLCBcIl55YW5kZXhcIiwgXCJeemRtL1xcXFxkXCIsIFwiXnpvb20gbWFya2V0cGxhY2UvXCIsIFwiYWdlbnRcXFxcYlwiLCBcImFuYWx5emVyXCIsIFwiYXJjaGl2ZVwiLCBcImFzayBqZWV2ZXMvdGVvbWFcIiwgXCJhdWRpdFwiLCBcImJpdFxcXFwubHkvXCIsIFwiYmx1ZWNvYXQgZHJ0clwiLCBcImJyb3dzZXhcIiwgXCJidXJwY29sbGFib3JhdG9yXCIsIFwiY2FwdHVyZVwiLCBcImNhdGNoXCIsIFwiY2hlY2tcXFxcYlwiLCBcImNoZWNrZXJcIiwgXCJjaHJvbWUtbGlnaHRob3VzZVwiLCBcImNocm9tZWZyYW1lXCIsIFwiY2xhc3NpZmllclwiLCBcImNsb3VkZmxhcmVcIiwgXCJjb252ZXJ0aWZ5XCIsIFwiY3Jhd2xcIiwgXCJjeXByZXNzL1wiLCBcImRhcmVib29zdFwiLCBcImRhdGFueXplXCIsIFwiZGVqYWNsaWNrXCIsIFwiZGV0ZWN0XCIsIFwiZG1icm93c2VyXCIsIFwiZG93bmxvYWRcIiwgXCJldmMtYmF0Y2gvXCIsIFwiZXhhbGVhZGNsb3Vkdmlld1wiLCBcImZlZWRcIiwgXCJmZXRjaGVyXCIsIFwiZmlyZXBocFwiLCBcImZ1bmN0aW9uaXplXCIsIFwiZ3JhYlwiLCBcImhlYWRsZXNzXCIsIFwiaHR0cmFja1wiLCBcImh1YnNwb3QgbWFya2V0aW5nIGdyYWRlclwiLCBcImh5ZHJhXCIsIFwiaWJpc2Jyb3dzZXJcIiwgXCJpbmZyYXdhdGNoXCIsIFwiaW5zaWdodFwiLCBcImluc3BlY3RcIiwgXCJpcGxhYmVsXCIsIFwiamF2YSg/ITspXCIsIFwibGlicmFyeVwiLCBcImxpbmtjaGVja1wiLCBcIm1haWxcXFxcLnJ1L1wiLCBcIm1hbmFnZXJcIiwgXCJtZWFzdXJlXCIsIFwibmV1c3RhciB3cG1cIiwgXCJub2RlXFxcXGJcIiwgXCJudXRjaFwiLCBcIm9mZmJ5b25lXCIsIFwib25ldHJ1c3RcIiwgXCJvcHRpbWl6ZVwiLCBcInBhZ2VidXJzdFwiLCBcInBhZ2VzcGVlZFwiLCBcInBhcnNlclwiLCBcInBoYW50b21qc1wiLCBcInBpbmdkb21cIiwgXCJwb3dlcm1hcmtzXCIsIFwicHJldmlld1wiLCBcInByb3h5XCIsIFwicHRzdFsgL11cXFxcZFwiLCBcInJldHJpZXZlclwiLCBcInJleHg7XCIsIFwicmlnb3JcIiwgXCJyc3NcXFxcYlwiLCBcInNjcmFwZVwiLCBcInNlcnZlclwiLCBcInNvZ291XCIsIFwic3BhcmtsZXIvXCIsIFwic3BlZWRjdXJ2ZVwiLCBcInNwaWRlclwiLCBcInNwbGFzaFwiLCBcInN0YXR1c2Nha2VcIiwgXCJzdXBlcmNsZWFuZXJcIiwgXCJzeW5hcHNlXCIsIFwic3ludGhldGljXCIsIFwidG9vbHNcIiwgXCJ0b3JyZW50XCIsIFwidHJhbnNjb2RlclwiLCBcInVybFwiLCBcInZhbGlkYXRvclwiLCBcInZpcnR1b3NvXCIsIFwid2FwcGFseXplclwiLCBcIndlYmdsYW5jZVwiLCBcIndlYmtpdDJwbmdcIiwgXCJ3aGF0Y21zL1wiLCBcInh0YXRlL1wiXTtcblxuLy9DaGVjayBpZiB0aGUgdXNlciBhZ2VudCBpcyBhIGJvdC9jcmF3bGVyXG5mdW5jdGlvbiBpc0JvdCh1c2VyQWdlbnQpIHtcbiAgaWYgKCF1c2VyQWdlbnQpIHJldHVybiBmYWxzZTtcblxuICAvLyBDcmVhdGUgYSBzaW5nbGUgUmVnRXhwIHBhdHRlcm4gZnJvbSBhbGwgcGF0dGVybnMgKHNhbWUgYXBwcm9hY2ggYXMgaXNib3QpXG4gIHZhciBwYXR0ZXJuID0gbmV3IFJlZ0V4cChib3RQYXR0ZXJucy5qb2luKCd8JyksICdpJyk7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodXNlckFnZW50KTtcbn1cbmZ1bmN0aW9uIGdldEFnZShiaXJ0aGRhdGUpIHtcbiAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgdmFyIGFnZSA9IHRvZGF5LmdldEZ1bGxZZWFyKCkgLSBiaXJ0aGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIG0gPSB0b2RheS5nZXRNb250aCgpIC0gYmlydGhkYXRlLmdldE1vbnRoKCk7XG4gIGlmIChtIDwgMCB8fCBtID09PSAwICYmIHRvZGF5LmdldERhdGUoKSA8IGJpcnRoZGF0ZS5nZXREYXRlKCkpIHtcbiAgICBhZ2UtLTtcbiAgfVxuICByZXR1cm4gYWdlO1xufVxudmFyIFNpdGVBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2l0ZUFnZUdhdGUoZWwpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2l0ZUFnZUdhdGUpO1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fYWdlR2F0ZUZvcm0gPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hZ2UtZ2F0ZV0nKTtcbiAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbCA9IHRoaXMuX2FnZUdhdGVGb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFnZS1nYXRlLWVycm9yXScpO1xuICAgIHRoaXMuX3JlcXVpcmVkQWdlID0gdGhpcy5fYWdlR2F0ZUZvcm0uZGF0YXNldC5yZXF1aXJlZEFnZTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpvcGVuJywgdGhpcy5fb3Blbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdhZ2UtZ2F0ZTpjbG9zZScsIHRoaXMuX2Nsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2FnZUdhdGVGb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuX29uRm9ybVN1Ym1pdC5iaW5kKHRoaXMpKTtcbiAgICBpZiAoaXNCb3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID09PSAnJykge1xuICAgICAgdGhpcy5fb3BlbigpO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoU2l0ZUFnZUdhdGUsIFt7XG4gICAga2V5OiBcIl9vcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vcGVuKCkge1xuICAgICAgc2Nyb2xsTG9jay5kaXNhYmxlUGFnZVNjcm9sbCgpO1xuICAgICAgdGhpcy5fZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlKCkge1xuICAgICAgc2Nyb2xsTG9jay5lbmFibGVQYWdlU2Nyb2xsKCk7XG4gICAgICB0aGlzLl9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25Gb3JtU3VibWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciBkYXRhID0gbmV3IEZvcm1EYXRhKGV2ZW50LnRhcmdldCk7XG4gICAgICB2YXIgZGF5ID0gZGF0YS5nZXQoJ2RheScpO1xuICAgICAgdmFyIG1vbnRoID0gZGF0YS5nZXQoJ21vbnRoJyk7XG4gICAgICB2YXIgeWVhciA9IGRhdGEuZ2V0KCd5ZWFyJyk7XG4gICAgICBpZiAoZGF5ID09PSAnJyB8fCBtb250aCA9PT0gJycgfHwgeWVhciA9PT0gJycpIHJldHVybjtcbiAgICAgIHZhciBhZ2UgPSBnZXRBZ2UobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpO1xuICAgICAgaWYgKGFnZSA+PSB0aGlzLl9yZXF1aXJlZEFnZSkge1xuICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdhZ2UtZ2F0ZScsIGFnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBTaXRlQWdlR2F0ZTtcbn0oKTtcblxudmFyIFBhZ2VBZ2VHYXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGFnZUFnZUdhdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhZ2VBZ2VHYXRlKTtcbiAgICB0aGlzLl9hZ2VHYXRlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWdlLWdhdGUtcGFnZScpO1xuICB9XG4gIF9jcmVhdGVDbGFzcyhQYWdlQWdlR2F0ZSwgW3tcbiAgICBrZXk6IFwib25TZWN0aW9uTG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25Mb2FkKCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25TZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uU2VsZWN0KCkge1xuICAgICAgdmFyIG9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudCgnYWdlLWdhdGU6b3BlbicpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChvcGVuRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblNlY3Rpb25EZXNlbGVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblNlY3Rpb25EZXNlbGVjdCgpIHtcbiAgICAgIHZhciBjbG9zZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdhZ2UtZ2F0ZTpjbG9zZScpO1xuICAgICAgaWYgKHRoaXMuX2FnZUdhdGVFbCkge1xuICAgICAgICB0aGlzLl9hZ2VHYXRlRWwuZGlzcGF0Y2hFdmVudChjbG9zZUV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIFBhZ2VBZ2VHYXRlO1xufSgpO1xuXG5leHBvcnQgeyBQYWdlQWdlR2F0ZSwgU2l0ZUFnZUdhdGUgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/age-gate/dist/index.es.js\n')},
vendor: 29,213 bytes, line 1
1"./node_modules/@pixelunion/animations/dist/animations.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "Animation": () => (/* binding */ Animation),\n/* harmony export */ "AnimationsManager": () => (/* binding */ AnimationsManager),\n/* harmony export */ "animation": () => (/* binding */ animation),\n/* harmony export */ "transition": () => (/* binding */ transition)\n/* harmony export */ });\n\n /*!\n * @pixelunion/animations v0.1.0\n * (c) 2019 Pixel Union\n * Released under the UNLICENSED license.\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(source, true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(source).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n/**\n * Promisified version of window.requestAnimationFrame.\n * @returns {Promise} Promise will resolve when requestAnimationFrame callback is run.\n */\nfunction raf() {\n return new Promise(function (resolve) {\n window.requestAnimationFrame(resolve);\n });\n}\n/**\n * Represents an HTML element with associate states\n */\n\n\nvar Animation =\n/*#__PURE__*/\nfunction () {\n /**\n * @param {Object} options\n * @param {HTMLElement} options.el Target element\n * @param {String} [options.state=initial] Initial state. This is also the default state.\n * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to\n * update with change of state.\n * @param {String} [options.endEvent=transitionend] Event to listen for at end of state change.\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n * @param {Function} [options.onStart] Callback to execute immediate after\n * applying stateChangeAttribute.\n */\n function Animation(options) {\n _classCallCheck(this, Animation);\n\n this._el = options.el;\n this.cancelRunning = null;\n this._state = options.state || \'initial\';\n this.initialState = this._state;\n this.stateAttribute = options.stateAttribute || \'data-animation-state\';\n this.stateChangeAttribute = options.stateChangeAttribute || \'data-animation\';\n this.endEvent = options.endEvent || \'transitionend\';\n this.hold = !!options.hold;\n\n this.onStart = options.onStart || function () {\n /* do nothing */\n };\n\n this.activeEventHandler = null;\n }\n /**\n * Returns target element\n *\n * @return {HTMLElement} Target element\n */\n\n\n _createClass(Animation, [{\n key: "isState",\n\n /**\n * Check if a state is active\n * @param {String} state State to compare\n *\n * @return {Boolean}\n */\n value: function isState(state) {\n return state === this._state;\n }\n /**\n * Sequences a change to a new state.\n * @param {String} state Target state\n *\n * @param {Boolean} options.force Switch to final state immediately\n *\n * @param {Function} options.onStart Callback to execute immediately after\n * applying stateChangeAttribute for this state change only.\n *\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the\n * next state change.\n *\n * @return {Promise} Resolves when endEvent triggered\n */\n\n }, {\n key: "animateTo",\n value: function animateTo(state) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var from = this._el.dataset[this.stateAttribute] || this._state;\n var to = state || this.initialState;\n var force = options.force;\n var hold = \'hold\' in options ? options.hold : this.hold;\n return new Promise(function (resolve) {\n if (_this.cancelRunning) {\n _this.cancelRunning();\n }\n\n if (from === to) {\n // Removing this here fixes some lingering attributes. But why?\n _this._el.removeAttribute(_this.stateChangeAttribute);\n\n resolve(from, null);\n return;\n }\n\n var running = true;\n\n _this.cancelRunning = function () {\n running = false;\n resolve(null, null);\n };\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = null;\n\n if (force) {\n _this._el.setAttribute(_this.stateChangeAttribute, "".concat(from, "=>").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === \'function\') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, null);\n return;\n }\n\n raf().then(function () {\n if (!running) throw new Error(\'cancelled\');\n\n _this._el.setAttribute(_this.stateChangeAttribute, "".concat(from, "=>").concat(to));\n\n _this.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n\n if (typeof options.onStart === \'function\') {\n options.onStart({\n el: _this._el,\n from: from,\n to: to\n });\n }\n\n return raf();\n }).then(function () {\n if (!running) throw new Error(\'cancelled\');\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this.activeEventHandler = function (e) {\n // Ignore any events bubbling up\n if (e.target !== _this._el || !running) return;\n\n _this._el.removeEventListener(_this.endEvent, _this.activeEventHandler);\n\n if (!hold) {\n _this._el.removeAttribute(_this.stateChangeAttribute);\n }\n\n resolve(to, e);\n };\n\n _this._el.addEventListener(_this.endEvent, _this.activeEventHandler);\n\n _this._el.setAttribute(_this.stateAttribute, to);\n\n _this._state = to;\n })["catch"](function (error) {\n // Only catch \'cancelled\' errors.\n if (error.message !== \'cancelled\') throw error;\n });\n });\n }\n /**\n * Remove any event listeners\n */\n\n }, {\n key: "unload",\n value: function unload() {\n this._el.removeEventListener(this.endEvent, this.activeEventHandler);\n\n this.activeEventHandler = null;\n }\n }, {\n key: "el",\n get: function get() {\n return this._el;\n }\n /**\n * Returns current state\n *\n * @return {String} Current state\n */\n\n }, {\n key: "state",\n get: function get() {\n return this._state;\n }\n }]);\n\n return Animation;\n}();\n\n/**\n * Manage state changes for a set of elements\n */\n\nvar AnimationsManager =\n/*#__PURE__*/\nfunction () {\n function AnimationsManager() {\n _classCallCheck(this, AnimationsManager);\n\n this.animations = new Map();\n }\n /**\n * Add a new element and return an animation for that element. If element already has an associated animation, return that animation.\n * @param {Object} options\n * @param {HTMLElement} options.el Target element\n * @param {String} [options.state=initial] Initial state. This is also the default state.\n * @param {String} [options.stateAttribute=data-revealer] Attribute name to update with state.\n * @param {String} [options.stateChangeAttribute=data-revealer-transition] Attribute name to update with change of state.\n * @param {String} [options.endEvent=transitionend] Event name to listen for at end of state change.\n * @param {Boolean} [options.hold=false] If true, changeAttribute will not be removed until the next state change.\n * @param {Function} [options.onStart] Callback to execute immediate after applying stateChangeAttribute.\n *\n * @return {Animation}\n */\n\n\n _createClass(AnimationsManager, [{\n key: "add",\n value: function add(options) {\n if (this.animations.has(options.el)) return this.animations.get(options.el);\n var animation = new Animation(options);\n this.animations.set(options.el, animation);\n return animation;\n }\n /**\n * Remove a single animation\n * @param {Animation} animation Animation to remove. Any event listeners will also be removed.\n */\n\n }, {\n key: "remove",\n value: function remove(animation) {\n this.animations["delete"](animation.el);\n animation.unload();\n }\n /**\n * Remove all animations, including all event listeners.\n */\n\n }, {\n key: "removeAll",\n value: function removeAll() {\n this.animations.forEach(function (animation) {\n return animation.unload();\n });\n }\n }]);\n\n return AnimationsManager;\n}();\n\nfunction animation(options) {\n var setOptions = {\n endEvent: \'animationend\',\n hold: true\n };\n return new Animation(_objectSpread2({\n options: options\n }, setOptions));\n}\n\nfunction transition(options) {\n return new Animation(options);\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vYW5pbWF0aW9ucy9kaXN0L2FuaW1hdGlvbnMuZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9hbmltYXRpb25zL2Rpc3QvYW5pbWF0aW9ucy5lcy5qcz9lOTU3Il0sInNvdXJjZXNDb250ZW50IjpbIlxuICAvKiFcbiAgICogQHBpeGVsdW5pb24vYW5pbWF0aW9ucyB2MC4xLjBcbiAgICogKGMpIDIwMTkgUGl4ZWwgVW5pb25cbiAgICogUmVsZWFzZWQgdW5kZXIgdGhlIFVOTElDRU5TRUQgbGljZW5zZS5cbiAgKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFByb21pc2lmaWVkIHZlcnNpb24gb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdpbGwgcmVzb2x2ZSB3aGVuIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBpcyBydW4uXG4gKi9cbmZ1bmN0aW9uIHJhZigpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShyZXNvbHZlKTtcbiAgfSk7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSFRNTCBlbGVtZW50IHdpdGggYXNzb2NpYXRlIHN0YXRlc1xuICovXG5cblxudmFyIEFuaW1hdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgb3B0aW9ucy5lbCBUYXJnZXQgZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGU9aW5pdGlhbF0gSW5pdGlhbCBzdGF0ZS4gVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlcl0gQXR0cmlidXRlIG5hbWUgdG8gdXBkYXRlIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZT1kYXRhLXJldmVhbGVyLXRyYW5zaXRpb25dIEF0dHJpYnV0ZSBuYW1lIHRvXG4gICAqIHVwZGF0ZSB3aXRoIGNoYW5nZSBvZiBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVuZEV2ZW50PXRyYW5zaXRpb25lbmRdIEV2ZW50IHRvIGxpc3RlbiBmb3IgYXQgZW5kIG9mIHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGVcbiAgICogbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3RhcnRdIENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlIGFmdGVyXG4gICAqIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gQW5pbWF0aW9uKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0aW9uKTtcblxuICAgIHRoaXMuX2VsID0gb3B0aW9ucy5lbDtcbiAgICB0aGlzLmNhbmNlbFJ1bm5pbmcgPSBudWxsO1xuICAgIHRoaXMuX3N0YXRlID0gb3B0aW9ucy5zdGF0ZSB8fCAnaW5pdGlhbCc7XG4gICAgdGhpcy5pbml0aWFsU3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICB0aGlzLnN0YXRlQXR0cmlidXRlID0gb3B0aW9ucy5zdGF0ZUF0dHJpYnV0ZSB8fCAnZGF0YS1hbmltYXRpb24tc3RhdGUnO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGUgPSBvcHRpb25zLnN0YXRlQ2hhbmdlQXR0cmlidXRlIHx8ICdkYXRhLWFuaW1hdGlvbic7XG4gICAgdGhpcy5lbmRFdmVudCA9IG9wdGlvbnMuZW5kRXZlbnQgfHwgJ3RyYW5zaXRpb25lbmQnO1xuICAgIHRoaXMuaG9sZCA9ICEhb3B0aW9ucy5ob2xkO1xuXG4gICAgdGhpcy5vblN0YXJ0ID0gb3B0aW9ucy5vblN0YXJ0IHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICB9O1xuXG4gICAgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRhcmdldCBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUYXJnZXQgZWxlbWVudFxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhBbmltYXRpb24sIFt7XG4gICAga2V5OiBcImlzU3RhdGVcIixcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3RhdGUgaXMgYWN0aXZlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIFN0YXRlIHRvIGNvbXBhcmVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzU3RhdGUoc3RhdGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZSA9PT0gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlcXVlbmNlcyBhIGNoYW5nZSB0byBhIG5ldyBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgVGFyZ2V0IHN0YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9wdGlvbnMuZm9yY2UgU3dpdGNoIHRvIGZpbmFsIHN0YXRlIGltbWVkaWF0ZWx5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLm9uU3RhcnQgQ2FsbGJhY2sgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseSBhZnRlclxuICAgICAqIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlIGZvciB0aGlzIHN0YXRlIGNoYW5nZSBvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGVcbiAgICAgKiBuZXh0IHN0YXRlIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gZW5kRXZlbnQgdHJpZ2dlcmVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhbmltYXRlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW5pbWF0ZVRvKHN0YXRlKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgZnJvbSA9IHRoaXMuX2VsLmRhdGFzZXRbdGhpcy5zdGF0ZUF0dHJpYnV0ZV0gfHwgdGhpcy5fc3RhdGU7XG4gICAgICB2YXIgdG8gPSBzdGF0ZSB8fCB0aGlzLmluaXRpYWxTdGF0ZTtcbiAgICAgIHZhciBmb3JjZSA9IG9wdGlvbnMuZm9yY2U7XG4gICAgICB2YXIgaG9sZCA9ICdob2xkJyBpbiBvcHRpb25zID8gb3B0aW9ucy5ob2xkIDogdGhpcy5ob2xkO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGlmIChfdGhpcy5jYW5jZWxSdW5uaW5nKSB7XG4gICAgICAgICAgX3RoaXMuY2FuY2VsUnVubmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgLy8gUmVtb3ZpbmcgdGhpcyBoZXJlIGZpeGVzIHNvbWUgbGluZ2VyaW5nIGF0dHJpYnV0ZXMuIEJ1dCB3aHk/XG4gICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSk7XG5cbiAgICAgICAgICByZXNvbHZlKGZyb20sIG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICBfdGhpcy5jYW5jZWxSdW5uaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXNvbHZlKG51bGwsIG51bGwpO1xuICAgICAgICB9O1xuXG4gICAgICAgIF90aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUNoYW5nZUF0dHJpYnV0ZSwgXCJcIi5jb25jYXQoZnJvbSwgXCI9PlwiKS5jb25jYXQodG8pKTtcblxuICAgICAgICAgIF90aGlzLm9uU3RhcnQoe1xuICAgICAgICAgICAgZWw6IF90aGlzLl9lbCxcbiAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vblN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU3RhcnQoe1xuICAgICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgICB0bzogdG9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl9lbC5zZXRBdHRyaWJ1dGUoX3RoaXMuc3RhdGVBdHRyaWJ1dGUsIHRvKTtcblxuICAgICAgICAgIF90aGlzLl9zdGF0ZSA9IHRvO1xuXG4gICAgICAgICAgaWYgKCFob2xkKSB7XG4gICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHRvLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByYWYoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIXJ1bm5pbmcpIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG5cbiAgICAgICAgICBfdGhpcy5fZWwuc2V0QXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlLCBcIlwiLmNvbmNhdChmcm9tLCBcIj0+XCIpLmNvbmNhdCh0bykpO1xuXG4gICAgICAgICAgX3RoaXMub25TdGFydCh7XG4gICAgICAgICAgICBlbDogX3RoaXMuX2VsLFxuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25TdGFydCh7XG4gICAgICAgICAgICAgIGVsOiBfdGhpcy5fZWwsXG4gICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgIHRvOiB0b1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJhZigpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIXJ1bm5pbmcpIHRocm93IG5ldyBFcnJvcignY2FuY2VsbGVkJyk7XG5cbiAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihfdGhpcy5lbmRFdmVudCwgX3RoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgICAgIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgYW55IGV2ZW50cyBidWJibGluZyB1cFxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBfdGhpcy5fZWwgfHwgIXJ1bm5pbmcpIHJldHVybjtcblxuICAgICAgICAgICAgX3RoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoX3RoaXMuZW5kRXZlbnQsIF90aGlzLmFjdGl2ZUV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICAgIGlmICghaG9sZCkge1xuICAgICAgICAgICAgICBfdGhpcy5fZWwucmVtb3ZlQXR0cmlidXRlKF90aGlzLnN0YXRlQ2hhbmdlQXR0cmlidXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0bywgZSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIF90aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKF90aGlzLmVuZEV2ZW50LCBfdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIpO1xuXG4gICAgICAgICAgX3RoaXMuX2VsLnNldEF0dHJpYnV0ZShfdGhpcy5zdGF0ZUF0dHJpYnV0ZSwgdG8pO1xuXG4gICAgICAgICAgX3RoaXMuX3N0YXRlID0gdG87XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBjYXRjaCAnY2FuY2VsbGVkJyBlcnJvcnMuXG4gICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgIT09ICdjYW5jZWxsZWQnKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVubG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuZW5kRXZlbnQsIHRoaXMuYWN0aXZlRXZlbnRIYW5kbGVyKTtcblxuICAgICAgdGhpcy5hY3RpdmVFdmVudEhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgc3RhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ3VycmVudCBzdGF0ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RhdGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0aW9uO1xufSgpO1xuXG4vKipcbiAqIE1hbmFnZSBzdGF0ZSBjaGFuZ2VzIGZvciBhIHNldCBvZiBlbGVtZW50c1xuICovXG5cbnZhciBBbmltYXRpb25zTWFuYWdlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFuaW1hdGlvbnNNYW5hZ2VyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRpb25zTWFuYWdlcik7XG5cbiAgICB0aGlzLmFuaW1hdGlvbnMgPSBuZXcgTWFwKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBlbGVtZW50IGFuZCByZXR1cm4gYW4gYW5pbWF0aW9uIGZvciB0aGF0IGVsZW1lbnQuIElmIGVsZW1lbnQgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBhbmltYXRpb24sIHJldHVybiB0aGF0IGFuaW1hdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIG9wdGlvbnMuZWwgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlPWluaXRpYWxdIEluaXRpYWwgc3RhdGUuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBzdGF0ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnN0YXRlQXR0cmlidXRlPWRhdGEtcmV2ZWFsZXJdIEF0dHJpYnV0ZSBuYW1lIHRvIHVwZGF0ZSB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc3RhdGVDaGFuZ2VBdHRyaWJ1dGU9ZGF0YS1yZXZlYWxlci10cmFuc2l0aW9uXSBBdHRyaWJ1dGUgbmFtZSB0byB1cGRhdGUgd2l0aCBjaGFuZ2Ugb2Ygc3RhdGUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5lbmRFdmVudD10cmFuc2l0aW9uZW5kXSBFdmVudCBuYW1lIHRvIGxpc3RlbiBmb3IgYXQgZW5kIG9mIHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ob2xkPWZhbHNlXSBJZiB0cnVlLCBjaGFuZ2VBdHRyaWJ1dGUgd2lsbCBub3QgYmUgcmVtb3ZlZCB1bnRpbCB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm9uU3RhcnRdIENhbGxiYWNrIHRvIGV4ZWN1dGUgaW1tZWRpYXRlIGFmdGVyIGFwcGx5aW5nIHN0YXRlQ2hhbmdlQXR0cmlidXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtBbmltYXRpb259XG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEFuaW1hdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKG9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmFuaW1hdGlvbnMuaGFzKG9wdGlvbnMuZWwpKSByZXR1cm4gdGhpcy5hbmltYXRpb25zLmdldChvcHRpb25zLmVsKTtcbiAgICAgIHZhciBhbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xuICAgICAgdGhpcy5hbmltYXRpb25zLnNldChvcHRpb25zLmVsLCBhbmltYXRpb24pO1xuICAgICAgcmV0dXJuIGFuaW1hdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc2luZ2xlIGFuaW1hdGlvblxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9ufSBhbmltYXRpb24gQW5pbWF0aW9uIHRvIHJlbW92ZS4gQW55IGV2ZW50IGxpc3RlbmVycyB3aWxsIGFsc28gYmUgcmVtb3ZlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnNbXCJkZWxldGVcIl0oYW5pbWF0aW9uLmVsKTtcbiAgICAgIGFuaW1hdGlvbi51bmxvYWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBhbmltYXRpb25zLCBpbmNsdWRpbmcgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUFsbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVBbGwoKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBhbmltYXRpb24udW5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0aW9uc01hbmFnZXI7XG59KCk7XG5cbmZ1bmN0aW9uIGFuaW1hdGlvbihvcHRpb25zKSB7XG4gIHZhciBzZXRPcHRpb25zID0ge1xuICAgIGVuZEV2ZW50OiAnYW5pbWF0aW9uZW5kJyxcbiAgICBob2xkOiB0cnVlXG4gIH07XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKF9vYmplY3RTcHJlYWQyKHtcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH0sIHNldE9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNpdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQW5pbWF0aW9uKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgeyBBbmltYXRpb24sIEFuaW1hdGlvbnNNYW5hZ2VyLCBhbmltYXRpb24sIHRyYW5zaXRpb24gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/animations/dist/animations.es.js\n')},
vendor: 3,817 bytes, line 1
1"./node_modules/@pixelunion/events/dist/EventHandler.js":function(__unused_webpack_module,exports){"use strict";eval("\nexports.__esModule = true;\nvar EventHandler = /** @class */ (function () {\n function EventHandler() {\n this.events = [];\n }\n EventHandler.prototype.register = function (el, event, listener) {\n if (!el || !event || !listener)\n return null;\n this.events.push({ el: el, event: event, listener: listener });\n el.addEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregister = function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n if (!el || !event || !listener)\n return null;\n this.events = this.events.filter(function (e) { return el !== e.el\n || event !== e.event || listener !== e.listener; });\n el.removeEventListener(event, listener);\n return { el: el, event: event, listener: listener };\n };\n EventHandler.prototype.unregisterAll = function () {\n this.events.forEach(function (_a) {\n var el = _a.el, event = _a.event, listener = _a.listener;\n return el.removeEventListener(event, listener);\n });\n this.events = [];\n };\n return EventHandler;\n}());\nexports.default = EventHandler;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGFyYWxsYXgvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vZXZlbnRzL2Rpc3QvRXZlbnRIYW5kbGVyLmpzP2Q1OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEV2ZW50SGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoZWwsIGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7IGVsOiBlbCwgZXZlbnQ6IGV2ZW50LCBsaXN0ZW5lcjogbGlzdGVuZXIgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBlbCA9IF9hLmVsLCBldmVudCA9IF9hLmV2ZW50LCBsaXN0ZW5lciA9IF9hLmxpc3RlbmVyO1xuICAgICAgICBpZiAoIWVsIHx8ICFldmVudCB8fCAhbGlzdGVuZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB0aGlzLmV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGVsICE9PSBlLmVsXG4gICAgICAgICAgICB8fCBldmVudCAhPT0gZS5ldmVudCB8fCBsaXN0ZW5lciAhPT0gZS5saXN0ZW5lcjsgfSk7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHsgZWw6IGVsLCBldmVudDogZXZlbnQsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIGVsID0gX2EuZWwsIGV2ZW50ID0gX2EuZXZlbnQsIGxpc3RlbmVyID0gX2EubGlzdGVuZXI7XG4gICAgICAgICAgICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudEhhbmRsZXI7XG59KCkpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBFdmVudEhhbmRsZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/events/dist/EventHandler.js\n")},
vendor: 55,096 bytes, line 1
1"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*!\n * @pixelunion/rimg-shopify v2.7.1\n * (c) 2023 Pixel Union\n */\n/*!\n * @pixelunion/rimg v2.2.2\n * (c) 2022 Pixel Union\n */\n\n/**\n * The default template render function. Turns a template string into an image\n * URL.\n *\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\nfunction defaultTemplateRender(template, size) {\n return template.replace('{size}', \"\".concat(size.width, \"x\").concat(size.height));\n}\n/**\n * @type Settings\n */\n\n\nvar defaults = {\n scale: 1,\n template: false,\n templateRender: defaultTemplateRender,\n max: {\n width: Infinity,\n height: Infinity\n },\n round: 32,\n placeholder: false,\n crop: null\n};\n/**\n * Get a data attribute value from an element, with a default fallback and\n * sanitization step.\n *\n * @param {Element} el\n *\n * @param {String} name\n * The data attribute name.\n *\n * @param {Object} options\n * An object holding fallback values if the data attribute does not\n * exist. If this object doesn't have the property, we further fallback\n * to our defaults.\n *\n * @param {Function} [sanitize]\n * A function to sanitize the data attribute value with.\n *\n * @returns {String|*}\n */\n\nfunction getData(el, name, options, sanitize) {\n var attr = \"data-rimg-\".concat(name);\n if (!el.hasAttribute(attr)) return options[name] || defaults[name];\n var value = el.getAttribute(attr);\n return sanitize ? sanitize(value) : value;\n}\n/**\n * Sanitize data attributes that represent a size (in the form of `10x10`).\n *\n * @param {String} value\n * @returns {Object} An object with `width` and `height` properties.\n */\n\n\nfunction parseSize(value) {\n value = value.split('x');\n return {\n width: parseInt(value[0], 10),\n height: parseInt(value[1], 10)\n };\n}\n/**\n * Sanitize crop values to ensure they are valid, or null\n *\n * @param {String} value\n * @returns {Object} Shopify crop parameter ('top', 'center', 'bottom', 'left', 'right') or null, if an unsupported value is found\n */\n\n\nfunction processCropValue(value) {\n switch (value) {\n case 'top':\n case 'center':\n case 'bottom':\n case 'left':\n case 'right':\n return value;\n\n default:\n return null;\n }\n}\n/**\n * Loads information about an element.\n *\n * Options can be set on the element itself using data attributes, or through\n * the `options` parameter. Data attributes take priority.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n * @returns {Item}\n */\n\n\nfunction parseItem(el) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var isImage = el.hasAttribute('data-rimg-template');\n /**\n * @typedef {Settings} Item\n */\n\n return {\n el: el,\n // Type of element\n isImage: isImage,\n isBackgroundImage: isImage && el.tagName !== 'IMG',\n // Image scale\n scale: parseInt(getData(el, 'scale', options)),\n // Device density\n density: window.devicePixelRatio || 1,\n // Image template URL\n template: getData(el, 'template', options),\n templateRender: options.templateRender || defaults.templateRender,\n // Maximum image dimensions\n max: getData(el, 'max', options, parseSize),\n // Round image dimensions to the nearest multiple\n round: getData(el, 'round', options),\n // Placeholder image dimensions\n placeholder: getData(el, 'placeholder', options, parseSize),\n // Crop value; null if image is uncropped, otherwise equal to the Shopify crop parameter ('center', 'top', etc.)\n crop: getData(el, 'crop', options, processCropValue)\n };\n}\n/**\n * Round to the nearest multiple.\n *\n * This is so we don't tax the image server too much.\n *\n * @param {Number} size The size, in pixels.\n * @param {Number} [multiple] The multiple to round to the nearest.\n * @param {Number} [maxLimit] Maximum allowed value - value to return if rounded multiple is above this limit\n * @returns {Number}\n */\n\n\nfunction roundSize(size) {\n var multiple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 32;\n var maxLimit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n return size === 0 ? multiple : Math.min(Math.ceil(size / multiple) * multiple, maxLimit);\n}\n/**\n * Get the size of an element.\n *\n * If it is too small, it's parent element is checked, and so on. This helps\n * avoid the situation where an element doesn't have a size yet or is positioned\n * out of the layout.\n *\n * @param {HTMLElement} el\n * @return {Object} size\n * @return {Number} size.width The width, in pixels.\n * @return {Number} size.height The height, in pixels.\n */\n\n\nfunction getElementSize(el) {\n var size = {\n width: 0,\n height: 0\n };\n\n while (el) {\n size.width = el.offsetWidth;\n size.height = el.offsetHeight;\n if (size.width > 20 && size.height > 20) break;\n el = el.parentNode;\n }\n\n return size;\n}\n/**\n * Return the maximum supported density of the image, given the container.\n *\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction supportedDensity(item, size) {\n return Math.min(Math.min(Math.max(item.max.width / size.width, 1), item.density), Math.min(Math.max(item.max.height / size.height, 1), item.density)).toFixed(2);\n}\n/**\n * Trigger a custom event.\n *\n * Note: this approach is deprecated, but still required to support older\n * browsers such as IE 10.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events\n *\n * @param {HTMLElement} el\n * The element to trigger the event on.\n *\n * @param {String} name\n * The event name.\n *\n * @returns {Boolean}\n * True if the event was canceled.\n */\n\n\nfunction trigger(el, name) {\n var event = document.createEvent('Event');\n event.initEvent(name, true, true);\n return !el.dispatchEvent(event);\n}\n/**\n * Set the image URL on the element. Supports background images and `srcset`.\n *\n * @param {Item} item\n * @param {Size} size\n * @param {Boolean} isPlaceholder\n */\n\n\nfunction setImage(item, size, isPlaceholder, onLoad) {\n var render = item.templateRender;\n var density = isPlaceholder ? 1 : supportedDensity(item, size);\n var round = isPlaceholder ? 1 : item.round; // Calculate the final display size, taking into account the image's\n // maximum dimensions.\n\n var targetWidth = size.width * density;\n var targetHeight = size.height * density;\n var displaySize;\n\n if (item.crop) {\n displaySize = {\n width: roundSize(targetWidth, round, item.max.width),\n height: roundSize(targetHeight, round, item.max.height)\n };\n } else {\n // Shopify serves images clamped by the requested dimensions (fitted to the smallest dimension).\n // To get the desired and expected pixel density we need to request cover dimensions (fitted to largest dimension).\n // This isn't a problem with cropped images which are served at the exact dimension requested.\n var containerAspectRatio = size.width / size.height;\n var imageAspectRatio = item.max.width / item.max.height;\n\n if (containerAspectRatio > imageAspectRatio) {\n // fit width\n displaySize = {\n width: roundSize(targetWidth, round, item.max.width),\n height: roundSize(targetWidth / imageAspectRatio, round, item.max.height)\n };\n } else {\n // fit height\n displaySize = {\n width: roundSize(targetHeight * imageAspectRatio, round, item.max.width),\n height: roundSize(targetHeight, round, item.max.height)\n };\n }\n }\n\n var url = render(item.template, displaySize); // On load callback\n\n var image = new Image();\n image.onload = onLoad;\n image.src = url; // Set image\n\n if (item.isBackgroundImage) {\n item.el.style.backgroundImage = \"url('\".concat(url, \"')\");\n } else {\n item.el.setAttribute('srcset', \"\".concat(url, \" \").concat(density, \"x\"));\n }\n}\n/**\n * Load the image, set loaded status, and trigger the load event.\n *\n * @fires rimg:load\n * @fires rimg:error\n * @param {Item} item\n * @param {Size} size\n */\n\n\nfunction loadFullImage(item, size) {\n var el = item.el;\n setImage(item, size, false, function (event) {\n if (event.type === 'load') {\n el.setAttribute('data-rimg', 'loaded');\n } else {\n el.setAttribute('data-rimg', 'error');\n trigger(el, 'rimg:error');\n }\n\n trigger(el, 'rimg:load');\n });\n}\n/**\n * Load in a responsive image.\n *\n * Sets the image's `srcset` attribute to the final image URLs, calculated based\n * on the actual size the image is being shown at.\n *\n * @fires rimg:loading\n * The image URLs have been set and we are waiting for them to load.\n *\n * @fires rimg:loaded\n * The final image has loaded.\n *\n * @fires rimg:error\n * The final image failed loading.\n *\n * @param {Item} item\n */\n\n\nfunction loadImage(item) {\n var el = item.el; // Already loaded?\n\n var status = el.getAttribute('data-rimg');\n if (status === 'loading' || status === 'loaded') return; // Is the SVG loaded?\n // In Firefox, el.complete always returns true [citation needed, may not be the case anymore, Jan/2022]\n // so we also check el.naturalWidth, which equals 0 until the image loads\n\n if (!item.isBackgroundImage) {\n if (el.naturalWidth === 0 || !el.complete) {\n // Wait for the load event, then call load image\n el.addEventListener('load', function cb() {\n el.removeEventListener('load', cb);\n loadImage(item);\n });\n return;\n }\n } // Trigger loading event, and stop if cancelled\n\n\n if (trigger(el, 'rimg:loading')) return; // Mark as loading\n\n el.setAttribute('data-rimg', 'loading'); // Get element size. This is used as the ideal display size.\n\n var size = getElementSize(item.el);\n size.width *= item.scale;\n size.height *= item.scale;\n\n if (item.placeholder) {\n // Load a placeholder image first, followed by the full image. Force the\n // element to keep its dimensions while it loads. If the image is smaller\n // than the element size, use the image's size. Density is taken into account\n // for HiDPI devices to avoid blurry images.\n if (!item.isBackgroundImage) {\n el.setAttribute('width', Math.min(Math.floor(item.max.width / item.density), size.width));\n el.setAttribute('height', Math.min(Math.floor(item.max.height / item.density), size.height));\n }\n\n setImage(item, item.placeholder, true, function () {\n return loadFullImage(item, size);\n });\n } else {\n loadFullImage(item, size);\n }\n}\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n * The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction load(el, options) {\n if (!el) return;\n trigger(el, 'rimg:enter');\n var item = parseItem(el, options);\n\n if (item.isImage) {\n if (!item.isBackgroundImage) {\n el.setAttribute('data-rimg-template-svg', el.getAttribute('srcset'));\n }\n\n loadImage(item);\n }\n}\n/**\n * Reset an element's state so that its image can be recalculated.\n *\n * @fires rimg:update\n * The element is being updated.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\n\n\nfunction update(el, options) {\n if (!el) return;\n trigger(el, 'rimg:update');\n var item = parseItem(el, options);\n\n if (item.isImage) {\n if (!item.isBackgroundImage) {\n el.setAttribute('data-rimg', 'lazy');\n el.setAttribute('srcset', el.getAttribute('data-rimg-template-svg'));\n }\n\n loadImage(item);\n }\n}\n/**\n * Returns true if the element is within the viewport.\n * @param {HTMLElement} el\n * @returns {Boolean}\n */\n\n\nfunction inViewport(el) {\n if (!el.offsetWidth || !el.offsetHeight || !el.getClientRects().length) {\n return false;\n }\n\n var root = document.documentElement;\n var width = Math.min(root.clientWidth, window.innerWidth);\n var height = Math.min(root.clientHeight, window.innerHeight);\n var rect = el.getBoundingClientRect();\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= height && rect.left <= width;\n}\n/**\n * @typedef {Object} Size\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * A function to turn a template string into a URL.\n *\n * @callback TemplateRenderer\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\n\n/**\n * @typedef {Object} Settings\n *\n * @property {String} [template]\n * A template string used to generate URLs for an image. This allows us to\n * dynamically load images with sizes to match the container's size.\n *\n * @property {TemplateRenderer} [templateRender]\n * A function to turn a template string into a URL.\n *\n * @property {Size} [max]\n * The maximum available size for the image. This ensures we don't\n * try to load an image larger than is possible.\n * \n * @property {Number} [scale]\n * A number to scale the final image dimensions by. \n * Only applies to lazy-loaded images. Defaults to 1.\n *\n * @property {Number} [round]\n * Round image dimensions to the nearest multiple. This is intended to\n * tax the image server less by lowering the number of possible image\n * sizes requested.\n *\n * @property {Size} [placeholder]\n * The size of the lo-fi image to load before the full image.\n * \n * @property {String} [crop]\n * Crop value; null if image is uncropped, otherwise equal \n * to the Shopify crop parameter ('center', 'top', etc.).\n */\n\n/**\n * Initialize the responsive image handler.\n *\n * @param {String|HTMLElement|NodeList} selector\n * The CSS selector, element, or elements to track for lazy-loading.\n *\n * @param {Settings} options\n *\n * @returns {PublicApi}\n */\n\n\nfunction rimg() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Intersections\n\n var io = new IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(entry.target);\n load(entry.target, options);\n }\n });\n }, {\n // Watch the viewport, with 20% vertical margins\n rootMargin: '20% 0px'\n });\n /**\n * @typedef {Object} PublicApi\n */\n\n var api = {\n /**\n * Track a new selector, element, or nodelist for lazy-loading.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n track: function track() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n // If an element is already in the viewport, load it right away. This\n // fixes a race-condition with dynamically added elements.\n if (inViewport(els[i])) {\n load(els[i], options);\n } else {\n io.observe(els[i]);\n }\n }\n },\n\n /**\n * Update element(s) that have already been loaded to force their images\n * to be recalculated.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n update: function update$1() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"loaded\"]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n update(els[i], options);\n }\n },\n\n /**\n * Stop tracking element(s) for lazy-loading.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n untrack: function untrack() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n io.unobserve(els[i]);\n }\n },\n\n /**\n * Manually load images.\n * @type Function\n * @param {String|HTMLElement|NodeList} selector\n */\n load: function load$1() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n var els = querySelector(selector);\n\n for (var i = 0; i < els.length; i++) {\n load(els[i], options);\n }\n },\n\n /**\n * Unload all event handlers and observers.\n * @type Function\n */\n unload: function unload() {\n io.disconnect();\n }\n }; // Add initial elements\n\n api.track(selector);\n return api;\n}\n/**\n * Finds a group of elements on the page.\n *\n * @param {String|HTMLElement|NodeList} selector\n * @returns {Object} An array-like object.\n */\n\n\nfunction querySelector(selector) {\n if (typeof selector === 'string') {\n return document.querySelectorAll(selector);\n }\n\n if (selector instanceof HTMLElement) {\n return [selector];\n }\n\n if (selector instanceof NodeList) {\n return selector;\n }\n\n return [];\n}\n\n/**\n * Polyfill for Element.matches().\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n */\nif (!Element.prototype.matches) {\n Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n i = matches.length;\n\n while (--i >= 0 && matches.item(i) !== this) {}\n\n return i > -1;\n };\n}\n\nvar state = {\n init: init,\n watch: watch,\n unwatch: unwatch,\n load: load$1\n};\n\nfunction init() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n state.selector = selector;\n state.instance = rimg(selector, options);\n state.loadedWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Listen for Shopify theme editor events\n\n document.addEventListener('shopify:section:load', function (event) {\n return watch(event.target);\n });\n window.addEventListener('resize', function () {\n return _update();\n });\n document.addEventListener('shopify:section:unload', function (event) {\n return unwatch(event.target);\n }); // Listen for custom events to allow themes to hook into rimg\n\n document.addEventListener('theme:rimg:watch', function (event) {\n return watch(event.target);\n });\n document.addEventListener('theme:rimg:unwatch', function (event) {\n return unwatch(event.target);\n }); // Support custom events triggered through jQuery\n // See: https://github.com/jquery/jquery/issues/3347\n\n if (window.jQuery) {\n jQuery(document).on({\n 'theme:rimg:watch': function themeRimgWatch(event) {\n return watch(event.target);\n },\n 'theme:rimg:unwatch': function themeRimgUnwatch(event) {\n return unwatch(event.target);\n }\n });\n }\n}\n/**\n * Track an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction watch(el) {\n // Track element\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.track(el);\n } // Track element's children\n\n\n state.instance.track(el.querySelectorAll(state.selector));\n}\n/**\n * Untrack an element, and its children\n *\n * @param {HTMLElement} el\n * @private\n */\n\n\nfunction unwatch(el) {\n // Untrack element's children\n state.instance.untrack(el.querySelectorAll(state.selector)); // Untrack element\n\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.untrack(el);\n }\n}\n/**\n * Manually load an image\n *\n * @param {HTMLElement} el\n */\n\n\nfunction load$1(el) {\n // Load element\n if (typeof el.matches === 'function' && el.matches(state.selector)) {\n state.instance.load(el);\n } // Load element's children\n\n\n state.instance.load(el.querySelectorAll(state.selector));\n}\n/**\n * Update an element, and its children.\n *\n * @param {HTMLElement} el\n */\n\n\nfunction _update() {\n var currentWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); // Return if we're not 2x smaller, or larger than the existing loading size\n\n if (currentWidth / state.loadedWidth > 0.5 && currentWidth / state.loadedWidth < 2) {\n return;\n }\n\n state.loadedWidth = currentWidth;\n state.instance.update();\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (state);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5L2Rpc3QvaW5kZXguZXMuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL25vZGVfbW9kdWxlcy9AcGl4ZWx1bmlvbi9yaW1nLXNob3BpZnkvZGlzdC9pbmRleC5lcy5qcz9kOTJhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQHBpeGVsdW5pb24vcmltZy1zaG9waWZ5IHYyLjcuMVxuICogKGMpIDIwMjMgUGl4ZWwgVW5pb25cbiAqL1xuLyohXG4gKiBAcGl4ZWx1bmlvbi9yaW1nIHYyLjIuMlxuICogKGMpIDIwMjIgUGl4ZWwgVW5pb25cbiAqL1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbi4gVHVybnMgYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhbiBpbWFnZVxuICogVVJMLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBkZWZhdWx0VGVtcGxhdGVSZW5kZXIodGVtcGxhdGUsIHNpemUpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoJ3tzaXplfScsIFwiXCIuY29uY2F0KHNpemUud2lkdGgsIFwieFwiKS5jb25jYXQoc2l6ZS5oZWlnaHQpKTtcbn1cbi8qKlxuICogQHR5cGUgU2V0dGluZ3NcbiAqL1xuXG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgc2NhbGU6IDEsXG4gIHRlbXBsYXRlOiBmYWxzZSxcbiAgdGVtcGxhdGVSZW5kZXI6IGRlZmF1bHRUZW1wbGF0ZVJlbmRlcixcbiAgbWF4OiB7XG4gICAgd2lkdGg6IEluZmluaXR5LFxuICAgIGhlaWdodDogSW5maW5pdHlcbiAgfSxcbiAgcm91bmQ6IDMyLFxuICBwbGFjZWhvbGRlcjogZmFsc2UsXG4gIGNyb3A6IG51bGxcbn07XG4vKipcbiAqIEdldCBhIGRhdGEgYXR0cmlidXRlIHZhbHVlIGZyb20gYW4gZWxlbWVudCwgd2l0aCBhIGRlZmF1bHQgZmFsbGJhY2sgYW5kXG4gKiBzYW5pdGl6YXRpb24gc3RlcC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgZGF0YSBhdHRyaWJ1dGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIEFuIG9iamVjdCBob2xkaW5nIGZhbGxiYWNrIHZhbHVlcyBpZiB0aGUgZGF0YSBhdHRyaWJ1dGUgZG9lcyBub3RcbiAqICAgICAgICBleGlzdC4gSWYgdGhpcyBvYmplY3QgZG9lc24ndCBoYXZlIHRoZSBwcm9wZXJ0eSwgd2UgZnVydGhlciBmYWxsYmFja1xuICogICAgICAgIHRvIG91ciBkZWZhdWx0cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbc2FuaXRpemVdXG4gKiAgICAgICAgQSBmdW5jdGlvbiB0byBzYW5pdGl6ZSB0aGUgZGF0YSBhdHRyaWJ1dGUgdmFsdWUgd2l0aC5cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfCp9XG4gKi9cblxuZnVuY3Rpb24gZ2V0RGF0YShlbCwgbmFtZSwgb3B0aW9ucywgc2FuaXRpemUpIHtcbiAgdmFyIGF0dHIgPSBcImRhdGEtcmltZy1cIi5jb25jYXQobmFtZSk7XG4gIGlmICghZWwuaGFzQXR0cmlidXRlKGF0dHIpKSByZXR1cm4gb3B0aW9uc1tuYW1lXSB8fCBkZWZhdWx0c1tuYW1lXTtcbiAgdmFyIHZhbHVlID0gZWwuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICByZXR1cm4gc2FuaXRpemUgPyBzYW5pdGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbi8qKlxuICogU2FuaXRpemUgZGF0YSBhdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IGEgc2l6ZSAoaW4gdGhlIGZvcm0gb2YgYDEweDEwYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzLlxuICovXG5cblxuZnVuY3Rpb24gcGFyc2VTaXplKHZhbHVlKSB7XG4gIHZhbHVlID0gdmFsdWUuc3BsaXQoJ3gnKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcGFyc2VJbnQodmFsdWVbMF0sIDEwKSxcbiAgICBoZWlnaHQ6IHBhcnNlSW50KHZhbHVlWzFdLCAxMClcbiAgfTtcbn1cbi8qKlxuICogU2FuaXRpemUgY3JvcCB2YWx1ZXMgdG8gZW5zdXJlIHRoZXkgYXJlIHZhbGlkLCBvciBudWxsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTaG9waWZ5IGNyb3AgcGFyYW1ldGVyICgndG9wJywgJ2NlbnRlcicsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCcpIG9yIG51bGwsIGlmIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGlzIGZvdW5kXG4gKi9cblxuXG5mdW5jdGlvbiBwcm9jZXNzQ3JvcFZhbHVlKHZhbHVlKSB7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogTG9hZHMgaW5mb3JtYXRpb24gYWJvdXQgYW4gZWxlbWVudC5cbiAqXG4gKiBPcHRpb25zIGNhbiBiZSBzZXQgb24gdGhlIGVsZW1lbnQgaXRzZWxmIHVzaW5nIGRhdGEgYXR0cmlidXRlcywgb3IgdGhyb3VnaFxuICogdGhlIGBvcHRpb25zYCBwYXJhbWV0ZXIuIERhdGEgYXR0cmlidXRlcyB0YWtlIHByaW9yaXR5LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7SXRlbX1cbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlSXRlbShlbCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBpc0ltYWdlID0gZWwuaGFzQXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUnKTtcbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtTZXR0aW5nc30gSXRlbVxuICAgKi9cblxuICByZXR1cm4ge1xuICAgIGVsOiBlbCxcbiAgICAvLyBUeXBlIG9mIGVsZW1lbnRcbiAgICBpc0ltYWdlOiBpc0ltYWdlLFxuICAgIGlzQmFja2dyb3VuZEltYWdlOiBpc0ltYWdlICYmIGVsLnRhZ05hbWUgIT09ICdJTUcnLFxuICAgIC8vIEltYWdlIHNjYWxlXG4gICAgc2NhbGU6IHBhcnNlSW50KGdldERhdGEoZWwsICdzY2FsZScsIG9wdGlvbnMpKSxcbiAgICAvLyBEZXZpY2UgZGVuc2l0eVxuICAgIGRlbnNpdHk6IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsXG4gICAgLy8gSW1hZ2UgdGVtcGxhdGUgVVJMXG4gICAgdGVtcGxhdGU6IGdldERhdGEoZWwsICd0ZW1wbGF0ZScsIG9wdGlvbnMpLFxuICAgIHRlbXBsYXRlUmVuZGVyOiBvcHRpb25zLnRlbXBsYXRlUmVuZGVyIHx8IGRlZmF1bHRzLnRlbXBsYXRlUmVuZGVyLFxuICAgIC8vIE1heGltdW0gaW1hZ2UgZGltZW5zaW9uc1xuICAgIG1heDogZ2V0RGF0YShlbCwgJ21heCcsIG9wdGlvbnMsIHBhcnNlU2l6ZSksXG4gICAgLy8gUm91bmQgaW1hZ2UgZGltZW5zaW9ucyB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZVxuICAgIHJvdW5kOiBnZXREYXRhKGVsLCAncm91bmQnLCBvcHRpb25zKSxcbiAgICAvLyBQbGFjZWhvbGRlciBpbWFnZSBkaW1lbnNpb25zXG4gICAgcGxhY2Vob2xkZXI6IGdldERhdGEoZWwsICdwbGFjZWhvbGRlcicsIG9wdGlvbnMsIHBhcnNlU2l6ZSksXG4gICAgLy8gQ3JvcCB2YWx1ZTsgbnVsbCBpZiBpbWFnZSBpcyB1bmNyb3BwZWQsIG90aGVyd2lzZSBlcXVhbCB0byB0aGUgU2hvcGlmeSBjcm9wIHBhcmFtZXRlciAoJ2NlbnRlcicsICd0b3AnLCBldGMuKVxuICAgIGNyb3A6IGdldERhdGEoZWwsICdjcm9wJywgb3B0aW9ucywgcHJvY2Vzc0Nyb3BWYWx1ZSlcbiAgfTtcbn1cbi8qKlxuICogUm91bmQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUuXG4gKlxuICogVGhpcyBpcyBzbyB3ZSBkb24ndCB0YXggdGhlIGltYWdlIHNlcnZlciB0b28gbXVjaC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2l6ZSBUaGUgc2l6ZSwgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtOdW1iZXJ9IFttdWx0aXBsZV0gVGhlIG11bHRpcGxlIHRvIHJvdW5kIHRvIHRoZSBuZWFyZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IFttYXhMaW1pdF0gTWF4aW11bSBhbGxvd2VkIHZhbHVlIC0gdmFsdWUgdG8gcmV0dXJuIGlmIHJvdW5kZWQgbXVsdGlwbGUgaXMgYWJvdmUgdGhpcyBsaW1pdFxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuXG5cbmZ1bmN0aW9uIHJvdW5kU2l6ZShzaXplKSB7XG4gIHZhciBtdWx0aXBsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMzI7XG4gIHZhciBtYXhMaW1pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogSW5maW5pdHk7XG4gIHJldHVybiBzaXplID09PSAwID8gbXVsdGlwbGUgOiBNYXRoLm1pbihNYXRoLmNlaWwoc2l6ZSAvIG11bHRpcGxlKSAqIG11bHRpcGxlLCBtYXhMaW1pdCk7XG59XG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiBhbiBlbGVtZW50LlxuICpcbiAqIElmIGl0IGlzIHRvbyBzbWFsbCwgaXQncyBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkLCBhbmQgc28gb24uIFRoaXMgaGVscHNcbiAqIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgYW4gZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBzaXplIHlldCBvciBpcyBwb3NpdGlvbmVkXG4gKiBvdXQgb2YgdGhlIGxheW91dC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7T2JqZWN0fSBzaXplXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUud2lkdGggVGhlIHdpZHRoLCBpbiBwaXhlbHMuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUuaGVpZ2h0IFRoZSBoZWlnaHQsIGluIHBpeGVscy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRTaXplKGVsKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuXG4gIHdoaWxlIChlbCkge1xuICAgIHNpemUud2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBzaXplLmhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcbiAgICBpZiAoc2l6ZS53aWR0aCA+IDIwICYmIHNpemUuaGVpZ2h0ID4gMjApIGJyZWFrO1xuICAgIGVsID0gZWwucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBzaXplO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIG1heGltdW0gc3VwcG9ydGVkIGRlbnNpdHkgb2YgdGhlIGltYWdlLCBnaXZlbiB0aGUgY29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKi9cblxuXG5mdW5jdGlvbiBzdXBwb3J0ZWREZW5zaXR5KGl0ZW0sIHNpemUpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LndpZHRoIC8gc2l6ZS53aWR0aCwgMSksIGl0ZW0uZGVuc2l0eSksIE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LmhlaWdodCAvIHNpemUuaGVpZ2h0LCAxKSwgaXRlbS5kZW5zaXR5KSkudG9GaXhlZCgyKTtcbn1cbi8qKlxuICogVHJpZ2dlciBhIGN1c3RvbSBldmVudC5cbiAqXG4gKiBOb3RlOiB0aGlzIGFwcHJvYWNoIGlzIGRlcHJlY2F0ZWQsIGJ1dCBzdGlsbCByZXF1aXJlZCB0byBzdXBwb3J0IG9sZGVyXG4gKiBicm93c2VycyBzdWNoIGFzIElFIDEwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvRXZlbnRzL0NyZWF0aW5nX2FuZF90cmlnZ2VyaW5nX2V2ZW50c1xuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqICAgICAgICBUaGUgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqICAgICAgICAgIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBjYW5jZWxlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHRyaWdnZXIoZWwsIG5hbWUpIHtcbiAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gIGV2ZW50LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcbiAgcmV0dXJuICFlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cbi8qKlxuICogU2V0IHRoZSBpbWFnZSBVUkwgb24gdGhlIGVsZW1lbnQuIFN1cHBvcnRzIGJhY2tncm91bmQgaW1hZ2VzIGFuZCBgc3Jjc2V0YC5cbiAqXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7U2l6ZX0gc2l6ZVxuICogQHBhcmFtIHtCb29sZWFufSBpc1BsYWNlaG9sZGVyXG4gKi9cblxuXG5mdW5jdGlvbiBzZXRJbWFnZShpdGVtLCBzaXplLCBpc1BsYWNlaG9sZGVyLCBvbkxvYWQpIHtcbiAgdmFyIHJlbmRlciA9IGl0ZW0udGVtcGxhdGVSZW5kZXI7XG4gIHZhciBkZW5zaXR5ID0gaXNQbGFjZWhvbGRlciA/IDEgOiBzdXBwb3J0ZWREZW5zaXR5KGl0ZW0sIHNpemUpO1xuICB2YXIgcm91bmQgPSBpc1BsYWNlaG9sZGVyID8gMSA6IGl0ZW0ucm91bmQ7IC8vIENhbGN1bGF0ZSB0aGUgZmluYWwgZGlzcGxheSBzaXplLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBpbWFnZSdzXG4gIC8vIG1heGltdW0gZGltZW5zaW9ucy5cblxuICB2YXIgdGFyZ2V0V2lkdGggPSBzaXplLndpZHRoICogZGVuc2l0eTtcbiAgdmFyIHRhcmdldEhlaWdodCA9IHNpemUuaGVpZ2h0ICogZGVuc2l0eTtcbiAgdmFyIGRpc3BsYXlTaXplO1xuXG4gIGlmIChpdGVtLmNyb3ApIHtcbiAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgIHdpZHRoOiByb3VuZFNpemUodGFyZ2V0V2lkdGgsIHJvdW5kLCBpdGVtLm1heC53aWR0aCksXG4gICAgICBoZWlnaHQ6IHJvdW5kU2l6ZSh0YXJnZXRIZWlnaHQsIHJvdW5kLCBpdGVtLm1heC5oZWlnaHQpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTaG9waWZ5IHNlcnZlcyBpbWFnZXMgY2xhbXBlZCBieSB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnMgKGZpdHRlZCB0byB0aGUgc21hbGxlc3QgZGltZW5zaW9uKS5cbiAgICAvLyBUbyBnZXQgdGhlIGRlc2lyZWQgYW5kIGV4cGVjdGVkIHBpeGVsIGRlbnNpdHkgd2UgbmVlZCB0byByZXF1ZXN0IGNvdmVyIGRpbWVuc2lvbnMgKGZpdHRlZCB0byBsYXJnZXN0IGRpbWVuc2lvbikuXG4gICAgLy8gVGhpcyBpc24ndCBhIHByb2JsZW0gd2l0aCBjcm9wcGVkIGltYWdlcyB3aGljaCBhcmUgc2VydmVkIGF0IHRoZSBleGFjdCBkaW1lbnNpb24gcmVxdWVzdGVkLlxuICAgIHZhciBjb250YWluZXJBc3BlY3RSYXRpbyA9IHNpemUud2lkdGggLyBzaXplLmhlaWdodDtcbiAgICB2YXIgaW1hZ2VBc3BlY3RSYXRpbyA9IGl0ZW0ubWF4LndpZHRoIC8gaXRlbS5tYXguaGVpZ2h0O1xuXG4gICAgaWYgKGNvbnRhaW5lckFzcGVjdFJhdGlvID4gaW1hZ2VBc3BlY3RSYXRpbykge1xuICAgICAgLy8gZml0IHdpZHRoXG4gICAgICBkaXNwbGF5U2l6ZSA9IHtcbiAgICAgICAgd2lkdGg6IHJvdW5kU2l6ZSh0YXJnZXRXaWR0aCwgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiByb3VuZFNpemUodGFyZ2V0V2lkdGggLyBpbWFnZUFzcGVjdFJhdGlvLCByb3VuZCwgaXRlbS5tYXguaGVpZ2h0KVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZml0IGhlaWdodFxuICAgICAgZGlzcGxheVNpemUgPSB7XG4gICAgICAgIHdpZHRoOiByb3VuZFNpemUodGFyZ2V0SGVpZ2h0ICogaW1hZ2VBc3BlY3RSYXRpbywgcm91bmQsIGl0ZW0ubWF4LndpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiByb3VuZFNpemUodGFyZ2V0SGVpZ2h0LCByb3VuZCwgaXRlbS5tYXguaGVpZ2h0KVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXJsID0gcmVuZGVyKGl0ZW0udGVtcGxhdGUsIGRpc3BsYXlTaXplKTsgLy8gT24gbG9hZCBjYWxsYmFja1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICBpbWFnZS5vbmxvYWQgPSBvbkxvYWQ7XG4gIGltYWdlLnNyYyA9IHVybDsgLy8gU2V0IGltYWdlXG5cbiAgaWYgKGl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICBpdGVtLmVsLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IFwidXJsKCdcIi5jb25jYXQodXJsLCBcIicpXCIpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0uZWwuc2V0QXR0cmlidXRlKCdzcmNzZXQnLCBcIlwiLmNvbmNhdCh1cmwsIFwiIFwiKS5jb25jYXQoZGVuc2l0eSwgXCJ4XCIpKTtcbiAgfVxufVxuLyoqXG4gKiBMb2FkIHRoZSBpbWFnZSwgc2V0IGxvYWRlZCBzdGF0dXMsIGFuZCB0cmlnZ2VyIHRoZSBsb2FkIGV2ZW50LlxuICpcbiAqIEBmaXJlcyByaW1nOmxvYWRcbiAqIEBmaXJlcyByaW1nOmVycm9yXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7U2l6ZX0gc2l6ZVxuICovXG5cblxuZnVuY3Rpb24gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKSB7XG4gIHZhciBlbCA9IGl0ZW0uZWw7XG4gIHNldEltYWdlKGl0ZW0sIHNpemUsIGZhbHNlLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycsICdsb2FkZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnLCAnZXJyb3InKTtcbiAgICAgIHRyaWdnZXIoZWwsICdyaW1nOmVycm9yJyk7XG4gICAgfVxuXG4gICAgdHJpZ2dlcihlbCwgJ3JpbWc6bG9hZCcpO1xuICB9KTtcbn1cbi8qKlxuICogTG9hZCBpbiBhIHJlc3BvbnNpdmUgaW1hZ2UuXG4gKlxuICogU2V0cyB0aGUgaW1hZ2UncyBgc3Jjc2V0YCBhdHRyaWJ1dGUgdG8gdGhlIGZpbmFsIGltYWdlIFVSTHMsIGNhbGN1bGF0ZWQgYmFzZWRcbiAqIG9uIHRoZSBhY3R1YWwgc2l6ZSB0aGUgaW1hZ2UgaXMgYmVpbmcgc2hvd24gYXQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZGluZ1xuICogICAgICAgIFRoZSBpbWFnZSBVUkxzIGhhdmUgYmVlbiBzZXQgYW5kIHdlIGFyZSB3YWl0aW5nIGZvciB0aGVtIHRvIGxvYWQuXG4gKlxuICogQGZpcmVzIHJpbWc6bG9hZGVkXG4gKiAgICAgICAgVGhlIGZpbmFsIGltYWdlIGhhcyBsb2FkZWQuXG4gKlxuICogQGZpcmVzIHJpbWc6ZXJyb3JcbiAqICAgICAgICBUaGUgZmluYWwgaW1hZ2UgZmFpbGVkIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkSW1hZ2UoaXRlbSkge1xuICB2YXIgZWwgPSBpdGVtLmVsOyAvLyBBbHJlYWR5IGxvYWRlZD9cblxuICB2YXIgc3RhdHVzID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnKTtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ2xvYWRlZCcpIHJldHVybjsgLy8gSXMgdGhlIFNWRyBsb2FkZWQ/XG4gIC8vIEluIEZpcmVmb3gsIGVsLmNvbXBsZXRlIGFsd2F5cyByZXR1cm5zIHRydWUgW2NpdGF0aW9uIG5lZWRlZCwgbWF5IG5vdCBiZSB0aGUgY2FzZSBhbnltb3JlLCBKYW4vMjAyMl1cbiAgLy8gc28gd2UgYWxzbyBjaGVjayBlbC5uYXR1cmFsV2lkdGgsIHdoaWNoIGVxdWFscyAwIHVudGlsIHRoZSBpbWFnZSBsb2Fkc1xuXG4gIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgIGlmIChlbC5uYXR1cmFsV2lkdGggPT09IDAgfHwgIWVsLmNvbXBsZXRlKSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbG9hZCBldmVudCwgdGhlbiBjYWxsIGxvYWQgaW1hZ2VcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiKTtcbiAgICAgICAgbG9hZEltYWdlKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIFRyaWdnZXIgbG9hZGluZyBldmVudCwgYW5kIHN0b3AgaWYgY2FuY2VsbGVkXG5cblxuICBpZiAodHJpZ2dlcihlbCwgJ3JpbWc6bG9hZGluZycpKSByZXR1cm47IC8vIE1hcmsgYXMgbG9hZGluZ1xuXG4gIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRpbmcnKTsgLy8gR2V0IGVsZW1lbnQgc2l6ZS4gVGhpcyBpcyB1c2VkIGFzIHRoZSBpZGVhbCBkaXNwbGF5IHNpemUuXG5cbiAgdmFyIHNpemUgPSBnZXRFbGVtZW50U2l6ZShpdGVtLmVsKTtcbiAgc2l6ZS53aWR0aCAqPSBpdGVtLnNjYWxlO1xuICBzaXplLmhlaWdodCAqPSBpdGVtLnNjYWxlO1xuXG4gIGlmIChpdGVtLnBsYWNlaG9sZGVyKSB7XG4gICAgLy8gTG9hZCBhIHBsYWNlaG9sZGVyIGltYWdlIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgZnVsbCBpbWFnZS4gRm9yY2UgdGhlXG4gICAgLy8gZWxlbWVudCB0byBrZWVwIGl0cyBkaW1lbnNpb25zIHdoaWxlIGl0IGxvYWRzLiBJZiB0aGUgaW1hZ2UgaXMgc21hbGxlclxuICAgIC8vIHRoYW4gdGhlIGVsZW1lbnQgc2l6ZSwgdXNlIHRoZSBpbWFnZSdzIHNpemUuIERlbnNpdHkgaXMgdGFrZW4gaW50byBhY2NvdW50XG4gICAgLy8gZm9yIEhpRFBJIGRldmljZXMgdG8gYXZvaWQgYmx1cnJ5IGltYWdlcy5cbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBNYXRoLm1pbihNYXRoLmZsb29yKGl0ZW0ubWF4LndpZHRoIC8gaXRlbS5kZW5zaXR5KSwgc2l6ZS53aWR0aCkpO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBNYXRoLm1pbihNYXRoLmZsb29yKGl0ZW0ubWF4LmhlaWdodCAvIGl0ZW0uZGVuc2l0eSksIHNpemUuaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgc2V0SW1hZ2UoaXRlbSwgaXRlbS5wbGFjZWhvbGRlciwgdHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGxvYWRGdWxsSW1hZ2UoaXRlbSwgc2l6ZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKTtcbiAgfVxufVxuLyoqXG4gKiBQcmVwYXJlIGFuIGVsZW1lbnQgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uXG4gKlxuICogSW1hZ2VzIGhhdmUgc3BlY2lhbCBsb2dpYyBhcHBsaWVkIHRvIHRoZW0gdG8gc3dhcCBvdXQgdGhlIGRpZmZlcmVudCBzb3VyY2VzLlxuICpcbiAqIEBmaXJlcyByaW1nOmVudGVyXG4gKiAgICAgICAgVGhlIGVsZW1lbnQgaXMgZW50ZXJpbmcgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKi9cblxuXG5mdW5jdGlvbiBsb2FkKGVsLCBvcHRpb25zKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJpZ2dlcihlbCwgJ3JpbWc6ZW50ZXInKTtcbiAgdmFyIGl0ZW0gPSBwYXJzZUl0ZW0oZWwsIG9wdGlvbnMpO1xuXG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nLXRlbXBsYXRlLXN2ZycsIGVsLmdldEF0dHJpYnV0ZSgnc3Jjc2V0JykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuLyoqXG4gKiBSZXNldCBhbiBlbGVtZW50J3Mgc3RhdGUgc28gdGhhdCBpdHMgaW1hZ2UgY2FuIGJlIHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAZmlyZXMgcmltZzp1cGRhdGVcbiAqICAgICAgICBUaGUgZWxlbWVudCBpcyBiZWluZyB1cGRhdGVkLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKi9cblxuXG5mdW5jdGlvbiB1cGRhdGUoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB0cmlnZ2VyKGVsLCAncmltZzp1cGRhdGUnKTtcbiAgdmFyIGl0ZW0gPSBwYXJzZUl0ZW0oZWwsIG9wdGlvbnMpO1xuXG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xhenknKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUtc3ZnJykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgd2l0aGluIHRoZSB2aWV3cG9ydC5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGluVmlld3BvcnQoZWwpIHtcbiAgaWYgKCFlbC5vZmZzZXRXaWR0aCB8fCAhZWwub2Zmc2V0SGVpZ2h0IHx8ICFlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB2YXIgd2lkdGggPSBNYXRoLm1pbihyb290LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1pbihyb290LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHJlY3QuYm90dG9tID49IDAgJiYgcmVjdC5yaWdodCA+PSAwICYmIHJlY3QudG9wIDw9IGhlaWdodCAmJiByZWN0LmxlZnQgPD0gd2lkdGg7XG59XG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3aWR0aFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGhlaWdodFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0byB0dXJuIGEgdGVtcGxhdGUgc3RyaW5nIGludG8gYSBVUkwuXG4gKlxuICogQGNhbGxiYWNrIFRlbXBsYXRlUmVuZGVyZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NcbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3RlbXBsYXRlXVxuICogICAgICAgICAgIEEgdGVtcGxhdGUgc3RyaW5nIHVzZWQgdG8gZ2VuZXJhdGUgVVJMcyBmb3IgYW4gaW1hZ2UuIFRoaXMgYWxsb3dzIHVzIHRvXG4gKiAgICAgICAgICAgZHluYW1pY2FsbHkgbG9hZCBpbWFnZXMgd2l0aCBzaXplcyB0byBtYXRjaCB0aGUgY29udGFpbmVyJ3Mgc2l6ZS5cbiAqXG4gKiBAcHJvcGVydHkge1RlbXBsYXRlUmVuZGVyZXJ9IFt0ZW1wbGF0ZVJlbmRlcl1cbiAqICAgICAgICAgICBBIGZ1bmN0aW9uIHRvIHR1cm4gYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhIFVSTC5cbiAqXG4gKiBAcHJvcGVydHkge1NpemV9IFttYXhdXG4gKiAgICAgICAgICAgVGhlIG1heGltdW0gYXZhaWxhYmxlIHNpemUgZm9yIHRoZSBpbWFnZS4gVGhpcyBlbnN1cmVzIHdlIGRvbid0XG4gKiAgICAgICAgICAgdHJ5IHRvIGxvYWQgYW4gaW1hZ2UgbGFyZ2VyIHRoYW4gaXMgcG9zc2libGUuXG4gKiBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc2NhbGVdXG4gKiAgICAgICAgICAgQSBudW1iZXIgdG8gc2NhbGUgdGhlIGZpbmFsIGltYWdlIGRpbWVuc2lvbnMgYnkuIFxuICogICAgICAgICAgIE9ubHkgYXBwbGllcyB0byBsYXp5LWxvYWRlZCBpbWFnZXMuIERlZmF1bHRzIHRvIDEuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyb3VuZF1cbiAqICAgICAgICAgICBSb3VuZCBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlLiBUaGlzIGlzIGludGVuZGVkIHRvXG4gKiAgICAgICAgICAgdGF4IHRoZSBpbWFnZSBzZXJ2ZXIgbGVzcyBieSBsb3dlcmluZyB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGltYWdlXG4gKiAgICAgICAgICAgc2l6ZXMgcmVxdWVzdGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gW3BsYWNlaG9sZGVyXVxuICogICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBsby1maSBpbWFnZSB0byBsb2FkIGJlZm9yZSB0aGUgZnVsbCBpbWFnZS5cbiAqIFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtjcm9wXVxuICogICAgICAgICAgIENyb3AgdmFsdWU7IG51bGwgaWYgaW1hZ2UgaXMgdW5jcm9wcGVkLCBvdGhlcndpc2UgZXF1YWwgXG4gKiAgICAgICAgICAgdG8gdGhlIFNob3BpZnkgY3JvcCBwYXJhbWV0ZXIgKCdjZW50ZXInLCAndG9wJywgZXRjLikuXG4gKi9cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSByZXNwb25zaXZlIGltYWdlIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gKiAgICAgICAgVGhlIENTUyBzZWxlY3RvciwgZWxlbWVudCwgb3IgZWxlbWVudHMgdG8gdHJhY2sgZm9yIGxhenktbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0ge1NldHRpbmdzfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge1B1YmxpY0FwaX1cbiAqL1xuXG5cbmZ1bmN0aW9uIHJpbWcoKSB7XG4gIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJztcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OyAvLyBJbnRlcnNlY3Rpb25zXG5cbiAgdmFyIGlvID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nIHx8IGVudHJ5LmludGVyc2VjdGlvblJhdGlvID4gMCkge1xuICAgICAgICBpby51bm9ic2VydmUoZW50cnkudGFyZ2V0KTtcbiAgICAgICAgbG9hZChlbnRyeS50YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCB7XG4gICAgLy8gV2F0Y2ggdGhlIHZpZXdwb3J0LCB3aXRoIDIwJSB2ZXJ0aWNhbCBtYXJnaW5zXG4gICAgcm9vdE1hcmdpbjogJzIwJSAwcHgnXG4gIH0pO1xuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHVibGljQXBpXG4gICAqL1xuXG4gIHZhciBhcGkgPSB7XG4gICAgLyoqXG4gICAgICogVHJhY2sgYSBuZXcgc2VsZWN0b3IsIGVsZW1lbnQsIG9yIG5vZGVsaXN0IGZvciBsYXp5LWxvYWRpbmcuXG4gICAgICogQHR5cGUgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAgICAgKi9cbiAgICB0cmFjazogZnVuY3Rpb24gdHJhY2soKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibGF6eVwiXSc7XG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIElmIGFuIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgdmlld3BvcnQsIGxvYWQgaXQgcmlnaHQgYXdheS4gVGhpc1xuICAgICAgICAvLyBmaXhlcyBhIHJhY2UtY29uZGl0aW9uIHdpdGggZHluYW1pY2FsbHkgYWRkZWQgZWxlbWVudHMuXG4gICAgICAgIGlmIChpblZpZXdwb3J0KGVsc1tpXSkpIHtcbiAgICAgICAgICBsb2FkKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW8ub2JzZXJ2ZShlbHNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBlbGVtZW50KHMpIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkIHRvIGZvcmNlIHRoZWlyIGltYWdlc1xuICAgICAqIHRvIGJlIHJlY2FsY3VsYXRlZC5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICAgICAqL1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlJDEoKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibG9hZGVkXCJdJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgdHJhY2tpbmcgZWxlbWVudChzKSBmb3IgbGF6eS1sb2FkaW5nLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgdW50cmFjazogZnVuY3Rpb24gdW50cmFjaygpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWddJztcbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW8udW5vYnNlcnZlKGVsc1tpXSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1hbnVhbGx5IGxvYWQgaW1hZ2VzLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24gbG9hZCQxKCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZ10nO1xuICAgICAgdmFyIGVscyA9IHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsb2FkKGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbGwgZXZlbnQgaGFuZGxlcnMgYW5kIG9ic2VydmVycy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgaW8uZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfTsgLy8gQWRkIGluaXRpYWwgZWxlbWVudHNcblxuICBhcGkudHJhY2soc2VsZWN0b3IpO1xuICByZXR1cm4gYXBpO1xufVxuLyoqXG4gKiBGaW5kcyBhIGdyb3VwIG9mIGVsZW1lbnRzIG9uIHRoZSBwYWdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICogQHJldHVybnMge09iamVjdH0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKi9cblxuXG5mdW5jdGlvbiBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW3NlbGVjdG9yXTtcbiAgfVxuXG4gIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIFBvbHlmaWxsIGZvciBFbGVtZW50Lm1hdGNoZXMoKS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIG1hdGNoZXMgPSAodGhpcy5kb2N1bWVudCB8fCB0aGlzLm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwocyksXG4gICAgICAgIGkgPSBtYXRjaGVzLmxlbmd0aDtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiBtYXRjaGVzLml0ZW0oaSkgIT09IHRoaXMpIHt9XG5cbiAgICByZXR1cm4gaSA+IC0xO1xuICB9O1xufVxuXG52YXIgc3RhdGUgPSB7XG4gIGluaXQ6IGluaXQsXG4gIHdhdGNoOiB3YXRjaCxcbiAgdW53YXRjaDogdW53YXRjaCxcbiAgbG9hZDogbG9hZCQxXG59O1xuXG5mdW5jdGlvbiBpbml0KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibGF6eVwiXSc7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgc3RhdGUuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgc3RhdGUuaW5zdGFuY2UgPSByaW1nKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgc3RhdGUubG9hZGVkV2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyAvLyBMaXN0ZW4gZm9yIFNob3BpZnkgdGhlbWUgZWRpdG9yIGV2ZW50c1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdXBkYXRlKCk7XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHVud2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgfSk7IC8vIExpc3RlbiBmb3IgY3VzdG9tIGV2ZW50cyB0byBhbGxvdyB0aGVtZXMgdG8gaG9vayBpbnRvIHJpbWdcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aGVtZTpyaW1nOndhdGNoJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aGVtZTpyaW1nOnVud2F0Y2gnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICB9KTsgLy8gU3VwcG9ydCBjdXN0b20gZXZlbnRzIHRyaWdnZXJlZCB0aHJvdWdoIGpRdWVyeVxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2lzc3Vlcy8zMzQ3XG5cbiAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKHtcbiAgICAgICd0aGVtZTpyaW1nOndhdGNoJzogZnVuY3Rpb24gdGhlbWVSaW1nV2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gICAgICB9LFxuICAgICAgJ3RoZW1lOnJpbWc6dW53YXRjaCc6IGZ1bmN0aW9uIHRoZW1lUmltZ1Vud2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVud2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBUcmFjayBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKi9cblxuXG5mdW5jdGlvbiB3YXRjaChlbCkge1xuICAvLyBUcmFjayBlbGVtZW50XG4gIGlmICh0eXBlb2YgZWwubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBlbC5tYXRjaGVzKHN0YXRlLnNlbGVjdG9yKSkge1xuICAgIHN0YXRlLmluc3RhbmNlLnRyYWNrKGVsKTtcbiAgfSAvLyBUcmFjayBlbGVtZW50J3MgY2hpbGRyZW5cblxuXG4gIHN0YXRlLmluc3RhbmNlLnRyYWNrKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc3RhdGUuc2VsZWN0b3IpKTtcbn1cbi8qKlxuICogVW50cmFjayBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiB1bndhdGNoKGVsKSB7XG4gIC8vIFVudHJhY2sgZWxlbWVudCdzIGNoaWxkcmVuXG4gIHN0YXRlLmluc3RhbmNlLnVudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpOyAvLyBVbnRyYWNrIGVsZW1lbnRcblxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS51bnRyYWNrKGVsKTtcbiAgfVxufVxuLyoqXG4gKiBNYW51YWxseSBsb2FkIGFuIGltYWdlXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGxvYWQkMShlbCkge1xuICAvLyBMb2FkIGVsZW1lbnRcbiAgaWYgKHR5cGVvZiBlbC5tYXRjaGVzID09PSAnZnVuY3Rpb24nICYmIGVsLm1hdGNoZXMoc3RhdGUuc2VsZWN0b3IpKSB7XG4gICAgc3RhdGUuaW5zdGFuY2UubG9hZChlbCk7XG4gIH0gLy8gTG9hZCBlbGVtZW50J3MgY2hpbGRyZW5cblxuXG4gIHN0YXRlLmluc3RhbmNlLmxvYWQoZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xufVxuLyoqXG4gKiBVcGRhdGUgYW4gZWxlbWVudCwgYW5kIGl0cyBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICovXG5cblxuZnVuY3Rpb24gX3VwZGF0ZSgpIHtcbiAgdmFyIGN1cnJlbnRXaWR0aCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IC8vIFJldHVybiBpZiB3ZSdyZSBub3QgMnggc21hbGxlciwgb3IgbGFyZ2VyIHRoYW4gdGhlIGV4aXN0aW5nIGxvYWRpbmcgc2l6ZVxuXG4gIGlmIChjdXJyZW50V2lkdGggLyBzdGF0ZS5sb2FkZWRXaWR0aCA+IDAuNSAmJiBjdXJyZW50V2lkdGggLyBzdGF0ZS5sb2FkZWRXaWR0aCA8IDIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5sb2FkZWRXaWR0aCA9IGN1cnJlbnRXaWR0aDtcbiAgc3RhdGUuaW5zdGFuY2UudXBkYXRlKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\n")},
vendor: 23,983 bytes, line 1
1"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n /*!\n * @pixelunion/shopify-asyncview v2.0.5\n * (c) 2020 Pixel Union\n */\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar deferred = {};\n\nvar AsyncView = /*#__PURE__*/function () {\n function AsyncView() {\n _classCallCheck(this, AsyncView);\n }\n\n _createClass(AsyncView, null, [{\n key: \"load\",\n\n /**\n * Load the template given by the provided URL into the provided\n * view\n *\n * @param {string} url - The url to load\n * @param {object} query - An object containing additional query parameters of the URL\n * @param {string} query.view - A required query parameter indicating which view to load\n * @param {object} [options] - Config options\n * @param {string} [options.hash] - A hash of the current page content\n */\n value: function load(url) {\n var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!('view' in query)) {\n return Promise.reject(new Error('\\'view\\' not found in \\'query\\' parameter'));\n }\n\n var querylessUrl = url.replace(/\\?[^#]+/, '');\n var queryParamsString = new RegExp(/.+\\?([^#]+)/).exec(url);\n var queryParams = query;\n\n if (queryParamsString && queryParamsString.length >= 2) {\n queryParamsString[1].split('&').forEach(function (param) {\n var _param$split = param.split('='),\n _param$split2 = _slicedToArray(_param$split, 2),\n key = _param$split2[0],\n value = _param$split2[1];\n\n queryParams[key] = value;\n });\n } // NOTE: We're adding an additional timestamp to the query.\n // This is to prevent certain browsers from returning cached\n // versions of the url we are requesting.\n // See this PR for more info: https://github.com/pixelunion/shopify-asyncview/pull/4\n\n\n var cachebustingParams = _objectSpread2({}, queryParams, {\n _: new Date().getTime()\n });\n\n var hashUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(queryParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(queryParams[key]));\n }).join('&')).concat(hash);\n });\n var requestUrl = querylessUrl.replace(/([^#]+)(.*)/, function (match, address, hash) {\n return \"\".concat(address, \"?\").concat(Object.keys(cachebustingParams).sort().map(function (key) {\n return \"\".concat(key, \"=\").concat(encodeURIComponent(cachebustingParams[key]));\n }).join('&')).concat(hash);\n });\n var promise = new Promise(function (resolve, reject) {\n var data;\n\n if (hashUrl in deferred) {\n resolve(deferred[hashUrl]);\n return;\n }\n\n deferred[hashUrl] = promise;\n\n if (options.hash) {\n data = sessionStorage.getItem(hashUrl);\n\n if (data) {\n var deserialized = JSON.parse(data);\n\n if (options.hash === deserialized.options.hash) {\n delete deferred[hashUrl];\n resolve(deserialized);\n return;\n }\n }\n }\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', requestUrl, true);\n\n xhr.onload = function () {\n var el = xhr.response;\n var newOptions = {};\n var optionsEl = el.querySelector('[data-options]');\n\n if (optionsEl && optionsEl.innerHTML) {\n newOptions = JSON.parse(el.querySelector('[data-options]').innerHTML);\n }\n\n var htmlEls = el.querySelectorAll('[data-html]');\n var newHtml = {};\n\n if (htmlEls.length === 1 && htmlEls[0].getAttribute('data-html') === '') {\n newHtml = htmlEls[0].innerHTML;\n } else {\n for (var i = 0; i < htmlEls.length; i++) {\n newHtml[htmlEls[i].getAttribute('data-html')] = htmlEls[i].innerHTML;\n }\n }\n\n var dataEls = el.querySelectorAll('[data-data]');\n var newData = {};\n\n if (dataEls.length === 1 && dataEls[0].getAttribute('data-data') === '') {\n newData = JSON.parse(dataEls[0].innerHTML);\n } else {\n for (var _i = 0; _i < dataEls.length; _i++) {\n newData[dataEls[_i].getAttribute('data-data')] = JSON.parse(dataEls[_i].innerHTML);\n }\n }\n\n if (options.hash) {\n try {\n sessionStorage.setItem(hashUrl, JSON.stringify({\n options: newOptions,\n data: newData,\n html: newHtml\n }));\n } catch (error) {\n console.error(error);\n }\n }\n\n delete deferred[hashUrl];\n resolve({\n data: newData,\n html: newHtml\n });\n };\n\n xhr.onerror = function () {\n delete deferred[hashUrl];\n reject();\n };\n\n xhr.responseType = 'document';\n xhr.send();\n });\n return promise;\n }\n }]);\n\n return AsyncView;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AsyncView);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3L2Rpc3QvaW5kZXguZXMuanM/MzAwZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgLyohXG4gICAqIEBwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3IHYyLjAuNVxuICAgKiAoYykgMjAyMCBQaXhlbCBVbmlvblxuICAqL1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSk7XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obik7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gIHJldHVybiBhcnIyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgZGVmZXJyZWQgPSB7fTtcblxudmFyIEFzeW5jVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFzeW5jVmlldygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXN5bmNWaWV3KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBc3luY1ZpZXcsIG51bGwsIFt7XG4gICAga2V5OiBcImxvYWRcIixcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHRlbXBsYXRlIGdpdmVuIGJ5IHRoZSBwcm92aWRlZCBVUkwgaW50byB0aGUgcHJvdmlkZWRcbiAgICAgKiB2aWV3XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHVybCB0byBsb2FkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHF1ZXJ5IC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIG9mIHRoZSBVUkxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkudmlldyAtIEEgcmVxdWlyZWQgcXVlcnkgcGFyYW1ldGVyIGluZGljYXRpbmcgd2hpY2ggdmlldyB0byBsb2FkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIENvbmZpZyBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmhhc2hdIC0gQSBoYXNoIG9mIHRoZSBjdXJyZW50IHBhZ2UgY29udGVudFxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIHF1ZXJ5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgICAgaWYgKCEoJ3ZpZXcnIGluIHF1ZXJ5KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdcXCd2aWV3XFwnIG5vdCBmb3VuZCBpbiBcXCdxdWVyeVxcJyBwYXJhbWV0ZXInKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBxdWVyeWxlc3NVcmwgPSB1cmwucmVwbGFjZSgvXFw/W14jXSsvLCAnJyk7XG4gICAgICB2YXIgcXVlcnlQYXJhbXNTdHJpbmcgPSBuZXcgUmVnRXhwKC8uK1xcPyhbXiNdKykvKS5leGVjKHVybCk7XG4gICAgICB2YXIgcXVlcnlQYXJhbXMgPSBxdWVyeTtcblxuICAgICAgaWYgKHF1ZXJ5UGFyYW1zU3RyaW5nICYmIHF1ZXJ5UGFyYW1zU3RyaW5nLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zU3RyaW5nWzFdLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICB2YXIgX3BhcmFtJHNwbGl0ID0gcGFyYW0uc3BsaXQoJz0nKSxcbiAgICAgICAgICAgICAgX3BhcmFtJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF9wYXJhbSRzcGxpdCwgMiksXG4gICAgICAgICAgICAgIGtleSA9IF9wYXJhbSRzcGxpdDJbMF0sXG4gICAgICAgICAgICAgIHZhbHVlID0gX3BhcmFtJHNwbGl0MlsxXTtcblxuICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIE5PVEU6IFdlJ3JlIGFkZGluZyBhbiBhZGRpdGlvbmFsIHRpbWVzdGFtcCB0byB0aGUgcXVlcnkuXG4gICAgICAvLyBUaGlzIGlzIHRvIHByZXZlbnQgY2VydGFpbiBicm93c2VycyBmcm9tIHJldHVybmluZyBjYWNoZWRcbiAgICAgIC8vIHZlcnNpb25zIG9mIHRoZSB1cmwgd2UgYXJlIHJlcXVlc3RpbmcuXG4gICAgICAvLyBTZWUgdGhpcyBQUiBmb3IgbW9yZSBpbmZvOiBodHRwczovL2dpdGh1Yi5jb20vcGl4ZWx1bmlvbi9zaG9waWZ5LWFzeW5jdmlldy9wdWxsLzRcblxuXG4gICAgICB2YXIgY2FjaGVidXN0aW5nUGFyYW1zID0gX29iamVjdFNwcmVhZDIoe30sIHF1ZXJ5UGFyYW1zLCB7XG4gICAgICAgIF86IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9KTtcblxuICAgICAgdmFyIGhhc2hVcmwgPSBxdWVyeWxlc3NVcmwucmVwbGFjZSgvKFteI10rKSguKikvLCBmdW5jdGlvbiAobWF0Y2gsIGFkZHJlc3MsIGhhc2gpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGFkZHJlc3MsIFwiP1wiKS5jb25jYXQoT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLnNvcnQoKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChrZXksIFwiPVwiKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1zW2tleV0pKTtcbiAgICAgICAgfSkuam9pbignJicpKS5jb25jYXQoaGFzaCk7XG4gICAgICB9KTtcbiAgICAgIHZhciByZXF1ZXN0VXJsID0gcXVlcnlsZXNzVXJsLnJlcGxhY2UoLyhbXiNdKykoLiopLywgZnVuY3Rpb24gKG1hdGNoLCBhZGRyZXNzLCBoYXNoKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChhZGRyZXNzLCBcIj9cIikuY29uY2F0KE9iamVjdC5rZXlzKGNhY2hlYnVzdGluZ1BhcmFtcykuc29ydCgpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KGtleSwgXCI9XCIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoY2FjaGVidXN0aW5nUGFyYW1zW2tleV0pKTtcbiAgICAgICAgfSkuam9pbignJicpKS5jb25jYXQoaGFzaCk7XG4gICAgICB9KTtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZGF0YTtcblxuICAgICAgICBpZiAoaGFzaFVybCBpbiBkZWZlcnJlZCkge1xuICAgICAgICAgIHJlc29sdmUoZGVmZXJyZWRbaGFzaFVybF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmVycmVkW2hhc2hVcmxdID0gcHJvbWlzZTtcblxuICAgICAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgZGF0YSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGFzaFVybCk7XG5cbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGRlc2VyaWFsaXplZCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc2ggPT09IGRlc2VyaWFsaXplZC5vcHRpb25zLmhhc2gpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGRlZmVycmVkW2hhc2hVcmxdO1xuICAgICAgICAgICAgICByZXNvbHZlKGRlc2VyaWFsaXplZCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCByZXF1ZXN0VXJsLCB0cnVlKTtcblxuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBlbCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHt9O1xuICAgICAgICAgIHZhciBvcHRpb25zRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vcHRpb25zXScpO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnNFbCAmJiBvcHRpb25zRWwuaW5uZXJIVE1MKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zID0gSlNPTi5wYXJzZShlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1vcHRpb25zXScpLmlubmVySFRNTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGh0bWxFbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1odG1sXScpO1xuICAgICAgICAgIHZhciBuZXdIdG1sID0ge307XG5cbiAgICAgICAgICBpZiAoaHRtbEVscy5sZW5ndGggPT09IDEgJiYgaHRtbEVsc1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHRtbCcpID09PSAnJykge1xuICAgICAgICAgICAgbmV3SHRtbCA9IGh0bWxFbHNbMF0uaW5uZXJIVE1MO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bWxFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbmV3SHRtbFtodG1sRWxzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1odG1sJyldID0gaHRtbEVsc1tpXS5pbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGRhdGFFbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1kYXRhXScpO1xuICAgICAgICAgIHZhciBuZXdEYXRhID0ge307XG5cbiAgICAgICAgICBpZiAoZGF0YUVscy5sZW5ndGggPT09IDEgJiYgZGF0YUVsc1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpID09PSAnJykge1xuICAgICAgICAgICAgbmV3RGF0YSA9IEpTT04ucGFyc2UoZGF0YUVsc1swXS5pbm5lckhUTUwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YUVscy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgbmV3RGF0YVtkYXRhRWxzW19pXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpXSA9IEpTT04ucGFyc2UoZGF0YUVsc1tfaV0uaW5uZXJIVE1MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhhc2hVcmwsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBuZXdPcHRpb25zLFxuICAgICAgICAgICAgICAgIGRhdGE6IG5ld0RhdGEsXG4gICAgICAgICAgICAgICAgaHRtbDogbmV3SHRtbFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgZGVmZXJyZWRbaGFzaFVybF07XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBkYXRhOiBuZXdEYXRhLFxuICAgICAgICAgICAgaHRtbDogbmV3SHRtbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZFtoYXNoVXJsXTtcbiAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFzeW5jVmlldztcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgQXN5bmNWaWV3O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\n")},
vendor: 38,398 bytes, line 1
1"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n\n/*!\n * @pixelunion/shopify-sections-manager v1.1.0\n * (c) 2021 Pixel Union\n */\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\n/**\n * Allows a callback to be run once, when a target intersects the viewport.\n * @constructor\n * @param {Object} [options] options with which to construct the IntersectionObserver\n * @param {string} [options.rootMargin='30%'] A string which specifies a set of offsets to add to\n * the root's bounding_box when calculating intersections.\n * @param {number} [options.threshold=0] Ratio of intersection required to trigger callback\n */\nvar LazyLoader = /*#__PURE__*/function () {\n function LazyLoader(options) {\n _classCallCheck(this, LazyLoader);\n\n var defaultOptions = {\n rootMargin: '30%',\n threshold: 0\n };\n this.callbacks = new WeakMap();\n this._observerCallback = this._observerCallback.bind(this);\n this.observer = new IntersectionObserver(this._observerCallback, _objectSpread2(_objectSpread2({}, defaultOptions), options));\n }\n /**\n * Add target and callback. Callback is only run once.\n * @add\n * @param {HTMLElement} target Target element\n * @param {function} callback Callback to run when target begins intersecting\n */\n\n\n _createClass(LazyLoader, [{\n key: \"add\",\n value: function add(target, callback) {\n this.callbacks.set(target, callback);\n this.observer.observe(target);\n }\n /**\n * Remove target. Associated callback is also removed.\n * @remove\n * @param {HTMLElement} target Target element\n */\n\n }, {\n key: \"remove\",\n value: function remove(target) {\n this.observer.unobserve(target);\n this.callbacks[\"delete\"](target);\n }\n /**\n * Disconnects IntersectionObserver if active\n * @unload\n */\n\n }, {\n key: \"unload\",\n value: function unload() {\n this.observer.disconnect();\n }\n /**\n * Runs associated callbacks for each entry, then removes that entry and callback\n * @_observerCallback\n * @param {IntersectionObserverEntry[]} entries Entries to check\n * @param {InterserctionObserver} observer IntersectionObserver instance\n */\n\n }, {\n key: \"_observerCallback\",\n value: function _observerCallback(entries, observer) {\n var _this = this;\n\n entries.forEach(function (_ref) {\n var isIntersecting = _ref.isIntersecting,\n target = _ref.target;\n\n // do nothing unless target moved into state of intersection\n if (isIntersecting === true) {\n // make sure we stop observing before running the callback, so we don't\n // somehow run the callback twice if element intersects twice quickly\n observer.unobserve(target);\n\n var callback = _this.callbacks.get(target);\n\n if (typeof callback === 'function') {\n callback();\n }\n\n _this.callbacks[\"delete\"](target);\n }\n });\n }\n }]);\n\n return LazyLoader;\n}();\n\nfunction triggerInstanceEvent(instance, eventName) {\n if (instance && instance[eventName]) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n instance[eventName].apply(instance, args);\n }\n}\n\nfunction loadData(el) {\n var dataEl = el.querySelector('[data-section-data]');\n if (!dataEl) return {}; // Load data from attribute, or innerHTML\n\n var data = dataEl.getAttribute('data-section-data') || dataEl.innerHTML;\n\n try {\n return JSON.parse(data);\n } catch (error) {\n console.warn(\"Sections: invalid section data found. \".concat(error.message));\n return {};\n }\n}\n\nvar ShopifySectionsManager = /*#__PURE__*/function () {\n function ShopifySectionsManager() {\n _classCallCheck(this, ShopifySectionsManager);\n\n this.handlers = {};\n this.instances = {};\n this.options = {};\n this.lazyLoader = null;\n this._onSectionEvent = this._onSectionEvent.bind(this);\n document.addEventListener('shopify:section:load', this._onSectionEvent);\n document.addEventListener('shopify:section:unload', this._onSectionEvent);\n document.addEventListener('shopify:section:select', this._onSectionEvent);\n document.addEventListener('shopify:section:deselect', this._onSectionEvent);\n document.addEventListener('shopify:section:reorder', this._onSectionEvent);\n document.addEventListener('shopify:block:select', this._onSectionEvent);\n document.addEventListener('shopify:block:deselect', this._onSectionEvent);\n }\n /**\n * Stop listening for section events, and unbind all handlers.\n */\n\n\n _createClass(ShopifySectionsManager, [{\n key: \"unbind\",\n value: function unbind() {\n document.removeEventListener('shopify:section:load', this._onSectionEvent);\n document.removeEventListener('shopify:section:unload', this._onSectionEvent);\n document.removeEventListener('shopify:section:select', this._onSectionEvent);\n document.removeEventListener('shopify:section:deselect', this._onSectionEvent);\n document.removeEventListener('shopify:section:reorder', this._onSectionEvent);\n document.removeEventListener('shopify:block:select', this._onSectionEvent);\n document.removeEventListener('shopify:block:deselect', this._onSectionEvent); // Unload all instances\n\n for (var i = 0; i < this.instances.length; i++) {\n triggerInstanceEvent(this.instances[i], 'onSectionUnload');\n }\n\n this.handlers = {};\n this.options = {};\n this.lazyLoader.unload();\n this.lazyLoader = null;\n this.instances = {};\n }\n /**\n * Register a section handler.\n *\n * @param {string} type\n * The section type to handle. The handler will be called for all\n * sections with this type.\n *\n * @param {function} handler\n * The handler function is passed information about a specific section\n * instance. The handler is expected to return an object that will be\n * associated with the section instance.\n *\n * Section handlers are passed an object with the following parameters:\n * {string} id\n * An ID that maps to a specific section instance. Typically the\n * section's filename for static sections, or a generated ID for\n * dynamic sections.\n *\n * {string} type\n * The section type, as supplied when registered.\n *\n * {Element} el\n * The root DOM element for the section instance.\n *\n * {Object} data\n * Data loaded from the section script element. Defaults to an\n * empty object.\n *\n * {Function} postMessage\n * A function that can be called to pass messages between sections.\n * The function should be called with a message \"name\", and\n * optionally some data.\n *\n * @param {object} options\n *\n * @param {boolean} options.lazy\n * If true, sections will only be initialized after they intersect the viewport + 30% margin\n */\n\n }, {\n key: \"register\",\n value: function register(type, handler) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (this.handlers[type]) {\n console.warn(\"Sections: section handler already exists of type '\".concat(type, \"'.\"));\n } // Store the section handler\n\n\n this.handlers[type] = handler; // Store options\n\n this.options[type] = options; // Init sections for this type\n\n this._initSections(type);\n }\n /**\n * Initialize sections already on the page.\n */\n\n }, {\n key: \"_initSections\",\n value: function _initSections(type) {\n var _this = this;\n\n // Fetch all existing sections of our type on the page\n var dataEls = document.querySelectorAll(\"[data-section-type=\\\"\".concat(type, \"\\\"]\"));\n if (!dataEls) return; // Create an instance for each section\n\n var _loop = function _loop(i) {\n var dataEl = dataEls[i];\n var el = dataEl.parentNode; // Get instance ID\n\n var idEl = el.querySelector('[data-section-id]');\n\n if (!idEl) {\n console.warn(\"Sections: unable to find section id for '\".concat(type, \"'.\"), el);\n return {\n v: void 0\n };\n }\n\n var sectionId = idEl.getAttribute('data-section-id');\n\n if (!sectionId) {\n console.warn(\"Sections: unable to find section id for '\".concat(type, \"'.\"), el);\n return {\n v: void 0\n };\n }\n\n if (_this.options[type] && _this.options[type].lazy) {\n if (_this.lazyLoader === null) {\n _this.lazyLoader = new LazyLoader();\n }\n\n _this.lazyLoader.add(el, function () {\n return _this._createInstance(sectionId, el);\n });\n } else {\n _this._createInstance(sectionId, el);\n }\n };\n\n for (var i = 0; i < dataEls.length; i++) {\n var _ret = _loop(i);\n\n if (_typeof(_ret) === \"object\") return _ret.v;\n }\n }\n }, {\n key: \"_onSectionEvent\",\n value: function _onSectionEvent(event) {\n var el = event.target;\n var _event$detail = event.detail,\n sectionId = _event$detail.sectionId,\n blockId = _event$detail.blockId;\n var instance = this.instances[sectionId];\n\n switch (event.type) {\n case 'shopify:section:load':\n this._createInstance(sectionId, el);\n\n break;\n\n case 'shopify:section:unload':\n triggerInstanceEvent(instance, 'onSectionUnload', {\n el: el,\n id: sectionId\n });\n\n if (this.lazyLoader) {\n this.lazyLoader.remove(el);\n }\n\n delete this.instances[sectionId];\n break;\n\n case 'shopify:section:select':\n triggerInstanceEvent(instance, 'onSectionSelect', {\n el: el,\n id: sectionId\n });\n break;\n\n case 'shopify:section:deselect':\n triggerInstanceEvent(instance, 'onSectionDeselect', {\n el: el,\n id: sectionId\n });\n break;\n\n case 'shopify:section:reorder':\n triggerInstanceEvent(instance, 'onSectionReorder', {\n el: el,\n id: sectionId\n });\n break;\n\n case 'shopify:block:select':\n triggerInstanceEvent(instance, 'onSectionBlockSelect', {\n el: el,\n id: blockId\n });\n break;\n\n case 'shopify:block:deselect':\n triggerInstanceEvent(instance, 'onSectionBlockDeselect', {\n el: el,\n id: blockId\n });\n break;\n }\n }\n }, {\n key: \"_postMessage\",\n value: function _postMessage(name, data) {\n var _this2 = this;\n\n Object.keys(this.instances).forEach(function (id) {\n triggerInstanceEvent(_this2.instances[id], 'onSectionMessage', name, data);\n });\n }\n }, {\n key: \"_createInstance\",\n value: function _createInstance(id, el) {\n var typeEl = el.querySelector('[data-section-type]');\n if (!typeEl) return;\n var type = typeEl.getAttribute('data-section-type');\n if (!type) return;\n var handler = this.handlers[type];\n\n if (!handler) {\n console.warn(\"Sections: unable to find section handler for type '\".concat(type, \"'.\"));\n return;\n }\n\n var data = loadData(el);\n\n var postMessage = this._postMessage.bind(this);\n\n this.instances[id] = handler({\n id: id,\n type: type,\n el: el,\n data: data,\n postMessage: postMessage\n });\n }\n }]);\n\n return ShopifySectionsManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ShopifySectionsManager);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGFyYWxsYXgvLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyL2Rpc3Qvc2hvcGlmeS1zZWN0aW9ucy1tYW5hZ2VyLmVzLmpzPzBkZjciXSwic291cmNlc0NvbnRlbnQiOlsiXG4vKiFcbiAqIEBwaXhlbHVuaW9uL3Nob3BpZnktc2VjdGlvbnMtbWFuYWdlciB2MS4xLjBcbiAqIChjKSAyMDIxIFBpeGVsIFVuaW9uXG4gKi9cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqXG4gKiBBbGxvd3MgYSBjYWxsYmFjayB0byBiZSBydW4gb25jZSwgd2hlbiBhIHRhcmdldCBpbnRlcnNlY3RzIHRoZSB2aWV3cG9ydC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25zIHdpdGggd2hpY2ggdG8gY29uc3RydWN0IHRoZSBJbnRlcnNlY3Rpb25PYnNlcnZlclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJvb3RNYXJnaW49JzMwJSddIEEgc3RyaW5nIHdoaWNoIHNwZWNpZmllcyBhIHNldCBvZiBvZmZzZXRzIHRvIGFkZCB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcm9vdCdzIGJvdW5kaW5nX2JveCB3aGVuIGNhbGN1bGF0aW5nIGludGVyc2VjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTBdIFJhdGlvIG9mIGludGVyc2VjdGlvbiByZXF1aXJlZCB0byB0cmlnZ2VyIGNhbGxiYWNrXG4gKi9cbnZhciBMYXp5TG9hZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGF6eUxvYWRlcihvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExhenlMb2FkZXIpO1xuXG4gICAgdmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgcm9vdE1hcmdpbjogJzMwJScsXG4gICAgICB0aHJlc2hvbGQ6IDBcbiAgICB9O1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZlckNhbGxiYWNrID0gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5fb2JzZXJ2ZXJDYWxsYmFjaywgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgdGFyZ2V0IGFuZCBjYWxsYmFjay4gQ2FsbGJhY2sgaXMgb25seSBydW4gb25jZS5cbiAgICogQGFkZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXQgVGFyZ2V0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuIHdoZW4gdGFyZ2V0IGJlZ2lucyBpbnRlcnNlY3RpbmdcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoTGF6eUxvYWRlciwgW3tcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodGFyZ2V0LCBjYWxsYmFjayk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRhcmdldC4gQXNzb2NpYXRlZCBjYWxsYmFjayBpcyBhbHNvIHJlbW92ZWQuXG4gICAgICogQHJlbW92ZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldCBUYXJnZXQgZWxlbWVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSh0YXJnZXQpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKHRhcmdldCk7XG4gICAgICB0aGlzLmNhbGxiYWNrc1tcImRlbGV0ZVwiXSh0YXJnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBJbnRlcnNlY3Rpb25PYnNlcnZlciBpZiBhY3RpdmVcbiAgICAgKiBAdW5sb2FkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1bnMgYXNzb2NpYXRlZCBjYWxsYmFja3MgZm9yIGVhY2ggZW50cnksIHRoZW4gcmVtb3ZlcyB0aGF0IGVudHJ5IGFuZCBjYWxsYmFja1xuICAgICAqIEBfb2JzZXJ2ZXJDYWxsYmFja1xuICAgICAqIEBwYXJhbSB7SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdfSBlbnRyaWVzIEVudHJpZXMgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0ge0ludGVyc2VyY3Rpb25PYnNlcnZlcn0gb2JzZXJ2ZXIgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgaW5zdGFuY2VcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9vYnNlcnZlckNhbGxiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMsIG9ic2VydmVyKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGlzSW50ZXJzZWN0aW5nID0gX3JlZi5pc0ludGVyc2VjdGluZyxcbiAgICAgICAgICAgIHRhcmdldCA9IF9yZWYudGFyZ2V0O1xuXG4gICAgICAgIC8vIGRvIG5vdGhpbmcgdW5sZXNzIHRhcmdldCBtb3ZlZCBpbnRvIHN0YXRlIG9mIGludGVyc2VjdGlvblxuICAgICAgICBpZiAoaXNJbnRlcnNlY3RpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc3RvcCBvYnNlcnZpbmcgYmVmb3JlIHJ1bm5pbmcgdGhlIGNhbGxiYWNrLCBzbyB3ZSBkb24ndFxuICAgICAgICAgIC8vIHNvbWVob3cgcnVuIHRoZSBjYWxsYmFjayB0d2ljZSBpZiBlbGVtZW50IGludGVyc2VjdHMgdHdpY2UgcXVpY2tseVxuICAgICAgICAgIG9ic2VydmVyLnVub2JzZXJ2ZSh0YXJnZXQpO1xuXG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3RoaXMuY2FsbGJhY2tzLmdldCh0YXJnZXQpO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5jYWxsYmFja3NbXCJkZWxldGVcIl0odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExhenlMb2FkZXI7XG59KCk7XG5cbmZ1bmN0aW9uIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCBldmVudE5hbWUpIHtcbiAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlW2V2ZW50TmFtZV0pIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZVtldmVudE5hbWVdLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkRGF0YShlbCkge1xuICB2YXIgZGF0YUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1kYXRhXScpO1xuICBpZiAoIWRhdGFFbCkgcmV0dXJuIHt9OyAvLyBMb2FkIGRhdGEgZnJvbSBhdHRyaWJ1dGUsIG9yIGlubmVySFRNTFxuXG4gIHZhciBkYXRhID0gZGF0YUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLWRhdGEnKSB8fCBkYXRhRWwuaW5uZXJIVE1MO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IGludmFsaWQgc2VjdGlvbiBkYXRhIGZvdW5kLiBcIi5jb25jYXQoZXJyb3IubWVzc2FnZSkpO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG52YXIgU2hvcGlmeVNlY3Rpb25zTWFuYWdlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNob3BpZnlTZWN0aW9uc01hbmFnZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNob3BpZnlTZWN0aW9uc01hbmFnZXIpO1xuXG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuaW5zdGFuY2VzID0ge307XG4gICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgdGhpcy5sYXp5TG9hZGVyID0gbnVsbDtcbiAgICB0aGlzLl9vblNlY3Rpb25FdmVudCA9IHRoaXMuX29uU2VjdGlvbkV2ZW50LmJpbmQodGhpcyk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246c2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICB9XG4gIC8qKlxuICAgKiBTdG9wIGxpc3RlbmluZyBmb3Igc2VjdGlvbiBldmVudHMsIGFuZCB1bmJpbmQgYWxsIGhhbmRsZXJzLlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhTaG9waWZ5U2VjdGlvbnNNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJ1bmJpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5iaW5kKCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpyZW9yZGVyJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OmJsb2NrOmRlc2VsZWN0JywgdGhpcy5fb25TZWN0aW9uRXZlbnQpOyAvLyBVbmxvYWQgYWxsIGluc3RhbmNlc1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KHRoaXMuaW5zdGFuY2VzW2ldLCAnb25TZWN0aW9uVW5sb2FkJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgICAgdGhpcy5sYXp5TG9hZGVyLnVubG9hZCgpO1xuICAgICAgdGhpcy5sYXp5TG9hZGVyID0gbnVsbDtcbiAgICAgIHRoaXMuaW5zdGFuY2VzID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgc2VjdGlvbiBoYW5kbGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICAgKiAgICAgICAgVGhlIHNlY3Rpb24gdHlwZSB0byBoYW5kbGUuIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGZvciBhbGxcbiAgICAgKiAgICAgICAgc2VjdGlvbnMgd2l0aCB0aGlzIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyXG4gICAgICogICAgICAgIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIGlzIHBhc3NlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHNlY3Rpb25cbiAgICAgKiAgICAgICAgaW5zdGFuY2UuIFRoZSBoYW5kbGVyIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAgICogICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqICAgICAgICBTZWN0aW9uIGhhbmRsZXJzIGFyZSBwYXNzZWQgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICAgICAqICAgICAgICAgIHtzdHJpbmd9IGlkXG4gICAgICogICAgICAgICAgQW4gSUQgdGhhdCBtYXBzIHRvIGEgc3BlY2lmaWMgc2VjdGlvbiBpbnN0YW5jZS4gVHlwaWNhbGx5IHRoZVxuICAgICAqICAgICAgICAgIHNlY3Rpb24ncyBmaWxlbmFtZSBmb3Igc3RhdGljIHNlY3Rpb25zLCBvciBhIGdlbmVyYXRlZCBJRCBmb3JcbiAgICAgKiAgICAgICAgICBkeW5hbWljIHNlY3Rpb25zLlxuICAgICAqXG4gICAgICogICAgICAgICAge3N0cmluZ30gdHlwZVxuICAgICAqICAgICAgICAgIFRoZSBzZWN0aW9uIHR5cGUsIGFzIHN1cHBsaWVkIHdoZW4gcmVnaXN0ZXJlZC5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtFbGVtZW50fSBlbFxuICAgICAqICAgICAgICAgIFRoZSByb290IERPTSBlbGVtZW50IGZvciB0aGUgc2VjdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtPYmplY3R9IGRhdGFcbiAgICAgKiAgICAgICAgICBEYXRhIGxvYWRlZCBmcm9tIHRoZSBzZWN0aW9uIHNjcmlwdCBlbGVtZW50LiBEZWZhdWx0cyB0byBhblxuICAgICAqICAgICAgICAgIGVtcHR5IG9iamVjdC5cbiAgICAgKlxuICAgICAqICAgICAgICAgIHtGdW5jdGlvbn0gcG9zdE1lc3NhZ2VcbiAgICAgKiAgICAgICAgICBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gc2VjdGlvbnMuXG4gICAgICogICAgICAgICAgVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBhIG1lc3NhZ2UgXCJuYW1lXCIsIGFuZFxuICAgICAqICAgICAgICAgIG9wdGlvbmFsbHkgc29tZSBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5sYXp5XG4gICAgICogICAgIElmIHRydWUsIHNlY3Rpb25zIHdpbGwgb25seSBiZSBpbml0aWFsaXplZCBhZnRlciB0aGV5IGludGVyc2VjdCB0aGUgdmlld3BvcnQgKyAzMCUgbWFyZ2luXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZXJzW3R5cGVdKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIlNlY3Rpb25zOiBzZWN0aW9uIGhhbmRsZXIgYWxyZWFkeSBleGlzdHMgb2YgdHlwZSAnXCIuY29uY2F0KHR5cGUsIFwiJy5cIikpO1xuICAgICAgfSAvLyBTdG9yZSB0aGUgc2VjdGlvbiBoYW5kbGVyXG5cblxuICAgICAgdGhpcy5oYW5kbGVyc1t0eXBlXSA9IGhhbmRsZXI7IC8vIFN0b3JlIG9wdGlvbnNcblxuICAgICAgdGhpcy5vcHRpb25zW3R5cGVdID0gb3B0aW9uczsgLy8gSW5pdCBzZWN0aW9ucyBmb3IgdGhpcyB0eXBlXG5cbiAgICAgIHRoaXMuX2luaXRTZWN0aW9ucyh0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBzZWN0aW9ucyBhbHJlYWR5IG9uIHRoZSBwYWdlLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiX2luaXRTZWN0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdFNlY3Rpb25zKHR5cGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIC8vIEZldGNoIGFsbCBleGlzdGluZyBzZWN0aW9ucyBvZiBvdXIgdHlwZSBvbiB0aGUgcGFnZVxuICAgICAgdmFyIGRhdGFFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtc2VjdGlvbi10eXBlPVxcXCJcIi5jb25jYXQodHlwZSwgXCJcXFwiXVwiKSk7XG4gICAgICBpZiAoIWRhdGFFbHMpIHJldHVybjsgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBlYWNoIHNlY3Rpb25cblxuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgICAgICB2YXIgZGF0YUVsID0gZGF0YUVsc1tpXTtcbiAgICAgICAgdmFyIGVsID0gZGF0YUVsLnBhcmVudE5vZGU7IC8vIEdldCBpbnN0YW5jZSBJRFxuXG4gICAgICAgIHZhciBpZEVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi1pZF0nKTtcblxuICAgICAgICBpZiAoIWlkRWwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJTZWN0aW9uczogdW5hYmxlIHRvIGZpbmQgc2VjdGlvbiBpZCBmb3IgJ1wiLmNvbmNhdCh0eXBlLCBcIicuXCIpLCBlbCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IHZvaWQgMFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VjdGlvbklkID0gaWRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2VjdGlvbi1pZCcpO1xuXG4gICAgICAgIGlmICghc2VjdGlvbklkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaWQgZm9yICdcIi5jb25jYXQodHlwZSwgXCInLlwiKSwgZWwpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2OiB2b2lkIDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLm9wdGlvbnNbdHlwZV0gJiYgX3RoaXMub3B0aW9uc1t0eXBlXS5sYXp5KSB7XG4gICAgICAgICAgaWYgKF90aGlzLmxhenlMb2FkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIF90aGlzLmxhenlMb2FkZXIgPSBuZXcgTGF6eUxvYWRlcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLmxhenlMb2FkZXIuYWRkKGVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLl9jcmVhdGVJbnN0YW5jZShzZWN0aW9uSWQsIGVsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBfcmV0ID0gX2xvb3AoaSk7XG5cbiAgICAgICAgaWYgKF90eXBlb2YoX3JldCkgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9vblNlY3Rpb25FdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25TZWN0aW9uRXZlbnQoZXZlbnQpIHtcbiAgICAgIHZhciBlbCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIHZhciBfZXZlbnQkZGV0YWlsID0gZXZlbnQuZGV0YWlsLFxuICAgICAgICAgIHNlY3Rpb25JZCA9IF9ldmVudCRkZXRhaWwuc2VjdGlvbklkLFxuICAgICAgICAgIGJsb2NrSWQgPSBfZXZlbnQkZGV0YWlsLmJsb2NrSWQ7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlc1tzZWN0aW9uSWRdO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOmxvYWQnOlxuICAgICAgICAgIHRoaXMuX2NyZWF0ZUluc3RhbmNlKHNlY3Rpb25JZCwgZWwpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnVubG9hZCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25VbmxvYWQnLCB7XG4gICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICBpZDogc2VjdGlvbklkXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxhenlMb2FkZXIucmVtb3ZlKGVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5pbnN0YW5jZXNbc2VjdGlvbklkXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246c2VsZWN0JzpcbiAgICAgICAgICB0cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvblNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBzZWN0aW9uSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uRGVzZWxlY3QnLCB7XG4gICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICBpZDogc2VjdGlvbklkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpzZWN0aW9uOnJlb3JkZXInOlxuICAgICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uUmVvcmRlcicsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBzZWN0aW9uSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzaG9waWZ5OmJsb2NrOnNlbGVjdCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25CbG9ja1NlbGVjdCcsIHtcbiAgICAgICAgICAgIGVsOiBlbCxcbiAgICAgICAgICAgIGlkOiBibG9ja0lkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2hvcGlmeTpibG9jazpkZXNlbGVjdCc6XG4gICAgICAgICAgdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25CbG9ja0Rlc2VsZWN0Jywge1xuICAgICAgICAgICAgZWw6IGVsLFxuICAgICAgICAgICAgaWQ6IGJsb2NrSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Bvc3RNZXNzYWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9wb3N0TWVzc2FnZShuYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZXMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHRyaWdnZXJJbnN0YW5jZUV2ZW50KF90aGlzMi5pbnN0YW5jZXNbaWRdLCAnb25TZWN0aW9uTWVzc2FnZScsIG5hbWUsIGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jcmVhdGVJbnN0YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY3JlYXRlSW5zdGFuY2UoaWQsIGVsKSB7XG4gICAgICB2YXIgdHlwZUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi10eXBlXScpO1xuICAgICAgaWYgKCF0eXBlRWwpIHJldHVybjtcbiAgICAgIHZhciB0eXBlID0gdHlwZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLXR5cGUnKTtcbiAgICAgIGlmICghdHlwZSkgcmV0dXJuO1xuICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuXG4gICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaGFuZGxlciBmb3IgdHlwZSAnXCIuY29uY2F0KHR5cGUsIFwiJy5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBkYXRhID0gbG9hZERhdGEoZWwpO1xuXG4gICAgICB2YXIgcG9zdE1lc3NhZ2UgPSB0aGlzLl9wb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmluc3RhbmNlc1tpZF0gPSBoYW5kbGVyKHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBlbDogZWwsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIHBvc3RNZXNzYWdlOiBwb3N0TWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNob3BpZnlTZWN0aW9uc01hbmFnZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\n")},
vendor: 36,763 bytes, line 1
1"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nvar LOCAL_STORAGE_KEY = 'pxu-shopify-surface-pick-up';\nvar loadingClass = 'surface-pick-up--loading';\n\nvar isNotExpired = function isNotExpired(timestamp) {\n return timestamp + 1000 * 60 * 60 >= Date.now();\n};\n\nvar removeTrailingSlash = function removeTrailingSlash(s) {\n return s.replace(/(.*)\\/$/, '$1');\n}; // Haversine Distance\n// The haversine formula is an equation giving great-circle distances between\n// two points on a sphere from their longitudes and latitudes\n\n\nfunction calculateDistance(latitude1, longitude1, latitude2, longitude2, unitSystem) {\n var dtor = Math.PI / 180;\n var radius = unitSystem === 'metric' ? 6378.14 : 3959;\n var rlat1 = latitude1 * dtor;\n var rlong1 = longitude1 * dtor;\n var rlat2 = latitude2 * dtor;\n var rlong2 = longitude2 * dtor;\n var dlon = rlong1 - rlong2;\n var dlat = rlat1 - rlat2;\n var a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.pow(Math.sin(dlon / 2), 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return radius * c;\n}\n\nfunction getGeoLocation() {\n return _getGeoLocation.apply(this, arguments);\n}\n\nfunction _getGeoLocation() {\n _getGeoLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt(\"return\", new Promise(function (resolve, reject) {\n var options = {\n maximumAge: 3600000,\n // 1 hour\n timeout: 5000\n };\n\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(function (_ref3) {\n var coords = _ref3.coords;\n return resolve(coords);\n }, reject, options);\n } else {\n reject();\n }\n }));\n\n case 1:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n return _getGeoLocation.apply(this, arguments);\n}\n\nfunction setLocation(_x) {\n return _setLocation.apply(this, arguments);\n}\n\nfunction _setLocation() {\n _setLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref) {\n var latitude, longitude, newData;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n latitude = _ref.latitude, longitude = _ref.longitude;\n newData = {\n latitude: latitude,\n longitude: longitude,\n timestamp: Date.now()\n };\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(newData));\n return _context2.abrupt(\"return\", fetch('/localization.json', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n latitude: latitude,\n longitude: longitude\n })\n }).then(function () {\n return {\n latitude: latitude,\n longitude: longitude\n };\n }));\n\n case 4:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n return _setLocation.apply(this, arguments);\n}\n\nfunction getLocation() {\n return _getLocation.apply(this, arguments);\n}\n\nfunction _getLocation() {\n _getLocation = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n var requestLocation,\n cachedLocation,\n _args3 = arguments;\n return regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n requestLocation = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : false;\n cachedLocation = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY));\n\n if (!(cachedLocation && isNotExpired(cachedLocation.timestamp))) {\n _context3.next = 4;\n break;\n }\n\n return _context3.abrupt(\"return\", cachedLocation);\n\n case 4:\n if (!requestLocation) {\n _context3.next = 6;\n break;\n }\n\n return _context3.abrupt(\"return\", getGeoLocation().then(function (coords) {\n setLocation(coords); // We don't need to wait for this\n\n return coords;\n }));\n\n case 6:\n return _context3.abrupt(\"return\", null);\n\n case 7:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n return _getLocation.apply(this, arguments);\n}\n\nvar SurfacePickUp = /*#__PURE__*/function () {\n function SurfacePickUp(el, options) {\n _classCallCheck(this, SurfacePickUp);\n\n this.el = el;\n this.options = _objectSpread2({\n root_url: window.Theme && window.Theme.routes && window.Theme.routes.root_url || ''\n }, options);\n this.options.root_url = removeTrailingSlash(this.options.root_url);\n this.callbacks = [];\n this.onBtnPress = null;\n this.latestVariantId = null;\n }\n\n _createClass(SurfacePickUp, [{\n key: \"load\",\n value: function load(variantId) {\n var _this = this;\n\n // If no variant is available, empty element and quick-return\n if (!variantId) {\n this.el.innerHTML = '';\n return Promise.resolve(true);\n } // Because Shopify doesn't expose any `pick_up_enabled` data on the shop object, we\n // don't know if the variant might be, or is definitely not available for pick up.\n // Until we know the shop has > 0 pick up locations, we want to avoid prompting the\n // user for location data (it's annoying, and only makes sense to do if we use it).\n //\n // Instead, we have to make an initial request, check and see if any pick up locations\n // were returned, then ask for the users location, then make another request to get the\n // location-aware pick up locations.\n //\n // As far as I can tell the pick up aware locations differ only in sort order - which\n // we could do on the front end - but we're following this approach to ensure future\n // compatibility with any changes Shopify makes (maybe disabling options based on\n // user location, or whatever else).\n //\n // Shopify has indicated they will look into adding pick_up_enabled data to the shop\n // object, which which case this method can be greatly simplifed into 2 simple cases.\n\n\n this.latestVariantId = variantId;\n this.el.classList.add(loadingClass);\n return this._getData(variantId).then(function (data) {\n return _this._injectData(data);\n });\n }\n }, {\n key: \"onModalRequest\",\n value: function onModalRequest(callback) {\n if (this.callbacks.indexOf(callback) >= 0) return;\n this.callbacks.push(callback);\n }\n }, {\n key: \"offModalRequest\",\n value: function offModalRequest(callback) {\n this.callbacks.splice(this.callbacks.indexOf(callback));\n }\n }, {\n key: \"unload\",\n value: function unload() {\n this.callbacks = [];\n this.el.innerHTML = '';\n }\n }, {\n key: \"_getData\",\n value: function _getData(variantId) {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var xhr = new XMLHttpRequest();\n var requestUrl = \"\".concat(_this2.options.root_url, \"/variants/\").concat(variantId, \"/?section_id=surface-pick-up\");\n xhr.open('GET', requestUrl, true);\n\n xhr.onload = function () {\n var el = xhr.response;\n var embed = el.querySelector('[data-html=\"surface-pick-up-embed\"]');\n var itemsContainer = el.querySelector('[data-html=\"surface-pick-up-items\"]');\n var items = itemsContainer.content.querySelectorAll('[data-surface-pick-up-item]');\n resolve({\n embed: embed,\n itemsContainer: itemsContainer,\n items: items,\n variantId: variantId\n });\n };\n\n xhr.onerror = function () {\n resolve({\n embed: {\n innerHTML: ''\n },\n itemsContainer: {\n innerHTML: ''\n },\n items: [],\n variantId: variantId\n });\n };\n\n xhr.responseType = 'document';\n xhr.send();\n });\n }\n }, {\n key: \"_injectData\",\n value: function _injectData(_ref2) {\n var _this3 = this;\n\n var embed = _ref2.embed,\n itemsContainer = _ref2.itemsContainer,\n items = _ref2.items,\n variantId = _ref2.variantId;\n\n if (variantId !== this.latestVariantId || items.length === 0) {\n this.el.innerHTML = '';\n this.el.classList.remove(loadingClass);\n return;\n }\n\n this.el.innerHTML = embed.innerHTML;\n this.el.classList.remove(loadingClass);\n var calculatedDistances = false;\n\n var calculateDistances = function calculateDistances() {\n if (calculatedDistances) return Promise.resolve();\n return getLocation(true).then(function (coords) {\n items.forEach(function (item) {\n var distanceEl = item.querySelector('[data-distance]');\n var distanceUnitEl = item.querySelector('[data-distance-unit]');\n var unitSystem = distanceUnitEl.dataset.distanceUnit;\n var itemLatitude = parseFloat(distanceEl.dataset.latitude);\n var itemLongitude = parseFloat(distanceEl.dataset.longitude);\n\n if (coords && isFinite(itemLatitude) && isFinite(itemLongitude)) {\n var distance = calculateDistance(coords.latitude, coords.longitude, itemLatitude, itemLongitude, unitSystem);\n distanceEl.innerHTML = distance.toFixed(1);\n } else {\n distanceEl.remove();\n distanceUnitEl.remove();\n }\n });\n })[\"catch\"](function (e) {\n console.log(e);\n items.forEach(function (item) {\n var distanceEl = item.querySelector('[data-distance]');\n var distanceUnitEl = item.querySelector('[data-distance-unit]');\n distanceEl.remove();\n distanceUnitEl.remove();\n });\n })[\"finally\"](function () {\n calculatedDistances = true;\n });\n };\n\n this.el.querySelector('[data-surface-pick-up-embed-modal-btn]').addEventListener('click', function () {\n calculateDistances().then(function () {\n return _this3.callbacks.forEach(function (callback) {\n return callback(itemsContainer.innerHTML);\n });\n });\n });\n }\n }]);\n\n return SurfacePickUp;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SurfacePickUp);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHBpeGVsdW5pb24vc2hvcGlmeS1zdXJmYWNlLXBpY2stdXAvZGlzdC9pbmRleC5lcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BwaXhlbHVuaW9uL3Nob3BpZnktc3VyZmFjZS1waWNrLXVwL2Rpc3QvaW5kZXguZXMuanM/N2FlOSJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pO1xuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxudmFyIExPQ0FMX1NUT1JBR0VfS0VZID0gJ3B4dS1zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG52YXIgbG9hZGluZ0NsYXNzID0gJ3N1cmZhY2UtcGljay11cC0tbG9hZGluZyc7XG5cbnZhciBpc05vdEV4cGlyZWQgPSBmdW5jdGlvbiBpc05vdEV4cGlyZWQodGltZXN0YW1wKSB7XG4gIHJldHVybiB0aW1lc3RhbXAgKyAxMDAwICogNjAgKiA2MCA+PSBEYXRlLm5vdygpO1xufTtcblxudmFyIHJlbW92ZVRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NsYXNoKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvKC4qKVxcLyQvLCAnJDEnKTtcbn07IC8vIEhhdmVyc2luZSBEaXN0YW5jZVxuLy8gVGhlIGhhdmVyc2luZSBmb3JtdWxhIGlzIGFuIGVxdWF0aW9uIGdpdmluZyBncmVhdC1jaXJjbGUgZGlzdGFuY2VzIGJldHdlZW5cbi8vIHR3byBwb2ludHMgb24gYSBzcGhlcmUgZnJvbSB0aGVpciBsb25naXR1ZGVzIGFuZCBsYXRpdHVkZXNcblxuXG5mdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShsYXRpdHVkZTEsIGxvbmdpdHVkZTEsIGxhdGl0dWRlMiwgbG9uZ2l0dWRlMiwgdW5pdFN5c3RlbSkge1xuICB2YXIgZHRvciA9IE1hdGguUEkgLyAxODA7XG4gIHZhciByYWRpdXMgPSB1bml0U3lzdGVtID09PSAnbWV0cmljJyA/IDYzNzguMTQgOiAzOTU5O1xuICB2YXIgcmxhdDEgPSBsYXRpdHVkZTEgKiBkdG9yO1xuICB2YXIgcmxvbmcxID0gbG9uZ2l0dWRlMSAqIGR0b3I7XG4gIHZhciBybGF0MiA9IGxhdGl0dWRlMiAqIGR0b3I7XG4gIHZhciBybG9uZzIgPSBsb25naXR1ZGUyICogZHRvcjtcbiAgdmFyIGRsb24gPSBybG9uZzEgLSBybG9uZzI7XG4gIHZhciBkbGF0ID0gcmxhdDEgLSBybGF0MjtcbiAgdmFyIGEgPSBNYXRoLnBvdyhNYXRoLnNpbihkbGF0IC8gMiksIDIpICsgTWF0aC5jb3MocmxhdDEpICogTWF0aC5jb3MocmxhdDIpICogTWF0aC5wb3coTWF0aC5zaW4oZGxvbiAvIDIpLCAyKTtcbiAgdmFyIGMgPSAyICogTWF0aC5hdGFuMihNYXRoLnNxcnQoYSksIE1hdGguc3FydCgxIC0gYSkpO1xuICByZXR1cm4gcmFkaXVzICogYztcbn1cblxuZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24oKSB7XG4gIHJldHVybiBfZ2V0R2VvTG9jYXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2dldEdlb0xvY2F0aW9uKCkge1xuICBfZ2V0R2VvTG9jYXRpb24gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1heGltdW1BZ2U6IDM2MDAwMDAsXG4gICAgICAgICAgICAgICAgLy8gMSBob3VyXG4gICAgICAgICAgICAgICAgdGltZW91dDogNTAwMFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgICAgICAgICAgdmFyIGNvb3JkcyA9IF9yZWYzLmNvb3JkcztcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgfSwgcmVqZWN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlKTtcbiAgfSkpO1xuICByZXR1cm4gX2dldEdlb0xvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIHNldExvY2F0aW9uKF94KSB7XG4gIHJldHVybiBfc2V0TG9jYXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX3NldExvY2F0aW9uKCkge1xuICBfc2V0TG9jYXRpb24gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKF9yZWYpIHtcbiAgICB2YXIgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgbmV3RGF0YTtcbiAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgbGF0aXR1ZGUgPSBfcmVmLmxhdGl0dWRlLCBsb25naXR1ZGUgPSBfcmVmLmxvbmdpdHVkZTtcbiAgICAgICAgICAgIG5ld0RhdGEgPSB7XG4gICAgICAgICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShuZXdEYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBmZXRjaCgnL2xvY2FsaXphdGlvbi5qc29uJywge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUyKTtcbiAgfSkpO1xuICByZXR1cm4gX3NldExvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGdldExvY2F0aW9uKCkge1xuICByZXR1cm4gX2dldExvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9nZXRMb2NhdGlvbigpIHtcbiAgX2dldExvY2F0aW9uID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICB2YXIgcmVxdWVzdExvY2F0aW9uLFxuICAgICAgICBjYWNoZWRMb2NhdGlvbixcbiAgICAgICAgX2FyZ3MzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICB3aGlsZSAoMSkge1xuICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXF1ZXN0TG9jYXRpb24gPSBfYXJnczMubGVuZ3RoID4gMCAmJiBfYXJnczNbMF0gIT09IHVuZGVmaW5lZCA/IF9hcmdzM1swXSA6IGZhbHNlO1xuICAgICAgICAgICAgY2FjaGVkTG9jYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKSk7XG5cbiAgICAgICAgICAgIGlmICghKGNhY2hlZExvY2F0aW9uICYmIGlzTm90RXhwaXJlZChjYWNoZWRMb2NhdGlvbi50aW1lc3RhbXApKSkge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBjYWNoZWRMb2NhdGlvbik7XG5cbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3RMb2NhdGlvbikge1xuICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLmFicnVwdChcInJldHVyblwiLCBnZXRHZW9Mb2NhdGlvbigpLnRoZW4oZnVuY3Rpb24gKGNvb3Jkcykge1xuICAgICAgICAgICAgICBzZXRMb2NhdGlvbihjb29yZHMpOyAvLyBXZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHRoaXNcblxuICAgICAgICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5hYnJ1cHQoXCJyZXR1cm5cIiwgbnVsbCk7XG5cbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBfY2FsbGVlMyk7XG4gIH0pKTtcbiAgcmV0dXJuIF9nZXRMb2NhdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG52YXIgU3VyZmFjZVBpY2tVcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1cmZhY2VQaWNrVXAoZWwsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3VyZmFjZVBpY2tVcCk7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5vcHRpb25zID0gX29iamVjdFNwcmVhZDIoe1xuICAgICAgcm9vdF91cmw6IHdpbmRvdy5UaGVtZSAmJiB3aW5kb3cuVGhlbWUucm91dGVzICYmIHdpbmRvdy5UaGVtZS5yb3V0ZXMucm9vdF91cmwgfHwgJydcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMucm9vdF91cmwgPSByZW1vdmVUcmFpbGluZ1NsYXNoKHRoaXMub3B0aW9ucy5yb290X3VybCk7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLm9uQnRuUHJlc3MgPSBudWxsO1xuICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTdXJmYWNlUGlja1VwLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodmFyaWFudElkKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBJZiBubyB2YXJpYW50IGlzIGF2YWlsYWJsZSwgZW1wdHkgZWxlbWVudCBhbmQgcXVpY2stcmV0dXJuXG4gICAgICBpZiAoIXZhcmlhbnRJZCkge1xuICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSAvLyBCZWNhdXNlIFNob3BpZnkgZG9lc24ndCBleHBvc2UgYW55IGBwaWNrX3VwX2VuYWJsZWRgIGRhdGEgb24gdGhlIHNob3Agb2JqZWN0LCB3ZVxuICAgICAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgdmFyaWFudCBtaWdodCBiZSwgb3IgaXMgZGVmaW5pdGVseSBub3QgYXZhaWxhYmxlIGZvciBwaWNrIHVwLlxuICAgICAgLy8gVW50aWwgd2Uga25vdyB0aGUgc2hvcCBoYXMgPiAwIHBpY2sgdXAgbG9jYXRpb25zLCB3ZSB3YW50IHRvIGF2b2lkIHByb21wdGluZyB0aGVcbiAgICAgIC8vIHVzZXIgZm9yIGxvY2F0aW9uIGRhdGEgKGl0J3MgYW5ub3lpbmcsIGFuZCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRvIGlmIHdlIHVzZSBpdCkuXG4gICAgICAvL1xuICAgICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSB0byBtYWtlIGFuIGluaXRpYWwgcmVxdWVzdCwgY2hlY2sgYW5kIHNlZSBpZiBhbnkgcGljayB1cCBsb2NhdGlvbnNcbiAgICAgIC8vIHdlcmUgcmV0dXJuZWQsIHRoZW4gYXNrIGZvciB0aGUgdXNlcnMgbG9jYXRpb24sIHRoZW4gbWFrZSBhbm90aGVyIHJlcXVlc3QgdG8gZ2V0IHRoZVxuICAgICAgLy8gbG9jYXRpb24tYXdhcmUgcGljayB1cCBsb2NhdGlvbnMuXG4gICAgICAvL1xuICAgICAgLy8gQXMgZmFyIGFzIEkgY2FuIHRlbGwgdGhlIHBpY2sgdXAgYXdhcmUgbG9jYXRpb25zIGRpZmZlciBvbmx5IGluIHNvcnQgb3JkZXIgLSB3aGljaFxuICAgICAgLy8gd2UgY291bGQgZG8gb24gdGhlIGZyb250IGVuZCAtIGJ1dCB3ZSdyZSBmb2xsb3dpbmcgdGhpcyBhcHByb2FjaCB0byBlbnN1cmUgZnV0dXJlXG4gICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggYW55IGNoYW5nZXMgU2hvcGlmeSBtYWtlcyAobWF5YmUgZGlzYWJsaW5nIG9wdGlvbnMgYmFzZWQgb25cbiAgICAgIC8vIHVzZXIgbG9jYXRpb24sIG9yIHdoYXRldmVyIGVsc2UpLlxuICAgICAgLy9cbiAgICAgIC8vIFNob3BpZnkgaGFzIGluZGljYXRlZCB0aGV5IHdpbGwgbG9vayBpbnRvIGFkZGluZyBwaWNrX3VwX2VuYWJsZWQgZGF0YSB0byB0aGUgc2hvcFxuICAgICAgLy8gb2JqZWN0LCB3aGljaCB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIGNhbiBiZSBncmVhdGx5IHNpbXBsaWZlZCBpbnRvIDIgc2ltcGxlIGNhc2VzLlxuXG5cbiAgICAgIHRoaXMubGF0ZXN0VmFyaWFudElkID0gdmFyaWFudElkO1xuICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKGxvYWRpbmdDbGFzcyk7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RGF0YSh2YXJpYW50SWQpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9pbmplY3REYXRhKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uTW9kYWxSZXF1ZXN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uTW9kYWxSZXF1ZXN0KGNhbGxiYWNrKSB7XG4gICAgICBpZiAodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjaykgPj0gMCkgcmV0dXJuO1xuICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9mZk1vZGFsUmVxdWVzdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZNb2RhbFJlcXVlc3QoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZSh0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVubG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmxvYWQoKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldERhdGEodmFyaWFudElkKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgdmFyIHJlcXVlc3RVcmwgPSBcIlwiLmNvbmNhdChfdGhpczIub3B0aW9ucy5yb290X3VybCwgXCIvdmFyaWFudHMvXCIpLmNvbmNhdCh2YXJpYW50SWQsIFwiLz9zZWN0aW9uX2lkPXN1cmZhY2UtcGljay11cFwiKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RVcmwsIHRydWUpO1xuXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGVsID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgIHZhciBlbWJlZCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWh0bWw9XCJzdXJmYWNlLXBpY2stdXAtZW1iZWRcIl0nKTtcbiAgICAgICAgICB2YXIgaXRlbXNDb250YWluZXIgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1odG1sPVwic3VyZmFjZS1waWNrLXVwLWl0ZW1zXCJdJyk7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gaXRlbXNDb250YWluZXIuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtaXRlbV0nKTtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGVtYmVkOiBlbWJlZCxcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyOiBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBlbWJlZDoge1xuICAgICAgICAgICAgICBpbm5lckhUTUw6ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXI6IHtcbiAgICAgICAgICAgICAgaW5uZXJIVE1MOiAnJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2luamVjdERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2luamVjdERhdGEoX3JlZjIpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgZW1iZWQgPSBfcmVmMi5lbWJlZCxcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lciA9IF9yZWYyLml0ZW1zQ29udGFpbmVyLFxuICAgICAgICAgIGl0ZW1zID0gX3JlZjIuaXRlbXMsXG4gICAgICAgICAgdmFyaWFudElkID0gX3JlZjIudmFyaWFudElkO1xuXG4gICAgICBpZiAodmFyaWFudElkICE9PSB0aGlzLmxhdGVzdFZhcmlhbnRJZCB8fCBpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKGxvYWRpbmdDbGFzcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSBlbWJlZC5pbm5lckhUTUw7XG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUobG9hZGluZ0NsYXNzKTtcbiAgICAgIHZhciBjYWxjdWxhdGVkRGlzdGFuY2VzID0gZmFsc2U7XG5cbiAgICAgIHZhciBjYWxjdWxhdGVEaXN0YW5jZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZXMoKSB7XG4gICAgICAgIGlmIChjYWxjdWxhdGVkRGlzdGFuY2VzKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBnZXRMb2NhdGlvbih0cnVlKS50aGVuKGZ1bmN0aW9uIChjb29yZHMpIHtcbiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgICB2YXIgdW5pdFN5c3RlbSA9IGRpc3RhbmNlVW5pdEVsLmRhdGFzZXQuZGlzdGFuY2VVbml0O1xuICAgICAgICAgICAgdmFyIGl0ZW1MYXRpdHVkZSA9IHBhcnNlRmxvYXQoZGlzdGFuY2VFbC5kYXRhc2V0LmxhdGl0dWRlKTtcbiAgICAgICAgICAgIHZhciBpdGVtTG9uZ2l0dWRlID0gcGFyc2VGbG9hdChkaXN0YW5jZUVsLmRhdGFzZXQubG9uZ2l0dWRlKTtcblxuICAgICAgICAgICAgaWYgKGNvb3JkcyAmJiBpc0Zpbml0ZShpdGVtTGF0aXR1ZGUpICYmIGlzRmluaXRlKGl0ZW1Mb25naXR1ZGUpKSB7XG4gICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNhbGN1bGF0ZURpc3RhbmNlKGNvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZSwgaXRlbUxhdGl0dWRlLCBpdGVtTG9uZ2l0dWRlLCB1bml0U3lzdGVtKTtcbiAgICAgICAgICAgICAgZGlzdGFuY2VFbC5pbm5lckhUTUwgPSBkaXN0YW5jZS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlzdGFuY2VFbC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VFbCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtZGlzdGFuY2VdJyk7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2VVbml0RWwgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3RhbmNlLXVuaXRdJyk7XG4gICAgICAgICAgICBkaXN0YW5jZUVsLnJlbW92ZSgpO1xuICAgICAgICAgICAgZGlzdGFuY2VVbml0RWwucmVtb3ZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiZmluYWxseVwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsY3VsYXRlZERpc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtZW1iZWQtbW9kYWwtYnRuXScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxjdWxhdGVEaXN0YW5jZXMoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN1cmZhY2VQaWNrVXA7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFN1cmZhY2VQaWNrVXA7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\n")},
vendor: 10,911 bytes, line 1
1"./node_modules/@shopify/theme-addresses/theme-addresses.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CountryProvinceSelector\": () => (/* binding */ CountryProvinceSelector)\n/* harmony export */ });\n/**\n * CountryProvinceSelector Constructor\n * @param {String} countryOptions the country options in html string\n */\nfunction CountryProvinceSelector(countryOptions) {\n if (typeof countryOptions !== 'string') {\n throw new TypeError(countryOptions + ' is not a string.');\n }\n this.countryOptions = countryOptions;\n}\n\n/**\n * Builds the country and province selector with the given node element\n * @param {Node} countryNodeElement The <select> element for country\n * @param {Node} provinceNodeElement The <select> element for province\n * @param {Object} options Additional settings available\n * @param {CountryProvinceSelector~onCountryChange} options.onCountryChange callback after a country `change` event\n * @param {CountryProvinceSelector~onProvinceChange} options.onProvinceChange callback after a province `change` event\n */\nCountryProvinceSelector.prototype.build = function (countryNodeElement, provinceNodeElement, options) {\n if (typeof countryNodeElement !== 'object') {\n throw new TypeError(countryNodeElement + ' is not a object.');\n }\n\n if (typeof provinceNodeElement !== 'object') {\n throw new TypeError(provinceNodeElement + ' is not a object.');\n }\n\n var defaultValue = countryNodeElement.getAttribute('data-default');\n options = options || {}\n\n countryNodeElement.innerHTML = this.countryOptions;\n countryNodeElement.value = defaultValue;\n\n if (defaultValue && getOption(countryNodeElement, defaultValue)) {\n var provinces = buildProvince(countryNodeElement, provinceNodeElement, defaultValue);\n options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n }\n\n // Listen for value change on the country select\n countryNodeElement.addEventListener('change', function (event) {\n var target = event.target;\n var selectedValue = target.value;\n \n var provinces = buildProvince(target, provinceNodeElement, selectedValue);\n options.onCountryChange && options.onCountryChange(provinces, provinceNodeElement, countryNodeElement);\n });\n\n options.onProvinceChange && provinceNodeElement.addEventListener('change', options.onProvinceChange);\n}\n\n/**\n * This callback is called after a user interacted with a country `<select>`\n * @callback CountryProvinceSelector~onCountryChange\n * @param {array} provinces the parsed provinces\n * @param {Node} provinceNodeElement province `<select>` element\n * @param {Node} countryNodeElement country `<select>` element\n */\n\n /**\n * This callback is called after a user interacted with a province `<select>`\n * @callback CountryProvinceSelector~onProvinceChange\n * @param {Event} event the province selector `change` event object\n */\n\n/**\n * Returns the <option> with the specified value from the\n * given node element\n * A null is returned if no such <option> is found\n */\nfunction getOption(nodeElement, value) {\n return nodeElement.querySelector('option[value=\"' + value +'\"]')\n}\n\n/**\n * Builds the options for province selector\n */\nfunction buildOptions (provinceNodeElement, provinces) {\n var defaultValue = provinceNodeElement.getAttribute('data-default');\n\n provinces.forEach(function (option) {\n var optionElement = document.createElement('option');\n optionElement.value = option[0];\n optionElement.textContent = option[1];\n\n provinceNodeElement.appendChild(optionElement);\n })\n\n if (defaultValue && getOption(provinceNodeElement, defaultValue)) {\n provinceNodeElement.value = defaultValue;\n }\n}\n\n/**\n * Builds the province selector\n */\nfunction buildProvince (countryNodeElement, provinceNodeElement, selectedValue) {\n var selectedOption = getOption(countryNodeElement, selectedValue);\n var provinces = JSON.parse(selectedOption.getAttribute('data-provinces'));\n\n provinceNodeElement.options.length = 0;\n\n if (provinces.length) {\n buildOptions(provinceNodeElement, provinces)\n }\n\n return provinces;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvQHNob3BpZnkvdGhlbWUtYWRkcmVzc2VzL3RoZW1lLWFkZHJlc3Nlcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL0BzaG9waWZ5L3RoZW1lLWFkZHJlc3Nlcy90aGVtZS1hZGRyZXNzZXMuanM/MTliNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvdW50cnlQcm92aW5jZVNlbGVjdG9yIENvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gY291bnRyeU9wdGlvbnMgdGhlIGNvdW50cnkgb3B0aW9ucyBpbiBodG1sIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IoY291bnRyeU9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBjb3VudHJ5T3B0aW9ucyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNvdW50cnlPcHRpb25zICsgJyBpcyBub3QgYSBzdHJpbmcuJyk7XG4gIH1cbiAgdGhpcy5jb3VudHJ5T3B0aW9ucyA9IGNvdW50cnlPcHRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY291bnRyeSBhbmQgcHJvdmluY2Ugc2VsZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gbm9kZSBlbGVtZW50XG4gKiBAcGFyYW0ge05vZGV9IGNvdW50cnlOb2RlRWxlbWVudCBUaGUgPHNlbGVjdD4gZWxlbWVudCBmb3IgY291bnRyeVxuICogQHBhcmFtIHtOb2RlfSBwcm92aW5jZU5vZGVFbGVtZW50IFRoZSA8c2VsZWN0PiBlbGVtZW50IGZvciBwcm92aW5jZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQWRkaXRpb25hbCBzZXR0aW5ncyBhdmFpbGFibGVcbiAqIEBwYXJhbSB7Q291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Db3VudHJ5Q2hhbmdlfSBvcHRpb25zLm9uQ291bnRyeUNoYW5nZSBjYWxsYmFjayBhZnRlciBhIGNvdW50cnkgYGNoYW5nZWAgZXZlbnRcbiAqIEBwYXJhbSB7Q291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Qcm92aW5jZUNoYW5nZX0gb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlIGNhbGxiYWNrIGFmdGVyIGEgcHJvdmluY2UgYGNoYW5nZWAgZXZlbnRcbiAqL1xuQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGNvdW50cnlOb2RlRWxlbWVudCwgcHJvdmluY2VOb2RlRWxlbWVudCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGNvdW50cnlOb2RlRWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNvdW50cnlOb2RlRWxlbWVudCArICcgaXMgbm90IGEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcm92aW5jZU5vZGVFbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocHJvdmluY2VOb2RlRWxlbWVudCArICcgaXMgbm90IGEgb2JqZWN0LicpO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IGNvdW50cnlOb2RlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGVmYXVsdCcpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGNvdW50cnlOb2RlRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLmNvdW50cnlPcHRpb25zO1xuICBjb3VudHJ5Tm9kZUVsZW1lbnQudmFsdWUgPSBkZWZhdWx0VmFsdWU7XG5cbiAgaWYgKGRlZmF1bHRWYWx1ZSAmJiBnZXRPcHRpb24oY291bnRyeU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpKSB7XG4gICAgdmFyIHByb3ZpbmNlcyA9IGJ1aWxkUHJvdmluY2UoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpO1xuICAgIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlICYmIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlKHByb3ZpbmNlcywgcHJvdmluY2VOb2RlRWxlbWVudCwgY291bnRyeU5vZGVFbGVtZW50KTtcbiAgfVxuXG4gIC8vIExpc3RlbiBmb3IgdmFsdWUgY2hhbmdlIG9uIHRoZSBjb3VudHJ5IHNlbGVjdFxuICBjb3VudHJ5Tm9kZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICBcbiAgICB2YXIgcHJvdmluY2VzID0gYnVpbGRQcm92aW5jZSh0YXJnZXQsIHByb3ZpbmNlTm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpO1xuICAgIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlICYmIG9wdGlvbnMub25Db3VudHJ5Q2hhbmdlKHByb3ZpbmNlcywgcHJvdmluY2VOb2RlRWxlbWVudCwgY291bnRyeU5vZGVFbGVtZW50KTtcbiAgfSk7XG5cbiAgb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlICYmIHByb3ZpbmNlTm9kZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb3B0aW9ucy5vblByb3ZpbmNlQ2hhbmdlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGEgY291bnRyeSBgPHNlbGVjdD5gXG4gKiBAY2FsbGJhY2sgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3J+b25Db3VudHJ5Q2hhbmdlXG4gKiBAcGFyYW0ge2FycmF5fSBwcm92aW5jZXMgdGhlIHBhcnNlZCBwcm92aW5jZXNcbiAqIEBwYXJhbSB7Tm9kZX0gcHJvdmluY2VOb2RlRWxlbWVudCBwcm92aW5jZSBgPHNlbGVjdD5gIGVsZW1lbnRcbiAqIEBwYXJhbSB7Tm9kZX0gY291bnRyeU5vZGVFbGVtZW50IGNvdW50cnkgYDxzZWxlY3Q+YCBlbGVtZW50XG4gKi9cblxuIC8qKlxuICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgYSB1c2VyIGludGVyYWN0ZWQgd2l0aCBhIHByb3ZpbmNlIGA8c2VsZWN0PmBcbiAqIEBjYWxsYmFjayBDb3VudHJ5UHJvdmluY2VTZWxlY3Rvcn5vblByb3ZpbmNlQ2hhbmdlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCB0aGUgcHJvdmluY2Ugc2VsZWN0b3IgYGNoYW5nZWAgZXZlbnQgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSA8b3B0aW9uPiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGVcbiAqIGdpdmVuIG5vZGUgZWxlbWVudFxuICogQSBudWxsIGlzIHJldHVybmVkIGlmIG5vIHN1Y2ggPG9wdGlvbj4gaXMgZm91bmRcbiAqL1xuZnVuY3Rpb24gZ2V0T3B0aW9uKG5vZGVFbGVtZW50LCB2YWx1ZSkge1xuICByZXR1cm4gbm9kZUVsZW1lbnQucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPVwiJyArIHZhbHVlICsnXCJdJylcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgZm9yIHByb3ZpbmNlIHNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkT3B0aW9ucyAocHJvdmluY2VOb2RlRWxlbWVudCwgcHJvdmluY2VzKSB7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBwcm92aW5jZU5vZGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWZhdWx0Jyk7XG5cbiAgcHJvdmluY2VzLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikge1xuICAgIHZhciBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvblswXTtcbiAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uWzFdO1xuXG4gICAgcHJvdmluY2VOb2RlRWxlbWVudC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcbiAgfSlcblxuICBpZiAoZGVmYXVsdFZhbHVlICYmIGdldE9wdGlvbihwcm92aW5jZU5vZGVFbGVtZW50LCBkZWZhdWx0VmFsdWUpKSB7XG4gICAgcHJvdmluY2VOb2RlRWxlbWVudC52YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcHJvdmluY2Ugc2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gYnVpbGRQcm92aW5jZSAoY291bnRyeU5vZGVFbGVtZW50LCBwcm92aW5jZU5vZGVFbGVtZW50LCBzZWxlY3RlZFZhbHVlKSB7XG4gIHZhciBzZWxlY3RlZE9wdGlvbiA9IGdldE9wdGlvbihjb3VudHJ5Tm9kZUVsZW1lbnQsIHNlbGVjdGVkVmFsdWUpO1xuICB2YXIgcHJvdmluY2VzID0gSlNPTi5wYXJzZShzZWxlY3RlZE9wdGlvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvdmluY2VzJykpO1xuXG4gIHByb3ZpbmNlTm9kZUVsZW1lbnQub3B0aW9ucy5sZW5ndGggPSAwO1xuXG4gIGlmIChwcm92aW5jZXMubGVuZ3RoKSB7XG4gICAgYnVpbGRPcHRpb25zKHByb3ZpbmNlTm9kZUVsZW1lbnQsIHByb3ZpbmNlcylcbiAgfVxuXG4gIHJldHVybiBwcm92aW5jZXM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/@shopify/theme-addresses/theme-addresses.js\n")},
1"./source/scripts/app.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n/* harmony import */ var _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-sections-manager */ \"./node_modules/@pixelunion/shopify-sections-manager/dist/shopify-sections-manager.es.js\");\n/* harmony import */ var _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/age-gate */ \"./node_modules/@pixelunion/age-gate/dist/index.es.js\");\n/* harmony import */ var _helpers_ComplementaryProducts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/ComplementaryProducts */ \"./source/scripts/helpers/ComplementaryProducts.js\");\n/* harmony import */ var _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @pixelunion/shopify-surface-pick-up */ \"./node_modules/@pixelunion/shopify-surface-pick-up/dist/index.es.js\");\n/* harmony import */ var _helpers_PaymentTerms__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers/PaymentTerms */ \"./source/scripts/helpers/PaymentTerms.js\");\n/* harmony import */ var _helpers_RecipientForm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers/RecipientForm */ \"./source/scripts/helpers/RecipientForm.js\");\n/* harmony import */ var _helpers_ShippingCalculator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./helpers/ShippingCalculator */ \"./source/scripts/helpers/ShippingCalculator.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n/* harmony import */ var just_debounce__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! just-debounce */ \"./node_modules/just-debounce/index.js\");\n/* harmony import */ var just_debounce__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(just_debounce__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_0__.default.init('[data-rimg=\"lazy\"]', {\n round: 1\n});\nconst sections = new _pixelunion_shopify_sections_manager__WEBPACK_IMPORTED_MODULE_1__.default();\nsections.register('age-gate', section => new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__.PageAgeGate(section));\nconst ageGatePage = document.getElementById('age-gate-page');\n\nif (ageGatePage) {\n new _pixelunion_age_gate__WEBPACK_IMPORTED_MODULE_2__.SiteAgeGate(ageGatePage);\n}\n/*============================================================================\n Global - header\n==============================================================================*/\n\n\nwindow.header = {\n init: function () {\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__.default();\n this.setHeaderPosition(); //remove duplicate header on update\n\n if ($('.mobile-header').length > 1) {\n var nav_menu = $(\"#nav\").data(\"mmenu\");\n nav_menu.close();\n $('.mobile-header:last, #nav:last').remove();\n } // Only applied when there is a full-width banner across top of page\n\n\n var $header = $('.feature_image .header.header-background--false'); // To offset the fixed header\n\n if ($('.header').hasClass('mm-fixed-top')) {\n $('.menu li:not(.cart) a[href^=\"#\"], .flex-caption a[href^=\"#\"]').on('click', function (e) {\n var anchorlink = $(this).attr('href');\n\n if ($('.index-sections').find(anchorlink).length) {\n e.preventDefault();\n var headerHeight = $('.header').outerHeight();\n $('html, body').animate({\n scrollTop: $(anchorlink).offset().top - headerHeight\n }, 2000);\n }\n });\n }\n\n ;\n\n if ($header.hasClass('sticky-header--true')) {\n $(\".index-sections .shopify-section:nth-child(2), .shopify-section:nth-child(2), .main-wrapper, .page-details-block:nth-child(2)\").waypoint(function (direction) {\n if (direction == 'down') {\n $header.addClass('sticky--active fadeInDown delay-0s header_bar');\n $header.removeClass('is-absolute');\n header.dynamicDropdown();\n } else if (direction == 'up') {\n $header.removeClass('sticky--active fadeInDown delay-0s header_bar');\n $header.addClass('is-absolute');\n header.dynamicDropdown();\n }\n }, {\n offset: function () {\n // sticky header activates when merchant scrolls down the page the height of the header plus 250px\n return -$header.outerHeight() - 250;\n }\n });\n }\n\n $header.on('webkitAnimationEnd oanimationend msAnimationEnd animationend', function () {\n $(this).removeClass('fadeIn');\n });\n $('#cart').mmenu({\n navbar: {\n add: false\n },\n offCanvas: {\n pageSelector: \"#content_wrapper\"\n },\n \"extensions\": [\"theme-dark\", \"position-front\", \"position-right\"]\n });\n $('.cart-button, .icon-menu').on(\"click\", function (e) {\n $('#search').hide();\n });\n var navSettings = {\n \"navbar\": {\n add: true,\n title: $('.mobile_logo').html()\n },\n scrollBugFix: {\n fix: true\n },\n searchfield: {\n add: $('#header').data('search-enabled'),\n search: false,\n position: \"top\",\n placeholder: window.PXUTheme.translation.search\n },\n \"extensions\": [\"theme-dark\"],\n offCanvas: {\n pageSelector: \"#content_wrapper\"\n }\n };\n\n if ($('.mobile-search-bar').length > 0) {\n var navSettings = {\n \"navbar\": {\n add: true,\n title: $('.mobile_logo').html()\n },\n scrollBugFix: {\n fix: true\n },\n \"extensions\": [\"theme-dark\"],\n offCanvas: {\n pageSelector: \"#content_wrapper\"\n }\n };\n }\n\n $('#nav').mmenu(navSettings, {\n searchfield: {\n \"form\": {\n \"action\": \"/search\"\n },\n \"input\": {\n \"name\": \"q\"\n }\n }\n }); // Add a link to the navbar title\n\n $('#mm-1').find('.mm-navbar__title').attr('href', '/');\n $('body').on('mouseenter', '.sub-menu', function () {\n $(this).attr('aria-expanded', true);\n $(this).find('details').attr('open', true);\n });\n $('body').on('mouseleave', '.sub-menu', function () {\n $(this).attr('aria-expanded', false);\n $(this).find('details').attr('open', false);\n });\n this.dynamicDropdown();\n this.mobileSearch = document.querySelector('[data-mobile-search]');\n if (!this.mobileSearch) return;\n this.mobileSearchAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n el: this.mobileSearch,\n state: 'closed'\n });\n this.mobileSearchInputs = document.querySelectorAll('.mm-searchfield__input input');\n this.mobileSearchClose = this.mobileSearch.querySelector('[data-search-close]');
1\n this.mobileSearchInputs.forEach(input => {\n this.events.register(input, 'click', () => this._openMobileSearch());\n });\n this.events.register(this.mobileSearchClose, 'click', () => this._closeMobileSearch());\n },\n\n _openMobileSearch() {\n document.body.appendChild(this.mobileSearch);\n this.mobileSearchAnimation.animateTo('open').then(() => {\n const input = this.mobileSearch.querySelector('[data-search-input]');\n const inputLength = input.value.length;\n input.setSelectionRange(inputLength, inputLength);\n input.focus();\n });\n },\n\n _closeMobileSearch() {\n this.mobileSearchAnimation.animateTo('closed');\n },\n\n setHeaderPosition: function () {\n // Determine the header position\n if ($('.promo-banner').length) {\n var announcementHeight = $('.promo-banner').outerHeight();\n $('.header').css('top', announcementHeight);\n } else {\n $('.header').css('top', '0');\n }\n },\n dynamicDropdown: function () {\n var headerNavigationWidth = $('[data-header-navigation]').width();\n var $headerNavItems = $('[data-header-nav-item]');\n var dropdownPosition = $('.header').data('dropdown-position');\n var singleLineNav = true;\n var totalNavItemsWidth = 0;\n $headerNavItems.each(function (index, navItem) {\n totalNavItemsWidth += $(navItem).outerWidth();\n });\n\n if (totalNavItemsWidth > headerNavigationWidth) {\n singleLineNav = false;\n }\n\n if (dropdownPosition == 'below_header' && singleLineNav == true) {\n $('.header_bar').removeClass('header-dropdown-position--below_parent');\n $('.header_bar').addClass('header-dropdown-position--below_header');\n $('.header_bar').attr('data-dropdown-position', 'below_header');\n $('.header_bar.header-dropdown-position--below_header .dropdown').css({\n \"padding-top\": $('.header').height() / 2\n });\n $('.header_bar.header-dropdown-position--below_header .disclosure__list-wrap').css({\n \"padding-top\": $('.header').height() / 2\n });\n } else {\n $('.header').addClass('header-dropdown-position--below_parent');\n $('.header').removeClass('header-dropdown-position--below_header');\n $('.header').attr('data-dropdown-position', 'below_parent');\n $('.header .dropdown').removeAttr('style');\n }\n },\n setPadding: function () {\n if ($('body').hasClass('index') && window.PXUTheme.media_queries.large.matches) {\n var $reorderableFirstSection = $('.index-sections .shopify-section').first();\n\n if ($reorderableFirstSection.hasClass('parallax-banner')) {\n if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--false')) {\n $reorderableFirstSection.css('padding-top', $('.header').height());\n }\n }\n }\n },\n openDropdown: function () {\n $('[data-header-nav-details]').on('click', handleDetailClick);\n $('[data-header-nav-details]').on('touchend', handleDetailClick);\n\n function handleDetailClick(e) {\n e.stopPropagation();\n const clickedParent = e.target.closest('li.sub-menu');\n const clickedDetails = e.currentTarget;\n const clickedLink = clickedDetails.querySelector('summary');\n const detailsElements = [...document.querySelectorAll('.header__navigation li.sub-menu > [data-header-nav-details]')]; // Close siblings\n\n if (detailsElements.includes(clickedDetails)) {\n detailsElements.forEach(detailsElement => {\n const details = detailsElement;\n\n if (details !== clickedDetails) {\n details.open = false;\n }\n });\n } // If the link being clicked is a parent link, then take control of the navigation\n\n\n if (clickedParent && clickedLink.getAttribute('href')) {\n e.preventDefault();\n\n if (clickedDetails.open) {\n window.location = clickedLink.getAttribute('href');\n return;\n } // If the submenu isn't open, open it\n\n\n clickedDetails.open = true;\n }\n }\n },\n unload: function ($target) {\n $('a[href^=\"#\"]').off('click');\n $('[data-header-nav-details]').off('click');\n $('[data-header-nav-details]').off('touchend');\n }\n};\n/*============================================================================\n Home page - featured promotions\n==============================================================================*/\n\nwindow.featured_promotions = {\n init: function () {\n window.animate_content.init();\n },\n unload: function ($target) {}\n};\n/*============================================================================\n Home page - video\n==============================================================================*/\n\nwindow.videoTheme = {\n init: function () {\n // Set up plyr for newly embedded video\n var featuredVideos = $('[data-vi
1deo-element]').get();\n var featuredVideoPlayers = Plyr.setup(featuredVideos, {\n controls: controls,\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: true\n },\n storage: {\n enabled: false\n }\n }); // Adds plyr video id to video wrapper\n\n $.each(featuredVideoPlayers, function (index, player) {\n var id = player.id;\n var $video;\n\n if (player.isHTML5) {\n $video = $(player.elements.wrapper).find('video');\n $video.attr('data-plyr-video-id', id);\n } // When a video is playing, pause any other instances\n\n\n player.on('play', function (event) {\n var instance = event.detail.plyr;\n $.each(featuredVideoPlayers, function (index, player) {\n if (instance.id != player.id) {\n player.pause();\n }\n });\n });\n });\n $('[data-video-element]').each(function (index, video) {\n // Variables\n var $video = $(video);\n var $section = $video.parents('.shopify-section').attr('id', id);\n var $videoElement = $section.find($video);\n var $videoWrapper = $videoElement.parents('.video-wrapper');\n var $playButton = $videoWrapper.find('[data-play-button]');\n var $videoText = $videoWrapper.find('[data-video-text]');\n var $videoTextContainer = $videoWrapper.find('[data-video-text-container]');\n var $posterImage = $videoWrapper.data('poster-image-uploaded');\n var aspectRatio = $videoWrapper.data('aspect-ratio');\n var id = $videoWrapper.data('video-src');\n var isAutoplay = $videoWrapper.data('autoplay');\n var isLoopingEnabled = $videoWrapper.data('autoloop');\n var isMuted = $videoWrapper.data('mute-video');\n $.each(featuredVideoPlayers, function (index, player) {\n var videoID;\n var playerID;\n\n if (player.isYouTube || player.isVimeo) {\n var videoID = $videoWrapper.attr('id');\n var playerID = $(player.elements.original).attr('id');\n } else if (player.isHTML5) {\n var videoID = $videoWrapper.find('[data-plyr-video-id]').data('plyr-video-id');\n var playerID = player.id;\n $videoElement = $section.find('.plyr--video');\n }\n\n if (playerID == videoID) {\n // Reset play button icon\n $videoWrapper.removeClass('play-button-icon--visible'); // Reset image\n\n $videoWrapper.removeClass('video-is-playing'); // Autoplay\n\n if (isAutoplay) {\n // If on desktop or player is YouTube/Vimeo\n if (window.PXUTheme.media_queries.large.matches || player.isYouTube || player.isVimeo) {\n player.autoplay = true; // Hide image\n\n $videoWrapper.addClass('video-is-playing'); // Show video\n\n $videoElement.show(); // If display text over video unchecked\n\n if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n $videoText.hide();\n } else {\n $videoText.show();\n } // Keep play button hidden\n\n\n $playButton.hide(); // HTML5 Mobile Video\n } else if (window.PXUTheme.media_queries.medium.matches && player.isHTML5) {\n // Hide image\n $videoWrapper.addClass('video-is-playing'); // Show video\n\n $videoElement.show(); // Display button so that video can be played\n\n $playButton.show();\n player.on('play', function () {\n // Show video\n $videoElement.show(); // Hide play button\n\n $playButton.hide();\n });\n }\n } else {\n // If Autoplay disabled\n // If poster image, show image wrapper otherwise hide it\n if ($posterImage) {\n $videoWrapper.removeClass('video-is-playing');\n } else {\n $videoWrapper.addClass('video-is-playing');\n $videoElement.show();\n }\n } // Clicking image will play video\n\n\n $videoWrapper.find('.parallax__wrap, .banner__wrap').on('click', function () {\n if (!player.playing && !$videoWrapper.hasClass('video-is-playing')) {\n player.play();\n }\n });
1 // Muted\n\n if (isMuted) {\n player.muted = true;\n } // Aspect Ratio\n\n\n if (aspectRatio) {\n player.ratio = aspectRatio;\n } // Looping\n\n\n if (isLoopingEnabled) {\n player.loop = true;\n } // Show Video Controls\n // - video controls get hidden using a css class: '.video-controls-enabled--false'\n // If button exists, hide text and poster\n\n\n if ($playButton) {\n $playButton.on('click', function () {\n // Hide image\n $videoWrapper.addClass('video-is-playing'); // Show video\n\n $videoElement.show(); // If display text over video unchecked\n\n if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n $videoText.hide();\n } else {\n $videoText.show();\n } // Play video\n\n\n player.play();\n });\n }\n\n player.on('ready', function () {\n window.videoTheme.resizeVideo($videoWrapper);\n });\n player.on('play', function () {\n // Hide image\n $videoWrapper.addClass('video-is-playing'); // Reset play button icon\n\n $videoWrapper.removeClass('play-button-icon--visible'); // Show video\n\n $videoElement.show(); // If display text over video unchecked\n\n if ($videoTextContainer.hasClass('display-text-over-video--false')) {\n $videoText.hide();\n } else {\n $videoText.show();\n } // Hide play button\n\n\n if ($playButton) {\n $playButton.hide();\n }\n }); // If video is paused, play button icon or button must be shown\n // If button text is filled out, use play button\n // If button text is not filled out, use play button icon\n\n player.on('pause', function () {\n if ($playButton.length > 0) {\n $playButton.show();\n $videoWrapper.removeClass('play-button-icon--visible');\n $videoTextContainer.hide();\n } else {\n $videoWrapper.addClass('play-button-icon--visible');\n }\n }); // If page loads with video paused and no button showing, show icon\n\n if (!player.playing && $playButton.is(':hidden') || $playButton.length == 0) {\n $videoWrapper.addClass('play-button-icon--visible');\n }\n\n return false;\n }\n });\n });\n },\n resizeVideo: function ($videoWrapper) {\n // get height and width of the video\n var videoHeight = $videoWrapper.find('.plyr--video').height();\n var videoWidth = $videoWrapper.find('.plyr__video-wrapper').width(); // calculate correct padding-bottom percentage for responsive videos\n\n var paddingBottom = videoHeight / videoWidth * 100; // apply that padding bottom ratio\n\n $videoWrapper.find('.plyr__video-wrapper').css('padding-bottom', paddingBottom + '%');\n }\n};\n/*============================================================================\n Banner image\n==============================================================================*/\n\nwindow.banner_image = {\n init: function () {\n var contentAreaPadding = $('.header').data('content-area-padding');\n\n if (window.PXUTheme.media_queries.large.matches) {\n var $reorderableFirstSection = $('.global-wrapper .shopify-section').first();\n $reorderableFirstSection.attr('style', '');\n\n if ($reorderableFirstSection.hasClass('parallax-banner')) {\n // Has banner\n if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--false')) {\n if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + contentAreaPadding);\n } else {\n $reorderableFirstSection.css('padding-top', $('.header').height() + contentAreaPadding);\n }\n\n $('.header').parent().removeClass('feature_image');\n $('.header').addClass('header_bar');\n\n if ($('.header').hasClass('sticky-header--false')) {\n $('.header').addClass('is-absolute');\n } else {\n $('.header.is-absolute').removeClass('is-absolute');\n }\n } else if ($('.header').hasClass('header-background--false') && $('.header').hasClass('header-transparency--true')) {\n $('.header').parent().addClass('feature_image');\n $('.header').removeClass('header_bar');\n $('.header').addClass('is-absolute');\n\n if ($('.header').hasClass('sticky-header--true')) {\n $('.header').addClass('is-absolute');\n }\n } else if ($('.header').hasClass('header-background--false') && $('.header').hasClass('header-transparency--false')) {\n $('.header').parent().addClass('feature_image');\n $('.header').removeClass('header_bar');\n $('.header').addClass('is-absolute');\n\n if ($('.header').hasClass('sticky-header--true')) {\n $('.header').addClass('is-absolute');\n }\n } else if ($('.header').hasClass('header-background--true') && $('.header').hasClass('header-transparency--true')) {\n $('.header').parent().removeClass('feature_image');\n $('.header').addClass('header_bar');\n\n if ($('.header').hasClass('sticky-header--false')) {\n $('.header').addClass('is-absolute');\n } else {\n $('.header.is-absolute').removeClass('is-absolute');\n }\n }\n } else {\n // No banner\n if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + contentAreaPadding);\n } else {\n $reorderableFirstSection.css('padding-top', $('.header').height() + contentAreaPadding);\n }\n\n if ($('.header').hasClass('sticky-header--false')) {\n $('.header').addClass('header_bar');\n $('.header').addClass('is-absolute');\n } else {\n $('.feature_image').removeClass('feature_image');\n $('.header').addClass('header_bar');\n $('.header.is-absolute').removeClass('is-absolute');\n }\n }\n }\n },\n resetPadding: function () {\n var $reorderableFirstSection = $('.global-wrapper .shopify-section').first();\n\n if ($reorderableFirstSection.hasClass('parallax-banner')) {\n $reorderableFirstSection.css('padding-top', '0px');\n } else {\n if (window.PXUTheme.media_queries.large.matches) {\n if ($('.global-wrapper__product').length || $('.shopify-policy__container').length || $('.global-wrapper__customer').length) {\n $('.global-wrapper__product, .shopify-policy__container, .global-wrapper__customer').css('padding-top', $('.header').height() + window.contentAreaPadding);\n } else {\n $reorderableFirstSection.css('padding-top', $('.header').height());\n }\n } else {\n $reorderableFirstSection.css('padding-top', '0px');\n }\n }\n },\n unload: function ($target) {}\n};\n/*============================================================================\n Announcement Bar\n==============================================================================*/\n\nvar announcement_bar = {\n init: function () {\n if ($('.promo-banner').length) {\n var announcement = Cookies.get('promo-banner');\n\n if (announcement != 'dismiss') {\n $('body').addClass('promo-banner--true');\n $('.promo-banner__close').on('click', function () {\n $('.promo-banner--true').attr('style', '');\n $('body').removeClass('promo-banner--true');\n announcement_bar.setPadding();\n Cookies.set('promo-banner', 'dismiss', {\n path: '/'\n }, {\n expires: 30\n });\n });\n }\n } //call setPadding on initialization\n\n\n announcement_bar.setPadding();\n },\n setPadding: function () {\n // Setting padding relative to promo banner height\n var bannerHeight = $('.promo-banner').innerHeight();\n var bannerPadding = bannerHeight - 25 + 'px';\n var parentSection = $('.promo-banner').parent('.shopify-section--header');\n\n if ($('body').hasClass('promo-banner--true')) {\n if ($('.header').hasClass('sticky-header--true') || $('.mobile-header').hasClass('mobile-sticky-header--false') && window.PXUTheme.media_queries.medium.matches) {\n $(parentSection).css('padding-bottom', bannerPadding);\n }\n } else {\n $(parentSection).css('padding-bottom', '0');\n $('.header').css('top', '0');\n }\n }\n};\n/*============================================================================\n Banner\n==============================================================================*/\n\nwindow.banner = {\n init: function () {\n window.animate_content.init(); //Arrow scroll\n\n var headerHeight = $('.header').outerHeight();\n\n if ($('.header').hasClass('sticky-header--true')) {\n $('.scroll-arrow').smoothScroll({\n offset: -headerHeight\n });\n } else {\n $('.scroll-arrow').smoothScroll();\n }\n\n announcement_bar.init();\n },\n unload: function ($target) {}\n};\n/*============================================================================\n Newsletter\n==============================================================================*/\n\nvar newsletter_popup = {\n init: function () {\n var popup = Cookies.get('popup');\n var newsletter_popup_days = parseInt(window.PXUTheme.theme_settings.newsletter_popup_days);\n var cookie_enabled = newsletter_popup_days != 0 ? true : false;\n\n if (cookie_enabled && popup == 'open') {\n return false;\n } else {\n newsletter_popup.open();\n }\n\n if (cookie_enabled) {\n Cookies.set('popup', 'open', {\n expires: newsletter_popup_days\n });\n }\n },\n open: function () {\n var newsletter_popup_seconds = parseInt(window.PXUTheme.theme_settings.newsletter_popup_seconds);\n\n if (window.PXUTheme.theme_settings.newsletter_popup_mobile || window.PXUTheme.media_queries.large.matches) {\n setTimeout(function () {\n $.fancybox.open($('.js-newsletter-popup'), {\n baseClass: 'newsletter_popup',\n hash: false,\n infobar: false,\n toolbar: false,\n loop: true,\n smallBtn: true,\n touch: false,\n mobile: {\
1n preventCaptionOverlap: false,\n toolbar: true,\n buttons: [\"close\"]\n }\n });\n }, newsletter_popup_seconds * 1000);\n }\n }\n};\n/*============================================================================\n Product\n==============================================================================*/\n\nwindow.product = {\n init: function () {\n var $notify_form = $('.notify_form .contact-form'); // Find product galleries on page but exclude those in the quickshop (quickshop logic handled in fancybox event)\n\n var $productGalleries = $('.product-gallery'); // For each product gallery, create an object and add it to an array of galleries\n\n var galleriesArray = [];\n globalPlayersArray = [];\n\n if ($productGalleries.length > 0) {\n $.each($productGalleries, function (index, gallery) {\n var $productSection = $(gallery).closest('.product_section');\n galleriesArray.push({\n element: $(gallery),\n productSection: $productSection,\n thumbnailsEnabled: $productSection.data('thumbnails-enabled'),\n thumbnailsSliderEnabled: $productSection.data('thumbnails-slider-enabled'),\n thumbnailsPosition: $productSection.data('thumbnails-position'),\n thumbnailsArrows: $productSection.data('gallery-arrows-enabled'),\n slideshowAnimation: $productSection.data('slideshow-animation'),\n slideShowSpeed: $productSection.data('slideshow-speed'),\n activateZoom: $productSection.data('activate-zoom'),\n productMediaSupported: $productSection.data('product-media-supported'),\n loopingEnabled: $(gallery).find('.product-gallery__main').data('video-looping-enabled'),\n sectionID: $productSection.parents('.shopify-section').attr('id')\n });\n });\n }\n\n if (galleriesArray.length > 0) {\n // For each galleryObject, enable a Flickity slider\n $.each(galleriesArray, function (index, galleryObject) {\n window.product.enableSlider(galleryObject); // If product media is supported for the gallery, then also launch product media and Plyr\n\n if (galleryObject.productMediaSupported) {\n // Find videos within gallery section\n var videos;\n videos = $(galleryObject.element).find('[data-html5-video] video, [data-youtube-video]').get();\n window.product.loadPlyr(galleryObject, videos);\n window.product.launchProductMedia(galleryObject); // Go through each gallery, on video play check instance ID against other player IDs\n\n var instance;\n $.each(galleryObject.videoPlayers, function (index, player) {\n player.on('play', function (event) {\n instance = event.detail.plyr; // Ensures only one video is playing at a time\n\n $.each(globalPlayersArray, function (index, player) {\n if (instance.id != player.id) {\n player.pause();\n }\n });\n });\n });\n } // Hover to zoom\n\n\n if (galleryObject.activateZoom) {\n document.addEventListener('lazyloaded', window.product.enableZoom);\n }\n });\n }\n\n const recipientFormEl = document.querySelector('[data-recipient-form]');\n\n if (recipientFormEl) {\n const sectionEl = recipientFormEl.closest('.product_section');\n this.recipientForm = new _helpers_RecipientForm__WEBPACK_IMPORTED_MODULE_6__.default(sectionEl);\n }\n\n const complementaryProductsEl = document.querySelector('[data-complementary-products]');\n\n if (complementaryProductsEl) {\n const sectionEl = complementaryProductsEl.closest('.product_section');\n const {\n sectionId,\n productId,\n productRecommendationLimit\n } = JSON.parse(document.querySelector('[data-complementary-products-data]').textContent);\n this.complementaryProductRecommendations = new _helpers_ComplementaryProducts__WEBPACK_IMPORTED_MODULE_3__.default({\n sectionEl,\n sectionId,\n productId,\n productRecommendationsRoute: window.PXUTheme.routes.product_recommendations_url,\n includeIndicatorDots: false,\n limit: productRecommendationLimit,\n arrowShape: 'M95.04 46 21.68 46 48.18 22.8 42.91 16.78 4.96 50 42.91 83.22 48.18 77.2 21.68 54 95.04 54 95.04 46z'\n });\n }\n\n if ($('.product-quickshop__container').length == 0) {\n window.product.loadProductRecommendations();\n }\n\n window.product.productSwatches();\n window.animate_content.init();\n },\n unitPricing: function (item) {\n let unitPriceMeasurementReferenceValue = '';\n let unitPriceOutput = '';\n\n if (item.unit_price_measurement) {\n if (item.unit_price_measurement.reference_value != 1) {\n unitPriceMeasurementReferenceValue = item.unit_price_measurement.reference_value;\n }\n\n unitPriceOutput += `<div class=\"item_unit-price\">${item.unit_price_measurement.quantity_value}${item.unit_price_measurement.quantity_unit} | ${Shopify.formatMoney(item.unit_price, $('body').data('money-format'))} / ${unitPriceMeasurementReferenceValue}${item.unit_price_measurement.reference_unit}</div>`;\n return unitPriceOutput;\n }\n },\n productSwatches: function () {\n $('[data-product-form=\"uninitialized\"]').each((_, options) =>
1 {\n options.dataset.productForm = '';\n const $options = $(options);\n const paymentTerms = new _helpers_PaymentTerms__WEBPACK_IMPORTED_MODULE_5__.default(options.closest('[data-product-details]'));\n const surfacePickUpEl = $options.closest('.js-product_section').find('[data-surface-pick-up]')[0];\n const productTitle = $options.data('product-title');\n let currentVariantId = $options.data('variant-id');\n let currentVariantTitle = $options.data('variant-title');\n let surfacePickUp;\n\n if (surfacePickUpEl) {\n surfacePickUp = new _pixelunion_shopify_surface_pick_up__WEBPACK_IMPORTED_MODULE_4__.default(surfacePickUpEl);\n surfacePickUp.load(currentVariantId);\n surfacePickUp.onModalRequest(contents => {\n const surfacePickUpModal = document.querySelector('[data-surface-pick-up-modal]');\n let fragment; // Build out pop-up content for product with no variants, else build\n // out popup content for product with variants\n\n if (currentVariantTitle == 'Default Title' && productTitle) {\n fragment = document.createDocumentFragment();\n const header = document.createElement('div');\n const title = document.createElement('h2');\n header.classList.add('surface-pick-up__modal-header');\n title.classList.add('surface-pick-up__modal-title');\n title.innerHTML = productTitle;\n header.appendChild(title);\n fragment.appendChild(header);\n } else if (currentVariantTitle !== 'Default Title' && productTitle) {\n fragment = document.createDocumentFragment();\n const header = document.createElement('div');\n const title = document.createElement('h2');\n header.classList.add('surface-pick-up__modal-header');\n title.classList.add('surface-pick-up__modal-title');\n title.innerHTML = productTitle;\n header.appendChild(title);\n\n if (window.currentVariant.title !== 'Default Title') {\n const subtitle = document.createElement('span');\n subtitle.classList.add('surface-pick-up__modal-subtitle');\n subtitle.innerHTML = window.currentVariant.title;\n header.appendChild(subtitle);\n }\n\n fragment.appendChild(header);\n }\n\n surfacePickUpModal.innerHTML = contents;\n surfacePickUpModal.insertBefore(fragment, surfacePickUpModal.firstChild);\n $.fancybox.open(surfacePickUpModal, {\n hash: false,\n infobar: false,\n toolbar: false,\n loop: true,\n smallBtn: true,\n touch: false,\n video: {\n autoStart: false\n },\n mobile: {\n preventCaptionOverlap: false,\n toolbar: true\n }\n });\n });\n }\n\n const selectId = $options.data('select-id');\n\n if (document.getElementById(selectId)) {\n new Shopify.OptionSelectors(selectId, {\n product: $options.data('product'),\n onVariantSelected: (variant, selector) => {\n window.currentVariant = variant;\n paymentTerms.update(variant ? variant.id : null);\n\n if (surfacePickUp) {\n surfacePickUp.load(variant ? variant.id : null);\n }\n\n window.selectCallback(variant, selector);\n },\n enableHistoryState: $options.data('enable-state')\n });\n }\n });\n\n if (window.PXUTheme.theme_settings.product_form_style == \"swatches\") {\n $('.product_form').addClass('is-visible');\n $('.swatch :radio').change(function () {\n var optionIndex = $(this).closest('.swatch').attr('data-option-index');\n var optionValue = $(this).val();\n $(this).closest('form').find('.single-option-selector').eq(optionIndex).val(optionValue).trigger('change');\n }); //Swatches linked with selected options\n\n if ($('.js-product_section').length) {\n var $productForms = $('.js-product_section').find('.product_form'); //Loop through each product and set the initial option value state\n\n $productForms.each(function () {\n var JSONData = $(this).data('product');\n var productID = $(this).data('product-id');\n var productSection = '.product-' + productID + ' .js-product_section';\n var swatchOptions = $(this).find('.swatch-options .swatch');\n\n if (swatchOptions.length > 1) {\n Shopify.linkOptionSelectors(JSONData, productSection);\n }\n });\n } //Add click event when there is more than one product on the page (eg. Collection in Detail)\n\n\n if ($('.js-product_section').length > 1) {\n $('body').on('click', '.swatch-element', function () {\n var swatchValue = $(this).data('value').toString();\n $(this).siblings('input[value=\"' + swatchValue.replace(/\\\"/g, '\\\\\"') + '\"]').prop(\"checked\", true).trigger(\"change\");\n var JSONData = $(this).parents('.product_form').data('product');\n var productID = $(this).parents('.product_form').data('product-id');\n var productSection = '.product-' + productID + ' .js-product_section';\n var swatchOptions = $(this).parents('.product_form').find('.swatch-options .swatch');\n\n if (swatchOptions.length > 1) {\n Shopify.linkOptionSelectors(JSONData, productSection);\n }\n });\n }\n }\n },\n enableZoom: function () {\n var $image = $(event.target);\n var zoomSrc = $image.data('zoom-src');\n\n if (zoomSrc) {\n $image.wrap('<span class=\"zoom-container\"></span>').css('display', 'block').parent().zoom({\n url: zoomSrc,\n touch: false,\n magnify: 1\n });\n }\n },\n enableSlider: function (galleryObject) {\n var $el = galleryObject.element.find('.product-gallery__main');\n var $thumbnailProductGallery = galleryObject.element.find('.product-gallery__thumbnails');\n var $slides = $el.find('.product-gallery__image');\n var $thumbnails = $thumbnailProductGallery.find('.product-gallery__thumbnail');\n var arrowShape = 'M95.04 46 21.68 46 48.18 22.8 42.91 16.78 4.96 50 42.91 83.22 48.18 77.2 21.68 54 95.04 54 95.04 46z';\n $el.flickity({\n wrapAround: true,\n adaptiveHeight: true,\n dragThreshold: 10,\n imagesLoaded: true,\n pageDots: false,\n prevNextButtons: $el.data('media-count') > 1 ? true : false,\n autoPlay: galleryObject.slideShowSpeed * 1000,\n fade: galleryObject.slideShowAnimation === 'fade' ? true : false,\n watchCSS: false,\n arrowShape: arrowShape\n });\n var $slides = $el.find('.product-gallery__image');\n $slides.each((_, slide) => {\n const $slide = $(slide); // Listen for model pause/play events\n\n $slide.find('model-viewer').on('shopify_model_viewer_ui_toggle_play', function () {\n $el.flickity('unbindDrag');\n });\n $slide.find('model-viewer').on('shopify_model_viewer_ui_toggle_pause', function () {\n $el.flickity('bindDrag');\n });\n });\n $el.on('change.flickity', function () {\n $slides.each(function (index, slide) {\n // Variables to be used\n var $slide = $(slide);\n var mediaType = $slide.data('media-type'); // Check whether slide is active slide (featured image shown) or inactive slide (slide hidden)\n\n if ($slide.hasClass('is-selected')) {\n // Switch statement to go through different media types (video, model)\n switch (mediaType) {\n case 'model':\n /* On slide change, if active slide contains 3d model\n * If on de
1sktop, on hover, unbind flickity, after hover bind flickity\n * On model play event, unbind flickity to ensure model can be interacted with\n * On model pause event, bind flickity so that slide can be swiped\n * Pause all model slides when hidden\n */\n if (window.PXUTheme.media_queries.large.matches) {\n // On mouseenter event, unbind flickity\n $slide.on('mouseenter', function () {\n $el.flickity('unbindDrag');\n }); // On mouseleave event, bind flickity\n\n $slide.on('mouseleave', function () {\n $el.flickity('bindDrag');\n });\n }\n\n break;\n }\n } else {\n // Below logic deals with the hidden slides when a flickity change is triggered\n // Switch statement to go through different media types (video, model)\n switch (mediaType) {\n case 'model':\n // Pause models when hidden\n if (galleryObject.models.length > 0) {\n $.each(galleryObject.models, function (index, model) {\n model.pause();\n });\n }\n\n break;\n\n case 'video':\n // Variables\n var $htmlVideo = $slide.find('[data-html5-video]');\n var videoID = $htmlVideo.find('video').data('plyr-video-id'); // Pause all html5 videos for slides that are hidden\n\n if ($htmlVideo.length) {\n $.each(galleryObject.videoPlayers, function (index, player) {\n if (player.id == videoID) {\n player.pause();\n }\n });\n }\n\n break;\n\n case 'external_video':\n // Variables\n var $iframeVideo = $slide.find('iframe');\n var iframeID = $iframeVideo.attr('id'); // Pause all youtube videos for slides that are hidden\n\n if ($iframeVideo.length) {\n $.each(galleryObject.videoPlayers, function (index, player) {\n if (player.media.id == iframeID) {\n player.pause();\n }\n });\n }\n\n break;\n }\n }\n });\n });\n $el.on('settle.flickity', function () {\n $el.flickity('resize');\n });\n $(window).on('load', function () {\n $el.flickity('resize');\n });\n $slides.each(function (index, slide) {\n // Variables to be used\n var $slide = $(slide);\n var mediaType = $slide.data('media-type'); // Check whether slide is active slide (featured image shown)\n\n if ($slide.hasClass('is-selected')) {\n if (mediaType == 'model') {\n // If slide has 3D model, unbind flickity on hover on desktop\n // Allows you to click anywhere to trigger model ui\n if (window.PXUTheme.media_queries.large.matches) {\n // On mouseenter event, unbind flickity\n $slide.on('mouseenter', function () {\n $el.flickity('unbindDrag');\n }); // On mouseleave event, bind flickity\n\n $slide.on('mouseleave', function () {\n $el.flickity('bindDrag');\n });\n }\n } // Detect keyboard 'ENTER' key on slides\n\n\n $slide.keypress(function (event) {\n if (event.which == 13) {\n $slide.find('model-viewer, .product-gallery__link, .plyr').focus();\n $el.on('settle.flickity', function (event, index) {\n // Run video autoplay logic if featured media is a video\n if (mediaType == 'video' || mediaType == 'external_video') {\n checkForVideos();\n } // Autoplay model if featured media is a model\n\n\n if (mediaType == 'model') {\n // If model container has class is-selected then play the model\n autoplayModel();\n } // Unbind settle event\n\n\n $el.off('settle.flickity');\n });\n }\n });\n }\n });\n var $sliderArrows = $el.find('.flickity-prev-next-button');\n\n if (($sliderArrows || $thumbnails) && window.PXUTheme.media_queries.large.matches) {\n $sliderArrows.on('click', function () {\n // Find out media type of featured media slide\n var mediaType = $el.find('.product-gallery__image.is-selected').data('media-type');\n $el.on('settle.flickity', function (event, index) {\n // Run video auto
1play logic if featured media is a video\n if (mediaType == 'video' || mediaType == 'external_video') {\n checkForVideos();\n } // Autoplay model if featured media is a model\n\n\n if (mediaType == 'model') {\n // If model container has class is-selected then play the model\n autoplayModel();\n } // Unbind settle event\n\n\n $el.off('settle.flickity');\n });\n }); // Detect keyboard 'ENTER' key on slider arrows\n\n $sliderArrows.on('keypress', function (event) {\n if (event.which == 13) {\n $el.focus();\n $el.attr('tabindex', 0);\n $el.find('.product-gallery__image').attr('tabindex', 0);\n }\n });\n $thumbnails.on('click', function () {\n // Change slide\n var index = $(event.currentTarget).index();\n $el.flickity('select', index); // Find out media type of featured media slide\n\n var mediaType = $el.find('.product-gallery__image.is-selected').data('media-type');\n $el.on('settle.flickity', function (event, index) {\n // Run video autoplay logic if featured media is a video\n if (mediaType == 'video' || mediaType == 'external_video') {\n checkForVideos();\n } // Autoplay model if featured media is a model\n\n\n if (mediaType == 'model') {\n // If model container has class is-selected then play the model\n autoplayModel();\n } // Unbind settle event\n\n\n $el.off('settle.flickity');\n });\n }); // Added functionality for keyboard 'enter' key\n\n $thumbnails.keypress(function (event) {\n var index = $(event.currentTarget).index();\n\n if (event.which == 13) {\n // Change slide\n $el.flickity('select', index); // Find selected slide\n\n var $selectedSlide = $el.find('.product-gallery__image.is-selected'); // Find out media type of featured media slide\n\n var mediaType = $selectedSlide.data('media-type'); // Bring focus to media inside selected slide once slide has finished animation\n\n $el.on('settle.flickity', function (event, index) {\n $selectedSlide.find('[data-youtube-video]').attr('tabindex', '0');\n $selectedSlide.find('model-viewer, .plyr, .product-gallery__link').focus(); // Run video autoplay logic if featured media is a video\n\n if (mediaType == 'video' || mediaType == 'external_video') {\n checkForVideos();\n } // Autoplay model if featured media is a model\n\n\n if (mediaType == 'model') {\n // If model container has class is-selected then play the model\n autoplayModel();\n } // Unbind settle event\n\n\n $el.off('settle.flickity');\n });\n }\n });\n }\n\n function autoplayModel() {\n $.each(galleryObject.models, function (index, model) {\n var $slide = $(model.container).parents('.product-gallery__image');\n\n if ($slide.hasClass('is-selected')) {\n model.play();\n }\n });\n }\n\n function checkForVideos() {\n $slides.each(function (index, slide) {\n // Variables\n var $slide = $(slide);\n var mediaType = $slide.data('media-type');\n var videoID = $slide.find('video').data('plyr-video-id');\n var $iframeVideo = $slide.find('iframe');\n var iframeID = $iframeVideo.attr('id');\n\n if ($slide.hasClass('is-selected')) {\n if (mediaType == 'video') {\n videoID = $slide.find('video').data('plyr-video-id');\n\n if (videoID) {\n autoplayVideo(videoID, $slide);\n }\n } else if (mediaType == 'external_video') {\n if (iframeID) {\n autoplayYoutubeVideo(iframeID, $slide);\n }\n }\n }\n });\n }\n\n function autoplayVideo(videoID, $slide) {\n // Compare id to player object and only play that video\n $.each(galleryObject.videoPlayers, function (index, player) {\n if (player.id == videoID) {\n player.play(); // On fullscreen exit, focus on the thumbnail nav\n\n player.on('exitfullscreen', function (event) {\n var $thumbnailProductGallery = $slide.closest('.product-gallery').find('.product-gallery__thumbnails');\n\n if ($thumbnailProductGallery.hasClass('vertical-slider-enabled')) {\n $thumbnailProductGallery.attr('tabindex', '0').focus();\n } else {\n $thumbnailProductGallery.focus();\n }\n });\n }\n });\n }\n\n function autoplayYoutubeVideo(iframeID, $slide) {\n // compare id to player object and only play that video\n $.each(galleryObject.videoPlayers, function (index, player) {\n if (player.playing) {\n player.pause();\n }\n\n if (player.media.id == iframeID) {\n player.play(); // On fullscreen exit, focus on the thumbnail nav\n\n player.on('exitfullscreen', function (event) {\n var $thumbnailProductGallery = $slide.closest('.product-gallery').find('.product-gallery__thumbnails');\n\n if ($thumbnailProductGallery.hasClass('vertical-slider-enabled')) {\n $thumbnailProductGallery.attr('tabindex', '0').focus();\n } else {\n $thumbnailProductGallery.focus();\n }\n });\n }\n });\n } // Thumbnail gallery logic begins\n\n\n if (galleryObject.thumbnailsEnabled == true) {\n if (galleryObject.thumbnailsSliderEnabled == true && $slides.length > 1) {\n // If desktop determine which slider we build\n if (window.PXUTheme.media_queries.large.matches) {\n // If thumbnail position is left/right then vertical slider gets enabled\n if (galleryObject.thumbnailsPosition == 'left-thumbnails' || galleryObject.thumbnailsPosition == 'right-thumbnails') {\n $thumbnailProductGallery.css('max-height', $el.closest('.product-gallery__main').outerHeight());\n $thumbnailProductGallery.addClass('vertical-slider-enabled');\n $thumbnails.on('click', function (event) {\n var index = $(event.currentTarget).index();\n $el.flickity('select', index);\n });\n var navCellHeight = $thumbnails.height();\n var navHeight = $thumbnailProductGallery.height();\n $el.on('select.flickity', function () {\n // set selected nav cell\
1n var flkty = $el.data('flickity');\n $thumbnailProductGallery.find('.is-nav-selected').removeClass('is-nav-selected');\n var $selected = $thumbnails.eq(flkty.selectedIndex).addClass('is-nav-selected'); // scroll nav\n\n var scrollY = $selected.position().top + $thumbnailProductGallery.scrollTop() - (navHeight + navCellHeight) / 2;\n $thumbnailProductGallery.animate({\n scrollTop: scrollY\n });\n });\n } else {\n $thumbnailProductGallery.flickity({\n cellAlign: 'center',\n contain: true,\n groupCells: '80%',\n imagesLoaded: true,\n pageDots: false,\n prevNextButtons: $thumbnails.length > 5 ? galleryObject.thumbnailsArrows : false,\n asNavFor: $el[0],\n arrowShape: arrowShape\n });\n $thumbnailProductGallery.on('settle.flickity', function () {\n $thumbnailProductGallery.flickity('resize');\n });\n $(window).on('load', function () {\n $thumbnailProductGallery.flickity('resize');\n }); // Once thumbnail is focused, move carousel to that cell\n\n $.each($thumbnails, function (index, thumbnail) {\n var $thumbnail = $(thumbnail);\n\n if ($thumbnail.hasClass('is-selected')) {\n $thumbnail.on('focus', function () {\n $thumbnailProductGallery.flickity('selectCell', index);\n });\n }\n });\n }\n } else {\n // If not on desktop, create standard thumbnail slider\n $thumbnailProductGallery.flickity({\n cellAlign: 'center',\n contain: true,\n groupCells: '80%',\n imagesLoaded: true,\n pageDots: false,\n prevNextButtons: $thumbnails.length > 5 ? galleryObject.thumbnailsArrows : false,\n asNavFor: $el[0],\n arrowShape: arrowShape\n });\n }\n } else {\n // If thumbnail slider is disabled, ensure thumbnails can still navigate product images\n $thumbnailProductGallery.find('.product-gallery__thumbnail').on('click', function () {\n var index = $(this).index();\n $el.flickity('selectCell', index);\n });\n }\n }\n },\n launchProductMedia: function (galleryObject) {\n // function to check if browser is IE\n var isIE11 = !!navigator.userAgent.match(/Trident.*rv\\:11\\./); // Ensure product media libraries are present\n\n if (!isIE11) {\n window.Shopify.loadFeatures([{\n name: 'shopify-xr',\n version: '1.0'\n }, {\n name: 'model-viewer-ui',\n version: '1.0'\n }], onAllFeaturesLoaded);\n } // Enable looping for videos based off their section setting\n // Find videos where they are contained within this section\n // Set looping\n\n\n $.each(galleryObject.videoPlayers, function (index, player) {\n var $wrapper = $(player.elements.wrapper);\n\n if (galleryObject.sectionID != null) {\n var $section = $wrapper.parents('.shopify-section').attr('id', galleryObject.sectionID);\n var loopingEnabled = $section.find(galleryObject.element).find('.product-gallery__main').data('video-looping-enabled');\n } else {\n var loopingEnabled = galleryObject.element.find('.product-gallery__main').data('video-looping-enabled');\n }\n\n player.loop = loopingEnabled;\n }); // 3D Model Setup\n\n var config = {\n // Default control list\n controls: ['zoom-in', 'zoom-out', 'fullscreen'],\n focusOnPlay: false\n };\n\n function onAllFeaturesLoaded() {\n // If product media enabled look for model-viewer tags and setup\n galleryObject.models = [];\n var $models = $($('model-viewer', galleryObject.element));\n $models.each(function (index, model) {\n model = new Shopify.ModelViewerUI(model, config);\n galleryObject.models.push(model);\n });\n }\n },\n enableVideoOnHover: function ($thumbnail) {\n var $html5Video = $thumbnail.find('[data-html5-video]');\n var $youtubeVideo = $thumbnail.find('[data-youtube-video]');\n var videoID;\n\n if ($html5Video.length > 0) {\n videoID = $html5Video.find('[data-plyr-video-id]').data('plyr-video-id');\n } else if ($youtubeVideo.length > 0) {\n videoID = $youtubeVideo.find('iframe').attr('id');\n }
1\n\n if (videoID) {\n $.each(secondaryMediaPlayers, function (index, player) {\n if (player.id == videoID || player.media.id == videoID) {\n player.toggleControls(false);\n player.muted = true;\n player.play();\n }\n });\n }\n },\n disableVideoOnHover: function ($thumbnail) {\n var $html5Video = $thumbnail.find('[data-html5-video]');\n var $youtubeVideo = $thumbnail.find('[data-youtube-video]');\n var videoID;\n\n if ($html5Video.length > 0) {\n videoID = $html5Video.find('[data-plyr-video-id]').data('plyr-video-id');\n } else if ($youtubeVideo.length > 0) {\n videoID = $youtubeVideo.find('iframe').attr('id');\n }\n\n if (videoID) {\n $.each(secondaryMediaPlayers, function (index, player) {\n if (player.id == videoID || player.media.id == videoID) {\n if (player.playing) {\n player.pause();\n }\n }\n });\n }\n },\n loadPlyr: function (galleryObject, videos, showSecondaryMedia) {\n // Initializes Plyr library for HTML5 and YouTube videos in Product Gallery\n utilities.launchVideoPlayer(Plyr, galleryObject, videos, showSecondaryMedia);\n\n if (galleryObject) {\n // Adds plyr video id to video wrapper\n $.each(galleryObject.videoPlayers, function (index, player) {\n var source = player.provider;\n var id = player.id;\n var $video;\n\n if (source == 'html5') {\n $video = $(player.elements.wrapper).find('video');\n $video.attr('data-plyr-video-id', id);\n }\n });\n }\n },\n loadProductRecommendations: function () {\n var $productRecommendations = $('.product-recommendations');\n var productID = $productRecommendations.data('product-id');\n var limit = $productRecommendations.data('limit');\n var recommendationsURL = $productRecommendations.data('recommendations-url');\n var sectionEnabled = $productRecommendations.data('enabled');\n var sectionId = $productRecommendations.data('section-id');\n if (!sectionEnabled) return; // Build request URL\n\n var requestUrl = recommendationsURL + \"?section_id=\" + sectionId + \"&limit=\" + limit + \"&product_id=\" + productID;\n $.ajax({\n type: 'GET',\n url: requestUrl,\n success: function (data) {\
1n if (!sectionEnabled) {\n return;\n }\n\n var $recommendedProductsElement = $(data).find('.product-recommendations').html(); // Insert product list into the product recommendations container\n\n $productRecommendations.html($recommendedProductsElement); // Initialize shopify payment buttons\n\n if (Shopify.PaymentButton) {\n Shopify.PaymentButton.init();\n }\n\n window.collection.init(); // Active swatch functionality for the recommended product quick shop\n\n window.product.productSwatches();\n\n if (window.PXUTheme.theme_settings.collection_secondary_image) {\n window.collection.showSecondaryImage();\n }\n }\n });\n },\n unload: function ($target) {\n // Destroy Flickity slider\n var $gallerySlider = $target.find('.product-gallery__main');\n var $thumbnailSlider = $target.find('.product-gallery__thumbnails');\n $gallerySlider.flickity('destroy');\n $thumbnailSlider.flickity('destroy');\n document.removeEventListener('lazyloaded', window.product.enableZoom);\n }\n};\n/*============================================================================\n Product form\n==============================================================================*/\n\nwindow.productFormListeners = {\n init: function () {\n $(document).on(\"click\", \".minus\", function (e) {\n var quantity = parseInt($(this).next(\"input\").val());\n quantity -= 1;\n $(this).next(\"input\").val(quantity);\n\n if (quantity == 0) {\n $(this).closest('li.cart_item').slideUp();\n setTimeout(ajaxSubmitCart, 500);\n } else {\n $(this).next(\"input\").trigger('change');\n }\n\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n $(document).on(\"click\", \".plus\", function (e) {\n var quantity = parseInt($(this).prev(\"input\").val());\n quantity += 1;\n $(this).prev(\"input\").val(quantity).trigger('change');\n e.stopPropagation();\n e.preventDefault();\n return false;\n }); // Prevent the default behavior of the cart link when the quantity input is clicked\n\n $(document).on('click', '.cart__quantity input.quantity', function (e) {\n return false;\n });\n $(document).on(\"change\", \"#cart_form input[type='number']\", function () {\n $(\"#cart_form\").submit();\n });\n\n if ($('.tos_agree').length) {\n $('body').on('click', 'input[type=\"submit\"]', function () {\n if ($(this).parents('form').find('.tos_agree').length) {\n if ($(this).parents('form').find('.tos_agree').is(':checked')) {\n $(this).submit();\n } else {\n alert(window.PXUTheme.translation.agree_to_terms_warning);\n return false;\n }\n } else {\n $(this).submit();\n }\n });\n }\n },\n unload: function () {}\n};\n/*============================================================================\n Collection\n==============================================================================*/\n\nwindow.collection = {\n init: function () {\n if (window.PXUTheme.theme_settings.collection_swatches) {\n if (window.PXUTheme.media_queries.large.matches) {\n $('.thumbnail').hover(function () {\n $('.swatch span', $(this)).each(function () {\n if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n $('<img/>')[0].src = $(this).data(\"image\");\n }\n });\n });\n $('.swatch span').hover(function () {\n if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n $(this).parents('.thumbnail').find('img').attr('src', $(this).data(\"image\"));\n $(this).parents('.thumbnail').find('img').attr('srcset', $(this).data(\"image\"));\n }\n });\n }\n } // Remove the Quick shop button and Fancybox data attributes on mobile devices\n\n\n if (window.PXUTheme.device.hasTouch.matches) {\n $('.quick_shop').remove();\n $('.quick_shop--list').removeAttr('data-fancybox data-src data-gallery');\n } // Display the Quick shop on desktop\n\n\n if (window.PXUTheme.media_queries.large.matches) {\n $('.quick_shop, .quick_shop--list').fancybox({\n baseClass: 'quick-shop__lightbox product-' + product.id,\
1n hash: false,\n infobar: false,\n toolbar: false,\n loop: false,\n smallBtn: true,\n video: {\n autoStart: false\n },\n touch: false,\n mobile: {\n preventCaptionOverlap: false,\n toolbar: true,\n buttons: [\"close\"]\n },\n afterShow: function (e) {\n // When the modal is opened, prevent scrolling\n document.documentElement.classList.add('scroll-locked');\n var productUrl = $(e.current.src).data('url');\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_11__.default.load(productUrl, {\n view: 'quickshop'\n }).then(({\n data,\n html\n }) => {\n $(e.current.src + '.modal').html(html.content);\n window.product.init(); // Initialize shopify payment buttons\n\n if (Shopify.PaymentButton) {\n Shopify.PaymentButton.init();\n } // Grab the fancybox element that is being clicked\n\n\n var $fancyboxImageElement = $(this.opts.$orig);\n var $gallery = $('.' + $fancyboxImageElement.data('gallery'));\n var selector = $('.fancybox-is-open').find('.selector-wrapper select');\n var $productForm = $('.fancybox-is-open .js-product_section').find('.product_form'); //Link sold out options when there is more than one option available\n\n if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n var JSONData = $productForm.data('product');\n var productID = $productForm.data('product-id');\n var productSection = '.product-' + productID + ' .js-product_section';\n var swatchOptions = $productForm.find('.swatch-options .swatch');\n\n if (swatchOptions.length > 1) {\n Shopify.linkOptionSelectors(JSONData, productSection);\n }\n }\n\n selector.trigger('change'); // Global variables\n\n var $gallery = $('.' + $fancyboxImageElement.data('gallery'));\n var galleryObject = {\n element: $gallery,\n thumbnailsEnabled: $gallery.parents('.product_section').data('thumbnails-enabled'),\n thumbnailsSliderEnabled: $gallery.parents('.product_section').data('thumbnails-slider-enabled'),\n thumbnailsPosition: $gallery.parents('.product_section').data('thumbnails-position'),\n thumbnailsArrows: $gallery.parents('.product_section').data('gallery-arrows-enabled'),\n slideshowAnimation: $gallery.parents('.product_section').data('slideshow-animation'),\n slideShowSpeed: $gallery.parents('.product_section').data('slideshow-speed'),\n activateZoom: $gallery.parents('.product_section').data('activate-zoom'),\n productMediaSupported: $gallery.parents('.product_section').data('product-media-supported'),\n loopingEnabled: $gallery.data('video-looping-enabled'),\n sectionID: null\n };\n window.product.enableSlider(galleryObject);\n\n if (galleryObject.productMediaSupported) {\n // Find videos within gallery section\n var thumbnailVideos;\n thumbnailVideos = $(galleryObject.element).find('[data-html5-video] video, [data-youtube-video]').get();\n window.product.loadPlyr(galleryObject, thumbnailVideos);\n window.product.launchProductMedia(galleryObject);\n } // Hover to zoom\n\n\n if (galleryObject.activateZoom) {\n document.addEventListener('lazyloaded', window.product.enableZoom);\n } // Initialize tabs\n\n\n const quickshopTabs = $('.product_section.is-quickshop').find('ul.tabs');\n\n if (quickshopTabs) {\n quickshopTabs.each(function () {\n const tab = $(this).find('> li > a');\n tab.click(function (e) {\n const contentLocation = $(this).attr('href');\n\n if (contentLocation.charAt(0) == \"#\") {\n e.preventDefault();\n tab.removeClass('active');\n $(this).addClass('active');\n $(this).parents('ul.tabs').next().find(contentLocation).show().css({\n 'display': 'block'\n }).addClass('active').siblings().hide().removeClass('active');\n }\n });\n });\n }\n });\n },\n afterClose: function () {\n // When the modal is closed, allow scrolling\n document.documentElement.classList.remove('scroll-locked'); // Grab the fancybox element that is being clicked\n\n var $fancyboxImageElement = $(this.opts.$orig);\n var $gallery = $('.' + $fancyboxImageElement.data('gallery')); // Find videos in gallery\n // Find IDs and match against player\n // If videos are playing, pause them\n\n var $videosInGallery = $gallery.find('.product-gallery__image[data-media-type=\"video\"], .product-gallery__image[data-media-type=\"external_video\"]');\n $videosInGallery.each(function (index, video) {\n var $iframeVideo = $(video).find('iframe');\n var iframeID = $iframeVideo.attr('id');\n var $html5Video = $(video).find('[data-html5-video]');\n var videoID = $html5Video.find('video').data('plyr-video-id'); // Pause videos if IDs match\n\n if ($html5Video.length || $iframeVideo.length) {\n $.each(globalPlayersArray, function (index, player) {\n if (videoI
1D) {\n if (player.id == videoID && player.playing) {\n player.pause();\n }\n } else if (iframeID) {\n if (player.media.id == iframeID && player.playing) {\n player.pause();\n }\n }\n });\n }\n });\n document.removeEventListener('lazyloaded', window.product.enableZoom);\n }\n });\n }\n\n if ($('[data-faceted-filters]').length) {\n facetedFiltering.init();\n }\n\n $('#sort-by').val($('#sort-by').data('default-sort'));\n $('body').on('change', '#sort-by', function () {\n const sortValue = $('#sort-by').val();\n let newQuery;\n\n if (location.search.length) {\n const currentQueryArray = location.search.replace('?', '').split('&');\n const newQueryArray = [];\n\n if (!location.search.includes('sort_by')) {\n newQueryArray.push(`sort_by=${sortValue}`);\n }\n\n currentQueryArray.forEach(query => {\n const splitQuery = query.split('=');\n const queryKey = splitQuery[0];\n let queryValue = splitQuery[1];\n\n if (queryKey === 'sort_by') {\n queryValue = sortValue;\n }\n\n newQueryArray.push(`${queryKey}=${queryValue}`);\n });\n newQuery = newQueryArray.join('&');\n } else {\n newQuery = `sort_by=${sortValue}`;\n }\n\n window.location = `?${newQuery}`;\n });\n\n if (window.PXUTheme.theme_settings.collection_secondary_image) {\n window.collection.showSecondaryImage();\n }\n },\n showSecondaryImage: function () {\n // Will be enabled on non-touch devices and screen sizes larger than 960px\n if (!window.PXUTheme.device.hasTouch.matches && window.PXUTheme.media_queries.larger.matches) {\n // Load Plyr for videos as secondary media\n var secondaryMediaVideos;\n secondaryMediaVideos = $('.thumbnail').find('[data-html5-video] video, [data-youtube-video]').get(); // If recommended products available, check for data-plyr-loaded attribute\n\n var plyrLoaded = $('.shopify-section--recommended-products').find('.products').data('plyr-loaded');\n let galleryObject = null;\n let showSecondaryMedia = true;\n\n if (!plyrLoaded) {\n window.product.loadPlyr(galleryObject, secondaryMediaVideos, showSecondaryMedia);\n }\n\n $('.has-secondary-media-swap').off().on('mouseenter', function () {\n $(this).find('.image-element__wrap img').toggleClass('secondary-media-hidden');\n $(this).find('[data-html5-video]').toggleClass('secondary-media-hidden');\n $(this).find('.external-video__container').toggleClass('secondary-media-hidden');\n window.product.enableVideoOnHover($(this));\n });\n $('.has-secondary-media-swap').on('mouseleave', function () {\n $(this).find('.image-element__wrap img').toggleClass('secondary-media-hidden');\n $(this).find('[data-html5-video]').toggleClass('secondary-media-hidden');\n $(this).find('.external-video__container').toggleClass('secondary-media-hidden');\n window.product.disableVideoOnHover($(this));\n });\n }\n },\n unload: function ($target) {\n $target.find('.thumbnail').off('mouseenter mouseleave');\n $('body').off('change', '#sort-by');\n $target.find('.quick_shop, .quick_shop--list').off('click.fb');\n $target.find('[data-filter-modal-open]').off('click');\n $(window).off('resize.filtering');\n }\n};\n/*============================================================================\n Faceted Filtering\n==============================================================================*/\n\nvar facetedFiltering = {\n init: function () {\n const filterRange = document.querySelectorAll('[data-filter-range]');\n const filterCheckboxes = document.querySelectorAll('[data-filter-input]');\n const rangeNames = [];\n filterCheckboxes.forEach(function (checkbox) {\n $(checkbox).on('click', function (e) {\n e.stopPropagation();\n e.preventDefault();\n const target = e.currentTarget;\n if (target.hasAttribute('data-disabled')) return; // Toggle checked state\n\n target.querySelector('[data-filter-checkbox]').toggleAttribute('data-filter-checked');\n window.location = target.dataset.url;\n });\n });\n /* For range input */\n\n filterRange.forEach(function (filter) {\n rangeNames.push(filter.name);\n });\n $('[data-range-filter-button]').on('click', function (e) {\n facetedFiltering.getFilteredResults(e.currentTarget, rangeNames);\n });\n $('[data-filter-modal-open]').on('click', function (e) {\n e.preventDefault();\n $.fancybox.open($('[data-filter-modal]'), {\n baseClass: 'faceted-filter-modal',\n hash: false,\n infobar: false,\n toolbar: false,\n loop: true,\n smallBtn: true,\n touch: false,\n mobile: {\
1n preventCaptionOverlap: false,\n toolbar: true,\n buttons: [\"close\"]\n },\n afterShow: function () {\n $(document.documentElement).addClass('scroll-locked');\n },\n afterClose: function () {\n $(document.documentElement).removeClass('scroll-locked');\n }\n });\n });\n $(window).on('resize.filtering', function (e) {\n if (window.innerWidth >= 799) {\n $('[data-filter-modal]').removeAttr('style');\n }\n });\n },\n getFilteredResults: function (element, rangeNames) {\n let searchParameters;\n const currentSearch = window.location.search.replace('?', '');\n const formData = new FormData(element.closest('form'));\n const newSearch = new URLSearchParams(formData).toString(); // Filter through current search string to see if price range input already exists,\n // if it does, create new string without current price range parameters\n\n const splitCurrentSearch = currentSearch.split('&');\n let filteredCurrentSearch = splitCurrentSearch.filter(search => {\n if (search.includes(rangeNames[0]) || search.includes(rangeNames[1])) {\n return false;\n }\n\n return true;\n });\n filteredCurrentSearch = filteredCurrentSearch.join('&'); // If current search parameters exist, append new search parameters\n // on to existing parameters\n\n if (filteredCurrentSearch.length > 0) {\n searchParameters = `${filteredCurrentSearch}&${newSearch}`;\n } else {\n searchParameters = `${newSearch}`;\n }\n\n let urlQueryString = '';\n\n if (searchParameters) {\n urlQueryString = `?${searchParameters}`;\n } else if (searchParameters) {\n urlQueryString = `?${searchParameters}`;\n }\n\n window.location.search = urlQueryString;\n }\n};\n/*============================================================================\n Map\n==============================================================================*/\n\nwindow.map = {\n init: function () {\n if ($(\".shopify-section--map .map, .shopify-section--page-contact-template .map\").hasClass('js-api-map')) {\n var mapsToLoad = []; //Create map settings array\n\n $('.map').each(function (i, obj) {\n mapsToLoad.push(this);\n mapsToLoad[i].sectionid = $(this).data('id');\n mapsToLoad[i].address = $(this).data('address');\n mapsToLoad[i].directions = $(this).data('directions-address');\n mapsToLoad[i].zoom = $(this).data('zoom');\n mapsToLoad[i].mapstyle = $(this).data('style');\n mapsToLoad[i].showpin = $(this).data('pin');\n mapsToLoad[i].apikey = $(this).data('api-key');\n });\n $.each(mapsToLoad, function (i, instance) {\n //Enable caching to avoid duplicate google maps files\n $.ajaxSetup({\n cache: true\n }); //Load maps script and find location coordinates\n\n $.getScript('https://maps.googleapis.com/maps/api/js?key=' + mapsToLoad[i].apikey).then(function () {\n window.map.findLocation(mapsToLoad[i]);\n $.ajaxSetup({\n cache: false\n });\n });\n });\n }\n },\n findLocation: function (mapArray) {\n var geoLat;\n var geoLng;\n var geocoder = new google.maps.Geocoder(); //Find and set coordinates\n\n geocoder.geocode({\n 'address': mapArray.address\n }, function (results, status) {\n if (status == google.maps.GeocoderStatus.OK) {\n geoLat = results[0].geometry.location.lat();\n geoLng = results[0].geometry.location.lng(); //Create map\n\n window.map.initMap(geoLat, geoLng, mapArray);\n }\n });\n },\n initMap: function (lat, lng, mapArray) {\n var location = {\n lat: lat,\n lng: lng\n };\n var styleJson = []; //Set style JSON\n\n if (mapArray.mapstyle == 'aubergine') {\n styleJson = [{\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#1d2c4d\"\n }]\n }, {\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#8ec3b9\"\n }]\n }, {\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#1a3646\"\n }]\n }, {\n \"featureType\": \"administrative.country\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#4b6878\"\n }]\n }, {\n \"featureType\": \"administrative.land_parcel\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#64779e\"\n }]\n }, {\n \"featureType\": \"administrative.province\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#4b6878\"\n }]\n }, {\n \"featureType\": \"landscape.man_made\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#334e87\"\n }]\n }, {\n \"featureType\": \"landscape.natural\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#023e58\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#283d6a\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#6f9ba5\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#1d2c4d\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [{\n \"color\": \"#023e58\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#3C7680\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#304a7d\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#98a5be\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#1d2c4d\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#2c6675\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#255763\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#b0d5ce\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#023e58\"\n }]\n }, {\n \"featureType\": \"transit\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#98a5be\"\n }]\n }, {\n \"featureType\": \"transit\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#1d2c4d\"\n }]\n }, {\n \"featureType\": \"transit.line\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [{\n \"color\": \"#283d6a\"\n }]\n }, {\n \"featureType\": \"transit.station\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#3a4762\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#0e1626\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#4e6d70\"\n }]\n }];\n } else if (mapArray.mapstyle == 'retro') {\n styleJson = [{\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#ebe3cd\"\n }]\n }, {\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#523735\"\n }]\n }, {\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#f5f1e6\"\n }]\n }, {\n \"featureType\": \"administrative\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#c9b2a6\"\n }]\n }, {\n \"featureType\": \"administrative.land_parcel\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#dcd2be\"\n }]\n }, {\n \"featureType\": \"administrative.land_parcel\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#ae9e90\"\n }]\n }, {\n \"featureType\": \"landscape.natural\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#dfd2ae\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#dfd2ae\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#93817c\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [{\n \"color\": \"#a5b076\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#447530\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#f5f1e6\"\n }]\n }, {\n \"featureType\": \"road.arterial\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#fdfcf8\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#f8c967\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#e9bc62\"\n }]\n }, {\n \"featureType\": \"road.highway.controlled_access\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#e98d58\"\n }]\n }, {\n \"featureType\": \"road.highway.controlled_access\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#db8555\"\n }]\n }, {\n \"featureType\": \"road.local\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#806b63\"\n }]\n }, {\n \"featureType\": \"transit.line\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#dfd2ae\"\n }]\n }, {\n \"featureType\": \"transit.line\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#8f7d77\"\n }]\n }, {\n \"featureType\": \"transit.line\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#ebe3cd\"\n }]\n }, {\n \"featureType\": \"transit.station\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#dfd2ae\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [{\n \"color\": \"#b9d3c2\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#92998d\"\n }]\n }];\n } else if (mapArray.mapstyle == 'silver') {\n styleJson = [{\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#f5f5f5\"\n }]\n }, {\n \"elementType\": \"labels.icon\",\n \"stylers\": [{\n \"visibility\": \"off\"\n }]\n }, {\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#616161\"\n }]\n }, {\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#f5f5f5\"\n }]\n }, {\n \"featureType\": \"administrative.land_parcel\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#bdbdbd\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#eeeeee\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#757575\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#e5e5e5\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#9e9e9e\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#ffffff\"\n }]\n }, {\n \"featureType\": \"road.arterial\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#757575\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#dadada\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#616161\"\n }]\n }, {\n \"featureType\": \"road.local\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#9e9e9e\"\n }]\n }, {\n \"featureType\": \"transit.line\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#e5e5e5\"\n }]\n }, {\n \"featureType\": \"transit.station\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#eeeeee\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#c9c9c9\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#9e9e9e\"\n }]\n }];\n } else if (mapArray.mapstyle == 'night') {\n styleJson = [{\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#242f3e\"\n }]\n }, {\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#746855\"\n }]\n }, {\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#242f3e\"\n }]\n }, {\n \"featureType\": \"administrative.locality\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#d59563\"\n }]\n }, {\n \"featureType\": \"poi\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#d59563\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#263c3f\"\n }]\n }, {\n \"featureType\": \"poi.park\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\"
1: \"#6b9a76\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#38414e\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#212a37\"\n }]\n }, {\n \"featureType\": \"road\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#9ca5b3\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#746855\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [{\n \"color\": \"#1f2835\"\n }]\n }, {\n \"featureType\": \"road.highway\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#f3d19c\"\n }]\n }, {\n \"featureType\": \"transit\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#2f3948\"\n }]\n }, {\n \"featureType\": \"transit.station\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#d59563\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"geometry\",\n \"stylers\": [{\n \"color\": \"#17263c\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [{\n \"color\": \"#515c6d\"\n }]\n }, {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [{\n \"color\": \"#17263c\"\n }]\n }];\n } else {\n styleJson = [];\n } //Create google maps link\n\n\n $('.js-map-link').attr('href', 'https://www.google.com/maps/place/' + mapArray.directions + '/@' + lat + ',' + lng); //Set map options\n\n var mapOptions = {\n zoom: mapArray.zoom,\n center: location,\n styles: styleJson,\n disableDefaultUI: false\n }; //Create map\n\n var map = new google.maps.Map(document.getElementById(mapArray.sectionid), mapOptions); //Show pin\n\n if (mapArray.showpin == true) {\n var marker = new google.maps.Marker({\n position: location,\n map: map\n });\n }\n }\n};\n/*============================================================================\n Blogs\n==============================================================================*/\n\nwindow.blogs = {\n init: function () {\n $('body').on('change', '#tag_filter', function () {\n const filterValue = $('#tag_filter').val();\n window.location.pathname = filterValue;\n });\n },\n unload: function () {\n $('body').off('change', '#tag_filter');\n }\n};\n/*============================================================================\n Article\n==============================================================================*/\n\nwindow.article = {\n init: function () {\n window.banner_image.init();\n window.banner.init();\n\n if (window.location.pathname.indexOf('/comments') != -1) {\n $('html,body').animate({\n scrollTop: $(\"#new-comment\").offset().top - 140\n }, 'slow');\n }\n },\n unload: function ($target) {}\n};\n/*============================================================================\n Utilities\n==============================================================================*/\n\nvar plyrUtils = {\n playButtonIcon: '<button type=\"button\" class=\"plyr__control plyr__control--overlaid\" aria-label=\"Play, {title}\" data-plyr=\"play\"><svg class=\"play-icon-button-control\" width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"60\" height=\"60\" fill=\"white\"/><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23 20V40L39 29.4248L23 20Z\" fill=\"#323232\"/></svg><span class=\"plyr__sr-only\">Play</span></button>',\n playButton: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" aria-label=\"Play, {title}\" data-plyr=\"play\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-pause\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-play\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">
1Pause</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Play</span></button>',\n muteButton: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" aria-label=\"Mute\" data-plyr=\"mute\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-muted\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-volume\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">Unmute</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Mute</span></button>',\n progressInput: '<div class=\"plyr__controls__item plyr__progress__container\"><div class=\"plyr__progress\"><input data-plyr=\"seek\" type=\"range\" min=\"0\" max=\"100\" step=\"0.01\" value=\"0\" aria-label=\"Seek\"><progress class=\"plyr__progress__buffer\" min=\"0\" max=\"100\" value=\"0\">% buffered</progress><span role=\"tooltip\" class=\"plyr__tooltip\">00:00</span></div></div>',\n volume: '<div class=\"plyr__controls__item plyr__volume\"><input data-plyr=\"volume\" type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value=\"1\" autocomplete=\"off\" aria-label=\"Volume\"></div>',\n fullscreen: '<button type=\"button\" class=\"plyr__controls__item plyr__control\" data-plyr=\"fullscreen\"><svg class=\"icon--pressed\" role=\"presentation\"><use xlink:href=\"#plyr-exit-fullscreen\"></use></svg><svg class=\"icon--not-pressed\" role=\"presentation\"><use xlink:href=\"#plyr-enter-fullscreen\"></use></svg><span class=\"label--pressed plyr__tooltip\" role=\"tooltip\">Exit fullscreen</span><span class=\"label--not-pressed plyr__tooltip\" role=\"tooltip\">Enter fullscreen</span></button>'\n};\nvar controls = plyrUtils.playButtonIcon + '<div class=\"plyr__controls\">' + plyrUtils.playButton + plyrUtils.progressInput + plyrUtils.muteButton + plyrUtils.volume + plyrUtils.fullscreen + '</div';\nvar globalPlayersArray = [];\nvar secondaryMediaPlayers;\nvar utilities = {\n listenForResize: function () {\n window.addEventListener('orientationchange', function (event) {\n setTimeout(function () {\n window.banner.init();\n }, 100);\n }); // Setup a timer\n\n var resizeTimeout; // Listen for resize events\n\n window.addEventListener('resize', function (event) {\n // If timer is null, reset it to 66ms and run your functions.\n // Otherwise, wait until timer is cleared\n if (!resizeTimeout) {\n resizeTimeout = setTimeout(function () {\n // Reset timeout\n resizeTimeout = null; // Run our resize functions\n\n announcement_bar.setPadding();\n window.animate_content.init();\n window.header.setHeaderPosition();\n window.banner_image.resetPadding();\n window.banner_image.init();\n window.banner.init();\n window.header.dynamicDropdown();\n window.header.setPadding();\n }, 66);\n }\n }, false);\n },\n launchVideoPlayer: function (Plyr, galleryObject, videos, showSecondaryMedia) {\n if (galleryObject != null) {\n galleryObject.videoPlayers = Plyr.setup(videos, {\n controls: controls,\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: true\n },\n storage: {\n enabled: false\n }\n }); // Going through galleries array and pushing players into master array\n\n $.each(galleryObject.videoPlayers, function (index, player) {\n globalPlayersArray.push(player);\n });\n } else if (showSecondaryMedia == true) {\n // Collection page/Recommended Products secondary media\n secondaryMediaPlayers = Plyr.setup(videos, {\n controls: controls,\n fullscreen: {\n enabled: true,\n fallback: true,\n iosNative: true\n },\n storage: {\n enabled: false\n }\n }); // Add data-attribute 'plyr-loaded=\"true\"' to videos container\n\n $('.shopify-section--recommended-products').find('.products').attr('data-plyr-loaded', 'true');\n $.each(secondaryMediaPlayers, function (index, player) {\n globalPlayersArray.push(player);\n }); // Adds plyr video id to video wrapper\n\n $.each(globalPlayersArray, function (index, player) {\n var source = player.provider;\n var id = player.id;\n var $video;\n\n if (source == 'html5') {\n $video = $(player.elements.wrapper).find('video');\n $video.attr('data-plyr-video-id', id);\n }\n });\n return secondaryMediaPlayers;\n }\n },\n enableDisclosure: function () {\n var $disclosure = $('[data-disclosure]');\n var $toggle = $('[data-disclosure-toggle]');\n var $disclosureWrap = $('.disclosure__list-wrap'); //Check if current opened menu is offscreen\n\n function checkOffScreen($openedToggle) {\n if ($openedToggle.siblings('.disclosure__list-wrap').is(':off-right')) {\n $openedToggle.siblings('.disclosure__list-wrap').addClass('disclosure--left');\n }\n }\n\n function closeDisclosures(ignoreTarget, currentTarget) {\n if (ignoreTarget === true) {\n $toggle.not(currentTarget).removeClass('is-cl
1icked');\n $toggle.not(currentTarget).attr('aria-expanded', 'false');\n } else {\n $toggle.removeClass('is-clicked');\n $toggle.attr('aria-expanded', 'false');\n }\n\n $disclosureWrap.removeClass('disclosure--left');\n } //Close menus on ESC\n\n\n $('body').on('keyup', function (e) {\n if (e.which == '27') {\n closeDisclosures();\n }\n }); //Close menus on hoverout\n\n $disclosure.on('mouseleave', function (e) {\n closeDisclosures();\n }); //On click/focus event for toggling options\n\n $toggle.on('mouseenter', function (e) {\n //Close all other menus\n closeDisclosures(true, this);\n var $target = $(e.currentTarget);\n $target.attr('aria-expanded', 'true').addClass('is-clicked');\n checkOffScreen($target);\n });\n $toggle.on('keyup', function (e) {\n if (e.which === 13) {\n var $target = $(e.currentTarget);\n $target.attr('aria-expanded', 'true').addClass('is-clicked');\n checkOffScreen($target);\n }\n });\n $disclosure.on('focusout', function (e) {\n const list = e.currentTarget;\n const nextEl = e.relatedTarget; // The element that would receive focus.\n // If the nextEl is within the list (a list item), don't close the list\n\n if (!list.contains(nextEl)) {\n closeDisclosures(false, this);\n }\n }); //Mobile toggle logic\n\n $toggle.on('touchstart', function (e) {\n if (window.PXUTheme.media_queries.medium.matches || !window.PXUTheme.device.hasTouch.matches) {\n var $target = $(e.currentTarget);\n closeDisclosures(true, this);\n\n if (!$target.hasClass('is-clicked')) {\n $target.attr('aria-expanded', 'true').addClass('is-clicked');\n checkOffScreen($target);\n } else {\n $target.attr('aria-expanded', 'false').removeClass('is-clicked');\n $disclosureWrap.removeClass('disclosure--left');\n }\n }\n });\n },\n addImageDimension: function (imageUrl, size) {\n var insertPosition = imageUrl.lastIndexOf(\".\");\n return imageUrl.substring(0, insertPosition) + size + imageUrl.substring(insertPosition);\n },\n unload: function () {\n $('[data-disclosure]').off();\n $('[data-disclosure-toggle]').off();\n $('.disclosure__list-wrap').off();\n }\n};\n\nvar toggleSidebarBlocks = function ($toggle) {\n if ($toggle.parent().next('ul').is(':visible')) {\n $toggle.parent().next('ul').hide();\n $toggle.html('+');\n $toggle.attr('aria-expanded', false);\n } else {\n $toggle.parent().next('ul').show();\n $toggle.html('-');\n $toggle.attr('aria-expanded', true);\n }\n};\n\nvar toggleSidebarMenus = function ($toggle) {\n var $content = $toggle.next('ul');\n $content.slideToggle();\n $toggle.toggleClass('active');\n $toggle.attr('aria-expanded', $toggle.attr('aria-expanded') == 'true' ? 'false' : 'true');\n};\n\nwindow.animate_content = {\n init: function () {\n // added to the listenForResize method\n if (window.PXUTheme.media_queries.large.matches || $(window).width() == 0) {\n $(\".animate_right\").waypoint(function () {\n $(this.element).addClass(\"animated fadeInRight\");\n }, {\n offset: '80%'\n });\n $(\".animate_left\").waypoint(function () {\n $(this.element).addClass(\"animated fadeInLeft\");\n }, {\n offset: '80%'\n });\n $(\".animate_up\").waypoint(function () {\n $(this.element).addClass(\"animated fadeInUp\");\n }, {\n offset: '80%'\n });\n $(\".animate_in\").waypoint(function () {\n $(this.element).addClass(\"animated fadeIn\");\n }, {\n offset: '80%'\n });\n $(\".animate_down\").waypoint(function () {\n $(this.element).addClass(\"animated fadeInDown\");\n }, {\n offset: '80%'\n });\n }\n }\n};\n/*============================================================================\n Cart\n==============================================================================*/\n\nwindow.cart = {\n init: function () {\n $(\"#address_country\").val($(\"#address_country\").data(\"default\")).change();\n },\n unload: function () {}\n};\n/*============================================================================\n Predictive search\n==============================================================================*/\n\nwindow.predictiveSearch = {\n init: function () {\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_8__.default();\n this.closeSearch = document.querySelector('[data-search-close]');\n this.siteOverlay = document.querySelector('[data-site-overlay]');\n this.siteOverlayAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n el: this.siteOverlay\n });\n this.searchForms = document.querySelectorAll('[data-predictive-search-enabled-true]');
1\n this.searchForms.forEach(form => {\n const input = form.querySelector('[data-search-input]');\n const results = form.querySelector('[data-search-results]');\n const resultsContainer = form.querySelector('[data-search-results-container]');\n const animation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_9__.transition)({\n el: resultsContainer\n });\n this.events.register(form, 'submit', e => this._onSubmit(e, input));\n this.events.register(window, 'resize', () => this._onResize(resultsContainer));\n this.events.register(window, 'keyup', e => this._onKeyUp(e, form, input, animation));\n this.events.register(this.closeSearch, 'click', () => this._close(form, animation));\n this.events.register(input, 'focus', () => this._onFocus(form, input, results, resultsContainer, animation));\n this.events.register(input, 'input', just_debounce__WEBPACK_IMPORTED_MODULE_10___default()(() => this._onChange(form, input, results, resultsContainer, animation)), 250);\n this.events.register(document.body, 'click', e => {\n if (form.classList.contains('search-form--active')) {\n if (!form.contains(e.target) && !form.closest('.mobile-search')) {\n this._close(form, animation);\n }\n }\n });\n });\n },\n\n _onSubmit(e, input) {\n // Prevent empty form submissions\n if (this._getQuery(input).length === 0) e.preventDefault();\n },\n\n _onResize(resultsContainer) {\n this._resizeSearchResults(resultsContainer);\n },\n\n _onKeyUp(e, form, input, animation) {\n if (e.code === 'Escape') {\n input.value = '';\n\n this._close(form, animation);\n\n $('#search').removeClass(\"fadeIn\").hide();\n }\n },\n\n _onBlur(form, animation) {\n this._close(form, animation);\n\n $('#search').removeClass(\"fadeIn\").hide();\n },\n\n _onFocus(form, input, results, resultsContainer, animation) {\n const term = this._getQuery(input);\n\n if (term.length === 0) return;\n\n this._getSearchResults(term, form, results, resultsContainer, animation);\n\n this._open(form, resultsContainer, animation);\n },\n\n _onChange(form, input, results, resultsContainer, animation) {\n const term = this._getQuery(input);\n\n if (term.length === 0) {\n this._close(form, animation);\n\n return;\n }\n\n this._getSearchResults(term, form, results, resultsContainer, animation);\n\n this._open(form, resultsContainer, animation);\n },\n\n _getQuery(input) {\n return input.value.trim();\n },\n\n _open(form, resultsContainer, animation) {\n animation.animateTo('open').then(() => {\n document.body.classList.add('scroll-locked');\n form.classList.add('search-form--active');\n\n if (form.classList.contains('search-form--overlay-enabled-true')) {\n this.siteOverlayAnimation.animateTo('open');\n }\n\n if (form.closest('.mobile-search') || form.closest('.mobile-search-bar') && window.PXUTheme.media_queries.medium.matches) {\n this.closeSearch.style.display = 'flex';\n }\n\n this._resizeSearchResults(resultsContainer);\n });\n },\n\n _close(form, animation) {\n animation.animateTo('closed').then(() => {\n form.classList.remove('search-form--active');\n document.body.classList.remove('scroll-locked');\n\n if (form.classList.contains('search-form--overlay-enabled-true')) {\n this.siteOverlayAnimation.animateTo('closed');\n }\n\n if (this.closeSearch && window.PXUTheme.theme_settings.mobile_search_location == 'below-header' && window.PXUTheme.media_queries.medium.matches) {\n this.closeSearch.style.display = 'none';\n }\n });\n },\n\n _getSearchResults(term, form, results, resultsContainer, animation) {\n const resourceType = form.classList.contains('search-form--blog') ? '&resources[type]=article' : '';\n resultsContainer.setAttribute('data-loading', 'true');\n fetch(`${window.PXUTheme.routes.predictive_search_url}?q=${term}${resourceType}§ion_id=predictive-search`).then(response => {\n if (!response.ok) {\n const error = new Error(response.status);\n throw error;\n }\n\n return response.text();\n }).then(text => {\n const resultsMarkup = new DOMParser().parseFromString(text, 'text/html').querySelector('#shopify-section-predictive-search').innerHTML;\n\n this._renderSearchResults(resultsMarkup, form, results, resultsContainer, animation);\n }).catch(error => {\n throw error;\n });\n },\n\n _renderSearchResults(resultsMarkup, form, results, resultsContainer, animation) {\n resultsContainer.setAttribute('data-loading', 'false');\n results.innerHTML = resultsMarkup;\n\n this._registerEvents(form, animation);\n },\n\n _registerEvents(form, animation) {\n this.searchButton = form.querySelector('[data-predictive-search-button]');\n this.events.register(this.searchButton, 'blur', () => this._onBlur(form, animation));\n },\n\n _resizeSearchResults(resultsContainer) {\n const offset = 3
10;\n const position = resultsContainer.parentNode.getBoundingClientRect();\n const maxHeight = window.innerHeight - position.bottom - offset;\n resultsContainer.style.setProperty('--search-results-max-height', `${maxHeight}px`);\n }\n\n};\n/*============================================================================\n Responsive media\n==============================================================================*/\n\nfunction enableResponsiveVideoWrapper() {\n // Wraps YouTube and Vimeo iframes in Plyr wrapper\n // Does not target iframes already embedded in Plyr wrapper (video sections and product galleries)\n $('iframe[src*=\"youtube.com\"]:not(.plyr__video-wrapper iframe[src*=\"youtube.com\"])').wrap('<div class=\"plyr__video-embed\"></div>');\n $('iframe[src*=\"vimeo.com\"]:not(.plyr__video-wrapper iframe[src*=\"vimeo.com\"])').wrap('<div class=\"plyr__video-embed\"></div>');\n}\n/*============================================================================\n Start of cart-related functionality\n==============================================================================*/\n\n\nfunction ajaxSubmitCart() {\n const $cart = $(\"#cart\");\n $.ajax({\n url: '/cart/update.js',\n dataType: 'json',\n cache: false,\n type: 'post',\n data: $cart.serialize(),\n success: function (data) {\
1n refreshCart(data);\n }\n });\n}\n\nfunction ajaxUpdateCart(lineID, quantity, parent) {\n $.ajax({\n url: '/cart/change.js',\n dataType: 'json',\n cache: false,\n type: 'post',\n data: {\n quantity: quantity,\n line: lineID\n },\n success: function (data) {\n refreshCart(data);\n var lineIDIndex = lineID - 1;\n var $input = parent.find(\"input[data-line-id='\" + lineID + \"']\"); //check to see if there are correct amount of products in array\n\n if (typeof data.items[lineIDIndex] === \"undefined\") {\n var updated_quantity = 0;\n } else {\n var updated_quantity = data.items[lineIDIndex].quantity;\n }\n\n if (quantity > 0 && quantity != updated_quantity) {\n if (updated_quantity == 1) {\n var items_left_text = window.PXUTheme.translation.items_left_count_one;\n } else {\n var items_left_text = window.PXUTheme.translation.items_left_count_other;\n }\n\n $('.warning--quantity').remove();\n var warning = `\n <div\n class=\"\n warning\n warning--quantity\n animated\n bounceIn\n \"\n >\n ${updated_quantity} ${items_left_text}\n </div>\n `;\n $input.parent().next().append(warning);\n $input.val(updated_quantity);\n }\n }\n });\n}\n\nfunction refreshCart(cart) {\n const $cartBtn = $(\".cart-button span\");\n\n if ($cartBtn && $cartBtn.length) {\n var value = $cartBtn.text() || '0';\n var cart_items_html = \"\";\n var $cart = $(\"#cart ul\");\n $cartBtn.text(value.replace(/[0-9]+/, cart.item_count));\n $cart.find('li:not(:first)').remove();\n\n if (cart.item_count == 0) {\n $cart.append('<li class=\"empty_cart\">' + window.PXUTheme.translation.empty_cart + '</li>');\n } else {\n $.each(cart.items, function (index, item) {\n var line_id = index + 1;\n let discountMessage = '';\n let unitPricingOutput = '';\n\n if (item.unit_price_measurement) {\n unitPricingOutput = window.product.unitPricing(item);\n } // Discounts logic\n\n\n if (item.discounts.length) {\n var discountAmount = Shopify.formatMoney(item.discounts[0].amount, $('body').data('money-format'));\n var title = item.discounts[0].title;\n discountMessage = `\n <span class=\"notification-discount\">\n ${window.PXUTheme.translation.cart_discount}: ${title} (-<span class=\"money\">${discountAmount}</span>)\n </span>\n `;\n }\n\n cart_items_html += `\n <li class=\"mm-listitem\">\n <a class=\"cart__item\" href=\"${item.url}\">\n `;\n\n if (item.image) {\n cart_items_html += `\n <div class=\"cart__image\">\n <img src=\"${item.image.replace(/(\\.[^.]*)$/, \"_medium$1\").replace('http:', '')}\" alt=\"${htmlEncode(item.title)}\"/>\n </div>\n `;\n }\n\n cart_items_html += `\n <div class=\"cart__info\">\n <div class=\"cart__description\">\n ${item.title}\n `;\n\n if (item.properties) {\n $.each(item.properties, function (title, value) {\n if (value && value !== 'on') {\n cart_items_html += `\n <div class=\"line-item\">\n ${title}: ${value}\n </div>\n `;\n }\n });\n }\n\n if (item.selling_plan_allocation && item.selling_plan_allocation.selling_plan) {\n cart_items_html += `\n <br>\n <span class=\"line-item selling-plan\">\n ${item.selling_plan_allocation.selling_plan.name}\n </span>\n `;\n }\n\n if (item.price > item.final_price) {\n cart_items_html += `\n <div class=\"cart__price\">
1\n <span class=\"money\">\n ${Shopify.formatMoney(item.final_line_price, $('body').data('money-format'))}\n </span>\n\n <span class=\"was_price money\">\n ${Shopify.formatMoney(item.original_line_price, $('body').data('money-format'))}\n </span>\n </div>\n\n <div class=\"cart__unit-price\">\n ${unitPricingOutput}\n </div>\n\n <div class=\"cart__discount\">\n ${discountMessage}\n </div>\n\n </div>\n `;\n } else {\n cart_items_html += `\n <div class=\"cart__price\">\n <span class=\"money\">\n ${Shopify.formatMoney(item.price, $('body').data('money-format'))}\n </span>\n </div>\n\n <div class=\"cart__unit-price\">\n ${unitPricingOutput}\n </div>\n\n </div>\n `;\n }\n\n cart_items_html += `\n <div class=\"cart__quantity\">\n <span class=\"icon-minus minus\"></span>\n <input type=\"number\" min=\"0\" class=\"quantity\" name=\"updates[]\" id=\"updates_${item.id}\" value=\"${item.quantity}\" data-line-id=\"${line_id}\" />\n <span class=\"icon-plus plus\"></span>\n </div>\n </div>\n\n </div>\n </a>\n `;\n });\n var cartDiscounts = cart.cart_level_discount_applications;\n var cartDiscountMessage = \"\";\n\n for (let i = 0; i < cartDiscounts.length; i++) {\n var amount = Shopify.formatMoney(cartDiscounts[i].total_allocated_amount, $('body').data('money-format'));\n var title = cartDiscounts[i].title;\n cartDiscountMessage = '<p class=\"mm-counter price mm-discount-label mm-listitem__text\">' + title + '<span>' + '(- <span class=\"money\">' + amount + '</span>)' + '</span>' + '</p>';\n }\n\n if (cart.cart_level_discount_applications.length > 0) {\n cart_items_html += '<li class=\"mm-label mm-listitem\">' + cartDiscountMessage + '</li>';\n }\n\n cart_items_html += `\n <li class=\"mm-label mm-listitem\">\n <a href=\"/cart\" class=\"cart__item-subtotal\">\n <span>\n ${window.PXUTheme.translation.subtotal}\n </span>\n\n <span class=\"mm-counter price\">\n <span class=\"money\">\n ${Shopify.formatMoney(cart.total_price, $('body').data('money-format'))}\n </span>\n </span>\n </a>\n </li>\n\n <li class=\"mm-subtitle mm-listitem\">\n `;\n\n if (window.PXUTheme.theme_settings.display_special_instructions) {\n var cart_note = cart.note ? cart.note : '';\n cart_items_html += '<textarea id=\"cart-note\" name=\"note\" rows=\"2\" placeholder=\"' + window.PXUTheme.translation.cart_notes + '\" class=\"clearfix\">' + cart_note + '</textarea>';\n }\n\n ;\n\n if (window.PXUTheme.theme_settings.display_tos_checkbox) {\n cart_items_html += '<aside class=\"tos tos_checkbox\"><input type=\"checkbox\" class=\"tos_agree\" id=\"sliding_agree\" required /><label class=\"tos_label\" for=\"sliding_agree\"> ' + window.PXUTheme.theme_settings.tos_richtext + '</label></aside>';\n }\n\n ;\n cart_items_html += '<span class=\"mm-action_buttons mm-listitem__text\"><a href=\"' + window.PXUTheme.theme_settings.cart_url + '\" class=\"action_button edit_cart left\">' + window.PXUTheme.translation.edit_cart + '</a>' + '<input type=\"submit\" class=\"action_button right\" value=\"' + window.PXUTheme.translation.checkout + '\"/>' + '</span>' + '</li>';\n $cart.append(cart_items_html);\n $cart.find('li.cart_item:last').addClass('last_cart_item');\n }\n }\n} // Document ready\n\n\n$(function () {\n utilities.listenForResize();\n utilities.enableDisclosure();\n window.lazySizesConfig = window.lazySizesConfig || {};\n lazySizesConfig.expand = 300;\n lazySizesConfig.loadHidden = false;\n $(\"body\").on(\"click\", '.continue', function () {\n var cart = $(\"#cart\").data(\"mmenu\");\n cart.close();\n var nav = $(\"#nav\").data(\"mmenu\");\n nav.close();\n }); // Search submit trigger event\n\n $('.search-form .submit-search, .search-form--mobile .submit-search').on('click touchstart', function (e) {\n $(this).parents('form').submit();\n }); // Offscreen check for dropdown menus\n\n $('.sub-menu').on('mouseenter', function () {\n if ($(this).find('.dropdown').is(':off-right')) {\n $(this).find('.dropdown').addClass(\"dropdown--align\");\n }\n });\n $('.sub-menu').on('mouseleave', function () {\n if ($(this).find('.dropdown').hasClass('dropdown--align')) {\n $(this).find('.dropdown').removeClass(\"dropdown--align\");\n }\n }); // Accessibility tabbing\n\n window.header.openDropdown(); // Load Accordions\n\n var allPanels = $('.accordion > dd');\n\n for (var i = 0; i < allPanels.length;
1 i++) {\n $(allPanels[i]).css('height', $(allPanels[i]).outerHeight());\n }\n\n allPanels.hide();\n $('.accordion > dt > a').click(function () {\n if (!$(this).parent().next().is(':visible')) {\n allPanels.slideUp();\n $(this).parent().next().slideDown();\n $('.accordion small.right').html('◄');\n $(this).find('small.right').html('▼');\n }\n\n return false;\n });\n $('.accordion dd:first-of-type').show(); //Load sections\n\n window.banner_image.init();\n window.header.init();\n window.banner.init();\n window.map.init();\n window.videoTheme.init();\n window.product.init();\n window.collection.init();\n window.cart.init();\n window.productFormListeners.init();\n window.featured_promotions.init();\n window.animate_content.init();\n window.blogs.init();\n\n if (window.PXUTheme.theme_settings.enable_predictive_search) {\n window.predictiveSearch.init();\n }\n\n var $jsSections = $('.shopify-section[class*=js]'); // Loop through sections with js classes and load them in\n\n var $jsSectionNames = $jsSections.each(function () {\n for (var i = 0; i < this.classList.length; i++) {\n if (this.classList[i].substring(0, 2) === \"js\") {\n var triggerClass = this.classList[i];\n\n if (window.PXUTheme[triggerClass]) {\n //console.log('Section: ' + triggerClass + ' has been loaded.')\n window.PXUTheme[triggerClass].init($(this));\n } else {//console.warn('Uh oh, ' + triggerClass + ' is referenced in section schema class, but can not be found. Make sure \"z__' + triggerClass + '.js\" and window.PXUTheme.' + triggerClass + '.init() function exists.');\n }\n }\n }\n });\n objectFitImages();\n\n if (window.PXUTheme.currency.shipping_calculator && document.querySelector('[data-cart-shipping]')) {\n const shippingCalculator = new _helpers_ShippingCalculator__WEBPACK_IMPORTED_MODULE_7__.default({\n el: document.querySelector('[data-cart-shipping]')\n });\n } // Initialize Responsive Videos\n\n\n enableResponsiveVideoWrapper();\n var $header = $(\".feature_image .header\");\n $(document).on('click', '.search__submit', function (e) {\n $(this).parent('form').submit();\n });\n $(document).on('click', '#search-toggle', function (e) {\n e.stopPropagation();\n e.preventDefault();\n document.body.classList.remove('scroll-locked');\n $('.search-form--header').css('padding-top', $('.header').height() + 50 + 'px');\n\n if ($('#search').is(\":visible\") && $(window).scrollTop() == 0) {\n if (window.PXUTheme.theme_settings.header_background == false) {\n $header.removeClass('header-background--true');\n }\n } else {\n $header.addClass('header-background--true');\n }\n\n if ($('#search').hasClass(\"fadeIn\")) {\n $('#search').removeClass(\"fadeIn\").hide();\n } else {\n $('#search').show().addClass(\"fadeIn\");\n const searchInput = $('#search').find('[data-search-input]');\n const searchInputLength = searchInput.val().length;\n searchInput[0].setSelectionRange(searchInputLength, searchInputLength);\n searchInput.focus();\n }\n\n $(document).on('click', function (e) {\n var searchForm = $(e.target).parents('.search-form--header');\n\n if (searchForm.length === 0) {\n $('#search').removeClass(\"fadeIn\").hide();\n document.body.classList.remove('scroll-locked');\n }\n });\n }); // Backwards compatibility with flexslider\n\n $('.slider, .flexslider:not(.homepage_slider)').find('li').unwrap();\n $('.slider, .flexslider:not(.homepage_slider)').flickity({\n pageDots: false,\n autoPlay: 6000,\n imagesLoaded: true,\n lazyLoad: 2\n });\n var arrowShape = '<svg class=\"flickity-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 13.46 24.09\"><title>flickity-arrow</title><polygon points=\"1.41 24.09 0 22.68 10.63 12.05 0 1.41 1.41 0 13.46 12.05 1.41 24.09\"/></svg>';\n $('.slider, .flexslider').find('.flickity-prev-next-button.next .flickity-button-icon').replaceWith(arrowShape);\n $('.slider, .flexslider').find('.flickity-prev-next-button.previous').addClass('arrow-is-inverse').find('.flickity-button-icon').replaceWith(arrowShape);\n\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches == false) {\n //Lightbox default options\n //https://fancyapps.com/fancybox/3/docs/#options\n $.fancybox.defaults.animationEffect = 'fade';\n $.fancybox.defaults.transitionEffect = 'slide';\n $.fancybox.defaults.hash = false;\n $.fancybox.defaults.infobar = false;\n $.fancybox.defaults.toolbar = false;\n $.fancybox.defaults.arrows = false;\n $.fancybox.defaults.loop = true;\n $.fancybox.defaults.smallBtn = true;\n $.fancybox.defaults.wheel = false;\n $.fancybox.defaults.live = false;\n $.fancybox.defaults.zoom = false;\n $.fancybox.defaults.btnTpl['smallBtn'] = '<a title=\"Close\" data-fancybox-close class=\"fancybox-item fancybox-close\" href=\"javascript:;\"></a>';\n $.fancybox.defaults.mobile.preventCaptionOverlap = false;\n $.fancybox.defaults.mobile.toolbar = true;\n $.fancybox.defaults.mobile.buttons = ['close'];\n $.fancybox.defaults.mobile.clickSlide = 'close';\n $.fancybox.defaults.mobile.clickContent = 'zoom';\n\n $.fancybox.defaults.afterLoad = function (instance, slide) {\n if (instance.current.type == 'image') {\n slide.$content.wrapInner(\"<div class='fancybox-image-wrap'></div>\");\n }\n\n if (instance.group.length > 1) {\n slide.$content.find('.fancybox-image-wrap').append('<a title=\"Previous\" class=\"fancybox-item fancybox-nav fancybox-prev ss-icon\" href=\"javascript:;\" data-fancybox-prev><span class=\"icon-circle-left\"></span></a><a title=\"Next\" class=\"fancybox-item fancybox-nav fancybox-next ss-icon\" href=\"javascript:;\" data-fancybox-next><span class=\"icon-circle-right\"></span></a>');\n }\n }; // Lightbox effect enabled if reduce motion is not enabled\n\n\n $('.lightbox').fancybox(); // Gallery fancybox initialization\n\n $('[rel=\"gallery\"]').fancybox({\n baseClass: \"gallery-section__lightbox\",\n clickContent: \"nextOrClose\"\n }); // // Trigger fancybox flickity product gallery images\n\n $('.product-gallery__main .product-gallery__image .fancybox').fancybox({\n baseClass: 'product-section__lightbox',\n clickContent: \"nextOrClose\",\n beforeShow: function () {\n // Grab the fancybox element that is being clicked\n var $fancyboxImageElement = $(this.opts.$orig); // Add alt to fancybox image\n\n var imageAlt = $fancyboxImageElement.data('alt');\n $('.fancybox-image').attr('alt', imageAlt);\n }\n });\n }\n\n if (window.PXUTheme.theme_settings.newsletter_popup) {\n newsletter_popup.init();\n }\n\n if (window.PXUTheme.theme_settings.collection_swatches) {\n window.PXUTheme;\n\n if (window.PXUTheme.media_queries.large.matches) {\n $('.thumbnail').hover(function () {\n $('.swatch span', $(this)).each(function () {\n if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n $('<img/>')[0].src = $(this).data(\"image\");\n }\n });\n });\n $('.swatch span').hover(function () {\n if ($(this).data(\"image\").indexOf(\"no-image\") == -1) {\n $(this).parents('.thumbnail').find('img').attr('src', $(this).data(\"image\"));\n }\n });\n }\n }\n\n var tabs = $('ul.tabs');\n tabs.each(function (i) {\n var tab = $(this).find('> li > a');\n tab.click(function (e) {\n var contentLocation = $(this).attr('href');\n\n if (contentLocation.charAt(0) == \"#\") {\n e.preventDefault();\n tab.removeClass('active');\n $(this).addClass('active');\n $(this).parents('ul.tabs').next().find(contentLocation).show().css({\n 'display': 'block'\n }).addClass('active').siblings().hide().removeClass('active');\n }\n });\n }); //Sidebar toggle\n\n $(document).on('click', '.menu-toggle', function (e) {\n toggleSidebarMenus($(this));\n });\n var sidebarTouched = false;\n $(document).on('touchend', '.toggle span', function (e) {\n e.stopPropagation();\n e.preventDefault();\n\n if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n var $toggle = $(this);\n toggleSidebarBlocks($toggle);\n sidebarTouched = true;\n return false;\n }\n });\n $(document).on('click', '.toggle span', function (e) {\n e.stopPropagation();\n e.preventDefault();\n\n if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n var $toggle = $(this);\n\n if (!sidebarTouched) {\n toggleSidebarBlocks($toggle);\n return false;\n }\n }\n });\n $(document).on('keyup', '.toggle span', function (e) {\n if (!$('body').hasClass('user-is-tabbing')) return;\n\n if (e.key === 'Enter') {\n e.stopPropagation();\n e.preventDefault();\n\n if (window.PXUTheme.media_queries.medium.matches || $(this).parents('.sidebar').hasClass('toggle-all--true')) {\n var $toggle = $(this);\n\n if (!sidebarTouched) {\n toggleSidebarBlocks($toggle);\n return false;\n }\n }\n }\n });\n\n if ($(\"#contact_form\").length) {\n var contactFormResponse = url('?customer_posted');\n\n if (contactFormResponse) {\n $('html,body').animate({\n scrollTop: $(\"#contact_form\").offset().top\n });\n }\n }\n\n if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n $('.swatch :radio').change(function () {\n var optionIndex = $(this).closest('.swatch').attr('data-option-index');\n var optionValue = $(this).val();\n $(this).closest('form').find('.single-option-selector').eq(optionIndex).val(optionValue).trigger('change');\n });\n }\n\n $('body').on(\"change\", \"#cart input.quantity\", function () {\n ajaxUpdateCart($(this).data('line-id'), $(this).val(), $(this).parents('#cart'));\n });
1\n $('body').on(\"change\", \"#cart #cart-note\", function () {\n ajaxSubmitCart();\n });\n\n if (window.PXUTheme.theme_settings.cart_action == 'ajax') {\n $(document).on('click', '.ajax-submit', function (e) {\n e.preventDefault();\n var $addToCartForm = $(this).closest('form');\n var $addToCartBtn = $addToCartForm.find('.add_to_cart');\n this.recipientForm = $addToCartForm[0].querySelector('[data-recipient-form]');\n $('.warning').remove();\n\n if (this.recipientForm) {\n this.recipientForm.classList.remove('recipient-form--has-errors');\n }\n\n $.ajax({\n url: '/cart/add.js',\n dataType: 'json',\n type: 'post',\n cache: false,\n data: $addToCartForm.serialize(),\n beforeSend: function () {\n $addToCartBtn.attr('disabled', 'disabled').addClass('disabled');\n $addToCartBtn.find('span').removeClass(\"zoomIn\").addClass('animated zoomOut');\n },\n success: function (itemData) {\n $addToCartBtn.find('span').text(window.PXUTheme.translation.product_add_to_cart_success).removeClass('zoomOut').addClass('fadeIn');\n window.setTimeout(function () {\n $addToCartBtn.removeAttr('disabled').removeClass('disabled');\n $addToCartBtn.find('span').addClass(\"fadeOut\").text($addToCartBtn.data('label')).removeClass('fadeIn').removeClass(\"fadeOut\").addClass('zoomIn');\n }, 1000);\n $.ajax({\n url: '/cart.js',\n dataType: \"json\",\n cache: false,\n success: function (cart) {\n refreshCart(cart);\n window.setTimeout(function () {\n $.fancybox.close();\n $('.cart-button').click();\n }, 500);\n }\n });\n },\n error: XMLHttpRequest => {\n var response = eval('(' + XMLHttpRequest.responseText + ')');\n $('.warning').remove();\n let warning;\n\n if (response.errors && response.errors.email) {\n this.recipientForm.classList.add('recipient-form--has-errors');\n } else {\n warning = '<p class=\"warning animated bounceIn\">' + response.description.replace('All 1 ', 'All ') + '</p>';\n $addToCartForm.after(warning);\n }\n\n $addToCartBtn.removeAttr('disabled').removeClass('disabled');\n $addToCartBtn.find('span').text(window.PXUTheme.translation.product_add_to_cart).removeClass('zoomOut').addClass('zoomIn');\n }\n });\n return false;\n });\n } // Variable returns true/false if reduced motion is enabled\n\n\n var reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; // Find instances of flexslider and pause slideshow\n\n if (reducedMotion) {\n $('.flexslider').flexslider('pause');\n }\n});\n\nwindow.selectCallback = function (variant, selector) {\n var $product = $('.product-' + selector.product.id);\n var $notify_form = $('.notify-form-' + selector.product.id);\n var $productForm = $('.product_form', $product);\n var variantInventory = $productForm.data('variant-inventory');\n var $notifyFormInputs = $('.notify_form__inputs');\n var notifyEmail = \"Email address\";\n var notifyEmailValue = \"\";\n var notifySend = \"Send\";\n\n if (variant) {\n if (variant.name != null) {\n var notifyMessage = $notifyFormInputs.data('notify-message') + ' - ' + variant.name;\n } else {\n var notifyMessage = $notifyFormInputs.data('notify-message');\n }\n }\n\n if ($notifyFormInputs.hasClass('customer--true')) {\n var notifyCustomerEmail = $notifyFormInputs.data('customer-email');\n var notifyEmailInput = '<input required type=\"email\" class=\"notify_email\" name=\"contact[email]\" id=\"contact[email]\" value=\"' + notifyCustomerEmail + '\" />';\n } else {\n var notifyEmailInput = '<input required type=\"email\" class=\"notify_email\" name=\"contact[email]\" id=\"contact[email]\" placeholder=\"' + notifyEmail + '\" value=\"' + notifyEmailValue + '\" />';\n }\n\n var notifyFormHTML = notifyEmailInput + '<input type=\"hidden\" name=\"challenge\" value=\"false\" /><input type=\"hidden\" name=\"contact[body]\" class=\"notify_form_message\" data-body=\"' + notifyMessage + '\" value=\"' + notifyMessage + '\" /><input class=\"action_button\" type=\"submit\" value=\"' + notifySend + '\" style=\"margin-bottom:0px\" />'; // Image variant feature\n\n if (variant && variant.featured_image && $product.is(\":visible\")) {\n var $sliders = $('.product-gallery__main', $product);\n $sliders.each(function () {\n var $slider = $(this);\n var $sliderInstance = Flickity.data(this);\n\n if ($slider.is(\":visible\") && $sliderInstance != undefined) {\n var index = $('[data-image-id=\"' + variant.featured_image.id + '\"]').data('index');\n $sliderInstance.select(index, false, true);\n }\n });\n }\n\n if (variant) {\n if (variantInventory) {\n variantInventory.forEac
1h(function (v) {\n if (v.id === variant.id) {\n variant.inventory_quantity = v.inventory_quantity;\n variant.inventory_management = v.inventory_management;\n variant.inventory_policy = v.inventory_policy;\n }\n });\n }\n\n $('.sku span', $product).text(variant.sku);\n\n if (window.PXUTheme.theme_settings.product_form_style == 'swatches') {\n for (let i = 0, length = variant.options.length; i < length; i++) {\n var radioButton = $productForm.find('.swatch[data-option-index=\"' + escape(i) + '\"] :radio[value=\"' + variant.options[i].replace(/\\\"/g, '\\\\\"') + '\"]');\n\n if (radioButton.length) {\n radioButton.get(0).checked = true;\n }\n }\n }\n }\n\n const $unitPrice = $('.product-details__unit-price', $product);\n $unitPrice.removeClass('product-details__unit-price--hidden');\n\n if (variant && variant.available == true) {\n if (variant.price < variant.compare_at_price) {\n $('.was_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.compare_at_price, $('body').data('money-format')) + '</span>');\n $('.current_price', $product).parent().addClass('sale');\n } else {\n $('.was_price', $product).html('');\n $('.current_price', $product).parent().removeClass('sale');\n }\n\n if (variant.inventory_management && variant.inventory_quantity > 0) {\n if (window.PXUTheme.theme_settings.display_inventory_left) {\n if (variant.inventory_quantity == 1) {\n var items_left_text = window.PXUTheme.translation.items_left_count_one;\n } else {\n var items_left_text = window.PXUTheme.translation.items_left_count_other;\n }\n\n var inventoryThreshold = window.PXUTheme.theme_settings.inventory_threshold;\n\n if (variant.inventory_quantity <= inventoryThreshold) {\n $('.items_left', $product).html(\"<p><em>\" + variant.inventory_quantity + \" \" + items_left_text + \"</em></p>\");\n } else {\n $('.items_left', $product).html(\"\");\n }\n }\n\n if (window.PXUTheme.theme_settings.limit_quantity) {\n if (variant.inventory_policy == \"deny\") {\n $('.quantity', $product).attr('max', variant.inventory_quantity);\n }\n }\n } else {\n $('.items_left', $product).text('');\n $('.quantity', $product).removeAttr('max');\n } // Empty sold out text\n\n\n $('.sold_out', $product).text(''); // Show price, otherwise, show free price text\n\n if (variant.price > 0) {\n $('.current_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.price, $('body').data('money-format')) + '</span>');\n\n if (window.product.unitPricing(variant) !== undefined) {\n $unitPrice.html(window.product.unitPricing(variant));\n } else {\n $unitPrice.addClass('product-details__unit-price--hidden');\n }\n } else {\n $('.current_price', $product).html(window.PXUTheme.theme_settings.free_price_text);\n $unitPrice.addClass('product-details__unit-price--hidden');\n }\n\n $('.modal_price', $product).removeClass('modal_price--sold-out');\n $('.add_to_cart', $product).removeClass('disabled').removeAttr('disabled').find('span').text($('.add_to_cart', $product).data('label'));\n $('.current_price').show();\n $('.was_price').show(); // Hide the back in stock notification form\n\n $notify_form.hide(); // Show the quantity field\n\n $('.purchase-details__quantity', $product).show(); // Remove disable from action buttons\n\n $('.atc-btn-container', $product).removeClass('disabled');\n } else {\n var message = variant ? window.PXUTheme.translation.product_sold_out : window.PXUTheme.translation.product_unavailable; // Hide the quantity field\n\n $('.purchase-details__quantity', $product).hide(); // Show the price and change the add to cart and sold out text\n\n $('.modal_price', $product).addClass('modal_price--sold-out');\n $('.was_price', $product).html('');\n $('.items_left', $product).text('');\n $('.quantity', $product).removeAttr('max');\n $('.sold_out', $product).text(' - ' + message); // Disable the add to cart button and Shopify payment button when a variant is sold out\n\n $('.atc-btn-container', $product).addClass('disabled');\n $('.add_to_cart', $product).addClass('disabled').attr('disabled', 'disabled').find('span').text(message); //Hide the back in stock notification form\n\n $notify_form.hide();\n $notifyFormInputs.empty();\n\n if (variant && !variant.available) {\n $('.current_price').show();\n $('.was_price').show(); // Show the variant price, otherwise, show the free price text\n\n if (variant.price > 0) {\n $('.current_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.price, $('body').data('money-format')) + '</span>');\n\n if (window.product.unitPricing(variant) !== undefined) {\n $unitPrice.html(window.product.unitPricing(variant));\n } else {\n $unitPrice.addClass('product-details__unit-price--hidden');\n }\n } else {\n $('.current_price', $product).html(window.PXUTheme.theme_settings.free_price_text);\n $unitPrice.addClass('product-details__unit-price--hidden');\n } // When a variant is sold out but on sale\n\n\n if (variant.price < variant.compare_at_price) {\n $('.was_price', $product).html('<span class=\"money\">' + Shopify.formatMoney(variant.compare_at_price, $('body').data('money-format')) + '</span>');\n $('.current_price', $product).parent().addClass('sale');\n } else {\n $('.was_price', $product).html('');\n $('.current_price', $product).parent().removeClass('sale');\n } // Show the back in stock notification form\n\n\n $notify_form.fadeIn();\n $notifyFormInputs.empty();\n $notifyFormInputs.append(notifyFormHTML);\n } else {\n $('.sold_out', $product).text(message);\n $unitPrice.addClass('product-details__unit-price--hidden'); // When a variant is specifically unavailable\n\n $('.current_price').hide();\n $('.was_price').hide();\n }\n }\n\n $productForm.removeClass(\"init\");\n};\n\nfunction htmlEncode(value) {\n if (value) {\n return $('<div/>').text(value).html();\n } else {\n return '';\n }\n}\n\nwindow.Shopify.updateOptionsInSelector = function (selectorIndex, parent) {\n switch (selectorIndex) {\n case 0:\n var key = 'root';\n var selector = $(parent + ' .single-option-selector:eq(0)');\n break;\n\n case 1:\n var key = $(parent + ' .single-option-selector:eq(0)').val();\n var selector = $(parent + ' .single-option-selector:eq(1)');\n break;\n\n case 2:\n var key = $(parent + ' .single-option-selector:eq(0)').val();\n key += ' / ' + $(parent + ' .single-option-selector:eq(1)').val();\n var selector = $(parent + ' .single-option-selector:eq(2)');\n }\n\n var availableOptions = Shopify.optionsMap[key];\n $(parent + ' .swatch[data-option-index=\"' + selectorIndex + '\"] .swatch-element').each(function () {\n if ($.inArray($(this).attr('data-value'), availableOptions) !== -1) {\n $(this).removeClass('soldout').find(':radio').removeAttr('disabled', 'disabled').removeAttr('checked');\n } else {\n $(this).addClass('soldout').find(':radio').removeAttr('checked').attr('disabled', 'disabled');\n }\n });\n selector.trigger('change');\n};\n/* Linked Option Selectors */\n\n\nShopify.linkOptionSelectors = function (product, parent) {\n // Building our mapping object.\n Shopify.optionsMap = {};\n\n for (let i = 0; i < product.variants.length;
1 i++) {\n var variant = product.variants[i];\n\n if (variant.available) {\n // Gathering values for the 1st drop-down.\n Shopify.optionsMap['root'] = Shopify.optionsMap['root'] || [];\n Shopify.optionsMap['root'].push(variant.option1);\n Shopify.optionsMap['root'] = Shopify.uniq(Shopify.optionsMap['root']); // Gathering values for the 2nd drop-down.\n\n if (product.options.length > 1) {\n var key = variant.option1;\n Shopify.optionsMap[key] = Shopify.optionsMap[key] || [];\n Shopify.optionsMap[key].push(variant.option2);\n Shopify.optionsMap[key] = Shopify.uniq(Shopify.optionsMap[key]);\n } // Gathering values for the 3rd drop-down.\n\n\n if (product.options.length === 3) {\n var key = variant.option1 + ' / ' + variant.option2;\n Shopify.optionsMap[key] = Shopify.optionsMap[key] || [];\n Shopify.optionsMap[key].push(variant.option3);\n Shopify.optionsMap[key] = Shopify.uniq(Shopify.optionsMap[key]);\n }\n }\n } // Update options right away.\n\n\n window.Shopify.updateOptionsInSelector(0, parent);\n if (product.options.length > 1) window.Shopify.updateOptionsInSelector(1, parent);\n if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent); // When there is an update in the first dropdown.\n\n $(parent + \" .single-option-selector:eq(0)\").change(function () {\n window.Shopify.updateOptionsInSelector(1, parent);\n if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent);\n return true;\n }); // When there is an update in the second dropdown.\n\n $(parent + \" .single-option-selector:eq(1)\").change(function () {\n if (product.options.length === 3) window.Shopify.updateOptionsInSelector(2, parent);\n return true;\n });\n}; // Loads in script when called\n\n\nvar loadScript = function (name, url, callback) {\n if (window.PXUTheme[name]) {\n callback;\n } else {\n $.ajax({\n url: url,\n dataType: 'script',\n success: callback,\n async: false\n });\n }\n};\n\n$(document).on('shopify:block:select', function (e) {\n var blockId = e.detail.blockId;\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n if ($parentSection.hasClass('shopify-section--slideshow')) {\n window.PXUTheme.jsSlideshow.blockSelect(blockId, $parentSection);\n }\n\n if ($parentSection.find('.map--container').length) {\n window.map.init();\n }\n\n if ($parentSection.find('.parallax-banner')) {\n $(this).find('.parallax__container > .parallax').unwrap();\n new universalParallax().init();\n }\n});\n$(document).on('shopify:block:deselect', function (e) {\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n if ($parentSection.hasClass('shopify-section--slideshow')) {\n window.PXUTheme.jsSlideshow.blockDeselect($parentSection);\n }\n});\n$(document).on('shopify:section:load', function (e) {\n // Shopify section as jQuery object\n var $section = $(e.target); // Vanilla js selection of Shopify section\n\n var section = document.getElementById('shopify-section-' + e.detail.sectionId);\n var sectionObjectUrl = $section.find('[data-theme-editor-load-script]').attr('src'); // Check classes on schema and look for js (eg. jsMap)\n\n for (var i = 0; i < section.classList.length; i++) {\n if (section.classList[i].substring(0, 2) === \"js\") {\n var triggerClass = section.classList[i]; // Check to see if section script exists\n\n if (typeof window.PXUTheme[triggerClass] == 'undefined') {\n // make AJAX call to load script\n loadScript(triggerClass, sectionObjectUrl, function () {\n window.PXUTheme[triggerClass].init($(section));\n });\n } else {\n if (window.PXUTheme[triggerClass]) {\n //console.log('Section: ' + triggerClass + ' has been loaded.')\n window.PXUTheme[triggerClass].init($(section));\n } else {//console.warn('Uh oh, ' + triggerClass + ' is referenced in section schema class, but can not be found. Make sure \"z__' + triggerClass + '.js\" and window.PXUTheme.' + triggerClass + '.init() function exists.');\n }\n }\n }\n }\n\n utilities.enableDisclosure(); // Call methods based on section classes\n\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n if (window.PXUTheme.theme_settings.newsletter_popup) {\n newsletter_popup.init();\n }\n\n if ($parentSection.hasClass('shopify-section--recommended-products')) {\n window.product.loadProductRecommendations();\n }\n\n if (window.PXUTheme.theme_settings.enable_predictive_search) {\n window.predictiveSearch.init();\n }\n\n if ($parentSection.hasClass('shopify-section--cart-template')) {\n window.productFormListeners.init();\n window.cart.init();\n }\n\n if ($parentSection.hasClass('shopify-section--image-with-text-overlay')) {\n window.banner_image.init(
1);\n window.banner.init();\n }\n\n if ($parentSection.hasClass('shopify-section--map') || $parentSection.hasClass('shopify-section--page-contact-template')) {\n window.map.init();\n }\n\n if ($parentSection.hasClass('shopify-section--featured-product')) {\n window.product.init();\n }\n\n if ($parentSection.hasClass('shopify-section--featured-collection')) {\n window.collection.init();\n window.product.init();\n window.banner.init();\n }\n\n if ($parentSection.hasClass('shopify-section--featured-promotions')) {\n window.featured_promotions.init();\n }\n\n if ($parentSection.hasClass('shopify-section--image-with-text')) {\n window.animate_content.init();\n }\n\n if ($parentSection.hasClass('shopify-section--video')) {\n window.videoTheme.init();\n window.banner.init();\n }\n\n if ($parentSection.hasClass('shopify-section--product-template') || $parentSection.hasClass('shopify-section--quick-shop')) {\n window.collection.init();\n window.product.init();\n }\n\n if ($parentSection.hasClass('shopify-section--collection-template')) {\n window.banner_image.init();\n window.collection.init();\n window.product.init();\n }\n\n if ($parentSection.hasClass('shopify-section--page-contact-template')) {\n window.banner_image.init();\n window.banner.init();\n }\n\n if ($parentSection.hasClass('shopify-section--article-template')) {\n window.article.init();\n }\n\n if ($parentSection.hasClass('shopify-section--search-template')) {\n window.collection.init();\n }\n\n if ($parentSection.hasClass('shopify-section--blog-template')) {\n window.banner_image.init();\n window.banner.init();\n }\n\n if ($parentSection.hasClass('shopify-section--header')) {\n window.banner_image.init();\n window.header.init();\n }\n\n if ($parentSection.hasClass('parallax-banner')) {\n $(this).find('.parallax__container > .parallax').unwrap();\n new universalParallax().init();\n }\n});\n$(document).on('shopify:section:unload', function (e) {\n utilities.unload();\n var $target = $(e.target);\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n\n if ($parentSection.hasClass('shopify-section--image-with-text-overlay')) {\n window.banner.unload($target);\n }\n\n if ($parentSection.hasClass('shopify-section--slideshow')) {\n window.PXUTheme.jsSlideshow.unload($target);\n }\n\n if ($parentSection.hasClass('shopify-section--featured-product')) {\n window.product.unload($target);\n }\n\n if ($parentSection.hasClass('shopify-section--featured-collection')) {\n window.collection.unload($target);\n }\n\n if ($parentSection.hasClass('shopify-section--product-template')) {\n window.product.unload($target);\n }\n\n if ($parentSection.hasClass('shopify-section--collection-template')) {\n window.collection.unload($target);\n }\n});\n$(document).on('shopify:section:select', function (e) {\n // Shopify section as jQuery object\n var $section = $(e.target); // Vanilla js selection of Shopify section\n\n var section = document.getElementById('shopify-section-' + e.detail.sectionId); // Force show state when section is selected in theme editor\n\n for (var i = 0; i < section.classList.length; i++) {\n if (section.classList[i].substring(0, 2) === \"js\") {\n var triggerClass = section.classList[i];\n\n if (window.PXUTheme[triggerClass].showThemeEditorState) {\n window.PXUTheme;\n window.PXUTheme[triggerClass].showThemeEditorState(e.detail.sectionId, $section);\n }\n }\n }\n\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n window.header.init();\n window.banner_image.init();\n window.banner.init();\n $('.lightbox').fancybox();\n});\n$(document).on('shopify:section:deselect', function (e) {\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n window.banner_image.init();\n});\n$(document).on('shopify:section:reorder', function (e) {\n var $parentSection = $('#shopify-section-' + e.detail.sectionId);\n window.header.init();\n window.banner_image.init();\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9hcHAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL3NvdXJjZS9zY3JpcHRzL2FwcC5qcz9hMmRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5pbXBvcnQgU2hvcGlmeVNlY3Rpb25zTWFuYWdlciBmcm9tICdAcGl4ZWx1bmlvbi9zaG9waWZ5LXNlY3Rpb25zLW1hbmFnZXInO1xuaW1wb3J0IHsgU2l0ZUFnZUdhdGUsIFBhZ2VBZ2VHYXRlIH0gZnJvbSAnQHBpeGVsdW5pb24vYWdlLWdhdGUnO1xuaW1wb3J0IENvbXBsZW1lbnRhcnlQcm9kdWN0cyBmcm9tICcuL2hlbHBlcnMvQ29tcGxlbWVudGFyeVByb2R1Y3RzJztcbmltcG9ydCBTaG9waWZ5U3VyZmFjZVBpY2tVcCBmcm9tICdAcGl4ZWx1bmlvbi9zaG9waWZ5LXN1cmZhY2UtcGljay11cCc7XG5pbXBvcnQgUGF5bWVudFRlcm1zIGZyb20gJy4vaGVscGVycy9QYXltZW50VGVybXMnO1xuaW1wb3J0IFJlY2lwaWVudE
1Zvcm0gZnJvbSAnLi9oZWxwZXJzL1JlY2lwaWVudEZvcm0nO1xuaW1wb3J0IFNoaXBwaW5nQ2FsY3VsYXRvciBmcm9tICcuL2hlbHBlcnMvU2hpcHBpbmdDYWxjdWxhdG9yJztcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tICdAcGl4ZWx1bmlvbi9hbmltYXRpb25zJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdqdXN0LWRlYm91bmNlJztcbmltcG9ydCBBc3luY1ZpZXcgZnJvbSAnQHBpeGVsdW5pb24vc2hvcGlmeS1hc3luY3ZpZXcnO1xuXG5yaW1nLmluaXQoJ1tkYXRhLXJpbWc9XCJsYXp5XCJdJywgeyByb3VuZDogMSB9KTtcblxuY29uc3Qgc2VjdGlvbnMgPSBuZXcgU2hvcGlmeVNlY3Rpb25zTWFuYWdlcigpO1xuXG5zZWN0aW9ucy5yZWdpc3RlcignYWdlLWdhdGUnLCBzZWN0aW9uID0+IG5ldyBQYWdlQWdlR2F0ZShzZWN0aW9uKSk7XG5cbmNvbnN0IGFnZUdhdGVQYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FnZS1nYXRlLXBhZ2UnKTtcblxuaWYgKGFnZUdhdGVQYWdlKSB7XG4gIG5ldyBTaXRlQWdlR2F0ZShhZ2VHYXRlUGFnZSk7XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBHbG9iYWwgLSBoZWFkZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5oZWFkZXIgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG4gICAgdGhpcy5zZXRIZWFkZXJQb3NpdGlvbigpO1xuXG4gICAgLy9yZW1vdmUgZHVwbGljYXRlIGhlYWRlciBvbiB1cGRhdGVcbiAgICBpZiAoJCgnLm1vYmlsZS1oZWFkZXInKS5sZW5ndGggPiAxKSB7XG4gICAgICB2Y
1XIgbmF2X21lbnUgPSAkKFwiI25hdlwiKS5kYXRhKFwibW1lbnVcIik7XG4gICAgICBuYXZfbWVudS5jbG9zZSgpO1xuICAgICAgJCgnLm1vYmlsZS1oZWFkZXI6bGFzdCwgI25hdjpsYXN0JykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gT25seSBhcHBsaWVkIHdoZW4gdGhlcmUgaXMgYSBmdWxsLXdpZHRoIGJhbm5lciBhY3Jvc3MgdG9wIG9mIHBhZ2VcbiAgICB2YXIgJGhlYWRlciA9ICQoJy5mZWF0dXJlX2ltYWdlIC5oZWFkZXIuaGVhZGVyLWJhY2tncm91bmQtLWZhbHNlJyk7XG5cbiAgICAvLyBUbyBvZmZzZXQgdGhlIGZpeGVkIGhlYWRlclxuICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ21tLWZpeGVkLXRvcCcpKSB7XG4gICAgICAkKCcubWVudSBsaTpub3QoLmNhcnQpIGFbaHJlZl49XCIjXCJdLCAuZmxleC1jYXB0aW9uIGFbaHJlZl49XCIjXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgIHZhciBhbmNob3JsaW5rID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgaWYoJCgnLmluZGV4LXNlY3Rpb25zJykuZmluZChhbmNob3JsaW5rKS5sZW5ndGgpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdmFyIGhlYWRlckhlaWdodCA9ICQoJy5oZWFkZXInKS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogJChhbmNob3JsaW5rKS5vZmZzZXQoKS50b3AgLSBoZWFkZXJIZWlnaHRcbiAgICAgICAgICB9LCAyMDAwKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG5cbiAgICBpZiAoJGhlYWRlci5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tdHJ1ZScpKSB7XG5cbiAgICAgICQoXCIuaW5kZXgtc2VjdGlvbnMgLnNob3BpZnktc2VjdGlvbjpudGgtY2hpbGQoMiksIC5zaG9waWZ5LXNlY3Rpb246bnRoLWNoaWxkKDIpLCAubWFpbi13cmFwcGVyLCAucGFnZS1kZXRhaWxzLWJsb2NrOm50aC1jaGlsZCgyKVwiKS53YXlwb2ludChmdW5jdGlvbihkaXJlY3Rpb24pIHtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09ICdkb3duJyl7XG4gICAgICAgICAgJGhlYWRlci5hZGRDbGFzcygnc3RpY2t5LS1hY3RpdmUgZmFkZUluRG93biBkZWxheS0wcyBoZWFkZXJfYmFyJyk7XG4gICAgICAgICAgJGhlYWRlci5yZW1vdmVDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICBoZWFkZXIuZHluYW1pY0Ryb3Bkb3duKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICd1cCcpe1xuICAgICAgICAgICRoZWFkZXIucmVtb3ZlQ2xhc3MoJ3N0aWNreS0tYWN0aXZlIGZhZGVJbkRvd24gZGVsYXktMHMgaGVhZGVyX2JhcicpO1xuICAgICAgICAgICRoZWFkZXIuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgaGVhZGVyLmR5bmFtaWNEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG9mZnNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gc3RpY2t5IGhlYWRlciBhY3RpdmF0ZXMgd2hlbiBtZXJjaGFudCBzY3JvbGxzIGRvd24gdGhlIHBhZ2UgdGhlIGhlaWdodCBvZiB0aGUgaGVhZGVyIHBsdXMgMjUwcHhcbiAgICAgICAgICByZXR1cm4gLSRoZWFkZXIub3V0ZXJIZWlnaHQoKSAtIDI1MFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkaGVhZGVyLm9uKCd3ZWJraXRBbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZCBtc0FuaW1hdGlvbkVuZCBhbmltYXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZhZGVJbicpO1xuICAgIH0pO1xuXG4gICAgJCgnI2NhcnQnKS5tbWVudSh7XG4gICAgICBuYXZiYXI6IHtcbiAgICAgICAgYWRkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIG9mZkNhbnZhczoge1xuICAgICAgICBwYWdlU2VsZWN0b3I6IFwiI2NvbnRlbnRfd3JhcHBlclwiXG4gICAgICB9LFxuICAgICAgXCJleHRlbnNpb25zXCI6IFtcbiAgICAgICAgXCJ0aGVtZS17eyBzZXR0aW5ncy5tb2JpbGVfbWVudV9jb2xvciB9fVwiLFxuICAgICAgICBcInBvc2l0aW9uLWZyb250XCIsXG4gICAgICAgIFwicG9zaXRpb24te3sgc2V0dGluZ3Muc2lkZV9jYXJ0X3Bvc2l0aW9uIH19XCJcbiAgICAgIF1cbiAgICB9KTtcbiAgICAkKCcuY2FydC1idXR0b24sIC5pY29uLW1lbnUnKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICQoJyNzZWFyY2gnKS5oaWRlKCk7XG4gICAgfSk7XG5cbiAgICB2YXIgbmF2U2V0dGluZ3MgPSB7XG4gICAgICBcIm5hdmJhclwiOiB7XG4gICAgICAgIGFkZDogdHJ1ZSxcbiAgICAgICAgdGl0bGU6ICQoJy5tb2JpbGVfbG9nbycpLmh0bWwoKVxuICAgICAgfSxcbiAgICAgIHNjcm9sbEJ1Z0ZpeDoge1xuICAgICAgICBmaXg6IHRydWVcbiAgICAgIH0sXG4gICAgICBzZWFyY2hmaWVsZDoge1xuICAgICAgICBhZGQ6ICQoJyNoZWFkZXInKS5kYXRhKCdzZWFyY2gtZW5hYmxlZCcpLFxuICAgICAgICBzZWFyY2g6IGZhbHNlLFxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5zZWFyY2hcbiAgICAgIH0sXG4gICAgICBcImV4dGVuc2lvbnNcIjogW1xuICAgICAgICBcInRoZW1lLXt7IHNldHRpbmdzLm1vYmlsZV9tZW51X2NvbG9yIH19XCJcbiAgICAgIF0sXG4gICAgICBvZmZDYW52YXM6IHsgcGFnZVNlbGVjdG9yOiBcIiNjb250ZW50X3dyYXBwZXJcIiB9XG4gICAgfVxuXG4gICAgaWYoJCgnLm1vYmlsZS1zZWFyY2gtYmFyJykubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIG5hdlNldHRpbmdzID0ge1xuICAgICAgICBcIm5hdmJhclwiOiB7XG4gICAgICAgICAgYWRkOiB0cnVlLFxuICAgICAgICAgIHRpdGxlOiAkKCcubW9iaWxlX2xvZ28nKS5odG1sKClcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsQnVnRml4OiB7XG4gICAgICAgICAgZml4OiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZXh0ZW5zaW9uc1wiOiBbXG4gICAgICAgICAgXCJ0aGVtZS17eyBzZXR0aW5ncy5tb2JpbGVfbWVudV9jb2xvciB9fVwiXG4gICAgICAgIF0sXG4gICAgICAgIG9mZkNhbnZhczogeyBwYWdlU2VsZWN0b3I6IFwiI2NvbnRlbn
1Rfd3JhcHBlclwiIH1cblxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgJCgnI25hdicpLm1tZW51KFxuICAgICAgbmF2U2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIHNlYXJjaGZpZWxkOiB7XG4gICAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiL3NlYXJjaFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcInFcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBZGQgYSBsaW5rIHRvIHRoZSBuYXZiYXIgdGl0bGVcbiAgICAkKCcjbW0tMScpLmZpbmQoJy5tbS1uYXZiYXJfX3RpdGxlJykuYXR0cignaHJlZicsICcvJyk7XG5cbiAgICAkKCdib2R5Jykub24oJ21vdXNlZW50ZXInLCAnLnN1Yi1tZW51JywgZnVuY3Rpb24oKSB7XG4gICAgICAkKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICAgICQodGhpcykuZmluZCgnZGV0YWlscycpLmF0dHIoJ29wZW4nLCB0cnVlKTtcbiAgICB9KTtcblxuICAgICQoJ2JvZHknKS5vbignbW91c2VsZWF2ZScsICcuc3ViLW1lbnUnLCBmdW5jdGlvbigpIHtcbiAgICAgICQodGhpcykuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICQodGhpcykuZmluZCgnZGV0YWlscycpLmF0dHIoJ29wZW4nLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmR5bmFtaWNEcm9wZG93bigpO1xuXG4gICAgdGhpcy5tb2JpbGVTZWFyY2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb2JpbGUtc2VhcmNoXScpO1xuXG4gICAgaWYgKCF0aGlzLm1vYmlsZVNlYXJjaCkgcmV0dXJuO1xuXG4gICAgdGhpcy5tb2JpbGVTZWFyY2hBbmltYXRpb24gPSB0cmFuc2l0aW9uKHsgZWw6IHRoaXMubW9iaWxlU2VhcmNoLCBzdGF0ZTogJ2Nsb3NlZCcgfSk7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW0tc2VhcmNoZmllbGRfX2lucHV0IGlucHV0Jyk7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hDbG9zZSA9IHRoaXMubW9iaWxlU2VhcmNoLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1jbG9zZV0nKTtcblxuICAgIHRoaXMubW9iaWxlU2VhcmNoSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIoaW5wdXQsICdjbGljaycsICgpID0+IHRoaXMuX29wZW5Nb2JpbGVTZWFyY2goKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLm1vYmlsZVNlYXJjaENsb3NlLCAnY2xpY2snLCAoKSA9PiB0aGlzLl9jbG9zZU1vYmlsZVNlYXJjaCgpKTtcbiAgfSxcbiAgX29wZW5Nb2JpbGVTZWFyY2goKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vYmlsZVNlYXJjaCk7XG5cbiAgICB0aGlzLm1vYmlsZVNlYXJjaEFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMubW9iaWxlU2VhcmNoLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgICAgY29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC52YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5wdXRMZW5ndGgsIGlucHV0TGVuZ3RoKTtcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIH0pO1xuICB9LFxuICBfY2xvc2VNb2JpbGVTZWFyY2goKSB7XG4gICAgdGhpcy5tb2JpbGVTZWFyY2hBbmltYXRpb24uYW5pbWF0ZVRvKCdjbG9zZWQnKTtcbiAgfSxcbiAgc2V0SGVhZGVyUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuICAgIC8vIERldGVybWluZSB0aGUgaGVhZGVyIHBvc2l0aW9uXG4gICAgaWYgKCQoJy5wcm9tby1iYW5uZXInKS5sZW5ndGgpIHtcbiAgICAgIHZhciBhbm5vdW5jZW1lbnRIZWlnaHQgPSAkKCcucHJvbW8tYmFubmVyJykub3V0ZXJIZWlnaHQoKTtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsIGFubm91bmNlbWVudEhlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsICcwJyk7XG4gICAgfVxuICB9LFxuICBkeW5hbWljRHJvcGRvd246IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoZWFkZXJOYXZpZ2F0aW9uV2lkdGggPSAkKCdbZGF0YS1oZWFkZXItbmF2aWdhdGlvbl0nKS53aWR0aCgpO1xuICAgIHZhciAkaGVhZGVyTmF2SXRlbXMgPSAkKCdbZGF0YS1oZWFkZXItbmF2LWl0ZW1dJyk7XG4gICAgdmFyIGRyb3Bkb3duUG9zaXRpb24gPSAkKCcuaGVhZGVyJykuZGF0YSgnZHJvcGRvd24tcG9zaXRpb24nKTtcbiAgICB2YXIgc2luZ2xlTGluZU5hdiA9IHRydWU7XG4gICAgdmFyIHRvdGFsTmF2SXRlbXNXaWR0aCA9IDA7XG5cbiAgICAkaGVhZGVyTmF2SXRlbXMuZWFjaChmdW5jdGlvbihpbmRleCwgbmF2SXRlbSl7XG4gICAgICB0b3RhbE5hdkl0ZW1zV2lkdGggKz0gJChuYXZJdGVtKS5vdXRlcldpZHRoKCk7XG4gICAgfSlcblxuICAgIGlmICh0b3RhbE5hdkl0ZW1zV2lkdGggPiBoZWFkZXJOYXZpZ2F0aW9uV2lkdGgpIHtcbiAgICAgIHNpbmdsZUxpbmVOYXYgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZHJvcGRvd25Qb3NpdGlvbiA9PSAnYmVsb3dfaGVhZGVyJyAmJiBzaW5nbGVMaW5lTmF2ID09IHRydWUpIHtcbiAgICAgICQoJy5oZWFkZXJfYmFyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlci1kcm9wZG93bi1wb3NpdGlvbi0tYmVsb3dfcGFyZW50Jyk7XG4gICAgICAkKCcuaGVhZGVyX2JhcicpLmFkZENsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlcicpO1xuICAgICAgJCgnLmhlYWRlcl9iYXInKS5hdHRyKCdkYXRhLWRyb3Bkb3duLXBvc2l0aW9uJywgJ2JlbG93X2hlYWRlcicpO1xuXG4gICAgICAkKCcuaGVhZGVyX2Jhci5oZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlciAuZHJvcGRvd24nKS5jc3Moe1xuICAgICAgICBcInBhZGRpbmctdG9wXCI6ICQoJy5oZWFkZXInKS5oZWlnaHQoKSAvIDJcbiAgICAgIH0pO1xuXG4gICAgICAkKCcuaGVhZGVyX2Jhci5oZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlciAuZGlzY2xvc3VyZV9fbGlzdC13cmFwJykuY3NzKHtcbiAgICAgICAgXCJwYWRkaW5nLXRvcFwiOiAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgLyAyXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X3BhcmVudCcpO1xuICAgICAgJCgnLmhlYWRlcicpLnJlbW92ZUNsYXNzKCdoZWFkZXItZHJvcGRvd24tcG9zaXRpb24tLWJlbG93X2hlYWRlcicpO1xuICAgICAgJCgnLmhlYWRlcicpLmF0dHIoJ2RhdGEtZ
1HJvcGRvd24tcG9zaXRpb24nLCAnYmVsb3dfcGFyZW50Jyk7XG5cbiAgICAgICQoJy5oZWFkZXIgLmRyb3Bkb3duJykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICB9XG4gIH0sXG4gIHNldFBhZGRpbmc6IGZ1bmN0aW9uKCkge1xuICAgIGlmICgkKCdib2R5JykuaGFzQ2xhc3MoJ2luZGV4JykgJiYgd2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmluZGV4LXNlY3Rpb25zIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgICBpZiAoJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmhhc0NsYXNzKCdwYXJhbGxheC1iYW5uZXInKSkge1xuXG4gICAgICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci1iYWNrZ3JvdW5kLS10cnVlJykgJiYgJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItdHJhbnNwYXJlbmN5LS1mYWxzZScpKXtcbiAgICAgICAgICAkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG9wZW5Ecm9wZG93bjogZnVuY3Rpb24oKSB7XG5cbiAgICAkKCdbZGF0YS1oZWFkZXItbmF2LWRldGFpbHNdJykub24oJ2NsaWNrJywgaGFuZGxlRGV0YWlsQ2xpY2spO1xuICAgICQoJ1tkYXRhLWhlYWRlci1uYXYtZGV0YWlsc10nKS5vbigndG91Y2hlbmQnLCBoYW5kbGVEZXRhaWxDbGljayk7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVEZXRhaWxDbGljayhlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBjbGlja2VkUGFyZW50ID0gZS50YXJnZXQuY2xvc2VzdCgnbGkuc3ViLW1lbnUnKTtcbiAgICAgIGNvbnN0IGNsaWNrZWREZXRhaWxzID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgICAgY29uc3QgY2xpY2tlZExpbmsgPSBjbGlja2VkRGV0YWlscy5xdWVyeVNlbGVjdG9yKCdzdW1tYXJ5Jyk7XG5cbiAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVhZGVyX19uYXZpZ2F0aW9uIGxpLnN1Yi1tZW51ID4gW2RhdGEtaGVhZGVyLW5hdi1kZXRhaWxzXScpXTtcblxuICAgICAgLy8gQ2xvc2Ugc2libGluZ3NcbiAgICAgIGlmIChkZXRhaWxzRWxlbWVudHMuaW5jbHVkZXMoY2xpY2tlZERldGFpbHMpKSB7XG4gICAgICAgIGRldGFpbHNFbGVtZW50cy5mb3JFYWNoKGRldGFpbHNFbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgICAgaWYgKGRldGFpbHMgIT09IGNsaWNrZWREZXRhaWxzKSB7XG4gICAgICAgICAgICBkZXRhaWxzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBsaW5rIGJlaW5nIGNsaWNrZWQgaXMgYSBwYXJlbnQgbGluaywgdGhlbiB0YWtlIGNvbnRyb2wgb2YgdGhlIG5hdmlnYXRpb25cbiAgICAgIGlmIChjbGlja2VkUGFyZW50ICYmIGNsaWNrZWRMaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoY2xpY2tlZERldGFpbHMub3Blbikge1xuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGNsaWNrZWRMaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdWJtZW51IGlzbid0IG9wZW4sIG9wZW4gaXRcbiAgICAgICAgY2xpY2tlZERldGFpbHMub3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuICAgICQoJ2FbaHJlZl49XCIjXCJdJykub2ZmKCdjbGljaycpO1xuICAgICQoJ1tkYXRhLWhlYWRlci1uYXYtZGV0YWlsc10nKS5vZmYoJ2NsaWNrJyk7XG4gICAgJCgnW2RhdGEtaGVhZGVyLW5hdi1kZXRhaWxzXScpLm9mZigndG91Y2hlbmQnKTtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgSG9tZSBwYWdlIC0gZmVhdHVyZWQgcHJvbW90aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmZlYXR1cmVkX3Byb21vdGlvbnMgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG4gICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEhvbWUgcGFnZSAtIHZpZGVvXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG53aW5kb3cudmlkZW9UaGVtZSA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcblxuICAgIC8vIFNldCB1cCBwbHlyIGZvciBuZXdseSBlbWJlZGRlZCB2aWRlb1xuICAgIHZhciBmZWF0dXJlZFZpZGVvcyA9ICQoJ1tkYXRhLXZpZGVvLWVsZW1lbnRdJykuZ2V0KCk7XG5cbiAgICB2YXIgZmVhdHVyZWRWaWRlb1BsYXllcnMgPSBQbHlyLnNldHVwKGZlYXR1cmVkVmlkZW9zLCB7XG4gICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICBmdWxsc2NyZWVuOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGZhbGxiYWNrOiB0cnVlLFxuICAgICAgICBpb3NOYXRpdmU6IHRydWVcbiAgICAgIH0sXG4gICAgICBzdG9yYWdlOiB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGRzIHBseXIgdmlkZW8gaWQgdG8gdmlkZW8gd3JhcHBlclxuICAgICQuZWFjaChmZWF0dXJlZFZpZGVvUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgdmFyIGlkID0gcGxheWVyLmlkO1xuICAgICAgdmFyICR2aWRlbztcblxuICAgICAgaWYgKHBsYXllci5pc0hUTUw1KSB7XG4gICAgICAgICR2aWRlbyA9ICQocGxheWVyLmVsZW1lbnRzLndyYXBwZXIpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgICAgICR2aWRlby5hdHRyKCdkYXRhLXBseXItdmlkZW8taWQnLCBpZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gYSB2aWRlbyBpcyBwbGF5aW5nLCBwYXVzZSBhbnkgb3RoZXIgaW5zdGFuY2VzXG4gICAgICBwbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2Y
1XIgaW5zdGFuY2UgPSBldmVudC5kZXRhaWwucGx5cjtcbiAgICAgICAgJC5lYWNoKGZlYXR1cmVkVmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLmlkICE9IHBsYXllci5pZCkge1xuICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgJCgnW2RhdGEtdmlkZW8tZWxlbWVudF0nKS5lYWNoKGZ1bmN0aW9uKGluZGV4LCB2aWRlbykge1xuXG4gICAgICAvLyBWYXJpYWJsZXNcbiAgICAgIHZhciAkdmlkZW8gPSAkKHZpZGVvKTtcbiAgICAgIHZhciAkc2VjdGlvbiA9ICR2aWRlby5wYXJlbnRzKCcuc2hvcGlmeS1zZWN0aW9uJykuYXR0cignaWQnLCBpZCk7XG4gICAgICB2YXIgJHZpZGVvRWxlbWVudCA9ICRzZWN0aW9uLmZpbmQoJHZpZGVvKTtcbiAgICAgIHZhciAkdmlkZW9XcmFwcGVyID0gJHZpZGVvRWxlbWVudC5wYXJlbnRzKCcudmlkZW8td3JhcHBlcicpO1xuICAgICAgdmFyICRwbGF5QnV0dG9uID0gJHZpZGVvV3JhcHBlci5maW5kKCdbZGF0YS1wbGF5LWJ1dHRvbl0nKTtcbiAgICAgIHZhciAkdmlkZW9UZXh0ID0gJHZpZGVvV3JhcHBlci5maW5kKCdbZGF0YS12aWRlby10ZXh0XScpO1xuICAgICAgdmFyICR2aWRlb1RleHRDb250YWluZXIgPSAkdmlkZW9XcmFwcGVyLmZpbmQoJ1tkYXRhLXZpZGVvLXRleHQtY29udGFpbmVyXScpO1xuICAgICAgdmFyICRwb3N0ZXJJbWFnZSA9ICR2aWRlb1dyYXBwZXIuZGF0YSgncG9zdGVyLWltYWdlLXVwbG9hZGVkJyk7XG4gICAgICB2Y
1XIgYXNwZWN0UmF0aW8gPSAkdmlkZW9XcmFwcGVyLmRhdGEoJ2FzcGVjdC1yYXRpbycpO1xuICAgICAgdmFyIGlkID0gJHZpZGVvV3JhcHBlci5kYXRhKCd2aWRlby1zcmMnKTtcbiAgICAgIHZhciBpc0F1dG9wbGF5ID0gJHZpZGVvV3JhcHBlci5kYXRhKCdhdXRvcGxheScpO1xuICAgICAgdmFyIGlzTG9vcGluZ0VuYWJsZWQgPSAkdmlkZW9XcmFwcGVyLmRhdGEoJ2F1dG9sb29wJyk7XG4gICAgICB2YXIgaXNNdXRlZCA9ICR2aWRlb1dyYXBwZXIuZGF0YSgnbXV0ZS12aWRlbycpO1xuXG4gICAgICAkLmVhY2goZmVhdHVyZWRWaWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgdmFyIHZpZGVvSUQ7XG4gICAgICAgIHZhciBwbGF5ZXJJRDtcblxuICAgICAgICBpZiAocGxheWVyLmlzWW91VHViZSB8fCBwbGF5ZXIuaXNWaW1lbykge1xuICAgICAgICAgIHZhciB2aWRlb0lEID0gJHZpZGVvV3JhcHBlci5hdHRyKCdpZCcpO1xuICAgICAgICAgIHZhciBwbGF5ZXJJRCA9ICQocGxheWVyLmVsZW1lbnRzLm9yaWdpbmFsKS5hdHRyKCdpZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHBsYXllci5pc0hUTUw1KSB7XG4gICAgICAgICAgdmFyIHZpZGVvSUQgPSAkdmlkZW9XcmFwcGVyLmZpbmQoJ1tkYXRhLXBseXItdmlkZW8taWRdJykuZGF0YSgncGx5ci12aWRlby1pZCcpO1xuICAgICAgICAgIHZhciBwbGF5ZXJJRCA9IHBsYXllci5pZDtcbiAgICAgICAgICAkdmlkZW9FbGVtZW50ID0gJHNlY3Rpb24uZmluZCgnLnBseXItLXZpZGVvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxheWVySUQgPT0gdmlkZW9JRCkge1xuXG4gICAgICAgICAgLy8gUmVzZXQgcGxheSBidXR0b24gaWNvblxuICAgICAgICAgICR2aWRlb1dyYXBwZXIucmVtb3ZlQ2xhc3MoJ3BsYXktYnV0dG9uLWljb24tLXZpc2libGUnKTtcblxuICAgICAgICAgIC8vIFJlc2V0IGltYWdlXG4gICAgICAgICAgJHZpZGVvV3JhcHBlci5yZW1vdmVDbGFzcygndmlkZW8taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgLy8gQXV0b3BsYXlcbiAgICAgICAgICBpZiAoaXNBdXRvcGxheSkge1xuICAgICAgICAgICAgLy8gSWYgb24gZGVza3RvcCBvciBwbGF5ZXIgaXMgWW91VHViZS9WaW1lb1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMgfHwgcGxheWVyLmlzWW91VHViZSB8fCBwbGF5ZXIuaXNWaW1lbykge1xuXG4gICAgICAgICAgICAgIHBsYXllci5hdXRvcGxheSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgLy8gSGlkZSBpbWFnZVxuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCd2aWRlby1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAvLyBJZiBkaXNwbGF5IHRleHQgb3ZlciB2aWRlbyB1bmNoZWNrZWRcbiAgICAgICAgICAgICAgaWYgKCR2aWRlb1RleHRDb250YWluZXIuaGFzQ2xhc3MoJ2Rpc3BsYXktdGV4dC1vdmVyLXZpZGVvLS1mYWxzZScpKSB7XG4gICAgICAgICAgICAgICAgJHZpZGVvVGV4dC5oaWRlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJHZpZGVvVGV4dC5zaG93KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBLZWVwIHBsYXkgYnV0dG9uIGhpZGRlblxuICAgICAgICAgICAgICAkcGxheUJ1dHRvbi5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgLy8gSFRNTDUgTW9iaWxlIFZpZGVvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLm1lZGl1bS5tYXRjaGVzICYmIHBsYXllci5pc0hUTUw1KSB7XG5cbiAgICAgICAgICAgICAgLy8gSGlkZSBpbWFnZVxuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCd2aWRlby1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAvLyBEaXNwbGF5IGJ1dHRvbiBzbyB0aGF0IHZpZGVvIGNhbiBiZSBwbGF5ZWRcbiAgICAgICAgICAgICAgJHBsYXlCdXR0b24uc2hvdygpO1xuXG4gICAgICAgICAgICAgIHBsYXllci5vbigncGxheScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIFNob3cgdmlkZW9cbiAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIC8vIEhpZGUgcGxheSBidXR0b25cbiAgICAgICAgICAgICAgICAkcGxheUJ1dHRvbi5oaWRlKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHsgLy8gSWYgQXV0b3BsYXkgZGlzYWJsZWRcbiAgICAgICAgICAgIC8vIElmIHBvc3RlciBpbWFnZSwgc2hvdyBpbWFnZSB3cmFwcGVyIG90aGVyd2lzZSBoaWRlIGl0XG4gICAgICAgICAgICBpZiAoJHBvc3RlckltYWdlKSB7XG4gICAgICAgICAgICAgICR2aWRlb1dyYXBwZXIucmVtb3ZlQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICR2aWRlb1dyYXBwZXIuYWRkQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcbiAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2xpY2tpbmcgaW1hZ2Ugd2lsbCBwbGF5IHZpZGVvXG4gICAgICAgICAgJHZpZGVvV3JhcHBlci5maW5kKCcucGFyYWxsYXhfX3dyYXAsIC5iYW5uZXJfX3dyYXAnKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIucGxheWluZyAmJiAhJHZpZGVvV3JhcHBlci5oYXNDbGFzcygndmlkZW8taXMtcGxheWluZycpKSB7XG4gICAgICAgICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIE11dGVkXG4gICAgICAgICAgaWYgKGlzTXV0ZWQpIHtcbiAgICAgICAgICAgIHBsYXllci5tdXRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQXNwZWN0IFJhdGlvXG4gICAgICAgICAgaWYgKGFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBwbGF5ZXIucmF0aW8gPSBhc3BlY3RSYXRpbztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMb29waW5nXG4gICAgICAgICAgaWYgKGlzTG9vcGluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgI
1HBsYXllci5sb29wID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTaG93IFZpZGVvIENvbnRyb2xzXG4gICAgICAgICAgLy8gLSB2aWRlbyBjb250cm9scyBnZXQgaGlkZGVuIHVzaW5nIGEgY3NzIGNsYXNzOiAnLnZpZGVvLWNvbnRyb2xzLWVuYWJsZWQtLWZhbHNlJ1xuXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIGV4aXN0cywgaGlkZSB0ZXh0IGFuZCBwb3N0ZXJcbiAgICAgICAgICBpZiAoJHBsYXlCdXR0b24pIHtcbiAgICAgICAgICAgICRwbGF5QnV0dG9uLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgIC8vIEhpZGUgaW1hZ2VcbiAgICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5hZGRDbGFzcygndmlkZW8taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAgIC8vIFNob3cgdmlkZW9cbiAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgZGlzcGxheSB0ZXh0IG92ZXIgdmlkZW8gdW5jaGVja2VkXG4gICAgICAgICAgICAgIGlmICgkdmlkZW9UZXh0Q29udGFpbmVyLmhhc0NsYXNzKCdkaXNwbGF5LXRleHQtb3Zlci12aWRlby0tZmFsc2UnKSkge1xuICAgICAgICAgICAgICAgICR2aWRlb1RleHQuaGlkZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICR2aWRlb1RleHQuc2hvdygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGxheSB2aWRlb1xuICAgICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwbGF5ZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB3aW5kb3cudmlkZW9UaGVtZS5yZXNpemVWaWRlbygkdmlkZW9XcmFwcGVyKTtcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcGxheWVyLm9uKCdwbGF5JywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIEhpZGUgaW1hZ2VcbiAgICAgICAgICAgICR2aWRlb1dyYXBwZXIuYWRkQ2xhc3MoJ3ZpZGVvLWlzLXBsYXlpbmcnKTtcblxuICAgICAgICAgICAgLy8gUmVzZXQgcGxheSBidXR0b24gaWNvblxuICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5yZW1vdmVDbGFzcygncGxheS1idXR0b24taWNvbi0tdmlzaWJsZScpO1xuXG4gICAgICAgICAgICAvLyBTaG93IHZpZGVvXG4gICAgICAgICAgICAkdmlkZW9FbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgLy8gSWYgZGlzcGxheSB0ZXh0IG92ZXIgdmlkZW8gdW5jaGVja2VkXG4gICAgICAgICAgICBpZiAoJHZpZGVvVGV4dENvbnRhaW5lci5oYXNDbGFzcygnZGlzcGxheS10ZXh0LW92ZXItdmlkZW8tLWZhbHNlJykpIHtcbiAgICAgICAgICAgICAgJHZpZGVvVGV4dC5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAkdmlkZW9UZXh0LnNob3coKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGlkZSBwbGF5IGJ1dHRvblxuICAgICAgICAgICAgaWYgKCRwbGF5QnV0dG9uKSB7XG4gICAgICAgICAgICAgICRwbGF5QnV0dG9uLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gSWYgdmlkZW8gaXMgcGF1c2VkLCBwbGF5IGJ1dHRvbiBpY29uIG9yIGJ1dHRvbiBtdXN0IGJlIHNob3duXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIHRleHQgaXMgZmlsbGVkIG91dCwgdXNlIHBsYXkgYnV0dG9uXG4gICAgICAgICAgLy8gSWYgYnV0dG9uIHRleHQgaXMgbm90IGZpbGxlZCBvdXQsIHVzZSBwbGF5IGJ1dHRvbiBpY29uXG4gICAgICAgICAgcGxheWVyLm9uKCdwYXVzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCRwbGF5QnV0dG9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgJHBsYXlCdXR0b24uc2hvdygpO1xuICAgICAgICAgICAgICAkdmlkZW9XcmFwcGVyLnJlbW92ZUNsYXNzKCdwbGF5LWJ1dHRvbi1pY29uLS12aXNpYmxlJyk7XG4gICAgICAgICAgICAgICR2aWRlb1RleHRDb250YWluZXIuaGlkZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHZpZGVvV3JhcHBlci5hZGRDbGFzcygncGxheS1idXR0b24taWNvbi0tdmlzaWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBJZiBwYWdlIGxvYWRzIHdpdGggdmlkZW8gcGF1c2VkIGFuZCBubyBidXR0b24gc2hvd2luZywgc2hvdyBpY29uXG4gICAgICAgICAgaWYgKCFwbGF5ZXIucGxheWluZyAmJiAkcGxheUJ1dHRvbi5pcygnOmhpZGRlbicpIHx8ICRwbGF5QnV0dG9uLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAkdmlkZW9XcmFwcGVyLmFkZENsYXNzKCdwbGF5LWJ1dHRvbi1pY29uLS12aXNpYmxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG5cblxuICB9LFxuICByZXNpemVWaWRlbzogZnVuY3Rpb24oJHZpZGVvV3JhcHBlcikge1xuICAgIC8vIGdldCBoZWlnaHQgYW5kIHdpZHRoIG9mIHRoZSB2aWRlb1xuICAgIHZhciB2aWRlb0hlaWdodCA9ICR2aWRlb1dyYXBwZXIuZmluZCgnLnBseXItLXZpZGVvJykuaGVpZ2h0KCk7XG4gICAgdmFyIHZpZGVvV2lkdGggPSAkdmlkZW9XcmFwcGVyLmZpbmQoJy5wbHlyX192aWRlby13cmFwcGVyJykud2lkdGgoKTtcblxuICAgIC8vIGNhbGN1bGF0ZSBjb3JyZWN0IHBhZGRpbmctYm90dG9tIHBlcmNlbnRhZ2UgZm9yIHJlc3BvbnNpdmUgdmlkZW9zXG4gICAgdmFyIHBhZGRpbmdCb3R0b20gPSAoIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aCApICogMTAwO1xuXG4gICAgLy8gYXBwbHkgdGhhdCBwYWRkaW5nIGJvdHRvbSByYXRpb1xuICAgICR2aWRlb1dyYXBwZXIuZmluZCgnLnBseXJfX3ZpZGVvLXdyYXBwZXInKS5jc3MoJ3BhZGRpbmctYm90dG9tJywgcGFkZGluZ0JvdHRvbSArICclJyk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEJhbm5lciBpbWFnZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmJhbm5lcl9pbWFnZSA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcblxuICAgI
1HZhciBjb250ZW50QXJlYVBhZGRpbmcgPSAkKCcuaGVhZGVyJykuZGF0YSgnY29udGVudC1hcmVhLXBhZGRpbmcnKTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZS5tYXRjaGVzKSB7XG4gICAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmdsb2JhbC13cmFwcGVyIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgICAkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uYXR0cignc3R5bGUnLCAnJyk7XG5cbiAgICAgIGlmICgkcmVvcmRlcmFibGVGaXJzdFNlY3Rpb24uaGFzQ2xhc3MoJ3BhcmFsbGF4LWJhbm5lcicpKSB7XG4gICAgICAgIC8vIEhhcyBiYW5uZXJcbiAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLWJhY2tncm91bmQtLXRydWUnKSAmJiAkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci10cmFuc3BhcmVuY3ktLWZhbHNlJykpIHtcbiAgICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJy5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICQoJy5nbG9iYWwtd3JhcHBlcl9fcHJvZHVjdCwgLnNob3BpZnktcG9saWN5X19jb250YWluZXIsIC5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5jc3MoJ3BhZGRpbmctdG9wJywgJCgnLmhlYWRlcicpLmhlaWdodCgpICsgY29udGVudEFyZWFQYWRkaW5nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgKyBjb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICQoJy5oZWFkZXInKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZmVhdHVyZV9pbWFnZScpO1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyX2JhcicpO1xuXG4gICAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tZmFsc2UnKSkge1xuICAgICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdpcy1hYnNvbHV0ZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKCcuaGVhZGVyLmlzLWFic29sdXRlJykucmVtb3ZlQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLWJhY2tncm91bmQtLWZhbHNlJykgJiYgJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItdHJhbnNwYXJlbmN5LS10cnVlJykpIHtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucGFyZW50KCkuYWRkQ2xhc3MoJ2ZlYXR1cmVfaW1hZ2UnKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlcl9iYXInKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tZmFsc2UnKSAmJiAkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ2hlYWRlci10cmFuc3BhcmVuY3ktLWZhbHNlJykpIHtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucGFyZW50KCkuYWRkQ2xhc3MoJ2ZlYXR1cmVfaW1hZ2UnKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykucmVtb3ZlQ2xhc3MoJ2hlYWRlcl9iYXInKTtcbiAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpICYmICQoJy5oZWFkZXInKS5oYXNDbGFzcygnaGVhZGVyLXRyYW5zcGFyZW5jeS0tdHJ1ZScpKSB7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdmZWF0dXJlX2ltYWdlJyk7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXJfYmFyJyk7XG5cbiAgICAgICAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS1mYWxzZScpKSB7XG4gICAgICAgICAgICAkKCcuaGVhZGVyJykuYWRkQ2xhc3MoJ2lzLWFic29sdXRlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoJy5oZWFkZXIuaXMtYWJzb2x1dGUnKS5yZW1vdmVDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGJhbm5lclxuICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJy5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAkKCcuZ2xvYmFsLXdyYXBwZXJfX3Byb2R1Y3QsIC5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyLCAuZ2xvYmFsLXdyYXBwZXJfX2N1c3RvbWVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIGNvbnRlbnRBcmVhUGFkZGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAkKCcuaGVhZGVyJykuaGVpZ2h0KCkgKyBjb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQoJy5oZWFkZXInKS5oYXNDbGFzcygnc3RpY2t5LWhlYWRlci0tZmFsc2UnKSkge1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaGVhZGVyX2JhcicpO1xuICAgICAgICAgICQoJy5oZWFkZXInKS5hZGRDbGFzcygnaXMtYWJzb2x1dGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKCcuZmVhdHVyZV9pbWFnZScpLnJlbW92ZUNsYXNzKCdmZWF0dXJlX2ltYWdlJyk7XG4gICAgICAgICAgJCgnLmhlYWRlcicpLmFkZENsYXNzKCdoZWFkZXJfYmFyJyk7XG4gICAgICAgICAgJCgnLmhlYWRlci5pcy1hYnNvbHV0ZScpLnJlbW92ZUNsYXNzKCdpcy1hYnNvbHV0ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZXNldFBhZGRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uID0gJCgnLmdsb2JhbC13cmFwcGVyIC5zaG9waWZ5LXNlY3Rpb24nKS5maXJzdCgpO1xuXG4gICAgaWYgKCRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5oYXNDbGFzcygncGFyYWxsYXgtYmFubmVyJykpIHtcbiAgICAgICRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5jc3MoJ3BhZGRpbmctdG9wJywgJzBweCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuICAgICAgICBpZiAoJCgnLmdsb2JhbC13cmFwcGVyX19wcm9kdWN0JykubGVuZ3RoIHx8ICQoJ
1y5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyJykubGVuZ3RoIHx8ICQoJy5nbG9iYWwtd3JhcHBlcl9fY3VzdG9tZXInKS5sZW5ndGgpIHtcbiAgICAgICAgICAkKCcuZ2xvYmFsLXdyYXBwZXJfX3Byb2R1Y3QsIC5zaG9waWZ5LXBvbGljeV9fY29udGFpbmVyLCAuZ2xvYmFsLXdyYXBwZXJfX2N1c3RvbWVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIHdpbmRvdy5jb250ZW50QXJlYVBhZGRpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRyZW9yZGVyYWJsZUZpcnN0U2VjdGlvbi5jc3MoJ3BhZGRpbmctdG9wJywgJCgnLmhlYWRlcicpLmhlaWdodCgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHJlb3JkZXJhYmxlRmlyc3RTZWN0aW9uLmNzcygncGFkZGluZy10b3AnLCAnMHB4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuXG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEFubm91bmNlbWVudCBCYXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBhbm5vdW5jZW1lbnRfYmFyID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICBpZiAoJCgnLnByb21vLWJhbm5lcicpLmxlbmd0aCkge1xuICAgICAgdmFyIGFubm91bmNlbWVudCA9IENvb2tpZXMuZ2V0KCdwcm9tby1iYW5uZXInKTtcbiAgICAgIGlmKGFubm91bmNlbWVudCAhPSAnZGlzbWlzcycpIHtcbiAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdwcm9tby1iYW5uZXItLXRydWUnKTtcbiAgICAgICAgJCgnLnByb21vLWJhbm5lcl9fY2xvc2UnKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICQoJy5wcm9tby1iYW5uZXItLXRydWUnKS5hdHRyKCdzdHlsZScsICcnKTtcbiAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Byb21vLWJhbm5lci0tdHJ1ZScpO1xuICAgICAgICAgIGFubm91bmNlbWVudF9iYXIuc2V0UGFkZGluZygpO1xuICAgICAgICAgIENvb2tpZXMuc2V0KCdwcm9tby1iYW5uZXInLCAnZGlzbWlzcycsIHsgcGF0aDogJy8nIH0sIHsgZXhwaXJlczogMzAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvL2NhbGwgc2V0UGFkZGluZyBvbiBpbml0aWFsaXphdGlvblxuICAgIGFubm91bmNlbWVudF9iYXIuc2V0UGFkZGluZygpO1xuICB9LFxuICBzZXRQYWRkaW5nOiBmdW5jdGlvbigpIHtcbiAgICAvLyBTZXR0aW5nIHBhZGRpbmcgcmVsYXRpdmUgdG8gcHJvbW8gYmFubmVyIGhlaWdodFxuICAgIHZhciBiYW5uZXJIZWlnaHQgPSAkKCcucHJvbW8tYmFubmVyJykuaW5uZXJIZWlnaHQoKTtcbiAgICB2YXIgYmFubmVyUGFkZGluZyA9IChiYW5uZXJIZWlnaHQgLSAyNSkgKyAncHgnO1xuICAgIHZhciBwYXJlbnRTZWN0aW9uID0gJCgnLnByb21vLWJhbm5lcicpLnBhcmVudCgnLnNob3BpZnktc2VjdGlvbi0taGVhZGVyJyk7XG4gICAgaWYgKCQoJ2JvZHknKS5oYXNDbGFzcygncHJvbW8tYmFubmVyLS10cnVlJykpIHtcbiAgICAgIGlmICgkKCcuaGVhZGVyJykuaGFzQ2xhc3MoJ3N0aWNreS1oZWFkZXItLXRydWUnKSB8fCAkKCcubW9iaWxlLWhlYWRlcicpLmhhc0NsYXNzKCdtb2JpbGUtc3RpY2t5LWhlYWRlci0tZmFsc2UnKSAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAkKHBhcmVudFNlY3Rpb24pLmNzcygncGFkZGluZy1ib3R0b20nLCBiYW5uZXJQYWRkaW5nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJChwYXJlbnRTZWN0aW9uKS5jc3MoJ3BhZGRpbmctYm90dG9tJywgJzAnKTtcbiAgICAgICQoJy5oZWFkZXInKS5jc3MoJ3RvcCcsICcwJyk7XG4gICAgfVxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBCYW5uZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5iYW5uZXIgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG5cbiAgICB3aW5kb3cuYW5pbWF0ZV9jb250ZW50LmluaXQoKTtcblxuICAgIC8vQXJyb3cgc2Nyb2xsXG5cbiAgICB2YXIgaGVhZGVySGVpZ2h0ID0gJCgnLmhlYWRlcicpLm91dGVySGVpZ2h0KCk7XG5cbiAgICBpZiAoJCgnLmhlYWRlcicpLmhhc0NsYXNzKCdzdGlja3ktaGVhZGVyLS10cnVlJykpIHtcbiAgICAgICQoJy5zY3JvbGwtYXJyb3cnKS5zbW9vdGhTY3JvbGwoe1xuICAgICAgICBvZmZzZXQ6IC1oZWFkZXJIZWlnaHRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAkKCcuc2Nyb2xsLWFycm93Jykuc21vb3RoU2Nyb2xsKCk7XG4gICAgfVxuXG4gICAgYW5ub3VuY2VtZW50X2Jhci5pbml0KCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIE5ld3NsZXR0ZXJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBuZXdzbGV0dGVyX3BvcHVwID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcG9wdXAgPSBDb29raWVzLmdldCgncG9wdXAnKTtcbiAgICB2YXIgbmV3c2xldHRlcl9wb3B1cF9kYXlzID0gcGFyc2VJbnQod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfZGF5cyk7XG4gICAgdmFyIGNvb2tpZV9lbmFibGVkID0gbmV3c2xldHRlcl9wb3B1cF9kYXlzICE9IDAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICBpZiAoY29va2llX2VuYWJsZWQgJiYgcG9wdXAgPT0gJ29wZW4nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld3NsZXR0ZXJfcG9wdXAub3BlbigpO1xuICAgIH1cbiAgICBpZiAoY29va2llX2VuYWJsZWQpIHtcbiAgICAgIENvb2tpZXMuc2V0KCdwb3B1cCcsICdvcGVuJywgeyBleHBpcmVzO
1iBuZXdzbGV0dGVyX3BvcHVwX2RheXMgfSk7XG4gICAgfVxuICB9LFxuICBvcGVuOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbmV3c2xldHRlcl9wb3B1cF9zZWNvbmRzID0gcGFyc2VJbnQod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfc2Vjb25kcyk7XG5cbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLm5ld3NsZXR0ZXJfcG9wdXBfbW9iaWxlIHx8IHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgICAkLmZhbmN5Ym94Lm9wZW4oJCgnLmpzLW5ld3NsZXR0ZXItcG9wdXAnKSwge1xuICAgICAgICAgIGJhc2VDbGFzczogJ25ld3NsZXR0ZXJfcG9wdXAnLFxuICAgICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICAgIGluZm9iYXIgOiBmYWxzZSxcbiAgICAgICAgICB0b29sYmFyOiBmYWxzZSxcbiAgICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICAgIHNtYWxsQnRuIDogdHJ1ZSxcbiAgICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgICBwcmV2ZW50Q2FwdGlvbk92ZXJsYXA6IGZhbHNlLFxuICAgICAgICAgICAgdG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgXCJjbG9zZVwiXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBuZXdzbGV0dGVyX3BvcHVwX3NlY29uZHMgKiAxMDAwKTtcbiAgICB9XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFByb2R1Y3Rcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5wcm9kdWN0ID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIHZhciAkbm90aWZ5X2Zvcm0gPSAkKCcubm90aWZ5X2Zvcm0gLmNvbnRhY3QtZm9ybScpO1xuXG4gICAgLy8gRmluZCBwcm9kdWN0IGdhbGxlcmllcyBvbiBwYWdlIGJ1dCBleGNsdWRlIHRob3NlIGluIHRoZSBxdWlja3Nob3AgKHF1aWNrc2hvcCBsb2dpYyBoYW5kbGVkIGluIGZhbmN5Ym94IGV2ZW50KVxuICAgIHZhciAkcHJvZHVjdEdhbGxlcmllcyA9ICQoJy5wcm9kdWN0LWdhbGxlcnknKTtcblxuICAgIC8vIEZvciBlYWNoIHByb2R1Y3QgZ2FsbGVyeSwgY3JlYXRlIGFuIG9iamVjdCBhbmQgYWRkIGl0IHRvIGFuIGFycmF5IG9mIGdhbGxlcmllc1xuICAgIHZhciBnYWxsZXJpZXNBcnJheSA9IFtdO1xuICAgIGdsb2JhbFBsYXllcnNBcnJheSA9IFtdO1xuXG4gICAgaWYgKCRwcm9kdWN0R2FsbGVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICQuZWFjaCgkcHJvZHVjdEdhbGxlcmllcywgZnVuY3Rpb24oaW5kZXgsIGdhbGxlcnkpIHtcbiAgICAgICAgdmFyICRwcm9kdWN0U2VjdGlvbiA9ICQoZ2FsbGVyeSkuY2xvc2VzdCgnLnByb2R1Y3Rfc2VjdGlvbicpO1xuICAgICAgICBnYWxsZXJpZXNBcnJheS5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiAkKGdhbGxlcnkpLFxuICAgICAgICAgIHByb2R1Y3RTZWN0aW9uOiAkcHJvZHVjdFNlY3Rpb24sXG4gICAgICAgICAgdGh1bWJuYWlsc0VuYWJsZWQ6ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCd0aHVtYm5haWxzLWVuYWJsZWQnKSxcbiAgICAgICAgICB0aHVtYm5haWxzU2xpZGVyRW5hYmxlZDogJHByb2R1Y3RTZWN0aW9uLmRhdGEoJ3RodW1ibmFpbHMtc2xpZGVyLWVuYWJsZWQnKSxcbiAgICAgICAgICB0aHVtYm5haWxzUG9zaXRpb246ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCd0aHVtYm5haWxzLXBvc2l0aW9uJyksXG4gICAgICAgICAgdGh1bWJuYWlsc0Fycm93czogJHByb2R1Y3RTZWN0aW9uLmRhdGEoJ2dhbGxlcnktYXJyb3dzLWVuYWJsZWQnKSxcbiAgICAgICAgICBzbGlkZXNob3dBbmltYXRpb246ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdzbGlkZXNob3ctYW5pbWF0aW9uJyksXG4gICAgICAgICAgc2xpZGVTaG93U3BlZWQ6ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdzbGlkZXNob3ctc3BlZWQnKSxcbiAgICAgICAgICBhY3RpdmF0ZVpvb206ICRwcm9kdWN0U2VjdGlvbi5kYXRhKCdhY3RpdmF0ZS16b29tJyksXG4gICAgICAgICAgcHJvZHVjdE1lZGlhU3VwcG9ydGVkOiAkcHJvZHVjdFNlY3Rpb24uZGF0YSgncHJvZHVjdC1tZWRpYS1zdXBwb3J0ZWQnKSxcbiAgICAgICAgICBsb29waW5nRW5hYmxlZDogJChnYWxsZXJ5KS5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19tYWluJykuZGF0YSgndmlkZW8tbG9vcGluZy1lbmFibGVkJyksXG4gICAgICAgICAgc2VjdGlvbklEOiAkcHJvZHVjdFNlY3Rpb24ucGFyZW50cygnLnNob3BpZnktc2VjdGlvbicpLmF0dHIoJ2lkJylcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGdhbGxlcmllc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEZvciBlYWNoIGdhbGxlcnlPYmplY3QsIGVuYWJsZSBhIEZsaWNraXR5IHNsaWRlclxuICAgICAgJC5lYWNoKGdhbGxlcmllc0FycmF5LCBmdW5jdGlvbihpbmRleCwgZ2FsbGVyeU9iamVjdCkge1xuICAgICAgICB3aW5kb3cucHJvZHVjdC5lbmFibGVTbGlkZXIoZ2FsbGVyeU9iamVjdCk7XG5cbiAgICAgICAgLy8gSWYgcHJvZHVjdCBtZWRpYSBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBnYWxsZXJ5LCB0aGVuIGFsc28gbGF1bmNoIHByb2R1Y3QgbWVkaWEgYW5kIFBseXJcbiAgICAgICAgaWYgKGdhbGxlcnlPYmplY3QucHJvZHVjdE1lZGlhU3VwcG9ydGVkKSB7XG5cbiAgICAgICAgICAvLyBGaW5kIHZpZGVvcyB3aXRoaW4gZ2FsbGVyeSBzZWN0aW9uXG4gICAgICAgICAgdmFyIHZpZGVvcztcbiAgICAgICAgICB2aWRlb3MgPSAkKGdhbGxlcnlPYmplY3QuZWxlbWVudCkuZmluZCgnW2RhdGEtaHRtbDUtdmlkZW9dIHZpZGVvLCBbZGF0YS15b3V0dWJlLXZpZGVvXScpLmdldCgpO1xuXG4gICAgICAgICAgd2luZG93LnByb2R1Y3QubG9hZFBseXIoZ2FsbGVyeU9iamVjdCwgdmlkZW9zKTtcbiAgICAgICAgICB3aW5kb3cucHJvZHVjdC5sYXVuY2hQcm9kdWN0TWVkaWEoZ2FsbGVyeU9iamVjdCk7XG5cbiAgICAgICAgICAvLyBHbyB0aHJvdWdoIGVhY2ggZ2FsbGVyeSwgb24gdmlkZW8gcGxheSBjaGVjayBpbnN0YW5jZSBJRCBhZ2FpbnN0IG90aGVyIHBsYXllciBJRHNcbiAgICAgICAgICB2Y
1XIgaW5zdGFuY2U7XG4gICAgICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgICBwbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICBpbnN0YW5jZSA9IGV2ZW50LmRldGFpbC5wbHlyO1xuXG4gICAgICAgICAgICAgIC8vIEVuc3VyZXMgb25seSBvbmUgdmlkZW8gaXMgcGxheWluZyBhdCBhIHRpbWVcbiAgICAgICAgICAgICAgJC5lYWNoKGdsb2JhbFBsYXllcnNBcnJheSwgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5pZCAhPSBwbGF5ZXIuaWQpIHtcbiAgICAgICAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhvdmVyIHRvIHpvb21cbiAgICAgICAgaWYgKGdhbGxlcnlPYmplY3QuYWN0aXZhdGVab29tKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbGF6eWxvYWRlZCcsIHdpbmRvdy5wcm9kdWN0LmVuYWJsZVpvb20pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEZvcm1FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtXScpO1xuXG4gICAgaWYgKHJlY2lwaWVudEZvcm1FbCkge1xuICAgICAgY29uc3Qgc2VjdGlvbkVsID0gcmVjaXBpZW50Rm9ybUVsLmNsb3Nlc3QoJy5wcm9kdWN0X3NlY3Rpb24nKTtcbiAgICAgIHRoaXMucmVjaXBpZW50Rm9ybSA9IG5ldyBSZWNpcGllbnRGb3JtKHNlY3Rpb25FbCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxlbWVudGFyeVByb2R1Y3RzRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb21wbGVtZW50YXJ5LXByb2R1Y3RzXScpO1xuXG4gICAgaWYgKGNvbXBsZW1lbnRhcnlQcm9kdWN0c0VsKSB7XG4gICAgICBjb25zdCBzZWN0aW9uRWwgPSBjb21wbGVtZW50YXJ5UHJvZHVjdHNFbC5jbG9zZXN0KCcucHJvZHVjdF9zZWN0aW9uJyk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlY3Rpb25JZCxcbiAgICAgICAgcHJvZHVjdElkLFxuICAgICAgICBwcm9kdWN0UmVjb21tZW5kYXRpb25MaW1pdCxcbiAgICAgIH0gPSBKU09OLnBhcnNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbXBsZW1lbnRhcnktcHJvZHVjdHMtZGF0YV0nKS50ZXh0Q29udGVudCk7XG5cbiAgICAgIHRoaXMuY29tcGxlbWVudGFyeVByb2R1Y3RSZWNvbW1lbmRhdGlvbnMgPSBuZXcgQ29tcGxlbWVudGFyeVByb2R1Y3RzKHtcbiAgICAgICAgc2VjdGlvbkVsLFxuICAgICAgICBzZWN0aW9uSWQsXG4gICAgICAgIHByb2R1Y3RJZCxcbiAgICAgICAgcHJvZHVjdFJlY29tbWVuZGF0aW9uc1JvdXRlOiB3aW5kb3cuUFhVVGhlbWUucm91dGVzLnByb2R1Y3RfcmVjb21tZW5kYXRpb25zX3VybCxcbiAgICAgICAgaW5jbHVkZUluZGljYXRvckRvdHM6IGZhbHNlLFxuICAgICAgICBsaW1pdDogcHJvZHVjdFJlY29tbWVuZGF0aW9uTGltaXQsXG4gICAgICAgIGFycm93U2hhcGU6ICdNOTUuMDQgNDYgMjEuNjggNDYgNDguMTggMjIuOCA0Mi45MSAxNi43OCA0Ljk2IDUwIDQyLjkxIDgzLjIyIDQ4LjE4IDc3LjIgMjEuNjggNTQgOTUuMDQgNTQgOTUuMDQgNDZ6JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICgkKCcucHJvZHVjdC1xdWlja3Nob3BfX2NvbnRhaW5lcicpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC5sb2FkUHJvZHVjdFJlY29tbWVuZGF0aW9ucygpO1xuICAgIH1cblxuICAgIHdpbmRvdy5wcm9kdWN0LnByb2R1Y3RTd2F0Y2hlcygpO1xuXG4gICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIH0sXG4gIHVuaXRQcmljaW5nOiBmdW5jdGlvbihpdGVtKSB7XG4gICAgbGV0IHVuaXRQcmljZU1lYXN1cmVtZW50UmVmZXJlbmNlVmFsdWUgPSAnJztcbiAgICBsZXQgdW5pdFByaWNlT3V0cHV0ID0gJyc7XG5cbiAgICBpZiAoaXRlbS51bml0X3ByaWNlX21lYXN1cmVtZW50KSB7XG4gICAgICBpZiAoaXRlbS51bml0X3ByaWNlX21lYXN1cmVtZW50LnJlZmVyZW5jZV92YWx1ZSAhPSAxKSB7XG4gICAgICAgIHVuaXRQcmljZU1lYXN1cmVtZW50UmVmZXJlbmNlVmFsdWUgPSBpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucmVmZXJlbmNlX3ZhbHVlO1xuICAgICAgfVxuICAgICAgdW5pdFByaWNlT3V0cHV0ICs9IGA8ZGl2IGNsYXNzPVwiaXRlbV91bml0LXByaWNlXCI+JHtpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucXVhbnRpdHlfdmFsdWV9JHtpdGVtLnVuaXRfcHJpY2VfbWVhc3VyZW1lbnQucXVhbnRpdHlfdW5pdH0gfCAke1Nob3BpZnkuZm9ybWF0TW9uZXkoaXRlbS51bml0X3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpfSAvICR7dW5pdFByaWNlTWVhc3VyZW1lbnRSZWZlcmVuY2VWYWx1ZX0ke2l0ZW0udW5pdF9wcmljZV9tZWFzdXJlbWVudC5yZWZlcmVuY2VfdW5pdH08L2Rpdj5gXG5cbiAgICAgIHJldHVybiB1bml0UHJpY2VPdXRwdXQ7XG4gICAgfVxuICB9LFxuICBwcm9kdWN0U3dhdGNoZXM6IGZ1bmN0aW9uKCkge1xuICAgICQoJ1tkYXRhLXByb2R1Y3QtZm9ybT1cInVuaW5pdGlhbGl6ZWRcIl0nKS5lYWNoKChfLCBvcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zLmRhdGFzZXQucHJvZHVjdEZvcm0gPSAnJztcbiAgICAgIGNvbnN0ICRvcHRpb25zID0gJChvcHRpb25zKTtcbiAgICAgIGNvbnN0IHBheW1lbnRUZXJtcyA9IG5ldyBQYXltZW50VGVybXMob3B0aW9ucy5jbG9zZXN0KCdbZGF0YS1wcm9kdWN0LWRldGFpbHNdJykpO1xuICAgICAgY29uc3Qgc3VyZmFjZVBpY2tVcEVsID0gJG9wdGlvbnMuY2xvc2VzdCgnLmpzLXByb2R1Y3Rfc2VjdGlvbicpLmZpbmQoJ1tkYXRhLXN1cmZhY2UtcGljay11cF0nKVswXTtcbiAgICAgIGNvbnN0IHByb2R1Y3RUaXRsZSA9ICRvcHRpb25zLmRhdGEoJ3Byb2R1Y3QtdGl0bGUnKTtcbiAgICAgIGxldCBjdXJyZW50VmFyaWFudElkID0gJG9wdGlvbnMuZGF0YSgndmFyaWFudC1pZCcpO1xuICAgICAgbGV0IGN1cnJlbnRWYXJpYW50VGl0bGUgPSAkb3B0aW9ucy5kYXRhKCd2YXJpYW50LXRpdGxlJyk7XG5cbiAgICAgIGxldCBzdXJmYWNlUGlja1VwO1xuXG4gICAgICBpZiAoc3VyZmFjZVBpY2tVcEVsKSB7XG4gICAgICAgI
1HN1cmZhY2VQaWNrVXAgPSBuZXcgU2hvcGlmeVN1cmZhY2VQaWNrVXAoc3VyZmFjZVBpY2tVcEVsKTtcbiAgICAgICAgc3VyZmFjZVBpY2tVcC5sb2FkKGN1cnJlbnRWYXJpYW50SWQpO1xuICAgICAgICBzdXJmYWNlUGlja1VwLm9uTW9kYWxSZXF1ZXN0KGNvbnRlbnRzID0+IHtcbiAgICAgICAgICBjb25zdCBzdXJmYWNlUGlja1VwTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zdXJmYWNlLXBpY2stdXAtbW9kYWxdJyk7XG4gICAgICAgICAgbGV0IGZyYWdtZW50O1xuXG4gICAgICAgICAgLy8gQnVpbGQgb3V0IHBvcC11cCBjb250ZW50IGZvciBwcm9kdWN0IHdpdGggbm8gdmFyaWFudHMsIGVsc2UgYnVpbGRcbiAgICAgICAgICAvLyBvdXQgcG9wdXAgY29udGVudCBmb3IgcHJvZHVjdCB3aXRoIHZhcmlhbnRzXG4gICAgICAgICAgaWYgKGN1cnJlbnRWYXJpYW50VGl0bGUgPT0gJ0RlZmF1bHQgVGl0bGUnICYmIHByb2R1Y3RUaXRsZSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLWhlYWRlcicpO1xuICAgICAgICAgICAgdGl0bGUuY2xhc3NMaXN0LmFkZCgnc3VyZmFjZS1waWNrLXVwX19tb2RhbC10aXRsZScpO1xuICAgICAgICAgICAgdGl0bGUuaW5uZXJIVE1MID0gcHJvZHVjdFRpdGxlO1xuICAgICAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFyaWFudFRpdGxlICE9PSAnRGVmYXVsdCBUaXRsZScgJiYgcHJvZHVjdFRpdGxlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xuICAgICAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ3N1cmZhY2UtcGljay11cF9fbW9kYWwtaGVhZGVyJyk7XG4gICAgICAgICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLXRpdGxlJyk7XG4gICAgICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSBwcm9kdWN0VGl0bGU7XG4gICAgICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQodGl0bGUpO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5jdXJyZW50VmFyaWFudC50aXRsZSAhPT0gJ0RlZmF1bHQgVGl0bGUnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1YnRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICBzdWJ0aXRsZS5jbGFzc0xpc3QuYWRkKCdzdXJmYWNlLXBpY2stdXBfX21vZGFsLXN1YnRpdGxlJyk7XG4gICAgICAgICAgICAgIHN1YnRpdGxlLmlubmVySFRNTCA9IHdpbmRvdy5jdXJyZW50VmFyaWFudC50aXRsZTtcbiAgICAgICAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHN1YnRpdGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGhlYWRlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3VyZmFjZVBpY2tVcE1vZGFsLmlubmVySFRNTCA9IGNvbnRlbnRzO1xuICAgICAgICAgIHN1cmZhY2VQaWNrVXBNb2RhbC5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHN1cmZhY2VQaWNrVXBNb2RhbC5maXJzdENoaWxkKTtcbiAgICAgICAgICAkLmZhbmN5Ym94Lm9wZW4oXG4gICAgICAgICAgICBzdXJmYWNlUGlja1VwTW9kYWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICAgICAgICBpbmZvYmFyOiBmYWxzZSxcbiAgICAgICAgICAgICAgdG9vbGJhcjogZmFsc2UsXG4gICAgICAgICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgICAgICAgIHNtYWxsQnRuOiB0cnVlLFxuICAgICAgICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgICAgICAgYXV0b1N0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgICAgICAgcHJldmVudENhcHRpb25PdmVybGFwOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0b29sYmFyOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0SWQgPSAkb3B0aW9ucy5kYXRhKCdzZWxlY3QtaWQnKTtcblxuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdElkKSkge1xuICAgICAgICBuZXcgU2hvcGlmeS5PcHRpb25TZWxlY3RvcnMoc2VsZWN0SWQse1xuICAgICAgICAgIHByb2R1Y3Q6ICRvcHRpb25zLmRhdGEoJ3Byb2R1Y3QnKSxcbiAgICAgICAgICBvblZhcmlhbnRTZWxlY3RlZDogKHZhcmlhbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuY3VycmVudFZhcmlhbnQgPSB2YXJpYW50O1xuXG4gICAgICAgICAgICBwYXltZW50VGVybXMudXBkYXRlKHZhcmlhbnQ/IHZhcmlhbnQuaWQgOiBudWxsKTtcblxuICAgICAgICAgICAgaWYgKHN1cmZhY2VQaWNrVXApIHtcbiAgICAgICAgICAgICAgc3VyZmFjZVBpY2tVcC5sb2FkKHZhcmlhbnQgPyB2YXJpYW50LmlkIDogbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5zZWxlY3RDYWxsYmFjayh2YXJpYW50LCBzZWxlY3Rvcik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmFibGVIaXN0b3J5U3RhdGU6ICRvcHRpb25zLmRhdGEoJ2VuYWJsZS1zdGF0ZScpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MucHJvZHVjdF9mb3JtX3N0eWxlID09IFwic3dhdGNoZXNcIikge1xuICAgICAgJCgnLnByb2R1Y3RfZm9ybScpLmFkZENsYXNzKCdpcy12aXNpYmxlJyk7XG4gICAgICAkKCcuc3dhdGNoIDpyYWRpbycpLmNoYW5nZShmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbkluZGV4ID0gJCh0aGlzKS5jbG9zZXN0KCcuc3dhdGNoJykuYXR0cignZGF0YS1vcHRpb24taW5kZXgnKTtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgJCh0aGlzKVxuICAgICAgICAgIC5jbG9zZXN0KCdmb3JtJylcbiAgICAgICAgICAuZmluZCgnLnNpbmdsZS1vcHRpb24tc2VsZWN0b3InKVxuICAgICAgICAgIC5lcShvcHRpb25JbmRleClcbiAgICAgICAgICAudmFsKG9wdGlvblZhbHVlKVxuICAgICAgICAgIC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICAvL1N3YXRjaGVzIGxpbmtlZCB3aXRoIHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgIGlmICgkKCcuanMtcHJvZHVjdF9zZWN0aW9uJykubGVuZ3RoKXtcbiAgICAgICAgdmFyICRwcm9kdWN0Rm9ybXMgPSAkKCcuanMtcHJvZHVjdF9zZWN0aW9uJykuZmluZCgnLnByb2R1Y3RfZm9ybScpO1xuXG4gICAgICAgIC8vTG9vcCB0aHJvdWdoIGVhY2ggcHJvZHVjdCBhbmQgc2V0IHRoZSBpbml0aWFsIG9wdGlvbiB2YWx1ZSBzdGF0ZVxuXG4gICAgICAgICRwcm9kdWN0Rm9ybXMuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgI
1HZhciBKU09ORGF0YSA9ICQodGhpcykuZGF0YSgncHJvZHVjdCcpO1xuICAgICAgICAgIHZhciBwcm9kdWN0SUQgPSAkKHRoaXMpLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICAgICAgICB2YXIgcHJvZHVjdFNlY3Rpb24gPSAnLnByb2R1Y3QtJyArIHByb2R1Y3RJRCArICcgLmpzLXByb2R1Y3Rfc2VjdGlvbic7XG4gICAgICAgICAgdmFyIHN3YXRjaE9wdGlvbnMgPSAkKHRoaXMpLmZpbmQoJy5zd2F0Y2gtb3B0aW9ucyAuc3dhdGNoJyk7XG4gICAgICAgICAgaWYgKHN3YXRjaE9wdGlvbnMubGVuZ3RoID4gMSl7XG4gICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL0FkZCBjbGljayBldmVudCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcHJvZHVjdCBvbiB0aGUgcGFnZSAoZWcuIENvbGxlY3Rpb24gaW4gRGV0YWlsKVxuICAgICAgaWYgKCQoJy5qcy1wcm9kdWN0X3NlY3Rpb24nKS5sZW5ndGggPiAxKXtcbiAgICAgICAgJCgnYm9keScpLm9uKCdjbGljaycsICcuc3dhdGNoLWVsZW1lbnQnLCBmdW5jdGlvbigpe1xuICAgICAgICAgIHZhciBzd2F0Y2hWYWx1ZSA9ICQodGhpcykuZGF0YSgndmFsdWUnKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgLnNpYmxpbmdzKCdpbnB1dFt2YWx1ZT1cIicrIHN3YXRjaFZhbHVlLnJlcGxhY2UoL1xcXCIvZywnXFxcXFwiJykgKydcIl0nKVxuICAgICAgICAgICAgLnByb3AoXCJjaGVja2VkXCIsIHRydWUpXG4gICAgICAgICAgICAudHJpZ2dlcihcImNoYW5nZVwiKTtcblxuICAgICAgICAgIHZhciBKU09ORGF0YSA9ICQodGhpcykucGFyZW50cygnLnByb2R1Y3RfZm9ybScpLmRhdGEoJ3Byb2R1Y3QnKTtcbiAgICAgICAgICB2Y
1XIgcHJvZHVjdElEID0gJCh0aGlzKS5wYXJlbnRzKCcucHJvZHVjdF9mb3JtJykuZGF0YSgncHJvZHVjdC1pZCcpO1xuICAgICAgICAgIHZhciBwcm9kdWN0U2VjdGlvbiA9ICcucHJvZHVjdC0nICsgcHJvZHVjdElEICsgJyAuanMtcHJvZHVjdF9zZWN0aW9uJztcbiAgICAgICAgICB2YXIgc3dhdGNoT3B0aW9ucyA9ICQodGhpcykucGFyZW50cygnLnByb2R1Y3RfZm9ybScpLmZpbmQoJy5zd2F0Y2gtb3B0aW9ucyAuc3dhdGNoJyk7XG4gICAgICAgICAgaWYgKHN3YXRjaE9wdGlvbnMubGVuZ3RoID4gMSl7XG4gICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbmFibGVab29tOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgJGltYWdlID0gJChldmVudC50YXJnZXQpO1xuICAgIHZhciB6b29tU3JjID0gJGltYWdlLmRhdGEoJ3pvb20tc3JjJyk7XG4gICAgaWYgKHpvb21TcmMpIHtcbiAgICAgICRpbWFnZS53cmFwKCc8c3BhbiBjbGFzcz1cInpvb20tY29udGFpbmVyXCI+PC9zcGFuPicpXG4gICAgICAuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJylcbiAgICAgIC5wYXJlbnQoKVxuICAgICAgLnpvb20oe1xuICAgICAgICB1cmw6IHpvb21TcmMsXG4gICAgICAgIHRvdWNoOiBmYWxzZSxcbiAgICAgICAgbWFnbmlmeTogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZW5hYmxlU2xpZGVyOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0KSB7XG5cbiAgICB2YXIgJGVsID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKTtcbiAgICB2YXIgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5ID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICB2YXIgJHNsaWRlcyA9ICRlbC5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19pbWFnZScpO1xuICAgIHZhciAkdGh1bWJuYWlscyA9ICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X190aHVtYm5haWwnKTtcbiAgICB2YXIgYXJyb3dTaGFwZSA9ICdNOTUuMDQgNDYgMjEuNjggNDYgNDguMTggMjIuOCA0Mi45MSAxNi43OCA0Ljk2IDUwIDQyLjkxIDgzLjIyIDQ4LjE4IDc3LjIgMjEuNjggNTQgOTUuMDQgNTQgOTUuMDQgNDZ6JztcblxuICAgICRlbC5mbGlja2l0eSh7XG4gICAgICB3cmFwQXJvdW5kOiB0cnVlLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICBkcmFnVGhyZXNob2xkOiAxMCxcbiAgICAgIGltYWdlc0xvYWRlZDogdHJ1ZSxcbiAgICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogJGVsLmRhdGEoJ21lZGlhLWNvdW50JykgPiAxID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgYXV0b1BsYXk6IGdhbGxlcnlPYmplY3Quc2xpZGVTaG93U3BlZWQgKiAxMDAwLFxuICAgICAgZmFkZTogZ2FsbGVyeU9iamVjdC5zbGlkZVNob3dBbmltYXRpb24gPT09ICdmYWRlJyA/IHRydWUgOiBmYWxzZSxcbiAgICAgIHdhdGNoQ1NTOiBmYWxzZSxcbiAgICAgIGFycm93U2hhcGU6IGFycm93U2hhcGVcbiAgICB9KVxuXG4gICAgdmFyICRzbGlkZXMgPSAkZWwuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2UnKTtcblxuICAgICRzbGlkZXMuZWFjaCgoXywgc2xpZGUpID0+IHtcbiAgICAgIGNvbnN0ICRzbGlkZSA9ICQoc2xpZGUpO1xuXG4gICAgICAgLy8gTGlzdGVuIGZvciBtb2RlbCBwYXVzZS9wbGF5IGV2ZW50c1xuICAgICAgJHNsaWRlLmZpbmQoJ21vZGVsLXZpZXdlcicpLm9uKCdzaG9waWZ5X21vZGVsX3ZpZXdlcl91aV90b2dnbGVfcGxheScsIGZ1bmN0aW9uKCl7XG4gICAgICAgICRlbC5mbGlja2l0eSgndW5iaW5kRHJhZycpO1xuICAgICAgfSlcblxuICAgICAgJHNsaWRlLmZpbmQoJ21vZGVsLXZpZXdlcicpLm9uKCdzaG9waWZ5X21vZGVsX3ZpZXdlcl91aV90b2dnbGVfcGF1c2UnLCBmdW5jdGlvbigpe1xuICAgICAgICAkZWwuZmxpY2tpdHkoJ2JpbmREcmFnJyk7XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAkZWwub24oJ2NoYW5nZS5mbGlja2l0eScsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAkc2xpZGVzLmVhY2goZnVuY3Rpb24oaW5kZXgsIHNsaWRlKSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGVzIHRvIGJlIHVzZWRcbiAgICAgICAgdmFyICRzbGlkZSA9ICQoc2xpZGUpO1xuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJHNsaWRlLmRhdGEoJ21lZGlhLXR5cGUnKTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHNsaWRlIGlzIGFjdGl2ZSBzbGlkZSAoZmVhdHVyZWQgaW1hZ2Ugc2hvd24pIG9yIGluYWN0aXZlIHNsaWRlIChzbGlkZSBoaWRkZW4pXG4gICAgICAgIGlmICgkc2xpZGUuaGFzQ2xhc3MoJ2lzLXNlbGVjdGVkJykpIHtcbiAgICAgICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IHRvIGdvIHRocm91Z2ggZGlmZmVyZW50IG1lZGlhIHR5cGVzICh2aWRlbywgbW9kZWwpXG4gICAgICAgICAgc3dpdGNoKG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW9kZWwnOlxuXG4gICAgICAgICAgICAgIC8qIE9uIHNsaWRlIGNoYW5nZSwgaWYgYWN0aXZlIHNsaWRlIGNvbnRhaW5zIDNkIG1vZGVsXG4gICAgICAgICAgICAgICogSWYgb24gZGVza3RvcCwgb24gaG92ZXIsIHVuYmluZCBmbGlja2l0eSwgYWZ0ZXIgaG92ZXIgYmluZCBmbGlja2l0eVxuICAgICAgICAgICAgICAqIE9uIG1vZGVsIHBsYXkgZXZlbnQsIHVuYmluZCBmbGlja2l0eSB0byBlbnN1cmUgbW9kZWwgY2FuIGJlIGludGVyYWN0ZWQgd2l0aFxuICAgICAgICAgICAgICAqIE9uIG1vZGVsIHBhdXNlIGV2ZW50LCBiaW5kIGZsaWNraXR5IHNvIHRoYXQgc2xpZGUgY2FuIGJlIHN3aXBlZFxuICAgICAgICAgICAgICAqIFBhdXNlIGFsbCBtb2RlbCBzbGlkZXMgd2hlbiBoaWRkZW5cbiAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICAgICAgICAgICAgLy8gT24gbW91c2VlbnRlciBldmVudCwgdW5iaW5kIGZsaWNraXR5XG4gICAgICAgICAgICAgICAgJHNsaWRlLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3VuYmluZERyYWcnKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIE9uIG1vdXNlbGVhdmUgZXZlbnQsIGJpbmQgZmxpY2tpdHlcbiAgICAgICAgICAgICAgICAkc2xpZGUub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICRlbC5mbGlja2l0eSgnYmluZERyYWcnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJlbG93IGxvZ2ljIGRlYWxzIHdpdGggdGhlIGhpZGRlbiBzbGlkZXMgd2hlbiBhIGZsaWNraXR5IGNoYW5nZSBpcyB0cmlnZ2VyZWRcbiAgICAgICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IHRvIGdvIHRocm91Z2ggZGlmZmVyZW50IG1lZGlhIHR5cGVzICh2aWRlbywgbW9kZWwpXG4gICAgICAgICAgc3dpdGNoKG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW9kZWwnOlxuXG4gICAgICAgICAgICAgIC8vIFBhdXNlIG1vZGVscyB3aGVuIGhpZGRlblxuICAgICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5tb2RlbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICQuZWFjaChnYWxsZXJ5T2JqZWN0Lm1vZGVscywgZnVuY3Rpb24oaW5kZXgsIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICBtb2RlbC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd2aWRlbyc6XG5cbiAgICAgICAgICAgICAgLy8gVmFyaWFibGVzXG4gICAgICAgICAgICAgIHZhciAkaHRtbFZpZGVvID0gJHNsaWRlLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpO1xuICAgICAgICAgICAgICB2Y
1XIgdmlkZW9JRCA9ICRodG1sVmlkZW8uZmluZCgndmlkZW8nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG5cbiAgICAgICAgICAgICAgLy8gUGF1c2UgYWxsIGh0bWw1IHZpZGVvcyBmb3Igc2xpZGVzIHRoYXQgYXJlIGhpZGRlblxuICAgICAgICAgICAgICBpZiAoJGh0bWxWaWRlby5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXh0ZXJuYWxfdmlkZW8nOlxuXG4gICAgICAgICAgICAgIC8vIFZhcmlhYmxlc1xuICAgICAgICAgICAgICB2YXIgJGlmcmFtZVZpZGVvID0gJHNsaWRlLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgICB2YXIgaWZyYW1lSUQgPSAkaWZyYW1lVmlkZW8uYXR0cignaWQnKTtcblxuICAgICAgICAgICAgICAvLyBQYXVzZSBhbGwgeW91dHViZSB2aWRlb3MgZm9yIHNsaWRlcyB0aGF0IGFyZSBoaWRkZW5cbiAgICAgICAgICAgICAgaWYgKCRpZnJhbWVWaWRlby5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIubWVkaWEuaWQgPT0gaWZyYW1lSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAkZWwuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgIH0pO1xuXG4gICAgJCggd2luZG93ICkub24oICdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAkZWwuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgIH0pO1xuXG4gICAgJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGluZGV4LCBzbGlkZSkge1xuXG4gICAgICAvLyBWYXJpYWJsZXMgdG8gYmUgdXNlZFxuICAgICAgdmFyICRzbGlkZSA9ICQoc2xpZGUpO1xuICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzbGlkZS5kYXRhKCdtZWRpYS10eXBlJyk7XG5cbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgc2xpZGUgaXMgYWN0aXZlIHNsaWRlIChmZWF0dXJlZCBpbWFnZSBzaG93bilcbiAgICAgIGlmICgkc2xpZGUuaGFzQ2xhc3MoJ2lzLXNlbGVjdGVkJykpIHtcblxuICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAvLyBJZiBzbGlkZSBoYXMgM0QgbW9kZWwsIHVuYmluZCBmbGlja2l0eSBvbiBob3ZlciBvbiBkZXNrdG9wXG4gICAgICAgICAgLy8gQWxsb3dzIHlvdSB0byBjbGljayBhbnl3aGVyZSB0byB0cmlnZ2VyIG1vZGVsIHVpXG5cbiAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykge1xuXG4gICAgICAgICAgICAvLyBPbiBtb3VzZWVudGVyIGV2ZW50LCB1bmJpbmQgZmxpY2tpdHlcbiAgICAgICAgICAgICRzbGlkZS5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3VuYmluZERyYWcnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBPbiBtb3VzZWxlYXZlIGV2ZW50LCBiaW5kIGZsaWNraXR5XG4gICAgICAgICAgICAkc2xpZGUub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJGVsLmZsaWNraXR5KCdiaW5kRHJhZycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGtleWJvYXJkICdFTlRFUicga2V5IG9uIHNsaWRlc1xuICAgICAgICAkc2xpZGUua2V5cHJlc3MoZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuXG4gICAgICAgICAgICAkc2xpZGUuZmluZCgnbW9kZWwtdmlld2VyLCAucHJvZHVjdC1nYWxsZXJ5X19saW5rLCAucGx5cicpLmZvY3VzKCk7XG5cbiAgICAgICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oIGV2ZW50LCBpbmRleCApIHtcblxuICAgICAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICd2aWRlbycgfHwgbWVkaWFUeXBlID09ICdleHRlcm5hbF92aWRlbycpIHtcbiAgICAgICAgICAgICAgICBjaGVja0ZvclZpZGVvcygpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQXV0b3BsYXkgbW9kZWwgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSBtb2RlbFxuICAgICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICBhdXRvcGxheU1vZGVsKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgICAgICRlbC5vZmYoJ3NldHRsZS5mbGlja2l0eScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB2YXIgJHNsaWRlckFycm93cyA9ICRlbC5maW5kKCcuZmxpY2tpdHktcHJldi1uZXh0LWJ1dHRvbicpO1xuXG4gICAgaWYgKCgkc2xpZGVyQXJyb3dzIHx8ICR0aHVtYm5haWxzKSAmJiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcykpIHtcbiAgICAgICRzbGlkZXJBcnJvd3Mub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgbWVkaWEgdHlwZSBvZiBmZWF0dXJlZCBtZWRpYSBzbGlkZVxuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJykuZGF0YSgnbWVkaWEtdHlwZScpO1xuXG4gICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oZXZlbnQsIGluZGV4KSB7XG5cbiAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgY2hlY2tGb3JWaWRlb3MoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSAnbW9kZWwnKSB7XG4gICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcblxuICAgICAgLy8gRGV0ZWN0IGtleWJvYXJkICdFTlRFUicga2V5IG9uIHNsaWRlciBhcnJvd3NcbiAgICAgICRzbGlkZXJBcnJvd3Mub24oJ2tleXByZXNzJywgZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuICAgICAgICAgICRlbC5mb2N1cygpO1xuICAgICAgICAgICRlbC5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAgICRlbC5maW5kKCcucHJvZHVjdC1nYWxsZXJ5X19pbWFnZScpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG4gICAgICAgIH1cblxuICAgICAgfSlcblxuICAgICAgJHRodW1ibmFpbHMub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgLy8gQ2hhbmdlIHNsaWRlXG4gICAgICAgIHZhciBpbmRleCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuaW5kZXgoKTtcbiAgICAgICAgJGVsLmZsaWNraXR5KCdzZWxlY3QnLCBpbmRleCk7XG5cbiAgICAgICAgLy8gRmluZCBvdXQgbWVkaWEgdHlwZSBvZiBmZWF0dXJlZCBtZWRpYSBzbGlkZVxuICAgICAgICB2Y
1XIgbWVkaWFUeXBlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJykuZGF0YSgnbWVkaWEtdHlwZScpO1xuXG4gICAgICAgICRlbC5vbignc2V0dGxlLmZsaWNraXR5JywgZnVuY3Rpb24oZXZlbnQsIGluZGV4KSB7XG5cbiAgICAgICAgICAvLyBSdW4gdmlkZW8gYXV0b3BsYXkgbG9naWMgaWYgZmVhdHVyZWQgbWVkaWEgaXMgYSB2aWRlb1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgY2hlY2tGb3JWaWRlb3MoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSAnbW9kZWwnKSB7XG4gICAgICAgICAgICAvLyBJZiBtb2RlbCBjb250YWluZXIgaGFzIGNsYXNzIGlzLXNlbGVjdGVkIHRoZW4gcGxheSB0aGUgbW9kZWxcbiAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVbmJpbmQgc2V0dGxlIGV2ZW50XG4gICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcblxuICAgICAgLy8gQWRkZWQgZnVuY3Rpb25hbGl0eSBmb3Iga2V5Ym9hcmQgJ2VudGVyJyBrZXlcbiAgICAgICR0aHVtYm5haWxzLmtleXByZXNzKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBpbmRleCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCkuaW5kZXgoKTtcblxuICAgICAgICBpZihldmVudC53aGljaCA9PSAxMykge1xuXG4gICAgICAgICAgLy8gQ2hhbmdlIHNsaWRlXG4gICAgICAgICAgJGVsLmZsaWNraXR5KCdzZWxlY3QnLCBpbmRleCk7XG5cbiAgICAgICAgICAvLyBGaW5kIHNlbGVjdGVkIHNsaWRlXG4gICAgICAgICAgdmFyICRzZWxlY3RlZFNsaWRlID0gJGVsLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlLmlzLXNlbGVjdGVkJyk7XG5cbiAgICAgICAgICAvLyBGaW5kIG91dCBtZWRpYSB0eXBlIG9mIGZlYXR1cmVkIG1lZGlhIHNsaWRlXG4gICAgICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzZWxlY3RlZFNsaWRlLmRhdGEoJ21lZGlhLXR5cGUnKTtcblxuICAgICAgICAgIC8vIEJyaW5nIGZvY3VzIHRvIG1lZGlhIGluc2lkZSBzZWxlY3RlZCBzbGlkZSBvbmNlIHNsaWRlIGhhcyBmaW5pc2hlZCBhbmltYXRpb25cbiAgICAgICAgICAkZWwub24oICdzZXR0bGUuZmxpY2tpdHknLCBmdW5jdGlvbiggZXZlbnQsIGluZGV4ICkge1xuICAgICAgICAgICAgJHNlbGVjdGVkU2xpZGUuZmluZCgnW2RhdGEteW91dHViZS12aWRlb10nKS5hdHRyKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICAkc2VsZWN0ZWRTbGlkZS5maW5kKCdtb2RlbC12aWV3ZXIsIC5wbHlyLCAucHJvZHVjdC1nYWxsZXJ5X19saW5rJykuZm9jdXMoKTtcblxuICAgICAgICAgICAgLy8gUnVuIHZpZGVvIGF1dG9wbGF5IGxvZ2ljIGlmIGZlYXR1cmVkIG1lZGlhIGlzIGEgdmlkZW9cbiAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJyB8fCBtZWRpYVR5cGUgPT0gJ2V4dGVybmFsX3ZpZGVvJykge1xuICAgICAgICAgICAgICBjaGVja0ZvclZpZGVvcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBdXRvcGxheSBtb2RlbCBpZiBmZWF0dXJlZCBtZWRpYSBpcyBhIG1vZGVsXG4gICAgICAgICAgICBpZiAobWVkaWFUeXBlID09ICdtb2RlbCcpIHtcbiAgICAgICAgICAgICAgLy8gSWYgbW9kZWwgY29udGFpbmVyIGhhcyBjbGFzcyBpcy1zZWxlY3RlZCB0aGVuIHBsYXkgdGhlIG1vZGVsXG4gICAgICAgICAgICAgIGF1dG9wbGF5TW9kZWwoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVW5iaW5kIHNldHRsZSBldmVudFxuICAgICAgICAgICAgJGVsLm9mZignc2V0dGxlLmZsaWNraXR5Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXV0b3BsYXlNb2RlbCgpIHtcbiAgICAgICQuZWFjaChnYWxsZXJ5T2JqZWN0Lm1vZGVscywgZnVuY3Rpb24oaW5kZXgsIG1vZGVsKSB7XG4gICAgICAgIHZhciAkc2xpZGUgPSAkKG1vZGVsLmNvbnRhaW5lcikucGFyZW50cygnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2UnKTtcbiAgICAgICAgaWYgKCRzbGlkZS5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgIG1vZGVsLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZvclZpZGVvcygpIHtcbiAgICAgICRzbGlkZXMuZWFjaChmdW5jdGlvbihpbmRleCwgc2xpZGUpIHtcbiAgICAgICAgLy8gVmFyaWFibGVzXG4gICAgICAgIHZhciAkc2xpZGUgPSAkKHNsaWRlKTtcbiAgICAgICAgdmFyIG1lZGlhVHlwZSA9ICRzbGlkZS5kYXRhKCdtZWRpYS10eXBlJyk7XG4gICAgICAgIHZhciB2aWRlb0lEID0gJHNsaWRlLmZpbmQoJ3ZpZGVvJykuZGF0YSgncGx5ci12aWRlby1pZCcpO1xuICAgICAgICB2Y
1XIgJGlmcmFtZVZpZGVvID0gJHNsaWRlLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICB2YXIgaWZyYW1lSUQgPSAkaWZyYW1lVmlkZW8uYXR0cignaWQnKTtcbiAgICAgICAgaWYgKCRzbGlkZS5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgdmlkZW9JRCA9ICRzbGlkZS5maW5kKCd2aWRlbycpLmRhdGEoJ3BseXItdmlkZW8taWQnKTtcbiAgICAgICAgICAgIGlmICh2aWRlb0lEKSB7XG4gICAgICAgICAgICAgIGF1dG9wbGF5VmlkZW8odmlkZW9JRCwgJHNsaWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSAnZXh0ZXJuYWxfdmlkZW8nKSB7XG4gICAgICAgICAgICBpZiAoaWZyYW1lSUQpIHtcbiAgICAgICAgICAgICAgYXV0b3BsYXlZb3V0dWJlVmlkZW8oaWZyYW1lSUQsICRzbGlkZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF1dG9wbGF5VmlkZW8odmlkZW9JRCwgJHNsaWRlKSB7XG4gICAgICAvLyBDb21wYXJlIGlkIHRvIHBsYXllciBvYmplY3QgYW5kIG9ubHkgcGxheSB0aGF0IHZpZGVvXG4gICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpe1xuXG4gICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG5cbiAgICAgICAgICAvLyBPbiBmdWxsc2NyZWVuIGV4aXQsIGZvY3VzIG9uIHRoZSB0aHVtYm5haWwgbmF2XG4gICAgICAgICAgcGxheWVyLm9uKCdleGl0ZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIHZhciAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkgPSAkc2xpZGUuY2xvc2VzdCgnLnByb2R1Y3QtZ2FsbGVyeScpLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICAgICAgICAgIGlmICgkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuaGFzQ2xhc3MoJ3ZlcnRpY2FsLXNsaWRlci1lbmFibGVkJykpIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmF0dHIoJ3RhYmluZGV4JywgJzAnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdXRvcGxheVlvdXR1YmVWaWRlbyhpZnJhbWVJRCwgJHNsaWRlKSB7XG4gICAgICAvLyBjb21wYXJlIGlkIHRvIHBsYXllciBvYmplY3QgYW5kIG9ubHkgcGxheSB0aGF0IHZpZGVvXG4gICAgICAkLmVhY2goZ2FsbGVyeU9iamVjdC52aWRlb1BsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpe1xuXG4gICAgICAgIGlmIChwbGF5ZXIucGxheWluZykge1xuICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXllci5tZWRpYS5pZCA9PSBpZnJhbWVJRCkge1xuICAgICAgICAgIHBsYXllci5wbGF5KCk7XG5cbiAgICAgICAgICAvLyBPbiBmdWxsc2NyZWVuIGV4aXQsIGZvY3VzIG9uIHRoZSB0aHVtYm5haWwgbmF2XG4gICAgICAgICAgcGxheWVyLm9uKCdleGl0ZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIHZhciAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkgPSAkc2xpZGUuY2xvc2VzdCgnLnByb2R1Y3QtZ2FsbGVyeScpLmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbHMnKTtcbiAgICAgICAgICAgIGlmICgkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuaGFzQ2xhc3MoJ3ZlcnRpY2FsLXNsaWRlci1lbmFibGVkJykpIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmF0dHIoJ3RhYmluZGV4JywgJzAnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBUaHVtYm5haWwgZ2FsbGVyeSBsb2dpYyBiZWdpbnNcbiAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzRW5hYmxlZCA9PSB0cnVlKSB7XG4gICAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzU2xpZGVyRW5hYmxlZCA9PSB0cnVlICYmICRzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBJZiBkZXNrdG9wIGRldGVybWluZSB3aGljaCBzbGlkZXIgd2UgYnVpbGRcbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICAgICAvLyBJZiB0aHVtYm5haWwgcG9zaXRpb24gaXMgbGVmdC9yaWdodCB0aGVuIHZlcnRpY2FsIHNsaWRlciBnZXRzIGVuYWJsZWRcbiAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzUG9zaXRpb24gPT0gJ2xlZnQtdGh1bWJuYWlscycgfHwgZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzUG9zaXRpb24gPT0gJ3JpZ2h0LXRodW1ibmFpbHMnKSB7XG4gICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuY3NzKCdtYXgtaGVpZ2h0JywgJGVsLmNsb3Nlc3QoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKS5vdXRlckhlaWdodCgpKTtcbiAgICAgICAgICAgICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5hZGRDbGFzcygndmVydGljYWwtc2xpZGVyLWVuYWJsZWQnKTtcblxuICAgICAgICAgICAgJHRodW1ibmFpbHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5pbmRleCgpO1xuICAgICAgICAgICAgICAkZWwuZmxpY2tpdHkoJ3NlbGVjdCcsIGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2Y
1XIgbmF2Q2VsbEhlaWdodCA9ICR0aHVtYm5haWxzLmhlaWdodCgpO1xuICAgICAgICAgICAgdmFyIG5hdkhlaWdodCA9ICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5oZWlnaHQoKTtcblxuICAgICAgICAgICAgJGVsLm9uKCAnc2VsZWN0LmZsaWNraXR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIC8vIHNldCBzZWxlY3RlZCBuYXYgY2VsbFxuICAgICAgICAgICAgICB2YXIgZmxrdHkgPSAkZWwuZGF0YSgnZmxpY2tpdHknKTtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZpbmQoJy5pcy1uYXYtc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnaXMtbmF2LXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgIHZhciAkc2VsZWN0ZWQgPSAkdGh1bWJuYWlscy5lcSggZmxrdHkuc2VsZWN0ZWRJbmRleCApLmFkZENsYXNzKCdpcy1uYXYtc2VsZWN0ZWQnKTtcblxuICAgICAgICAgICAgICAvLyBzY3JvbGwgbmF2XG4gICAgICAgICAgICAgIHZhciBzY3JvbGxZID0gJHNlbGVjdGVkLnBvc2l0aW9uKCkudG9wICsgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LnNjcm9sbFRvcCgpIC0gKCBuYXZIZWlnaHQgKyBuYXZDZWxsSGVpZ2h0ICkgLyAyO1xuICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBzY3JvbGxZXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZsaWNraXR5KHtcbiAgICAgICAgICAgICAgICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICAgICAgICAgICAgZ3JvdXBDZWxsczogJzgwJScsXG4gICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmV2TmV4dEJ1dHRvbnM6ICR0aHVtYm5haWxzLmxlbmd0aCA+IDUgPyBnYWxsZXJ5T2JqZWN0LnRodW1ibmFpbHNBcnJvd3MgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhc05hdkZvcjogJGVsWzBdLFxuICAgICAgICAgICAgICAgIGFycm93U2hhcGU6IGFycm93U2hhcGVcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5Lm9uKCdzZXR0bGUuZmxpY2tpdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkdGh1bWJuYWlsUHJvZHVjdEdhbGxlcnkuZmxpY2tpdHkoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBPbmNlIHRodW1ibmFpbCBpcyBmb2N1c2VkLCBtb3ZlIGNhcm91c2VsIHRvIHRoYXQgY2VsbFxuICAgICAgICAgICAgICAkLmVhY2goJHRodW1ibmFpbHMsIGZ1bmN0aW9uKGluZGV4LCB0aHVtYm5haWwpIHtcbiAgICAgICAgICAgICAgICB2Y
1XIgJHRodW1ibmFpbCA9ICQodGh1bWJuYWlsKTtcbiAgICAgICAgICAgICAgICBpZiAoJHRodW1ibmFpbC5oYXNDbGFzcygnaXMtc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgJHRodW1ibmFpbC5vbignZm9jdXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZsaWNraXR5KCdzZWxlY3RDZWxsJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBvbiBkZXNrdG9wLCBjcmVhdGUgc3RhbmRhcmQgdGh1bWJuYWlsIHNsaWRlclxuICAgICAgICAgICR0aHVtYm5haWxQcm9kdWN0R2FsbGVyeS5mbGlja2l0eSh7XG4gICAgICAgICAgICBjZWxsQWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwQ2VsbHM6ICc4MCUnLFxuICAgICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgICAgICAgcHJldk5leHRCdXR0b25zOiAkdGh1bWJuYWlscy5sZW5ndGggPiA1ID8gZ2FsbGVyeU9iamVjdC50aHVtYm5haWxzQXJyb3dzIDogZmFsc2UsXG4gICAgICAgICAgICBhc05hdkZvcjogJGVsWzBdLFxuICAgICAgICAgICAgYXJyb3dTaGFwZTogYXJyb3dTaGFwZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aHVtYm5haWwgc2xpZGVyIGlzIGRpc2FibGVkLCBlbnN1cmUgdGh1bWJuYWlscyBjYW4gc3RpbGwgbmF2aWdhdGUgcHJvZHVjdCBpbWFnZXNcbiAgICAgICAgJHRodW1ibmFpbFByb2R1Y3RHYWxsZXJ5LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX3RodW1ibmFpbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgdmFyIGluZGV4ID0gJCh0aGlzKS5pbmRleCgpO1xuICAgICAgICAgICRlbC5mbGlja2l0eSggJ3NlbGVjdENlbGwnLCBpbmRleCApO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbGF1bmNoUHJvZHVjdE1lZGlhOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0KSB7XG5cbiAgICAvLyBmdW5jdGlvbiB0byBjaGVjayBpZiBicm93c2VyIGlzIElFXG4gICAgdmFyIGlzSUUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgLy8gRW5zdXJlIHByb2R1Y3QgbWVkaWEgbGlicmFyaWVzIGFyZSBwcmVzZW50XG4gICAgaWYgKCFpc0lFMTEpIHtcbiAgICAgIHdpbmRvdy5TaG9waWZ5LmxvYWRGZWF0dXJlcyhbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc2hvcGlmeS14cicsXG4gICAgICAgICAgdmVyc2lvbjogJzEuMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnbW9kZWwtdmlld2VyLXVpJyxcbiAgICAgICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgfVxuICAgICAgXSwgb25BbGxGZWF0dXJlc0xvYWRlZCk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIGxvb3BpbmcgZm9yIHZpZGVvcyBiYXNlZCBvZmYgdGhlaXIgc2VjdGlvbiBzZXR0aW5nXG4gICAgLy8gRmluZCB2aWRlb3Mgd2hlcmUgdGhleSBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNlY3Rpb25cbiAgICAvLyBTZXQgbG9vcGluZ1xuXG4gICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICB2Y
1XIgJHdyYXBwZXIgPSAkKHBsYXllci5lbGVtZW50cy53cmFwcGVyKTtcblxuICAgICAgaWYgKGdhbGxlcnlPYmplY3Quc2VjdGlvbklEICE9IG51bGwpIHtcbiAgICAgICAgdmFyICRzZWN0aW9uID0gJHdyYXBwZXIucGFyZW50cygnLnNob3BpZnktc2VjdGlvbicpLmF0dHIoJ2lkJywgZ2FsbGVyeU9iamVjdC5zZWN0aW9uSUQpO1xuICAgICAgICB2YXIgbG9vcGluZ0VuYWJsZWQgPSAkc2VjdGlvbi5maW5kKGdhbGxlcnlPYmplY3QuZWxlbWVudCkuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbicpLmRhdGEoJ3ZpZGVvLWxvb3BpbmctZW5hYmxlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGxvb3BpbmdFbmFibGVkID0gZ2FsbGVyeU9iamVjdC5lbGVtZW50LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKS5kYXRhKCd2aWRlby1sb29waW5nLWVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgcGxheWVyLmxvb3AgPSBsb29waW5nRW5hYmxlZDtcbiAgICB9KVxuXG4gICAgLy8gM0QgTW9kZWwgU2V0dXBcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgLy8gRGVmYXVsdCBjb250cm9sIGxpc3RcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgICd6b29tLWluJyxcbiAgICAgICAgJ3pvb20tb3V0JyxcbiAgICAgICAgJ2Z1bGxzY3JlZW4nLFxuICAgICAgXSxcbiAgICAgIGZvY3VzT25QbGF5OiBmYWxzZVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvbkFsbEZlYXR1cmVzTG9hZGVkKCkge1xuICAgICAgLy8gSWYgcHJvZHVjdCBtZWRpYSBlbmFibGVkIGxvb2sgZm9yIG1vZGVsLXZpZXdlciB0YWdzIGFuZCBzZXR1cFxuICAgICAgZ2FsbGVyeU9iamVjdC5tb2RlbHMgPSBbXTtcbiAgICAgIHZhciAkbW9kZWxzID0gJCgkKCdtb2RlbC12aWV3ZXInLCBnYWxsZXJ5T2JqZWN0LmVsZW1lbnQpKTtcbiAgICAgICRtb2RlbHMuZWFjaChmdW5jdGlvbihpbmRleCwgbW9kZWwpIHtcbiAgICAgICAgbW9kZWwgPSBuZXcgU2hvcGlmeS5Nb2RlbFZpZXdlclVJKG1vZGVsLCBjb25maWcpO1xuICAgICAgICBnYWxsZXJ5T2JqZWN0Lm1vZGVscy5wdXNoKG1vZGVsKTtcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBlbmFibGVWaWRlb09uSG92ZXI6IGZ1bmN0aW9uKCR0aHVtYm5haWwpIHtcbiAgICB2YXIgJGh0bWw1VmlkZW8gPSAkdGh1bWJuYWlsLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpO1xuICAgIHZhciAkeW91dHViZVZpZGVvID0gJHRodW1ibmFpbC5maW5kKCdbZGF0YS15b3V0dWJlLXZpZGVvXScpO1xuICAgIHZhciB2aWRlb0lEO1xuXG4gICAgaWYgKCRodG1sNVZpZGVvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZpZGVvSUQgPSAkaHRtbDVWaWRlby5maW5kKCdbZGF0YS1wbHlyLXZpZGVvLWlkXScpLmRhdGEoJ3BseXItdmlkZW8taWQnKTtcbiAgICB9IGVsc2UgaWYgKCR5b3V0dWJlVmlkZW8ubGVuZ3RoID4gMCkge1xuICAgICAgdmlkZW9JRCA9ICR5b3V0dWJlVmlkZW8uZmluZCgnaWZyYW1lJykuYXR0cignaWQnKTtcbiAgICB9XG5cbiAgICBpZiAodmlkZW9JRCkge1xuICAgICAgJC5lYWNoKHNlY29uZGFyeU1lZGlhUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuXG4gICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCB8fCBwbGF5ZXIubWVkaWEuaWQgPT0gdmlkZW9JRCkge1xuICAgICAgICAgIHBsYXllci50b2dnbGVDb250cm9scyhmYWxzZSk7XG4gICAgICAgICAgcGxheWVyLm11dGVkID0gdHJ1ZTtcbiAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICB9LFxuICBkaXNhYmxlVmlkZW9PbkhvdmVyOiBmdW5jdGlvbigkdGh1bWJuYWlsKSB7XG4gICAgdmFyICRodG1sNVZpZGVvID0gJHRodW1ibmFpbC5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKTtcbiAgICB2YXIgJHlvdXR1YmVWaWRlbyA9ICR0aHVtYm5haWwuZmluZCgnW2RhdGEteW91dHViZS12aWRlb10nKTtcbiAgICB2YXIgdmlkZW9JRDtcblxuICAgIGlmICgkaHRtbDVWaWRlby5sZW5ndGggPiAwKSB7XG4gICAgICB2aWRlb0lEID0gJGh0bWw1VmlkZW8uZmluZCgnW2RhdGEtcGx5ci12aWRlby1pZF0nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG4gICAgfSBlbHNlIGlmICgkeW91dHViZVZpZGVvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZpZGVvSUQgPSAkeW91dHViZVZpZGVvLmZpbmQoJ2lmcmFtZScpLmF0dHIoJ2lkJyk7XG4gICAgfVxuXG4gICAgaWYgKHZpZGVvSUQpIHtcbiAgICAgICQuZWFjaChzZWNvbmRhcnlNZWRpYVBsYXllcnMsIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcblxuICAgICAgICBpZiAocGxheWVyLmlkID09IHZpZGVvSUQgfHwgcGxheWVyLm1lZGlhLmlkID09IHZpZGVvSUQpIHtcbiAgICAgICAgICBpZiAocGxheWVyLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG4gIGxvYWRQbHlyOiBmdW5jdGlvbihnYWxsZXJ5T2JqZWN0LCB2aWRlb3MsIHNob3dTZWNvbmRhcnlNZWRpYSkge1xuXG4gICAgLy8gSW5pdGlhbGl6ZXMgUGx5ciBsaWJyYXJ5IGZvciBIVE1MNSBhbmQgWW91VHViZSB2aWRlb3MgaW4gUHJvZHVjdCBHYWxsZXJ5XG4gICAgdXRpbGl0aWVzLmxhdW5jaFZpZGVvUGxheWVyKFBseXIsIGdhbGxlcnlPYmplY3QsIHZpZGVvcywgc2hvd1NlY29uZGFyeU1lZGlhKTtcblxuICAgIGlmIChnYWxsZXJ5T2JqZWN0KSB7XG4gICAgICAvLyBBZGRzIHBseXIgdmlkZW8gaWQgdG8gdmlkZW8gd3JhcHBlclxuICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBwbGF5ZXIucHJvdmlkZXI7XG4gICAgICAgIHZhciBpZCA9IHBsYXllci5pZDtcbiAgICAgICAgdmFyICR2aWRlbztcblxuICAgICAgICBpZiAoc291cmNlID09ICdodG1sNScpIHtcbiAgICAgICAgICAkdmlkZW8gPSAkKHBsYXllci5lbGVtZW50cy53cmFwcGVyKS5maW5kKCd2aWRlbycpO1xuICAgICAgICAgICR2aWRlby5hdHRyKCdkYXRhLXBseXItdmlkZW8taWQnLCBpZCk7XG4gICAgICAgI
1H1cbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBsb2FkUHJvZHVjdFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24oKSB7XG4gICAgdmFyICRwcm9kdWN0UmVjb21tZW5kYXRpb25zID0gJCgnLnByb2R1Y3QtcmVjb21tZW5kYXRpb25zJyk7XG4gICAgdmFyIHByb2R1Y3RJRCA9ICRwcm9kdWN0UmVjb21tZW5kYXRpb25zLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICB2YXIgbGltaXQgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdsaW1pdCcpO1xuICAgIHZhciByZWNvbW1lbmRhdGlvbnNVUkwgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdyZWNvbW1lbmRhdGlvbnMtdXJsJyk7XG4gICAgdmFyIHNlY3Rpb25FbmFibGVkID0gJHByb2R1Y3RSZWNvbW1lbmRhdGlvbnMuZGF0YSgnZW5hYmxlZCcpO1xuICAgIHZhciBzZWN0aW9uSWQgPSAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5kYXRhKCdzZWN0aW9uLWlkJyk7XG5cbiAgICBpZiAoIXNlY3Rpb25FbmFibGVkKSByZXR1cm47XG5cbiAgICAvLyBCdWlsZCByZXF1ZXN0IFVSTFxuICAgIHZhciByZXF1ZXN0VXJsID0gcmVjb21tZW5kYXRpb25zVVJMICsgXCI/c2VjdGlvbl9pZD1cIiArIHNlY3Rpb25JZCArIFwiJmxpbWl0PVwiICsgbGltaXQgKyBcIiZwcm9kdWN0X2lkPVwiICsgcHJvZHVjdElEO1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgdXJsOiByZXF1ZXN0VXJsLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBpZiAoIXNlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyICRyZWNvbW1lbmRlZFByb2R1Y3RzRWxlbWVudCA9ICQoZGF0YSkuZmluZCgnLnByb2R1Y3QtcmVjb21tZW5kYXRpb25zJykuaHRtbCgpO1xuXG4gICAgICAgIC8vIEluc2VydCBwcm9kdWN0IGxpc3QgaW50byB0aGUgcHJvZHVjdCAgcmVjb21tZW5kYXRpb25zIGNvbnRhaW5lclxuICAgICAgICAkcHJvZHVjdFJlY29tbWVuZGF0aW9ucy5odG
11sKCRyZWNvbW1lbmRlZFByb2R1Y3RzRWxlbWVudCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzaG9waWZ5IHBheW1lbnQgYnV0dG9uc1xuICAgICAgICBpZiAoU2hvcGlmeS5QYXltZW50QnV0dG9uKSB7XG4gICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLmluaXQoKTtcblxuICAgICAgICAvLyBBY3RpdmUgc3dhdGNoIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByZWNvbW1lbmRlZCBwcm9kdWN0IHF1aWNrIHNob3BcbiAgICAgICAgd2luZG93LnByb2R1Y3QucHJvZHVjdFN3YXRjaGVzKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3NlY29uZGFyeV9pbWFnZSkge1xuICAgICAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLnNob3dTZWNvbmRhcnlJbWFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oJHRhcmdldCl7XG4gICAgLy8gRGVzdHJveSBGbGlja2l0eSBzbGlkZXJcbiAgICB2YXIgJGdhbGxlcnlTbGlkZXIgPSAkdGFyZ2V0LmZpbmQoJy5wcm9kdWN0LWdhbGxlcnlfX21haW4nKTtcbiAgICB2YXIgJHRodW1ibmFpbFNsaWRlciA9ICR0YXJnZXQuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9fdGh1bWJuYWlscycpO1xuXG4gICAgJGdhbGxlcnlTbGlkZXIuZmxpY2tpdHkoJ2Rlc3Ryb3knKTtcbiAgICAkdGh1bWJuYWlsU2xpZGVyLmZsaWNraXR5KCdkZXN0cm95Jyk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsYXp5bG9hZGVkJywgd2luZG93LnByb2R1Y3QuZW5hYmxlWm9vbSk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFByb2R1Y3QgZm9ybVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LnByb2R1Y3RGb3JtTGlzdGVuZXJzID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuXG4gICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5taW51c1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICB2Y
1XIgcXVhbnRpdHkgPSBwYXJzZUludCgkKHRoaXMpLm5leHQoXCJpbnB1dFwiKS52YWwoKSk7XG4gICAgICBxdWFudGl0eSAtPSAxO1xuICAgICAgJCh0aGlzKS5uZXh0KFwiaW5wdXRcIikudmFsKHF1YW50aXR5KTtcblxuICAgICAgaWYgKHF1YW50aXR5ID09IDApIHtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdsaS5jYXJ0X2l0ZW0nKS5zbGlkZVVwKCk7XG4gICAgICAgIHNldFRpbWVvdXQoYWpheFN1Ym1pdENhcnQsIDUwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgXHQkKHRoaXMpLm5leHQoXCJpbnB1dFwiKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH1cblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIucGx1c1wiLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgcXVhbnRpdHkgPSBwYXJzZUludCgkKHRoaXMpLnByZXYoXCJpbnB1dFwiKS52YWwoKSk7XG4gICAgICBxdWFudGl0eSArPSAxO1xuICAgICAgJCh0aGlzKS5wcmV2KFwiaW5wdXRcIikudmFsKHF1YW50aXR5KS50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGNhcnQgbGluayB3aGVuIHRoZSBxdWFudGl0eSBpbnB1dCBpcyBjbGlja2VkXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5jYXJ0X19xdWFudGl0eSBpbnB1dC5xdWFudGl0eScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiI2NhcnRfZm9ybSBpbnB1dFt0eXBlPSdudW1iZXInXVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICQoXCIjY2FydF9mb3JtXCIpLnN1Ym1pdCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKCQoJy50b3NfYWdyZWUnKS5sZW5ndGgpIHtcbiAgICAgICQoJ2JvZHknKS5vbignY2xpY2snLCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZigkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKS5maW5kKCcudG9zX2FncmVlJykubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCQodGhpcykucGFyZW50cygnZm9ybScpLmZpbmQoJy50b3NfYWdyZWUnKS5pcygnOmNoZWNrZWQnKSkge1xuICAgICAgICAgICAgJCh0aGlzKS5zdWJtaXQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxlcnQod2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLmFncmVlX3RvX3Rlcm1zX3dhcm5pbmcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkKHRoaXMpLnN1Ym1pdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKXtcblxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBDb2xsZWN0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG53aW5kb3cuY29sbGVjdGlvbiA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKXtcbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmNvbGxlY3Rpb25fc3dhdGNoZXMpIHtcbiAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZS5tYXRjaGVzKSB7XG4gICAgICAgICQoJy50aHVtYm5haWwnKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAkKCcuc3dhdGNoIHNwYW4nLCAkKHRoaXMpKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYoJCh0aGlzKS5kYXRhKFwiaW1hZ2VcIikuaW5kZXhPZihcIm5vLWltYWdlXCIpID09IC0xKSB7XG4gICAgICAgICAgICAgICQoJzxpbWcvPicpWzBdLnNyYyA9ICQodGhpcykuZGF0YShcImltYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAkKCcuc3dhdGNoIHNwYW4nKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZigkKHRoaXMpLmRhdGEoXCJpbWFnZVwiKS5pbmRleE9mKFwibm8taW1hZ2VcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyY3NldCcsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgUXVpY2sgc2hvcCBidXR0b24gYW5kIEZhbmN5Ym94IGRhdGEgYXR0cmlidXRlcyBvbiBtb2JpbGUgZGV2aWNlc1xuICAgIGlmKCB3aW5kb3cuUFhVVGhlbWUuZGV2aWNlLmhhc1RvdWNoLm1hdGNoZXMpIHtcbiAgICAgICQoJy5xdWlja19zaG9wJykucmVtb3ZlKCk7XG4gICAgICAkKCcucXVpY2tfc2hvcC0tbGlzdCcpLnJlbW92ZUF0dHIoJ2RhdGEtZmFuY3lib3ggZGF0YS1zcmMgZGF0YS1nYWxsZXJ5Jyk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSB0aGUgUXVpY2sgc2hvcCBvbiBkZXNrdG9wXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICQoJy5xdWlja19zaG9wLCAucXVpY2tfc2hvcC0tbGlzdCcpLmZhbmN5Ym94KHtcbiAgICAgICAgYmFzZUNsYXNzOiAncXVpY2stc2hvcF9fbGlnaHRib3ggcHJvZHVjdC0nICsgcHJvZHVjdC5pZCxcbiAgICAgICAgaGFzaDogZmFsc2UsXG4gICAgICAgIGluZm9iYXIgOiBmYWxzZSxcbiAgICAgICAgdG9vbGJhcjogZmFsc2UsXG4gICAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgICBzbWFsbEJ0biA6IHRydWUsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgYXV0b1N0YXJ0OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB0b3VjaDogZmFsc2UsXG4gICAgICAgIG1vYmlsZToge1xuICAgICAgICAgIHByZXZlbnRDYXB0aW9uT3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgdG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICBcImNsb3NlXCJcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIGFmdGVyU2hvdzogZnVuY3Rpb24oZSkge1xuICAgICAgICAgIC8vIFdoZW4gdGhlIG1vZGFsIGlzIG9wZW5lZCwgcHJldmVudCBzY3JvbGxpbmdcbiAgICAgICAgICBkb2
1N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsLWxvY2tlZCcpO1xuXG4gICAgICAgICAgdmFyIHByb2R1Y3RVcmwgPSAkKGUuY3VycmVudC5zcmMpLmRhdGEoJ3VybCcpXG4gICAgICAgICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICAgICAgICBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgeyB2aWV3OiAncXVpY2tzaG9wJyB9LFxuICAgICAgICAgICkudGhlbigoeyBkYXRhLCBodG1sIH0pID0+IHtcbiAgICAgICAgICAgICQoZS5jdXJyZW50LnNyYyArICcubW9kYWwnKS5odG1sKGh0bWwuY29udGVudCk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5wcm9kdWN0LmluaXQoKTtcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgc2hvcGlmeSBwYXltZW50IGJ1dHRvbnNcbiAgICAgICAgICAgIGlmIChTaG9waWZ5LlBheW1lbnRCdXR0b24pIHtcbiAgICAgICAgICAgICAgU2hvcGlmeS5QYXltZW50QnV0dG9uLmluaXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR3JhYiB0aGUgZmFuY3lib3ggZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNsaWNrZWRcbiAgICAgICAgICAgIHZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG5cbiAgICAgICAgICAgIHZhciAkZ2FsbGVyeSA9ICQoJy4nICsgJGZhbmN5Ym94SW1hZ2VFbGVtZW50LmRhdGEoJ2dhbGxlcnknKSk7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAkKCcuZmFuY3lib3gtaXMtb3BlbicpLmZpbmQoJy5zZWxlY3Rvci13cmFwcGVyIHNlbGVjdCcpO1xuICAgICAgICAgICAgdmFyICRwcm9kdWN0Rm9ybSA9ICQoJy5mYW5jeWJveC1pcy1vcGVuIC5qcy1wcm9kdWN0X3NlY3Rpb24nKS5maW5kKCcucHJvZHVjdF9mb3JtJyk7XG5cbiAgICAgICAgICAgIC8vTGluayBzb2xkIG91dCBvcHRpb25zIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvcHRpb24gYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLnByb2R1Y3RfZm9ybV9zdHlsZSAgPT0gJ3N3YXRjaGVzJykge1xuICAgICAgICAgICAgICB2Y
1XIgSlNPTkRhdGEgPSAkcHJvZHVjdEZvcm0uZGF0YSgncHJvZHVjdCcpO1xuICAgICAgICAgICAgICB2YXIgcHJvZHVjdElEID0gJHByb2R1Y3RGb3JtLmRhdGEoJ3Byb2R1Y3QtaWQnKTtcbiAgICAgICAgICAgICAgdmFyIHByb2R1Y3RTZWN0aW9uID0gJy5wcm9kdWN0LScgKyBwcm9kdWN0SUQgKyAnIC5qcy1wcm9kdWN0X3NlY3Rpb24nO1xuICAgICAgICAgICAgICB2YXIgc3dhdGNoT3B0aW9ucyA9ICRwcm9kdWN0Rm9ybS5maW5kKCcuc3dhdGNoLW9wdGlvbnMgLnN3YXRjaCcpO1xuICAgICAgICAgICAgICBpZiAoc3dhdGNoT3B0aW9ucy5sZW5ndGggPiAxKXtcbiAgICAgICAgICAgICAgICBTaG9waWZ5LmxpbmtPcHRpb25TZWxlY3RvcnMoSlNPTkRhdGEsIHByb2R1Y3RTZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxlY3Rvci50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgICAgICAgICAgLy8gR2xvYmFsIHZhcmlhYmxlc1xuICAgICAgICAgICAgdmFyICRnYWxsZXJ5ID0gJCgnLicgKyAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnZ2FsbGVyeScpKTtcblxuICAgICAgICAgICAgdmFyIGdhbGxlcnlPYmplY3QgPSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6ICRnYWxsZXJ5LFxuICAgICAgICAgICAgICB0aHVtYm5haWxzRW5hYmxlZDogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ3RodW1ibmFpbHMtZW5hYmxlZCcpLFxuICAgICAgICAgICAgICB0aHVtYm5haWxzU2xpZGVyRW5hYmxlZDogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ3RodW1ibmFpbHMtc2xpZGVyLWVuYWJsZWQnKSxcbiAgICAgICAgICAgICAgdGh1bWJuYWlsc1Bvc2l0aW9uOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgndGh1bWJuYWlscy1wb3NpdGlvbicpLFxuICAgICAgICAgICAgICB0aHVtYm5haWxzQXJyb3dzOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgnZ2FsbGVyeS1hcnJvd3MtZW5hYmxlZCcpLFxuICAgICAgICAgICAgICBzbGlkZXNob3dBbmltYXRpb246ICRnYWxsZXJ5LnBhcmVudHMoJy5wcm9kdWN0X3NlY3Rpb24nKS5kYXRhKCdzbGlkZXNob3ctYW5pbWF0aW9uJyksXG4gICAgICAgICAgICAgIHNsaWRlU2hvd1NwZWVkOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgnc2xpZGVzaG93LXNwZWVkJyksXG4gICAgICAgICAgICAgIGFjdGl2YXRlWm9vbTogJGdhbGxlcnkucGFyZW50cygnLnByb2R1Y3Rfc2VjdGlvbicpLmRhdGEoJ2FjdGl2YXRlLXpvb20nKSxcbiAgICAgICAgICAgICAgcHJvZHVjdE1lZGlhU3VwcG9ydGVkOiAkZ2FsbGVyeS5wYXJlbnRzKCcucHJvZHVjdF9zZWN0aW9uJykuZGF0YSgncHJvZHVjdC1tZWRpYS1zdXBwb3J0ZWQnKSxcbiAgICAgICAgICAgICAgbG9vcGluZ0VuYWJsZWQ6ICRnYWxsZXJ5LmRhdGEoJ3ZpZGVvLWxvb3BpbmctZW5hYmxlZCcpLFxuICAgICAgICAgICAgICBzZWN0aW9uSUQ6IG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93LnByb2R1Y3QuZW5hYmxlU2xpZGVyKGdhbGxlcnlPYmplY3QpO1xuXG4gICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5wcm9kdWN0TWVkaWFTdXBwb3J0ZWQpIHtcblxuICAgICAgICAgICAgICAvLyBGaW5kIHZpZGVvcyB3aXRoaW4gZ2FsbGVyeSBzZWN0aW9uXG4gICAgICAgICAgICAgIHZhciB0aHVtYm5haWxWaWRlb3M7XG4gICAgICAgICAgICAgIHRodW1ibmFpbFZpZGVvcyA9ICQoZ2FsbGVyeU9iamVjdC5lbGVtZW50KS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10gdmlkZW8sIFtkYXRhLXlvdXR1YmUtdmlkZW9dJykuZ2V0KCk7XG5cbiAgICAgICAgICAgICAgd2luZG93LnByb2R1Y3QubG9hZFBseXIoZ2FsbGVyeU9iamVjdCwgdGh1bWJuYWlsVmlkZW9zKTtcbiAgICAgICAgICAgICAgd2luZG93LnByb2R1Y3QubGF1bmNoUHJvZHVjdE1lZGlhKGdhbGxlcnlPYmplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIb3ZlciB0byB6b29tXG4gICAgICAgICAgICBpZiAoZ2FsbGVyeU9iamVjdC5hY3RpdmF0ZVpvb20pIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbGF6eWxvYWRlZCcsIHdpbmRvdy5wcm9kdWN0LmVuYWJsZVpvb20pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRhYnNcblxuICAgICAgICAgICAgY29uc3QgcXVpY2tzaG9wVGFicyA9ICQoJy5wcm9kdWN0X3NlY3Rpb24uaXMtcXVpY2tzaG9wJykuZmluZCgndWwudGFicycpO1xuICAgICAgICAgICAgaWYgKHF1aWNrc2hvcFRhYnMpIHtcbiAgICAgICAgICAgICAgcXVpY2tzaG9wVGFicy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9ICQodGhpcykuZmluZCgnPiBsaSA+IGEnKTtcbiAgICAgICAgICAgICAgICB0YWIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudExvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoY29udGVudExvY2F0aW9uLmNoYXJBdCgwKT09XCIjXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCd1bC50YWJzJykubmV4dCgpLmZpbmQoY29udGVudExvY2F0aW9uKS5zaG93KCkuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KS5hZGRDbGFzcygnYWN0aXZlJykuc2libGluZ3MoKS5oaWRlKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBhZnRlckNsb3NlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBXaGVuIHRoZSBtb2RhbCBpcyBjbG9zZWQsIGFsbG93IHNjcm9sbGluZ1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9ja2VkJyk7XG5cbiAgICAgICAgICAvLyBHcmFiIHRoZSBmYW5jeWJveCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgY2xpY2tlZFxuICAgICAgICAgI
1HZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG4gICAgICAgICAgdmFyICRnYWxsZXJ5ID0gJCgnLicgKyAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnZ2FsbGVyeScpKVxuXG4gICAgICAgICAgLy8gRmluZCB2aWRlb3MgaW4gZ2FsbGVyeVxuICAgICAgICAgIC8vIEZpbmQgSURzIGFuZCBtYXRjaCBhZ2FpbnN0IHBsYXllclxuICAgICAgICAgIC8vIElmIHZpZGVvcyBhcmUgcGxheWluZywgcGF1c2UgdGhlbVxuICAgICAgICAgIHZhciAkdmlkZW9zSW5HYWxsZXJ5ID0gJGdhbGxlcnkuZmluZCgnLnByb2R1Y3QtZ2FsbGVyeV9faW1hZ2VbZGF0YS1tZWRpYS10eXBlPVwidmlkZW9cIl0sIC5wcm9kdWN0LWdhbGxlcnlfX2ltYWdlW2RhdGEtbWVkaWEtdHlwZT1cImV4dGVybmFsX3ZpZGVvXCJdJyk7XG4gICAgICAgICAgJHZpZGVvc0luR2FsbGVyeS5lYWNoKGZ1bmN0aW9uKGluZGV4LCB2aWRlbykge1xuICAgICAgICAgICAgdmFyICRpZnJhbWVWaWRlbyA9ICQodmlkZW8pLmZpbmQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgdmFyIGlmcmFtZUlEID0gJGlmcmFtZVZpZGVvLmF0dHIoJ2lkJyk7XG4gICAgICAgICAgICB2YXIgJGh0bWw1VmlkZW8gPSAkKHZpZGVvKS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKTtcbiAgICAgICAgICAgIHZhciB2aWRlb0lEID0gJGh0bWw1VmlkZW8uZmluZCgndmlkZW8nKS5kYXRhKCdwbHlyLXZpZGVvLWlkJyk7XG5cbiAgICAgICAgICAgIC8vIFBhdXNlIHZpZGVvcyBpZiBJRHMgbWF0Y2hcbiAgICAgICAgICAgIGlmICgkaHRtbDVWaWRlby5sZW5ndGggfHwgJGlmcmFtZVZpZGVvLmxlbmd0aCkge1xuICAgICAgICAgICAgICAkLmVhY2goZ2xvYmFsUGxheWVyc0FycmF5LCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvSUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuaWQgPT0gdmlkZW9JRCAmJiBwbGF5ZXIucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlmcmFtZUlEKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGxheWVyLm1lZGlhLmlkID09IGlmcmFtZUlEICYmIHBsYXllci5wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xhenlsb2FkZWQnLCB3aW5kb3cucHJvZHVjdC5lbmFibGVab29tKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCQoJ1tkYXRhLWZhY2V0ZWQtZmlsdGVyc10nKS5sZW5ndGgpe1xuICAgICAgZmFjZXRlZEZpbHRlcmluZy5pbml0KCk7XG4gICAgfVxuXG4gICAgJCgnI3NvcnQtYnknKS52YWwoJCgnI3NvcnQtYnknKS5kYXRhKCdkZWZhdWx0LXNvcnQnKSk7XG5cbiAgICAkKCdib2R5JylcbiAgICAgIC5vbignY2hhbmdlJywgJyNzb3J0LWJ5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNvcnRWYWx1ZSA9ICQoJyNzb3J0LWJ5JykudmFsKCk7XG4gICAgICAgIGxldCBuZXdRdWVyeTtcblxuICAgICAgICBpZiAobG9jYXRpb24uc2VhcmNoLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWVyeUFycmF5ID0gbG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoJz8nLCAnJykuc3BsaXQoJyYnKTtcbiAgICAgICAgICBjb25zdCBuZXdRdWVyeUFycmF5ID0gW107XG5cbiAgICAgICAgICBpZiAoIWxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcygnc29ydF9ieScpKSB7XG4gICAgICAgICAgICBuZXdRdWVyeUFycmF5LnB1c2goYHNvcnRfYnk9JHtzb3J0VmFsdWV9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFF1ZXJ5QXJyYXkuZm9yRWFjaChxdWVyeSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdFF1ZXJ5ID0gcXVlcnkuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5S2V5ID0gc3BsaXRRdWVyeVswXTtcbiAgICAgICAgICAgIGxldCBxdWVyeVZhbHVlID0gc3BsaXRRdWVyeVsxXTtcblxuICAgICAgICAgICAgaWYgKHF1ZXJ5S2V5ID09PSAnc29ydF9ieScpIHtcbiAgICAgICAgICAgICAgcXVlcnlWYWx1ZSA9IHNvcnRWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3UXVlcnlBcnJheS5wdXNoKGAke3F1ZXJ5S2V5fT0ke3F1ZXJ5VmFsdWV9YCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBuZXdRdWVyeSA9IG5ld1F1ZXJ5QXJyYXkuam9pbignJicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1F1ZXJ5ID0gYHNvcnRfYnk9JHtzb3J0VmFsdWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGA/JHtuZXdRdWVyeX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3NlY29uZGFyeV9pbWFnZSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24uc2hvd1NlY29uZGFyeUltYWdlKCk7XG4gICAgfVxuICB9LFxuICBzaG93U2Vjb25kYXJ5SW1hZ2U6IGZ1bmN0aW9uKCl7XG4gICAgLy8gV2lsbCBiZSBlbmFibGVkIG9uIG5vbi10b3VjaCBkZXZpY2VzIGFuZCBzY3JlZW4gc2l6ZXMgbGFyZ2VyIHRoYW4gOTYwcHhcbiAgICBpZiAoIXdpbmRvdy5QWFVUaGVtZS5kZXZpY2UuaGFzVG91Y2gubWF0Y2hlcyAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5sYXJnZXIubWF0Y2hlcykge1xuXG4gICAgICAvLyBMb2FkIFBseXIgZm9yIHZpZGVvcyBhcyBzZWNvbmRhcnkgbWVkaWFcbiAgICAgIHZhciBzZWNvbmRhcnlNZWRpYVZpZGVvcztcbiAgICAgIHNlY29uZGFyeU1lZGlhVmlkZW9zID0gJCgnLnRodW1ibmFpbCcpLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXSB2aWRlbywgW2RhdGEteW91dHViZS12aWRlb10nKS5nZXQoKTtcblxuICAgICAgLy8gSWYgcmVjb21tZW5kZWQgcHJvZHVjdHMgYXZhaWxhYmxlLCBjaGVjayBmb3IgZGF0YS1wbHlyLWxvYWRlZCBhdHRyaWJ1dGVcbiAgICAgIHZhciBwbHlyTG9hZGVkID0gJCgnLnNob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKS5maW5kKCcucHJvZHVjdHMnKS5kYXRhKCdwbHlyLWxvYWRlZCcpO1xuXG4gICAgICBsZXQgZ2FsbGVyeU9iamVjdCA9IG51bGw7XG4gICAgICBsZXQgc2hvd1NlY29uZGFyeU1lZGlhID0gdHJ1ZTtcblxuICAgICAgaWYgKCFwbHlyTG9hZGVkKSB7XG4gICAgICAgI
1HdpbmRvdy5wcm9kdWN0LmxvYWRQbHlyKGdhbGxlcnlPYmplY3QsIHNlY29uZGFyeU1lZGlhVmlkZW9zLCBzaG93U2Vjb25kYXJ5TWVkaWEpO1xuICAgICAgfVxuXG4gICAgICAkKCcuaGFzLXNlY29uZGFyeS1tZWRpYS1zd2FwJykub2ZmKCkub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzKS5maW5kKCcuaW1hZ2UtZWxlbWVudF9fd3JhcCBpbWcnKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJ1tkYXRhLWh0bWw1LXZpZGVvXScpLnRvZ2dsZUNsYXNzKCdzZWNvbmRhcnktbWVkaWEtaGlkZGVuJyk7XG4gICAgICAgICQodGhpcykuZmluZCgnLmV4dGVybmFsLXZpZGVvX19jb250YWluZXInKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICB3aW5kb3cucHJvZHVjdC5lbmFibGVWaWRlb09uSG92ZXIoJCh0aGlzKSk7XG4gICAgICB9KTtcblxuICAgICAgJCgnLmhhcy1zZWNvbmRhcnktbWVkaWEtc3dhcCcpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykuZmluZCgnLmltYWdlLWVsZW1lbnRfX3dyYXAgaW1nJykudG9nZ2xlQ2xhc3MoJ3NlY29uZGFyeS1tZWRpYS1oaWRkZW4nKTtcbiAgICAgICAgJCh0aGlzKS5maW5kKCdbZGF0YS1odG1sNS12aWRlb10nKS50b2dnbGVDbGFzcygnc2Vjb25kYXJ5LW1lZGlhLWhpZGRlbicpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJy5leHRlcm5hbC12aWRlb19fY29udGFpbmVyJykudG9nZ2xlQ2xhc3MoJ3NlY29uZGFyeS1tZWRpYS1oaWRkZW4nKTtcbiAgICAgICAgd2luZG93LnByb2R1Y3QuZGlzYWJsZVZpZGVvT25Ib3ZlcigkKHRoaXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdW5sb2FkOiBmdW5jdGlvbigkdGFyZ2V0KXtcbiAgICAkdGFyZ2V0LmZpbmQoJy50aHVtYm5haWwnKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpO1xuICAgICQoJ2JvZHknKS5vZmYoJ2NoYW5nZScsICcjc29ydC1ieScpO1xuICAgICR0YXJnZXQuZmluZCgnLnF1aWNrX3Nob3AsIC5xdWlja19zaG9wLS1saXN0Jykub2ZmKCdjbGljay5mYicpO1xuICAgICR0YXJnZXQuZmluZCgnW2RhdGEtZmlsdGVyLW1vZGFsLW9wZW5dJykub2ZmKCdjbGljaycpO1xuICAgICQod2luZG93KS5vZmYoJ3Jlc2l6ZS5maWx0ZXJpbmcnKTtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgRmFjZXRlZCBGaWx0ZXJpbmdcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBmYWNldGVkRmlsdGVyaW5nID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIGNvbnN0IGZpbHRlclJhbmdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmlsdGVyLXJhbmdlXScpO1xuICAgIGNvbnN0IGZpbHRlckNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1maWx0ZXItaW5wdXRdJyk7XG5cbiAgICBjb25zdCByYW5nZU5hbWVzID0gW107XG5cbiAgICBmaWx0ZXJDaGVja2JveGVzLmZvckVhY2goZnVuY3Rpb24oY2hlY2tib3gpIHtcbiAgICAgICQoY2hlY2tib3gpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkJykpIHJldHVybjtcbiAgICAgICAgLy8gVG9nZ2xlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZpbHRlci1jaGVja2JveF0nKS50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtZmlsdGVyLWNoZWNrZWQnKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0YXJnZXQuZGF0YXNldC51cmw7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qIEZvciByYW5nZSBpbnB1dCAqL1xuICAgIGZpbHRlclJhbmdlLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgICByYW5nZU5hbWVzLnB1c2goZmlsdGVyLm5hbWUpO1xuICAgIH0pO1xuXG4gICAgJCgnW2RhdGEtcmFuZ2UtZmlsdGVyLWJ1dHRvbl0nKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICBmYWNldGVkRmlsdGVyaW5nLmdldEZpbHRlcmVkUmVzdWx0cyhlLmN1cnJlbnRUYXJnZXQsIHJhbmdlTmFtZXMpO1xuICAgIH0pO1xuXG4gICAgJCgnW2RhdGEtZmlsdGVyLW1vZGFsLW9wZW5dJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgJC5mYW5jeWJveC5vcGVuKCQoJ1tkYXRhLWZpbHRlci1tb2RhbF0nKSwge1xuICAgICAgICBiYXNlQ2xhc3M6ICdmYWNldGVkLWZpbHRlci1tb2RhbCcsXG4gICAgICAgIGhhc2g6IGZhbHNlLFxuICAgICAgICBpbmZvYmFyIDogZmFsc2UsXG4gICAgICAgIHRvb2xiYXI6IGZhbHNlLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBzbWFsbEJ0biA6IHRydWUsXG4gICAgICAgIHRvdWNoOiBmYWxzZSxcbiAgICAgICAgbW9iaWxlOiB7XG4gICAgICAgICAgcHJldmVudENhcHRpb25PdmVybGFwOiBmYWxzZSxcbiAgICAgICAgICB0b29sYmFyOiB0cnVlLFxuICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgIFwiY2xvc2VcIlxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJTaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYWRkQ2xhc3MoJ3Njcm9sbC1sb2NrZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWZ0ZXJDbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLnJlbW92ZUNsYXNzKCdzY3JvbGwtbG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuZmlsdGVyaW5nJywgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDc5OSkge1xuICAgICAgICAkKCdbZGF0YS1maWx0ZXItbW9kYWxdJykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgZ2V0RmlsdGVyZWRSZXN1bHRzOiBmdW5jdGlvbihlbGVtZW50LCByYW5nZU5hbWVzKSB7XG4gICAgbGV0IHNlYXJjaFBhcmFtZXRlcnM7XG4gICAgY29uc3QgY3VycmVudFNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgnPycsICcnKTtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50LmNsb3Nlc3QoJ2Zvcm0nKSk7XG4gICAgY29uc3QgbmV3U2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSkudG9TdHJpbmc
1oKTtcblxuICAgIC8vIEZpbHRlciB0aHJvdWdoIGN1cnJlbnQgc2VhcmNoIHN0cmluZyB0byBzZWUgaWYgcHJpY2UgcmFuZ2UgaW5wdXQgYWxyZWFkeSBleGlzdHMsXG4gICAgLy8gaWYgaXQgZG9lcywgY3JlYXRlIG5ldyBzdHJpbmcgd2l0aG91dCBjdXJyZW50IHByaWNlIHJhbmdlIHBhcmFtZXRlcnNcbiAgICBjb25zdCBzcGxpdEN1cnJlbnRTZWFyY2ggPSBjdXJyZW50U2VhcmNoLnNwbGl0KCcmJyk7XG4gICAgbGV0IGZpbHRlcmVkQ3VycmVudFNlYXJjaCA9IHNwbGl0Q3VycmVudFNlYXJjaC5maWx0ZXIoc2VhcmNoID0+IHtcbiAgICAgIGlmIChzZWFyY2guaW5jbHVkZXMocmFuZ2VOYW1lc1swXSkgfHwgc2VhcmNoLmluY2x1ZGVzKHJhbmdlTmFtZXNbMV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBmaWx0ZXJlZEN1cnJlbnRTZWFyY2ggPSBmaWx0ZXJlZEN1cnJlbnRTZWFyY2guam9pbignJicpO1xuXG4gICAgLy8gSWYgY3VycmVudCBzZWFyY2ggcGFyYW1ldGVycyBleGlzdCwgYXBwZW5kIG5ldyBzZWFyY2ggcGFyYW1ldGVyc1xuICAgIC8vIG9uIHRvIGV4aXN0aW5nIHBhcmFtZXRlcnNcbiAgICBpZiAoZmlsdGVyZWRDdXJyZW50U2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlYXJjaFBhcmFtZXRlcnMgPSBgJHtmaWx0ZXJlZEN1cnJlbnRTZWFyY2h9JiR7bmV3U2VhcmNofWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlYXJjaFBhcmFtZXRlcnMgPSBgJHtuZXdTZWFyY2h9YDtcbiAgICB9XG5cbiAgICBsZXQgdXJsUXVlcnlTdHJpbmcgPSAnJztcblxuICAgIGlmIChzZWFyY2hQYXJhbWV0ZXJzKSB7XG4gICAgICB1cmxRdWVyeVN0cmluZyA9IGA/JHtzZWFyY2hQYXJhbWV0ZXJzfWA7XG4gICAgfSBlbHNlIGlmIChzZWFyY2hQYXJhbWV0ZXJzKSB7XG4gICAgICB1cmxRdWVyeVN0cmluZyA9IGA/JHtzZWFyY2hQYXJhbWV0ZXJzfWA7XG4gICAgfVxuXG4gICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaCA9IHVybFF1ZXJ5U3RyaW5nO1xuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBNYXBcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5tYXAgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCl7XG4gICAgaWYgKCQoXCIuc2hvcGlmeS1zZWN0aW9uLS1tYXAgLm1hcCwgLnNob3BpZnktc2VjdGlvbi0tcGFnZS1jb250YWN0LXRlbXBsYXRlIC5tYXBcIikuaGFzQ2xhc3MoJ2pzLWFwaS1tYXAnKSkge1xuICAgICAgdmFyIG1hcHNUb0xvYWQgPSBbXTtcblxuICAgICAgLy9DcmVhdGUgbWFwIHNldHRpbmdzIGFycmF5XG4gICAgICAkKCcubWFwJykuZWFjaChmdW5jdGlvbihpLCBvYmopIHtcbiAgICAgICAgbWFwc1RvTG9hZC5wdXNoKHRoaXMpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLnNlY3Rpb25pZCA9ICQodGhpcykuZGF0YSgnaWQnKTtcbiAgICAgICAgbWFwc1RvTG9hZFtpXS5hZGRyZXNzID0gJCh0aGlzKS5kYXRhKCdhZGRyZXNzJyk7XG4gICAgICAgIG1hcHNUb0xvYWRbaV0uZGlyZWN0aW9ucyA9ICQodGhpcykuZGF0YSgnZGlyZWN0aW9ucy1hZGRyZXNzJyk7XG4gICAgICAgIG1hcHNUb0xvYWRbaV0uem9vbSA9ICQodGhpcykuZGF0YSgnem9vbScpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLm1hcHN0eWxlID0gJCh0aGlzKS5kYXRhKCdzdHlsZScpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLnNob3dwaW4gPSAkKHRoaXMpLmRhdGEoJ3BpbicpO1xuICAgICAgICBtYXBzVG9Mb2FkW2ldLmFwaWtleSA9ICQodGhpcykuZGF0YSgnYXBpLWtleScpO1xuICAgICAgfSk7XG5cbiAgICAgICQuZWFjaChtYXBzVG9Mb2FkLCBmdW5jdGlvbihpLCBpbnN0YW5jZSkge1xuXG4gICAgICAgIC8vRW5hYmxlIGNhY2hpbmcgdG8gYXZvaWQgZHVwbGljYXRlIGdvb2dsZSBtYXBzIGZpbGVzXG4gICAgICAgICQuYWpheFNldHVwKHsgY2FjaGU6IHRydWUgfSk7XG5cbiAgICAgICAgLy9Mb2FkIG1hcHMgc2NyaXB0IGFuZCBmaW5kIGxvY2F0aW9uIGNvb3JkaW5hdGVzXG4gICAgICAgICQuZ2V0U2NyaXB0KCdodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PScgKyBtYXBzVG9Mb2FkW2ldLmFwaWtleSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICB3aW5kb3cubWFwLmZpbmRMb2NhdGlvbihtYXBzVG9Mb2FkW2ldKTtcbiAgICAgICAgICAkLmFqYXhTZXR1cCh7IGNhY2hlOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgZmluZExvY2F0aW9uOmZ1bmN0aW9uKG1hcEFycmF5KSB7XG4gICAgdmFyIGdlb0xhdDtcbiAgICB2YXIgZ2VvTG5nO1xuICAgIHZhciBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgLy9GaW5kIGFuZCBzZXQgY29vcmRpbmF0ZXNcbiAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogbWFwQXJyYXkuYWRkcmVzcyB9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgIGlmIChzdGF0dXMgPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0spIHtcblxuICAgICAgICBnZW9MYXQgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xuICAgICAgICBnZW9MbmcgPSByZXN1bHRzWzBdLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xuXG4gICAgICAgIC8vQ3JlYXRlIG1hcFxuICAgICAgICB3aW5kb3cubWFwLmluaXRNYXAoZ2VvTGF0LCBnZW9MbmcsIG1hcEFycmF5KTtcblxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIGluaXRNYXA6ZnVuY3Rpb24obGF0LGxuZywgbWFwQXJyYXkpIHtcblxuICAgIHZhciBsb2NhdGlvbiA9IHtsYXQ6IGxhdCwgbG5nOiBsbmd9O1xuICAgIHZhciBzdHlsZUpzb24gPSBbXTtcblxuICAgIC8vU2V0IHN0eWxlIEpTT05cbiAgICBpZiggbWFwQXJyYXkubWFwc3R5bGUgPT0gJ2F1YmVyZ2luZScpIHtcbiAgICAgIHN0eWxlSnNvbiA9IFt7XCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZDJjNGRcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzhlYzNiOVwifV19LHtcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxYTM2NDZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwiYWRtaW5pc3RyYXRpdmUuY291bnRyeVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzRiNjg3OFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJhZG1pbmlzdHJhdGl2ZS5sYW5kX3BhcmNlbFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM2NDc3OWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwiYWRtaW5pc3RyYXRpdmUucHJvdmluY2VcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM0YjY4NzhcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwibGFuZHNjYXBlLm1hbl9tYWRlXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMzM0ZTg3XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImxhbmRzY2FwZS5uYXR1cmFsXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwMjNlNThcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyODNkNmFcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzZmOWJhNVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZDJjNGRcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMDIzZTU4XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzNDNzY4MFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMzMDRhN2RcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5OGE1YmVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzFkMmM0ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzJjNjY3NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyNTU3NjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5
1oaWdod2F5XCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2IwZDVjZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwMjNlNThcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5OGE1YmVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzFkMmM0ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0LmxpbmVcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMjgzZDZhXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQuc3RhdGlvblwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjM2E0NzYyXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMwZTE2MjZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNGU2ZDcwXCJ9XX1dO1xuICAgIH0gZWxzZSBpZihtYXBBcnJheS5tYXBzdHlsZSA9PSAncmV0cm8nKSB7XG4gICAgICBzdHlsZUpzb24gPSBbe1wiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZWJlM2NkXCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM1MjM3MzVcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjVmMWU2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYzliMmE2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnkuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGNkMmJlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2FlOWU5MFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJsYW5kc2NhcGUubmF0dXJhbFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGZkMmFlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZGZkMmFlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaVwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM5MzgxN2NcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYTViMDc2XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzQ0NzUzMFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNmNWYxZTZcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5hcnRlcmlhbFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZmRmY2Y4XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQuaGlnaHdheVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjhjOTY3XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQuaGlnaHdheVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2U5YmM2MlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3NcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2U5OGQ1OFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXkuY29udHJvbGxlZF9hY2Nlc3NcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkYjg1NTVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5sb2NhbFwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM4MDZiNjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5saW5lXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkZmQyYWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5saW5lXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzhmN2Q3N1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0LmxpbmVcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNlYmUzY2RcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5zdGF0aW9uXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkZmQyYWVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjYjlkM2MyXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzkyOTk4ZFwifV19XTtcbiAgICB9IGVsc2UgaWYobWFwQXJyYXkubWFwc3R5bGUgPT0gJ3NpbHZlcicpIHtcbiAgICAgIHN0eWxlSnNvbiA9IFt7XCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNmNWY1ZjVcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLmljb25cIixcInN0eWxlcnNcIjpbe1widmlzaWJpbGl0eVwiOlwib2ZmXCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiM2MTYxNjFcIn1dfSx7XCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZjVmNWY1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcImFkbWluaXN0cmF0aXZlLmxhbmRfcGFyY2VsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2JkYmRiZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2VlZWVlZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2lcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNzU3NTc1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNlNWU1ZTVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pLnBhcmtcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWRcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2ZmZmZmZlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmFydGVyaWFsXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzc1NzU3NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2RhZGFkYVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNjE2MTYxXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInJvYWQubG9jYWxcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQubGluZVwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZTVlNWU1XCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInRyYW5zaXQuc3RhdGlvblwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjZWVlZWVlXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNjOWM5YzlcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwid2F0ZXJcIixcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjOWU5ZTllXCJ9XX1dO1xuICAgIH0gZWxzZSBpZihtYXBBcnJheS5tYXBzdHlsZSA9PSAnbmlnaHQnKSB7XG4gICAgICBzdHlsZUpzb24gPSAgW3tcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzI0MmYzZVwifV19LHtcImVsZW1lbnRUeXBlXCI6XCJsYWJlbHMudGV4dC5maWxsXCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjNzQ2ODU1XCJ9XX0se1wiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzI0MmYzZVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJhZG1pbmlzdHJhdGl2ZS5sb2NhbGl0eVwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LmZpbGxcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiNkNTk1NjNcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicG9pXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2Q1OTU2M1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJwb2kucGFya1wiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMjYzYzNmXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcInBvaS5wYXJrXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzZiOWE3NlwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMzODQxNGVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZFwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzIxMmEzN1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzljYTViM1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzc0Njg1NVwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJyb2FkLmhpZ2h3YXlcIixcImVsZW1lbnRUeXBlXCI6XCJnZW9tZXRyeS5zdHJva2VcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMxZjI4MzVcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwicm9hZC5
1oaWdod2F5XCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2YzZDE5Y1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ0cmFuc2l0XCIsXCJlbGVtZW50VHlwZVwiOlwiZ2VvbWV0cnlcIixcInN0eWxlcnNcIjpbe1wiY29sb3JcIjpcIiMyZjM5NDhcIn1dfSx7XCJmZWF0dXJlVHlwZVwiOlwidHJhbnNpdC5zdGF0aW9uXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiI2Q1OTU2M1wifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ3YXRlclwiLFwiZWxlbWVudFR5cGVcIjpcImdlb21ldHJ5XCIsXCJzdHlsZXJzXCI6W3tcImNvbG9yXCI6XCIjMTcyNjNjXCJ9XX0se1wiZmVhdHVyZVR5cGVcIjpcIndhdGVyXCIsXCJlbGVtZW50VHlwZVwiOlwibGFiZWxzLnRleHQuZmlsbFwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzUxNWM2ZFwifV19LHtcImZlYXR1cmVUeXBlXCI6XCJ3YXRlclwiLFwiZWxlbWVudFR5cGVcIjpcImxhYmVscy50ZXh0LnN0cm9rZVwiLFwic3R5bGVyc1wiOlt7XCJjb2xvclwiOlwiIzE3MjYzY1wifV19XTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVKc29uID0gW107XG4gICAgfVxuXG4gICAgLy9DcmVhdGUgZ29vZ2xlIG1hcHMgbGlua1xuICAgICQoJy5qcy1tYXAtbGluaycpLmF0dHIoJ2hyZWYnLCAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3BsYWNlLycgKyBtYXBBcnJheS5kaXJlY3Rpb25zICsgJy9AJyArIGxhdCArICcsJyArIGxuZyApO1xuXG4gICAgLy9TZXQgbWFwIG9wdGlvbnNcbiAgICB2YXIgbWFwT3B0aW9ucyA9IHtcbiAgICAgIHpvb206IG1hcEFycmF5Lnpvb20sXG4gICAgICBjZW50ZXI6IGxvY2F0aW9uLFxuICAgICAgc3R5bGVzOiBzdHlsZUpzb24sXG4gICAgICBkaXNhYmxlRGVmYXVsdFVJOiBmYWxzZVxuICAgIH07XG5cbiAgICAvL0NyZWF0ZSBtYXBcbiAgICB2YXIgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtYXBBcnJheS5zZWN0aW9uaWQpLCBtYXBPcHRpb25zKTtcblxuICAgIC8vU2hvdyBwaW5cbiAgICBpZihtYXBBcnJheS5zaG93cGluID09IHRydWUpIHtcbiAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgcG9zaXRpb246IGxvY2F0aW9uLFxuICAgICAgICBtYXA6IG1hcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBCbG9nc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxud2luZG93LmJsb2dzID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAkKCdib2R5JylcbiAgICAgIC5vbignY2hhbmdlJywgJyN0YWdfZmlsdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gJCgnI3RhZ19maWx0ZXInKS52YWwoKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID0gZmlsdGVyVmFsdWU7XG4gICAgfSk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgJCgnYm9keScpLm9mZignY2hhbmdlJywgJyN0YWdfZmlsdGVyJyk7XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIEFydGljbGVcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5hcnRpY2xlID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xuICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCcvY29tbWVudHMnKSAhPSAtMSkge1xuICAgICAgJCgnaHRtbCxib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAkKFwiI25ldy1jb21tZW50XCIpLm9mZnNldCgpLnRvcC0xNDB9LCdzbG93Jyk7XG4gICAgfVxuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCR0YXJnZXQpe1xuICB9XG59XG5cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFV0aWxpdGllc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIHBseXJVdGlscyA9IHtcbiAgcGxheUJ1dHRvbkljb246JzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbCBwbHlyX19jb250cm9sLS1vdmVybGFpZFwiIGFyaWEtbGFiZWw9XCJQbGF5LCB7dGl0bGV9XCIgZGF0YS1wbHlyPVwicGxheVwiPjxzdmcgY2xhc3M9XCJwbGF5LWljb24tYnV0dG9uLWNvbnRyb2xcIiB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCI2MFwiIGhlaWdodD1cIjYwXCIgZmlsbD1cIndoaXRlXCIvPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMyAyMFY0MEwzOSAyOS40MjQ4TDIzIDIwWlwiIGZpbGw9XCIjMzIzMjMyXCIvPjwvc3ZnPjxzcGFuIGNsYXNzPVwicGx5cl9fc3Itb25seVwiPlBsYXk8L3NwYW4+PC9idXR0b24+JyxcbiAgcGxheUJ1dHRvbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGFyaWEtbGFiZWw9XCJQbGF5LCB7dGl0bGV9XCIgZGF0YS1wbHlyPVwicGxheVwiPjxzdmcgY2xhc3M9XCJpY29uLS1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXBhdXNlXCI+PC91c2U+PC9zdmc+PHN2ZyBjbGFzcz1cImljb24tLW5vdC1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXBsYXlcIj48L3VzZT48L3N2Zz48c3BhbiBjbGFzcz1cImxhYmVsLS1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlBhdXNlPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPlBsYXk8L3NwYW4+PC9idXR0b24+JyxcbiAgbXV0ZUJ1dHRvbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGFyaWEtbGFiZWw9XCJNdXRlXCIgZGF0YS1wbHlyPVwibXV0ZVwiPjxzdmcgY2xhc3M9XCJpY29uLS1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLW11dGVkXCI+P
1C91c2U+PC9zdmc+PHN2ZyBjbGFzcz1cImljb24tLW5vdC1wcmVzc2VkXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjx1c2UgeGxpbms6aHJlZj1cIiNwbHlyLXZvbHVtZVwiPjwvdXNlPjwvc3ZnPjxzcGFuIGNsYXNzPVwibGFiZWwtLXByZXNzZWQgcGx5cl9fdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+VW5tdXRlPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPk11dGU8L3NwYW4+PC9idXR0b24+JyxcbiAgcHJvZ3Jlc3NJbnB1dDogJzxkaXYgY2xhc3M9XCJwbHlyX19jb250cm9sc19faXRlbSBwbHlyX19wcm9ncmVzc19fY29udGFpbmVyXCI+PGRpdiBjbGFzcz1cInBseXJfX3Byb2dyZXNzXCI+PGlucHV0IGRhdGEtcGx5cj1cInNlZWtcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgc3RlcD1cIjAuMDFcIiB2YWx1ZT1cIjBcIiBhcmlhLWxhYmVsPVwiU2Vla1wiPjxwcm9ncmVzcyBjbGFzcz1cInBseXJfX3Byb2dyZXNzX19idWZmZXJcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIwXCI+JSBidWZmZXJlZDwvcHJvZ3Jlc3M+PHNwYW4gcm9sZT1cInRvb2x0aXBcIiBjbGFzcz1cInBseXJfX3Rvb2x0aXBcIj4wMDowMDwvc3Bhbj48L2Rpdj48L2Rpdj4nLFxuICB2b2x1bWU6ICc8ZGl2IGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fdm9sdW1lXCI+PGlucHV0IGRhdGEtcGx5cj1cInZvbHVtZVwiIHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxXCIgc3RlcD1cIjAuMDVcIiB2YWx1ZT1cIjFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcmlhLWxhYmVsPVwiVm9sdW1lXCI+PC9kaXY+JyxcbiAgZnVsbHNjcmVlbjogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicGx5cl9fY29udHJvbHNfX2l0ZW0gcGx5cl9fY29udHJvbFwiIGRhdGEtcGx5cj1cImZ1bGxzY3JlZW5cIj48c3ZnIGNsYXNzPVwiaWNvbi0tcHJlc3NlZFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48dXNlIHhsaW5rOmhyZWY9XCIjcGx5ci1leGl0LWZ1bGxzY3JlZW5cIj48L3VzZT48L3N2Zz48c3ZnIGNsYXNzPVwiaWNvbi0tbm90LXByZXNzZWRcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PHVzZSB4bGluazpocmVmPVwiI3BseXItZW50ZXItZnVsbHNjcmVlblwiPjwvdXNlPjwvc3ZnPjxzcGFuIGNsYXNzPVwibGFiZWwtLXByZXNzZWQgcGx5cl9fdG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+RXhpdCBmdWxsc2NyZWVuPC9zcGFuPjxzcGFuIGNsYXNzPVwibGFiZWwtLW5vdC1wcmVzc2VkIHBseXJfX3Rvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPkVudGVyIGZ1bGxzY3JlZW48L3NwYW4+PC9idXR0b24+J1xufVxuXG52YXIgY29udHJvbHMgPSBwbHlyVXRpbHMucGxheUJ1dHRvbkljb24gKyAnPGRpdiBjbGFzcz1cInBseXJfX2NvbnRyb2xzXCI+JyArIHBseXJVdGlscy5wbGF5QnV0dG9uICsgcGx5clV0aWxzLnByb2dyZXNzSW5wdXQgKyBwbHlyVXRpbHMubXV0ZUJ1dHRvbiArIHBseXJVdGlscy52b2x1bWUgKyBwbHlyVXRpbHMuZnVsbHNjcmVlbiArICc8L2Rpdic7XG5cbnZhciBnbG9iYWxQbGF5ZXJzQXJyYXkgPSBbXTtcbnZhciBzZWNvbmRhcnlNZWRpYVBsYXllcnM7XG5cbnZhciB1dGlsaXRpZXMgPSB7XG4gIGxpc3RlbkZvclJlc2l6ZTogZnVuY3Rpb24oKSB7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgICB9LCAxMDApO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgYSB0aW1lclxuICAgIHZhciByZXNpemVUaW1lb3V0O1xuXG4gICAgLy8gTGlzdGVuIGZvciByZXNpemUgZXZlbnRzXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cbiAgICAgIC8vIElmIHRpbWVyIGlzIG51bGwsIHJlc2V0IGl0IHRvIDY2bXMgYW5kIHJ1biB5b3VyIGZ1bmN0aW9ucy5cbiAgICAgIC8vIE90aGVyd2lzZSwgd2FpdCB1bnRpbCB0aW1lciBpcyBjbGVhcmVkXG4gICAgICBpZiAoICFyZXNpemVUaW1lb3V0ICkge1xuICAgICAgICByZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBSZXNldCB0aW1lb3V0XG4gICAgICAgICAgcmVzaXplVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgLy8gUnVuIG91ciByZXNpemUgZnVuY3Rpb25zXG4gICAgICAgICAgYW5ub3VuY2VtZW50X2Jhci5zZXRQYWRkaW5nKCk7XG4gICAgICAgICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmhlYWRlci5zZXRIZWFkZXJQb3NpdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UucmVzZXRQYWRkaW5nKCk7XG4gICAgICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgICAgICAgd2luZG93LmhlYWRlci5keW5hbWljRHJvcGRvd24oKTtcbiAgICAgICAgICB3aW5kb3cuaGVhZGVyLnNldFBhZGRpbmcoKTtcbiAgICAgICAgfSwgNjYpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcbiAgfSxcbiAgbGF1bmNoVmlkZW9QbGF5ZXI6IGZ1bmN0aW9uKFBseXIsIGdhbGxlcnlPYmplY3QsIHZpZGVvcywgc2hvd1NlY29uZGFyeU1lZGlhKSB7XG5cbiAgICBpZiAoZ2FsbGVyeU9iamVjdCAhPSBudWxsKSB7XG4gICAgICBnYWxsZXJ5T2JqZWN0LnZpZGVvUGxheWVycyA9IFBseXIuc2V0dXAodmlkZW9zLCB7XG4gICAgICAgIGNvbnRyb2xzOiBjb250cm9scyxcbiAgICAgICAgZnVsbHNjcmVlbjoge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZmFsbGJhY2s6IHRydWUsXG4gICAgICAgICAgaW9zTmF0aXZlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2U6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gR29pbmcgdGhyb3VnaCBnYWxsZXJpZXMgYXJyYXkgYW5kIHB1c2hpbmcgcGxheWVycyBpbnRvIG1hc3RlciBhcnJheVxuICAgICAgJC5lYWNoKGdhbGxlcnlPYmplY3QudmlkZW9QbGF5ZXJzLCBmdW5jdGlvbihpbmRleCwgcGxheWVyKSB7XG4gICAgICAgIGdsb2JhbFBsYXllcnNBcnJheS5wdXNoKHBsYXllcik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNob3dTZWNvbmRhcnlNZWRpYSA9PSB0cnVlKSB7XG4gICAgICAvLyBDb2xsZWN0aW9uIHBhZ2UvUmVjb21tZW5kZWQgUHJvZHVjdHMgc2Vjb25kYXJ5IG1lZGlhXG4gICAgICBzZWNvbmRhcnlNZWRpYVBsYXllcnMgPSBQbHlyLnNldHVwKHZpZGVvcywge1xuICAgICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICAgIGZ1bGxzY3JlZW46IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGZhbGxiYWNrOiB0cnVlLFxuICAgICAgICAgIGlvc05hdGl2ZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBzdG9yYWdlOiB7XG4gICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWRkIGRhdGEtYXR0cmlidXRlICdwbHlyLWxvYWRlZD1cInRydWVcIicgdG8gdmlkZW9zIGNvbnRhaW5lclxuICAgICAgJCgnLnNob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKS5maW5kKCcucHJvZHVjdHMnKS5hdHRyKCdkYXRhLXBseXItbG9hZGVkJywgJ3RydWUnKTtcblxuICAgICAgJC5lYWNoKHNlY29uZGFyeU1lZGlhUGxheWVycywgZnVuY3Rpb24oaW5kZXgsIHBsYXllcikge1xuICAgICAgICBnbG9iYWxQbGF5ZXJzQXJyYXkucHVzaChwbGF5ZXIpO1xuICAgICAgfSlcblxuICAgICAgLy8gQWRkcyBwbHlyIHZpZGVvIGlkIHRvIHZpZGVvIHdyYXBwZXJcbiAgICAgICQuZWFjaChnbG9iYWxQbGF5ZXJzQXJyYXksIGZ1bmN0aW9uKGluZGV4LCBwbGF5ZXIpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHBsYXllci5wcm92aWRlcjtcbiAgICAgICAgdmFyIGlkID0gcGxheWVyLmlkO1xuICAgICAgICB2Y
1XIgJHZpZGVvO1xuXG4gICAgICAgIGlmIChzb3VyY2UgPT0gJ2h0bWw1Jykge1xuICAgICAgICAgICR2aWRlbyA9ICQocGxheWVyLmVsZW1lbnRzLndyYXBwZXIpLmZpbmQoJ3ZpZGVvJyk7XG4gICAgICAgICAgJHZpZGVvLmF0dHIoJ2RhdGEtcGx5ci12aWRlby1pZCcsIGlkKTtcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHNlY29uZGFyeU1lZGlhUGxheWVycztcbiAgICB9XG4gIH0sXG4gIGVuYWJsZURpc2Nsb3N1cmU6IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyICRkaXNjbG9zdXJlID0gJCgnW2RhdGEtZGlzY2xvc3VyZV0nKTtcbiAgICB2YXIgJHRvZ2dsZSA9ICQoJ1tkYXRhLWRpc2Nsb3N1cmUtdG9nZ2xlXScpO1xuICAgIHZhciAkZGlzY2xvc3VyZVdyYXAgPSAkKCcuZGlzY2xvc3VyZV9fbGlzdC13cmFwJyk7XG5cbiAgICAvL0NoZWNrIGlmIGN1cnJlbnQgb3BlbmVkIG1lbnUgaXMgb2Zmc2NyZWVuXG4gICAgZnVuY3Rpb24gY2hlY2tPZmZTY3JlZW4oJG9wZW5lZFRvZ2dsZSkge1xuICAgICAgaWYoJG9wZW5lZFRvZ2dsZS5zaWJsaW5ncygnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLmlzKCc6b2ZmLXJpZ2h0JykpIHtcbiAgICAgICAgJG9wZW5lZFRvZ2dsZS5zaWJsaW5ncygnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLmFkZENsYXNzKCdkaXNjbG9zdXJlLS1sZWZ0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2VEaXNjbG9zdXJlcyhpZ25vcmVUYXJnZXQsIGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGlmKGlnbm9yZVRhcmdldCA9PT0gdHJ1ZSkge1xuICAgICAgICAkdG9nZ2xlLm5vdChjdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcygnaXMtY2xpY2tlZCcpO1xuICAgICAgICAkdG9nZ2xlLm5vdChjdXJyZW50VGFyZ2V0KS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkdG9nZ2xlLnJlbW92ZUNsYXNzKCdpcy1jbGlja2VkJyk7XG4gICAgICAgICR0b2dnbGUuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgfVxuXG4gICAgICAkZGlzY2xvc3VyZVdyYXAucmVtb3ZlQ2xhc3MoJ2Rpc2Nsb3N1cmUtLWxlZnQnKTtcbiAgICB9XG5cbiAgICAvL0Nsb3NlIG1lbnVzIG9uIEVTQ1xuICAgICQoJ2JvZHknKS5vbigna2V5dXAnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZihlLndoaWNoID09ICcyNycpIHtcbiAgICAgICAgY2xvc2VEaXNjbG9zdXJlcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9DbG9zZSBtZW51cyBvbiBob3Zlcm91dFxuICAgICRkaXNjbG9zdXJlLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oZSkge1xuICAgICAgY2xvc2VEaXNjbG9zdXJlcygpO1xuICAgIH0pO1xuXG4gICAgLy9PbiBjbGljay9mb2N1cyBldmVudCBmb3IgdG9nZ2xpbmcgb3B0aW9uc1xuICAgICR0b2dnbGUub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgIC8vQ2xvc2UgYWxsIG90aGVyIG1lbnVzXG4gICAgICBjbG9zZURpc2Nsb3N1cmVzKHRydWUsIHRoaXMpO1xuXG4gICAgICB2Y
1XIgJHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcbiAgICAgICR0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJykuYWRkQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgIGNoZWNrT2ZmU2NyZWVuKCR0YXJnZXQpO1xuICAgIH0pO1xuXG4gICAgJHRvZ2dsZS5vbigna2V5dXAnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgdmFyICR0YXJnZXQgPSAkKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICR0YXJnZXQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJykuYWRkQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgICAgY2hlY2tPZmZTY3JlZW4oJHRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkZGlzY2xvc3VyZS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgICAgY29uc3QgbmV4dEVsID0gZS5yZWxhdGVkVGFyZ2V0OyAvLyBUaGUgZWxlbWVudCB0aGF0IHdvdWxkIHJlY2VpdmUgZm9jdXMuXG5cbiAgICAgIC8vIElmIHRoZSBuZXh0RWwgaXMgd2l0aGluIHRoZSBsaXN0IChhIGxpc3QgaXRlbSksIGRvbid0IGNsb3NlIHRoZSBsaXN0XG4gICAgICBpZiAoIWxpc3QuY29udGFpbnMobmV4dEVsKSkge1xuICAgICAgICBjbG9zZURpc2Nsb3N1cmVzKGZhbHNlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vTW9iaWxlIHRvZ2dsZSBsb2dpY1xuICAgICR0b2dnbGUub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubWVkaXVtLm1hdGNoZXMgfHwgIXdpbmRvdy5QWFVUaGVtZS5kZXZpY2UuaGFzVG91Y2gubWF0Y2hlcykge1xuICAgICAgICB2Y
1XIgJHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTtcblxuICAgICAgICBjbG9zZURpc2Nsb3N1cmVzKHRydWUsIHRoaXMpO1xuXG4gICAgICAgIGlmKCEkdGFyZ2V0Lmhhc0NsYXNzKCdpcy1jbGlja2VkJykpIHtcbiAgICAgICAgICAkdGFyZ2V0LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpLmFkZENsYXNzKCdpcy1jbGlja2VkJyk7XG4gICAgICAgICAgY2hlY2tPZmZTY3JlZW4oJHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHRhcmdldC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJykucmVtb3ZlQ2xhc3MoJ2lzLWNsaWNrZWQnKTtcbiAgICAgICAgICAkZGlzY2xvc3VyZVdyYXAucmVtb3ZlQ2xhc3MoJ2Rpc2Nsb3N1cmUtLWxlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGFkZEltYWdlRGltZW5zaW9uOiBmdW5jdGlvbihpbWFnZVVybCwgc2l6ZSkge1xuICAgIHZhciBpbnNlcnRQb3NpdGlvbiA9IGltYWdlVXJsLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICByZXR1cm4gaW1hZ2VVcmwuc3Vic3RyaW5nKDAsIGluc2VydFBvc2l0aW9uKSArIHNpemUgKyBpbWFnZVVybC5zdWJzdHJpbmcoaW5zZXJ0UG9zaXRpb24pO1xuICB9LFxuICB1bmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICQoJ1tkYXRhLWRpc2Nsb3N1cmVdJykub2ZmKCk7XG4gICAgJCgnW2RhdGEtZGlzY2xvc3VyZS10b2dnbGVdJykub2ZmKCk7XG4gICAgJCgnLmRpc2Nsb3N1cmVfX2xpc3Qtd3JhcCcpLm9mZigpO1xuICB9XG59XG5cbnZhciB0b2dnbGVTaWRlYmFyQmxvY2tzID0gZnVuY3Rpb24oJHRvZ2dsZSl7XG4gIGlmKCR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5pcygnOnZpc2libGUnKSkge1xuICAgICR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5oaWRlKCk7XG4gICAgJHRvZ2dsZS5odG1sKCcrJyk7XG4gICAgJHRvZ2dsZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICB9IGVsc2Uge1xuICAgICR0b2dnbGUucGFyZW50KCkubmV4dCgndWwnKS5zaG93KCk7XG4gICAgJHRvZ2dsZS5odG1sKCctJyk7XG4gICAgJHRvZ2dsZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gIH1cbn1cblxudmFyIHRvZ2dsZVNpZGViYXJNZW51cyA9IGZ1bmN0aW9uKCR0b2dnbGUpe1xuICB2YXIgJGNvbnRlbnQgPSAkdG9nZ2xlLm5leHQoJ3VsJyk7XG4gICRjb250ZW50LnNsaWRlVG9nZ2xlKCk7XG4gICR0b2dnbGUudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpO1xuICAkdG9nZ2xlLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAkdG9nZ2xlLmF0dHIoJ2FyaWEtZXhwYW5kZWQnKSA9PSAndHJ1ZScgPyAnZmFsc2UnIDogJ3RydWUnKTtcbn1cblxud2luZG93LmFuaW1hdGVfY29udGVudCA9IHtcbiAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgLy8gYWRkZWQgdG8gdGhlIGxpc3RlbkZvclJlc2l6ZSBtZXRob2RcbiAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubGFyZ2UubWF0Y2hlcyB8fCAkKHdpbmRvdykud2lkdGgoKSA9PSAwKSB7XG4gICAgICAkKFwiLmFuaW1hdGVfcmlnaHRcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJblJpZ2h0XCIpO1xuICAgICAgfSwgeyBvZmZzZXQ6ICc4MCUnIH0pO1xuICAgICAgJChcIi5hbmltYXRlX2xlZnRcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJbkxlZnRcIik7XG4gICAgICB9LCB7IG9mZnNldDogJzgwJScgfSk7XG4gICAgICAkKFwiLmFuaW1hdGVfdXBcIikud2F5cG9pbnQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5lbGVtZW50KS5hZGRDbGFzcyhcImFuaW1hdGVkIGZhZGVJblVwXCIpO1xuICAgICAgfSwgeyBvZmZzZXQ6ICc4MCUnIH0pO1xuICAgICAgJChcIi5hbmltYXRlX2luXCIpLndheXBvaW50KGZ1bmN0aW9uKCkge1xuICAgICAgICAkKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoXCJhbmltYXRlZCBmYWRlSW5cIik7XG4gICAgICB9LCB7IG9mZnNldDogJzgwJScgfSk7XG4gICAgICAkKFwiLmFuaW1hdGVfZG93blwiKS53YXlwb2ludChmdW5jdGlvbigpIHtcbiAgICAgICAgJCh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKFwiYW5pbWF0ZWQgZmFkZUluRG93blwiKTtcbiAgICAgIH0sIHsgb2Zmc2V0OiAnODAlJyB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIENhcnRcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5jYXJ0ID0ge1xuICBpbml0OiBmdW5jdGlvbigpe1xuICAgICQoXCIjYWRkcmVzc19jb3VudHJ5XCIpLnZhbCgkKFwiI2FkZHJlc3NfY291bnRyeVwiKS5kYXRhKFwiZGVmYXVsdFwiKSkuY2hhbmdlKCk7XG4gIH0sXG4gIHVubG9hZDogZnVuY3Rpb24oKXtcbiAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgUHJlZGljdGl2ZSBzZWFyY2hcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbndpbmRvdy5wcmVkaWN0aXZlU2VhcmNoID0ge1xuICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLmNsb3NlU2VhcmNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLWNsb3NlXScpO1xuICAgIHRoaXMuc2l0ZU92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaXRlLW92ZXJsYXldJyk7XG4gICAgdGhpcy5zaXRlT3ZlcmxheUFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5zaXRlT3ZlcmxheSB9KTtcbiAgICB0aGlzLnNlYXJjaEZvcm1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcHJlZGljdGl2ZS1zZWFyY2gtZW5hYmxlZC10cnVlXScpO1xuXG4gICAgdGhpcy5zZWFyY2hGb3Jtcy5mb3JFYWNoKGZvcm0gPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlYXJjaC1yZXN1bHRzXScpO1xuICAgICAgY29uc3QgcmVzdWx0c0NvbnRhaW5lciA9IGZvcm0ucXVlcnlTZWxlY3RvcignW2RhdGEtc2VhcmNoLXJlc3VsdHMtY29udGFpbmVyXScpO1xuICAgICAgY29uc3QgYW5pbWF0aW9uID0gdHJhbnNpdGlvbih7IGVsOiByZXN1bHRzQ29udGFpbmVyIH0pO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihmb3JtLCAnc3VibWl0JywgZSA9PiB0aGlzLl9vblN1Ym1pdChlLCBpbnB1dCkpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAncmVzaXplJywgKCkgPT4gdGhpcy5fb25SZXNpemUocmVzdWx0c0NvbnRhaW5lcikpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIod2luZG93LCAna2V5dXAnLCBlID0+IHRoaXMuX29uS2V5VXAoZSwgZm9ybSwgaW5wdXQsIGFuaW1hdGlvbikpO1xuICAgICAgdGhpcy5ldmVudHMucmVnaXN0ZXIodGhpcy5jbG9zZVNlYXJjaCwgJ2NsaWNrJywgKCkgPT4gdGhpcy5fY2xvc2UoZm9ybSwgYW5pbWF0aW9uKSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihpbnB1dCwgJ2ZvY3VzJywgKCkgPT4gdGhpcy5fb25Gb2N1cyhmb3JtLCBpbnB1dCwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKSk7XG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihpbnB1dCwgJ2lucHV0JywgZGVib3VuY2UoKCkgPT4gdGhpcy5fb25DaGFuZ2UoZm9ybSwgaW5wdXQsIHJlc3VsdHMsIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikpLCAyNTApO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcihkb2N1bWVudC5ib2R5LCAnY2xpY2snLCBlID0+IHtcbiAgICAgICAgaWYgKGZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtZm9ybS0tYWN0aXZlJykpIHtcbiAgICAgICAgICBpZiAoIWZvcm0uY29udGFpbnMoZS50YXJnZXQpICYmICFmb3JtLmNsb3Nlc3QoJy5tb2JpbGUtc2VhcmNoJykpIHtcbiAgICAgICAgICAgI
1HRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgX29uU3VibWl0KGUsIGlucHV0KSB7XG4gICAgLy8gUHJldmVudCBlbXB0eSBmb3JtIHN1Ym1pc3Npb25zXG4gICAgaWYgKHRoaXMuX2dldFF1ZXJ5KGlucHV0KS5sZW5ndGggPT09IDApIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSxcbiAgX29uUmVzaXplKHJlc3VsdHNDb250YWluZXIpIHtcbiAgICB0aGlzLl9yZXNpemVTZWFyY2hSZXN1bHRzKHJlc3VsdHNDb250YWluZXIpO1xuICB9LFxuICBfb25LZXlVcChlLCBmb3JtLCBpbnB1dCwgYW5pbWF0aW9uKSB7XG4gICAgaWYgKGUuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG5cbiAgICAgIHRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG5cbiAgICAgICQoJyNzZWFyY2gnKS5yZW1vdmVDbGFzcyhcImZhZGVJblwiKS5oaWRlKCk7XG4gICAgfVxuICB9LFxuICBfb25CbHVyKGZvcm0sIGFuaW1hdGlvbikge1xuICAgIHRoaXMuX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbik7XG5cbiAgICAkKCcjc2VhcmNoJykucmVtb3ZlQ2xhc3MoXCJmYWRlSW5cIikuaGlkZSgpO1xuICB9LFxuICBfb25Gb2N1cyhmb3JtLCBpbnB1dCwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKSB7XG4gICAgY29uc3QgdGVybSA9IHRoaXMuX2dldFF1ZXJ5KGlucHV0KTtcblxuICAgIGlmICh0ZXJtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fZ2V0U2VhcmNoUmVzdWx0cyh0ZXJtLCBmb3JtLCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pO1xuICAgIHRoaXMuX29wZW4oZm9ybSwgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgfSxcbiAgX29uQ2hhbmdlKGZvcm0sIGlucHV0LCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5fZ2V0UXVlcnkoaW5wdXQpO1xuXG4gICAgaWYgKHRlcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9jbG9zZShmb3JtLCBhbmltYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dldFNlYXJjaFJlc3VsdHMo
1dGVybSwgZm9ybSwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgICB0aGlzLl9vcGVuKGZvcm0sIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbik7XG4gIH0sXG4gIF9nZXRRdWVyeShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC52YWx1ZS50cmltKCk7XG4gIH0sXG4gIF9vcGVuKGZvcm0sIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikge1xuICAgIGFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbC1sb2NrZWQnKTtcblxuICAgICAgICBmb3JtLmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1mb3JtLS1hY3RpdmUnKTtcblxuICAgICAgICBpZiAoZm9ybS5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1mb3JtLS1vdmVybGF5LWVuYWJsZWQtdHJ1ZScpKSB7XG4gICAgICAgICAgdGhpcy5zaXRlT3ZlcmxheUFuaW1hdGlvbi5hbmltYXRlVG8oJ29wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtLmNsb3Nlc3QoJy5tb2JpbGUtc2VhcmNoJykgfHwgZm9ybS5jbG9zZXN0KCcubW9iaWxlLXNlYXJjaC1iYXInKSAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2guc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2l6ZVNlYXJjaFJlc3VsdHMocmVzdWx0c0NvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgfSxcbiAgX2Nsb3NlKGZvcm0sIGFuaW1hdGlvbikge1xuICAgIGFuaW1hdGlvbi5hbmltYXRlVG8oJ2Nsb3NlZCcpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGZvcm0uY2xhc3NMaXN0LnJlbW92ZSgnc2VhcmNoLWZvcm0tLWFjdGl2ZScpO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnc2Nyb2xsLWxvY2tlZCcpO1xuXG4gICAgICAgIGlmIChmb3JtLmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoLWZvcm0tLW92ZXJsYXktZW5hYmxlZC10cnVlJykpIHtcbiAgICAgICAgICB0aGlzLnNpdGVPdmVybGF5QW5pbWF0aW9uLmFuaW1hdGVUbygnY2xvc2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jbG9zZVNlYXJjaCAmJiB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MubW9iaWxlX3NlYXJjaF9sb2NhdGlvbiA9PSAnYmVsb3ctaGVhZGVyJyAmJiB3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcykge1xuICAgICAgICAgIHRoaXMuY2xvc2VTZWFyY2guc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0sXG4gIF9nZXRTZWFyY2hSZXN1bHRzKHRlcm0sIGZvcm0sIHJlc3VsdHMsIHJlc3VsdHNDb250YWluZXIsIGFuaW1hdGlvbikge1xuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGZvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtZm9ybS0tYmxvZycpID8gJyZyZXNvdXJjZXNbdHlwZV09YXJ0aWNsZScgOiAnJztcblxuICAgIHJlc3VsdHNDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnLCAndHJ1ZScpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlBYVVRoZW1lLnJvdXRlcy5wcmVkaWN0aXZlX3NlYXJjaF91cmx9P3E9JHt0ZXJtfSR7cmVzb3VyY2VUeXBlfSZzZWN0aW9uX2lkPXByZWRpY3RpdmUtc2VhcmNoYClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0c01hcmt1cCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpLnF1ZXJ5U2VsZWN0b3IoJyNzaG9waWZ5LXNlY3Rpb24tcHJlZGljdGl2ZS1zZWFyY2gnKS5pbm5lckhUTUw7XG4gICAgICAgIHRoaXMuX3JlbmRlclNlYXJjaFJlc3VsdHMocmVzdWx0c01hcmt1cCwgZm9ybSwgcmVzdWx0cywgcmVzdWx0c0NvbnRhaW5lciwgYW5pbWF0aW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICB9LFxuICBfcmVuZGVyU2VhcmNoUmVzdWx0cyhyZXN1bHRzTWFya3VwLCBmb3JtLCByZXN1bHRzLCByZXN1bHRzQ29udGFpbmVyLCBhbmltYXRpb24pIHtcbiAgICByZXN1bHRzQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJywgJ2ZhbHNlJyk7XG4gICAgcmVzdWx0cy5pbm5lckhUTUwgPSByZXN1bHRzTWFya3VwO1xuICAgIHRoaXMuX3JlZ2lzdGVyRXZlbnRzKGZvcm0sIGFuaW1hdGlvbik7XG4gIH0sXG4gIF9yZWdpc3RlckV2ZW50cyhmb3JtLCBhbmltYXRpb24pIHtcbiAgICB0aGlzLnNlYXJjaEJ1dHRvbiA9IGZvcm0ucXVlcnlTZWxlY3RvcignW2RhdGEtcHJlZGljdGl2ZS1zZWFyY2gtYnV0dG9uXScpO1xuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMuc2VhcmNoQnV0dG9uLCAnYmx1cicsICgpID0+IHRoaXMuX29uQmx1cihmb3JtLCBhbmltYXRpb24pKTtcbiAgfSxcbiAgX3Jlc2l6ZVNlYXJjaFJlc3VsdHMocmVzdWx0c0NvbnRhaW5lcikge1xuICAgIGNvbnN0IG9mZnNldCA9IDMwO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gcmVzdWx0c0NvbnRhaW5lci5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHBvc2l0aW9uLmJvdHRvbSAtIG9mZnNldDtcblxuICAgIHJlc3VsdHNDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2VhcmNoLXJlc3VsdHMtbWF4LWhlaWdodCcsIGAke21heEhlaWdodH1weGApO1xuICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBSZXNwb25zaXZlIG1lZGlhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0q
1L1xuXG5mdW5jdGlvbiBlbmFibGVSZXNwb25zaXZlVmlkZW9XcmFwcGVyKCkge1xuICAvLyBXcmFwcyBZb3VUdWJlIGFuZCBWaW1lbyBpZnJhbWVzIGluIFBseXIgd3JhcHBlclxuICAvLyBEb2VzIG5vdCB0YXJnZXQgaWZyYW1lcyBhbHJlYWR5IGVtYmVkZGVkIGluIFBseXIgd3JhcHBlciAodmlkZW8gc2VjdGlvbnMgYW5kIHByb2R1Y3QgZ2FsbGVyaWVzKVxuICAkKCdpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tXCJdOm5vdCgucGx5cl9fdmlkZW8td3JhcHBlciBpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tXCJdKScpLndyYXAoJzxkaXYgY2xhc3M9XCJwbHlyX192aWRlby1lbWJlZFwiPjwvZGl2PicpO1xuICAkKCdpZnJhbWVbc3JjKj1cInZpbWVvLmNvbVwiXTpub3QoLnBseXJfX3ZpZGVvLXdyYXBwZXIgaWZyYW1lW3NyYyo9XCJ2aW1lby5jb21cIl0pJykud3JhcCgnPGRpdiBjbGFzcz1cInBseXJfX3ZpZGVvLWVtYmVkXCI+PC9kaXY+Jyk7XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBTdGFydCBvZiBjYXJ0LXJlbGF0ZWQgZnVuY3Rpb25hbGl0eVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuICBmdW5jdGlvbiBhamF4U3VibWl0Q2FydCgpIHtcbiAgICBjb25zdCAkY2FydCA9ICQoXCIjY2FydFwiKTtcbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiAnL2NhcnQvdXBkYXRlLmpzJyxcbiAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICBjYWNoZTogZmFsc2UsXG4gICAgICB0eXBlOiAncG9zdCcsXG4gICAgICBkYXRhOiAkY2FydC5zZXJpYWxpemUoKSxcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJlZnJlc2hDYXJ0KGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWpheFVwZGF0ZUNhcnQobGluZUlELCBxdWFudGl0eSwgcGFyZW50KSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogJy9jYXJ0L2NoYW5nZS5qcycsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3Bvc3QnLFxuICAgICAgZGF0YTogeyBxdWFudGl0eTogcXVhbnRpdHksIGxpbmU6IGxpbmVJRCB9LFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmVmcmVzaENhcnQoZGF0YSk7XG5cbiAgICAgICAgdmFyIGxpbmVJREluZGV4ID0gbGluZUlEIC0gMTtcblx0XHQgICAgdmFyICRpbnB1dCA9IHBhcmVudC5maW5kKFwiaW5wdXRbZGF0YS1saW5lLWlkPSdcIiArIGxpbmVJRCArIFwiJ11cIik7XG5cbiAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGNvcnJlY3QgYW1vdW50IG9mIHByb2R1Y3RzIGluIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5pdGVtc1tsaW5lSURJbmRleF0gPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgIHZhciB1cGRhdGVkX3F1YW50aXR5ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2Y
1XIgdXBkYXRlZF9xdWFudGl0eSA9IGRhdGEuaXRlbXNbbGluZUlESW5kZXhdLnF1YW50aXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocXVhbnRpdHkgPiAwICYmIHF1YW50aXR5ICE9IHVwZGF0ZWRfcXVhbnRpdHkpIHtcbiAgICAgICAgICBpZiAodXBkYXRlZF9xdWFudGl0eSA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgaXRlbXNfbGVmdF90ZXh0ID0gd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLml0ZW1zX2xlZnRfY291bnRfb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaXRlbXNfbGVmdF90ZXh0ID0gd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLml0ZW1zX2xlZnRfY291bnRfb3RoZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJCgnLndhcm5pbmctLXF1YW50aXR5JykucmVtb3ZlKCk7XG5cbiAgICAgICAgICB2YXIgd2FybmluZyA9IGBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgICAgICB3YXJuaW5nXG4gICAgICAgICAgICAgICAgd2FybmluZy0tcXVhbnRpdHlcbiAgICAgICAgICAgICAgICBhbmltYXRlZFxuICAgICAgICAgICAgICAgIGJvdW5jZUluXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICR7dXBkYXRlZF9xdWFudGl0eX0gJHtpdGVtc19sZWZ0X3RleHR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgJGlucHV0LnBhcmVudCgpLm5leHQoKS5hcHBlbmQod2FybmluZyk7XG4gICAgICAgICAgJGlucHV0LnZhbCh1cGRhdGVkX3F1YW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaENhcnQoY2FydCkge1xuICAgIGNvbnN0ICRjYXJ0QnRuID0gJChcIi5jYXJ0LWJ1dHRvbiBzcGFuXCIpO1xuICAgIGlmICgkY2FydEJ0biAmJiAkY2FydEJ0bi5sZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9ICRjYXJ0QnRuLnRleHQoKSB8fCAnMCc7XG4gICAgICB2Y
1XIgY2FydF9pdGVtc19odG1sID0gXCJcIjtcbiAgICAgIHZhciAkY2FydCA9ICQoXCIjY2FydCB1bFwiKTtcblxuICAgICAgJGNhcnRCdG4udGV4dCh2YWx1ZS5yZXBsYWNlKC9bMC05XSsvLGNhcnQuaXRlbV9jb3VudCkpO1xuICAgICAgJGNhcnQuZmluZCgnbGk6bm90KDpmaXJzdCknKS5yZW1vdmUoKTtcblxuICAgICAgaWYgKGNhcnQuaXRlbV9jb3VudCA9PSAwKSB7XG4gICAgICAgICRjYXJ0LmFwcGVuZCgnPGxpIGNsYXNzPVwiZW1wdHlfY2FydFwiPicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uZW1wdHlfY2FydCArICc8L2xpPicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJC5lYWNoKGNhcnQuaXRlbXMsIGZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7XG5cbiAgICAgICAgICB2YXIgbGluZV9pZCA9IGluZGV4ICsgMTtcblxuICAgICAgICAgIGxldCBkaXNjb3VudE1lc3NhZ2UgPSAnJztcblxuICAgICAgICAgIGxldCB1bml0UHJpY2luZ091dHB1dCA9ICcnO1xuXG4gICAgICAgICAgaWYgKGl0ZW0udW5pdF9wcmljZV9tZWFzdXJlbWVudCkge1xuICAgICAgICAgICAgdW5pdFByaWNpbmdPdXRwdXQgPSB3aW5kb3cucHJvZHVjdC51bml0UHJpY2luZyhpdGVtKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEaXNjb3VudHMgbG9naWNcbiAgICAgICAgICBpZiAoaXRlbS5kaXNjb3VudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgZGlzY291bnRBbW91bnQgPSBTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0uZGlzY291bnRzWzBdLmFtb3VudCwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKTtcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGl0ZW0uZGlzY291bnRzWzBdLnRpdGxlO1xuICAgICAgICAgICAgZGlzY291bnRNZXNzYWdlID0gYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vdGlmaWNhdGlvbi1kaXNjb3VudFwiPlxuICAgICAgICAgICAgICAgICR7d2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLmNhcnRfZGlzY291bnR9OiAke3RpdGxlfSAoLTxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke2Rpc2NvdW50QW1vdW50fTwvc3Bhbj4pXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1tLWxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiY2FydF9faXRlbVwiIGhyZWY9XCIke2l0ZW0udXJsfVwiPlxuICAgICAgICAgIGA7XG5cbiAgICAgICAgICBpZiAoaXRlbS5pbWFnZSkge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX2ltYWdlXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIke2l0ZW0uaW1hZ2UucmVwbGFjZSgvKFxcLlteLl0qKSQvLCBcIl9tZWRpdW0kMVwiKS5yZXBsYWNlKCdodHRwOicsICcnKX1cIiBhbHQ9XCIke2h0bWxFbmNvZGUoaXRlbS50aXRsZSl9XCIvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X19pbmZvXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X19kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAke2l0ZW0udGl0bGV9XG4gICAgICAgICAgYDtcblxuICAgICAgICAgIGlmKGl0ZW0ucHJvcGVydGllcykge1xuICAgICAgICAgICAgJC5lYWNoKGl0ZW0ucHJvcGVydGllcywgZnVuY3Rpb24odGl0bGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gJ29uJykge1xuICAgICAgICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICR7dGl0bGV9OiAke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW0uc2VsbGluZ19wbGFuX2FsbG9jYXRpb24gJiYgaXRlbS5zZWxsaW5nX3BsYW5fYWxsb2NhdGlvbi5zZWxsaW5nX3BsYW4pIHtcbiAgICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgICAgIDxicj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lLWl0ZW0gc2VsbGluZy1wbGFuXCI+XG4gICAgICAgICAgICAgICAgJHtpdGVtLnNlbGxpbmdfcGxhbl9hbGxvY2F0aW9uLnNlbGxpbmdfcGxhbi5uYW1lfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICBgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpdGVtLnByaWNlID4gaXRlbS5maW5hbF9wcmljZSkge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0uZmluYWxfbGluZV9wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndhc19wcmljZSBtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0ub3JpZ2luYWxfbGluZV9wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJ0X191bml0LXByaWNlXCI+XG4gICAgICAgICAgICAgICAgJHt1bml0UHJpY2luZ091dHB1dH1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX2Rpc2NvdW50XCI+XG4gICAgICAgICAgICAgICAgJHtkaXNjb3VudE1lc3NhZ2V9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FydF9pdGVtc19odG1sICs9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3ByaWNlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb25leVwiPlxuICAgICAgICAgICAgICAgICAgJHtTaG9waWZ5LmZvcm1hdE1vbmV5KGl0ZW0ucHJpY2UsICQ
1oJ2JvZHknKS5kYXRhKCdtb25leS1mb3JtYXQnKSl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydF9fdW5pdC1wcmljZVwiPlxuICAgICAgICAgICAgICAgICR7dW5pdFByaWNpbmdPdXRwdXR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcnRfX3F1YW50aXR5XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1taW51cyBtaW51c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgY2xhc3M9XCJxdWFudGl0eVwiIG5hbWU9XCJ1cGRhdGVzW11cIiBpZD1cInVwZGF0ZXNfJHtpdGVtLmlkfVwiIHZhbHVlPVwiJHtpdGVtLnF1YW50aXR5fVwiICBkYXRhLWxpbmUtaWQ9XCIke2xpbmVfaWR9XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXBsdXMgcGx1c1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGNhcnREaXNjb3VudHMgPSBjYXJ0LmNhcnRfbGV2ZWxfZGlzY291bnRfYXBwbGljYXRpb25zO1xuICAgICAgICB2Y
1XIgY2FydERpc2NvdW50TWVzc2FnZSA9IFwiXCI7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgY2FydERpc2NvdW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBhbW91bnQgPSBTaG9waWZ5LmZvcm1hdE1vbmV5KGNhcnREaXNjb3VudHNbaV0udG90YWxfYWxsb2NhdGVkX2Ftb3VudCwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKTtcbiAgICAgICAgICB2YXIgdGl0bGUgPSBjYXJ0RGlzY291bnRzW2ldLnRpdGxlO1xuICAgICAgICAgIGNhcnREaXNjb3VudE1lc3NhZ2UgPSAnPHAgY2xhc3M9XCJtbS1jb3VudGVyIHByaWNlIG1tLWRpc2NvdW50LWxhYmVsIG1tLWxpc3RpdGVtX190ZXh0XCI+JyArIHRpdGxlICsgJzxzcGFuPicgKyAnKC0gPHNwYW4gY2xhc3M9XCJtb25leVwiPicgKyBhbW91bnQgKyAnPC9zcGFuPiknICsgJzwvc3Bhbj4nICsgJzwvcD4nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhcnQuY2FydF9sZXZlbF9kaXNjb3VudF9hcHBsaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSAnPGxpIGNsYXNzPVwibW0tbGFiZWwgbW0tbGlzdGl0ZW1cIj4nICsgY2FydERpc2NvdW50TWVzc2FnZSArICc8L2xpPidcbiAgICAgICAgfVxuXG4gICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSBgXG4gICAgICAgICAgPGxpIGNsYXNzPVwibW0tbGFiZWwgbW0tbGlzdGl0ZW1cIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCIvY2FydFwiIGNsYXNzPVwiY2FydF9faXRlbS1zdWJ0b3RhbFwiPlxuICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5zdWJ0b3RhbH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW0tY291bnRlciBwcmljZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9uZXlcIj5cbiAgICAgICAgICAgICAgICAgICR7U2hvcGlmeS5mb3JtYXRNb25leShjYXJ0LnRvdGFsX3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICA8bGkgY2x
1hc3M9XCJtbS1zdWJ0aXRsZSBtbS1saXN0aXRlbVwiPlxuICAgICAgICBgO1xuXG4gICAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZGlzcGxheV9zcGVjaWFsX2luc3RydWN0aW9ucykge1xuICAgICAgICAgIHZhciBjYXJ0X25vdGUgPSBjYXJ0Lm5vdGUgPyBjYXJ0Lm5vdGUgOiAnJztcbiAgICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gJzx0ZXh0YXJlYSBpZD1cImNhcnQtbm90ZVwiIG5hbWU9XCJub3RlXCIgcm93cz1cIjJcIiBwbGFjZWhvbGRlcj1cIicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uY2FydF9ub3RlcyArICdcIiBjbGFzcz1cImNsZWFyZml4XCI+JyArIGNhcnRfbm90ZSArICc8L3RleHRhcmVhPic7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5kaXNwbGF5X3Rvc19jaGVja2JveCkge1xuICAgICAgICAgIGNhcnRfaXRlbXNfaHRtbCArPSAnPGFzaWRlIGNsYXNzPVwidG9zIHRvc19jaGVja2JveFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInRvc19hZ3JlZVwiIGlkPVwic2xpZGluZ19hZ3JlZVwiIHJlcXVpcmVkIC8+PGxhYmVsIGNsYXNzPVwidG9zX2xhYmVsXCIgZm9yPVwic2xpZGluZ19hZ3JlZVwiPiAnICtcbiAgICAgICAgICB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MudG9zX3JpY2h0ZXh0ICArICc8L2xhYmVsPjwvYXNpZGU+JztcbiAgICAgICAgfTtcblxuICAgICAgICBjYXJ0X2l0ZW1zX2h0bWwgKz0gJzxzcGFuIGNsYXNzPVwibW0tYWN0aW9uX2J1dHRvbnMgbW0tbGlzdGl0ZW1fX3RleHRcIj57JSBpZiBzZXR0aW5ncy5kaXNwbGF5X3ZpZXdfY2FydCAlfTxhIGhyZWY9XCInICsgd2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmNhcnRfdXJsICsgJ1wiIGNsYXNzPVwiYWN0aW9uX2J1dHRvbiBlZGl0X2NhcnQgbGVmdFwiPicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uZWRpdF9jYXJ0ICsgJzwvYT57JSBlbmRpZiAlfScgKyAnPGlucHV0IHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImFjdGlvbl9idXR0b24geyUgaWYgc2V0dGluZ3MuZGlzcGxheV92aWV3X2NhcnQgJX1yaWdodHslIGVsc2UgJX1mdWxsLXdpZHRoeyUgZW5kaWYgJX1cIiB2YWx1ZT1cIicgKyB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uY2hlY2tvdXQgKyAnXCIvPicgKyAnPC9zcGFuPicgKyAnPC9saT4nO1xuXG4gICAgICAgICRjYXJ0LmFwcGVuZChjYXJ0X2l0ZW1zX2h0bWwpO1xuICAgICAgICAkY2FydC5maW5kKCdsaS5jYXJ0X2l0ZW06bGFzdCcpLmFkZENsYXNzKCdsYXN0X2NhcnRfaXRlbScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4vLyBEb2N1bWVudCByZWFkeVxuJChmdW5jdGlvbigpIHtcbiAgdXRpbGl0aWVzLmxpc3RlbkZvclJlc2l6ZSgpO1xuICB1dGlsaXRpZXMuZW5hYmxlRGlzY2xvc3VyZSgpO1xuXG4gIHdpbmRvdy5sYXp5U2l6ZXNDb25maWcgPSB3aW5kb3cubGF6eVNpemVzQ29uZmlnIHx8IHt9O1xuXG4gIGxhenlTaXplc0NvbmZpZy5leHBhbmQgPSAzMDA7XG4gIGxhenlTaXplc0NvbmZpZy5sb2FkSGlkZGVuID0gZmFsc2U7XG5cbiAgJChcImJvZHlcIikub24oXCJjbGlja1wiLCAnLmNvbnRpbnVlJywgZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIgY2FydCA9ICQoXCIjY2FydFwiKS5kYXRhKCBcIm1tZW51XCIgKTtcbiAgICBjYXJ0LmNsb3NlKCk7XG5cbiAgICB2YXIgbmF2ID0gJChcIiNuYXZcIikuZGF0YSggXCJtbWVudVwiICk7XG4gICAgbmF2LmNsb3NlKCk7XG5cbiAgfSk7XG5cbiAgLy8gU2VhcmNoIHN1Ym1pdCB0cmlnZ2VyIGV2ZW50XG4gICQoJy5zZWFyY2gtZm9ybSAuc3VibWl0LXNlYXJjaCwgLnNlYXJjaC1mb3JtLS1tb2JpbGUgLnN1Ym1pdC1zZWFyY2gnKS5vbignY2xpY2sgdG91Y2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKS5zdWJtaXQoKTtcbiAgfSk7XG5cbiAgLy8gT2Zmc2NyZWVuIGNoZWNrIGZvciBkcm9wZG93biBtZW51c1xuXG4gICQoJy5zdWItbWVudScpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKXtcbiAgICBpZigkKHRoaXMpLmZpbmQoJy5kcm9wZG93bicpLmlzKCc6b2ZmLXJpZ2h0JykpIHtcbiAgICAgICQodGhpcykuZmluZCgnLmRyb3Bkb3duJykuYWRkQ2xhc3MoXCJkcm9wZG93bi0tYWxpZ25cIik7XG4gICAgfVxuICB9KTtcblxuICAkKCcuc3ViLW1lbnUnKS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCl7XG4gICAgaWYoJCh0aGlzKS5maW5kKCcuZHJvcGRvd24nKS5oYXNDbGFzcygnZHJvcGRvd24tLWFsaWduJykpIHtcbiAgICAgICQodGhpcykuZmluZCgnLmRyb3Bkb3duJykucmVtb3ZlQ2xhc3MoXCJkcm9wZG93bi0tYWxpZ25cIik7XG4gICAgfVxuICB9KTtcblxuICAvLyBBY2Nlc3NpYmlsaXR5IHRhYmJpbmdcbiAgd2luZG93LmhlYWRlci5vcGVuRHJvcGRvd24oKTtcblxuICAvLyBMb2FkIEFjY29yZGlvbnNcbiAgdmFyIGFsbFBhbmVscyA9ICQoJy5hY2NvcmRpb24gPiBkZCcpO1xuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhbGxQYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAkKGFsbFBhbmVsc1tpXSkuY3NzKCdoZWlnaHQnLCAkKGFsbFBhbmVsc1tpXSkub3V0ZXJIZWlnaHQoKSk7XG4gIH1cblxuICAgIGFsbFBhbmVscy5oaWRlKCk7XG5cbiAgJCgnLmFjY29yZGlvbiA+IGR0ID4gYScpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgIGlmKCEkKHRoaXMpLnBhcmVudCgpLm5leHQoKS5pcygnOnZpc2libGUnKSkge1xuICAgICAgYWxsUGFuZWxzLnNsaWRlVXAoKTtcbiAgICAgICQodGhpcykucGFyZW50KCkubmV4dCgpLnNsaWRlRG93bigpO1xuICAgICAgJCgnLmFjY29yZGlvbiBzbWFsbC5yaWdodCcpLmh0bWwoJyYjOTY2ODsnKTtcbiAgICAgICQodGhpcykuZmluZCgnc21hbGwucmlnaHQnKS5odG1sKCcmIzk2NjA7Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICAkKCcuYWNjb3JkaW9uIGRkOmZpcnN0LW9mLXR5cGUnKS5zaG93KCk7XG5cbiAgLy9Mb2FkIHNlY3Rpb25zXG4gIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5p
1dCgpO1xuICB3aW5kb3cuaGVhZGVyLmluaXQoKTtcbiAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gIHdpbmRvdy5tYXAuaW5pdCgpO1xuICB3aW5kb3cudmlkZW9UaGVtZS5pbml0KCk7XG4gIHdpbmRvdy5wcm9kdWN0LmluaXQoKTtcbiAgd2luZG93LmNvbGxlY3Rpb24uaW5pdCgpO1xuICB3aW5kb3cuY2FydC5pbml0KCk7XG4gIHdpbmRvdy5wcm9kdWN0Rm9ybUxpc3RlbmVycy5pbml0KCk7XG4gIHdpbmRvdy5mZWF0dXJlZF9wcm9tb3Rpb25zLmluaXQoKTtcbiAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gIHdpbmRvdy5ibG9ncy5pbml0KCk7XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5lbmFibGVfcHJlZGljdGl2ZV9zZWFyY2gpIHtcbiAgICB3aW5kb3cucHJlZGljdGl2ZVNlYXJjaC5pbml0KCk7XG4gIH1cblxuICB2YXIgJGpzU2VjdGlvbnMgPSAkKCcuc2hvcGlmeS1zZWN0aW9uW2NsYXNzKj1qc10nKTtcblxuICAvLyBMb29wIHRocm91Z2ggc2VjdGlvbnMgd2l0aCBqcyBjbGFzc2VzIGFuZCBsb2FkIHRoZW0gaW5cbiAgdmFyICRqc1NlY3Rpb25OYW1lcyA9ICRqc1NlY3Rpb25zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdFtpXS5zdWJzdHJpbmcoMCwgMikgPT09IFwianNcIil7XG4gICAgICAgIHZhciB0cmlnZ2VyQ2xhc3MgPSB0aGlzLmNsYXNzTGlzdFtpXTtcbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdKSB7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygnU2VjdGlvbjogJyArIHRyaWdnZXJDbGFzcyArICcgaGFzIGJlZW4gbG9hZGVkLicpXG4gICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uaW5pdCgkKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL2NvbnNvbGUud2FybignVWggb2gsICcgKyB0cmlnZ2VyQ2xhc3MgKyAnIGlzIHJlZmVyZW5jZWQgaW4gc2VjdGlvbiBzY2hlbWEgY2xhc3MsIGJ1dCBjYW4gbm90IGJlIGZvdW5kLiBNYWtlIHN1cmUgXCJ6X18nICsgdHJpZ2dlckNsYXNzICsgJy5qc1wiIGFuZCB3aW5kb3cuUFhVVGhlbWUuJyArIHRyaWdnZXJDbGFzcyArICcuaW5pdCgpIGZ1bmN0aW9uIGV4aXN0cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBvYmplY3RGaXRJbWFnZXMoKTtcblxuICBpZiAod2luZG93LlBYVVRoZW1lLmN1cnJlbmN5LnNoaXBwaW5nX2NhbGN1bGF0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1zaGlwcGluZ10nKSkge1xuICAgIGNvbnN0IHNoaXBwaW5nQ2FsY3VsYXRvciA9IG5ldyBTaGlwcGluZ0NhbGN1bGF0b3IoeyBlbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydC1zaGlwcGluZ10nKSB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUmVzcG9uc2l2ZSBWaWRlb3NcbiAgZW5hYmxlUmVzcG9uc2l2ZVZpZGVvV3JhcHBlcigpO1xuXG4gIHZhciAkaGVhZGVyID0gJChcIi5mZWF0dXJlX2ltYWdlIC5oZWFkZXJcIik7XG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5zZWFyY2hfX3N1Ym1pdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAkKHRoaXMpLnBhcmVudCgnZm9ybScpLnN1Ym1pdCgpO1xuICB9KTtcblxuICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnI3NlYXJjaC10b2dnbGUnLCBmdW5jdGlvbihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrZWQnKTtcblxuICAgICQoJy5zZWFyY2gtZm9ybS0taGVhZGVyJykuY3NzKCdwYWRkaW5nLXRvcCcsICQoJy5oZWFkZXInKS5oZWlnaHQoKSArIDUwICsgJ3B4Jyk7XG5cbiAgICBpZigkKCcjc2VhcmNoJykuaXMoXCI6dmlzaWJsZVwiKSAmJiAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgPT0gMCkge1xuICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5oZWFkZXJfYmFja2dyb3VuZCA9PSBmYWxzZSkge1xuICAgICAgICAkaGVhZGVyLnJlbW92ZUNsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkaGVhZGVyLmFkZENsYXNzKCdoZWFkZXItYmFja2dyb3VuZC0tdHJ1ZScpO1xuICAgIH1cblxuICAgIGlmKCQoJyNzZWFyY2gnKS5oYXNDbGFzcyhcImZhZGVJblwiKSkge1xuICAgICAgJCgnI3NlYXJjaCcpLnJlbW92ZUNsYXNzKFwiZmFkZUluXCIpLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnI3NlYXJjaCcpLnNob3coKS5hZGRDbGFzcyhcImZhZGVJblwiKTtcbiAgICAgIGNvbnN0IHNlYXJjaElucHV0ID0gJCgnI3NlYXJjaCcpLmZpbmQoJ1tkYXRhLXNlYXJjaC1pbnB1dF0nKTtcbiAgICAgIGNvbnN0IHNlYXJjaElucHV0TGVuZ3RoID0gc2VhcmNoSW5wdXQudmFsKCkubGVuZ3RoO1xuICAgICAgc2VhcmNoSW5wdXRbMF0uc2V0U2VsZWN0aW9uUmFuZ2Uoc2VhcmNoSW5wdXRMZW5ndGgsIHNlYXJjaElucHV0TGVuZ3RoKTtcbiAgICAgIHNlYXJjaElucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHNlYXJjaEZvcm0gPSAkKGUudGFyZ2V0KS5wYXJlbnRzKCcuc2VhcmNoLWZvcm0tLWhlYWRlcicpO1xuXG4gICAgICBpZihzZWFyY2hGb3JtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkKCcjc2VhcmNoJykucmVtb3ZlQ2xhc3MoXCJmYWRlSW5cIikuaGlkZSgpO1xuICAgICAgICBkb2
1N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSlcblxuICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGZsZXhzbGlkZXJcbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXI6bm90KC5ob21lcGFnZV9zbGlkZXIpJykuZmluZCgnbGknKS51bndyYXAoKTtcbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXI6bm90KC5ob21lcGFnZV9zbGlkZXIpJykuZmxpY2tpdHkoe1xuICAgIHBhZ2VEb3RzOiBmYWxzZSxcbiAgICBhdXRvUGxheTogNjAwMCxcbiAgICBpbWFnZXNMb2FkZWQ6IHRydWUsXG4gICAgbGF6eUxvYWQ6IDIsXG4gIH0pO1xuXG4gIHZhciBhcnJvd1NoYXBlID0gJzxzdmcgY2xhc3M9XCJmbGlja2l0eS1idXR0b24taWNvblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEzLjQ2IDI0LjA5XCI+PHRpdGxlPmZsaWNraXR5LWFycm93PC90aXRsZT48cG9seWdvbiBwb2ludHM9XCIxLjQxIDI0LjA5IDAgMjIuNjggMTAuNjMgMTIuMDUgMCAxLjQxIDEuNDEgMCAxMy40NiAxMi4wNSAxLjQxIDI0LjA5XCIvPjwvc3ZnPidcblxuICAkKCcuc2xpZGVyLCAuZmxleHNsaWRlcicpLmZpbmQoJy5mbGlja2l0eS1wcmV2LW5leHQtYnV0dG9uLm5leHQgLmZsaWNraXR5LWJ1dHRvbi1pY29uJykucmVwbGFjZVdpdGgoYXJyb3dTaGFwZSk7XG5cbiAgJCgnLnNsaWRlciwgLmZsZXhzbGlkZXInKS5maW5kKCcuZmxpY2tpdHktcHJldi1uZXh0LWJ1dHRvbi5wcmV2aW91cycpLmFkZENsYXNzKCdhcnJvdy1pcy1pbnZlcnNlJykuZmluZCgnLmZsaWNraXR5LWJ1dHRvbi1pY29uJykucmVwbGFjZVdpdGgoYXJyb3dTaGFwZSk7XG5cblxuICBpZiAod2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcyA9PSBmYWxzZSkge1xuICAgIC8vTGlnaHRib3ggZGVmYXVsdCBvcHRpb25zXG4gICAgLy9odHRwczovL2ZhbmN5YXBwcy5jb20vZmFuY3lib3gvMy9kb2NzLyNvcHRpb25zXG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy5hbmltYXRpb25FZmZlY3QgPSAnZmFkZSc7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy50cmFuc2l0aW9uRWZmZWN0ID0gJ3NsaWRlJztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmhhc2ggPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmluZm9iYXIgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLnRvb2xiYXIgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmFycm93cyA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubG9vcCA9IHRydWU7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy5zbWFsbEJ0biA9IHRydWU7XG4gICAgJC5mYW5jeWJveC5kZWZhdWx0cy53aGVlbCA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubGl2ZSA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMuem9vbSA9IGZhbHNlO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMuYnRuVHBsWydzbWFsbEJ0biddID0gJzxhIHRpdGxlPVwiQ2xvc2VcIiBkYXRhLWZhbmN5Ym94LWNsb3NlIGNsYXNzPVwiZmFuY3lib3gtaXRlbSBmYW5jeWJveC1jbG9zZVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIj48L2E+JztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS5wcmV2ZW50Q2FwdGlvbk92ZXJsYXAgPSBmYWxzZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS50b29sYmFyID0gdHJ1ZTtcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLm1vYmlsZS5idXR0b25zID0gWydjbG9zZSddO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubW9iaWxlLmNsaWNrU2xpZGUgPSAnY2xvc2UnO1xuICAgICQuZmFuY3lib3guZGVmYXVsdHMubW9iaWxlLmNsaWNrQ29udGVudCA9ICd6b29tJztcbiAgICAkLmZhbmN5Ym94LmRlZmF1bHRzLmFmdGVyTG9hZCA9IGZ1bmN0aW9uKGluc3RhbmNlLCBzbGlkZSkge1xuICAgICAgaWYgKGluc3RhbmNlLmN1cnJlbnQudHlwZSA9PSAnaW1hZ2UnKXtcbiAgICAgICAgc2xpZGUuJGNvbnRlbnQud3JhcElubmVyKCBcIjxkaXYgY2xhc3M9J2ZhbmN5Ym94LWltYWdlLXdyYXAnPjwvZGl2PlwiIClcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0YW5jZS5ncm91cC5sZW5ndGggPiAxKXtcbiAgICAgICAgc2xpZGUuJGNvbnRlbnQuZmluZCgnLmZhbmN5Ym94LWltYWdlLXdyYXAnKS5hcHBlbmQoJzxhIHRpdGxlPVwiUHJldmlvdXNcIiBjbGFzcz1cImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtbmF2IGZhbmN5Ym94LXByZXYgc3MtaWNvblwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBkYXRhLWZhbmN5Ym94LXByZXY+PHNwYW4gY2xhc3M9XCJpY29uLWNpcmNsZS1sZWZ0XCI+PC9zcGFuPjwvYT48YSB0aXRsZT1cIk5leHRcIiBjbGFzcz1cImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtbmF2IGZhbmN5Ym94LW5leHQgc3MtaWNvblwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBkYXRhLWZhbmN5Ym94LW5leHQ+PHNwYW4gY2xhc3M9XCJpY29uLWNpcmNsZS1yaWdodFwiPjwvc3Bhbj48L2E+JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaWdodGJveCBlZmZlY3QgZW5hYmxlZCBpZiByZWR1Y2UgbW90aW9uIGlzIG5vdCBlbmFibGVkXG4gICAgJCgnLmxpZ2h0Ym94JykuZmFuY3lib3goKTtcblxuICAgIC8vIEdhbGxlcnkgZmFuY3lib3ggaW5pdGlhbGl6YXRpb25cbiAgICAkKCdbcmVsPVwiZ2FsbGVyeVwiXScpLmZhbmN5Ym94KHtcbiAgICAgIGJhc2VDbGFzczogXCJnYWxsZXJ5LXNlY3Rpb25fX2xpZ2h0Ym94XCIsXG4gICAgICBjbGlja0NvbnRlbnQ6IFwibmV4dE9yQ2xvc2VcIlxuICAgIH0pO1xuXG4gICAgLy8gLy8gVHJpZ2dlciBmYW5jeWJveCBmbGlja2l0eSBwcm9kdWN0IGdhbGxlcnkgaW1hZ2VzXG4gICAgJCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbiAucHJvZHVjdC1nYWxsZXJ5X19pbWFnZSAuZmFuY3lib3gnKS5mYW5jeWJveCh7XG4gICAgICBiYXNlQ2xhc3M6ICdwcm9kdWN0LXNlY3Rpb25fX2xpZ2h0Ym94JyxcbiAgICAgIGNsaWNrQ29udGVudDogXCJuZXh0T3JDbG9zZVwiLFxuICAgICAgYmVmb3JlU2hvdzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIEdyYWIgdGhlIGZhbmN5Ym94IGVsZW1lbnQgdGhhdCBpcyBiZWluZyBjbGlja2VkXG4gICAgICAgI
1HZhciAkZmFuY3lib3hJbWFnZUVsZW1lbnQgPSAkKHRoaXMub3B0cy4kb3JpZyk7XG5cbiAgICAgICAgLy8gQWRkIGFsdCB0byBmYW5jeWJveCBpbWFnZVxuICAgICAgICB2YXIgaW1hZ2VBbHQgPSAkZmFuY3lib3hJbWFnZUVsZW1lbnQuZGF0YSgnYWx0Jyk7XG4gICAgICAgICQoJy5mYW5jeWJveC1pbWFnZScpLmF0dHIoJ2FsdCcsIGltYWdlQWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MubmV3c2xldHRlcl9wb3B1cCkge1xuICAgIG5ld3NsZXR0ZXJfcG9wdXAuaW5pdCgpO1xuICB9XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jb2xsZWN0aW9uX3N3YXRjaGVzKSB7d2luZG93LlBYVVRoZW1lXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLmxhcmdlLm1hdGNoZXMpIHtcbiAgICAgICQoJy50aHVtYm5haWwnKS5ob3ZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnLnN3YXRjaCBzcGFuJywgJCh0aGlzKSkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZigkKHRoaXMpLmRhdGEoXCJpbWFnZVwiKS5pbmRleE9mKFwibm8taW1hZ2VcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICQoJzxpbWcvPicpWzBdLnNyYyA9ICQodGhpcykuZGF0YShcImltYWdlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgJCgnLnN3YXRjaCBzcGFuJykuaG92ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmKCQodGhpcykuZGF0YShcImltYWdlXCIpLmluZGV4T2YoXCJuby1pbWFnZVwiKSA9PSAtMSkge1xuICAgICAgICAgICQodGhpcykucGFyZW50cygnLnRodW1ibmFpbCcpLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycsICQodGhpcykuZGF0YShcImltYWdlXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRhYnMgPSAkKCd1bC50YWJzJyk7XG4gIHRhYnMuZWFjaChmdW5jdGlvbihpKSB7XG4gICAgdmFyIHRhYiA9ICQodGhpcykuZmluZCgnPiBsaSA+IGEnKTtcbiAgICB0YWIuY2xpY2soZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIGNvbnRlbnRMb2NhdGlvbiA9ICQodGhpcykuYXR0cignaHJlZicpO1xuICAgICAgaWYoY29udGVudExvY2F0aW9uLmNoYXJBdCgwKT09XCIjXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0YWIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCd1bC50YWJzJykubmV4dCgpLmZpbmQoY29udGVudExvY2F0aW9uKS5zaG93KCkuY3NzKHsnZGlzcGxheSc6ICdibG9jayd9KS5hZGRDbGFzcygnYWN0aXZlJykuc2libGluZ3MoKS5oaWRlKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvL1NpZGViYXIgdG9nZ2xlXG5cbiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5tZW51LXRvZ2dsZScsIGZ1bmN0aW9uKGUpIHtcbiAgICB0b2dnbGVTaWRlYmFyTWVudXMoJCh0aGlzKSk7XG4gIH0pO1xuXG4gIHZhciBzaWRlYmFyVG91Y2hlZCA9IGZhbHNlO1xuICAkKGRvY3VtZW50KS5vbigndG91Y2hlbmQnLCAnLnRvZ2dsZSBzcGFuJywgZnVuY3Rpb24oZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUubWVkaWFfcXVlcmllcy5tZWRpdW0ubWF0Y2hlcyB8fCAkKHRoaXMpLnBhcmVudHMoJy5zaWRlYmFyJykuaGFzQ2xhc3MoJ3RvZ2dsZS1hbGwtLXRydWUnKSkge1xuICAgICAgdmFyICR0b2dnbGUgPSAkKHRoaXMpO1xuICAgICAgdG9nZ2xlU2lkZWJhckJsb2NrcygkdG9nZ2xlKTtcbiAgICAgIHNpZGViYXJUb3VjaGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcudG9nZ2xlIHNwYW4nLCBmdW5jdGlvbihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS5tZWRpYV9xdWVyaWVzLm1lZGl1bS5tYXRjaGVzIHx8ICQodGhpcykucGFyZW50cygnLnNpZGViYXInKS5oYXNDbGFzcygndG9nZ2xlLWFsbC0tdHJ1ZScpKSB7XG4gICAgICB2Y
1XIgJHRvZ2dsZSA9ICQodGhpcyk7XG4gICAgICBpZiAoIXNpZGViYXJUb3VjaGVkKSB7XG4gICAgICAgIHRvZ2dsZVNpZGViYXJCbG9ja3MoJHRvZ2dsZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gJChkb2N1bWVudCkub24oJ2tleXVwJywgJy50b2dnbGUgc3BhbicsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoISQoJ2JvZHknKS5oYXNDbGFzcygndXNlci1pcy10YWJiaW5nJykpIHJldHVybjtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAod2luZG93LlBYVVRoZW1lLm1lZGlhX3F1ZXJpZXMubWVkaXVtLm1hdGNoZXMgfHwgJCh0aGlzKS5wYXJlbnRzKCcuc2lkZWJhcicpLmhhc0NsYXNzKCd0b2dnbGUtYWxsLS10cnVlJykpIHtcbiAgICAgICAgdmFyICR0b2dnbGUgPSAkKHRoaXMpO1xuICAgICAgICBpZiAoIXNpZGViYXJUb3VjaGVkKSB7XG4gICAgICAgICAgdG9nZ2xlU2lkZWJhckJsb2NrcygkdG9nZ2xlKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmICgkKFwiI2NvbnRhY3RfZm9ybVwiKS5sZW5ndGgpIHtcbiAgICB2YXIgY29udGFjdEZvcm1SZXNwb25zZSA9IHVybCgnP2N1c3RvbWVyX3Bvc3RlZCcpO1xuICAgIGlmIChjb250YWN0Rm9ybVJlc3BvbnNlKXtcbiAgICAgICQoJ2h0bWwsYm9keScpLmFuaW1hdGUoe1xuICAgICAgICBzY3JvbGxUb3A6ICQoXCIjY29udGFjdF9mb3JtXCIpLm9mZnNldCgpLnRvcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5wcm9kdWN0X2Zvcm1fc3R5bGUgID09ICdzd2F0Y2hlcycpIHtcbiAgICAkKCcuc3dhdGNoIDpyYWRpbycpLmNoYW5nZShmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25JbmRleCA9ICQodGhpcykuY2xvc2VzdCgnLnN3YXRjaCcpLmF0dHIoJ2RhdGEtb3B0aW9uLWluZGV4Jyk7XG4gICAgICB2Y
1XIgb3B0aW9uVmFsdWUgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgJCh0aGlzKVxuICAgICAgICAuY2xvc2VzdCgnZm9ybScpXG4gICAgICAgIC5maW5kKCcuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcicpXG4gICAgICAgIC5lcShvcHRpb25JbmRleClcbiAgICAgICAgLnZhbChvcHRpb25WYWx1ZSlcbiAgICAgICAgLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0pO1xuICB9XG5cbiAgJCgnYm9keScpLm9uKFwiY2hhbmdlXCIsIFwiI2NhcnQgaW5wdXQucXVhbnRpdHlcIiwgZnVuY3Rpb24oKSB7XG4gICAgYWpheFVwZGF0ZUNhcnQoJCh0aGlzKS5kYXRhKCdsaW5lLWlkJyksICQodGhpcykudmFsKCksICQodGhpcykucGFyZW50cygnI2NhcnQnKSk7XG4gIH0pO1xuXG4gICQoJ2JvZHknKS5vbihcImNoYW5nZVwiLCBcIiNjYXJ0ICNjYXJ0LW5vdGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgYWpheFN1Ym1pdENhcnQoKTtcbiAgfSk7XG5cbiAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5jYXJ0X2FjdGlvbiA9PSAnYWpheCcpIHtcbiAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmFqYXgtc3VibWl0JywgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyICRhZGRUb0NhcnRGb3JtID0gJCh0aGlzKS5jbG9zZXN0KCdmb3JtJyk7XG4gICAgICB2YXIgJGFkZFRvQ2FydEJ0biA9ICRhZGRUb0NhcnRGb3JtLmZpbmQoJy5hZGRfdG9fY2FydCcpO1xuICAgICAgdGhpcy5yZWNpcGllbnRGb3JtID0gJGFkZFRvQ2FydEZvcm1bMF0ucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWZvcm1dJyk7XG5cbiAgICAgICQoJy53YXJuaW5nJykucmVtb3ZlKCk7XG5cbiAgICAgIGlmICh0aGlzLnJlY2lwaWVudE
1Zvcm0pIHtcbiAgICAgICAgdGhpcy5yZWNpcGllbnRGb3JtLmNsYXNzTGlzdC5yZW1vdmUoJ3JlY2lwaWVudC1mb3JtLS1oYXMtZXJyb3JzJyk7XG4gICAgICB9XG5cbiAgICAgICQuYWpheCh7XG4gICAgICAgIHVybDogJy9jYXJ0L2FkZC5qcycsXG4gICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgY2FjaGU6IGZhbHNlLFxuICAgICAgICBkYXRhOiAkYWRkVG9DYXJ0Rm9ybS5zZXJpYWxpemUoKSxcbiAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJGFkZFRvQ2FydEJ0bi5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICRhZGRUb0NhcnRCdG4uZmluZCgnc3BhbicpLnJlbW92ZUNsYXNzKFwiem9vbUluXCIpLmFkZENsYXNzKCdhbmltYXRlZCB6b29tT3V0Jyk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGl0ZW1EYXRhKSB7XG4gICAgICAgICAgJGFkZFRvQ2FydEJ0bi5maW5kKCdzcGFuJykudGV4dCh3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24ucHJvZHVjdF9hZGRfdG9fY2FydF9zdWNjZXNzKS5yZW1vdmVDbGFzcygnem9vbU91dCcpLmFkZENsYXNzKCdmYWRlSW4nKTtcblxuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAkYWRkVG9DYXJ0QnRuLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAkYWRkVG9DYXJ0QnRuLmZpbmQoJ3NwYW4nKS5hZGRDbGFzcyhcImZhZGVPdXRcIikudGV4dCgkYWRkVG9DYXJ0QnRuLmRhdGEoJ2xhYmVsJykpLnJlbW92ZUNsYXNzKCdmYWRlSW4nKS5yZW1vdmVDbGFzcyhcImZhZGVPdXRcIikuYWRkQ2xhc3MoJ3pvb21JbicpO1xuICAgICAgICAgIH0sIDEwMDApO1xuXG4gICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogJy9jYXJ0LmpzJyxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImpzb25cIixcbiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGNhcnQpIHtcbiAgICAgICAgICAgICAgcmVmcmVzaENhcnQoY2FydCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQuZmFuY3lib3guY2xvc2UoKTsgJCgnLmNhcnQtYnV0dG9uJykuY2xpY2soKTsgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChYTUxIdHRwUmVxdWVzdCkgPT4ge1xuICAgICAgICAgIHZhciByZXNwb25zZSA9IGV2YWwoJygnICsgWE1MSHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0ICsgJyknKTtcblxuICAgICAgICAgICQoJy53YXJuaW5nJykucmVtb3ZlKCk7XG5cbiAgICAgICAgICBsZXQgd2FybmluZztcblxuICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcnMgJiYgcmVzcG9uc2UuZXJyb3JzLmVtYWlsKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2lwaWVudE
1Zvcm0uY2xhc3NMaXN0LmFkZCgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybmluZyA9ICc8cCBjbGFzcz1cIndhcm5pbmcgYW5pbWF0ZWQgYm91bmNlSW5cIj4nICsgcmVzcG9uc2UuZGVzY3JpcHRpb24ucmVwbGFjZSgnQWxsIDEgJywgJ0FsbCAnKSArICc8L3A+JztcbiAgICAgICAgICAgICRhZGRUb0NhcnRGb3JtLmFmdGVyKHdhcm5pbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICRhZGRUb0NhcnRCdG4ucmVtb3ZlQXR0cignZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICAgICAgICAkYWRkVG9DYXJ0QnRuLmZpbmQoJ3NwYW4nKS50ZXh0KHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5wcm9kdWN0X2FkZF90b19jYXJ0KS5yZW1vdmVDbGFzcygnem9vbU91dCcpLmFkZENsYXNzKCd6b29tSW4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICAvLyBWYXJpYWJsZSByZXR1cm5zIHRydWUvZmFsc2UgaWYgcmVkdWNlZCBtb3Rpb24gaXMgZW5hYmxlZFxuICB2YXIgcmVkdWNlZE1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7XG5cbiAgLy8gRmluZCBpbnN0YW5jZXMgb2YgZmxleHNsaWRlciBhbmQgcGF1c2Ugc2xpZGVzaG93XG4gIGlmIChyZWR1Y2VkTW90aW9uKSB7XG4gICAgJCgnLmZsZXhzbGlkZXInKS5mbGV4c2xpZGVyKCdwYXVzZScpO1xuICB9XG5cbn0pO1xuXG5cbndpbmRvdy5zZWxlY3RDYWxsYmFjayA9IGZ1bmN0aW9uKHZhcmlhbnQsIHNlbGVjdG9yKSB7XG4gIHZhciAkcHJvZHVjdCA9ICQoJy5wcm9kdWN0LScgKyBzZWxlY3Rvci5wcm9kdWN0LmlkKTtcbiAgdmFyICRub3RpZnlfZm9ybSA9ICQoJy5ub3RpZnktZm9ybS0nICsgc2VsZWN0b3IucHJvZHVjdC5pZCk7XG4gIHZhciAkcHJvZHVjdEZvcm0gPSAkKCcucHJvZHVjdF9mb3JtJywgJHByb2R1Y3QpO1xuICB2YXIgdmFyaWFudEludmVudG9yeSA9ICRwcm9kdWN0Rm9ybS5kYXRhKCd2YXJpYW50LWludmVudG9yeScpO1xuXG4gIHZhciAkbm90aWZ5Rm9ybUlucHV0cyA9ICQoJy5ub3RpZnlfZm9ybV9faW5wdXRzJyk7XG5cbiAgdmFyIG5vdGlmeUVtYWlsID0gXCJ7eyAncHJvZHVjdHMubm90aWZ5X2Zvcm0uZW1haWwnIHwgdCB9fVwiO1xuICB2YXIgbm90aWZ5RW1haWxWYWx1ZSA9IFwie3sgY29udGFjdC5maWVsZHMuZW1haWwgfX1cIjtcbiAgdmFyIG5vdGlmeVNlbmQgPSBcInt7ICdwcm9kdWN0cy5ub3RpZnlfZm9ybS5zZW5kJyB8IHQgfX1cIjtcblxuICBpZih2YXJpYW50KSB7XG4gICAgaWYodmFyaWFudC5uYW1lICE9IG51bGwpIHtcbiAgICAgIHZhciBub3RpZnlNZXNzYWdlID0gJG5vdGlmeUZvcm1JbnB1dHMuZGF0YSgnbm90aWZ5LW1lc3NhZ2UnKSArICcgLSAnICsgdmFyaWFudC5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB2Y
1XIgbm90aWZ5TWVzc2FnZSA9ICRub3RpZnlGb3JtSW5wdXRzLmRhdGEoJ25vdGlmeS1tZXNzYWdlJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCRub3RpZnlGb3JtSW5wdXRzLmhhc0NsYXNzKCdjdXN0b21lci0tdHJ1ZScpKSB7XG4gICAgdmFyIG5vdGlmeUN1c3RvbWVyRW1haWwgPSAkbm90aWZ5Rm9ybUlucHV0cy5kYXRhKCdjdXN0b21lci1lbWFpbCcpO1xuICAgIHZhciBub3RpZnlFbWFpbElucHV0ID0gJzxpbnB1dCByZXF1aXJlZCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cIm5vdGlmeV9lbWFpbFwiIG5hbWU9XCJjb250YWN0W2VtYWlsXVwiIGlkPVwiY29udGFjdFtlbWFpbF1cIiB2YWx1ZT1cIicrIG5vdGlmeUN1c3RvbWVyRW1haWwgKydcIiAvPidcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm90aWZ5RW1haWxJbnB1dCA9ICc8aW5wdXQgcmVxdWlyZWQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJub3RpZnlfZW1haWxcIiBuYW1lPVwiY29udGFjdFtlbWFpbF1cIiBpZD1cImNvbnRhY3RbZW1haWxdXCIgcGxhY2Vob2xkZXI9XCInKyBub3RpZnlFbWFpbCArJ1wiIHZhbHVlPVwiJysgbm90aWZ5RW1haWxWYWx1ZSArJ1wiIC8+JztcbiAgfVxuICB2YXIgbm90aWZ5Rm9ybUhUTUwgPSBub3RpZnlFbWFpbElucHV0Kyc8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJjaGFsbGVuZ2VcIiB2YWx1ZT1cImZhbHNlXCIgLz48aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJjb250YWN0W2JvZHldXCIgY2xhc3M9XCJub3RpZnlfZm9ybV9tZXNzYWdlXCIgZGF0YS1ib2R5PVwiJysgbm90aWZ5TWVzc2FnZSArJ1wiIHZhbHVlPVwiJysgbm90aWZ5TWVzc2FnZSArJ1wiIC8+PGlucHV0IGNsYXNzPVwiYWN0aW9uX2J1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIicrIG5vdGlmeVNlbmQgKyAnXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjBweFwiIC8+JztcblxuICAvLyBJbWFnZSB2YXJpYW50IGZlYXR1cmVcbiAgaWYgKHZhcmlhbnQgJiYgdmFyaWFudC5mZWF0dXJlZF9pbWFnZSAmJiAkcHJvZHVjdC5pcyhcIjp2aXNpYmxlXCIpKSB7XG4gICAgdmFyICRzbGlkZXJzID0gJCgnLnByb2R1Y3QtZ2FsbGVyeV9fbWFpbicsICRwcm9kdWN0KTtcbiAgICAkc2xpZGVycy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyICRzbGlkZXIgPSAkKHRoaXMpO1xuICAgICAgdmFyICRzbGlkZXJJbnN0YW5jZSA9IEZsaWNraXR5LmRhdGEodGhpcyk7XG4gICAgICBpZiAoJHNsaWRlci5pcyhcIjp2aXNpYmxlXCIpICYmICRzbGlkZXJJbnN0YW5jZSAhPSB1bmRlZmluZWQgKSB7XG4gICAgICAgIHZhciBpbmRleCA9ICQoJ1tkYXRhLWltYWdlLWlkPVwiJyArIHZhcmlhbnQuZmVhdHVyZWRfaW1hZ2UuaWQgKyAnXCJdJykuZGF0YSgnaW5kZXgnKTtcbiAgICAgICAgJHNsaWRlckluc3RhbmNlLnNlbGVjdCggaW5kZXgsIGZhbHNlLCB0cnVlICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAodmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50SW52ZW50b3J5KSB7XG4gICAgICB2Y
1XJpYW50SW52ZW50b3J5LmZvckVhY2goZnVuY3Rpb24odil7XG4gICAgICAgIGlmICh2LmlkID09PSB2YXJpYW50LmlkKSB7XG4gICAgICAgICAgdmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPSB2LmludmVudG9yeV9xdWFudGl0eTtcbiAgICAgICAgICB2YXJpYW50LmludmVudG9yeV9tYW5hZ2VtZW50ID0gdi5pbnZlbnRvcnlfbWFuYWdlbWVudDtcbiAgICAgICAgICB2YXJpYW50LmludmVudG9yeV9wb2xpY3kgPSB2LmludmVudG9yeV9wb2xpY3k7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgICQoJy5za3Ugc3BhbicsICRwcm9kdWN0KS50ZXh0KHZhcmlhbnQuc2t1KTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MucHJvZHVjdF9mb3JtX3N0eWxlICA9PSAnc3dhdGNoZXMnKSB7XG4gICAgICBmb3IgKGxldCBpPTAsbGVuZ3RoPXZhcmlhbnQub3B0aW9ucy5sZW5ndGg7IGk8bGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhZGlvQnV0dG9uID0gJHByb2R1Y3RGb3JtLmZpbmQoJy5zd2F0Y2hbZGF0YS1vcHRpb24taW5kZXg9XCInICsgZXNjYXBlKGkpICsgJ1wiXSA6cmFkaW9bdmFsdWU9XCInICsgdmFyaWFudC5vcHRpb25zW2ldLnJlcGxhY2UoL1xcXCIvZywnXFxcXFwiJykgKydcIl0nKTtcbiAgICAgICAgaWYgKHJhZGlvQnV0dG9uLmxlbmd0aCkge1xuICAgICAgICAgIHJhZGlvQnV0dG9uLmdldCgwKS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgY29uc3QgJHVuaXRQcmljZSA9ICQoJy5wcm9kdWN0LWRldGFpbHNfX3VuaXQtcHJpY2UnLCAkcHJvZHVjdCk7XG4gICR1bml0UHJpY2UucmVtb3ZlQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG5cbiAgaWYgKHZhcmlhbnQgJiYgdmFyaWFudC5hdmFpbGFibGUgPT0gdHJ1ZSkge1xuXG4gICAgaWYodmFyaWFudC5wcmljZSA8IHZhcmlhbnQuY29tcGFyZV9hdF9wcmljZSl7XG4gICAgICAkKCcud2FzX3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJzxzcGFuIGNsYXNzPVwibW9uZXlcIj4nICsgU2hvcGlmeS5mb3JtYXRNb25leSh2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UsICQoJ2JvZHknKS5kYXRhKCdtb25leS1mb3JtYXQnKSkgKyAnPC9zcGFuPicpO1xuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkuYWRkQ2xhc3MoJ3NhbGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLndhc19wcmljZScsICRwcm9kdWN0KS5odG1sKCcnKVxuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3NhbGUnKTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfbWFuYWdlbWVudCAmJiB2YXJpYW50LmludmVudG9yeV9xdWFudGl0eSA+IDApIHtcbiAgICAgIGlmICh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZGlzcGxheV9pbnZlbnRvcnlfbGVmdCkge1xuICAgICAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPT0gMSkge1xuICAgICAgICAgIHZhciBpdGVtc19sZWZ0X3RleHQgPSB3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uaXRlbXNfbGVmdF9jb3VudF9vbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGl0ZW1zX2xlZnRfdGV4dCA9IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5pdGVtc19sZWZ0X2NvdW50X290aGVyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnZlbnRvcnlUaHJlc2hvbGQgPSB3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuaW52ZW50b3J5X3RocmVzaG9sZDtcblxuICAgICAgICBpZiAodmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkgPD0gaW52ZW50b3J5VGhyZXNob2xkICkge1xuICAgICAgICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLmh0bWwoXCI8cD48ZW0+XCIgKyB2YXJpYW50LmludmVudG9yeV9xdWFudGl0eSArIFwiIFwiICsgaXRlbXNfbGVmdF90ZXh0ICsgXCI8L2VtPjwvcD5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCgnLml0ZW1zX2xlZnQnLCAkcHJvZHVjdCkuaHRtbChcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5saW1pdF9xdWFudGl0eSkge1xuICAgICAgICBpZih2YXJpYW50LmludmVudG9yeV9wb2x
1pY3kgPT0gXCJkZW55XCIpIHtcbiAgICAgICAgICAkKCcucXVhbnRpdHknLCAkcHJvZHVjdCkuYXR0cignbWF4JywgdmFyaWFudC5pbnZlbnRvcnlfcXVhbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLnRleHQoJycpO1xuICAgICAgJCgnLnF1YW50aXR5JywgJHByb2R1Y3QpLnJlbW92ZUF0dHIoJ21heCcpO1xuICAgIH1cblxuICAgIC8vIEVtcHR5IHNvbGQgb3V0IHRleHRcbiAgICAkKCcuc29sZF9vdXQnLCAkcHJvZHVjdCkudGV4dCgnJyk7XG5cbiAgICAvLyBTaG93IHByaWNlLCBvdGhlcndpc2UsIHNob3cgZnJlZSBwcmljZSB0ZXh0XG4gICAgaWYgKHZhcmlhbnQucHJpY2UgPiAwKSB7XG4gICAgICAkKCcuY3VycmVudF9wcmljZScsICRwcm9kdWN0KS5odG1sKCc8c3BhbiBjbGFzcz1cIm1vbmV5XCI+JyArIFNob3BpZnkuZm9ybWF0TW9uZXkodmFyaWFudC5wcmljZSwgJCgnYm9keScpLmRhdGEoJ21vbmV5LWZvcm1hdCcpKSArICc8L3NwYW4+Jyk7XG4gICAgICBpZiAod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAkdW5pdFByaWNlLmh0bWwod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHVuaXRQcmljZS5hZGRDbGFzcygncHJvZHVjdC1kZXRhaWxzX191bml0LXByaWNlLS1oaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkuaHRtbCh3aW5kb3cuUFhVVGhlbWUudGhlbWVfc2V0dGluZ3MuZnJlZV9wcmljZV90ZXh0KTtcbiAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgfVxuXG4gICAgJCgnLm1vZGFsX3ByaWNlJywgJHByb2R1Y3QpLnJlbW92ZUNsYXNzKCdtb2RhbF9wcmljZS0tc29sZC1vdXQnKVxuXG4gICAgJCgnLmFkZF90b19jYXJ0JywgJHByb2R1Y3QpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJykuZmluZCgnc3BhbicpLnRleHQoJCgnLmFkZF90b19jYXJ0JywgJHByb2R1Y3QpLmRhdGEoJ2xhYmVsJykpO1xuXG4gICAgJCgnLmN1cnJlbnRfcHJpY2UnKS5zaG93KCk7XG4gICAgJCgnLndhc19wcmljZScpLnNob3coKTtcblxuICAgIC8vIEhpZGUgdGhlIGJhY2sgaW4gc3RvY2sgbm90aWZpY2F0aW9uIGZvcm1cbiAgICAkbm90aWZ5X2Zvcm0uaGlkZSgpO1xuXG4gICAgLy8gU2hvdyB0aGUgcXVhbnRpdHkgZmllbGRcbiAgICAkKCcucHVyY2hhc2UtZGV0YWlsc19fcXVhbnRpdHknLCAkcHJvZHVjdCkuc2hvdygpO1xuXG4gICAgLy8gUmVtb3ZlIGRpc2FibGUgZnJvbSBhY3Rpb24gYnV0dG9uc1xuICAgICQoJy5hdGMtYnRuLWNvbnRhaW5lcicsICRwcm9kdWN0KS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcblxuICB9IGVsc2Uge1xuICAgIHZhciBtZXNzYWdlID0gdmFyaWFudCA/IHdpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5wcm9kdWN0X3NvbGRfb3V0IDogd2luZG93LlBYVVRoZW1lLnRyYW5zbGF0aW9uLnByb2R1Y3RfdW5hdmFpbGFibGU7XG5cbiAgICAvLyBIaWRlIHRoZSBxdWFudGl0eSBmaWVsZFxuICAgICQoJy5wdXJjaGFzZS1kZXRhaWxzX19xdWFudGl0eScsICRwcm9kdWN0KS5oaWRlKCk7XG5cbiAgICAvLyBTaG93IHRoZSBwcmljZSBhbmQgY2hhbmdlIHRoZSBhZGQgdG8gY2FydCBhbmQgc29sZCBvdXQgdGV4dFxuICAgICQoJy5tb2RhbF9wcmljZScsICRwcm9kdWN0KS5hZGRDbGFzcygnbW9kYWxfcHJpY2UtLXNvbGQtb3V0JylcbiAgICAkKCcud2FzX3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJycpO1xuICAgICQoJy5pdGVtc19sZWZ0JywgJHByb2R1Y3QpLnRleHQoJycpO1xuICAgICQoJy5xdWFudGl0eScsICRwcm9kdWN0KS5yZW1vdmVBdHRyKCdtYXgnKTtcbiAgICAkKCcuc29sZF9vdXQnLCAkcHJvZHVjdCkudGV4dCgnIC0gJyArIG1lc3NhZ2UpO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgYWRkIHRvIGNhcnQgYnV0dG9uIGFuZCBTaG9waWZ5IHBheW1lbnQgYnV0dG9uIHdoZW4gYSB2YXJpYW50IGlzIHNvbGQgb3V0XG4gICAgJCgnLmF0Yy1idG4tY29udGFpbmVyJywgJHByb2R1Y3QpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICQoJy5hZGRfdG9fY2FydCcsICRwcm9kdWN0KS5hZGRDbGFzcygnZGlzYWJsZWQnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLmZpbmQoJ3NwYW4nKS50ZXh0KG1lc3NhZ2UpO1xuXG4gICAgLy9IaWRlIHRoZSBiYWNrIGluIHN0b2NrIG5vdGlmaWNhdGlvbiBmb3JtXG4gICAgJG5vdGlmeV9mb3JtLmhpZGUoKTtcbiAgICAkbm90aWZ5Rm9ybUlucHV0cy5lbXB0eSgpO1xuXG4gICAgaWYgKHZhcmlhbnQgJiYgIXZhcmlhbnQuYXZhaWxhYmxlKSB7XG4gICAgICAkKCcuY3VycmVudF9wcmljZScpLnNob3coKTtcbiAgICAgICQoJy53YXNfcHJpY2UnKS5zaG93KCk7XG4gICAgICAvLyBTaG93IHRoZSB2YXJpYW50IHByaWNlLCBvdGhlcndpc2UsIHNob3cgdGhlIGZyZWUgcHJpY2UgdGV4dFxuICAgICAgaWYgKHZhcmlhbnQucHJpY2UgPiAwKSB7XG4gICAgICAgICQoJy5jdXJyZW50X3ByaWNlJywgJHByb2R1Y3QpLmh0bWwoJzxzcGFuIGNsYXNzPVwibW9uZXlcIj4nICsgU2hvcGlmeS5mb3JtYXRNb25leSh2YXJpYW50LnByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpICsgJzwvc3Bhbj4nKTtcbiAgICAgICAgaWYgKHdpbmRvdy5wcm9kdWN0LnVuaXRQcmljaW5nKHZhcmlhbnQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAkdW5pdFByaWNlLmh0bWwod2luZG93LnByb2R1Y3QudW5pdFByaWNpbmcodmFyaWFudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJy5jdXJyZW50X3ByaWNlJywgJHByb2R1Y3QpLmh0bWwod2luZG93LlBYVVRoZW1lLnRoZW
11lX3NldHRpbmdzLmZyZWVfcHJpY2VfdGV4dCk7XG4gICAgICAgICR1bml0UHJpY2UuYWRkQ2xhc3MoJ3Byb2R1Y3QtZGV0YWlsc19fdW5pdC1wcmljZS0taGlkZGVuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gYSB2YXJpYW50IGlzIHNvbGQgb3V0IGJ1dCBvbiBzYWxlXG4gICAgICBpZih2YXJpYW50LnByaWNlIDwgdmFyaWFudC5jb21wYXJlX2F0X3ByaWNlKXtcbiAgICAgICAgJCgnLndhc19wcmljZScsICRwcm9kdWN0KS5odG1sKCc8c3BhbiBjbGFzcz1cIm1vbmV5XCI+JyArIFNob3BpZnkuZm9ybWF0TW9uZXkodmFyaWFudC5jb21wYXJlX2F0X3ByaWNlLCAkKCdib2R5JykuZGF0YSgnbW9uZXktZm9ybWF0JykpICsgJzwvc3Bhbj4nKTtcbiAgICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkuYWRkQ2xhc3MoJ3NhbGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoJy53YXNfcHJpY2UnLCAkcHJvZHVjdCkuaHRtbCgnJylcbiAgICAgICAgJCgnLmN1cnJlbnRfcHJpY2UnLCAkcHJvZHVjdCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3NhbGUnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyB0aGUgYmFjayBpbiBzdG9jayBub3RpZmljYXRpb24gZm9ybVxuICAgICAgJG5vdGlmeV9mb3JtLmZhZGVJbigpO1xuICAgICAgJG5vdGlmeUZvcm1JbnB1dHMuZW1wdHkoKTtcbiAgICAgICRub3RpZnlGb3JtSW5wdXRzLmFwcGVuZChub3RpZnlGb3JtSFRNTCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJy5zb2xkX291dCcsICRwcm9kdWN0KS50ZXh0KG1lc3NhZ2UpO1xuICAgICAgJHVuaXRQcmljZS5hZGRDbGFzcygncHJvZHVjdC1kZXRhaWxzX191bml0LXByaWNlLS1oaWRkZW4nKVxuICAgICAgLy8gV2hlbiBhIHZhcmlhbnQgaXMgc3BlY2lmaWNhbGx5IHVuYXZhaWxhYmxlXG4gICAgICAkKCcuY3VycmVudF9wcmljZScpLmhpZGUoKTtcbiAgICAgICQoJy53YXNfcHJpY2UnKS5oaWRlKCk7XG4gICAgfVxuXG4gIH1cblxuICAkcHJvZHVjdEZvcm0ucmVtb3ZlQ2xhc3MoXCJpbml0XCIpO1xufTtcblxuZnVuY3Rpb24gaHRtbEVuY29kZSh2YWx1ZSl7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAkKCc8ZGl2Lz4nKS50ZXh0KHZhbHVlKS5odG1sKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cblxud2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IgPSBmdW5jdGlvbihzZWxlY3RvckluZGV4LCBwYXJlbnQpIHtcblxuICBzd2l0Y2ggKHNlbGVjdG9ySW5kZXgpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2Y
1XIga2V5ID0gJ3Jvb3QnO1xuICAgICAgdmFyIHNlbGVjdG9yID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDApJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICB2YXIga2V5ID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDApJykudmFsKCk7XG4gICAgICB2YXIgc2VsZWN0b3IgPSAkKHBhcmVudCArICcgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMSknKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciBrZXkgPSAkKHBhcmVudCArICcgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMCknKS52YWwoKTtcbiAgICAgIGtleSArPSAnIC8gJyArICQocGFyZW50ICsgJyAuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcjplcSgxKScpLnZhbCgpO1xuICAgICAgdmFyIHNlbGVjdG9yID0gJChwYXJlbnQgKyAnIC5zaW5nbGUtb3B0aW9uLXNlbGVjdG9yOmVxKDIpJyk7XG4gIH1cblxuICB2YXIgYXZhaWxhYmxlT3B0aW9ucyA9IFNob3BpZnkub3B0aW9uc01hcFtrZXldO1xuXG4gICQocGFyZW50ICsgJyAuc3dhdGNoW2RhdGEtb3B0aW9uLWluZGV4PVwiJyArIHNlbGVjdG9ySW5kZXggKyAnXCJdIC5zd2F0Y2gtZWxlbWVudCcpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaWYgKCQuaW5BcnJheSgkKHRoaXMpLmF0dHIoJ2RhdGEtdmFsdWUnKSwgYXZhaWxhYmxlT3B0aW9ucykgIT09IC0xKSB7XG4gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdzb2xkb3V0JykuZmluZCgnOnJhZGlvJykucmVtb3ZlQXR0cignZGlzYWJsZWQnLCdkaXNhYmxlZCcpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdzb2xkb3V0JykuZmluZCgnOnJhZGlvJykucmVtb3ZlQXR0cignY2hlY2tlZCcpLmF0dHIoJ2Rpc2FibGVkJywnZGlzYWJsZWQnKTtcbiAgICB9XG4gIH0pO1xuICBzZWxlY3Rvci50cmlnZ2VyKCdjaGFuZ2UnKTtcblxufTtcblxuLyogTGlua2VkIE9wdGlvbiBTZWxlY3RvcnMgKi9cblNob3BpZnkubGlua09wdGlvblNlbGVjdG9ycyA9IGZ1bmN0aW9uKHByb2R1Y3QsIHBhcmVudCkge1xuICAgIC8vIEJ1aWxkaW5nIG91ciBtYXBwaW5nIG9iamVjdC5cbiAgICBTaG9waWZ5Lm9wdGlvbnNNYXAgPSB7fTtcbiAgICBmb3IgKGxldCBpPTA7IGk8cHJvZHVjdC52YXJpYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzW2ldO1xuICAgICAgaWYgKHZhcmlhbnQuYXZhaWxhYmxlKSB7XG4gICAgICAgIC8vIEdhdGhlcmluZyB2YWx1ZXMgZm9yIHRoZSAxc3QgZHJvcC1kb3duLlxuICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBbJ3Jvb3QnXSA9IFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddIHx8IFtdO1xuICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBbJ3Jvb3QnXS5wdXNoKHZhcmlhbnQub3B0aW9uMSk7XG4gICAgICAgIFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddID0gU2hvcGlmeS51bmlxKFNob3BpZnkub3B0aW9uc01hcFsncm9vdCddKTtcbiAgICAgICAgLy8gR2F0aGVyaW5nIHZhbHVlcyBmb3IgdGhlIDJuZCBkcm9wLWRvd24uXG4gICAgICAgIGlmIChwcm9kdWN0Lm9wdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBrZXkgPSB2YXJpYW50Lm9wdGlvbjE7XG4gICAgICAgICAgU2hvcGlmeS5vcHRpb25zTWFwW2tleV0gPSBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSB8fCBbXTtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XS5wdXNoKHZhcmlhbnQub3B0aW9uMik7XG4gICAgICAgICAgU2hvcGlmeS5vcHRpb25zTWFwW2tleV0gPSBTaG9waWZ5LnVuaXEoU2hvcGlmeS5vcHRpb25zTWFwW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdhdGhlcmluZyB2YWx1ZXMgZm9yIHRoZSAzcmQgZHJvcC1kb3duLlxuICAgICAgICBpZiAocHJvZHVjdC5vcHRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgIHZhciBrZXkgPSB2YXJpYW50Lm9wdGlvbjEgKyAnIC8gJyArIHZhcmlhbnQub3B0aW9uMjtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSA9IFNob3BpZnkub3B0aW9uc01hcFtrZXldIHx8IFtdO1xuICAgICAgICAgIFNob3BpZnkub3B0aW9uc01hcFtrZXldLnB1c2godmFyaWFudC5vcHRpb24zKTtcbiAgICAgICAgICBTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSA9IFNob3BpZnkudW5pcShTaG9waWZ5Lm9wdGlvbnNNYXBba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVXBkYXRlIG9wdGlvbnMgcmlnaHQgYXdheS5cbiAgICB3aW5kb3cuU2hvcGlmeS51cGRhdGVPcHRpb25zSW5TZWxlY3RvcigwLCBwYXJlbnQpO1xuICAgIGlmIChwcm9kdWN0Lm9wdGlvbnMubGVuZ3RoID4gMSkgd2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IoMSwgcGFyZW50KTtcbiAgICBpZiAocHJvZHVjdC5vcHRpb25zLmxlbmd0aCA9PT0gMykgd2luZG93LlNob3BpZnkudXBkYXRlT3B0aW9uc0luU2VsZWN0b3IoMiwgcGFyZW50KTtcbiAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBpbiB0aGUgZmlyc3QgZHJvcGRvd24uXG4gICAgJChwYXJlbnQgKyBcIiAuc2luZ2xlLW9wdGlvbi1zZWxlY3RvcjplcSgwKVwiKS5jaGFuZ2UoZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cuU2hvcGlmeS51cGRhdGVPcHRpb25zSW5TZWxlY3RvcigxLCBwYXJlbnQpO1xuICAgICAgaWYgKHByb2R1Y3Qub3B0aW9ucy5sZW5ndGggPT09IDMpIHdpbmRvdy5TaG9waWZ5LnVwZGF0ZU9wdGlvbnNJblNlbGVjdG9yKDIsIHBhcmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBpbiB0aGUgc2Vjb25kIGRyb3Bkb3duLlxuICAgICQocGFyZW50ICsgXCIgLnNpbmdsZS1vcHRpb24tc2VsZWN0b3I6ZXEoMSlcIikuY2hhbmdlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2R1Y3Qub3B0aW9ucy5sZW5ndGggPT09IDMpIHdpbmRvdy5TaG9waWZ5LnVwZGF0ZU9wdGlvbnNJblNlbGVjdG9yKDIsIHBhcmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn07XG5cbi8vIExvYWRzIGluIHNjcmlwdCB3aGVuIGNhbGxlZFxudmFyIGxvYWRTY3JpcHQgPSBmdW5jdGlvbiAobmFtZSwgdXJsLCBjYWxsYmFjaykge1xuICBpZiAod2luZG93LlBYVVRoZW1lW25hbWVdKSB7XG4gICAgY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLFxuICAgICAgc3VjY2VzczogY2FsbGJhY2ssXG4gICAgICBhc3luYzogZmFsc2VcbiAgICB9KTtcbiAgfVxufVxuXG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpibG9jazpzZWxlY3QnLCBmdW5jdGlvbihlKXtcblxuICAgI
1HZhciBibG9ja0lkID0gZS5kZXRhaWwuYmxvY2tJZDtcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXNsaWRlc2hvdycpKXtcbiAgICAgIHdpbmRvdy5QWFVUaGVtZS5qc1NsaWRlc2hvdy5ibG9ja1NlbGVjdChibG9ja0lkLCAkcGFyZW50U2VjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmZpbmQoJy5tYXAtLWNvbnRhaW5lcicpLmxlbmd0aCkge1xuICAgICAgd2luZG93Lm1hcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmZpbmQoJy5wYXJhbGxheC1iYW5uZXInKSkge1xuICAgICAgJCh0aGlzKS5maW5kKCcucGFyYWxsYXhfX2NvbnRhaW5lciA+IC5wYXJhbGxheCcpLnVud3JhcCgpO1xuICAgICAgbmV3IHVuaXZlcnNhbFBhcmFsbGF4KCkuaW5pdCgpO1xuICAgIH1cblxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdmFyICRwYXJlbnRTZWN0aW9uID0gJCgnI3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1zbGlkZXNob3cnKSl7XG4gICAgICB3aW5kb3cuUFhVVGhlbWUuanNTbGlkZXNob3cuYmxvY2tEZXNlbGVjdCgkcGFyZW50U2VjdGlvbik7XG4gICAgfVxuXG59KTtcblxuJChkb2N1bWVudClcbiAgLm9uKCdzaG9waWZ5OnNlY3Rpb246bG9hZCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgLy8gU2hvcGlmeSBzZWN0aW9uIGFzIGpRdWVyeSBvYmplY3RcbiAgICB2YXIgJHNlY3Rpb24gPSAkKGUudGFyZ2V0KTtcblxuICAgIC8vIFZhbmlsbGEganMgc2VsZWN0aW9uIG9mIFNob3BpZnkgc2VjdGlvblxuICAgIHZhciBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIHZhciBzZWN0aW9uT2JqZWN0VXJsID0gJHNlY3Rpb24uZmluZCgnW2RhdGEtdGhlbWUtZWRpdG9yLWxvYWQtc2NyaXB0XScpLmF0dHIoJ3NyYycpO1xuXG4gICAgLy8gQ2hlY2sgY2xhc3NlcyBvbiBzY2hlbWEgYW5kIGxvb2sgZm9yIGpzIChlZy4ganNNYXApXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWN0aW9uLmNsYXNzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHNlY3Rpb24uY2xhc3NMaXN0W2ldLnN1YnN0cmluZygwLCAyKSA9PT0gXCJqc1wiKXtcbiAgICAgICAgdmFyIHRyaWdnZXJDbGFzcyA9IHNlY3Rpb24uY2xhc3NMaXN0W2ldO1xuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBzZWN0aW9uIHNjcmlwdCBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuUFhVVGhlbWVbdHJpZ2dlckNsYXNzXSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIG1ha2UgQUpBWCBjYWxsIHRvIGxvYWQgc2NyaXB0XG4gICAgICAgICAgbG9hZFNjcmlwdCh0cmlnZ2VyQ2xhc3MsIHNlY3Rpb25PYmplY3RVcmwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdLmluaXQoJChzZWN0aW9uKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAod2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ1NlY3Rpb246ICcgKyB0cmlnZ2VyQ2xhc3MgKyAnIGhhcyBiZWVuIGxvYWRlZC4nKVxuICAgICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uaW5pdCgkKHNlY3Rpb24pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ1VoIG9oLCAnICsgdHJpZ2dlckNsYXNzICsgJyBpcyByZWZlcmVuY2VkIGluIHNlY3Rpb24gc2NoZW1hIGNsYXNzLCBidXQgY2FuIG5vdCBiZSBmb3VuZC4gTWFrZSBzdXJlIFwiel9fJyArIHRyaWdnZXJDbGFzcyArICcuanNcIiBhbmQgd2luZG93LlBYVVRoZW1lLicgKyB0cmlnZ2VyQ2xhc3MgKyAnLmluaXQoKSBmdW5jdGlvbiBleGlzdHMuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbGl0aWVzLmVuYWJsZURpc2Nsb3N1cmUoKTtcblxuICAgIC8vIENhbGwgbWV0aG9kcyBiYXNlZCBvbiBzZWN0aW9uIGNsYXNzZXNcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKHdpbmRvdy5QWFVUaGVtZS50aGVtZV9zZXR0aW5ncy5uZXdzbGV0dGVyX3BvcHVwKSB7XG4gICAgICBuZXdzbGV0dGVyX3BvcHVwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tcmVjb21tZW5kZWQtcHJvZHVjdHMnKSkge1xuICAgICAgd2luZG93LnByb2R1Y3QubG9hZFByb2R1Y3RSZWNvbW1lbmRhdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LlBYVVRoZW1lLnRoZW1lX3NldHRpbmdzLmVuYWJsZV9wcmVkaWN0aXZlX3NlYXJjaCkge1xuICAgICAgd2luZG93LnByZWRpY3RpdmVTZWFyY2guaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1jYXJ0LXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5wcm9kdWN0Rm9ybUxpc3RlbmVycy5pbml0KCk7XG4gICAgICB3aW5kb3cuY2FydC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWltYWdlLXdpdGgtdGV4dC1vdmVybGF5JykpIHtcbiAgICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xuICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLW1hcCcpIHx8ICRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXBhZ2UtY29udGFjdC10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cubWFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tZmVhdHVyZWQtcHJvZHVjdCcpKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLWNvbGxlY3Rpb24nKSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24uaW5pdCgpO1xuICAgICAgd2luZG93LnByb2R1Y3QuaW5pdCgpO1xuICAgICAgd2luZG93LmJhbm5lci5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLXByb21vdGlvbnMnKSkge1xuICAgICAgd2luZG93LmZlYXR1cmVkX3Byb21vdGlvbnMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1pbWFnZS13aXRoLXRleHQnKSkge1xuICAgICAgd2luZG93LmFuaW1hdGVfY29udGVudC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXZpZGVvJykpIHtcbiAgICAgIHdpbmRvdy52aWRlb1RoZW1lLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5p
1dCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1wcm9kdWN0LXRlbXBsYXRlJykgfHwgJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tcXVpY2stc2hvcCcpKSB7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi5pbml0KCk7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWNvbGxlY3Rpb24tdGVtcGxhdGUnKSkge1xuICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi5pbml0KCk7XG4gICAgICB3aW5kb3cucHJvZHVjdC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLXBhZ2UtY29udGFjdC10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuYmFubmVyX2ltYWdlLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1hcnRpY2xlLXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5hcnRpY2xlLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tc2VhcmNoLXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5jb2xsZWN0aW9uLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tYmxvZy10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuYmFubmVyX2ltYWdlLmluaXQoKTtcbiAgICAgIHdpbmRvdy5iYW5uZXIuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1oZWFkZXInKSkge1xuICAgICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgICB3aW5kb3cuaGVhZGVyLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3BhcmFsbGF4LWJhbm5lcicpKSB7XG4gICAgICAkKHRoaXMpLmZpbmQoJy5wYXJhbGxheF9fY29udGFpbmVyID4gLnBhcmFsbGF4JykudW53cmFwKCk7XG4gICAgICBuZXcgdW5pdmVyc2FsUGFyYWxsYXgoKS5pbml0KCk7XG4gICAgfVxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdXRpbGl0aWVzLnVubG9hZCgpO1xuXG4gICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWltYWdlLXdpdGgtdGV4dC1vdmVybGF5JykpIHtcbiAgICAgIHdpbmRvdy5iYW5uZXIudW5sb2FkKCR0YXJnZXQpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1zbGlkZXNob3cnKSkge1xuICAgICAgd2luZG93LlBYVVRoZW1lLmpzU2xpZGVzaG93LnVubG9hZCgkdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tZmVhdHVyZWQtcHJvZHVjdCcpKSB7XG4gICAgICB3aW5kb3cucHJvZHVjdC51bmxvYWQoJHRhcmdldCk7XG4gICAgfVxuXG4gICAgaWYgKCRwYXJlbnRTZWN0aW9uLmhhc0NsYXNzKCdzaG9waWZ5LXNlY3Rpb24tLWZlYXR1cmVkLWNvbGxlY3Rpb24nKSkge1xuICAgICAgd2luZG93LmNvbGxlY3Rpb24udW5sb2FkKCR0YXJnZXQpO1xuICAgIH1cblxuICAgIGlmICgkcGFyZW50U2VjdGlvbi5oYXNDbGFzcygnc2hvcGlmeS1zZWN0aW9uLS1wcm9kdWN0LXRlbXBsYXRlJykpIHtcbiAgICAgIHdpbmRvdy5wcm9kdWN0LnVubG9hZCgkdGFyZ2V0KTtcbiAgICB9XG5cbiAgICBpZiAoJHBhcmVudFNlY3Rpb24uaGFzQ2xhc3MoJ3Nob3BpZnktc2VjdGlvbi0tY29sbGVjdGlvbi10ZW1wbGF0ZScpKSB7XG4gICAgICB3aW5kb3cuY29sbGVjdGlvbi51bmxvYWQoJHRhcmdldCk7XG4gICAgfVxufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgLy8gU2hvcGlmeSBzZWN0aW9uIGFzIGpRdWVyeSBvYmplY3RcbiAgICB2YXIgJHNlY3Rpb24gPSAkKGUudGFyZ2V0KTtcblxuICAgIC8vIFZhbmlsbGEganMgc2VsZWN0aW9uIG9mIFNob3BpZnkgc2VjdGlvblxuICAgIHZhciBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIC8vIEZvcmNlIHNob3cgc3RhdGUgd2hlbiBzZWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZW1lIGVkaXRvclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbi5jbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzZWN0aW9uLmNsYXNzTGlzdFtpXS5zdWJzdHJpbmcoMCwgMikgPT09IFwianNcIikge1xuICAgICAgICB2Y
1XIgdHJpZ2dlckNsYXNzID0gc2VjdGlvbi5jbGFzc0xpc3RbaV07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5QWFVUaGVtZVt0cmlnZ2VyQ2xhc3NdLnNob3dUaGVtZUVkaXRvclN0YXRlKSB7d2luZG93LlBYVVRoZW1lXG4gICAgICAgICAgd2luZG93LlBYVVRoZW1lW3RyaWdnZXJDbGFzc10uc2hvd1RoZW1lRWRpdG9yU3RhdGUoZS5kZXRhaWwuc2VjdGlvbklkLCAkc2VjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgd2luZG93LmhlYWRlci5pbml0KCk7XG4gICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG4gICAgd2luZG93LmJhbm5lci5pbml0KCk7XG5cbiAgICAkKCcubGlnaHRib3gnKS5mYW5jeWJveCgpO1xufSk7XG5cbiQoZG9jdW1lbnQpXG4gIC5vbignc2hvcGlmeTpzZWN0aW9uOmRlc2VsZWN0JywgZnVuY3Rpb24oZSl7XG5cbiAgICB2YXIgJHBhcmVudFNlY3Rpb24gPSAkKCcjc2hvcGlmeS1zZWN0aW9uLScgKyBlLmRldGFpbC5zZWN0aW9uSWQpO1xuXG4gICAgd2luZG93LmJhbm5lcl9pbWFnZS5pbml0KCk7XG59KTtcblxuJChkb2N1bWVudClcbiAgLm9uKCdzaG9waWZ5OnNlY3Rpb246cmVvcmRlcicsIGZ1bmN0aW9uKGUpe1xuXG4gICAgdmFyICRwYXJlbnRTZWN0aW9uID0gJCgnI3Nob3BpZnktc2VjdGlvbi0nICsgZS5kZXRhaWwuc2VjdGlvbklkKTtcblxuICAgIHdpbmRvdy5oZWFkZXIuaW5pdCgpO1xuICAgIHdpbmRvdy5iYW5uZXJfaW1hZ2UuaW5pdCgpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQUdBO0FBUEE7QUFhQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFHQTtBQUFBO0FBQUE7QUFqQkE7QUFDQTtBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBREE7QUFHQTtBQUdBO0FBQUE7QUFBQTtBQVhBO0FBZUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBREE7QUFKQTtBQURBO0FBQ0E7QUFZQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3UUE7QUFnUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUFQQTtBQUNBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFoUEE7QUFtUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpGQTtBQThGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5QkE7QUFpQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBUkE7QUFnQkE7QUFFQTtBQUNBO0FBdkNBO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFWQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFhQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF0QkE7QUF3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF2Q0E7QUF5Q0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUZBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBS0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFCQTtBQTRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUF2M0JBO0FBMDNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0REE7QUEyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQWNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQS9JQTtBQWlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFqUUE7QUFvUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwQkE7QUFzQkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWp
1HQTtBQW9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUF6RkE7QUE0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFEQTtBQVBBO0FBQ0E7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBREE7QUFQQTtBQUNBO0FBWUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwTEE7QUFDQTtBQXNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBcEJBO0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBaEpBO0FBa0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUE1Q0E7QUE4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVZBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1Q0E7QUErQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVpBO0FBQ0E7QUFjQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/app.js\n")},
1"./source/scripts/helpers/ComplementaryProducts.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ComplementaryProducts)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/shopify-asyncview */ \"./node_modules/@pixelunion/shopify-asyncview/dist/index.es.js\");\n/* harmony import */ var _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @pixelunion/rimg-shopify */ \"./node_modules/@pixelunion/rimg-shopify/dist/index.es.js\");\n\n\n\nclass ComplementaryProducts {\n constructor(options) {\n this.sectionEl = options.sectionEl;\n this.sectionId = options.sectionId;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.productId = options.productId;\n this.includeIndicatorDots = options.includeIndicatorDots || false;\n this.recommendationsRoute = options.productRecommendationsRoute;\n this.limit = options.limit;\n const defaultArrowShape = {\n x0: 10,\n x1: 60,\n y1: 50,\n x2: 65,\n y2: 45,\n x3: 20\n };\n this.arrowShape = options.arrowShape || defaultArrowShape;\n this.recommendationsEl = this.sectionEl.querySelector('[data-complementary-products]');\n this.loadRecommendations();\n }\n\n loadRecommendations() {\n const url = `${this.recommendationsRoute}?section_id=${this.sectionId}&limit=${this.limit}&product_id=${this.productId}&intent=complementary`;\n _pixelunion_shopify_asyncview__WEBPACK_IMPORTED_MODULE_1__.default.load(url, {\n view: ''\n }).then(({\n html\n }) => {\n if (typeof html === 'object' && Object.keys(html).length === 0) return;\n\n if (html.trim().length === 0) {\n this.recommendationsEl.classList.add('complementary-products--no-recommendations');\n return;\n }\n\n this.recommendationsEl.innerHTML = html;\n\n if (!_pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.instance) {\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.init();\n }\n\n _pixelunion_rimg_shopify__WEBPACK_IMPORTED_MODULE_2__.default.watch(this.recommendationsEl);\n const slider = this.recommendationsEl.querySelector('[data-slider]');\n const slides = this.recommendationsEl.querySelectorAll('[data-slide]');\n\n if (slides.length > 1) {\n this.slider = $(slider).flickity({\n cellSelector: '[data-slide]',\n accessibility: false,\n adaptiveHeight: false,\n autoPlay: false,\n cellAlign: 'left',\n contain: true,\n imagesLoaded: true,\n pageDots: this.includeIndicatorDots,\n wrapAround: true,\n arrowShape: this.arrowShape\n });\n this.events.register(slider, 'rimg:load', () => {\n this.slider.resize();\n });\n }\n });\n }\n\n unload() {\n this.slider.destroy();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0NvbXBsZW1lbnRhcnlQcm9kdWN0cy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9Db21wbGVtZW50YXJ5UHJvZHVjdHMuanM/YmEyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5pbXBvcnQgQXN5bmNWaWV3IGZyb20gJ0BwaXhlbHVuaW9uL3Nob3BpZnktYXN5bmN2aWV3JztcbmltcG9ydCByaW1nIGZyb20gJ0BwaXhlbHVuaW9uL3JpbWctc2hvcGlmeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBsZW1lbnRhcnlQcm9kdWN0cyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnNlY3Rpb25FbCA9IG9wdGlvbnMuc2VjdGlvbkVsO1xuICAgIHRoaXMuc2VjdGlvbklkID0gb3B0aW9ucy5zZWN0aW9uSWQ7XG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVyKCk7XG4gICAgdGhpcy5wcm9kdWN0SWQgPSBvcHRpb25zLnByb2R1Y3RJZDtcbiAgICB0aGlzLmluY2x1ZGVJbmRpY2F0b3JEb3RzID0gb3B0aW9ucy5pbmNsdWRlSW5kaWNhdG9yRG90cyB8fCBmYWxzZTtcbiAgICB0aGlzLnJlY29tbWVuZGF0aW9uc1JvdXRlID0gb3B0aW9ucy5wcm9kdWN0UmVjb21tZW5kYXRpb25zUm91dGU7XG4gICAgdGhpcy5saW1pdCA9IG9wdGlvbnMubGltaXQ7XG5cbiAgICBjb25zdCBkZWZhdWx0QXJyb3dTaGFwZSA9IHtcbiAgICAgIHgwOiAxMCxcbiAgICAgIHgxOiA2MCxcbiAgICAgIHkxOiA1MCxcbiAgICAgIHgyOiA2NSxcbiAgICAgIHkyOiA0NSxcbiAgICAgIHgzOiAyMCxcbiAgICB9XG5cbiAgICB0aGlzLmFycm93U2hhcGUgPSBvcHRpb25zLmFycm93U2hhcGUgfHwgZGVmYXVsdEFycm93U2hhcGU7XG5cbiAgICB0aGlzLnJlY29tbWVuZGF0aW9uc0VsID0gdGhpcy5zZWN0aW9uRWwucXVlcnlTZWxlY3RvcignW2RhdGEtY29tcGxlbWVudGFyeS1wcm9kdWN0c10nKTtcbiAgICB0aGlzLmxvYWRSZWNvbW1lbmRhdGlvbnMoKTtcbiAgfVxuXG4gIGxvYWRSZWNvbW1lbmRhdGlvbnMoKSB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5yZWNvbW1lbmRhdGlvbnNSb3V0ZX0/c2VjdGlvbl9pZD0ke3RoaXMuc2VjdGlvbklkfSZsaW1pdD0ke3RoaXMubGltaXR9JnByb2R1Y3RfaWQ9JHt0aGlzLnByb2R1Y3RJZH0maW50ZW50PWNvbXBsZW1lbnRhcnlgO1xuXG4gICAgQXN5bmNWaWV3LmxvYWQoXG4gICAgICB1cmwsXG4gICAgICB7IHZpZXc6ICcnIH0sXG4gICAgKS50aGVuKCh7IGh0bWwgfSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBodG1sID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhodG1sKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgaWYgKGh0bWwudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGF0aW9uc0VsLmNsYXNzTGlzdC5hZGQoJ2NvbXBsZW1lbnRhcnktcHJvZHVjdHMtLW5vLXJlY29tbWVuZGF0aW9ucycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVjb21tZW5kYXRpb25zRWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgaWYgKCFyaW1nLmluc3RhbmNlKSB7XG4gICAgICAgI
1HJpbWcuaW5pdCgpO1xuICAgICAgfVxuXG4gICAgICByaW1nLndhdGNoKHRoaXMucmVjb21tZW5kYXRpb25zRWwpO1xuXG4gICAgICBjb25zdCBzbGlkZXIgPSB0aGlzLnJlY29tbWVuZGF0aW9uc0VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsaWRlcl0nKTtcbiAgICAgIGNvbnN0IHNsaWRlcyA9IHRoaXMucmVjb21tZW5kYXRpb25zRWwucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc2xpZGVdJyk7XG5cbiAgICAgIGlmIChzbGlkZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnNsaWRlciA9ICQoc2xpZGVyKS5mbGlja2l0eSh7XG4gICAgICAgICAgY2VsbFNlbGVjdG9yOiAnW2RhdGEtc2xpZGVdJyxcbiAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiBmYWxzZSxcbiAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gICAgICAgICAgYXV0b1BsYXk6IGZhbHNlLFxuICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgICAgIHBhZ2VEb3RzOiB0aGlzLmluY2x1ZGVJbmRpY2F0b3JEb3RzLFxuICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXG4gICAgICAgICAgYXJyb3dTaGFwZTogdGhpcy5hcnJvd1NoYXBlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZWdpc3RlcihzbGlkZXIsICdyaW1nOmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbGlkZXIucmVzaXplKCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5zbGlkZXIuZGVzdHJveSgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTFFQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/ComplementaryProducts.js\n")},
1"./source/scripts/helpers/PaymentTerms.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ PaymentTerms)\n/* harmony export */ });\nclass PaymentTerms {\n constructor(el) {\n this._el = el;\n this._reference = this._el.querySelector('[data-payment-terms-reference] shopify-payment-terms');\n this._target = this._el.querySelector('[data-payment-terms-target]');\n if (!this._reference || !this._target) return;\n this._input = document.createElement('input');\n this._input.name = 'id';\n this._input.type = 'hidden';\n\n this._target.appendChild(this._input);\n\n this._target.appendChild(this._reference);\n\n this._target.style.display = null;\n }\n\n update(variantId) {\n if (!this._reference || !this._target) return;\n this._input.value = variantId;\n\n this._input.dispatchEvent(new Event('change', {\n bubbles: true\n }));\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1BheW1lbnRUZXJtcy5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9QYXltZW50VGVybXMuanM/MzNmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYXltZW50VGVybXMge1xuICBjb25zdHJ1Y3RvcihlbCkge1xuICAgIHRoaXMuX2VsID0gZWw7XG4gICAgdGhpcy5fcmVmZXJlbmNlID0gdGhpcy5fZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcGF5bWVudC10ZXJtcy1yZWZlcmVuY2VdIHNob3BpZnktcGF5bWVudC10ZXJtcycpO1xuICAgIHRoaXMuX3RhcmdldCA9IHRoaXMuX2VsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBheW1lbnQtdGVybXMtdGFyZ2V0XScpO1xuXG4gICAgaWYgKCF0aGlzLl9yZWZlcmVuY2UgfHwgIXRoaXMuX3RhcmdldCkgcmV0dXJuO1xuXG4gICAgdGhpcy5faW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRoaXMuX2lucHV0Lm5hbWUgPSAnaWQnO1xuICAgIHRoaXMuX2lucHV0LnR5cGUgPSAnaGlkZGVuJztcblxuICAgIHRoaXMuX3RhcmdldC5hcHBlbmRDaGlsZCh0aGlzLl9pbnB1dCk7XG4gICAgdGhpcy5fdGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuX3JlZmVyZW5jZSk7XG5cbiAgICB0aGlzLl90YXJnZXQuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gIH1cblxuICB1cGRhdGUodmFyaWFudElkKSB7XG4gICAgaWYgKCF0aGlzLl9yZWZlcmVuY2UgfHwgIXRoaXMuX3RhcmdldCkgcmV0dXJuO1xuICAgIHRoaXMuX2lucHV0LnZhbHVlID0gdmFyaWFudElkO1xuICAgIHRoaXMuX2lucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBdkJBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./source/scripts/helpers/PaymentTerms.js\n")},
1"./source/scripts/helpers/RecipientForm.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RecipientForm)\n/* harmony export */ });\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n/* harmony import */ var _pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/animations */ \"./node_modules/@pixelunion/animations/dist/animations.es.js\");\n\n\nclass RecipientForm {\n constructor(el) {\n this.el = el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_0__.default();\n this.recipientForm = this.el.querySelector('[data-recipient-form]');\n this.recipientFormInputs = this.el.querySelectorAll('[data-recipient-form-input]');\n this.recipientFormEmailInput = this.el.querySelector('[data-recipient-form-email-input]');\n this.disclosure = this.el.querySelector('[data-recipient-disclosure]');\n this.disclosureCheckbox = this.el.querySelector('[data-recipient-disclosure-checkbox]');\n this.checkmark = this.disclosure.querySelector('.checkmark');\n this.checkmarkCheck = this.disclosure.querySelector('.checkmark__check');\n this.fillAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n el: this.checkmark\n });\n this.checkAnimation = (0,_pixelunion_animations__WEBPACK_IMPORTED_MODULE_1__.transition)({\n el: this.checkmarkCheck\n });\n this.events.register(this.recipientForm, 'keydown', event => this._onKeydown(event));\n this.events.register(this.disclosure, 'toggle', () => this._onToggle());\n this.events.register(this.disclosureCheckbox, 'change', () => this._onChange());\n }\n\n _onChange() {\n this.disclosure.open = this.disclosureCheckbox.checked;\n }\n\n _onKeydown(event) {\n // Prevent input form submission\n if (event.key === 'Enter' && event.target.matches('[data-recipient-form-input]')) {\n event.preventDefault();\n }\n }\n\n _onToggle() {\n if (this.disclosure.open) {\n this._showRecipientForm();\n } else {\n this._hideRecipientForm();\n }\n }\n\n _showRecipientForm() {\n if (this.checkmark && this.checkmarkCheck) {\n this.fillAnimation.animateTo('checked');\n this.checkAnimation.animateTo('checked');\n }\n\n this.disclosureCheckbox.checked = true;\n this.recipientFormEmailInput.required = true;\n }\n\n _hideRecipientForm() {\n if (this.checkmark && this.checkmarkCheck) {\n this.fillAnimation.animateTo('unchecked');\n this.checkAnimation.animateTo('unchecked');\n }\n\n this.disclosureCheckbox.checked = false;\n this.recipientFormEmailInput.required = false;\n\n this._resetRecipientForm();\n }\n\n _resetRecipientForm() {\n this.recipientFormInputs.forEach(el => {\n el.value = '';\n\n if (el.classList.contains('form-field-filled')) {\n el.classList.remove('form-field-filled');\n }\n });\n\n if (this.recipientForm.classList.contains('recipient-form--has-errors')) {\n this.recipientForm.classList.remove('recipient-form--has-errors');\n }\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1JlY2lwaWVudE
1Zvcm0uanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wYXJhbGxheC8uL3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvUmVjaXBpZW50Rm9ybS5qcz84ZWE4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnQHBpeGVsdW5pb24vZXZlbnRzJztcbmltcG9ydCB7IHRyYW5zaXRpb24gfSBmcm9tICdAcGl4ZWx1bmlvbi9hbmltYXRpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjaXBpZW50Rm9ybSB7XG4gIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuXG4gICAgdGhpcy5yZWNpcGllbnRGb3JtID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZm9ybV0nKTtcbiAgICB0aGlzLnJlY2lwaWVudEZvcm1JbnB1dHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWVtYWlsLWlucHV0XScpO1xuXG4gICAgdGhpcy5kaXNjbG9zdXJlID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNpcGllbnQtZGlzY2xvc3VyZV0nKTtcbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtcmVjaXBpZW50LWRpc2Nsb3N1cmUtY2hlY2tib3hdJyk7XG5cbiAgICB0aGlzLmNoZWNrbWFyayA9IHRoaXMuZGlzY2xvc3VyZS5xdWVyeVNlbGVjdG9yKCcuY2hlY2ttYXJrJyk7XG4gICAgdGhpcy5jaGVja21hcmtDaGVjayA9IHRoaXMuZGlzY2xvc3VyZS5xdWVyeVNlbGVjdG9yKCcuY2hlY2ttYXJrX19jaGVjaycpO1xuICAgIHRoaXMuZmlsbEFuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5jaGVja21hcmsgfSk7XG4gICAgdGhpcy5jaGVja0FuaW1hdGlvbiA9IHRyYW5zaXRpb24oeyBlbDogdGhpcy5jaGVja21hcmtDaGVjayB9KTtcblxuICAgIHRoaXMuZXZlbnRzLnJlZ2lzdGVyKHRoaXMucmVjaXBpZW50Rm9ybSwgJ2tleWRvd24nLCBldmVudCA9PiB0aGlzLl9vbktleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmUsICd0b2dnbGUnLCAoKSA9PiB0aGlzLl9vblRvZ2dsZSgpKTtcbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLmRpc2Nsb3N1cmVDaGVja2JveCwgJ2NoYW5nZScsICgpID0+IHRoaXMuX29uQ2hhbmdlKCkpO1xuICB9XG5cbiAgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGlzY2xvc3VyZS5vcGVuID0gdGhpcy5kaXNjbG9zdXJlQ2hlY2tib3guY2hlY2tlZDtcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IGlucHV0IGZvcm0gc3VibWlzc2lvblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ1tkYXRhLXJlY2lwaWVudC1mb3JtLWlucHV0XScpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5kaXNjbG9zdXJlLm9wZW4pIHtcbiAgICAgIHRoaXMuX3Nob3dSZWNpcGllbnRGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hpZGVSZWNpcGllbnRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgX3Nob3dSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCdjaGVja2VkJyk7XG4gICAgICB0aGlzLmNoZWNrQW5pbWF0aW9uLmFuaW1hdGVUbygnY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY2xvc3VyZUNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUVtYWlsSW5wdXQucmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgX2hpZGVSZWNpcGllbnRGb3JtKCkge1xuICAgIGlmICh0aGlzLmNoZWNrbWFyayAmJiB0aGlzLmNoZWNrbWFya0NoZWNrKSB7XG4gICAgICB0aGlzLmZpbGxBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICAgIHRoaXMuY2hlY2tBbmltYXRpb24uYW5pbWF0ZVRvKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nsb3N1cmVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWNpcGllbnRGb3JtRW1haWxJbnB1dC5yZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVzZXRSZWNpcGllbnRGb3JtKCk7XG4gIH1cblxuICBfcmVzZXRSZWNpcGllbnRGb3JtKCkge1xuICAgIHRoaXMucmVjaXBpZW50Rm9ybUlucHV0cy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnZhbHVlID0gJyc7XG5cbiAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tZmllbGQtZmlsbGVkJykpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZm9ybS1maWVsZC1maWxsZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJlY2lwaWVudE
1Zvcm0uY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWNpcGllbnQtZm9ybS0taGFzLWVycm9ycycpKSB7XG4gICAgICB0aGlzLnJlY2lwaWVudEZvcm0uY2xhc3NMaXN0LnJlbW92ZSgncmVjaXBpZW50LWZvcm0tLWhhcy1lcnJvcnMnKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE1RUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./source/scripts/helpers/RecipientForm.js\n")},
1"./source/scripts/helpers/ShippingCalculator.js":function(__unused_webpack_module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ShippingCalculator)\n/* harmony export */ });\n/* harmony import */ var _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @shopify/theme-addresses */ \"./node_modules/@shopify/theme-addresses/theme-addresses.js\");\n/* harmony import */ var _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pixelunion/events */ \"./node_modules/@pixelunion/events/dist/EventHandler.js\");\n\n\nclass ShippingCalculator {\n constructor({\n el\n }) {\n this.el = el;\n this.events = new _pixelunion_events__WEBPACK_IMPORTED_MODULE_1__.default();\n this.rates = this.el.querySelector('[data-shipping-rates]');\n this.message = this.el.querySelector('[data-shipping-message]');\n this.zip = this.el.querySelector('[data-shipping-calculator-zipcode]');\n this.submit = this.el.querySelector('[data-shipping-calculator-submit]');\n this.response = this.el.querySelector('[data-shipping-calculator-response]');\n this.countrySelect = this.el.querySelector('[data-shipping-calculator-country]');\n this.provinceSelect = this.el.querySelector('[data-shipping-calculator-province]');\n this.provinceContainer = this.el.querySelector('[data-shipping-calculator-province-container]');\n this.buildCalculator();\n }\n\n buildCalculator() {\n this.shippingCountryProvinceSelector = new _shopify_theme_addresses__WEBPACK_IMPORTED_MODULE_0__.CountryProvinceSelector(this.countrySelect.innerHTML);\n this.shippingCountryProvinceSelector.build(this.countrySelect, this.provinceSelect, {\n onCountryChange: provinces => {\n if (provinces.length) {\n this.provinceContainer.style.display = 'block';\n } else {\n this.provinceContainer.style.display = 'none';\n } // \"Province\", \"State\", \"Region\", etc. and \"Postal Code\", \"ZIP Code\", etc.\n // Even countries without provinces include a label.\n\n\n const {\n label,\n zip_label: zipLabel\n } = window.Countries[this.countrySelect.value];\n this.provinceContainer.querySelector('label[for=\"address_province\"]').innerHTML = label;\n this.el.querySelector('label[for=\"address_zip\"]').innerHTML = zipLabel;\n }\n });\n this.events.register(this.submit, 'click', e => {\n e.preventDefault();\n this.getRates();\n });\n }\n\n getRates() {\n const shippingAddress = {};\n shippingAddress.country = this.countrySelect ? this.countrySelect.value : '';\n shippingAddress.province = this.provinceSelect ? this.provinceSelect.value : '';\n shippingAddress.zip = this.zip ? this.zip.value : '';\n const queryString = Object.keys(shippingAddress).map(key => `${encodeURIComponent(`shipping_address[${key}]`)}=${encodeURIComponent(shippingAddress[key])}`).join('&');\n fetch(`${window.PXUTheme.routes.cart_url}/shipping_rates.json?${queryString}`).then(response => response.json()).then(data => this.displayRates(data));\n }\n\n displayRates(rates) {\n const propertyName = Object.keys(rates);\n this.clearRates();\n\n if (propertyName[0] === 'shipping_rates') {\n rates.shipping_rates.forEac
1h(rate => {\n const rateLi = document.createElement('li');\n rateLi.innerHTML = `${rate.name}: ${this.formatPrice(rate.price)}`;\n this.rates.appendChild(rateLi);\n });\n\n if (rates.shipping_rates.length > 1) {\n this.message.innerHTML = `${window.PXUTheme.translation.additional_rates_part_1} ${rates.shipping_rates.length} ${window.PXUTheme.translation.additional_rates_part_2} ${this.zip.value}, ${this.provinceSelect.value}, ${this.countrySelect.value}, ${window.PXUTheme.translation.additional_rates_part_3} ${this.formatPrice(rates.shipping_rates[0].price)}`;\n } else {\n this.message.innerHTML = `${window.PXUTheme.translation.additional_rate} ${this.zip.value}, ${this.provinceSelect.value}, ${this.countrySelect.value}, ${window.PXUTheme.translation.additional_rate_at} ${this.formatPrice(rates.shipping_rates[0].price)}`;\n }\n\n this.response.classList.add('shipping-rates--display-rates');\n } else {\n this.message.innerHTML = `Error: ${propertyName[0]} ${rates[propertyName[0]]}`;\n this.response.classList.add('shipping-rates--display-error');\n }\n }\n\n clearRates() {\n this.response.classList.remove('shipping-rates--display-error', 'shipping-rates--display-rates');\n this.message.innerHTML = '';\n this.rates.innerHTML = '';\n }\n\n formatPrice(price) {\n let formattedPrice;\n\n if (window.PXUTheme.currency.display_format === 'money_with_currency_format') {\n formattedPrice = `<span class=\"money\">${window.PXUTheme.currency.symbol}${price} ${window.PXUTheme.currency.iso_code}</span>`;\n } else {\n formattedPrice = `<span class=\"money\">${window.PXUTheme.currency.symbol}${price}</span>`;\n }\n\n return formattedPrice;\n }\n\n unload() {\n this.events.unregisterAll();\n }\n\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL1NoaXBwaW5nQ2FsY3VsYXRvci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vc291cmNlL3NjcmlwdHMvaGVscGVycy9TaGlwcGluZ0NhbGN1bGF0b3IuanM/N2QzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3VudHJ5UHJvdmluY2VTZWxlY3RvciB9IGZyb20gJ0BzaG9waWZ5L3RoZW1lLWFkZHJlc3Nlcyc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJ0BwaXhlbHVuaW9uL2V2ZW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXBwaW5nQ2FsY3VsYXRvciB7XG4gIGNvbnN0cnVjdG9yKHsgZWwgfSkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLnJhdGVzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaGlwcGluZy1yYXRlc10nKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLW1lc3NhZ2VdJyk7XG4gICAgdGhpcy56aXAgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItemlwY29kZV0nKTtcbiAgICB0aGlzLnN1Ym1pdCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2hpcHBpbmctY2FsY3VsYXRvci1zdWJtaXRdJyk7XG4gICAgdGhpcy5yZXNwb25zZSA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2hpcHBpbmctY2FsY3VsYXRvci1yZXNwb25zZV0nKTtcbiAgICB0aGlzLmNvdW50cnlTZWxlY3QgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItY291bnRyeV0nKTtcbiAgICB0aGlzLnByb3ZpbmNlU2VsZWN0ID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zaGlwcGluZy1jYWxjdWxhdG9yLXByb3ZpbmNlXScpO1xuICAgIHRoaXMucHJvdmluY2VDb250YWluZXIgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNoaXBwaW5nLWNhbGN1bGF0b3ItcHJvdmluY2UtY29udGFpbmVyXScpO1xuXG4gICAgdGhpcy5idWlsZENhbGN1bGF0b3IoKTtcbiAgfVxuXG4gIGJ1aWxkQ2FsY3VsYXRvcigpIHtcbiAgICB0aGlzLnNoaXBwaW5nQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IgPSBuZXcgQ291bnRyeVByb3ZpbmNlU2VsZWN0b3IodGhpcy5jb3VudHJ5U2VsZWN0LmlubmVySFRNTCk7XG4gICAgdGhpcy5zaGlwcGluZ0NvdW50cnlQcm92aW5jZVNlbGVjdG9yXG4gICAgICAuYnVpbGQoXG4gICAgICAgIHRoaXMuY291bnRyeVNlbGVjdCxcbiAgICAgICAgdGhpcy5wcm92aW5jZVNlbGVjdCxcbiAgICAgICAge1xuICAgICAgICAgIG9uQ291bnRyeUNoYW5nZTogcHJvdmluY2VzID0+IHtcbiAgICAgICAgICAgIGlmIChwcm92aW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvdmluY2VDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFwiUHJvdmluY2VcIiwgXCJTdGF0ZVwiLCBcIlJlZ2lvblwiLCBldGMuIGFuZCBcIlBvc3RhbCBDb2RlXCIsIFwiWklQIENvZGVcIiwgZXRjLlxuICAgICAgICAgICAgLy8gRXZlbiBjb3VudHJpZXMgd2l0aG91dCBwcm92aW5jZXMgaW5jbHVkZSBhIGxhYmVsLlxuICAgICAgICAgICAgY29uc3QgeyBsYWJlbCwgemlwX2xhYmVsOiB6aXBMYWJlbCB9ID0gd2luZG93LkNvdW50cmllc1t0aGlzLmNvdW50cnlTZWxlY3QudmFsdWVdO1xuICAgICAgICAgICAgdGhpcy5wcm92aW5jZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9XCJhZGRyZXNzX3Byb3ZpbmNlXCJdJykuaW5uZXJIVE1MID0gbGFiZWw7XG4gICAgICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1cImFkZHJlc3NfemlwXCJdJykuaW5uZXJIVE1MID0gemlwTGFiZWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICB0aGlzLmV2ZW50cy5yZWdpc3Rlcih0aGlzLnN1Ym1pdCwgJ2NsaWNrJywgZSA9PiB7XG4gICAgICBlLnByZXZlbn
1REZWZhdWx0KCk7XG4gICAgICB0aGlzLmdldFJhdGVzKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRSYXRlcygpIHtcbiAgICBjb25zdCBzaGlwcGluZ0FkZHJlc3MgPSB7fTtcbiAgICBzaGlwcGluZ0FkZHJlc3MuY291bnRyeSA9IHRoaXMuY291bnRyeVNlbGVjdCA/IHRoaXMuY291bnRyeVNlbGVjdC52YWx1ZSA6ICcnO1xuICAgIHNoaXBwaW5nQWRkcmVzcy5wcm92aW5jZSA9IHRoaXMucHJvdmluY2VTZWxlY3QgPyB0aGlzLnByb3ZpbmNlU2VsZWN0LnZhbHVlIDogJyc7XG4gICAgc2hpcHBpbmdBZGRyZXNzLnppcCA9IHRoaXMuemlwID8gdGhpcy56aXAudmFsdWUgOiAnJztcblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMoc2hpcHBpbmdBZGRyZXNzKVxuICAgICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGBzaGlwcGluZ19hZGRyZXNzWyR7a2V5fV1gKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2hpcHBpbmdBZGRyZXNzW2tleV0pfWApXG4gICAgICAuam9pbignJicpO1xuXG4gICAgZmV0Y2goYCR7d2luZG93LlBYVVRoZW1lLnJvdXRlcy5jYXJ0X3VybH0vc2hpcHBpbmdfcmF0ZXMuanNvbj8ke3F1ZXJ5U3RyaW5nfWApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihkYXRhID0+IHRoaXMuZGlzcGxheVJhdGVzKGRhdGEpKTtcbiAgfVxuXG4gIGRpc3BsYXlSYXRlcyhyYXRlcykge1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IE9iamVjdC5rZXlzKHJhdGVzKTtcbiAgICB0aGlzLmNsZWFyUmF0ZXMoKTtcblxuICAgIGlmIChwcm9wZXJ0eU5hbWVbMF0gPT09ICdzaGlwcGluZ19yYXRlcycpIHtcbiAgICAgIHJhdGVzLnNoaXBwaW5nX3JhdGVzLmZvckVhY2gocmF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJhdGVMaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICAgIHJhdGVMaS5pbm5lckhUTUwgPSBgJHtyYXRlLm5hbWV9OiAke3RoaXMuZm9ybWF0UHJpY2UocmF0ZS5wcmljZSl9YDtcbiAgICAgICAgdGhpcy5yYXRlcy5hcHBlbmRDaGlsZChyYXRlTGkpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChyYXRlcy5zaGlwcGluZ19yYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5pbm5lckhUTUwgPSBgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlc19wYXJ0XzF9ICR7cmF0ZXMuc2hpcHBpbmdfcmF0ZXMubGVuZ3RofSAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5hZGRpdGlvbmFsX3JhdGVzX3BhcnRfMn0gJHt0aGlzLnppcC52YWx1ZX0sICR7dGhpcy5wcm92aW5jZVNlbGVjdC52YWx1ZX0sICR7dGhpcy5jb3VudHJ5U2VsZWN0LnZhbHVlfSwgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlc19wYXJ0XzN9ICR7dGhpcy5mb3JtYXRQcmljZShyYXRlcy5zaGlwcGluZ19yYXRlc1swXS5wcmljZSl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5pbm5lckhUTUwgPSBgJHt3aW5kb3cuUFhVVGhlbWUudHJhbnNsYXRpb24uYWRkaXRpb25hbF9yYXRlfSAke3RoaXMuemlwLnZhbHVlfSwgJHt0aGlzLnByb3ZpbmNlU2VsZWN0LnZhbHVlfSwgJHt0aGlzLmNvdW50cnlTZWxlY3QudmFsdWV9LCAke3dpbmRvdy5QWFVUaGVtZS50cmFuc2xhdGlvbi5hZGRpdGlvbmFsX3JhdGVfYXR9ICR7dGhpcy5mb3JtYXRQcmljZShyYXRlcy5zaGlwcGluZ19yYXRlc1swXS5wcmljZSl9YDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNwb25zZS5jbGFzc0xpc3QuYWRkKCdzaGlwcGluZy1yYXRlcy0tZGlzcGxheS1yYXRlcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuaW5uZXJIVE1MID0gYEVycm9yOiAke3Byb3BlcnR5TmFtZVswXX0gJHtyYXRlc1twcm9wZXJ0eU5hbWVbMF1dfWA7XG4gICAgICB0aGlzLnJlc3BvbnNlLmNsYXNzTGlzdC5hZGQoJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LWVycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSYXRlcygpIHtcbiAgICB0aGlzLnJlc3BvbnNlLmNsYXNzTGlzdC5yZW1vdmUoJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LWVycm9yJywgJ3NoaXBwaW5nLXJhdGVzLS1kaXNwbGF5LXJhdGVzJyk7XG4gICAgdGhpcy5tZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMucmF0ZXMuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBmb3JtYXRQcmljZShwcmljZSkge1xuICAgIGxldCBmb3JtYXR0ZWRQcmljZTtcblxuICAgIGlmICh3aW5kb3cuUFhVVGhlbWUuY3VycmVuY3kuZGlzcGxheV9mb3JtYXQgPT09ICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCcpIHtcbiAgICAgIGZvcm1hdHRlZFByaWNlID0gYDxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke3dpbmRvdy5QWFVUaGVtZS5jdXJyZW5jeS5zeW1ib2x9JHtwcmljZX0gJHt3aW5kb3cuUFhVVGhlbWUuY3VycmVuY3kuaXNvX2NvZGV9PC9zcGFuPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdHRlZFByaWNlID0gYDxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke3dpbmRvdy5QWFVUaGVtZS5jdXJyZW5jeS5zeW1ib2x9JHtwcmljZX08L3NwYW4+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkUHJpY2U7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5ldmVudHMudW5yZWdpc3RlckFsbCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXpHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./source/scripts/helpers/ShippingCalculator.js\n")},
vendor: 2,227 bytes, line 1
1"./node_modules/just-debounce/index.js":function(module){eval("module.exports = debounce;\n\nfunction debounce(fn, delay, atStart, guarantee) {\n var timeout;\n var args;\n var self;\n\n return function debounced() {\n self = this;\n args = Array.prototype.slice.call(arguments);\n\n if (timeout && (atStart || guarantee)) {\n return;\n } else if (!atStart) {\n clear();\n\n timeout = setTimeout(run, delay);\n return timeout;\n }\n\n timeout = setTimeout(clear, delay);\n fn.apply(self, args);\n\n function run() {\n clear();\n fn.apply(self, args);\n }\n\n function clear() {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanVzdC1kZWJvdW5jZS9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL2p1c3QtZGVib3VuY2UvaW5kZXguanM/NDcyMyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuXG5mdW5jdGlvbiBkZWJvdW5jZShmbiwgZGVsYXksIGF0U3RhcnQsIGd1YXJhbnRlZSkge1xuICB2YXIgdGltZW91dDtcbiAgdmFyIGFyZ3M7XG4gIHZhciBzZWxmO1xuXG4gIHJldHVybiBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgc2VsZiA9IHRoaXM7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodGltZW91dCAmJiAoYXRTdGFydCB8fCBndWFyYW50ZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICghYXRTdGFydCkge1xuICAgICAgY2xlYXIoKTtcblxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQocnVuLCBkZWxheSk7XG4gICAgICByZXR1cm4gdGltZW91dDtcbiAgICB9XG5cbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhciwgZGVsYXkpO1xuICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgZnVuY3Rpb24gcnVuKCkge1xuICAgICAgY2xlYXIoKTtcbiAgICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/just-debounce/index.js\n")},
vendor: 32,833 bytes, line 1
1"./node_modules/scroll-lock/dist/scroll-lock.js":(function(module){eval("(function webpackUniversalModuleDefinition(root, factory) {\n if(true)\n module.exports = factory();\n else {}\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ // The module cache\n/******/ var installedModules = {};\n/******/\n/******/ // The require function\n/******/ function __nested_webpack_require_543__(moduleId) {\n/******/\n/******/ // Check if module is in cache\n/******/ if(installedModules[moduleId]) {\n/******/ return installedModules[moduleId].exports;\n/******/ }\n/******/ // Create a new module (and put it into the cache)\n/******/ var module = installedModules[moduleId] = {\n/******/ i: moduleId,\n/******/ l: false,\n/******/ exports: {}\n/******/ };\n/******/\n/******/ // Execute the module function\n/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__);\n/******/\n/******/ // Flag the module as loaded\n/******/ module.l = true;\n/******/\n/******/ // Return the exports of the module\n/******/ return module.exports;\n/******/ }\n/******/\n/******/\n/******/ // expose the modules object (__webpack_modules__)\n/******/ __nested_webpack_require_543__.m = modules;\n/******/\n/******/ // expose the module cache\n/******/ __nested_webpack_require_543__.c = installedModules;\n/******/\n/******/ // define getter function for harmony exports\n/******/ __nested_webpack_require_543__.d = function(exports, name, getter) {\n/******/ if(!__nested_webpack_require_543__.o(exports, name)) {\n/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ }\n/******/ };\n/******/\n/******/ // define __esModule on exports\n/******/ __nested_webpack_require_543__.r = function(exports) {\n/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ }\n/******/ Object.defineProperty(exports, '__esModule', { value: true });\n/******/ };\n/******/\n/******/ // create a fake namespace object\n/******/ // mode & 1: value is a module id, require it\n/******/ // mode & 2: merge all properties of value into the ns\n/******/ // mode & 4: return value when already ns object\n/******/ // mode & 8|1: behave like require\n/******/ __nested_webpack_require_543__.t = function(value, mode) {\n/******/ if(mode & 1) value = __nested_webpack_require_543__(value);\n/******/ if(mode & 8) return value;\n/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ var ns = Object.create(null);\n/******/ __nested_webpack_require_543__.r(ns);\n/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_543__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ return ns;\n/******/ };\n/******/\n/******/ // getDefaultExport function for compatibility with non-harmony modules\n/******/ __nested_webpack_require_543__.n = function(module) {\n/******/ var getter = module && module.__esModule ?\n/******/ function getDefault() { return module['default']; } :\n/******/ function getModuleExports() { return module; };\n/******/ __nested_webpack_require_543__.d(getter, 'a', getter);\n/******/ return getter;\n/******/ };\n/******/\n/******/ // Object.prototype.hasOwnProperty.call\n/******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ // __webpack_public_path__\n/******/ __nested_webpack_require_543__.p = \"\";\n/******/\n/******/\n/******/ // Load entry module and return exports\n/******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __nested_webpack_require_4019__) {\n\n\"use strict\";\n__nested_webpack_require_4019__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/tools.js\nvar argumentAsArray = function argumentAsArray(argument) {\n return Array.isArray(argument) ? argument : [argument];\n};\nvar isElement = function isElement(target) {\n return target instanceof Node;\n};\nvar isElementList = function isElementList(nodeList) {\n return nodeList instanceof NodeList;\n};\nvar eachNode = function eachNode(nodeList, callback) {\n if (nodeList && callback) {\n nodeList = isElementList(nodeList) ? nodeList : [nodeList];\n\n for (var i = 0; i < nodeList.length; i++) {\n if (callback(nodeList[i], i, nodeList.length) === true) {\n break;\n }\n }\n }\n};\nvar throwError = function throwError(message) {\n return console.error(\"[scroll-lock] \".concat(message));\n};\nvar arrayAsSelector = function arrayAsSelector(array) {\n if (Array.isArray(array)) {\n var selector = array.join(', ');\n return selector;\n }\n};\nvar nodeListAsArray = function nodeListAsArray(nodeList) {\n var nodes = [];\n eachNode(nodeList, function (node) {\n return nodes.push(node);\n });\n return nodes;\n};\nvar findParentBySelector = function findParentBySelector($el, selector) {\n var self = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var $root = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : document;\n\n if (self && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1) {\n return $el;\n }\n\n while (($el = $el.parentElement) && nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) === -1) {\n ;\n }\n\n return $el;\n};\nvar elementHasSelector = function elementHasSelector($el, selector) {\n var $root = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document;\n var has = nodeListAsArray($root.querySelectorAll(selector)).indexOf($el) !== -1;\n return has;\n};\nvar elementHasOverflowHidden = function elementHasOverflowHidden($el) {\n if ($el) {\n var computedStyle = getComputedStyle($el);\n var overflowIsHidden = computedStyle.overflow === 'hidden';\n return overflowIsHidden;\n }\n};\nvar elementScrollTopOnStart = function elementScrollTopOnStart($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollTop = $el.scrollTop;\n return scrollTop <= 0;\n }\n};\nvar elementScrollTopOnEnd = function elementScrollTopOnEnd($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollTop = $el.scrollTop;\n var scrollHeight = $el.scrollHeight;\n var scrollTopWithHeight = scrollTop + $el.offsetHeight;\n return scrollTopWithHeight >= scrollHeight;\n }\n};\nvar elementScrollLeftOnStart = function elementScrollLeftOnStart($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollLeft = $el.scrollLeft;\n return scrollLeft <= 0;\n }\n};\nvar elementScrollLeftOnEnd = function elementScrollLeftOnEnd($el) {\n if ($el) {\n if (elementHasOverflowHidden($el)) {\n return true;\n }\n\n var scrollLeft = $el.scrollLeft;\n var scrollWidth = $el.scrollWidth;\n var scrollLeftWithWidth = scrollLeft + $el.offsetWidth;\n return scrollLeftWithWidth >= scrollWidth;\n }\n};\nvar elementIsScrollableField = function elementIsScrollableField($el) {\n var selector = 'textarea, [contenteditable=\"true\"]';\n return elementHasSelector($el, selector);\n};\nvar elementIsInputRange = function elementIsInputRange($el) {\n var selector = 'input[type=\"range\"]';\n return elementHasSelector($el, selector);\n};\n// CONCATENATED MODULE: ./src/scroll-lock.js\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"disablePageScroll\", function() { return disablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"enablePageScroll\", function() { return enablePageScroll; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getScrollState\", function() { return getScrollState; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"clearQueueScrollLocks\", function() { return clearQueueScrollLocks; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getTargetScrollBarWidth\", function() { return scroll_lock_getTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentTargetScrollBarWidth\", function() { return scroll_lock_getCurrentTargetScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getPageScrollBarWidth\", function() { return getPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"getCurrentPageScrollBarWidth\", function() { return getCurrentPageScrollBarWidth; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableTarget\", function() { return scroll_lock_addScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableTarget\", function() { return scroll_lock_removeScrollableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addScrollableSelector\", function() { return scroll_lock_addScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeScrollableSelector\", function() { return scroll_lock_removeScrollableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableTarget\", function() { return scroll_lock_addLockableTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addLockableSelector\", function() { return scroll_lock_addLockableSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"setFillGapMethod\", function() { return scroll_lock_setFillGapMethod; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapTarget\", function() { return scroll_lock_addFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapTarget\", function() { return scroll_lock_removeFillGapTarget; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"addFillGapSelector\", function() { return scroll_lock_addFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"removeFillGapSelector\", function() { return scroll_lock_removeFillGapSelector; });\n/* harmony export (binding) */ __nested_webpack_require_4019__.d(__webpack_exports__, \"refillGaps\", function() { return refillGaps; });\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar FILL_GAP_AVAILABLE_METHODS = ['padding', 'margin', 'width', 'max-width', 'none'];\nvar TOUCH_DIRECTION_DETECT_OFFSET = 3;\nvar state = {\n scroll: true,\n queue: 0,\n scrollableSelectors: ['[data-scroll-lock-scrollable]'],\n lockableSelectors: ['body', '[data-scroll-lock-lockable]'],\n fillGapSelectors: ['body', '[data-scroll-lock-fill-gap]', '[data-scroll-lock-lockable]'],\n fillGapMethod: FILL_GAP_AVAILABLE_METHODS[0],\n //\n startTouchY: 0,\n startTouchX: 0\n};\nvar disablePageScroll = function disablePageScroll(target) {\n if (state.queue <= 0) {\n state.scroll = false;\n scroll_lock_hideLockableOverflow();\n fillGaps();\n }\n\n scroll_lock_addScrollableTarget(target);\n state.queue++;\n};\nvar enablePageScroll = function enablePageScroll(target) {\n state.queue > 0 && state.queue--;\n\n if (state.queue <= 0) {\n state.scroll = true;\n scroll_lock_showLockableOverflow();\n unfillGaps();\n }\n\n scroll_lock_removeScrollableTarget(target);\n};\nvar getScrollState = function getScrollState() {\n return state.scroll;\n};\nvar clearQueueScrollLocks = function clearQueueScrollLocks() {\n state.queue = 0;\n};\nvar scroll_lock_getTargetScrollBarWidth = function getTargetScrollBarWidth($target) {\n var onlyExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (isElement($target)) {\n var currentOverflowYProperty = $target.style.overflowY;\n\n if (onlyExists) {\n if (!getScrollState()) {\n $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-overflow-y-property');\n }\n } else {\n $target.style.overflowY = 'scroll';\n }\n\n var width = scroll_lock_getCurrentTargetScrollBarWidth($target);\n $target.style.overflowY = currentOverflowYProperty;\n return width;\n } else {\n return 0;\n }\n};\nvar scroll_lock_getCurrentTargetScrollBarWidth = function getCurrentTargetScrollBarWidth($target) {\n if (isElement($target)) {\n if ($target === document.body) {\n var documentWidth = document.documentElement.clientWidth;\n var windowWidth = window.innerWidth;\n var currentWidth = windowWidth - documentWidth;\n return currentWidth;\n } else {\n var borderLeftWidthCurrentProperty = $target.style.borderLeftWidth;\n var borderRightWidthCurrentProperty = $target.style.borderRightWidth;\n $target.style.borderLeftWidth = '0px';\n $target.style.borderRightWidth = '0px';\n\n var _currentWidth = $target.offsetWidth - $target.clientWidth;\n\n $target.style.borderLeftWidth = borderLeftWidthCurrentProperty;\n $target.style.borderRightWidth = borderRightWidthCurrentProperty;\n return _currentWidth;\n }\n } else {\n return 0;\n }\n};\nvar getPageScrollBarWidth = function getPageScrollBarWidth() {\n var onlyExists = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n return scroll_lock_getTargetScrollBarWidth(document.body, onlyExists);\n};\nvar getCurrentPageScrollBarWidth = function getCurrentPageScrollBarWidth() {\n return scroll_lock_getCurrentTargetScrollBarWidth(document.body);\n};\nvar scroll_lock_addScrollableTarget = function addScrollableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-scrollable', '');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_removeScrollableTarget = function removeScrollableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.removeAttribute('data-scroll-lock-scrollable');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_addScrollableSelector = function addScrollableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.scrollableSelectors.push(selector);\n });\n }\n};\nvar scroll_lock_removeScrollableSelector = function removeScrollableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.scrollableSelectors = state.scrollableSelectors.filter(function (sSelector) {\n return sSelector !== selector;\n });\n });\n }\n};\nvar scroll_lock_addLockableTarget = function addLockableTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-lockable', '');\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n\n if (!getScrollState()) {\n scroll_lock_hideLockableOverflow();\n }\n }\n};\nvar scroll_lock_addLockableSelector = function addLockableSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.lockableSelectors.push(selector);\n });\n\n if (!getScrollState()) {\n scroll_lock_hideLockableOverflow();\n }\n\n scroll_lock_addFillGapSelector(selector);\n }\n};\nvar scroll_lock_setFillGapMethod = function setFillGapMethod(method) {\n if (method) {\n if (FILL_GAP_AVAILABLE_METHODS.indexOf(method) !== -1) {\n state.fillGapMethod = method;\n refillGaps();\n } else {\n var methods = FILL_GAP_AVAILABLE_METHODS.join(', ');\n throwError(\"\\\"\".concat(method, \"\\\" method is not available!\\nAvailable fill gap methods: \").concat(methods, \".\"));\n }\n }\n};\nvar scroll_lock_addFillGapTarget = function addFillGapTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.setAttribute('data-scroll-lock-fill-gap', '');\n\n if (!state.scroll) {\n scroll_lock_fillGapTarget($target);\n }\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_removeFillGapTarget = function removeFillGapTarget(target) {\n if (target) {\n var targets = argumentAsArray(target);\n targets.map(function ($targets) {\n eachNode($targets, function ($target) {\n if (isElement($target)) {\n $target.removeAttribute('data-scroll-lock-fill-gap');\n\n if (!state.scroll) {\n scroll_lock_unfillGapTarget($target);\n }\n } else {\n throwError(\"\\\"\".concat($target, \"\\\" is not a Element.\"));\n }\n });\n });\n }\n};\nvar scroll_lock_addFillGapSelector = function addFillGapSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n if (state.fillGapSelectors.indexOf(selector) === -1) {\n state.fillGapSelectors.push(selector);\n\n if (!state.scroll) {\n scroll_lock_fillGapSelector(selector);\n }\n }\n });\n }\n};\nvar scroll_lock_removeFillGapSelector = function removeFillGapSelector(selector) {\n if (selector) {\n var selectors = argumentAsArray(selector);\n selectors.map(function (selector) {\n state.fillGapSelectors = state.fillGapSelectors.filter(function (fSelector) {\n return fSelector !== selector;\n });\n\n if (!state.scroll) {\n scroll_lock_unfillGapSelector(selector);\n }\n });\n }\n};\nvar refillGaps = function refillGaps() {\n if (!state.scroll) {\n fillGaps();\n }\n};\n\nvar scroll_lock_hideLockableOverflow = function hideLockableOverflow() {\n var selector = arrayAsSelector(state.lockableSelectors);\n scroll_lock_hideLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_showLockableOverflow = function showLockableOverflow() {\n var selector = arrayAsSelector(state.lockableSelectors);\n scroll_lock_showLockableOverflowSelector(selector);\n};\n\nvar scroll_lock_hideLockableOverflowSelector = function hideLockableOverflowSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_hideLockableOverflowTarget($target);\n });\n};\n\nvar scroll_lock_showLockableOverflowSelector = function showLockableOverflowSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_showLockableOverflowTarget($target);\n });\n};\n\nvar scroll_lock_hideLockableOverflowTarget = function hideLockableOverflowTarget($target) {\n if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') !== 'true') {\n var computedStyle = window.getComputedStyle($target);\n $target.setAttribute('data-scroll-lock-saved-overflow-y-property', computedStyle.overflowY);\n $target.setAttribute('data-scroll-lock-saved-inline-overflow-property', $target.style.overflow);\n $target.setAttribute('data-scroll-lock-saved-inline-overflow-y-property', $target.style.overflowY);\n $target.style.overflow = 'hidden';\n $target.setAttribute('data-scroll-lock-locked', 'true');\n }\n};\n\nvar scroll_lock_showLockableOverflowTarget = function showLockableOverflowTarget($target) {\n if (isElement($target) && $target.getAttribute('data-scroll-lock-locked') === 'true') {\n $target.style.overflow = $target.getAttribute('data-scroll-lock-saved-inline-overflow-property');\n $target.style.overflowY = $target.getAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n $target.removeAttribute('data-scroll-lock-saved-overflow-property');\n $target.removeAttribute('data-scroll-lock-saved-inline-overflow-property');\n $target.removeAttribute('data-scroll-lock-saved-inline-overflow-y-property');\n $target.removeAttribute('data-scroll-lock-locked');\n }\n};\n\nvar fillGaps = function fillGaps() {\n state.fillGapSelectors.map(function (selector) {\n scroll_lock_fillGapSelector(selector);\n });\n};\n\nvar unfillGaps = function unfillGaps() {\n state.fillGapSelectors.map(function (selector) {\n scroll_lock_unfillGapSelector(selector);\n });\n};\n\nvar scroll_lock_fillGapSelector = function fillGapSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n var isLockable = state.lockableSelectors.indexOf(selector) !== -1;\n eachNode($targets, function ($target) {\n scroll_lock_fillGapTarget($target, isLockable);\n });\n};\n\nvar scroll_lock_fillGapTarget = function fillGapTarget($target) {\n var isLockable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (isElement($target)) {\n var scrollBarWidth;\n\n if ($target.getAttribute('data-scroll-lock-lockable') === '' || isLockable) {\n scrollBarWidth = scroll_lock_getTargetScrollBarWidth($target, true);\n } else {\n var $lockableParent = findParentBySelector($target, arrayAsSelector(state.lockableSelectors));\n scrollBarWidth = scroll_lock_getTargetScrollBarWidth($lockableParent, true);\n }\n\n if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n scroll_lock_unfillGapTarget($target);\n }\n\n var computedStyle = window.getComputedStyle($target);\n $target.setAttribute('data-scroll-lock-filled-gap', 'true');\n $target.setAttribute('data-scroll-lock-current-fill-gap-method', state.fillGapMethod);\n\n if (state.fillGapMethod === 'margin') {\n var currentMargin = parseFloat(computedStyle.marginRight);\n $target.style.marginRight = \"\".concat(currentMargin + scrollBarWidth, \"px\");\n } else if (state.fillGapMethod === 'width') {\n $target.style.width = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n } else if (state.fillGapMethod === 'max-width') {\n $target.style.maxWidth = \"calc(100% - \".concat(scrollBarWidth, \"px)\");\n } else if (state.fillGapMethod === 'padding') {\n var currentPadding = parseFloat(computedStyle.paddingRight);\n $target.style.paddingRight = \"\".concat(currentPadding + scrollBarWidth, \"px\");\n }\n }\n};\n\nvar scroll_lock_unfillGapSelector = function unfillGapSelector(selector) {\n var $targets = document.querySelectorAll(selector);\n eachNode($targets, function ($target) {\n scroll_lock_unfillGapTarget($target);\n });\n};\n\nvar scroll_lock_unfillGapTarget = function unfillGapTarget($target) {\n if (isElement($target)) {\n if ($target.getAttribute('data-scroll-lock-filled-gap') === 'true') {\n var currentFillGapMethod = $target.getAttribute('data-scroll-lock-current-fill-gap-method');\n $target.removeAttribute('data-scroll-lock-filled-gap');\n $target.removeAttribute('data-scroll-lock-current-fill-gap-method');\n\n if (currentFillGapMethod === 'margin') {\n $target.style.marginRight = \"\";\n } else if (currentFillGapMethod === 'width') {\n $target.style.width = \"\";\n } else if (currentFillGapMethod === 'max-width') {\n $target.style.maxWidth = \"\";\n } else if (currentFillGapMethod === 'padding') {\n $target.style.paddingRight = \"\";\n }\n }\n }\n};\n\nvar onResize = function onResize(e) {\n refillGaps();\n};\n\nvar onTouchStart = function onTouchStart(e) {\n if (!state.scroll) {\n state.startTouchY = e.touches[0].clientY;\n state.startTouchX = e.touches[0].clientX;\n }\n};\n\nvar scroll_lock_onTouchMove = function onTouchMove(e) {\n if (!state.scroll) {\n var startTouchY = state.startTouchY,\n startTouchX = state.startTouchX;\n var currentClientY = e.touches[0].clientY;\n var currentClientX = e.touches[0].clientX;\n\n if (e.touches.length < 2) {\n var selector = arrayAsSelector(state.scrollableSelectors);\n var direction = {\n up: startTouchY < currentClientY,\n down: startTouchY > currentClientY,\n left: startTouchX < currentClientX,\n right: startTouchX > currentClientX\n };\n var directionWithOffset = {\n up: startTouchY + TOUCH_DIRECTION_DETECT_OFFSET < currentClientY,\n down: startTouchY - TOUCH_DIRECTION_DETECT_OFFSET > currentClientY,\n left: startTouchX + TOUCH_DIRECTION_DETECT_OFFSET < currentClientX,\n right: startTouchX - TOUCH_DIRECTION_DETECT_OFFSET > currentClientX\n };\n\n var handle = function handle($el) {\n var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if ($el) {\n var parentScrollableEl = findParentBySelector($el, selector, false);\n\n if (elementIsInputRange($el)) {\n return false;\n }\n\n if (skip || elementIsScrollableField($el) && findParentBySelector($el, selector) || elementHasSelector($el, selector)) {\n var prevent = false;\n\n if (elementScrollLeftOnStart($el) && elementScrollLeftOnEnd($el)) {\n if (direction.up && elementScrollTopOnStart($el) || direction.down && elementScrollTopOnEnd($el)) {\n prevent = true;\n }\n } else if (elementScrollTopOnStart($el) && elementScrollTopOnEnd($el)) {\n if (direction.left && elementScrollLeftOnStart($el) || direction.right && elementScrollLeftOnEnd($el)) {\n prevent = true;\n }\n } else if (directionWithOffset.up && elementScrollTopOnStart($el) || directionWithOffset.down && elementScrollTopOnEnd($el) || directionWithOffset.left && elementScrollLeftOnStart($el) || directionWithOffset.right && elementScrollLeftOnEnd($el)) {\n prevent = true;\n }\n\n if (prevent) {\n if (parentScrollableEl) {\n handle(parentScrollableEl, true);\n } else {\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n }\n } else {\n handle(parentScrollableEl);\n }\n } else {\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n };\n\n handle(e.target);\n }\n }\n};\n\nvar onTouchEnd = function onTouchEnd(e) {\n if (!state.scroll) {\n state.startTouchY = 0;\n state.startTouchX = 0;\n }\n};\n\nif (typeof window !== 'undefined') {\n window.addEventListener('resize', onResize);\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('touchstart', onTouchStart);\n document.addEventListener('touchmove', scroll_lock_onTouchMove, {\n passive: false\n });\n document.addEventListener('touchend', onTouchEnd);\n}\n\nvar deprecatedMethods = {\n hide: function hide(target) {\n throwError('\"hide\" is deprecated! Use \"disablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#disablepagescrollscrollabletarget');\n disablePageScroll(target);\n },\n show: function show(target) {\n throwError('\"show\" is deprecated! Use \"enablePageScroll\" instead. \\n https://github.com/FL3NKEY/scroll-lock#enablepagescrollscrollabletarget');\n enablePageScroll(target);\n },\n toggle: function toggle(target) {\n throwError('\"toggle\" is deprecated! Do not use it.');\n\n if (getScrollState()) {\n disablePageScroll();\n } else {\n enablePageScroll(target);\n }\n },\n getState: function getState() {\n throwError('\"getState\" is deprecated! Use \"getScrollState\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getscrollstate');\n return getScrollState();\n },\n getWidth: function getWidth() {\n throwError('\"getWidth\" is deprecated! Use \"getPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getpagescrollbarwidth');\n return getPageScrollBarWidth();\n },\n getCurrentWidth: function getCurrentWidth() {\n throwError('\"getCurrentWidth\" is deprecated! Use \"getCurrentPageScrollBarWidth\" instead. \\n https://github.com/FL3NKEY/scroll-lock#getcurrentpagescrollbarwidth');\n return getCurrentPageScrollBarWidth();\n },\n setScrollableTargets: function setScrollableTargets(target) {\n throwError('\"setScrollableTargets\" is deprecated! Use \"addScrollableTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addscrollabletargetscrollabletarget');\n scroll_lock_addScrollableTarget(target);\n },\n setFillGapSelectors: function setFillGapSelectors(selector) {\n throwError('\"setFillGapSelectors\" is deprecated! Use \"addFillGapSelector\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgapselectorfillgapselector');\n scroll_lock_addFillGapSelector(selector);\n },\n setFillGapTargets: function setFillGapTargets(target) {\n throwError('\"setFillGapTargets\" is deprecated! Use \"addFillGapTarget\" instead. \\n https://github.com/FL3NKEY/scroll-lock#addfillgaptargetfillgaptarget');\n scroll_lock_addFillGapTarget(target);\n },\n clearQueue: function clearQueue() {\n throwError('\"clearQueue\" is deprecated! Use \"clearQueueScrollLocks\" instead. \\n https://github.com/FL3NKEY/scroll-lock#clearqueuescrolllocks');\n clearQueueScrollLocks();\n }\n};\n\nvar scrollLock = _objectSpread({\n disablePageScroll: disablePageScroll,\n enablePageScroll: enablePageScroll,\n getScrollState: getScrollState,\n clearQueueScrollLocks: clearQueueScrollLocks,\n getTargetScrollBarWidth: scroll_lock_getTargetScrollBarWidth,\n getCurrentTargetScrollBarWidth: scroll_lock_getCurrentTargetScrollBarWidth,\n getPageScrollBarWidth: getPageScrollBarWidth,\n getCurrentPageScrollBarWidth: getCurrentPageScrollBarWidth,\n addScrollableSelector: scroll_lock_addScrollableSelector,\n removeScrollableSelector: scroll_lock_removeScrollableSelector,\n addScrollableTarget: scroll_lock_addScrollableTarget,\n removeScrollableTarget: scroll_lock_removeScrollableTarget,\n addLockableSelector: scroll_lock_addLockableSelector,\n addLockableTarget: scroll_lock_addLockableTarget,\n addFillGapSelector: scroll_lock_addFillGapSelector,\n removeFillGapSelector: scroll_lock_removeFillGapSelector,\n addFillGapTarget: scroll_lock_addFillGapTarget,\n removeFillGapTarget: scroll_lock_removeFillGapTarget,\n setFillGapMethod: scroll_lock_setFillGapMethod,\n refillGaps: refillGaps,\n _state: state\n}, deprecatedMethods);\n\n/* harmony default export */ var scroll_lock = __webpack_exports__[\"default\"] = (scrollLock);\n\n/***/ })
1\n/******/ ])[\"default\"];\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc2Nyb2xsLWxvY2svZGlzdC9zY3JvbGwtbG9jay5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL3BhcmFsbGF4Ly4vbm9kZV9tb2R1bGVzL3Njcm9sbC1sb2NrL2Rpc3Qvc2Nyb2xsLWxvY2suanM/MzI1MSJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzY3JvbGxMb2NrXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNjcm9sbExvY2tcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybi
1B2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdG9vbHMuanNcbnZhciBhcmd1bWVudEFzQXJyYXkgPSBmdW5jdGlvbiBhcmd1bWVudEFzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnQpID8gYXJndW1lbnQgOiBbYXJndW1lbnRdO1xufTtcbnZhciBpc0VsZW1lbnQgPSBmdW5jdGlvbiBpc0VsZW1lbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBOb2RlO1xufTtcbnZhciBpc0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gaXNFbGVtZW50TGlzdChub2RlTGlzdCkge1xuICByZXR1cm4gbm9kZUxpc3QgaW5zdGFuY2VvZiBOb2RlTGlzdDtcbn07XG52YXIgZWFjaE5vZGUgPSBmdW5jdGlvbiBlYWNoTm9kZShub2RlTGlzdCwgY2FsbGJhY2spIHtcbiAgaWYgKG5vZGVMaXN0ICYmIGNhbGxiYWNrKSB7XG4gICAgbm9kZUxpc3QgPSBpc0VsZW1lbnRMaXN0KG5vZGVMaXN0KSA/IG5vZGVMaXN0IDogW25vZGVMaXN0XTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjYWxsYmFjayhub2RlTGlzdFtpXSwgaSwgbm9kZUxpc3QubGVuZ3RoKSA9PT0gdHJ1ZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgdGhyb3dFcnJvciA9IGZ1bmN0aW9uIHRocm93RXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gY29uc29sZS5lcnJvcihcIltzY3JvbGwtbG9ja10gXCIuY29uY2F0KG1lc3NhZ2UpKTtcbn07XG52YXIgYXJyYXlBc1NlbGVjdG9yID0gZnVuY3Rpb24gYXJyYXlBc1NlbGVjdG9yKGFycmF5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgIHZhciBzZWxlY3RvciA9IGFycmF5LmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG59O1xudmFyIG5vZGVMaXN0QXNBcnJheSA9IGZ1bmN0aW9uIG5vZGVMaXN0QXNBcnJheShub2RlTGlzdCkge1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgZWFjaE5vZGUobm9kZUxpc3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVzLnB1c2gobm9kZSk7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59O1xudmFyIGZpbmRQYXJlbnRCeVNlbGVjdG9yID0gZnVuY3Rpb24gZmluZFBhcmVudEJ5U2VsZWN0b3IoJGVsLCBzZWxlY3Rvcikge1xuICB2YXIgc2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBkb2N1bWVudDtcblxuICBpZiAoc2VsZiAmJiBub2RlTGlzdEFzQXJyYXkoJHJvb3QucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpLmluZGV4T2YoJGVsKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJGVsO1xuICB9XG5cbiAgd2hpbGUgKCgkZWwgPSAkZWwucGFyZW50RWxlbWVudCkgJiYgbm9kZUxpc3RBc0FycmF5KCRyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5pbmRleE9mKCRlbCkgPT09IC0xKSB7XG4gICAgO1xuICB9XG5cbiAgcmV0dXJuICRlbDtcbn07XG52YXIgZWxlbWVudEhhc1NlbGVjdG9yID0gZnVuY3Rpb24gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpIHtcbiAgdmFyICRyb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkb2N1bWVudDtcbiAgdmFyIGhhcyA9IG5vZGVMaXN0QXNBcnJheSgkcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkuaW5kZXhPZigkZWwpICE9PSAtMTtcbiAgcmV0dXJuIGhhcztcbn07XG52YXIgZWxlbWVudEhhc092ZXJmbG93SGlkZGVuID0gZnVuY3Rpb24gZWxlbWVudEhhc092ZXJmbG93SGlkZGVuKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCRlbCk7XG4gICAgdmFyIG92ZXJmbG93SXNIaWRkZW4gPSBjb21wdXRlZFN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJztcbiAgICByZXR1cm4gb3ZlcmZsb3dJc0hpZGRlbjtcbiAgfVxufTtcbnZhciBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxUb3BPblN0YXJ0KCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICByZXR1cm4gc2Nyb2xsVG9wIDw9IDA7XG4gIH1cbn07XG52YXIgZWxlbWVudFNjcm9sbFRvcE9uRW5kID0gZnVuY3Rpb24gZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsVG9wID0gJGVsLnNjcm9sbFRvcDtcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gJGVsLnNjcm9sbEhlaWdodDtcbiAgICB2YXIgc2Nyb2xsVG9wV2l0aEhlaWdodCA9IHNjcm9sbFRvcCArICRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgcmV0dXJuIHNjcm9sbFRvcFdpdGhIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0O1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCA9IGZ1bmN0aW9uIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHtcbiAgaWYgKCRlbCkge1xuICAgIGlmIChlbGVtZW50SGFzT3ZlcmZsb3dIaWRkZW4oJGVsKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHNjcm9sbExlZnQgPSAkZWwuc2Nyb2xsTGVmdDtcbiAgICByZXR1cm4gc2Nyb2xsTGVmdCA8PSAwO1xuICB9XG59O1xudmFyIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQgPSBmdW5jdGlvbiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkge1xuICBpZiAoJGVsKSB7XG4gICAgaWYgKGVsZW1lbnRIYXNPdmVyZmxvd0hpZGRlbigkZWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgc2Nyb2xsTGVmdCA9ICRlbC5zY3JvbGxMZWZ0O1xuICAgIHZhciBzY3JvbGxXaWR0aCA9ICRlbC5zY3JvbGxXaWR0aDtcbiAgICB2YXIgc2Nyb2xsTGVmdFdpdGhXaWR0aCA9IHNjcm9sbExlZnQgKyAkZWwub2Zmc2V0V2lkdGg7XG4gICAgcmV0dXJuIHNjcm9sbExlZnRXaXRoV2lkdGggPj0gc2Nyb2xsV2lkdGg7XG4gIH1cbn07XG52YXIgZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkID0gZnVuY3Rpb24gZWxlbWVudElzU2Nyb2xsYWJsZUZpZWxkKCRlbCkge1xuICB2YXIgc2VsZWN0b3IgPSAndGV4dGFyZWEsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJztcbiAgcmV0dXJuIGVsZW1lbnRIYXNTZWxlY3RvcigkZWwsIHNlbGVjdG9yKTtcbn07XG52YXIgZWxlbWVudElzSW5wdXRSYW5nZSA9IGZ1bmN0aW9uIGVsZW1lbnRJc0lucHV0UmFuZ2UoJGVsKSB7XG4gIHZhciBzZWxlY3RvciA9ICdpbnB1dFt0eXBlPVwicmFuZ2VcIl0nO1xuICByZXR1cm4gZWxlbWVudEhhc1NlbGVjdG9yKCRlbCwgc2VsZWN0b3IpO1xufTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVT
1EU6IC4vc3JjL3Njcm9sbC1sb2NrLmpzXG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBkaXNhYmxlUGFnZVNjcm9sbDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZW5hYmxlUGFnZVNjcm9sbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGVuYWJsZVBhZ2VTY3JvbGw7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldFNjcm9sbFN0YXRlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZ2V0U2Nyb2xsU3RhdGU7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNsZWFyUXVldWVTY3JvbGxMb2Nrc1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsZWFyUXVldWVTY3JvbGxMb2NrczsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGg7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBnZXRDdXJyZW50UGFnZVNjcm9sbEJhcldpZHRoOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVUYXJnZXQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFNjcm9sbGFibGVTZWxlY3RvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVRhcmdldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRMb2NrYWJsZVNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwic2V0RmlsbEdhcE1ldGhvZFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2Q7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZEZpbGxHYXBUYXJnZXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19hZGRGaWxsR2FwVGFyZ2V0OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwVGFyZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfcmVtb3ZlRmlsbEdhcFRhcmdldDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFNlbGVjdG9yOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVGaWxsR2FwU2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3I7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInJlZmlsbEdhcHNcIiwgZnVuY3Rpb24oKSB7IHJldHVybi
1ByZWZpbGxHYXBzOyB9KTtcbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuXG52YXIgRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMgPSBbJ3BhZGRpbmcnLCAnbWFyZ2luJywgJ3dpZHRoJywgJ21heC13aWR0aCcsICdub25lJ107XG52YXIgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPSAzO1xudmFyIHN0YXRlID0ge1xuICBzY3JvbGw6IHRydWUsXG4gIHF1ZXVlOiAwLFxuICBzY3JvbGxhYmxlU2VsZWN0b3JzOiBbJ1tkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGVdJ10sXG4gIGxvY2thYmxlU2VsZWN0b3JzOiBbJ2JvZHknLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBTZWxlY3RvcnM6IFsnYm9keScsICdbZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcF0nLCAnW2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGVdJ10sXG4gIGZpbGxHYXBNZXRob2Q6IEZJTExfR0FQX0FWQUlMQUJMRV9NRVRIT0RTWzBdLFxuICAvL1xuICBzdGFydFRvdWNoWTogMCxcbiAgc3RhcnRUb3VjaFg6IDBcbn07XG52YXIgZGlzYWJsZVBhZ2VTY3JvbGwgP
1SBmdW5jdGlvbiBkaXNhYmxlUGFnZVNjcm9sbCh0YXJnZXQpIHtcbiAgaWYgKHN0YXRlLnF1ZXVlIDw9IDApIHtcbiAgICBzdGF0ZS5zY3JvbGwgPSBmYWxzZTtcbiAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG4gIHN0YXRlLnF1ZXVlKys7XG59O1xudmFyIGVuYWJsZVBhZ2VTY3JvbGwgPSBmdW5jdGlvbiBlbmFibGVQYWdlU2Nyb2xsKHRhcmdldCkge1xuICBzdGF0ZS5xdWV1ZSA+IDAgJiYgc3RhdGUucXVldWUtLTtcblxuICBpZiAoc3RhdGUucXVldWUgPD0gMCkge1xuICAgIHN0YXRlLnNjcm9sbCA9IHRydWU7XG4gICAgc2Nyb2xsX2xvY2tfc2hvd0xvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB1bmZpbGxHYXBzKCk7XG4gIH1cblxuICBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCk7XG59O1xudmFyIGdldFNjcm9sbFN0YXRlID0gZnVuY3Rpb24gZ2V0U2Nyb2xsU3RhdGUoKSB7XG4gIHJldHVybiBzdGF0ZS5zY3JvbGw7XG59O1xudmFyIGNsZWFyUXVldWVTY3JvbGxMb2NrcyA9IGZ1bmN0aW9uIGNsZWFyUXVldWVTY3JvbGxMb2NrcygpIHtcbiAgc3RhdGUucXVldWUgPSAwO1xufTtcbnZhciBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgdmFyIG9ubHlFeGlzdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgY3VycmVudE92ZXJmbG93WVByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5vdmVyZmxvd1k7XG5cbiAgICBpZiAob25seUV4aXN0cykge1xuICAgICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICAgICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9ICdzY3JvbGwnO1xuICAgIH1cblxuICAgIHZhciB3aWR0aCA9IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0KTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93WSA9IGN1cnJlbnRPdmVyZmxvd1lQcm9wZXJ0eTtcbiAgICByZXR1cm4gd2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRhcmdldFNjcm9sbEJhcldpZHRoKCR0YXJnZXQpIHtcbiAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgIGlmICgkdGFyZ2V0ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB2Y
1XIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgdmFyIGN1cnJlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gZG9jdW1lbnRXaWR0aDtcbiAgICAgIHJldHVybiBjdXJyZW50V2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBib3JkZXJMZWZ0V2lkdGhDdXJyZW50UHJvcGVydHkgPSAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aDtcbiAgICAgIHZhciBib3JkZXJSaWdodFdpZHRoQ3VycmVudFByb3BlcnR5ID0gJHRhcmdldC5zdHlsZS5ib3JkZXJSaWdodFdpZHRoO1xuICAgICAgJHRhcmdldC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSAnMHB4JztcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9ICcwcHgnO1xuXG4gICAgICB2YXIgX2N1cnJlbnRXaWR0aCA9ICR0YXJnZXQub2Zmc2V0V2lkdGggLSAkdGFyZ2V0LmNsaWVudFdpZHRoO1xuXG4gICAgICAkdGFyZ2V0LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9IGJvcmRlckxlZnRXaWR0aEN1cnJlbnRQcm9wZXJ0eTtcbiAgICAgICR0YXJnZXQuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IGJvcmRlclJpZ2h0V2lkdGhDdXJyZW50UHJvcGVydHk7XG4gICAgICByZXR1cm4gX2N1cnJlbnRXaWR0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZ2V0UGFnZVNjcm9sbEJhcldpZHRoID0gZnVuY3Rpb24gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCkge1xuICB2YXIgb25seUV4aXN0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aChkb2N1bWVudC5ib2R5LCBvbmx5RXhpc3RzKTtcbn07XG52YXIgZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aCA9IGZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKSB7XG4gIHJldHVybiBzY3JvbGxfbG9ja19nZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGgoZG9jdW1lbnQuYm9keSk7XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZFNjcm9sbGFibGVUYXJnZXQgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlVGFyZ2V0KHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldHMgPSBhcmd1bWVudEFzQXJyYXkodGFyZ2V0KTtcbiAgICB0YXJnZXRzLm1hcChmdW5jdGlvbiAoJHRhcmdldHMpIHtcbiAgICAgIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgICAgICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgICAgICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2Nyb2xsYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVTY3JvbGxhYmxlVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNjcm9sbGFibGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRTY3JvbGxhYmxlU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRTY3JvbGxhYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLnNjcm9sbGFibGVTZWxlY3RvcnMucHVzaChzZWxlY3Rvcik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yID0gZnVuY3Rpb24gcmVtb3ZlU2Nyb2xsYWJsZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHZhciBzZWxlY3RvcnMgPSBhcmd1bWVudEFzQXJyYXkoc2VsZWN0b3IpO1xuICAgIHNlbGVjdG9ycy5tYXAoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICBzdGF0ZS5zY3JvbGxhYmxlU2VsZWN0b3JzID0gc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKHNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gc1NlbGVjdG9yICE9PSBzZWxlY3RvcjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0ID0gZnVuY3Rpb24gYWRkTG9ja2FibGVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrYWJsZScsICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICghZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3coKTtcbiAgICB9XG4gI
1H1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvciA9IGZ1bmN0aW9uIGFkZExvY2thYmxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIHN0YXRlLmxvY2thYmxlU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFnZXRTY3JvbGxTdGF0ZSgpKSB7XG4gICAgICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfc2V0RmlsbEdhcE1ldGhvZCA9IGZ1bmN0aW9uIHNldEZpbGxHYXBNZXRob2QobWV0aG9kKSB7XG4gIGlmIChtZXRob2QpIHtcbiAgICBpZiAoRklMTF9HQVBfQVZBSUxBQkxFX01FVEhPRFMuaW5kZXhPZihtZXRob2QpICE9PSAtMSkge1xuICAgICAgc3RhdGUuZmlsbEdhcE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIHJlZmlsbEdhcHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1ldGhvZHMgPSBGSUxMX0dBUF9BVkFJTEFCTEVfTUVUSE9EUy5qb2luKCcsICcpO1xuICAgICAgdGhyb3dFcnJvcihcIlxcXCJcIi5jb25jYXQobWV0aG9kLCBcIlxcXCIgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUhXFxuQXZhaWxhYmxlIGZpbGwgZ2FwIG1ldGhvZHM6IFwiKS5jb25jYXQobWV0aG9kcywgXCIuXCIpKTtcbiAgICB9XG4gIH1cbn07XG52YXIgc2Nyb2xsX2xvY2tfYWRkRmlsbEdhcFRhcmdldCA9IGZ1bmN0aW9uIGFkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGFyZ3VtZW50QXNBcnJheSh0YXJnZXQpO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uICgkdGFyZ2V0cykge1xuICAgICAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICAgICAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsLWdhcCcsICcnKTtcblxuICAgICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgICBzY3JvbGxfbG9ja19maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlRmlsbEdhcFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIHZhciB0YXJnZXRzID0gYXJndW1lbnRBc0FycmF5KHRhcmdldCk7XG4gICAgdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKCR0YXJnZXRzKSB7XG4gICAgICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICAgICAgaWYgKGlzRWxlbWVudCgkdGFyZ2V0KSkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGwtZ2FwJyk7XG5cbiAgICAgICAgICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgICAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKFwiXFxcIlwiLmNvbmNhdCgkdGFyZ2V0LCBcIlxcXCIgaXMgbm90IGEgRWxlbWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY3JvbGxfbG9ja19hZGRGaWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiBhZGRGaWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgaWYgKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IGFyZ3VtZW50QXNBcnJheShzZWxlY3Rvcik7XG4gICAgc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLmluZGV4T2Yoc2VsZWN0b3IpID09PSAtMSkge1xuICAgICAgICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLnB1c2goc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgICAgICAgc2Nyb2xsX2xvY2tfZmlsbEdhcFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIHJlbW92ZUZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgc2VsZWN0b3JzID0gYXJndW1lbnRBc0FycmF5KHNlbGVjdG9yKTtcbiAgICBzZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgc3RhdGUuZmlsbEdhcFNlbGVjdG9ycyA9IHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uIChmU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZTZWxlY3RvciAhPT0gc2VsZWN0b3I7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFzdGF0ZS5zY3JvbGwpIHtcbiAgICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xudmFyIHJlZmlsbEdhcHMgPSBmdW5jdGlvbiByZWZpbGxHYXBzKCkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIGZpbGxHYXBzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIGhpZGVMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvdyA9IGZ1bmN0aW9uIHNob3dMb2NrYWJsZU92ZXJmbG93KCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUubG9ja2FibGVTZWxlY3RvcnMpO1xuICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja19oaWRlTG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yID0gZnVuY3Rpb24gaGlkZUxvY2thYmxlT3ZlcmZsb3dTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93U2VsZWN0b3IgPSBmdW5jdGlvbiBzaG93TG9ja2FibGVPdmVyZmxvd1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHZhciAkdGFyZ2V0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlYWNoTm9kZSgkdGFyZ2V0cywgZnVuY3Rpb24gKCR0YXJnZXQpIHtcbiAgICBzY3JvbGxfbG9ja19zaG93TG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KTtcbiAgfSk7XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfaGlkZUxvY2thYmxlT3ZlcmZsb3dUYXJnZXQgPSBmdW5jdGlvbiBoaWRlTG9ja2FibGVPdmVyZmxvd1RhcmdldCgkdGFyZ2V0KSB7XG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkgJiYgJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJykgIT09ICd0cnVlJykge1xuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtb3ZlcmZsb3cteS1wcm9wZXJ0eScsIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3ctcHJv
1cGVydHknLCAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93KTtcbiAgICAkdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScsICR0YXJnZXQuc3R5bGUub3ZlcmZsb3dZKTtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2VkJywgJ3RydWUnKTtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX3Nob3dMb2NrYWJsZU92ZXJmbG93VGFyZ2V0ID0gZnVuY3Rpb24gc2hvd0xvY2thYmxlT3ZlcmZsb3dUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpICYmICR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWxvY2tlZCcpID09PSAndHJ1ZScpIHtcbiAgICAkdGFyZ2V0LnN0eWxlLm92ZXJmbG93ID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5zdHlsZS5vdmVyZmxvd1kgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1zYXZlZC1pbmxpbmUtb3ZlcmZsb3cteS1wcm9wZXJ0eScpO1xuICAgICR0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLXNhdmVkLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXByb3BlcnR5Jyk7XG4gICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stc2F2ZWQtaW5saW5lLW92ZXJmbG93LXktcHJvcGVydHknKTtcbiAgICAkdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1sb2NrZWQnKTtcbiAgfVxufTtcblxudmFyIGZpbGxHYXBzID0gZnVuY3Rpb24gZmlsbEdhcHMoKSB7XG4gIHN0YXRlLmZpbGxHYXBTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHVuZmlsbEdhcHMgPSBmdW5jdGlvbiB1bmZpbGxHYXBzKCkge1xuICBzdGF0ZS5maWxsR2FwU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICBzY3JvbGxfbG9ja191bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBTZWxlY3RvciA9IGZ1bmN0aW9uIGZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgdmFyIGlzTG9ja2FibGUgPSBzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycy5pbmRleE9mKHNlbGVjdG9yKSAhPT0gLTE7XG4gIGVhY2hOb2RlKCR0YXJnZXRzLCBmdW5jdGlvbiAoJHRhcmdldCkge1xuICAgIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQoJHRhcmdldCwgaXNMb2NrYWJsZSk7XG4gIH0pO1xufTtcblxudmFyIHNjcm9sbF9sb2NrX2ZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiBmaWxsR2FwVGFyZ2V0KCR0YXJnZXQpIHtcbiAgdmFyIGlzTG9ja2FibGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChpc0VsZW1lbnQoJHRhcmdldCkpIHtcbiAgICB2YXIgc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBpZiAoJHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stbG9ja2FibGUnKSA9PT0gJycgfHwgaXNMb2NrYWJsZSkge1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkdGFyZ2V0LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyICRsb2NrYWJsZVBhcmVudCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCR0YXJnZXQsIGFycmF5QXNTZWxlY3RvcihzdGF0ZS5sb2NrYWJsZVNlbGVjdG9ycykpO1xuICAgICAgc2Nyb2xsQmFyV2lkdGggPSBzY3JvbGxfbG9ja19nZXRUYXJnZXRTY3JvbGxCYXJXaWR0aCgkbG9ja2FibGVQYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICgkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1maWxsZWQtZ2FwJykgPT09ICd0cnVlJykge1xuICAgICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICAgIH1cblxuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoJHRhcmdldCk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcsICd0cnVlJyk7XG4gICAgJHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnLCBzdGF0ZS5maWxsR2FwTWV0aG9kKTtcblxuICAgIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgdmFyIGN1cnJlbnRNYXJnaW4gPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQpO1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRNYXJnaW4gKyBzY3JvbGxCYXJXaWR0aCwgXCJweFwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICR0YXJnZXQuc3R5bGUud2lkdGggPSBcImNhbGMoMTAwJSAtIFwiLmNvbmNhdChzY3JvbGxCYXJXaWR0aCwgXCJweClcIik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5maWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgJHRhcmdldC5zdHlsZS5tYXhXaWR0aCA9IFwiY2FsYygxMDAlIC0gXCIuY29uY2F0KHNjcm9sbEJhcldpZHRoLCBcInB4KVwiKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgdmFyIGN1cnJlbnRQYWRkaW5nID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCIuY29uY2F0KGN1cnJlbnRQYWRkaW5nICsgc2Nyb2xsQmFyV2lkdGgsIFwicHhcIik7XG4gICAgfVxuICB9XG59O1xuXG52YXIgc2Nyb2xsX2xvY2tfdW5maWxsR2FwU2VsZWN0b3IgPSBmdW5jdGlvbiB1bmZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcikge1xuICB2YXIgJHRhcmdldHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgZWFjaE5vZGUoJHRhcmdldHMsIGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgc2Nyb2xsX2xvY2tfdW5maWxsR2FwVGFyZ2V0KCR0YXJnZXQpO1xuICB9KTtcbn07XG5cbnZhciBzY3JvbGxfbG9ja191bmZpbGxHYXBUYXJnZXQgPSBmdW5jdGlvbiB1bmZpbGxHYXBUYXJnZXQoJHRhcmdldCkge1xuICBpZiAoaXNFbGVtZW50KCR0YXJnZXQpKSB7XG4gICAgaWYgKCR0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbC1sb2NrLWZpbGxlZC1nYXAnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB2Y
1XIgY3VycmVudEZpbGxHYXBNZXRob2QgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JvbGwtbG9jay1jdXJyZW50LWZpbGwtZ2FwLW1ldGhvZCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stZmlsbGVkLWdhcCcpO1xuICAgICAgJHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2Nyb2xsLWxvY2stY3VycmVudC1maWxsLWdhcC1tZXRob2QnKTtcblxuICAgICAgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWFyZ2luJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICd3aWR0aCcpIHtcbiAgICAgICAgJHRhcmdldC5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRGaWxsR2FwTWV0aG9kID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLm1heFdpZHRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpbGxHYXBNZXRob2QgPT09ICdwYWRkaW5nJykge1xuICAgICAgICAkdGFyZ2V0LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgb25SZXNpemUgPSBmdW5jdGlvbiBvblJlc2l6ZShlKSB7XG4gIHJlZmlsbEdhcHMoKTtcbn07XG5cbnZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgfVxufTtcblxudmFyIHNjcm9sbF9sb2NrX29uVG91Y2hNb3ZlID0gZnVuY3Rpb24gb25Ub3VjaE1vdmUoZSkge1xuICBpZiAoIXN0YXRlLnNjcm9sbCkge1xuICAgIHZhciBzdGFydFRvdWNoWSA9IHN0YXRlLnN0YXJ0VG91Y2hZLFxuICAgICAgICBzdGFydFRvdWNoWCA9IHN0YXRlLnN0YXJ0VG91Y2hYO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WSA9IGUudG91Y2hlc1swXS5jbGllbnRZO1xuICAgIHZhciBjdXJyZW50Q2xpZW50WCA9IGUudG91Y2hlc1swXS5jbGllbnRYO1xuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPCAyKSB7XG4gICAgICB2Y
1XIgc2VsZWN0b3IgPSBhcnJheUFzU2VsZWN0b3Ioc3RhdGUuc2Nyb2xsYWJsZVNlbGVjdG9ycyk7XG4gICAgICB2YXIgZGlyZWN0aW9uID0ge1xuICAgICAgICB1cDogc3RhcnRUb3VjaFkgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgPiBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgbGVmdDogc3RhcnRUb3VjaFggPCBjdXJyZW50Q2xpZW50WCxcbiAgICAgICAgcmlnaHQ6IHN0YXJ0VG91Y2hYID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG4gICAgICB2YXIgZGlyZWN0aW9uV2l0aE9mZnNldCA9IHtcbiAgICAgICAgdXA6IHN0YXJ0VG91Y2hZICsgVE9VQ0hfRElSRUNUSU9OX0RFVEVDVF9PRkZTRVQgPCBjdXJyZW50Q2xpZW50WSxcbiAgICAgICAgZG93bjogc3RhcnRUb3VjaFkgLSBUT1VDSF9ESVJFQ1RJT05fREVURUNUX09GRlNFVCA+IGN1cnJlbnRDbGllbnRZLFxuICAgICAgICBsZWZ0OiBzdGFydFRvdWNoWCArIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUIDwgY3VycmVudENsaWVudFgsXG4gICAgICAgIHJpZ2h0OiBzdGFydFRvdWNoWCAtIFRPVUNIX0RJUkVDVElPTl9ERVRFQ1RfT0ZGU0VUID4gY3VycmVudENsaWVudFhcbiAgICAgIH07XG5cbiAgICAgIHZhciBoYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUoJGVsKSB7XG4gICAgICAgIHZhciBza2lwID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcblxuICAgICAgICBpZiAoJGVsKSB7XG4gICAgICAgICAgdmFyIHBhcmVudFNjcm9sbGFibGVFbCA9IGZpbmRQYXJlbnRCeVNlbGVjdG9yKCRlbCwgc2VsZWN0b3IsIGZhbHNlKTtcblxuICAgICAgICAgIGlmIChlbGVtZW50SXNJbnB1dFJhbmdlKCRlbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcCB8fCBlbGVtZW50SXNTY3JvbGxhYmxlRmllbGQoJGVsKSAmJiBmaW5kUGFyZW50QnlTZWxlY3RvcigkZWwsIHNlbGVjdG9yKSB8fCBlbGVtZW50SGFzU2VsZWN0b3IoJGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHZhciBwcmV2ZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50U2Nyb2xsTGVmdE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsTGVmdE9uRW5kKCRlbCkpIHtcbiAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbi51cCAmJiBlbGVtZW50U2Nyb2xsVG9wT25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbi5kb3duICYmIGVsZW1lbnRTY3JvbGxUb3BPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgICAgcHJldmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSAmJiBlbGVtZW50U2Nyb2xsVG9wT25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLmxlZnQgJiYgZWxlbWVudFNjcm9sbExlZnRPblN0YXJ0KCRlbCkgfHwgZGlyZWN0aW9uLnJpZ2h0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25FbmQoJGVsKSkge1xuICAgICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbldpdGhPZmZzZXQudXAgJiYgZWxlbWVudFNjcm9sbFRvcE9uU3RhcnQoJGVsKSB8fCBkaXJlY3Rpb25XaXRoT2Zmc2V0LmRvd24gJiYgZWxlbWVudFNjcm9sbFRvcE9uRW5kKCRlbCkgfHwgZGlyZWN0aW9uV2l0aE9mZnNldC5sZWZ0ICYmIGVsZW1lbnRTY3JvbGxMZWZ0T25TdGFydCgkZWwpIHx8IGRpcmVjdGlvbldpdGhPZmZzZXQucmlnaHQgJiYgZWxlbWVudFNjcm9sbExlZnRPbkVuZCgkZWwpKSB7XG4gICAgICAgICAgICAgIHByZXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmVudCkge1xuICAgICAgICAgICAgICBpZiAocGFyZW50U2Nyb2xsYWJsZUVsKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlKHBhcmVudFNjcm9sbGFibGVFbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUocGFyZW50U2Nyb2xsYWJsZUVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlKGUudGFyZ2V0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZChlKSB7XG4gIGlmICghc3RhdGUuc2Nyb2xsKSB7XG4gICAgc3RhdGUuc3RhcnRUb3VjaFkgPSAwO1xuICAgIHN0YXRlLnN0YXJ0VG91Y2hYID0gMDtcbiAgfVxufTtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7XG59XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzY3JvbGxfbG9ja19vblRvdWNoTW92ZSwge1xuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQpO1xufVxuXG52YXIgZGVwcmVjYXRlZE1ldGhvZHMgPSB7XG4gIGhpZGU6IGZ1bmN0aW9uIGhpZGUodGFyZ2V0KSB7XG4gICAgdGhyb3dFcnJvcignXCJoaWRlXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZGlzYWJsZVBhZ2VTY3JvbGxcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjZGlzYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZGlzYWJsZVBhZ2VTY3JvbGwodGFyZ2V0KTtcbiAgfSxcbiAgc2hvdzogZnVuY3Rpb24gc2hvdyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNob3dcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJlbmFibGVQYWdlU2Nyb2xsXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2VuYWJsZXBhZ2VzY3JvbGxzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICB9LFxuICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInRvZ2dsZVwiIGlzIGRlcHJlY2F0ZWQhIERvIG5vdCB1c2UgaXQuJyk7XG5cbiAgICBpZiAoZ2V0U2Nyb2xsU3RhdGUoKSkge1xuICAgICAgZGlzYWJsZVBhZ2VTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlUGFnZVNjcm9sbCh0YXJnZXQpO1xuICAgIH1cbiAgfSxcbiAgZ2V0U3RhdGU6IGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0U3RhdGVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJnZXRTY3JvbGxTdGF0ZVwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNn
1ZXRzY3JvbGxzdGF0ZScpO1xuICAgIHJldHVybiBnZXRTY3JvbGxTdGF0ZSgpO1xuICB9LFxuICBnZXRXaWR0aDogZnVuY3Rpb24gZ2V0V2lkdGgoKSB7XG4gICAgdGhyb3dFcnJvcignXCJnZXRXaWR0aFwiIGlzIGRlcHJlY2F0ZWQhIFVzZSBcImdldFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRwYWdlc2Nyb2xsYmFyd2lkdGgnKTtcbiAgICByZXR1cm4gZ2V0UGFnZVNjcm9sbEJhcldpZHRoKCk7XG4gIH0sXG4gIGdldEN1cnJlbnRXaWR0aDogZnVuY3Rpb24gZ2V0Q3VycmVudFdpZHRoKCkge1xuICAgIHRocm93RXJyb3IoJ1wiZ2V0Q3VycmVudFdpZHRoXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiZ2V0Q3VycmVudFBhZ2VTY3JvbGxCYXJXaWR0aFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNnZXRjdXJyZW50cGFnZXNjcm9sbGJhcndpZHRoJyk7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgoKTtcbiAgfSxcbiAgc2V0U2Nyb2xsYWJsZVRhcmdldHM6IGZ1bmN0aW9uIHNldFNjcm9sbGFibGVUYXJnZXRzKHRhcmdldCkge1xuICAgIHRocm93RXJyb3IoJ1wic2V0U2Nyb2xsYWJsZVRhcmdldHNcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJhZGRTY3JvbGxhYmxlVGFyZ2V0XCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZHNjcm9sbGFibGV0YXJnZXRzY3JvbGxhYmxldGFyZ2V0Jyk7XG4gICAgc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCh0YXJnZXQpO1xuICB9LFxuICBzZXRGaWxsR2FwU2VsZWN0b3JzOiBmdW5jdGlvbiBzZXRGaWxsR2FwU2VsZWN0b3JzKHNlbGVjdG9yKSB7XG4gICAgdGhyb3dFcnJvcignXCJzZXRGaWxsR2FwU2VsZWN0b3JzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFNlbGVjdG9yXCIgaW5zdGVhZC4gXFxuIGh0dHBzOi8vZ2l0aHViLmNvbS9GTDNOS0VZL3Njcm9sbC1sb2NrI2FkZGZpbGxnYXBzZWxlY3RvcmZpbGxnYXBzZWxlY3RvcicpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH0sXG4gIHNldEZpbGxHYXBUYXJnZXRzOiBmdW5jdGlvbiBzZXRGaWxsR2FwVGFyZ2V0cyh0YXJnZXQpIHtcbiAgICB0aHJvd0Vycm9yKCdcInNldEZpbGxHYXBUYXJnZXRzXCIgaXMgZGVwcmVjYXRlZCEgVXNlIFwiYWRkRmlsbEdhcFRhcmdldFwiIGluc3RlYWQuIFxcbiBodHRwczovL2dpdGh1Yi5jb20vRkwzTktFWS9zY3JvbGwtbG9jayNhZGRmaWxsZ2FwdGFyZ2V0ZmlsbGdhcHRhcmdldCcpO1xuICAgIHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQodGFyZ2V0KTtcbiAgfSxcbiAgY2xlYXJRdWV1ZTogZnVuY3Rpb24gY2xlYXJRdWV1ZSgpIHtcbiAgICB0aHJvd0Vycm9yKCdcImNsZWFyUXVldWVcIiBpcyBkZXByZWNhdGVkISBVc2UgXCJjbGVhclF1ZXVlU2Nyb2xsTG9ja3NcIiBpbnN0ZWFkLiBcXG4gaHR0cHM6Ly9naXRodWIuY29tL0ZMM05LRVkvc2Nyb2xsLWxvY2sjY2xlYXJxdWV1ZXNjcm9sbGxvY2tzJyk7XG4gICAgY2xlYXJRdWV1ZVNjcm9sbExvY2tzKCk7XG4gIH1cbn07XG5cbnZhciBzY3JvbGxMb2NrID0gX29iamVjdFNwcmVhZCh7XG4gIGRpc2FibGVQYWdlU2Nyb2xsOiBkaXNhYmxlUGFnZVNjcm9sbCxcbiAgZW5hYmxlUGFnZVNjcm9sbDogZW5hYmxlUGFnZVNjcm9sbCxcbiAgZ2V0U2Nyb2xsU3RhdGU6IGdldFNjcm9sbFN0YXRlLFxuICBjbGVhclF1ZXVlU2Nyb2xsTG9ja3M6IGNsZWFyUXVldWVTY3JvbGxMb2NrcyxcbiAgZ2V0VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldFRhcmdldFNjcm9sbEJhcldpZHRoLFxuICBnZXRDdXJyZW50VGFyZ2V0U2Nyb2xsQmFyV2lkdGg6IHNjcm9sbF9sb2NrX2dldEN1cnJlbnRUYXJnZXRTY3JvbGxCYXJXaWR0aCxcbiAgZ2V0UGFnZVNjcm9sbEJhcldpZHRoOiBnZXRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGg6IGdldEN1cnJlbnRQYWdlU2Nyb2xsQmFyV2lkdGgsXG4gIGFkZFNjcm9sbGFibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVNlbGVjdG9yLFxuICByZW1vdmVTY3JvbGxhYmxlU2VsZWN0b3I6IHNjcm9sbF9sb2NrX3JlbW92ZVNjcm9sbGFibGVTZWxlY3RvcixcbiAgYWRkU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfYWRkU2Nyb2xsYWJsZVRhcmdldCxcbiAgcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldDogc2Nyb2xsX2xvY2tfcmVtb3ZlU2Nyb2xsYWJsZVRhcmdldCxcbiAgYWRkTG9ja2FibGVTZWxlY3Rvcjogc2Nyb2xsX2xvY2tfYWRkTG9ja2FibGVTZWxlY3RvcixcbiAgYWRkTG9ja2FibGVUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZExvY2thYmxlVGFyZ2V0LFxuICBhZGRGaWxsR2FwU2VsZWN0b3I6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBTZWxlY3RvcixcbiAgcmVtb3ZlRmlsbEdhcFNlbGVjdG9yOiBzY3JvbGxfbG9ja19yZW1vdmVGaWxsR2FwU2VsZWN0b3IsXG4gIGFkZEZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX2FkZEZpbGxHYXBUYXJnZXQsXG4gIHJlbW92ZUZpbGxHYXBUYXJnZXQ6IHNjcm9sbF9sb2NrX3JlbW92ZUZpbGxHYXBUYXJnZXQsXG4gIHNldEZpbGxHYXBNZXRob2Q6IHNjcm9sbF9sb2NrX3NldEZpbGxHYXBNZXRob2QsXG4gIHJlZmlsbEdhcHM6IHJlZmlsbEdhcHMsXG4gIF9zdGF0ZTogc3RhdGVcbn0sIGRlcHJlY2F0ZWRNZXRob2RzKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgc2Nyb2xsX2xvY2sgPSBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChzY3JvbGxMb2NrKTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pW1wiZGVmYXVsdFwiXTtcbn0pOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsUUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/scroll-lock/dist/scroll-lock.js\n")})},__webpack_module_cache__={};function __webpack_require__(moduleId){if(__webpack_module_cache__[moduleId])return __webpack_module_cache__[moduleId].exports;
1var module2=__webpack_module_cache__[moduleId]={exports:{}};return __webpack_modules__[moduleId].call(module2.exports,module2,module2.exports,__webpack_require__),module2.exports}(function(){__webpack_require__.n=function(module2){var getter=module2&&module2.__esModule?function(){return module2.default}:function(){return module2};return __webpack_require__.d(getter,{a:getter}),getter}})(),(function(){__webpack_require__.d=function(exports2,definition){for(var key in definition)__webpack_require__.o(definition,key)&&!__webpack_require__.o(exports2,key)&&Object.defineProperty(exports2,key,{enumerable:!0,get:definition[key]})}})(),(function(){__webpack_require__.o=function(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}})(),(function(){__webpack_require__.r=function(exports2){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(exports2,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports2,"__esModule",{value:!0})}})(),__webpack_require__("./source/scripts/app.js")})(); 2//# sourceMappingURL=/cdn/shop/t/60/assets/app.js.map?v=104344540167097334551788283778
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.