\\n
\\u8FD4\\u56DE \\n
\\u7EDF\\u8BA1 \\n
\\n
\\n
\\u6210\\u5C31\\u6392\\u884C\\u699C \\n
\\n ");\n achievementPage.find(\'#specialthanks\').click(function () {\n return _this2.switch(\'index\');\n });\n achievementPage.find(\'#rank\').click(function () {\n return _this2.hint(\'别卷了,没有排行榜\');\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 var contents = 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(contents); // $(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 \\u81EA\\u52A8\\u64AD\\u653E \\n \\u81EA\\u52A8\\u64AD\\u653E2x \\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();\n trajectoryPage.find(\'#auto\').hide();\n trajectoryPage.find(\'#auto2x\').hide(); // trajectoryPage.find(\'#domToImage\').show();\n }\n\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 }); // 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 clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n\n _this2.switch(\'summary\');\n });\n\n var auto = function auto(tick) {\n if (app_classPrivateFieldGet(_this2, _autoTrajectory)) {\n clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n } else {\n if (!_this2.isEnd) trajectoryPage.find(\'#lifeTrajectory\').click();\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, setInterval(function () {\n if (_this2.isEnd) {\n clearInterval(app_classPrivateFieldGet(_this2, _autoTrajectory));\n\n app_classPrivateFieldSet(_this2, _autoTrajectory, null);\n } else {\n trajectoryPage.find(\'#lifeTrajectory\').click();\n }\n }, tick));\n }\n };\n\n trajectoryPage.find(\'#auto\').click(function () {\n return auto(1000);\n });\n trajectoryPage.find(\'#auto2x\').click(function () {\n return auto(500);\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\\u6536\\u96C6\\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 trajectoryPage.find(\'#auto\').show();\n trajectoryPage.find(\'#auto2x\').show();\n\n app_classPrivateFieldSet(_this2, _isEnd, false);\n },\n born: function born(contents) {\n if (contents.length > 0) $(\'#lifeTrajectory\').append("
\\u521D\\u59CB\\uFF1A ".concat(contents.map(function (_ref9) {\n var source = _ref9.source,\n target = _ref9.target;\n return "\\u5929\\u8D4B\\u3010".concat(source.name, "\\u3011\\u53D1\\u52A8\\uFF1A\\u66FF\\u6362\\u4E3A\\u5929\\u8D4B\\u3010").concat(target.name, "\\u3011");\n }).join(\' \'), " "));\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 var lastExtendTalent = app_classPrivateFieldGet(_this2, _life).getLastExtendTalent();\n\n Array.from(app_classPrivateFieldGet(_this2, _talentSelected)).sort(function (_ref10, _ref11) {\n var a = _ref10.id,\n ag = _ref10.grade;\n var b = _ref11.id,\n bg = _ref11.grade;\n if (a == lastExtendTalent) return -1;\n if (b == lastExtendTalent) return 1;\n return bg - ag;\n }).forEach(function (talent, i) {\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 if (!i) li.click();\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 (_ref12) {\n var name = _ref12.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4NS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUE1RUE7O0FBZ0ZBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQWZBO0FBaUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQWpCQTtBQW1CQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTs7QUFDQTtBQUFBO0FBTkE7QUFRQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFEQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFEQTtBQUFBOztBQUFBO0FBRUE7QUFBQTtBQUFBOztBQUNBO0FBREE7QUFGQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUtBOztBQUxBO0FBQUE7O0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQURBO0FBTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFTQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1Q0E7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTs7QUExQ0E7O0FBRkE7QUFrREE7QUFDQTtBQUZBOztBQWpEQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBOERBO0FBQUE7O0FBRUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQ0E7O0FBNEJBO0FBQ0E7QUFEQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFBQTtBQXJEQTtBQXVEQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFoQkE7QUFrQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBbkJBO0FBcUJBOzs7QUFFQTtBQUFBOztBQUNBO0FBUUE7OztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBQUE7QUExQkE7QUE0QkE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFGQTtBQUlBOzs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUtBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBUEE7O0FBU0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUlBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQVZBOztBQVlBO0FBQ0E7QUFVQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUlBOzs7Ozs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUFBO0FBdEJBO0FBd0JBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQVJBO0FBVUE7O0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUdBO0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTs7QUFDQTs7QUFFQTtBQUFBO0FBNUJBO0FBOEJBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlIQTtBQUNBOzs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUFBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2REE7QUFDQTtBQUNBOzs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUFBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQURBO0FBQUE7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTs7QUFGQTtBQUFBOztBQUFBO0FBR0E7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFQQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQVFBO0FBQ0E7OztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQURBOztBQUdBO0FBQ0E7QUFEQTs7QUFHQTtBQUNBO0FBREE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOztBQURBO0FBQUE7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBOztBQWhDQTtBQUFBOztBQUFBO0FBaUNBO0FBQUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBd0NBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQURBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0tBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQUE7O0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTs7QUFKQTs7QUFIQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7OztBQVlBO0FBQUE7O0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUhBO0FBSEE7QUFRQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFEQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7Ozs7O0FBUUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBTUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQVZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0FBYUE7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUNBOztBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTs7QUFDQTtBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRkE7QUFJQTs7QUFDQTtBQUNBOzs7QUFFQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7O0FBTEE7QUFBQTs7QUFBQTtBQU1BO0FBQUE7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7O0FBQ0E7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQW9CQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTs7QUFDQTtBQUVBO0FBQUE7O0FBQUE7QUFBQTtBQUdBOzs7QUFFQTtBQUNBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTtBQUVBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUNBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTs7O0FBRUE7QUFBQTs7QUFBQTtBQUFBO0FBQ0E7QUFBQTs7QUFDQTs7QUFDQTtBQUlBOzs7Ozs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNU5BO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOzs7OztBQWFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFHQTs7QUFJQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBbkJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0FBc0JBO0FBQUE7O0FBRUE7QUFDQTs7QUFVQTs7QUFpQkE7QUFFQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFHQTtBQUdBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFZQTtBQUVBO0FBQUE7QUFFQTtBQVVBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFBQTs7QUFFQTs7QUFTQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFHQTtBQUFBO0FBQUE7O0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT0E7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFHQTs7QUFDQTtBQUFBO0FBQUE7O0FBY0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBR0E7O0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBREE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFHQTs7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQU5BOztBQVFBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7O0FBR0E7QUFnQkE7QUFHQTs7QUFDQTs7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBR0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBOztBQUNBO0FBT0E7O0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUdBOztBQUNBOztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUFBOztBQUdBO0FBbUJBO0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBM0JBO0FBNkJBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBOztBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BO0FBaEJBO0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBTEE7O0FBT0E7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBUEE7O0FBU0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQU9BOztBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBbERBO0FBb0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBcEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUdBO0FBWkE7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBeEJBO0FBMEJBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUNBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUNBO0FBQ0E7O0FBQ0E7QUFBQTtBQUFBOztBQUNBO0FBQ0E7O0FBRUE7QUFTQTtBQXJEQTtBQXhLQTs7QUFpT0E7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQUE7O0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7O0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbHpCQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FBR0E7QUFDQTtBQUVBO0FBQUE7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy9zdW1tYXJ5LmpzPzRkYWUiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2Z1bmN0aW9ucy9hZGRpdGlvbi5qcz84MDNkIiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9mdW5jdGlvbnMvdXRpbC5qcz9hZWRjIiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9wcm9wZXJ0eS5qcz8yOWE2Iiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9mdW5jdGlvbnMvY29uZGl0aW9uLmpzPzZkMDgiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2V2ZW50LmpzPzQwMmEiLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL3RhbGVudC5qcz9jNTZmIiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9hY2hpZXZlbWVudC5qcz9lNDIyIiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9saWZlLmpzPzkxMDciLCJ3ZWJwYWNrOi8vbGlmZV9yZXN0YXJ0Ly4vc3JjL2FwcC5qcz8xMTEyIiwid2VicGFjazovL2xpZmVfcmVzdGFydC8uL3NyYy9pbmRleC5qcz9iNjM1Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGRhdGEgPSB7XG4gICAgXCJDSFJcIjogW1xuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjIsIFwianVkZ2VcIjogXCLkuI3kvbNcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo3LCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjksIFwianVkZ2VcIjogXCLnvZXop4FcIiwgXCJncmFkZVwiOiAyfSxcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcbiAgICBdLFxuICAgIFwiTU5ZXCI6IFtcbiAgICAgICAge1wianVkZ2VcIjogXCLlnLDni7FcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MSwgXCJqdWRnZVwiOiBcIuaKmOejqFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoyLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjQsIFwianVkZ2VcIjogXCLmma7pgJpcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NywgXCJqdWRnZVwiOiBcIuS8mOengFwiLCBcImdyYWRlXCI6IDF9LFxuICAgICAgICB7XCJtaW5cIjo5LCBcImp1ZGdlXCI6IFwi572V6KeBXCIsIFwiZ3JhZGVcIjogMn0sXG4gICAgICAgIHtcIm1pblwiOjExLCBcImp1ZGdlXCI6IFwi6YCG5aSpXCIsIFwiZ3JhZGVcIjogM30sXG4gICAgXSxcbiAgICBcIlNQUlwiOiBbXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjEsIFwianVkZ2VcIjogXCLmipjno6hcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MiwgXCJqdWRnZVwiOiBcIuS4jeW5uFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo0LCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjcsIFwianVkZ2VcIjogXCLlubjnpo9cIiwgXCJncmFkZVwiOiAxfSxcbiAgICAgICAge1wibWluXCI6OSwgXCJqdWRnZVwiOiBcIuaegeS5kFwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjoxMSwgXCJqdWRnZVwiOiBcIuWkqeWRvVwiLCBcImdyYWRlXCI6IDN9LFxuICAgIF0sXG4gICAgXCJJTlRcIjogW1xuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjIsIFwianVkZ2VcIjogXCLkuI3kvbNcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo3LCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjksIFwianVkZ2VcIjogXCLnvZXop4FcIiwgXCJncmFkZVwiOiAyfSxcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MjEsIFwianVkZ2VcIjogXCLor4bmtbdcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MTMxLCBcImp1ZGdlXCI6IFwi5YWD56WeXCIsIFwiZ3JhZGVcIjogM30sXG4gICAgICAgIHtcIm1pblwiOjUwMSwgXCJqdWRnZVwiOiBcIuS7memtglwiLCBcImdyYWRlXCI6IDN9LFxuICAgIF0sXG4gICAgXCJTVFJcIjogW1xuICAgICAgICB7XCJqdWRnZVwiOiBcIuWcsOeLsVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjIsIFwianVkZ2VcIjogXCLkuI3kvbNcIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6NCwgXCJqdWRnZVwiOiBcIuaZrumAmlwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo3LCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjksIFwianVkZ2VcIjogXCLnvZXop4FcIiwgXCJncmFkZVwiOiAyfSxcbiAgICAgICAge1wibWluXCI6MTEsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MjEsIFwianVkZ2VcIjogXCLlh53msJRcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MTAxLCBcImp1ZGdlXCI6IFwi562R5Z+6XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgICAgIHtcIm1pblwiOjQwMSwgXCJqdWRnZVwiOiBcIumHkeS4uVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoxMDAxLCBcImp1ZGdlXCI6IFwi5YWD5am0XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgICAgIHtcIm1pblwiOjIwMDEsIFwianVkZ2VcIjogXCLku5nkvZNcIiwgXCJncmFkZVwiOiAzfSxcbiAgICBdLFxuICAgIFwiQUdFXCI6IFtcbiAgICAgICAge1wianVkZ2VcIjogXCLog47mrbvohbnkuK1cIiwgXCJncmFkZVwiOiAwfSxcbiAgICAgICAge1wibWluXCI6MSwgXCJqdWRnZVwiOiBcIuaXqeWkrVwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxMCwgXCJqdWRnZVwiOiBcIuWwkeW5tFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjoxOCwgXCJqdWRnZVwiOiBcIuebm+W5tFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo0MCwgXCJqdWRnZVwiOiBcIuS4reW5tFwiLCBcImdyYWRlXCI6IDB9LFxuICAgICAgICB7XCJtaW5cIjo2MCwgXCJqdWRnZVwiOiBcIuiKseeUslwiLCBcImdyYWRlXCI6IDF9LFxuICAgICAgICB7XCJtaW5cIjo3MCwgXCJqdWRnZVwiOiBcIuWPpOeogFwiLCBcImdyYWRlXCI6IDF9LFxuICAgICAgICB7XCJtaW5cIjo4MCwgXCJqdWRnZVwiOiBcIuadluacnVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjo5MCwgXCJqdWRnZVwiOiBcIuWNl+WxsVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjo5NSwgXCJqdWRnZVwiOiBcIuS4jeiAgVwiLCBcImdyYWRlXCI6IDN9LFxuICAgICAgICB7XCJtaW5cIjoxMDAsIFwianVkZ2VcIjogXCLkv67ku5lcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6NTAwLCBcImp1ZGdlXCI6IFwi5LuZ5a+/XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgXSxcbiAgICBcIlNVTVwiOiBbXG4gICAgICAgIHtcImp1ZGdlXCI6IFwi5Zyw54uxXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjQxLCBcImp1ZGdlXCI6IFwi5oqY56OoXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjUwLCBcImp1ZGdlXCI6IFwi5LiN5L2zXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjYwLCBcImp1ZGdlXCI6IFwi5pmu6YCaXCIsIFwiZ3JhZGVcIjogMH0sXG4gICAgICAgIHtcIm1pblwiOjgwLCBcImp1ZGdlXCI6IFwi5LyY56eAXCIsIFwiZ3JhZGVcIjogMX0sXG4gICAgICAgIHtcIm1pblwiOjEwMCwgXCJqdWRnZVwiOiBcIue9leingVwiLCBcImdyYWRlXCI6IDJ9LFxuICAgICAgICB7XCJtaW5cIjoxMTAsIFwianVkZ2VcIjogXCLpgIblpKlcIiwgXCJncmFkZVwiOiAzfSxcbiAgICAgICAge1wibWluXCI6MTIwLCBcImp1ZGdlXCI6IFwi5Lyg6K+0XCIsIFwiZ3JhZGVcIjogM30sXG4gICAgXVxufVxuXG5mdW5jdGlvbiBzdW1tYXJ5KHR5cGUsIHZhbHVlKSB7XG4gICAgbGV0IGxlbmd0aCA9IGRhdGFbdHlwZV0ubGVuZ3RoO1xuICAgIHdoaWxlKGxlbmd0aC0tKSB7XG4gICAgICAgIGNvbnN0IHttaW4sIGp1ZGdlLCBncmFkZX0gPSBkYXRhW3R5cGVdW2xlbmd0aF07XG4gICAgICAgIGlmKG1pbj09dm9pZCAwIHx8IHZhbHVlID49IG1pbikgcmV0dXJuIHtqdWRnZSwgZ3JhZGV9O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgc3VtbWFyeSB9OyIsImV4cG9ydCBmdW5jdGlvbiBnZXRSYXRlKHR5cGUsIHZhbHVlKSB7XHJcbiAgICBzd2l0Y2godHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3RpbWVzJzpcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTAwKSByZXR1cm4gezI6Nn07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDcwKSByZXR1cm4gezI6NX07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDUwKSByZXR1cm4gezI6NH07XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDMwKSByZXR1cm4gezI6M307XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwKSByZXR1cm4gezI6Mn07XHJcbiAgICAgICAgICAgIHJldHVybiB7MjogMX07XHJcbiAgICAgICAgY2FzZSAnYWNoaWV2ZW1lbnQnOlxyXG4gICAgICAgICAgICBpZih2YWx1ZSA+PSAxMDApIHJldHVybiB7Mzo2fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gNzApIHJldHVybiB7Mzo1fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gNTApIHJldHVybiB7Mzo0fTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMzApIHJldHVybiB7MzozfTtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTApIHJldHVybiB7MzoyfTtcclxuICAgICAgICAgICAgcmV0dXJuIHszOjF9O1xyXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiB7fTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyYWRlKHR5cGUsIHZhbHVlKSB7XHJcbiAgICBzd2l0Y2godHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3RpbWVzJzpcclxuICAgICAgICBjYXNlICdhY2hpZXZlbWVudCc6XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDEwMCkgcmV0dXJuIDM7XHJcbiAgICAgICAgICAgIGlmKHZhbHVlID49IDUwKSByZXR1cm4gMjtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMTApIHJldHVybiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICBjYXNlICd0YWxlbnRSYXRlJzpcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC45KSByZXR1cm4gMztcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC42KSByZXR1cm4gMjtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC4zKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgY2FzZSAnZXZlbnRSYXRlJzpcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC42KSByZXR1cm4gMztcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC40KSByZXR1cm4gMjtcclxuICAgICAgICAgICAgaWYodmFsdWUgPj0gMC4yKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7XHJcbiAgICB9XHJcbn0iLCJmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgIHN3aXRjaCh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKHY9PmNsb25lKHYpKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld09iaiA9IHt9O1xuICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiB2YWx1ZSkgbmV3T2JqW2tleV0gPSBjbG9uZSh2YWx1ZVtrZXldKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1heCguLi5hcnIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4uYXJyLmZsYXQoKSk7XG59XG5cbmZ1bmN0aW9uIG1pbiguLi5hcnIpIHtcbiAgICByZXR1cm4gTWF0aC5taW4oLi4uYXJyLmZsYXQoKSk7XG59XG5cbmZ1bmN0aW9uIHN1bSguLi5hcnIpIHtcbiAgICBsZXQgcyA9IDA7XG4gICAgYXJyLmZsYXQoKS5mb3JFYWNoKHY9PnMrPXYpO1xuICAgIHJldHVybiBzO1xufVxuXG5mdW5jdGlvbiBhdmVyYWdlKC4uLmFycikge1xuICAgIGNvbnN0IHMgPSBzdW0oLi4uYXJyKTtcbiAgICByZXR1cm4gcyAvIGFyci5mbGF0KCkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB3ZWlnaHRSYW5kb20obGlzdCkge1xuICAgIGxldCB0b3RhbFdlaWdodHMgPSAwO1xuICAgIGZvcihjb25zdCBbLCB3ZWlnaHRdIG9mIGxpc3QpXG4gICAgICAgIHRvdGFsV2VpZ2h0cyArPSB3ZWlnaHQ7XG5cbiAgICBsZXQgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIHRvdGFsV2VpZ2h0cztcbiAgICBmb3IoY29uc3QgW2lkLCB3ZWlnaHRdIG9mIGxpc3QpXG4gICAgICAgIGlmKChyYW5kb20tPXdlaWdodCk8MClcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICByZXR1cm4gbGlzdFtsaXN0Lmxlbmd0aC0xXTtcbn1cblxuZnVuY3Rpb24gbGlzdFJhbmRvbShsaXN0KSB7XG4gICAgcmV0dXJuIGxpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGlzdC5sZW5ndGgpXTtcbn1cblxuZXhwb3J0IHsgY2xvbmUsIG1heCwgbWluLCBzdW0sIGF2ZXJhZ2UsIHdlaWdodFJhbmRvbSwgbGlzdFJhbmRvbSB9OyIsImltcG9ydCB7IG1heCwgbWluLCBzdW0sIGNsb25lLCBsaXN0UmFuZG9tIH0gZnJvbSAnLi9mdW5jdGlvbnMvdXRpbC5qcyc7XHJcblxyXG5jbGFzcyBQcm9wZXJ0eSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgVFlQRVMgPSB7XHJcbiAgICAgICAgLy8g5pys5bGAXHJcbiAgICAgICAgQUdFOiBcIkFHRVwiLCAvLyDlubTpvoQgYWdlIEFHRVxyXG4gICAgICAgIENIUjogXCJDSFJcIiwgLy8g6aKc5YC8IGNoYXJtIENIUlxyXG4gICAgICAgIElOVDogXCJJTlRcIiwgLy8g5pm65YqbIGludGVsbGlnZW5jZSBJTlRcclxuICAgICAgICBTVFI6IFwiU1RSXCIsIC8vIOS9k+i0qCBzdHJlbmd0aCBTVFJcclxuICAgICAgICBNTlk6IFwiTU5ZXCIsIC8vIOWutuWigyBtb25leSBNTllcclxuICAgICAgICBTUFI6IFwiU1BSXCIsIC8vIOW/q+S5kCBzcGlyaXQgU1BSXHJcbiAgICAgICAgTElGOiBcIkxJRlwiLCAvLyDnlJ/lkb0gbGlmZSBMSUZFXHJcbiAgICAgICAgVExUOiBcIlRMVFwiLCAvLyDlpKnotYsgdGFsZW50IFRMVFxyXG4gICAgICAgIEVWVDogXCJFVlRcIiwgLy8g5LqL5Lu2IGV2ZW50IEVWVFxyXG4gICAgICAgIFRNUzogXCJUTVNcIiwgLy8g5qyh5pWwIHRpbWVzIFRNU1xyXG5cclxuICAgICAgICAvLyBBdXRvIGNhbGNcclxuICAgICAgICBMQUdFOiBcIkxBR0VcIiwgLy8g5pyA5L2O5bm06b6EIExvdyBBZ2VcclxuICAgICAgICBIQUdFOiBcIkhBR0VcIiwgLy8g5pyA6auY5bm06b6EIEhpZ2ggQWdlXHJcbiAgICAgICAgTENIUjogXCJMQ0hSXCIsIC8vIOacgOS9juminOWAvCBMb3cgQ2hhcm1cclxuICAgICAgICBIQ0hSOiBcIkhDSFJcIiwgLy8g5pyA6auY6aKc5YC8IEhpZ2ggQ2hhcm1cclxuICAgICAgICBMSU5UOiBcIkxJTlRcIiwgLy8g5pyA5L2O5pm65YqbIExvdyBJbnRlbGxpZ2VuY2VcclxuICAgICAgICBISU5UOiBcIkhJTlRcIiwgLy8g5pyA6auY5pm65YqbIEhpZ2ggSW50ZWxsaWdlbmNlXHJcbiAgICAgICAgTFNUUjogXCJMU1RSXCIsIC8vIOacgOS9juS9k+i0qCBMb3cgU3RyZW5ndGhcclxuICAgICAgICBIU1RSOiBcIkhTVFJcIiwgLy8g5pyA6auY5L2T6LSoIEhpZ2ggU3RyZW5ndGhcclxuICAgICAgICBMTU5ZOiBcIkxNTllcIiwgLy8g5pyA5L2O5a625aKDIExvdyBNb25leVxyXG4gICAgICAgIEhNTlk6IFwiSE1OWVwiLCAvLyDmnIDpq5jlrrblooMgSGlnaCBNb25leVxyXG4gICAgICAgIExTUFI6IFwiTFNQUlwiLCAvLyDmnIDkvY7lv6vkuZAgTG93IFNwaXJpdFxyXG4gICAgICAgIEhTUFI6IFwiSFNQUlwiLCAvLyDmnIDpq5jlv6vkuZAgSGlnaCBTcGlyaXRcclxuXHJcbiAgICAgICAgU1VNOiBcIlNVTVwiLCAvLyDmgLvor4Qgc3VtbWFyeSBTVU1cclxuXHJcbiAgICAgICAgRVhUOiBcIkVYVFwiLCAvLyDnu6fmib/lpKnotYtcclxuXHJcbiAgICAgICAgLy8g5oC76K6hXHJcbiAgICAgICAgLy8gQWNoaWV2ZW1lbnQgVG90YWxcclxuICAgICAgICBBVExUOiBcIkFUTFRcIiwgLy8g5oul5pyJ6L+H55qE5aSp6LWLIEFjaGlldmUgVGFsZW50XHJcbiAgICAgICAgQUVWVDogXCJBRVZUXCIsIC8vIOinpuWPkei/h+eahOS6i+S7tiBBY2hpZXZlIEV2ZW50XHJcbiAgICAgICAgQUNIVjogXCJBQ0hWXCIsIC8vIOi+vuaIkOeahOaIkOWwsSBBY2hpZXZlbWVudFxyXG5cclxuICAgICAgICBDVExUOiBcIlJUTFRcIiwgLy8g5aSp6LWL6YCJ5oup5pWwIENvdW50IFRhbGVudFxyXG4gICAgICAgIENFVlQ6IFwiUkVWVFwiLCAvLyDkuovku7bmlLbpm4bmlbAgQ291bnQgRXZlbnRcclxuICAgICAgICBDQUNIVjogXCJDQUNIVlwiLCAvLyDmiJDlsLHovr7miJDmlbAgQ291bnQgQWNoaWV2ZW1lbnRcclxuXHJcbiAgICAgICAgLy8gU1BFQ0lBTFxyXG4gICAgICAgIFJETTogJ1JETScsIC8vIOmaj+acuuWxnuaApyByYW5kb20gUkRNXHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvLyDnibnmrornsbvlnotcclxuICAgIFNQRUNJQUwgPSB7XHJcbiAgICAgICAgUkRNOiBbIC8vIOmaj+acuuWxnuaApyByYW5kb20gUkRNXHJcbiAgICAgICAgICAgIHRoaXMuVFlQRVMuQ0hSLFxyXG4gICAgICAgICAgICB0aGlzLlRZUEVTLklOVCxcclxuICAgICAgICAgICAgdGhpcy5UWVBFUy5TVFIsXHJcbiAgICAgICAgICAgIHRoaXMuVFlQRVMuTU5ZLFxyXG4gICAgICAgICAgICB0aGlzLlRZUEVTLlNQUixcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgI2FnZURhdGE7XHJcbiAgICAjZGF0YSA9IHt9O1xyXG5cclxuICAgIGluaXRpYWwoe2FnZX0pIHtcclxuXHJcbiAgICAgICAgdGhpcy4jYWdlRGF0YSA9IGFnZTtcclxuICAgICAgICBmb3IoY29uc3QgYSBpbiBhZ2UpIHtcclxuICAgICAgICAgICAgbGV0IHsgZXZlbnQsIHRhbGVudCB9ID0gYWdlW2FdO1xyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShldmVudCkpXHJcbiAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQgPSBldmVudC5tYXAodj0+e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHt2fWAuc3BsaXQoJyonKS5tYXAobj0+TnVtYmVyKG4pKTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlLmxlbmd0aD09MSkgdmFsdWUucHVzaCgxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheSh0YWxlbnQpKVxyXG4gICAgICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Py5zcGxpdCgnLCcpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgdGFsZW50ID0gdGFsZW50Lm1hcCh2PT5OdW1iZXIodikpO1xyXG5cclxuICAgICAgICAgICAgYWdlW2FdID0geyBldmVudCwgdGFsZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnQoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuI2RhdGEgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IC0xLFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSU5UXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1RSXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogMCxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuU1BSXTogMCxcclxuXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxJRl06IDEsXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5UTFRdOiBbXSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuRVZUXTogW10sXHJcblxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MQUdFXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxDSFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTElOVF06IEluZmluaXR5LFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5MU1RSXTogSW5maW5pdHksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkxTUFJdOiBJbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTE1OWV06IEluZmluaXR5LFxyXG5cclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSEFHRV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSENIUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSElOVF06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNUUl06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSE1OWV06IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuSFNQUl06IC1JbmZpbml0eSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2Uoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RhcnRMYXN0U3RlcCgpIHtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MSU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuTFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkxTUFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5TUFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5MTU5ZXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuTU5ZKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSEFHRV0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLkFHRSk7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhDSFJdID0gdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5ISU5UXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSU5UKTtcclxuICAgICAgICB0aGlzLiNkYXRhW3RoaXMuVFlQRVMuSFNUUl0gPSB0aGlzLmdldCh0aGlzLlRZUEVTLlNUUik7XHJcbiAgICAgICAgdGhpcy4jZGF0YVt0aGlzLlRZUEVTLkhNTlldID0gdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpO1xyXG4gICAgICAgIHRoaXMuI2RhdGFbdGhpcy5UWVBFUy5IU1BSXSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1BSKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQocHJvcCkge1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmUodGhpcy4jZGF0YVtwcm9wXSk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RhdGFbcHJvcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXQodGhpcy5mYWxsYmFjayhwcm9wKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVU06XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIQUdFID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IQUdFKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhDSFIgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhDSFIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSElOVCA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSElOVCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBIU1RSID0gdGhpcy5nZXQodGhpcy5UWVBFUy5IU1RSKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IEhNTlkgPSB0aGlzLmdldCh0aGlzLlRZUEVTLkhNTlkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgSFNQUiA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuSFNQUik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihzdW0oSENIUiwgSElOVCwgSFNUUiwgSE1OWSwgSFNQUikqMiArIEhBR0UvMik7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldCgndGltZXMnKSB8fCAwO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuRVhUOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubHNnZXQoJ2V4dGVuZFRhbGVudCcpIHx8IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BVExUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQUVWVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sc2dldChwcm9wKSB8fCBbXTtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWxsYmFjayhwcm9wKVxyXG4gICAgICAgICAgICAgICAgKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmYWxsYmFjayhwcm9wKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxBR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IQUdFOiByZXR1cm4gdGhpcy5UWVBFUy5BR0U7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MQ0hSOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSENIUjogcmV0dXJuIHRoaXMuVFlQRVMuQ0hSO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTElOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhJTlQ6IHJldHVybiB0aGlzLlRZUEVTLklOVDtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxTVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5IU1RSOiByZXR1cm4gdGhpcy5UWVBFUy5TVFI7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MTU5ZOlxyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSE1OWTogcmV0dXJuIHRoaXMuVFlQRVMuTU5ZO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuTFNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkhTUFI6IHJldHVybiB0aGlzLlRZUEVTLlNQUjtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNUTFQ6IHJldHVybiB0aGlzLlRZUEVTLkFUTFQ7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DRVZUOiByZXR1cm4gdGhpcy5UWVBFUy5BRVZUO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuQ0FDSFY6IHJldHVybiB0aGlzLlRZUEVTLkFDSFY7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgc3dpdGNoKHByb3ApIHtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkFHRTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNIUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLklOVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNUUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLk1OWTpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlNQUjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkxJRjpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlRMVDpcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkVWVDpcclxuICAgICAgICAgICAgICAgIHRoaXMuaGwocHJvcCwgdGhpcy4jZGF0YVtwcm9wXSA9IGNsb25lKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjaGlldmUocHJvcCwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuVE1TOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3NldCgndGltZXMnLCBwYXJzZUludCh2YWx1ZSkgfHwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FWFQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxzc2V0KCdleHRlbmRUYWxlbnQnLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0UmVjb3JkKCkge1xyXG4gICAgICAgIHJldHVybiBjbG9uZSh7XHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLkFHRV06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuQUdFKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuQ0hSXTogdGhpcy5nZXQodGhpcy5UWVBFUy5DSFIpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5JTlRdOiB0aGlzLmdldCh0aGlzLlRZUEVTLklOVCksXHJcbiAgICAgICAgICAgIFt0aGlzLlRZUEVTLlNUUl06IHRoaXMuZ2V0KHRoaXMuVFlQRVMuU1RSKSxcclxuICAgICAgICAgICAgW3RoaXMuVFlQRVMuTU5ZXTogdGhpcy5nZXQodGhpcy5UWVBFUy5NTlkpLFxyXG4gICAgICAgICAgICBbdGhpcy5UWVBFUy5TUFJdOiB0aGlzLmdldCh0aGlzLlRZUEVTLlNQUiksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlKHByb3AsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IHYgb2YgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZShwcm9wLCBOdW1iZXIodikpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5DSFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5JTlQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5NTlk6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TUFI6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5MSUY6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhsKHByb3AsIHRoaXMuI2RhdGFbcHJvcF0gKz0gTnVtYmVyKHZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTFQ6XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5FVlQ6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jZGF0YVtwcm9wXTtcclxuICAgICAgICAgICAgICAgIGlmKHZhbHVlPDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHYuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXghPS0xKSB2LnNwbGljZShpbmRleCwxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCF2LmluY2x1ZGVzKHZhbHVlKSkgdi5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWNoaWV2ZShwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5UTVM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldChcclxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0KHByb3ApICsgcGFyc2VJbnQodmFsdWUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhvb2tTcGVjaWFsKHByb3ApIHtcclxuICAgICAgICBzd2l0Y2gocHJvcCkge1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuUkRNOiByZXR1cm4gbGlzdFJhbmRvbSh0aGlzLlNQRUNJQUwuUkRNKTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHByb3A7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVmZmVjdChlZmZlY3RzKSB7XHJcbiAgICAgICAgZm9yKGxldCBwcm9wIGluIGVmZmVjdHMpXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rU3BlY2lhbChwcm9wKSxcclxuICAgICAgICAgICAgICAgIE51bWJlcihlZmZlY3RzW3Byb3BdKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRW5kKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLlRZUEVTLkxJRikgPCAxO1xyXG4gICAgfVxyXG5cclxuICAgIGFnZU5leHQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2UodGhpcy5UWVBFUy5BR0UsIDEpO1xyXG4gICAgICAgIGNvbnN0IGFnZSA9IHRoaXMuZ2V0KHRoaXMuVFlQRVMuQUdFKTtcclxuICAgICAgICBjb25zdCB7ZXZlbnQsIHRhbGVudH0gPSB0aGlzLmdldEFnZURhdGEoYWdlKTtcclxuICAgICAgICByZXR1cm4ge2FnZSwgZXZlbnQsIHRhbGVudH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWdlRGF0YShhZ2UpIHtcclxuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy4jYWdlRGF0YVthZ2VdKTtcclxuICAgIH1cclxuXHJcbiAgICBobChwcm9wLCB2YWx1ZSkge1xyXG4gICAgICAgIGxldCBrZXlzO1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BR0U6IGtleXMgPSBbdGhpcy5UWVBFUy5MQUdFLCB0aGlzLlRZUEVTLkhBR0VdOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkNIUjoga2V5cyA9IFt0aGlzLlRZUEVTLkxDSFIsIHRoaXMuVFlQRVMuSENIUl07IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuSU5UOiBrZXlzID0gW3RoaXMuVFlQRVMuTElOVCwgdGhpcy5UWVBFUy5ISU5UXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5TVFI6IGtleXMgPSBbdGhpcy5UWVBFUy5MU1RSLCB0aGlzLlRZUEVTLkhTVFJdOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLk1OWToga2V5cyA9IFt0aGlzLlRZUEVTLkxNTlksIHRoaXMuVFlQRVMuSE1OWV07IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMuVFlQRVMuU1BSOiBrZXlzID0gW3RoaXMuVFlQRVMuTFNQUiwgdGhpcy5UWVBFUy5IU1BSXTsgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgW2wsIGhdID0ga2V5cztcclxuICAgICAgICB0aGlzLiNkYXRhW2xdID0gbWluKHRoaXMuI2RhdGFbbF0sIHZhbHVlKTtcclxuICAgICAgICB0aGlzLiNkYXRhW2hdID0gbWF4KHRoaXMuI2RhdGFbaF0sIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBhY2hpZXZlKHByb3AsIG5ld0RhdGEpIHtcclxuICAgICAgICBsZXQga2V5O1xyXG4gICAgICAgIHN3aXRjaChwcm9wKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5UWVBFUy5BQ0hWOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdERhdGEgPSB0aGlzLmxzZ2V0KHByb3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sc3NldChcclxuICAgICAgICAgICAgICAgICAgICBwcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgIChsYXN0RGF0YSB8fCBbXSkuY29uY2F0KFtbbmV3RGF0YSwgRGF0ZS5ub3coKV1dKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLlRMVDoga2V5ID0gdGhpcy5UWVBFUy5BVExUOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSB0aGlzLlRZUEVTLkVWVDoga2V5ID0gdGhpcy5UWVBFUy5BRVZUOyBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsYXN0RGF0YSA9IHRoaXMubHNnZXQoa2V5KSB8fCBbXTtcclxuICAgICAgICB0aGlzLmxzc2V0KFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIEFycmF5LmZyb20oXHJcbiAgICAgICAgICAgICAgICBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgICAgICAgIGxhc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQobmV3RGF0YXx8W10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0KClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBsc2dldChrZXkpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZihkYXRhID09PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgbHNzZXQoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb3BlcnR5OyIsImZ1bmN0aW9uIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbikge1xyXG5cclxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXTtcclxuICAgIGNvbnN0IGxlbmd0aCA9IGNvbmRpdGlvbi5sZW5ndGg7XHJcbiAgICBjb25zdCBzdGFjayA9IFtdO1xyXG4gICAgc3RhY2sudW5zaGlmdChjb25kaXRpb25zKTtcclxuICAgIGxldCBjdXJzb3IgPSAwO1xyXG4gICAgY29uc3QgY2F0Y2hTdHJpbmcgPSBpID0+IHtcclxuICAgICAgICBjb25zdCBzdHIgPSBjb25kaXRpb24uc3Vic3RyaW5nKGN1cnNvciwgaSkudHJpbSgpO1xyXG4gICAgICAgIGN1cnNvciA9IGk7XHJcbiAgICAgICAgaWYoc3RyKSBzdGFja1swXS5wdXNoKHN0cik7XHJcbiAgICB9O1xyXG5cclxuICAgIGZvcihsZXQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgc3dpdGNoKGNvbmRpdGlvbltpXSkge1xyXG4gICAgICAgICAgICBjYXNlICcgJzogY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjYXNlICcoJzpcclxuICAgICAgICAgICAgICAgIGNhdGNoU3RyaW5nKGkpO1xyXG4gICAgICAgICAgICAgICAgY3Vyc29yICsrO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViID0gW107XHJcbiAgICAgICAgICAgICAgICBzdGFja1swXS5wdXNoKHN1Yik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay51bnNoaWZ0KHN1Yik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJyknOlxyXG4gICAgICAgICAgICAgICAgY2F0Y2hTdHJpbmcoaSk7XHJcbiAgICAgICAgICAgICAgICBjdXJzb3IgKys7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgICAgY2FzZSAnJic6XHJcbiAgICAgICAgICAgICAgICBjYXRjaFN0cmluZyhpKTtcclxuICAgICAgICAgICAgICAgIGNhdGNoU3RyaW5nKGkrMSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNhdGNoU3RyaW5nKGxlbmd0aCk7XHJcblxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pIHtcclxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pO1xyXG4gICAgcmV0dXJuIGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9ucyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9ucykge1xyXG4gICAgaWYoIUFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHJldHVybiBjaGVja1Byb3AocHJvcGVydHksIGNvbmRpdGlvbnMpO1xyXG4gICAgaWYoY29uZGl0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICBpZihjb25kaXRpb25zLmxlbmd0aCA9PSAxKSByZXR1cm4gY2hlY2tQYXJzZWRDb25kaXRpb25zKHByb3BlcnR5LCBjb25kaXRpb25zWzBdKTtcclxuXHJcbiAgICBsZXQgcmV0ID0gY2hlY2tQYXJzZWRDb25kaXRpb25zKHByb3BlcnR5LCBjb25kaXRpb25zWzBdKTtcclxuICAgIGZvcihsZXQgaT0xOyBpPGNvbmRpdGlvbnMubGVuZ3RoOyBpKz0yKSB7XHJcbiAgICAgICAgc3dpdGNoKGNvbmRpdGlvbnNbaV0pIHtcclxuICAgICAgICAgICAgY2FzZSAnJic6XHJcbiAgICAgICAgICAgICAgICBpZihyZXQpIHJldCA9IGNoZWNrUGFyc2VkQ29uZGl0aW9ucyhwcm9wZXJ0eSwgY29uZGl0aW9uc1tpKzFdKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd8JzpcclxuICAgICAgICAgICAgICAgIGlmKHJldCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXQgPSBjaGVja1BhcnNlZENvbmRpdGlvbnMocHJvcGVydHksIGNvbmRpdGlvbnNbaSsxXSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrUHJvcChwcm9wZXJ0eSwgY29uZGl0aW9uKSB7XHJcblxyXG4gICAgY29uc3QgbGVuZ3RoID0gY29uZGl0aW9uLmxlbmd0aDtcclxuICAgIGxldCBpID0gY29uZGl0aW9uLnNlYXJjaCgvWz48XFwhXFw/PV0vKTtcclxuXHJcbiAgICBjb25zdCBwcm9wID0gY29uZGl0aW9uLnN1YnN0cmluZygwLGkpO1xyXG4gICAgY29uc3Qgc3ltYm9sID0gY29uZGl0aW9uLnN1YnN0cmluZyhpLCBpKz0oY29uZGl0aW9uW2krMV09PSc9Jz8yOjEpKTtcclxuICAgIGNvbnN0IGQgPSBjb25kaXRpb24uc3Vic3RyaW5nKGksIGxlbmd0aCk7XHJcblxyXG4gICAgY29uc3QgcHJvcERhdGEgPSBwcm9wZXJ0eS5nZXQocHJvcCk7XHJcbiAgICBjb25zdCBjb25kaXRpb25EYXRhID0gZFswXT09J1snPyBKU09OLnBhcnNlKGQpOiBOdW1iZXIoZCk7XHJcblxyXG4gICAgc3dpdGNoKHN5bWJvbCkge1xyXG4gICAgICAgIGNhc2UgJz4nOiAgcmV0dXJuIHByb3BEYXRhID4gIGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPCc6ICByZXR1cm4gcHJvcERhdGEgPCAgY29uZGl0aW9uRGF0YTtcclxuICAgICAgICBjYXNlICc+PSc6IHJldHVybiBwcm9wRGF0YSA+PSBjb25kaXRpb25EYXRhO1xyXG4gICAgICAgIGNhc2UgJzw9JzogcmV0dXJuIHByb3BEYXRhIDw9IGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPSc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEYXRhLmluY2x1ZGVzKGNvbmRpdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gcHJvcERhdGEgPT0gY29uZGl0aW9uRGF0YTtcclxuICAgICAgICBjYXNlICchPSc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFwcm9wRGF0YS5pbmNsdWRlcyhjb25kaXRpb25EYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3BEYXRhID09IGNvbmRpdGlvbkRhdGE7XHJcbiAgICAgICAgY2FzZSAnPyc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgcCBvZiBwcm9wRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICBpZihjb25kaXRpb25EYXRhLmluY2x1ZGVzKHApKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRGF0YS5pbmNsdWRlcyhwcm9wRGF0YSk7XHJcbiAgICAgICAgY2FzZSAnISc6XHJcbiAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvcERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IoY29uc3QgcCBvZiBwcm9wRGF0YSlcclxuICAgICAgICAgICAgICAgICAgICBpZihjb25kaXRpb25EYXRhLmluY2x1ZGVzKHApKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gIWNvbmRpdGlvbkRhdGEuaW5jbHVkZXMocHJvcERhdGEpO1xyXG5cclxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RNYXhUcmlnZ2Vycyhjb25kaXRpb24pIHtcclxuICAgIC8vIEFzc3VtaW5nIG9ubHkgYWdlIHJlbGF0ZWQgdGFsZW50cyBjYW4gYmUgdHJpZ2dlcmVkIG11bHRpcGxlIHRpbWVzLlxyXG4gICAgY29uc3QgUkVfQUdFX0NPTkRJVElPTiA9IC9BR0VcXD9cXFsoWzAtOVxcLF0rKVxcXS87XHJcbiAgICBjb25zdCBtYXRjaF9vYmplY3QgPSBSRV9BR0VfQ09ORElUSU9OLmV4ZWMoY29uZGl0aW9uKTtcclxuICAgIGlmIChtYXRjaF9vYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICAgIC8vIE5vdCBhZ2UgcmVsYXRlZCwgc2luZ2xlIHRyaWdnZXIuXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IGFnZV9saXN0ID0gbWF0Y2hfb2JqZWN0WzFdLnNwbGl0KFwiLFwiKTtcclxuICAgIHJldHVybiBhZ2VfbGlzdC5sZW5ndGg7XHJcbn1cclxuXHJcbmV4cG9ydCB7IGNoZWNrQ29uZGl0aW9uLCBleHRyYWN0TWF4VHJpZ2dlcnMgfTsiLCJpbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnO1xuaW1wb3J0IHsgY2hlY2tDb25kaXRpb24gfSBmcm9tICcuL2Z1bmN0aW9ucy9jb25kaXRpb24uanMnO1xuXG5jbGFzcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgI2V2ZW50cztcblxuICAgIGluaXRpYWwoe2V2ZW50c30pIHtcbiAgICAgICAgdGhpcy4jZXZlbnRzID0gZXZlbnRzO1xuICAgICAgICBmb3IoY29uc3QgaWQgaW4gZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpZF07XG4gICAgICAgICAgICBpZighZXZlbnQuYnJhbmNoKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV2ZW50LmJyYW5jaCA9IGV2ZW50LmJyYW5jaC5tYXAoYj0+e1xuICAgICAgICAgICAgICAgIGIgPSBiLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgYlsxXSA9IE51bWJlcihiWzFdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY291bnQoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLiNldmVudHMpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjaGVjayhldmVudElkLCBwcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCB7IGluY2x1ZGUsIGV4Y2x1ZGUsIE5vUmFuZG9tIH0gPSB0aGlzLmdldChldmVudElkKTtcbiAgICAgICAgaWYoTm9SYW5kb20pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYoZXhjbHVkZSAmJiBjaGVja0NvbmRpdGlvbihwcm9wZXJ0eSwgZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYoaW5jbHVkZSkgcmV0dXJuIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBpbmNsdWRlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0KGV2ZW50SWQpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLiNldmVudHNbZXZlbnRJZF07XG4gICAgICAgIGlmKCFldmVudCkgdGhyb3cgbmV3IEVycm9yKGBbRVJST1JdIE5vIEV2ZW50WyR7ZXZlbnRJZH1dYCk7XG4gICAgICAgIHJldHVybiBjbG9uZShldmVudCk7XG4gICAgfVxuXG4gICAgaW5mb3JtYXRpb24oZXZlbnRJZCkge1xuICAgICAgICBjb25zdCB7IGV2ZW50OiBkZXNjcmlwdGlvbiB9ID0gdGhpcy5nZXQoZXZlbnRJZClcbiAgICAgICAgcmV0dXJuIHsgZGVzY3JpcHRpb24gfTtcbiAgICB9XG5cbiAgICBkbyhldmVudElkLCBwcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCB7IGVmZmVjdCwgYnJhbmNoLCBldmVudDogZGVzY3JpcHRpb24sIHBvc3RFdmVudCB9ID0gdGhpcy5nZXQoZXZlbnRJZCk7XG4gICAgICAgIGlmKGJyYW5jaClcbiAgICAgICAgICAgIGZvcihjb25zdCBbY29uZCwgbmV4dF0gb2YgYnJhbmNoKVxuICAgICAgICAgICAgICAgIGlmKGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWZmZWN0LCBuZXh0LCBkZXNjcmlwdGlvbiB9O1xuICAgICAgICByZXR1cm4geyBlZmZlY3QsIHBvc3RFdmVudCwgZGVzY3JpcHRpb24gfTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnQ7IiwiaW1wb3J0IHsgY2xvbmUsIHdlaWdodFJhbmRvbSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnO1xyXG5pbXBvcnQgeyBjaGVja0NvbmRpdGlvbiwgZXh0cmFjdE1heFRyaWdnZXJzIH0gZnJvbSAnLi9mdW5jdGlvbnMvY29uZGl0aW9uLmpzJztcclxuaW1wb3J0IHsgZ2V0UmF0ZSB9IGZyb20gJy4vZnVuY3Rpb25zL2FkZGl0aW9uLmpzJztcclxuXHJcbmNsYXNzIFRhbGVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgI3RhbGVudHM7XHJcblxyXG4gICAgaW5pdGlhbCh7dGFsZW50c30pIHtcclxuICAgICAgICB0aGlzLiN0YWxlbnRzID0gdGFsZW50cztcclxuICAgICAgICBmb3IoY29uc3QgaWQgaW4gdGFsZW50cykge1xyXG4gICAgICAgICAgICBjb25zdCB0YWxlbnQgPSB0YWxlbnRzW2lkXTtcclxuICAgICAgICAgICAgdGFsZW50LmlkPSBOdW1iZXIoaWQpO1xyXG4gICAgICAgICAgICB0YWxlbnQuZ3JhZGUgPSBOdW1iZXIodGFsZW50LmdyYWRlKTtcclxuICAgICAgICAgICAgdGFsZW50Lm1heF90cmlnZ2VycyA9IGV4dHJhY3RNYXhUcmlnZ2Vycyh0YWxlbnQuY29uZGl0aW9uKTtcclxuICAgICAgICAgICAgaWYodGFsZW50LnJlcGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGtleSBpbiB0YWxlbnQucmVwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHZhbHVlIG9mIHRhbGVudC5yZXBsYWNlbWVudFtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYCR7dmFsdWV9YC5zcGxpdCgnKicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbdmFsdWVbMF18fDBdID0gTnVtYmVyKHZhbHVlWzFdKSB8fCAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0YWxlbnQucmVwbGFjZW1lbnRba2V5XSA9IG9iajtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3VudCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy4jdGFsZW50cykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrKHRhbGVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGNvbnN0IHsgY29uZGl0aW9uIH0gPSB0aGlzLmdldCh0YWxlbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCh0YWxlbnRJZCkge1xyXG4gICAgICAgIGNvbnN0IHRhbGVudCA9IHRoaXMuI3RhbGVudHNbdGFsZW50SWRdO1xyXG4gICAgICAgIGlmKCF0YWxlbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBUYWxlbnRbJHt0YWxlbnRJZH1dYCk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lKHRhbGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5mb3JtYXRpb24odGFsZW50SWQpIHtcclxuICAgICAgICBjb25zdCB7IGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9ID0gdGhpcy5nZXQodGFsZW50SWQpXHJcbiAgICAgICAgcmV0dXJuIHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhjbHVzaXZlKHRhbGVuZHMsIGV4Y2x1c2l2ZUlkKSB7XHJcbiAgICAgICAgY29uc3QgeyBleGNsdXNpdmUgfSA9IHRoaXMuZ2V0KGV4Y2x1c2l2ZUlkKTtcclxuICAgICAgICBpZighZXhjbHVzaXZlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBmb3IoY29uc3QgdGFsZW50IG9mIHRhbGVuZHMpIHtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IGUgb2YgZXhjbHVzaXZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZih0YWxlbnQgPT0gZSkgcmV0dXJuIHRhbGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0YWxlbnRSYW5kb20oaW5jbHVkZSwge3RpbWVzID0gMCwgYWNoaWV2ZW1lbnQgPSAwfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgcmF0ZSA9IHsgMToxMDAsIDI6MTAsIDM6MSwgfTtcclxuICAgICAgICBjb25zdCByYXRlQWRkaXRpb24gPSB7IDE6MSwgMjoxLCAzOjEsIH07XHJcbiAgICAgICAgY29uc3QgdGltZXNSYXRlID0gZ2V0UmF0ZSgndGltZXMnLCB0aW1lcyk7XHJcbiAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnRSYXRlID0gZ2V0UmF0ZSgnYWNoaWV2ZW1lbnQnLCBhY2hpZXZlbWVudCk7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiB0aW1lc1JhdGUpXHJcbiAgICAgICAgICAgIHJhdGVBZGRpdGlvbltncmFkZV0gKz0gdGltZXNSYXRlW2dyYWRlXSAtIDE7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiBhY2hpZXZlbWVudFJhdGUpXHJcbiAgICAgICAgICAgIHJhdGVBZGRpdGlvbltncmFkZV0gKz0gYWNoaWV2ZW1lbnRSYXRlW2dyYWRlXSAtIDE7XHJcblxyXG4gICAgICAgIGZvcihjb25zdCBncmFkZSBpbiByYXRlQWRkaXRpb24pXHJcbiAgICAgICAgICAgIHJhdGVbZ3JhZGVdICo9IHJhdGVBZGRpdGlvbltncmFkZV07XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmRvbUdyYWRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmFuZG9tTnVtYmVyID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCk7XHJcbiAgICAgICAgICAgIGlmKChyYW5kb21OdW1iZXIgLT0gcmF0ZVszXSkgPCAwKSByZXR1cm4gMztcclxuICAgICAgICAgICAgaWYoKHJhbmRvbU51bWJlciAtPSByYXRlWzJdKSA8IDApIHJldHVybiAyO1xyXG4gICAgICAgICAgICBpZigocmFuZG9tTnVtYmVyIC09IHJhdGVbMV0pIDwgMCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gMTAwMCwgMTAwLCAxMCwgMVxyXG4gICAgICAgIGNvbnN0IHRhbGVudExpc3QgPSB7fTtcclxuICAgICAgICBmb3IoY29uc3QgdGFsZW50SWQgaW4gdGhpcy4jdGFsZW50cykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGlkLCBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24gfSA9IHRoaXMuI3RhbGVudHNbdGFsZW50SWRdO1xyXG4gICAgICAgICAgICBpZihpZCA9PSBpbmNsdWRlKSB7XHJcbiAgICAgICAgICAgICAgICBpbmNsdWRlID0geyBncmFkZSwgbmFtZSwgZGVzY3JpcHRpb24sIGlkIH07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighdGFsZW50TGlzdFtncmFkZV0pIHRhbGVudExpc3RbZ3JhZGVdID0gW3sgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uLCBpZCB9XTtcclxuICAgICAgICAgICAgZWxzZSB0YWxlbnRMaXN0W2dyYWRlXS5wdXNoKHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uLCBpZCB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgQXJyYXkoMTApXHJcbiAgICAgICAgICAgIC5maWxsKDEpLm1hcCgodiwgaSk9PntcclxuICAgICAgICAgICAgICAgIGlmKCFpICYmIGluY2x1ZGUpIHJldHVybiBpbmNsdWRlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdyYWRlID0gcmFuZG9tR3JhZGUoKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlKHRhbGVudExpc3RbZ3JhZGVdLmxlbmd0aCA9PSAwKSBncmFkZS0tO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGFsZW50TGlzdFtncmFkZV0ubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZW5ndGgpICUgbGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhbGVudExpc3RbZ3JhZGVdLnNwbGljZShyYW5kb20sMSlbMF07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnRzKSB7XHJcbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheSh0YWxlbnRzKSkge1xyXG4gICAgICAgICAgICBsZXQgYWRkaXRpb24gPSAwO1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgdGFsZW50IG9mIHRhbGVudHMpXHJcbiAgICAgICAgICAgICAgICBhZGRpdGlvbiArPSB0aGlzLmFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWRkaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXQodGFsZW50cykuc3RhdHVzKSB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIGRvKHRhbGVudElkLCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIGNvbnN0IHsgZWZmZWN0LCBjb25kaXRpb24sIGdyYWRlLCBuYW1lLCBkZXNjcmlwdGlvbiB9ID0gdGhpcy5nZXQodGFsZW50SWQpO1xyXG4gICAgICAgIGlmKGNvbmRpdGlvbiAmJiAhY2hlY2tDb25kaXRpb24ocHJvcGVydHksIGNvbmRpdGlvbikpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB7IGVmZmVjdCwgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVwbGFjZSh0YWxlbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZ2V0UmVwbGFjZUxpc3QgPSAodGFsZW50LCB0YWxlbnRzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcmVwbGFjZW1lbnQgfSA9IHRoaXMuZ2V0KHRhbGVudCk7XHJcbiAgICAgICAgICAgIGlmKCFyZXBsYWNlbWVudCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBbXTtcclxuICAgICAgICAgICAgaWYocmVwbGFjZW1lbnQuZ3JhZGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yRWFjaCgoe2lkLCBncmFkZX0pPT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXJlcGxhY2VtZW50LmdyYWRlW2dyYWRlXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZXhjbHVzaXZlKHRhbGVudHMsIGlkKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaChbaWQsIHJlcGxhY2VtZW50LmdyYWRlW2dyYWRlXV0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihyZXBsYWNlbWVudC50YWxlbnQpIHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaWQgaW4gcmVwbGFjZW1lbnQudGFsZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBOdW1iZXIoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZXhjbHVzaXZlKHRhbGVudHMsIGlkKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKFtpZCwgcmVwbGFjZW1lbnQudGFsZW50W2lkXV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVwbGFjZSA9ICh0YWxlbnQsIHRhbGVudHMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZUxpc3QgPSBnZXRSZXBsYWNlTGlzdCh0YWxlbnQsIHRhbGVudHMpO1xyXG4gICAgICAgICAgICBpZighcmVwbGFjZUxpc3QpIHJldHVybiB0YWxlbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmQgPSB3ZWlnaHRSYW5kb20ocmVwbGFjZUxpc3QpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZShcclxuICAgICAgICAgICAgICAgIHJhbmQsIHRhbGVudHMuY29uY2F0KHJhbmQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdUYWxlbnRzID0gY2xvbmUodGFsZW50cyk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgZm9yKGNvbnN0IHRhbGVudCBvZiB0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VJZCA9IHJlcGxhY2UodGFsZW50LCBuZXdUYWxlbnRzKTtcclxuICAgICAgICAgICAgaWYocmVwbGFjZUlkICE9IHRhbGVudCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3RhbGVudF0gPSByZXBsYWNlSWQ7XHJcbiAgICAgICAgICAgICAgICBuZXdUYWxlbnRzLnB1c2gocmVwbGFjZUlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGZvckVhY2goY2FsbGJhY2spIHtcclxuICAgICAgICBpZih0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xyXG4gICAgICAgIGZvcihjb25zdCBpZCBpbiB0aGlzLiN0YWxlbnRzKVxyXG4gICAgICAgICAgICBjYWxsYmFjayhjbG9uZSh0aGlzLiN0YWxlbnRzW2lkXSksIGlkKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhbGVudDsiLCJpbXBvcnQgeyBjbG9uZSB9IGZyb20gJy4vZnVuY3Rpb25zL3V0aWwuanMnO1xyXG5pbXBvcnQgeyBjaGVja0NvbmRpdGlvbiB9IGZyb20gJy4vZnVuY3Rpb25zL2NvbmRpdGlvbi5qcyc7XHJcblxyXG5jbGFzcyBBY2hpZXZlbWVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLy8g5pe25py6XHJcbiAgICBPcHBvcnR1bml0eSA9IHtcclxuICAgICAgICBTVEFSVDogXCJTVEFSVFwiLCAgICAgICAgICAgICAvLyDliIbphY3lrozmiJDngrnmlbDvvIzngrnlh7vlvIDlp4vmlrDkurrnlJ/lkI5cclxuICAgICAgICBUUkFKRUNUT1JZOiBcIlRSQUpFQ1RPUllcIiwgICAvLyDmr4/kuIDlubTnmoTkurrnlJ/nu4/ljobkuK1cclxuICAgICAgICBTVU1NQVJZOiBcIlNVTU1BUllcIiwgICAgICAgICAvLyDkurrnlJ/nu5PmnZ/vvIzngrnlh7vkurrnlJ/mgLvnu5PlkI5cclxuICAgICAgICBFTkQ6IFwiRU5EXCIsICAgICAgICAgICAgICAgICAvLyDmuLjmiI/lrozmiJDvvIzngrnlh7vph43lvIAg6YeN5byA5qyh5pWw5Zyo6L+Z5LmL5ZCO5omN5LyaKzFcclxuICAgIH07XHJcblxyXG4gICAgI2FjaGlldmVtZW50cztcclxuXHJcbiAgICBpbml0aWFsKHthY2hpZXZlbWVudHN9KSB7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnRzID0gYWNoaWV2ZW1lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvdW50KCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLiNhY2hpZXZlbWVudHMpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0KHByb3BlcnR5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFxyXG4gICAgICAgICAgICAudmFsdWVzKHRoaXMuI2FjaGlldmVtZW50cylcclxuICAgICAgICAgICAgLm1hcCgoe1xyXG4gICAgICAgICAgICAgICAgaWQsIG5hbWUsIG9wcG9ydHVuaXR5LFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGhpZGUsIGdyYWRlLFxyXG4gICAgICAgICAgICB9KT0+KHtcclxuICAgICAgICAgICAgICAgIGlkLCBuYW1lLCBvcHBvcnR1bml0eSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBoaWRlLCBncmFkZSxcclxuICAgICAgICAgICAgICAgIGlzQWNoaWV2ZWQ6IHRoaXMuaXNBY2hpZXZlZChpZCwgcHJvcGVydHkpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGFjaGlldmVtZW50SWQpIHtcclxuICAgICAgICBjb25zdCBhY2hpZXZlbWVudCA9IHRoaXMuI2FjaGlldmVtZW50c1thY2hpZXZlbWVudElkXTtcclxuICAgICAgICBpZighYWNoaWV2ZW1lbnQpIHRocm93IG5ldyBFcnJvcihgW0VSUk9SXSBObyBBY2hpZXZlbWVudFske2FjaGlldmVtZW50SWR9XWApO1xyXG4gICAgICAgIHJldHVybiBjbG9uZShhY2hpZXZlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2soYWNoaWV2ZW1lbnRJZCwgcHJvcGVydHkpIHtcclxuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiB9ID0gdGhpcy5nZXQoYWNoaWV2ZW1lbnRJZCk7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29uZGl0aW9uKHByb3BlcnR5LCBjb25kaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQWNoaWV2ZWQoYWNoaWV2ZW1lbnRJZCwgcHJvcGVydHkpIHtcclxuICAgICAgICBmb3IoY29uc3QgW2FjaGlldmVkXSBvZiAocHJvcGVydHkuZ2V0KHByb3BlcnR5LlRZUEVTLkFDSFYpfHxbXSkpXHJcbiAgICAgICAgICAgIGlmKGFjaGlldmVkID09IGFjaGlldmVtZW50SWQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhY2hpZXZlKG9wcG9ydHVuaXR5LCBwcm9wZXJ0eSkge1xyXG4gICAgICAgIHRoaXMubGlzdChwcm9wZXJ0eSlcclxuICAgICAgICAgICAgLmZpbHRlcigoe2lzQWNoaWV2ZWR9KT0+IWlzQWNoaWV2ZWQpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHtvcHBvcnR1bml0eTogb30pPT5vPT1vcHBvcnR1bml0eSlcclxuICAgICAgICAgICAgLmZpbHRlcigoe2lkfSk9PnRoaXMuY2hlY2soaWQsIHByb3BlcnR5KSlcclxuICAgICAgICAgICAgLmZvckVhY2goKHtpZH0pPT57XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5hY2hpZXZlKHByb3BlcnR5LlRZUEVTLkFDSFYsIGlkKVxyXG4gICAgICAgICAgICAgICAgJCRldmVudCgnYWNoaWV2ZW1lbnQnLCB0aGlzLmdldChpZCkpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY2hpZXZlbWVudDsiLCJpbXBvcnQgeyB3ZWlnaHRSYW5kb20gfSBmcm9tICcuL2Z1bmN0aW9ucy91dGlsLmpzJ1xyXG5pbXBvcnQgUHJvcGVydHkgZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XHJcbmltcG9ydCBFdmVudCBmcm9tICcuL2V2ZW50LmpzJztcclxuaW1wb3J0IFRhbGVudCBmcm9tICcuL3RhbGVudC5qcyc7XHJcbmltcG9ydCBBY2hpZXZlbWVudCBmcm9tICcuL2FjaGlldmVtZW50LmpzJztcclxuXHJcbmNsYXNzIExpZmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHkgPSBuZXcgUHJvcGVydHkoKTtcclxuICAgICAgICB0aGlzLiNldmVudCA9IG5ldyBFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuI3RhbGVudCA9IG5ldyBUYWxlbnQoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudCA9IG5ldyBBY2hpZXZlbWVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgICNwcm9wZXJ0eTtcclxuICAgICNldmVudDtcclxuICAgICN0YWxlbnQ7XHJcbiAgICAjYWNoaWV2ZW1lbnQ7XHJcbiAgICAjdHJpZ2dlclRhbGVudHM7XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbCgpIHtcclxuICAgICAgICBjb25zdCBbYWdlLCB0YWxlbnRzLCBldmVudHMsIGFjaGlldmVtZW50c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICBqc29uKCdhZ2UnKSxcclxuICAgICAgICAgIGpzb24oJ3RhbGVudHMnKSxcclxuICAgICAgICAgIGpzb24oJ2V2ZW50cycpLFxyXG4gICAgICAgICAganNvbignYWNoaWV2ZW1lbnQnKSxcclxuICAgICAgICBdKVxyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5LmluaXRpYWwoe2FnZX0pO1xyXG4gICAgICAgIHRoaXMuI3RhbGVudC5pbml0aWFsKHt0YWxlbnRzfSk7XHJcbiAgICAgICAgdGhpcy4jZXZlbnQuaW5pdGlhbCh7ZXZlbnRzfSk7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuaW5pdGlhbCh7YWNoaWV2ZW1lbnRzfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdGFydChhbGxvY2F0aW9uKSB7XHJcbiAgICAgICAgdGhpcy4jdHJpZ2dlclRhbGVudHMgPSB7fTtcclxuICAgICAgICBjb25zdCBjb250ZW50cyA9IHRoaXMudGFsZW50UmVwbGFjZShhbGxvY2F0aW9uLlRMVCk7XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHkucmVzdGFydChhbGxvY2F0aW9uKTtcclxuICAgICAgICB0aGlzLmRvVGFsZW50KClcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5yZXN0YXJ0TGFzdFN0ZXAoKTtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5TVEFSVCxcclxuICAgICAgICAgICAgdGhpcy4jcHJvcGVydHlcclxuICAgICAgICApXHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRhbGVudEFsbG9jYXRpb25BZGRpdGlvbih0YWxlbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhbGVudC5hbGxvY2F0aW9uQWRkaXRpb24odGFsZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFsZW50Q3VycmVudFRyaWdnZXJDb3VudCh0YWxlbnRJZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyVGFsZW50c1t0YWxlbnRJZF0gfHwgMDtcclxuICAgIH1cclxuXHJcbiAgICBuZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IHthZ2UsIGV2ZW50LCB0YWxlbnR9ID0gdGhpcy4jcHJvcGVydHkuYWdlTmV4dCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0YWxlbnRDb250ZW50ID0gdGhpcy5kb1RhbGVudCh0YWxlbnQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IHRoaXMuZG9FdmVudCh0aGlzLnJhbmRvbShldmVudCkpO1xyXG5cclxuICAgICAgICBjb25zdCBpc0VuZCA9IHRoaXMuI3Byb3BlcnR5LmlzRW5kKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBbdGFsZW50Q29udGVudCwgZXZlbnRDb250ZW50XS5mbGF0KCk7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuYWNoaWV2ZShcclxuICAgICAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuT3Bwb3J0dW5pdHkuVFJBSkVDVE9SWSxcclxuICAgICAgICAgICAgdGhpcy4jcHJvcGVydHlcclxuICAgICAgICApXHJcbiAgICAgICAgcmV0dXJuIHsgYWdlLCBjb250ZW50LCBpc0VuZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRhbGVudFJlcGxhY2UodGFsZW50cykge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3RhbGVudC5yZXBsYWNlKHRhbGVudHMpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gW107XHJcbiAgICAgICAgZm9yKGNvbnN0IGlkIGluIHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0YWxlbnRzLnB1c2gocmVzdWx0W2lkXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuI3RhbGVudC5nZXQoaWQpO1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiN0YWxlbnQuZ2V0KHJlc3VsdFtpZF0pO1xyXG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0YWxlbnRSZXBsYWNlJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZSwgdGFyZ2V0XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9UYWxlbnQodGFsZW50cykge1xyXG4gICAgICAgIGlmKHRhbGVudHMpIHRoaXMuI3Byb3BlcnR5LmNoYW5nZSh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTFQsIHRhbGVudHMpO1xyXG4gICAgICAgIHRhbGVudHMgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuVExUKVxyXG4gICAgICAgICAgICAuZmlsdGVyKHRhbGVudElkID0+IHRoaXMuZ2V0VGFsZW50Q3VycmVudFRyaWdnZXJDb3VudCh0YWxlbnRJZCkgPCB0aGlzLiN0YWxlbnQuZ2V0KHRhbGVudElkKS5tYXhfdHJpZ2dlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50cyA9IFtdO1xyXG4gICAgICAgIGZvcihjb25zdCB0YWxlbnRJZCBvZiB0YWxlbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI3RhbGVudC5kbyh0YWxlbnRJZCwgdGhpcy4jcHJvcGVydHkpO1xyXG4gICAgICAgICAgICBpZighcmVzdWx0KSBjb250aW51ZTtcclxuICAgICAgICAgICAgdGhpcy4jdHJpZ2dlclRhbGVudHNbdGFsZW50SWRdID0gdGhpcy5nZXRUYWxlbnRDdXJyZW50VHJpZ2dlckNvdW50KHRhbGVudElkKSArIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZWZmZWN0LCBuYW1lLCBkZXNjcmlwdGlvbiwgZ3JhZGUgfSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgY29udGVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTFQsXHJcbiAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYoIWVmZmVjdCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHRoaXMuI3Byb3BlcnR5LmVmZmVjdChlZmZlY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9FdmVudChldmVudElkKSB7XHJcbiAgICAgICAgY29uc3QgeyBlZmZlY3QsIG5leHQsIGRlc2NyaXB0aW9uLCBwb3N0RXZlbnQgfSA9IHRoaXMuI2V2ZW50LmRvKGV2ZW50SWQsIHRoaXMuI3Byb3BlcnR5KTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5jaGFuZ2UodGhpcy4jcHJvcGVydHkuVFlQRVMuRVZULCBldmVudElkKTtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5lZmZlY3QoZWZmZWN0KTtcclxuICAgICAgICBjb25zdCBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLiNwcm9wZXJ0eS5UWVBFUy5FVlQsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBwb3N0RXZlbnQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG5leHQpIHJldHVybiBbY29udGVudCwgdGhpcy5kb0V2ZW50KG5leHQpXS5mbGF0KCk7XHJcbiAgICAgICAgcmV0dXJuIFtjb250ZW50XTtcclxuICAgIH1cclxuXHJcbiAgICByYW5kb20oZXZlbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIHdlaWdodFJhbmRvbShcclxuICAgICAgICAgICAgZXZlbnRzLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChbZXZlbnRJZF0pPT50aGlzLiNldmVudC5jaGVjayhldmVudElkLCB0aGlzLiNwcm9wZXJ0eSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGFsZW50UmFuZG9tKCkge1xyXG4gICAgICAgIGNvbnN0IHRpbWVzID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLlRNUyk7XHJcbiAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnQgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuQ0FDSFYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLiN0YWxlbnQudGFsZW50UmFuZG9tKHRoaXMuZ2V0TGFzdEV4dGVuZFRhbGVudCgpLCB7IHRpbWVzLCBhY2hpZXZlbWVudCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0YWxlbnRFeHRlbmQodGFsZW50SWQpIHtcclxuICAgICAgICB0aGlzLiNwcm9wZXJ0eS5zZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuRVhULCB0YWxlbnRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGFzdEV4dGVuZFRhbGVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkVYVCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3VtbWFyeSgpIHtcclxuICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5hY2hpZXZlKFxyXG4gICAgICAgICAgICB0aGlzLiNhY2hpZXZlbWVudC5PcHBvcnR1bml0eS5TVU1NQVJZLFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBBR0U6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5IQUdFKSxcclxuICAgICAgICAgICAgQ0hSOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSENIUiksXHJcbiAgICAgICAgICAgIElOVDogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhJTlQpLFxyXG4gICAgICAgICAgICBTVFI6IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5IU1RSKSxcclxuICAgICAgICAgICAgTU5ZOiB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuSE1OWSksXHJcbiAgICAgICAgICAgIFNQUjogdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkhTUFIpLFxyXG4gICAgICAgICAgICBTVU06IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5TVU0pLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TGFzdFJlY29yZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcGVydHkuZ2V0TGFzdFJlY29yZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4Y2x1c2l2ZSh0YWxlbnRzLCBleGNsdXNpdmUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jdGFsZW50LmV4Y2x1c2l2ZSh0YWxlbnRzLCBleGNsdXNpdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFjaGlldmVtZW50cygpIHtcclxuICAgICAgICBjb25zdCB0aWNrcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuI3Byb3BlcnR5XHJcbiAgICAgICAgICAgIC5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuQUNIVilcclxuICAgICAgICAgICAgLmZvckVhY2goKFtpZCwgdGlja10pID0+IHRpY2tzW2lkXSA9IHRpY2spO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC4jYWNoaWV2ZW1lbnRcclxuICAgICAgICAgICAgLmxpc3QodGhpcy4jcHJvcGVydHkpXHJcbiAgICAgICAgICAgIC5zb3J0KChcclxuICAgICAgICAgICAgICAgIHtpZDogYSwgZ3JhZGU6IGFnLCBoaWRlOiBhaH0sXHJcbiAgICAgICAgICAgICAgICB7aWQ6IGIsIGdyYWRlOiBiZywgaGlkZTogYmh9XHJcbiAgICAgICAgICAgICk9PntcclxuICAgICAgICAgICAgICAgIGEgPSB0aWNrc1thXTtcclxuICAgICAgICAgICAgICAgIGIgPSB0aWNrc1tiXTtcclxuICAgICAgICAgICAgICAgIGlmKGEmJmIpIHJldHVybiBiIC0gYTtcclxuICAgICAgICAgICAgICAgIGlmKCFhJiYhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGFoJiZiaCkgcmV0dXJuIGJnIC0gYWc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYWgpIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGJoKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJnIC0gYWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZighYSkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICBpZighYikgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUb3RhbCgpIHtcclxuICAgICAgICBjb25zdCBUTVMgPSB0aGlzLiNwcm9wZXJ0eS5nZXQodGhpcy4jcHJvcGVydHkuVFlQRVMuVE1TKTtcclxuICAgICAgICBjb25zdCBDQUNIViA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5DQUNIVik7XHJcbiAgICAgICAgY29uc3QgQ1RMVCA9IHRoaXMuI3Byb3BlcnR5LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5DVExUKTtcclxuICAgICAgICBjb25zdCBDRVZUID0gdGhpcy4jcHJvcGVydHkuZ2V0KHRoaXMuI3Byb3BlcnR5LlRZUEVTLkNFVlQpO1xyXG5cclxuICAgICAgICBjb25zdCB0b3RhbFRhbGVudCA9IHRoaXMuI3RhbGVudC5jb3VudCgpO1xyXG4gICAgICAgIGNvbnN0IHRvdGFsRXZlbnQgPSB0aGlzLiNldmVudC5jb3VudCgpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lczogVE1TLFxyXG4gICAgICAgICAgICBhY2hpZXZlbWVudDogQ0FDSFYsXHJcbiAgICAgICAgICAgIHRhbGVudFJhdGU6IENUTFQgLyB0b3RhbFRhbGVudCxcclxuICAgICAgICAgICAgZXZlbnRSYXRlOiBDRVZUIC8gdG90YWxFdmVudCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpbWVzKCkgeyByZXR1cm4gdGhpcy4jcHJvcGVydHk/LmdldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTVMpIHx8IDA7IH1cclxuICAgIHNldCB0aW1lcyh2KSB7XHJcbiAgICAgICAgdGhpcy4jcHJvcGVydHk/LnNldCh0aGlzLiNwcm9wZXJ0eS5UWVBFUy5UTVMsIHYpIHx8IDA7XHJcbiAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuYWNoaWV2ZShcclxuICAgICAgICAgICAgdGhpcy4jYWNoaWV2ZW1lbnQuT3Bwb3J0dW5pdHkuRU5ELFxyXG4gICAgICAgICAgICB0aGlzLiNwcm9wZXJ0eVxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlmZTtcclxuXHJcbiIsImltcG9ydCB7IHN1bW1hcnkgfSBmcm9tICcuL2Z1bmN0aW9ucy9zdW1tYXJ5LmpzJztcclxuaW1wb3J0IHsgZ2V0UmF0ZSwgZ2V0R3JhZGUgfSBmcm9tICcuL2Z1bmN0aW9ucy9hZGRpdGlvbi5qcyc7XHJcbmltcG9ydCBMaWZlIGZyb20gJy4vbGlmZS5qcyc7XHJcblxyXG5jbGFzcyBBcHB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuI2xpZmUgPSBuZXcgTGlmZSgpO1xyXG4gICAgfVxyXG5cclxuICAgICNsaWZlO1xyXG4gICAgI3BhZ2VzO1xyXG4gICAgI2N1cnJlbnRQYWdlO1xyXG4gICAgI3RhbGVudFNlbGVjdGVkID0gbmV3IFNldCgpO1xyXG4gICAgI3RvdGFsTWF4PTIwO1xyXG4gICAgI2lzRW5kID0gZmFsc2U7XHJcbiAgICAjc2VsZWN0ZWRFeHRlbmRUYWxlbnQgPSBudWxsO1xyXG4gICAgI2hpbnRUaW1lb3V0O1xyXG4gICAgI3NwZWNpYWx0aGFua3M7XHJcbiAgICAjYXV0b1RyYWplY3Rvcnk7XHJcblxyXG4gICAgYXN5bmMgaW5pdGlhbCgpIHtcclxuICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoKCdsb2FkaW5nJyk7XHJcbiAgICAgICAgY29uc3QgWyxzcGVjaWFsdGhhbmtzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgICAgdGhpcy4jbGlmZS5pbml0aWFsKCksXHJcbiAgICAgICAgICAgIGpzb24oJ3NwZWNpYWx0aGFua3MnKVxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIHRoaXMuI3NwZWNpYWx0aGFua3MgPSBzcGVjaWFsdGhhbmtzO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoKCdpbmRleCcpO1xyXG4gICAgICAgIGdsb2JhbFRoaXMub25lcnJvciA9IChldmVudCwgc291cmNlLCBsaW5lbm8sIGNvbG5vLCBlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpbnQoYFtFUlJPUl0gYXQgKCR7c291cmNlfToke2xpbmVub306JHtjb2xub30pXFxuXFxuJHtlcnJvcj8uc3RhY2t8fGVycm9yfHwndW5rbm93IEVycm9yJ31gLCAnZXJyb3InKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qga2V5RG93bkNhbGxiYWNrID0gKGtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleWJvYXJkRXZlbnQud2hpY2ggPT09IDEzIHx8IGtleWJvYXJkRXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXNzRW50ZXJGdW5jID0gdGhpcy4jcGFnZXNbdGhpcy4jY3VycmVudFBhZ2VdPy5wcmVzc0VudGVyO1xyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlckZ1bmMgJiYgdHlwZW9mIHByZXNzRW50ZXJGdW5jID09PSAnZnVuY3Rpb24nICYmIHByZXNzRW50ZXJGdW5jKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5RG93bkNhbGxiYWNrKTtcclxuICAgICAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlEb3duQ2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRQYWdlcygpIHtcclxuXHJcbiAgICAgICAgLy8gTG9hZGluZ1xyXG4gICAgICAgIGNvbnN0IGxvYWRpbmdQYWdlID0gJChgXHJcbiAgICAgICAgPGRpdiBpZD1cIm1haW5cIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICDkurrnlJ/ph43lvIDmqKHmi5/lmag8YnI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuNXJlbTsgZm9udC13ZWlnaHQ6bm9ybWFsO1wiPuWKoOi9veS4rS4uLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgLy8gSW5kZXhcclxuICAgICAgICBjb25zdCBpbmRleFBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiYWNoaWV2ZW1lbnRcIj7miJDlsLE8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNwZWNpYWx0aGFua3NcIj7nibnliKvmhJ/osKI8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInRoZW1lVG9nZ2xlQnRuXCI+6buRPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzYXZlXCI+U2F2ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibG9hZFwiPkxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICDkurrnlJ/ph43lvIDmqKHmi5/lmag8YnI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjEuNXJlbTsgZm9udC13ZWlnaHQ6bm9ybWFsO1wiPui/meWeg+WcvuS6uueUn+S4gOenkuS5n+S4jeaDs+WRhuS6hjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJlc3RhcnRcIiBjbGFzcz1cIm1haW5idG5cIj48c3BhbiBjbGFzcz1cImljb25mb250XCI+JiN4ZTZhNzs8L3NwYW4+56uL5Y2z6YeN5byAPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxhIGlkPVwiZGlzY29yZFwiIGhyZWY9XCJodHRwczovL2Rpc2NvcmQuZ2cvVTNxcmY0OU5NUVwiIHN0eWxlPVwiei1pbmRleDogOTk5OTtcIiBhcmlhLWxhYmVsPVwiQ2hhdCBvbiBEaXNjb3JkXCI+PGJ1dHRvbiBjbGFzcz1cImRpc2NvcmQtYnRuXCI+PHN2ZyB3aWR0aD1cIjUwJVwiIGhlaWdodD1cIjU1XCIgdmlld0JveD1cIjAgMCA3MSA1NVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDApXCI+PHBhdGggZD1cIk02MC4xMDQ1IDQuODk3OEM1NS41NzkyIDIuODIxNCA1MC43MjY1IDEuMjkxNiA0NS42NTI3IDAuNDE1NDJDNDUuNTYwMyAwLjM5ODUxIDQ1LjQ2OCAwLjQ0MDc2OSA0NS40MjA0IDAuNTI1Mjg5QzQ0Ljc5NjMgMS42MzUzIDQ0LjEwNSAzLjA4MzQgNDMuNjIwOSA0LjIyMTZDMzguMTYzNyAzLjQwNDYgMzIuNzM0NSAzLjQwNDYgMjcuMzg5MiA0LjIyMTZDMjYuOTA1IDMuMDU4MSAyNi4xODg2IDEuNjM1MyAyNS41NjE3IDAuNTI1Mjg5QzI1LjUxNDEgMC40NDM1ODkgMjUuNDIxOCAwLjQwMTMzIDI1LjMyOTQgMC40MTU0MkMyMC4yNTg0IDEuMjg4OCAxNS40MDU3IDIuODE4NiAxMC44Nzc2IDQuODk3OEMxMC44Mzg0IDQuOTE0NyAxMC44MDQ4IDQuOTQyOSAxMC43ODI1IDQuOTc5NUMxLjU3Nzk1IDE4LjczMDkgLTAuOTQzNTYxIDMyLjE0NDMgMC4yOTM0MDggNDUuMzkxNEMwLjI5OTAwNSA0NS40NTYyIDAuMzM1Mzg2IDQ1LjUxODIgMC4zODU3NjEgNDUuNTU3NkM2LjQ1ODY2IDUwLjAxNzQgMTIuMzQxMyA1Mi43MjQ5IDE4LjExNDcgNTQuNTE5NUMxOC4yMDcxIDU0LjU0NzcgMTguMzA1IDU0LjUxMzkgMTguMzYzOCA1NC40Mzc4QzE5LjcyOTUgNTIuNTcyOCAyMC45NDY5IDUwLjYwNjMgMjEuOTkwNyA0OC41MzgzQzIyLjA1MjMgNDguNDE3MiAyMS45OTM1IDQ4LjI3MzUgMjEuODY3NiA0OC4yMjU2QzE5LjkzNjYgNDcuNDkzMSAxOC4wOTc5IDQ2LjYgMTYuMzI5MiA0NS41ODU4QzE2LjE4OTMgNDUuNTA0MSAxNi4xNzgxIDQ1LjMwNCAxNi4zMDY4IDQ1LjIwODJDMTYuNjc5IDQ0LjkyOTMgMTcuMDUxMyA0NC42MzkxIDE3LjQwNjcgNDQuMzQ2MUMxNy40NzEgNDQuMjkyNiAxNy41NjA2IDQ0LjI4MTMgMTcuNjM2MiA0NC4zMTUxQzI5LjI1NTggNDkuNjIwMiA0MS44MzU0IDQ5LjYyMDIgNTMuMzE3OSA0NC4zMTUxQzUzLjM5MzUgNDQuMjc4NSA1My40ODMxIDQ0LjI4OTggNTMuNTUwMiA0NC4zNDMzQzUzLjkwNTcgNDQuNjM2MyA1NC4yNzc5IDQ0LjkyOTMgNTQuNjUyOSA0NS4yMDgyQzU0Ljc4MTYgNDUuMzA0IDU0Ljc3MzIgNDUuNTA0MSA1NC42MzMzIDQ1LjU4NThDNTIuODY0NiA0Ni42MTk3IDUxLjAyNTkgNDcuNDkzMSA0OS4wOTIxIDQ4LjIyMjhDNDguOTY2MiA0OC4yNzA3IDQ4LjkxMDIgNDguNDE3MiA0OC45NzE4IDQ4LjUzODNDNTAuMDM4IDUwLjYwMzQgNTEuMjU1NCA1Mi41Njk5IDUyLjU5NTkgNTQuNDM1QzUyLjY1MTkgNTQuNTEzOSA1Mi43NTI2IDU0LjU0NzcgNTIuODQ1IDU0LjUxOTVDNTguNjQ2NCA1Mi43MjQ5IDY0LjUyOSA1MC4wMTc0IDcwLjYwMTkgNDUuNTU3NkM3MC42NTUxIDQ1LjUxODIgNzAuNjg4NyA0NS40NTkgNzAuNjk0MyA0NS4zOTQyQzcyLjE3NDcgMzAuMDc5MSA2OC4yMTQ3IDE2Ljc3NTcgNjAuMTk2OCA0Ljk4MjNDNjAuMTc3MiA0Ljk0MjkgNjAuMTQzNyA0LjkxNDcgNjAuMTA0NSA0Ljg5NzhaTTIzLjcyNTkgMzcuMzI1M0MyMC4yMjc2IDM3LjMyNTMgMTcuMzQ1MSAzNC4xMTM2IDE3LjM0NTEgMzAuMTY5M0MxNy4zNDUxIDI2LjIyNSAyMC4xNzE3IDIzLjAxMzMgMjMuNzI1OSAyMy4wMTMzQzI3LjMwOCAyMy4wMTMzIDMwLjE2MjYgMjYuMjUzMiAzMC4xMDY2IDMwLjE2OTNDMzAuMTA2NiAzNC4xMTM2IDI3LjI4IDM3LjMyNTMgMjMuNzI1OSAzNy4zMjUzWk00Ny4zMTc4IDM3LjMyNTNDNDMuODE5NiAzNy4zMjUzIDQwLjkzNzEgMzQuMTEzNiA0MC45MzcxIDMwLjE2OTNDNDAuOTM3MSAyNi4yMjUgNDMuNzYzNiAyMy4wMTMzIDQ3LjMxNzggMjMuMDEzM0M1MC45IDIzLjAxMzMgNTMuNzU0NSAyNi4yNTMyIDUzLjY5ODYgMzAuMTY5M0M1My42OTg2IDM0LjExMzYgNTAuOSAzNy4zMjUzIDQ3LjMxNzggMzcuMzI1M1pcIiBmaWxsPVwiI2ZmZmZmZlwiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPVwiY2xpcDBcIj48cmVjdCB3aWR0aD1cIjcxXCIgaGVpZ2h0PVwiNTVcIiBmaWxsPVwid2hpdGVcIi8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+Q0hBVDwvYnV0dG9uPjxzdHlsZT4uZGlzY29yZC1idG4ge3Bvc2l0aW9uOiBmaXhlZDtib3R0b206IDAuNXJlbTtsZWZ0OiAwLjVyZW07YmFja2dyb3VuZC1jb2xvcjogIzU4NjVGMjtwYWRkaW5nOiAwLjdyZW07aGVpZ2h0OiBhdXRvO2NvbG9yOiB3aGl0ZTt0ZXh0LWFsaWduOiByaWdodDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlcjogbm9uZTt3aWR0aDogNi41cmVtO2ZvbnQtc2l6ZTogMXJlbTtib3JkZXItcmFkaXVzOiA0cHg7fS5kaXNjb3JkLWJ0biBzdmcge2hlaWdodDogMS41cmVtO3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDUwJTtsZWZ0OiAwO3RyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTt9LmRpc2NvcmQtYnRuOmhvdmVyIHN2Z3thbmltYXRpb246ZGlzY29yZC13YXZlIDU2MG1zIGVhc2UtaW4tb3V0O31Aa2V5ZnJhbWVzIGRpc2NvcmQtd2F2ZXswJSwxMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSgwKX0yMCUsNjAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSgtMjVkZWcpfTQwJSw4MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDEwZGVnKX19QG1lZGlhIChtYXgtd2lkdGg6NTAwcHgpey5kaXNjb3JkLWJ0bjpob3ZlciBzdmd7YW5pbWF0aW9uOm5vbmV9LmRpc2NvcmQtYnRuIHN2Z3thbmltYXRpb246ZGlzY29yZC13YXZlIDU2MG1zIGVhc2UtaW4tb3V0fX08L3N0eWxlPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdCB0aGVtZVxyXG4gICAgICAgIHRoaXMuc2V0VGhlbWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykpXHJcblxyXG4gICAgICAgIGluZGV4UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3Jlc3RhcnQnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PnRoaXMuc3dpdGNoKCd0YWxlbnQnKSk7XHJcblxyXG4gICAgICAgIGluZGV4UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI2FjaGlldmVtZW50JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgnYWNoaWV2ZW1lbnQnKSk7XHJcblxyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNzYXZlJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICBPYmplY3RcclxuICAgICAgICAgICAgICAgICAgICAua2V5cyhsb2NhbFN0b3JhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2PT52LnN1YnN0cigwLDQpIT0nZ29vZycpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goa2V5PT5kYXRhW2tleV0gPSBsb2NhbFN0b3JhZ2Vba2V5XSk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gYmxvYi5zbGljZSB8fCBibG9iLndlYmtpdFNsaWNlIHx8IGJsb2IubW96U2xpY2U7XHJcbiAgICAgICAgICAgICAgICBibG9iID0gc2xpY2UuY2FsbChibG9iLCAwLCBibG9iLnNpemUsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnYScpO1xyXG4gICAgICAgICAgICAgICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBgUmVtYWtlX3NhdmVfJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnOicsJy4nKX0uanNvbmA7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGEuaHJlZik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNsb2FkJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gJChgPGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVcIiBhY2NlcHQ9XCJhcHBsaWNhdGlvbi9qc29uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+YClcclxuICAgICAgICAgICAgICAgIGZpbGUuYXBwZW5kVG8oJ2JvZHknKTtcclxuICAgICAgICAgICAgICAgIGZpbGUuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIGZpbGUub24oJ2NoYW5nZScsIChlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoKCdsb2FkaW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFmaWxlKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZWFkZXIucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Vba2V5XSA9IGRhdGFba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgnaW5kZXgnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaGVtZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJyN0aGVtZVRvZ2dsZUJ0bicpLnRleHQoJ+m7kScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfnmb0nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn5Yqg6L295a2Y5qGj5oiQ5YqfJywgJ3N1Y2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJyN0aGVtZVRvZ2dsZUJ0bicpLnRleHQoJ+m7kScpXHJcbiAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICBpbmRleFBhZ2UuZmluZCgnI3RoZW1lVG9nZ2xlQnRuJykudGV4dCgn55m9JylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGluZGV4UGFnZVxyXG4gICAgICAgICAgICAuZmluZChcIiN0aGVtZVRvZ2dsZUJ0blwiKVxyXG4gICAgICAgICAgICAuY2xpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsICdkYXJrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJyN0aGVtZVRvZ2dsZUJ0bicpLnRleHQoJ+eZvScpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsICdsaWdodCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UGFnZS5maW5kKCcjdGhlbWVUb2dnbGVCdG4nKS50ZXh0KCfpu5EnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGhlbWUobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpbmRleFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNzcGVjaWFsdGhhbmtzJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgnc3BlY2lhbHRoYW5rcycpKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3BlY2lhbFRoYW5rc1BhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwic3BlY2lhbHRoYW5rc1wiPui/lOWbnjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwic3B0aHhcIj5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImcxXCI+PC91bD5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImcyXCI+PC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzcG9uc29yXCIgb25jbGljaz1cImdsb2JhbFRoaXMub3BlbignaHR0cHM6Ly9hZmRpYW4ubmV0L0BMaWZlUmVzdGFydCcpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIzk0NmNlNiwjN2U1ZmQ5KTsgbGVmdDphdXRvOyByaWdodDo1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC0ycmVtLC01MCUpO1wiPuaJk+i1j+etluWIkijniLHlj5HnlLUpPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzcG9uc29yXCIgb25jbGljaz1cImdsb2JhbFRoaXMub3BlbignaHR0cHM6Ly9kdW4ubWlhbmJhb2R1by5jb20vQHZpY2tzY2FybGV0JylcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6I2M2OTsgbGVmdDo1MCU7IHJpZ2h0OmF1dG87IHRyYW5zZm9ybTogdHJhbnNsYXRlKDJyZW0sLTUwJSk7XCI+5omT6LWP56iL5bqPKOmhv+mhv+mlrSk8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgc3BlY2lhbFRoYW5rc1BhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNzcGVjaWFsdGhhbmtzJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgnaW5kZXgnKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFjaGlldmVtZW50UGFnZSA9ICQoYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzcGVjaWFsdGhhbmtzXCI+6L+U5ZuePC9idXR0b24+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj7nu5/orqE8L3NwYW4+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cInRvdGFsXCI+PC91bD5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOjAuMjVyZW07IG1hcmdpbjogMC41cmVtIDA7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogI2NjYztcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj7miJDlsLE8YnV0dG9uIGlkPVwicmFua1wiPuaOkuihjOamnDwvYnV0dG9uPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHVsIGlkPVwiYWNoaWV2ZW1lbnRzXCI+PC91bD5cclxuICAgICAgICBgKVxyXG5cclxuICAgICAgICBhY2hpZXZlbWVudFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNzcGVjaWFsdGhhbmtzJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT50aGlzLnN3aXRjaCgnaW5kZXgnKSk7XHJcblxyXG4gICAgICAgIGFjaGlldmVtZW50UGFnZVxyXG4gICAgICAgICAgICAuZmluZCgnI3JhbmsnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PnRoaXMuaGludCgn5Yir5Y235LqG77yM5rKh5pyJ5o6S6KGM5qacJykpO1xyXG4gICAgICAgIC8vIFRhbGVudFxyXG4gICAgICAgIGNvbnN0IHRhbGVudFBhZ2UgPSAkKGBcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxLjZyZW1cIj7lpKnotYvmir3ljaE8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJhbmRvbVwiIGNsYXNzPVwibWFpbmJ0blwiIHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyB0b3A6IDUwJTsgbGVmdDogNTAlOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcIlwiPjEw6L+e5oq977yBPC9idXR0b24+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cInRhbGVudHNcIiBjbGFzcz1cInNlbGVjdGxpc3RcIj48L3VsPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwibmV4dFwiIGNsYXNzPVwibWFpbmJ0blwiPuivt+mAieaLqTPkuKo8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlVGFsZW50ID0gKHsgZ3JhZGUsIG5hbWUsIGRlc2NyaXB0aW9uIH0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICQoYDxsaSBjbGFzcz1cImdyYWRlJHtncmFkZX1iXCI+JHtuYW1lfe+8iCR7ZGVzY3JpcHRpb25977yJPC9saT5gKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRhbGVudFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNyYW5kb20nKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI3JhbmRvbScpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVsID0gdGFsZW50UGFnZS5maW5kKCcjdGFsZW50cycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jbGlmZS50YWxlbnRSYW5kb20oKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKHRhbGVudD0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGNyZWF0ZVRhbGVudCh0YWxlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bC5hcHBlbmQobGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaS5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGkuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3RhbGVudFNlbGVjdGVkLmRlbGV0ZSh0YWxlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuI3RhbGVudFNlbGVjdGVkLnNpemU8Mykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWxlbnRQYWdlLmZpbmQoJyNuZXh0JykudGV4dCgn6K+36YCJ5oupM+S4qicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLiN0YWxlbnRTZWxlY3RlZC5zaXplPT0zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludCgn5Y+q6IO96YCJM+S4quWkqei1iycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNsdXNpdmUgPSB0aGlzLiNsaWZlLmV4Y2x1c2l2ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLiN0YWxlbnRTZWxlY3RlZCkubWFwKCh7aWR9KT0+aWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWxlbnQuaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4Y2x1c2l2ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCB7IG5hbWUsIGlkIH0gb2YgdGhpcy4jdGFsZW50U2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlkID09IGV4Y2x1c2l2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludChg5LiO5bey6YCJ5oup55qE5aSp6LWL44CQJHtuYW1lfeOAkeWGsueqgWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3RhbGVudFNlbGVjdGVkLmFkZCh0YWxlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuI3RhbGVudFNlbGVjdGVkLnNpemU9PTMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjbmV4dCcpLnRleHQoJ+W8gOWni+aWsOS6uueUnycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgnI25leHQnKS5zaG93KClcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRhbGVudFBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNuZXh0JylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLiN0YWxlbnRTZWxlY3RlZC5zaXplIT0zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KCfor7fpgInmi6kz5Liq5aSp6LWLJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjbmV4dCcpLmhpZGUoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy4jdG90YWxNYXggPSAyMCArIHRoaXMuI2xpZmUuZ2V0VGFsZW50QWxsb2NhdGlvbkFkZGl0aW9uKEFycmF5LmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpLm1hcCgoe2lkfSk9PmlkKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgncHJvcGVydHknKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgLy8gUHJvcGVydHlcclxuICAgICAgICAvLyBoaW50IG9mIGV4dGVuc2lvbiB0b2Jlcm1vcnkuZXM2LXN0cmluZy1odG1sXHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlQYWdlID0gJCgvKmh0bWwqL2BcclxuICAgICAgICA8ZGl2IGlkPVwibWFpblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxLjZyZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+6LCD5pW05Yid5aeL5bGe5oCnPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidG90YWxcIiBzdHlsZT1cImZvbnQtc2l6ZToxcmVtOyBmb250LXdlaWdodDpub3JtYWw7XCI+5Y+v55So5bGe5oCn54K577yaMDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHVsIGlkPVwicHJvcGVydHlBbGxvY2F0aW9uXCIgY2xhc3M9XCJwcm9waW5pdGlhbFwiPjwvdWw+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInNlbGVjdGxpc3RcIiBpZD1cInRhbGVudFNlbGVjdGVkVmlld1wiPjwvdWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tYXJlYVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJhbmRvbVwiIGNsYXNzPVwibWFpbmJ0blwiPumaj+acuuWIhumFjTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInN0YXJ0XCIgY2xhc3M9XCJtYWluYnRuXCI+5byA5aeL5paw5Lq655SfPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIGApO1xyXG4gICAgICAgIHByb3BlcnR5UGFnZS5tb3VudGVkID0gKCk9PntcclxuICAgICAgICAgICAgcHJvcGVydHlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjdGFsZW50U2VsZWN0ZWRWaWV3JykuYXBwZW5kKFxyXG4gICAgICAgICAgICAgICAgYDxsaT7lt7LpgInlpKnotYs8L2xpPmAgK1xyXG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLiN0YWxlbnRTZWxlY3RlZClcclxuICAgICAgICAgICAgICAgIC5tYXAoKHtuYW1lLGRlc2NyaXB0aW9ufSk9PmA8bGkgY2xhc3M9XCJncmFkZTBiXCI+JHtuYW1lfSgke2Rlc2NyaXB0aW9ufSk8L2xpPmApXHJcbiAgICAgICAgICAgICAgICAuam9pbignJylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91cHMgPSB7fTtcclxuICAgICAgICBjb25zdCB0b3RhbCA9ICgpPT57XHJcbiAgICAgICAgICAgIGxldCB0ID0gMDtcclxuICAgICAgICAgICAgZm9yKGNvbnN0IHR5cGUgaW4gZ3JvdXBzKVxyXG4gICAgICAgICAgICAgICAgdCArPSBncm91cHNbdHlwZV0uZ2V0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmcmVzaFRvdGFsID0gKCk9PntcclxuICAgICAgICAgICAgcHJvcGVydHlQYWdlLmZpbmQoJyN0b3RhbCcpLnRleHQoYOWPr+eUqOWxnuaAp+eCue+8miR7dGhpcy4jdG90YWxNYXggLSB0b3RhbCgpfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnZXRCdG5Hcm91cHMgPSAobmFtZSwgbWluLCBtYXgpPT57XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gJChgPGxpPiR7bmFtZX0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2xpPmApO1xyXG4gICAgICAgICAgICBjb25zdCBidG5TdWIgPSAkKGA8c3BhbiBjbGFzcz1cImljb25mb250IHByb3BidG5cIj4mI3hlNmE1Ozwvc3Bhbj5gKTtcclxuICAgICAgICAgICAgY29uc3QgaW5wdXRCb3ggPSAkKGA8aW5wdXQgdmFsdWU9XCIwXCIgdHlwZT1cIm51bWJlclwiIC8+YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ0bkFkZCA9ICQoYDxzcGFuIGNsYXNzPVwiaWNvbmZvbnQgcHJvcGJ0blwiPiYjeGU2YTY7PC9zcGFuPmApO1xyXG4gICAgICAgICAgICBncm91cC5hcHBlbmQoYnRuU3ViKTtcclxuICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKGlucHV0Qm94KTtcclxuICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKGJ0bkFkZCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsaW1pdCA9IHY9PntcclxuICAgICAgICAgICAgICAgIHYgPSBOdW1iZXIodil8fDA7XHJcbiAgICAgICAgICAgICAgICB2ID0gTWF0aC5yb3VuZCh2KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2IDwgbWluID8gbWluIDogKFxyXG4gICAgICAgICAgICAgICAgICAgIHYgPiBtYXggPyBtYXggOiB2XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZ2V0ID0gKCk9Pk51bWJlcihpbnB1dEJveC52YWwoKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldCA9IHY9PntcclxuICAgICAgICAgICAgICAgIGlucHV0Qm94LnZhbChsaW1pdCh2KSk7XHJcbiAgICAgICAgICAgICAgICBmcmVzaFRvdGFsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnRuQWRkLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICBpZih0b3RhbCgpID49IHRoaXMuI3RvdGFsTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KCfmsqHmnInlj6/liIbphY3nmoTngrnmlbDkuoYnKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZXQoZ2V0KCkrMSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBidG5TdWIuY2xpY2soKCk9PnNldChnZXQoKS0xKSk7XHJcbiAgICAgICAgICAgIGlucHV0Qm94Lm9uKCdpbnB1dCcsICgpPT57XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gdG90YWwoKTtcclxuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBnZXQoKTtcclxuICAgICAgICAgICAgICAgIGlmKHQgPiB0aGlzLiN0b3RhbE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbCAtPSB0IC0gdGhpcy4jdG90YWxNYXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YWwgPSBsaW1pdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgaWYodmFsICE9IGlucHV0Qm94LnZhbCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmcmVzaFRvdGFsKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4ge2dyb3VwLCBnZXQsIHNldH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncm91cHMuQ0hSID0gZ2V0QnRuR3JvdXBzKFwi6aKc5YC8XCIsIDAsIDEwKTsgLy8g6aKc5YC8IGNoYXJtIENIUlxyXG4gICAgICAgIGdyb3Vwcy5JTlQgPSBnZXRCdG5Hcm91cHMoXCLmmbrliptcIiwgMCwgMTApOyAvLyDmmbrlipsgaW50ZWxsaWdlbmNlIElOVFxyXG4gICAgICAgIGdyb3Vwcy5TVFIgPSBnZXRCdG5Hcm91cHMoXCLkvZPotKhcIiwgMCwgMTApOyAvLyDkvZPotKggc3RyZW5ndGggU1RSXHJcbiAgICAgICAgZ3JvdXBzLk1OWSA9IGdldEJ0bkdyb3VwcyhcIuWutuWig1wiLCAwLCAxMCk7IC8vIOWutuWigyBtb25leSBNTllcclxuXHJcbiAgICAgICAgY29uc3QgdWwgPSBwcm9wZXJ0eVBhZ2UuZmluZCgnI3Byb3BlcnR5QWxsb2NhdGlvbicpO1xyXG5cclxuICAgICAgICBmb3IoY29uc3QgdHlwZSBpbiBncm91cHMpIHtcclxuICAgICAgICAgICAgdWwuYXBwZW5kKGdyb3Vwc1t0eXBlXS5ncm91cCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9wZXJ0eVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNyYW5kb20nKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGxldCB0ID0gdGhpcy4jdG90YWxNYXg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBbMTAsIDEwLCAxMCwgMTBdO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUodD4wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogKE1hdGgubWluKHQsIDEwKSAtIDEpKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3QgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KSAlIDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycltzZWxlY3RdIC0gc3ViIDwwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyW3NlbGVjdF0gLT0gc3ViO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0IC09IHN1YjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ3JvdXBzLkNIUi5zZXQoMTAgLSBhcnJbMF0pO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBzLklOVC5zZXQoMTAgLSBhcnJbMV0pO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBzLlNUUi5zZXQoMTAgLSBhcnJbMl0pO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBzLk1OWS5zZXQoMTAgLSBhcnJbM10pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcHJvcGVydHlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3RhcnQnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKHRvdGFsKCkgPCB0aGlzLiN0b3RhbE1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGludChg5L2g6L+Y5pyJJHt0aGlzLiN0b3RhbE1heC10b3RhbCgpfeWxnuaAp+eCueayoeacieWIhumFjeWujGApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG90YWwoKSA+IHRoaXMuI3RvdGFsTWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KGDkvaDlpJrkvb/nlKjkuoYke3RvdGFsKCkgLSB0aGlzLiN0b3RhbE1heH3lsZ7mgKfngrlgKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IHRoaXMuI2xpZmUucmVzdGFydCh7XHJcbiAgICAgICAgICAgICAgICAgICAgQ0hSOiBncm91cHMuQ0hSLmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIElOVDogZ3JvdXBzLklOVC5nZXQoKSxcclxuICAgICAgICAgICAgICAgICAgICBTVFI6IGdyb3Vwcy5TVFIuZ2V0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgTU5ZOiBncm91cHMuTU5ZLmdldCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIFNQUjogNSxcclxuICAgICAgICAgICAgICAgICAgICBUTFQ6IEFycmF5LmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpLm1hcCgoe2lkfSk9PmlkKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2goJ3RyYWplY3RvcnknKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLnRyYWplY3RvcnkuYm9ybihjb250ZW50cyk7XHJcbiAgICAgICAgICAgICAgICAvLyAkKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBpZihldmVudC53aGljaCA9PSAzMiB8fCBldmVudC53aGljaCA9PSAxMyl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICQoJyNsaWZlVHJhamVjdG9yeScpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gfSlcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFRyYWplY3RvcnlcclxuICAgICAgICBjb25zdCB0cmFqZWN0b3J5UGFnZSA9ICQoYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cImxpZmVQcm9wZXJ0eVwiIGNsYXNzPVwibGlmZVByb3BlcnR5XCI+PC91bD5cclxuICAgICAgICAgICAgPHVsIGlkPVwibGlmZVRyYWplY3RvcnlcIiBjbGFzcz1cImxpZmVUcmFqZWN0b3J5XCI+PC91bD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1hcmVhXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiYXV0b1wiIGNsYXNzPVwibWFpbmJ0blwiPuiHquWKqOaSreaUvjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImF1dG8yeFwiIGNsYXNzPVwibWFpbmJ0blwiPuiHquWKqOaSreaUvjJ4PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic3VtbWFyeVwiIGNsYXNzPVwibWFpbmJ0blwiPuS6uueUn+aAu+e7kzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRvbVRvSW1hZ2VcIiBjbGFzcz1cIm1haW5idG5cIj7kurrnlJ/lm57mlL48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb21Ub0ltYWdlMnd4XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIlwiIGlkPVwiZW5kSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgdHJhamVjdG9yeVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNsaWZlVHJhamVjdG9yeScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy4jaXNFbmQpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYWplY3RvcnkgPSB0aGlzLiNsaWZlLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgYWdlLCBjb250ZW50LCBpc0VuZCB9ID0gdHJhamVjdG9yeTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gJChgPGxpPjxzcGFuPiR7YWdlfeWyge+8mjwvc3Bhbj48c3Bhbj4ke1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQubWFwKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoe3R5cGUsIGRlc2NyaXB0aW9uLCBncmFkZSwgbmFtZSwgcG9zdEV2ZW50fSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUTFQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYOWkqei1i+OAkCR7bmFtZX3jgJHlj5HliqjvvJoke2Rlc2NyaXB0aW9ufWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRVZUJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uICsgKHBvc3RFdmVudD9gPGJyPiR7cG9zdEV2ZW50fWA6JycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKS5qb2luKCc8YnI+JylcclxuICAgICAgICAgICAgICAgIH08L3NwYW4+PC9saT5gKTtcclxuICAgICAgICAgICAgICAgIGxpLmFwcGVuZFRvKCcjbGlmZVRyYWplY3RvcnknKTtcclxuICAgICAgICAgICAgICAgICQoXCIjbGlmZVRyYWplY3RvcnlcIikuc2Nyb2xsVG9wKCQoXCIjbGlmZVRyYWplY3RvcnlcIilbMF0uc2Nyb2xsSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGlmKGlzRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkudW5iaW5kKFwia2V5ZG93blwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNpc0VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI3N1bW1hcnknKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2F1dG8nKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2UuZmluZCgnI2F1dG8yeCcpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0cmFqZWN0b3J5UGFnZS5maW5kKCcjZG9tVG9JbWFnZScpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy4jbGlmZS5nZXRMYXN0UmVjb3JkKCk7XHJcbiAgICAgICAgICAgICAgICAkKFwiI2xpZmVQcm9wZXJ0eVwiKS5odG1sKGBcclxuICAgICAgICAgICAgICAgIDxsaT48c3Bhbj7popzlgLw8L3NwYW4+PHNwYW4+JHtwcm9wZXJ0eS5DSFJ9PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGk+PHNwYW4+5pm65YqbPC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuSU5UfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxzcGFuPuS9k+i0qDwvc3Bhbj48c3Bhbj4ke3Byb3BlcnR5LlNUUn08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48c3Bhbj7lrrblooM8L3NwYW4+PHNwYW4+JHtwcm9wZXJ0eS5NTll9PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGk+PHNwYW4+5b+r5LmQPC9zcGFuPjxzcGFuPiR7cHJvcGVydHkuU1BSfTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgYCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGh0bWwyY2FudmFzXHJcbiAgICAgICAgdHJhamVjdG9yeVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNkb21Ub0ltYWdlJylcclxuICAgICAgICAgICAgLmNsaWNrKCgpPT57XHJcbiAgICAgICAgICAgICAgICAkKFwiI2xpZmVUcmFqZWN0b3J5XCIpLmFkZENsYXNzKFwiZGVsZXRlRml4ZWRcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGRvbXRvaW1hZ2UudG9KcGVnKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWZlVHJhamVjdG9yeScpKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmRvd25sb2FkID0gJ+aIkeeahOS6uueUn+WbnuaUvi5qcGVnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gZGF0YVVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI2xpZmVUcmFqZWN0b3J5XCIpLnJlbW92ZUNsYXNzKFwiZGVsZXRlRml4ZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW+ruS/oeWGhee9rua1j+iniOWZqO+8jOaYvuekuuWbvueJh++8jOmcgOimgeeUqOaIt+WNleeLrOS/neWtmFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih1YS5tYXRjaCgvTWljcm9NZXNzZW5nZXIvaSk9PVwibWljcm9tZXNzZW5nZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2VuZEltYWdlJykuYXR0cignc3JjJywgZGF0YVVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5oaWRlKCk7XHJcblxyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjc3VtbWFyeScpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNhdXRvVHJhamVjdG9yeSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiNhdXRvVHJhamVjdG9yeSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaCgnc3VtbWFyeScpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYXV0byA9IHRpY2s9PntcclxuICAgICAgICAgICAgaWYodGhpcy4jYXV0b1RyYWplY3RvcnkpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4jYXV0b1RyYWplY3RvcnkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jYXV0b1RyYWplY3RvcnkgPSBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuaXNFbmQpXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhamVjdG9yeVBhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyNsaWZlVHJhamVjdG9yeScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jYXV0b1RyYWplY3RvcnkgPSBzZXRJbnRlcnZhbCgoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNFbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNhdXRvVHJhamVjdG9yeSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2F1dG9UcmFqZWN0b3J5ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJyNsaWZlVHJhamVjdG9yeScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB0aWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRyYWplY3RvcnlQYWdlXHJcbiAgICAgICAgICAgIC5maW5kKCcjYXV0bycpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+YXV0bygxMDAwKSk7XHJcbiAgICAgICAgdHJhamVjdG9yeVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNhdXRvMngnKVxyXG4gICAgICAgICAgICAuY2xpY2soKCk9PmF1dG8oNTAwKSk7XHJcblxyXG4gICAgICAgIC8vIFN1bW1hcnlcclxuICAgICAgICBjb25zdCBzdW1tYXJ5UGFnZSA9ICQoYFxyXG4gICAgICAgIDxkaXYgaWQ9XCJtYWluXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkXCI+5Lq655Sf5oC757uTPC9kaXY+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cImp1ZGdlXCIgY2xhc3M9XCJqdWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUyXCI+PHNwYW4+6aKc5YC877yaPC9zcGFuPjxzcGFuPjnnuqcg576O6Iul5aSp5LuZPC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7mmbrlipvvvJo8L3NwYW4+PHNwYW4+NOe6pyDmmbrlipvkuIDoiKw8L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMFwiPjxzcGFuPuS9k+i0qO+8mjwvc3Bhbj48c3Bhbj4x57qnIOaegeW6puiZmuW8sTwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUwXCI+PHNwYW4+5a625aKD77yaPC9zcGFuPjxzcGFuPjbnuqcg5bCP5bq35LmL5a62PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJncmFkZTBcIj48c3Bhbj7kuqvlubTvvJo8L3NwYW4+PHNwYW4+M+WygSDml6nlpK08L3NwYW4+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyYWRlMFwiPjxzcGFuPuW/q+S5kO+8mjwvc3Bhbj48c3Bhbj48L3NwYW4+M+e6pyDkuI3lpKrlubjnpo/nmoTkurrnlJ88L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZFwiIHN0eWxlPVwiaGVpZ2h0OmF1dG87XCI+5aSp6LWL77yM5L2g5Y+v5Lul6YCJ5LiA5Liq77yM5LiL6L6I5a2Q6L+Y6IO95oq95YiwPC9kaXY+XHJcbiAgICAgICAgICAgIDx1bCBpZD1cInRhbGVudHNcIiBjbGFzcz1cInNlbGVjdGxpc3RcIiBzdHlsZT1cImZsZXg6IDAgMSBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ3JhZGUyYlwiPum7keW5le+8iOmdouivleS4gOWumuaIkOWKn++8iTwvbGk+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJhZ2FpblwiIGNsYXNzPVwibWFpbmJ0blwiPjxzcGFuIGNsYXNzPVwiaWNvbmZvbnRcIj4mI3hlNmE3Ozwvc3Bhbj7lho3mrKHph43lvIA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgKTtcclxuXHJcbiAgICAgICAgc3VtbWFyeVBhZ2VcclxuICAgICAgICAgICAgLmZpbmQoJyNhZ2FpbicpXHJcbiAgICAgICAgICAgIC5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lcyArKztcclxuICAgICAgICAgICAgICAgIHRoaXMuI2xpZmUudGFsZW50RXh0ZW5kKHRoaXMuI3NlbGVjdGVkRXh0ZW5kVGFsZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI3NlbGVjdGVkRXh0ZW5kVGFsZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuI3RhbGVudFNlbGVjdGVkLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0b3RhbE1heCA9IDIwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jaXNFbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoKCdpbmRleCcpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy4jcGFnZXMgPSB7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IGxvYWRpbmdQYWdlLFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAnbG9hZGluZyc7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpbmRleDoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogaW5kZXhQYWdlLFxyXG4gICAgICAgICAgICAgICAgYnRuQWNoaWV2ZW1lbnQ6IGluZGV4UGFnZS5maW5kKCcjYWNoaWV2ZW1lbnQnKSxcclxuICAgICAgICAgICAgICAgIGJ0blJlc3RhcnQ6IGluZGV4UGFnZS5maW5kKCcjcmVzdGFydCcpLFxyXG4gICAgICAgICAgICAgICAgaGludDogaW5kZXhQYWdlLmZpbmQoJy5oaW50JyksXHJcbiAgICAgICAgICAgICAgICBwcmVzc0VudGVyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLmluZGV4LmJ0blJlc3RhcnQuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50UGFnZSA9ICdpbmRleCc7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhQYWdlLmZpbmQoJy5oaW50JykuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnQgPSBpbmRleFBhZ2UuZmluZCgnI2FjaGlldmVtZW50Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzY29yZCA9IGluZGV4UGFnZS5maW5kKCcjZGlzY29yZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWNpYWx0aGFua3MgPSBpbmRleFBhZ2UuZmluZCgnI3NwZWNpYWx0aGFua3MnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGltZXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjaGlldmVtZW50LnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29yZC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWx0aGFua3Muc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzY29yZC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BlY2lhbHRoYW5rcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzcGVjaWFsdGhhbmtzOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiBzcGVjaWFsVGhhbmtzUGFnZSxcclxuICAgICAgICAgICAgICAgIGNsZWFyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGhhbmtzUGFnZS5maW5kKCcjc3B0aHggPiB1bC5nMScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGhhbmtzUGFnZS5maW5kKCcjc3B0aHggPiB1bC5nMicpLFxyXG4gICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goZz0+Zy5lbXB0eSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzcGVjaWFsdGhhbmtzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KCgpPT4wLjUtTWF0aC5yYW5kb20oKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKHtncm91cCwgbmFtZSwgY29tbWVudCwgY29sb3J9KT0+Z3JvdXBzWy0tZ3JvdXBdLmFwcGVuZChgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCIgJHtjb2xvcj8oJ3N0eWxlPVwiY29sb3I6Jytjb2xvcisnXCInKTonJ30+JHtuYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRcIj4ke2NvbW1lbnR8fCcnfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGApKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBhY2hpZXZlbWVudDoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogYWNoaWV2ZW1lbnRQYWdlLFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbCA9IGFjaGlldmVtZW50UGFnZS5maW5kKFwidWwjdG90YWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNoaWV2ZW1lbnRzID0gYWNoaWV2ZW1lbnRQYWdlLmZpbmQoXCJ1bCNhY2hpZXZlbWVudHNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICBhY2hpZXZlbWVudHMuZW1wdHkoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0UmF0ZSA9ICh0eXBlLCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRlID0gZ2V0UmF0ZSh0eXBlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvciA9IE9iamVjdC5rZXlzKHJhdGUpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocGFyc2VJbnQoY29sb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNvbG9yID0gJ+eZveiJsic7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBjb2xvciA9ICfok53oibInOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogY29sb3IgPSAn57Sr6ImyJzsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IGNvbG9yID0gJ+apmeiJsic7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBPYmplY3QudmFsdWVzKHJhdGUpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocGFyc2VJbnQocikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogciA9ICfkuI3lj5gnOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogciA9ICfnv7vlgI0nOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogciA9ICfkuInlgI0nOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogciA9ICflm5vlgI0nOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogciA9ICfkupTlgI0nOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogciA9ICflha3lgI0nOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBg5oq95YiwJHtjb2xvcn3mpoLnjocke3J9YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdGltZXMsIGFjaGlldmVtZW50LCB0YWxlbnRSYXRlLCBldmVudFJhdGUgfSA9IHRoaXMuI2xpZmUuZ2V0VG90YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbC5hcHBlbmQoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2h2ZyR7Z2V0R3JhZGUoJ3RpbWVzJywgdGltZXMpfVwiPjxzcGFuIGNsYXNzPVwiYWNoaWV2ZW1lbnR0aXRsZVwiPuW3sumHjeW8gCR7dGltZXN95qyhPC9zcGFuPiR7Zm9ybWF0UmF0ZSgndGltZXMnLCB0aW1lcyl9PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYWNodmcke2dldEdyYWRlKCdhY2hpZXZlbWVudCcsIGFjaGlldmVtZW50KX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7miJDlsLHovr7miJAke2FjaGlldmVtZW50feS4qjwvc3Bhbj4ke2Zvcm1hdFJhdGUoJ2FjaGlldmVtZW50JywgYWNoaWV2ZW1lbnQpfTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFjaHZnJHtnZXRHcmFkZSgnZXZlbnRSYXRlJywgZXZlbnRSYXRlKX1cIj48c3BhbiBjbGFzcz1cImFjaGlldmVtZW50dGl0bGVcIj7kuovku7bmlLbpm4bnjoc8L3NwYW4+JHtNYXRoLmZsb29yKGV2ZW50UmF0ZSAqIDEwMCl9JTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFjaHZnJHtnZXRHcmFkZSgndGFsZW50UmF0ZScsIHRhbGVudFJhdGUpfVwiPjxzcGFuIGNsYXNzPVwiYWNoaWV2ZW1lbnR0aXRsZVwiPuWkqei1i+aUtumbhueOhzwvc3Bhbj4ke01hdGguZmxvb3IodGFsZW50UmF0ZSAqIDEwMCl9JTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjaGlldmVtZW50c0RhdGEgPSB0aGlzLiNsaWZlLmdldEFjaGlldmVtZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFjaGlldmVtZW50c0RhdGEuZm9yRWFjaCgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZXNjcmlwdGlvbiwgaGlkZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGUsIGlzQWNoaWV2ZWRcclxuICAgICAgICAgICAgICAgICAgICB9KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihoaWRlICYmICFpc0FjaGlldmVkKSBuYW1lID0gZGVzY3JpcHRpb24gPSAnPz8/JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNoaWV2ZW1lbnRzLmFwcGVuZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA8bGkgY2xhc3M9XCJhY2h2ZyR7Z3JhZGV9ICR7aXNBY2hpZXZlZD8nJzonbWFzayd9XCI+PHNwYW4gY2xhc3M9XCJhY2hpZXZlbWVudHRpdGxlXCI+JHtuYW1lfTwvc3Bhbj4ke2Rlc2NyaXB0aW9ufTwvbGk+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0YWxlbnQ6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHRhbGVudFBhZ2UsXHJcbiAgICAgICAgICAgICAgICB0YWxlbnRMaXN0OiB0YWxlbnRQYWdlLmZpbmQoJyN0YWxlbnRzJyksXHJcbiAgICAgICAgICAgICAgICBidG5SYW5kb206IHRhbGVudFBhZ2UuZmluZCgnI3JhbmRvbScpLFxyXG4gICAgICAgICAgICAgICAgYnRuTmV4dDogdGFsZW50UGFnZS5maW5kKCcjbmV4dCcpLFxyXG4gICAgICAgICAgICAgICAgcHJlc3NFbnRlcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWxlbnRMaXN0ID0gdGhpcy4jcGFnZXMudGFsZW50LnRhbGVudExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRuUmFuZG9tID0gdGhpcy4jcGFnZXMudGFsZW50LmJ0blJhbmRvbTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5OZXh0ID0gdGhpcy4jcGFnZXMudGFsZW50LmJ0bk5leHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhbGVudExpc3QuY2hpbGRyZW4oKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnRuTmV4dC5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0blJhbmRvbS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50UGFnZSA9ICd0YWxlbnQnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhbGVudFBhZ2UuZmluZCgndWwuc2VsZWN0bGlzdCcpLmVtcHR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFsZW50UGFnZS5maW5kKCcjcmFuZG9tJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3RvdGFsTWF4ID0gMjA7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcm9wZXJ0eToge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogcHJvcGVydHlQYWdlLFxyXG4gICAgICAgICAgICAgICAgYnRuU3RhcnQ6IHByb3BlcnR5UGFnZS5maW5kKCcjc3RhcnQnKSxcclxuICAgICAgICAgICAgICAgIHByZXNzRW50ZXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcGFnZXMucHJvcGVydHkuYnRuU3RhcnQuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50UGFnZSA9ICdwcm9wZXJ0eSc7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJlc2hUb3RhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnI3RhbGVudFNlbGVjdGVkVmlldycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdHJhamVjdG9yeToge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogdHJhamVjdG9yeVBhZ2UsXHJcbiAgICAgICAgICAgICAgICBsaWZlVHJhamVjdG9yeTogdHJhamVjdG9yeVBhZ2UuZmluZCgnI2xpZmVUcmFqZWN0b3J5JyksXHJcbiAgICAgICAgICAgICAgICBwcmVzc0VudGVyOiAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3BhZ2VzLnRyYWplY3RvcnkubGlmZVRyYWplY3RvcnkuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGVhcjogKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50UGFnZSA9ICd0cmFqZWN0b3J5JztcclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjbGlmZVRyYWplY3RvcnknKS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNzdW1tYXJ5JykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNhdXRvJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYWplY3RvcnlQYWdlLmZpbmQoJyNhdXRvMngnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaXNFbmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBib3JuOiBjb250ZW50cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudHMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xpZmVUcmFqZWN0b3J5JylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoYDxsaT48c3Bhbj7liJ3lp4vvvJo8L3NwYW4+PHNwYW4+JHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7c291cmNlLCB0YXJnZXR9KSA9PiBg5aSp6LWL44CQJHtzb3VyY2UubmFtZX3jgJHlj5HliqjvvJrmm7/mjaLkuLrlpKnotYvjgJAke3RhcmdldC5uYW1lfeOAkWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmpvaW4oJzxicj4nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvc3Bhbj48L2xpPmApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cmFqZWN0b3J5UGFnZS5maW5kKCcjbGlmZVRyYWplY3RvcnknKS50cmlnZ2VyKFwiY2xpY2tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN1bW1hcnk6IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHN1bW1hcnlQYWdlLFxyXG4gICAgICAgICAgICAgICAgY2xlYXI6ICgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY3VycmVudFBhZ2UgPSAnc3VtbWFyeSc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganVkZ2UgPSBzdW1tYXJ5UGFnZS5maW5kKCcjanVkZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWxlbnRzID0gc3VtbWFyeVBhZ2UuZmluZCgnI3RhbGVudHMnKTtcclxuICAgICAgICAgICAgICAgICAgICBqdWRnZS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhbGVudHMuZW1wdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0RXh0ZW5kVGFsZW50ID0gdGhpcy4jbGlmZS5nZXRMYXN0RXh0ZW5kVGFsZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgQXJyYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20odGhpcy4jdGFsZW50U2VsZWN0ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZDphLCBncmFkZTphZ30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6YiwgZ3JhZGU6Ymd9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhID09IGxhc3RFeHRlbmRUYWxlbnQpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGIgPT0gbGFzdEV4dGVuZFRhbGVudCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmcgLSBhZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKHRhbGVudCwgaSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gY3JlYXRlVGFsZW50KHRhbGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWxlbnRzLmFwcGVuZChsaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5jbGljaygoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3NlbGVjdGVkRXh0ZW5kVGFsZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHRoaXMuI3NlbGVjdGVkRXh0ZW5kVGFsZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50KCflj6rog73nu6fmib/kuIDkuKrlpKnotYsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3NlbGVjdGVkRXh0ZW5kVGFsZW50ID0gdGFsZW50LmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpKSBsaS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeURhdGEgPSB0aGlzLiNsaWZlLmdldFN1bW1hcnkoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSAoZGlzY3JpcHRpb24sIHR5cGUpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3VtbWFyeURhdGFbdHlwZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsganVkZ2UsIGdyYWRlIH0gPSBzdW1tYXJ5KHR5cGUsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8bGkgY2xhc3M9XCJncmFkZSR7Z3JhZGV9XCI+PHNwYW4+JHtkaXNjcmlwdGlvbn3vvJo8L3NwYW4+PHNwYW4+JHt2YWx1ZX0gJHtqdWRnZX08L3NwYW4+PC9saT5gO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGp1ZGdlLmFwcGVuZChgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCfpopzlgLwnLCAnQ0hSJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCfmmbrlipsnLCAnSU5UJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCfkvZPotKgnLCAnU1RSJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCflrrblooMnLCAnTU5ZJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCflv6vkuZAnLCAnU1BSJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCfkuqvlubQnLCAnQUdFJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7Zm9ybWF0KCfmgLvor4QnLCAnU1VNJyl9XHJcbiAgICAgICAgICAgICAgICAgICAgYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkJG9uKCdhY2hpZXZlbWVudCcsICh7bmFtZX0pPT57XHJcbiAgICAgICAgICAgIHRoaXMuaGludChg6Kej6ZSB5oiQ5bCx44CQJHtuYW1lfeOAkWAsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2gocGFnZSkge1xyXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLiNwYWdlc1twYWdlXTtcclxuICAgICAgICBpZighcCkgcmV0dXJuO1xyXG4gICAgICAgICQoJyNtYWluJykuZGV0YWNoKCk7XHJcbiAgICAgICAgcC5jbGVhcigpO1xyXG4gICAgICAgIHAucGFnZS5hcHBlbmRUbygnYm9keScpO1xyXG4gICAgICAgIGlmKHR5cGVvZiBwLnBhZ2UubW91bnRlZCA9PT0gJ2Z1bmN0aW9uJyl7XHJcbiAgICAgICAgICAgIHAucGFnZS5tb3VudGVkKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGludChtZXNzYWdlLCB0eXBlPSdpbmZvJykge1xyXG4gICAgICAgIGlmKHRoaXMuI2hpbnRUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNoaW50VGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuI2hpbnRUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlkZUJhbm5lcnMoKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBiYW5uZXIgPSAkKGAuYmFubmVyLiR7dHlwZX1gKTtcclxuICAgICAgICAgICAgYmFubmVyLmFkZENsYXNzKCd2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgIGJhbm5lci5maW5kKCcuYmFubmVyLW1lc3NhZ2UnKS50ZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZih0eXBlICE9ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2hpbnRUaW1lb3V0ID0gc2V0VGltZW91dChoaWRlQmFubmVycywgMzAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaGVtZSh0aGVtZSkge1xyXG4gICAgICAgIGNvbnN0IHRoZW1lTGluayA9ICQoZG9jdW1lbnQpLmZpbmQoJyN0aGVtZUxpbmsnKTtcclxuXHJcbiAgICAgICAgaWYodGhlbWUgPT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICB0aGVtZUxpbmsuYXR0cignaHJlZicsICdsaWdodC5jc3MnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGVtZUxpbmsuYXR0cignaHJlZicsICdkYXJrLmNzcycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgdGltZXMoKSB7cmV0dXJuIHRoaXMuI2xpZmU/LnRpbWVzIHx8IDA7fVxyXG4gICAgc2V0IHRpbWVzKHYpIHsgaWYodGhpcy4jbGlmZSkgdGhpcy4jbGlmZS50aW1lcyA9IHYgfTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFwcDtcclxuIiwiaW1wb3J0IEFwcCBmcm9tICcuLi9zcmMvYXBwLmpzJztcclxuXHJcbmdsb2JhbFRoaXMuJCRldmVudE1hcCA9IG5ldyBNYXAoKTtcclxuZ2xvYmFsVGhpcy4kJGV2ZW50ID0gKHRhZywgZGF0YSkgPT4ge1xyXG4gICAgY29uc3QgbGlzdGVuZXIgPSAkJGV2ZW50TWFwLmdldCh0YWcpO1xyXG4gICAgaWYobGlzdGVuZXIpIGxpc3RlbmVyLmZvckVhY2goZm49PmZuKGRhdGEpKTtcclxufVxyXG5nbG9iYWxUaGlzLiQkb24gPSAodGFnLCBmbikgPT4ge1xyXG4gICAgbGV0IGxpc3RlbmVyID0gJCRldmVudE1hcC5nZXQodGFnKTtcclxuICAgIGlmKCFsaXN0ZW5lcikge1xyXG4gICAgICAgIGxpc3RlbmVyID0gbmV3IFNldCgpO1xyXG4gICAgICAgICQkZXZlbnRNYXAuc2V0KHRhZywgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG4gICAgbGlzdGVuZXIuYWRkKGZuKTtcclxufVxyXG5nbG9iYWxUaGlzLiQkb2ZmID0gKHRhZywgZm4pID0+IHtcclxuICAgIGNvbnN0IGxpc3RlbmVyID0gJCRldmVudE1hcC5nZXQodGFnKTtcclxuICAgIGlmKGxpc3RlbmVyKSBsaXN0ZW5lci5kZWxldGUoZm4pO1xyXG59XHJcblxyXG5nbG9iYWxUaGlzLmpzb24gPSBhc3luYyBmaWxlTmFtZSA9PiBhd2FpdCAoYXdhaXQgZmV0Y2goYC4uL2RhdGEvJHtmaWxlTmFtZX0uanNvbmApKS5qc29uKCk7XHJcblxyXG4vLyBQc3NzdCwgSSd2ZSBjcmVhdGVkIGEgZ2l0aHViIHBhY2thZ2UgLSBodHRwczovL2dpdGh1Yi5jb20vYnJvb2tlc2I5MS9kaXNtaXNzaWJsZVxyXG5nbG9iYWxUaGlzLmhpZGVCYW5uZXJzID0gKGUpID0+IHtcclxuICAgIGRvY3VtZW50XHJcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmFubmVyLnZpc2libGVcIilcclxuICAgICAgICAuZm9yRWFjaCgoYikgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKFwidmlzaWJsZVwiKSk7XHJcbn07XHJcblxyXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XHJcbmFwcC5pbml0aWFsKCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\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)})();