\\n
\\u8FD4\\u56DE \\n
\\u7EDF\\u8BA1 \\n
\\n
\\n
\\u6210\\u5C31 \\n
\\n ");\n achievementPage.find(\'#specialthanks\').click(function () {\n return _this2.switch(\'index\');\n }); // Talent\n\n var talentPage = $("\\n
\\n
\\u5929\\u8D4B\\u62BD\\u5361
\\n
10\\u8FDE\\u62BD\\uFF01 \\n
\\n
\\u8BF7\\u9009\\u62E93\\u4E2A \\n
\\n ");\n\n var createTalent = function createTalent(_ref) {\n var grade = _ref.grade,\n name = _ref.name,\n description = _ref.description;\n return $("
").concat(name, "\\uFF08").concat(description, "\\uFF09 "));\n };\n\n talentPage.find(\'#random\').click(function () {\n talentPage.find(\'#random\').hide();\n var ul = talentPage.find(\'#talents\');\n\n app_classPrivateFieldGet(_this2, _life).talentRandom().forEach(function (talent) {\n var li = createTalent(talent);\n ul.append(li);\n li.click(function () {\n if (li.hasClass(\'selected\')) {\n li.removeClass(\'selected\');\n\n app_classPrivateFieldGet(_this2, _talentSelected).delete(talent);\n\n if (app_classPrivateFieldGet(_this2, _talentSelected).size < 3) {\n talentPage.find(\'#next\').text(\'请选择3个\');\n }\n } else {\n if (app_classPrivateFieldGet(_this2, _talentSelected).size == 3) {\n _this2.hint(\'只能选3个天赋\');\n\n return;\n }\n\n var exclusive = app_classPrivateFieldGet(_this2, _life).exclusive(Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref2) {\n var id = _ref2.id;\n return id;\n }), talent.id);\n\n if (exclusive != null) {\n var _iterator = app_createForOfIteratorHelper(app_classPrivateFieldGet(_this2, _talentSelected)),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _step$value = _step.value,\n name = _step$value.name,\n id = _step$value.id;\n\n if (id == exclusive) {\n _this2.hint("\\u4E0E\\u5DF2\\u9009\\u62E9\\u7684\\u5929\\u8D4B\\u3010".concat(name, "\\u3011\\u51B2\\u7A81"));\n\n return;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return;\n }\n\n li.addClass(\'selected\');\n\n app_classPrivateFieldGet(_this2, _talentSelected).add(talent);\n\n if (app_classPrivateFieldGet(_this2, _talentSelected).size == 3) {\n talentPage.find(\'#next\').text(\'开始新人生\');\n }\n }\n });\n });\n\n talentPage.find(\'#next\').show();\n });\n talentPage.find(\'#next\').click(function () {\n if (app_classPrivateFieldGet(_this2, _talentSelected).size != 3) {\n _this2.hint(\'请选择3个天赋\');\n\n return;\n }\n\n talentPage.find(\'#next\').hide();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20 + app_classPrivateFieldGet(_this2, _life).getTalentAllocationAddition(Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref3) {\n var id = _ref3.id;\n return id;\n })));\n\n _this2.switch(\'property\');\n }); // Property\n // hint of extension tobermory.es6-string-html\n\n var propertyPage = $(\n /*html*/\n "\\n
\\n
\\n
\\u8C03\\u6574\\u521D\\u59CB\\u5C5E\\u6027
\\n
\\u53EF\\u7528\\u5C5E\\u6027\\u70B9\\uFF1A0
\\n
\\n
\\n
\\n
\\n \\u968F\\u673A\\u5206\\u914D \\n \\u5F00\\u59CB\\u65B0\\u4EBA\\u751F \\n
\\n
\\n ");\n\n propertyPage.mounted = function () {\n propertyPage.find(\'#talentSelectedView\').append("
\\u5DF2\\u9009\\u5929\\u8D4B " + Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref4) {\n var name = _ref4.name,\n description = _ref4.description;\n return "
".concat(name, "(").concat(description, ") ");\n }).join(\'\'));\n };\n\n var groups = {};\n\n var total = function total() {\n var t = 0;\n\n for (var type in groups) {\n t += groups[type].get();\n }\n\n return t;\n };\n\n var freshTotal = function freshTotal() {\n propertyPage.find(\'#total\').text("\\u53EF\\u7528\\u5C5E\\u6027\\u70B9\\uFF1A".concat(app_classPrivateFieldGet(_this2, _totalMax) - total()));\n };\n\n var getBtnGroups = function getBtnGroups(name, min, max) {\n var group = $("
".concat(name, " "));\n var btnSub = $("
");\n var inputBox = $("
");\n var btnAdd = $("
");\n group.append(btnSub);\n group.append(inputBox);\n group.append(btnAdd);\n\n var limit = function limit(v) {\n v = Number(v) || 0;\n v = Math.round(v);\n return v < min ? min : v > max ? max : v;\n };\n\n var get = function get() {\n return Number(inputBox.val());\n };\n\n var set = function set(v) {\n inputBox.val(limit(v));\n freshTotal();\n };\n\n btnAdd.click(function () {\n if (total() >= app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint(\'没有可分配的点数了\');\n\n return;\n }\n\n set(get() + 1);\n });\n btnSub.click(function () {\n return set(get() - 1);\n });\n inputBox.on(\'input\', function () {\n var t = total();\n var val = get();\n\n if (t > app_classPrivateFieldGet(_this2, _totalMax)) {\n val -= t - app_classPrivateFieldGet(_this2, _totalMax);\n }\n\n val = limit(val);\n\n if (val != inputBox.val()) {\n set(val);\n }\n\n freshTotal();\n });\n return {\n group: group,\n get: get,\n set: set\n };\n };\n\n groups.CHR = getBtnGroups("颜值", 0, 10); // 颜值 charm CHR\n\n groups.INT = getBtnGroups("智力", 0, 10); // 智力 intelligence INT\n\n groups.STR = getBtnGroups("体质", 0, 10); // 体质 strength STR\n\n groups.MNY = getBtnGroups("家境", 0, 10); // 家境 money MNY\n\n var ul = propertyPage.find(\'#propertyAllocation\');\n\n for (var type in groups) {\n ul.append(groups[type].group);\n }\n\n propertyPage.find(\'#random\').click(function () {\n var t = app_classPrivateFieldGet(_this2, _totalMax);\n\n var arr = [10, 10, 10, 10];\n\n while (t > 0) {\n var sub = Math.round(Math.random() * (Math.min(t, 10) - 1)) + 1;\n\n while (true) {\n var select = Math.floor(Math.random() * 4) % 4;\n if (arr[select] - sub < 0) continue;\n arr[select] -= sub;\n t -= sub;\n break;\n }\n }\n\n groups.CHR.set(10 - arr[0]);\n groups.INT.set(10 - arr[1]);\n groups.STR.set(10 - arr[2]);\n groups.MNY.set(10 - arr[3]);\n });\n propertyPage.find(\'#start\').click(function () {\n if (total() < app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint("\\u4F60\\u8FD8\\u6709".concat(app_classPrivateFieldGet(_this2, _totalMax) - total(), "\\u5C5E\\u6027\\u70B9\\u6CA1\\u6709\\u5206\\u914D\\u5B8C"));\n\n return;\n } else if (total() > app_classPrivateFieldGet(_this2, _totalMax)) {\n _this2.hint("\\u4F60\\u591A\\u4F7F\\u7528\\u4E86".concat(total() - app_classPrivateFieldGet(_this2, _totalMax), "\\u5C5E\\u6027\\u70B9"));\n\n return;\n }\n\n app_classPrivateFieldGet(_this2, _life).restart({\n CHR: groups.CHR.get(),\n INT: groups.INT.get(),\n STR: groups.STR.get(),\n MNY: groups.MNY.get(),\n SPR: 5,\n TLT: Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).map(function (_ref5) {\n var id = _ref5.id;\n return id;\n })\n });\n\n _this2.switch(\'trajectory\');\n\n app_classPrivateFieldGet(_this2, _pages).trajectory.born(); // $(document).keydown(function(event){\n // if(event.which == 32 || event.which == 13){\n // $(\'#lifeTrajectory\').click();\n // }\n // })\n\n }); // Trajectory\n\n var trajectoryPage = $("\\n
\\n
\\n
\\n
\\n \\u4EBA\\u751F\\u603B\\u7ED3 \\n \\u4EBA\\u751F\\u56DE\\u653E \\n
\\n
\\n
\\n
\\n
\\n ");\n trajectoryPage.find(\'#lifeTrajectory\').click(function () {\n if (app_classPrivateFieldGet(_this2, _isEnd)) return;\n\n var trajectory = app_classPrivateFieldGet(_this2, _life).next();\n\n var age = trajectory.age,\n content = trajectory.content,\n isEnd = trajectory.isEnd;\n var li = $("
".concat(age, "\\u5C81\\uFF1A ").concat(content.map(function (_ref6) {\n var type = _ref6.type,\n description = _ref6.description,\n grade = _ref6.grade,\n name = _ref6.name,\n postEvent = _ref6.postEvent;\n\n switch (type) {\n case \'TLT\':\n return "\\u5929\\u8D4B\\u3010".concat(name, "\\u3011\\u53D1\\u52A8\\uFF1A").concat(description);\n\n case \'EVT\':\n return description + (postEvent ? " ".concat(postEvent) : \'\');\n }\n }).join(\' \'), " "));\n li.appendTo(\'#lifeTrajectory\');\n $("#lifeTrajectory").scrollTop($("#lifeTrajectory")[0].scrollHeight);\n\n if (isEnd) {\n $(document).unbind("keydown");\n\n app_classPrivateFieldSet(_this2, _isEnd, true);\n\n trajectoryPage.find(\'#summary\').show(); // trajectoryPage.find(\'#domToImage\').show();\n } else {\n // 如未死亡,更新数值\n // Update properties if not die yet\n var property = app_classPrivateFieldGet(_this2, _life).getLastRecord();\n\n $("#lifeProperty").html("\\n
\\u989C\\u503C ".concat(property.CHR, " \\n
\\u667A\\u529B ").concat(property.INT, " \\n
\\u4F53\\u8D28 ").concat(property.STR, " \\n
\\u5BB6\\u5883 ").concat(property.MNY, " \\n
\\u5FEB\\u4E50 ").concat(property.SPR, " \\n "));\n }\n }); // html2canvas\n\n trajectoryPage.find(\'#domToImage\').click(function () {\n $("#lifeTrajectory").addClass("deleteFixed");\n var ua = navigator.userAgent.toLowerCase();\n domtoimage.toJpeg(document.getElementById(\'lifeTrajectory\')).then(function (dataUrl) {\n var link = document.createElement(\'a\');\n link.download = \'我的人生回放.jpeg\';\n link.href = dataUrl;\n link.click();\n $("#lifeTrajectory").removeClass("deleteFixed"); // 微信内置浏览器,显示图片,需要用户单独保存\n\n if (ua.match(/MicroMessenger/i) == "micromessenger") {\n $(\'#endImage\').attr(\'src\', dataUrl);\n }\n });\n }).hide();\n trajectoryPage.find(\'#summary\').click(function () {\n _this2.switch(\'summary\');\n }); // Summary\n\n var summaryPage = $("\\n
\\n
\\u4EBA\\u751F\\u603B\\u7ED3
\\n
\\n \\u989C\\u503C\\uFF1A 9\\u7EA7 \\u7F8E\\u82E5\\u5929\\u4ED9 \\n \\u667A\\u529B\\uFF1A 4\\u7EA7 \\u667A\\u529B\\u4E00\\u822C \\n \\u4F53\\u8D28\\uFF1A 1\\u7EA7 \\u6781\\u5EA6\\u865A\\u5F31 \\n \\u5BB6\\u5883\\uFF1A 6\\u7EA7 \\u5C0F\\u5EB7\\u4E4B\\u5BB6 \\n \\u4EAB\\u5E74\\uFF1A 3\\u5C81 \\u65E9\\u592D \\n \\u5FEB\\u4E50\\uFF1A 3\\u7EA7 \\u4E0D\\u592A\\u5E78\\u798F\\u7684\\u4EBA\\u751F \\n \\n
\\u5929\\u8D4B\\uFF0C\\u4F60\\u53EF\\u4EE5\\u9009\\u4E00\\u4E2A\\uFF0C\\u4E0B\\u8F88\\u5B50\\u8FD8\\u80FD\\u62BD\\u5230
\\n
\\n \\u9ED1\\u5E55\\uFF08\\u9762\\u8BD5\\u4E00\\u5B9A\\u6210\\u529F\\uFF09 \\n \\n
\\u518D\\u6B21\\u91CD\\u5F00\\n
\\n ");\n summaryPage.find(\'#again\').click(function () {\n _this2.times++;\n\n app_classPrivateFieldGet(_this2, _life).talentExtend(app_classPrivateFieldGet(_this2, _selectedExtendTalent));\n\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, null);\n\n app_classPrivateFieldGet(_this2, _talentSelected).clear();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20);\n\n app_classPrivateFieldSet(_this2, _isEnd, false);\n\n _this2.switch(\'index\');\n });\n\n app_classPrivateFieldSet(this, _pages, {\n loading: {\n page: loadingPage,\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'loading\');\n }\n },\n index: {\n page: indexPage,\n btnAchievement: indexPage.find(\'#achievement\'),\n btnRestart: indexPage.find(\'#restart\'),\n hint: indexPage.find(\'.hint\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).index.btnRestart.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'index\');\n\n indexPage.find(\'.hint\').hide();\n var times = _this2.times;\n var achievement = indexPage.find(\'#achievement\');\n var discord = indexPage.find(\'#discord\');\n var specialthanks = indexPage.find(\'#specialthanks\');\n\n if (times > 0) {\n achievement.show();\n discord.show();\n specialthanks.show();\n return;\n }\n\n achievement.hide();\n discord.hide();\n specialthanks.hide();\n }\n },\n specialthanks: {\n page: specialThanksPage,\n clear: function clear() {\n var groups = [specialThanksPage.find(\'#spthx > ul.g1\'), specialThanksPage.find(\'#spthx > ul.g2\')];\n groups.forEach(function (g) {\n return g.empty();\n });\n\n app_classPrivateFieldGet(_this2, _specialthanks).sort(function () {\n return 0.5 - Math.random();\n }).forEach(function (_ref7) {\n var group = _ref7.group,\n name = _ref7.name,\n comment = _ref7.comment,\n color = _ref7.color;\n return groups[--group].append("\\n
\\n ").concat(name, " \\n \\n \\n "));\n });\n }\n },\n achievement: {\n page: achievementPage,\n clear: function clear() {\n var total = achievementPage.find("ul#total");\n var achievements = achievementPage.find("ul#achievements");\n total.empty();\n achievements.empty();\n\n var formatRate = function formatRate(type, value) {\n var rate = getRate(type, value);\n var color = Object.keys(rate)[0];\n\n switch (parseInt(color)) {\n case 0:\n color = \'白色\';\n break;\n\n case 1:\n color = \'蓝色\';\n break;\n\n case 2:\n color = \'紫色\';\n break;\n\n case 3:\n color = \'橙色\';\n break;\n\n default:\n break;\n }\n\n var r = Object.values(rate)[0];\n\n switch (parseInt(r)) {\n case 1:\n r = \'不变\';\n break;\n\n case 2:\n r = \'翻倍\';\n break;\n\n case 3:\n r = \'三倍\';\n break;\n\n case 4:\n r = \'四倍\';\n break;\n\n case 5:\n r = \'五倍\';\n break;\n\n case 6:\n r = \'六倍\';\n break;\n\n default:\n break;\n }\n\n return "\\u62BD\\u5230".concat(color, "\\u6982\\u7387").concat(r);\n };\n\n var _classPrivateFieldGet3 = app_classPrivateFieldGet(_this2, _life).getTotal(),\n times = _classPrivateFieldGet3.times,\n achievement = _classPrivateFieldGet3.achievement,\n talentRate = _classPrivateFieldGet3.talentRate,\n eventRate = _classPrivateFieldGet3.eventRate;\n\n total.append("\\n
\\u5DF2\\u91CD\\u5F00").concat(times, "\\u6B21 ").concat(formatRate(\'times\', times), "\\n
\\u6210\\u5C31\\u8FBE\\u6210").concat(achievement, "\\u4E2A ").concat(formatRate(\'achievement\', achievement), "\\n
\\u4E8B\\u4EF6\\u9009\\u62E9\\u7387 ").concat(Math.floor(eventRate * 100), "%\\n
\\u5929\\u8D4B\\u6536\\u96C6\\u7387 ").concat(Math.floor(talentRate * 100), "%\\n "));\n\n var achievementsData = app_classPrivateFieldGet(_this2, _life).getAchievements();\n\n achievementsData.forEach(function (_ref8) {\n var name = _ref8.name,\n description = _ref8.description,\n hide = _ref8.hide,\n grade = _ref8.grade,\n isAchieved = _ref8.isAchieved;\n if (hide && !isAchieved) name = description = \'???\';\n achievements.append("
").concat(name, " ").concat(description, ""));\n });\n }\n },\n talent: {\n page: talentPage,\n talentList: talentPage.find(\'#talents\'),\n btnRandom: talentPage.find(\'#random\'),\n btnNext: talentPage.find(\'#next\'),\n pressEnter: function pressEnter() {\n var talentList = app_classPrivateFieldGet(_this2, _pages).talent.talentList;\n\n var btnRandom = app_classPrivateFieldGet(_this2, _pages).talent.btnRandom;\n\n var btnNext = app_classPrivateFieldGet(_this2, _pages).talent.btnNext;\n\n if (talentList.children().length) {\n btnNext.click();\n } else {\n btnRandom.click();\n }\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'talent\');\n\n talentPage.find(\'ul.selectlist\').empty();\n talentPage.find(\'#random\').show();\n\n app_classPrivateFieldSet(_this2, _totalMax, 20);\n }\n },\n property: {\n page: propertyPage,\n btnStart: propertyPage.find(\'#start\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).property.btnStart.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'property\');\n\n freshTotal();\n propertyPage.find(\'#talentSelectedView\').empty();\n }\n },\n trajectory: {\n page: trajectoryPage,\n lifeTrajectory: trajectoryPage.find(\'#lifeTrajectory\'),\n pressEnter: function pressEnter() {\n app_classPrivateFieldGet(_this2, _pages).trajectory.lifeTrajectory.click();\n },\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'trajectory\');\n\n trajectoryPage.find(\'#lifeTrajectory\').empty();\n trajectoryPage.find(\'#summary\').hide();\n\n app_classPrivateFieldSet(_this2, _isEnd, false);\n },\n born: function born() {\n trajectoryPage.find(\'#lifeTrajectory\').trigger("click");\n }\n },\n summary: {\n page: summaryPage,\n clear: function clear() {\n app_classPrivateFieldSet(_this2, _currentPage, \'summary\');\n\n var judge = summaryPage.find(\'#judge\');\n var talents = summaryPage.find(\'#talents\');\n judge.empty();\n talents.empty();\n\n app_classPrivateFieldGet(_this2, _talentSelected).forEach(function (talent) {\n var li = createTalent(talent);\n talents.append(li);\n li.click(function () {\n if (li.hasClass(\'selected\')) {\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, null);\n\n li.removeClass(\'selected\');\n } else if (app_classPrivateFieldGet(_this2, _selectedExtendTalent) != null) {\n _this2.hint(\'只能继承一个天赋\');\n\n return;\n } else {\n app_classPrivateFieldSet(_this2, _selectedExtendTalent, talent.id);\n\n li.addClass(\'selected\');\n }\n });\n });\n\n var summaryData = app_classPrivateFieldGet(_this2, _life).getSummary();\n\n var format = function format(discription, type) {\n var value = summaryData[type];\n\n var _summary = summary(type, value),\n judge = _summary.judge,\n grade = _summary.grade;\n\n return "
").concat(discription, "\\uFF1A ").concat(value, " ").concat(judge, " ");\n };\n\n judge.append("\\n ".concat(format(\'颜值\', \'CHR\'), "\\n ").concat(format(\'智力\', \'INT\'), "\\n ").concat(format(\'体质\', \'STR\'), "\\n ").concat(format(\'家境\', \'MNY\'), "\\n ").concat(format(\'快乐\', \'SPR\'), "\\n ").concat(format(\'享年\', \'AGE\'), "\\n ").concat(format(\'总评\', \'SUM\'), "\\n "));\n }\n }\n });\n\n $$on(\'achievement\', function (_ref9) {\n var name = _ref9.name;\n\n _this2.hint("\\u89E3\\u9501\\u6210\\u5C31\\u3010".concat(name, "\\u3011"), \'success\');\n });\n }\n }, {\n key: "switch",\n value: function _switch(page) {\n var p = app_classPrivateFieldGet(this, _pages)[page];\n\n if (!p) return;\n $(\'#main\').detach();\n p.clear();\n p.page.appendTo(\'body\');\n\n if (typeof p.page.mounted === \'function\') {\n p.page.mounted();\n }\n }\n }, {\n key: "hint",\n value: function hint(message) {\n var _this3 = this;\n\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \'info\';\n\n if (app_classPrivateFieldGet(this, _hintTimeout)) {\n clearTimeout(app_classPrivateFieldGet(this, _hintTimeout));\n\n app_classPrivateFieldSet(this, _hintTimeout, null);\n }\n\n hideBanners();\n requestAnimationFrame(function () {\n var banner = $(".banner.".concat(type));\n banner.addClass(\'visible\');\n banner.find(\'.banner-message\').text(message);\n\n if (type != \'error\') {\n app_classPrivateFieldSet(_this3, _hintTimeout, setTimeout(hideBanners, 3000));\n }\n });\n }\n }, {\n key: "setTheme",\n value: function setTheme(theme) {\n var themeLink = $(document).find(\'#themeLink\');\n\n if (theme == \'light\') {\n themeLink.attr(\'href\', \'light.css\');\n } else {\n themeLink.attr(\'href\', \'dark.css\');\n }\n }\n }, {\n key: "times",\n get: function get() {\n var _classPrivateFieldGet4;\n\n return ((_classPrivateFieldGet4 = app_classPrivateFieldGet(this, _life)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.times) || 0;\n },\n set: function set(v) {\n if (app_classPrivateFieldGet(this, _life)) app_classPrivateFieldGet(this, _life).times = v;\n }\n }]);\n\n return App;\n}();\n\n/* harmony default export */ const app = (App);\n;// CONCATENATED MODULE: ./src/index.js\n\n\nfunction src_asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\n\nfunction src_asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { src_asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { src_asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\n\n\n\n\n\n\n\n\n\n\nglobalThis.$$eventMap = new Map();\n\nglobalThis.$$event = function (tag, data) {\n var listener = $$eventMap.get(tag);\n if (listener) listener.forEach(function (fn) {\n return fn(data);\n });\n};\n\nglobalThis.$$on = function (tag, fn) {\n var listener = $$eventMap.get(tag);\n\n if (!listener) {\n listener = new Set();\n $$eventMap.set(tag, listener);\n }\n\n listener.add(fn);\n};\n\nglobalThis.$$off = function (tag, fn) {\n var listener = $$eventMap.get(tag);\n if (listener) listener.delete(fn);\n};\n\nglobalThis.json = /*#__PURE__*/function () {\n var _ref = src_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(fileName) {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return fetch("../data/".concat(fileName, ".json"));\n\n case 2:\n _context.next = 4;\n return _context.sent.json();\n\n case 4:\n return _context.abrupt("return", _context.sent);\n\n case 5:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n}(); // Pssst, I\'ve created a github package - https://github.com/brookesb91/dismissible\n\n\nglobalThis.hideBanners = function (e) {\n document.querySelectorAll(".banner.visible").forEach(function (b) {\n return b.classList.remove("visible");\n });\n};\n\nvar src_app = new app();\nsrc_app.initial();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE1RUE7O0FBZ0ZBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQWZBO0FBaUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQWpCQTtBQW1CQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBOztBQUNBOztBQUNBO0FBQUE7QUFOQTtBQVFBOztBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQURBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVCQTs7Ozs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOztBQXZDQTs7QUFGQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBZ0RBO0FBQUE7O0FBRUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQ0E7O0FBNEJBO0FBQ0E7QUFEQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFBQTtBQXJEQTtBQXVEQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFoQkE7QUFrQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBbkJBO0FBcUJBOzs7QUFFQTtBQUFBOztBQUNBO0FBUUE7OztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBQUE7QUExQkE7QUE0QkE7OztBQUVBO0FBQ0E7QUFDQTtBQURBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFQQTs7QUFTQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBSUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBVkE7O0FBWUE7QUFDQTtBQVVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBSUE7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3VkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQUE7QUF0QkE7QUF3QkE7O0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBUkE7QUFVQTs7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBOztBQUNBOztBQUVBO0FBQUE7QUE1QkE7QUE4QkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUhBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQUlBO0FBQUE7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkRBO0FBQ0E7QUFDQTs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUE7QUFBQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7O0FBQ0E7O0FBRkE7QUFBQTs7QUFBQTtBQUdBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFRQTtBQUNBOzs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFEQTs7QUFHQTtBQUNBO0FBREE7O0FBR0E7QUFDQTtBQURBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7QUFEQTtBQUFBOztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUlBO0FBQ0E7O0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuSEE7QUFDQTs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOztBQUpBOztBQUhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBWUE7QUFBQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBSEE7QUFIQTtBQVFBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBOztBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQURBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFHQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBOzs7OztBQVFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQU1BO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7OztBQWFBO0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFJQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTs7QUFMQTtBQUFBOztBQUFBO0FBTUE7QUFBQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTs7QUFDQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBb0JBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBRUE7O0FBSEE7QUFBQTs7QUFBQTtBQUlBO0FBQUE7QUFBQTs7QUFDQTtBQURBO0FBSkE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFPQTs7QUFQQTtBQUFBOztBQUFBO0FBUUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFEQTtBQVJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBV0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFFQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFDQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7OztBQUVBO0FBQUE7O0FBQUE7QUFBQTtBQUNBO0FBQUE7O0FBQ0E7O0FBQ0E7QUFJQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hOQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7Ozs7O0FBWUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFGQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUdBOztBQUlBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFuQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7QUFzQkE7QUFBQTs7QUFFQTtBQUNBOztBQVVBOztBQWVBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFZQTtBQUVBO0FBQUE7QUFFQTtBQVVBO0FBRUE7QUFBQTs7QUFHQTs7QUFTQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFHQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT0E7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFHQTs7QUFDQTtBQUFBO0FBQUE7O0FBY0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBR0E7O0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBREE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTs7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU5BOztBQVFBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7O0FBR0E7QUFjQTtBQUdBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFHQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQU9BO0FBQ0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7O0FBR0E7QUFtQkE7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUEzQkE7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFoQkE7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFMQTs7QUFPQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFQQTs7QUFTQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7O0FBT0E7O0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFsREE7QUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFwQkE7QUFzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBR0E7QUFaQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBZEE7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTs7QUFFQTtBQVNBO0FBekNBO0FBOUpBOztBQTJNQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsc0JBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUFHQTtBQUNBO0FBRUE7QUFBQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZnVuY3Rpb25zL3N1bW1hcnkuanM/NGRhZSIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZnVuY3Rpb25zL2FkZGl0aW9uLmpzPzgwM2QiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy91dGlsLmpzP2FlZGMiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL3Byb3BlcnR5LmpzPzI5YTYiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy9jb25kaXRpb24uanM/NmQwOCIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvZXZlbnQuanM/NDAyYSIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvdGFsZW50LmpzP2M1NmYiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2FjaGlldmVtZW50LmpzP2U0MjIiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2xpZmUuanM/OTEwNyIsIndlYnBhY2s6Ly9saWZlX3Jlc3RhcnQvLi9zcmMvYXBwLmpzPzExMTIiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2luZGV4LmpzP2I2MzUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGF0YSA9IHtcbiAgICBcIkNIUlwiOiBbXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MiwgXCJqdWRnZVwiOiBcIuS4jeS9s1wiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo0LCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcbiAgICAgICAge1wibWluXCI6OSwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjoxMSwgXCJqdWRnZVwiOiBcIumAhuWkqVwiLCBcImdyYWRlXCI6IDN9LFxuICAgIF0sXG4gICAgXCJNTllcIjogW1xuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjIsIFwianVkZ2VcIjogXCLkuI3kvbNcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo3LCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjksIFwianVkZ2VcIjogXCLnvZXop4FcIiwgXCJncmFkZVwiOiAyfSxcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcbiAgICBdLFxuICAgIFwiU1BSXCI6IFtcbiAgICAgICAge1wianVkZ2VcIjogXCLlnLDni7FcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MSwgXCJqdWRnZVwiOiBcIuaKmOejqFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoyLCBcImp1ZGdlXCI6IFwi5LiN5bm4XCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjQsIFwianVkZ2VcIjogXCLmma7pgJpcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NywgXCJqdWRnZVwiOiBcIuW5uOemj1wiLCBcImdyYWRlXCI6IDF9LFxuICAgICAgICB7XCJtaW5cIjo5LCBcImp1ZGdlXCI6IFwi5p6B5LmQXCIsIFwiZ3JhZGVcIjogMn0sXG4gICAgICAgIHtcIm1pblwiOjExLCBcImp1ZGdlXCI6IFwi5aSp5ZG9XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgXSxcbiAgICBcIklOVFwiOiBbXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MiwgXCJqdWRnZVwiOiBcIuS4jeS9s1wiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo0LCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcbiAgICAgICAge1wibWluXCI6OSwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjoxMSwgXCJqdWRnZVwiOiBcIumAhuWkqVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoyMSwgXCJqdWRnZVwiOiBcIuivhua1t1wiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoxMzEsIFwianVkZ2VcIjogXCLlhYPnpZ5cIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6NTAxLCBcImp1ZGdlXCI6IFwi5LuZ6a2CXCIsIFwiZ3JhZGVcIjogM30sXG4gICAgXSxcbiAgICBcIlNUUlwiOiBbXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MiwgXCJqdWRnZVwiOiBcIuS4jeS9s1wiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo0LCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcbiAgICAgICAge1wibWluXCI6OSwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjoxMSwgXCJqdWRnZVwiOiBcIumAhuWkqVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoyMSwgXCJqdWRnZVwiOiBcIuWHneawlFwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoxMDEsIFwianVkZ2VcIjogXCLnrZHln7pcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6NDAxLCBcImp1ZGdlXCI6IFwi6YeR5Li5XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgICAgIHtcIm1pblwiOjEwMDEsIFwianVkZ2VcIjogXCLlhYPlqbRcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MjAwMSwgXCJqdWRnZVwiOiBcIuS7meS9k1wiLCBcImdyYWRlXCI6IDN9LFxuICAgIF0sXG4gICAgXCJBR0VcIjogW1xuICAgICAgICB7XCJqdWRnZVwiOiBcIuiDjuatu+iFueS4rVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5pep5aStXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjEwLCBcImp1ZGdlXCI6IFwi5bCR5bm0XCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjE4LCBcImp1ZGdlXCI6IFwi55ub5bm0XCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjQwLCBcImp1ZGdlXCI6IFwi5Lit5bm0XCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjYwLCBcImp1ZGdlXCI6IFwi6Iqx55SyXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjcwLCBcImp1ZGdlXCI6IFwi5Y+k56iAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjgwLCBcImp1ZGdlXCI6IFwi5p2W5pydXCIsIFwiZ3JhZGVcIjogMn0sXG4gICAgICAgIHtcIm1pblwiOjkwLCBcImp1ZGdlXCI6IFwi5Y2X5bGxXCIsIFwiZ3JhZGVcIjogMn0sXG4gICAgICAgIHtcIm1pblwiOjk1LCBcImp1ZGdlXCI6IFwi5LiN6ICBXCIsIFwiZ3JhZGVcIjogM30sXG4gICAgICAgIHtcIm1pblwiOjEwMCwgXCJqdWRnZVwiOiBcIuS/ruS7mVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjo1MDAsIFwianVkZ2VcIjogXCLku5nlr79cIiwgXCJncmFkZVwiOiAzfSxcbiAgICBdLFxuICAgIFwiU1VNXCI6IFtcbiAgICAgICAge1wianVkZ2VcIjogXCLlnLDni7FcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NDEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NTAsIFwianVkZ2VcIjogXCLkuI3kvbNcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NjAsIFwianVkZ2VcIjogXCLmma7pgJpcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6ODAsIFwianVkZ2VcIjogXCLkvJjnp4BcIiwgXCJncmFkZVwiOiAxfSxcbiAgICAgICAge1wibWluXCI6MTAwLCBcImp1ZGdlXCI6IFwi572V6KeBXCIsIFwiZ3JhZGVcIjogMn0sXG4gICAgICAgIHtcIm1pblwiOjExMCwgXCJqdWRnZVwiOiBcIumAhuWkqVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoxMjAsIFwianVkZ2VcIjogXCLkvKDor7RcIiwgXCJncmFkZVwiOiAzfSxcbiAgICBdXG59XG5cbmZ1bmN0aW9uIHN1bW1hcnkodHlwZSwgdmFsdWUpIHtcbiAgICBsZXQgbGVuZ3RoID0gZGF0YVt0eXBlXS5sZW5ndGg7XG4gICAgd2hpbGUobGVuZ3RoLS0pIHtcbiAgICAgICAgY29uc3Qge21pbiwganVkZ2UsIGdyYWRlfSA9IGRhdGFbdHlwZV1bbGVuZ3RoXTtcbiAgICAgICAgaWYobWluPT12b2lkIDAgfHwgdmFsdWUgPj0gbWluKSByZXR1cm4ge2p1ZGdlLCBncmFkZX07XG4gICAgfVxufVxuXG5leHBvcnQgeyBzdW1tYXJ5IH07IiwiZXhwb3J0IGZ1bmN0aW9uIGdldFJhdGUodHlwZSwgdmFsdWUpIHtcclxuICAgIHN3aXRjaCh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAndGltZXMnOlxyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMDApIHJldHVybiB7Mjo2fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gNzApIHJldHVybiB7Mjo1fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gNTApIHJldHVybiB7Mjo0fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMzApIHJldHVybiB7MjozfTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTApIHJldHVybiB7MjoyfTtcclxuICAgICAgICAgICAgcmV0dXJuIHsyOiAxfTtcclxuICAgICAgICBjYXNlICdhY2hpZXZlbWVudCc6XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwMCkgcmV0dXJuIHszOjZ9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSA3MCkgcmV0dXJuIHszOjV9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSA1MCkgcmV0dXJuIHszOjR9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAzMCkgcmV0dXJuIHszOjN9O1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMCkgcmV0dXJuIHszOjJ9O1xyXG4gICAgICAgICAgICByZXR1cm4gezM6MX07XHJcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIHt9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JhZGUodHlwZSwgdmFsdWUpIHtcclxuICAgIHN3aXRjaCh0eXBlKSB7XHJcbiAgICAgICAgY2FzZSAndGltZXMnOlxyXG4gICAgICAgIGNhc2UgJ2FjaGlldmVtZW50JzpcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTAwKSByZXR1cm4gMztcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gNTApIHJldHVybiAyO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIGNhc2UgJ3RhbGVudFJhdGUnOlxyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjkpIHJldHVybiAzO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjUpIHJldHVybiAyO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjEpIHJldHVybiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICBjYXNlICdldmVudFJhdGUnOlxyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjUpIHJldHVybiAzO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjMpIHJldHVybiAyO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAwLjEpIHJldHVybiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDtcclxuICAgIH1cclxufSIsImZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gICAgc3dpdGNoKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAodj0+Y2xvbmUodikpO1xuICAgICAgICAgICAgY29uc3QgbmV3T2JqID0ge307XG4gICAgICAgICAgICBmb3IoY29uc3Qga2V5IGluIHZhbHVlKSBuZXdPYmpba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWF4KC4uLmFycikge1xuICAgIHJldHVybiBNYXRoLm1heCguLi5hcnIuZmxhdCgpKTtcbn1cblxuZnVuY3Rpb24gbWluKC4uLmFycikge1xuICAgIHJldHVybiBNYXRoLm1pbiguLi5hcnIuZmxhdCgpKTtcbn1cblxuZnVuY3Rpb24gc3VtKC4uLmFycikge1xuICAgIGxldCBzID0gMDtcbiAgICBhcnIuZmxhdCgpLmZvckVhY2godj0+cys9dik7XG4gICAgcmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIGF2ZXJhZ2UoLi4uYXJyKSB7XG4gICAgY29uc3QgcyA9IHN1bSguLi5hcnIpO1xuICAgIHJldHVybiBzIC8gYXJyLmZsYXQoKS5sZW5ndGg7XG59XG5cbmV4cG9ydCB7IGNsb25lLCBtYXgsIG1pbiwgc3VtLCBhdmVyYWdlIH07IiwiaW1wb3J0IHsgbWF4LCBtaW4sIHN1bSwgY2xvbmUgfSBmcm9tICcuL2Z1bmN0aW9ucy91dGlsLmpzJztcclxuXHJcbmNsYXNzIFByb3BlcnR5IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgICBUWVBFUyA9IHtcclxuICAgICAgICAvLyDmnKzlsYBcclxuICAgICAgICBBR0U6IFwiQUdFXCIsIC8vIOW5tOm+hCBhZ2UgQUdFXHJcbiAgICAgICAgQ0hSOiBcIkNIUlwiLCAvLyDpopzlgLwgY2hhcm0gQ0hSXHJcbiAgICAgICAgSU5UOiBcIklOVFwiLCAvLyDmmbrlipsgaW50ZWxsaWdlbmNlIElOVFxyXG4gICAgICAgIFNUUjogXCJTVFJcIiwgLy8g5L2T6LSoIHN0cmVuZ3RoIFNUUlxyXG4gICAgICAgIE1OWTogXCJNTllcIiwgLy8g5a625aKDIG1vbmV5IE1OWVxyXG4gICAgICAgIFNQUjogXCJTUFJcIiwgLy8g5b+r5LmQIHNwaXJpdCBTUFJcclxuICAgICAgICBMSUY6IFwiTElGXCIsIC8vIOeUn+WRvSBsaWZlIExJRkVcclxuICAgICAgICBUTFQ6IFwiVExUXCIsIC8vIOWkqei1iyB0YWxlbnQgVExUXHJcbiAgICAgICAgRVZUOiBcIkVWVFwiLCAvLyDkuovku7YgZXZlbnQgRVZUXHJcbiAgICAgICAgVE1TOiBcIlRNU1wiLCAvLyDmrKHmlbAgdGltZXMgVE1TXHJcblxyXG4gICAgICAgIC8vIEF1dG8gY2FsY1xyXG4gICAgICAgIExBR0U6IFwiTEFHRVwiLCAvLyDmnIDkvY7lubTpvoQgTG93IEFnZVxyXG4gICAgICAgIEhBR0U6IFwiSEFHRVwiLCAvLyDmnIDpq5jlubTpvoQgSGlnaCBBZ2VcclxuICAgICAgICBMQ0hSOiBcIkxDSFJcIiwgLy8g5pyA5L2O6aKc5YC8IExvdyBDaGFybVxyXG4gICAgICAgIEhDSFI6IFwiSENIUlwiLCAvLyDmnIDpq5jpopzlgLwgSGlnaCBDaGFybVxyXG4gICAgICAgIExJTlQ6IFwiTElOVFwiLCAvLyDmnIDkvY7mmbrlipsgTG93IEludGVsbGlnZW5jZVxyXG4gICAgICAgIEhJTlQ6IFwiSElOVFwiLCAvLyDmnIDpq5jmmbrlipsgSGlnaCBJbnRlbGxpZ2VuY2VcclxuICAgICAgICBMU1RSOiBcIkxTVFJcIiwgLy8g5pyA5L2O5L2T6LSoIExvdyBTdHJlbmd0aFxyXG4gICAgICAgIEhTVFI6IFwiSFNUUlwiLCAvLyDmnIDpq5jkvZPotKggSGlnaCBTdHJlbmd0aFxyXG4gICAgICAgIExNTlk6IFwiTE1OWVwiLCAvLyDmnIDkvY7lrrblooMgTG93IE1vbmV5XHJcbiAgICAgICAgSE1OWTogXCJITU5ZXCIsIC8vIOacgOmrmOWutuWigyBIaWdoIE1vbmV5XHJcbiAgICAgICAgTFNQUjogXCJMU1BSXCIsIC8vIOacgOS9juW/q+S5kCBMb3cgU3Bpcml0XHJcbiAgICAgICAgSFNQUjogXCJIU1BSXCIsIC8vIOacgOmrmOW/q+S5kCBIaWdoIFNwaXJpdFxyXG5cclxuICAgICAgICBTVU06IFwiU1VNXCIsIC8vIOaAu+ivhCBzdW1tYXJ5IFNVTVxyXG5cclxuICAgICAgICBFWFQ6IFwiRVhUXCIsIC8vIOe7p+aJv+Wkqei1i1xyXG5cclxuICAgICAgICAvLyDmgLvorqFcclxuICAgICAgICAvLyBBY2hpZXZlbWVudCBUb3RhbFxyXG4gICAgICAgIEFUTFQ6IFwiQVRMVFwiLCAvLyDmi6XmnInov4fnmoTlpKnotYsgQWNoaWV2ZSBUYWxlbnRcclxuICAgICAgICBBRVZUOiBcIkFFVlRcIiwgLy8g6Kem5Y+R6L+H55qE5LqL5Lu2IEFjaGlldmUgRXZlbnRcclxuICAgICAgICBBQ0hWOiBcIkFDSFZcIiwgLy8g6L6+5oiQ55qE5oiQ5bCxIEFjaGlldmVtZW50XHJcblxyXG4gICAgICAgIENUTFQ6IFwiUlRMVFwiLCAvLyDlpKnotYvpgInmi6nmlbAgQ291bnQgVGFsZW50XHJcbiAgICAgICAgQ0VWVDogXCJSRVZUXCIsIC8vIOS6i+S7tuaUtumbhuaVsCBDb3VudCBFdmVudFxyXG4gICAgICAgIENBQ0hWOiBcIkNBQ0hWXCIsIC8vIOaIkOWwsei+vuaIkOaVsCBDb3VudCBBY2hpZXZlbWVudFxyXG5cclxuICAgIH07XHJcblxyXG4gICAgI2FnZURhdGE7XHJcbiAgICAjZGF0YSA9IHt9O1xyXG5cclxuICAgIGluaXRpYWwoe2FnZX0pIHtcclxuXHJcbiAgICAgICAgdGhpcy4jYWdlRGF0YSA9IGFnZTtcclxuICAgICAgICBmb3IoY29uc3QgYSBpbiBhZ2UpIHtcclxuICAgICAgICAgICAgbGV0IHsgZXZlbnQsIHRhbGVudCB9ID0gYWdlW2FdO1xyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShldmVudCkpXHJcbiAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSBldmVudC5tYXAodj0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt2fWAuc3BsaXQoJyonKS5tYXAobj0+TnVtYmVyKG4pKTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlLmxlbmd0aD09MSkgdmFsdWUucHVzaCgxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheSh0YWxlbnQpKVxyXG4gICAgICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Lm1hcCh2PT5OdW1iZXIodikpO1xyXG5cclxuICAgICAgICAgICAgYWdlW2FdID0geyBldmVudCwgdGFsZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnQoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuI2RhdGEgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IC0xLFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSU5UXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1RSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1BSXTogMCxcclxuXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxJRl06IDEsXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5UTFRdOiBbXSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuRVZUXTogW10sXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MQUdFXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxDSFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTElOVF06IEluZmluaXR5LFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MU1RSXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxTUFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTE1OWV06IEluZmluaXR5LFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSEFHRV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSENIUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSElOVF06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNUUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSE1OWV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNQUl06IC1JbmZpbml0eSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2Uoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnRMYXN0U3RlcCgpIHtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MSU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxTUFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5TUFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MTU5ZXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuTU5ZKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5ISU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhNTlldID0gdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5IU1BSXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1BSKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQocHJvcCkge1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmUodGhpcy4jZGF0YVtwcm9wXSk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVU06XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIQUdFID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IQUdFKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhDSFIgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhDSFIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSElOVCA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSElOVCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIU1RSID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IU1RSKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhNTlkgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhNTlkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSFNQUiA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSFNQUik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihzdW0oSENIUiwgSElOVCwgSFNUUiwgSE1OWSwgSFNQUikqMiArIEhBR0UvMik7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldCgndGltZXMnKSB8fCAwO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuRVhUOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubHNnZXQoJ2V4dGVuZFRhbGVudCcpIHx8IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BVExUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQUVWVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldChwcm9wKSB8fCBbXTtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFjayhwcm9wKVxyXG4gICAgICAgICAgICAgICAgKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmYWxsYmFjayhwcm9wKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxBR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOiByZXR1cm4gdGhpcy5UWVBFUy5BR0U7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQ0hSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjogcmV0dXJuIHRoaXMuVFlQRVMuQ0hSO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTElOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6IHJldHVybiB0aGlzLlRZUEVTLklOVDtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOiByZXR1cm4gdGhpcy5UWVBFUy5TVFI7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MTU5ZOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTogcmV0dXJuIHRoaXMuVFlQRVMuTU5ZO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTFNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6IHJldHVybiB0aGlzLlRZUEVTLlNQUjtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6IHJldHVybiB0aGlzLlRZUEVTLkFUTFQ7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOiByZXR1cm4gdGhpcy5UWVBFUy5BRVZUO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6IHJldHVybiB0aGlzLlRZUEVTLkFDSFY7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFHRTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLklOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNUUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLk1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJRjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlRMVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkVWVDpcclxuICAgICAgICAgICAgICAgIHRoaXMuaGwocHJvcCwgdGhpcy4jZGF0YVtwcm9wXSA9IGNsb25lKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjaGlldmUocHJvcCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuVE1TOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3NldCgndGltZXMnLCBwYXJzZUludCh2YWx1ZSkgfHwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FWFQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxzc2V0KCdleHRlbmRUYWxlbnQnLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0UmVjb3JkKCkge1xyXG4gICAgICAgIHJldHVybiBjbG9uZSh7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuQUdFKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5JTlRdOiB0aGlzLmdldCh0aGlzLlRZUEVTLklOVCksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLlNUUl06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1RSKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5TUFJdOiB0aGlzLmdldCh0aGlzLlRZUEVTLlNQUiksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlKHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IHYgb2YgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZShwcm9wLCBOdW1iZXIodikpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhsKHByb3AsIHRoaXMuI2RhdGFbcHJvcF0gKz0gTnVtYmVyKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jZGF0YVtwcm9wXTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlPDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHYuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXghPS0xKSB2LnNwbGljZShpbmRleCwxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCF2LmluY2x1ZGVzKHZhbHVlKSkgdi5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNoaWV2ZShwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldChcclxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0KHByb3ApICsgcGFyc2VJbnQodmFsdWUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVmZmVjdChlZmZlY3RzKSB7XHJcbiAgICAgICAgZm9yKGNvbnN0IHByb3AgaW4gZWZmZWN0cylcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2UocHJvcCwgTnVtYmVyKGVmZmVjdHNbcHJvcF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0VuZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy5UWVBFUy5MSUYpIDwgMTtcclxuICAgIH1cclxuXHJcbiAgICBhZ2VOZXh0KCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlKHRoaXMuVFlQRVMuQUdFLCAxKTtcclxuICAgICAgICBjb25zdCBhZ2UgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgY29uc3Qge2V2ZW50LCB0YWxlbnR9ID0gdGhpcy5nZXRBZ2VEYXRhKGFnZSk7XHJcbiAgICAgICAgcmV0dXJuIHthZ2UsIGV2ZW50LCB0YWxlbnR9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFnZURhdGEoYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lKHRoaXMuI2FnZURhdGFbYWdlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGwocHJvcCwgdmFsdWUpIHtcclxuICAgICAgICBsZXQga2V5cztcclxuICAgICAgICBzd2l0Y2gocHJvcCkge1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQUdFOiBrZXlzID0gW3RoaXMuVFlQRVMuTEFHRSwgdGhpcy5UWVBFUy5IQUdFXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6IGtleXMgPSBbdGhpcy5UWVBFUy5MQ0hSLCB0aGlzLlRZUEVTLkhDSFJdOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLklOVDoga2V5cyA9IFt0aGlzLlRZUEVTLkxJTlQsIHRoaXMuVFlQRVMuSElOVF07IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuU1RSOiBrZXlzID0gW3RoaXMuVFlQRVMuTFNUUiwgdGhpcy5UWVBFUy5IU1RSXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6IGtleXMgPSBbdGhpcy5UWVBFUy5MTU5ZLCB0aGlzLlRZUEVTLkhNTlldOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNQUjoga2V5cyA9IFt0aGlzLlRZUEVTLkxTUFIsIHRoaXMuVFlQRVMuSFNQUl07IGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IFtsLCBoXSA9IGtleXM7XHJcbiAgICAgICAgdGhpcy4jZGF0YVtsXSA9IG1pbih0aGlzLiNkYXRhW2xdLCB2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVtoXSA9IG1heCh0aGlzLiNkYXRhW2hdLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWNoaWV2ZShwcm9wLCBuZXdEYXRhKSB7XHJcbiAgICAgICAgbGV0IGtleTtcclxuICAgICAgICBzd2l0Y2gocHJvcCkge1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQUNIVjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3REYXRhID0gdGhpcy5sc2dldChwcm9wKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubHNzZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcCxcclxuICAgICAgICAgICAgICAgICAgICAobGFzdERhdGEgfHwgW10pLmNvbmNhdChbW25ld0RhdGEsIERhdGUubm93KCldXSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6IGtleSA9IHRoaXMuVFlQRVMuQVRMVDsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6IGtleSA9IHRoaXMuVFlQRVMuQUVWVDsgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGFzdERhdGEgPSB0aGlzLmxzZ2V0KGtleSkgfHwgW107XHJcbiAgICAgICAgdGhpcy5sc3NldChcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBBcnJheS5mcm9tKFxyXG4gICAgICAgICAgICAgICAgbmV3IFNldChcclxuICAgICAgICAgICAgICAgICAgICBsYXN0RGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KG5ld0RhdGF8fFtdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmxhdCgpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgbHNnZXQoa2V5KSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgaWYoZGF0YSA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGxzc2V0KGtleSwgdmFsdWUpIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9wZXJ0eTsiLCJmdW5jdGlvbiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pIHtcclxuXHJcbiAgICBjb25zdCBjb25kaXRpb25zID0gW107XHJcbiAgICBjb25zdCBsZW5ndGggPSBjb25kaXRpb24ubGVuZ3RoO1xyXG4gICAgY29uc3Qgc3RhY2sgPSBbXTtcclxuICAgIHN0YWNrLnVuc2hpZnQoY29uZGl0aW9ucyk7XHJcbiAgICBsZXQgY3Vyc29yID0gMDtcclxuICAgIGNvbnN0IGNhdGNoU3RyaW5nID0gaSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RyID0gY29uZGl0aW9uLnN1YnN0cmluZyhjdXJzb3IsIGkpLnRyaW0oKTtcclxuICAgICAgICBjdXJzb3IgPSBpO1xyXG4gICAgICAgIGlmKHN0cikgc3RhY2tbMF0ucHVzaChzdHIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmb3IobGV0IGk9MDsgaTxsZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN3aXRjaChjb25kaXRpb25baV0pIHtcclxuICAgICAgICAgICAgY2FzZSAnICc6IGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnKCc6XHJcbiAgICAgICAgICAgICAgICBjYXRjaFN0cmluZyhpKTtcclxuICAgICAgICAgICAgICAgIGN1cnNvciArKztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgc3RhY2tbMF0ucHVzaChzdWIpO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sudW5zaGlmdChzdWIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICcpJzpcclxuICAgICAgICAgICAgICAgIGNhdGNoU3RyaW5nKGkpO1xyXG4gICAgICAgICAgICAgICAgY3Vyc29yICsrO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnfCc6XHJcbiAgICAgICAgICAgIGNhc2UgJyYnOlxyXG4gICAgICAgICAgICAgICAgY2F0Y2hTdHJpbmcoaSk7XHJcbiAgICAgICAgICAgICAgICBjYXRjaFN0cmluZyhpKzEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYXRjaFN0cmluZyhsZW5ndGgpO1xyXG5cclxuICAgIHJldHVybiBjb25kaXRpb25zO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgY29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjb25kaXRpb25zID0gcGFyc2VDb25kaXRpb24oY29uZGl0aW9uKTtcclxuICAgIHJldHVybiBjaGVja1BhcnNlZENvbmRpdGlvbnMocHJvcGVydHksIGNvbmRpdGlvbnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1BhcnNlZENvbmRpdGlvbnMocHJvcGVydHksIGNvbmRpdGlvbnMpIHtcclxuICAgIGlmKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpKSByZXR1cm4gY2hlY2tQcm9wKHByb3BlcnR5LCBjb25kaXRpb25zKTtcclxuICAgIGlmKGNvbmRpdGlvbnMubGVuZ3RoID09IDApIHJldHVybiB0cnVlO1xyXG4gICAgaWYoY29uZGl0aW9ucy5sZW5ndGggPT0gMSkgcmV0dXJuIGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9uc1swXSk7XHJcblxyXG4gICAgbGV0IHJldCA9IGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9uc1swXSk7XHJcbiAgICBmb3IobGV0IGk9MTsgaTxjb25kaXRpb25zLmxlbmd0aDsgaSs9Mikge1xyXG4gICAgICAgIHN3aXRjaChjb25kaXRpb25zW2ldKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJyYnOlxyXG4gICAgICAgICAgICAgICAgaWYocmV0KSByZXQgPSBjaGVja1BhcnNlZENvbmRpdGlvbnMocHJvcGVydHksIGNvbmRpdGlvbnNbaSsxXSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnfCc6XHJcbiAgICAgICAgICAgICAgICBpZihyZXQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0ID0gY2hlY2tQYXJzZWRDb25kaXRpb25zKHByb3BlcnR5LCBjb25kaXRpb25zW2krMV0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1Byb3AocHJvcGVydHksIGNvbmRpdGlvbikge1xyXG5cclxuICAgIGNvbnN0IGxlbmd0aCA9IGNvbmRpdGlvbi5sZW5ndGg7XHJcbiAgICBsZXQgaSA9IGNvbmRpdGlvbi5zZWFyY2goL1s+PFxcIVxcPz1dLyk7XHJcblxyXG4gICAgY29uc3QgcHJvcCA9IGNvbmRpdGlvbi5zdWJzdHJpbmcoMCxpKTtcclxuICAgIGNvbnN0IHN5bWJvbCA9IGNvbmRpdGlvbi5zdWJzdHJpbmcoaSwgaSs9KGNvbmRpdGlvbltpKzFdPT0nPSc/MjoxKSk7XHJcbiAgICBjb25zdCBkID0gY29uZGl0aW9uLnN1YnN0cmluZyhpLCBsZW5ndGgpO1xyXG5cclxuICAgIGNvbnN0IHByb3BEYXRhID0gcHJvcGVydHkuZ2V0KHByb3ApO1xyXG4gICAgY29uc3QgY29uZGl0aW9uRGF0YSA9IGRbMF09PSdbJz8gSlNPTi5wYXJzZShkKTogTnVtYmVyKGQpO1xyXG5cclxuICAgIHN3aXRjaChzeW1ib2wpIHtcclxuICAgICAgICBjYXNlICc+JzogIHJldHVybiBwcm9wRGF0YSA+ICBjb25kaXRpb25EYXRhO1xyXG4gICAgICAgIGNhc2UgJzwnOiAgcmV0dXJuIHByb3BEYXRhIDwgIGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPj0nOiByZXR1cm4gcHJvcERhdGEgPj0gY29uZGl0aW9uRGF0YTtcclxuICAgICAgICBjYXNlICc8PSc6IHJldHVybiBwcm9wRGF0YSA8PSBjb25kaXRpb25EYXRhO1xyXG4gICAgICAgIGNhc2UgJz0nOlxyXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHByb3BEYXRhKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGF0YS5pbmNsdWRlcyhjb25kaXRpb25EYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3BEYXRhID09IGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnIT0nOlxyXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHByb3BEYXRhKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiAhcHJvcERhdGEuaW5jbHVkZXMoY29uZGl0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm9wRGF0YSA9PSBjb25kaXRpb25EYXRhO1xyXG4gICAgICAgIGNhc2UgJz8nOlxyXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHByb3BEYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IHAgb2YgcHJvcERhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZGl0aW9uRGF0YS5pbmNsdWRlcyhwKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkRhdGEuaW5jbHVkZXMocHJvcERhdGEpO1xyXG4gICAgICAgIGNhc2UgJyEnOlxyXG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHByb3BEYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IHAgb2YgcHJvcERhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29uZGl0aW9uRGF0YS5pbmNsdWRlcyhwKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICFjb25kaXRpb25EYXRhLmluY2x1ZGVzKHByb3BEYXRhKTtcclxuXHJcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0TWF4VHJpZ2dlcnMoY29uZGl0aW9uKSB7XHJcbiAgICAvLyBBc3N1bWluZyBvbmx5IGFnZSByZWxhdGVkIHRhbGVudHMgY2FuIGJlIHRyaWdnZXJlZCBtdWx0aXBsZSB0aW1lcy5cclxuICAgIGNvbnN0IFJFX0FHRV9DT05ESVRJT04gPSAvQUdFXFw/XFxbKFswLTlcXCxdKylcXF0vO1xyXG4gICAgY29uc3QgbWF0Y2hfb2JqZWN0ID0gUkVfQUdFX0NPTkRJVElPTi5leGVjKGNvbmRpdGlvbik7XHJcbiAgICBpZiAobWF0Y2hfb2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgICAvLyBOb3QgYWdlIHJlbGF0ZWQsIHNpbmdsZSB0cmlnZ2VyLlxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBhZ2VfbGlzdCA9IG1hdGNoX29iamVjdFsxXS5zcGxpdChcIixcIik7XHJcbiAgICByZXR1cm4gYWdlX2xpc3QubGVuZ3RoO1xyXG59XHJcblxyXG5leHBvcnQgeyBjaGVja0NvbmRpdGlvbiwgZXh0cmFjdE1heFRyaWdnZXJzIH07IiwiaW1wb3J0IHsgY2xvbmUgfSBmcm9tICcuL2Z1bmN0aW9ucy91dGlsLmpzJztcbmltcG9ydCB7IGNoZWNrQ29uZGl0aW9uIH0gZnJvbSAnLi9mdW5jdGlvbnMvY29uZGl0aW9uLmpzJztcblxuY2xhc3MgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgICNldmVudHM7XG5cbiAgICBpbml0aWFsKHtldmVudHN9KSB7XG4gICAgICAgIHRoaXMuI2V2ZW50cyA9IGV2ZW50cztcbiAgICAgICAgZm9yKGNvbnN0IGlkIGluIGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaWRdO1xuICAgICAgICAgICAgaWYoIWV2ZW50LmJyYW5jaCkgY29udGludWU7XG4gICAgICAgICAgICBldmVudC5icmFuY2ggPSBldmVudC5icmFuY2gubWFwKGI9PntcbiAgICAgICAgICAgICAgICBiID0gYi5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIGJbMV0gPSBOdW1iZXIoYlsxXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvdW50KCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy4jZXZlbnRzKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgY2hlY2soZXZlbnRJZCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBOb1JhbmRvbSB9ID0gdGhpcy5nZXQoZXZlbnRJZCk7XG4gICAgICAgIGlmKE5vUmFuZG9tKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKGV4Y2x1ZGUgJiYgY2hlY2tDb25kaXRpb24ocHJvcGVydHksIGV4Y2x1ZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKGluY2x1ZGUpIHJldHVybiBjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgaW5jbHVkZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldChldmVudElkKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy4jZXZlbnRzW2V2ZW50SWRdO1xuICAgICAgICBpZighZXZlbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBFdmVudFske2V2ZW50SWR9XWApO1xuICAgICAgICByZXR1cm4gY2xvbmUoZXZlbnQpO1xuICAgIH1cblxuICAgIGluZm9ybWF0aW9uKGV2ZW50SWQpIHtcbiAgICAgICAgY29uc3QgeyBldmVudDogZGVzY3JpcHRpb24gfSA9IHRoaXMuZ2V0KGV2ZW50SWQpXG4gICAgICAgIHJldHVybiB7IGRlc2NyaXB0aW9uIH07XG4gICAgfVxuXG4gICAgZG8oZXZlbnRJZCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgeyBlZmZlY3QsIGJyYW5jaCwgZXZlbnQ6IGRlc2NyaXB0aW9uLCBwb3N0RXZlbnQgfSA9IHRoaXMuZ2V0KGV2ZW50SWQpO1xuICAgICAgICBpZihicmFuY2gpXG4gICAgICAgICAgICBmb3IoY29uc3QgW2NvbmQsIG5leHRdIG9mIGJyYW5jaClcbiAgICAgICAgICAgICAgICBpZihjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgY29uZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVmZmVjdCwgbmV4dCwgZGVzY3JpcHRpb24gfTtcbiAgICAgICAgcmV0dXJuIHsgZWZmZWN0LCBwb3N0RXZlbnQsIGRlc2NyaXB0aW9uIH07XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50OyIsImltcG9ydCB7IGNsb25lIH0gZnJvbSAnLi9mdW5jdGlvbnMvdXRpbC5qcyc7XHJcbmltcG9ydCB7IGNoZWNrQ29uZGl0aW9uLCBleHRyYWN0TWF4VHJpZ2dlcnMgfSBmcm9tICcuL2Z1bmN0aW9ucy9jb25kaXRpb24uanMnO1xyXG5pbXBvcnQgeyBnZXRSYXRlIH0gZnJvbSAnLi9mdW5jdGlvbnMvYWRkaXRpb24uanMnO1xyXG5cclxuY2xhc3MgVGFsZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgICAjdGFsZW50cztcclxuXHJcbiAgICBpbml0aWFsKHt0YWxlbnRzfSkge1xyXG4gICAgICAgIHRoaXMuI3RhbGVudHMgPSB0YWxlbnRzO1xyXG4gICAgICAgIGZvcihjb25zdCBpZCBpbiB0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhbGVudCA9IHRhbGVudHNbaWRdO1xyXG4gICAgICAgICAgICB0YWxlbnQuaWQ9IE51bWJlcihpZCk7XHJcbiAgICAgICAgICAgIHRhbGVudC5ncmFkZSA9IE51bWJlcih0YWxlbnQuZ3JhZGUpO1xyXG4gICAgICAgICAgICB0YWxlbnQubWF4X3RyaWdnZXJzID0gZXh0cmFjdE1heFRyaWdnZXJzKHRhbGVudC5jb25kaXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3VudCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy4jdGFsZW50cykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKHRhbGVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGNvbnN0IHsgY29uZGl0aW9uIH0gPSB0aGlzLmdldCh0YWxlbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCh0YWxlbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHRhbGVudCA9IHRoaXMuI3RhbGVudHNbdGFsZW50SWRdO1xyXG4gICAgICAgIGlmKCF0YWxlbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBUYWxlbnRbJHt0YWxlbnRJZH1dYCk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lKHRhbGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5mb3JtYXRpb24odGFsZW50SWQpIHtcclxuICAgICAgICBjb25zdCB7IGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9ID0gdGhpcy5nZXQodGFsZW50SWQpXHJcbiAgICAgICAgcmV0dXJuIHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhjbHVzaXZlKHRhbGVuZHMsIGV4Y2x1c2l2ZUlkKSB7XHJcbiAgICAgICAgY29uc3QgeyBleGNsdXNpdmUgfSA9IHRoaXMuZ2V0KGV4Y2x1c2l2ZUlkKTtcclxuICAgICAgICBpZighZXhjbHVzaXZlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBmb3IoY29uc3QgdGFsZW50IG9mIHRhbGVuZHMpIHtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IGUgb2YgZXhjbHVzaXZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZih0YWxlbnQgPT0gZSkgcmV0dXJuIHRhbGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0YWxlbnRSYW5kb20oaW5jbHVkZSwge3RpbWVzID0gMCwgYWNoaWV2ZW1lbnQgPSAwfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgcmF0ZSA9IHsgMToxMDAsIDI6MTAsIDM6MSwgfTtcclxuICAgICAgICBjb25zdCByYXRlQWRkaXRpb24gPSB7IDE6MSwgMjoxLCAzOjEsIH07XHJcbiAgICAgICAgY29uc3QgdGltZXNSYXRlID0gZ2V0UmF0ZSgndGltZXMnLCB0aW1lcyk7XHJcbiAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnRSYXRlID0gZ2V0UmF0ZSgnYWNoaWV2ZW1lbnQnLCBhY2hpZXZlbWVudCk7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiB0aW1lc1JhdGUpXHJcbiAgICAgICAgICAgIHJhdGVBZGRpdGlvbltncmFkZV0gKz0gdGltZXNSYXRlW2dyYWRlXSAtIDE7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiBhY2hpZXZlbWVudFJhdGUpXHJcbiAgICAgICAgICAgIHJhdGVBZGRpdGlvbltncmFkZV0gKz0gYWNoaWV2ZW1lbnRSYXRlW2dyYWRlXSAtIDE7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiByYXRlQWRkaXRpb24pXHJcbiAgICAgICAgICAgIHJhdGVbZ3JhZGVdICo9IHJhdGVBZGRpdGlvbltncmFkZV07XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmRvbUdyYWRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmFuZG9tTnVtYmVyID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCk7XHJcbiAgICAgICAgICAgIGlmKChyYW5kb21OdW1iZXIgLT0gcmF0ZVszXSkgPCAwKSByZXR1cm4gMztcclxuICAgICAgICAgICAgaWYoKHJhbmRvbU51bWJlciAtPSByYXRlWzJdKSA8IDApIHJldHVybiAyO1xyXG4gICAgICAgICAgICBpZigocmFuZG9tTnVtYmVyIC09IHJhdGVbMV0pIDwgMCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gMTAwMCwgMTAwLCAxMCwgMVxyXG4gICAgICAgIGNvbnN0IHRhbGVudExpc3QgPSB7fTtcclxuICAgICAgICBmb3IoY29uc3QgdGFsZW50SWQgaW4gdGhpcy4jdGFsZW50cykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGlkLCBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24gfSA9IHRoaXMuI3RhbGVudHNbdGFsZW50SWRdO1xyXG4gICAgICAgICAgICBpZihpZCA9PSBpbmNsdWRlKSB7XHJcbiAgICAgICAgICAgICAgICBpbmNsdWRlID0geyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24sIGlkIH07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighdGFsZW50TGlzdFtncmFkZV0pIHRhbGVudExpc3RbZ3JhZGVdID0gW3sgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uLCBpZCB9XTtcclxuICAgICAgICAgICAgZWxzZSB0YWxlbnRMaXN0W2dyYWRlXS5wdXNoKHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uLCBpZCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgQXJyYXkoMTApXHJcbiAgICAgICAgICAgIC5maWxsKDEpLm1hcCgodiwgaSk9PntcclxuICAgICAgICAgICAgICAgIGlmKCFpICYmIGluY2x1ZGUpIHJldHVybiBpbmNsdWRlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyYWRlID0gcmFuZG9tR3JhZGUoKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlKHRhbGVudExpc3RbZ3JhZGVdLmxlbmd0aCA9PSAwKSBncmFkZS0tO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGFsZW50TGlzdFtncmFkZV0ubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZW5ndGgpICUgbGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhbGVudExpc3RbZ3JhZGVdLnNwbGljZShyYW5kb20sMSlbMF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnRzKSB7XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh0YWxlbnRzKSkge1xyXG4gICAgICAgICAgICBsZXQgYWRkaXRpb24gPSAwO1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgdGFsZW50IG9mIHRhbGVudHMpXHJcbiAgICAgICAgICAgICAgICBhZGRpdGlvbiArPSB0aGlzLmFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWRkaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXQodGFsZW50cykuc3RhdHVzKSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIGRvKHRhbGVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGNvbnN0IHsgZWZmZWN0LCBjb25kaXRpb24sIGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9ID0gdGhpcy5nZXQodGFsZW50SWQpO1xyXG4gICAgICAgIGlmKGNvbmRpdGlvbiAmJiAhY2hlY2tDb25kaXRpb24ocHJvcGVydHksIGNvbmRpdGlvbikpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB7IGVmZmVjdCwgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhbGVudDsiLCJpbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnO1xyXG5pbXBvcnQgeyBjaGVja0NvbmRpdGlvbiB9IGZyb20gJy4vZnVuY3Rpb25zL2NvbmRpdGlvbi5qcyc7XHJcblxyXG5jbGFzcyBBY2hpZXZlbWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLy8g5pe25py6XHJcbiAgICBPcHBvcnR1bml0eSA9IHtcclxuICAgICAgICBTVEFSVDogXCJTVEFSVFwiLCAgICAgICAgICAgICAvLyDliIbphY3lrozmiJDngrnmlbDvvIzngrnlh7vlvIDlp4vmlrDkurrnlJ/lkI5cclxuICAgICAgICBUUkFKRUNUT1JZOiBcIlRSQUpFQ1RPUllcIiwgICAvLyDmr4/kuIDlubTnmoTkurrnlJ/nu4/ljobkuK1cclxuICAgICAgICBTVU1NQVJZOiBcIlNVTU1BUllcIiwgICAgICAgICAvLyDkurrnlJ/nu5PmnZ/vvIzngrnlh7vkurrnlJ/mgLvnu5PlkI5cclxuICAgICAgICBFTkQ6IFwiRU5EXCIsICAgICAgICAgICAgICAgICAvLyDmuLjmiI/lrozmiJDvvIzngrnlh7vph43lvIAg6YeN5byA5qyh5pWw5Zyo6L+Z5LmL5ZCO5omN5LyaKzFcclxuICAgIH07XHJcblxyXG4gICAgI2FjaGlldmVtZW50cztcclxuXHJcbiAgICBpbml0aWFsKHthY2hpZXZlbWVudHN9KSB7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnRzID0gYWNoaWV2ZW1lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvdW50KCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLiNhY2hpZXZlbWVudHMpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0KHByb3BlcnR5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFxyXG4gICAgICAgICAgICAudmFsdWVzKHRoaXMuI2FjaGlldmVtZW50cylcclxuICAgICAgICAgICAgLm1hcCgoe1xyXG4gICAgICAgICAgICAgICAgaWQsIG5hbWUsIG9wcG9ydHVuaXR5LFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGhpZGUsIGdyYWRlLFxyXG4gICAgICAgICAgICB9KT0+KHtcclxuICAgICAgICAgICAgICAgIGlkLCBuYW1lLCBvcHBvcnR1bml0eSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBoaWRlLCBncmFkZSxcclxuICAgICAgICAgICAgICAgIGlzQWNoaWV2ZWQ6IHRoaXMuaXNBY2hpZXZlZChpZCwgcHJvcGVydHkpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGFjaGlldmVtZW50SWQpIHtcclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudCA9IHRoaXMuI2FjaGlldmVtZW50c1thY2hpZXZlbWVudElkXTtcclxuICAgICAgICBpZighYWNoaWV2ZW1lbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBBY2hpZXZlbWVudFske2FjaGlldmVtZW50SWR9XWApO1xyXG4gICAgICAgIHJldHVybiBjbG9uZShhY2hpZXZlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2soYWNoaWV2ZW1lbnRJZCwgcHJvcGVydHkpIHtcclxuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiB9ID0gdGhpcy5nZXQoYWNoaWV2ZW1lbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQWNoaWV2ZWQoYWNoaWV2ZW1lbnRJZCwgcHJvcGVydHkpIHtcclxuICAgICAgICBmb3IoY29uc3QgW2FjaGlldmVkXSBvZiAocHJvcGVydHkuZ2V0KHByb3BlcnR5LlRZUEVTLkFDSFYpfHxbXSkpXHJcbiAgICAgICAgICAgIGlmKGFjaGlldmVkID09IGFjaGlldmVtZW50SWQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhY2hpZXZlKG9wcG9ydHVuaXR5LCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIHRoaXMubGlzdChwcm9wZXJ0eSlcclxuICAgICAgICAgICAgLmZpbHRlcigoe2lzQWNoaWV2ZWR9KT0+IWlzQWNoaWV2ZWQpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHtvcHBvcnR1bml0eTogb30pPT5vPT1vcHBvcnR1bml0eSlcclxuICAgICAgICAgICAgLmZpbHRlcigoe2lkfSk9PnRoaXMuY2hlY2soaWQsIHByb3BlcnR5KSlcclxuICAgICAgICAgICAgLmZvckVhY2goKHtpZH0pPT57XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5hY2hpZXZlKHByb3BlcnR5LlRZUEVTLkFDSFYsIGlkKVxyXG4gICAgICAgICAgICAgICAgJCRldmVudCgnYWNoaWV2ZW1lbnQnLCB0aGlzLmdldChpZCkpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY2hpZXZlbWVudDsiLCJpbXBvcnQgUHJvcGVydHkgZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XHJcbmltcG9ydCBFdmVudCBmcm9tICcuL2V2ZW50LmpzJztcclxuaW1wb3J0IFRhbGVudCBmcm9tICcuL3RhbGVudC5qcyc7XHJcbmltcG9ydCBBY2hpZXZlbWVudCBmcm9tICcuL2FjaGlldmVtZW50LmpzJztcclxuXHJcbmNsYXNzIExpZmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHkgPSBuZXcgUHJvcGVydHkoKTtcclxuICAgICAgICB0aGlzLiNldmVudCA9IG5ldyBFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuI3RhbGVudCA9IG5ldyBUYWxlbnQoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudCA9IG5ldyBBY2hpZXZlbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNwcm9wZXJ0eTtcclxuICAgICNldmVudDtcclxuICAgICN0YWxlbnQ7XHJcbiAgICAjYWNoaWV2ZW1lbnQ7XHJcbiAgICAjdHJpZ2dlclRhbGVudHM7XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbCgpIHtcclxuICAgICAgICBjb25zdCBbYWdlLCB0YWxlbnRzLCBldmVudHMsIGFjaGlldmVtZW50c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICBqc29uKCdhZ2UnKSxcclxuICAgICAgICAgIGpzb24oJ3RhbGVudHMnKSxcclxuICAgICAgICAgIGpzb24oJ2V2ZW50cycpLFxyXG4gICAgICAgICAganNvbignYWNoaWV2ZW1lbnQnKSxcclxuICAgICAgICBdKVxyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LmluaXRpYWwoe2FnZX0pO1xyXG4gICAgICAgIHRoaXMuI3RhbGVudC5pbml0aWFsKHt0YWxlbnRzfSk7XHJcbiAgICAgICAgdGhpcy4jZXZlbnQuaW5pdGlhbCh7ZXZlbnRzfSk7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuaW5pdGlhbCh7YWNoaWV2ZW1lbnRzfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdGFydChhbGxvY2F0aW9uKSB7XHJcbiAgICAgICAgdGhpcy4jdHJpZ2dlclRhbGVudHMgPSB7fTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5yZXN0YXJ0KGFsbG9jYXRpb24pO1xyXG4gICAgICAgIHRoaXMuZG9UYWxlbnQoKTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5yZXN0YXJ0TGFzdFN0ZXAoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5TVEFSVCxcclxuICAgICAgICAgICAgdGhpcy4jcHJvcGVydHlcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFsZW50QWxsb2NhdGlvbkFkZGl0aW9uKHRhbGVudHMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jdGFsZW50LmFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUYWxlbnRDdXJyZW50VHJpZ2dlckNvdW50KHRhbGVudElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyaWdnZXJUYWxlbnRzW3RhbGVudElkXSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIG5leHQoKSB7XHJcbiAgICAgICAgY29uc3Qge2FnZSwgZXZlbnQsIHRhbGVudH0gPSB0aGlzLiNwcm9wZXJ0eS5hZ2VOZXh0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhbGVudENvbnRlbnQgPSB0aGlzLmRvVGFsZW50KHRhbGVudCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gdGhpcy5kb0V2ZW50KHRoaXMucmFuZG9tKGV2ZW50KSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzRW5kID0gdGhpcy4jcHJvcGVydHkuaXNFbmQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IFt0YWxlbnRDb250ZW50LCBldmVudENvbnRlbnRdLmZsYXQoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5UUkFKRUNUT1JZLFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4geyBhZ2UsIGNvbnRlbnQsIGlzRW5kIH07XHJcbiAgICB9XHJcblxyXG4gICAgZG9UYWxlbnQodGFsZW50cykge1xyXG4gICAgICAgIGlmKHRhbGVudHMpIHRoaXMuI3Byb3BlcnR5LmNoYW5nZSh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTFQsIHRhbGVudHMpO1xyXG4gICAgICAgIHRhbGVudHMgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuVExUKVxyXG4gICAgICAgICAgICAuZmlsdGVyKHRhbGVudElkID0+IHRoaXMuZ2V0VGFsZW50Q3VycmVudFRyaWdnZXJDb3VudCh0YWxlbnRJZCkgPCB0aGlzLiN0YWxlbnQuZ2V0KHRhbGVudElkKS5tYXhfdHJpZ2dlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50cyA9IFtdO1xyXG4gICAgICAgIGZvcihjb25zdCB0YWxlbnRJZCBvZiB0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3RhbGVudC5kbyh0YWxlbnRJZCwgdGhpcy4jcHJvcGVydHkpO1xyXG4gICAgICAgICAgICBpZighcmVzdWx0KSBjb250aW51ZTtcclxuICAgICAgICAgICAgdGhpcy4jdHJpZ2dlclRhbGVudHNbdGFsZW50SWRdID0gdGhpcy5nZXRUYWxlbnRDdXJyZW50VHJpZ2dlckNvdW50KHRhbGVudElkKSArIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZWZmZWN0LCBuYW1lLCBkZXNjcmlwdGlvbiwgZ3JhZGUgfSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgY29udGVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTFQsXHJcbiAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYoIWVmZmVjdCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHRoaXMuI3Byb3BlcnR5LmVmZmVjdChlZmZlY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9FdmVudChldmVudElkKSB7XHJcbiAgICAgICAgY29uc3QgeyBlZmZlY3QsIG5leHQsIGRlc2NyaXB0aW9uLCBwb3N0RXZlbnQgfSA9IHRoaXMuI2V2ZW50LmRvKGV2ZW50SWQsIHRoaXMuI3Byb3BlcnR5KTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5jaGFuZ2UodGhpcy4jcHJvcGVydHkuVFlQRVMuRVZULCBldmVudElkKTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5lZmZlY3QoZWZmZWN0KTtcclxuICAgICAgICBjb25zdCBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLiNwcm9wZXJ0eS5UWVBFUy5FVlQsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBwb3N0RXZlbnQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG5leHQpIHJldHVybiBbY29udGVudCwgdGhpcy5kb0V2ZW50KG5leHQpXS5mbGF0KCk7XHJcbiAgICAgICAgcmV0dXJuIFtjb250ZW50XTtcclxuICAgIH1cclxuXHJcbiAgICByYW5kb20oZXZlbnRzKSB7XHJcbiAgICAgICAgZXZlbnRzID0gZXZlbnRzLmZpbHRlcigoW2V2ZW50SWRdKT0+dGhpcy4jZXZlbnQuY2hlY2soZXZlbnRJZCwgdGhpcy4jcHJvcGVydHkpKTtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsV2VpZ2h0cyA9IDA7XHJcbiAgICAgICAgZm9yKGNvbnN0IFssIHdlaWdodF0gb2YgZXZlbnRzKVxyXG4gICAgICAgICAgICB0b3RhbFdlaWdodHMgKz0gd2VpZ2h0O1xyXG5cclxuICAgICAgICBsZXQgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIHRvdGFsV2VpZ2h0cztcclxuICAgICAgICBmb3IoY29uc3QgW2V2ZW50SWQsIHdlaWdodF0gb2YgZXZlbnRzKVxyXG4gICAgICAgICAgICBpZigocmFuZG9tLT13ZWlnaHQpPDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRJZDtcclxuICAgICAgICByZXR1cm4gZXZlbnRzW2V2ZW50cy5sZW5ndGgtMV07XHJcbiAgICB9XHJcblxyXG4gICAgdGFsZW50UmFuZG9tKCkge1xyXG4gICAgICAgIGNvbnN0IHRpbWVzID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRNUyk7XHJcbiAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnQgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuQ0FDSFYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLiN0YWxlbnQudGFsZW50UmFuZG9tKHRoaXMuZ2V0TGFzdEV4dGVuZFRhbGVudCgpLCB7IHRpbWVzLCBhY2hpZXZlbWVudCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0YWxlbnRFeHRlbmQodGFsZW50SWQpIHtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5zZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuRVhULCB0YWxlbnRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGFzdEV4dGVuZFRhbGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkVYVCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3VtbWFyeSgpIHtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5TVU1NQVJZLFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBBR0U6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5IQUdFKSxcclxuICAgICAgICAgICAgQ0hSOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSENIUiksXHJcbiAgICAgICAgICAgIElOVDogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhJTlQpLFxyXG4gICAgICAgICAgICBTVFI6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5IU1RSKSxcclxuICAgICAgICAgICAgTU5ZOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSE1OWSksXHJcbiAgICAgICAgICAgIFNQUjogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhTUFIpLFxyXG4gICAgICAgICAgICBTVU06IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5TVU0pLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGFzdFJlY29yZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcGVydHkuZ2V0TGFzdFJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4Y2x1c2l2ZSh0YWxlbnRzLCBleGNsdXNpdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jdGFsZW50LmV4Y2x1c2l2ZSh0YWxlbnRzLCBleGNsdXNpdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFjaGlldmVtZW50cygpIHtcclxuICAgICAgICBjb25zdCB0aWNrcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5XHJcbiAgICAgICAgICAgIC5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuQUNIVilcclxuICAgICAgICAgICAgLmZvckVhY2goKFtpZCwgdGlja10pID0+IHRpY2tzW2lkXSA9IHRpY2spO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC4jYWNoaWV2ZW1lbnRcclxuICAgICAgICAgICAgLmxpc3QodGhpcy4jcHJvcGVydHkpXHJcbiAgICAgICAgICAgIC5zb3J0KChcclxuICAgICAgICAgICAgICAgIHtpZDogYSwgZ3JhZGU6IGFnLCBoaWRlOiBhaH0sXHJcbiAgICAgICAgICAgICAgICB7aWQ6IGIsIGdyYWRlOiBiZywgaGlkZTogYmh9XHJcbiAgICAgICAgICAgICk9PntcclxuICAgICAgICAgICAgICAgIGEgPSB0aWNrc1thXTtcclxuICAgICAgICAgICAgICAgIGIgPSB0aWNrc1tiXTtcclxuICAgICAgICAgICAgICAgIGlmKGEmJmIpIHJldHVybiBiIC0gYTtcclxuICAgICAgICAgICAgICAgIGlmKCFhJiYhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGFoJiZiaCkgcmV0dXJuIGJnIC0gYWc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYWgpIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGJoKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJnIC0gYWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZighYSkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICBpZighYikgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbCgpIHtcclxuICAgICAgICBjb25zdCBUTVMgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuVE1TKTtcclxuICAgICAgICBjb25zdCBDQUNIViA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5DQUNIVik7XHJcbiAgICAgICAgY29uc3QgQ1RMVCA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5DVExUKTtcclxuICAgICAgICBjb25zdCBDRVZUID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkNFVlQpO1xyXG5cclxuICAgICAgICBjb25zdCB0b3RhbFRhbGVudCA9IHRoaXMuI3RhbGVudC5jb3VudCgpO1xyXG4gICAgICAgIGNvbnN0IHRvdGFsRXZlbnQgPSB0aGlzLiNldmVudC5jb3VudCgpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lczogVE1TLFxyXG4gICAgICAgICAgICBhY2hpZXZlbWVudDogQ0FDSFYsXHJcbiAgICAgICAgICAgIHRhbGVudFJhdGU6IENUTFQgLyB0b3RhbFRhbGVudCxcclxuICAgICAgICAgICAgZXZlbnRSYXRlOiBDRVZUIC8gdG90YWxFdmVudCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpbWVzKCkgeyByZXR1cm4gdGhpcy4jcHJvcGVydHk/LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTVMpIHx8IDA7IH1cclxuICAgIHNldCB0aW1lcyh2KSB7XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHk/LnNldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTVMsIHYpIHx8IDA7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuYWNoaWV2ZShcclxuICAgICAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuT3Bwb3J0dW5pdHkuRU5ELFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlmZTtcclxuXHJcbiIsImltcG9ydCB7IHN1bW1hcnkgfSBmcm9tICcuL2Z1bmN0aW9ucy9zdW1tYXJ5LmpzJztcclxuaW1wb3J0IHsgZ2V0UmF0ZSwgZ2V0R3JhZGUgfSBmcm9tICcuL2Z1bmN0aW9ucy9hZGRpdGlvbi5qcyc7XHJcbmltcG9ydCBMaWZlIGZyb20gJy4vbGlmZS5qcyc7XHJcblxyXG5jbGFzcyBBcHB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuI2xpZmUgPSBuZXcgTGlmZSgpO1xyXG4gICAgfVxyXG5cclxuICAgICNsaWZlO1xyXG4gICAgI3BhZ2VzO1xyXG4gICAgI2N1cnJlbnRQYWdlO1xyXG4gICAgI3RhbGVudFNlbGVjdGVkID0gbmV3IFNldCgpO1xyXG4gICAgI3RvdGFsTWF4PTIwO1xyXG4gICAgI2lzRW5kID0gZmFsc2U7XHJcbiAgICAjc2VsZWN0ZWRFeHRlbmRUYWxlbnQgPSBudWxsO1xyXG4gICAgI2hpbnRUaW1lb3V0O1xyXG4gICAgI3NwZWNpYWx0aGFua3M7XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbCgpIHtcclxuICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoKCdsb2FkaW5nJyk7XHJcbiAgICAgICAgY29uc3QgWyxzcGVjaWFsdGhhbmtzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgdGhpcy4jbGlmZS5pbml0aWFsKCksXHJcbiAgICAgICAgICAgIGpzb24oJ3NwZWNpYWx0aGFua3MnKVxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIHRoaXMuI3NwZWNpYWx0aGFua3MgPSBzcGVjaWFsdGhhbmtzO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoKCdpbmRleCcpO1xyXG4gICAgICAgIGdsb2JhbFRoaXMub25lcnJvciA9IChldmVudCwgc291cmNlLCBsaW5lbm8sIGNvbG5vLCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpbnQoYFtFUlJPUl0gYXQgKCR7c291cmNlfToke2xpbmVub306JHtjb2xub30pXFxuXFxuJHtlcnJvcj8uc3RhY2t8fGVycm9yfHwndW5rbm93IEVycm9yJ31gLCAnZXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5RG93bkNhbGxiYWNrID0gKGtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleWJvYXJkRXZlbnQud2hpY2ggPT09IDEzIHx8IGtleWJvYXJkRXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXNzRW50ZXJGdW5jID0gdGhpcy4jcGFnZXNbdGhpcy4jY3VycmVudFBhZ2VdPy5wcmVzc0VudGVyO1xyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlckZ1bmMgJiYgdHlwZW9mIHByZXNzRW50ZXJGdW5jID09PSAnZnVuY3Rpb24nICYmIHByZXNzRW50ZXJGdW5jKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5RG93bkNhbGxiYWNrKTtcclxuICAgICAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlEb3duQ2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRQYWdlcygpIHtcclxuXHJcbiAgICAgICAgLy8gTG9hZGluZ1xyXG4gICAgICAgIGNvbnN0IGxvYWRpbmdQYWdlID0gJChgXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICDkurrnlJ/ph43lvIDmqKHmi5/lmag8YnI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuNXJlbTsgZm9udC13ZWlnaHQ6bm9ybWFsO1wiPuWKoOi9veS4rS4uLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgLy8gSW5kZXhcclxuICAgICAgICBjb25zdCBpbmRleFBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYWNoaWV2ZW1lbnRcIj7miJDlsLE8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNwZWNpYWx0aGFua3NcIj7nibnliKvmhJ/osKI8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRoZW1lVG9nZ2xlQnRuXCI+6buRPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAg5Lq655Sf6YeN5byA5qih5ouf5ZmoPGJyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxLjVyZW07IGZvbnQtd2VpZ2h0Om5vcm1hbDtcIj7ov5nlnoPlnL7kurrnlJ/kuIDnp5LkuZ/kuI3mg7PlkYbkuoY8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZXN0YXJ0XCIgY2xhc3M9XCJtYWluYnRuXCI+PHNwYW4gY2xhc3M9XCJpY29uZm9udFwiPiYjeGU2YTc7PC9zcGFuPueri+WNs+mHjeW8gDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YSBpZD1cImRpc2NvcmRcIiBocmVmPVwiaHR0cHM6Ly9kaXNjb3JkLmdnL1UzcXJmNDlOTVFcIiBzdHlsZT1cInotaW5kZXg6IDk5OTk7XCIgYXJpYS1sYWJlbD1cIkNoYXQgb24gRGlzY29yZFwiPjxidXR0b24gY2xhc3M9XCJkaXNjb3JkLWJ0blwiPjxzdmcgd2lkdGg9XCI1MCVcIiBoZWlnaHQ9XCI1NVwiIHZpZXdCb3g9XCIwIDAgNzEgNTVcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwKVwiPjxwYXRoIGQ9XCJNNjAuMTA0NSA0Ljg5NzhDNTUuNTc5MiAyLjgyMTQgNTAuNzI2NSAxLjI5MTYgNDUuNjUyNyAwLjQxNTQyQzQ1LjU2MDMgMC4zOTg1MSA0NS40NjggMC40NDA3NjkgNDUuNDIwNCAwLjUyNTI4OUM0NC43OTYzIDEuNjM1MyA0NC4xMDUgMy4wODM0IDQzLjYyMDkgNC4yMjE2QzM4LjE2MzcgMy40MDQ2IDMyLjczNDUgMy40MDQ2IDI3LjM4OTIgNC4yMjE2QzI2LjkwNSAzLjA1ODEgMjYuMTg4NiAxLjYzNTMgMjUuNTYxNyAwLjUyNTI4OUMyNS41MTQxIDAuNDQzNTg5IDI1LjQyMTggMC40MDEzMyAyNS4zMjk0IDAuNDE1NDJDMjAuMjU4NCAxLjI4ODggMTUuNDA1NyAyLjgxODYgMTAuODc3NiA0Ljg5NzhDMTAuODM4NCA0LjkxNDcgMTAuODA0OCA0Ljk0MjkgMTAuNzgyNSA0Ljk3OTVDMS41Nzc5NSAxOC43MzA5IC0wLjk0MzU2MSAzMi4xNDQzIDAuMjkzNDA4IDQ1LjM5MTRDMC4yOTkwMDUgNDUuNDU2MiAwLjMzNTM4NiA0NS41MTgyIDAuMzg1NzYxIDQ1LjU1NzZDNi40NTg2NiA1MC4wMTc0IDEyLjM0MTMgNTIuNzI0OSAxOC4xMTQ3IDU0LjUxOTVDMTguMjA3MSA1NC41NDc3IDE4LjMwNSA1NC41MTM5IDE4LjM2MzggNTQuNDM3OEMxOS43Mjk1IDUyLjU3MjggMjAuOTQ2OSA1MC42MDYzIDIxLjk5MDcgNDguNTM4M0MyMi4wNTIzIDQ4LjQxNzIgMjEuOTkzNSA0OC4yNzM1IDIxLjg2NzYgNDguMjI1NkMxOS45MzY2IDQ3LjQ5MzEgMTguMDk3OSA0Ni42IDE2LjMyOTIgNDUuNTg1OEMxNi4xODkzIDQ1LjUwNDEgMTYuMTc4MSA0NS4zMDQgMTYuMzA2OCA0NS4yMDgyQzE2LjY3OSA0NC45MjkzIDE3LjA1MTMgNDQuNjM5MSAxNy40MDY3IDQ0LjM0NjFDMTcuNDcxIDQ0LjI5MjYgMTcuNTYwNiA0NC4yODEzIDE3LjYzNjIgNDQuMzE1MUMyOS4yNTU4IDQ5LjYyMDIgNDEuODM1NCA0OS42MjAyIDUzLjMxNzkgNDQuMzE1MUM1My4zOTM1IDQ0LjI3ODUgNTMuNDgzMSA0NC4yODk4IDUzLjU1MDIgNDQuMzQzM0M1My45MDU3IDQ0LjYzNjMgNTQuMjc3OSA0NC45MjkzIDU0LjY1MjkgNDUuMjA4MkM1NC43ODE2IDQ1LjMwNCA1NC43NzMyIDQ1LjUwNDEgNTQuNjMzMyA0NS41ODU4QzUyLjg2NDYgNDYuNjE5NyA1MS4wMjU5IDQ3LjQ5MzEgNDkuMDkyMSA0OC4yMjI4QzQ4Ljk2NjIgNDguMjcwNyA0OC45MTAyIDQ4LjQxNzIgNDguOTcxOCA0OC41MzgzQzUwLjAzOCA1MC42MDM0IDUxLjI1NTQgNTIuNTY5OSA1Mi41OTU5IDU0LjQzNUM1Mi42NTE5IDU0LjUxMzkgNTIuNzUyNiA1NC41NDc3IDUyLjg0NSA1NC41MTk1QzU4LjY0NjQgNTIuNzI0OSA2NC41MjkgNTAuMDE3NCA3MC42MDE5IDQ1LjU1NzZDNzAuNjU1MSA0NS41MTgyIDcwLjY4ODcgNDUuNDU5IDcwLjY5NDMgNDUuMzk0MkM3Mi4xNzQ3IDMwLjA3OTEgNjguMjE0NyAxNi43NzU3IDYwLjE5NjggNC45ODIzQzYwLjE3NzIgNC45NDI5IDYwLjE0MzcgNC45MTQ3IDYwLjEwNDUgNC44OTc4Wk0yMy43MjU5IDM3LjMyNTNDMjAuMjI3NiAzNy4zMjUzIDE3LjM0NTEgMzQuMTEzNiAxNy4zNDUxIDMwLjE2OTNDMTcuMzQ1MSAyNi4yMjUgMjAuMTcxNyAyMy4wMTMzIDIzLjcyNTkgMjMuMDEzM0MyNy4zMDggMjMuMDEzMyAzMC4xNjI2IDI2LjI1MzIgMzAuMTA2NiAzMC4xNjkzQzMwLjEwNjYgMzQuMTEzNiAyNy4yOCAzNy4zMjUzIDIzLjcyNTkgMzcuMzI1M1pNNDcuMzE3OCAzNy4zMjUzQzQzLjgxOTYgMzcuMzI1MyA0MC45MzcxIDM0LjExMzYgNDAuOTM3MSAzMC4xNjkzQzQwLjkzNzEgMjYuMjI1IDQzLjc2MzYgMjMuMDEzMyA0Ny4zMTc4IDIzLjAxMzNDNTAuOSAyMy4wMTMzIDUzLjc1NDUgMjYuMjUzMiA1My42OTg2IDMwLjE2OTNDNTMuNjk4NiAzNC4xMTM2IDUwLjkgMzcuMzI1MyA0Ny4zMTc4IDM3LjMyNTNaXCIgZmlsbD1cIiNmZmZmZmZcIi8+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD1cImNsaXAwXCI+PHJlY3Qgd2lkdGg9XCI3MVwiIGhlaWdodD1cIjU1XCIgZmlsbD1cIndoaXRlXCIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPkNIQVQ8L2J1dHRvbj48c3R5bGU+LmRpc2NvcmQtYnRuIHtwb3NpdGlvbjogZml4ZWQ7Ym90dG9tOiAwLjVyZW07bGVmdDogMC41cmVtO2JhY2tncm91bmQtY29sb3I6ICM1ODY1RjI7cGFkZGluZzogMC43cmVtO2hlaWdodDogYXV0bztjb2xvcjogd2hpdGU7dGV4dC1hbGlnbjogcmlnaHQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXI6IG5vbmU7d2lkdGg6IDYuNXJlbTtmb250LXNpemU6IDFyZW07Ym9yZGVyLXJhZGl1czogNHB4O30uZGlzY29yZC1idG4gc3ZnIHtoZWlnaHQ6IDEuNXJlbTtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiA1MCU7bGVmdDogMDt0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7fS5kaXNjb3JkLWJ0bjpob3ZlciBzdmd7YW5pbWF0aW9uOmRpc2NvcmQtd2F2ZSA1NjBtcyBlYXNlLWluLW91dDt9QGtleWZyYW1lcyBkaXNjb3JkLXdhdmV7MCUsMTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMCl9MjAlLDYwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoLTI1ZGVnKX00MCUsODAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSgxMGRlZyl9fUBtZWRpYSAobWF4LXdpZHRoOjUwMHB4KXsuZGlzY29yZC1idG46aG92ZXIgc3Zne2FuaW1hdGlvbjpub25lfS5kaXNjb3JkLWJ0biBzdmd7YW5pbWF0aW9uOmRpc2NvcmQtd2F2ZSA1NjBtcyBlYXNlLWluLW91dH19PC9zdHlsZT48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIC8vIEluaXQgdGhlbWVcclxuICAgICAgICB0aGlzLnNldFRoZW1lKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpKVxyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNyZXN0YXJ0JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgndGFsZW50JykpO1xyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNhY2hpZXZlbWVudCcpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ2FjaGlldmVtZW50JykpO1xyXG5cclxuICAgICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSA9PSAnbGlnaHQnKSB7XHJcbiAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfpu5EnKVxyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJyN0aGVtZVRvZ2dsZUJ0bicpLnRleHQoJ+eZvScpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoXCIjdGhlbWVUb2dnbGVCdG5cIilcclxuICAgICAgICAgICAgLmNsaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnZGFyaycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfnmb0nKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnbGlnaHQnKTtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleFBhZ2UuZmluZCgnI3RoZW1lVG9nZ2xlQnRuJykudGV4dCgn6buRJylcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRoZW1lKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaW5kZXhQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ3NwZWNpYWx0aGFua3MnKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNwZWNpYWxUaGFua3NQYWdlID0gJChgXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNwZWNpYWx0aGFua3NcIj7ov5Tlm548L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInNwdGh4XCI+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnMVwiPjwvdWw+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnMlwiPjwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3BvbnNvclwiIG9uY2xpY2s9XCJnbG9iYWxUaGlzLm9wZW4oJ2h0dHBzOi8vYWZkaWFuLm5ldC9ATGlmZVJlc3RhcnQnKVwiIHN0eWxlPVwiYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCM5NDZjZTYsIzdlNWZkOSk7IGxlZnQ6YXV0bzsgcmlnaHQ6NTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMnJlbSwtNTAlKTtcIj7miZPotY/nrZbliJIo54ix5Y+R55S1KTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3BvbnNvclwiIG9uY2xpY2s9XCJnbG9iYWxUaGlzLm9wZW4oJ2h0dHBzOi8vZHVuLm1pYW5iYW9kdW8uY29tL0B2aWNrc2NhcmxldCcpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiNjNjk7IGxlZnQ6NTAlOyByaWdodDphdXRvOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgycmVtLC01MCUpO1wiPuaJk+i1j+eoi+W6jyjpob/pob/ppa0pPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHNwZWNpYWxUaGFua3NQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3BlY2lhbHRoYW5rcycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+dGhpcy5zd2l0Y2goJ2luZGV4JykpO1xyXG5cclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudFBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3BlY2lhbHRoYW5rc1wiPui/lOWbnjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+57uf6K6hPC9zcGFuPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJ0b3RhbFwiPjwvdWw+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwicGFkZGluZzowLjI1cmVtOyBtYXJnaW46IDAuNXJlbSAwOyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQ6ICNjY2M7XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+5oiQ5bCxPC9zcGFuPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJhY2hpZXZlbWVudHNcIj48L3VsPlxyXG4gICAgICAgIGApXHJcblxyXG4gICAgICAgIGFjaGlldmVtZW50UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3NwZWNpYWx0aGFua3MnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PnRoaXMuc3dpdGNoKCdpbmRleCcpKTtcclxuXHJcbiAgICAgICAgLy8gVGFsZW50XHJcbiAgICAgICAgY29uc3QgdGFsZW50UGFnZSA9ICQoYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkXCIgc3R5bGU9XCJmb250LXNpemU6IDEuNnJlbVwiPuWkqei1i+aKveWNoTwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwicmFuZG9tXCIgY2xhc3M9XCJtYWluYnRuXCIgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiXCI+MTDov57mir3vvIE8L2J1dHRvbj5cclxuICAgICAgICAgICAgPHVsIGlkPVwidGFsZW50c1wiIGNsYXNzPVwic2VsZWN0bGlzdFwiPjwvdWw+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJuZXh0XCIgY2xhc3M9XCJtYWluYnRuXCI+6K+36YCJ5oupM+S4qjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIGApO1xyXG5cclxuICAgICAgICBjb25zdCBjcmVhdGVUYWxlbnQgPSAoeyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24gfSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gJChgPGxpIGNsYXNzPVwiZ3JhZGUke2dyYWRlfWJcIj4ke25hbWV977yIJHtkZXNjcmlwdGlvbn3vvIk8L2xpPmApXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGFsZW50UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3JhbmRvbScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjcmFuZG9tJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdWwgPSB0YWxlbnRQYWdlLmZpbmQoJyN0YWxlbnRzJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNsaWZlLnRhbGVudFJhbmRvbSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2godGFsZW50PT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gY3JlYXRlVGFsZW50KHRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVsLmFwcGVuZChsaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsaS5oYXNDbGFzcygnc2VsZWN0ZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGFsZW50U2VsZWN0ZWQuZGVsZXRlKHRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy4jdGFsZW50U2VsZWN0ZWQuc2l6ZTwzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI25leHQnKS50ZXh0KCfor7fpgInmi6kz5LiqJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuI3RhbGVudFNlbGVjdGVkLnNpemU9PTMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KCflj6rog73pgIkz5Liq5aSp6LWLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2x1c2l2ZSA9IHRoaXMuI2xpZmUuZXhjbHVzaXZlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuI3RhbGVudFNlbGVjdGVkKS5tYXAoKHtpZH0pPT5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGVudC5pZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXhjbHVzaXZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNvbnN0IHsgbmFtZSwgaWQgfSBvZiB0aGlzLiN0YWxlbnRTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWQgPT0gZXhjbHVzaXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KGDkuI7lt7LpgInmi6nnmoTlpKnotYvjgJAke25hbWV944CR5Yay56qBYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGFsZW50U2VsZWN0ZWQuYWRkKHRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy4jdGFsZW50U2VsZWN0ZWQuc2l6ZT09Mykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJyNuZXh0JykudGV4dCgn5byA5aeL5paw5Lq655SfJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjbmV4dCcpLnNob3coKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGFsZW50UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI25leHQnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuI3RhbGVudFNlbGVjdGVkLnNpemUhPTMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoJ+ivt+mAieaLqTPkuKrlpKnotYsnKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJyNuZXh0JykuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0b3RhbE1heCA9IDIwICsgdGhpcy4jbGlmZS5nZXRUYWxlbnRBbGxvY2F0aW9uQWRkaXRpb24oQXJyYXkuZnJvbSh0aGlzLiN0YWxlbnRTZWxlY3RlZCkubWFwKCh7aWR9KT0+aWQpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoKCdwcm9wZXJ0eScpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBQcm9wZXJ0eVxyXG4gICAgICAgIC8vIGhpbnQgb2YgZXh0ZW5zaW9uIHRvYmVybW9yeS5lczYtc3RyaW5nLWh0bWxcclxuICAgICAgICBjb25zdCBwcm9wZXJ0eVBhZ2UgPSAkKC8qaHRtbCovYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkXCIgc3R5bGU9XCJmb250LXNpemU6IDEuNnJlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj7osIPmlbTliJ3lp4vlsZ7mgKc8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJ0b3RhbFwiIHN0eWxlPVwiZm9udC1zaXplOjFyZW07IGZvbnQtd2VpZ2h0Om5vcm1hbDtcIj7lj6/nlKjlsZ7mgKfngrnvvJowPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJwcm9wZXJ0eUFsbG9jYXRpb25cIiBjbGFzcz1cInByb3Bpbml0aWFsXCI+PC91bD5cclxuICAgICAgICAgICAgPHVsIGNsYXNzPVwic2VsZWN0bGlzdFwiIGlkPVwidGFsZW50U2VsZWN0ZWRWaWV3XCI+PC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1hcmVhXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmFuZG9tXCIgY2xhc3M9XCJtYWluYnRuXCI+6ZqP5py65YiG6YWNPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic3RhcnRcIiBjbGFzcz1cIm1haW5idG5cIj7lvIDlp4vmlrDkurrnlJ88L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcbiAgICAgICAgcHJvcGVydHlQYWdlLm1vdW50ZWQgPSAoKT0+e1xyXG4gICAgICAgICAgICBwcm9wZXJ0eVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyN0YWxlbnRTZWxlY3RlZFZpZXcnKS5hcHBlbmQoXHJcbiAgICAgICAgICAgICAgICBgPGxpPuW3sumAieWkqei1izwvbGk+YCArXHJcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuI3RhbGVudFNlbGVjdGVkKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgoe25hbWUsZGVzY3JpcHRpb259KT0+YDxsaSBjbGFzcz1cImdyYWRlMGJcIj4ke25hbWV9KCR7ZGVzY3JpcHRpb259KTwvbGk+YClcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gKCk9PntcclxuICAgICAgICAgICAgbGV0IHQgPSAwO1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgdHlwZSBpbiBncm91cHMpXHJcbiAgICAgICAgICAgICAgICB0ICs9IGdyb3Vwc1t0eXBlXS5nZXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZyZXNoVG90YWwgPSAoKT0+e1xyXG4gICAgICAgICAgICBwcm9wZXJ0eVBhZ2UuZmluZCgnI3RvdGFsJykudGV4dChg5Y+v55So5bGe5oCn54K577yaJHt0aGlzLiN0b3RhbE1heCAtIHRvdGFsKCl9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdldEJ0bkdyb3VwcyA9IChuYW1lLCBtaW4sIG1heCk9PntcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSAkKGA8bGk+JHtuYW1lfSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvbGk+YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ0blN1YiA9ICQoYDxzcGFuIGNsYXNzPVwiaWNvbmZvbnQgcHJvcGJ0blwiPiYjeGU2YTU7PC9zcGFuPmApO1xyXG4gICAgICAgICAgICBjb25zdCBpbnB1dEJveCA9ICQoYDxpbnB1dCB2YWx1ZT1cIjBcIj5gKTtcclxuICAgICAgICAgICAgY29uc3QgYnRuQWRkID0gJChgPHNwYW4gY2xhc3M9XCJpY29uZm9udCBwcm9wYnRuXCI+JiN4ZTZhNjs8L3NwYW4+YCk7XHJcbiAgICAgICAgICAgIGdyb3VwLmFwcGVuZChidG5TdWIpO1xyXG4gICAgICAgICAgICBncm91cC5hcHBlbmQoaW5wdXRCb3gpO1xyXG4gICAgICAgICAgICBncm91cC5hcHBlbmQoYnRuQWRkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gdj0+e1xyXG4gICAgICAgICAgICAgICAgdiA9IE51bWJlcih2KXx8MDtcclxuICAgICAgICAgICAgICAgIHYgPSBNYXRoLnJvdW5kKHYpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHYgPCBtaW4gPyBtaW4gOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdiA+IG1heCA/IG1heCA6IHZcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBnZXQgPSAoKT0+TnVtYmVyKGlucHV0Qm94LnZhbCgpKTtcclxuICAgICAgICAgICAgY29uc3Qgc2V0ID0gdj0+e1xyXG4gICAgICAgICAgICAgICAgaW5wdXRCb3gudmFsKGxpbWl0KHYpKTtcclxuICAgICAgICAgICAgICAgIGZyZXNoVG90YWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBidG5BZGQuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHRvdGFsKCkgPj0gdGhpcy4jdG90YWxNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoJ+ayoeacieWPr+WIhumFjeeahOeCueaVsOS6hicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldChnZXQoKSsxKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJ0blN1Yi5jbGljaygoKT0+c2V0KGdldCgpLTEpKTtcclxuICAgICAgICAgICAgaW5wdXRCb3gub24oJ2lucHV0JywgKCk9PntcclxuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0b3RhbCgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGdldCgpO1xyXG4gICAgICAgICAgICAgICAgaWYodCA+IHRoaXMuI3RvdGFsTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsIC09IHQgLSB0aGlzLiN0b3RhbE1heDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhbCA9IGxpbWl0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICBpZih2YWwgIT0gaW5wdXRCb3gudmFsKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXQodmFsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZyZXNoVG90YWwoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7Z3JvdXAsIGdldCwgc2V0fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdyb3Vwcy5DSFIgPSBnZXRCdG5Hcm91cHMoXCLpopzlgLxcIiwgMCwgMTApOyAvLyDpopzlgLwgY2hhcm0gQ0hSXHJcbiAgICAgICAgZ3JvdXBzLklOVCA9IGdldEJ0bkdyb3VwcyhcIuaZuuWKm1wiLCAwLCAxMCk7IC8vIOaZuuWKmyBpbnRlbGxpZ2VuY2UgSU5UXHJcbiAgICAgICAgZ3JvdXBzLlNUUiA9IGdldEJ0bkdyb3VwcyhcIuS9k+i0qFwiLCAwLCAxMCk7IC8vIOS9k+i0qCBzdHJlbmd0aCBTVFJcclxuICAgICAgICBncm91cHMuTU5ZID0gZ2V0QnRuR3JvdXBzKFwi5a625aKDXCIsIDAsIDEwKTsgLy8g5a625aKDIG1vbmV5IE1OWVxyXG5cclxuICAgICAgICBjb25zdCB1bCA9IHByb3BlcnR5UGFnZS5maW5kKCcjcHJvcGVydHlBbGxvY2F0aW9uJyk7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCB0eXBlIGluIGdyb3Vwcykge1xyXG4gICAgICAgICAgICB1bC5hcHBlbmQoZ3JvdXBzW3R5cGVdLmdyb3VwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb3BlcnR5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3JhbmRvbScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLiN0b3RhbE1heDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IFsxMCwgMTAsIDEwLCAxMF07XHJcbiAgICAgICAgICAgICAgICB3aGlsZSh0PjApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWIgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAoTWF0aC5taW4odCwgMTApIC0gMSkpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICUgNDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXJyW3NlbGVjdF0gLSBzdWIgPDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJbc2VsZWN0XSAtPSBzdWI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgLT0gc3ViO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBncm91cHMuQ0hSLnNldCgxMCAtIGFyclswXSk7XHJcbiAgICAgICAgICAgICAgICBncm91cHMuSU5ULnNldCgxMCAtIGFyclsxXSk7XHJcbiAgICAgICAgICAgICAgICBncm91cHMuU1RSLnNldCgxMCAtIGFyclsyXSk7XHJcbiAgICAgICAgICAgICAgICBncm91cHMuTU5ZLnNldCgxMCAtIGFyclszXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwcm9wZXJ0eVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNzdGFydCcpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYodG90YWwoKSA8IHRoaXMuI3RvdGFsTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KGDkvaDov5jmnIkke3RoaXMuI3RvdGFsTWF4LXRvdGFsKCl95bGe5oCn54K55rKh5pyJ5YiG6YWN5a6MYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b3RhbCgpID4gdGhpcy4jdG90YWxNYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpbnQoYOS9oOWkmuS9v+eUqOS6hiR7dG90YWwoKSAtIHRoaXMuI3RvdGFsTWF4feWxnuaAp+eCuWApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuI2xpZmUucmVzdGFydCh7XHJcbiAgICAgICAgICAgICAgICAgICAgQ0hSOiBncm91cHMuQ0hSLmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIElOVDogZ3JvdXBzLklOVC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBTVFI6IGdyb3Vwcy5TVFIuZ2V0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgTU5ZOiBncm91cHMuTU5ZLmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIFNQUjogNSxcclxuICAgICAgICAgICAgICAgICAgICBUTFQ6IEFycmF5LmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpLm1hcCgoe2lkfSk9PmlkKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2goJ3RyYWplY3RvcnknKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLnRyYWplY3RvcnkuYm9ybigpO1xyXG4gICAgICAgICAgICAgICAgLy8gJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihldmVudCl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYoZXZlbnQud2hpY2ggPT0gMzIgfHwgZXZlbnQud2hpY2ggPT0gMTMpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAkKCcjbGlmZVRyYWplY3RvcnknKS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUcmFqZWN0b3J5XHJcbiAgICAgICAgY29uc3QgdHJhamVjdG9yeVBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJsaWZlUHJvcGVydHlcIiBjbGFzcz1cImxpZmVQcm9wZXJ0eVwiPjwvdWw+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cImxpZmVUcmFqZWN0b3J5XCIgY2xhc3M9XCJsaWZlVHJhamVjdG9yeVwiPjwvdWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tYXJlYVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInN1bW1hcnlcIiBjbGFzcz1cIm1haW5idG5cIj7kurrnlJ/mgLvnu5M8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkb21Ub0ltYWdlXCIgY2xhc3M9XCJtYWluYnRuXCI+5Lq655Sf5Zue5pS+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9tVG9JbWFnZTJ3eFwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJcIiBpZD1cImVuZEltYWdlXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjbGlmZVRyYWplY3RvcnknKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuI2lzRW5kKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFqZWN0b3J5ID0gdGhpcy4jbGlmZS5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFnZSwgY29udGVudCwgaXNFbmQgfSA9IHRyYWplY3Rvcnk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaSA9ICQoYDxsaT48c3Bhbj4ke2FnZX3lsoHvvJo8L3NwYW4+PHNwYW4+JHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Lm1hcChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHt0eXBlLCBkZXNjcmlwdGlvbiwgZ3JhZGUsIG5hbWUsIHBvc3RFdmVudH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVExUJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGDlpKnotYvjgJAke25hbWV944CR5Y+R5Yqo77yaJHtkZXNjcmlwdGlvbn1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VWVCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbiArIChwb3N0RXZlbnQ/YDxicj4ke3Bvc3RFdmVudH1gOicnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICkuam9pbignPGJyPicpXHJcbiAgICAgICAgICAgICAgICB9PC9zcGFuPjwvbGk+YCk7XHJcbiAgICAgICAgICAgICAgICBsaS5hcHBlbmRUbygnI2xpZmVUcmFqZWN0b3J5Jyk7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2xpZmVUcmFqZWN0b3J5XCIpLnNjcm9sbFRvcCgkKFwiI2xpZmVUcmFqZWN0b3J5XCIpWzBdLnNjcm9sbEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBpZihpc0VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnVuYmluZChcImtleWRvd25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaXNFbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNzdW1tYXJ5Jykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNkb21Ub0ltYWdlJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnKrmrbvkuqHvvIzmm7TmlrDmlbDlgLxcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyBpZiBub3QgZGllIHlldFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy4jbGlmZS5nZXRMYXN0UmVjb3JkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNsaWZlUHJvcGVydHlcIikuaHRtbChgXHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuPuminOWAvDwvc3Bhbj48c3Bhbj4ke3Byb3BlcnR5LkNIUn08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4+5pm65YqbPC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuSU5UfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaT48c3Bhbj7kvZPotKg8L3NwYW4+PHNwYW4+JHtwcm9wZXJ0eS5TVFJ9PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuPuWutuWigzwvc3Bhbj48c3Bhbj4ke3Byb3BlcnR5Lk1OWX08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4+5b+r5LmQPC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuU1BSfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyBodG1sMmNhbnZhc1xyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjZG9tVG9JbWFnZScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgJChcIiNsaWZlVHJhamVjdG9yeVwiKS5hZGRDbGFzcyhcImRlbGV0ZUZpeGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBkb210b2ltYWdlLnRvSnBlZyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlmZVRyYWplY3RvcnknKSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluay5kb3dubG9hZCA9ICfmiJHnmoTkurrnlJ/lm57mlL4uanBlZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGRhdGFVcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNsaWZlVHJhamVjdG9yeVwiKS5yZW1vdmVDbGFzcyhcImRlbGV0ZUZpeGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDlvq7kv6HlhoXnva7mtY/op4jlmajvvIzmmL7npLrlm77niYfvvIzpnIDopoHnlKjmiLfljZXni6zkv53lrZhcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodWEubWF0Y2goL01pY3JvTWVzc2VuZ2VyL2kpPT1cIm1pY3JvbWVzc2VuZ2VyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNlbmRJbWFnZScpLmF0dHIoJ3NyYycsIGRhdGFVcmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuaGlkZSgpO1xyXG5cclxuICAgICAgICB0cmFqZWN0b3J5UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3N1bW1hcnknKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoKCdzdW1tYXJ5Jyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBTdW1tYXJ5XHJcbiAgICAgICAgY29uc3Qgc3VtbWFyeVBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZFwiPuS6uueUn+aAu+e7kzwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJqdWRnZVwiIGNsYXNzPVwianVkZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMlwiPjxzcGFuPuminOWAvO+8mjwvc3Bhbj48c3Bhbj4557qnIOe+juiLpeWkqeS7mTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUwXCI+PHNwYW4+5pm65Yqb77yaPC9zcGFuPjxzcGFuPjTnuqcg5pm65Yqb5LiA6IisPC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7kvZPotKjvvJo8L3NwYW4+PHNwYW4+Mee6pyDmnoHluqbomZrlvLE8L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMFwiPjxzcGFuPuWutuWig++8mjwvc3Bhbj48c3Bhbj4257qnIOWwj+W6t+S5i+Wutjwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUwXCI+PHNwYW4+5Lqr5bm077yaPC9zcGFuPjxzcGFuPjPlsoEg5pep5aStPC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7lv6vkuZDvvJo8L3NwYW4+PHNwYW4+PC9zcGFuPjPnuqcg5LiN5aSq5bm456aP55qE5Lq655SfPC9saT5cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRcIiBzdHlsZT1cImhlaWdodDphdXRvO1wiPuWkqei1i++8jOS9oOWPr+S7pemAieS4gOS4qu+8jOS4i+i+iOWtkOi/mOiDveaKveWIsDwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgaWQ9XCJ0YWxlbnRzXCIgY2xhc3M9XCJzZWxlY3RsaXN0XCIgc3R5bGU9XCJmbGV4OiAwIDEgYXV0bztcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMmJcIj7pu5HluZXvvIjpnaLor5XkuIDlrprmiJDlip/vvIk8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYWdhaW5cIiBjbGFzcz1cIm1haW5idG5cIj48c3BhbiBjbGFzcz1cImljb25mb250XCI+JiN4ZTZhNzs8L3NwYW4+5YaN5qyh6YeN5byAPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCk7XHJcblxyXG4gICAgICAgIHN1bW1hcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjYWdhaW4nKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZXMgKys7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNsaWZlLnRhbGVudEV4dGVuZCh0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0YWxlbnRTZWxlY3RlZC5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jdG90YWxNYXggPSAyMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2lzRW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgnaW5kZXgnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuI3BhZ2VzID0ge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiBsb2FkaW5nUGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRQYWdlID0gJ2xvYWRpbmcnO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaW5kZXg6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IGluZGV4UGFnZSxcclxuICAgICAgICAgICAgICAgIGJ0bkFjaGlldmVtZW50OiBpbmRleFBhZ2UuZmluZCgnI2FjaGlldmVtZW50JyksXHJcbiAgICAgICAgICAgICAgICBidG5SZXN0YXJ0OiBpbmRleFBhZ2UuZmluZCgnI3Jlc3RhcnQnKSxcclxuICAgICAgICAgICAgICAgIGhpbnQ6IGluZGV4UGFnZS5maW5kKCcuaGludCcpLFxyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwYWdlcy5pbmRleC5idG5SZXN0YXJ0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAnaW5kZXgnO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcuaGludCcpLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZXMgPSB0aGlzLnRpbWVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjaGlldmVtZW50ID0gaW5kZXhQYWdlLmZpbmQoJyNhY2hpZXZlbWVudCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2NvcmQgPSBpbmRleFBhZ2UuZmluZCgnI2Rpc2NvcmQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjaWFsdGhhbmtzID0gaW5kZXhQYWdlLmZpbmQoJyNzcGVjaWFsdGhhbmtzJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRpbWVzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvcmQuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsdGhhbmtzLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZW1lbnQuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2NvcmQuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNwZWNpYWx0aGFua3MuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3BlY2lhbHRoYW5rczoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogc3BlY2lhbFRoYW5rc1BhZ2UsXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRoYW5rc1BhZ2UuZmluZCgnI3NwdGh4ID4gdWwuZzEnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRoYW5rc1BhZ2UuZmluZCgnI3NwdGh4ID4gdWwuZzInKSxcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKGc9PmcuZW1wdHkoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3BlY2lhbHRoYW5rc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoKT0+MC41LU1hdGgucmFuZG9tKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKCh7Z3JvdXAsIG5hbWUsIGNvbW1lbnQsIGNvbG9yfSk9Pmdyb3Vwc1stLWdyb3VwXS5hcHBlbmQoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiICR7Y29sb3I/KCdzdHlsZT1cImNvbG9yOicrY29sb3IrJ1wiJyk6Jyd9PiR7bmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21tZW50XCI+JHtjb21tZW50fHwnJ308L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYWNoaWV2ZW1lbnQ6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IGFjaGlldmVtZW50UGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSBhY2hpZXZlbWVudFBhZ2UuZmluZChcInVsI3RvdGFsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjaGlldmVtZW50cyA9IGFjaGlldmVtZW50UGFnZS5maW5kKFwidWwjYWNoaWV2ZW1lbnRzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsLmVtcHR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZW1lbnRzLmVtcHR5KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdFJhdGUgPSAodHlwZSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF0ZSA9IGdldFJhdGUodHlwZSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3IgPSBPYmplY3Qua2V5cyhyYXRlKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBhcnNlSW50KGNvbG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjb2xvciA9ICfnmb3oibInOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogY29sb3IgPSAn6JOd6ImyJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNvbG9yID0gJ+e0q+iJsic7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBjb2xvciA9ICfmqZnoibInOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0gT2JqZWN0LnZhbHVlcyhyYXRlKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBhcnNlSW50KHIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHIgPSAn5LiN5Y+YJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHIgPSAn57+75YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHIgPSAn5LiJ5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHIgPSAn5Zub5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHIgPSAn5LqU5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHIgPSAn5YWt5YCNJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYOaKveWIsCR7Y29sb3J95qaC546HJHtyfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRpbWVzLCBhY2hpZXZlbWVudCwgdGFsZW50UmF0ZSwgZXZlbnRSYXRlIH0gPSB0aGlzLiNsaWZlLmdldFRvdGFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwuYXBwZW5kKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYWNodmcke2dldEdyYWRlKCd0aW1lcycsIHRpbWVzKX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7lt7Lph43lvIAke3RpbWVzfeasoTwvc3Bhbj4ke2Zvcm1hdFJhdGUoJ3RpbWVzJywgdGltZXMpfTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFjaHZnJHtnZXRHcmFkZSgnYWNoaWV2ZW1lbnQnLCBhY2hpZXZlbWVudCl9XCI+PHNwYW4gY2xhc3M9XCJhY2hpZXZlbWVudHRpdGxlXCI+5oiQ5bCx6L6+5oiQJHthY2hpZXZlbWVudH3kuKo8L3NwYW4+JHtmb3JtYXRSYXRlKCdhY2hpZXZlbWVudCcsIGFjaGlldmVtZW50KX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2h2ZyR7Z2V0R3JhZGUoJ2V2ZW50UmF0ZScsIGV2ZW50UmF0ZSl9XCI+PHNwYW4gY2xhc3M9XCJhY2hpZXZlbWVudHRpdGxlXCI+5LqL5Lu26YCJ5oup546HPC9zcGFuPiR7TWF0aC5mbG9vcihldmVudFJhdGUgKiAxMDApfSU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2h2ZyR7Z2V0R3JhZGUoJ3RhbGVudFJhdGUnLCB0YWxlbnRSYXRlKX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7lpKnotYvmlLbpm4bnjoc8L3NwYW4+JHtNYXRoLmZsb29yKHRhbGVudFJhdGUgKiAxMDApfSU8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIGApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2hpZXZlbWVudHNEYXRhID0gdGhpcy4jbGlmZS5nZXRBY2hpZXZlbWVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudHNEYXRhLmZvckVhY2goKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZGVzY3JpcHRpb24sIGhpZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRlLCBpc0FjaGlldmVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaGlkZSAmJiAhaXNBY2hpZXZlZCkgbmFtZSA9IGRlc2NyaXB0aW9uID0gJz8/Pyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjaGlldmVtZW50cy5hcHBlbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPGxpIGNsYXNzPVwiYWNodmcke2dyYWRlfSAke2lzQWNoaWV2ZWQ/Jyc6J21hc2snfVwiPjxzcGFuIGNsYXNzPVwiYWNoaWV2ZW1lbnR0aXRsZVwiPiR7bmFtZX08L3NwYW4+JHtkZXNjcmlwdGlvbn08L2xpPmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGFsZW50OiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiB0YWxlbnRQYWdlLFxyXG4gICAgICAgICAgICAgICAgdGFsZW50TGlzdDogdGFsZW50UGFnZS5maW5kKCcjdGFsZW50cycpLFxyXG4gICAgICAgICAgICAgICAgYnRuUmFuZG9tOiB0YWxlbnRQYWdlLmZpbmQoJyNyYW5kb20nKSxcclxuICAgICAgICAgICAgICAgIGJ0bk5leHQ6IHRhbGVudFBhZ2UuZmluZCgnI25leHQnKSxcclxuICAgICAgICAgICAgICAgIHByZXNzRW50ZXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFsZW50TGlzdCA9IHRoaXMuI3BhZ2VzLnRhbGVudC50YWxlbnRMaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0blJhbmRvbSA9IHRoaXMuI3BhZ2VzLnRhbGVudC5idG5SYW5kb207XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRuTmV4dCA9IHRoaXMuI3BhZ2VzLnRhbGVudC5idG5OZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWxlbnRMaXN0LmNoaWxkcmVuKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0bk5leHQuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBidG5SYW5kb20uY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAndGFsZW50JztcclxuICAgICAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJ3VsLnNlbGVjdGxpc3QnKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI3JhbmRvbScpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiN0b3RhbE1heCA9IDIwO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcHJvcGVydHk6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHByb3BlcnR5UGFnZSxcclxuICAgICAgICAgICAgICAgIGJ0blN0YXJ0OiBwcm9wZXJ0eVBhZ2UuZmluZCgnI3N0YXJ0JyksXHJcbiAgICAgICAgICAgICAgICBwcmVzc0VudGVyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLnByb3BlcnR5LmJ0blN0YXJ0LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAncHJvcGVydHknO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyZXNoVG90YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyN0YWxlbnRTZWxlY3RlZFZpZXcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRyYWplY3Rvcnk6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHRyYWplY3RvcnlQYWdlLFxyXG4gICAgICAgICAgICAgICAgbGlmZVRyYWplY3Rvcnk6IHRyYWplY3RvcnlQYWdlLmZpbmQoJyNsaWZlVHJhamVjdG9yeScpLFxyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwYWdlcy50cmFqZWN0b3J5LmxpZmVUcmFqZWN0b3J5LmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAndHJhamVjdG9yeSc7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2xpZmVUcmFqZWN0b3J5JykuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjc3VtbWFyeScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNpc0VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJvcm46ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2xpZmVUcmFqZWN0b3J5JykudHJpZ2dlcihcImNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdW1tYXJ5OiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiBzdW1tYXJ5UGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRQYWdlID0gJ3N1bW1hcnknO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp1ZGdlID0gc3VtbWFyeVBhZ2UuZmluZCgnI2p1ZGdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFsZW50cyA9IHN1bW1hcnlQYWdlLmZpbmQoJyN0YWxlbnRzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAganVkZ2UuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICB0YWxlbnRzLmVtcHR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGFsZW50U2VsZWN0ZWQuZm9yRWFjaCh0YWxlbnQ9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGkgPSBjcmVhdGVUYWxlbnQodGFsZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFsZW50cy5hcHBlbmQobGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaS5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGkuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodGhpcy4jc2VsZWN0ZWRFeHRlbmRUYWxlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn5Y+q6IO957un5om/5LiA5Liq5aSp6LWLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNzZWxlY3RlZEV4dGVuZFRhbGVudCA9IHRhbGVudC5pZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gdGhpcy4jbGlmZS5nZXRTdW1tYXJ5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gKGRpc2NyaXB0aW9uLCB0eXBlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN1bW1hcnlEYXRhW3R5cGVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGp1ZGdlLCBncmFkZSB9ID0gc3VtbWFyeSh0eXBlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGxpIGNsYXNzPVwiZ3JhZGUke2dyYWRlfVwiPjxzcGFuPiR7ZGlzY3JpcHRpb25977yaPC9zcGFuPjxzcGFuPiR7dmFsdWV9ICR7anVkZ2V9PC9zcGFuPjwvbGk+YDtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqdWRnZS5hcHBlbmQoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn6aKc5YC8JywgJ0NIUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5pm65YqbJywgJ0lOVCcpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5L2T6LSoJywgJ1NUUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5a625aKDJywgJ01OWScpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5b+r5LmQJywgJ1NQUicpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5Lqr5bm0JywgJ0FHRScpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2Zvcm1hdCgn5oC76K+EJywgJ1NVTScpfVxyXG4gICAgICAgICAgICAgICAgICAgIGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCRvbignYWNoaWV2ZW1lbnQnLCAoe25hbWV9KT0+e1xyXG4gICAgICAgICAgICB0aGlzLmhpbnQoYOino+mUgeaIkOWwseOAkCR7bmFtZX3jgJFgLCAnc3VjY2VzcycpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoKHBhZ2UpIHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy4jcGFnZXNbcGFnZV07XHJcbiAgICAgICAgaWYoIXApIHJldHVybjtcclxuICAgICAgICAkKCcjbWFpbicpLmRldGFjaCgpO1xyXG4gICAgICAgIHAuY2xlYXIoKTtcclxuICAgICAgICBwLnBhZ2UuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgICAgICBpZih0eXBlb2YgcC5wYWdlLm1vdW50ZWQgPT09ICdmdW5jdGlvbicpe1xyXG4gICAgICAgICAgICBwLnBhZ2UubW91bnRlZCgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhpbnQobWVzc2FnZSwgdHlwZT0naW5mbycpIHtcclxuICAgICAgICBpZih0aGlzLiNoaW50VGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jaGludFRpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLiNoaW50VGltZW91dCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhpZGVCYW5uZXJzKCk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYmFubmVyID0gJChgLmJhbm5lci4ke3R5cGV9YCk7XHJcbiAgICAgICAgICAgIGJhbm5lci5hZGRDbGFzcygndmlzaWJsZScpO1xyXG4gICAgICAgICAgICBiYW5uZXIuZmluZCgnLmJhbm5lci1tZXNzYWdlJykudGV4dChtZXNzYWdlKTtcclxuICAgICAgICAgICAgaWYodHlwZSAhPSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNoaW50VGltZW91dCA9IHNldFRpbWVvdXQoaGlkZUJhbm5lcnMsIDMwMDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGhlbWUodGhlbWUpIHtcclxuICAgICAgICBjb25zdCB0aGVtZUxpbmsgPSAkKGRvY3VtZW50KS5maW5kKCcjdGhlbWVMaW5rJyk7XHJcblxyXG4gICAgICAgIGlmKHRoZW1lID09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgdGhlbWVMaW5rLmF0dHIoJ2hyZWYnLCAnbGlnaHQuY3NzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhlbWVMaW5rLmF0dHIoJ2hyZWYnLCAnZGFyay5jc3MnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpbWVzKCkge3JldHVybiB0aGlzLiNsaWZlPy50aW1lcyB8fCAwO31cclxuICAgIHNldCB0aW1lcyh2KSB7IGlmKHRoaXMuI2xpZmUpIHRoaXMuI2xpZmUudGltZXMgPSB2IH07XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBcHA7XHJcbiIsImltcG9ydCBBcHAgZnJvbSAnLi4vc3JjL2FwcC5qcyc7XHJcblxyXG5nbG9iYWxUaGlzLiQkZXZlbnRNYXAgPSBuZXcgTWFwKCk7XHJcbmdsb2JhbFRoaXMuJCRldmVudCA9ICh0YWcsIGRhdGEpID0+IHtcclxuICAgIGNvbnN0IGxpc3RlbmVyID0gJCRldmVudE1hcC5nZXQodGFnKTtcclxuICAgIGlmKGxpc3RlbmVyKSBsaXN0ZW5lci5mb3JFYWNoKGZuPT5mbihkYXRhKSk7XHJcbn1cclxuZ2xvYmFsVGhpcy4kJG9uID0gKHRhZywgZm4pID0+IHtcclxuICAgIGxldCBsaXN0ZW5lciA9ICQkZXZlbnRNYXAuZ2V0KHRhZyk7XHJcbiAgICBpZighbGlzdGVuZXIpIHtcclxuICAgICAgICBsaXN0ZW5lciA9IG5ldyBTZXQoKTtcclxuICAgICAgICAkJGV2ZW50TWFwLnNldCh0YWcsIGxpc3RlbmVyKTtcclxuICAgIH1cclxuICAgIGxpc3RlbmVyLmFkZChmbik7XHJcbn1cclxuZ2xvYmFsVGhpcy4kJG9mZiA9ICh0YWcsIGZuKSA9PiB7XHJcbiAgICBjb25zdCBsaXN0ZW5lciA9ICQkZXZlbnRNYXAuZ2V0KHRhZyk7XHJcbiAgICBpZihsaXN0ZW5lcikgbGlzdGVuZXIuZGVsZXRlKGZuKTtcclxufVxyXG5cclxuZ2xvYmFsVGhpcy5qc29uID0gYXN5bmMgZmlsZU5hbWUgPT4gYXdhaXQgKGF3YWl0IGZldGNoKGAuLi9kYXRhLyR7ZmlsZU5hbWV9Lmpzb25gKSkuanNvbigpO1xyXG5cclxuLy8gUHNzc3QsIEkndmUgY3JlYXRlZCBhIGdpdGh1YiBwYWNrYWdlIC0gaHR0cHM6Ly9naXRodWIuY29tL2Jyb29rZXNiOTEvZGlzbWlzc2libGVcclxuZ2xvYmFsVGhpcy5oaWRlQmFubmVycyA9IChlKSA9PiB7XHJcbiAgICBkb2N1bWVudFxyXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhbm5lci52aXNpYmxlXCIpXHJcbiAgICAgICAgLmZvckVhY2goKGIpID0+IGIuY2xhc3NMaXN0LnJlbW92ZShcInZpc2libGVcIikpO1xyXG59O1xyXG5cclxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xyXG5hcHAuaW5pdGlhbCgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3785\n')}},__webpack_module_cache__={};function __webpack_require__(e){var n=__webpack_module_cache__[e];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();var __webpack_exports__=__webpack_require__(3785)})();