From c72aae2b1ab3b98859a6b322d381cc9bff3f0c2a Mon Sep 17 00:00:00 2001 From: saertna <83655354+saertna@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:35:43 +0200 Subject: [PATCH] refactoring classes in own files --- main.js | 2437 ++++++++++++++++++------------------ src/ModalBooster.ts | 51 + src/ModalInformationbox.ts | 20 + src/MultiSelectModal.ts | 462 +++++++ src/main.ts | 535 +------- 5 files changed, 1763 insertions(+), 1742 deletions(-) create mode 100644 src/ModalBooster.ts create mode 100644 src/ModalInformationbox.ts create mode 100644 src/MultiSelectModal.ts diff --git a/main.js b/main.js index 493d2da..95d0b42 100644 --- a/main.js +++ b/main.js @@ -34,10 +34,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // src/main.ts var main_exports = {}; __export(main_exports, { - default: () => gamification + default: () => gamification2, + hoursUntilMinutesPassed: () => hoursUntilMinutesPassed, + isMinutesPassed: () => isMinutesPassed }); module.exports = __toCommonJS(main_exports); -var import_obsidian2 = require("obsidian"); +var import_obsidian5 = require("obsidian"); // src/settings.ts var import_obsidian = require("obsidian"); @@ -2705,1351 +2707,1362 @@ function getRandomMessagePoints(points) { return message.replace("[X]", points.toString()); } -// src/main.ts -var style = document.createElement("style"); -style.textContent = ` - .modal-checkbox-container { - margin-bottom: 10px; - display: flex; - align-items: center; - } - - .modal-checkbox-container input[type="checkbox"] { - margin-right: 5px; - } -`; -document.head.append(style); -var gamification = class extends import_obsidian2.Plugin { - constructor() { - super(...arguments); - this.statusBarItem = this.addStatusBarItem(); - this.statusbarGamification = this.statusBarItem.createEl("span", { text: "" }); - } - getSetting(key) { - return this.settings[key] !== void 0 ? this.settings[key] : null; +// src/ModalInformationbox.ts +var import_obsidian2 = require("obsidian"); +var ModalInformationbox = class extends import_obsidian2.Modal { + // Store the text to be displayed + constructor(app2, displayText) { + super(app2); + this.displayText = displayText; } - setSetting(key, value) { - this.settings[key] = value; - this.saveSettings(); + onOpen() { + const { contentEl } = this; + contentEl.setText(this.displayText); } - setSettingBoolean(key, value) { - this.settings[key] = value; - this.saveSettings(); + onClose() { + const { contentEl } = this; + contentEl.empty(); } - setSettingString(key, value) { - this.settings[key] = value; - this.saveSettings(); +}; + +// src/ModalBooster.ts +var import_obsidian4 = require("obsidian"); + +// src/MultiSelectModal.ts +var import_obsidian3 = require("obsidian"); +var MultiSelectModal = class extends import_obsidian3.Modal { + constructor(app2, items, buttonText, gamificationInstance) { + super(app2); + this.selectedItems = []; + this.remainingStock = {}; + this.boosters = {}; + this.useBooster = false; + this.remainingBoosterStock = {}; + this.items = items; + this.buttonText = buttonText; + this.gamificationInstance = gamificationInstance; } - async onload() { - console.log("obsidian-pkm-gamification loaded!"); - await this.loadSettings(); - this.addSettingTab(new GamificationPluginSettings(this.app, this)); - setTimeout(async () => { - await this.resetDailyGoals(); - }, 2e3); - this.timerInterval = 30 * 60 * 1e3; - this.timerId = window.setInterval(this.resetDailyGoals.bind(this), this.timerInterval); - await this.updateStatusBar(this.statusbarGamification); - if (this.settings.debug) { - this.addRibbonIcon("accessibility", "crafting", async () => { - this.acquireIngredients(); + onOpen() { + const { contentEl } = this; + contentEl.empty(); + if (this.useBooster) { + boosterRecipes.forEach((item) => { + if (this.boosterAvailableForUse(item.name)) { + const listItem = this.createItemContainer(item.name); + contentEl.appendChild(listItem); + } }); + } else { + const listItem = this.createItemContainer(""); + contentEl.appendChild(listItem); } - this.addRibbonIcon("test-tube-2", "Boosters", async () => { - new ModalBooster(this.app, ` `, this).open(); - }); - this.addRibbonIcon("sprout", "Calculate Note Maturity", async () => { - await this.calculateNoteMajurity(); - }); - this.addCommand({ - id: "boosters", - name: "open booter pallete", - callback: async () => { - new ModalBooster(this.app, ` `, this).open(); + } + onClose() { + this.selectedItems = []; + } + boosterAvailableForUse(item) { + let found = false; + listOfUseableBoostersToBeShown.forEach((element) => { + if (item == element) { + if (!found) { + found = true; + } } }); - if (this.settings.enableInitCommand) { - this.addCommand({ - id: "init-rate-gamification", - name: "Initialize gamification ratings", - callback: async () => { - await this.initializeGame(this.statusbarGamification); - } - }); + return found; + } + setUseBooster(useBooster) { + this.useBooster = useBooster; + } + // Updated createItemContainer method + createItemContainer(labelText) { + if (this.useBooster) { + return this.createBoosterList(labelText); + } else { + return this.createCraftingLayout(); } - if (this.settings.enableInitCommand) { - this.addCommand({ - id: "create-avatar-page", - name: "create profile page", - callback: async () => { - const { vault } = this.app; - await createAvatarFile(this.app, this.settings.avatarPageName); - const chartString = await this.createChart(vault); - await replaceChartContent(this.settings.avatarPageName, chartString); - } - }); + } + updateIncrementStock(increment, stock) { + console.log(`updateIncrementStock: increment ${increment} stock ${stock}`); + this.remainingStock[increment] = stock; + this.gamificationInstance.setSetting(this.getIngerementVarNameFromName(increment) || "", stock); + } + updateBoosterStock(booster, stockIncrease) { + this.boosters[booster] += stockIncrease; + } + decrementBooster(booster, stockIncrease) { + const stock = this.boosters[booster]; + const momentDate = window.moment(booster, "YYYY-MM-DD HH:mm:ss"); + if (stock > 0 && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(booster))) { + this.boosters[booster] -= stockIncrease; + this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(booster), this.boosters[booster]); + this.gamificationInstance.setSettingBoolean(this.getBoosterSwitchFromName(booster), true); + this.gamificationInstance.setSettingString(this.getBoosterDateFromName(booster), window.moment().format("YYYY-MM-DD HH:mm:ss")); + this.updateQuantityDisplay(booster); } - if (this.settings.enableInitCommand) { - this.addCommand({ - id: "reset-game", - name: "reset the game", - callback: async () => { - await this.resetGame(); - } - }); + } + readBoostersStock() { + if (this.gamificationInstance) { + this.boosters = { + "Temporal Tweaker": this.gamificationInstance.getSetting("temporalTweaker"), + "Perpetual Progress": this.gamificationInstance.getSetting("perpetualProgress"), + "Strategic Synapses": this.gamificationInstance.getSetting("strategicSynapses"), + "Accelerated Acquisition": this.gamificationInstance.getSetting("acceleratedAcquisition"), + "Linkers Lode": this.gamificationInstance.getSetting("linkersLode"), + "Effortless Expansion": this.gamificationInstance.getSetting("effortlessExpansion"), + "Recursive Reflection": this.gamificationInstance.getSetting("recursiveReflection"), + "Synaptic Surge": this.gamificationInstance.getSetting("synapticSurge"), + "Inspiration Infusion": this.gamificationInstance.getSetting("inspirationInfusion"), + "Title Titan": this.gamificationInstance.getSetting("titleTitan"), + "Precision Prism": this.gamificationInstance.getSetting("precisionPrism"), + "Hyperlink Harmony": this.gamificationInstance.getSetting("hyperlinkHarmony") + }; } - this.addCommand({ - id: "update-chart-avatarpage", - name: "update chart on profile page", - callback: async () => { - const { vault } = app; - const chartString = await this.createChart(vault); - await replaceChartContent(this.settings.avatarPageName, chartString); - } - }); - this.addCommand({ - id: "rate-note-maturity", - name: "Rate note majurity", - callback: async () => { - await this.calculateNoteMajurity(); + } + readIngrementStock() { + if (this.gamificationInstance) { + this.remainingStock = { + "Nexus Node": this.gamificationInstance.getSetting("nexusNode"), + "Connection Crystal": this.gamificationInstance.getSetting("connectionCrystal"), + "Mastery Scroll": this.gamificationInstance.getSetting("masteryScroll"), + "Insight Prism": this.gamificationInstance.getSetting("insightPrism"), + "Reflective Essence": this.gamificationInstance.getSetting("reflectiveEssence"), + "Amplification Crystal": this.gamificationInstance.getSetting("amplificationCrystal"), + "Creative Catalyst": this.gamificationInstance.getSetting("creativeCatalyst"), + "Precision Lens": this.gamificationInstance.getSetting("precisionLens") + }; + } + } + createCraftingLayout() { + const container = document.createElement("div"); + container.className = "modal-crafting-container"; + const stockContainer = document.createElement("div"); + stockContainer.className = "stock-container"; + craftingItems.forEach((recipe) => { + if (this.boosterAvailableForUse(recipe.name)) { + const itemContainer = document.createElement("div"); + itemContainer.className = "crafting-item-container"; + const button = document.createElement("button"); + button.innerText = "Craft"; + button.onclick = () => this.craftBoosterItem(recipe); + const useInfoButton = document.createElement("button"); + useInfoButton.innerText = "?"; + useInfoButton.onclick = () => { + new ModalInformationbox(this.app, this.getBoosterInforFromFromName(recipe.name)).open(); + }; + const itemText = document.createElement("span"); + itemText.innerText = `${recipe.name} \u21D2 ${recipe.incredients.join(" ")}`; + itemContainer.appendChild(button); + itemContainer.appendChild(useInfoButton); + itemContainer.appendChild(itemText); + container.appendChild(itemContainer); } }); - this.addCommand({ - id: "change-progressive-formatting", - name: "toggle progressive summarization formatting", - callback: async () => { - await replaceFormatStrings(this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); - } + const stockInfo = document.createElement("div"); + stockInfo.className = "stock-info"; + listOfUseableIngredientsToBeShown.forEach((element) => { + stockInfo.innerHTML += `${this.getIngerementFromName(element).shortName} [${this.remainingStock[this.getIngerementFromName(element).name] || 0}]      `; }); + stockContainer.appendChild(stockInfo); + container.appendChild(stockContainer); + return container; } - async resetGame() { - await this.removeKeysFromFrontmatter(); - this.settings.statusLevel = 1; - this.settings.statusPoints = 0; - this.settings.xpForNextLevel = 1e3; - this.settings.badgeBoosterState = false; - this.settings.badgeBoosterFactor = 1; - await this.saveData(this.settings); - await this.giveStatusPoints(0); - await this.updateStatusBar(this.statusbarGamification); - new ModalInformationbox(this.app, `Game is now reseted. Please delete the Profile Page: "${this.settings.avatarPageName}.md" manually.`).open(); - } - async initializeGame(statusbarGamification) { - this.settings.gamificationStartDate = format(new Date(), "yyyy-MM-dd"); - await this.saveSettings(); - const { vault } = this.app; - await createAvatarFile(this.app, this.settings.avatarPageName); - const chartString = await this.createChart(vault); - await replaceChartContent(this.settings.avatarPageName, chartString); - await this.openAvatarFile(); - const fileCountMap = await getFileMap(this.app, this.settings.tagsExclude, this.settings.folderExclude); - console.log(`fileCountMap loaded. Number of files: ${fileCountMap.length}`); - let pointsReceived = 0; - for (const fileName of fileCountMap) { - const file = fileName; - const fileContents = await app.vault.read(file); - const activeView = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); - if (activeView && activeView.file && activeView.file.path === file.path) { - console.warn(`File ${file.path} is currently open. Skipping.`); - continue; - } - const fileLength = countCharactersInActiveFile(fileContents, fileName.basename); - const rateFileLength = rateNoteLength(fileLength); - const { - charCount, - highlightedCount, - boldCount - } = countLayer2AndLayer3Characters(fileContents, fileName.basename, this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); - const rateProgressiveSum = rateProgressiveSummarization(charCount, highlightedCount, boldCount); - const fileNameRate = rateLengthFilename(file.name); - const inlinkNumber = count_inlinks(file); - const inlinkClass = rateInlinks(inlinkNumber); - const rateOut = rateOutlinks(getNumberOfOutlinks(file)); - const noteMajurity = rateLevelOfMaturity(rateFileLength, fileNameRate, inlinkClass, rateOut, rateProgressiveSum); - console.log(`Processing file ${fileName.basename} in path ${fileName.path}`); - try { - await this.app.fileManager.processFrontMatter(file, (frontmatter) => { - if (rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity) >= 1) { - pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity); - this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("frontmatter['note-maturity']", noteMajurity)); - } else if (!("note-maturity" in frontmatter)) { - pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity); - this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity)); - } - if (rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate) >= 1 && "title-class" in frontmatter) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate)); - } else if (!("title-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate)); - } - if (rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength)); - } else if (!("note-length-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength)); - } - if (rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass)); - } else if (!("inlink-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass)); - } - if (rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut)); - } else if (!("outlink-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateOut); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateOut)); - } - if (rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum)); - } else if (!("progressive-summarization-maturity" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); - this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateProgressiveSum)); - } - this.writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity); - }); - } catch (e2) { - if ((e2 == null ? void 0 : e2.name) === "YAMLParseError") { - const errorMessage = `Update majuritys failed Malformed frontamtter on this file : ${file.path} ${e2.message}`; - new import_obsidian2.Notice(errorMessage, 4e3); - console.error(errorMessage); - } - } - } - if (pointsReceived > 0) { - let boosterFactor = 1; - if (this.settings.badgeBoosterState) { - boosterFactor = this.settings.badgeBoosterFactor; - } - new import_obsidian2.Notice(`${pointsReceived * boosterFactor} Points received`); - console.log(`${pointsReceived * boosterFactor} Points received`); - } - setTimeout(async () => { - const initBadge = getBadgeForInitLevel(this.settings.statusLevel); - new import_obsidian2.Notice(`You've earned the "${initBadge.name}" badge. ${initBadge.description}`); - console.log(`You earned ${initBadge.name} - ${initBadge.description}`); - await this.giveInitBadgeInProfile(this.settings.avatarPageName, initBadge); - await this.removeBadgesWhenInitLevelHigher(this.settings.avatarPageName, this.settings.statusLevel); - await this.boosterForInit(); - await this.updateStatusBar(statusbarGamification); - }, 2e3); - new ModalInformationbox(this.app, `Finallized gamification initialistation! -Congratulation, you earned ${pointsReceived} Points! - -Check the Profile Page: "${this.settings.avatarPageName}.md" - -You received an initialisation Booster aktiv for your first level ups. Game on!`).open(); - } - writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity) { - frontmatter["title-class"] = rateDirection(frontmatter["title-class"], fileNameRate); - frontmatter["note-length-class"] = rateDirection(frontmatter["note-length-class"], rateFileLength); - frontmatter["inlink-class"] = rateDirection(frontmatter["inlink-class"], inlinkClass); - frontmatter["outlink-class"] = rateDirection(frontmatter["outlink-class"], rateOut); - frontmatter["progressive-summarization-maturity"] = rateDirection(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); - frontmatter["note-maturity"] = rateDirection(frontmatter["note-maturity"], noteMajurity); - } - onunload() { - console.log("obsidian-pkm-gamification unloaded!"); - if (this.timerId !== null) { - clearInterval(this.timerId); - this.timerId = null; - } - } - async calculateNoteMajurity() { - var _a; - const file = this.app.workspace.getActiveFile(); - if (file == null) { - console.error("got no file, propably none is active"); - } - let detectIfNoteIsFirstTimeRated = false; - const activeView = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); - const fileContents = activeView == null ? void 0 : activeView.editor.getValue(); - const fileName = activeView == null ? void 0 : activeView.file.basename; - let rateFileLength = 0; - let fileLength = 0; - let rateProgressiveSum = 0; - if (fileContents !== void 0 && fileName !== void 0) { - fileLength = countCharactersInActiveFile(fileContents, fileName); - rateFileLength = rateNoteLength(fileLength); - if (fileContents !== null && fileName !== null) { - const { charCount, highlightedCount, boldCount } = countLayer2AndLayer3Characters(fileContents, fileName, this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); - rateProgressiveSum = rateProgressiveSummarization(charCount, highlightedCount, boldCount); - } - } - let fileNameRate = 0; - let inlinkNumber = 0; - let inlinkClass = 0; - let rateOut = 0; - if (file !== null) { - fileNameRate = rateLengthFilename((_a = file.name) != null ? _a : ""); - inlinkNumber = count_inlinks(file); - inlinkClass = rateInlinks(inlinkNumber); - rateOut = rateOutlinks(getNumberOfOutlinks(file)); - const noteMajurity = rateLevelOfMaturity(rateFileLength, fileNameRate, inlinkClass, rateOut, rateProgressiveSum); - try { - await this.app.fileManager.processFrontMatter(file, (frontmatter) => { - if (frontmatter) { - let pointsReceived = 0; - if (rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity) >= 1) { - console.log(`note-maturity >=1`); - pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity); - const newLevel = this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("frontmatter['note-maturity']", noteMajurity)); - this.decisionIfBadge(newLevel); - } else if (!("note-maturity" in frontmatter)) { - pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity); - const newLevel = this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity)); - this.decisionIfBadge(newLevel); - detectIfNoteIsFirstTimeRated = true; - } - if (rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate) >= 1 && "title-class" in frontmatter) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate)); - this.decisionIfBadge(newLevel); - } else if (!("title-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate)); - this.decisionIfBadge(newLevel); - } - if (rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength)); - this.decisionIfBadge(newLevel); - } else if (!("note-length-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength)); - this.decisionIfBadge(newLevel); - } - if (rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass)); - this.decisionIfBadge(newLevel); - } else if (!("inlink-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass)); - this.decisionIfBadge(newLevel); - } - if (rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut)); - this.decisionIfBadge(newLevel); - } else if (!("outlink-class" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateOut); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateOut)); - this.decisionIfBadge(newLevel); - } - if (rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum) >= 1) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum)); - this.decisionIfBadge(newLevel); - } else if (!("progressive-summarization-maturity" in frontmatter)) { - pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); - const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateProgressiveSum)); - this.decisionIfBadge(newLevel); - } - console.log(`pointsReceived: ${pointsReceived}`); - if (pointsReceived > 0) { - const messagePoints = getRandomMessagePoints(pointsReceived * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); - new import_obsidian2.Notice(messagePoints); - console.log(messagePoints); - } - this.writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity); - } - }); - } catch (e2) { - if ((e2 == null ? void 0 : e2.name) === "YAMLParseError") { - const errorMessage = `Update majuritys failed Malformed frontamtter on this file : ${file.path} ${e2.message}`; - new import_obsidian2.Notice(errorMessage, 4e3); - console.error(errorMessage); - } - } - new import_obsidian2.Notice("note majurity updated!"); - console.log("note majurity updated!"); - await this.updateStatusBar(this.statusbarGamification); - } else { - console.error("file was not found to calculate majurities. Make sure one is active."); - } - if (detectIfNoteIsFirstTimeRated) { - await this.increaseDailyCreatedNoteCount(); - await this.increaseWeeklyCreatedNoteCount(); - } - } - async resetDailyGoals() { - let reset = false; - if (!isSameDay(window.moment(this.settings.dailyNoteCreationDate, "DD.MM.YYYY"))) { - this.settings.dailyNoteCreationTask = 0; - this.settings.dailyNoteCreationDate = window.moment().format("DD.MM.YYYY"); - await this.saveSettings(); - console.log(`daily Challenge reseted`); - reset = true; - } - if (!isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY")) && !isSameDay(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { - const daysPassed = window.moment().diff(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"), "days") - 1; - this.settings.weeklyNoteCreationTask = 0; - this.settings.weeklyNoteCreationDate = window.moment().subtract(1, "day").format("DD.MM.YYYY"); - this.decreaseStreakbooster(daysPassed); - console.log(`${daysPassed} days passed`); - await this.saveSettings(); - await this.updateStatusBar(this.statusbarGamification); - console.log(`weekly Challenge reseted`); - reset = true; - } - if (isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY")) && this.settings.weeklyNoteCreationTask == 7) { - this.settings.weeklyNoteCreationTask = 0; - this.settings.weeklyNoteCreationDate = window.moment().subtract(1, "day").format("DD.MM.YYYY"); - await this.saveSettings(); - reset = true; - } - if (reset) { - await this.updateAvatarPage(this.settings.avatarPageName); - } - if (this.settings.boosterFactorPerpetualProgress == true && isMinutesPassed(window.moment(this.settings.boosterDatePerpetualProgress, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("perpetualProgress"))) { - this.setSettingBoolean("boosterFactorPerpetualProgress", false); - console.log('"Perpetual Progress" has ended.'); - } - if (this.settings.boosterFactorStrategicSynapses == true && isMinutesPassed(window.moment(this.settings.boosterDateStrategicSynapses, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("strategicSynapses"))) { - this.setSettingBoolean("boosterFactorStrategicSynapses", false); - console.log('"Strategic Synapses" has ended.'); - } - if (this.settings.boosterFactorLinkersLode == true && isMinutesPassed(window.moment(this.settings.boosterDateLinkersLode, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("linkersLode"))) { - this.setSettingBoolean("boosterFactorLinkersLode", false); - console.log('"Linkers Lode" has ended.'); - } - if (this.settings.boosterFactorRecursiveReflection == true && isMinutesPassed(window.moment(this.settings.boosterDateRecursiveReflection, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("recursiveReflection"))) { - this.setSettingBoolean("boosterFactorRecursiveReflection", false); - console.log('"Recursive Reflection" has ended.'); - } - if (this.settings.boosterFactorSynapticSurge == true && isMinutesPassed(window.moment(this.settings.boosterDateSynapticSurge, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("synapticSurge"))) { - this.setSettingBoolean("boosterFactorSynapticSurge", false); - console.log('"Synaptic Surge" has ended.'); - } - if (this.settings.boosterFactorTitleTitan == true && isMinutesPassed(window.moment(this.settings.boosterDateTitleTitan, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("titleTitan"))) { - this.setSettingBoolean("boosterFactorTitleTitan", false); - console.log('"Title Titan" has ended.'); - } - if (this.settings.boosterFactorPrecisionPrism == true && isMinutesPassed(window.moment(this.settings.boosterDatePrecisionPrism, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("precisionPrism"))) { - this.setSettingBoolean("boosterFactorPrecisionPrism", false); - console.log('"Precision Prism" has ended.'); - } - if (this.settings.boosterFactorHyperlinkHarmony == true && isMinutesPassed(window.moment(this.settings.boosterDateHyperlinkHarmony, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("hyperlinkHarmony"))) { - this.setSettingBoolean("boosterFactorHyperlinkHarmony", false); - console.log('"Hyperlink Harmony" has ended.'); - } - if (this.settings.boosterFactorEphemeralEuphoria == true && isMinutesPassed(window.moment(this.settings.boosterDateEphemeralEuphoria, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("ephemeralEuphoria"))) { - this.setSettingBoolean("boosterFactorEphemeralEuphoria", false); - console.log('"Ephemeral Euphoria" has ended.'); - } - } - async increaseDailyCreatedNoteCount() { - let newDailyNoteCreationTask = this.settings.dailyNoteCreationTask; - if (newDailyNoteCreationTask < 2) { - newDailyNoteCreationTask++; - this.settings.dailyNoteCreationTask = newDailyNoteCreationTask; - await this.saveSettings(); - if (newDailyNoteCreationTask == 1) { - await this.updateAvatarPage(this.settings.avatarPageName); - console.log(`${newDailyNoteCreationTask}/2 Notes created today.`); - } else if (newDailyNoteCreationTask == 2) { - this.increaseStreakbooster(streakboosterIncreaseDaily); - await this.saveSettings(); - await this.updateStatusBar(this.statusbarGamification); - await this.giveStatusPoints(pointsForDailyChallenge); - const message = getRandomMessageTwoNoteChallenge(pointsForDailyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); - console.log(`daily Challenge reached! ${newDailyNoteCreationTask}/2 created.`); - new import_obsidian2.Notice(message); - console.log(message); - } else { - console.log(`${newDailyNoteCreationTask}/2 Notes created today.`); - } - } - } - async increaseWeeklyCreatedNoteCount() { - if (isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { - await this.checkForWeeklyNoteChallengeBelow7(); - } else if (isSameDay(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { - console.log(`daily note creation was rated already today.`); + createBoosterList(labelText) { + const container = document.createElement("div"); + container.className = "modal-checkbox-container"; + const stock = this.boosters[labelText]; + const label = document.createElement("div"); + label.className = `${labelText.replace(" ", "-")}`; + const useButton = document.createElement("button"); + const momentDate = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); + if (isMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText)) == false) { + console.log(`Booster ${labelText} is still in cooldown for ${window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText) / 60} hours`); + label.innerHTML = `${labelText} : (${stock})`; + useButton.innerText = `cooldown ${hoursUntilMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText))} hours`; + useButton.id = `use-button-${labelText.replace(" ", "-")}`; + useButton.onclick = () => { + new ModalInformationbox(this.app, `${labelText} is for ${hoursUntilMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText))} hours in cooldown and can only then be used again.`).open(); + }; } else { - this.settings.weeklyNoteCreationDate = window.moment().format("DD.MM.YYYY"); - this.settings.weeklyNoteCreationTask = 1; - await this.saveSettings(); + label.innerHTML = `${labelText} : (${stock})`; + useButton.innerText = "Use"; + useButton.id = `use-button-${labelText.replace(" ", "-")}`; + useButton.onclick = () => { + this.useBoosterItem(labelText); + }; } + const useInfoButton = document.createElement("button"); + useInfoButton.innerText = "?"; + useInfoButton.id = `information-${labelText.replace(" ", "-")}`; + useInfoButton.onclick = () => { + new ModalInformationbox(this.app, this.getBoosterInforFromFromName(labelText)).open(); + }; + container.appendChild(useButton); + container.appendChild(useInfoButton); + container.appendChild(label); + return container; } - async checkForWeeklyNoteChallengeBelow7() { - let currentWeeklyCreatedNotes = this.settings.weeklyNoteCreationTask; - if (currentWeeklyCreatedNotes < 7) { - currentWeeklyCreatedNotes++; - this.settings.weeklyNoteCreationDate = window.moment().format("DD.MM.YYYY"); - this.settings.weeklyNoteCreationTask = currentWeeklyCreatedNotes; - await this.saveSettings(); - await this.checkForWeeklyNoteChallengeEvaluation(currentWeeklyCreatedNotes); + incrementItem(item) { + const stock = this.remainingStock[item]; + console.log(`incrementItem: stock = ${stock}`); + if (stock > 0) { + this.selectedItems.push(item); + this.remainingStock[item]--; + this.updateQuantityDisplay(item); } - } - async checkForWeeklyNoteChallengeEvaluation(newWeeklyNoteCreationTask) { - if (newWeeklyNoteCreationTask <= 6) { - await this.updateAvatarPage(this.settings.avatarPageName); - console.log(`${newWeeklyNoteCreationTask}/7 Notes created in a chain.`); - } else if (newWeeklyNoteCreationTask == 7) { - this.increaseStreakbooster(streakboosterIncreaseWeekly); - await this.saveSettings(); - await this.giveStatusPoints(pointsForWeeklyChallenge); - console.log(`Weekly Challenge reached! ${newWeeklyNoteCreationTask}/7 created in a chain.`); - const message = getRandomMessageWeeklyChallenge(pointsForWeeklyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); - new import_obsidian2.Notice(message); - console.log(message); - } else { - console.log(`${newWeeklyNoteCreationTask}/7 Notes created in a chain.`); + if (this.boosters[item] !== void 0) { + this.boosters[item]--; + this.updateQuantityDisplay(item); } } - async updateStatusBar(statusbar) { - const currentLevel = getLevelForPoints(this.settings.statusPoints); - const progressbarPercent = (this.settings.statusPoints - currentLevel.points) / (currentLevel.pointsNext - currentLevel.points) * 100; - const charNumProgressbar = 10; - const barLength = Math.round(progressbarPercent / charNumProgressbar); - const boosterFactor = this.settings.streakbooster; - statusbar.setText(`\u{1F3B2}|lvl: ${this.settings.statusLevel} | ${this.createProgressbar(charNumProgressbar, barLength)}|\u{1F680}${boosterFactor}${this.rateBoosterDirection()}`); - } - rateBoosterDirection() { - let direction = "\u2B06\uFE0F"; - if (this.settings.streakboosterDate) { - direction = "\u2B06\uFE0F"; - } else { - direction = "\u2B07\uFE0F"; + decrementItem(item) { + const itemIndex = this.selectedItems.indexOf(item); + if (itemIndex > -1) { + this.selectedItems.splice(itemIndex, 1); + this.remainingStock[item]++; + this.updateQuantityDisplay(item); } - return direction; - } - createProgressbar(charNumProgressbar, barLength) { - let progressbar = ""; - for (let i2 = 1; i2 <= charNumProgressbar; i2++) { - if (i2 <= barLength) { - progressbar += "="; - } else { - progressbar += "-"; - } + if (this.boosters[item] !== void 0) { + this.boosters[item]++; + this.updateQuantityDisplay(item); } - return progressbar; - } - async loadSettings() { - this.settings = Object.assign({}, defaultSettings, await this.loadData()); - console.log("loadSettings()"); } - async saveSettings() { - await this.saveData(this.settings); + useBoosterItem(labelText) { + console.log(`use Booster ${labelText}`); + this.decrementBooster(labelText, 1); } - async giveStatusPoints(pointsToAdd) { - let boosterFactor = 1; - let streakbooster = this.settings.streakbooster; - let boosterFactorPerpetualProgress = 0; - let boosterFactorStrategicSynapses = 0; - let boosterFactorLinkersLode = 0; - let boosterFactorRecursiveReflection = 0; - let boosterFactorSynapticSurge = 0; - let boosterFactorTitleTitan = 0; - let boosterFactorPrecisionPrism = 0; - let boosterFactorHyperlinkHarmony = 0; - let boosterFactorEphemeralEuphoria = 0; - if (this.settings.badgeBoosterState) { - boosterFactor = this.settings.badgeBoosterFactor; - } - if (this.settings.boosterFactorPerpetualProgress) { - boosterFactorPerpetualProgress = 3; - } - if (this.settings.boosterFactorStrategicSynapses) { - boosterFactorStrategicSynapses = 3; - } - if (this.settings.boosterFactorLinkersLode) { - boosterFactorLinkersLode = 10; - } - if (this.settings.boosterFactorRecursiveReflection) { - boosterFactorRecursiveReflection = 5; - } - if (this.settings.boosterFactorSynapticSurge) { - boosterFactorSynapticSurge = 20; - } - if (this.settings.boosterFactorTitleTitan) { - boosterFactorTitleTitan = 4; - } - if (this.settings.boosterFactorPrecisionPrism) { - boosterFactorPrecisionPrism = 4; + updateQuantityDisplay(labelText) { + const stock = this.boosters[labelText]; + const stockInfo = document.querySelector(`.${labelText.replace(" ", "-")}`); + if (stockInfo) { + stockInfo.innerHTML = ""; + stockInfo.innerHTML = `${labelText} : (${stock})`; } - if (this.settings.boosterFactorHyperlinkHarmony) { - boosterFactorHyperlinkHarmony = 5; + const buttonUse = document.querySelector(`#use-button-${labelText.replace(" ", "-")}`); + const date = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); + const momentDate = window.moment(date, "YYYY-MM-DD HH:mm:ss"); + if (buttonUse && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText)) == false) { + buttonUse.setText(`cooldown ${hoursUntilMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText))} hours`); } - if (this.settings.boosterFactorEphemeralEuphoria) { - boosterFactorEphemeralEuphoria = 80; + } + checkIngredientsAvailability(incredients) { + for (const ingredient of incredients.incredients) { + const [quantity, shortName] = ingredient.split("x"); + const requiredQuantity = parseInt(quantity); + const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; + if (requiredQuantity > availableStock) { + return false; + } } - this.settings.statusPoints = pointsToAdd * (boosterFactor + streakbooster + boosterFactorPerpetualProgress + boosterFactorStrategicSynapses + boosterFactorLinkersLode + boosterFactorRecursiveReflection + boosterFactorSynapticSurge + boosterFactorTitleTitan + boosterFactorPrecisionPrism + boosterFactorHyperlinkHarmony + boosterFactorEphemeralEuphoria) + this.settings.statusPoints; - await this.saveData(this.settings); - return this.updateAvatarPage(this.settings.avatarPageName); + return true; } - async increaseStreakbooster(increaseValue) { - let newBoosterFakfor = parseFloat((this.settings.streakbooster + increaseValue).toFixed(streakboosterIncreaseWeekly)); - if (newBoosterFakfor > 80) { - newBoosterFakfor = 80; + useIngrediments(incredients) { + console.log(`useIngrediments: ${incredients}`); + for (const ingredient of incredients.incredients) { + const [quantity, shortName] = ingredient.split("x"); + console.log(`quantity: ${quantity} shortName: ${shortName}`); + const requiredQuantity = parseInt(quantity); + const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; + const ingrementName = this.getIngerementNameFromShortName(shortName) || ""; + console.log(`this.getIngerementNameFromShortName(shortName): ${this.getIngerementNameFromShortName(shortName)}`); + this.updateIncrementStock(ingrementName, availableStock - requiredQuantity); + console.log(`${incredients.name} ${availableStock - requiredQuantity}`); } - this.settings.streakbooster = newBoosterFakfor; - this.settings.streakboosterDate = true; - await this.saveData(this.settings); - console.log(`streakbooster: ${this.settings.streakbooster}`); + return true; } - async decreaseStreakbooster(decreaseValue) { - let newBoosterFakfor = parseFloat((this.settings.streakbooster - decreaseValue).toFixed(streakboosterDecrease)); - this.settings.streakbooster = newBoosterFakfor; - if (newBoosterFakfor < 0) { - newBoosterFakfor = 0; + updateStockInformation() { + const stockInfo = document.querySelector(".stock-info"); + if (stockInfo) { + stockInfo.innerHTML = ""; + elements.forEach((element) => { + stockInfo.innerHTML += `${element.shortName} [${this.remainingStock[element.name] || 0}]      `; + }); } - this.settings.streakbooster = newBoosterFakfor; - this.settings.streakboosterDate = false; - await this.saveData(this.settings); } - async updateAvatarPage(avatarPageName) { - const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); - if (existingFile == null) { - console.log(`File ${avatarPageName}.md does not exist`); - return false; + craftBoosterItem(selectedItems) { + if (this.checkIngredientsAvailability(selectedItems)) { + console.log(`craft booster ${selectedItems.name}`); + this.updateBoosterStock(selectedItems.name, 1); + this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(selectedItems.name), this.boosters[selectedItems.name]); + this.useIngrediments(selectedItems); + this.updateStockInformation(); + } else { + console.log(`not enough ingredients for booster ${selectedItems.name} in stock`); } - const file = existingFile; - const content = await app.vault.read(file); - let reference = null; - let reference2 = null; - let reference3 = null; - let reference4 = null; - let end = null; - let start = null; - let end2 = null; - let start2 = null; - let end3 = null; - let start3 = null; - let end4 = null; - let start4 = null; - const lines = content.split("\n"); - for (let i2 = 0; i2 < lines.length; i2++) { - const line = lines[i2].trim(); - if (line === "^levelAndPoints") { - if (reference === null) { - reference = i2; - } + } + getIngerementNameFromShortName(shortName) { + for (const element of elements) { + if (element.shortName === shortName) { + return element.name; } - if (line === "^dailyNotesChallenge") { - if (reference2 === null) { - reference2 = i2; - } + } + return null; + } + getIngerementShortNameFromName(name) { + for (const element of elements) { + if (element.name === name) { + return element.shortName; } - if (line === "^weeklyNotesChallenge") { - if (reference3 === null) { - reference3 = i2; - } + } + return null; + } + getIngerementFromName(name) { + for (const element of elements) { + if (element.name === name) { + return element; } - if (line === "^boosterFactor") { - if (reference4 === null) { - reference4 = i2; - } + } + return { shortName: "", name: "", varName: "" }; + } + getIngerementVarNameFromShortName(shortName) { + for (const element of elements) { + if (element.shortName === shortName) { + return element.varName; } } - const newPoints = this.settings.statusPoints; - const level = getLevelForPoints(newPoints); - let nextLevelAt = this.settings.xpForNextLevel; - let receiveBadge = false; - if (this.settings.statusLevel < level.level) { - new import_obsidian2.Notice(`With ${newPoints} points, the current level is ${level.level}.`); - receiveBadge = checkIfReceiveABadge(this.settings.statusLevel, level.level); - this.settings.statusLevel = level.level; - nextLevelAt = level.pointsNext; - this.settings.xpForNextLevel = level.pointsNext; - await this.saveData(this.settings); + return null; + } + getIngerementVarNameFromName(name) { + for (const element of elements) { + if (element.name === name) { + return element.varName; + } } - const progressBarEnd = nextLevelAt - newPoints; - const newPointsString = "| **Level** | **" + level.level + "** |\n| Points | " + newPoints + " |\n^levelAndPoints\n```chart\ntype: bar\nlabels: [Expririence]\nseries:\n - title: points reached\n data: [" + newPoints + "]\n - title: points to earn to level up\n data: [" + progressBarEnd + "]\nxMin: " + level.points + "\nxMax: " + level.pointsNext + '\ntension: 0.2\nwidth: 40%\nlabelColors: false\nfill: false\nbeginAtZero: false\nbestFit: false\nbestFitTitle: undefined\nbestFitNumber: 0\nstacked: true\nindexAxis: y\nxTitle: "progress"\nlegend: false\n```'; - const dailyChallenge = "| **daily Notes** | *" + pointsForDailyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster) + "EP* | **" + this.settings.dailyNoteCreationTask + "/2** |"; - const daysLeftInWeeklyChain = 7 - this.settings.weeklyNoteCreationTask; - const weeklyChallenge = "| **weekly Notes** | *" + pointsForWeeklyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster) + "EP* | **" + this.settings.weeklyNoteCreationTask + "/7** |\n^weeklyNotesChallenge\n```chart\ntype: bar\nlabels: [days done in a row]\nseries:\n - title: days to do in a row\n data: [" + this.settings.weeklyNoteCreationTask + "]\n - title: points to earn to level up\n data: [" + daysLeftInWeeklyChain + ']\nxMin: 0\nxMax: 7\ntension: 0.2\nwidth: 40%\nlabelColors: false\nfill: false\nbeginAtZero: false\nbestFit: false\nbestFitTitle: undefined\nbestFitNumber: 0\nstacked: true\nindexAxis: y\nxTitle: "progress"\nlegend: false\n```'; - const boosterFactor = "| **booster factor** | **" + this.settings.streakbooster + "** |"; - if (reference != null && reference2 != null && reference3 != null && reference4 != null) { - start = reference - 2; - end = reference + 24; - start2 = reference2 - 1 - 25; - end2 = reference2 - 25; - start3 = reference3 - 1 - 25; - end3 = reference3 + 24 - 25; - start4 = reference4 - 1 - 25; - end4 = reference4 - 25; - const newLines = [...lines.slice(0, start), newPointsString, ...lines.slice(end)]; - const newLines2 = [...newLines.slice(0, start2), dailyChallenge, ...newLines.slice(end2)]; - const newLines3 = [...newLines2.slice(0, start3), weeklyChallenge, ...newLines2.slice(end3)]; - const newLines4 = [...newLines3.slice(0, start4), boosterFactor, ...newLines3.slice(end4)]; - await app.vault.modify(file, newLines4.join("\n")); + return null; + } + getBoosterVarNameFromName(boosterName) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.varname; + } } - return receiveBadge; + return ""; } - async giveBadgeInProfile(avatarPageName, badge) { - const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); - if (existingFile == null) { - console.log(`File ${avatarPageName}.md does not exist`); - return; + getBoosterInforFromFromName(boosterName) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.description; + } } - const file = existingFile; - const content = await app.vault.read(file); - let reference = null; - let reference2 = null; - let end = null; - let start = null; - let end2 = null; - let start2 = null; - const lines = content.split("\n"); - for (let i2 = 0; i2 < lines.length; i2++) { - const line = lines[i2].trim(); - if (line === "#### achieved") { - if (reference === null) { - reference = i2; - } + return ""; + } + getBoosterSwitchFromName(boosterName) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterSwitch; } - if (line === badge.level + ": *" + badge.name + "*") { - if (reference2 === null) { - reference2 = i2; - } + } + return ""; + } + getBoosterDateFromName(boosterName) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterDate; } } - if (reference != null && reference2 != null) { - end = reference + 1; - start = reference + 1; - end2 = reference2 + 2; - start2 = reference2 + 1; - const badgeString = "**" + badge.name + "** " + badge.level + "\n> " + badge.description + " - *" + window.moment().format("D.M.YY") + "*\n"; - const newLines = [...lines.slice(0, start), badgeString, ...lines.slice(end)]; - const newLines2 = [...newLines.slice(0, start2), ...newLines.slice(end2)]; - await app.vault.modify(file, newLines2.join("\n")); - console.log(`badgeString: ${badgeString}`); + return ""; + } + getBoosterCooldownFromName(boosterName) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterCooldown; + } } + return 0; } - async giveInitBadgeInProfile(avatarPageName, badge) { - const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); - if (existingFile == null) { - console.log(`File ${avatarPageName}.md does not exist`); - return; +}; + +// src/ModalBooster.ts +var ModalBooster = class extends import_obsidian4.Modal { + constructor(app2, displayText, gamificationInstance) { + super(app2); + this.displayText = displayText; + this.gamificationInstance = gamificationInstance; + } + onOpen() { + const { contentEl } = this; + contentEl.setText(this.displayText); + const multiSelectModal = new MultiSelectModal(this.app, [], "Craft Booster Item", this.gamificationInstance); + const button = document.createElement("button"); + button.innerText = "Open Crafting Table"; + button.onclick = () => { + multiSelectModal.setUseBooster(false); + multiSelectModal.open(); + }; + multiSelectModal.readBoostersStock(); + multiSelectModal.readIngrementStock(); + const button2 = document.createElement("button"); + button2.innerText = "Open Booster Board"; + button2.onclick = () => { + multiSelectModal.setUseBooster(true); + multiSelectModal.open(); + }; + contentEl.appendChild(button); + contentEl.appendChild(button2); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/main.ts +var style = document.createElement("style"); +style.textContent = ` + .modal-checkbox-container { + margin-bottom: 10px; + display: flex; + align-items: center; + } + + .modal-checkbox-container input[type="checkbox"] { + margin-right: 5px; + } +`; +document.head.append(style); +var gamification2 = class extends import_obsidian5.Plugin { + constructor() { + super(...arguments); + this.statusBarItem = this.addStatusBarItem(); + this.statusbarGamification = this.statusBarItem.createEl("span", { text: "" }); + } + getSetting(key) { + return this.settings[key] !== void 0 ? this.settings[key] : null; + } + setSetting(key, value) { + this.settings[key] = value; + this.saveSettings(); + } + setSettingBoolean(key, value) { + this.settings[key] = value; + this.saveSettings(); + } + setSettingString(key, value) { + this.settings[key] = value; + this.saveSettings(); + } + async onload() { + console.log("obsidian-pkm-gamification loaded!"); + await this.loadSettings(); + this.addSettingTab(new GamificationPluginSettings(this.app, this)); + setTimeout(async () => { + await this.resetDailyGoals(); + }, 2e3); + this.timerInterval = 30 * 60 * 1e3; + this.timerId = window.setInterval(this.resetDailyGoals.bind(this), this.timerInterval); + await this.updateStatusBar(this.statusbarGamification); + if (this.settings.debug) { + this.addRibbonIcon("accessibility", "crafting", async () => { + this.acquireIngredients(); + }); } - const file = existingFile; - const content = await app.vault.read(file); - let reference = null; - let end = null; - let start = null; - const lines = content.split("\n"); - for (let i2 = 0; i2 < lines.length; i2++) { - const line = lines[i2].trim(); - if (line === "#### achieved") { - if (reference === null) { - reference = i2; - } + this.addRibbonIcon("test-tube-2", "Boosters", async () => { + new ModalBooster(this.app, ` `, this).open(); + }); + this.addRibbonIcon("sprout", "Calculate Note Maturity", async () => { + await this.calculateNoteMajurity(); + }); + this.addCommand({ + id: "boosters", + name: "open booter pallete", + callback: async () => { + new ModalBooster(this.app, ` `, this).open(); } + }); + if (this.settings.enableInitCommand) { + this.addCommand({ + id: "init-rate-gamification", + name: "Initialize gamification ratings", + callback: async () => { + await this.initializeGame(this.statusbarGamification); + } + }); } - if (reference != null) { - end = reference + 2; - start = reference + 1; - const badgeString = "**" + badge.name + "**\n> " + badge.description + " - *" + window.moment().format("D.M.YY") + "*\n"; - const newLines = [...lines.slice(0, start), badgeString, ...lines.slice(end)]; - await app.vault.modify(file, newLines.join("\n")); - console.log(`badgeString: ${badgeString}`); - } - } - async removeBadgesWhenInitLevelHigher(avatarPageName, level) { - const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); - if (existingFile == null) { - console.log(`File ${avatarPageName}.md does not exist`); - return; + if (this.settings.enableInitCommand) { + this.addCommand({ + id: "create-avatar-page", + name: "create profile page", + callback: async () => { + const { vault } = this.app; + await createAvatarFile(this.app, this.settings.avatarPageName); + const chartString = await this.createChart(vault); + await replaceChartContent(this.settings.avatarPageName, chartString); + } + }); } - const file = existingFile; - const content = await app.vault.read(file); - let reference = null; - let reference2 = null; - const lines = content.split("\n"); - for (let i2 = 0; i2 < lines.length; i2++) { - const line = lines[i2].trim(); - if (line === "#### outstanding") { - if (reference === null) { - reference = i2; + if (this.settings.enableInitCommand) { + this.addCommand({ + id: "reset-game", + name: "reset the game", + callback: async () => { + await this.resetGame(); } + }); + } + this.addCommand({ + id: "update-chart-avatarpage", + name: "update chart on profile page", + callback: async () => { + const { vault } = app; + const chartString = await this.createChart(vault); + await replaceChartContent(this.settings.avatarPageName, chartString); } - if (reference != null && reference2 == null) { - const levelRegex = /level (\d+)/; - const match2 = line.match(levelRegex); - if (match2) { - const levelNumber = parseInt(match2[1], 10); - if (levelNumber > level) { - reference2 = i2; + }); + this.addCommand({ + id: "rate-note-maturity", + name: "Rate note majurity", + callback: async () => { + await this.calculateNoteMajurity(); + } + }); + this.addCommand({ + id: "change-progressive-formatting", + name: "toggle progressive summarization formatting", + callback: async () => { + await replaceFormatStrings(this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); + } + }); + } + async resetGame() { + await this.removeKeysFromFrontmatter(); + this.settings.statusLevel = 1; + this.settings.statusPoints = 0; + this.settings.xpForNextLevel = 1e3; + this.settings.badgeBoosterState = false; + this.settings.badgeBoosterFactor = 1; + await this.saveData(this.settings); + await this.giveStatusPoints(0); + await this.updateStatusBar(this.statusbarGamification); + new ModalInformationbox(this.app, `Game is now reseted. Please delete the Profile Page: "${this.settings.avatarPageName}.md" manually.`).open(); + } + async initializeGame(statusbarGamification) { + this.settings.gamificationStartDate = format(new Date(), "yyyy-MM-dd"); + await this.saveSettings(); + const { vault } = this.app; + await createAvatarFile(this.app, this.settings.avatarPageName); + const chartString = await this.createChart(vault); + await replaceChartContent(this.settings.avatarPageName, chartString); + await this.openAvatarFile(); + const fileCountMap = await getFileMap(this.app, this.settings.tagsExclude, this.settings.folderExclude); + console.log(`fileCountMap loaded. Number of files: ${fileCountMap.length}`); + let pointsReceived = 0; + for (const fileName of fileCountMap) { + const file = fileName; + const fileContents = await app.vault.read(file); + const activeView = this.app.workspace.getActiveViewOfType(import_obsidian5.MarkdownView); + if (activeView && activeView.file && activeView.file.path === file.path) { + console.warn(`File ${file.path} is currently open. Skipping.`); + continue; + } + const fileLength = countCharactersInActiveFile(fileContents, fileName.basename); + const rateFileLength = rateNoteLength(fileLength); + const { + charCount, + highlightedCount, + boldCount + } = countLayer2AndLayer3Characters(fileContents, fileName.basename, this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); + const rateProgressiveSum = rateProgressiveSummarization(charCount, highlightedCount, boldCount); + const fileNameRate = rateLengthFilename(file.name); + const inlinkNumber = count_inlinks(file); + const inlinkClass = rateInlinks(inlinkNumber); + const rateOut = rateOutlinks(getNumberOfOutlinks(file)); + const noteMajurity = rateLevelOfMaturity(rateFileLength, fileNameRate, inlinkClass, rateOut, rateProgressiveSum); + console.log(`Processing file ${fileName.basename} in path ${fileName.path}`); + try { + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + if (rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity) >= 1) { + pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity); + this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("frontmatter['note-maturity']", noteMajurity)); + } else if (!("note-maturity" in frontmatter)) { + pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity); + this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity)); + } + if (rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate) >= 1 && "title-class" in frontmatter) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate)); + } else if (!("title-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate)); + } + if (rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength)); + } else if (!("note-length-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength)); + } + if (rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass)); + } else if (!("inlink-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass)); + } + if (rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut)); + } else if (!("outlink-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateOut); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateOut)); + } + if (rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum)); + } else if (!("progressive-summarization-maturity" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); + this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateProgressiveSum)); } + this.writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity); + }); + } catch (e2) { + if ((e2 == null ? void 0 : e2.name) === "YAMLParseError") { + const errorMessage = `Update majuritys failed Malformed frontamtter on this file : ${file.path} ${e2.message}`; + new import_obsidian5.Notice(errorMessage, 4e3); + console.error(errorMessage); } } } - if (reference != null && reference2 != null) { - const newLines = [...lines.slice(0, reference + 1), ...lines.slice(reference2)]; - await app.vault.modify(file, newLines.join("\n")); - } - } - async createChart(vault) { - const files = vault.getMarkdownFiles(); - const earliestFile = findEarliestModifiedFile(files); - const earliestDate = earliestFile.stat.mtime; - let monthCounter = 0; - let dateCount = new Date(earliestDate); - const fileDateMonthMapMod = /* @__PURE__ */ new Map(); - const monthcount = monthsBetween(new Date(earliestDate), new Date()); - let dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); - let yLabel = ""; - monthCounter = 0; - dateCount = new Date(earliestDate); - dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); - while (monthCounter < monthcount) { - dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); - yLabel = yLabel + dateString + ", "; - dateCount.setMonth(dateCount.getMonth() + 1); - monthCounter += 1; - fileDateMonthMapMod.set(dateString, 0); - } - yLabel = yLabel.slice(0, yLabel.length - 2); - const modificationDates = getModificationDates(files); - for (let i2 = 0; i2 < modificationDates.length; i2++) { - const formattedDate = format(modificationDates[i2], "M.yyyy"); - const currentCount = fileDateMonthMapMod.get(formattedDate); - if (currentCount !== void 0) { - fileDateMonthMapMod.set(formattedDate, currentCount + 1); - } else { - fileDateMonthMapMod.set(formattedDate, 1); + if (pointsReceived > 0) { + let boosterFactor = 1; + if (this.settings.badgeBoosterState) { + boosterFactor = this.settings.badgeBoosterFactor; } + new import_obsidian5.Notice(`${pointsReceived * boosterFactor} Points received`); + console.log(`${pointsReceived * boosterFactor} Points received`); } - let charStringModified = ""; - for (const [value] of fileDateMonthMapMod) { - charStringModified = charStringModified + value + ", "; - } - charStringModified = charStringModified.slice(0, charStringModified.length - 2); - return createChartFormat(yLabel, charStringModified, this.settings.chartReduzierungMonate); + setTimeout(async () => { + const initBadge = getBadgeForInitLevel(this.settings.statusLevel); + new import_obsidian5.Notice(`You've earned the "${initBadge.name}" badge. ${initBadge.description}`); + console.log(`You earned ${initBadge.name} - ${initBadge.description}`); + await this.giveInitBadgeInProfile(this.settings.avatarPageName, initBadge); + await this.removeBadgesWhenInitLevelHigher(this.settings.avatarPageName, this.settings.statusLevel); + await this.boosterForInit(); + await this.updateStatusBar(statusbarGamification); + }, 2e3); + new ModalInformationbox(this.app, `Finallized gamification initialistation! +Congratulation, you earned ${pointsReceived} Points! + +Check the Profile Page: "${this.settings.avatarPageName}.md" + +You received an initialisation Booster aktiv for your first level ups. Game on!`).open(); } - async decisionIfBadge(newLevel) { - newLevel.then((result) => { - if (result) { - const badge = getBadgeForLevel(this.settings.statusLevel, false); - new import_obsidian2.Notice(`You've earned the "${badge.name}" badge. ${badge.description}`); - console.log(`You've earned the "${badge.name}" badge. ${badge.description}`); - this.giveBadgeInProfile(this.settings.avatarPageName, badge); - this.settings.badgeBoosterState = false; - this.settings.badgeBoosterFactor = 1; - this.saveData(this.settings); - } - }); + writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity) { + frontmatter["title-class"] = rateDirection(frontmatter["title-class"], fileNameRate); + frontmatter["note-length-class"] = rateDirection(frontmatter["note-length-class"], rateFileLength); + frontmatter["inlink-class"] = rateDirection(frontmatter["inlink-class"], inlinkClass); + frontmatter["outlink-class"] = rateDirection(frontmatter["outlink-class"], rateOut); + frontmatter["progressive-summarization-maturity"] = rateDirection(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); + frontmatter["note-maturity"] = rateDirection(frontmatter["note-maturity"], noteMajurity); } - async removeKeysFromFrontmatter() { - const { vault } = this.app; - const fileCountMap = await getFileCountMap(this.app, this.settings.tagsExclude, this.settings.folderExclude); - for (const fileName of fileCountMap.keys()) { - const files = vault.getFiles(); - const file = files.find((file2) => file2.basename === fileName); - if (!file) { - console.warn(`File ${fileName} not found.`); - continue; + onunload() { + console.log("obsidian-pkm-gamification unloaded!"); + if (this.timerId !== null) { + clearInterval(this.timerId); + this.timerId = null; + } + } + async calculateNoteMajurity() { + var _a; + const file = this.app.workspace.getActiveFile(); + if (file == null) { + console.error("got no file, propably none is active"); + } + let detectIfNoteIsFirstTimeRated = false; + const activeView = this.app.workspace.getActiveViewOfType(import_obsidian5.MarkdownView); + const fileContents = activeView == null ? void 0 : activeView.editor.getValue(); + const fileName = activeView == null ? void 0 : activeView.file.basename; + let rateFileLength = 0; + let fileLength = 0; + let rateProgressiveSum = 0; + if (fileContents !== void 0 && fileName !== void 0) { + fileLength = countCharactersInActiveFile(fileContents, fileName); + rateFileLength = rateNoteLength(fileLength); + if (fileContents !== null && fileName !== null) { + const { charCount, highlightedCount, boldCount } = countLayer2AndLayer3Characters(fileContents, fileName, this.settings.progressiveSumLayer2, this.settings.progressiveSumLayer3); + rateProgressiveSum = rateProgressiveSummarization(charCount, highlightedCount, boldCount); } - console.log(`Processing file ${fileName}`); + } + let fileNameRate = 0; + let inlinkNumber = 0; + let inlinkClass = 0; + let rateOut = 0; + if (file !== null) { + fileNameRate = rateLengthFilename((_a = file.name) != null ? _a : ""); + inlinkNumber = count_inlinks(file); + inlinkClass = rateInlinks(inlinkNumber); + rateOut = rateOutlinks(getNumberOfOutlinks(file)); + const noteMajurity = rateLevelOfMaturity(rateFileLength, fileNameRate, inlinkClass, rateOut, rateProgressiveSum); try { await this.app.fileManager.processFrontMatter(file, (frontmatter) => { - delete frontmatter["title-class"]; - delete frontmatter["note-length-class"]; - delete frontmatter["inlink-class"]; - delete frontmatter["outlink-class"]; - delete frontmatter["progressive-summarization-maturity"]; - delete frontmatter["note-maturity"]; + if (frontmatter) { + let pointsReceived = 0; + if (rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity) >= 1) { + console.log(`note-maturity >=1`); + pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints(frontmatter["note-maturity"], noteMajurity); + const newLevel = this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("frontmatter['note-maturity']", noteMajurity)); + this.decisionIfBadge(newLevel); + } else if (!("note-maturity" in frontmatter)) { + pointsReceived += pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity); + const newLevel = this.giveStatusPoints(pointsNoteMajurity * rateDirectionForStatusPoints("0", noteMajurity)); + this.decisionIfBadge(newLevel); + detectIfNoteIsFirstTimeRated = true; + } + if (rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate) >= 1 && "title-class" in frontmatter) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["title-class"], fileNameRate)); + this.decisionIfBadge(newLevel); + } else if (!("title-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", fileNameRate)); + this.decisionIfBadge(newLevel); + } + if (rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["note-length-class"], rateFileLength)); + this.decisionIfBadge(newLevel); + } else if (!("note-length-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateFileLength)); + this.decisionIfBadge(newLevel); + } + if (rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["inlink-class"], inlinkClass)); + this.decisionIfBadge(newLevel); + } else if (!("inlink-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", inlinkClass)); + this.decisionIfBadge(newLevel); + } + if (rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["outlink-class"], rateOut)); + this.decisionIfBadge(newLevel); + } else if (!("outlink-class" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints("0", rateOut); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateOut)); + this.decisionIfBadge(newLevel); + } + if (rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum) >= 1) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum)); + this.decisionIfBadge(newLevel); + } else if (!("progressive-summarization-maturity" in frontmatter)) { + pointsReceived += pointsMajurity * rateDirectionForStatusPoints(frontmatter["progressive-summarization-maturity"], rateProgressiveSum); + const newLevel = this.giveStatusPoints(pointsMajurity * rateDirectionForStatusPoints("0", rateProgressiveSum)); + this.decisionIfBadge(newLevel); + } + console.log(`pointsReceived: ${pointsReceived}`); + if (pointsReceived > 0) { + const messagePoints = getRandomMessagePoints(pointsReceived * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); + new import_obsidian5.Notice(messagePoints); + console.log(messagePoints); + } + this.writeFrontmatter(frontmatter, fileNameRate, rateFileLength, inlinkClass, rateOut, rateProgressiveSum, noteMajurity); + } }); } catch (e2) { if ((e2 == null ? void 0 : e2.name) === "YAMLParseError") { - const errorMessage = `Update majuritys failed Malformed frontamtter ${e2.message}`; - new import_obsidian2.Notice(errorMessage, 4e3); + const errorMessage = `Update majuritys failed Malformed frontamtter on this file : ${file.path} ${e2.message}`; + new import_obsidian5.Notice(errorMessage, 4e3); console.error(errorMessage); } } + new import_obsidian5.Notice("note majurity updated!"); + console.log("note majurity updated!"); + await this.updateStatusBar(this.statusbarGamification); + } else { + console.error("file was not found to calculate majurities. Make sure one is active."); } - } - async whichLevelNextBadge(currentLevel) { - let nextBadgeLevel = 0; - for (let i2 = currentLevel; i2 < 110; i2++) { - const badge = getBadgeForLevel(i2, true); - const levelRegex = /level (\d+)/; - const match2 = badge.level.match(levelRegex); - if (match2) { - const levelNumber = parseInt(match2[1], 10); - if (levelNumber > currentLevel && nextBadgeLevel == 0) { - nextBadgeLevel = levelNumber; - } - } + if (detectIfNoteIsFirstTimeRated) { + await this.increaseDailyCreatedNoteCount(); + await this.increaseWeeklyCreatedNoteCount(); } - return nextBadgeLevel; - } - async boosterForInit() { - const nextBadgeAt = await this.whichLevelNextBadge(this.settings.statusLevel); - const statusPointsToReach = statusPointsForLevel(nextBadgeAt); - const boosterFactor = Math.round((statusPointsToReach - this.settings.statusPoints) / 50 / 300); - this.settings.badgeBoosterFactor = boosterFactor; - this.settings.badgeBoosterState = true; - await this.saveData(this.settings); - return boosterFactor; } - async openAvatarFile() { - var _a; - const existingFile = app.vault.getAbstractFileByPath(`${this.settings.avatarPageName}.md`); - if (existingFile) { - const sourcePath = ((_a = this.app.workspace.getActiveFile()) == null ? void 0 : _a.path) || ""; - await app.workspace.openLinkText(existingFile.path, sourcePath); - } else { - console.log("File not found or unable to open."); + async resetDailyGoals() { + let reset = false; + if (!isSameDay(window.moment(this.settings.dailyNoteCreationDate, "DD.MM.YYYY"))) { + this.settings.dailyNoteCreationTask = 0; + this.settings.dailyNoteCreationDate = window.moment().format("DD.MM.YYYY"); + await this.saveSettings(); + console.log(`daily Challenge reseted`); + reset = true; } - } - getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - async acquireIngredients() { - const chanceToEarnIngredient = 0.5; - if (Math.random() < chanceToEarnIngredient) { - const randomIngredientIndex = this.getRandomInt(0, 3); - const earnedIngredient = elements[randomIngredientIndex]; - let elementCount = this.getSetting(earnedIngredient.varName); - if (elementCount !== null && typeof elementCount === "number") { - this.setSetting(earnedIngredient.varName, elementCount + 1); - this.saveSettings(); - console.log(`You earned: ${earnedIngredient.name}`); - } else { - console.error(`Invalid element count for ${earnedIngredient.varName}`); - } - } else { - console.log("You did not earn an ingredient this time."); + if (!isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY")) && !isSameDay(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { + const daysPassed = window.moment().diff(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"), "days") - 1; + this.settings.weeklyNoteCreationTask = 0; + this.settings.weeklyNoteCreationDate = window.moment().subtract(1, "day").format("DD.MM.YYYY"); + this.decreaseStreakbooster(daysPassed); + console.log(`${daysPassed} days passed`); + await this.saveSettings(); + await this.updateStatusBar(this.statusbarGamification); + console.log(`weekly Challenge reseted`); + reset = true; } - } -}; -function getBoosterRunTimeFromVarName(boosterVarName) { - for (const element of boosterRecipes) { - if (element.varname === boosterVarName) { - return element.boosterRunTime; + if (isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY")) && this.settings.weeklyNoteCreationTask == 7) { + this.settings.weeklyNoteCreationTask = 0; + this.settings.weeklyNoteCreationDate = window.moment().subtract(1, "day").format("DD.MM.YYYY"); + await this.saveSettings(); + reset = true; } - } - return 0; -} -function isSameDay(inputDate) { - const currentDate = window.moment(); - return currentDate.isSame(inputDate, "day"); -} -function isOneDayBefore(inputDate) { - const oneDayBeforeCurrent = window.moment().subtract(1, "day"); - return inputDate.isSame(oneDayBeforeCurrent, "day"); -} -function isMinutesPassed(inputDate, minutesPassed) { - const minutesAgo = window.moment().subtract(minutesPassed, "minutes"); - return inputDate.isSameOrBefore(minutesAgo); -} -function hoursUntilMinutesPassed(inputDate, minutesToPass) { - const currentTime = window.moment(); - const targetTime = inputDate.clone().add(minutesToPass, "minutes"); - if (targetTime.isAfter(currentTime)) { - const hoursRemaining = targetTime.diff(currentTime, "hours"); - return hoursRemaining; - } else { - return 0; - } -} -async function createAvatarFile(app2, fileName) { - const existingFile = app2.vault.getAbstractFileByPath(`${fileName}.md`); - if (existingFile instanceof import_obsidian2.TFile) { - console.log(`File ${fileName}.md already exists`); - return; - } - await app2.vault.create(`${fileName}.md`, avatarInitContent); -} -var MultiSelectModal = class extends import_obsidian2.Modal { - constructor(app2, items, buttonText, gamificationInstance) { - super(app2); - this.selectedItems = []; - this.remainingStock = {}; - this.boosters = {}; - this.useBooster = false; - this.remainingBoosterStock = {}; - this.items = items; - this.buttonText = buttonText; - this.gamificationInstance = gamificationInstance; - } - onOpen() { - const { contentEl } = this; - contentEl.empty(); - if (this.useBooster) { - boosterRecipes.forEach((item) => { - if (this.boosterAvailableForUse(item.name)) { - const listItem = this.createItemContainer(item.name); - contentEl.appendChild(listItem); - } - }); - } else { - const listItem = this.createItemContainer(""); - contentEl.appendChild(listItem); + if (reset) { + await this.updateAvatarPage(this.settings.avatarPageName); + } + if (this.settings.boosterFactorPerpetualProgress == true && isMinutesPassed(window.moment(this.settings.boosterDatePerpetualProgress, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("perpetualProgress"))) { + this.setSettingBoolean("boosterFactorPerpetualProgress", false); + console.log('"Perpetual Progress" has ended.'); + } + if (this.settings.boosterFactorStrategicSynapses == true && isMinutesPassed(window.moment(this.settings.boosterDateStrategicSynapses, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("strategicSynapses"))) { + this.setSettingBoolean("boosterFactorStrategicSynapses", false); + console.log('"Strategic Synapses" has ended.'); + } + if (this.settings.boosterFactorLinkersLode == true && isMinutesPassed(window.moment(this.settings.boosterDateLinkersLode, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("linkersLode"))) { + this.setSettingBoolean("boosterFactorLinkersLode", false); + console.log('"Linkers Lode" has ended.'); + } + if (this.settings.boosterFactorRecursiveReflection == true && isMinutesPassed(window.moment(this.settings.boosterDateRecursiveReflection, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("recursiveReflection"))) { + this.setSettingBoolean("boosterFactorRecursiveReflection", false); + console.log('"Recursive Reflection" has ended.'); + } + if (this.settings.boosterFactorSynapticSurge == true && isMinutesPassed(window.moment(this.settings.boosterDateSynapticSurge, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("synapticSurge"))) { + this.setSettingBoolean("boosterFactorSynapticSurge", false); + console.log('"Synaptic Surge" has ended.'); + } + if (this.settings.boosterFactorTitleTitan == true && isMinutesPassed(window.moment(this.settings.boosterDateTitleTitan, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("titleTitan"))) { + this.setSettingBoolean("boosterFactorTitleTitan", false); + console.log('"Title Titan" has ended.'); + } + if (this.settings.boosterFactorPrecisionPrism == true && isMinutesPassed(window.moment(this.settings.boosterDatePrecisionPrism, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("precisionPrism"))) { + this.setSettingBoolean("boosterFactorPrecisionPrism", false); + console.log('"Precision Prism" has ended.'); + } + if (this.settings.boosterFactorHyperlinkHarmony == true && isMinutesPassed(window.moment(this.settings.boosterDateHyperlinkHarmony, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("hyperlinkHarmony"))) { + this.setSettingBoolean("boosterFactorHyperlinkHarmony", false); + console.log('"Hyperlink Harmony" has ended.'); + } + if (this.settings.boosterFactorEphemeralEuphoria == true && isMinutesPassed(window.moment(this.settings.boosterDateEphemeralEuphoria, "YYYY-MM-DD HH:mm:ss"), getBoosterRunTimeFromVarName("ephemeralEuphoria"))) { + this.setSettingBoolean("boosterFactorEphemeralEuphoria", false); + console.log('"Ephemeral Euphoria" has ended.'); } } - onClose() { - this.selectedItems = []; - } - boosterAvailableForUse(item) { - let found = false; - listOfUseableBoostersToBeShown.forEach((element) => { - if (item == element) { - if (!found) { - found = true; - } + async increaseDailyCreatedNoteCount() { + let newDailyNoteCreationTask = this.settings.dailyNoteCreationTask; + if (newDailyNoteCreationTask < 2) { + newDailyNoteCreationTask++; + this.settings.dailyNoteCreationTask = newDailyNoteCreationTask; + await this.saveSettings(); + if (newDailyNoteCreationTask == 1) { + await this.updateAvatarPage(this.settings.avatarPageName); + console.log(`${newDailyNoteCreationTask}/2 Notes created today.`); + } else if (newDailyNoteCreationTask == 2) { + this.increaseStreakbooster(streakboosterIncreaseDaily); + await this.saveSettings(); + await this.updateStatusBar(this.statusbarGamification); + await this.giveStatusPoints(pointsForDailyChallenge); + const message = getRandomMessageTwoNoteChallenge(pointsForDailyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); + console.log(`daily Challenge reached! ${newDailyNoteCreationTask}/2 created.`); + new import_obsidian5.Notice(message); + console.log(message); + } else { + console.log(`${newDailyNoteCreationTask}/2 Notes created today.`); } - }); - return found; - } - setUseBooster(useBooster) { - this.useBooster = useBooster; + } } - // Updated createItemContainer method - createItemContainer(labelText) { - if (this.useBooster) { - return this.createBoosterList(labelText); + async increaseWeeklyCreatedNoteCount() { + if (isOneDayBefore(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { + await this.checkForWeeklyNoteChallengeBelow7(); + } else if (isSameDay(window.moment(this.settings.weeklyNoteCreationDate, "DD.MM.YYYY"))) { + console.log(`daily note creation was rated already today.`); } else { - return this.createCraftingLayout(); + this.settings.weeklyNoteCreationDate = window.moment().format("DD.MM.YYYY"); + this.settings.weeklyNoteCreationTask = 1; + await this.saveSettings(); } } - updateIncrementStock(increment, stock) { - console.log(`updateIncrementStock: increment ${increment} stock ${stock}`); - this.remainingStock[increment] = stock; - this.gamificationInstance.setSetting(this.getIngerementVarNameFromName(increment) || "", stock); - } - updateBoosterStock(booster, stockIncrease) { - this.boosters[booster] += stockIncrease; - } - decrementBooster(booster, stockIncrease) { - const stock = this.boosters[booster]; - const momentDate = window.moment(booster, "YYYY-MM-DD HH:mm:ss"); - if (stock > 0 && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(booster))) { - this.boosters[booster] -= stockIncrease; - this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(booster), this.boosters[booster]); - this.gamificationInstance.setSettingBoolean(this.getBoosterSwitchFromName(booster), true); - this.gamificationInstance.setSettingString(this.getBoosterDateFromName(booster), window.moment().format("YYYY-MM-DD HH:mm:ss")); - this.updateQuantityDisplay(booster); + async checkForWeeklyNoteChallengeBelow7() { + let currentWeeklyCreatedNotes = this.settings.weeklyNoteCreationTask; + if (currentWeeklyCreatedNotes < 7) { + currentWeeklyCreatedNotes++; + this.settings.weeklyNoteCreationDate = window.moment().format("DD.MM.YYYY"); + this.settings.weeklyNoteCreationTask = currentWeeklyCreatedNotes; + await this.saveSettings(); + await this.checkForWeeklyNoteChallengeEvaluation(currentWeeklyCreatedNotes); } } - readBoostersStock() { - if (this.gamificationInstance) { - this.boosters = { - "Temporal Tweaker": this.gamificationInstance.getSetting("temporalTweaker"), - "Perpetual Progress": this.gamificationInstance.getSetting("perpetualProgress"), - "Strategic Synapses": this.gamificationInstance.getSetting("strategicSynapses"), - "Accelerated Acquisition": this.gamificationInstance.getSetting("acceleratedAcquisition"), - "Linkers Lode": this.gamificationInstance.getSetting("linkersLode"), - "Effortless Expansion": this.gamificationInstance.getSetting("effortlessExpansion"), - "Recursive Reflection": this.gamificationInstance.getSetting("recursiveReflection"), - "Synaptic Surge": this.gamificationInstance.getSetting("synapticSurge"), - "Inspiration Infusion": this.gamificationInstance.getSetting("inspirationInfusion"), - "Title Titan": this.gamificationInstance.getSetting("titleTitan"), - "Precision Prism": this.gamificationInstance.getSetting("precisionPrism"), - "Hyperlink Harmony": this.gamificationInstance.getSetting("hyperlinkHarmony") - }; + async checkForWeeklyNoteChallengeEvaluation(newWeeklyNoteCreationTask) { + if (newWeeklyNoteCreationTask <= 6) { + await this.updateAvatarPage(this.settings.avatarPageName); + console.log(`${newWeeklyNoteCreationTask}/7 Notes created in a chain.`); + } else if (newWeeklyNoteCreationTask == 7) { + this.increaseStreakbooster(streakboosterIncreaseWeekly); + await this.saveSettings(); + await this.giveStatusPoints(pointsForWeeklyChallenge); + console.log(`Weekly Challenge reached! ${newWeeklyNoteCreationTask}/7 created in a chain.`); + const message = getRandomMessageWeeklyChallenge(pointsForWeeklyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster)); + new import_obsidian5.Notice(message); + console.log(message); + } else { + console.log(`${newWeeklyNoteCreationTask}/7 Notes created in a chain.`); } } - readIngrementStock() { - if (this.gamificationInstance) { - this.remainingStock = { - "Nexus Node": this.gamificationInstance.getSetting("nexusNode"), - "Connection Crystal": this.gamificationInstance.getSetting("connectionCrystal"), - "Mastery Scroll": this.gamificationInstance.getSetting("masteryScroll"), - "Insight Prism": this.gamificationInstance.getSetting("insightPrism"), - "Reflective Essence": this.gamificationInstance.getSetting("reflectiveEssence"), - "Amplification Crystal": this.gamificationInstance.getSetting("amplificationCrystal"), - "Creative Catalyst": this.gamificationInstance.getSetting("creativeCatalyst"), - "Precision Lens": this.gamificationInstance.getSetting("precisionLens") - }; + async updateStatusBar(statusbar) { + const currentLevel = getLevelForPoints(this.settings.statusPoints); + const progressbarPercent = (this.settings.statusPoints - currentLevel.points) / (currentLevel.pointsNext - currentLevel.points) * 100; + const charNumProgressbar = 10; + const barLength = Math.round(progressbarPercent / charNumProgressbar); + const boosterFactor = this.settings.streakbooster; + statusbar.setText(`\u{1F3B2}|lvl: ${this.settings.statusLevel} | ${this.createProgressbar(charNumProgressbar, barLength)}|\u{1F680}${boosterFactor}${this.rateBoosterDirection()}`); + } + rateBoosterDirection() { + let direction = "\u2B06\uFE0F"; + if (this.settings.streakboosterDate) { + direction = "\u2B06\uFE0F"; + } else { + direction = "\u2B07\uFE0F"; } + return direction; } - createCraftingLayout() { - const container = document.createElement("div"); - container.className = "modal-crafting-container"; - const stockContainer = document.createElement("div"); - stockContainer.className = "stock-container"; - craftingItems.forEach((recipe) => { - if (this.boosterAvailableForUse(recipe.name)) { - const itemContainer = document.createElement("div"); - itemContainer.className = "crafting-item-container"; - const button = document.createElement("button"); - button.innerText = "Craft"; - button.onclick = () => this.craftBoosterItem(recipe); - const useInfoButton = document.createElement("button"); - useInfoButton.innerText = "?"; - useInfoButton.onclick = () => { - new ModalInformationbox(this.app, this.getBoosterInforFromFromName(recipe.name)).open(); - }; - const itemText = document.createElement("span"); - itemText.innerText = `${recipe.name} \u21D2 ${recipe.incredients.join(" ")}`; - itemContainer.appendChild(button); - itemContainer.appendChild(useInfoButton); - itemContainer.appendChild(itemText); - container.appendChild(itemContainer); + createProgressbar(charNumProgressbar, barLength) { + let progressbar = ""; + for (let i2 = 1; i2 <= charNumProgressbar; i2++) { + if (i2 <= barLength) { + progressbar += "="; + } else { + progressbar += "-"; } - }); - const stockInfo = document.createElement("div"); - stockInfo.className = "stock-info"; - listOfUseableIngredientsToBeShown.forEach((element) => { - stockInfo.innerHTML += `${this.getIngerementFromName(element).shortName} [${this.remainingStock[this.getIngerementFromName(element).name] || 0}]      `; - }); - stockContainer.appendChild(stockInfo); - container.appendChild(stockContainer); - return container; - } - createBoosterList(labelText) { - const container = document.createElement("div"); - container.className = "modal-checkbox-container"; - const stock = this.boosters[labelText]; - const label = document.createElement("div"); - label.className = `${labelText.replace(" ", "-")}`; - const useButton = document.createElement("button"); - const momentDate = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); - if (isMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText)) == false) { - console.log(`Booster ${labelText} is still in cooldown for ${window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText) / 60} hours`); - label.innerHTML = `${labelText} : (${stock})`; - useButton.innerText = `cooldown ${hoursUntilMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText))} hours`; - useButton.id = `use-button-${labelText.replace(" ", "-")}`; - useButton.onclick = () => { - new ModalInformationbox(this.app, `${labelText} is for ${hoursUntilMinutesPassed(window.moment(momentDate, "YYYY-MM-DD HH:mm:ss"), this.getBoosterCooldownFromName(labelText))} hours in cooldown and can only then be used again.`).open(); - }; - } else { - label.innerHTML = `${labelText} : (${stock})`; - useButton.innerText = "Use"; - useButton.id = `use-button-${labelText.replace(" ", "-")}`; - useButton.onclick = () => { - this.useBoosterItem(labelText); - }; } - const useInfoButton = document.createElement("button"); - useInfoButton.innerText = "?"; - useInfoButton.id = `information-${labelText.replace(" ", "-")}`; - useInfoButton.onclick = () => { - new ModalInformationbox(this.app, this.getBoosterInforFromFromName(labelText)).open(); - }; - container.appendChild(useButton); - container.appendChild(useInfoButton); - container.appendChild(label); - return container; + return progressbar; } - incrementItem(item) { - const stock = this.remainingStock[item]; - console.log(`incrementItem: stock = ${stock}`); - if (stock > 0) { - this.selectedItems.push(item); - this.remainingStock[item]--; - this.updateQuantityDisplay(item); + async loadSettings() { + this.settings = Object.assign({}, defaultSettings, await this.loadData()); + console.log("loadSettings()"); + } + async saveSettings() { + await this.saveData(this.settings); + } + async giveStatusPoints(pointsToAdd) { + let boosterFactor = 1; + let streakbooster = this.settings.streakbooster; + let boosterFactorPerpetualProgress = 0; + let boosterFactorStrategicSynapses = 0; + let boosterFactorLinkersLode = 0; + let boosterFactorRecursiveReflection = 0; + let boosterFactorSynapticSurge = 0; + let boosterFactorTitleTitan = 0; + let boosterFactorPrecisionPrism = 0; + let boosterFactorHyperlinkHarmony = 0; + let boosterFactorEphemeralEuphoria = 0; + if (this.settings.badgeBoosterState) { + boosterFactor = this.settings.badgeBoosterFactor; + } + if (this.settings.boosterFactorPerpetualProgress) { + boosterFactorPerpetualProgress = 3; + } + if (this.settings.boosterFactorStrategicSynapses) { + boosterFactorStrategicSynapses = 3; + } + if (this.settings.boosterFactorLinkersLode) { + boosterFactorLinkersLode = 10; + } + if (this.settings.boosterFactorRecursiveReflection) { + boosterFactorRecursiveReflection = 5; + } + if (this.settings.boosterFactorSynapticSurge) { + boosterFactorSynapticSurge = 20; } - if (this.boosters[item] !== void 0) { - this.boosters[item]--; - this.updateQuantityDisplay(item); + if (this.settings.boosterFactorTitleTitan) { + boosterFactorTitleTitan = 4; } - } - decrementItem(item) { - const itemIndex = this.selectedItems.indexOf(item); - if (itemIndex > -1) { - this.selectedItems.splice(itemIndex, 1); - this.remainingStock[item]++; - this.updateQuantityDisplay(item); + if (this.settings.boosterFactorPrecisionPrism) { + boosterFactorPrecisionPrism = 4; } - if (this.boosters[item] !== void 0) { - this.boosters[item]++; - this.updateQuantityDisplay(item); + if (this.settings.boosterFactorHyperlinkHarmony) { + boosterFactorHyperlinkHarmony = 5; } + if (this.settings.boosterFactorEphemeralEuphoria) { + boosterFactorEphemeralEuphoria = 80; + } + this.settings.statusPoints = pointsToAdd * (boosterFactor + streakbooster + boosterFactorPerpetualProgress + boosterFactorStrategicSynapses + boosterFactorLinkersLode + boosterFactorRecursiveReflection + boosterFactorSynapticSurge + boosterFactorTitleTitan + boosterFactorPrecisionPrism + boosterFactorHyperlinkHarmony + boosterFactorEphemeralEuphoria) + this.settings.statusPoints; + await this.saveData(this.settings); + return this.updateAvatarPage(this.settings.avatarPageName); } - useBoosterItem(labelText) { - console.log(`use Booster ${labelText}`); - this.decrementBooster(labelText, 1); - } - updateQuantityDisplay(labelText) { - const stock = this.boosters[labelText]; - const stockInfo = document.querySelector(`.${labelText.replace(" ", "-")}`); - if (stockInfo) { - stockInfo.innerHTML = ""; - stockInfo.innerHTML = `${labelText} : (${stock})`; + async increaseStreakbooster(increaseValue) { + let newBoosterFakfor = parseFloat((this.settings.streakbooster + increaseValue).toFixed(streakboosterIncreaseWeekly)); + if (newBoosterFakfor > 80) { + newBoosterFakfor = 80; } - const buttonUse = document.querySelector(`#use-button-${labelText.replace(" ", "-")}`); - const date = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); - const momentDate = window.moment(date, "YYYY-MM-DD HH:mm:ss"); - if (buttonUse && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText)) == false) { - buttonUse.setText(`cooldown ${hoursUntilMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText))} hours`); + this.settings.streakbooster = newBoosterFakfor; + this.settings.streakboosterDate = true; + await this.saveData(this.settings); + console.log(`streakbooster: ${this.settings.streakbooster}`); + } + async decreaseStreakbooster(decreaseValue) { + let newBoosterFakfor = parseFloat((this.settings.streakbooster - decreaseValue).toFixed(streakboosterDecrease)); + this.settings.streakbooster = newBoosterFakfor; + if (newBoosterFakfor < 0) { + newBoosterFakfor = 0; } + this.settings.streakbooster = newBoosterFakfor; + this.settings.streakboosterDate = false; + await this.saveData(this.settings); } - checkIngredientsAvailability(incredients) { - for (const ingredient of incredients.incredients) { - const [quantity, shortName] = ingredient.split("x"); - const requiredQuantity = parseInt(quantity); - const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; - if (requiredQuantity > availableStock) { - return false; + async updateAvatarPage(avatarPageName) { + const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); + if (existingFile == null) { + console.log(`File ${avatarPageName}.md does not exist`); + return false; + } + const file = existingFile; + const content = await app.vault.read(file); + let reference = null; + let reference2 = null; + let reference3 = null; + let reference4 = null; + let end = null; + let start = null; + let end2 = null; + let start2 = null; + let end3 = null; + let start3 = null; + let end4 = null; + let start4 = null; + const lines = content.split("\n"); + for (let i2 = 0; i2 < lines.length; i2++) { + const line = lines[i2].trim(); + if (line === "^levelAndPoints") { + if (reference === null) { + reference = i2; + } + } + if (line === "^dailyNotesChallenge") { + if (reference2 === null) { + reference2 = i2; + } + } + if (line === "^weeklyNotesChallenge") { + if (reference3 === null) { + reference3 = i2; + } + } + if (line === "^boosterFactor") { + if (reference4 === null) { + reference4 = i2; + } } } - return true; - } - useIngrediments(incredients) { - console.log(`useIngrediments: ${incredients}`); - for (const ingredient of incredients.incredients) { - const [quantity, shortName] = ingredient.split("x"); - console.log(`quantity: ${quantity} shortName: ${shortName}`); - const requiredQuantity = parseInt(quantity); - const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; - const ingrementName = this.getIngerementNameFromShortName(shortName) || ""; - console.log(`this.getIngerementNameFromShortName(shortName): ${this.getIngerementNameFromShortName(shortName)}`); - this.updateIncrementStock(ingrementName, availableStock - requiredQuantity); - console.log(`${incredients.name} ${availableStock - requiredQuantity}`); + const newPoints = this.settings.statusPoints; + const level = getLevelForPoints(newPoints); + let nextLevelAt = this.settings.xpForNextLevel; + let receiveBadge = false; + if (this.settings.statusLevel < level.level) { + new import_obsidian5.Notice(`With ${newPoints} points, the current level is ${level.level}.`); + receiveBadge = checkIfReceiveABadge(this.settings.statusLevel, level.level); + this.settings.statusLevel = level.level; + nextLevelAt = level.pointsNext; + this.settings.xpForNextLevel = level.pointsNext; + await this.saveData(this.settings); } - return true; + const progressBarEnd = nextLevelAt - newPoints; + const newPointsString = "| **Level** | **" + level.level + "** |\n| Points | " + newPoints + " |\n^levelAndPoints\n```chart\ntype: bar\nlabels: [Expririence]\nseries:\n - title: points reached\n data: [" + newPoints + "]\n - title: points to earn to level up\n data: [" + progressBarEnd + "]\nxMin: " + level.points + "\nxMax: " + level.pointsNext + '\ntension: 0.2\nwidth: 40%\nlabelColors: false\nfill: false\nbeginAtZero: false\nbestFit: false\nbestFitTitle: undefined\nbestFitNumber: 0\nstacked: true\nindexAxis: y\nxTitle: "progress"\nlegend: false\n```'; + const dailyChallenge = "| **daily Notes** | *" + pointsForDailyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster) + "EP* | **" + this.settings.dailyNoteCreationTask + "/2** |"; + const daysLeftInWeeklyChain = 7 - this.settings.weeklyNoteCreationTask; + const weeklyChallenge = "| **weekly Notes** | *" + pointsForWeeklyChallenge * (this.settings.badgeBoosterFactor + this.settings.streakbooster) + "EP* | **" + this.settings.weeklyNoteCreationTask + "/7** |\n^weeklyNotesChallenge\n```chart\ntype: bar\nlabels: [days done in a row]\nseries:\n - title: days to do in a row\n data: [" + this.settings.weeklyNoteCreationTask + "]\n - title: points to earn to level up\n data: [" + daysLeftInWeeklyChain + ']\nxMin: 0\nxMax: 7\ntension: 0.2\nwidth: 40%\nlabelColors: false\nfill: false\nbeginAtZero: false\nbestFit: false\nbestFitTitle: undefined\nbestFitNumber: 0\nstacked: true\nindexAxis: y\nxTitle: "progress"\nlegend: false\n```'; + const boosterFactor = "| **booster factor** | **" + this.settings.streakbooster + "** |"; + if (reference != null && reference2 != null && reference3 != null && reference4 != null) { + start = reference - 2; + end = reference + 24; + start2 = reference2 - 1 - 25; + end2 = reference2 - 25; + start3 = reference3 - 1 - 25; + end3 = reference3 + 24 - 25; + start4 = reference4 - 1 - 25; + end4 = reference4 - 25; + const newLines = [...lines.slice(0, start), newPointsString, ...lines.slice(end)]; + const newLines2 = [...newLines.slice(0, start2), dailyChallenge, ...newLines.slice(end2)]; + const newLines3 = [...newLines2.slice(0, start3), weeklyChallenge, ...newLines2.slice(end3)]; + const newLines4 = [...newLines3.slice(0, start4), boosterFactor, ...newLines3.slice(end4)]; + await app.vault.modify(file, newLines4.join("\n")); + } + return receiveBadge; } - updateStockInformation() { - const stockInfo = document.querySelector(".stock-info"); - if (stockInfo) { - stockInfo.innerHTML = ""; - elements.forEach((element) => { - stockInfo.innerHTML += `${element.shortName} [${this.remainingStock[element.name] || 0}]      `; - }); + async giveBadgeInProfile(avatarPageName, badge) { + const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); + if (existingFile == null) { + console.log(`File ${avatarPageName}.md does not exist`); + return; + } + const file = existingFile; + const content = await app.vault.read(file); + let reference = null; + let reference2 = null; + let end = null; + let start = null; + let end2 = null; + let start2 = null; + const lines = content.split("\n"); + for (let i2 = 0; i2 < lines.length; i2++) { + const line = lines[i2].trim(); + if (line === "#### achieved") { + if (reference === null) { + reference = i2; + } + } + if (line === badge.level + ": *" + badge.name + "*") { + if (reference2 === null) { + reference2 = i2; + } + } + } + if (reference != null && reference2 != null) { + end = reference + 1; + start = reference + 1; + end2 = reference2 + 2; + start2 = reference2 + 1; + const badgeString = "**" + badge.name + "** " + badge.level + "\n> " + badge.description + " - *" + window.moment().format("D.M.YY") + "*\n"; + const newLines = [...lines.slice(0, start), badgeString, ...lines.slice(end)]; + const newLines2 = [...newLines.slice(0, start2), ...newLines.slice(end2)]; + await app.vault.modify(file, newLines2.join("\n")); + console.log(`badgeString: ${badgeString}`); } } - craftBoosterItem(selectedItems) { - if (this.checkIngredientsAvailability(selectedItems)) { - console.log(`craft booster ${selectedItems.name}`); - this.updateBoosterStock(selectedItems.name, 1); - this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(selectedItems.name), this.boosters[selectedItems.name]); - this.useIngrediments(selectedItems); - this.updateStockInformation(); - } else { - console.log(`not enough ingredients for booster ${selectedItems.name} in stock`); + async giveInitBadgeInProfile(avatarPageName, badge) { + const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); + if (existingFile == null) { + console.log(`File ${avatarPageName}.md does not exist`); + return; + } + const file = existingFile; + const content = await app.vault.read(file); + let reference = null; + let end = null; + let start = null; + const lines = content.split("\n"); + for (let i2 = 0; i2 < lines.length; i2++) { + const line = lines[i2].trim(); + if (line === "#### achieved") { + if (reference === null) { + reference = i2; + } + } + } + if (reference != null) { + end = reference + 2; + start = reference + 1; + const badgeString = "**" + badge.name + "**\n> " + badge.description + " - *" + window.moment().format("D.M.YY") + "*\n"; + const newLines = [...lines.slice(0, start), badgeString, ...lines.slice(end)]; + await app.vault.modify(file, newLines.join("\n")); + console.log(`badgeString: ${badgeString}`); } } - getIngerementNameFromShortName(shortName) { - for (const element of elements) { - if (element.shortName === shortName) { - return element.name; + async removeBadgesWhenInitLevelHigher(avatarPageName, level) { + const existingFile = app.vault.getAbstractFileByPath(`${avatarPageName}.md`); + if (existingFile == null) { + console.log(`File ${avatarPageName}.md does not exist`); + return; + } + const file = existingFile; + const content = await app.vault.read(file); + let reference = null; + let reference2 = null; + const lines = content.split("\n"); + for (let i2 = 0; i2 < lines.length; i2++) { + const line = lines[i2].trim(); + if (line === "#### outstanding") { + if (reference === null) { + reference = i2; + } + } + if (reference != null && reference2 == null) { + const levelRegex = /level (\d+)/; + const match2 = line.match(levelRegex); + if (match2) { + const levelNumber = parseInt(match2[1], 10); + if (levelNumber > level) { + reference2 = i2; + } + } } } - return null; - } - getIngerementShortNameFromName(name) { - for (const element of elements) { - if (element.name === name) { - return element.shortName; - } + if (reference != null && reference2 != null) { + const newLines = [...lines.slice(0, reference + 1), ...lines.slice(reference2)]; + await app.vault.modify(file, newLines.join("\n")); } - return null; } - getIngerementFromName(name) { - for (const element of elements) { - if (element.name === name) { - return element; - } + async createChart(vault) { + const files = vault.getMarkdownFiles(); + const earliestFile = findEarliestModifiedFile(files); + const earliestDate = earliestFile.stat.mtime; + let monthCounter = 0; + let dateCount = new Date(earliestDate); + const fileDateMonthMapMod = /* @__PURE__ */ new Map(); + const monthcount = monthsBetween(new Date(earliestDate), new Date()); + let dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); + let yLabel = ""; + monthCounter = 0; + dateCount = new Date(earliestDate); + dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); + while (monthCounter < monthcount) { + dateString = dateCount.getMonth() + 1 + "." + dateCount.getFullYear(); + yLabel = yLabel + dateString + ", "; + dateCount.setMonth(dateCount.getMonth() + 1); + monthCounter += 1; + fileDateMonthMapMod.set(dateString, 0); } - return { shortName: "", name: "", varName: "" }; - } - getIngerementVarNameFromShortName(shortName) { - for (const element of elements) { - if (element.shortName === shortName) { - return element.varName; + yLabel = yLabel.slice(0, yLabel.length - 2); + const modificationDates = getModificationDates(files); + for (let i2 = 0; i2 < modificationDates.length; i2++) { + const formattedDate = format(modificationDates[i2], "M.yyyy"); + const currentCount = fileDateMonthMapMod.get(formattedDate); + if (currentCount !== void 0) { + fileDateMonthMapMod.set(formattedDate, currentCount + 1); + } else { + fileDateMonthMapMod.set(formattedDate, 1); } } - return null; - } - getIngerementVarNameFromName(name) { - for (const element of elements) { - if (element.name === name) { - return element.varName; - } + let charStringModified = ""; + for (const [value] of fileDateMonthMapMod) { + charStringModified = charStringModified + value + ", "; } - return null; + charStringModified = charStringModified.slice(0, charStringModified.length - 2); + return createChartFormat(yLabel, charStringModified, this.settings.chartReduzierungMonate); } - getBoosterVarNameFromName(boosterName) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.varname; + async decisionIfBadge(newLevel) { + newLevel.then((result) => { + if (result) { + const badge = getBadgeForLevel(this.settings.statusLevel, false); + new import_obsidian5.Notice(`You've earned the "${badge.name}" badge. ${badge.description}`); + console.log(`You've earned the "${badge.name}" badge. ${badge.description}`); + this.giveBadgeInProfile(this.settings.avatarPageName, badge); + this.settings.badgeBoosterState = false; + this.settings.badgeBoosterFactor = 1; + this.saveData(this.settings); } - } - return ""; + }); } - getBoosterInforFromFromName(boosterName) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.description; + async removeKeysFromFrontmatter() { + const { vault } = this.app; + const fileCountMap = await getFileCountMap(this.app, this.settings.tagsExclude, this.settings.folderExclude); + for (const fileName of fileCountMap.keys()) { + const files = vault.getFiles(); + const file = files.find((file2) => file2.basename === fileName); + if (!file) { + console.warn(`File ${fileName} not found.`); + continue; } - } - return ""; - } - getBoosterSwitchFromName(boosterName) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterSwitch; + console.log(`Processing file ${fileName}`); + try { + await this.app.fileManager.processFrontMatter(file, (frontmatter) => { + delete frontmatter["title-class"]; + delete frontmatter["note-length-class"]; + delete frontmatter["inlink-class"]; + delete frontmatter["outlink-class"]; + delete frontmatter["progressive-summarization-maturity"]; + delete frontmatter["note-maturity"]; + }); + } catch (e2) { + if ((e2 == null ? void 0 : e2.name) === "YAMLParseError") { + const errorMessage = `Update majuritys failed Malformed frontamtter ${e2.message}`; + new import_obsidian5.Notice(errorMessage, 4e3); + console.error(errorMessage); + } } } - return ""; } - getBoosterDateFromName(boosterName) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterDate; + async whichLevelNextBadge(currentLevel) { + let nextBadgeLevel = 0; + for (let i2 = currentLevel; i2 < 110; i2++) { + const badge = getBadgeForLevel(i2, true); + const levelRegex = /level (\d+)/; + const match2 = badge.level.match(levelRegex); + if (match2) { + const levelNumber = parseInt(match2[1], 10); + if (levelNumber > currentLevel && nextBadgeLevel == 0) { + nextBadgeLevel = levelNumber; + } } } - return ""; + return nextBadgeLevel; } - getBoosterCooldownFromName(boosterName) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterCooldown; - } - } - return 0; + async boosterForInit() { + const nextBadgeAt = await this.whichLevelNextBadge(this.settings.statusLevel); + const statusPointsToReach = statusPointsForLevel(nextBadgeAt); + const boosterFactor = Math.round((statusPointsToReach - this.settings.statusPoints) / 50 / 300); + this.settings.badgeBoosterFactor = boosterFactor; + this.settings.badgeBoosterState = true; + await this.saveData(this.settings); + return boosterFactor; } -}; -var ModalBooster = class extends import_obsidian2.Modal { - constructor(app2, displayText, gamificationInstance) { - super(app2); - this.displayText = displayText; - this.gamificationInstance = gamificationInstance; + async openAvatarFile() { + var _a; + const existingFile = app.vault.getAbstractFileByPath(`${this.settings.avatarPageName}.md`); + if (existingFile) { + const sourcePath = ((_a = this.app.workspace.getActiveFile()) == null ? void 0 : _a.path) || ""; + await app.workspace.openLinkText(existingFile.path, sourcePath); + } else { + console.log("File not found or unable to open."); + } } - onOpen() { - const { contentEl } = this; - contentEl.setText(this.displayText); - const multiSelectModal = new MultiSelectModal(this.app, [], "Craft Booster Item", this.gamificationInstance); - const button = document.createElement("button"); - button.innerText = "Open Crafting Table"; - button.onclick = () => { - multiSelectModal.setUseBooster(false); - multiSelectModal.open(); - }; - multiSelectModal.readBoostersStock(); - multiSelectModal.readIngrementStock(); - const button2 = document.createElement("button"); - button2.innerText = "Open Booster Board"; - button2.onclick = () => { - multiSelectModal.setUseBooster(true); - multiSelectModal.open(); - }; - contentEl.appendChild(button); - contentEl.appendChild(button2); + getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; } - onClose() { - const { contentEl } = this; - contentEl.empty(); + async acquireIngredients() { + const chanceToEarnIngredient = 0.5; + if (Math.random() < chanceToEarnIngredient) { + const randomIngredientIndex = this.getRandomInt(0, 3); + const earnedIngredient = elements[randomIngredientIndex]; + let elementCount = this.getSetting(earnedIngredient.varName); + if (elementCount !== null && typeof elementCount === "number") { + this.setSetting(earnedIngredient.varName, elementCount + 1); + this.saveSettings(); + console.log(`You earned: ${earnedIngredient.name}`); + } else { + console.error(`Invalid element count for ${earnedIngredient.varName}`); + } + } else { + console.log("You did not earn an ingredient this time."); + } } }; -var ModalInformationbox = class extends import_obsidian2.Modal { - // Store the text to be displayed - constructor(app2, displayText) { - super(app2); - this.displayText = displayText; +function getBoosterRunTimeFromVarName(boosterVarName) { + for (const element of boosterRecipes) { + if (element.varname === boosterVarName) { + return element.boosterRunTime; + } } - onOpen() { - const { contentEl } = this; - contentEl.setText(this.displayText); + return 0; +} +function isSameDay(inputDate) { + const currentDate = window.moment(); + return currentDate.isSame(inputDate, "day"); +} +function isOneDayBefore(inputDate) { + const oneDayBeforeCurrent = window.moment().subtract(1, "day"); + return inputDate.isSame(oneDayBeforeCurrent, "day"); +} +function isMinutesPassed(inputDate, minutesPassed) { + const minutesAgo = window.moment().subtract(minutesPassed, "minutes"); + return inputDate.isSameOrBefore(minutesAgo); +} +function hoursUntilMinutesPassed(inputDate, minutesToPass) { + const currentTime = window.moment(); + const targetTime = inputDate.clone().add(minutesToPass, "minutes"); + if (targetTime.isAfter(currentTime)) { + const hoursRemaining = targetTime.diff(currentTime, "hours"); + return hoursRemaining; + } else { + return 0; } - onClose() { - const { contentEl } = this; - contentEl.empty(); +} +async function createAvatarFile(app2, fileName) { + const existingFile = app2.vault.getAbstractFileByPath(`${fileName}.md`); + if (existingFile instanceof import_obsidian5.TFile) { + console.log(`File ${fileName}.md already exists`); + return; } -}; + await app2.vault.create(`${fileName}.md`, avatarInitContent); +} async function replaceFormatStrings(layer2, layer3) { - const activeView = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView); + const activeView = this.app.workspace.getActiveViewOfType(import_obsidian5.MarkdownView); if (!activeView) { console.error("No active Markdown view found."); return; @@ -4075,4 +4088,4 @@ function rateDirectionForStatusPoints(ratingCurrent, ratingNew) { } return ratingFaktor; } -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2lzRGF0ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL3RvRGF0ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2lzVmFsaWQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDRGF5T2ZZZWFyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vlay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZGVmYXVsdE9wdGlvbnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrWWVhci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvc3RhcnRPZlVUQ1dlZWtZZWFyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9saWdodEZvcm1hdHRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3Byb3RlY3RlZFRva2Vucy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hGbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZGVmYXVsdExvY2FsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2Zvcm1hdC9pbmRleC5qcyIsICJzcmMvY29uc3RhbnRzLnRzIiwgInNyYy9tYWp1cml0eWNhbGN1bGF0aW9uLnRzIiwgInNyYy9jcmVhdG1vZGNoYXJ0Y2FsY3VsYXRpb24udHMiLCAic3JjL2JhZGdlcy50cyIsICJzcmMvbGV2ZWxzLnRzIiwgInNyYy9yYW5kb21Ob3RpZmljYXRpb25UZXh0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbnN0eWxlLnRleHRDb250ZW50ID0gYFxyXG4gIC5tb2RhbC1jaGVja2JveC1jb250YWluZXIge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIH1cclxuXHJcbiAgLm1vZGFsLWNoZWNrYm94LWNvbnRhaW5lciBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgfVxyXG5gO1xyXG5cclxuZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpO1xyXG5pbXBvcnQge0FwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2RlZmF1bHRTZXR0aW5ncywgSVNldHRpbmdzLCBHYW1pZmljYXRpb25QbHVnaW5TZXR0aW5nc30gZnJvbSAnLi9zZXR0aW5ncyc7XHJcbmltcG9ydCBmb3JtYXQgZnJvbSAnZGF0ZS1mbnMvZm9ybWF0JztcclxuaW1wb3J0IHtcclxuXHRhdmF0YXJJbml0Q29udGVudCxcclxuXHRwb2ludHNNYWp1cml0eSxcclxuXHRwb2ludHNOb3RlTWFqdXJpdHksXHJcblx0cG9pbnRzRm9yRGFpbHlDaGFsbGVuZ2UsXHJcblx0cG9pbnRzRm9yV2Vla2x5Q2hhbGxlbmdlLFxyXG5cdGluY3JlZGltZW50cyxcclxuXHRjcmFmdGluZ0l0ZW1zLFxyXG5cdGVsZW1lbnRzLFxyXG5cdGJvb3N0ZXJSZWNpcGVzLFxyXG5cdGxpc3RPZlVzZWFibGVCb29zdGVyc1RvQmVTaG93bixcclxuXHRsaXN0T2ZVc2VhYmxlSW5ncmVkaWVudHNUb0JlU2hvd24sXHJcblx0c3RyZWFrYm9vc3RlckRlY3JlYXNlLFxyXG5cdHN0cmVha2Jvb3N0ZXJJbmNyZWFzZURhaWx5LFxyXG5cdHN0cmVha2Jvb3N0ZXJJbmNyZWFzZVdlZWtseVxyXG59IGZyb20gJy4vY29uc3RhbnRzJ1xyXG5pbXBvcnQge1xyXG5cdGNvdW50X2lubGlua3MsXHJcblx0Y291bnRDaGFyYWN0ZXJzSW5BY3RpdmVGaWxlLFxyXG5cdGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyxcclxuXHRnZXRGaWxlQ291bnRNYXAsXHJcblx0Z2V0RmlsZU1hcCxcclxuXHRnZXROdW1iZXJPZk91dGxpbmtzLFxyXG5cdHJhdGVEaXJlY3Rpb24sXHJcblx0cmF0ZUlubGlua3MsXHJcblx0cmF0ZUxlbmd0aEZpbGVuYW1lLFxyXG5cdHJhdGVMZXZlbE9mTWF0dXJpdHksXHJcblx0cmF0ZU5vdGVMZW5ndGgsXHJcblx0cmF0ZU91dGxpbmtzLFxyXG5cdHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb25cclxufSBmcm9tICcuL21hanVyaXR5Y2FsY3VsYXRpb24nXHJcbmltcG9ydCB7XHJcblx0Y3JlYXRlQ2hhcnRGb3JtYXQsXHJcblx0ZmluZEVhcmxpZXN0TW9kaWZpZWRGaWxlLFxyXG5cdGdldE1vZGlmaWNhdGlvbkRhdGVzLFxyXG5cdG1vbnRoc0JldHdlZW4sXHJcblx0cmVwbGFjZUNoYXJ0Q29udGVudFxyXG59IGZyb20gJy4vY3JlYXRtb2RjaGFydGNhbGN1bGF0aW9uJ1xyXG5pbXBvcnQge0JhZGdlLCBjaGVja0lmUmVjZWl2ZUFCYWRnZSwgZ2V0QmFkZ2VGb3JJbml0TGV2ZWwsIGdldEJhZGdlRm9yTGV2ZWx9IGZyb20gJy4vYmFkZ2VzJ1xyXG5pbXBvcnQge2dldExldmVsRm9yUG9pbnRzLCBzdGF0dXNQb2ludHNGb3JMZXZlbH0gZnJvbSAnLi9sZXZlbHMnXHJcbmltcG9ydCB0eXBlIHtNb21lbnR9IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IGdldFJhbmRvbU1lc3NhZ2VXZWVrbHlDaGFsbGVuZ2UsIGdldFJhbmRvbU1lc3NhZ2VUd29Ob3RlQ2hhbGxlbmdlICwgZ2V0UmFuZG9tTWVzc2FnZVBvaW50cyB9IGZyb20gJy4vcmFuZG9tTm90aWZpY2F0aW9uVGV4dCdcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGdhbWlmaWNhdGlvbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0Ly9wdWJsaWMgc2V0dGluZ3M6IEdhbWlmaWNhdGlvblBsdWdpblNldHRpbmdzO1xyXG5cdHByaXZhdGUgdGltZXJJbnRlcnZhbDogbnVtYmVyO1xyXG5cdHByaXZhdGUgdGltZXJJZDogbnVtYmVyIHwgbnVsbDtcclxuXHRwcml2YXRlIHN0YXR1c0Jhckl0ZW0gPSB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKTtcclxuXHRwcml2YXRlIHN0YXR1c2JhckdhbWlmaWNhdGlvbiA9IHRoaXMuc3RhdHVzQmFySXRlbS5jcmVhdGVFbChcInNwYW5cIiwgeyB0ZXh0OiBcIlwiIH0pO1xyXG5cdHB1YmxpYyBzZXR0aW5nczogSVNldHRpbmdzO1xyXG5cclxuXHJcblx0Z2V0U2V0dGluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFJldHJpZXZlIGEgc3BlY2lmaWMgc2V0dGluZ1xyXG5cdFx0Ly8gcmV0dXJuIHRoaXMuc2V0dGluZ3Nba2V5XTtcclxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXMuc2V0dGluZ3Nba2V5XSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2V0dGluZyhrZXk6IHN0cmluZywgdmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIC8vIFNldCBhIHNwZWNpZmljIHNldHRpbmdcclxuXHRcdC8vY29uc29sZS5sb2coYG5ldyB2YWx1ZSBmb3IgJHtrZXl9IGlzICR7dmFsdWV9YClcclxuICAgICAgICB0aGlzLnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuXHRzZXRTZXR0aW5nQm9vbGVhbihrZXk6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBTZXQgYSBzcGVjaWZpYyBzZXR0aW5nXHJcblx0XHQvL2NvbnNvbGUubG9nKGBuZXcgdmFsdWUgZm9yICR7a2V5fSBpcyAke3ZhbHVlfWApXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1trZXldID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHR9XHJcblxyXG5cdHNldFNldHRpbmdTdHJpbmcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBTZXQgYSBzcGVjaWZpYyBzZXR0aW5nXHJcblx0XHQvL2NvbnNvbGUubG9nKGBuZXcgdmFsdWUgZm9yICR7a2V5fSBpcyAke3ZhbHVlfWApXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1trZXldID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdvYnNpZGlhbi1wa20tZ2FtaWZpY2F0aW9uIGxvYWRlZCEnKTtcclxuXHRcdC8vdGhpcy5zZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncztcclxuXHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3ModGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcblx0XHQvLyB0YWtlIGNhcmUgdG8gcmVzZXQgd2hlbiBvcGVuZWQgb24gYSBuZXcgZGF5LCBkb24ndCB3YWl0IGZvciB0cmlnZ2VyXHJcblx0XHRzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0Ly8gQ29kZSB0aGF0IHlvdSB3YW50IHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRlbGF5XHJcblx0XHRcdGF3YWl0IHRoaXMucmVzZXREYWlseUdvYWxzKClcclxuXHRcdH0sIDIwMDApOyAvLyAyMDAwIG1pbGxpc2Vjb25kcyA9IDIgc2Vjb25kc1xyXG5cclxuXHJcblx0XHQvLyB0byBzZXQgdGltZXIgZm9yIHJlc2V0IGRhaWx5IGFuZCB3ZWVrbHkgZ29hbHNcclxuXHRcdHRoaXMudGltZXJJbnRlcnZhbCA9IDMwICogNjAgKiAxMDAwOyAvLyBtaW51dGVzIHggc2Vjb25kcyB4IG1pbGxpc2Vjb25kc1xyXG5cdFx0dGhpcy50aW1lcklkID0gd2luZG93LnNldEludGVydmFsKHRoaXMucmVzZXREYWlseUdvYWxzLmJpbmQodGhpcyksIHRoaXMudGltZXJJbnRlcnZhbCk7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy51cGRhdGVTdGF0dXNCYXIodGhpcy5zdGF0dXNiYXJHYW1pZmljYXRpb24pXHJcblxyXG5cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKXtcclxuXHRcdFx0dGhpcy5hZGRSaWJib25JY29uKFwiYWNjZXNzaWJpbGl0eVwiLCBcImNyYWZ0aW5nXCIsIGFzeW5jICgpID0+IHtcclxuXHJcblx0XHRcdFx0Ly8gY29uc3QgcG9pbnRzUmVjZWl2ZWQgPSA1MDA7XHJcblx0XHRcdFx0Ly8gbmV3IE1vZGFsSW5mb3JtYXRpb25ib3godGhpcy5hcHAsIGBGaW5hbGl6ZWQgZ2FtaWZpY2F0aW9uIGluaXRpYWxpemF0aW9uIVxcbkNvbmdyYXR1bGF0aW9uLCB5b3UgZWFybmVkICR7cG9pbnRzUmVjZWl2ZWR9IFBvaW50cyFcXG5cXG5DaGVjayB0aGUgUHJvZmlsZSBQYWdlOiBcXFwiJHt0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lfS5tZFxcXCIuYCkub3BlbigpO1xyXG5cclxuXHRcdFx0XHQvLyBjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCAzMDApXHJcblx0XHRcdFx0Ly8gdGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblxyXG5cdFx0XHRcdC8vIGNvbnN0IG5leHRCYWRnZUxldmVsID0gYXdhaXQgdGhpcy53aGljaExldmVsTmV4dEJhZGdlKHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwpXHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coYE5cdTAwRTRjaHN0ZSBCYWRnZSBtaXQgTGV2ZWwgJHtuZXh0QmFkZ2VMZXZlbH1gKVxyXG5cclxuXHJcblx0XHRcdFx0Ly8gY29uc3QgaW5pdEJhZGdlIDogQmFkZ2UgPSBhd2FpdCBnZXRCYWRnZUZvckluaXRMZXZlbCh0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsKTtcclxuXHRcdFx0XHQvLyBhd2FpdCB0aGlzLmdpdmVJbml0QmFkZ2VJblByb2ZpbGUodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgaW5pdEJhZGdlKTtcclxuXHRcdFx0XHQvLyBhd2FpdCB0aGlzLnJlbW92ZUJhZGdlc1doZW5Jbml0TGV2ZWxIaWdoZXIodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSAsdGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbClcclxuXHRcdFx0XHQvLyBhd2FpdCB0aGlzLmJvb3N0ZXJGb3JJbml0KClcclxuXHJcblx0XHRcdFx0Ly8gdGhpcy5vcGVuQXZhdGFyRmlsZSgpXHJcblxyXG5cclxuXHRcdFx0XHQvLyBjaGFuZ2UgdGV4dCBpbiBzdGF0dXMgYmFyXHJcblxyXG5cdFx0XHRcdC8vIHRoaXMudXBkYXRlU3RhdHVzQmFyKHN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuXHRcdFx0XHQvL3N0YXR1c2JhckdhbWlmaWNhdGlvbi5zZXRUZXh0KFwiSGFsbG9cIilcclxuXHJcblxyXG5cdFx0XHRcdC8vYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHRcdFx0XHQvL2F3YWl0IHRoaXMudXBkYXRlQXZhdGFyUGFnZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lKTtcclxuXHJcblx0XHRcdFx0Ly8gdGhpcy5sb2FkU2V0dGluZ3MoKVxyXG5cdFx0XHRcdC8vYXdhaXQgdGhpcy5yZXNldERhaWx5R29hbHMoKVxyXG5cclxuXHJcblx0XHRcdFx0Ly9uZXcgTW9kYWxCb29zdGVyKHRoaXMuYXBwLCBgIGAsIHRoaXMpLm9wZW4oKTtcclxuXHJcblx0XHRcdFx0dGhpcy5hY3F1aXJlSW5ncmVkaWVudHMoKTtcclxuXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYWRkUmliYm9uSWNvbihcInRlc3QtdHViZS0yXCIsIFwiQm9vc3RlcnNcIiwgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQvL2NvbnN0IGZpbGU6IFRGaWxlIHwgbnVsbCA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XHJcblx0XHRcdG5ldyBNb2RhbEJvb3N0ZXIodGhpcy5hcHAsIGAgYCwgdGhpcykub3BlbigpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRSaWJib25JY29uKFwic3Byb3V0XCIsIFwiQ2FsY3VsYXRlIE5vdGUgTWF0dXJpdHlcIiwgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQvL2NvbnN0IGZpbGU6IFRGaWxlIHwgbnVsbCA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuY2FsY3VsYXRlTm90ZU1hanVyaXR5KCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2Jvb3N0ZXJzJyxcclxuXHRcdFx0bmFtZTogJ29wZW4gYm9vdGVyIHBhbGxldGUnLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdG5ldyBNb2RhbEJvb3N0ZXIodGhpcy5hcHAsIGAgYCwgdGhpcykub3BlbigpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlSW5pdENvbW1hbmQpe1xyXG5cdFx0XHQvLyBjb21tYW5kIEluaXRpYWxpemUgZ2FtaWZpY2F0aW9uIHJhdGluZ3NcclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2luaXQtcmF0ZS1nYW1pZmljYXRpb24nLFxyXG5cdFx0XHRcdG5hbWU6ICdJbml0aWFsaXplIGdhbWlmaWNhdGlvbiByYXRpbmdzJyxcclxuXHRcdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5pbml0aWFsaXplR2FtZSh0aGlzLnN0YXR1c2JhckdhbWlmaWNhdGlvbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlSW5pdENvbW1hbmQpe1xyXG5cdFx0XHQvLyBjb21tYW5kIGNyZWF0ZSBhdmF0YXIgcHJvZmlsZSBwYWdlXHJcblx0XHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdFx0aWQ6ICdjcmVhdGUtYXZhdGFyLXBhZ2UnLFxyXG5cdFx0XHRcdG5hbWU6ICdjcmVhdGUgcHJvZmlsZSBwYWdlJyxcclxuXHRcdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgeyB2YXVsdCB9ID0gdGhpcy5hcHA7XHJcblx0XHRcdFx0XHRhd2FpdCBjcmVhdGVBdmF0YXJGaWxlKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lKVxyXG5cdFx0XHRcdFx0Y29uc3QgY2hhcnRTdHJpbmcgPSBhd2FpdCB0aGlzLmNyZWF0ZUNoYXJ0KHZhdWx0KVxyXG5cdFx0XHRcdFx0YXdhaXQgcmVwbGFjZUNoYXJ0Q29udGVudCh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCBjaGFydFN0cmluZylcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlSW5pdENvbW1hbmQpIHtcclxuXHRcdFx0Ly8gY29tbWFuZDogcmVzZXQgZ2FtZVxyXG5cdFx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRcdGlkOiAncmVzZXQtZ2FtZScsXHJcblx0XHRcdFx0bmFtZTogJ3Jlc2V0IHRoZSBnYW1lJyxcclxuXHRcdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzZXRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG5cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29tbWFuZDogdXBkYXRlIGNoYXJ0IGluIEF2YXRhciBQYWdlXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3VwZGF0ZS1jaGFydC1hdmF0YXJwYWdlJyxcclxuXHRcdFx0bmFtZTogJ3VwZGF0ZSBjaGFydCBvbiBwcm9maWxlIHBhZ2UnLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcclxuXHRcdFx0XHRjb25zdCBjaGFydFN0cmluZyA9IGF3YWl0IHRoaXMuY3JlYXRlQ2hhcnQodmF1bHQpXHJcblx0XHRcdFx0YXdhaXQgcmVwbGFjZUNoYXJ0Q29udGVudCh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCBjaGFydFN0cmluZylcclxuXHRcdFx0fSxcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0XHQvLyBjb21tYW5kOiByYXRlIG5vdGUgbWF0dXJpdHlcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAncmF0ZS1ub3RlLW1hdHVyaXR5JyxcclxuXHRcdFx0bmFtZTogJ1JhdGUgbm90ZSBtYWp1cml0eScsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5jYWxjdWxhdGVOb3RlTWFqdXJpdHkoKTtcclxuXHRcdFx0fSxcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0XHQvLyBjb21tYW5kOiBjaGFuZ2UgcHJvZ3Jlc3NpdmUgc3VtbWFyaXphdGlvbiBzeW1ib2xzXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ2NoYW5nZS1wcm9ncmVzc2l2ZS1mb3JtYXR0aW5nJyxcclxuXHRcdFx0bmFtZTogJ3RvZ2dsZSBwcm9ncmVzc2l2ZSBzdW1tYXJpemF0aW9uIGZvcm1hdHRpbmcnLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdGF3YWl0IHJlcGxhY2VGb3JtYXRTdHJpbmdzKHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjIsIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldEdhbWUoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVLZXlzRnJvbUZyb250bWF0dGVyKCk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbCA9IDE7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zdGF0dXNQb2ludHMgPSAwO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MueHBGb3JOZXh0TGV2ZWwgPSAxMDAwXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJTdGF0ZSA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgPSAxXHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmdpdmVTdGF0dXNQb2ludHMoMClcclxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c0Jhcih0aGlzLnN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuICAgICAgICBuZXcgTW9kYWxJbmZvcm1hdGlvbmJveCh0aGlzLmFwcCwgYEdhbWUgaXMgbm93IHJlc2V0ZWQuIFBsZWFzZSBkZWxldGUgdGhlIFByb2ZpbGUgUGFnZTogXCIke3RoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWV9Lm1kXCIgbWFudWFsbHkuYCkub3BlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUdhbWUoc3RhdHVzYmFyR2FtaWZpY2F0aW9uOiBIVE1MU3BhbkVsZW1lbnQpIHtcclxuXHRcdHRoaXMuc2V0dGluZ3MuZ2FtaWZpY2F0aW9uU3RhcnREYXRlID0gZm9ybWF0KG5ldyBEYXRlKCksICd5eXl5LU1NLWRkJyk7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cclxuXHRcdGNvbnN0IHt2YXVsdH0gPSB0aGlzLmFwcDtcclxuXHRcdGF3YWl0IGNyZWF0ZUF2YXRhckZpbGUodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0XHRjb25zdCBjaGFydFN0cmluZyA9IGF3YWl0IHRoaXMuY3JlYXRlQ2hhcnQodmF1bHQpXHJcblx0XHRhd2FpdCByZXBsYWNlQ2hhcnRDb250ZW50KHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUsIGNoYXJ0U3RyaW5nKVxyXG5cdFx0YXdhaXQgdGhpcy5vcGVuQXZhdGFyRmlsZSgpXHJcblx0XHRjb25zdCBmaWxlQ291bnRNYXA6IFRGaWxlW10gPSBhd2FpdCBnZXRGaWxlTWFwKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzLnRhZ3NFeGNsdWRlLCB0aGlzLnNldHRpbmdzLmZvbGRlckV4Y2x1ZGUpO1xyXG5cdFx0Y29uc29sZS5sb2coYGZpbGVDb3VudE1hcCBsb2FkZWQuIE51bWJlciBvZiBmaWxlczogJHtmaWxlQ291bnRNYXAubGVuZ3RofWApO1xyXG5cclxuXHRcdGxldCBwb2ludHNSZWNlaXZlZCA9IDA7IC8vIHRvIGhhdmUgb25lIG1lc3NhZ2UgYXQgdGhlIGVuZCBob3cgbWFueSBwb2ludHMgcmVjZWl2ZWRcclxuXHJcblx0XHRmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVDb3VudE1hcCkge1xyXG5cdFx0XHRjb25zdCBmaWxlID0gZmlsZU5hbWVcclxuXHRcdFx0Y29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblx0XHRcdGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0XHRpZiAoYWN0aXZlVmlldyAmJiBhY3RpdmVWaWV3LmZpbGUgJiYgYWN0aXZlVmlldy5maWxlLnBhdGggPT09IGZpbGUucGF0aCkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGUucGF0aH0gaXMgY3VycmVudGx5IG9wZW4uIFNraXBwaW5nLmApO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vY29uc29sZS5sb2coYGZpbGVOYW1lLmJhc2VuYW1lOiAke2ZpbGVOYW1lLmJhc2VuYW1lfWApXHJcblx0XHRcdGNvbnN0IGZpbGVMZW5ndGggPSBjb3VudENoYXJhY3RlcnNJbkFjdGl2ZUZpbGUoZmlsZUNvbnRlbnRzLCBmaWxlTmFtZS5iYXNlbmFtZSk7XHJcblx0XHRcdGNvbnN0IHJhdGVGaWxlTGVuZ3RoID0gcmF0ZU5vdGVMZW5ndGgoZmlsZUxlbmd0aCk7XHJcblx0XHRcdGNvbnN0IHtcclxuXHRcdFx0XHRjaGFyQ291bnQsXHJcblx0XHRcdFx0aGlnaGxpZ2h0ZWRDb3VudCxcclxuXHRcdFx0XHRib2xkQ291bnRcclxuXHRcdFx0fSA9IGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyhmaWxlQ29udGVudHMsIGZpbGVOYW1lLmJhc2VuYW1lLCB0aGlzLnNldHRpbmdzLnByb2dyZXNzaXZlU3VtTGF5ZXIyLCB0aGlzLnNldHRpbmdzLnByb2dyZXNzaXZlU3VtTGF5ZXIzKTtcclxuXHRcdFx0Y29uc3QgcmF0ZVByb2dyZXNzaXZlU3VtOiBudW1iZXIgPSByYXRlUHJvZ3Jlc3NpdmVTdW1tYXJpemF0aW9uKGNoYXJDb3VudCwgaGlnaGxpZ2h0ZWRDb3VudCwgYm9sZENvdW50KTtcclxuXHRcdFx0Y29uc3QgZmlsZU5hbWVSYXRlID0gcmF0ZUxlbmd0aEZpbGVuYW1lKGZpbGUubmFtZSk7XHJcblx0XHRcdGNvbnN0IGlubGlua051bWJlciA9IGNvdW50X2lubGlua3MoZmlsZSk7XHJcblx0XHRcdGNvbnN0IGlubGlua0NsYXNzID0gcmF0ZUlubGlua3MoaW5saW5rTnVtYmVyKS8vLCBmaWxlQ291bnRNYXAuc2l6ZSk7XHJcblx0XHRcdGNvbnN0IHJhdGVPdXQgPSByYXRlT3V0bGlua3MoZ2V0TnVtYmVyT2ZPdXRsaW5rcyhmaWxlKSk7XHJcblx0XHRcdGNvbnN0IG5vdGVNYWp1cml0eSA9IHJhdGVMZXZlbE9mTWF0dXJpdHkocmF0ZUZpbGVMZW5ndGgsIGZpbGVOYW1lUmF0ZSwgaW5saW5rQ2xhc3MsIHJhdGVPdXQsIHJhdGVQcm9ncmVzc2l2ZVN1bSk7XHJcblxyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coYFByb2Nlc3NpbmcgZmlsZSAke2ZpbGVOYW1lLmJhc2VuYW1lfSBpbiBwYXRoICR7ZmlsZU5hbWUucGF0aH1gKTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucHJvY2Vzc0Zyb250TWF0dGVyKGZpbGUsIChmcm9udG1hdHRlcikgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSwgbm90ZU1hanVyaXR5KSA+PSAxKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c05vdGVNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSwgbm90ZU1hanVyaXR5KVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcImZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J11cIiwgbm90ZU1hanVyaXR5KSlcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoISgnbm90ZS1tYXR1cml0eScgaW4gZnJvbnRtYXR0ZXIpKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c05vdGVNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIG5vdGVNYWp1cml0eSlcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c05vdGVNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIG5vdGVNYWp1cml0eSkpXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10sIGZpbGVOYW1lUmF0ZSkgPj0gMSAmJiAndGl0bGUtY2xhc3MnIGluIGZyb250bWF0dGVyKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSwgZmlsZU5hbWVSYXRlKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWyd0aXRsZS1jbGFzcyddLCBmaWxlTmFtZVJhdGUpKVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICghKCd0aXRsZS1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgZmlsZU5hbWVSYXRlKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBmaWxlTmFtZVJhdGUpKVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydub3RlLWxlbmd0aC1jbGFzcyddLCByYXRlRmlsZUxlbmd0aCkgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydub3RlLWxlbmd0aC1jbGFzcyddLCByYXRlRmlsZUxlbmd0aCkpXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCEoJ25vdGUtbGVuZ3RoLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlRmlsZUxlbmd0aClcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZUZpbGVMZW5ndGgpKVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpID49IDEpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddLCBpbmxpbmtDbGFzcykpXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCEoJ2lubGluay1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgaW5saW5rQ2xhc3MpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIGlubGlua0NsYXNzKSlcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddLCByYXRlT3V0KSA+PSAxKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddLCByYXRlT3V0KVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpKVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICghKCdvdXRsaW5rLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlT3V0KVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlT3V0KSlcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsncHJvZ3Jlc3NpdmUtc3VtbWFyaXphdGlvbi1tYXR1cml0eSddLCByYXRlUHJvZ3Jlc3NpdmVTdW0pID49IDEpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSlcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsncHJvZ3Jlc3NpdmUtc3VtbWFyaXphdGlvbi1tYXR1cml0eSddLCByYXRlUHJvZ3Jlc3NpdmVTdW0pKVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICghKCdwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5JyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSlcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZVByb2dyZXNzaXZlU3VtKSlcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0XHRcdHRoaXMud3JpdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgZmlsZU5hbWVSYXRlLCByYXRlRmlsZUxlbmd0aCwgaW5saW5rQ2xhc3MsIHJhdGVPdXQsIHJhdGVQcm9ncmVzc2l2ZVN1bSwgbm90ZU1hanVyaXR5KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdGlmIChlPy5uYW1lID09PSAnWUFNTFBhcnNlRXJyb3InKSB7XHJcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBgVXBkYXRlIG1hanVyaXR5cyBmYWlsZWQgTWFsZm9ybWVkIGZyb250YW10dGVyIG9uIHRoaXMgZmlsZSA6ICR7ZmlsZS5wYXRofSAke2UubWVzc2FnZX1gO1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShlcnJvck1lc3NhZ2UsIDQwMDApO1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHBvaW50c1JlY2VpdmVkID4gMCkge1xyXG5cdFx0XHRsZXQgYm9vc3RlckZhY3RvciA9IDE7XHJcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlclN0YXRlKXtcclxuXHRcdFx0XHRib29zdGVyRmFjdG9yID0gdGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3I7XHJcblx0XHRcdH1cclxuXHRcdFx0bmV3IE5vdGljZShgJHtwb2ludHNSZWNlaXZlZCAqIGJvb3N0ZXJGYWN0b3J9IFBvaW50cyByZWNlaXZlZGApXHJcblx0XHRcdGNvbnNvbGUubG9nKGAke3BvaW50c1JlY2VpdmVkICogYm9vc3RlckZhY3Rvcn0gUG9pbnRzIHJlY2VpdmVkYClcclxuXHRcdH1cclxuXHJcblx0XHQvLyBJbnNpZGUgeW91ciBmdW5jdGlvbiB3aGVyZSB5b3Ugd2FudCB0byBpbnRyb2R1Y2UgYSBkZWxheVxyXG5cdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdC8vIENvZGUgdGhhdCB5b3Ugd2FudCB0byBleGVjdXRlIGFmdGVyIHRoZSBkZWxheVxyXG5cdFx0XHRjb25zdCBpbml0QmFkZ2U6IEJhZGdlID0gZ2V0QmFkZ2VGb3JJbml0TGV2ZWwodGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbCk7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFlvdSd2ZSBlYXJuZWQgdGhlIFwiJHtpbml0QmFkZ2UubmFtZX1cIiBiYWRnZS4gJHtpbml0QmFkZ2UuZGVzY3JpcHRpb259YClcclxuXHRcdFx0Y29uc29sZS5sb2coYFlvdSBlYXJuZWQgJHtpbml0QmFkZ2UubmFtZX0gLSAke2luaXRCYWRnZS5kZXNjcmlwdGlvbn1gKVxyXG5cdFx0XHRhd2FpdCB0aGlzLmdpdmVJbml0QmFkZ2VJblByb2ZpbGUodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgaW5pdEJhZGdlKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZW1vdmVCYWRnZXNXaGVuSW5pdExldmVsSGlnaGVyKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUsIHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwpXHJcblx0XHRcdGF3YWl0IHRoaXMuYm9vc3RlckZvckluaXQoKVxyXG5cdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c0JhcihzdGF0dXNiYXJHYW1pZmljYXRpb24pXHJcblx0XHR9LCAyMDAwKTsgLy8gMjAwMCBtaWxsaXNlY29uZHMgPSAyIHNlY29uZHNcclxuXHJcblx0XHRuZXcgTW9kYWxJbmZvcm1hdGlvbmJveCh0aGlzLmFwcCwgYEZpbmFsbGl6ZWQgZ2FtaWZpY2F0aW9uIGluaXRpYWxpc3RhdGlvbiFcXG5Db25ncmF0dWxhdGlvbiwgeW91IGVhcm5lZCAke3BvaW50c1JlY2VpdmVkfSBQb2ludHMhXFxuXFxuQ2hlY2sgdGhlIFByb2ZpbGUgUGFnZTogXCIke3RoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWV9Lm1kXCJcXG5cXG5Zb3UgcmVjZWl2ZWQgYW4gaW5pdGlhbGlzYXRpb24gQm9vc3RlciBha3RpdiBmb3IgeW91ciBmaXJzdCBsZXZlbCB1cHMuIEdhbWUgb24hYCkub3BlbigpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB3cml0ZUZyb250bWF0dGVyKGZyb250bWF0dGVyOiBhbnksIGZpbGVOYW1lUmF0ZTogbnVtYmVyLCByYXRlRmlsZUxlbmd0aDogbnVtYmVyLCBpbmxpbmtDbGFzczogbnVtYmVyLCByYXRlT3V0OiBudW1iZXIsIHJhdGVQcm9ncmVzc2l2ZVN1bTogbnVtYmVyLCBub3RlTWFqdXJpdHk6IG51bWJlcikge1xyXG5cdFx0ZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10gPSByYXRlRGlyZWN0aW9uKGZyb250bWF0dGVyWyd0aXRsZS1jbGFzcyddLCBmaWxlTmFtZVJhdGUpXHJcblx0XHRmcm9udG1hdHRlclsnbm90ZS1sZW5ndGgtY2xhc3MnXSA9IHJhdGVEaXJlY3Rpb24oZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKVxyXG5cdFx0ZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddID0gcmF0ZURpcmVjdGlvbihmcm9udG1hdHRlclsnaW5saW5rLWNsYXNzJ10sIGlubGlua0NsYXNzKVxyXG5cdFx0ZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXSA9IHJhdGVEaXJlY3Rpb24oZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXSwgcmF0ZU91dClcclxuXHRcdGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10gPSByYXRlRGlyZWN0aW9uKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSlcclxuXHRcdGZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J10gPSByYXRlRGlyZWN0aW9uKGZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J10sIG5vdGVNYWp1cml0eSlcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coJ29ic2lkaWFuLXBrbS1nYW1pZmljYXRpb24gdW5sb2FkZWQhJyk7XHJcblxyXG5cdFx0Ly8gQ2xlYXIgdGhlIHRpbWVyIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZFxyXG5cdFx0aWYgKHRoaXMudGltZXJJZCAhPT0gbnVsbCkge1xyXG5cdFx0XHRjbGVhckludGVydmFsKHRoaXMudGltZXJJZCk7XHJcblx0XHRcdHRoaXMudGltZXJJZCA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBjYWxjdWxhdGVOb3RlTWFqdXJpdHkoKXtcclxuXHRcdGNvbnN0IGZpbGU6IFRGaWxlIHwgbnVsbD0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRcdGlmIChmaWxlID09IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignZ290IG5vIGZpbGUsIHByb3BhYmx5IG5vbmUgaXMgYWN0aXZlJylcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZGV0ZWN0SWZOb3RlSXNGaXJzdFRpbWVSYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIGdldCBmaWxlIGNvbnRlbnQgbGVuZ3RoXHJcblx0XHRjb25zdCBhY3RpdmVWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGNvbnN0IGZpbGVDb250ZW50cyA9IGFjdGl2ZVZpZXc/LmVkaXRvci5nZXRWYWx1ZSgpO1xyXG5cdFx0Y29uc3QgZmlsZU5hbWUgPSBhY3RpdmVWaWV3Py5maWxlLmJhc2VuYW1lO1xyXG5cclxuXHRcdGxldCByYXRlRmlsZUxlbmd0aCA9IDA7XHJcblx0XHRsZXQgZmlsZUxlbmd0aCA9IDA7XHJcblx0XHRsZXQgcmF0ZVByb2dyZXNzaXZlU3VtID0gMDtcclxuXHJcblx0XHRpZiAoZmlsZUNvbnRlbnRzICE9PSB1bmRlZmluZWQgJiYgZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRmaWxlTGVuZ3RoID0gY291bnRDaGFyYWN0ZXJzSW5BY3RpdmVGaWxlKGZpbGVDb250ZW50cywgZmlsZU5hbWUpO1xyXG5cdFx0XHRyYXRlRmlsZUxlbmd0aCA9IHJhdGVOb3RlTGVuZ3RoKGZpbGVMZW5ndGgpO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgZmlsZUNvbnRlbnRzIGFuZCBmaWxlTmFtZSBhcmUgbm90IG51bGxcclxuXHRcdFx0aWYgKGZpbGVDb250ZW50cyAhPT0gbnVsbCAmJiBmaWxlTmFtZSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdGNvbnN0IHsgY2hhckNvdW50LCBoaWdobGlnaHRlZENvdW50LCBib2xkQ291bnQgfSA9IGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyhmaWxlQ29udGVudHMsIGZpbGVOYW1lLCB0aGlzLnNldHRpbmdzLnByb2dyZXNzaXZlU3VtTGF5ZXIyLCB0aGlzLnNldHRpbmdzLnByb2dyZXNzaXZlU3VtTGF5ZXIzKTtcclxuXHRcdFx0XHRyYXRlUHJvZ3Jlc3NpdmVTdW0gPSByYXRlUHJvZ3Jlc3NpdmVTdW1tYXJpemF0aW9uKGNoYXJDb3VudCwgaGlnaGxpZ2h0ZWRDb3VudCwgYm9sZENvdW50KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBmaWxlTmFtZVJhdGUgPSAwO1xyXG5cdFx0bGV0IGlubGlua051bWJlciA9IDA7XHJcblx0XHRsZXQgaW5saW5rQ2xhc3MgPSAwO1xyXG5cdFx0bGV0IHJhdGVPdXQgPSAwO1xyXG5cclxuXHRcdGlmIChmaWxlICE9PSBudWxsKSB7XHJcblx0XHRcdGZpbGVOYW1lUmF0ZSA9IHJhdGVMZW5ndGhGaWxlbmFtZShmaWxlLm5hbWUgPz8gJycpO1xyXG5cdFx0XHRpbmxpbmtOdW1iZXIgPSBjb3VudF9pbmxpbmtzKGZpbGUpO1xyXG5cdFx0XHRpbmxpbmtDbGFzcyA9IHJhdGVJbmxpbmtzKGlubGlua051bWJlcikvLywgbnVtQWxsRmlsZXMpXHJcblx0XHRcdHJhdGVPdXQgPSByYXRlT3V0bGlua3MoZ2V0TnVtYmVyT2ZPdXRsaW5rcyhmaWxlKSk7XHJcblxyXG5cdFx0XHRjb25zdCBub3RlTWFqdXJpdHkgPSByYXRlTGV2ZWxPZk1hdHVyaXR5KHJhdGVGaWxlTGVuZ3RoLCBmaWxlTmFtZVJhdGUsIGlubGlua0NsYXNzLCByYXRlT3V0LCByYXRlUHJvZ3Jlc3NpdmVTdW0pO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgKGZyb250bWF0dGVyKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAoZnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0XHRcdFx0bGV0IHBvaW50c1JlY2VpdmVkID0gMDsgLy8gdG8gaGF2ZSBvbmUgbWVzc2FnZSBhdCB0aGUgZW5kIGhvdyBtYW55IHBvaW50cyByZWNlaXZlZFxyXG5cdFx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddLCBub3RlTWFqdXJpdHkpID49IDEpe1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBub3RlLW1hdHVyaXR5ID49MWApXHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTm90ZU1hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSwgbm90ZU1hanVyaXR5KVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c05vdGVNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCJmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddXCIsIG5vdGVNYWp1cml0eSkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoISgnbm90ZS1tYXR1cml0eScgaW4gZnJvbnRtYXR0ZXIpKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNOb3RlTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgbm90ZU1hanVyaXR5KVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c05vdGVNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIG5vdGVNYWp1cml0eSkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpO1xyXG5cdFx0XHRcdFx0XHRcdGRldGVjdElmTm90ZUlzRmlyc3RUaW1lUmF0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSwgZmlsZU5hbWVSYXRlKSA+PSAxICYmICd0aXRsZS1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10sIGZpbGVOYW1lUmF0ZSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10sIGZpbGVOYW1lUmF0ZSkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoISgndGl0bGUtY2xhc3MnIGluIGZyb250bWF0dGVyKSl7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgZmlsZU5hbWVSYXRlKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgZmlsZU5hbWVSYXRlKSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKSA+PSAxKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydub3RlLWxlbmd0aC1jbGFzcyddLCByYXRlRmlsZUxlbmd0aClcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fWVsc2UgaWYgKCEoJ25vdGUtbGVuZ3RoLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIHJhdGVGaWxlTGVuZ3RoKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZUZpbGVMZW5ndGgpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnaW5saW5rLWNsYXNzJ10sIGlubGlua0NsYXNzKSA+PSAxKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZiAoISgnaW5saW5rLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIGlubGlua0NsYXNzKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgaW5saW5rQ2xhc3MpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddLCByYXRlT3V0KSA+PSAxKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZiAoISgnb3V0bGluay1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlT3V0KVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZU91dCkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSkgPj0gMSl7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsncHJvZ3Jlc3NpdmUtc3VtbWFyaXphdGlvbi1tYXR1cml0eSddLCByYXRlUHJvZ3Jlc3NpdmVTdW0pXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1lbHNlIGlmICghKCdwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5JyBpbiBmcm9udG1hdHRlcikpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZVByb2dyZXNzaXZlU3VtKSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhgcG9pbnRzUmVjZWl2ZWQ6ICR7cG9pbnRzUmVjZWl2ZWR9YClcclxuXHRcdFx0XHRcdFx0aWYgKHBvaW50c1JlY2VpdmVkID4gMCl7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWVzc2FnZVBvaW50cyA9IGdldFJhbmRvbU1lc3NhZ2VQb2ludHMocG9pbnRzUmVjZWl2ZWQgKiAodGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgKyB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIpKVxyXG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UobWVzc2FnZVBvaW50cylcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhtZXNzYWdlUG9pbnRzKVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLndyaXRlRnJvbnRtYXR0ZXIoZnJvbnRtYXR0ZXIsIGZpbGVOYW1lUmF0ZSwgcmF0ZUZpbGVMZW5ndGgsIGlubGlua0NsYXNzLCByYXRlT3V0LCByYXRlUHJvZ3Jlc3NpdmVTdW0sIG5vdGVNYWp1cml0eSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRpZiAoZT8ubmFtZSA9PT0gJ1lBTUxQYXJzZUVycm9yJykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gYFVwZGF0ZSBtYWp1cml0eXMgZmFpbGVkIE1hbGZvcm1lZCBmcm9udGFtdHRlciBvbiB0aGlzIGZpbGUgOiAke2ZpbGUucGF0aH0gJHtlLm1lc3NhZ2V9YDtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoZXJyb3JNZXNzYWdlLCA0MDAwKTtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0bmV3IE5vdGljZSgnbm90ZSBtYWp1cml0eSB1cGRhdGVkIScpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnbm90ZSBtYWp1cml0eSB1cGRhdGVkIScpXHJcblx0XHRcdC8vYXdhaXQgdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0XHRcdGF3YWl0IHRoaXMudXBkYXRlU3RhdHVzQmFyKHRoaXMuc3RhdHVzYmFyR2FtaWZpY2F0aW9uKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignZmlsZSB3YXMgbm90IGZvdW5kIHRvIGNhbGN1bGF0ZSBtYWp1cml0aWVzLiBNYWtlIHN1cmUgb25lIGlzIGFjdGl2ZS4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKGRldGVjdElmTm90ZUlzRmlyc3RUaW1lUmF0ZWQpe1xyXG5cdFx0XHRhd2FpdCB0aGlzLmluY3JlYXNlRGFpbHlDcmVhdGVkTm90ZUNvdW50KCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuaW5jcmVhc2VXZWVrbHlDcmVhdGVkTm90ZUNvdW50KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgcmVzZXREYWlseUdvYWxzKCl7XHJcblx0XHRsZXQgcmVzZXQgPSBmYWxzZTtcclxuXHRcdGlmKCFpc1NhbWVEYXkod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmRhaWx5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSkpe1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmRhaWx5Tm90ZUNyZWF0aW9uVGFzayA9IDA7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuZGFpbHlOb3RlQ3JlYXRpb25EYXRlID0gd2luZG93Lm1vbWVudCgpLmZvcm1hdCgnREQuTU0uWVlZWScpXHJcblx0XHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBkYWlseSBDaGFsbGVuZ2UgcmVzZXRlZGApXHJcblx0XHRcdHJlc2V0ID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmKCFpc09uZURheUJlZm9yZSh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSkgJiYgIWlzU2FtZURheSh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSkpe1xyXG5cdFx0XHRjb25zdCBkYXlzUGFzc2VkID0gd2luZG93Lm1vbWVudCgpLmRpZmYod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUsICdERC5NTS5ZWVlZJyksICdkYXlzJykgLSAxOyAvL3RvZGF5IGlzIHN0aWxsIGEgY2hhbmNlLiBcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrID0gMDtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlID0gd2luZG93Lm1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXknKS5mb3JtYXQoJ0RELk1NLllZWVknKVxyXG5cdFx0XHR0aGlzLmRlY3JlYXNlU3RyZWFrYm9vc3RlcihkYXlzUGFzc2VkKVxyXG5cdFx0XHRjb25zb2xlLmxvZyhgJHtkYXlzUGFzc2VkfSBkYXlzIHBhc3NlZGApXHJcblx0XHRcdC8vdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5JykuZm9ybWF0KCdERC5NTS5ZWVlZJylcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVTdGF0dXNCYXIodGhpcy5zdGF0dXNiYXJHYW1pZmljYXRpb24pXHJcblx0XHRcdGNvbnNvbGUubG9nKGB3ZWVrbHkgQ2hhbGxlbmdlIHJlc2V0ZWRgKVxyXG5cdFx0XHRyZXNldCA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZihpc09uZURheUJlZm9yZSh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSkgJiYgdGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrID09IDcpe1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgPSAwO1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUgPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLmZvcm1hdCgnREQuTU0uWVlZWScpXHJcblx0XHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdHJlc2V0ID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmIChyZXNldCl7XHJcblx0XHRcdC8vdGhpcy5kYWlseUNoYWxsZW5nZVVwZGF0ZVByb2ZpbGUodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgMClcclxuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRlYXRpdmF0ZSBib29zdGVyc1xyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZVBlcnBldHVhbFByb2dyZXNzLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ3BlcnBldHVhbFByb2dyZXNzJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIlBlcnBldHVhbCBQcm9ncmVzc1wiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZVN0cmF0ZWdpY1N5bmFwc2VzLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ3N0cmF0ZWdpY1N5bmFwc2VzJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIlN0cmF0ZWdpYyBTeW5hcHNlc1wiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvckxpbmtlcnNMb2RlID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZUxpbmtlcnNMb2RlLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ2xpbmtlcnNMb2RlJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvckxpbmtlcnNMb2RlJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIkxpbmtlcnMgTG9kZVwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24gPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlUmVjdXJzaXZlUmVmbGVjdGlvbiwgJ1lZWVktTU0tREQgSEg6bW06c3MnKSxnZXRCb29zdGVyUnVuVGltZUZyb21WYXJOYW1lKCdyZWN1cnNpdmVSZWZsZWN0aW9uJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24nLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiUmVjdXJzaXZlIFJlZmxlY3Rpb25cIiBoYXMgZW5kZWQuJylcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZVN5bmFwdGljU3VyZ2UsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgnc3luYXB0aWNTdXJnZScpKSl7XHJcblx0XHRcdHRoaXMuc2V0U2V0dGluZ0Jvb2xlYW4oJ2Jvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIlN5bmFwdGljIFN1cmdlXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yVGl0bGVUaXRhbiA9PSB0cnVlICYmIGlzTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3MuYm9vc3RlckRhdGVUaXRsZVRpdGFuLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ3RpdGxlVGl0YW4nKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yVGl0bGVUaXRhbicsZmFsc2UpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXCJUaXRsZSBUaXRhblwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZVByZWNpc2lvblByaXNtLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ3ByZWNpc2lvblByaXNtJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIlByZWNpc2lvbiBQcmlzbVwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3Rvckh5cGVybGlua0hhcm1vbnkgPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlSHlwZXJsaW5rSGFybW9ueSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKSxnZXRCb29zdGVyUnVuVGltZUZyb21WYXJOYW1lKCdoeXBlcmxpbmtIYXJtb255JykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3Rvckh5cGVybGlua0hhcm1vbnknLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiSHlwZXJsaW5rIEhhcm1vbnlcIiBoYXMgZW5kZWQuJylcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYSA9PSB0cnVlICYmIGlzTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3MuYm9vc3RlckRhdGVFcGhlbWVyYWxFdXBob3JpYSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKSxnZXRCb29zdGVyUnVuVGltZUZyb21WYXJOYW1lKCdlcGhlbWVyYWxFdXBob3JpYScpKSl7XHJcblx0XHRcdHRoaXMuc2V0U2V0dGluZ0Jvb2xlYW4oJ2Jvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYScsZmFsc2UpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXCJFcGhlbWVyYWwgRXVwaG9yaWFcIiBoYXMgZW5kZWQuJylcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgaW5jcmVhc2VEYWlseUNyZWF0ZWROb3RlQ291bnQoKXtcclxuXHRcdGxldCBuZXdEYWlseU5vdGVDcmVhdGlvblRhc2sgPSB0aGlzLnNldHRpbmdzLmRhaWx5Tm90ZUNyZWF0aW9uVGFzaztcclxuICAgICAgICBpZiAobmV3RGFpbHlOb3RlQ3JlYXRpb25UYXNrIDwgMil7XHJcblx0XHRcdG5ld0RhaWx5Tm90ZUNyZWF0aW9uVGFzayArKztcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5kYWlseU5vdGVDcmVhdGlvblRhc2sgPSBuZXdEYWlseU5vdGVDcmVhdGlvblRhc2s7XHJcblx0XHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcblxyXG5cdFx0XHRpZihuZXdEYWlseU5vdGVDcmVhdGlvblRhc2sgPT0gMSl7XHJcblx0XHRcdFx0Ly8gdXBkYXRlIEF2YXRhciBQYWdlXHJcblx0XHRcdFx0YXdhaXQgdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGAke25ld0RhaWx5Tm90ZUNyZWF0aW9uVGFza30vMiBOb3RlcyBjcmVhdGVkIHRvZGF5LmApXHJcblx0XHRcdH0gZWxzZSBpZiAobmV3RGFpbHlOb3RlQ3JlYXRpb25UYXNrID09IDIpIHtcclxuXHRcdFx0XHR0aGlzLmluY3JlYXNlU3RyZWFrYm9vc3RlcihzdHJlYWtib29zdGVySW5jcmVhc2VEYWlseSlcclxuXHRcdFx0XHQvL3RoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlckRhdGUgPSB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdERC5NTS5ZWVlZJyk7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c0Jhcih0aGlzLnN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzRm9yRGFpbHlDaGFsbGVuZ2UpXHJcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGdldFJhbmRvbU1lc3NhZ2VUd29Ob3RlQ2hhbGxlbmdlKHBvaW50c0ZvckRhaWx5Q2hhbGxlbmdlICogKHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yICsgdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyKSk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coYGRhaWx5IENoYWxsZW5nZSByZWFjaGVkISAke25ld0RhaWx5Tm90ZUNyZWF0aW9uVGFza30vMiBjcmVhdGVkLmApXHJcblx0XHRcdFx0bmV3IE5vdGljZShtZXNzYWdlKVxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKG1lc3NhZ2UpXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gbm90aGluZyBlbHNlIHRvIGRvIGhlcmVcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhgJHtuZXdEYWlseU5vdGVDcmVhdGlvblRhc2t9LzIgTm90ZXMgY3JlYXRlZCB0b2RheS5gKVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBpbmNyZWFzZVdlZWtseUNyZWF0ZWROb3RlQ291bnQoKXtcclxuXHRcdGlmKGlzT25lRGF5QmVmb3JlKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSl7XHJcblx0XHRcdGF3YWl0IHRoaXMuY2hlY2tGb3JXZWVrbHlOb3RlQ2hhbGxlbmdlQmVsb3c3KCk7XHJcblx0XHR9IGVsc2UgaWYgKGlzU2FtZURheSh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSkpe1xyXG5cdFx0XHQvLyBkbyBub3RoaW5nXHJcblx0XHRcdGNvbnNvbGUubG9nKGBkYWlseSBub3RlIGNyZWF0aW9uIHdhcyByYXRlZCBhbHJlYWR5IHRvZGF5LmApXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUgPSB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdERC5NTS5ZWVlZJylcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrID0gMTtcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgY2hlY2tGb3JXZWVrbHlOb3RlQ2hhbGxlbmdlQmVsb3c3KCkge1xyXG5cdFx0bGV0IGN1cnJlbnRXZWVrbHlDcmVhdGVkTm90ZXMgPSB0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2s7XHJcblx0XHRpZiAoY3VycmVudFdlZWtseUNyZWF0ZWROb3RlcyA8IDcpIHtcclxuXHRcdFx0Y3VycmVudFdlZWtseUNyZWF0ZWROb3RlcysrO1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUgPSB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdERC5NTS5ZWVlZJylcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrID0gY3VycmVudFdlZWtseUNyZWF0ZWROb3RlcztcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHJcblx0XHRcdGF3YWl0IHRoaXMuY2hlY2tGb3JXZWVrbHlOb3RlQ2hhbGxlbmdlRXZhbHVhdGlvbihjdXJyZW50V2Vla2x5Q3JlYXRlZE5vdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYXN5bmMgY2hlY2tGb3JXZWVrbHlOb3RlQ2hhbGxlbmdlRXZhbHVhdGlvbihuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrOiBudW1iZXIpIHtcclxuXHRcdGlmIChuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrIDw9IDYpIHtcclxuXHRcdFx0Ly8gdXBkYXRlIEF2YXRhciBQYWdlXHJcblx0XHRcdGF3YWl0IHRoaXMudXBkYXRlQXZhdGFyUGFnZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYCR7bmV3V2Vla2x5Tm90ZUNyZWF0aW9uVGFza30vNyBOb3RlcyBjcmVhdGVkIGluIGEgY2hhaW4uYClcclxuXHRcdH0gZWxzZSBpZiAobmV3V2Vla2x5Tm90ZUNyZWF0aW9uVGFzayA9PSA3KSB7XHJcblx0XHRcdHRoaXMuaW5jcmVhc2VTdHJlYWtib29zdGVyKHN0cmVha2Jvb3N0ZXJJbmNyZWFzZVdlZWtseSk7XHJcblx0XHRcdC8vdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0RELk1NLllZWVknKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c0ZvcldlZWtseUNoYWxsZW5nZSlcclxuXHRcdFx0Y29uc29sZS5sb2coYFdlZWtseSBDaGFsbGVuZ2UgcmVhY2hlZCEgJHtuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrfS83IGNyZWF0ZWQgaW4gYSBjaGFpbi5gKVxyXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZ2V0UmFuZG9tTWVzc2FnZVdlZWtseUNoYWxsZW5nZShwb2ludHNGb3JXZWVrbHlDaGFsbGVuZ2UgKiAodGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgKyB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIpKTtcclxuXHRcdFx0bmV3IE5vdGljZShtZXNzYWdlKVxyXG5cdFx0XHRjb25zb2xlLmxvZyhtZXNzYWdlKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gbm90aGluZyBlbHNlIHRvIGRvIGhlcmVcclxuXHRcdFx0Y29uc29sZS5sb2coYCR7bmV3V2Vla2x5Tm90ZUNyZWF0aW9uVGFza30vNyBOb3RlcyBjcmVhdGVkIGluIGEgY2hhaW4uYClcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHVwZGF0ZVN0YXR1c0JhcihzdGF0dXNiYXI6IEhUTUxTcGFuRWxlbWVudCl7XHJcblx0XHRjb25zdCBjdXJyZW50TGV2ZWwgPSBnZXRMZXZlbEZvclBvaW50cyh0aGlzLnNldHRpbmdzLnN0YXR1c1BvaW50cylcclxuXHRcdGNvbnN0IHByb2dyZXNzYmFyUGVyY2VudCA9ICh0aGlzLnNldHRpbmdzLnN0YXR1c1BvaW50cyAtIGN1cnJlbnRMZXZlbC5wb2ludHMpLyhjdXJyZW50TGV2ZWwucG9pbnRzTmV4dCAtIGN1cnJlbnRMZXZlbC5wb2ludHMpKjEwMDtcclxuXHRcdGNvbnN0IGNoYXJOdW1Qcm9ncmVzc2JhciA9IDEwO1xyXG5cdFx0Y29uc3QgYmFyTGVuZ3RoID0gTWF0aC5yb3VuZChwcm9ncmVzc2JhclBlcmNlbnQgLyBjaGFyTnVtUHJvZ3Jlc3NiYXIpXHJcblx0XHRjb25zdCBib29zdGVyRmFjdG9yID0gdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyXHJcblx0XHRzdGF0dXNiYXIuc2V0VGV4dChgXHVEODNDXHVERkIyfGx2bDogJHt0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsfSB8ICR7dGhpcy5jcmVhdGVQcm9ncmVzc2JhcihjaGFyTnVtUHJvZ3Jlc3NiYXIsIGJhckxlbmd0aCl9fFx1RDgzRFx1REU4MCR7Ym9vc3RlckZhY3Rvcn0ke3RoaXMucmF0ZUJvb3N0ZXJEaXJlY3Rpb24oKX1gKVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByYXRlQm9vc3RlckRpcmVjdGlvbigpe1xyXG5cdFx0bGV0IGRpcmVjdGlvbiA9ICdcdTJCMDZcdUZFMEYnXHJcblx0XHQvKmNvbnN0IG9uZURheUJlZm9yZUN1cnJlbnQgPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpOyAvLyBDYWxjdWxhdGUgb25lIGRheSBiZWZvcmUgY3VycmVudCBkYXRlXHJcblx0XHRpZih3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKS5pc1NhbWUob25lRGF5QmVmb3JlQ3VycmVudCwgJ2RheScpKXtcclxuXHRcdFx0ZGlyZWN0aW9uID0gJ1x1MkIwNlx1RkUwRidcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGRpcmVjdGlvbiA9ICdcdTJCMDdcdUZFMEYnXHJcblx0XHR9Ki9cclxuXHRcdGlmKHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlckRhdGUpe1xyXG5cdFx0XHRkaXJlY3Rpb24gPSAnXHUyQjA2XHVGRTBGJztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGRpcmVjdGlvbiA9ICdcdTJCMDdcdUZFMEYnO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGRpcmVjdGlvblxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVQcm9ncmVzc2JhcihjaGFyTnVtUHJvZ3Jlc3NiYXI6IG51bWJlciwgYmFyTGVuZ3RoOiBudW1iZXIpIHtcclxuXHRcdGxldCBwcm9ncmVzc2JhciA9ICcnXHJcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8PSBjaGFyTnVtUHJvZ3Jlc3NiYXI7IGkrKykge1xyXG5cdFx0XHRpZiAoaSA8PSBiYXJMZW5ndGgpIHtcclxuXHRcdFx0XHRwcm9ncmVzc2JhciArPSAnPSdcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwcm9ncmVzc2JhciArPSAnLSdcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHByb2dyZXNzYmFyO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRTZXR0aW5ncywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkU2V0dGluZ3MoKScpXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBnaXZlU3RhdHVzUG9pbnRzKHBvaW50c1RvQWRkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+e1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3IgPSAxO1xyXG5cdFx0bGV0IHN0cmVha2Jvb3N0ZXIgPSB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXI7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXMgPSAwO1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZSA9IDA7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24gPSAwO1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yVGl0bGVUaXRhbiA9IDA7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueSA9IDA7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhID0gMDtcclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlclN0YXRlKXtcclxuXHRcdFx0Ym9vc3RlckZhY3RvciA9IHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzKXtcclxuXHRcdFx0Ym9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzID0gMztcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcyl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcyA9IDM7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yTGlua2Vyc0xvZGUpe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yTGlua2Vyc0xvZGUgPSAxMDtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JSZWN1cnNpdmVSZWZsZWN0aW9uKXtcclxuXHRcdFx0Ym9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24gPSA1O1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclN5bmFwdGljU3VyZ2Upe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yU3luYXB0aWNTdXJnZSA9IDIwO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclRpdGxlVGl0YW4pe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yVGl0bGVUaXRhbiA9IDQ7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20pe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20gPSA0O1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3Rvckh5cGVybGlua0hhcm1vbnkpe1xyXG5cdFx0XHRib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueSA9IDU7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWEpe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWEgPSA4MDtcclxuXHRcdH1cclxuXHRcdFxyXG5cclxuXHRcdHRoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzID0gcG9pbnRzVG9BZGQgKiAoYm9vc3RlckZhY3RvciArIHN0cmVha2Jvb3N0ZXIgKyBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3MgKyBib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXMgKyBib29zdGVyRmFjdG9yTGlua2Vyc0xvZGUgKyBib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbiArIGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlICsgYm9vc3RlckZhY3RvclRpdGxlVGl0YW4gKyBib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20gKyBib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueSArIGJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYSApICsgdGhpcy5zZXR0aW5ncy5zdGF0dXNQb2ludHNcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0fVxyXG5cclxuXHRhc3luYyBpbmNyZWFzZVN0cmVha2Jvb3N0ZXIoaW5jcmVhc2VWYWx1ZTpudW1iZXIpe1xyXG5cdFx0bGV0IG5ld0Jvb3N0ZXJGYWtmb3IgPSBwYXJzZUZsb2F0KCh0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIgKyBpbmNyZWFzZVZhbHVlKS50b0ZpeGVkKHN0cmVha2Jvb3N0ZXJJbmNyZWFzZVdlZWtseSkpO1xyXG5cdFx0aWYobmV3Qm9vc3RlckZha2ZvciA+IDgwKXtcclxuXHRcdFx0bmV3Qm9vc3RlckZha2ZvciA9IDgwO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyID0gbmV3Qm9vc3RlckZha2ZvcjtcclxuXHRcdHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlckRhdGUgPSB0cnVlO1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKVxyXG5cdFx0Y29uc29sZS5sb2coYHN0cmVha2Jvb3N0ZXI6ICR7dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyfWApXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgZGVjcmVhc2VTdHJlYWtib29zdGVyKGRlY3JlYXNlVmFsdWU6bnVtYmVyKXtcclxuXHRcdGxldCBuZXdCb29zdGVyRmFrZm9yID0gcGFyc2VGbG9hdCgodGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyIC0gZGVjcmVhc2VWYWx1ZSkudG9GaXhlZChzdHJlYWtib29zdGVyRGVjcmVhc2UpKVxyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyID0gbmV3Qm9vc3RlckZha2ZvclxyXG5cdFx0aWYgKG5ld0Jvb3N0ZXJGYWtmb3IgPCAwKXtcclxuXHRcdFx0bmV3Qm9vc3RlckZha2ZvciA9IDBcclxuXHRcdH1cclxuXHRcdHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlciA9IG5ld0Jvb3N0ZXJGYWtmb3JcclxuXHRcdHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlckRhdGUgPSBmYWxzZTtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyB1cGRhdGVBdmF0YXJQYWdlKGF2YXRhclBhZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+e1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHthdmF0YXJQYWdlTmFtZX0ubWRgKTtcclxuXHRcdGlmIChleGlzdGluZ0ZpbGUgPT0gbnVsbCkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgRmlsZSAke2F2YXRhclBhZ2VOYW1lfS5tZCBkb2VzIG5vdCBleGlzdGApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCBmaWxlID0gZXhpc3RpbmdGaWxlIGFzIFRGaWxlO1xyXG5cclxuXHRcdC8vY29uc29sZS5sb2coYGN1cnJlbnQgc3RhdHVzUG9pbnRzOiAke3RoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzfWApXHJcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblx0XHRsZXQgcmVmZXJlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2UyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2UzOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2U0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBlbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBlbmQyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBzdGFydDI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IGVuZDM6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0MzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kNDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgc3RhcnQ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XHJcblx0XHRcdGlmIChsaW5lID09PSBcIl5sZXZlbEFuZFBvaW50c1wiKSB7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZSA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0cmVmZXJlbmNlID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiXmRhaWx5Tm90ZXNDaGFsbGVuZ2VcIikge1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UyID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UyID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiXndlZWtseU5vdGVzQ2hhbGxlbmdlXCIpIHtcclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlMyA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0cmVmZXJlbmNlMyA9IGk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChsaW5lID09PSBcIl5ib29zdGVyRmFjdG9yXCIpIHtcclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlNCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0cmVmZXJlbmNlNCA9IGk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyByZWFkIGN1cnJlbnQgUG9pbnRzIGZyb20gc2V0dGluZ3NcclxuXHRcdGNvbnN0IG5ld1BvaW50cyA9IHRoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzXHJcblxyXG5cdFx0Y29uc3QgbGV2ZWwgPSBnZXRMZXZlbEZvclBvaW50cyhuZXdQb2ludHMpO1xyXG5cdFx0bGV0IG5leHRMZXZlbEF0ID0gdGhpcy5zZXR0aW5ncy54cEZvck5leHRMZXZlbDtcclxuXHRcdGxldCByZWNlaXZlQmFkZ2UgPSBmYWxzZVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwgPCBsZXZlbC5sZXZlbCl7XHJcblx0XHRcdC8vIExldmVsIFVwIGFyY2hpdmVkXHJcblx0XHRcdG5ldyBOb3RpY2UoYFdpdGggJHtuZXdQb2ludHN9IHBvaW50cywgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgJHtsZXZlbC5sZXZlbH0uYClcclxuXHRcdFx0Ly8gY2hlY2sgZmlyc3QgaWYgdGhpcyBtZWFucyBhIG5ldyBiYWRnZSBiZWZvcmUgaXQgZ2V0cyBvdmVyd3JpdHRlblxyXG5cdFx0XHRyZWNlaXZlQmFkZ2UgPSBjaGVja0lmUmVjZWl2ZUFCYWRnZSh0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsLCBsZXZlbC5sZXZlbClcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbCA9IGxldmVsLmxldmVsO1xyXG5cdFx0XHRuZXh0TGV2ZWxBdCA9IGxldmVsLnBvaW50c05leHQ7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3MueHBGb3JOZXh0TGV2ZWwgPSBsZXZlbC5wb2ludHNOZXh0O1xyXG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcHJvZ3Jlc3NCYXJFbmQgPSBuZXh0TGV2ZWxBdCAtIG5ld1BvaW50cztcclxuXHRcdGNvbnN0IG5ld1BvaW50c1N0cmluZyA9ICd8ICoqTGV2ZWwqKiAgfCAqKicgKyBsZXZlbC5sZXZlbCArICcqKiB8XFxufCBQb2ludHMgfCAnICsgbmV3UG9pbnRzICsgJyAgICB8XFxuXmxldmVsQW5kUG9pbnRzXFxuYGBgY2hhcnRcXG50eXBlOiBiYXJcXG5sYWJlbHM6IFtFeHByaXJpZW5jZV1cXG5zZXJpZXM6XFxuICAtIHRpdGxlOiBwb2ludHMgcmVhY2hlZFxcbiAgICBkYXRhOiBbJyArIG5ld1BvaW50cyArICddXFxuICAtIHRpdGxlOiBwb2ludHMgdG8gZWFybiB0byBsZXZlbCB1cFxcbiAgICBkYXRhOiBbJyArIHByb2dyZXNzQmFyRW5kICsgJ11cXG54TWluOiAnICsgbGV2ZWwucG9pbnRzICsgJ1xcbnhNYXg6ICcgKyBsZXZlbC5wb2ludHNOZXh0ICsgJ1xcbnRlbnNpb246IDAuMlxcbndpZHRoOiA0MCVcXG5sYWJlbENvbG9yczogZmFsc2VcXG5maWxsOiBmYWxzZVxcbmJlZ2luQXRaZXJvOiBmYWxzZVxcbmJlc3RGaXQ6IGZhbHNlXFxuYmVzdEZpdFRpdGxlOiB1bmRlZmluZWRcXG5iZXN0Rml0TnVtYmVyOiAwXFxuc3RhY2tlZDogdHJ1ZVxcbmluZGV4QXhpczogeVxcbnhUaXRsZTogXCJwcm9ncmVzc1wiXFxubGVnZW5kOiBmYWxzZVxcbmBgYCdcclxuXHRcdGNvbnN0IGRhaWx5Q2hhbGxlbmdlID0gJ3wgKipkYWlseSBOb3RlcyoqIHwgKicgKyBwb2ludHNGb3JEYWlseUNoYWxsZW5nZSAqICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvciArIHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlcikgKyAnRVAqIHwgKionICsgdGhpcy5zZXR0aW5ncy5kYWlseU5vdGVDcmVhdGlvblRhc2sgKyAnLzIqKiAgIHwnO1xyXG5cdFx0Y29uc3QgZGF5c0xlZnRJbldlZWtseUNoYWluIDogbnVtYmVyID0gNyAtIHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uVGFzaztcclxuXHRcdGNvbnN0IHdlZWtseUNoYWxsZW5nZSA9ICd8ICoqd2Vla2x5IE5vdGVzKiogfCAqJyArIHBvaW50c0ZvcldlZWtseUNoYWxsZW5nZSAqICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvciArIHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlcikgKyAnRVAqICAgICB8ICAqKicgKyB0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgKyAnLzcqKiAgIHxcXG5ed2Vla2x5Tm90ZXNDaGFsbGVuZ2VcXG5gYGBjaGFydFxcbnR5cGU6IGJhclxcbmxhYmVsczogW2RheXMgZG9uZSBpbiBhIHJvd11cXG5zZXJpZXM6XFxuICAtIHRpdGxlOiBkYXlzIHRvIGRvIGluIGEgcm93XFxuICAgIGRhdGE6IFsnICsgdGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrICsgJ11cXG4gIC0gdGl0bGU6IHBvaW50cyB0byBlYXJuIHRvIGxldmVsIHVwXFxuICAgIGRhdGE6IFsnICsgZGF5c0xlZnRJbldlZWtseUNoYWluICsgJ11cXG54TWluOiAwXFxueE1heDogN1xcbnRlbnNpb246IDAuMlxcbndpZHRoOiA0MCVcXG5sYWJlbENvbG9yczogZmFsc2VcXG5maWxsOiBmYWxzZVxcbmJlZ2luQXRaZXJvOiBmYWxzZVxcbmJlc3RGaXQ6IGZhbHNlXFxuYmVzdEZpdFRpdGxlOiB1bmRlZmluZWRcXG5iZXN0Rml0TnVtYmVyOiAwXFxuc3RhY2tlZDogdHJ1ZVxcbmluZGV4QXhpczogeVxcbnhUaXRsZTogXCJwcm9ncmVzc1wiXFxubGVnZW5kOiBmYWxzZVxcbmBgYCc7XHJcblx0XHRjb25zdCBib29zdGVyRmFjdG9yID0gJ3wgKipib29zdGVyIGZhY3RvcioqIHwgKionICsgdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyICsgJyoqIHwnXHJcblxyXG5cdFx0aWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZTIgIT0gbnVsbCAmJiByZWZlcmVuY2UzICE9IG51bGwgJiYgcmVmZXJlbmNlNCAhPSBudWxsKXtcclxuXHRcdFx0c3RhcnQgPSByZWZlcmVuY2UgLSAyO1xyXG5cdFx0XHRlbmQgPSByZWZlcmVuY2UgKyAyNDtcclxuXHRcdFx0c3RhcnQyID0gcmVmZXJlbmNlMiAtIDEgLSAyNTsgLy8gbm8gaWRlYSB3Ynkgb2Zmc2V0IDI1IGlzIG5lZWRlZFxyXG5cdFx0XHRlbmQyID0gcmVmZXJlbmNlMiAtIDI1OyAvLyBubyBpZGVhIHdieSBvZmZzZXQgMjUgaXMgbmVlZGVkXHJcblx0XHRcdHN0YXJ0MyA9IHJlZmVyZW5jZTMgLSAxIC0yNTsgLy8gbm8gaWRlYSB3Ynkgb2Zmc2V0IDI1IGlzIG5lZWRlZFxyXG5cdFx0XHRlbmQzID0gcmVmZXJlbmNlMyArIDI0IC0yNTsgLy8gbm8gaWRlYSB3Ynkgb2Zmc2V0IDI1IGlzIG5lZWRlZFxyXG5cdFx0XHRzdGFydDQgPSByZWZlcmVuY2U0IC0gMSAtIDI1OyAvLyBubyBpZGVhIHdieSBvZmZzZXQgNTUgaXMgbmVlZGVkXHJcblx0XHRcdGVuZDQgPSByZWZlcmVuY2U0IC0gMjUgOyAvLyBubyBpZGVhIHdieSBvZmZzZXQgNTUgaXMgbmVlZGVkXHJcblxyXG5cclxuXHRcdFx0Y29uc3QgbmV3TGluZXMgPSBbLi4ubGluZXMuc2xpY2UoMCwgc3RhcnQpLCBuZXdQb2ludHNTdHJpbmcsIC4uLmxpbmVzLnNsaWNlKGVuZCldO1xyXG5cdFx0XHRjb25zdCBuZXdMaW5lczIgPSBbLi4ubmV3TGluZXMuc2xpY2UoMCwgc3RhcnQyKSwgZGFpbHlDaGFsbGVuZ2UsIC4uLm5ld0xpbmVzLnNsaWNlKGVuZDIpXTtcclxuXHRcdFx0Y29uc3QgbmV3TGluZXMzID0gWy4uLm5ld0xpbmVzMi5zbGljZSgwLCBzdGFydDMpLCB3ZWVrbHlDaGFsbGVuZ2UsIC4uLm5ld0xpbmVzMi5zbGljZShlbmQzKV07XHJcblx0XHRcdGNvbnN0IG5ld0xpbmVzNCA9IFsuLi5uZXdMaW5lczMuc2xpY2UoMCwgc3RhcnQ0KSwgYm9vc3RlckZhY3RvciwgLi4ubmV3TGluZXMzLnNsaWNlKGVuZDQpXTtcclxuXHRcdFx0YXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdMaW5lczQuam9pbihcIlxcblwiKSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVjZWl2ZUJhZGdlXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgZ2l2ZUJhZGdlSW5Qcm9maWxlKGF2YXRhclBhZ2VOYW1lOiBzdHJpbmcsIGJhZGdlOiBCYWRnZSl7XHJcblx0XHRjb25zdCBleGlzdGluZ0ZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke2F2YXRhclBhZ2VOYW1lfS5tZGApO1xyXG5cdFx0aWYgKGV4aXN0aW5nRmlsZSA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGZpbGUgPSBleGlzdGluZ0ZpbGUgYXMgVEZpbGU7XHJcblxyXG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgcmVmZXJlbmNlMjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBzdGFydDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kMjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgc3RhcnQyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XHJcblx0XHRcdGlmIChsaW5lID09PSBcIiMjIyMgYWNoaWV2ZWRcIikge1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdHJlZmVyZW5jZSA9IGk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChsaW5lID09PSBiYWRnZS5sZXZlbCArIFwiOiAqXCIgKyBiYWRnZS5uYW1lICsgXCIqXCIpe1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UyID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UyID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChyZWZlcmVuY2UgIT0gbnVsbCAmJiByZWZlcmVuY2UyICE9IG51bGwpe1xyXG5cdFx0XHRlbmQgPSByZWZlcmVuY2UgKyAxO1xyXG5cdFx0XHRzdGFydCA9IHJlZmVyZW5jZSArIDE7XHJcblxyXG5cdFx0XHRlbmQyID0gcmVmZXJlbmNlMiArIDI7XHJcblx0XHRcdHN0YXJ0MiA9IHJlZmVyZW5jZTIgKyAxO1xyXG5cclxuXHRcdFx0Y29uc3QgYmFkZ2VTdHJpbmcgPSBcIioqXCIgKyBiYWRnZS5uYW1lICsgXCIqKiBcIiArIGJhZGdlLmxldmVsICsgXCJcXG4+IFwiICsgYmFkZ2UuZGVzY3JpcHRpb24gKyBcIiAtICpcIiArIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0QuTS5ZWScpICsgXCIqXFxuXCJcclxuXHRcdFx0Y29uc3QgbmV3TGluZXMgPSBbLi4ubGluZXMuc2xpY2UoMCwgc3RhcnQpLCBiYWRnZVN0cmluZywgLi4ubGluZXMuc2xpY2UoZW5kKV07XHJcblx0XHRcdGNvbnN0IG5ld0xpbmVzMiA9IFsuLi5uZXdMaW5lcy5zbGljZSgwLCBzdGFydDIpLCAuLi5uZXdMaW5lcy5zbGljZShlbmQyKV1cclxuXHRcdFx0YXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdMaW5lczIuam9pbihcIlxcblwiKSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBiYWRnZVN0cmluZzogJHtiYWRnZVN0cmluZ31gKVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgZ2l2ZUluaXRCYWRnZUluUHJvZmlsZShhdmF0YXJQYWdlTmFtZTogc3RyaW5nLCBiYWRnZTogQmFkZ2Upe1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHthdmF0YXJQYWdlTmFtZX0ubWRgKTtcclxuXHRcdGlmIChleGlzdGluZ0ZpbGUgPT0gbnVsbCkge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgRmlsZSAke2F2YXRhclBhZ2VOYW1lfS5tZCBkb2VzIG5vdCBleGlzdGApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBmaWxlID0gZXhpc3RpbmdGaWxlIGFzIFRGaWxlO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdGxldCByZWZlcmVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IGVuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgc3RhcnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTtcclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiIyMjIyBhY2hpZXZlZFwiKSB7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZSA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0cmVmZXJlbmNlID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChyZWZlcmVuY2UgIT0gbnVsbCApe1xyXG5cdFx0XHRlbmQgPSByZWZlcmVuY2UgKyAyO1xyXG5cdFx0XHRzdGFydCA9IHJlZmVyZW5jZSArIDE7XHJcblxyXG5cdFx0XHRjb25zdCBiYWRnZVN0cmluZyA9IFwiKipcIiArIGJhZGdlLm5hbWUgKyBcIioqXFxuPiBcIiArIGJhZGdlLmRlc2NyaXB0aW9uICsgXCIgLSAqXCIgKyB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdELk0uWVknKSArIFwiKlxcblwiXHJcblx0XHRcdGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzLnNsaWNlKDAsIHN0YXJ0KSwgYmFkZ2VTdHJpbmcsIC4uLmxpbmVzLnNsaWNlKGVuZCldO1xyXG5cdFx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0xpbmVzLmpvaW4oXCJcXG5cIikpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgYmFkZ2VTdHJpbmc6ICR7YmFkZ2VTdHJpbmd9YClcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlbW92ZUJhZGdlc1doZW5Jbml0TGV2ZWxIaWdoZXIoYXZhdGFyUGFnZU5hbWU6IHN0cmluZywgbGV2ZWw6IG51bWJlcil7XHJcblx0XHRjb25zdCBleGlzdGluZ0ZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke2F2YXRhclBhZ2VOYW1lfS5tZGApO1xyXG5cdFx0aWYgKGV4aXN0aW5nRmlsZSA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGZpbGUgPSBleGlzdGluZ0ZpbGUgYXMgVEZpbGU7XHJcblxyXG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgcmVmZXJlbmNlMjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xyXG5cdFx0XHRpZiAobGluZSA9PT0gXCIjIyMjIG91dHN0YW5kaW5nXCIpIHtcclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UgPSBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlMiA9PSBudWxsKXtcclxuXHRcdFx0XHQvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdGhlIGxldmVsIG51bWJlclxyXG5cdFx0XHRcdGNvbnN0IGxldmVsUmVnZXggPSAvbGV2ZWwgKFxcZCspLztcclxuXHRcdFx0XHQvLyBFeHRyYWN0IHRoZSBsZXZlbCBudW1iZXIgdXNpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvblxyXG5cdFx0XHRcdGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaChsZXZlbFJlZ2V4KTtcclxuXHJcblx0XHRcdFx0aWYobWF0Y2gpe1xyXG5cdFx0XHRcdFx0Y29uc3QgbGV2ZWxOdW1iZXIgPSBwYXJzZUludChtYXRjaFsxXSwgMTApOyAvLyBDb252ZXJ0IHRoZSBtYXRjaGVkIG51bWJlciB0byBhbiBpbnRlZ2VyXHJcblx0XHRcdFx0XHRpZiAobGV2ZWxOdW1iZXIgPiBsZXZlbCkge1xyXG5cdFx0XHRcdFx0XHRyZWZlcmVuY2UyID0gaVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZTIgIT0gbnVsbCl7XHJcblx0XHRcdGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzLnNsaWNlKDAsIHJlZmVyZW5jZSArIDEpLCAuLi5saW5lcy5zbGljZShyZWZlcmVuY2UyKV07XHJcblx0XHRcdGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3TGluZXMuam9pbihcIlxcblwiKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgY3JlYXRlQ2hhcnQodmF1bHQ6IFZhdWx0KTogUHJvbWlzZTxzdHJpbmc+e1xyXG5cdFx0Y29uc3QgZmlsZXMgPSB2YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRjb25zdCBlYXJsaWVzdEZpbGUgPSBmaW5kRWFybGllc3RNb2RpZmllZEZpbGUoZmlsZXMpXHJcblx0XHQvL2xldCBlYXJsaWVzdERhdGUgPSBlYXJsaWVzdEZpbGUuc3RhdC5jdGltZVxyXG5cdFx0Ly9pZiAoZWFybGllc3RGaWxlLnN0YXQubXRpbWUgPCBlYXJsaWVzdEZpbGUuc3RhdC5jdGltZSApe1xyXG5cdFx0Y29uc3QgZWFybGllc3REYXRlID0gZWFybGllc3RGaWxlLnN0YXQubXRpbWVcclxuXHRcdC8vfVxyXG5cclxuXHRcdGxldCBtb250aENvdW50ZXIgPSAwIC8vZm9ybWF0KG5ldyBEYXRlKGVhcmxpZXN0RGF0ZSksICdNTScpO1xyXG5cdFx0bGV0IGRhdGVDb3VudCA9IG5ldyBEYXRlKGVhcmxpZXN0RGF0ZSk7IC8vIHVtIGVzIGhvY2h6XHUwMEU0aGxlbiB6dSBrXHUwMEY2bm5lblxyXG5cdFx0Ly9jb25zdCBmaWxlRGF0ZU1vbnRoTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuXHRcdGNvbnN0IGZpbGVEYXRlTW9udGhNYXBNb2QgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cdFx0Y29uc3QgbW9udGhjb3VudCA9IG1vbnRoc0JldHdlZW4obmV3IERhdGUoZWFybGllc3REYXRlKSwgbmV3IERhdGUoKSlcclxuXHRcdGxldCBkYXRlU3RyaW5nID0gZGF0ZUNvdW50LmdldE1vbnRoKCkrMSArIFwiLlwiICsgZGF0ZUNvdW50LmdldEZ1bGxZZWFyKClcclxuXHRcdGxldCB5TGFiZWwgPSBcIlwiXHJcblx0XHQvLyBjcmVhdGUgQmFzZSBmb3IgY291bnRpbmcgY3JlYXRlZFxyXG5cdFx0Lyp3aGlsZSAobW9udGhDb3VudGVyIDwgbW9udGhjb3VudCl7XHJcblx0XHRcdGRhdGVTdHJpbmcgPSBkYXRlQ291bnQuZ2V0TW9udGgoKSsxICsgXCIuXCIgKyBkYXRlQ291bnQuZ2V0RnVsbFllYXIoKVxyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBkYXRlU3RyaW5nOiAke2RhdGVTdHJpbmd9YClcclxuXHRcdFx0ZGF0ZUNvdW50LnNldE1vbnRoKGRhdGVDb3VudC5nZXRNb250aCgpICsgMSlcclxuXHRcdFx0bW9udGhDb3VudGVyICs9IDE7XHJcblx0XHRcdGZpbGVEYXRlTW9udGhNYXAuc2V0KGRhdGVTdHJpbmcsIDApXHJcblx0XHR9Ki9cclxuXHJcblx0XHRtb250aENvdW50ZXIgPSAwXHJcblx0XHRkYXRlQ291bnQgPSBuZXcgRGF0ZShlYXJsaWVzdERhdGUpOyAvLyB1bSBlcyBob2Noelx1MDBFNGhsZW4genUga1x1MDBGNm5uZW5cclxuXHRcdGRhdGVTdHJpbmcgPSBkYXRlQ291bnQuZ2V0TW9udGgoKSsxICsgXCIuXCIgKyBkYXRlQ291bnQuZ2V0RnVsbFllYXIoKVxyXG5cdFx0Ly8gY3JlYXRlIEJhc2UgZm9yIGNvdW50aW5nIG1vZGlmaWVkXHJcblx0XHR3aGlsZSAobW9udGhDb3VudGVyIDwgbW9udGhjb3VudCl7XHJcblx0XHRcdGRhdGVTdHJpbmcgPSBkYXRlQ291bnQuZ2V0TW9udGgoKSsxICsgXCIuXCIgKyBkYXRlQ291bnQuZ2V0RnVsbFllYXIoKVxyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBkYXRlU3RyaW5nOiAke2RhdGVTdHJpbmd9YClcclxuXHRcdFx0eUxhYmVsID0geUxhYmVsICsgZGF0ZVN0cmluZyArIFwiLCBcIlxyXG5cdFx0XHRkYXRlQ291bnQuc2V0TW9udGgoZGF0ZUNvdW50LmdldE1vbnRoKCkgKyAxKVxyXG5cdFx0XHRtb250aENvdW50ZXIgKz0gMTtcclxuXHRcdFx0ZmlsZURhdGVNb250aE1hcE1vZC5zZXQoZGF0ZVN0cmluZywgMClcclxuXHRcdH1cclxuXHRcdHlMYWJlbCA9IHlMYWJlbC5zbGljZSgwLHlMYWJlbC5sZW5ndGgtMilcclxuXHJcblx0XHQvLyBjb3VudCBob3cgbWFueSBmaWxlcyBpbiBlYWNoIG1vbnRoXHJcblx0XHQvKmNvbnN0IGNyZWF0aW9uRGF0ZXMgPSBnZXRDcmVhdGlvbkRhdGVzKGZpbGVzKVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjcmVhdGlvbkRhdGVzLmxlbmd0aDsgaSsrKXtcclxuXHRcdFx0Ly9maWxlRGF0ZU1vbnRoTWFwLnNldChmb3JtYXQoY3JlYXRpb25EYXRlc1tpXSwgJ00ueXl5eScpLGZpbGVEYXRlTW9udGhNYXAuZ2V0KGZvcm1hdChjcmVhdGlvbkRhdGVzW2ldLCAnTS55eXl5JykpKzEpXHJcblx0XHRcdGNvbnN0IGZvcm1hdHRlZERhdGUgPSBmb3JtYXQoY3JlYXRpb25EYXRlc1tpXSwgJ00ueXl5eScpO1xyXG5cdFx0XHRjb25zdCBjdXJyZW50Q291bnQgPSBmaWxlRGF0ZU1vbnRoTWFwLmdldChmb3JtYXR0ZWREYXRlKTtcclxuXHJcblx0XHRcdGlmIChjdXJyZW50Q291bnQgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGZpbGVEYXRlTW9udGhNYXAuc2V0KGZvcm1hdHRlZERhdGUsIGN1cnJlbnRDb3VudCArIDEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBpbiB0aGUgbWFwLCBpbml0aWFsaXplIGl0IHdpdGggYSBjb3VudCBvZiAxXHJcblx0XHRcdFx0ZmlsZURhdGVNb250aE1hcC5zZXQoZm9ybWF0dGVkRGF0ZSwgMSk7XHJcblx0XHRcdH1cclxuXHRcdH0qL1xyXG5cclxuXHRcdC8vIGNvdW50IGhvdyBtYW55IG1vZCBmaWxlcyBpbiBlYWNoIG1vbnRoXHJcblx0XHRjb25zdCBtb2RpZmljYXRpb25EYXRlcyA9IGdldE1vZGlmaWNhdGlvbkRhdGVzKGZpbGVzKVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtb2RpZmljYXRpb25EYXRlcy5sZW5ndGg7IGkrKyl7XHJcblx0XHRcdC8vZmlsZURhdGVNb250aE1hcE1vZC5zZXQoZm9ybWF0KG1vZGlmaWNhdGlvbkRhdGVzW2ldLCAnTS55eXl5JyksZmlsZURhdGVNb250aE1hcE1vZC5nZXQoZm9ybWF0KG1vZGlmaWNhdGlvbkRhdGVzW2ldLCAnTS55eXl5JykpKzEpXHJcblx0XHRcdGNvbnN0IGZvcm1hdHRlZERhdGUgPSBmb3JtYXQobW9kaWZpY2F0aW9uRGF0ZXNbaV0sICdNLnl5eXknKTtcclxuXHRcdFx0Y29uc3QgY3VycmVudENvdW50ID0gZmlsZURhdGVNb250aE1hcE1vZC5nZXQoZm9ybWF0dGVkRGF0ZSk7XHJcblxyXG5cdFx0XHRpZiAoY3VycmVudENvdW50ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRmaWxlRGF0ZU1vbnRoTWFwTW9kLnNldChmb3JtYXR0ZWREYXRlLCBjdXJyZW50Q291bnQgKyAxKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIG1hcCwgaW5pdGlhbGl6ZSBpdCB3aXRoIGEgY291bnQgb2YgMVxyXG5cdFx0XHRcdGZpbGVEYXRlTW9udGhNYXBNb2Quc2V0KGZvcm1hdHRlZERhdGUsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgQ2hhcnQgU3RyaW5nIGNyZWF0ZWRcclxuXHRcdC8qbGV0IGNoYXJTdHJpbmdDcmVhdGVkID0gXCJcIlxyXG5cdFx0Zm9yIChjb25zdCBbdmFsdWVdIG9mIGZpbGVEYXRlTW9udGhNYXApIHtcclxuXHRcdFx0Y2hhclN0cmluZ0NyZWF0ZWQgPSBjaGFyU3RyaW5nQ3JlYXRlZCArIHZhbHVlICsgXCIsIFwiXHJcblx0XHR9XHJcblx0XHRjaGFyU3RyaW5nQ3JlYXRlZCA9IGNoYXJTdHJpbmdDcmVhdGVkLnNsaWNlKDAsY2hhclN0cmluZ0NyZWF0ZWQubGVuZ3RoLTIpKi9cclxuXHJcblx0XHQvLyBidWlsZCBDaGFydCBTdHJpbmcgbW9kaWZpZWRcclxuXHRcdGxldCBjaGFyU3RyaW5nTW9kaWZpZWQgPSBcIlwiXHJcblx0XHRmb3IgKGNvbnN0IFt2YWx1ZV0gb2YgZmlsZURhdGVNb250aE1hcE1vZCkge1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBrZXk6ICR7a2V5fSwgdmFsdWU6ICR7dmFsdWV9YCk7XHJcblx0XHRcdGNoYXJTdHJpbmdNb2RpZmllZCA9IGNoYXJTdHJpbmdNb2RpZmllZCArIHZhbHVlICsgXCIsIFwiXHJcblx0XHR9XHJcblx0XHRjaGFyU3RyaW5nTW9kaWZpZWQgPSBjaGFyU3RyaW5nTW9kaWZpZWQuc2xpY2UoMCxjaGFyU3RyaW5nTW9kaWZpZWQubGVuZ3RoLTIpXHJcblxyXG5cdFx0cmV0dXJuIGNyZWF0ZUNoYXJ0Rm9ybWF0KHlMYWJlbCwgY2hhclN0cmluZ01vZGlmaWVkLCB0aGlzLnNldHRpbmdzLmNoYXJ0UmVkdXppZXJ1bmdNb25hdGUpXHJcblx0fVxyXG5cclxuXHRhc3luYyBkZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWw6IFByb21pc2U8Ym9vbGVhbj4pe1xyXG5cdFx0bmV3TGV2ZWwudGhlbigocmVzdWx0OiBib29sZWFuKT0+IHtcclxuXHRcdFx0aWYocmVzdWx0KXtcclxuXHRcdFx0XHRjb25zdCBiYWRnZSA6IEJhZGdlID0gZ2V0QmFkZ2VGb3JMZXZlbCh0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsLCBmYWxzZSlcclxuXHRcdFx0XHRuZXcgTm90aWNlKGBZb3UndmUgZWFybmVkIHRoZSBcIiR7YmFkZ2UubmFtZX1cIiBiYWRnZS4gJHtiYWRnZS5kZXNjcmlwdGlvbn1gKVxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGBZb3UndmUgZWFybmVkIHRoZSBcIiR7YmFkZ2UubmFtZX1cIiBiYWRnZS4gJHtiYWRnZS5kZXNjcmlwdGlvbn1gKVxyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coYGJhZGdlIGZvciBsZXZlbCAke3RoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWx9IGlzICR7YmFkZ2UubmFtZX0gLSAke2JhZGdlLmxldmVsfWApXHJcblx0XHRcdFx0dGhpcy5naXZlQmFkZ2VJblByb2ZpbGUodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgYmFkZ2UpXHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJTdGF0ZSA9IGZhbHNlO1xyXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yID0gMTtcclxuXHRcdFx0XHR0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblxyXG5cdGFzeW5jIHJlbW92ZUtleXNGcm9tRnJvbnRtYXR0ZXIoKSB7XHJcblx0XHQvL2NvbnN0IHsgVmF1bHQsIFRGaWxlIH0gPSB3aW5kb3cuYXBwO1xyXG5cdFx0Y29uc3QgeyB2YXVsdCB9ID0gdGhpcy5hcHBcclxuXHRcdC8vY29uc3QgdmF1bHQgPSBWYXVsdC5yZW9wZW4oKTtcclxuXHJcblx0XHQvLyBHZXQgYWxsIE1hcmtkb3duIGZpbGVzIGluIHRoZSB2YXVsdFxyXG5cdFx0Ly9jb25zdCBtYXJrZG93bkZpbGVzID0gdmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cdFx0Y29uc3QgZmlsZUNvdW50TWFwID0gYXdhaXQgZ2V0RmlsZUNvdW50TWFwKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzLnRhZ3NFeGNsdWRlLCB0aGlzLnNldHRpbmdzLmZvbGRlckV4Y2x1ZGUpO1xyXG5cdFx0Zm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlQ291bnRNYXAua2V5cygpKSB7XHJcblx0XHRcdGNvbnN0IGZpbGVzID0gdmF1bHQuZ2V0RmlsZXMoKTtcclxuXHRcdFx0Y29uc3QgZmlsZSA9IGZpbGVzLmZpbmQoZmlsZSA9PiBmaWxlLmJhc2VuYW1lID09PSBmaWxlTmFtZSk7XHJcblx0XHRcdGlmICghZmlsZSkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihgRmlsZSAke2ZpbGVOYW1lfSBub3QgZm91bmQuYCk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9jb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYFByb2Nlc3NpbmcgZmlsZSAke2ZpbGVOYW1lfWApO1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnByb2Nlc3NGcm9udE1hdHRlcihmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdGRlbGV0ZSBmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXVxyXG5cdFx0XHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyWydub3RlLWxlbmd0aC1jbGFzcyddXHJcblx0XHRcdFx0XHRkZWxldGUgZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddXHJcblx0XHRcdFx0XHRkZWxldGUgZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXVxyXG5cdFx0XHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J11cclxuXHRcdFx0XHRcdGRlbGV0ZSBmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRpZiAoZT8ubmFtZSA9PT0gJ1lBTUxQYXJzZUVycm9yJykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JNZXNzYWdlID0gYFVwZGF0ZSBtYWp1cml0eXMgZmFpbGVkIE1hbGZvcm1lZCBmcm9udGFtdHRlciAke2UubWVzc2FnZX1gO1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShlcnJvck1lc3NhZ2UsIDQwMDApO1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBuZXcgTm90aWNlKGBSZW1vdmVkIHNwZWNpZmllZCBrZXlzIGZyb20gZnJvbnRtYXR0ZXIgZnJvbSBmaWxlIFxcXCIke2ZpbGVOYW1lfVxcXCIuYCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyB3aGljaExldmVsTmV4dEJhZGdlKGN1cnJlbnRMZXZlbDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+e1xyXG5cdFx0bGV0IG5leHRCYWRnZUxldmVsID0gMFxyXG5cdFx0Zm9yIChsZXQgaSA9IGN1cnJlbnRMZXZlbDsgaSA8IDExMDsgaSsrKXtcclxuXHRcdFx0Y29uc3QgYmFkZ2UgOiBCYWRnZSA9IGdldEJhZGdlRm9yTGV2ZWwoaSwgdHJ1ZSlcclxuXHRcdFx0Ly8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHRoZSBsZXZlbCBudW1iZXJcclxuXHRcdFx0Y29uc3QgbGV2ZWxSZWdleCA9IC9sZXZlbCAoXFxkKykvO1xyXG5cdFx0XHQvLyBFeHRyYWN0IHRoZSBsZXZlbCBudW1iZXIgdXNpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvblxyXG5cdFx0XHRjb25zdCBtYXRjaCA9IGJhZGdlLmxldmVsLm1hdGNoKGxldmVsUmVnZXgpO1xyXG5cdFx0XHRpZihtYXRjaCl7XHJcblx0XHRcdFx0Y29uc3QgbGV2ZWxOdW1iZXIgPSBwYXJzZUludChtYXRjaFsxXSwgMTApOyAvLyBDb252ZXJ0IHRoZSBtYXRjaGVkIG51bWJlciB0byBhbiBpbnRlZ2VyXHJcblx0XHRcdFx0aWYgKGxldmVsTnVtYmVyID4gY3VycmVudExldmVsICYmIG5leHRCYWRnZUxldmVsID09IDAgKSB7XHJcblx0XHRcdFx0XHRuZXh0QmFkZ2VMZXZlbCA9IGxldmVsTnVtYmVyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG5leHRCYWRnZUxldmVsXHJcblx0fVxyXG5cclxuXHRhc3luYyBib29zdGVyRm9ySW5pdCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cdFx0Y29uc3QgbmV4dEJhZGdlQXQgPSBhd2FpdCB0aGlzLndoaWNoTGV2ZWxOZXh0QmFkZ2UodGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbClcclxuXHRcdGNvbnN0IHN0YXR1c1BvaW50c1RvUmVhY2ggPSBzdGF0dXNQb2ludHNGb3JMZXZlbChuZXh0QmFkZ2VBdClcclxuXHRcdC8vY29uc29sZS5sb2coYHN0YXR1c1BvaW50c1RvUmVhY2ggZm9yIG5leHQgQmFkZ2U6ICR7c3RhdHVzUG9pbnRzVG9SZWFjaH1gKVxyXG5cdFx0Ly8gNTAgTm90ZXMgZnJvbSBMZXZlbCAxIHRvIDUgdG8gZ2V0IHRoZSBmaXJzdCBiYWRnZS5cclxuXHRcdC8vIDMwMCBQb2ludHMgaW4gYXZlcmFnZSBmb3IgYSBOb3RlLlxyXG5cdFx0Y29uc3QgYm9vc3RlckZhY3RvciA9IE1hdGgucm91bmQoKHN0YXR1c1BvaW50c1RvUmVhY2ggLSB0aGlzLnNldHRpbmdzLnN0YXR1c1BvaW50cykvNTAvMzAwKTtcclxuXHRcdHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yID0gYm9vc3RlckZhY3RvclxyXG5cdFx0dGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJTdGF0ZSA9IHRydWVcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuXHRcdC8vY29uc29sZS5sb2coYGJvb3N0ZXJGYWt0b3I6ICR7Ym9vc3RlckZhY3Rvcn1gKVxyXG5cdFx0cmV0dXJuIGJvb3N0ZXJGYWN0b3JcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9wZW5BdmF0YXJGaWxlKCkge1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHt0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lfS5tZGApO1xyXG5cdFx0aWYgKGV4aXN0aW5nRmlsZSl7XHJcblx0XHRcdGNvbnN0IHNvdXJjZVBhdGggPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpPy5wYXRoIHx8ICcnO1xyXG5cdFx0XHRhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChleGlzdGluZ0ZpbGUucGF0aCwgc291cmNlUGF0aCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcIkZpbGUgbm90IGZvdW5kIG9yIHVuYWJsZSB0byBvcGVuLlwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGdldFJhbmRvbUludChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcclxuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xyXG5cdCAgfVxyXG5cdFxyXG5cdCAgYXN5bmMgYWNxdWlyZUluZ3JlZGllbnRzKCkge1xyXG5cdFx0Y29uc3QgY2hhbmNlVG9FYXJuSW5ncmVkaWVudCA9IDAuNTtcclxuXHRcclxuXHRcdGlmIChNYXRoLnJhbmRvbSgpIDwgY2hhbmNlVG9FYXJuSW5ncmVkaWVudCkge1xyXG5cdFx0XHRjb25zdCByYW5kb21JbmdyZWRpZW50SW5kZXggPSB0aGlzLmdldFJhbmRvbUludCgwLCAzKTtcclxuXHRcdFx0Y29uc3QgZWFybmVkSW5ncmVkaWVudCA9IGVsZW1lbnRzW3JhbmRvbUluZ3JlZGllbnRJbmRleF07XHJcblx0XHRcdGxldCBlbGVtZW50Q291bnQgPSB0aGlzLmdldFNldHRpbmcoZWFybmVkSW5ncmVkaWVudC52YXJOYW1lKTtcclxuXHRcclxuXHRcdFx0Ly8gUGVyZm9ybSBhIG51bGwgY2hlY2tcclxuXHRcdFx0aWYgKGVsZW1lbnRDb3VudCAhPT0gbnVsbCAmJiB0eXBlb2YgZWxlbWVudENvdW50ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdHRoaXMuc2V0U2V0dGluZyhlYXJuZWRJbmdyZWRpZW50LnZhck5hbWUsIGVsZW1lbnRDb3VudCArIDEpO1xyXG5cdFx0XHRcdHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coYFlvdSBlYXJuZWQ6ICR7ZWFybmVkSW5ncmVkaWVudC5uYW1lfWApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZWxlbWVudCBjb3VudCBmb3IgJHtlYXJuZWRJbmdyZWRpZW50LnZhck5hbWV9YCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdZb3UgZGlkIG5vdCBlYXJuIGFuIGluZ3JlZGllbnQgdGhpcyB0aW1lLicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxufVxyXG5cclxuXHJcbiAgXHJcbmZ1bmN0aW9uIGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoYm9vc3RlclZhck5hbWU6IHN0cmluZykge1xyXG5cdGZvciAoY29uc3QgZWxlbWVudCBvZiBib29zdGVyUmVjaXBlcykge1xyXG5cdFx0aWYgKGVsZW1lbnQudmFybmFtZSA9PT0gYm9vc3RlclZhck5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIGVsZW1lbnQuYm9vc3RlclJ1blRpbWUgYXMgbnVtYmVyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gMDsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1NhbWVEYXkoaW5wdXREYXRlOiBNb21lbnQpOiBib29sZWFuIHtcclxuXHRjb25zdCBjdXJyZW50RGF0ZSA9IHdpbmRvdy5tb21lbnQoKTsgLy8gR2V0IHRoZSBjdXJyZW50IGRhdGVcclxuXHRyZXR1cm4gY3VycmVudERhdGUuaXNTYW1lKGlucHV0RGF0ZSwgJ2RheScpOyAvLyBDaGVjayBpZiB0aGV5IGFyZSB0aGUgc2FtZSBkYXlcclxufVxyXG5cclxuZnVuY3Rpb24gaXNPbmVEYXlCZWZvcmUoaW5wdXREYXRlOiBNb21lbnQpOiBib29sZWFuIHtcclxuXHRjb25zdCBvbmVEYXlCZWZvcmVDdXJyZW50ID0gd2luZG93Lm1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXknKTsgLy8gQ2FsY3VsYXRlIG9uZSBkYXkgYmVmb3JlIGN1cnJlbnQgZGF0ZVxyXG5cdHJldHVybiBpbnB1dERhdGUuaXNTYW1lKG9uZURheUJlZm9yZUN1cnJlbnQsICdkYXknKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNNaW51dGVzUGFzc2VkKGlucHV0RGF0ZTogTW9tZW50LCBtaW51dGVzUGFzc2VkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG1pbnV0ZXNBZ28gPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QobWludXRlc1Bhc3NlZCwgJ21pbnV0ZXMnKTsgLy8gQ2FsY3VsYXRlIHRpbWUgJ21pbnV0ZXNQYXNzZWQnIG1pbnV0ZXMgYWdvXHJcbiAgICByZXR1cm4gaW5wdXREYXRlLmlzU2FtZU9yQmVmb3JlKG1pbnV0ZXNBZ28pO1xyXG59XHJcblxyXG4vKmZ1bmN0aW9uIGhvdXJzVW50aWxNaW51dGVzUGFzc2VkKGlucHV0RGF0ZTogTW9tZW50LCBtaW51dGVzUGFzc2VkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB3aW5kb3cubW9tZW50KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lXHJcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gaW5wdXREYXRlLmNsb25lKCkuYWRkKG1pbnV0ZXNQYXNzZWQsICdtaW51dGVzJyk7IC8vIENhbGN1bGF0ZSB0YXJnZXQgdGltZVxyXG5cclxuICAgIGlmIChjdXJyZW50VGltZS5pc1NhbWVPckFmdGVyKHRhcmdldFRpbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7IC8vIElmIHRoZSB0YXJnZXQgdGltZSBoYXMgYWxyZWFkeSBwYXNzZWQsIHJldHVybiAwIGhvdXJzXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGltZURpZmYgPSB0YXJnZXRUaW1lLmRpZmYoY3VycmVudFRpbWUsICdob3VycycsIHRydWUpOyAvLyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gaG91cnNcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGltZURpZmYpO1xyXG59Ki9cclxuXHJcbmZ1bmN0aW9uIGhvdXJzVW50aWxNaW51dGVzUGFzc2VkKGlucHV0RGF0ZTogTW9tZW50LCBtaW51dGVzVG9QYXNzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB3aW5kb3cubW9tZW50KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lXHJcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gaW5wdXREYXRlLmNsb25lKCkuYWRkKG1pbnV0ZXNUb1Bhc3MsICdtaW51dGVzJyk7IC8vIENhbGN1bGF0ZSB0aGUgdGFyZ2V0IHRpbWVcclxuXHJcbiAgICBpZiAodGFyZ2V0VGltZS5pc0FmdGVyKGN1cnJlbnRUaW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGhvdXJzUmVtYWluaW5nID0gdGFyZ2V0VGltZS5kaWZmKGN1cnJlbnRUaW1lLCAnaG91cnMnKTtcclxuICAgICAgICByZXR1cm4gaG91cnNSZW1haW5pbmc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdmF0YXJGaWxlKGFwcDogQXBwLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0Ly9zZXR0aW5nczogR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3M7XHJcblx0Ly8gRGVmaW5lIHRoZSBmaWxlIG5hbWUgYW5kIGNvbnRlbnRcclxuXHQvL2NvbnN0IGZpbGVOYW1lID0gJ0F2YXRhciAtIEdhbWlmaWNhdGlvbic7IC8vIHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWU7XHJcblx0Ly9jb25zb2xlLmxvZyhgZmlsZU5hbWU6ICR7ZmlsZU5hbWV9YClcclxuXHJcblx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHtmaWxlTmFtZX0ubWRgKTtcclxuXHRpZiAoZXhpc3RpbmdGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdGNvbnNvbGUubG9nKGBGaWxlICR7ZmlsZU5hbWV9Lm1kIGFscmVhZHkgZXhpc3RzYCk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIENyZWF0ZSB0aGUgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgdmF1bHRcclxuXHRhd2FpdCBhcHAudmF1bHQuY3JlYXRlKGAke2ZpbGVOYW1lfS5tZGAsIGF2YXRhckluaXRDb250ZW50KTtcclxuXHJcbn1cclxuXHJcblxyXG5cclxuZnVuY3Rpb24gc3RyaW5nVG9MaXN0KGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoJywnKTtcclxufVxyXG5cclxuXHJcblxyXG5jbGFzcyBNdWx0aVNlbGVjdE1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gICAgcHJpdmF0ZSBpdGVtczogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIHNlbGVjdGVkSXRlbXM6IHN0cmluZ1tdID0gW107XHJcblx0cHJpdmF0ZSByZW1haW5pbmdTdG9jazogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG4gICAgcHJpdmF0ZSBidXR0b25UZXh0OiBzdHJpbmc7XHJcblx0cHJpdmF0ZSByZWFkb25seSBnYW1pZmljYXRpb25JbnN0YW5jZTogZ2FtaWZpY2F0aW9uO1xyXG5cdHByaXZhdGUgYm9vc3RlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuXHRwcml2YXRlIHVzZUJvb3N0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIHJlbWFpbmluZ0Jvb3N0ZXJTdG9jazogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpdGVtczogc3RyaW5nW10sIGJ1dHRvblRleHQ6IHN0cmluZyxnYW1pZmljYXRpb25JbnN0YW5jZTogZ2FtaWZpY2F0aW9uKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwKTtcclxuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XHJcblx0XHR0aGlzLmJ1dHRvblRleHQgPSBidXR0b25UZXh0O1xyXG5cdFx0dGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZSA9IGdhbWlmaWNhdGlvbkluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuXHRcdC8vdGhpcy5yZWFkQm9vc3RlcnNTdG9jaygpO1xyXG5cclxuXHRcdC8vIHRha2UgY2FyZSBvbmx5IHRvIHJ1biBzZXZlcmFsIHRpbWVzIHRocm91Z2ggd2hlbiBib29zdGVycyBhcmUgdXNlZFxyXG5cdFx0aWYgKHRoaXMudXNlQm9vc3Rlcil7XHJcblx0XHRcdGJvb3N0ZXJSZWNpcGVzLmZvckVhY2goaXRlbSA9PiB7XHJcblx0XHRcdFx0aWYodGhpcy5ib29zdGVyQXZhaWxhYmxlRm9yVXNlKGl0ZW0ubmFtZSkpe1xyXG5cdFx0XHRcdFx0Y29uc3QgbGlzdEl0ZW0gPSB0aGlzLmNyZWF0ZUl0ZW1Db250YWluZXIoaXRlbS5uYW1lKTtcclxuXHRcdFx0XHRcdGNvbnRlbnRFbC5hcHBlbmRDaGlsZChsaXN0SXRlbSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IGxpc3RJdGVtID0gdGhpcy5jcmVhdGVJdGVtQ29udGFpbmVyKFwiXCIpO1xyXG5cdFx0XHRjb250ZW50RWwuYXBwZW5kQ2hpbGQobGlzdEl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHJcbiAgICBvbkNsb3NlKCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICB9XHJcblxyXG5cdHByaXZhdGUgYm9vc3RlckF2YWlsYWJsZUZvclVzZShpdGVtOnN0cmluZyl7XHJcblx0XHQvL2NvbnNvbGUubG9nKGBib29zdGVyQXZhaWxhYmxlRm9yVXNlOiAke2l0ZW19YClcclxuXHRcdGxldCBmb3VuZCA9IGZhbHNlXHJcblx0XHRsaXN0T2ZVc2VhYmxlQm9vc3RlcnNUb0JlU2hvd24uZm9yRWFjaChlbGVtZW50ID0+IHtcclxuXHRcdFx0Ly9jb25zb2xlLmxvZyhgJHtpdGVtfSA9PSAke2VsZW1lbnR9ID8/YClcclxuXHRcdFx0aWYoaXRlbSA9PSBlbGVtZW50KXtcclxuXHRcdFx0XHRpZighZm91bmQpe1xyXG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBmb3VuZFxyXG5cdH1cclxuXHJcblx0c2V0VXNlQm9vc3Rlcih1c2VCb29zdGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy51c2VCb29zdGVyID0gdXNlQm9vc3RlcjtcclxuICAgIH1cclxuXHJcblxyXG5cdC8vIFVwZGF0ZWQgY3JlYXRlSXRlbUNvbnRhaW5lciBtZXRob2RcclxuICAgIHByaXZhdGUgY3JlYXRlSXRlbUNvbnRhaW5lcihsYWJlbFRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZUJvb3N0ZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQm9vc3Rlckxpc3QobGFiZWxUZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL3JldHVybiB0aGlzLmNyZWF0ZUNoZWNrYm94KGxhYmVsVGV4dCk7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNyYWZ0aW5nTGF5b3V0KClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdHVwZGF0ZUluY3JlbWVudFN0b2NrKGluY3JlbWVudDogc3RyaW5nLCBzdG9jazogbnVtYmVyKSB7XHJcblx0XHRjb25zb2xlLmxvZyhgdXBkYXRlSW5jcmVtZW50U3RvY2s6IGluY3JlbWVudCAke2luY3JlbWVudH0gIHN0b2NrICR7c3RvY2t9YClcclxuICAgICAgICB0aGlzLnJlbWFpbmluZ1N0b2NrW2luY3JlbWVudF0gPSBzdG9jaztcclxuXHRcdHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2Uuc2V0U2V0dGluZyh0aGlzLmdldEluZ2VyZW1lbnRWYXJOYW1lRnJvbU5hbWUoaW5jcmVtZW50KXx8ICcnLCBzdG9jaylcclxuICAgIH1cclxuXHJcblxyXG5cdHVwZGF0ZUJvb3N0ZXJTdG9jayhib29zdGVyOiBzdHJpbmcsIHN0b2NrSW5jcmVhc2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYm9vc3RlcnNbYm9vc3Rlcl0gKz0gc3RvY2tJbmNyZWFzZTtcclxuICAgIH1cclxuXHJcblx0ZGVjcmVtZW50Qm9vc3Rlcihib29zdGVyOiBzdHJpbmcsIHN0b2NrSW5jcmVhc2U6IG51bWJlcikge1xyXG5cdFx0Y29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2Jvb3N0ZXJdO1xyXG5cdFx0Y29uc3QgbW9tZW50RGF0ZSA9IHdpbmRvdy5tb21lbnQoYm9vc3RlciwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcclxuXHRcdGlmIChzdG9jayA+IDAgJiYgaXNNaW51dGVzUGFzc2VkKG1vbWVudERhdGUsdGhpcy5nZXRCb29zdGVyQ29vbGRvd25Gcm9tTmFtZShib29zdGVyKSkpIHtcclxuICAgICAgICBcdHRoaXMuYm9vc3RlcnNbYm9vc3Rlcl0gLT0gc3RvY2tJbmNyZWFzZTtcclxuXHRcdFx0dGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5zZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlclZhck5hbWVGcm9tTmFtZShib29zdGVyKSx0aGlzLmJvb3N0ZXJzW2Jvb3N0ZXJdKVxyXG5cdFx0XHR0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLnNldFNldHRpbmdCb29sZWFuKHRoaXMuZ2V0Qm9vc3RlclN3aXRjaEZyb21OYW1lKGJvb3N0ZXIpLHRydWUpXHJcblx0XHRcdHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2Uuc2V0U2V0dGluZ1N0cmluZyh0aGlzLmdldEJvb3N0ZXJEYXRlRnJvbU5hbWUoYm9vc3Rlciksd2luZG93Lm1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpKVxyXG5cdFx0XHR0aGlzLnVwZGF0ZVF1YW50aXR5RGlzcGxheShib29zdGVyKTtcclxuXHRcdH1cclxuICAgIH1cclxuXHJcblxyXG5cdHJlYWRCb29zdGVyc1N0b2NrKCl7XHJcblx0XHRpZiAodGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZSkge1xyXG5cdFx0XHR0aGlzLmJvb3N0ZXJzID0geyBcclxuXHRcdFx0XHQnVGVtcG9yYWwgVHdlYWtlcic6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygndGVtcG9yYWxUd2Vha2VyJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdQZXJwZXR1YWwgUHJvZ3Jlc3MnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3BlcnBldHVhbFByb2dyZXNzJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdTdHJhdGVnaWMgU3luYXBzZXMnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3N0cmF0ZWdpY1N5bmFwc2VzJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdBY2NlbGVyYXRlZCBBY3F1aXNpdGlvbic6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnYWNjZWxlcmF0ZWRBY3F1aXNpdGlvbicpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnTGlua2VycyBMb2RlJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdsaW5rZXJzTG9kZScpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnRWZmb3J0bGVzcyBFeHBhbnNpb24nOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2VmZm9ydGxlc3NFeHBhbnNpb24nKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J1JlY3Vyc2l2ZSBSZWZsZWN0aW9uJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdyZWN1cnNpdmVSZWZsZWN0aW9uJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdTeW5hcHRpYyBTdXJnZSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnc3luYXB0aWNTdXJnZScpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnSW5zcGlyYXRpb24gSW5mdXNpb24nOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2luc3BpcmF0aW9uSW5mdXNpb24nKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J1RpdGxlIFRpdGFuJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCd0aXRsZVRpdGFuJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdQcmVjaXNpb24gUHJpc20nOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3ByZWNpc2lvblByaXNtJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdIeXBlcmxpbmsgSGFybW9ueSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnaHlwZXJsaW5rSGFybW9ueScpIGFzIG51bWJlcixcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRyZWFkSW5ncmVtZW50U3RvY2soKXtcclxuXHRcdGlmICh0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlKSB7XHJcblx0XHRcdHRoaXMucmVtYWluaW5nU3RvY2sgPSB7IFxyXG5cdFx0XHRcdCdOZXh1cyBOb2RlJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCduZXh1c05vZGUnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0Nvbm5lY3Rpb24gQ3J5c3RhbCc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnY29ubmVjdGlvbkNyeXN0YWwnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J01hc3RlcnkgU2Nyb2xsJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdtYXN0ZXJ5U2Nyb2xsJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdJbnNpZ2h0IFByaXNtJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdpbnNpZ2h0UHJpc20nKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J1JlZmxlY3RpdmUgRXNzZW5jZSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygncmVmbGVjdGl2ZUVzc2VuY2UnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0FtcGxpZmljYXRpb24gQ3J5c3RhbCc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnYW1wbGlmaWNhdGlvbkNyeXN0YWwnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0NyZWF0aXZlIENhdGFseXN0JzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdjcmVhdGl2ZUNhdGFseXN0JykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdQcmVjaXNpb24gTGVucyc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygncHJlY2lzaW9uTGVucycpIGFzIG51bWJlcixcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZUNyYWZ0aW5nTGF5b3V0KCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnbW9kYWwtY3JhZnRpbmctY29udGFpbmVyJztcclxuXHJcblx0XHQvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHRoZSBzdG9jayBpbmZvcm1hdGlvblxyXG5cdFx0Y29uc3Qgc3RvY2tDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHN0b2NrQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdzdG9jay1jb250YWluZXInO1xyXG5cdFxyXG5cclxuXHRcdGNyYWZ0aW5nSXRlbXMuZm9yRWFjaChyZWNpcGUgPT4ge1xyXG5cdFx0XHRpZih0aGlzLmJvb3N0ZXJBdmFpbGFibGVGb3JVc2UocmVjaXBlLm5hbWUpKXtcclxuXHRcdFx0XHRjb25zdCBpdGVtQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRcdFx0aXRlbUNvbnRhaW5lci5jbGFzc05hbWUgPSAnY3JhZnRpbmctaXRlbS1jb250YWluZXInO1xyXG5cclxuXHRcdFx0XHRjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdFx0XHRidXR0b24uaW5uZXJUZXh0ID0gJ0NyYWZ0JztcclxuXHRcdFx0XHRidXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuY3JhZnRCb29zdGVySXRlbShyZWNpcGUpO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1c2VJbmZvQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRcdFx0dXNlSW5mb0J1dHRvbi5pbm5lclRleHQgPSAnPyc7XHJcblx0XHRcdFx0dXNlSW5mb0J1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdFx0bmV3IE1vZGFsSW5mb3JtYXRpb25ib3godGhpcy5hcHAsIHRoaXMuZ2V0Qm9vc3RlckluZm9yRnJvbUZyb21OYW1lKHJlY2lwZS5uYW1lKSkub3BlbigpO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGl0ZW1UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0XHRcdGl0ZW1UZXh0LmlubmVyVGV4dCA9IGAke3JlY2lwZS5uYW1lfSBcdTIxRDIgJHtyZWNpcGUuaW5jcmVkaWVudHMuam9pbignICAgICcpfWA7XHJcblxyXG5cdFx0XHRcdGl0ZW1Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuXHRcdFx0XHRpdGVtQ29udGFpbmVyLmFwcGVuZENoaWxkKHVzZUluZm9CdXR0b24pO1xyXG5cdFx0XHRcdGl0ZW1Db250YWluZXIuYXBwZW5kQ2hpbGQoaXRlbVRleHQpO1xyXG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtQ29udGFpbmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Y29uc3Qgc3RvY2tJbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRzdG9ja0luZm8uY2xhc3NOYW1lID0gJ3N0b2NrLWluZm8nO1xyXG5cclxuXHRcdGxpc3RPZlVzZWFibGVJbmdyZWRpZW50c1RvQmVTaG93bi5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGAke2VsZW1lbnQubmFtZX0gOiAke3RoaXMucmVtYWluaW5nU3RvY2tbZWxlbWVudC5uYW1lXX1gKVxyXG5cdFx0XHRzdG9ja0luZm8uaW5uZXJIVE1MICs9IGAke3RoaXMuZ2V0SW5nZXJlbWVudEZyb21OYW1lKGVsZW1lbnQpLnNob3J0TmFtZX0gWyR7dGhpcy5yZW1haW5pbmdTdG9ja1t0aGlzLmdldEluZ2VyZW1lbnRGcm9tTmFtZShlbGVtZW50KS5uYW1lXSB8fCAwfV0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtgOyBcclxuXHRcdH0pO1xyXG5cclxuXHRcdHN0b2NrQ29udGFpbmVyLmFwcGVuZENoaWxkKHN0b2NrSW5mbyk7XHJcblxyXG5cclxuXHRcclxuXHRcdC8vIEFkZCB0aGUgc3RvY2sgY29udGFpbmVyIHRvIHRoZSBtYWluIGNvbnRhaW5lclxyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHN0b2NrQ29udGFpbmVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZUJvb3N0ZXJMaXN0KGxhYmVsVGV4dDogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGNvbnRhaW5lci5jbGFzc05hbWUgPSAnbW9kYWwtY2hlY2tib3gtY29udGFpbmVyJztcclxuXHRcdFxyXG5cdFx0Ly9jb25zdCBzdG9jayA9IHRoaXMucmVtYWluaW5nU3RvY2tbbGFiZWxUZXh0XSB8fCAwO1xyXG5cdFx0Y29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF1cclxuXHRcclxuXHRcdGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRsYWJlbC5jbGFzc05hbWUgPSBgJHtsYWJlbFRleHQucmVwbGFjZSgnICcsJy0nKX1gO1xyXG5cdFx0Y29uc3QgdXNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRjb25zdCBtb21lbnREYXRlID0gdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlckRhdGVGcm9tTmFtZShsYWJlbFRleHQpKTtcclxuXHRcdGlmKGlzTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KG1vbWVudERhdGUgYXMgc3RyaW5nLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLHRoaXMuZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUobGFiZWxUZXh0KSkgPT0gZmFsc2Upe1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgQm9vc3RlciAke2xhYmVsVGV4dH0gaXMgc3RpbGwgaW4gY29vbGRvd24gZm9yICR7d2luZG93Lm1vbWVudChtb21lbnREYXRlIGFzIHN0cmluZywgJ1lZWVktTU0tREQgSEg6bW06c3MnKSx0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkvNjB9IGhvdXJzYClcclxuXHRcdFx0bGFiZWwuaW5uZXJIVE1MID0gYCR7bGFiZWxUZXh0fSA6ICgke3N0b2NrfSlgO1xyXG5cdFx0XHQvL2NvbnN0IHVzZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG5cdFx0XHR1c2VCdXR0b24uaW5uZXJUZXh0ID0gYGNvb2xkb3duICR7aG91cnNVbnRpbE1pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudChtb21lbnREYXRlIGFzIHN0cmluZywgJ1lZWVktTU0tREQgSEg6bW06c3MnKSx0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpfSBob3Vyc2A7XHJcblx0XHRcdHVzZUJ1dHRvbi5pZCA9IGB1c2UtYnV0dG9uLSR7bGFiZWxUZXh0LnJlcGxhY2UoJyAnLCctJyl9YDtcclxuXHRcdFx0dXNlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdFx0bmV3IE1vZGFsSW5mb3JtYXRpb25ib3godGhpcy5hcHAsIGAke2xhYmVsVGV4dH0gaXMgZm9yICR7aG91cnNVbnRpbE1pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudChtb21lbnREYXRlIGFzIHN0cmluZywgJ1lZWVktTU0tREQgSEg6bW06c3MnKSx0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpfSBob3VycyBpbiBjb29sZG93biBhbmQgY2FuIG9ubHkgdGhlbiBiZSB1c2VkIGFnYWluLmApLm9wZW4oKTtcclxuXHRcdFx0fTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxhYmVsLmlubmVySFRNTCA9IGAke2xhYmVsVGV4dH0gOiAoJHtzdG9ja30pYDtcclxuXHRcdFx0Ly9jb25zdCB1c2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdFx0dXNlQnV0dG9uLmlubmVyVGV4dCA9ICdVc2UnO1xyXG5cdFx0XHR1c2VCdXR0b24uaWQgPSBgdXNlLWJ1dHRvbi0ke2xhYmVsVGV4dC5yZXBsYWNlKCcgJywnLScpfWA7XHJcblx0XHRcdHVzZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudXNlQm9vc3Rlckl0ZW0obGFiZWxUZXh0KTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcclxuXHRcdGNvbnN0IHVzZUluZm9CdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdHVzZUluZm9CdXR0b24uaW5uZXJUZXh0ID0gJz8nO1xyXG5cdFx0dXNlSW5mb0J1dHRvbi5pZCA9IGBpbmZvcm1hdGlvbi0ke2xhYmVsVGV4dC5yZXBsYWNlKCcgJywnLScpfWA7XHJcblx0XHR1c2VJbmZvQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdG5ldyBNb2RhbEluZm9ybWF0aW9uYm94KHRoaXMuYXBwLCB0aGlzLmdldEJvb3N0ZXJJbmZvckZyb21Gcm9tTmFtZShsYWJlbFRleHQpKS5vcGVuKCk7XHJcblx0XHR9O1xyXG5cclxuXHJcblx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlQnV0dG9uKTtcclxuXHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2VJbmZvQnV0dG9uKTtcclxuXHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChsYWJlbCk7XHJcblx0XHQgXHJcblxyXG5cdFx0cmV0dXJuIGNvbnRhaW5lcjtcclxuXHRcdFxyXG5cdH1cclxuXHRcclxuXHJcblx0aW5jcmVtZW50SXRlbShpdGVtOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IHN0b2NrID0gdGhpcy5yZW1haW5pbmdTdG9ja1tpdGVtXTtcclxuXHRcdGNvbnNvbGUubG9nKGBpbmNyZW1lbnRJdGVtOiBzdG9jayA9ICR7c3RvY2t9YClcclxuXHRcdGlmIChzdG9jayA+IDApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcblx0XHRcdHRoaXMucmVtYWluaW5nU3RvY2tbaXRlbV0tLTtcclxuXHRcdFx0dGhpcy51cGRhdGVRdWFudGl0eURpc3BsYXkoaXRlbSk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5ib29zdGVyc1tpdGVtXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9vc3RlcnNbaXRlbV0tLTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVRdWFudGl0eURpc3BsYXkoaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cdH1cclxuXHRcclxuXHJcblx0ZGVjcmVtZW50SXRlbShpdGVtOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG5cdFxyXG5cdFx0aWYgKGl0ZW1JbmRleCA+IC0xKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaXRlbUluZGV4LCAxKTtcclxuXHRcdFx0dGhpcy5yZW1haW5pbmdTdG9ja1tpdGVtXSsrO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVF1YW50aXR5RGlzcGxheShpdGVtKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmJvb3N0ZXJzW2l0ZW1dICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ib29zdGVyc1tpdGVtXSsrO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVF1YW50aXR5RGlzcGxheShpdGVtKTtcclxuICAgICAgICB9XHJcblx0fVxyXG5cdFxyXG5cclxuXHRwcml2YXRlIHVzZUJvb3N0ZXJJdGVtKGxhYmVsVGV4dDogc3RyaW5nKSB7XHJcblx0XHRjb25zb2xlLmxvZyhgdXNlIEJvb3N0ZXIgJHtsYWJlbFRleHR9YClcclxuXHRcdC8qY29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF07XHJcblx0XHRpZiAoc3RvY2sgPiAwKSB7XHJcblx0XHRcdC8vdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2gobGFiZWxUZXh0KTtcclxuXHRcdFx0Ly90aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF0tLTtcclxuXHRcdFx0dGhpcy51cGRhdGVRdWFudGl0eURpc3BsYXkobGFiZWxUZXh0KTtcclxuXHRcdH0qL1xyXG5cdFx0dGhpcy5kZWNyZW1lbnRCb29zdGVyKGxhYmVsVGV4dCwxKVxyXG5cdFx0XHJcblx0fVxyXG5cdFxyXG5cclxuXHJcblx0cHJpdmF0ZSB1cGRhdGVRdWFudGl0eURpc3BsYXkobGFiZWxUZXh0OiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IHN0b2NrID0gdGhpcy5ib29zdGVyc1tsYWJlbFRleHRdXHJcblx0XHRjb25zdCBzdG9ja0luZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsYWJlbFRleHQucmVwbGFjZSgnICcsJy0nKX1gKTtcclxuXHRcdGlmIChzdG9ja0luZm8pIHtcclxuXHRcdFx0c3RvY2tJbmZvLmlubmVySFRNTCA9ICcnOyAvLyBDbGVhciB0aGUgY3VycmVudCBjb250ZW50XHJcblx0XHRcdHN0b2NrSW5mby5pbm5lckhUTUwgPSBgJHtsYWJlbFRleHR9IDogKCR7c3RvY2t9KWBcclxuXHRcdH1cclxuXHRcdGNvbnN0IGJ1dHRvblVzZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCN1c2UtYnV0dG9uLSR7bGFiZWxUZXh0LnJlcGxhY2UoJyAnLCctJyl9YCk7XHJcblx0XHRjb25zdCBkYXRlID0gdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlckRhdGVGcm9tTmFtZShsYWJlbFRleHQpKTtcclxuXHRcdGNvbnN0IG1vbWVudERhdGUgPSB3aW5kb3cubW9tZW50KGRhdGUgYXMgc3RyaW5nLCAnWVlZWS1NTS1ERCBISDptbTpzcycpXHJcblx0XHRpZiAoYnV0dG9uVXNlICYmIGlzTWludXRlc1Bhc3NlZChtb21lbnREYXRlLCB0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpID09IGZhbHNlKXtcclxuXHRcdFx0YnV0dG9uVXNlLnNldFRleHQoYGNvb2xkb3duICR7aG91cnNVbnRpbE1pbnV0ZXNQYXNzZWQobW9tZW50RGF0ZSx0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpfSBob3Vyc2ApXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRcclxuXHRwcml2YXRlIGNoZWNrSW5ncmVkaWVudHNBdmFpbGFiaWxpdHkoaW5jcmVkaWVudHM6IHtuYW1lOiBzdHJpbmc7IGluY3JlZGllbnRzOiBzdHJpbmdbXTt9KSB7XHJcblx0XHRmb3IgKGNvbnN0IGluZ3JlZGllbnQgb2YgaW5jcmVkaWVudHMuaW5jcmVkaWVudHMpIHtcclxuXHRcdFx0Y29uc3QgW3F1YW50aXR5LCBzaG9ydE5hbWVdID0gaW5ncmVkaWVudC5zcGxpdCgneCcpO1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBxdWFudGl0eTogJHtxdWFudGl0eX1cXHRzaG9ydE5hbWU6ICR7c2hvcnROYW1lfWApXHJcblx0XHRcdGNvbnN0IHJlcXVpcmVkUXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XHJcblx0XHRcdGNvbnN0IGF2YWlsYWJsZVN0b2NrID0gdGhpcy5yZW1haW5pbmdTdG9ja1t0aGlzLmdldEluZ2VyZW1lbnROYW1lRnJvbVNob3J0TmFtZVxyXG5cdFx0KHNob3J0TmFtZSkgfHwgMF07XHJcblx0XHRcdC8vY29uc29sZS5sb2coYHJlcXVpcmVkUXVhbnRpdHk6ICR7cmVxdWlyZWRRdWFudGl0eX1cXHRhdmFpbGFibGVTdG9jazogXHUwMzAxJHthdmFpbGFibGVTdG9ja31gKVxyXG5cdFxyXG5cdFx0XHRpZiAocmVxdWlyZWRRdWFudGl0eSA+IGF2YWlsYWJsZVN0b2NrKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBOb3QgZW5vdWdoIHN0b2NrIGZvciB0aGlzIGluZ3JlZGllbnRcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSB1c2VJbmdyZWRpbWVudHMoaW5jcmVkaWVudHM6IHtuYW1lOiBzdHJpbmc7IGluY3JlZGllbnRzOiBzdHJpbmdbXTt9KSB7XHJcblx0XHRjb25zb2xlLmxvZyhgdXNlSW5ncmVkaW1lbnRzOiAke2luY3JlZGllbnRzfWApXHJcblx0XHRmb3IgKGNvbnN0IGluZ3JlZGllbnQgb2YgaW5jcmVkaWVudHMuaW5jcmVkaWVudHMpIHtcclxuXHRcdFx0Y29uc3QgW3F1YW50aXR5LCBzaG9ydE5hbWVdID0gaW5ncmVkaWVudC5zcGxpdCgneCcpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgcXVhbnRpdHk6ICR7cXVhbnRpdHl9XFx0c2hvcnROYW1lOiAke3Nob3J0TmFtZX1gKVxyXG5cdFx0XHRjb25zdCByZXF1aXJlZFF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xyXG5cdFx0XHRjb25zdCBhdmFpbGFibGVTdG9jayA9IHRoaXMucmVtYWluaW5nU3RvY2tbdGhpcy5nZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lKSB8fCAwXTtcclxuXHRcdFx0Y29uc3QgaW5ncmVtZW50TmFtZSA9IHRoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSkgfHwgJyc7XHJcblx0XHRcdC8vY29uc29sZS5sb2coYHJlcXVpcmVkUXVhbnRpdHk6ICR7cmVxdWlyZWRRdWFudGl0eX1cXHRhdmFpbGFibGVTdG9jazogXHUwMzAxJHthdmFpbGFibGVTdG9ja31gKVxyXG5cdFx0XHQvL3RoaXMucmVtYWluaW5nU3RvY2tbdGhpcy5nZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lKSA9IHRoaXMucmVtYWluaW5nU3RvY2tbdGhpcy5nZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lKSB8fCAwXSAtPSBxdWFudGl0eTtcclxuXHRcdFx0Y29uc29sZS5sb2coYHRoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSk6ICR7dGhpcy5nZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lKX1gKVxyXG5cdFx0XHR0aGlzLnVwZGF0ZUluY3JlbWVudFN0b2NrKGluZ3JlbWVudE5hbWUsYXZhaWxhYmxlU3RvY2sgLSByZXF1aXJlZFF1YW50aXR5KVxyXG5cdFx0XHRjb25zb2xlLmxvZyhgJHtpbmNyZWRpZW50cy5uYW1lfSAgJHthdmFpbGFibGVTdG9jayAtIHJlcXVpcmVkUXVhbnRpdHl9YClcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdFxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVN0b2NrSW5mb3JtYXRpb24oKSB7XHJcblx0XHRjb25zdCBzdG9ja0luZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RvY2staW5mbycpO1xyXG5cdFx0aWYgKHN0b2NrSW5mbykge1xyXG5cdFx0XHRzdG9ja0luZm8uaW5uZXJIVE1MID0gJyc7IC8vIENsZWFyIHRoZSBjdXJyZW50IGNvbnRlbnRcclxuXHRcclxuXHRcdFx0ZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuXHRcdFx0XHRzdG9ja0luZm8uaW5uZXJIVE1MICs9IGAke2VsZW1lbnQuc2hvcnROYW1lfSBbJHt0aGlzLnJlbWFpbmluZ1N0b2NrW2VsZW1lbnQubmFtZV0gfHwgMH1dJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YDtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cclxuICAgIHByaXZhdGUgY3JhZnRCb29zdGVySXRlbShzZWxlY3RlZEl0ZW1zOiB7bmFtZTogc3RyaW5nOyBpbmNyZWRpZW50czogc3RyaW5nW107fSkge1xyXG5cdFx0Ly8gY2FsbCBoZXJlIHRoZSByZWNpcGUgbG9naWMgYW5kIHJlZHVjZSB0aGUgc3RvY2tcclxuXHRcdGlmKHRoaXMuY2hlY2tJbmdyZWRpZW50c0F2YWlsYWJpbGl0eShzZWxlY3RlZEl0ZW1zKSl7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBjcmFmdCBib29zdGVyICR7c2VsZWN0ZWRJdGVtcy5uYW1lfWApXHJcblx0XHRcdHRoaXMudXBkYXRlQm9vc3RlclN0b2NrKHNlbGVjdGVkSXRlbXMubmFtZSwgMSlcclxuXHRcdFx0dGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5zZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlclZhck5hbWVGcm9tTmFtZShzZWxlY3RlZEl0ZW1zLm5hbWUpLCB0aGlzLmJvb3N0ZXJzW3NlbGVjdGVkSXRlbXMubmFtZV0pXHJcblx0XHRcdHRoaXMudXNlSW5ncmVkaW1lbnRzKHNlbGVjdGVkSXRlbXMpXHJcblx0XHRcdC8vdGhpcy51cGRhdGVRdWFudGl0eURpc3BsYXkoc2VsZWN0ZWRJdGVtcy5uYW1lKVxyXG5cdFx0XHR0aGlzLnVwZGF0ZVN0b2NrSW5mb3JtYXRpb24oKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYG5vdCBlbm91Z2ggaW5ncmVkaWVudHMgZm9yIGJvb3N0ZXIgJHtzZWxlY3RlZEl0ZW1zLm5hbWV9IGluIHN0b2NrYClcclxuXHRcdH1cclxuXHR9XHJcblx0XHRcclxuXHJcblx0cHJpdmF0ZSBnZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lOiBzdHJpbmcpIHtcclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG5cdFx0XHRpZiAoZWxlbWVudC5zaG9ydE5hbWUgPT09IHNob3J0TmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtZW50Lm5hbWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEluZ2VyZW1lbnRTaG9ydE5hbWVGcm9tTmFtZShuYW1lOiBzdHJpbmcpIHtcclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG5cdFx0XHRpZiAoZWxlbWVudC5uYW1lID09PSBuYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuc2hvcnROYW1lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRJbmdlcmVtZW50RnJvbU5hbWUobmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gbmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtZW50O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4ge3Nob3J0TmFtZTogJycsIG5hbWU6ICcnLCB2YXJOYW1lOiAnJ307IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmRcclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGdldEluZ2VyZW1lbnRWYXJOYW1lRnJvbVNob3J0TmFtZShzaG9ydE5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50LnNob3J0TmFtZSA9PT0gc2hvcnROYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQudmFyTmFtZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmRcclxuXHR9XHJcblx0XHJcblx0cHJpdmF0ZSBnZXRJbmdlcmVtZW50VmFyTmFtZUZyb21OYW1lKG5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IG5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC52YXJOYW1lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRCb29zdGVyVmFyTmFtZUZyb21OYW1lKGJvb3N0ZXJOYW1lOiBzdHJpbmcpIHtcclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBib29zdGVyUmVjaXBlcykge1xyXG5cdFx0XHRpZiAoZWxlbWVudC5uYW1lID09PSBib29zdGVyTmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtZW50LnZhcm5hbWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAnJzsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRCb29zdGVySW5mb3JGcm9tRnJvbU5hbWUoYm9vc3Rlck5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IGJvb3N0ZXJOYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuZGVzY3JpcHRpb247XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAnJzsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRCb29zdGVyU3dpdGNoRnJvbU5hbWUoYm9vc3Rlck5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IGJvb3N0ZXJOYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuYm9vc3RlclN3aXRjaDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICcnOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEJvb3N0ZXJEYXRlRnJvbU5hbWUoYm9vc3Rlck5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IGJvb3N0ZXJOYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuYm9vc3RlckRhdGUgYXMgc3RyaW5nO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gJyc7IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmRcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUoYm9vc3Rlck5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IGJvb3N0ZXJOYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQuYm9vc3RlckNvb2xkb3duO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gMDsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHRcclxufVxyXG5cclxuXHJcblxyXG5jbGFzcyBNb2RhbEJvb3N0ZXIgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmc7XHJcblx0cHJpdmF0ZSByZWFkb25seSBnYW1pZmljYXRpb25JbnN0YW5jZTogZ2FtaWZpY2F0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBkaXNwbGF5VGV4dDogc3RyaW5nLCBnYW1pZmljYXRpb25JbnN0YW5jZTogZ2FtaWZpY2F0aW9uKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlUZXh0ID0gZGlzcGxheVRleHQ7XHJcblx0XHR0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlID0gZ2FtaWZpY2F0aW9uSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgb25PcGVuKCkge1xyXG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG4gICAgICAgIGNvbnRlbnRFbC5zZXRUZXh0KHRoaXMuZGlzcGxheVRleHQpO1xyXG5cclxuXHRcdGNvbnN0IG11bHRpU2VsZWN0TW9kYWwgPSBuZXcgTXVsdGlTZWxlY3RNb2RhbCh0aGlzLmFwcCwgW10sICdDcmFmdCBCb29zdGVyIEl0ZW0nLCB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlKTsgLy8gQ3JlYXRlIHRoZSBtb2RhbCBpbnN0YW5jZVxyXG5cclxuICAgICAgICAvLyBBZGQgYSBidXR0b24gdG8gb3BlbiB0aGUgbXVsdGktc2VsZWN0IG1vZGFsXHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9ICdPcGVuIENyYWZ0aW5nIFRhYmxlJztcclxuICAgICAgICBidXR0b24ub25jbGljayA9ICgpID0+IHtcclxuICAgICAgICAgICAgbXVsdGlTZWxlY3RNb2RhbC5zZXRVc2VCb29zdGVyKGZhbHNlKTsgLy8gU2V0IHRoZSBmbGFnIGZvciBjcmFmdGluZyB0YWJsZVxyXG4gICAgICAgICAgICBtdWx0aVNlbGVjdE1vZGFsLm9wZW4oKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcblx0XHRtdWx0aVNlbGVjdE1vZGFsLnJlYWRCb29zdGVyc1N0b2NrKCk7XHJcblx0XHRtdWx0aVNlbGVjdE1vZGFsLnJlYWRJbmdyZW1lbnRTdG9jaygpO1xyXG5cclxuXHJcblx0XHRjb25zdCBidXR0b24yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICAgICAgYnV0dG9uMi5pbm5lclRleHQgPSAnT3BlbiBCb29zdGVyIEJvYXJkJztcclxuICAgICAgIFx0YnV0dG9uMi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRtdWx0aVNlbGVjdE1vZGFsLnNldFVzZUJvb3N0ZXIodHJ1ZSk7XHJcblx0XHRcdG11bHRpU2VsZWN0TW9kYWwub3BlbigpO1xyXG5cdFx0fTtcclxuXHJcbiAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblx0XHRjb250ZW50RWwuYXBwZW5kQ2hpbGQoYnV0dG9uMik7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbG9zZSgpIHtcclxuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuXHJcbmNsYXNzIE1vZGFsSW5mb3JtYXRpb25ib3ggZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nOyAvLyBTdG9yZSB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWRcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGRpc3BsYXlUZXh0OiBzdHJpbmcpIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLmRpc3BsYXlUZXh0ID0gZGlzcGxheVRleHQ7IC8vIFN0b3JlIHRoZSBwYXNzZWQgdGV4dFxyXG5cdH1cclxuXHJcblx0b25PcGVuKCkge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuc2V0VGV4dCh0aGlzLmRpc3BsYXlUZXh0KTsgLy8gVXNlIHRoZSBzdG9yZWQgdGV4dFxyXG5cdH1cclxuXHJcblx0b25DbG9zZSgpIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUZvcm1hdFN0cmluZ3MobGF5ZXIyOiBzdHJpbmcsIGxheWVyMzogc3RyaW5nKSB7XHJcblx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblxyXG5cdGlmICghYWN0aXZlVmlldykge1xyXG5cdFx0Y29uc29sZS5lcnJvcihcIk5vIGFjdGl2ZSBNYXJrZG93biB2aWV3IGZvdW5kLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IGVkaXRvciA9IGFjdGl2ZVZpZXcuZWRpdG9yO1xyXG5cdGNvbnN0IHNlbGVjdGVkVGV4dCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKTtcclxuXHJcblx0aWYgKCFzZWxlY3RlZFRleHQpIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoXCJObyB0ZXh0IHNlbGVjdGVkIChmb3IgcHJvZ3Jlc3NpdmUgc3VtbWFyaXphdGlvbiBzd2l0Y2ggTGF5ZXIgMiAmIDMpLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGxldCByZXBsYWNlZFRleHQgPSBzZWxlY3RlZFRleHQucmVwbGFjZUFsbChsYXllcjIsIFwiXHUwMEE3XHUwMEE3XHUwMEE3XHUwMEE3XCIpO1xyXG5cdHJlcGxhY2VkVGV4dCA9IHJlcGxhY2VkVGV4dC5yZXBsYWNlQWxsKGxheWVyMywgXCJcdTIwQUNcdTIwQUNcdTIwQUNcdTIwQUNcIilcclxuXHRyZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZUFsbChcIlx1MjBBQ1x1MjBBQ1x1MjBBQ1x1MjBBQ1wiLCBsYXllcjIpXHJcblx0cmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2VBbGwoXCJcdTAwQTdcdTAwQTdcdTAwQTdcdTAwQTdcIiwgbGF5ZXIzKVxyXG5cclxuXHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihyZXBsYWNlZFRleHQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKHJhdGluZ0N1cnJlbnQ6IHN0cmluZywgcmF0aW5nTmV3OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdGxldCByYXRpbmdGYWt0b3I6IG51bWJlclxyXG5cdGlmIChwYXJzZUludChyYXRpbmdDdXJyZW50LCAxMCkgPCByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nRmFrdG9yID0gcmF0aW5nTmV3IC0gcGFyc2VJbnQocmF0aW5nQ3VycmVudCwgMTApXHJcblx0fSBlbHNlIHtcclxuXHRcdHJhdGluZ0Zha3RvciA9IDBcclxuXHR9XHJcblxyXG5cdHJldHVybiByYXRpbmdGYWt0b3JcclxufVxyXG5cclxuXHJcblxyXG4gIFxyXG4gIFxyXG5cclxuXHJcblxyXG5cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGdhbWlmaWNhdGlvbiBmcm9tICcuL21haW4nO1xyXG5pbXBvcnQgdHlwZSB7TW9tZW50SW5wdXR9IGZyb20gJ21vbWVudCc7XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBQYXJ0aWFsPElTZXR0aW5ncz4gPSB7XHJcbiAgZW5hYmxlSW5pdENvbW1hbmQ6IHRydWUsXHJcbiAgYmluZEVudGVyOiB0cnVlLFxyXG4gIGJpbmRUYWI6IHRydWUsXHJcbiAgYXZhdGFyUGFnZU5hbWU6ICdBdmF0YXIgLSBHYW1pZmljYXRpb24nLFxyXG4gIHRhZ3NFeGNsdWRlOiAnJyxcclxuICBmb2xkZXJFeGNsdWRlOiAnRXhjYWxpZHJhdycsXHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjI6ICc9PScsXHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjM6ICcqKicsXHJcbiAgbnVtQWxsRmlsZXM6IDEsXHJcbiAgbnVtQWxsRmlsZXNDb3VudDogMCxcclxuICBjaGFydFJlZHV6aWVydW5nTW9uYXRlOiAwLFxyXG4gIHN0YXR1c1BvaW50czogMCxcclxuICBzdGF0dXNMZXZlbDogMSxcclxuICB4cEZvck5leHRMZXZlbDogMTAwMCxcclxuICBnYW1pZmljYXRpb25TdGFydERhdGU6ICcxMi4wOC4yMDIzJyxcclxuICBiYWRnZUJvb3N0ZXJTdGF0ZTogZmFsc2UsXHJcbiAgYmFkZ2VCb29zdGVyRmFjdG9yOiAxLFxyXG4gIGRlYnVnOiBmYWxzZSxcclxuICBkYWlseU5vdGVDcmVhdGlvblRhc2s6IDAsXHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25EYXRlOiAnMTIuMDguMjAyMycsXHJcbiAgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogMCxcclxuICB3ZWVrbHlOb3RlQ3JlYXRpb25EYXRlOiAnMTIuMDguMjAyMycsXHJcbiAgbmV4dXNOb2RlOiAwLFxyXG4gIGNvbm5lY3Rpb25DcnlzdGFsOiAwLFxyXG4gIG1hc3RlcnlTY3JvbGw6IDAsXHJcbiAgaW5zaWdodFByaXNtOiAwLFxyXG4gIHJlZmxlY3RpdmVFc3NlbmNlOiAwLFxyXG4gIGFtcGxpZmljYXRpb25DcnlzdGFsOiAwLFxyXG4gIGNyZWF0aXZlQ2F0YWx5c3Q6IDAsXHJcbiAgcHJlY2lzaW9uTGVuczogMCxcclxuICB0ZW1wb3JhbFR3ZWFrZXI6IDAsXHJcbiAgcGVycGV0dWFsUHJvZ3Jlc3M6IDAsXHJcbiAgc3RyYXRlZ2ljU3luYXBzZXM6IDAsXHJcbiAgYWNjZWxlcmF0ZWRBY3F1aXNpdGlvbjogMCxcclxuICBsaW5rZXJzTG9kZTogMCxcclxuICBlZmZvcnRsZXNzRXhwYW5zaW9uOiAwLFxyXG4gIHJlY3Vyc2l2ZVJlZmxlY3Rpb246IDAsXHJcbiAgc3luYXB0aWNTdXJnZTogMCxcclxuICBpbnNwaXJhdGlvbkluZnVzaW9uOiAwLFxyXG4gIHRpdGxlVGl0YW46IDAsXHJcbiAgcHJlY2lzaW9uUHJpc206IDAsXHJcbiAgaHlwZXJsaW5rSGFybW9ueTogMCxcclxuICBlcGhlbWVyYWxFdXBob3JpYTogMCxcclxuICBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3M6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlUGVycGV0dWFsUHJvZ3Jlc3M6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXM6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlU3RyYXRlZ2ljU3luYXBzZXM6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yTGlua2Vyc0xvZGU6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlTGlua2Vyc0xvZGU6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbjogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVSZWN1cnNpdmVSZWZsZWN0aW9uOicyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yU3luYXB0aWNTdXJnZTogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVTeW5hcHRpY1N1cmdlOiAnMjAyMy0wOC0xNSAyMDowMDowMCcsXHJcbiAgYm9vc3RlckZhY3RvclRpdGxlVGl0YW46IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlVGl0bGVUaXRhbjogJzIwMjMtMDgtMTUgMjA6MDA6MDAnLFxyXG4gIGJvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbTogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVQcmVjaXNpb25QcmlzbTogJzIwMjMtMDgtMTUgMjA6MDA6MDAnLFxyXG4gIGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255OiBmYWxzZSxcclxuICBib29zdGVyRGF0ZUh5cGVybGlua0hhcm1vbnk6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWE6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWE6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBzdHJlYWtib29zdGVyOiAwLFxyXG4gIHN0cmVha2Jvb3N0ZXJEYXRlOiBmYWxzZVxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljU2V0dGluZ3Mge1xyXG4gIFtrZXk6IHN0cmluZ106IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNldHRpbmdzIGV4dGVuZHMgRHluYW1pY1NldHRpbmdze1xyXG4gIGVuYWJsZUluaXRDb21tYW5kOiBib29sZWFuO1xyXG4gIGJpbmRFbnRlcjogYm9vbGVhbjtcclxuICBiaW5kVGFiOiBib29sZWFuO1xyXG4gIGF2YXRhclBhZ2VOYW1lOiBzdHJpbmc7XHJcbiAgdGFnc0V4Y2x1ZGU6IHN0cmluZztcclxuICBmb2xkZXJFeGNsdWRlOiBzdHJpbmc7XHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjI6IHN0cmluZztcclxuICBwcm9ncmVzc2l2ZVN1bUxheWVyMzogc3RyaW5nO1xyXG4gIG51bUFsbEZpbGVzOiBudW1iZXI7XHJcbiAgbnVtQWxsRmlsZXNDb3VudDogbnVtYmVyO1xyXG4gIGNoYXJ0UmVkdXppZXJ1bmdNb25hdGU6IG51bWJlcjtcclxuICBzdGF0dXNQb2ludHM6IG51bWJlcjtcclxuICBzdGF0dXNMZXZlbDogbnVtYmVyO1xyXG4gIHhwRm9yTmV4dExldmVsOiBudW1iZXI7XHJcbiAgZ2FtaWZpY2F0aW9uU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgYmFkZ2VCb29zdGVyU3RhdGU6IGJvb2xlYW47XHJcbiAgYmFkZ2VCb29zdGVyRmFjdG9yOiBudW1iZXI7XHJcbiAgZGVidWc6IGJvb2xlYW47XHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25UYXNrOiBudW1iZXI7XHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25EYXRlOiBzdHJpbmc7XHJcbiAgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHdlZWtseU5vdGVDcmVhdGlvbkRhdGU6IHN0cmluZztcclxuICBzdHJlYWtib29zdGVyOiBudW1iZXI7XHJcbiAgc3RyZWFrYm9vc3RlckRhdGU6IGJvb2xlYW47XHJcbiAgbmV4dXNOb2RlOiBudW1iZXI7XHJcbiAgY29ubmVjdGlvbkNyeXN0YWw6IG51bWJlcjtcclxuICBtYXN0ZXJ5U2Nyb2xsOiBudW1iZXI7XHJcbiAgaW5zaWdodFByaXNtOiBudW1iZXI7XHJcbiAgcmVmbGVjdGl2ZUVzc2VuY2U6IG51bWJlcjtcclxuICBhbXBsaWZpY2F0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIGNyZWF0aXZlQ2F0YWx5c3Q6IG51bWJlcjtcclxuICBwcmVjaXNpb25MZW5zOiBudW1iZXI7XHJcbiAgdGVtcG9yYWxUd2Vha2VyOiBudW1iZXI7XHJcbiAgcGVycGV0dWFsUHJvZ3Jlc3M6IG51bWJlcjtcclxuICBzdHJhdGVnaWNTeW5hcHNlczogbnVtYmVyO1xyXG4gIGFjY2VsZXJhdGVkQWNxdWlzaXRpb246IG51bWJlcjtcclxuICBsaW5rZXJzTG9kZTogbnVtYmVyO1xyXG4gIGVmZm9ydGxlc3NFeHBhbnNpb246IG51bWJlcjtcclxuICByZWN1cnNpdmVSZWZsZWN0aW9uOiBudW1iZXI7XHJcbiAgc3luYXB0aWNTdXJnZTogbnVtYmVyO1xyXG4gIGluc3BpcmF0aW9uSW5mdXNpb246IG51bWJlcjtcclxuICB0aXRsZVRpdGFuOiBudW1iZXI7XHJcbiAgcHJlY2lzaW9uUHJpc206IG51bWJlcjtcclxuICBoeXBlcmxpbmtIYXJtb255OiBudW1iZXI7XHJcbiAgZXBoZW1lcmFsRXVwaG9yaWE6IG51bWJlcjtcclxuICBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgYm9vc3RlckRhdGVQZXJwZXR1YWxQcm9ncmVzczogc3RyaW5nXHJcbiAgYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlU3RyYXRlZ2ljU3luYXBzZXM6IHN0cmluZztcclxuICBib29zdGVyRmFjdG9yTGlua2Vyc0xvZGU6IGJvb2xlYW47XHJcbiAgYm9vc3RlckRhdGVMaW5rZXJzTG9kZTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JSZWN1cnNpdmVSZWZsZWN0aW9uOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlUmVjdXJzaXZlUmVmbGVjdGlvbjogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlU3luYXB0aWNTdXJnZTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlVGl0bGVUaXRhbjogc3RyaW5nXHJcbiAgYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlUHJlY2lzaW9uUHJpc206IHN0cmluZ1xyXG4gIGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255OiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlSHlwZXJsaW5rSGFybW9ueTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYTogYm9vbGVhbjtcclxuICBib29zdGVyRGF0ZUVwaGVtZXJhbEV1cGhvcmlhOiBzdHJpbmc7XHJcbiAgLy9ba2V5OiBzdHJpbmddOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgTW9tZW50SW5wdXQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogZ2FtaWZpY2F0aW9uO1xyXG4gIHB1YmxpYyBzZXR0aW5nczogSVNldHRpbmdzO1xyXG4gIFxyXG4gIHB1YmxpYyBlbmFibGVJbml0Q29tbWFuZDogYm9vbGVhbjtcclxuICBwdWJsaWMgYmluZEVudGVyOiBib29sZWFuO1xyXG4gIHB1YmxpYyBiaW5kVGFiOiBib29sZWFuO1xyXG4gIHB1YmxpYyBhdmF0YXJQYWdlTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyB0YWdzRXhjbHVkZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBmb2xkZXJFeGNsdWRlOiBzdHJpbmc7XHJcbiAgcHVibGljIHByb2dyZXNzaXZlU3VtTGF5ZXIyOiBzdHJpbmc7XHJcbiAgcHVibGljIHByb2dyZXNzaXZlU3VtTGF5ZXIzOiBzdHJpbmc7XHJcbiAgcHVibGljIG51bUFsbEZpbGVzOiBudW1iZXI7XHJcbiAgcHVibGljIG51bUFsbEZpbGVzQ291bnQ6IG51bWJlcjtcclxuICBwdWJsaWMgY2hhcnRSZWR1emllcnVuZ01vbmF0ZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBzdGF0dXNQb2ludHM6IG51bWJlcjtcclxuICBwdWJsaWMgc3RhdHVzTGV2ZWw6IG51bWJlcjtcclxuICBwdWJsaWMgeHBGb3JOZXh0TGV2ZWw6IG51bWJlcjtcclxuICBwdWJsaWMgZ2FtaWZpY2F0aW9uU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIGJhZGdlQm9vc3RlclN0YXRlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBiYWRnZUJvb3N0ZXJGYWN0b3I6IG51bWJlcjtcclxuICBwdWJsaWMgZGVidWc6IGJvb2xlYW47XHJcbiAgcHVibGljIGRhaWx5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHB1YmxpYyBkYWlseU5vdGVDcmVhdGlvbkRhdGU6IHN0cmluZztcclxuICBwdWJsaWMgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHB1YmxpYyB3ZWVrbHlOb3RlQ3JlYXRpb25EYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIHN0cmVha2Jvb3N0ZXI6IG51bWJlcjtcclxuICBwdWJsaWMgc3RyZWFrYm9vc3RlckRhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIG5leHVzTm9kZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBjb25uZWN0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtYXN0ZXJ5U2Nyb2xsOiBudW1iZXI7XHJcbiAgcHVibGljIGluc2lnaHRQcmlzbTogbnVtYmVyO1xyXG4gIHB1YmxpYyByZWZsZWN0aXZlRXNzZW5jZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBhbXBsaWZpY2F0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIHB1YmxpYyBjcmVhdGl2ZUNhdGFseXN0OiBudW1iZXI7XHJcbiAgcHVibGljIHByZWNpc2lvbkxlbnM6IG51bWJlcjtcclxuICBwdWJsaWMgdGVtcG9yYWxUd2Vha2VyOiBudW1iZXI7XHJcbiAgcHVibGljIHBlcnBldHVhbFByb2dyZXNzOiBudW1iZXI7XHJcbiAgcHVibGljIHN0cmF0ZWdpY1N5bmFwc2VzOiBudW1iZXI7XHJcbiAgcHVibGljIGFjY2VsZXJhdGVkQWNxdWlzaXRpb246IG51bWJlcjtcclxuICBwdWJsaWMgbGlua2Vyc0xvZGU6IG51bWJlcjtcclxuICBwdWJsaWMgZWZmb3J0bGVzc0V4cGFuc2lvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyByZWN1cnNpdmVSZWZsZWN0aW9uOiBudW1iZXI7XHJcbiAgcHVibGljIHN5bmFwdGljU3VyZ2U6IG51bWJlcjtcclxuICBwdWJsaWMgaW5zcGlyYXRpb25JbmZ1c2lvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyB0aXRsZVRpdGFuOiBudW1iZXI7XHJcbiAgcHVibGljIHByZWNpc2lvblByaXNtOiBudW1iZXI7XHJcbiAgcHVibGljIGh5cGVybGlua0hhcm1vbnk6IG51bWJlcjtcclxuICBwdWJsaWMgZXBoZW1lcmFsRXVwaG9yaWE6IG51bWJlcjtcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVBlcnBldHVhbFByb2dyZXNzOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVN0cmF0ZWdpY1N5bmFwc2VzOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvckxpbmtlcnNMb2RlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZUxpbmtlcnNMb2RlOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb246IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlUmVjdXJzaXZlUmVmbGVjdGlvbjogc3RyaW5nXHJcbiAgcHVibGljIGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVN5bmFwdGljU3VyZ2U6IHN0cmluZ1xyXG4gIHB1YmxpYyBib29zdGVyRmFjdG9yVGl0bGVUaXRhbjogYm9vbGVhbjtcclxuICBwdWJsaWMgYm9vc3RlckRhdGVUaXRsZVRpdGFuOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVByZWNpc2lvblByaXNtOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3Rvckh5cGVybGlua0hhcm1vbnk6IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlSHlwZXJsaW5rSGFybW9ueTogc3RyaW5nO1xyXG4gIHB1YmxpYyBib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWE6IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWE6IHN0cmluZztcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogZ2FtaWZpY2F0aW9uKSB7XHJcblx0ICBzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0ICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcbiAgXHJcblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGFpbmVyRWwuYWRkQ2xhc3MoXCJleGNhbGlkcmF3LXNldHRpbmdzXCIpO1xyXG5cdFx0dGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnN0IGNvZmZlZURpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdihcImNvZmZlZVwiKTtcclxuXHRcdGNvZmZlZURpdi5hZGRDbGFzcyhcImV4LWNvZmZlZS1kaXZcIik7XHJcblx0XHRjb25zdCBjb2ZmZWVMaW5rID0gY29mZmVlRGl2LmNyZWF0ZUVsKFwiYVwiLCB7XHJcblx0XHRocmVmOiBcImh0dHBzOi8va28tZmkuY29tL2FuZHJlYXN0cmViaW5nXCIsXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGNvZmZlZUltZyA9IGNvZmZlZUxpbmsuY3JlYXRlRWwoXCJpbWdcIiwge1xyXG5cdFx0YXR0cjoge1xyXG5cdFx0XHRzcmM6IFwiaHR0cHM6Ly9jZG4ua28tZmkuY29tL2Nkbi9rb2ZpMy5wbmc/dj0zXCIsXHJcblx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHRjb2ZmZWVJbWcuaGVpZ2h0ID0gNDU7XHJcblxyXG5cdFx0Ly9jb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Ly9jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gIFxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnR2FtaWZ5IHlvdXIgUEtNIC0gU2V0dGluZ3MnIH0pO1xyXG5cdFx0Y29uc29sZS5sb2coJ3NldHRpbmdzIGNhbGxlZCcpXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJyN0YWdzIHRvIGlnbm9yZScpXHJcblx0XHRcdC5zZXREZXNjKCdlbnRlciB0YWdzIHdpdGhvdXQgIyBhbmQgc2VwYXJhdGUgd2l0aCBcIiwgXCIuXFxuSW5jbHVkZSBuZXN0ZWQgdGFncy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHlvdXIgdGFnMSwgdGFnMi9zdWJ0YWcsIFx1MjAyNicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NFeGNsdWRlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NFeGNsdWRlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0XHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdmb2xkZXIgdG8gaWdub3JlJylcclxuXHRcdFx0LnNldERlc2MoJ2VudGVyIGZvbGRlciB3aGljaHMgY29udGVudCBzaGFsbCBiZSBpZ25vcmVkLiBTZXBhcmF0ZSB3aXRoIFwiLCBcIi4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHlvdXIgZm9sZGVyMSwgZm9sZGVyMiwgXHUyMDI2JylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyRXhjbHVkZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnZm9sZGVyIHRvIGV4Y2x1ZGU6ICcgKyB2YWx1ZSk7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb2xkZXJFeGNsdWRlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9maWxlIFBhZ2UgTmFtZScpXHJcblx0XHRcdC5zZXREZXNjKCd5b3UgY2FuIGNoYW5nZSBoZXJlIHRoZSBuYW1lIG9mIHlvdXIgcHJvZmlsZSBwYWdlIGlmIHlvdSBsaWtlLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCduYW1lJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ZvbGRlciB0byBleGNsdWRlOiAnICsgdmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdPdGhlciBTZXR0aW5ncycgfSk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0Rpc2FibGUgSW5pdCBDb21tYW5kJylcclxuXHRcdFx0LnNldERlc2MoJ3lvdSBjYW4gcmVtb3ZlIHRoZSBpbml0IGNvbW1hbmQgZnJvbSBjb21tYW5kIHByb21wdCBieSBzd2l0Y2hpbmcgb2ZmLlxcbnJlc3RhcnQgbmVlZGVkLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gXHJcblx0XHRcdFx0dG9nZ2xlXHJcbiAgICAgICAgICBcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUluaXRDb21tYW5kKVxyXG4gICAgICAgIFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlSW5pdENvbW1hbmQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgXHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG4gICAgICAgICAgXHRcdFx0fSksXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ2xpbWl0IHRoZSB2aXNpYmxlIG1vbnRoIGluIHRoZSBjaGFydCBvbiB5b3VyIGF2YXRhciBwYWdlOiAnICsgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0XHRcdC5zZXREZXNjKCdpZiAwLCBhbGwgbW9udGggd2lsbCBiZSBzaG93bi4gRW50ZXIgYSBudW1iZXIgaG93IG1hbnkgbW9udGggc2hhbGwgYmUgc2hvd24uJylcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ051bWJlciBvZiBNb250aCB0byBzaG93JylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jaGFydFJlZHV6aWVydW5nTW9uYXRlLnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmNoYXJ0UmVkdXppZXJ1bmdNb25hdGUgPSBwYXJzZUludCh2YWx1ZSk7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcbiAgXHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9ncmVzc2l2ZSBTdW1tYXJpemF0aW9uJylcclxuXHRcdFx0LnNldERlc2MoJ3lvdSBjYW4gY2hhbmdlIHdoaWNoIGZvcm1hdHRpbmcgeW91IHVzZSBmb3IgTGF5ZXIgMiBhbmQgMy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignTGF5ZXIgMiBpcyB1c3VhbGx5ICoqJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ZvbGRlciB0byBleGNsdWRlOiAnICsgdmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSlcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0xheWVyIDMgaXMgdXN1YWxseSA9PScpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdmb2xkZXIgdG8gZXhjbHVkZTogJyArIHZhbHVlKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pKTtcclxuXHJcblx0fVxyXG4gIH0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVxdWlyZWRBcmdzKHJlcXVpcmVkLCBhcmdzKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA8IHJlcXVpcmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihyZXF1aXJlZCArICcgYXJndW1lbnQnICsgKHJlcXVpcmVkID4gMSA/ICdzJyA6ICcnKSArICcgcmVxdWlyZWQsIGJ1dCBvbmx5ICcgKyBhcmdzLmxlbmd0aCArICcgcHJlc2VudCcpO1xuICB9XG59IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSB0b0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIERhdGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0cyBjbG9uZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIGl0IGlzIHRyZWF0ZWQgYXMgYSB0aW1lc3RhbXAuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIG5vbmUgb2YgdGhlIGFib3ZlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gYXJndW1lbnQgLSB0aGUgdmFsdWUgdG8gY29udmVydFxuICogQHJldHVybnMge0RhdGV9IHRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7XG5cbiAgLy8gQ2xvbmUgdGhlIGRhdGVcbiAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fCBfdHlwZW9mKGFyZ3VtZW50KSA9PT0gJ29iamVjdCcgJiYgYXJnU3RyID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBkYXRlIHRvIGxvc2UgdGhlIG1pbGxpc2Vjb25kcyB3aGVuIHBhc3NlZCB0byBuZXcgRGF0ZSgpIGluIElFMTBcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdudW1iZXInIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmICgodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IFN0cmluZ10nKSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXCJTdGFydGluZyB3aXRoIHYyLjAuMC1iZXRhLjEgZGF0ZS1mbnMgZG9lc24ndCBhY2NlcHQgc3RyaW5ncyBhcyBkYXRlIGFyZ3VtZW50cy4gUGxlYXNlIHVzZSBgcGFyc2VJU09gIHRvIHBhcnNlIHN0cmluZ3MuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI3N0cmluZy1hcmd1bWVudHNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbn0iLCAiaW1wb3J0IGlzRGF0ZSBmcm9tIFwiLi4vaXNEYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzVmFsaWRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdmFsaWQ/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGFyZ3VtZW50IGlzIEludmFsaWQgRGF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBBcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gRGF0ZSB1c2luZyBgdG9EYXRlYC4gU2VlIFt0b0RhdGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvdG9EYXRlfVxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogQHBhcmFtIHsqfSBkYXRlIC0gdGhlIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZSBpcyB2YWxpZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoMjAxNCwgMSwgMzEpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsdWUsIGNvbnZlcnRhYmxlIGludG8gYSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZCgxMzkzODA0ODAwMDAwKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgnJykpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICBpZiAoIWlzRGF0ZShkaXJ0eURhdGUpICYmIHR5cGVvZiBkaXJ0eURhdGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHJldHVybiAhaXNOYU4oTnVtYmVyKGRhdGUpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9JbnRlZ2VyKGRpcnR5TnVtYmVyKSB7XG4gIGlmIChkaXJ0eU51bWJlciA9PT0gbnVsbCB8fCBkaXJ0eU51bWJlciA9PT0gdHJ1ZSB8fCBkaXJ0eU51bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bWJlciA8IDAgPyBNYXRoLmNlaWwobnVtYmVyKSA6IE1hdGguZmxvb3IobnVtYmVyKTtcbn0iLCAiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHRpbWVzdGFtcCA9IHRvRGF0ZShkaXJ0eURhdGUpLmdldFRpbWUoKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyBhbW91bnQpO1xufSIsICJpbXBvcnQgYWRkTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9hZGRNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdWJNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgc3VidHJhY3RlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgc3VidHJhY3RlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA3NTAgbWlsbGlzZWNvbmRzIGZyb20gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1Yk1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjI5LjI1MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCAtYW1vdW50KTtcbn0iLCAiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fREFZID0gODY0MDAwMDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENEYXlPZlllYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mWWVhclRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICB2YXIgZGlmZmVyZW5jZSA9IHRpbWVzdGFtcCAtIHN0YXJ0T2ZZZWFyVGltZXN0YW1wO1xuICByZXR1cm4gTWF0aC5mbG9vcihkaWZmZXJlbmNlIC8gTUlMTElTRUNPTkRTX0lOX0RBWSkgKyAxO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWsoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gMTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuICBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59IiwgImltcG9ydCBnZXRVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWtZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIHllYXIgPSBnZXRVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpO1xuICB2YXIgZm91cnRoT2ZKYW51YXJ5ID0gbmV3IERhdGUoMCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSk7XG4gIHJldHVybiBkYXRlO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRpZmYgPSBzdGFydE9mVVRDSVNPV2VlayhkYXRlKS5nZXRUaW1lKCkgLSBzdGFydE9mVVRDSVNPV2Vla1llYXIoZGF0ZSkuZ2V0VGltZSgpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSykgKyAxO1xufSIsICJ2YXIgZGVmYXVsdE9wdGlvbnMgPSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuLi9kZWZhdWx0T3B0aW9ucy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ1dlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfcmVmMiwgX3JlZjMsIF9vcHRpb25zJHdlZWtTdGFydHNPbiwgX29wdGlvbnMkbG9jYWxlLCBfb3B0aW9ucyRsb2NhbGUkb3B0aW8sIF9kZWZhdWx0T3B0aW9ucyRsb2NhbCwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMjtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSB0b0ludGVnZXIoKF9yZWYgPSAoX3JlZjIgPSAoX3JlZjMgPSAoX29wdGlvbnMkd2Vla1N0YXJ0c09uID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX29wdGlvbnMkd2Vla1N0YXJ0c09uICE9PSB2b2lkIDAgPyBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX29wdGlvbnMkbG9jYWxlJG9wdGlvID0gX29wdGlvbnMkbG9jYWxlLm9wdGlvbnMpID09PSBudWxsIHx8IF9vcHRpb25zJGxvY2FsZSRvcHRpbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbG9jYWxlJG9wdGlvLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX3JlZjMgIT09IHZvaWQgMCA/IF9yZWYzIDogZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmMiAhPT0gdm9pZCAwID8gX3JlZjIgOiAoX2RlZmF1bHRPcHRpb25zJGxvY2FsID0gZGVmYXVsdE9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwyID0gX2RlZmF1bHRPcHRpb25zJGxvY2FsLm9wdGlvbnMpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogMCk7XG5cbiAgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAwIGFuZCA2IF9hbmRfIGlzIG5vdCBOYU5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCAiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgb3B0aW9ucykge1xuICB2YXIgX3JlZiwgX3JlZjIsIF9yZWYzLCBfb3B0aW9ucyRmaXJzdFdlZWtDb24sIF9vcHRpb25zJGxvY2FsZSwgX29wdGlvbnMkbG9jYWxlJG9wdGlvLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwsIF9kZWZhdWx0T3B0aW9ucyRsb2NhbDI7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IHRvSW50ZWdlcigoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8uZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAxKTtcblxuICAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDEgYW5kIDcgX2FuZF8gaXMgbm90IE5hTlxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldFVUQ0Z1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mVVRDV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcbiAgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufSIsICJpbXBvcnQgZ2V0VVRDV2Vla1llYXIgZnJvbSBcIi4uL2dldFVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENXZWVrWWVhcihkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9yZWYsIF9yZWYyLCBfcmVmMywgX29wdGlvbnMkZmlyc3RXZWVrQ29uLCBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbywgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyO1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IHRvSW50ZWdlcigoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8uZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAxKTtcbiAgdmFyIHllYXIgPSBnZXRVVENXZWVrWWVhcihkaXJ0eURhdGUsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vlay5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBkYXRlID0gc3RhcnRPZlVUQ1dlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwgImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrWWVhciBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fV0VFSyA9IDYwNDgwMDAwMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGlmZiA9IHN0YXJ0T2ZVVENXZWVrKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKSAtIHN0YXJ0T2ZVVENXZWVrWWVhcihkYXRlLCBvcHRpb25zKS5nZXRUaW1lKCk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdClcbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIE1JTExJU0VDT05EU19JTl9XRUVLKSArIDE7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgPyAnLScgOiAnJztcbiAgdmFyIG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKTtcbiAgd2hpbGUgKG91dHB1dC5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHNpZ24gKyBvdXRwdXQ7XG59IiwgImltcG9ydCBhZGRMZWFkaW5nWmVyb3MgZnJvbSBcIi4uLy4uL2FkZExlYWRpbmdaZXJvcy9pbmRleC5qc1wiO1xuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIHkoZGF0ZSwgdG9rZW4pIHtcbiAgICAvLyBGcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtMzEvdHIzNS1kYXRlcy5odG1sI0RhdGVfRm9ybWF0X3Rva2Vuc1xuICAgIC8vIHwgWWVhciAgICAgfCAgICAgeSB8IHl5IHwgICB5eXkgfCAgeXl5eSB8IHl5eXl5IHxcbiAgICAvLyB8LS0tLS0tLS0tLXwtLS0tLS0tfC0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18XG4gICAgLy8gfCBBRCAxICAgICB8ICAgICAxIHwgMDEgfCAgIDAwMSB8ICAwMDAxIHwgMDAwMDEgfFxuICAgIC8vIHwgQUQgMTIgICAgfCAgICAxMiB8IDEyIHwgICAwMTIgfCAgMDAxMiB8IDAwMDEyIHxcbiAgICAvLyB8IEFEIDEyMyAgIHwgICAxMjMgfCAyMyB8ICAgMTIzIHwgIDAxMjMgfCAwMDEyMyB8XG4gICAgLy8gfCBBRCAxMjM0ICB8ICAxMjM0IHwgMzQgfCAgMTIzNCB8ICAxMjM0IHwgMDEyMzQgfFxuICAgIC8vIHwgQUQgMTIzNDUgfCAxMjM0NSB8IDQ1IHwgMTIzNDUgfCAxMjM0NSB8IDEyMzQ1IHxcblxuICAgIHZhciBzaWduZWRZZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSAneXknID8geWVhciAlIDEwMCA6IHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSAnTScgPyBTdHJpbmcobW9udGggKyAxKSA6IGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpO1xuICB9LFxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDRGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBBTSBvciBQTVxuICBhOiBmdW5jdGlvbiBhKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0VVRDSG91cnMoKSAvIDEyID49IDEgPyAncG0nIDogJ2FtJztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdhJzpcbiAgICAgIGNhc2UgJ2FhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSAnYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICAgIGNhc2UgJ2FhYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgJ2FhYWEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gJ2FtJyA/ICdhLm0uJyA6ICdwLm0uJztcbiAgICB9XG4gIH0sXG4gIC8vIEhvdXIgWzEtMTJdXG4gIGg6IGZ1bmN0aW9uIGgoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ01pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIHMoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDU2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gUyhkYXRlLCB0b2tlbikge1xuICAgIHZhciBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgICB2YXIgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCAiaW1wb3J0IGdldFVUQ0RheU9mWWVhciBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENEYXlPZlllYXIvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENJU09XZWVrIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ1dlZWsgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ1dlZWtZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTGVhZGluZ1plcm9zIGZyb20gXCIuLi8uLi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanNcIjtcbmltcG9ydCBsaWdodEZvcm1hdHRlcnMgZnJvbSBcIi4uL2xpZ2h0Rm9ybWF0dGVycy9pbmRleC5qc1wiO1xudmFyIGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiAnYW0nLFxuICBwbTogJ3BtJyxcbiAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gIG5vb246ICdub29uJyxcbiAgbW9ybmluZzogJ21vcm5pbmcnLFxuICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICBldmVuaW5nOiAnZXZlbmluZycsXG4gIG5pZ2h0OiAnbmlnaHQnXG59O1xuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8gIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAhIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgIHwgIFAhIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHogIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgZm9ybWF0YCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqIC0gYFBgIGlzIGxvbmcgbG9jYWxpemVkIGRhdGUgZm9ybWF0XG4gKiAtIGBwYCBpcyBsb25nIGxvY2FsaXplZCB0aW1lIGZvcm1hdFxuICovXG5cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBFcmFcbiAgRzogZnVuY3Rpb24gRyhkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZXJhID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpID4gMCA/IDEgOiAwO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSAnRyc6XG4gICAgICBjYXNlICdHRyc6XG4gICAgICBjYXNlICdHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93J1xuICAgICAgICB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlICdHR0dHJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24geShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gJ3lvJykge1xuICAgICAgdmFyIHNpZ25lZFllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHllYXIsIHtcbiAgICAgICAgdW5pdDogJ3llYXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiBZKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBzaWduZWRXZWVrWWVhciA9IGdldFVUQ1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgdmFyIHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgICAgdmFyIHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpO1xuICAgIH1cblxuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSAnWW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwge1xuICAgICAgICB1bml0OiAneWVhcidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiBSKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGlzb1dlZWtZZWFyID0gZ2V0VVRDSVNPV2Vla1llYXIoZGF0ZSk7XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gdShkYXRlLCB0b2tlbikge1xuICAgIHZhciB5ZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiBRKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgJ1EnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgJ1FRJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSAnUW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7XG4gICAgICAgICAgdW5pdDogJ3F1YXJ0ZXInXG4gICAgICAgIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgJ1FRUSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgJ1FRUVFRJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSAnUVFRUSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIHEoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIC8gMyk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSAncXEnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlICdxbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB1bml0OiAncXVhcnRlcidcbiAgICAgICAgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSAncXFxJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSAncXFxcXEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlICdxcXFxJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIE0oZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ00nOlxuICAgICAgY2FzZSAnTU0nOlxuICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLk0oZGF0ZSwgdG9rZW4pO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSAnTW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHtcbiAgICAgICAgICB1bml0OiAnbW9udGgnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlICdNTU0nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlICdNTU1NJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gTChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSAnTCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobW9udGggKyAxKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlICdMbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwge1xuICAgICAgICAgIHVuaXQ6ICdtb250aCdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSAnTExMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBMb2NhbCB3ZWVrIG9mIHllYXJcbiAgdzogZnVuY3Rpb24gdyhkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgd2VlayA9IGdldFVUQ1dlZWsoZGF0ZSwgb3B0aW9ucyk7XG4gICAgaWYgKHRva2VuID09PSAnd28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7XG4gICAgICAgIHVuaXQ6ICd3ZWVrJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiBJKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBpc29XZWVrID0gZ2V0VVRDSVNPV2VlayhkYXRlKTtcbiAgICBpZiAodG9rZW4gPT09ICdJbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHtcbiAgICAgICAgdW5pdDogJ3dlZWsnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIGQoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnZG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ0RhdGUoKSwge1xuICAgICAgICB1bml0OiAnZGF0ZSdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiBEKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBkYXlPZlllYXIgPSBnZXRVVENEYXlPZlllYXIoZGF0ZSk7XG4gICAgaWYgKHRva2VuID09PSAnRG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHtcbiAgICAgICAgdW5pdDogJ2RheU9mWWVhcidcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHdlZWtcbiAgRTogZnVuY3Rpb24gRShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgJ0UnOlxuICAgICAgY2FzZSAnRUUnOlxuICAgICAgY2FzZSAnRUVFJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlICdFRUVFRUUnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnc2hvcnQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgJ0VFRUUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIGUoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pXG4gICAgICBjYXNlICdlJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlICdlZSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlICdlbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdlZWUnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2VlZWVlJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2VlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnZWVlZSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbiAgYzogZnVuY3Rpb24gYyhkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSAnY2MnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlICdjbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2NjY2NjJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2NjY2NjYyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIGkoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSAnaSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlICdpaSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMm5kXG4gICAgICBjYXNlICdpbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2Vlaywge1xuICAgICAgICAgIHVuaXQ6ICdkYXknXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlICdpaWknOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2lpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2lpaWlpaSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnaWlpaSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gYShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICdwbScgOiAnYW0nO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnYWEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2FhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlICdhYWFhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2FhYWEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gYihkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gJ3BtJyA6ICdhbSc7XG4gICAgfVxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgY2FzZSAnYmInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2JiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlICdiYmJiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2JiYmInOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gQihkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnQic6XG4gICAgICBjYXNlICdCQic6XG4gICAgICBjYXNlICdCQkInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ0JCQkJCJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAnQkJCQic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gaChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdobycpIHtcbiAgICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyO1xuICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gSChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdIbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0VVRDSG91cnMoKSwge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLkgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiBLKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyO1xuICAgIGlmICh0b2tlbiA9PT0gJ0tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSG91ciBbMS0yNF1cbiAgazogZnVuY3Rpb24gayhkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuICAgIGlmICh0b2tlbiA9PT0gJ2tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIG0oZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnbW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ01pbnV0ZXMoKSwge1xuICAgICAgICB1bml0OiAnbWludXRlJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiBzKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ3NvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENTZWNvbmRzKCksIHtcbiAgICAgICAgdW5pdDogJ3NlY29uZCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gUyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIFgoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSBvcmlnaW5hbERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiAnWic7XG4gICAgfVxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlICdYJzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuICAgICAgY2FzZSAnWFhYWCc6XG4gICAgICBjYXNlICdYWCc6XG4gICAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWFhgXG4gICAgICBjYXNlICdYWFhYWCc6XG4gICAgICBjYXNlICdYWFgnOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpXG4gIHg6IGZ1bmN0aW9uIHgoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSBvcmlnaW5hbERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSAneCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgJ3h4eHgnOlxuICAgICAgY2FzZSAneHgnOlxuICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuICAgICAgY2FzZSAneHh4eHgnOlxuICAgICAgY2FzZSAneHh4JzogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiBPKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ08nOlxuICAgICAgY2FzZSAnT08nOlxuICAgICAgY2FzZSAnT09PJzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgJ09PT08nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiB6KGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ3onOlxuICAgICAgY2FzZSAnenonOlxuICAgICAgY2FzZSAnenp6JzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgJ3p6enonOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiB0KGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWVzdGFtcCA9IE1hdGguZmxvb3Iob3JpZ2luYWxEYXRlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIFQoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXN0YW1wID0gb3JpZ2luYWxEYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkaXJ0eURlbGltaXRlcikge1xuICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAnLScgOiAnKyc7XG4gIHZhciBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGFic09mZnNldCAvIDYwKTtcbiAgdmFyIG1pbnV0ZXMgPSBhYnNPZmZzZXQgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gc2lnbiArIFN0cmluZyhob3Vycyk7XG4gIH1cbiAgdmFyIGRlbGltaXRlciA9IGRpcnR5RGVsaW1pdGVyIHx8ICcnO1xuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkaXJ0eURlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAnLScgOiAnKyc7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkaXJ0eURlbGltaXRlcik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBkZWxpbWl0ZXIgPSBkaXJ0eURlbGltaXRlciB8fCAnJztcbiAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICB2YXIgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgdmFyIGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgdmFyIG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdHRlcnM7IiwgInZhciBkYXRlTG9uZ0Zvcm1hdHRlciA9IGZ1bmN0aW9uIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSAnUCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1BQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1BQUCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG4gICAgY2FzZSAnUFBQUCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgfVxufTtcbnZhciB0aW1lTG9uZ0Zvcm1hdHRlciA9IGZ1bmN0aW9uIHRpbWVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSAncCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ3BwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ3BwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG4gICAgY2FzZSAncHBwcCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgfVxufTtcbnZhciBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSBmdW5jdGlvbiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZykge1xuICB2YXIgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKC8oUCspKHArKT8vKSB8fCBbXTtcbiAgdmFyIGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIHZhciB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdO1xuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG4gIHZhciBkYXRlVGltZUZvcm1hdDtcbiAgc3dpdGNoIChkYXRlUGF0dGVybikge1xuICAgIGNhc2UgJ1AnOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUFAnOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdtZWRpdW0nXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BQUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BQUFAnOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBkYXRlVGltZUZvcm1hdC5yZXBsYWNlKCd7e2RhdGV9fScsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSkucmVwbGFjZSgne3t0aW1lfX0nLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufTtcbnZhciBsb25nRm9ybWF0dGVycyA9IHtcbiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsXG4gIFA6IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlclxufTtcbmV4cG9ydCBkZWZhdWx0IGxvbmdGb3JtYXR0ZXJzOyIsICIvKipcbiAqIEdvb2dsZSBDaHJvbWUgYXMgb2YgNjcuMC4zMzk2Ljg3IGludHJvZHVjZWQgdGltZXpvbmVzIHdpdGggb2Zmc2V0IHRoYXQgaW5jbHVkZXMgc2Vjb25kcy5cbiAqIFRoZXkgdXN1YWxseSBhcHBlYXIgZm9yIGRhdGVzIHRoYXQgZGVub3RlIHRpbWUgYmVmb3JlIHRoZSB0aW1lem9uZXMgd2VyZSBpbnRyb2R1Y2VkXG4gKiAoZS5nLiBmb3IgJ0V1cm9wZS9QcmFndWUnIHRpbWV6b25lIHRoZSBvZmZzZXQgaXMgR01UKzAwOjU3OjQ0IGJlZm9yZSAxIE9jdG9iZXIgMTg5MVxuICogYW5kIEdNVCswMTowMDowMCBhZnRlciB0aGF0IGRhdGUpXG4gKlxuICogRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gbWludXRlcyBhbmQgd291bGQgcmV0dXJuIDU3IGZvciB0aGUgZXhhbXBsZSBhYm92ZSxcbiAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0YWtlcyBzZWNvbmRzIGluIGFjY291bnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkge1xuICB2YXIgdXRjRGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpKTtcbiAgdXRjRGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gZGF0ZS5nZXRUaW1lKCkgLSB1dGNEYXRlLmdldFRpbWUoKTtcbn0iLCAidmFyIHByb3RlY3RlZERheU9mWWVhclRva2VucyA9IFsnRCcsICdERCddO1xudmFyIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zID0gWydZWScsICdZWVlZJ107XG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gcHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGlmICh0b2tlbiA9PT0gJ1lZWVknKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0QnKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYGRgIGluc3RlYWQgb2YgYERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0REJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfVxufSIsICJ2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6ICdsZXNzIHRoYW4gYSBzZWNvbmQnLFxuICAgIG90aGVyOiAnbGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICB4U2Vjb25kczoge1xuICAgIG9uZTogJzEgc2Vjb25kJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICBoYWxmQU1pbnV0ZTogJ2hhbGYgYSBtaW51dGUnLFxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiAnbGVzcyB0aGFuIGEgbWludXRlJyxcbiAgICBvdGhlcjogJ2xlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6ICcxIG1pbnV0ZScsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIGhvdXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4SG91cnM6IHtcbiAgICBvbmU6ICcxIGhvdXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4RGF5czoge1xuICAgIG9uZTogJzEgZGF5JyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBkYXlzJ1xuICB9LFxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogJ2Fib3V0IDEgd2VlaycsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIHhXZWVrczoge1xuICAgIG9uZTogJzEgd2VlaycsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogJ2Fib3V0IDEgbW9udGgnLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgeE1vbnRoczoge1xuICAgIG9uZTogJzEgbW9udGgnLFxuICAgIG90aGVyOiAne3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIHllYXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IHllYXJzJ1xuICB9LFxuICB4WWVhcnM6IHtcbiAgICBvbmU6ICcxIHllYXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IHllYXJzJ1xuICB9LFxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiAnb3ZlciAxIHllYXInLFxuICAgIG90aGVyOiAnb3ZlciB7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogJ2FsbW9zdCAxIHllYXInLFxuICAgIG90aGVyOiAnYWxtb3N0IHt7Y291bnR9fSB5ZWFycydcbiAgfVxufTtcbnZhciBmb3JtYXREaXN0YW5jZSA9IGZ1bmN0aW9uIGZvcm1hdERpc3RhbmNlKHRva2VuLCBjb3VudCwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuICB2YXIgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcbiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoJ3t7Y291bnR9fScsIGNvdW50LnRvU3RyaW5nKCkpO1xuICB9XG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuICdpbiAnICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgJyBhZ28nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdERpc3RhbmNlOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICB2YXIgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59IiwgImltcG9ydCBidWlsZEZvcm1hdExvbmdGbiBmcm9tIFwiLi4vLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi9pbmRleC5qc1wiO1xudmFyIGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiAnRUVFRSwgTU1NTSBkbywgeScsXG4gIGxvbmc6ICdNTU1NIGRvLCB5JyxcbiAgbWVkaXVtOiAnTU1NIGQsIHknLFxuICBzaG9ydDogJ01NL2RkL3l5eXknXG59O1xudmFyIHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiAnaDptbTpzcyBhIHp6enonLFxuICBsb25nOiAnaDptbTpzcyBhIHonLFxuICBtZWRpdW06ICdoOm1tOnNzIGEnLFxuICBzaG9ydDogJ2g6bW0gYSdcbn07XG52YXIgZGF0ZVRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbG9uZzogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIG1lZGl1bTogJ3t7ZGF0ZX19LCB7e3RpbWV9fScsXG4gIHNob3J0OiAne3tkYXRlfX0sIHt7dGltZX19J1xufTtcbnZhciBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSksXG4gIHRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KSxcbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSlcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtYXRMb25nOyIsICJ2YXIgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiAnUCdcbn07XG52YXIgZm9ybWF0UmVsYXRpdmUgPSBmdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZSh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtYXRSZWxhdGl2ZTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkaXJ0eUluZGV4LCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnRleHQgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6ICdzdGFuZGFsb25lJztcbiAgICB2YXIgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09ICdmb3JtYXR0aW5nJyAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIHZhciBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICB2YXIgd2lkdGggPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2RlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgdmFyIF93aWR0aCA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbX3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tfZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKGRpcnR5SW5kZXgpIDogZGlydHlJbmRleDtcbiAgICAvLyBAdHMtaWdub3JlOiBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59IiwgImltcG9ydCBidWlsZExvY2FsaXplRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzXCI7XG52YXIgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnQicsICdBJ10sXG4gIGFiYnJldmlhdGVkOiBbJ0JDJywgJ0FEJ10sXG4gIHdpZGU6IFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXG59O1xudmFyIHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWycxJywgJzInLCAnMycsICc0J10sXG4gIGFiYnJldmlhdGVkOiBbJ1ExJywgJ1EyJywgJ1EzJywgJ1E0J10sXG4gIHdpZGU6IFsnMXN0IHF1YXJ0ZXInLCAnMm5kIHF1YXJ0ZXInLCAnM3JkIHF1YXJ0ZXInLCAnNHRoIHF1YXJ0ZXInXVxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxudmFyIG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgd2lkZTogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ11cbn07XG52YXIgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLFxuICBzaG9ydDogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICBhYmJyZXZpYXRlZDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgd2lkZTogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddXG59O1xudmFyIGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06ICdhJyxcbiAgICBwbTogJ3AnLFxuICAgIG1pZG5pZ2h0OiAnbWknLFxuICAgIG5vb246ICduJyxcbiAgICBtb3JuaW5nOiAnbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnZXZlbmluZycsXG4gICAgbmlnaHQ6ICduaWdodCdcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogJ0FNJyxcbiAgICBwbTogJ1BNJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ21vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnbmlnaHQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ2EubS4nLFxuICAgIHBtOiAncC5tLicsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgICBuaWdodDogJ25pZ2h0J1xuICB9XG59O1xudmFyIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiAnYScsXG4gICAgcG06ICdwJyxcbiAgICBtaWRuaWdodDogJ21pJyxcbiAgICBub29uOiAnbicsXG4gICAgbW9ybmluZzogJ2luIHRoZSBtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdpbiB0aGUgYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnaW4gdGhlIGV2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnYXQgbmlnaHQnXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06ICdBTScsXG4gICAgcG06ICdQTScsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdpbiB0aGUgbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnaW4gdGhlIGFmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2luIHRoZSBldmVuaW5nJyxcbiAgICBuaWdodDogJ2F0IG5pZ2h0J1xuICB9LFxuICB3aWRlOiB7XG4gICAgYW06ICdhLm0uJyxcbiAgICBwbTogJ3AubS4nLFxuICAgIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICAgIG5vb246ICdub29uJyxcbiAgICBtb3JuaW5nOiAnaW4gdGhlIG1vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2luIHRoZSBhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdpbiB0aGUgZXZlbmluZycsXG4gICAgbmlnaHQ6ICdhdCBuaWdodCdcbiAgfVxufTtcbnZhciBvcmRpbmFsTnVtYmVyID0gZnVuY3Rpb24gb3JkaW5hbE51bWJlcihkaXJ0eU51bWJlciwgX29wdGlvbnMpIHtcbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICB2YXIgcmVtMTAwID0gbnVtYmVyICUgMTAwO1xuICBpZiAocmVtMTAwID4gMjAgfHwgcmVtMTAwIDwgMTApIHtcbiAgICBzd2l0Y2ggKHJlbTEwMCAlIDEwKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnc3QnO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ25kJztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArICdyZCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXIgKyAndGgnO1xufTtcbnZhciBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcjogb3JkaW5hbE51bWJlcixcbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBhcmd1bWVudENhbGxiYWNrOiBmdW5jdGlvbiBhcmd1bWVudENhbGxiYWNrKHF1YXJ0ZXIpIHtcbiAgICAgIHJldHVybiBxdWFydGVyIC0gMTtcbiAgICB9XG4gIH0pLFxuICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6ICd3aWRlJ1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsaXplOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgIHZhciBtYXRjaFBhdHRlcm4gPSB3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdIHx8IGFyZ3MubWF0Y2hQYXR0ZXJuc1thcmdzLmRlZmF1bHRNYXRjaFdpZHRoXTtcbiAgICB2YXIgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpO1xuICAgIH0pIDogZmluZEtleShwYXJzZVBhdHRlcm5zLCBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKTtcbiAgICB9KTtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSkgOiBwYXJzZVJlc3VsdFswXTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufSIsICJpbXBvcnQgYnVpbGRNYXRjaEZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi9pbmRleC5qc1wiO1xuaW1wb3J0IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi9pbmRleC5qc1wiO1xudmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKSh0aHxzdHxuZHxyZCk/L2k7XG52YXIgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG52YXIgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihifGEpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihiXFwuP1xccz9jXFwuP3xiXFwuP1xccz9jXFwuP1xccz9lXFwuP3xhXFwuP1xccz9kXFwuP3xjXFwuP1xccz9lXFwuPykvaSxcbiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pXG59O1xudmFyIHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9eYi9pLCAvXihhfGMpL2ldXG59O1xudmFyIG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2lcbn07XG52YXIgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldXG59O1xudmFyIG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pXG59O1xudmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15qL2ksIC9eZi9pLCAvXm0vaSwgL15hL2ksIC9ebS9pLCAvXmovaSwgL15qL2ksIC9eYS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV0sXG4gIGFueTogWy9eamEvaSwgL15mL2ksIC9ebWFyL2ksIC9eYXAvaSwgL15tYXkvaSwgL15qdW4vaSwgL15qdWwvaSwgL15hdS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV1cbn07XG52YXIgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaVxufTtcbnZhciBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV1cbn07XG52YXIgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2lcbn07XG52YXIgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pXG4gIH1cbn07XG52YXIgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogZnVuY3Rpb24gdmFsdWVDYWxsYmFjayh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9KSxcbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55JyxcbiAgICB2YWx1ZUNhbGxiYWNrOiBmdW5jdGlvbiB2YWx1ZUNhbGxiYWNrKGluZGV4KSB7XG4gICAgICByZXR1cm4gaW5kZXggKyAxO1xuICAgIH1cbiAgfSksXG4gIG1vbnRoOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogJ2FueSdcbiAgfSksXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogJ2FueSdcbiAgfSksXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnYW55JyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IG1hdGNoOyIsICJpbXBvcnQgZm9ybWF0RGlzdGFuY2UgZnJvbSBcIi4vX2xpYi9mb3JtYXREaXN0YW5jZS9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdExvbmcgZnJvbSBcIi4vX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0UmVsYXRpdmUgZnJvbSBcIi4vX2xpYi9mb3JtYXRSZWxhdGl2ZS9pbmRleC5qc1wiO1xuaW1wb3J0IGxvY2FsaXplIGZyb20gXCIuL19saWIvbG9jYWxpemUvaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9fbGliL21hdGNoL2luZGV4LmpzXCI7XG4vKipcbiAqIEB0eXBlIHtMb2NhbGV9XG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycH1cbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zc31cbiAqL1xudmFyIGxvY2FsZSA9IHtcbiAgY29kZTogJ2VuLVVTJyxcbiAgZm9ybWF0RGlzdGFuY2U6IGZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBmb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBsb2NhbGl6ZSxcbiAgbWF0Y2g6IG1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwIC8qIFN1bmRheSAqLyxcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDFcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTsiLCAiaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSBcIi4uLy4uL2xvY2FsZS9lbi1VUy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdExvY2FsZTsiLCAiaW1wb3J0IGlzVmFsaWQgZnJvbSBcIi4uL2lzVmFsaWQvaW5kZXguanNcIjtcbmltcG9ydCBzdWJNaWxsaXNlY29uZHMgZnJvbSBcIi4uL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0dGVycyBmcm9tIFwiLi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IGxvbmdGb3JtYXR0ZXJzIGZyb20gXCIuLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgZnJvbSBcIi4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbiwgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLCB0aHJvd1Byb3RlY3RlZEVycm9yIH0gZnJvbSBcIi4uL19saWIvcHJvdGVjdGVkVG9rZW5zL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4uL19saWIvZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gXCIuLi9fbGliL2RlZmF1bHRMb2NhbGUvaW5kZXguanNcIjsgLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG52YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxudmFyIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG52YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xudmFyIGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG52YXIgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBGb3JtYXQgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiA+IFx1MjZBMFx1RkUwRiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICogKHNlZSB0aGUgbGFzdCBleGFtcGxlKVxuICpcbiAqIEZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA3IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogQWNjZXB0ZWQgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAwdGgsIDE3dGggICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDIwMTd0aCAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IFIgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUiAgICAgIHwgLTQzLCAwMCwgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1LDcgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgdSAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNyAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhLi5hYSAgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhICAgICB8IGFtLCBwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgfCBhLm0uLCBwLm0uICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhYSAgIHwgYSwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgIHwgYi4uYmIgICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYiAgICAgfCBhbSwgcG0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3LyBaKSAgICAgICAgfCBYICAgICAgIHwgLTA4LCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFggICAgICB8IC0wODAwLCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWCAgICAgfCAtMDg6MDAsICswNTozMCwgWiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYICAgIHwgLTA4MDAsICswNTMwLCBaLCArMTIzNDU2ICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWFggICB8IC0wODowMCwgKzA1OjMwLCBaLCArMTI6MzQ6NTYgICAgICB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgICB8IHggICAgICAgfCAtMDgsICswNTMwLCArMDAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eCAgICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4ICAgICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHggICAgfCAtMDgwMCwgKzA1MzAsICswMDAwLCArMTIzNDU2ICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4eCAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCwgKzEyOjM0OjU2IHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgIHwgTy4uLk9PTyB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyICAgICB8XG4gKiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSAgfCB6Li4uenp6IHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgNiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgenp6eiAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIsNiAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgIHwgVCAgICAgICB8IDUxMjk2OTUyMDkwMCAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCBQICAgICAgIHwgMDQvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFAgICAgICB8IEFwciAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUCAgICAgfCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQICAgIHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHAgICAgIHwgMTI6MDA6MDAgQU0gR01UKzIgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwcCAgICB8IDEyOjAwOjAwIEFNIEdNVCswMjowMCAgICAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8IFBwICAgICAgfCAwNC8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUHBwICAgIHwgQXByIDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQcHBwICB8IEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFBwcHBwfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgfCAyLDcgICB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyOlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGUgKGUuZy4gYEVFRUVFRUVFRUVFYClcbiAqICAgIHRoZSBvdXRwdXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBkZWZhdWx0IHBhdHRlcm4gZm9yIHRoaXMgdW5pdCwgdXN1YWxseVxuICogICAgdGhlIGxvbmdlc3Qgb25lIChpbiBjYXNlIG9mIElTTyB3ZWVrZGF5cywgYEVFRUVgKS4gRGVmYXVsdCBwYXR0ZXJucyBmb3IgdW5pdHNcbiAqICAgIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NJykgLy89PiAnTm92J2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTScpIC8vPT4gJ04nYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAzLiBTb21lIHBhdHRlcm5zIGNvdWxkIGJlIHVubGltaXRlZCBsZW5ndGggKHN1Y2ggYXMgYHl5eXl5eXl5YCkuXG4gKiAgICBUaGUgb3V0cHV0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgcGF0dGVybi5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ3l5eXl5eXl5JykgLy89PiAnMDAwMDIwMTcnYFxuICpcbiAqIDQuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDUuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gKiAgICB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQ6XG4gKlxuICogICAgfCBZZWFyIHwgYHl5YCB8IGB1dWAgfFxuICogICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfFxuICogICAgfCAxICAgIHwgICAwMSB8ICAgMDEgfFxuICogICAgfCAxNCAgIHwgICAxNCB8ICAgMTQgfFxuICogICAgfCAzNzYgIHwgICA3NiB8ICAzNzYgfFxuICogICAgfCAxNDUzIHwgICA1MyB8IDE0NTMgfFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW2dldElTT1dlZWtZZWFyXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldElTT1dlZWtZZWFyfVxuICogICAgYW5kIFtnZXRXZWVrWWVhcl17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRXZWVrWWVhcn0pLlxuICpcbiAqIDYuIFNwZWNpZmljIG5vbi1sb2NhdGlvbiB0aW1lem9uZXMgYXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBpbiBgZGF0ZS1mbnNgLFxuICogICAgc28gcmlnaHQgbm93IHRoZXNlIHRva2VucyBmYWxsIGJhY2sgdG8gR01UIHRpbWV6b25lcy5cbiAqXG4gKiA3LiBUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGluIHRoZSBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiAgICAtIGBpYDogSVNPIGRheSBvZiB3ZWVrXG4gKiAgICAtIGBJYDogSVNPIHdlZWsgb2YgeWVhclxuICogICAgLSBgUmA6IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiAgICAtIGB0YDogc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYFRgOiBtaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBvYDogb3JkaW5hbCBudW1iZXIgbW9kaWZpZXJcbiAqICAgIC0gYFBgOiBsb25nIGxvY2FsaXplZCBkYXRlXG4gKiAgICAtIGBwYDogbG9uZyBsb2NhbGl6ZWQgdGltZVxuICpcbiAqIDguIGBZWWAgYW5kIGBZWVlZYCB0b2tlbnMgcmVwcmVzZW50IHdlZWstbnVtYmVyaW5nIHllYXJzIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIHllYXJzLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgLSB0aGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM9ZmFsc2VdIC0gaWYgdHJ1ZSwgYWxsb3dzIHVzYWdlIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyIHRva2VucyBgWVlgIGFuZCBgWVlZWWA7XG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zPWZhbHNlXSAtIGlmIHRydWUsIGFsbG93cyB1c2FnZSBvZiB0aGUgZGF5IG9mIHllYXIgdG9rZW5zIGBEYCBhbmQgYEREYDtcbiAqICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoZGlydHlEYXRlLCBkaXJ0eUZvcm1hdFN0ciwgb3B0aW9ucykge1xuICB2YXIgX3JlZiwgX29wdGlvbnMkbG9jYWxlLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfb3B0aW9ucyRmaXJzdFdlZWtDb24sIF9vcHRpb25zJGxvY2FsZTIsIF9vcHRpb25zJGxvY2FsZTIkb3B0aSwgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyLCBfcmVmNSwgX3JlZjYsIF9yZWY3LCBfb3B0aW9ucyR3ZWVrU3RhcnRzT24sIF9vcHRpb25zJGxvY2FsZTMsIF9vcHRpb25zJGxvY2FsZTMkb3B0aSwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMywgX2RlZmF1bHRPcHRpb25zJGxvY2FsNDtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBmb3JtYXRTdHIgPSBTdHJpbmcoZGlydHlGb3JtYXRTdHIpO1xuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICB2YXIgbG9jYWxlID0gKF9yZWYgPSAoX29wdGlvbnMkbG9jYWxlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2FsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkbG9jYWxlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRsb2NhbGUgOiBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBkZWZhdWx0TG9jYWxlO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gdG9JbnRlZ2VyKChfcmVmMiA9IChfcmVmMyA9IChfcmVmNCA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTIgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTIkb3B0aSA9IF9vcHRpb25zJGxvY2FsZTIub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMiRvcHRpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUyJG9wdGkuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmNCAhPT0gdm9pZCAwID8gX3JlZjQgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYzICE9PSB2b2lkIDAgPyBfcmVmMyA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IDEpO1xuXG4gIC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG4gIGlmICghKGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA+PSAxICYmIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA8PSA3KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdmaXJzdFdlZWtDb250YWluc0RhdGUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDcgaW5jbHVzaXZlbHknKTtcbiAgfVxuICB2YXIgd2Vla1N0YXJ0c09uID0gdG9JbnRlZ2VyKChfcmVmNSA9IChfcmVmNiA9IChfcmVmNyA9IChfb3B0aW9ucyR3ZWVrU3RhcnRzT24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gIT09IHZvaWQgMCA/IF9vcHRpb25zJHdlZWtTdGFydHNPbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTMgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTMkb3B0aSA9IF9vcHRpb25zJGxvY2FsZTMub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMyRvcHRpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUzJG9wdGkud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmNyAhPT0gdm9pZCAwID8gX3JlZjcgOiBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWY2ICE9PSB2b2lkIDAgPyBfcmVmNiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwzID0gZGVmYXVsdE9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwzID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2RlZmF1bHRPcHRpb25zJGxvY2FsNCA9IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDMub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsNC53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWY1ICE9PSB2b2lkIDAgPyBfcmVmNSA6IDApO1xuXG4gIC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuICBpZiAoIWxvY2FsZS5sb2NhbGl6ZSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsb2NhbGUgbXVzdCBjb250YWluIGxvY2FsaXplIHByb3BlcnR5Jyk7XG4gIH1cbiAgaWYgKCFsb2NhbGUuZm9ybWF0TG9uZykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsb2NhbGUgbXVzdCBjb250YWluIGZvcm1hdExvbmcgcHJvcGVydHknKTtcbiAgfVxuICB2YXIgb3JpZ2luYWxEYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGlmICghaXNWYWxpZChvcmlnaW5hbERhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICB9XG5cbiAgLy8gQ29udmVydCB0aGUgZGF0ZSBpbiBzeXN0ZW0gdGltZXpvbmUgdG8gdGhlIHNhbWUgZGF0ZSBpbiBVVEMrMDA6MDAgdGltZXpvbmUuXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gVVRDIGZ1bmN0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkLCBsb2NhbGVzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIHRoZW0uXG4gIC8vIFNlZSBhbiBpc3N1ZSBhYm91dCBVVEMgZnVuY3Rpb25zOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuICB2YXIgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSk7XG4gIHZhciB1dGNEYXRlID0gc3ViTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSwgdGltZXpvbmVPZmZzZXQpO1xuICB2YXIgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT246IHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBfb3JpZ2luYWxEYXRlOiBvcmlnaW5hbERhdGVcbiAgfTtcbiAgdmFyIHJlc3VsdCA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKGZ1bmN0aW9uIChzdWJzdHJpbmcpIHtcbiAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAncCcgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICdQJykge1xuICAgICAgdmFyIGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0cmluZztcbiAgfSkuam9pbignJykubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKGZ1bmN0aW9uIChzdWJzdHJpbmcpIHtcbiAgICAvLyBSZXBsYWNlIHR3byBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyB3aXRoIG9uZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyXG4gICAgaWYgKHN1YnN0cmluZyA9PT0gXCInJ1wiKSB7XG4gICAgICByZXR1cm4gXCInXCI7XG4gICAgfVxuICAgIHZhciBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICByZXR1cm4gY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZyk7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICBpZiAoIShvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucykgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHN1YnN0cmluZykpIHtcbiAgICAgICAgdGhyb3dQcm90ZWN0ZWRFcnJvcihzdWJzdHJpbmcsIGRpcnR5Rm9ybWF0U3RyLCBTdHJpbmcoZGlydHlEYXRlKSk7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMpICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIFN0cmluZyhkaXJ0eURhdGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXR0ZXIodXRjRGF0ZSwgc3Vic3RyaW5nLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAnICsgZmlyc3RDaGFyYWN0ZXIgKyAnYCcpO1xuICAgIH1cbiAgICByZXR1cm4gc3Vic3RyaW5nO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICB2YXIgbWF0Y2hlZCA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApO1xuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufSIsICJleHBvcnQgY29uc3QgcG9pbnRzTm90ZU1hanVyaXR5ID0gMTAwO1xyXG5leHBvcnQgY29uc3QgcG9pbnRzTWFqdXJpdHkgPSAxMDtcclxuZXhwb3J0IGNvbnN0IHBvaW50c0ZvckRhaWx5Q2hhbGxlbmdlID0gNTAwO1xyXG5leHBvcnQgY29uc3QgcG9pbnRzRm9yV2Vla2x5Q2hhbGxlbmdlID0gMjAwMDtcclxuZXhwb3J0IGNvbnN0IHN0cmVha2Jvb3N0ZXJEZWNyZWFzZSA9IDAuMjtcclxuZXhwb3J0IGNvbnN0IHN0cmVha2Jvb3N0ZXJJbmNyZWFzZURhaWx5ID0gMC4xO1xyXG5leHBvcnQgY29uc3Qgc3RyZWFrYm9vc3RlckluY3JlYXNlV2Vla2x5ID0gMTtcclxuZXhwb3J0IGNvbnN0IGF2YXRhckluaXRDb250ZW50ID0gIGAjIEF2YXRhclxyXG5cclxufCAgICAgICAgfCAgICAgfFxyXG58IC0tLS0tLSB8IC0tLSB8XHJcbnwgTGV2ZWwgIHwgMCAgICB8XHJcbnwgUG9pbnRzIHwgMCAgICB8XHJcbl5sZXZlbEFuZFBvaW50c1x0XHJcblxcYFxcYFxcYGNoYXJ0XHJcbnR5cGU6IGJhclxyXG5sYWJlbHM6IFtFeHByaXJpZW5jZV1cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IHBvaW50cyByZWFjaGVkXHJcbiAgICBkYXRhOiBbMF1cclxuICAtIHRpdGxlOiBwb2ludHMgdG8gZWFybiB0byBsZXZlbCB1cFxyXG4gICAgZGF0YTogWzEwMDBdXHJcbnhNaW46IDBcclxueE1heDogMTAwMFxyXG50ZW5zaW9uOiAwLjJcclxud2lkdGg6IDQwJVxyXG5sYWJlbENvbG9yczogZmFsc2VcclxuZmlsbDogZmFsc2VcclxuYmVnaW5BdFplcm86IGZhbHNlXHJcbmJlc3RGaXQ6IGZhbHNlXHJcbmJlc3RGaXRUaXRsZTogdW5kZWZpbmVkXHJcbmJlc3RGaXROdW1iZXI6IDBcclxuc3RhY2tlZDogdHJ1ZVxyXG5pbmRleEF4aXM6IHlcclxueFRpdGxlOiBcInByb2dyZXNzXCJcclxubGVnZW5kOiBmYWxzZVxyXG5cXGBcXGBcXGBcclxuXHJcbnwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxyXG58IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tIHxcclxufCAqKmJvb3N0ZXIgZmFjdG9yKiogfCAqKjAqKiB8XHJcbl5ib29zdGVyRmFjdG9yXHJcblxyXG58ICAgICAgICAgICAgIHwgICAgIHwgICAgICAgfFxyXG58IC0tLS0tLS0tLS0tIHwgLS0tIHwgLS0tLS0gfFxyXG58ICoqZGFpbHkgTm90ZXMqKiB8ICo1MDBFUCogfCAqKjAvMioqIHxcclxuXmRhaWx5Tm90ZXNDaGFsbGVuZ2VcclxuXHJcbnwgIHwgICAgIHx8XHJcbnwgLS0tLSB8IC0tLSB8IC0tLSB8XHJcbnwgKip3ZWVrbHkgTm90ZXMqKiB8ICoyMDAwRVAqICAgICB8ICAqKjAvNyoqICAgfFxyXG5ed2Vla2x5Tm90ZXNDaGFsbGVuZ2VcclxuXHJcblxcYFxcYFxcYGNoYXJ0XHJcbnR5cGU6IGJhclxyXG5sYWJlbHM6IFtOb3Rlc11cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IGRheXMgZG9uZSBpbiBhIHJvd1xyXG4gICAgZGF0YTogWzBdXHJcbiAgLSB0aXRsZTogZGF5cyB0byBkbyBpbiBhIHJvd1xyXG4gICAgZGF0YTogWzddXHJcbnhNaW46IDBcclxueE1heDogN1xyXG50ZW5zaW9uOiAwLjJcclxud2lkdGg6IDQwJVxyXG5sYWJlbENvbG9yczogZmFsc2VcclxuZmlsbDogZmFsc2VcclxuYmVnaW5BdFplcm86IGZhbHNlXHJcbmJlc3RGaXQ6IGZhbHNlXHJcbmJlc3RGaXRUaXRsZTogdW5kZWZpbmVkXHJcbmJlc3RGaXROdW1iZXI6IDBcclxuc3RhY2tlZDogdHJ1ZVxyXG5pbmRleEF4aXM6IHlcclxueFRpdGxlOiBcImRheXNcIlxyXG5sZWdlbmQ6IGZhbHNlXHJcblxcYFxcYFxcYFxyXG5cclxufCBMZXZlbCB8IENvdW50IHxcclxufCA6LS0tOiB8IDotLS06IHxcclxufCBNYWp1cml0eSA1IHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbNSwgJzUnLCAnNVx1MjdBMVx1RkUwRicsICc1XHUyQjA3XHVGRTBGJywgJzVcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSA0IHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbNCwgJzQnLCAnNFx1MjdBMVx1RkUwRicsICc0XHUyQjA3XHVGRTBGJywgJzRcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAzIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMywgJzMnLCAnM1x1MjdBMVx1RkUwRicsICczXHUyQjA3XHVGRTBGJywgJzNcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAyIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMiwgJzInLCAnMlx1MjdBMVx1RkUwRicsICcyXHUyQjA3XHVGRTBGJywgJzJcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAxIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMSwgJzEnLCAnMVx1MjdBMVx1RkUwRicsICcxXHUyQjA3XHVGRTBGJywgJzFcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAwIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMCwgJzAnLCAnMFx1MjdBMVx1RkUwRicsICcwXHUyQjA3XHVGRTBGJywgJzBcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxuXHJcblxyXG5cXGBcXGBcXGBjaGFydFxyXG50eXBlOiBiYXJcclxubGFiZWxzOiBbMCwgMCwgMF1cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IG1vZGlmaWVkXHJcbiAgICBkYXRhOiBbMCwgMCwgMF1cclxudGVuc2lvbjogMC4yXHJcbndpZHRoOiA4MCAlXHJcbmxhYmVsQ29sb3JzOiBmYWxzZVxyXG5maWxsOiBmYWxzZVxyXG5iZWdpbkF0WmVybzogZmFsc2VcclxuYmVzdEZpdDogZmFsc2VcclxuYmVzdEZpdFRpdGxlOiB1bmRlZmluZWRcclxuYmVzdEZpdE51bWJlcjogMFxyXG5zdGFja2VkOiB0cnVlXHJcbnlUaXRsZTogXCJOdW1iZXIgb2YgTm90ZXNcIlxyXG54VGl0bGU6IFwiTW9udGhzXCJcclxueE1pbjogMFxyXG5cXGBcXGBcXGBcclxuXkNoYXJ0TW9udGhcclxuXHJcblxyXG4jIyMgQmFkZ2VzXHJcbiMjIyMgYWNoaWV2ZWRcclxuXHJcblxyXG4jIyMjIG91dHN0YW5kaW5nXHJcbmxldmVsIDU6ICpFbmxpZ2h0ZW5lZCBOb3ZpY2UqXHJcbmxldmVsIDEwOiAqQ3VyaW91cyBDb25ub2lzc2V1cipcclxubGV2ZWwgMjA6ICpCcmFpbmlhYyBUcmFpbGJsYXplcipcclxubGV2ZWwgMjc6ICpTY2hvbGFybHkgVHJhaWxibGF6ZXIqXHJcbmxldmVsIDM1OiAqSW5mbyBOaW5qYSBNYXN0ZXIqXHJcbmxldmVsIDQyOiAqV2lzZSBPd2wgR3VydSpcclxubGV2ZWwgNTA6ICpFaW5zdGVpbiBJbmNhcm5hdGUqXHJcbmxldmVsIDYwOiAqTWFzdGVybWluZCBTYWdlKlxyXG5sZXZlbCA3NTogKkNlcmVicmFsIE1hZXN0cm8qXHJcbmxldmVsIDgyOiAqWmVuIEtub3dsZWRnZSBLZWVwZXIqXHJcbmxldmVsIDkwOiAqR3JhbmQgQXJjaGl2aXN0IE92ZXJsb3JkKlxyXG5sZXZlbCAxMDA6ICpPbW5pc2NpZW50IFNhZ2Ugb2YgRXZlcnl0aGluZypcclxuXHJcblxyXG5cclxuIyMjICoqbm90ZS1tYXR1cml0eSA9IDUqKlxyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gNSBvciBub3RlLW1hdHVyaXR5ID0gXCI1XCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiNVx1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjVcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCI1XHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcblxyXG4jIyMgKipub3RlLW1hdHVyaXR5ID0gNCoqXHJcblxcYFxcYFxcYGRhdGF2aWV3XHJcbkxpc3QgTm90ZU1hdHVyaXR5Q291bnRcclxuZnJvbSBcIlwiXHJcbldoZXJlIG5vdGUtbWF0dXJpdHkgPSA0IG9yIG5vdGUtbWF0dXJpdHkgPSBcIjRcIiBvciBub3RlLW1hdHVyaXR5ID0gXCI0XHUyN0ExXHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiNFx1MkIwNlx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjRcdTJCMDdcdUZFMEZcIlxyXG5cXGBcXGBcXGBcclxuXHJcbiMjIyBub3RlLW1hdHVyaXR5ID0gM1xyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gMyBvciBub3RlLW1hdHVyaXR5ID0gXCIzXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiM1x1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjNcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIzXHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcblxyXG4jIyMgbm90ZS1tYXR1cml0eSA9IDJcclxuXFxgXFxgXFxgZGF0YXZpZXdcclxuTGlzdCBOb3RlTWF0dXJpdHlDb3VudFxyXG5mcm9tIFwiXCJcclxuV2hlcmUgbm90ZS1tYXR1cml0eSA9IDIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjJcdTI3QTFcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIyXHUyQjA2XHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMlx1MkIwN1x1RkUwRlwiXHJcblxcYFxcYFxcYFxyXG5cclxuIyMjIG5vdGUtbWF0dXJpdHkgPSAxXHJcblxcYFxcYFxcYGRhdGF2aWV3XHJcbkxpc3QgTm90ZU1hdHVyaXR5Q291bnRcclxuZnJvbSBcIlwiXHJcbldoZXJlIG5vdGUtbWF0dXJpdHkgPSAxIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjFcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIxXHUyN0ExXHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMVx1MkIwNlx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjFcdTJCMDdcdUZFMEZcIlxyXG5cXGBcXGBcXGBcclxuXHJcbiMjIyBub3RlLW1hdHVyaXR5ID0gMFxyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gMCBvciBub3RlLW1hdHVyaXR5ID0gXCIwXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMFx1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjBcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIwXHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcbmA7XHJcbmV4cG9ydCBjb25zdCBpbmNyZWRpbWVudHMgPSBbXHJcbiAgJ05leHVzIE5vZGUnLFxyXG4gICdDb25uZWN0aW9uIENyeXN0YWwnLFxyXG4gICdNYXN0ZXJ5IFNjcm9sbCcsXHJcbiAgJ0luc2lnaHQgUHJpc20nLFxyXG4gICdSZWZsZWN0aXZlIEVzc2VuY2UnLFxyXG4gICdBbXBsaWZpY2F0aW9uIENyeXN0YWwnLFxyXG4gICdDcmVhdGl2ZSBDYXRhbHlzdCcsXHJcbiAgJ1ByZWNpc2lvbiBMZW5zJ1xyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGluY3JlZGltZW50c0RhdGFOYW1lID0gW1xyXG4gICduZXh1c05vZGUnLFxyXG4gICdjb25uZWN0aW9uQ3J5c3RhbCcsXHJcbiAgJ21hc3RlcnlTY3JvbGwnLFxyXG4gICdpbnNpZ2h0UHJpc20nLFxyXG4gICdyZWZsZWN0aXZlRXNzZW5jZScsXHJcbiAgJ2FtcGxpZmljYXRpb25DcnlzdGFsJyxcclxuICAnY3JlYXRpdmVDYXRhbHlzdCcsXHJcbiAgJ3ByZWNpc2lvbkxlbnMnXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgY3JhZnRpbmdJdGVtcyA9IFtcclxuICB7IG5hbWU6ICdUZW1wb3JhbCBUd2Vha2VyJywgaW5jcmVkaWVudHM6IFsnMnhTMScsICcxeFM2J10gfSxcclxuICB7IG5hbWU6ICdQZXJwZXR1YWwgUHJvZ3Jlc3MnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzQnXSB9LFxyXG4gIHsgbmFtZTogJ1N0cmF0ZWdpYyBTeW5hcHNlcycsIGluY3JlZGllbnRzOiBbJzN4UzEnLCAnMnhTMiddIH0sXHJcbiAgeyBuYW1lOiAnQWNjZWxlcmF0ZWQgQWNxdWlzaXRpb24nLCBpbmNyZWRpZW50czogWycxeFMzJywgJzJ4UzQnXSB9LFxyXG4gIHsgbmFtZTogJ0xpbmtlcnMgTG9kZScsIGluY3JlZGllbnRzOiBbJzN4UzInLCAnMXhTMSddIH0sXHJcbiAgeyBuYW1lOiAnRWZmb3J0bGVzcyBFeHBhbnNpb24nLCBpbmNyZWRpZW50czogWycyeFMzJywgJzF4UzYnXSB9LFxyXG4gIHsgbmFtZTogJ1JlY3Vyc2l2ZSBSZWZsZWN0aW9uJywgaW5jcmVkaWVudHM6IFsnMnhTNCcsICcxeFM1J10gfSxcclxuICB7IG5hbWU6ICdTeW5hcHRpYyBTdXJnZScsIGluY3JlZGllbnRzOiBbJzJ4UzInLCAnMXhTMSddIH0sXHJcbiAgeyBuYW1lOiAnSW5zcGlyYXRpb24gSW5mdXNpb24nLCBpbmNyZWRpZW50czogWycyeFM3JywgJzF4UzEnXSB9LFxyXG4gIHsgbmFtZTogJ1RpdGxlIFRpdGFuJywgaW5jcmVkaWVudHM6IFsnMnhTOCcsICcxeFM3J10gfSxcclxuICB7IG5hbWU6ICdQcmVjaXNpb24gUHJpc20nLCBpbmNyZWRpZW50czogWycyeFM4JywgJzF4UzInXSB9LFxyXG4gIHsgbmFtZTogJ0h5cGVybGluayBIYXJtb255JywgaW5jcmVkaWVudHM6IFsnMnhTMicsICcxeFM2J10gfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBsaXN0T2ZVc2VhYmxlQm9vc3RlcnNUb0JlU2hvd24gPSBbJ1BlcnBldHVhbCBQcm9ncmVzcycsICdUaXRsZSBUaXRhbicsICdQcmVjaXNpb24gUHJpc20nXVxyXG5leHBvcnQgY29uc3QgbGlzdE9mVXNlYWJsZUluZ3JlZGllbnRzVG9CZVNob3duID0gWydDb25uZWN0aW9uIENyeXN0YWwnLCAnSW5zaWdodCBQcmlzbScsICdDcmVhdGl2ZSBDYXRhbHlzdCcsICdQcmVjaXNpb24gTGVucyddXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xyXG4gIHsgc2hvcnROYW1lOiAnUzInLCBuYW1lOiAnQ29ubmVjdGlvbiBDcnlzdGFsJywgdmFyTmFtZTogJ2Nvbm5lY3Rpb25DcnlzdGFsJyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzQnLCBuYW1lOiAnSW5zaWdodCBQcmlzbScsIHZhck5hbWU6ICdpbnNpZ2h0UHJpc20nIH0sXHJcbiAgeyBzaG9ydE5hbWU6ICdTNycsIG5hbWU6ICdDcmVhdGl2ZSBDYXRhbHlzdCcsIHZhck5hbWU6ICdjcmVhdGl2ZUNhdGFseXN0JyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzgnLCBuYW1lOiAnUHJlY2lzaW9uIExlbnMnLCB2YXJOYW1lOiAncHJlY2lzaW9uTGVucycgfSxcclxuICB7IHNob3J0TmFtZTogJ1MxJywgbmFtZTogJ05leHVzIE5vZGUnLCB2YXJOYW1lOiAnbmV4dXNOb2RlJyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzMnLCBuYW1lOiAnTWFzdGVyeSBTY3JvbGwnLCB2YXJOYW1lOiAnbWFzdGVyeVNjcm9sbCcgfSxcclxuICB7IHNob3J0TmFtZTogJ1M1JywgbmFtZTogJ1JlZmxlY3RpdmUgRXNzZW5jZScsIHZhck5hbWU6ICdyZWZsZWN0aXZlRXNzZW5jZScgfSxcclxuICB7IHNob3J0TmFtZTogJ1M2JywgbmFtZTogJ0FtcGxpZmljYXRpb24gQ3J5c3RhbCcsIHZhck5hbWU6ICdhbXBsaWZpY2F0aW9uQ3J5c3RhbCcgfVxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3N0ZXJSZWNpcGVzID0gW1xyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDAsIGJvb3N0ZXJDb29sZG93bjogMCwgYm9vc3RlckRhdGU6ICcnLCBib29zdGVyU3dpdGNoOiAnJywgdmFybmFtZTogJ3RlbXBvcmFsVHdlYWtlcicgLG5hbWU6ICdUZW1wb3JhbCBUd2Vha2VyJywgaW5jcmVkaWVudHM6IFsnMnhTMScsICcxeFM2J10sIGRlc2NyaXB0aW9uOiAnVGVtcG9yYWwgVHdlYWtlcjogcmVzZXQgdGhlIGNvb2xkb3duIHBoYXNlIGZvciBhIGJvb3N0ZXIgeW91ciBjaG9pY2UnIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogNCo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVBlcnBldHVhbFByb2dyZXNzJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JQZXJwZXR1YWxQcm9ncmVzcycsIHZhcm5hbWU6ICdwZXJwZXR1YWxQcm9ncmVzcycgLG5hbWU6ICdQZXJwZXR1YWwgUHJvZ3Jlc3MnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzQnXSwgZGVzY3JpcHRpb246ICdQZXJwZXR1YWwgUHJvZ3Jlc3M6IGdldCAzIHRpbWVzIHBvaW50cyBhbiBhbGwgeW91ciBhY3Rpb25zIGZvciB0aGUgbmV4dCA0IGhvdXJzLiBZb3UgY2FuIHVzZSBQZXJwZXR1YWwgUHJvZ3Jlc3MgZXZlcnkgdGhyZWUgZGF5cywgaWYgeW91IGhhdmUgdGhlIGluZ3JlZGllbnRzIHRvIGNyYWZ0IGl0LicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiA0KjYwLCBib29zdGVyQ29vbGRvd246IDEyMCo2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVN0cmF0ZWdpY1N5bmFwc2VzJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcycsIHZhcm5hbWU6ICdzdHJhdGVnaWNTeW5hcHNlcycgLG5hbWU6ICdTdHJhdGVnaWMgU3luYXBzZXMnLCBpbmNyZWRpZW50czogWyczeFMxJywgJzJ4UzInXSwgZGVzY3JpcHRpb246ICdTdHJhdGVnaWMgU3luYXBzZXM6IGdhaW4gMyB0aW1lcyBFUCBmb3IgYWxsIGFjdGlvbnMgb24gTWFwIE9mIENvbnRlbnQgcmF0aW5ncyBmb3IgdGhlIG5leHQgNCBob3Vycy4gVGhpcyBib29zdGVyIGhhcyBhIGNvb2xkb3duIHRpbWUgb2YgNSBkYXlzLicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiAwLCBib29zdGVyQ29vbGRvd246IDM2KjYwLCBib29zdGVyRGF0ZTogJycsIGJvb3N0ZXJTd2l0Y2g6ICcnLCB2YXJuYW1lOiAnYWNjZWxlcmF0ZWRBY3F1aXNpdGlvbicgLG5hbWU6ICdBY2NlbGVyYXRlZCBBY3F1aXNpdGlvbicsIGluY3JlZGllbnRzOiBbJzF4UzMnLCAnMnhTNCddLCBkZXNjcmlwdGlvbjogJ0FjY2VsZXJhdGVkIEFjcXVpc2l0aW9uOiBVc2UgQWNjZWxlcmF0ZWQgQWNxdWlzaXRpb24gYW5kIGNvbGxlY3QgbXVjaCBmYXN0ZXIgZm9yIHRoZSBuZXh0IDEyIGhvdXJzIGFsbCBzb3J0cyBvZiBpbmdyZWRpZW50cyB3aGVuIGNyZWF0aW5nIGFuZCBpbXByb3Zpbmcgbm90ZXMnIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMyo2MCwgYm9vc3RlckNvb2xkb3duOiA0OCo2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZUxpbmtlcnNMb2RlJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZScsIHZhcm5hbWU6ICdsaW5rZXJzTG9kZScgLG5hbWU6ICdMaW5rZXJzIExvZGUnLCBpbmNyZWRpZW50czogWyczeFMyJywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdMaW5rZXJzIExvZGU6IGNvbGxlY3QgZXh0cmEgcG9pbnRzIHdoZW4gY3JlYXRpbmcgY2hhaW4gb2YgdGhvdWdodHMgZm9yIHRoZSBuZXh0IDMgaG91cnMuIChjb29sZG93biAyIGRheXMpJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDAsIGJvb3N0ZXJDb29sZG93bjogNDgwKjYwLCBib29zdGVyRGF0ZTogJycsIGJvb3N0ZXJTd2l0Y2g6ICcnLCB2YXJuYW1lOiAnZWZmb3J0bGVzc0V4cGFuc2lvbicgLG5hbWU6ICdFZmZvcnRsZXNzIEV4cGFuc2lvbicsIGluY3JlZGllbnRzOiBbJzJ4UzMnLCAnMXhTNiddLCBkZXNjcmlwdGlvbjogJ0VmZm9ydGxlc3MgRXhwYW5zaW9uOiBDYXN0IFwiRWZmb3J0bGVzcyBFeHBhbnNpb25cIiBhbmQgbG93ZXIgdGhlIGNhcCB0byB0aGUgbmV4dCBsZXZlbCBhYm91dCAyMCUgaW4gdGhlIG5leHQgNSBkYXlzLiAoQ29vbGRvd24gMjAgZGF5cyknIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogNSo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVJlY3Vyc2l2ZVJlZmxlY3Rpb24nLCBib29zdGVyU3dpdGNoOiAnYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24nLCB2YXJuYW1lOiAncmVjdXJzaXZlUmVmbGVjdGlvbicgLG5hbWU6ICdSZWN1cnNpdmUgUmVmbGVjdGlvbicsIGluY3JlZGllbnRzOiBbJzJ4UzQnLCAnMXhTNSddLCBkZXNjcmlwdGlvbjogJ1JlY3Vyc2l2ZSBSZWZsZWN0aW9uOiBJbXByb3ZlIHlvdXIgbm90ZXMgYW5kIGdldCA1IHRpbWVzIHRoZSBwb2ludHMgeW91IGdldCBvbiBub3JtYWwgY29uZGl0aW9uIGZvciB0aGUgbmV4dCA1IGhvdXJzLiBDb29sZG93biAzIGRheXMuJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDIqNjAsIGJvb3N0ZXJDb29sZG93bjogMzYqNjAsIGJvb3N0ZXJEYXRlOiAnYm9vc3RlckRhdGVTeW5hcHRpY1N1cmdlJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlJywgdmFybmFtZTogJ3N5bmFwdGljU3VyZ2UnICxuYW1lOiAnU3luYXB0aWMgU3VyZ2UnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdTeW5hcHRpYyBTdXJnZTogTGluayB5b3VyIGlkZWFzIHRvZ2V0aGVyLCBldmVyeSBpbmNyZWFzZSBpbiBcImxpbmtpbmcgbWF0dXJpdHlcIiBwYXlzIG91dCAyMCB0aW1lcyBmb3IgdGhlIG5leHQgMiBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMCwgYm9vc3RlckNvb2xkb3duOiA0OCo2MCwgYm9vc3RlckRhdGU6ICcnLCBib29zdGVyU3dpdGNoOiAnJywgdmFybmFtZTogJ2luc3BpcmF0aW9uSW5mdXNpb24nICxuYW1lOiAnSW5zcGlyYXRpb24gSW5mdXNpb24nLCBpbmNyZWRpZW50czogWycyeFM3JywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdJbnNwaXJhdGlvbiBJbmZ1c2lvbjogSW5jcmVhc2UgdGhlIGZyZXF1ZW5jeSB0byBnZXQgaGVscGZ1bCBwcm9tcHRzIHRvIHBvd2VyIHVwIHlvdSBwZXJzb25hbCBrbm93bGVkZ2UgbWFuYWdlbWVudCBmb3IgdGhlIG5leHQgMiBkYXlzLicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiAzKjYwLCBib29zdGVyQ29vbGRvd246IDM2KjYwLCBib29zdGVyRGF0ZTogJ2Jvb3N0ZXJEYXRlVGl0bGVUaXRhbicsIGJvb3N0ZXJTd2l0Y2g6ICdib29zdGVyRmFjdG9yVGl0bGVUaXRhbicsIHZhcm5hbWU6ICd0aXRsZVRpdGFuJyAsbmFtZTogJ1RpdGxlIFRpdGFuJywgaW5jcmVkaWVudHM6IFsnMnhTOCcsICcxeFM3J10sIGRlc2NyaXB0aW9uOiAnVGl0bGUgVGl0YW46IFF1YWRybyB5b3VyIHBvaW50cyB3aGVuIG1ha2luZyB5b3VyIG5vdGUgdGl0bGUgbW9yZSB0byB0aGUgcG9pbnQgZXhwcmVzc2luZyB0aGUgaWRlYSBvZiB5b3Ugbm90ZSBmb3IgdGhlIG5leHQgMyBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMyo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVByZWNpc2lvblByaXNtJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbScsIHZhcm5hbWU6ICdwcmVjaXNpb25QcmlzbScgLG5hbWU6ICdQcmVjaXNpb24gUHJpc20nLCBpbmNyZWRpZW50czogWycyeFM4JywgJzF4UzInXSwgZGVzY3JpcHRpb246ICdQcmVjaXNpb24gUHJpc206IDQgdGltZXMgdGhlIHBvaW50cyB3aGVuIGluY3JlYXNpbmcgdGhlIFwibm90ZSBsZW5ndGggbWFqdXJpdHlcIiBmb3IgYSBub3RlIHRoZSBuZXh0IDMgaG91cnMuJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDMqNjAsIGJvb3N0ZXJDb29sZG93bjogMzYqNjAsIGJvb3N0ZXJEYXRlOiAnYm9vc3RlckRhdGVIeXBlcmxpbmtIYXJtb255JywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255JywgdmFybmFtZTogJ2h5cGVybGlua0hhcm1vbnknICxuYW1lOiAnSHlwZXJsaW5rIEhhcm1vbnknLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzYnXSwgZGVzY3JpcHRpb246ICdIeXBlcmxpbmsgSGFybW9ueTogR2V0IGZvciBcIklubGluayBtYWp1cml0eVwiIEFORCBcIm91dGxpbmsgbWFqdXJpdHlcIiBpbXByb3ZlbWVudHMgNSB0aW1lcyB0aGUgcG9pbnQgdGhlIG5leHQgMyBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMio2MCwgYm9vc3RlckNvb2xkb3duOiAyMTYwKjYwLCBib29zdGVyRGF0ZTogJ2Jvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWEnLCBib29zdGVyU3dpdGNoOiAnYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhJywgdmFybmFtZTogJ2VwaGVtZXJhbEV1cGhvcmlhJyAsbmFtZTogJ0VwaGVtZXJhbCBFdXBob3JpYScsIGluY3JlZGllbnRzOiBbJzEwMDB4U1gnXSwgZGVzY3JpcHRpb246ICdVbmVhcnRoIHRoZSBoaWRkZW4gcG90ZW50aWFsIHdpdGhpbiB5b3VyIGtub3dsZWRnZSByZXBvc2l0b3J5IHdpdGggdGhlIEVwaGVtZXJhbCBFdXBob3JpYSBib29zdGVyLiBGb3IgYSBmbGVldGluZyB0d28taG91ciB3aW5kb3csIHlvdXIgbm90ZXMgd2lsbCByZXNvbmF0ZSB3aXRoIGFuIGV4dHJhb3JkaW5hcnkgdml0YWxpdHksIGFsbG93aW5nIHlvdSB0byBlYXJuIHBvaW50cyBhdCBhbiBhc3RvbmlzaGluZyByYXRlLiBTZWl6ZSB0aGlzIG1vbWVudCBvZiBib3VuZGxlc3Mgb3Bwb3J0dW5pdHkgYW5kIHdhdGNoIHlvdXIga25vd2xlZGdlIGZsb3VyaXNoIGxpa2UgbmV2ZXIgYmVmb3JlIScgfSxcclxuXTtcclxuXHJcbiIsICJpbXBvcnQgeyBURmlsZSwgQXBwLCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb24oY2hhckNvdW50VG90YWw6IG51bWJlciwgbGF5ZXIyY291bnQ6IG51bWJlciwgbGF5ZXIzY291bnQ6IG51bWJlcik6IG51bWJlciB7XHJcblx0Y29uc3QgcGVyY2VudExheWVyMiA9IGxheWVyMmNvdW50ICogMTAwIC8gY2hhckNvdW50VG90YWw7XHJcbiAgICBjb25zdCBwZXJjZW50TGF5ZXIzID0gbGF5ZXIzY291bnQgKiAxMDAgLyBsYXllcjJjb3VudDtcclxuXHR2YXIgbGF5ZXIybWFqdXJpdHkgPSAwO1xyXG5cdHZhciBsYXllcjNtYWp1cml0eSA9IDA7XHJcblx0dmFyIG1hanVyaXR5ID0gMDtcclxuXHRpZiAoY2hhckNvdW50VG90YWwgPCAzMDAwKSB7XHJcblx0XHRtYWp1cml0eSA9IDA7XHJcblx0XHQvL2NvbnNvbGUubG9nKGBOb3RlIGlzIG5vdCBsb25nIGVub3VnaCB0byBnZXQgaW50byBjYWxjdWxhdGlvbiBmb3IgbWFqdXJpdHkuIFRoZSB0b3RhbCBjaGFyYWN0ZXIgY291bnQgaXMgJHtjaGFyQ291bnRUb3RhbH1gKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0aWYgKHBlcmNlbnRMYXllcjIgPT0gMCkge1xyXG5cdFx0XHRsYXllcjJtYWp1cml0eSA9IDA7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjIgPD0gMTApIHtcclxuXHRcdFx0bGF5ZXIybWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIyIDw9IDIwKSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gNDtcclxuXHRcdH0gZWxzZSBpZiAocGVyY2VudExheWVyMiA8PSAzMCkge1xyXG5cdFx0XHRsYXllcjJtYWp1cml0eSA9IDM7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjIgPD0gNDApIHtcclxuXHRcdFx0bGF5ZXIybWFqdXJpdHkgPSAyO1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIyIDw9IDQwKSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gMTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGF5ZXIzY291bnQgPT0gMCkge1xyXG5cdFx0XHRsYXllcjNtYWp1cml0eSA9IDA7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjMgPD0gMTApIHtcclxuXHRcdFx0bGF5ZXIzbWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIzIDw9IDIwKSB7XHJcblx0XHRcdGxheWVyM21hanVyaXR5ID0gNDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxheWVyM21hanVyaXR5ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGF5ZXIybWFqdXJpdHkgPT0gMSAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMTtcclxuXHRcdH0gZWxzZSBpZiAobGF5ZXIybWFqdXJpdHkgPT0gMiAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMjtcclxuXHRcdH0gZWxzZSBpZiAobGF5ZXIybWFqdXJpdHkgPj0gMyAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMztcclxuXHRcdH0gZWxzZSBpZiAoKGxheWVyMm1hanVyaXR5ID09IDMgfHwgbGF5ZXIybWFqdXJpdHkgPT0gNCkgJiYgKGxheWVyM21hanVyaXR5ID09IDQgfHwgbGF5ZXIzbWFqdXJpdHkgPT0gNSkpIHtcclxuXHRcdFx0bWFqdXJpdHkgPSA0O1xyXG5cdFx0fSBlbHNlIGlmIChsYXllcjJtYWp1cml0eSA9PSA1ICYmIGxheWVyM21hanVyaXR5ID09IDUpIHtcclxuXHRcdFx0bWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWFqdXJpdHkgPSAwO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0XHJcblx0Ly9jb25zb2xlLmxvZyhgbGF5ZXIybWFqdXJpdHk6ICR7bGF5ZXIybWFqdXJpdHl9IFxcdGxheWVyM21hanVyaXR5OiAke2xheWVyM21hanVyaXR5fSBcXHRtYWp1cml0eTogJHttYWp1cml0eX1gKTtcclxuXHQvL2NvbnNvbGUubG9nKGBwZXJjZW50TGF5ZXIyOiAke3BlcmNlbnRMYXllcjJ9IFxcdHBlcmNlbnRMYXllcjM6ICR7cGVyY2VudExheWVyM30gXFx0bWFqdXJpdHk6ICR7bWFqdXJpdHl9YCk7XHJcblx0Ly9jb25zb2xlLmxvZyhgY2hhckNvdW50VG90YWw6ICR7Y2hhckNvdW50VG90YWx9YCk7XHJcblx0cmV0dXJuIG1hanVyaXR5O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyhjb250ZW50OiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIGxheWVyMjogc3RyaW5nLCBsYXllcjM6IHN0cmluZyk6IHsgY2hhckNvdW50OiBudW1iZXI7IGhpZ2hsaWdodGVkQ291bnQ6IG51bWJlcjsgYm9sZENvdW50OiBudW1iZXIgfSB7XHJcbiAgXHJcblx0Y29uc3QgZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZW5hbWU7IC8vLnNsaWNlKDAsIC1maWxlbmFtZS5sZW5ndGgpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb246ICR7ZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9ufWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWFya2Rvd24gZm9ybWF0dGluZyBzeW1ib2xzXHJcblx0Y29uc3Qgc3RyaXBwZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9bKl9+YF0vZywgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbjogJHtmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb259YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBtYXJrZG93biBoZWFkaW5ncyB0aGF0IG1hdGNoIHRoZSBmaWxlbmFtZVxyXG5cdGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCMrKVxccyguKikkL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0SGVhZGluZ3MgPSBzdHJpcHBlZENvbnRlbnQucmVwbGFjZShoZWFkaW5nUmVnZXgsIChtYXRjaCwgcDEsIHAyKSA9PiB7XHJcblx0XHJcblx0XHQvLyBjb25zb2xlLmxvZyhgcDI6ICR7cDJ9YCk7XHJcblx0XHRpZiAocDIgPT09IGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaDtcclxuXHR9KTtcclxuXHQvLyBjb25zb2xlLmxvZyhgY29udGVudFdpdGhvdXRIZWFkaW5nczogJHtjb250ZW50V2l0aG91dEhlYWRpbmdzfWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWV0YWRhdGEgYmxvY2tzIGZyb20gY291bnRcclxuXHRjb25zdCBtZXRhZGF0YVJlZ2V4ID0gL14tLS1bXFxzXFxTXSo/LS0tL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEgPSBjb250ZW50V2l0aG91dEhlYWRpbmdzLnJlcGxhY2UobWV0YWRhdGFSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0TWV0YWRhdGE6ICR7Y29udGVudFdpdGhvdXRNZXRhZGF0YX1gKTtcclxuXHJcblx0Ly8gUmVtb3ZlICN0YWdzIGZyb20gY291bnRcclxuXHRjb25zdCB0YWdSZWdleCA9IC8jW15cXHNdKy9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0VGFncyA9IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEucmVwbGFjZSh0YWdSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0VGFnczogJHtjb250ZW50V2l0aG91dFRhZ3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBsaW5rcyBhbmQgV2lraXBlZGlhLWxpbmtzIGZyb20gY291bnRcclxuXHRjb25zdCBsaW5rUmVnZXggPSAvXFxbLio/XFxdXFwoLio/XFwpfFxcW1xcWy4qP1xcXVxcXS9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TGlua3MgPSBjb250ZW50V2l0aG91dFRhZ3MucmVwbGFjZShsaW5rUmVnZXgsIFwiXCIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBjb250ZW50V2l0aG91dExpbmtzOiAke2NvbnRlbnRXaXRob3V0TGlua3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBibGFuayBuZXdsaW5lc1xyXG5cdGNvbnN0IGZpbHRlcmVkQ29udGVudDogc3RyaW5nID0gY29udGVudFdpdGhvdXRMaW5rc1xyXG5cdC5zcGxpdCgnXFxuJykgLy8gU3BsaXQgdGhlIGNvbnRlbnQgaW50byBhbiBhcnJheSBvZiBsaW5lc1xyXG5cdC5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpIC8vIEZpbHRlciBvdXQgbGluZXMgdGhhdCBhcmUgZW1wdHkgb3IgY29udGFpbiBvbmx5IHdoaXRlc3BhY2VcclxuXHQuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09ICctLS0nKSAvLyByZW1vdmUgLS0tIG9uIHNpbmdsZSBsaW5lc1xyXG5cdC5qb2luKCdcXG4nKTsgLy8gSm9pbiB0aGUgcmVtYWluaW5nIGxpbmVzIGJhY2sgaW50byBhIHN0cmluZywgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzXHJcblx0Ly8gY29uc29sZS5sb2coYGZpbHRlcmVkQ29udGVudDogJHtmaWx0ZXJlZENvbnRlbnR9YCk7XHJcblxyXG5cdC8vIENvdW50IHRoZSByZW1haW5pbmcgY2hhcmFjdGVyc1xyXG5cdGNvbnN0IGNoYXJDb3VudCA9IGZpbHRlcmVkQ29udGVudC5sZW5ndGg7XHJcblx0Ly8gY29uc29sZS5sb2coYGNoYXJDb3VudDogJHtjaGFyQ291bnR9YCk7XHJcblxyXG5cclxuXHQvLyBjYWxjdWxhdGUgTGF5ZXIgMiAmIDMgTGVuZ3RoXHJcblxyXG5cdC8vIENvdW50IHRoZSBoaWdobGlnaHRlZCBhbmQgYm9sZCBjaGFyYWN0ZXJzXHJcblx0bGV0IGhpZ2hsaWdodGVkQ291bnQgPSAwO1xyXG5cdGxldCBib2xkQ291bnQgPSAwO1xyXG4gIFxyXG5cdHZhciBsYXllcjJleGNsdWRlID0gJz0nXHJcblx0dmFyIGxheWVyM2V4Y2x1ZGUgPSAnXFxcXConXHJcblx0Ly8gdG8gaGF2ZSB0aGUgcmVnIGV4IGNvcnJlY3QuIG90aGVyd2lzZSBpdCB3aWxsIGdldCBzdHVjIHdpdGggKiouXHJcblx0aWYobGF5ZXIzID09ICcqKicpe1xyXG5cdFx0bGF5ZXIzID0gJ1xcXFwqXFxcXConXHJcblx0XHRsYXllcjNleGNsdWRlID0gJ1xcXFwqJ1xyXG5cdFx0bGF5ZXIyZXhjbHVkZSA9ICc9J1xyXG5cdH1cclxuXHRpZihsYXllcjIgPT0gJyoqJyl7XHJcblx0XHRsYXllcjIgPSAnXFxcXCpcXFxcKidcclxuXHRcdGxheWVyM2V4Y2x1ZGUgPSAnPSdcclxuXHRcdGxheWVyMmV4Y2x1ZGUgPSAnXFxcXConXHJcblx0fVxyXG4gIFx0XHJcblxyXG5cdGNvbnN0IGhpZ2hsaWdodFJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtsYXllcjJ9W14ke2xheWVyMmV4Y2x1ZGV9XSske2xheWVyMn1gLCBcImdcIik7XHJcbiAgICBjb25zdCBib2xkUmVnZXggPSBuZXcgUmVnRXhwKGAke2xheWVyM31bXiR7bGF5ZXIzZXhjbHVkZX1dKyR7bGF5ZXIzfWAsIFwiZ1wiKTtcclxuICBcclxuXHQvLyBDb3VudCBoaWdobGlnaHRlZCBjaGFyYWN0ZXJzXHJcblx0Y29uc3QgaGlnaGxpZ2h0ZWRNYXRjaGVzID0gY29udGVudC5tYXRjaChoaWdobGlnaHRSZWdleCk7XHJcblx0aWYgKGhpZ2hsaWdodGVkTWF0Y2hlcykge1xyXG5cdCAgaGlnaGxpZ2h0ZWRDb3VudCA9IGhpZ2hsaWdodGVkTWF0Y2hlcy5qb2luKFwiXCIpLmxlbmd0aCAtIChoaWdobGlnaHRlZE1hdGNoZXMubGVuZ3RoICogNCk7IC8vIFN1YnRyYWN0IHRoZSBsZW5ndGggb2YgJz09J1xyXG5cdCAgLy8gZmlyc3QgdGFrZSB0aGUgbGF5ZXIyIChoaWdobGlnaHRlZENvdW50KSBhbmQgcnVuIG9uIHRoaXMgdGhlICdib2xkUmVnZXgnXHJcblx0ICAvLyBDb3VudCBib2xkIGNoYXJhY3RlcnNcclxuXHQgIGNvbnN0IGxheWVyMlN0cmluZyA9IGhpZ2hsaWdodGVkTWF0Y2hlcy5qb2luKFwiXCIpO1xyXG5cdCAgY29uc3QgYm9sZE1hdGNoZXMgPSBsYXllcjJTdHJpbmcubWF0Y2goYm9sZFJlZ2V4KTtcclxuXHQgIGlmIChib2xkTWF0Y2hlcykge1xyXG5cdCAgICBib2xkQ291bnQgPSBib2xkTWF0Y2hlcy5qb2luKFwiXCIpLmxlbmd0aCAtIChib2xkTWF0Y2hlcy5sZW5ndGggKiA0KTsgLy8gU3VidHJhY3QgdGhlIGxlbmd0aCBvZiAnKionXHJcblx0ICB9XHJcblx0fVxyXG4gIFxyXG5cdFxyXG5cdFxyXG4gIFxyXG5cdHJldHVybiB7IGNoYXJDb3VudCwgaGlnaGxpZ2h0ZWRDb3VudCwgYm9sZENvdW50IH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhdGVMZXZlbE9mTWF0dXJpdHkobm90ZUxlbmd0aDogbnVtYmVyLCBsZW5ndGhPZlRpdGxlOiBudW1iZXIsIElubGlua3M6IG51bWJlciwgb3V0Z29pbmdMaW5rczogbnVtYmVyLCBwcm9ncmVzc2l2ZVN1bU1hanVyaXR5OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdC8vIGNvbnNvbGUubG9nKGBub3RlTGVuZ3RoOiAke25vdGVMZW5ndGh9XFx0bGVuZ3RoT2ZUaXRsZTogJHtsZW5ndGhPZlRpdGxlfVxcdElubGlua3M6ICR7SW5saW5rc31cXHRvdXRnb2luZ0xpbmtzOiAke291dGdvaW5nTGlua3N9YClcclxuXHRcclxuXHQvLyBkZWNpZGUgaWYgbm90ZUxlbmd0aC1tYWp1cml0eSBvciBwcm9ncmVzc2l2ZVN1bS1tYWp1cml0eSBzaGFsbCBiZSB1c2VkXHJcblx0dmFyIGxlbmd0aE1hanVyaXR5ID0gMDtcclxuXHRpZihub3RlTGVuZ3RoID49IHByb2dyZXNzaXZlU3VtTWFqdXJpdHkpIHtcclxuXHRcdGxlbmd0aE1hanVyaXR5ID0gbm90ZUxlbmd0aDtcclxuXHR9IGVsc2Uge1xyXG5cdFx0bGVuZ3RoTWFqdXJpdHkgPSBwcm9ncmVzc2l2ZVN1bU1hanVyaXR5O1xyXG5cdH1cclxuXHRcclxuXHRjb25zdCB0b3RhbFdlaWdodCA6IG51bWJlciA9IGxlbmd0aE1hanVyaXR5ICsgbGVuZ3RoT2ZUaXRsZSArIElubGlua3MgKyBvdXRnb2luZ0xpbmtzO1xyXG5cdGNvbnN0IGF2ZXJhZ2VXZWlnaHQgPSB0b3RhbFdlaWdodCAvIDU7XHJcblx0Ly8gY29uc29sZS5sb2coYHRvdGFsV2VpZ2h0OiAke3RvdGFsV2VpZ2h0fVxcdGF2ZXJhZ2VXZWlnaHQ6ICR7YXZlcmFnZVdlaWdodH1gKVxyXG5cdGlmIChhdmVyYWdlV2VpZ2h0IDwgMC41KSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gMSkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIGlmIChhdmVyYWdlV2VpZ2h0IDw9IDIpIHtcclxuXHRcdHJldHVybiAyO1xyXG5cdH0gZWxzZSBpZiAoYXZlcmFnZVdlaWdodCA8PSAzKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gMy41KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gNCkge1xyXG5cdFx0cmV0dXJuIDU7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByYXRlT3V0bGlua3Mob3V0bGlua3M6IG51bWJlcik6IG51bWJlciB7XHJcblx0Ly8gY29uc29sZS5sb2coYG91dGxpbmtzOiAke291dGxpbmtzfWApXHJcblx0aWYgKG91dGxpbmtzIDwgMikge1xyXG5cdFx0cmV0dXJuIDA7XHJcblx0fSBlbHNlIGlmIChvdXRsaW5rcyA8IDMpIHtcclxuXHRcdHJldHVybiAxO1xyXG5cdH0gZWxzZSBpZiAob3V0bGlua3MgPCA1KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKG91dGxpbmtzIDwgOSkge1xyXG5cdFx0cmV0dXJuIDU7XHJcblx0fSBlbHNlIGlmIChvdXRsaW5rcyA8IDExKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKG91dGxpbmtzIDwgMTIpIHtcclxuXHRcdHJldHVybiAxO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZUlubGlua3MobnVtSW5saW5rczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHQvL3ZhciBwcm96ZW50SW5saW5rcyA9IG51bUlubGlua3MgKiAxMDAgLyBudW1BbGxGaWxlcztcclxuXHQvL2NvbnNvbGUubG9nKGBudW1JbmxpbmtzOiAke251bUlubGlua3N9XFx0bnVtQWxsRmlsZXM6ICR7bnVtQWxsRmlsZXN9XFx0cHJvemVudElubGlua3M6ICR7cHJvemVudElubGlua3N9YClcclxuXHQvKmlmIChwcm96ZW50SW5saW5rcyA8IDAuMDA1IHx8IHByb3plbnRJbmxpbmtzID4gMC4xKSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9IGVsc2UgKi8gaWYgKG51bUlubGlua3MgPT0gMCkge1xyXG5cdFx0cmV0dXJuIDA7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgNCkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgOCkge1xyXG5cdFx0cmV0dXJuIDI7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgMTEpIHtcclxuXHRcdHJldHVybiAzO1xyXG5cdH0gZWxzZSBpZiAobnVtSW5saW5rcyA8IDE2KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKG51bUlubGlua3MgPj0gMTYgJiYgbnVtSW5saW5rcyA8IDUwMCApIHtcclxuXHRcdHJldHVybiA1O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZURpcmVjdGlvbihyYXRpbmdDdXJyZW50OiBzdHJpbmcsIHJhdGluZ05ldzogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRsZXQgcmF0aW5nID0gXCJcIlxyXG5cdGlmIChwYXJzZUludChyYXRpbmdDdXJyZW50LCAxMCkgPiByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nID0gcmF0aW5nTmV3ICsgXCJcdTJCMDdcdUZFMEZcIlxyXG5cdH0gZWxzZSBpZiAocGFyc2VJbnQocmF0aW5nQ3VycmVudCwgMTApIDwgcmF0aW5nTmV3KXtcclxuXHRcdHJhdGluZyA9IHJhdGluZ05ldyArIFwiXHUyQjA2XHVGRTBGXCJcclxuXHR9IGVsc2UgaWYgKHBhcnNlSW50KHJhdGluZ0N1cnJlbnQsIDEwKSA9PSByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nID0gcmF0aW5nTmV3ICsgXCJcdTI3QTFcdUZFMEZcIlxyXG5cdH0gZWxzZSB7XHJcblx0XHRyYXRpbmcgPSByYXRpbmdOZXcgKyBcIlwiXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmF0aW5nXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZUxlbmd0aEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gIGlmIChmaWxlbmFtZS5sZW5ndGggPCAzMCkge1xyXG5cdHJldHVybiAwO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgODApIHtcclxuXHRyZXR1cm4gMTtcclxuICB9IGVsc2UgaWYgKGZpbGVuYW1lLmxlbmd0aCA8IDEwMCkge1xyXG5cdHJldHVybiAzO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgMTUwKSB7XHJcblx0cmV0dXJuIDU7XHJcbiAgfSBlbHNlIGlmIChmaWxlbmFtZS5sZW5ndGggPCAxOTApIHtcclxuXHRyZXR1cm4gNDtcclxuICB9IGVsc2UgaWYgKGZpbGVuYW1lLmxlbmd0aCA8IDIxMCkge1xyXG5cdHJldHVybiAyO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgMjUwKSB7XHJcblx0cmV0dXJuIDE7XHJcbiAgfSBlbHNlIHtcclxuXHRyZXR1cm4gMDtcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZU5vdGVMZW5ndGgoY29udGVubGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdGlmIChjb250ZW5sZW5ndGggPCAyMDApIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgNTUwKSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKGNvbnRlbmxlbmd0aCA8IDEwMDApIHtcclxuXHRcdHJldHVybiA1O1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgMTIwMCkge1xyXG5cdFx0cmV0dXJuIDQ7XHJcblx0fSBlbHNlIGlmIChjb250ZW5sZW5ndGggPCAyMDAwKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKGNvbnRlbmxlbmd0aCA8IDI1MDApIHtcclxuXHRcdHJldHVybiAyO1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgMzAwMCkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXROdW1iZXJPZk91dGxpbmtzKGFjdGl2ZUZpbGU6IFRGaWxlKTogbnVtYmVyIHtcclxuXHQvLyBjb25zdCBhY3RpdmVGaWxlOiBURmlsZSB8IG51bGwgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRpZiAoIWFjdGl2ZUZpbGUpIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHRjb25zdCBpbmxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGFjdGl2ZUZpbGUpPy5saW5rcztcclxuXHRyZXR1cm4gaW5saW5rcyA/IE9iamVjdC5rZXlzKGlubGlua3MpLmxlbmd0aCA6IDA7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY291bnRDaGFyYWN0ZXJzSW5BY3RpdmVGaWxlKGNvbnRlbnQ6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgXHJcblx0Y29uc3QgZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZW5hbWU7IC8vLnNsaWNlKDAsIC1maWxlbmFtZS5sZW5ndGgpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb246ICR7ZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9ufWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWFya2Rvd24gZm9ybWF0dGluZyBzeW1ib2xzXHJcblx0Y29uc3Qgc3RyaXBwZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9bKl9+YF0vZywgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbjogJHtmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb259YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBtYXJrZG93biBoZWFkaW5ncyB0aGF0IG1hdGNoIHRoZSBmaWxlbmFtZVxyXG5cdGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCMrKVxccyguKikkL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0SGVhZGluZ3MgPSBzdHJpcHBlZENvbnRlbnQucmVwbGFjZShoZWFkaW5nUmVnZXgsIChtYXRjaCwgcDEsIHAyKSA9PiB7XHJcblx0XHJcblx0XHQvLyBjb25zb2xlLmxvZyhgcDI6ICR7cDJ9YCk7XHJcblx0XHRpZiAocDIgPT09IGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaDtcclxuXHR9KTtcclxuXHQvLyBjb25zb2xlLmxvZyhgY29udGVudFdpdGhvdXRIZWFkaW5nczogJHtjb250ZW50V2l0aG91dEhlYWRpbmdzfWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWV0YWRhdGEgYmxvY2tzIGZyb20gY291bnRcclxuXHRjb25zdCBtZXRhZGF0YVJlZ2V4ID0gL14tLS1bXFxzXFxTXSo/LS0tL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEgPSBjb250ZW50V2l0aG91dEhlYWRpbmdzLnJlcGxhY2UobWV0YWRhdGFSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0TWV0YWRhdGE6ICR7Y29udGVudFdpdGhvdXRNZXRhZGF0YX1gKTtcclxuXHJcblx0Ly8gUmVtb3ZlICN0YWdzIGZyb20gY291bnRcclxuXHRjb25zdCB0YWdSZWdleCA9IC8jW15cXHNdKy9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0VGFncyA9IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEucmVwbGFjZSh0YWdSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0VGFnczogJHtjb250ZW50V2l0aG91dFRhZ3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBsaW5rcyBhbmQgV2lraXBlZGlhLWxpbmtzIGZyb20gY291bnRcclxuXHRjb25zdCBsaW5rUmVnZXggPSAvXFxbLio/XFxdXFwoLio/XFwpfFxcW1xcWy4qP1xcXVxcXS9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TGlua3MgPSBjb250ZW50V2l0aG91dFRhZ3MucmVwbGFjZShsaW5rUmVnZXgsIFwiXCIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBjb250ZW50V2l0aG91dExpbmtzOiAke2NvbnRlbnRXaXRob3V0TGlua3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBibGFuayBuZXdsaW5lc1xyXG5cdGNvbnN0IGZpbHRlcmVkQ29udGVudDogc3RyaW5nID0gY29udGVudFdpdGhvdXRMaW5rc1xyXG5cdC5zcGxpdCgnXFxuJykgLy8gU3BsaXQgdGhlIGNvbnRlbnQgaW50byBhbiBhcnJheSBvZiBsaW5lc1xyXG5cdC5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpIC8vIEZpbHRlciBvdXQgbGluZXMgdGhhdCBhcmUgZW1wdHkgb3IgY29udGFpbiBvbmx5IHdoaXRlc3BhY2VcclxuXHQuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09ICctLS0nKSAvLyByZW1vdmUgLS0tIG9uIHNpbmdsZSBsaW5lc1xyXG5cdC5qb2luKCdcXG4nKTsgLy8gSm9pbiB0aGUgcmVtYWluaW5nIGxpbmVzIGJhY2sgaW50byBhIHN0cmluZywgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzXHJcblx0Ly8gY29uc29sZS5sb2coYGZpbHRlcmVkQ29udGVudDogJHtmaWx0ZXJlZENvbnRlbnR9YCk7XHJcblxyXG5cdC8vIENvdW50IHRoZSByZW1haW5pbmcgY2hhcmFjdGVyc1xyXG5cdGNvbnN0IGNoYXJDb3VudCA9IGZpbHRlcmVkQ29udGVudC5sZW5ndGg7XHJcblx0Ly8gY29uc29sZS5sb2coYGNoYXJDb3VudDogJHtjaGFyQ291bnR9YCk7XHJcblxyXG5cdHJldHVybiBjaGFyQ291bnQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY291bnRfaW5saW5rc19zaW5nbGUoZmlsZV9wYXRoOiBzdHJpbmcsIHZhdWx0X3BhdGg6IHN0cmluZyk6IG51bWJlciB7XHJcblx0Ly8gR2V0IHRoZSBmaWxlbmFtZSBhbmQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHdlJ3JlIGNvdW50aW5nIGxpbmtzIHRvXHJcblx0Y29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVfcGF0aCk7XHJcblx0Y29uc3QgZGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZpbGVfcGF0aCk7XHJcblxyXG5cdC8vIENyZWF0ZSBhIHNldCB0byBob2xkIGFsbCB0aGUgZmlsZXMgdGhhdCBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdGNvbnN0IGxpbmtpbmdfZmlsZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG5cclxuXHQvLyBSZWN1cnNpdmVseSBzZWFyY2ggZm9yIGZpbGVzIGluIHRoZSB2YXVsdCBkaXJlY3RvcnkgdGhhdCBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdGNvbnN0IHdhbGtTeW5jID0gKGRpcjogc3RyaW5nLCBmaWxlbGlzdDogc3RyaW5nW10pID0+IHtcclxuXHRcdGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoZGlyKTtcclxuXHRcdGZpbGVsaXN0ID0gZmlsZWxpc3QgfHwgW107XHJcblx0XHRmaWxlcy5mb3JFYWNoKChmaWxlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbihkaXIsIGZpbGUpKS5pc0RpcmVjdG9yeSgpKSB7XHJcblx0XHRcdFx0ZmlsZWxpc3QgPSB3YWxrU3luYyhwYXRoLmpvaW4oZGlyLCBmaWxlKSwgZmlsZWxpc3QpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdC8vIElnbm9yZSBub24tbWQgZmlsZXMgYW5kIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdXIgdGFyZ2V0IGZpbGVcclxuXHRcdFx0XHRpZiAoIWZpbGUuZW5kc1dpdGgoXCIubWRcIikgfHwgZmlsZSA9PT0gZmlsZW5hbWUpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFJlYWQgdGhlIGZpbGUgYW5kIGxvb2sgZm9yIGxpbmtzIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpciwgZmlsZSksIFwidXRmLThcIik7XHJcblx0XHRcdFx0ZGF0YS5zcGxpdCgnXFxuJykuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAobGluZS5pbmNsdWRlcyhgW1ske2ZpbGVuYW1lLnNsaWNlKDAsIC0zKX1dXWApIHx8IGxpbmUuaW5jbHVkZXMoYFske2ZpbGVuYW1lLnNsaWNlKDAsIC0zKX1dYCkpIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2UgZm91bmQgYSBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZSFcclxuXHRcdFx0XHRcdFx0bGlua2luZ19maWxlcy5hZGQocGF0aC5yZWxhdGl2ZShkaXJlY3RvcnksIHBhdGguam9pbihkaXIsIGZpbGUpKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGZpbGVsaXN0O1xyXG5cdH07XHJcblxyXG5cdHdhbGtTeW5jKHZhdWx0X3BhdGgsIFtdKTtcclxuXHJcblx0Ly8gY291bnQgaG93IG1hbnkgZmlsZXMgYXJlIG1lbnRpb25pbmcgdGhlIGlucHV0IGZpbGVcclxuXHRyZXR1cm4gbGlua2luZ19maWxlcy5zaXplO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50X2lubGlua3MoZmlsZTogVEZpbGUpOiBudW1iZXIge1xyXG4gICAgY29uc3QgeyBhcHA6IHsgbWV0YWRhdGFDYWNoZTogeyByZXNvbHZlZExpbmtzIH0gfSB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgcGF0aCB9ID0gZmlsZTtcclxuXHJcbiAgICBjb25zdCBzdW1JbmxpbmtzID0gT2JqZWN0LnZhbHVlcyhyZXNvbHZlZExpbmtzKVxyXG4gICAgICAgIC5tYXAoKHZhbDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSkgPT4gdmFsW3BhdGhdID8/IDApXHJcbiAgICAgICAgLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHN1bUlubGlua3M7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RmlsZUNvdW50TWFwID0gYXN5bmMgKGFwcDogQXBwLCBleGNsdWRlVGFnOiBzdHJpbmcsIGV4Y2x1ZGVGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4gPT4ge1xyXG5cclxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcclxuXHJcblx0XHJcblx0Ly8gZmlsZXMgd2l0aCB0aGlzICN0YWdzIGluIHRvIGlnbm9yZVxyXG5cdGxldCBleGNsdWRlZFN1YnN0cmluZ3MgOiBzdHJpbmdbXSA9IFtdXHJcblx0aWYgKGV4Y2x1ZGVUYWcgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBbXVxyXG5cdH0gZWxzZSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBleGNsdWRlVGFnLnNwbGl0KCcsICcpO1xyXG5cdH1cclxuXHRcclxuXHJcblx0Ly8gZm9sZGVycyB0byBpZ25vcmUgLm1kLWZpbGVzIGluXHJcblx0bGV0IGV4Y2x1ZGVkRm9sZGVycyA6IHN0cmluZ1tdID0gW11cclxuXHRpZiAoZXhjbHVkZUZvbGRlciA9PSB1bmRlZmluZWQpIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IFtdXHJcblx0fSBlbHNlIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IGV4Y2x1ZGVGb2xkZXIuc3BsaXQoJywgJyk7XHJcblx0fVxyXG5cdGV4Y2x1ZGVkRm9sZGVycy5wdXNoKCcub2JzaWRpYW4nLCAnLnRyYXNoJyk7IC8vIGhhcmRjb2RlIHRoZSBiYXNpYyBmb2xkZXJzXHJcblx0XHJcbiAgICBjb25zdCBmaWxlQ291bnRNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cclxuXHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50ID0gZmlsZUNvdW50TWFwLmdldChmaWxlTmFtZSkgfHwgMDtcclxuXHJcbiAgICAgICAgZmlsZUNvdW50TWFwLnNldChmaWxlTmFtZSwgY3VycmVudENvdW50ICsgMSk7XHJcblxyXG5cdFx0Y29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblxyXG4gICAgICAgIGlmICghZXhjbHVkZWRTdWJzdHJpbmdzLnNvbWUoc3Vic3RyaW5nID0+IGZpbGVDb250ZW50cy5pbmNsdWRlcyhzdWJzdHJpbmcpKSAmJiBcclxuICAgICAgICAgICAgIWV4Y2x1ZGVkRm9sZGVycy5zb21lKGZvbGRlciA9PiBmaWxlLnBhdGguaW5jbHVkZXMoZm9sZGVyKSkpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IGZpbGVDb3VudE1hcC5nZXQoZmlsZU5hbWUpIHx8IDA7XHJcblxyXG4gICAgICAgICAgICBmaWxlQ291bnRNYXAuc2V0KGZpbGVOYW1lLCBjdXJyZW50Q291bnQgKyAxKTtcclxuICAgICAgICB9XHJcblx0XHRcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmlsZUNvdW50TWFwO1xyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGaWxlTWFwID0gYXN5bmMgKGFwcDogQXBwLCBleGNsdWRlVGFnOiBzdHJpbmcsIGV4Y2x1ZGVGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8VEZpbGVbXT4gPT4ge1xyXG5cclxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcclxuXHJcblx0Ly8gZmlsZXMgd2l0aCB0aGlzICN0YWdzIGluIHRvIGlnbm9yZVxyXG5cdGxldCBleGNsdWRlZFN1YnN0cmluZ3MgOiBzdHJpbmdbXSA9IFtdXHJcblx0aWYgKGV4Y2x1ZGVUYWcgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBbXVxyXG5cdH0gZWxzZSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBleGNsdWRlVGFnLnNwbGl0KCcsICcpO1xyXG5cdH1cclxuXHQvL2NvbnNvbGUubG9nKGBleGNsdWRlZFN1YnN0cmluZ3M6ICR7ZXhjbHVkZWRTdWJzdHJpbmdzfWApXHJcblx0Ly8gZm9sZGVycyB0byBpZ25vcmUgLm1kLWZpbGVzIGluXHJcblx0bGV0IGV4Y2x1ZGVkRm9sZGVycyA6IHN0cmluZ1tdID0gW11cclxuXHRpZiAoZXhjbHVkZUZvbGRlciA9PSB1bmRlZmluZWQpIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IFtdXHJcblx0fSBlbHNlIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IGV4Y2x1ZGVGb2xkZXIuc3BsaXQoJywgJyk7XHJcblx0fVxyXG5cdGV4Y2x1ZGVkRm9sZGVycy5wdXNoKCcub2JzaWRpYW4nLCAnLnRyYXNoJyk7IC8vIGhhcmRjb2RlIHRoZSBiYXNpYyBmb2xkZXJzXHJcblx0Ly9jb25zb2xlLmxvZyhgZXhjbHVkZWRGb2xkZXJzOiAke2V4Y2x1ZGVkRm9sZGVyc31gKVx0XHJcbiAgICBsZXQgZmlsZUFycmF5OiBURmlsZVtdID0gW107XHJcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cclxuICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdC8vY29uc29sZS5sb2coYGZpbGUucGF0aDogJHtmaWxlLnBhdGh9YClcclxuXHRcdGlmICgoIWV4Y2x1ZGVkU3Vic3RyaW5ncy5zb21lKHN1YnN0cmluZyA9PiBmaWxlQ29udGVudHMuaW5jbHVkZXMoc3Vic3RyaW5nKSkgfHwgZXhjbHVkZVRhZy5sZW5ndGggPT09IDApICYmIFxyXG4gICAgICAgICAgICAhZXhjbHVkZWRGb2xkZXJzLnNvbWUoZm9sZGVyID0+IGZpbGUucGF0aC5pbmNsdWRlcyhmb2xkZXIpKSkge1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBmaWxlICR7ZmlsZX0gZ2V0J3MgYWRkZWQuYClcclxuXHRcdFx0ZmlsZUFycmF5LnB1c2goZmlsZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmlsZUFycmF5O1xyXG59O1xyXG4iLCAiaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFYXJsaWVzdENyZWF0ZWRGaWxlKGZpbGVzOiBURmlsZVtdKTogVEZpbGUge1xyXG5cdGxldCBlYXJsaWVzdENyZWF0ZWRGaWxlOiBURmlsZSA9IGZpbGVzWzBdO1xyXG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cdFx0aWYgKGZpbGUuc3RhdC5jdGltZSA8IGVhcmxpZXN0Q3JlYXRlZEZpbGUuc3RhdC5jdGltZSkge1xyXG5cdFx0XHRlYXJsaWVzdENyZWF0ZWRGaWxlID0gZmlsZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGVhcmxpZXN0Q3JlYXRlZEZpbGU7XHJcbn1cclxuXHJcbiAgXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWFybGllc3RNb2RpZmllZEZpbGUoZmlsZXM6IFRGaWxlW10pOiBURmlsZSB7XHJcblx0bGV0IGVhcmxpZXN0TW9kaWZpZWRGaWxlOiBURmlsZSA9IGZpbGVzWzBdO1xyXG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cdFx0aWYgKGZpbGUuc3RhdC5tdGltZSA8IGVhcmxpZXN0TW9kaWZpZWRGaWxlLnN0YXQubXRpbWUpIHtcclxuXHRcdFx0ZWFybGllc3RNb2RpZmllZEZpbGUgPSBmaWxlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gZWFybGllc3RNb2RpZmllZEZpbGU7XHJcbn0gIFxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWFybGllc3REYXRlRmlsZShmaWxlczogVEZpbGVbXSk6IFRGaWxlIHtcclxuXHRsZXQgZWFybGllc3RDcmVhdGVkRmlsZTogVEZpbGUgPSBmaWxlc1swXTtcclxuXHRmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcclxuXHRcdGlmIChmaWxlLnN0YXQuY3RpbWUgPCBlYXJsaWVzdENyZWF0ZWRGaWxlLnN0YXQuY3RpbWUpIHtcclxuXHRcdFx0ZWFybGllc3RDcmVhdGVkRmlsZSA9IGZpbGU7XHJcblx0XHR9XHJcblx0XHRpZiAoZmlsZS5zdGF0Lm10aW1lIDwgZWFybGllc3RDcmVhdGVkRmlsZS5zdGF0LmN0aW1lKSB7XHJcblx0XHRcdGVhcmxpZXN0Q3JlYXRlZEZpbGUgPSBmaWxlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gZWFybGllc3RDcmVhdGVkRmlsZTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtb250aHNCZXR3ZWVuKHN0YXJ0TW9udGg6IERhdGUsIGVuZE1vbnRoOiBEYXRlKTogbnVtYmVyIHtcclxuXHRsZXQgbW9udGhzID0gKGVuZE1vbnRoLmdldE1vbnRoKCkgLSBzdGFydE1vbnRoLmdldE1vbnRoKCkpICsgMTtcclxuXHRpZiAoZW5kTW9udGguZ2V0RnVsbFllYXIoKSA+IHN0YXJ0TW9udGguZ2V0RnVsbFllYXIoKSkge1xyXG5cdFx0bW9udGhzICs9IChlbmRNb250aC5nZXRGdWxsWWVhcigpIC0gc3RhcnRNb250aC5nZXRGdWxsWWVhcigpKSoxMjtcclxuXHR9XHJcblx0cmV0dXJuIG1vbnRocztcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGlvbkRhdGVzKGZpbGVzOiBURmlsZVtdKTogQXJyYXk8RGF0ZT4ge1xyXG5cdGNvbnN0IGNyZWF0aW9uRGF0ZXM6IEFycmF5PERhdGU+ID0gW107XHJcbiAgXHJcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcblx0XHRjcmVhdGlvbkRhdGVzLnB1c2gobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKSk7XHJcblx0fVxyXG4gIFxyXG5cdHJldHVybiBjcmVhdGlvbkRhdGVzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGVzKGZpbGVzOiBURmlsZVtdKTogQXJyYXk8RGF0ZT4ge1xyXG5cdGNvbnN0IGNyZWF0aW9uRGF0ZXM6IEFycmF5PERhdGU+ID0gW107XHJcbiAgXHJcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcblx0XHRjcmVhdGlvbkRhdGVzLnB1c2gobmV3IERhdGUoZmlsZS5zdGF0Lm10aW1lKSk7XHJcblx0fVxyXG4gIFxyXG5cdHJldHVybiBjcmVhdGlvbkRhdGVzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0Rm9ybWF0KHlfYXhpczogc3RyaW5nLCBjb3VudHNTdHJpbmdNb2Q6IHN0cmluZywgY2hhcnRSZWR1emllcnVuZ01vbmF0ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRsZXQgbW9uYXRzYmVncmVuenVuZyA9IG51bGxcclxuXHRpZiAoY2hhcnRSZWR1emllcnVuZ01vbmF0ZSA9PSAwKXtcclxuXHRcdG1vbmF0c2JlZ3Jlbnp1bmcgPSAwXHJcblx0fSBlbHNlIHtcclxuXHRcdG1vbmF0c2JlZ3Jlbnp1bmcgPSBjb3VudHNTdHJpbmdNb2Quc3BsaXQoJywnKS5sZW5ndGggLSBjaGFydFJlZHV6aWVydW5nTW9uYXRlXHJcblx0fVxyXG5cdFxyXG5cdC8vY29uc3QgbW9uYXRzYmVncmVuenVuZyA9IGxlbmd0aGNvdW50c1N0cmluZ0NyZWF0ZSAtIHRoaXMuc2V0dGluZ3MuY2hhcnRSZWR1emllcnVuZ01vbmF0ZVxyXG5cdHJldHVybiBcImBgYGNoYXJ0XFxudHlwZTogYmFyXFxubGFiZWxzOiBbXCIgKyB5X2F4aXMgKyBcIl1cXG5zZXJpZXM6XFxuICAtIHRpdGxlOiBtb2RpZmllZFxcbiAgICBkYXRhOiBbXCIgKyBjb3VudHNTdHJpbmdNb2QgKyBcIl1cXG50ZW5zaW9uOiAwLjJcXG53aWR0aDogODAgJVxcbmxhYmVsQ29sb3JzOiBmYWxzZVxcbmZpbGw6IGZhbHNlXFxuYmVnaW5BdFplcm86IGZhbHNlXFxuYmVzdEZpdDogZmFsc2VcXG5iZXN0Rml0VGl0bGU6IHVuZGVmaW5lZFxcbmJlc3RGaXROdW1iZXI6IDBcXG5zdGFja2VkOiB0cnVlXFxueVRpdGxlOiBcXFwiTnVtYmVyIG9mIE5vdGVzXFxcIlxcbnhUaXRsZTogXFxcIk1vbnRoc1xcXCJcXG54TWluOiBcIiArIG1vbmF0c2JlZ3Jlbnp1bmcgKyBcIlxcbmBgYFwiO1xyXG59XHJcblxyXG4gIFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNoYXJ0Q29udGVudCAoYXZhdGFyUGFnZU5hbWU6IHN0cmluZywgbmV3Q29udGVudDogc3RyaW5nKSB7XHJcblx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHthdmF0YXJQYWdlTmFtZX0ubWRgKTtcclxuXHRpZiAoZXhpc3RpbmdGaWxlID09IG51bGwpIHtcclxuXHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0Y29uc3QgZmlsZSA9IGV4aXN0aW5nRmlsZSBhcyBURmlsZTtcclxuXHJcblx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdGxldCByZWZlcmVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBlbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBzdGFydDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xyXG5cdFx0aWYgKGxpbmUgPT09IFwiXkNoYXJ0TW9udGhcIikge1xyXG5cdFx0XHRpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XHJcblx0XHRcdFx0cmVmZXJlbmNlID0gaTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAocmVmZXJlbmNlICE9IG51bGwpe1xyXG5cdFx0ZW5kID0gcmVmZXJlbmNlO1xyXG5cdFx0c3RhcnQgPSByZWZlcmVuY2UgLSAxOTtcclxuXHRcdGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzLnNsaWNlKDAsIHN0YXJ0KSwgbmV3Q29udGVudCwgLi4ubGluZXMuc2xpY2UoZW5kKV07XHJcblx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0xpbmVzLmpvaW4oXCJcXG5cIikpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICJleHBvcnQgaW50ZXJmYWNlIEJhZGdlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgICBsZXZlbDogc3RyaW5nO1xyXG4gIH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmUmVjZWl2ZUFCYWRnZShsZXZlbE9sZDogbnVtYmVyLCBsZXZlbE5ldzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgY29uc3QgYmFkZ2VMZXZlbHM6IG51bWJlcltdID0gWzUsIDEwLCAyMCwgMjcsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCAxMDBdO1xyXG4gIGxldCByZWNlaXZlQmFkZ2UgPSBmYWxzZVxyXG4gIGZvciAobGV0IGk9MDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKXtcclxuICAgIGlmIChsZXZlbE9sZCA8IGJhZGdlTGV2ZWxzW2ldICYmIGxldmVsTmV3ID49IGJhZGdlTGV2ZWxzW2ldKXtcclxuICAgICAgcmVjZWl2ZUJhZGdlID0gdHJ1ZVxyXG4gICAgfSBcclxuICB9XHJcbiAgcmV0dXJuIHJlY2VpdmVCYWRnZVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFkZ2VGb3JMZXZlbChsZXZlbDogbnVtYmVyLCBpbmZvcm06IGJvb2xlYW4pOiBCYWRnZSB7XHJcbiAgICBjb25zdCBiYWRnZUxldmVsczogbnVtYmVyW10gPSBbNSwgMTAsIDIwLCAyNywgMzUsIDQyLCA1MCwgNjAsIDc1LCA4MiwgOTAsIDEwMF07XHJcbiAgICBjb25zdCBiYWRnZU5hbWVzOiBCYWRnZVtdID0gW1xyXG4gICAgICB7IG5hbWU6IFwiRW5saWdodGVuZWQgTm92aWNlXCIsIGRlc2NyaXB0aW9uOiBcIkh1enphaCEgWW91J3ZlIGVtYmFya2VkIG9uIHRoZSBwYXRoIG9mIGtub3dsZWRnZSBhbmQgZWFybmVkIHRoZSB0aXRsZSBvZiAnRW5saWdodGVuZWQgTm92aWNlLicgVGhlIGpvdXJuZXkgaGFzIGp1c3QgYmVndW4sIGFuZCB5b3UncmUgYWxyZWFkeSByYWRpYXRpbmcgd2lzZG9tIGxpa2UgYSBiYWJ5IHN1biFcIiwgbGV2ZWw6IFwibGV2ZWwgNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJDdXJpb3VzIENvbm5vaXNzZXVyXCIsIGRlc2NyaXB0aW9uOiBcIkZhbnRhc3RpYyEgWW91J3ZlIGVtYnJhY2VkIHRoZSB3b25kZXJzIG9mIGxlYXJuaW5nIGFuZCBiZWNvbWUgYSAnQ3VyaW91cyBDb25ub2lzc2V1ci4nIFlvdXIgYXBwZXRpdGUgZm9yIGtub3dsZWRnZSBpcyBpbnNhdGlhYmxlLCBsaWtlIGEgYm90dG9tbGVzcyBib3dsIG9mIGljZSBjcmVhbSFcIiAsIGxldmVsOiBcImxldmVsIDEwXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkJyYWluaWFjIFRyYWlsYmxhemVyXCIsIGRlc2NyaXB0aW9uOiBcIkJyYXZvISBBcyBhICdCcmFpbmlhYyBUcmFpbGJsYXplciwnIHlvdSd2ZSBjYXJ2ZWQgeW91ciB3YXkgdGhyb3VnaCBhIGp1bmdsZSBvZiBpbmZvcm1hdGlvbiBhbmQgZW1lcmdlZCB2aWN0b3Jpb3VzLiBZb3VyIGludGVsbGVjdCBpcyBhIGJlYWNvbiBzaGluaW5nIGJyaWdodGx5IGZvciBvdGhlcnMgdG8gZm9sbG93IVwiICwgbGV2ZWw6IFwibGV2ZWwgMjBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU2Nob2xhcmx5IFRyYWlsYmxhemVyXCIsIGRlc2NyaXB0aW9uOiBcIkltcHJlc3NpdmUhIFlvdSdyZSBub3cgYSAnU2Nob2xhcmx5IFRyYWlsYmxhemVyLCcgYm9sZGx5IHZlbnR1cmluZyB0aHJvdWdoIGEgc2VhIG9mIGtub3dsZWRnZSB3aXRoIGEgY29tcGFzcyBvZiBjdXJpb3NpdHkgYW5kIGEgbWFwIG9mIGludGVsbGVjdCFcIiAsIGxldmVsOiBcImxldmVsIDI3XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkluZm8gTmluamEgTWFzdGVyXCIsIGRlc2NyaXB0aW9uOiBcIkluY3JlZGlibGUhIFlvdSd2ZSByZWFjaGVkIHRoZSBwaW5uYWNsZSBvZiBzdGVhbHRoeSBrbm93bGVkZ2UgbWFuYWdlbWVudC4gQXMgYW4gJ0luZm8gTmluamEgTWFzdGVyLCcgeW91IGNhbiBzbmF0Y2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgc2hhZG93cyBsaWtlIGEgZGlnaXRhbCBuaW5qYSFcIiAsIGxldmVsOiBcImxldmVsIDM1XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIldpc2UgT3dsIEd1cnVcIiwgZGVzY3JpcHRpb246IFwiV2hvby1ob28hIFlvdSd2ZSBhY2hpZXZlZCAnV2lzZSBPd2wgR3VydScgc3RhdHVzLiBZb3VyIHdpc2RvbSBpcyBsZWdlbmRhcnksIGFuZCB5b3VyIGhvb3RzIG9mIGtub3dsZWRnZSBlY2hvIHRocm91Z2ggdGhlIGZvcmVzdCBvZiBpZ25vcmFuY2UhXCIgLCBsZXZlbDogXCJsZXZlbCA0MlwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJFaW5zdGVpbiBJbmNhcm5hdGVcIiwgZGVzY3JpcHRpb246IFwiRXVyZWthISBZb3UndmUgYmVjb21lIGFuICdFaW5zdGVpbiBJbmNhcm5hdGUsJyBwdXNoaW5nIHRoZSBib3VuZGFyaWVzIG9mIHVuZGVyc3RhbmRpbmcgYW5kIGJlbmRpbmcgdGhlIGZhYnJpYyBvZiBrbm93bGVkZ2UgdG8geW91ciB3aWxsIVwiICwgbGV2ZWw6IFwibGV2ZWwgNTBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiTWFzdGVybWluZCBTYWdlXCIsIGRlc2NyaXB0aW9uOiBcIk1hZ25pZmljZW50ISBZb3UndmUgYXNjZW5kZWQgdG8gdGhlIHJhbmsgb2YgJ01hc3Rlcm1pbmQgU2FnZSwnIGd1aWRpbmcgdGhlIHJpdmVycyBvZiBpbmZvcm1hdGlvbiBhbmQgZW5saWdodGVuaW5nIGFsbCB3aG8gc2VlayB3aXNkb20hXCIgLCBsZXZlbDogXCJsZXZlbCA2MFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJDZXJlYnJhbCBNYWVzdHJvXCIsIGRlc2NyaXB0aW9uOiBcIkJyYXZpc3NpbW8hIFlvdSdyZSBub3cgYSAnQ2VyZWJyYWwgTWFlc3RybywnIGNvbmR1Y3RpbmcgdGhlIHN5bXBob255IG9mIGtub3dsZWRnZSB3aXRoIHRoZSBmaW5lc3NlIG9mIGEgdmlydHVvc28gY29uZHVjdG9yIVwiICwgbGV2ZWw6IFwibGV2ZWwgNzVcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiWmVuIEtub3dsZWRnZSBLZWVwZXJcIiwgZGVzY3JpcHRpb246IFwiU2VyZW5pdHkgYWNoaWV2ZWQhIEFzIGEgJ1plbiBLbm93bGVkZ2UgS2VlcGVyLCcgeW91IG1haW50YWluIGEgdHJhbnF1aWwgbWluZCB3aGlsZSBtYW5hZ2luZyB2YXN0IHBvb2xzIG9mIGtub3dsZWRnZSB3aXRoIGdyYWNlIGFuZCBwb2lzZS5cIiAsIGxldmVsOiBcImxldmVsIDgyXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkdyYW5kIEFyY2hpdmlzdCBPdmVybG9yZFwiLCBkZXNjcmlwdGlvbjogXCJBbGwgaGFpbCB0aGUgJ0dyYW5kIEFyY2hpdmlzdCBPdmVybG9yZCEnIFlvdSB3aWVsZCB0aGUga25vd2xlZGdlIG9mIGFnZXMgYW5kIGhvbGQgdGhlIGtleXMgdG8gdW5sb2NrIHRoZSBnYXRlcyBvZiB3aXNkb20hXCIgLCBsZXZlbDogXCJsZXZlbCA5MFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJPbW5pc2NpZW50IFNhZ2Ugb2YgRXZlcnl0aGluZ1wiLCBkZXNjcmlwdGlvbjogXCJDb25ncmF0dWxhdGlvbnMsIG9oIHdpc2Ugb25lISBZb3UndmUgYXR0YWluZWQgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgZW5saWdodGVubWVudCBhcyB0aGUgJ09tbmlzY2llbnQgU2FnZSBvZiBFdmVyeXRoaW5nLicgWW91ciB1bmRlcnN0YW5kaW5nIGtub3dzIG5vIGJvdW5kcywgYW5kIHlvdXIgd2lzZG9tIGlzIGFzIHZhc3QgYXMgdGhlIGNvc21vcyBpdHNlbGYhXCIsIGxldmVsOiBcImxldmVsIDEwMFwiICB9LFxyXG4gICAgXTtcclxuICBcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChsZXZlbCA+PSBiYWRnZUxldmVsc1tpXSkge1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhZGdlTmFtZXNbaW5kZXhdXHJcbiAgfVxyXG4gIFxyXG5cclxuXHJcbiAgZXhwb3J0ICBmdW5jdGlvbiBnZXRCYWRnZUZvckluaXRMZXZlbChsZXZlbDogbnVtYmVyKTogQmFkZ2Uge1xyXG4gICAgY29uc3QgYmFkZ2VMZXZlbHM6IG51bWJlcltdID0gWzAsIDMsIDcsIDE1LCAyMywgMzAsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCAxMDBdO1xyXG4gICAgY29uc3QgYmFkZ2VOYW1lc0luaXQ6IEJhZGdlW10gPSBbXHJcbiAgICAgIHsgbmFtZTogXCJMb3JlIFNlZWtlciBJbml0aWF0ZVwiLCBkZXNjcmlwdGlvbjogXCJXZWxjb21lIHRvIHRoZSBqb3VybmV5IG9mIGtub3dsZWRnZSEgQXMgYSAnTG9yZSBTZWVrZXIgSW5pdGlhdGUsJyB5b3UndmUgdGFrZW4geW91ciBmaXJzdCBzdGVwcyBpbnRvIHRoZSB3b3JsZCBvZiBvcmdhbml6ZWQgd2lzZG9tLiBZb3VyIHF1ZXN0IGhhcyBqdXN0IGJlZ3VuLCBhbmQgd2l0aCBlYWNoIG5vdGUgeW91IG1ha2UsIHlvdSBsYXkgdGhlIGZvdW5kYXRpb24gZm9yIGEgZnV0dXJlIHJpY2ggd2l0aCBpbnNpZ2h0cyBhbmQgdW5kZXJzdGFuZGluZy4gWW91ciBqb3VybmV5IHN0YXJ0cyBoZXJlLCBhbmQgdGhlIHBhdGggYWhlYWQgaXMgZmlsbGVkIHdpdGggcG90ZW50aWFsIGFuZCBkaXNjb3ZlcnkuXCIsIGxldmVsOiBcImxldmVsIDFcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiTG9yZSBBcHByZW50aWNlXCIsIGRlc2NyaXB0aW9uOiBcIllvdSd2ZSBoaXQgdGhlIGdyb3VuZCBydW5uaW5nIHdpdGggeW91ciBleGlzdGluZyBrbm93bGVkZ2UgdHJlYXN1cmVzISBZb3UncmUgYWxyZWFkeSBhbiAnTG9yZSBBcHByZW50aWNlLCcgYXJtZWQgd2l0aCBhIHdlYWx0aCBvZiB3aXNkb20gYW5kIHJlYWR5IHRvIHNoYXBlIGl0IGZ1cnRoZXIuXCIsIGxldmVsOiBcImxldmVsIDNcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU2F2dnkgU2Nob2xhclwiLCBkZXNjcmlwdGlvbjogXCJZb3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgZ2l2ZW4geW91IGEgaGVhZCBzdGFydCEgWW91J3JlIG5vdyBhICdTYXZ2eSBTY2hvbGFyLCcgY29uZmlkZW50bHkgZGl2aW5nIGludG8gdGhlIHNlYSBvZiBpbmZvcm1hdGlvbiB3aXRoIGEgdHJlYXN1cmUgdHJvdmUgb2YgaW5zaWdodHMuXCIgLCBsZXZlbDogXCJsZXZlbCA3XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIlNhZ2UncyBGb3VuZGF0aW9uXCIsIGRlc2NyaXB0aW9uOiBcIkJ1aWxkaW5nIHVwb24geW91ciBwcmUtZXhpc3Rpbmcgbm90ZXMsIHlvdSdyZSBlc3RhYmxpc2hpbmcgdGhlICdTYWdlJ3MgRm91bmRhdGlvbicgZm9yIGFuIGV2ZW4gZ3JhbmRlciBlZGlmaWNlIG9mIGtub3dsZWRnZS4gWW91ciBncm91bmR3b3JrIGlzIGltcHJlc3NpdmUhXCIgLCBsZXZlbDogXCJsZXZlbCAxNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJXaXNkb20gU2VlZGxpbmdcIiwgZGVzY3JpcHRpb246IFwiWW91ciBleGlzdGluZyBub3RlcyBoYXZlIG51cnR1cmVkIHRoZSBncm93dGggb2YgYSAnV2lzZG9tIFNlZWRsaW5nLicgWW91J3JlIGN1bHRpdmF0aW5nIHlvdXIgZ2FyZGVuIG9mIGtub3dsZWRnZSB3aXRoIGNhcmUgYW5kIHBhdGllbmNlLlwiICwgbGV2ZWw6IFwibGV2ZWwgMjNcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiUHJvZGlnaW91cyBQcmVwYXJlclwiLCBkZXNjcmlwdGlvbjogXCJUaGFua3MgdG8geW91ciBwcmlvciBlZmZvcnRzLCB5b3UncmUgYSAnUHJvZGlnaW91cyBQcmVwYXJlciwnIHN0YW5kaW5nIHRhbGwgYW1vbmcgeW91ciBub3RlcyBhbmQgcmVhZHkgdG8gY29ucXVlciBuZXcgcmVhbG1zIG9mIHVuZGVyc3RhbmRpbmcuXCIgLCBsZXZlbDogXCJsZXZlbCAzMFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJFcGljIEVwaXBoYW55IEV4cGxvcmVyXCIsIGRlc2NyaXB0aW9uOiBcIllvdXIgcGFzdCBub3RlcyBoYXZlIGxlZCB5b3UgdG8gdGhlIGdyYW5kICdFcGljIEVwaXBoYW55IEV4cGxvcmVyJyBzdGF0dXMhIFlvdSd2ZSBhbHJlYWR5IGJlZW4gZG93biBhIGZldyByYWJiaXQgaG9sZXMgYW5kIGNvbWUgb3V0IHdpdGggZGF6emxpbmcgZGlzY292ZXJpZXMuXCIgLCBsZXZlbDogXCJsZXZlbCAzNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJMb3JlIEx1bWluYXJ5XCIsIGRlc2NyaXB0aW9uOiBcIldpdGggeW91ciBleGlzdGluZyBub3RlcyBpbGx1bWluYXRpbmcgeW91ciBwYXRoLCB5b3UndmUgYmVjb21lIGEgJ0xvcmUgTHVtaW5hcnksJyBzaGluaW5nIGxpZ2h0IG9uIHRoZSBteXN0ZXJpZXMgb2YgdGhlIHVuaXZlcnNlLCBvbmUgaWRlYSBhdCBhIHRpbWUuXCIgLCBsZXZlbDogXCJsZXZlbCA0MlwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJTY3JpYmUgb2YgdGhlIEFuY2llbnRzXCIsIGRlc2NyaXB0aW9uOiBcIllvdXIgbWFzdGVyeSBvZiBwZXJzb25hbCBrbm93bGVkZ2UgbWFuYWdlbWVudCBoYXMgZWxldmF0ZWQgeW91IHRvIHRoZSBlc3RlZW1lZCByYW5rIG9mIHRoZSAnU2NyaWJlIG9mIHRoZSBBbmNpZW50cy4nIFlvdXIgZXhpc3Rpbmcgbm90ZXMgaGF2ZSB0cmFuc2Zvcm1lZCBpbnRvIHRyZWFzdXJlcywgYnJpZGdpbmcgdGhlIGdhcCBiZXR3ZWVuIG9sZCB3aXNkb20gYW5kIG5ldyBkaXNjb3Zlcmllcy5cIiAsIGxldmVsOiBcImxldmVsIDUwXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkV1cmVrYSBNYWVzdHJvXCIsIGRlc2NyaXB0aW9uOiBcIkFybWVkIHdpdGggeW91ciBleGlzdGluZyBub3RlcywgeW91J3JlIHRoZSAnRXVyZWthIE1hZXN0cm8sJyBjb21wb3NpbmcgYSBzeW1waG9ueSBvZiBpbnNpZ2h0cyB0aGF0IGhhcm1vbml6ZSB3aXRoIHRoZSBtZWxvZHkgb2YgZGlzY292ZXJ5LlwiICwgbGV2ZWw6IFwibGV2ZWwgNjBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiQ2hyb25pY2xlcyBDaGFtcGlvblwiLCBkZXNjcmlwdGlvbjogXCJXaXRoIHlvdXIgZXhpc3Rpbmcgbm90ZXMgc3RhbmRpbmcgYXMgYSB0ZXN0YW1lbnQsIHlvdSd2ZSBhc2NlbmRlZCB0byB0aGUgaWxsdXN0cmlvdXMgJ0Nocm9uaWNsZXMgQ2hhbXBpb24nIGxldmVsLiBZb3VyIGpvdXJuZXkgdGhyb3VnaCB0aW1lJ3MgdGFwZXN0cnkgaGFzIGJyb3VnaHQgZm9ydGggYSBzeW1waG9ueSBvZiBpbnNpZ2h0cyB0aGF0IGhhcm1vbml6ZSBwYXN0IGFuZCBwcmVzZW50LlwiICwgbGV2ZWw6IFwibGV2ZWwgNzVcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiVGhlIEN1cmlvdXMgQ2FydG9ncmFwaGVyXCIsIGRlc2NyaXB0aW9uOiBcIkFzICdUaGUgQ3VyaW91cyBDYXJ0b2dyYXBoZXIsJyB5b3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgbWFwcGVkIG91dCB1bmNoYXJ0ZWQgdGVycml0b3JpZXMgb2YgdW5kZXJzdGFuZGluZy4gWW91ciBjdXJpb3NpdHkga25vd3Mgbm8gYm91bmRzLCBhbmQgeW91ciBub3RlcyBhcmUgdGhlIGNvbXBhc3MgZ3VpZGluZyB5b3VyIGV4cGxvcmF0aW9uLlwiICwgbGV2ZWw6IFwibGV2ZWwgODJcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU3VsdGFuIG9mIFN5bnRoZXNpc1wiLCBkZXNjcmlwdGlvbjogXCJZb3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgbWFkZSB5b3UgdGhlICdTdWx0YW4gb2YgU3ludGhlc2lzLicgWW91J3JlIHRoZSBtYXN0ZXIgd2VhdmVyLCB0aHJlYWRpbmcgdG9nZXRoZXIgdGhyZWFkcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmljaCB0YXBlc3RyeSBvZiBpbnNpZ2h0LlwiICwgbGV2ZWw6IFwibGV2ZWwgOTBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiRXRlcm5hbCBBcmNoaXZpc3RcIiwgZGVzY3JpcHRpb246IFwiQXQgdGhlIHBpbm5hY2xlIG9mIHBlcnNvbmFsIGtub3dsZWRnZSBtYXN0ZXJ5LCB5b3UncmUgbm93IHJldmVyZWQgYXMgdGhlICdFdGVybmFsIEFyY2hpdmlzdC4nIFlvdXIgZXhpc3Rpbmcgbm90ZXMsIGNhcmVmdWxseSBjdXJhdGVkIGFuZCBudXJ0dXJlZCwgc3RhbmQgYXMgaW1tb3J0YWwgYmVhY29ucywgZ3VpZGluZyBzZWVrZXJzIHRocm91Z2ggdGhlIGxhYnlyaW50aCBvZiBrbm93bGVkZ2UgYWNyb3NzIGFnZXMuXCIgLCBsZXZlbDogXCJsZXZlbCAxMDBcIiB9LFxyXG4gICAgXTtcclxuICBcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChsZXZlbCA+PSBiYWRnZUxldmVsc1tpXSkge1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhZGdlTmFtZXNJbml0W2luZGV4XVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIEV4YW1wbGUgdXNhZ2U6XHJcbiAgLy8gY29uc3QgY3VycmVudExldmVsID0gNDI7IC8vIFJlcGxhY2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgcGxheWVyJ3MgbGV2ZWxcclxuICAvLyBjb25zdCBiYWRnZSA9IGdldEJhZGdlRm9yTGV2ZWwoY3VycmVudExldmVsKTtcclxuICAvLyBjb25zb2xlLmxvZyhgQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgcmVhY2hlZCBMZXZlbCAke2N1cnJlbnRMZXZlbH0uIFlvdSd2ZSBlYXJuZWQgdGhlIFwiJHtiYWRnZS5uYW1lfVwiIGJhZGdlLiAke2JhZGdlLmRlc2NyaXB0aW9ufWApO1xyXG4gIFxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEJhZGdlRm9yTGV2ZWwobGV2ZWw6IG51bWJlcik6IEJhZGdlIHtcclxuICAgIGNvbnN0IGJhZGdlczogQmFkZ2VbXSA9IFtcclxuICAgICAgeyBuYW1lOiBcIkVubGlnaHRlbmVkIE5vdmljZVwiLCBkZXNjcmlwdGlvbjogXCJIdXp6YWghIFlvdSd2ZSBlbWJhcmtlZCBvbiB0aGUgcGF0aCBvZiBrbm93bGVkZ2UgYW5kIGVhcm5lZCB0aGUgdGl0bGUgb2YgJ0VubGlnaHRlbmVkIE5vdmljZS4nIFRoZSBqb3VybmV5IGhhcyBqdXN0IGJlZ3VuLCBhbmQgeW91J3JlIGFscmVhZHkgcmFkaWF0aW5nIHdpc2RvbSBsaWtlIGEgYmFieSBzdW4hXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkN1cmlvdXMgQ29ubm9pc3NldXJcIiwgZGVzY3JpcHRpb246IFwiRmFudGFzdGljISBZb3UndmUgZW1icmFjZWQgdGhlIHdvbmRlcnMgb2YgbGVhcm5pbmcgYW5kIGJlY29tZSBhICdDdXJpb3VzIENvbm5vaXNzZXVyLicgWW91ciBhcHBldGl0ZSBmb3Iga25vd2xlZGdlIGlzIGluc2F0aWFibGUsIGxpa2UgYSBib3R0b21sZXNzIGJvd2wgb2YgaWNlIGNyZWFtIVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJCcmFpbmlhYyBUcmFpbGJsYXplclwiLCBkZXNjcmlwdGlvbjogXCJCcmF2byEgQXMgYSAnQnJhaW5pYWMgVHJhaWxibGF6ZXIsJyB5b3UndmUgY2FydmVkIHlvdXIgd2F5IHRocm91Z2ggYSBqdW5nbGUgb2YgaW5mb3JtYXRpb24gYW5kIGVtZXJnZWQgdmljdG9yaW91cy4gWW91ciBpbnRlbGxlY3QgaXMgYSBiZWFjb24gc2hpbmluZyBicmlnaHRseSBmb3Igb3RoZXJzIHRvIGZvbGxvdyFcIiB9LFxyXG4gICAgICAvLyBBZGQgbW9yZSBiYWRnZXMgaGVyZSBmb3IgbGV2ZWxzIDUsIDEwLCAyMCwgMjcsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCBhbmQgMTAwXHJcbiAgICAgIC8vIEV4YW1wbGU6XHJcbiAgICAgIC8vIHsgbmFtZTogXCJTY2hvbGFybHkgVHJhaWxibGF6ZXJcIiwgZGVzY3JpcHRpb246IFwiSW1wcmVzc2l2ZSEgWW91J3JlIG5vdyBhICdTY2hvbGFybHkgVHJhaWxibGF6ZXIsJyBib2xkbHkgdmVudHVyaW5nIHRocm91Z2ggYSBzZWEgb2Yga25vd2xlZGdlIHdpdGggYSBjb21wYXNzIG9mIGN1cmlvc2l0eSBhbmQgYSBtYXAgb2YgaW50ZWxsZWN0IVwiIH0sXHJcbiAgICAgIC8vIHsgbmFtZTogXCJJbmZvIE5pbmphIE1hc3RlclwiLCBkZXNjcmlwdGlvbjogXCJJbmNyZWRpYmxlISBZb3UndmUgcmVhY2hlZCB0aGUgcGlubmFjbGUgb2Ygc3RlYWx0aHkga25vd2xlZGdlIG1hbmFnZW1lbnQuIEFzIGFuICdJbmZvIE5pbmphIE1hc3RlciwnIHlvdSBjYW4gc25hdGNoIGluZm9ybWF0aW9uIGZyb20gdGhlIHNoYWRvd3MgbGlrZSBhIGRpZ2l0YWwgbmluamEhXCIgfSxcclxuICAgICAgLy8gLi4uYW5kIHNvIG9uXHJcbiAgICBdO1xyXG4gIFxyXG4gICAgY29uc3QgbWF4TGV2ZWwgPTEwMDsgLy8gQXNzdW1pbmcgZWFjaCBiYWRnZSBpcyBhd2FyZGVkIGV2ZXJ5IDUgbGV2ZWxzXHJcbiAgICBjb25zdCBjYXBwZWRMZXZlbCA9IE1hdGgubWluKGxldmVsLCBtYXhMZXZlbCk7XHJcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY2FwcGVkTGV2ZWwgLyA1KSAtIDE7XHJcbiAgICByZXR1cm4gYmFkZ2VzW2luZGV4XTtcclxuICB9XHJcbiAgXHJcblxyXG4gIGludGVyZmFjZSBCYWRnZSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIH1cclxuICAqL1xyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBMZXZlbERhdGEge1xyXG4gICAgcG9pbnRzOiBudW1iZXI7XHJcbiAgICBsZXZlbDogbnVtYmVyO1xyXG4gICAgcG9pbnRzTmV4dDogbnVtYmVyO1xyXG4gIH1cclxuICBcclxuICBjb25zdCBsZXZlbERhdGE6IExldmVsRGF0YVtdID0gW1xyXG4gICAgeyBwb2ludHM6IDAsIGxldmVsOiAwLCBwb2ludHNOZXh0OiAwfSxcclxuICAgIHsgcG9pbnRzOiAwLCBsZXZlbDogMSwgcG9pbnRzTmV4dDogMTAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEwMDAsIGxldmVsOiAyLCBwb2ludHNOZXh0OiAzMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMCwgbGV2ZWw6IDMsIHBvaW50c05leHQ6IDc1MDAgfSxcclxuICAgIHsgcG9pbnRzOiA3NTAwLCBsZXZlbDogNCwgcG9pbnRzTmV4dDogMTUwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNTAwMCwgbGV2ZWw6IDUsIHBvaW50c05leHQ6IDMwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMDAsIGxldmVsOiA2LCBwb2ludHNOZXh0OiA1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDUwMDAwLCBsZXZlbDogNywgcG9pbnRzTmV4dDogODAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4MDAwMCwgbGV2ZWw6IDgsIHBvaW50c05leHQ6IDEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEyMDAwMCwgbGV2ZWw6IDksIHBvaW50c05leHQ6IDE3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE3MDAwMCwgbGV2ZWw6IDEwLCBwb2ludHNOZXh0OiAyMzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyMzAwMDAsIGxldmVsOiAxMSwgcG9pbnRzTmV4dDogMzAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMDAwLCBsZXZlbDogMTIsIHBvaW50c05leHQ6IDM4MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM4MDAwMCwgbGV2ZWw6IDEzLCBwb2ludHNOZXh0OiA0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0NzAwMDAsIGxldmVsOiAxNCwgcG9pbnRzTmV4dDogNjAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjAwMDAwLCBsZXZlbDogMTUsIHBvaW50c05leHQ6IDc1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc1MDAwMCwgbGV2ZWw6IDE2LCBwb2ludHNOZXh0OiA5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MjAwMDAsIGxldmVsOiAxNywgcG9pbnRzTmV4dDogMTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDExMTAwMDAsIGxldmVsOiAxOCwgcG9pbnRzTmV4dDogMTMyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEzMjAwMDAsIGxldmVsOiAxOSwgcG9pbnRzTmV4dDogMTU1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE1NTAwMDAsIGxldmVsOiAyMCwgcG9pbnRzTmV4dDogMTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE4MDAwMDAsIGxldmVsOiAyMSwgcG9pbnRzTmV4dDogMjA3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIwNzAwMDAsIGxldmVsOiAyMiwgcG9pbnRzTmV4dDogMjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIzNjAwMDAsIGxldmVsOiAyMywgcG9pbnRzTmV4dDogMjY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI2NzAwMDAsIGxldmVsOiAyNCwgcG9pbnRzTmV4dDogMzAwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMwMDAwMDAsIGxldmVsOiAyNSwgcG9pbnRzTmV4dDogMzM1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMzNTAwMDAsIGxldmVsOiAyNiwgcG9pbnRzTmV4dDogMzcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM3MjAwMDAsIGxldmVsOiAyNywgcG9pbnRzTmV4dDogNDExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQxMTAwMDAsIGxldmVsOiAyOCwgcG9pbnRzTmV4dDogNDUyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ1MjAwMDAsIGxldmVsOiAyOSwgcG9pbnRzTmV4dDogNDk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ5NTAwMDAsIGxldmVsOiAzMCwgcG9pbnRzTmV4dDogNTQwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU0MDAwMDAsIGxldmVsOiAzMSwgcG9pbnRzTmV4dDogNTg3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU4NzAwMDAsIGxldmVsOiAzMiwgcG9pbnRzTmV4dDogNjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDYzNjAwMDAsIGxldmVsOiAzMywgcG9pbnRzTmV4dDogNjg3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDY4NzAwMDAsIGxldmVsOiAzNCwgcG9pbnRzTmV4dDogNzQwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc0MDAwMDAsIGxldmVsOiAzNSwgcG9pbnRzTmV4dDogNzk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc5NTAwMDAsIGxldmVsOiAzNiwgcG9pbnRzTmV4dDogODUyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDg1MjAwMDAsIGxldmVsOiAzNywgcG9pbnRzTmV4dDogOTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDkxMTAwMDAsIGxldmVsOiAzOCwgcG9pbnRzTmV4dDogOTcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDk3MjAwMDAsIGxldmVsOiAzOSwgcG9pbnRzTmV4dDogMTAzNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMDM1MDAwMCwgbGV2ZWw6IDQwLCBwb2ludHNOZXh0OiAxMTAwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDExMDAwMDAwLCBsZXZlbDogNDEsIHBvaW50c05leHQ6IDExNjcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTE2NzAwMDAsIGxldmVsOiA0MiwgcG9pbnRzTmV4dDogMTIzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMjM2MDAwMCwgbGV2ZWw6IDQzLCBwb2ludHNOZXh0OiAxMzA3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEzMDcwMDAwLCBsZXZlbDogNDQsIHBvaW50c05leHQ6IDEzODAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTM4MDAwMDAsIGxldmVsOiA0NSwgcG9pbnRzTmV4dDogMTQ1NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNDU1MDAwMCwgbGV2ZWw6IDQ2LCBwb2ludHNOZXh0OiAxNTMyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE1MzIwMDAwLCBsZXZlbDogNDcsIHBvaW50c05leHQ6IDE2MTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTYxMTAwMDAsIGxldmVsOiA0OCwgcG9pbnRzTmV4dDogMTY5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNjkyMDAwMCwgbGV2ZWw6IDQ5LCBwb2ludHNOZXh0OiAxNzc1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE3NzUwMDAwLCBsZXZlbDogNTAsIHBvaW50c05leHQ6IDE4NjAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTg2MDAwMDAsIGxldmVsOiA1MSwgcG9pbnRzTmV4dDogMTk0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxOTQ3MDAwMCwgbGV2ZWw6IDUyLCBwb2ludHNOZXh0OiAyMDM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIwMzYwMDAwLCBsZXZlbDogNTMsIHBvaW50c05leHQ6IDIxMjcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjEyNzAwMDAsIGxldmVsOiA1NCwgcG9pbnRzTmV4dDogMjIyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyMjIwMDAwMCwgbGV2ZWw6IDU1LCBwb2ludHNOZXh0OiAyMzE1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIzMTUwMDAwLCBsZXZlbDogNTYsIHBvaW50c05leHQ6IDI0MTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjQxMjAwMDAsIGxldmVsOiA1NywgcG9pbnRzTmV4dDogMjUxMTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyNTExMDAwMCwgbGV2ZWw6IDU4LCBwb2ludHNOZXh0OiAyNjEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI2MTIwMDAwLCBsZXZlbDogNTksIHBvaW50c05leHQ6IDI3MTUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjcxNTAwMDAsIGxldmVsOiA2MCwgcG9pbnRzTmV4dDogMjgyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyODIwMDAwMCwgbGV2ZWw6IDYxLCBwb2ludHNOZXh0OiAyOTI3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI5MjcwMDAwLCBsZXZlbDogNjIsIHBvaW50c05leHQ6IDMwMzYwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAzNjAwMDAsIGxldmVsOiA2MywgcG9pbnRzTmV4dDogMzE0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzMTQ3MDAwMCwgbGV2ZWw6IDY0LCBwb2ludHNOZXh0OiAzMjYwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMyNjAwMDAwLCBsZXZlbDogNjUsIHBvaW50c05leHQ6IDMzNzUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzM3NTAwMDAsIGxldmVsOiA2NiwgcG9pbnRzTmV4dDogMzQ5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzNDkyMDAwMCwgbGV2ZWw6IDY3LCBwb2ludHNOZXh0OiAzNjExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM2MTEwMDAwLCBsZXZlbDogNjgsIHBvaW50c05leHQ6IDM3MzIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzczMjAwMDAsIGxldmVsOiA2OSwgcG9pbnRzTmV4dDogMzg1NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzODU1MDAwMCwgbGV2ZWw6IDcwLCBwb2ludHNOZXh0OiAzOTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM5ODAwMDAwLCBsZXZlbDogNzEsIHBvaW50c05leHQ6IDQxMDcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDEwNzAwMDAsIGxldmVsOiA3MiwgcG9pbnRzTmV4dDogNDIzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0MjM2MDAwMCwgbGV2ZWw6IDczLCBwb2ludHNOZXh0OiA0MzY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQzNjcwMDAwLCBsZXZlbDogNzQsIHBvaW50c05leHQ6IDQ1MDAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDUwMDAwMDAsIGxldmVsOiA3NSwgcG9pbnRzTmV4dDogNDYzNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0NjM1MDAwMCwgbGV2ZWw6IDc2LCBwb2ludHNOZXh0OiA0NzcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ3NzIwMDAwLCBsZXZlbDogNzcsIHBvaW50c05leHQ6IDQ5MTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDkxMTAwMDAsIGxldmVsOiA3OCwgcG9pbnRzTmV4dDogNTA1MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1MDUyMDAwMCwgbGV2ZWw6IDc5LCBwb2ludHNOZXh0OiA1MTk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDUxOTUwMDAwLCBsZXZlbDogODAsIHBvaW50c05leHQ6IDUzNDAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNTM0MDAwMDAsIGxldmVsOiA4MSwgcG9pbnRzTmV4dDogNTQ4NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1NDg3MDAwMCwgbGV2ZWw6IDgyLCBwb2ludHNOZXh0OiA1NjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU2MzYwMDAwLCBsZXZlbDogODMsIHBvaW50c05leHQ6IDU3ODcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNTc4NzAwMDAsIGxldmVsOiA4NCwgcG9pbnRzTmV4dDogNTk0MDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1OTQwMDAwMCwgbGV2ZWw6IDg1LCBwb2ludHNOZXh0OiA2MDk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDYwOTUwMDAwLCBsZXZlbDogODYsIHBvaW50c05leHQ6IDYyNTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjI1MjAwMDAsIGxldmVsOiA4NywgcG9pbnRzTmV4dDogNjQxMTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA2NDExMDAwMCwgbGV2ZWw6IDg4LCBwb2ludHNOZXh0OiA2NTcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDY1NzIwMDAwLCBsZXZlbDogODksIHBvaW50c05leHQ6IDY3MzUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjczNTAwMDAsIGxldmVsOiA5MCwgcG9pbnRzTmV4dDogNjkwMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA2OTAwMDAwMCwgbGV2ZWw6IDkxLCBwb2ludHNOZXh0OiA3MDY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDcwNjcwMDAwLCBsZXZlbDogOTIsIHBvaW50c05leHQ6IDcyMzYwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNzIzNjAwMDAsIGxldmVsOiA5MywgcG9pbnRzTmV4dDogNzQwNzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA3NDA3MDAwMCwgbGV2ZWw6IDk0LCBwb2ludHNOZXh0OiA3NTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc1ODAwMDAwLCBsZXZlbDogOTUsIHBvaW50c05leHQ6IDc3NTUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNzc1NTAwMDAsIGxldmVsOiA5NiwgcG9pbnRzTmV4dDogNzkzMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA3OTMyMDAwMCwgbGV2ZWw6IDk3LCBwb2ludHNOZXh0OiA4MTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDgxMTEwMDAwLCBsZXZlbDogOTgsIHBvaW50c05leHQ6IDgyOTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogODI5MjAwMDAsIGxldmVsOiA5OSwgcG9pbnRzTmV4dDogODQ3NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4NDc1MDAwMCwgbGV2ZWw6IDEwMCwgcG9pbnRzTmV4dDogODY2MDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4NjYwMDAwMCwgbGV2ZWw6IDEwMSwgcG9pbnRzTmV4dDogODg0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4ODQ3MDAwMCwgbGV2ZWw6IDEwMiwgcG9pbnRzTmV4dDogOTAzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MDM2MDAwMCwgbGV2ZWw6IDEwMywgcG9pbnRzTmV4dDogOTIyNzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MjI3MDAwMCwgbGV2ZWw6IDEwNCwgcG9pbnRzTmV4dDogOTQyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5NDIwMDAwMCwgbGV2ZWw6IDEwNSwgcG9pbnRzTmV4dDogOTYxNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5NjE1MDAwMCwgbGV2ZWw6IDEwNiwgcG9pbnRzTmV4dDogOTgxMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5ODEyMDAwMCwgbGV2ZWw6IDEwNywgcG9pbnRzTmV4dDogMTAwMTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTAwMTEwMDAwLCBsZXZlbDogMTA4LCBwb2ludHNOZXh0OiAxMDIxMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMDIxMjAwMDAsIGxldmVsOiAxMDksIHBvaW50c05leHQ6IDEwMjEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEwNDE1MDAwMCwgbGV2ZWw6IDExMCwgcG9pbnRzTmV4dDogMTA2MTUwMDAwIH0sXHJcbiAgXTtcclxuICBcclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TGV2ZWxGb3JQb2ludHMocG9pbnRzOiBudW1iZXIpOiBMZXZlbERhdGEge1xyXG4gICAgbGV0IGxldmVsIDpMZXZlbERhdGEgPSBsZXZlbERhdGFbMF07XHJcbiAgICBmb3IgKGNvbnN0IGRhdGEgb2YgbGV2ZWxEYXRhKSB7XHJcbiAgICAgIGlmIChwb2ludHMgPj0gZGF0YS5wb2ludHMpIHtcclxuICAgICAgICBsZXZlbCA9IGRhdGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsZXZlbDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBzdGF0dXNQb2ludHNGb3JMZXZlbCh0YXJnZXRMZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBzdGF0dXNQb2ludHMgPSAwO1xyXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIGxldmVsRGF0YSkge1xyXG4gICAgICBpZiAodGFyZ2V0TGV2ZWwgPT0gZGF0YS5sZXZlbCAmJiBzdGF0dXNQb2ludHMgPT0gMCkge1xyXG4gICAgICAgIHN0YXR1c1BvaW50cyA9IGRhdGEucG9pbnRzO1xyXG4gICAgICB9IFxyXG4gICAgfVxyXG5cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHN0YXR1c1BvaW50c1xyXG4gIH1cclxuICBcclxuXHJcbi8qXHJcbmNvbnN0IHBvaW50cyA9IDU1MDA7XHJcbmNvbnN0IGxldmVsID0gZ2V0TGV2ZWxGb3JQb2ludHMocG9pbnRzKTtcclxuY29uc29sZS5sb2coYFdpdGggJHtwb2ludHN9IHBvaW50cywgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgJHtsZXZlbH0uYCk7XHJcbiovIiwgImNvbnN0IG1lc3NhZ2VzV2Vla2x5Q2hhbGxlbmdlOiBzdHJpbmdbXSA9IFtcclxuXHRcIlNldmVuIGRheXMgb2Ygbm90ZS10YWtpbmc/IFlvdSdyZSBwcmFjdGljYWxseSBhIG5vdGUgbmluamEgdHVydGxlIG5vdyEgXHVEODNEXHVEQzIyXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGNvd2FidW5nYSFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGNvbXBsZXRlZCBhIHdlZWstbG9uZyBub3RlLXRha2luZyBtYXJhdGhvbiEgXHVEODNDXHVERkMzXHUyMDBEXHUyNjQyXHVGRTBGXHVEODNEXHVEQ0REIFtYXSBwb2ludHMgZWFybmVkLiBSZWFkeSBmb3IgdGhlIG5leHQgbGFwP1wiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgb24gZmlyZSEgXHVEODNEXHVERDI1XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgdGhlIHNwYXJrIGFsaXZlIVwiLFxyXG5cdFwiU2V2ZW4gbm90ZXMgaW4gc2V2ZW4gZGF5cyAtIHRoYXQncyBsaWtlIGEgbm90ZSBzeW1waG9ueSEgXHVEODNDXHVERkI2XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIG1hZXN0cm8hXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgZmllc3RhISBcdUQ4M0NcdURGODlcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCB0aGUgcGFydHkgZ29pbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIFlvdSdyZSBsaWtlIHRoZSBKYW1lcyBCb25kIG9mIG5vdGUtdGFraW5nISBcdUQ4M0RcdURENzZcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgc2VjcmV0IGFnZW50IVwiLFxyXG5cdFwiWW91J3JlIG9mZmljaWFsbHkgYSAnTm90ZS1BLURheScgc3VwZXJoZXJvISBcdUQ4M0VcdUREQjhcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgY2FwZXMgb3B0aW9uYWwhXCIsXHJcblx0XCJBIHdob2xlIHdlZWsgb2Ygbm90ZXM/IFlvdSd2ZSBwcmFjdGljYWxseSB3cml0dGVuIGEgbWluaSBub3ZlbCBieSBub3chIFx1RDgzRFx1RENEQVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBhdXRob3Igc3RhdHVzIGFjaGlldmVkIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cyBzdHJhaWdodD8gWW91J3JlIHRoZSBVc2FpbiBCb2x0IG9mIG5vdGUtdGFraW5nISBcdUQ4M0NcdURGQzNcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgc3ByaW50aW5nIHRvd2FyZHMga25vd2xlZGdlIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHNwcmVlISBJdCdzIGxpa2UgYSBub3Rlcy1wbG9zaW9uISBcdUQ4M0RcdURDQTVcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCB0aGUgZmlyZXdvcmtzIGNvbWluZyFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGJhc2ljYWxseSB0aGUgTWljaGFlbCBKb3JkYW4gb2Ygbm90ZS10YWtpbmchIFx1RDgzQ1x1REZDMFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBzbGFtIGR1bmshXCIsXHJcblx0XCJBIHdob2xlIHdlZWsgb2Ygbm90ZXM/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgTVZQISBcdUQ4M0NcdURGQzZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzY29yaW5nIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgdW5sb2NrZWQgdGhlICdTZXZlbiBEYXkgTm90ZSBGZXZlcicgYWNoaWV2ZW1lbnQhIFx1RDgzQ1x1REYxRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBjYXRjaCB0aGUgZmV2ZXIhXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIHJvY2tzdGFyISBcdUQ4M0NcdURGQjhcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBqYW1taW4nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIG1hZ2ljIHNob3chIE5vdyB5b3Ugc2VlIHRoZSBub3Rlcywgbm93IHlvdSBkb24ndCEgXHVEODNDXHVERkE5XHUyNzI4IFtYXSBwb2ludHMsIGtlZXAgdGhlIG1hZ2ljIGFsaXZlIVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgbGlrZSBhIG5vdGUtdGFraW5nIEplZGkgTWFzdGVyISBcdUQ4M0NcdURGMENcdTI2OTRcdUZFMEYgW1hdIHBvaW50cywgbWF5IHRoZSBub3RlcyBiZSB3aXRoIHlvdSFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgVG9ueSBIYXdrIG9mIG5vdGUtdGFraW5nISBcdUQ4M0RcdURFRjlcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzaHJlZGRpbmchXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgcm9sbGVyY29hc3RlciEgVXAgYW5kIGRvd24sIGJ1dCBhbHdheXMgbW92aW5nIGZvcndhcmQhIFx1RDgzQ1x1REZBMlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBlbmpveSB0aGUgcmlkZSFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGEgbm90ZS10YWtpbmcgREogc3Bpbm5pbmcga25vd2xlZGdlIGJlYXRzISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgZHJvcCB0aGUga25vd2xlZGdlIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgY29ucXVlcmVkIHRoZSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgY2hhbGxlbmdlISBZb3UncmUgdGhlIG5vdGUtdGFraW5nIEluZGlhbmEgSm9uZXMhIFx1RDgzQ1x1REZGOVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGV4cGxvcmluZyFcIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIHRoZSBub3RlLXRha2luZyBTaGVybG9jayBIb2xtZXMsIHNvbHZpbmcga25vd2xlZGdlIG15c3RlcmllcyEgXHVEODNEXHVERDBEXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xldXRoaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBQaWNhc3NvLCBjcmVhdGluZyBhIG1hc3RlcnBpZWNlIG9mIGtub3dsZWRnZSEgXHVEODNDXHVERkE4XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgcGFpbnRpbmchXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgcm9ja2V0IHNoaXAhIERlc3RpbmF0aW9uOiBJbmZpbml0ZSBLbm93bGVkZ2UhIFx1RDgzRFx1REU4MFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBlbmpveSB0aGUgam91cm5leSFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgTWFjR3l2ZXIsIHR1cm5pbmcgaW5mb3JtYXRpb24gaW50byBzb2x1dGlvbnMhIFx1RDgzRFx1REQyN1x1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGNyYWZ0aW5nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHNhZmFyaSwgZXhwbG9yaW5nIHRoZSB3aWxkcyBvZiBrbm93bGVkZ2UhIFx1RDgzRFx1REMxOFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGV4cGxvcmluZyFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGEgbm90ZS10YWtpbmcgY2hlZiwgY29va2luZyB1cCBhIGtub3dsZWRnZSBmZWFzdCEgXHVEODNDXHVERjczXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgY29va2luZyFcIixcclxuXHRcIllvdSd2ZSBqdXN0IHVubG9ja2VkIHRoZSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgYmFkZ2UhIFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgc3VwZXJoZXJvIHdlIG5lZWQhIFx1RDgzRVx1RERCOFx1MjAwRFx1MjY0MFx1RkUwRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIHNhdmluZyB0aGUgZGF5IVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgdGhlIG5vdGUtdGFraW5nIExld2lzIGFuZCBDbGFyaywgY2hhcnRpbmcgbmV3IHRlcnJpdG9yaWVzIG9mIGtub3dsZWRnZSEgXHVEODNEXHVEREZBXHVGRTBGXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgZXhwbG9yaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiwgZHJvcHBpbmcgYmVhdHMgb2Ygd2lzZG9tISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzcGlubmluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyB0cmVhc3VyZSBodW50LCBkaXNjb3ZlcmluZyBnZW1zIG9mIHdpc2RvbSEgXHVEODNEXHVEQzhFXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgaHVudGluZyFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgbmluamEgd2FycmlvciwgY29ucXVlcmluZyB0aGUga25vd2xlZGdlIG9ic3RhY2xlIGNvdXJzZSEgXHVEODNFXHVERDRCXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xheWluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyByb2NrZXQgc2hpcCEgRGVzdGluYXRpb246IEluZmluaXRlIEtub3dsZWRnZSEgXHVEODNEXHVERTgwXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGVuam95IHRoZSBqb3VybmV5IVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBkZXRlY3RpdmUsIHNvbHZpbmcgY2FzZXMgb2YgY3VyaW9zaXR5ISBcdUQ4M0RcdURENzVcdUZFMEZcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBkZXRlY3RpbmchXCIsXHJcblx0XCJZb3UndmUganVzdCB1bmxvY2tlZCB0aGUgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIGJhZGdlISBZb3UncmUgdGhlIG5vdGUtdGFraW5nIHN1cGVyaGVybyB3ZSBuZWVkISBcdUQ4M0VcdUREQjhcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzYXZpbmcgdGhlIGRheSFcIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIHRoZSBub3RlLXRha2luZyBwaW9uZWVyLCBibGF6aW5nIHRyYWlscyB0aHJvdWdoIHRoZSBmb3Jlc3RzIG9mIGluZm9ybWF0aW9uISBcdUQ4M0NcdURGMzJcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBwaW9uZWVyaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiwgZHJvcHBpbmcgYmVhdHMgb2Ygd2lzZG9tISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzcGlubmluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyB0cmVhc3VyZSBodW50LCBkaXNjb3ZlcmluZyBnZW1zIG9mIHdpc2RvbSEgXHVEODNEXHVEQzhFXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgaHVudGluZyFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgbmluamEgd2FycmlvciwgY29ucXVlcmluZyB0aGUga25vd2xlZGdlIG9ic3RhY2xlIGNvdXJzZSEgXHVEODNFXHVERDRCXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xheWluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyByb2xsZXJjb2FzdGVyISBVcCBhbmQgZG93biwgYnV0IGFsd2F5cyBtb3ZpbmcgZm9yd2FyZCEgXHVEODNDXHVERkEyXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGVuam95IHRoZSByaWRlIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiBzcGlubmluZyBrbm93bGVkZ2UgYmVhdHMhIFx1RDgzQ1x1REZBN1x1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBkcm9wIHRoZSBrbm93bGVkZ2UhXCIsXHJcblx0XCJZb3UndmUganVzdCBjb25xdWVyZWQgdGhlIHNldmVuLWRheSBub3RlLXRha2luZyBjaGFsbGVuZ2UhIFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgSW5kaWFuYSBKb25lcyEgXHVEODNDXHVERkY5XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgZXhwbG9yaW5nIVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgdGhlIG5vdGUtdGFraW5nIFNoZXJsb2NrIEhvbG1lcywgc29sdmluZyBrbm93bGVkZ2UgbXlzdGVyaWVzISBcdUQ4M0RcdUREMERcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzbGV1dGhpbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIFBpY2Fzc28sIGNyZWF0aW5nIGEgbWFzdGVycGllY2Ugb2Yga25vd2xlZGdlISBcdUQ4M0NcdURGQThcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBwYWludGluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyBzYWZhcmksIGV4cGxvcmluZyB0aGUgd2lsZHMgb2Yga25vd2xlZGdlISBcdUQ4M0RcdURDMThcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBleHBsb3JpbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzIHN0cmFpZ2h0PyBZb3UncmUgdGhlIFRvbnkgSGF3ayBvZiBub3RlLXRha2luZyEgXHVEODNEXHVERUY5XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2hyZWRkaW5nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHJvY2tldCBzaGlwISBEZXN0aW5hdGlvbjogSW5maW5pdGUgS25vd2xlZGdlISBcdUQ4M0RcdURFODBcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgZW5qb3kgdGhlIGpvdXJuZXkhXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIG5pbmphIHR1cnRsZSBub3chIFx1RDgzRFx1REMyMlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBjb3dhYnVuZ2EhXCIsXHJcblx0XCJZb3UndmUganVzdCBjb21wbGV0ZWQgYSB3ZWVrLWxvbmcgbm90ZS10YWtpbmcgbWFyYXRob24hIFx1RDgzQ1x1REZDM1x1MjAwRFx1MjY0Mlx1RkUwRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzIGVhcm5lZC4gUmVhZHkgZm9yIHRoZSBuZXh0IGxhcD9cIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIG9uIGZpcmUhIFx1RDgzRFx1REQyNVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIHRoZSBzcGFyayBhbGl2ZSFcIixcclxuXHRcIlNldmVuIG5vdGVzIGluIHNldmVuIGRheXMgLSB0aGF0J3MgbGlrZSBhIG5vdGUgc3ltcGhvbnkhIFx1RDgzQ1x1REZCNlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBtYWVzdHJvIVwiXHJcbl07XHJcblxyXG5jb25zdCB0d29Ob3RlTWVzc2FnZXM6IHN0cmluZ1tdID0gW1xyXG5cdFwiQm9vbSEgWW91IGp1c3QgYWNlZCB0aGUgMi1ub3RlIHRhbmdvISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cyBpbiB0aGUgcG9ja2V0LiBLZWVwIGdyb292aW4nIVwiLFxyXG5cdFwiVHdvIG5vdGVzIGluIGEgZGF5PyBZb3UncmUgb2ZmaWNpYWxseSBhIE5vdGUgTmluamEhIFx1RDgzRVx1REQ0QiBbWF0gcG9pbnRzIGVhcm5lZC4gUm9jayBvbiFcIixcclxuXHRcIkhpZ2gtZml2ZSEgWW91J3ZlIGNvbnF1ZXJlZCB0aGUgMi1ub3RlIHJvZGVvISBcdUQ4M0VcdUREMjAgW1hdIHBvaW50cyBlYXJuZWQuIFllZWhhdyFcIixcclxuXHRcIkRvdWJsZSB0cm91YmxlISBUd28gbm90ZXMgaW4gb25lIGRheSwgeW91IGxlZ2VuZCEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMsIHJvY2tzdGFyIVwiLFxyXG5cdFwiWW91J3JlIG9uIGZpcmUhIFR3byBub3RlcyBpbiBhIGRheSAtIHdoYXQncyB5b3VyIHNlY3JldCB3ZWFwb24/IFx1RDgzRFx1REQyNSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiQmluZ28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNEXHVERTgwIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIGl0IHVwIVwiLFxyXG5cdFwiS2Fib29tISBZb3UganVzdCBibGV3IHRoZSAyLW5vdGUgY2hhbGxlbmdlIG91dCBvZiB0aGUgd2F0ZXIhIFx1RDgzRFx1RENBNSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiWW91J3JlIG9mZmljaWFsbHkgYSAyLW5vdGUgc3VwZXJzdGFyISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBpbiB0aGUgYmFnLiBLZWVwIHNoaW5pbmchXCIsXHJcblx0XCJEb3VibGUgdXAsIGRvdWJsZSBkb3duISBUd28gbm90ZXMgaW4gb25lIGRheSAtIHlvdSdyZSBhIHJvY2tzdGFyISBcdUQ4M0NcdURGQjggW1hdIHBvaW50cyFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGpvaW5lZCB0aGUgMi1ub3RlIHBhcnR5ISBcdUQ4M0VcdURENzMgW1hdIHBvaW50cyBlYXJuZWQuIExldCdzIGtlZXAgZGFuY2luZyFcIixcclxuXHRcIkthLWNoaW5nISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSByYWNraW5nIHVwIHRob3NlIHBvaW50cyEgXHVEODNEXHVEQ0IwIFtYXSBlYXJuZWQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFnaWNpYW4hIFx1RDgzQ1x1REZBOVx1MjcyOCBbWF0gcG9pbnRzIGVhcm5lZC4gV2hhdCdzIHlvdXIgbmV4dCB0cmljaz9cIixcclxuXHRcIlR3byBub3Rlcz8gTmFpbGVkIGl0ISBZb3UncmUgb24gYSByb2xsISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgaXQgZ29pbmchXCIsXHJcblx0XCJBYnJhLWNhZGFicmEhIFR3byBub3RlcyBhcHBlYXIhIFx1RDgzQ1x1REZBOVx1MjcyOCBbWF0gcG9pbnRzIGVhcm5lZC4gS2VlcCB0aGUgbWFnaWMgYWxpdmUhXCIsXHJcblx0XCJEb3VibGUgdHJvdWJsZSwgZG91YmxlIHRoZSBmdW4hIFR3byBub3RlcyBpbiBvbmUgZGF5ISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cywgc3VwZXJzdGFyIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgdW5sb2NrZWQgdGhlIDItbm90ZSBhY2hpZXZlbWVudCEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIHNvYXJpbmchXCIsXHJcblx0XCJXb28taG9vISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSBvbiBmaXJlISBcdUQ4M0RcdUREMjUgW1hdIHBvaW50cywga2VlcCBpdCB1cCFcIixcclxuXHRcIllvdSdyZSBhIDItbm90ZSB3aXphcmQhIFx1MjcyOFx1RDgzRFx1REQyRSBbWF0gcG9pbnRzIGVhcm5lZC4gV2hhdCdzIHlvdXIgbmV4dCBzcGVsbD9cIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgYXdlc29tZW5lc3MhIFx1RDgzQ1x1REYxRiBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGtpY2tlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSBvdXQgb2YgdGhlIHBhcmshIFx1MjZCRSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiQm9vbSEgWW91IGp1c3QgY29ucXVlcmVkIHRoZSAyLW5vdGUgY2hhbGxlbmdlISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cywgc3VwZXJzdGFyIVwiLFxyXG5cdFwiRG91YmxlIHRoZSBub3RlcywgZG91YmxlIHRoZSBjZWxlYnJhdGlvbiEgXHVEODNFXHVERDczIFtYXSBwb2ludHMgZWFybmVkLiBQYXJ0eSBvbiFcIixcclxuXHRcIllvdSdyZSBhIDItbm90ZSBtYWVzdHJvISBcdUQ4M0NcdURGQjUgW1hdIHBvaW50cyBpbiB0aGUgcG9ja2V0LiBLZWVwIHRoZSBtdXNpYyBwbGF5aW5nIVwiLFxyXG5cdFwiS2Fib29tISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSBvbiBhIHJvbGwhIFx1RDgzRFx1REU4MCBbWF0gcG9pbnRzIGVhcm5lZC4gS2VlcCBpdCB1cCFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGpvaW5lZCB0aGUgMi1ub3RlIGZpZXN0YSEgXHVEODNFXHVERDczIFtYXSBwb2ludHMgZWFybmVkLiBMZXQncyBrZWVwIGRhbmNpbmchXCIsXHJcblx0XCJaYXAhIFlvdSd2ZSBqdXN0IGVsZWN0cmlmaWVkIHRoZSAyLW5vdGUgY2hhbGxlbmdlISBcdTI2QTEgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJEb3VibGUgbm90ZXMsIGRvdWJsZSB0aGUgc3BhcmtsZSEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIHNoaW5pbmcgYnJpZ2h0IVwiLFxyXG5cdFwiWW91J3JlIGEgMi1ub3RlIGR5bmFtbyEgXHVEODNEXHVEQ0E1IFtYXSBwb2ludHMgZWFybmVkLiBXaGF0J3MgeW91ciBuZXh0IGV4cGxvc2lvbj9cIixcclxuXHRcIkthYm9vbSEgVHdvIG5vdGVzIGluIGEgZGF5ISBZb3UncmUgb24gZmlyZSEgXHVEODNEXHVERDI1IFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UndmUganVzdCB1bmxvY2tlZCB0aGUgMi1ub3RlIGFjaGlldmVtZW50ISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc29hcmluZyFcIixcclxuXHRcIldvby1ob28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgd2l6YXJkISBcdTI3MjhcdUQ4M0RcdUREMkUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgc3BlbGw/XCIsXHJcblx0XCJEb3VibGUgdGhlIG5vdGVzLCBkb3VibGUgdGhlIGF3ZXNvbWVuZXNzISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJZb3UndmUganVzdCBraWNrZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2Ugb3V0IG9mIHRoZSBwYXJrISBcdTI2QkUgW1hdIHBvaW50cyFcIixcclxuXHRcIkJvb20hIFlvdSBqdXN0IGNvbnF1ZXJlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIHN1cGVyc3RhciFcIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgY2VsZWJyYXRpb24hIFx1RDgzRVx1REQ3MyBbWF0gcG9pbnRzIGVhcm5lZC4gUGFydHkgb24hXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFlc3RybyEgXHVEODNDXHVERkI1IFtYXSBwb2ludHMgaW4gdGhlIHBvY2tldC4gS2VlcCB0aGUgbXVzaWMgcGxheWluZyFcIixcclxuXHRcIlphcCEgWW91J3ZlIGp1c3QgZWxlY3RyaWZpZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2UhIFx1MjZBMSBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIkRvdWJsZSBub3RlcywgZG91YmxlIHRoZSBzcGFya2xlISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc2hpbmluZyBicmlnaHQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgZHluYW1vISBcdUQ4M0RcdURDQTUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgZXhwbG9zaW9uP1wiLFxyXG5cdFwiS2Fwb3chIFR3byBub3RlcyBpbiBhIGRheSAtIHlvdSdyZSBhIHN1cGVyaGVybyEgXHVEODNFXHVEREI4XHUyMDBEXHUyNjQyXHVGRTBGIFtYXSBwb2ludHMhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbGVnZW5kISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgYWR2ZW50dXJlP1wiLFxyXG5cdFwiQmluZ28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNEXHVERTgwIFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgd2l6YXJkISBcdTI3MjhcdUQ4M0RcdUREMkUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgc3BlbGw/XCIsXHJcblx0XCJEb3VibGUgdGhlIG5vdGVzLCBkb3VibGUgdGhlIGF3ZXNvbWVuZXNzISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJZb3UndmUganVzdCBraWNrZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2Ugb3V0IG9mIHRoZSBwYXJrISBcdTI2QkUgW1hdIHBvaW50cyFcIixcclxuXHRcIkJvb20hIFlvdSBqdXN0IGNvbnF1ZXJlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIHN1cGVyc3RhciFcIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgY2VsZWJyYXRpb24hIFx1RDgzRVx1REQ3MyBbWF0gcG9pbnRzIGVhcm5lZC4gUGFydHkgb24hXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFlc3RybyEgXHVEODNDXHVERkI1IFtYXSBwb2ludHMgaW4gdGhlIHBvY2tldC4gS2VlcCB0aGUgbXVzaWMgcGxheWluZyFcIixcclxuXHRcIlphcCEgWW91J3ZlIGp1c3QgZWxlY3RyaWZpZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2UhIFx1MjZBMSBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIkRvdWJsZSBub3RlcywgZG91YmxlIHRoZSBzcGFya2xlISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc2hpbmluZyBicmlnaHQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgZHluYW1vISBcdUQ4M0RcdURDQTUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgZXhwbG9zaW9uP1wiXHJcbl07XHJcblxyXG5jb25zdCByYW5kb21Qb2ludE5vdGljZXM6IHN0cmluZ1tdID0gW1xyXG5cdFwiQmF6aW5nYSEgWW91IGp1c3Qgc25hZ2dlZCBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiS2Fib29tISBbWF0gcG9pbnRzIGFyZSBub3cgaW4geW91ciBwb2NrZXQhXCIsXHJcblx0XCJXb29ob28hIFtYXSBwb2ludHMgZWFybmVkISBLZWVwIGl0IHVwIVwiLFxyXG5cdFwiUG9pbnRzIGFob3khIFtYXSBtb3JlIGluIHRoZSBiYW5rIVwiLFxyXG5cdFwiU2NvcmUhIFtYXSBwb2ludHMgYWRkZWQgdG8geW91ciB0b3RhbCFcIixcclxuXHRcIllvdSdyZSBvbiBmaXJlISBbWF0gcG9pbnRzIGluIHRoZSBiYWchXCIsXHJcblx0XCJaaXBwaXR5LXphcCEgW1hdIHBvaW50cyBmb3IgeW91IVwiLFxyXG5cdFwiQ2hhbXBpb24gbW92ZSEgW1hdIHBvaW50cyBhcmUgeW91cnMhXCIsXHJcblx0XCJCaW5nbyEgW1hdIHBvaW50cyBqdXN0IGZvciB5b3UhXCIsXHJcblx0XCJTaGF6YW0hIFtYXSBwb2ludHMgdG8gdGhlIHJlc2N1ZSFcIixcclxuXHRcIkthLWNoaW5nISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlN1cGVyYiEgW1hdIG1vcmUgcG9pbnRzIGZvciB5b3UhXCIsXHJcblx0XCJCcmF2byEgW1hdIHBvaW50cyBhZGRlZCB0byB5b3VyIHN0YXNoIVwiLFxyXG5cdFwiV2VsbCBkb25lISBbWF0gbW9yZSBwb2ludHMgaW4gdG93IVwiLFxyXG5cdFwiWmFwISBbWF0gcG9pbnRzLCBqdXN0IGxpa2UgdGhhdCFcIixcclxuXHRcIkEgcm91bmQgb2YgYXBwbGF1c2UgZm9yIFtYXSBwb2ludHMhXCIsXHJcblx0XCJXaG9vc2ghIFtYXSBwb2ludHMgYXJlIHlvdXJzIVwiLFxyXG5cdFwiWmluZyEgW1hdIHBvaW50cyBmb3IgeW91ciBlZmZvcnRzIVwiLFxyXG5cdFwiV29vISBbWF0gcG9pbnRzLCB3YXkgdG8gZ28hXCIsXHJcblx0XCJaZXN0eSEgW1hdIHBvaW50cyBpbiB5b3VyIHRhbGx5IVwiLFxyXG5cdFwiR3JlYXQgam9iISBbWF0gbW9yZSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIkZhbnRhc3RpYyEgW1hdIHBvaW50cyBpbiB0aGUgYmFnIVwiLFxyXG5cdFwiWm93aWUhIFtYXSBwb2ludHMganVzdCBmb3IgeW91IVwiLFxyXG5cdFwiSG9vcmF5ISBbWF0gcG9pbnRzIGluIHlvdXIgYWNjb3VudCFcIixcclxuXHRcIk5pY2Ugb25lISBbWF0gcG9pbnRzIGluIHRoZSBwb2NrZXQhXCIsXHJcblx0XCJXb290IHdvb3QhIFtYXSBwb2ludHMsIG5pY2Ugd29yayFcIixcclxuXHRcIlppZ3phZyEgW1hdIHBvaW50cywga2VlcCBpdCB1cCFcIixcclxuXHRcIkJhbSEgW1hdIHBvaW50cywgd2VsbCBkb25lIVwiLFxyXG5cdFwiQ29vbCBiZWFucyEgW1hdIHBvaW50cyBmb3IgeW91IVwiLFxyXG5cdFwiWmVzdHkhIFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJTcGxlbmRpZCEgW1hdIHBvaW50cyBmb3IgeW91ciBlZmZvcnRzIVwiLFxyXG5cdFwiTWFydmVsb3VzISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlphbnkhIFtYXSBwb2ludHMsIHdlbGwgZG9uZSFcIixcclxuXHRcIkV4cXVpc2l0ZSEgW1hdIHBvaW50cyBpbiB5b3VyIHN0YXNoIVwiLFxyXG5cdFwiT3V0c3RhbmRpbmchIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlplc3R5ISBbWF0gcG9pbnRzLCBuaWNlIGpvYiFcIixcclxuXHRcIk1hZ25pZmljZW50ISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlppZ3phZyEgW1hdIHBvaW50cyBpbiB5b3VyIHRhbGx5IVwiLFxyXG5cdFwiVGVycmlmaWMhIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlN1cGVyYiEgW1hdIHBvaW50cywgd2VsbCBkb25lIVwiLFxyXG5cdFwiWm93aWUhIFtYXSBwb2ludHMgZm9yIHlvdXIgZWZmb3J0cyFcIixcclxuXHRcIkV4Y2VsbGVudCEgW1hdIHBvaW50cyBlYXJuZWQhXCIsXHJcblx0XCJaYXAhIFtYXSBwb2ludHMgaW4geW91ciBhY2NvdW50IVwiLFxyXG5cdFwiQXdlc29tZSEgW1hdIHBvaW50cywgd2F5IHRvIGdvIVwiLFxyXG5cdFwiV2VsbCBwbGF5ZWQhIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlplc3R5ISBbWF0gcG9pbnRzLCBuaWNlIHdvcmshXCIsXHJcblx0XCJJbXByZXNzaXZlISBbWF0gcG9pbnRzLCBrZWVwIGl0IHVwIVwiLFxyXG5cdFwiQnJpbGxpYW50ISBbWF0gcG9pbnRzLCB3ZWxsIGRvbmUhXCIsXHJcblx0XCJaaW5nISBbWF0gcG9pbnRzIGZvciB5b3VyIGVmZm9ydHMhXCIsXHJcblx0XCJOaWNlIG1vdmUhIFtYXSBwb2ludHMgZWFybmVkIVwiLFxyXG5cdFwiWmVzdHkhIFtYXSBwb2ludHMgaW4gdGhlIGJhZyFcIixcclxuXHRcIlN0ZWxsYXIhIFtYXSBwb2ludHMganVzdCBmb3IgeW91IVwiLFxyXG5cdFwiV2VsbCBkZXNlcnZlZCEgW1hdIHBvaW50cyBlYXJuZWQhXCJcclxuXTtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVdlZWtseUNoYWxsZW5nZShwb2ludHM6IG51bWJlcik6IHN0cmluZyB7XHJcblx0Y29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtZXNzYWdlc1dlZWtseUNoYWxsZW5nZS5sZW5ndGgpO1xyXG5cdGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1dlZWtseUNoYWxsZW5nZVtyYW5kb21JbmRleF07XHJcblx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZShcIltYXVwiLCBwb2ludHMudG9TdHJpbmcoKSk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVR3b05vdGVDaGFsbGVuZ2UocG9pbnRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdGNvbnN0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdHdvTm90ZU1lc3NhZ2VzLmxlbmd0aCk7XHJcblx0Y29uc3QgbWVzc2FnZSA9IHR3b05vdGVNZXNzYWdlc1tyYW5kb21JbmRleF07XHJcblx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZShcIltYXVwiLCBwb2ludHMudG9TdHJpbmcoKSk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVBvaW50cyhwb2ludHM6IG51bWJlcik6IHN0cmluZyB7XHJcblx0Y29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByYW5kb21Qb2ludE5vdGljZXMubGVuZ3RoKTtcclxuXHRjb25zdCBtZXNzYWdlID0gcmFuZG9tUG9pbnROb3RpY2VzW3JhbmRvbUluZGV4XTtcclxuXHRyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKFwiW1hdXCIsIHBvaW50cy50b1N0cmluZygpKTtcclxufVxyXG5cclxuLy8gRXhhbXBsZSB1c2FnZVxyXG4vLyBjb25zdCByYW5kb21Qb2ludHMgPSAxMDA7IC8vIFJlcGxhY2Ugd2l0aCB5b3VyIGFjdHVhbCBwb2ludHMgdmFsdWVcclxuLy8gY29uc3QgcmFuZG9tTWVzc2FnZSA9IGdldFJhbmRvbU1lc3NhZ2VXZWVrbHlDaGFsbGVuZ2UocmFuZG9tUG9pbnRzKTtcclxuLy8gY29uc29sZS5sb2cocmFuZG9tTWVzc2FnZSk7XHJcblxyXG5cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxJQUFB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QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksS0FBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxNQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLElBQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsS0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLEtBQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsTUFBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxLQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE1BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNuRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxLQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE1BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksS0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxNQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLEtBQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsTUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxNQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLE9BQVUsT0FBTyxLQUFLLFlBQVksT0FBUztBQUFBLEVBQ3JELEVBQUUsUUFBUSxRQUFVLE9BQU8sS0FBSyxZQUFZLE9BQVM7QUFBQSxFQUNyRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxPQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLFFBQVUsT0FBTyxLQUFLLFlBQVksTUFBUztBQUFBLEVBQ3JELEVBQUUsUUFBUSxPQUFVLE9BQU8sS0FBSyxZQUFZLE9BQVM7QUFBQSxFQUNyRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxPQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLFFBQVUsT0FBTyxLQUFLLFlBQVksUUFBVTtBQUFBLEVBQ3RELEVBQUUsUUFBUSxTQUFXLE9BQU8sS0FBSyxZQUFZLFFBQVU7QUFBQSxFQUN2RCxFQUFFLFFBQVEsU0FBVyxPQUFPLEtBQUssWUFBWSxRQUFVO0FBQUEsRUFDdkQsRUFBRSxRQUFRLFNBQVcsT0FBTyxLQUFLLFlBQVksUUFBVTtBQUN6RDtBQUVPLFNBQVMsa0JBQWtCLFFBQTJCO0FBQzNELE1BQUksUUFBbUIsVUFBVSxDQUFDO0FBQ2xDLGFBQVcsUUFBUSxXQUFXO0FBQzVCLFFBQUksVUFBVSxLQUFLLFFBQVE7QUFDekIsY0FBUTtBQUFBLElBQ1YsT0FBTztBQUNMO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFTyxTQUFTLHFCQUFxQixhQUE2QjtBQUNoRSxNQUFJLGVBQWU7QUFDbkIsYUFBVyxRQUFRLFdBQVc7QUFDNUIsUUFBSSxlQUFlLEtBQUssU0FBUyxnQkFBZ0IsR0FBRztBQUNsRCxxQkFBZSxLQUFLO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBR0YsU0FBTztBQUNQOzs7QUM5SUYsSUFBTSwwQkFBb0M7QUFBQSxFQUN6QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUVBLElBQU0sa0JBQTRCO0FBQUEsRUFDakM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUVBLElBQU0scUJBQStCO0FBQUEsRUFDcEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Q7QUFHTyxTQUFTLGdDQUFnQyxRQUF3QjtBQUN2RSxRQUFNLGNBQWMsS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLHdCQUF3QixNQUFNO0FBQzdFLFFBQU0sVUFBVSx3QkFBd0IsV0FBVztBQUNuRCxTQUFPLFFBQVEsUUFBUSxP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Q2hCO0FBRUEsU0FBTztBQUNSOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiYXBwIiwgIm9iaiIsICJkZWZhdWx0T3B0aW9ucyIsICJkZWZhdWx0T3B0aW9ucyIsICJkZWZhdWx0T3B0aW9ucyIsICJNSUxMSVNFQ09ORFNfSU5fV0VFSyIsICJmb3JtYXR0ZXJzIiwgImxvY2FsaXplIiwgInkiLCAiTSIsICJkIiwgImEiLCAiaCIsICJIIiwgIm0iLCAicyIsICJTIiwgImRhdGVMb25nRm9ybWF0dGVyIiwgImZvcm1hdExvbmciLCAidGltZUxvbmdGb3JtYXR0ZXIiLCAiZGF0ZVRpbWVMb25nRm9ybWF0dGVyIiwgImZvcm1hdCIsICJmb3JtYXREaXN0YW5jZSIsICJmb3JtYXQiLCAiZm9ybWF0UmVsYXRpdmUiLCAib3JkaW5hbE51bWJlciIsICJ2YWx1ZUNhbGxiYWNrIiwgImRlZmF1bHRPcHRpb25zIiwgImxvY2FsZSIsICJtYXRjaCIsICJwYXRoIiwgImFwcCIsICJmaWxlTmFtZSIsICJjdXJyZW50Q291bnQiLCAiaSIsICJpIiwgImUiLCAiaSIsICJtYXRjaCIsICJmaWxlIiwgImFwcCIsICJhcHAiXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgIm5vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2lzRGF0ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL3RvRGF0ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2lzVmFsaWQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDRGF5T2ZZZWFyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vlay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZGVmYXVsdE9wdGlvbnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrWWVhci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvc3RhcnRPZlVUQ1dlZWtZZWFyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9saWdodEZvcm1hdHRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3Byb3RlY3RlZFRva2Vucy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9sb2NhbGl6ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hGbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9sb2NhbGUvZW4tVVMvX2xpYi9tYXRjaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL19saWIvZGVmYXVsdExvY2FsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2Zvcm1hdC9pbmRleC5qcyIsICJzcmMvY29uc3RhbnRzLnRzIiwgInNyYy9tYWp1cml0eWNhbGN1bGF0aW9uLnRzIiwgInNyYy9jcmVhdG1vZGNoYXJ0Y2FsY3VsYXRpb24udHMiLCAic3JjL2JhZGdlcy50cyIsICJzcmMvbGV2ZWxzLnRzIiwgInNyYy9yYW5kb21Ob3RpZmljYXRpb25UZXh0LnRzIiwgInNyYy9Nb2RhbEluZm9ybWF0aW9uYm94LnRzIiwgInNyYy9Nb2RhbEJvb3N0ZXIudHMiLCAic3JjL011bHRpU2VsZWN0TW9kYWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuc3R5bGUudGV4dENvbnRlbnQgPSBgXHJcbiAgLm1vZGFsLWNoZWNrYm94LWNvbnRhaW5lciB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfVxyXG5cclxuICAubW9kYWwtY2hlY2tib3gtY29udGFpbmVyIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICB9XHJcbmA7XHJcblxyXG5kb2N1bWVudC5oZWFkLmFwcGVuZChzdHlsZSk7XHJcbmltcG9ydCB7QXBwLCBNYXJrZG93blZpZXcsIE5vdGljZSwgUGx1Z2luLCBURmlsZSwgVmF1bHR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtkZWZhdWx0U2V0dGluZ3MsIElTZXR0aW5ncywgR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3N9IGZyb20gJy4vc2V0dGluZ3MnO1xyXG5pbXBvcnQgZm9ybWF0IGZyb20gJ2RhdGUtZm5zL2Zvcm1hdCc7XHJcbmltcG9ydCB7XHJcblx0YXZhdGFySW5pdENvbnRlbnQsXHJcblx0cG9pbnRzTWFqdXJpdHksXHJcblx0cG9pbnRzTm90ZU1hanVyaXR5LFxyXG5cdHBvaW50c0ZvckRhaWx5Q2hhbGxlbmdlLFxyXG5cdHBvaW50c0ZvcldlZWtseUNoYWxsZW5nZSxcclxuXHRpbmNyZWRpbWVudHMsXHJcblx0ZWxlbWVudHMsXHJcblx0Ym9vc3RlclJlY2lwZXMsXHJcblx0c3RyZWFrYm9vc3RlckRlY3JlYXNlLFxyXG5cdHN0cmVha2Jvb3N0ZXJJbmNyZWFzZURhaWx5LFxyXG5cdHN0cmVha2Jvb3N0ZXJJbmNyZWFzZVdlZWtseVxyXG59IGZyb20gJy4vY29uc3RhbnRzJ1xyXG5pbXBvcnQge1xyXG5cdGNvdW50X2lubGlua3MsXHJcblx0Y291bnRDaGFyYWN0ZXJzSW5BY3RpdmVGaWxlLFxyXG5cdGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyxcclxuXHRnZXRGaWxlQ291bnRNYXAsXHJcblx0Z2V0RmlsZU1hcCxcclxuXHRnZXROdW1iZXJPZk91dGxpbmtzLFxyXG5cdHJhdGVEaXJlY3Rpb24sXHJcblx0cmF0ZUlubGlua3MsXHJcblx0cmF0ZUxlbmd0aEZpbGVuYW1lLFxyXG5cdHJhdGVMZXZlbE9mTWF0dXJpdHksXHJcblx0cmF0ZU5vdGVMZW5ndGgsXHJcblx0cmF0ZU91dGxpbmtzLFxyXG5cdHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb25cclxufSBmcm9tICcuL21hanVyaXR5Y2FsY3VsYXRpb24nXHJcbmltcG9ydCB7XHJcblx0Y3JlYXRlQ2hhcnRGb3JtYXQsXHJcblx0ZmluZEVhcmxpZXN0TW9kaWZpZWRGaWxlLFxyXG5cdGdldE1vZGlmaWNhdGlvbkRhdGVzLFxyXG5cdG1vbnRoc0JldHdlZW4sXHJcblx0cmVwbGFjZUNoYXJ0Q29udGVudFxyXG59IGZyb20gJy4vY3JlYXRtb2RjaGFydGNhbGN1bGF0aW9uJ1xyXG5pbXBvcnQge0JhZGdlLCBjaGVja0lmUmVjZWl2ZUFCYWRnZSwgZ2V0QmFkZ2VGb3JJbml0TGV2ZWwsIGdldEJhZGdlRm9yTGV2ZWx9IGZyb20gJy4vYmFkZ2VzJ1xyXG5pbXBvcnQge2dldExldmVsRm9yUG9pbnRzLCBzdGF0dXNQb2ludHNGb3JMZXZlbH0gZnJvbSAnLi9sZXZlbHMnXHJcbmltcG9ydCB0eXBlIHtNb21lbnR9IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IGdldFJhbmRvbU1lc3NhZ2VXZWVrbHlDaGFsbGVuZ2UsIGdldFJhbmRvbU1lc3NhZ2VUd29Ob3RlQ2hhbGxlbmdlICwgZ2V0UmFuZG9tTWVzc2FnZVBvaW50cyB9IGZyb20gJy4vcmFuZG9tTm90aWZpY2F0aW9uVGV4dCdcclxuaW1wb3J0IHsgTW9kYWxJbmZvcm1hdGlvbmJveCB9IGZyb20gJ01vZGFsSW5mb3JtYXRpb25ib3gnO1xyXG5pbXBvcnQgeyBNb2RhbEJvb3N0ZXIgfSBmcm9tICdNb2RhbEJvb3N0ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZ2FtaWZpY2F0aW9uIGV4dGVuZHMgUGx1Z2luIHtcclxuXHQvL3B1YmxpYyBzZXR0aW5nczogR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3M7XHJcblx0cHJpdmF0ZSB0aW1lckludGVydmFsOiBudW1iZXI7XHJcblx0cHJpdmF0ZSB0aW1lcklkOiBudW1iZXIgfCBudWxsO1xyXG5cdHByaXZhdGUgc3RhdHVzQmFySXRlbSA9IHRoaXMuYWRkU3RhdHVzQmFySXRlbSgpO1xyXG5cdHByaXZhdGUgc3RhdHVzYmFyR2FtaWZpY2F0aW9uID0gdGhpcy5zdGF0dXNCYXJJdGVtLmNyZWF0ZUVsKFwic3BhblwiLCB7IHRleHQ6IFwiXCIgfSk7XHJcblx0cHVibGljIHNldHRpbmdzOiBJU2V0dGluZ3M7XHJcblxyXG5cclxuXHRnZXRTZXR0aW5nKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gUmV0cmlldmUgYSBzcGVjaWZpYyBzZXR0aW5nXHJcblx0XHQvLyByZXR1cm4gdGhpcy5zZXR0aW5nc1trZXldO1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3Nba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpcy5zZXR0aW5nc1trZXldIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZXR0aW5nKGtleTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gU2V0IGEgc3BlY2lmaWMgc2V0dGluZ1xyXG5cdFx0Ly9jb25zb2xlLmxvZyhgbmV3IHZhbHVlIGZvciAke2tleX0gaXMgJHt2YWx1ZX1gKVxyXG4gICAgICAgIHRoaXMuc2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG5cdHNldFNldHRpbmdCb29sZWFuKGtleTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIFNldCBhIHNwZWNpZmljIHNldHRpbmdcclxuXHRcdC8vY29uc29sZS5sb2coYG5ldyB2YWx1ZSBmb3IgJHtrZXl9IGlzICR7dmFsdWV9YClcclxuICAgICAgICB0aGlzLnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdH1cclxuXHJcblx0c2V0U2V0dGluZ1N0cmluZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFNldCBhIHNwZWNpZmljIHNldHRpbmdcclxuXHRcdC8vY29uc29sZS5sb2coYG5ldyB2YWx1ZSBmb3IgJHtrZXl9IGlzICR7dmFsdWV9YClcclxuICAgICAgICB0aGlzLnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coJ29ic2lkaWFuLXBrbS1nYW1pZmljYXRpb24gbG9hZGVkIScpO1xyXG5cdFx0Ly90aGlzLnNldHRpbmdzID0gZGVmYXVsdFNldHRpbmdzO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBHYW1pZmljYXRpb25QbHVnaW5TZXR0aW5ncyh0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdC8vIHRha2UgY2FyZSB0byByZXNldCB3aGVuIG9wZW5lZCBvbiBhIG5ldyBkYXksIGRvbid0IHdhaXQgZm9yIHRyaWdnZXJcclxuXHRcdHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQvLyBDb2RlIHRoYXQgeW91IHdhbnQgdG8gZXhlY3V0ZSBhZnRlciB0aGUgZGVsYXlcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNldERhaWx5R29hbHMoKVxyXG5cdFx0fSwgMjAwMCk7IC8vIDIwMDAgbWlsbGlzZWNvbmRzID0gMiBzZWNvbmRzXHJcblxyXG5cclxuXHRcdC8vIHRvIHNldCB0aW1lciBmb3IgcmVzZXQgZGFpbHkgYW5kIHdlZWtseSBnb2Fsc1xyXG5cdFx0dGhpcy50aW1lckludGVydmFsID0gMzAgKiA2MCAqIDEwMDA7IC8vIG1pbnV0ZXMgeCBzZWNvbmRzIHggbWlsbGlzZWNvbmRzXHJcblx0XHR0aGlzLnRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZXNldERhaWx5R29hbHMuYmluZCh0aGlzKSwgdGhpcy50aW1lckludGVydmFsKTtcclxuXHJcblx0XHRhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c0Jhcih0aGlzLnN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuXHJcblxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xyXG5cdFx0XHR0aGlzLmFkZFJpYmJvbkljb24oXCJhY2Nlc3NpYmlsaXR5XCIsIFwiY3JhZnRpbmdcIiwgYXN5bmMgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHQvLyBjb25zdCBwb2ludHNSZWNlaXZlZCA9IDUwMDtcclxuXHRcdFx0XHQvLyBuZXcgTW9kYWxJbmZvcm1hdGlvbmJveCh0aGlzLmFwcCwgYEZpbmFsaXplZCBnYW1pZmljYXRpb24gaW5pdGlhbGl6YXRpb24hXFxuQ29uZ3JhdHVsYXRpb24sIHlvdSBlYXJuZWQgJHtwb2ludHNSZWNlaXZlZH0gUG9pbnRzIVxcblxcbkNoZWNrIHRoZSBQcm9maWxlIFBhZ2U6IFxcXCIke3RoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWV9Lm1kXFxcIi5gKS5vcGVuKCk7XHJcblxyXG5cdFx0XHRcdC8vIGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUsIDMwMClcclxuXHRcdFx0XHQvLyB0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHJcblx0XHRcdFx0Ly8gY29uc3QgbmV4dEJhZGdlTGV2ZWwgPSBhd2FpdCB0aGlzLndoaWNoTGV2ZWxOZXh0QmFkZ2UodGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbClcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhgTlx1MDBFNGNoc3RlIEJhZGdlIG1pdCBMZXZlbCAke25leHRCYWRnZUxldmVsfWApXHJcblxyXG5cclxuXHRcdFx0XHQvLyBjb25zdCBpbml0QmFkZ2UgOiBCYWRnZSA9IGF3YWl0IGdldEJhZGdlRm9ySW5pdExldmVsKHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwpO1xyXG5cdFx0XHRcdC8vIGF3YWl0IHRoaXMuZ2l2ZUluaXRCYWRnZUluUHJvZmlsZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCBpbml0QmFkZ2UpO1xyXG5cdFx0XHRcdC8vIGF3YWl0IHRoaXMucmVtb3ZlQmFkZ2VzV2hlbkluaXRMZXZlbEhpZ2hlcih0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lICx0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsKVxyXG5cdFx0XHRcdC8vIGF3YWl0IHRoaXMuYm9vc3RlckZvckluaXQoKVxyXG5cclxuXHRcdFx0XHQvLyB0aGlzLm9wZW5BdmF0YXJGaWxlKClcclxuXHJcblxyXG5cdFx0XHRcdC8vIGNoYW5nZSB0ZXh0IGluIHN0YXR1cyBiYXJcclxuXHJcblx0XHRcdFx0Ly8gdGhpcy51cGRhdGVTdGF0dXNCYXIoc3RhdHVzYmFyR2FtaWZpY2F0aW9uKVxyXG5cdFx0XHRcdC8vc3RhdHVzYmFyR2FtaWZpY2F0aW9uLnNldFRleHQoXCJIYWxsb1wiKVxyXG5cclxuXHJcblx0XHRcdFx0Ly9hd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0XHRcdC8vYXdhaXQgdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpO1xyXG5cclxuXHRcdFx0XHQvLyB0aGlzLmxvYWRTZXR0aW5ncygpXHJcblx0XHRcdFx0Ly9hd2FpdCB0aGlzLnJlc2V0RGFpbHlHb2FscygpXHJcblxyXG5cclxuXHRcdFx0XHQvL25ldyBNb2RhbEJvb3N0ZXIodGhpcy5hcHAsIGAgYCwgdGhpcykub3BlbigpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmFjcXVpcmVJbmdyZWRpZW50cygpO1xyXG5cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hZGRSaWJib25JY29uKFwidGVzdC10dWJlLTJcIiwgXCJCb29zdGVyc1wiLCBhc3luYyAoKSA9PiB7XHJcblx0XHRcdC8vY29uc3QgZmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRcdFx0bmV3IE1vZGFsQm9vc3Rlcih0aGlzLmFwcCwgYCBgLCB0aGlzKS5vcGVuKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oXCJzcHJvdXRcIiwgXCJDYWxjdWxhdGUgTm90ZSBNYXR1cml0eVwiLCBhc3luYyAoKSA9PiB7XHJcblx0XHRcdC8vY29uc3QgZmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5jYWxjdWxhdGVOb3RlTWFqdXJpdHkoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnYm9vc3RlcnMnLFxyXG5cdFx0XHRuYW1lOiAnb3BlbiBib290ZXIgcGFsbGV0ZScsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0bmV3IE1vZGFsQm9vc3Rlcih0aGlzLmFwcCwgYCBgLCB0aGlzKS5vcGVuKCk7XHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVJbml0Q29tbWFuZCl7XHJcblx0XHRcdC8vIGNvbW1hbmQgSW5pdGlhbGl6ZSBnYW1pZmljYXRpb24gcmF0aW5nc1xyXG5cdFx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRcdGlkOiAnaW5pdC1yYXRlLWdhbWlmaWNhdGlvbicsXHJcblx0XHRcdFx0bmFtZTogJ0luaXRpYWxpemUgZ2FtaWZpY2F0aW9uIHJhdGluZ3MnLFxyXG5cdFx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmluaXRpYWxpemVHYW1lKHRoaXMuc3RhdHVzYmFyR2FtaWZpY2F0aW9uKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVJbml0Q29tbWFuZCl7XHJcblx0XHRcdC8vIGNvbW1hbmQgY3JlYXRlIGF2YXRhciBwcm9maWxlIHBhZ2VcclxuXHRcdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0XHRpZDogJ2NyZWF0ZS1hdmF0YXItcGFnZScsXHJcblx0XHRcdFx0bmFtZTogJ2NyZWF0ZSBwcm9maWxlIHBhZ2UnLFxyXG5cdFx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCB7IHZhdWx0IH0gPSB0aGlzLmFwcDtcclxuXHRcdFx0XHRcdGF3YWl0IGNyZWF0ZUF2YXRhckZpbGUodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0XHRcdFx0XHRjb25zdCBjaGFydFN0cmluZyA9IGF3YWl0IHRoaXMuY3JlYXRlQ2hhcnQodmF1bHQpXHJcblx0XHRcdFx0XHRhd2FpdCByZXBsYWNlQ2hhcnRDb250ZW50KHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUsIGNoYXJ0U3RyaW5nKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVJbml0Q29tbWFuZCkge1xyXG5cdFx0XHQvLyBjb21tYW5kOiByZXNldCBnYW1lXHJcblx0XHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdFx0aWQ6ICdyZXNldC1nYW1lJyxcclxuXHRcdFx0XHRuYW1lOiAncmVzZXQgdGhlIGdhbWUnLFxyXG5cdFx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldEdhbWUoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb21tYW5kOiB1cGRhdGUgY2hhcnQgaW4gQXZhdGFyIFBhZ2VcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAndXBkYXRlLWNoYXJ0LWF2YXRhcnBhZ2UnLFxyXG5cdFx0XHRuYW1lOiAndXBkYXRlIGNoYXJ0IG9uIHByb2ZpbGUgcGFnZScsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgeyB2YXVsdCB9ID0gYXBwO1xyXG5cdFx0XHRcdGNvbnN0IGNoYXJ0U3RyaW5nID0gYXdhaXQgdGhpcy5jcmVhdGVDaGFydCh2YXVsdClcclxuXHRcdFx0XHRhd2FpdCByZXBsYWNlQ2hhcnRDb250ZW50KHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUsIGNoYXJ0U3RyaW5nKVxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cclxuXHRcdC8vIGNvbW1hbmQ6IHJhdGUgbm90ZSBtYXR1cml0eVxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdyYXRlLW5vdGUtbWF0dXJpdHknLFxyXG5cdFx0XHRuYW1lOiAnUmF0ZSBub3RlIG1hanVyaXR5JyxcclxuXHRcdFx0Y2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmNhbGN1bGF0ZU5vdGVNYWp1cml0eSgpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cclxuXHRcdC8vIGNvbW1hbmQ6IGNoYW5nZSBwcm9ncmVzc2l2ZSBzdW1tYXJpemF0aW9uIHN5bWJvbHNcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnY2hhbmdlLXByb2dyZXNzaXZlLWZvcm1hdHRpbmcnLFxyXG5cdFx0XHRuYW1lOiAndG9nZ2xlIHByb2dyZXNzaXZlIHN1bW1hcml6YXRpb24gZm9ybWF0dGluZycsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0YXdhaXQgcmVwbGFjZUZvcm1hdFN0cmluZ3ModGhpcy5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMiwgdGhpcy5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMyk7XHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHJlc2V0R2FtZSgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUtleXNGcm9tRnJvbnRtYXR0ZXIoKTtcclxuICAgICAgICB0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsID0gMTtcclxuICAgICAgICB0aGlzLnNldHRpbmdzLnN0YXR1c1BvaW50cyA9IDA7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy54cEZvck5leHRMZXZlbCA9IDEwMDBcclxuICAgICAgICB0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlclN0YXRlID0gZmFsc2VcclxuICAgICAgICB0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvciA9IDFcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cygwKVxyXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RhdHVzQmFyKHRoaXMuc3RhdHVzYmFyR2FtaWZpY2F0aW9uKVxyXG4gICAgICAgIG5ldyBNb2RhbEluZm9ybWF0aW9uYm94KHRoaXMuYXBwLCBgR2FtZSBpcyBub3cgcmVzZXRlZC4gUGxlYXNlIGRlbGV0ZSB0aGUgUHJvZmlsZSBQYWdlOiBcIiR7dGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZX0ubWRcIiBtYW51YWxseS5gKS5vcGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplR2FtZShzdGF0dXNiYXJHYW1pZmljYXRpb246IEhUTUxTcGFuRWxlbWVudCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncy5nYW1pZmljYXRpb25TdGFydERhdGUgPSBmb3JtYXQobmV3IERhdGUoKSwgJ3l5eXktTU0tZGQnKTtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcblxyXG5cdFx0Y29uc3Qge3ZhdWx0fSA9IHRoaXMuYXBwO1xyXG5cdFx0YXdhaXQgY3JlYXRlQXZhdGFyRmlsZSh0aGlzLmFwcCwgdGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSlcclxuXHRcdGNvbnN0IGNoYXJ0U3RyaW5nID0gYXdhaXQgdGhpcy5jcmVhdGVDaGFydCh2YXVsdClcclxuXHRcdGF3YWl0IHJlcGxhY2VDaGFydENvbnRlbnQodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgY2hhcnRTdHJpbmcpXHJcblx0XHRhd2FpdCB0aGlzLm9wZW5BdmF0YXJGaWxlKClcclxuXHRcdGNvbnN0IGZpbGVDb3VudE1hcDogVEZpbGVbXSA9IGF3YWl0IGdldEZpbGVNYXAodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MudGFnc0V4Y2x1ZGUsIHRoaXMuc2V0dGluZ3MuZm9sZGVyRXhjbHVkZSk7XHJcblx0XHRjb25zb2xlLmxvZyhgZmlsZUNvdW50TWFwIGxvYWRlZC4gTnVtYmVyIG9mIGZpbGVzOiAke2ZpbGVDb3VudE1hcC5sZW5ndGh9YCk7XHJcblxyXG5cdFx0bGV0IHBvaW50c1JlY2VpdmVkID0gMDsgLy8gdG8gaGF2ZSBvbmUgbWVzc2FnZSBhdCB0aGUgZW5kIGhvdyBtYW55IHBvaW50cyByZWNlaXZlZFxyXG5cclxuXHRcdGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZUNvdW50TWFwKSB7XHJcblx0XHRcdGNvbnN0IGZpbGUgPSBmaWxlTmFtZVxyXG5cdFx0XHRjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdFx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRcdGlmIChhY3RpdmVWaWV3ICYmIGFjdGl2ZVZpZXcuZmlsZSAmJiBhY3RpdmVWaWV3LmZpbGUucGF0aCA9PT0gZmlsZS5wYXRoKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKGBGaWxlICR7ZmlsZS5wYXRofSBpcyBjdXJyZW50bHkgb3Blbi4gU2tpcHBpbmcuYCk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9jb25zb2xlLmxvZyhgZmlsZU5hbWUuYmFzZW5hbWU6ICR7ZmlsZU5hbWUuYmFzZW5hbWV9YClcclxuXHRcdFx0Y29uc3QgZmlsZUxlbmd0aCA9IGNvdW50Q2hhcmFjdGVyc0luQWN0aXZlRmlsZShmaWxlQ29udGVudHMsIGZpbGVOYW1lLmJhc2VuYW1lKTtcclxuXHRcdFx0Y29uc3QgcmF0ZUZpbGVMZW5ndGggPSByYXRlTm90ZUxlbmd0aChmaWxlTGVuZ3RoKTtcclxuXHRcdFx0Y29uc3Qge1xyXG5cdFx0XHRcdGNoYXJDb3VudCxcclxuXHRcdFx0XHRoaWdobGlnaHRlZENvdW50LFxyXG5cdFx0XHRcdGJvbGRDb3VudFxyXG5cdFx0XHR9ID0gY291bnRMYXllcjJBbmRMYXllcjNDaGFyYWN0ZXJzKGZpbGVDb250ZW50cywgZmlsZU5hbWUuYmFzZW5hbWUsIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjIsIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMpO1xyXG5cdFx0XHRjb25zdCByYXRlUHJvZ3Jlc3NpdmVTdW06IG51bWJlciA9IHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb24oY2hhckNvdW50LCBoaWdobGlnaHRlZENvdW50LCBib2xkQ291bnQpO1xyXG5cdFx0XHRjb25zdCBmaWxlTmFtZVJhdGUgPSByYXRlTGVuZ3RoRmlsZW5hbWUoZmlsZS5uYW1lKTtcclxuXHRcdFx0Y29uc3QgaW5saW5rTnVtYmVyID0gY291bnRfaW5saW5rcyhmaWxlKTtcclxuXHRcdFx0Y29uc3QgaW5saW5rQ2xhc3MgPSByYXRlSW5saW5rcyhpbmxpbmtOdW1iZXIpLy8sIGZpbGVDb3VudE1hcC5zaXplKTtcclxuXHRcdFx0Y29uc3QgcmF0ZU91dCA9IHJhdGVPdXRsaW5rcyhnZXROdW1iZXJPZk91dGxpbmtzKGZpbGUpKTtcclxuXHRcdFx0Y29uc3Qgbm90ZU1hanVyaXR5ID0gcmF0ZUxldmVsT2ZNYXR1cml0eShyYXRlRmlsZUxlbmd0aCwgZmlsZU5hbWVSYXRlLCBpbmxpbmtDbGFzcywgcmF0ZU91dCwgcmF0ZVByb2dyZXNzaXZlU3VtKTtcclxuXHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyBmaWxlICR7ZmlsZU5hbWUuYmFzZW5hbWV9IGluIHBhdGggJHtmaWxlTmFtZS5wYXRofWApO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwgKGZyb250bWF0dGVyKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddLCBub3RlTWFqdXJpdHkpID49IDEpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddLCBub3RlTWFqdXJpdHkpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNOb3RlTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXVwiLCBub3RlTWFqdXJpdHkpKVxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICghKCdub3RlLW1hdHVyaXR5JyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgbm90ZU1hanVyaXR5KVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgbm90ZU1hanVyaXR5KSlcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSwgZmlsZU5hbWVSYXRlKSA+PSAxICYmICd0aXRsZS1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWyd0aXRsZS1jbGFzcyddLCBmaWxlTmFtZVJhdGUpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10sIGZpbGVOYW1lUmF0ZSkpXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCEoJ3RpdGxlLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBmaWxlTmFtZVJhdGUpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIGZpbGVOYW1lUmF0ZSkpXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKSA+PSAxKSB7XHJcblx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1sZW5ndGgtY2xhc3MnXSwgcmF0ZUZpbGVMZW5ndGgpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKSlcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoISgnbm90ZS1sZW5ndGgtY2xhc3MnIGluIGZyb250bWF0dGVyKSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIHJhdGVGaWxlTGVuZ3RoKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlRmlsZUxlbmd0aCkpXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddLCBpbmxpbmtDbGFzcykgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddLCBpbmxpbmtDbGFzcylcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnaW5saW5rLWNsYXNzJ10sIGlubGlua0NsYXNzKSlcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoISgnaW5saW5rLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBpbmxpbmtDbGFzcylcclxuXHRcdFx0XHRcdFx0dGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgaW5saW5rQ2xhc3MpKVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpID49IDEpIHtcclxuXHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXSwgcmF0ZU91dCkpXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCEoJ291dGxpbmstY2xhc3MnIGluIGZyb250bWF0dGVyKSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIHJhdGVPdXQpXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIHJhdGVPdXQpKVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSkgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSkpXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCEoJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknIGluIGZyb250bWF0dGVyKSkge1xyXG5cdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlUHJvZ3Jlc3NpdmVTdW0pKVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRcdFx0dGhpcy53cml0ZUZyb250bWF0dGVyKGZyb250bWF0dGVyLCBmaWxlTmFtZVJhdGUsIHJhdGVGaWxlTGVuZ3RoLCBpbmxpbmtDbGFzcywgcmF0ZU91dCwgcmF0ZVByb2dyZXNzaXZlU3VtLCBub3RlTWFqdXJpdHkpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0aWYgKGU/Lm5hbWUgPT09ICdZQU1MUGFyc2VFcnJvcicpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVcGRhdGUgbWFqdXJpdHlzIGZhaWxlZCBNYWxmb3JtZWQgZnJvbnRhbXR0ZXIgb24gdGhpcyBmaWxlIDogJHtmaWxlLnBhdGh9ICR7ZS5tZXNzYWdlfWA7XHJcblx0XHRcdFx0XHRuZXcgTm90aWNlKGVycm9yTWVzc2FnZSwgNDAwMCk7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAocG9pbnRzUmVjZWl2ZWQgPiAwKSB7XHJcblx0XHRcdGxldCBib29zdGVyRmFjdG9yID0gMTtcclxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyU3RhdGUpe1xyXG5cdFx0XHRcdGJvb3N0ZXJGYWN0b3IgPSB0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvcjtcclxuXHRcdFx0fVxyXG5cdFx0XHRuZXcgTm90aWNlKGAke3BvaW50c1JlY2VpdmVkICogYm9vc3RlckZhY3Rvcn0gUG9pbnRzIHJlY2VpdmVkYClcclxuXHRcdFx0Y29uc29sZS5sb2coYCR7cG9pbnRzUmVjZWl2ZWQgKiBib29zdGVyRmFjdG9yfSBQb2ludHMgcmVjZWl2ZWRgKVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluc2lkZSB5b3VyIGZ1bmN0aW9uIHdoZXJlIHlvdSB3YW50IHRvIGludHJvZHVjZSBhIGRlbGF5XHJcblx0XHRzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0Ly8gQ29kZSB0aGF0IHlvdSB3YW50IHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRlbGF5XHJcblx0XHRcdGNvbnN0IGluaXRCYWRnZTogQmFkZ2UgPSBnZXRCYWRnZUZvckluaXRMZXZlbCh0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsKTtcclxuXHRcdFx0bmV3IE5vdGljZShgWW91J3ZlIGVhcm5lZCB0aGUgXCIke2luaXRCYWRnZS5uYW1lfVwiIGJhZGdlLiAke2luaXRCYWRnZS5kZXNjcmlwdGlvbn1gKVxyXG5cdFx0XHRjb25zb2xlLmxvZyhgWW91IGVhcm5lZCAke2luaXRCYWRnZS5uYW1lfSAtICR7aW5pdEJhZGdlLmRlc2NyaXB0aW9ufWApXHJcblx0XHRcdGF3YWl0IHRoaXMuZ2l2ZUluaXRCYWRnZUluUHJvZmlsZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCBpbml0QmFkZ2UpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlbW92ZUJhZGdlc1doZW5Jbml0TGV2ZWxIaWdoZXIodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSwgdGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbClcclxuXHRcdFx0YXdhaXQgdGhpcy5ib29zdGVyRm9ySW5pdCgpXHJcblx0XHRcdGF3YWl0IHRoaXMudXBkYXRlU3RhdHVzQmFyKHN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuXHRcdH0sIDIwMDApOyAvLyAyMDAwIG1pbGxpc2Vjb25kcyA9IDIgc2Vjb25kc1xyXG5cclxuXHRcdG5ldyBNb2RhbEluZm9ybWF0aW9uYm94KHRoaXMuYXBwLCBgRmluYWxsaXplZCBnYW1pZmljYXRpb24gaW5pdGlhbGlzdGF0aW9uIVxcbkNvbmdyYXR1bGF0aW9uLCB5b3UgZWFybmVkICR7cG9pbnRzUmVjZWl2ZWR9IFBvaW50cyFcXG5cXG5DaGVjayB0aGUgUHJvZmlsZSBQYWdlOiBcIiR7dGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZX0ubWRcIlxcblxcbllvdSByZWNlaXZlZCBhbiBpbml0aWFsaXNhdGlvbiBCb29zdGVyIGFrdGl2IGZvciB5b3VyIGZpcnN0IGxldmVsIHVwcy4gR2FtZSBvbiFgKS5vcGVuKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHdyaXRlRnJvbnRtYXR0ZXIoZnJvbnRtYXR0ZXI6IGFueSwgZmlsZU5hbWVSYXRlOiBudW1iZXIsIHJhdGVGaWxlTGVuZ3RoOiBudW1iZXIsIGlubGlua0NsYXNzOiBudW1iZXIsIHJhdGVPdXQ6IG51bWJlciwgcmF0ZVByb2dyZXNzaXZlU3VtOiBudW1iZXIsIG5vdGVNYWp1cml0eTogbnVtYmVyKSB7XHJcblx0XHRmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSA9IHJhdGVEaXJlY3Rpb24oZnJvbnRtYXR0ZXJbJ3RpdGxlLWNsYXNzJ10sIGZpbGVOYW1lUmF0ZSlcclxuXHRcdGZyb250bWF0dGVyWydub3RlLWxlbmd0aC1jbGFzcyddID0gcmF0ZURpcmVjdGlvbihmcm9udG1hdHRlclsnbm90ZS1sZW5ndGgtY2xhc3MnXSwgcmF0ZUZpbGVMZW5ndGgpXHJcblx0XHRmcm9udG1hdHRlclsnaW5saW5rLWNsYXNzJ10gPSByYXRlRGlyZWN0aW9uKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpXHJcblx0XHRmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddID0gcmF0ZURpcmVjdGlvbihmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddLCByYXRlT3V0KVxyXG5cdFx0ZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSA9IHJhdGVEaXJlY3Rpb24oZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKVxyXG5cdFx0ZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSA9IHJhdGVEaXJlY3Rpb24oZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSwgbm90ZU1hanVyaXR5KVxyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygnb2JzaWRpYW4tcGttLWdhbWlmaWNhdGlvbiB1bmxvYWRlZCEnKTtcclxuXHJcblx0XHQvLyBDbGVhciB0aGUgdGltZXIgd2hlbiB0aGUgcGx1Z2luIGlzIHVubG9hZGVkXHJcblx0XHRpZiAodGhpcy50aW1lcklkICE9PSBudWxsKSB7XHJcblx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcklkKTtcclxuXHRcdFx0dGhpcy50aW1lcklkID0gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGNhbGN1bGF0ZU5vdGVNYWp1cml0eSgpe1xyXG5cdFx0Y29uc3QgZmlsZTogVEZpbGUgfCBudWxsPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG5cdFx0aWYgKGZpbGUgPT0gbnVsbCkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdnb3Qgbm8gZmlsZSwgcHJvcGFibHkgbm9uZSBpcyBhY3RpdmUnKVxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBkZXRlY3RJZk5vdGVJc0ZpcnN0VGltZVJhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gZ2V0IGZpbGUgY29udGVudCBsZW5ndGhcclxuXHRcdGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0Y29uc3QgZmlsZUNvbnRlbnRzID0gYWN0aXZlVmlldz8uZWRpdG9yLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBmaWxlTmFtZSA9IGFjdGl2ZVZpZXc/LmZpbGUuYmFzZW5hbWU7XHJcblxyXG5cdFx0bGV0IHJhdGVGaWxlTGVuZ3RoID0gMDtcclxuXHRcdGxldCBmaWxlTGVuZ3RoID0gMDtcclxuXHRcdGxldCByYXRlUHJvZ3Jlc3NpdmVTdW0gPSAwO1xyXG5cclxuXHRcdGlmIChmaWxlQ29udGVudHMgIT09IHVuZGVmaW5lZCAmJiBmaWxlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGZpbGVMZW5ndGggPSBjb3VudENoYXJhY3RlcnNJbkFjdGl2ZUZpbGUoZmlsZUNvbnRlbnRzLCBmaWxlTmFtZSk7XHJcblx0XHRcdHJhdGVGaWxlTGVuZ3RoID0gcmF0ZU5vdGVMZW5ndGgoZmlsZUxlbmd0aCk7XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiBmaWxlQ29udGVudHMgYW5kIGZpbGVOYW1lIGFyZSBub3QgbnVsbFxyXG5cdFx0XHRpZiAoZmlsZUNvbnRlbnRzICE9PSBudWxsICYmIGZpbGVOYW1lICE9PSBudWxsKSB7XHJcblx0XHRcdFx0Y29uc3QgeyBjaGFyQ291bnQsIGhpZ2hsaWdodGVkQ291bnQsIGJvbGRDb3VudCB9ID0gY291bnRMYXllcjJBbmRMYXllcjNDaGFyYWN0ZXJzKGZpbGVDb250ZW50cywgZmlsZU5hbWUsIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjIsIHRoaXMuc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMpO1xyXG5cdFx0XHRcdHJhdGVQcm9ncmVzc2l2ZVN1bSA9IHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb24oY2hhckNvdW50LCBoaWdobGlnaHRlZENvdW50LCBib2xkQ291bnQpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGZpbGVOYW1lUmF0ZSA9IDA7XHJcblx0XHRsZXQgaW5saW5rTnVtYmVyID0gMDtcclxuXHRcdGxldCBpbmxpbmtDbGFzcyA9IDA7XHJcblx0XHRsZXQgcmF0ZU91dCA9IDA7XHJcblxyXG5cdFx0aWYgKGZpbGUgIT09IG51bGwpIHtcclxuXHRcdFx0ZmlsZU5hbWVSYXRlID0gcmF0ZUxlbmd0aEZpbGVuYW1lKGZpbGUubmFtZSA/PyAnJyk7XHJcblx0XHRcdGlubGlua051bWJlciA9IGNvdW50X2lubGlua3MoZmlsZSk7XHJcblx0XHRcdGlubGlua0NsYXNzID0gcmF0ZUlubGlua3MoaW5saW5rTnVtYmVyKS8vLCBudW1BbGxGaWxlcylcclxuXHRcdFx0cmF0ZU91dCA9IHJhdGVPdXRsaW5rcyhnZXROdW1iZXJPZk91dGxpbmtzKGZpbGUpKTtcclxuXHJcblx0XHRcdGNvbnN0IG5vdGVNYWp1cml0eSA9IHJhdGVMZXZlbE9mTWF0dXJpdHkocmF0ZUZpbGVMZW5ndGgsIGZpbGVOYW1lUmF0ZSwgaW5saW5rQ2xhc3MsIHJhdGVPdXQsIHJhdGVQcm9ncmVzc2l2ZVN1bSk7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnByb2Nlc3NGcm9udE1hdHRlcihmaWxlLCAoZnJvbnRtYXR0ZXIpID0+IHtcclxuXHRcdFx0XHRcdGlmIChmcm9udG1hdHRlcikge1xyXG5cdFx0XHRcdFx0XHRsZXQgcG9pbnRzUmVjZWl2ZWQgPSAwOyAvLyB0byBoYXZlIG9uZSBtZXNzYWdlIGF0IHRoZSBlbmQgaG93IG1hbnkgcG9pbnRzIHJlY2VpdmVkXHJcblx0XHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J10sIG5vdGVNYWp1cml0eSkgPj0gMSl7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coYG5vdGUtbWF0dXJpdHkgPj0xYClcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNOb3RlTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1tYXR1cml0eSddLCBub3RlTWFqdXJpdHkpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcImZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J11cIiwgbm90ZU1hanVyaXR5KSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghKCdub3RlLW1hdHVyaXR5JyBpbiBmcm9udG1hdHRlcikpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c05vdGVNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBub3RlTWFqdXJpdHkpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTm90ZU1hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgbm90ZU1hanVyaXR5KSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbCk7XHJcblx0XHRcdFx0XHRcdFx0ZGV0ZWN0SWZOb3RlSXNGaXJzdFRpbWVSYXRlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWyd0aXRsZS1jbGFzcyddLCBmaWxlTmFtZVJhdGUpID49IDEgJiYgJ3RpdGxlLWNsYXNzJyBpbiBmcm9udG1hdHRlcil7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSwgZmlsZU5hbWVSYXRlKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsndGl0bGUtY2xhc3MnXSwgZmlsZU5hbWVSYXRlKSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghKCd0aXRsZS1jbGFzcycgaW4gZnJvbnRtYXR0ZXIpKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBmaWxlTmFtZVJhdGUpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBmaWxlTmFtZVJhdGUpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAocmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1sZW5ndGgtY2xhc3MnXSwgcmF0ZUZpbGVMZW5ndGgpID49IDEpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ10sIHJhdGVGaWxlTGVuZ3RoKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0xldmVsID0gdGhpcy5naXZlU3RhdHVzUG9pbnRzKHBvaW50c01hanVyaXR5ICogcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsnbm90ZS1sZW5ndGgtY2xhc3MnXSwgcmF0ZUZpbGVMZW5ndGgpKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9ZWxzZSBpZiAoISgnbm90ZS1sZW5ndGgtY2xhc3MnIGluIGZyb250bWF0dGVyKSl7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgcmF0ZUZpbGVMZW5ndGgpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlRmlsZUxlbmd0aCkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydpbmxpbmstY2xhc3MnXSwgaW5saW5rQ2xhc3MpID49IDEpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddLCBpbmxpbmtDbGFzcylcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ2lubGluay1jbGFzcyddLCBpbmxpbmtDbGFzcykpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1lbHNlIGlmICghKCdpbmxpbmstY2xhc3MnIGluIGZyb250bWF0dGVyKSl7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhcIjBcIiwgaW5saW5rQ2xhc3MpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCBpbmxpbmtDbGFzcykpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydvdXRsaW5rLWNsYXNzJ10sIHJhdGVPdXQpID49IDEpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXSwgcmF0ZU91dClcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ291dGxpbmstY2xhc3MnXSwgcmF0ZU91dCkpXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kZWNpc2lvbklmQmFkZ2UobmV3TGV2ZWwpXHJcblx0XHRcdFx0XHRcdH1lbHNlIGlmICghKCdvdXRsaW5rLWNsYXNzJyBpbiBmcm9udG1hdHRlcikpe1xyXG5cdFx0XHRcdFx0XHRcdHBvaW50c1JlY2VpdmVkICs9IHBvaW50c01hanVyaXR5KnJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoXCIwXCIsIHJhdGVPdXQpXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlT3V0KSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKSA+PSAxKXtcclxuXHRcdFx0XHRcdFx0XHRwb2ludHNSZWNlaXZlZCArPSBwb2ludHNNYWp1cml0eSpyYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKGZyb250bWF0dGVyWydwcm9ncmVzc2l2ZS1zdW1tYXJpemF0aW9uLW1hdHVyaXR5J10sIHJhdGVQcm9ncmVzc2l2ZVN1bSlcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdMZXZlbCA9IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNNYWp1cml0eSAqIHJhdGVEaXJlY3Rpb25Gb3JTdGF0dXNQb2ludHMoZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXSwgcmF0ZVByb2dyZXNzaXZlU3VtKSlcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbClcclxuXHRcdFx0XHRcdFx0fWVsc2UgaWYgKCEoJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknIGluIGZyb250bWF0dGVyKSl7XHJcblx0XHRcdFx0XHRcdFx0cG9pbnRzUmVjZWl2ZWQgKz0gcG9pbnRzTWFqdXJpdHkqcmF0ZURpcmVjdGlvbkZvclN0YXR1c1BvaW50cyhmcm9udG1hdHRlclsncHJvZ3Jlc3NpdmUtc3VtbWFyaXphdGlvbi1tYXR1cml0eSddLCByYXRlUHJvZ3Jlc3NpdmVTdW0pXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3TGV2ZWwgPSB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzTWFqdXJpdHkgKiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKFwiMFwiLCByYXRlUHJvZ3Jlc3NpdmVTdW0pKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGVjaXNpb25JZkJhZGdlKG5ld0xldmVsKVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBwb2ludHNSZWNlaXZlZDogJHtwb2ludHNSZWNlaXZlZH1gKVxyXG5cdFx0XHRcdFx0XHRpZiAocG9pbnRzUmVjZWl2ZWQgPiAwKXtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlUG9pbnRzID0gZ2V0UmFuZG9tTWVzc2FnZVBvaW50cyhwb2ludHNSZWNlaXZlZCAqICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvciArIHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlcikpXHJcblx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShtZXNzYWdlUG9pbnRzKVxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKG1lc3NhZ2VQb2ludHMpXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRoaXMud3JpdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgZmlsZU5hbWVSYXRlLCByYXRlRmlsZUxlbmd0aCwgaW5saW5rQ2xhc3MsIHJhdGVPdXQsIHJhdGVQcm9ncmVzc2l2ZVN1bSwgbm90ZU1hanVyaXR5KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdGlmIChlPy5uYW1lID09PSAnWUFNTFBhcnNlRXJyb3InKSB7XHJcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBgVXBkYXRlIG1hanVyaXR5cyBmYWlsZWQgTWFsZm9ybWVkIGZyb250YW10dGVyIG9uIHRoaXMgZmlsZSA6ICR7ZmlsZS5wYXRofSAke2UubWVzc2FnZX1gO1xyXG5cdFx0XHRcdFx0bmV3IE5vdGljZShlcnJvck1lc3NhZ2UsIDQwMDApO1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRuZXcgTm90aWNlKCdub3RlIG1hanVyaXR5IHVwZGF0ZWQhJyk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdub3RlIG1hanVyaXR5IHVwZGF0ZWQhJylcclxuXHRcdFx0Ly9hd2FpdCB0aGlzLnVwZGF0ZUF2YXRhclBhZ2UodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSlcclxuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVTdGF0dXNCYXIodGhpcy5zdGF0dXNiYXJHYW1pZmljYXRpb24pXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdmaWxlIHdhcyBub3QgZm91bmQgdG8gY2FsY3VsYXRlIG1hanVyaXRpZXMuIE1ha2Ugc3VyZSBvbmUgaXMgYWN0aXZlLicpXHJcblx0XHR9XHJcblx0XHRpZiAoZGV0ZWN0SWZOb3RlSXNGaXJzdFRpbWVSYXRlZCl7XHJcblx0XHRcdGF3YWl0IHRoaXMuaW5jcmVhc2VEYWlseUNyZWF0ZWROb3RlQ291bnQoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5pbmNyZWFzZVdlZWtseUNyZWF0ZWROb3RlQ291bnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyByZXNldERhaWx5R29hbHMoKXtcclxuXHRcdGxldCByZXNldCA9IGZhbHNlO1xyXG5cdFx0aWYoIWlzU2FtZURheSh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3MuZGFpbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSl7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3MuZGFpbHlOb3RlQ3JlYXRpb25UYXNrID0gMDtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy5kYWlseU5vdGVDcmVhdGlvbkRhdGUgPSB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdERC5NTS5ZWVlZJylcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYGRhaWx5IENoYWxsZW5nZSByZXNldGVkYClcclxuXHRcdFx0cmVzZXQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYoIWlzT25lRGF5QmVmb3JlKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSAmJiAhaXNTYW1lRGF5KHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSl7XHJcblx0XHRcdGNvbnN0IGRheXNQYXNzZWQgPSB3aW5kb3cubW9tZW50KCkuZGlmZih3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSwgJ0RELk1NLllZWVknKSwgJ2RheXMnKSAtIDE7IC8vdG9kYXkgaXMgc3RpbGwgYSBjaGFuY2UuIFxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgPSAwO1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUgPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLmZvcm1hdCgnREQuTU0uWVlZWScpXHJcblx0XHRcdHRoaXMuZGVjcmVhc2VTdHJlYWtib29zdGVyKGRheXNQYXNzZWQpXHJcblx0XHRcdGNvbnNvbGUubG9nKGAke2RheXNQYXNzZWR9IGRheXMgcGFzc2VkYClcclxuXHRcdFx0Ly90aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXJEYXRlID0gd2luZG93Lm1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXknKS5mb3JtYXQoJ0RELk1NLllZWVknKVxyXG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c0Jhcih0aGlzLnN0YXR1c2JhckdhbWlmaWNhdGlvbilcclxuXHRcdFx0Y29uc29sZS5sb2coYHdlZWtseSBDaGFsbGVuZ2UgcmVzZXRlZGApXHJcblx0XHRcdHJlc2V0ID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmKGlzT25lRGF5QmVmb3JlKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSAmJiB0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgPT0gNyl7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uVGFzayA9IDA7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5JykuZm9ybWF0KCdERC5NTS5ZWVlZJylcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0cmVzZXQgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHJlc2V0KXtcclxuXHRcdFx0Ly90aGlzLmRhaWx5Q2hhbGxlbmdlVXBkYXRlUHJvZmlsZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCAwKVxyXG5cdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUF2YXRhclBhZ2UodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZGVhdGl2YXRlIGJvb3N0ZXJzXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3MgPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlUGVycGV0dWFsUHJvZ3Jlc3MsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgncGVycGV0dWFsUHJvZ3Jlc3MnKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3MnLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiUGVycGV0dWFsIFByb2dyZXNzXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXMgPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlU3RyYXRlZ2ljU3luYXBzZXMsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgnc3RyYXRlZ2ljU3luYXBzZXMnKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXMnLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiU3RyYXRlZ2ljIFN5bmFwc2VzXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yTGlua2Vyc0xvZGUgPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlTGlua2Vyc0xvZGUsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgnbGlua2Vyc0xvZGUnKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yTGlua2Vyc0xvZGUnLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiTGlua2VycyBMb2RlXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbiA9PSB0cnVlICYmIGlzTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3MuYm9vc3RlckRhdGVSZWN1cnNpdmVSZWZsZWN0aW9uLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ3JlY3Vyc2l2ZVJlZmxlY3Rpb24nKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbicsZmFsc2UpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXCJSZWN1cnNpdmUgUmVmbGVjdGlvblwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclN5bmFwdGljU3VyZ2UgPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlU3luYXB0aWNTdXJnZSwgJ1lZWVktTU0tREQgSEg6bW06c3MnKSxnZXRCb29zdGVyUnVuVGltZUZyb21WYXJOYW1lKCdzeW5hcHRpY1N1cmdlJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvclN5bmFwdGljU3VyZ2UnLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiU3luYXB0aWMgU3VyZ2VcIiBoYXMgZW5kZWQuJylcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZVRpdGxlVGl0YW4sICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgndGl0bGVUaXRhbicpKSl7XHJcblx0XHRcdHRoaXMuc2V0U2V0dGluZ0Jvb2xlYW4oJ2Jvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIlRpdGxlIFRpdGFuXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20gPT0gdHJ1ZSAmJiBpc01pbnV0ZXNQYXNzZWQod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLmJvb3N0ZXJEYXRlUHJlY2lzaW9uUHJpc20sICdZWVlZLU1NLUREIEhIOm1tOnNzJyksZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZSgncHJlY2lzaW9uUHJpc20nKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20nLGZhbHNlKTtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1wiUHJlY2lzaW9uIFByaXNtXCIgaGFzIGVuZGVkLicpXHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueSA9PSB0cnVlICYmIGlzTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KHRoaXMuc2V0dGluZ3MuYm9vc3RlckRhdGVIeXBlcmxpbmtIYXJtb255LCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ2h5cGVybGlua0hhcm1vbnknKSkpe1xyXG5cdFx0XHR0aGlzLnNldFNldHRpbmdCb29sZWFuKCdib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueScsZmFsc2UpO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXCJIeXBlcmxpbmsgSGFybW9ueVwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhID09IHRydWUgJiYgaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy5ib29zdGVyRGF0ZUVwaGVtZXJhbEV1cGhvcmlhLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLGdldEJvb3N0ZXJSdW5UaW1lRnJvbVZhck5hbWUoJ2VwaGVtZXJhbEV1cGhvcmlhJykpKXtcclxuXHRcdFx0dGhpcy5zZXRTZXR0aW5nQm9vbGVhbignYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhJyxmYWxzZSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdcIkVwaGVtZXJhbCBFdXBob3JpYVwiIGhhcyBlbmRlZC4nKVxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBpbmNyZWFzZURhaWx5Q3JlYXRlZE5vdGVDb3VudCgpe1xyXG5cdFx0bGV0IG5ld0RhaWx5Tm90ZUNyZWF0aW9uVGFzayA9IHRoaXMuc2V0dGluZ3MuZGFpbHlOb3RlQ3JlYXRpb25UYXNrO1xyXG4gICAgICAgIGlmIChuZXdEYWlseU5vdGVDcmVhdGlvblRhc2sgPCAyKXtcclxuXHRcdFx0bmV3RGFpbHlOb3RlQ3JlYXRpb25UYXNrICsrO1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmRhaWx5Tm90ZUNyZWF0aW9uVGFzayA9IG5ld0RhaWx5Tm90ZUNyZWF0aW9uVGFzaztcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHJcblx0XHRcdGlmKG5ld0RhaWx5Tm90ZUNyZWF0aW9uVGFzayA9PSAxKXtcclxuXHRcdFx0XHQvLyB1cGRhdGUgQXZhdGFyIFBhZ2VcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUF2YXRhclBhZ2UodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coYCR7bmV3RGFpbHlOb3RlQ3JlYXRpb25UYXNrfS8yIE5vdGVzIGNyZWF0ZWQgdG9kYXkuYClcclxuXHRcdFx0fSBlbHNlIGlmIChuZXdEYWlseU5vdGVDcmVhdGlvblRhc2sgPT0gMikge1xyXG5cdFx0XHRcdHRoaXMuaW5jcmVhc2VTdHJlYWtib29zdGVyKHN0cmVha2Jvb3N0ZXJJbmNyZWFzZURhaWx5KVxyXG5cdFx0XHRcdC8vdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0RELk1NLllZWVknKTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMudXBkYXRlU3RhdHVzQmFyKHRoaXMuc3RhdHVzYmFyR2FtaWZpY2F0aW9uKVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2l2ZVN0YXR1c1BvaW50cyhwb2ludHNGb3JEYWlseUNoYWxsZW5nZSlcclxuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gZ2V0UmFuZG9tTWVzc2FnZVR3b05vdGVDaGFsbGVuZ2UocG9pbnRzRm9yRGFpbHlDaGFsbGVuZ2UgKiAodGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgKyB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIpKTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhgZGFpbHkgQ2hhbGxlbmdlIHJlYWNoZWQhICR7bmV3RGFpbHlOb3RlQ3JlYXRpb25UYXNrfS8yIGNyZWF0ZWQuYClcclxuXHRcdFx0XHRuZXcgTm90aWNlKG1lc3NhZ2UpXHJcblx0XHRcdFx0Y29uc29sZS5sb2cobWVzc2FnZSlcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBub3RoaW5nIGVsc2UgdG8gZG8gaGVyZVxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGAke25ld0RhaWx5Tm90ZUNyZWF0aW9uVGFza30vMiBOb3RlcyBjcmVhdGVkIHRvZGF5LmApXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGluY3JlYXNlV2Vla2x5Q3JlYXRlZE5vdGVDb3VudCgpe1xyXG5cdFx0aWYoaXNPbmVEYXlCZWZvcmUod2luZG93Lm1vbWVudCh0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvbkRhdGUsICdERC5NTS5ZWVlZJykpKXtcclxuXHRcdFx0YXdhaXQgdGhpcy5jaGVja0ZvcldlZWtseU5vdGVDaGFsbGVuZ2VCZWxvdzcoKTtcclxuXHRcdH0gZWxzZSBpZiAoaXNTYW1lRGF5KHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpKSl7XHJcblx0XHRcdC8vIGRvIG5vdGhpbmdcclxuXHRcdFx0Y29uc29sZS5sb2coYGRhaWx5IG5vdGUgY3JlYXRpb24gd2FzIHJhdGVkIGFscmVhZHkgdG9kYXkuYClcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0RELk1NLllZWVknKVxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgPSAxO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyBjaGVja0ZvcldlZWtseU5vdGVDaGFsbGVuZ2VCZWxvdzcoKSB7XHJcblx0XHRsZXQgY3VycmVudFdlZWtseUNyZWF0ZWROb3RlcyA9IHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uVGFzaztcclxuXHRcdGlmIChjdXJyZW50V2Vla2x5Q3JlYXRlZE5vdGVzIDwgNykge1xyXG5cdFx0XHRjdXJyZW50V2Vla2x5Q3JlYXRlZE5vdGVzKys7XHJcblx0XHRcdHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uRGF0ZSA9IHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0RELk1NLllZWVknKVxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgPSBjdXJyZW50V2Vla2x5Q3JlYXRlZE5vdGVzO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cclxuXHRcdFx0YXdhaXQgdGhpcy5jaGVja0ZvcldlZWtseU5vdGVDaGFsbGVuZ2VFdmFsdWF0aW9uKGN1cnJlbnRXZWVrbHlDcmVhdGVkTm90ZXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyBjaGVja0ZvcldlZWtseU5vdGVDaGFsbGVuZ2VFdmFsdWF0aW9uKG5ld1dlZWtseU5vdGVDcmVhdGlvblRhc2s6IG51bWJlcikge1xyXG5cdFx0aWYgKG5ld1dlZWtseU5vdGVDcmVhdGlvblRhc2sgPD0gNikge1xyXG5cdFx0XHQvLyB1cGRhdGUgQXZhdGFyIFBhZ2VcclxuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVBdmF0YXJQYWdlKHRoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgJHtuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrfS83IE5vdGVzIGNyZWF0ZWQgaW4gYSBjaGFpbi5gKVxyXG5cdFx0fSBlbHNlIGlmIChuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrID09IDcpIHtcclxuXHRcdFx0dGhpcy5pbmNyZWFzZVN0cmVha2Jvb3N0ZXIoc3RyZWFrYm9vc3RlckluY3JlYXNlV2Vla2x5KTtcclxuXHRcdFx0Ly90aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXJEYXRlID0gd2luZG93Lm1vbWVudCgpLmZvcm1hdCgnREQuTU0uWVlZWScpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmdpdmVTdGF0dXNQb2ludHMocG9pbnRzRm9yV2Vla2x5Q2hhbGxlbmdlKVxyXG5cdFx0XHRjb25zb2xlLmxvZyhgV2Vla2x5IENoYWxsZW5nZSByZWFjaGVkISAke25ld1dlZWtseU5vdGVDcmVhdGlvblRhc2t9LzcgY3JlYXRlZCBpbiBhIGNoYWluLmApXHJcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBnZXRSYW5kb21NZXNzYWdlV2Vla2x5Q2hhbGxlbmdlKHBvaW50c0ZvcldlZWtseUNoYWxsZW5nZSAqICh0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlckZhY3RvciArIHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlcikpO1xyXG5cdFx0XHRuZXcgTm90aWNlKG1lc3NhZ2UpXHJcblx0XHRcdGNvbnNvbGUubG9nKG1lc3NhZ2UpXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBub3RoaW5nIGVsc2UgdG8gZG8gaGVyZVxyXG5cdFx0XHRjb25zb2xlLmxvZyhgJHtuZXdXZWVrbHlOb3RlQ3JlYXRpb25UYXNrfS83IE5vdGVzIGNyZWF0ZWQgaW4gYSBjaGFpbi5gKVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgdXBkYXRlU3RhdHVzQmFyKHN0YXR1c2JhcjogSFRNTFNwYW5FbGVtZW50KXtcclxuXHRcdGNvbnN0IGN1cnJlbnRMZXZlbCA9IGdldExldmVsRm9yUG9pbnRzKHRoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzKVxyXG5cdFx0Y29uc3QgcHJvZ3Jlc3NiYXJQZXJjZW50ID0gKHRoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzIC0gY3VycmVudExldmVsLnBvaW50cykvKGN1cnJlbnRMZXZlbC5wb2ludHNOZXh0IC0gY3VycmVudExldmVsLnBvaW50cykqMTAwO1xyXG5cdFx0Y29uc3QgY2hhck51bVByb2dyZXNzYmFyID0gMTA7XHJcblx0XHRjb25zdCBiYXJMZW5ndGggPSBNYXRoLnJvdW5kKHByb2dyZXNzYmFyUGVyY2VudCAvIGNoYXJOdW1Qcm9ncmVzc2JhcilcclxuXHRcdGNvbnN0IGJvb3N0ZXJGYWN0b3IgPSB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXJcclxuXHRcdHN0YXR1c2Jhci5zZXRUZXh0KGBcdUQ4M0NcdURGQjJ8bHZsOiAke3RoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWx9IHwgJHt0aGlzLmNyZWF0ZVByb2dyZXNzYmFyKGNoYXJOdW1Qcm9ncmVzc2JhciwgYmFyTGVuZ3RoKX18XHVEODNEXHVERTgwJHtib29zdGVyRmFjdG9yfSR7dGhpcy5yYXRlQm9vc3RlckRpcmVjdGlvbigpfWApXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHJhdGVCb29zdGVyRGlyZWN0aW9uKCl7XHJcblx0XHRsZXQgZGlyZWN0aW9uID0gJ1x1MkIwNlx1RkUwRidcclxuXHRcdC8qY29uc3Qgb25lRGF5QmVmb3JlQ3VycmVudCA9IHdpbmRvdy5tb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5Jyk7IC8vIENhbGN1bGF0ZSBvbmUgZGF5IGJlZm9yZSBjdXJyZW50IGRhdGVcclxuXHRcdGlmKHdpbmRvdy5tb21lbnQodGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25EYXRlLCAnREQuTU0uWVlZWScpLmlzU2FtZShvbmVEYXlCZWZvcmVDdXJyZW50LCAnZGF5Jykpe1xyXG5cdFx0XHRkaXJlY3Rpb24gPSAnXHUyQjA2XHVGRTBGJ1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGlyZWN0aW9uID0gJ1x1MkIwN1x1RkUwRidcclxuXHRcdH0qL1xyXG5cdFx0aWYodGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSl7XHJcblx0XHRcdGRpcmVjdGlvbiA9ICdcdTJCMDZcdUZFMEYnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGlyZWN0aW9uID0gJ1x1MkIwN1x1RkUwRic7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZGlyZWN0aW9uXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZVByb2dyZXNzYmFyKGNoYXJOdW1Qcm9ncmVzc2JhcjogbnVtYmVyLCBiYXJMZW5ndGg6IG51bWJlcikge1xyXG5cdFx0bGV0IHByb2dyZXNzYmFyID0gJydcclxuXHRcdGZvciAobGV0IGkgPSAxOyBpIDw9IGNoYXJOdW1Qcm9ncmVzc2JhcjsgaSsrKSB7XHJcblx0XHRcdGlmIChpIDw9IGJhckxlbmd0aCkge1xyXG5cdFx0XHRcdHByb2dyZXNzYmFyICs9ICc9J1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHByb2dyZXNzYmFyICs9ICctJ1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcHJvZ3Jlc3NiYXI7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdFx0Y29uc29sZS5sb2coJ2xvYWRTZXR0aW5ncygpJylcclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdH1cclxuXHJcblxyXG5cdGFzeW5jIGdpdmVTdGF0dXNQb2ludHMocG9pbnRzVG9BZGQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj57XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvciA9IDE7XHJcblx0XHRsZXQgc3RyZWFrYm9vc3RlciA9IHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlcjtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3MgPSAwO1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcyA9IDA7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvckxpbmtlcnNMb2RlID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbiA9IDA7XHJcblx0XHRsZXQgYm9vc3RlckZhY3RvclN5bmFwdGljU3VyZ2UgPSAwO1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yUHJlY2lzaW9uUHJpc20gPSAwO1xyXG5cdFx0bGV0IGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255ID0gMDtcclxuXHRcdGxldCBib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWEgPSAwO1xyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyU3RhdGUpe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yID0gdGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3I7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3Mpe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3MgPSAzO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzKXtcclxuXHRcdFx0Ym9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzID0gMztcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZSl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZSA9IDEwO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24pe1xyXG5cdFx0XHRib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbiA9IDU7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yU3luYXB0aWNTdXJnZSl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlID0gMjA7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9yVGl0bGVUaXRhbil7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuID0gNDtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbSl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbSA9IDQ7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5ib29zdGVyRmFjdG9ySHlwZXJsaW5rSGFybW9ueSl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255ID0gNTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYSl7XHJcblx0XHRcdGJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYSA9IDgwO1xyXG5cdFx0fVxyXG5cdFx0XHJcblxyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdGF0dXNQb2ludHMgPSBwb2ludHNUb0FkZCAqIChib29zdGVyRmFjdG9yICsgc3RyZWFrYm9vc3RlciArIGJvb3N0ZXJGYWN0b3JQZXJwZXR1YWxQcm9ncmVzcyArIGJvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcyArIGJvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZSArIGJvb3N0ZXJGYWN0b3JSZWN1cnNpdmVSZWZsZWN0aW9uICsgYm9vc3RlckZhY3RvclN5bmFwdGljU3VyZ2UgKyBib29zdGVyRmFjdG9yVGl0bGVUaXRhbiArIGJvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbSArIGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255ICsgYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhICkgKyB0aGlzLnNldHRpbmdzLnN0YXR1c1BvaW50c1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnVwZGF0ZUF2YXRhclBhZ2UodGhpcy5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSlcclxuXHR9XHJcblxyXG5cdGFzeW5jIGluY3JlYXNlU3RyZWFrYm9vc3RlcihpbmNyZWFzZVZhbHVlOm51bWJlcil7XHJcblx0XHRsZXQgbmV3Qm9vc3RlckZha2ZvciA9IHBhcnNlRmxvYXQoKHRoaXMuc2V0dGluZ3Muc3RyZWFrYm9vc3RlciArIGluY3JlYXNlVmFsdWUpLnRvRml4ZWQoc3RyZWFrYm9vc3RlckluY3JlYXNlV2Vla2x5KSk7XHJcblx0XHRpZihuZXdCb29zdGVyRmFrZm9yID4gODApe1xyXG5cdFx0XHRuZXdCb29zdGVyRmFrZm9yID0gODA7XHJcblx0XHR9XHJcblx0XHR0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIgPSBuZXdCb29zdGVyRmFrZm9yO1xyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSA9IHRydWU7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpXHJcblx0XHRjb25zb2xlLmxvZyhgc3RyZWFrYm9vc3RlcjogJHt0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXJ9YClcclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBkZWNyZWFzZVN0cmVha2Jvb3N0ZXIoZGVjcmVhc2VWYWx1ZTpudW1iZXIpe1xyXG5cdFx0bGV0IG5ld0Jvb3N0ZXJGYWtmb3IgPSBwYXJzZUZsb2F0KCh0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIgLSBkZWNyZWFzZVZhbHVlKS50b0ZpeGVkKHN0cmVha2Jvb3N0ZXJEZWNyZWFzZSkpXHJcblx0XHR0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIgPSBuZXdCb29zdGVyRmFrZm9yXHJcblx0XHRpZiAobmV3Qm9vc3RlckZha2ZvciA8IDApe1xyXG5cdFx0XHRuZXdCb29zdGVyRmFrZm9yID0gMFxyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyID0gbmV3Qm9vc3RlckZha2ZvclxyXG5cdFx0dGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyRGF0ZSA9IGZhbHNlO1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKVxyXG5cdH1cclxuXHJcblxyXG5cdGFzeW5jIHVwZGF0ZUF2YXRhclBhZ2UoYXZhdGFyUGFnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj57XHJcblx0XHRjb25zdCBleGlzdGluZ0ZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke2F2YXRhclBhZ2VOYW1lfS5tZGApO1xyXG5cdFx0aWYgKGV4aXN0aW5nRmlsZSA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGZpbGUgPSBleGlzdGluZ0ZpbGUgYXMgVEZpbGU7XHJcblxyXG5cdFx0Ly9jb25zb2xlLmxvZyhgY3VycmVudCBzdGF0dXNQb2ludHM6ICR7dGhpcy5zZXR0aW5ncy5zdGF0dXNQb2ludHN9YClcclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdGxldCByZWZlcmVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTM6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IGVuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgc3RhcnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IGVuZDI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0MjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kMzogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgc3RhcnQzOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBlbmQ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBzdGFydDQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTtcclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiXmxldmVsQW5kUG9pbnRzXCIpIHtcclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UgPSBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAobGluZSA9PT0gXCJeZGFpbHlOb3Rlc0NoYWxsZW5nZVwiKSB7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZTIgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdHJlZmVyZW5jZTIgPSBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAobGluZSA9PT0gXCJed2Vla2x5Tm90ZXNDaGFsbGVuZ2VcIikge1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UzID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UzID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiXmJvb3N0ZXJGYWN0b3JcIikge1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2U0ID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2U0ID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIHJlYWQgY3VycmVudCBQb2ludHMgZnJvbSBzZXR0aW5nc1xyXG5cdFx0Y29uc3QgbmV3UG9pbnRzID0gdGhpcy5zZXR0aW5ncy5zdGF0dXNQb2ludHNcclxuXHJcblx0XHRjb25zdCBsZXZlbCA9IGdldExldmVsRm9yUG9pbnRzKG5ld1BvaW50cyk7XHJcblx0XHRsZXQgbmV4dExldmVsQXQgPSB0aGlzLnNldHRpbmdzLnhwRm9yTmV4dExldmVsO1xyXG5cdFx0bGV0IHJlY2VpdmVCYWRnZSA9IGZhbHNlXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbCA8IGxldmVsLmxldmVsKXtcclxuXHRcdFx0Ly8gTGV2ZWwgVXAgYXJjaGl2ZWRcclxuXHRcdFx0bmV3IE5vdGljZShgV2l0aCAke25ld1BvaW50c30gcG9pbnRzLCB0aGUgY3VycmVudCBsZXZlbCBpcyAke2xldmVsLmxldmVsfS5gKVxyXG5cdFx0XHQvLyBjaGVjayBmaXJzdCBpZiB0aGlzIG1lYW5zIGEgbmV3IGJhZGdlIGJlZm9yZSBpdCBnZXRzIG92ZXJ3cml0dGVuXHJcblx0XHRcdHJlY2VpdmVCYWRnZSA9IGNoZWNrSWZSZWNlaXZlQUJhZGdlKHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwsIGxldmVsLmxldmVsKVxyXG5cdFx0XHR0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsID0gbGV2ZWwubGV2ZWw7XHJcblx0XHRcdG5leHRMZXZlbEF0ID0gbGV2ZWwucG9pbnRzTmV4dDtcclxuXHRcdFx0dGhpcy5zZXR0aW5ncy54cEZvck5leHRMZXZlbCA9IGxldmVsLnBvaW50c05leHQ7XHJcblx0XHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwcm9ncmVzc0JhckVuZCA9IG5leHRMZXZlbEF0IC0gbmV3UG9pbnRzO1xyXG5cdFx0Y29uc3QgbmV3UG9pbnRzU3RyaW5nID0gJ3wgKipMZXZlbCoqICB8ICoqJyArIGxldmVsLmxldmVsICsgJyoqIHxcXG58IFBvaW50cyB8ICcgKyBuZXdQb2ludHMgKyAnICAgIHxcXG5ebGV2ZWxBbmRQb2ludHNcXG5gYGBjaGFydFxcbnR5cGU6IGJhclxcbmxhYmVsczogW0V4cHJpcmllbmNlXVxcbnNlcmllczpcXG4gIC0gdGl0bGU6IHBvaW50cyByZWFjaGVkXFxuICAgIGRhdGE6IFsnICsgbmV3UG9pbnRzICsgJ11cXG4gIC0gdGl0bGU6IHBvaW50cyB0byBlYXJuIHRvIGxldmVsIHVwXFxuICAgIGRhdGE6IFsnICsgcHJvZ3Jlc3NCYXJFbmQgKyAnXVxcbnhNaW46ICcgKyBsZXZlbC5wb2ludHMgKyAnXFxueE1heDogJyArIGxldmVsLnBvaW50c05leHQgKyAnXFxudGVuc2lvbjogMC4yXFxud2lkdGg6IDQwJVxcbmxhYmVsQ29sb3JzOiBmYWxzZVxcbmZpbGw6IGZhbHNlXFxuYmVnaW5BdFplcm86IGZhbHNlXFxuYmVzdEZpdDogZmFsc2VcXG5iZXN0Rml0VGl0bGU6IHVuZGVmaW5lZFxcbmJlc3RGaXROdW1iZXI6IDBcXG5zdGFja2VkOiB0cnVlXFxuaW5kZXhBeGlzOiB5XFxueFRpdGxlOiBcInByb2dyZXNzXCJcXG5sZWdlbmQ6IGZhbHNlXFxuYGBgJ1xyXG5cdFx0Y29uc3QgZGFpbHlDaGFsbGVuZ2UgPSAnfCAqKmRhaWx5IE5vdGVzKiogfCAqJyArIHBvaW50c0ZvckRhaWx5Q2hhbGxlbmdlICogKHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yICsgdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyKSArICdFUCogfCAqKicgKyB0aGlzLnNldHRpbmdzLmRhaWx5Tm90ZUNyZWF0aW9uVGFzayArICcvMioqICAgfCc7XHJcblx0XHRjb25zdCBkYXlzTGVmdEluV2Vla2x5Q2hhaW4gOiBudW1iZXIgPSA3IC0gdGhpcy5zZXR0aW5ncy53ZWVrbHlOb3RlQ3JlYXRpb25UYXNrO1xyXG5cdFx0Y29uc3Qgd2Vla2x5Q2hhbGxlbmdlID0gJ3wgKip3ZWVrbHkgTm90ZXMqKiB8IConICsgcG9pbnRzRm9yV2Vla2x5Q2hhbGxlbmdlICogKHRoaXMuc2V0dGluZ3MuYmFkZ2VCb29zdGVyRmFjdG9yICsgdGhpcy5zZXR0aW5ncy5zdHJlYWtib29zdGVyKSArICdFUCogICAgIHwgICoqJyArIHRoaXMuc2V0dGluZ3Mud2Vla2x5Tm90ZUNyZWF0aW9uVGFzayArICcvNyoqICAgfFxcbl53ZWVrbHlOb3Rlc0NoYWxsZW5nZVxcbmBgYGNoYXJ0XFxudHlwZTogYmFyXFxubGFiZWxzOiBbZGF5cyBkb25lIGluIGEgcm93XVxcbnNlcmllczpcXG4gIC0gdGl0bGU6IGRheXMgdG8gZG8gaW4gYSByb3dcXG4gICAgZGF0YTogWycgKyB0aGlzLnNldHRpbmdzLndlZWtseU5vdGVDcmVhdGlvblRhc2sgKyAnXVxcbiAgLSB0aXRsZTogcG9pbnRzIHRvIGVhcm4gdG8gbGV2ZWwgdXBcXG4gICAgZGF0YTogWycgKyBkYXlzTGVmdEluV2Vla2x5Q2hhaW4gKyAnXVxcbnhNaW46IDBcXG54TWF4OiA3XFxudGVuc2lvbjogMC4yXFxud2lkdGg6IDQwJVxcbmxhYmVsQ29sb3JzOiBmYWxzZVxcbmZpbGw6IGZhbHNlXFxuYmVnaW5BdFplcm86IGZhbHNlXFxuYmVzdEZpdDogZmFsc2VcXG5iZXN0Rml0VGl0bGU6IHVuZGVmaW5lZFxcbmJlc3RGaXROdW1iZXI6IDBcXG5zdGFja2VkOiB0cnVlXFxuaW5kZXhBeGlzOiB5XFxueFRpdGxlOiBcInByb2dyZXNzXCJcXG5sZWdlbmQ6IGZhbHNlXFxuYGBgJztcclxuXHRcdGNvbnN0IGJvb3N0ZXJGYWN0b3IgPSAnfCAqKmJvb3N0ZXIgZmFjdG9yKiogfCAqKicgKyB0aGlzLnNldHRpbmdzLnN0cmVha2Jvb3N0ZXIgKyAnKiogfCdcclxuXHJcblx0XHRpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlMiAhPSBudWxsICYmIHJlZmVyZW5jZTMgIT0gbnVsbCAmJiByZWZlcmVuY2U0ICE9IG51bGwpe1xyXG5cdFx0XHRzdGFydCA9IHJlZmVyZW5jZSAtIDI7XHJcblx0XHRcdGVuZCA9IHJlZmVyZW5jZSArIDI0O1xyXG5cdFx0XHRzdGFydDIgPSByZWZlcmVuY2UyIC0gMSAtIDI1OyAvLyBubyBpZGVhIHdieSBvZmZzZXQgMjUgaXMgbmVlZGVkXHJcblx0XHRcdGVuZDIgPSByZWZlcmVuY2UyIC0gMjU7IC8vIG5vIGlkZWEgd2J5IG9mZnNldCAyNSBpcyBuZWVkZWRcclxuXHRcdFx0c3RhcnQzID0gcmVmZXJlbmNlMyAtIDEgLTI1OyAvLyBubyBpZGVhIHdieSBvZmZzZXQgMjUgaXMgbmVlZGVkXHJcblx0XHRcdGVuZDMgPSByZWZlcmVuY2UzICsgMjQgLTI1OyAvLyBubyBpZGVhIHdieSBvZmZzZXQgMjUgaXMgbmVlZGVkXHJcblx0XHRcdHN0YXJ0NCA9IHJlZmVyZW5jZTQgLSAxIC0gMjU7IC8vIG5vIGlkZWEgd2J5IG9mZnNldCA1NSBpcyBuZWVkZWRcclxuXHRcdFx0ZW5kNCA9IHJlZmVyZW5jZTQgLSAyNSA7IC8vIG5vIGlkZWEgd2J5IG9mZnNldCA1NSBpcyBuZWVkZWRcclxuXHJcblxyXG5cdFx0XHRjb25zdCBuZXdMaW5lcyA9IFsuLi5saW5lcy5zbGljZSgwLCBzdGFydCksIG5ld1BvaW50c1N0cmluZywgLi4ubGluZXMuc2xpY2UoZW5kKV07XHJcblx0XHRcdGNvbnN0IG5ld0xpbmVzMiA9IFsuLi5uZXdMaW5lcy5zbGljZSgwLCBzdGFydDIpLCBkYWlseUNoYWxsZW5nZSwgLi4ubmV3TGluZXMuc2xpY2UoZW5kMildO1xyXG5cdFx0XHRjb25zdCBuZXdMaW5lczMgPSBbLi4ubmV3TGluZXMyLnNsaWNlKDAsIHN0YXJ0MyksIHdlZWtseUNoYWxsZW5nZSwgLi4ubmV3TGluZXMyLnNsaWNlKGVuZDMpXTtcclxuXHRcdFx0Y29uc3QgbmV3TGluZXM0ID0gWy4uLm5ld0xpbmVzMy5zbGljZSgwLCBzdGFydDQpLCBib29zdGVyRmFjdG9yLCAuLi5uZXdMaW5lczMuc2xpY2UoZW5kNCldO1xyXG5cdFx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0xpbmVzNC5qb2luKFwiXFxuXCIpKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZWNlaXZlQmFkZ2VcclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBnaXZlQmFkZ2VJblByb2ZpbGUoYXZhdGFyUGFnZU5hbWU6IHN0cmluZywgYmFkZ2U6IEJhZGdlKXtcclxuXHRcdGNvbnN0IGV4aXN0aW5nRmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoYCR7YXZhdGFyUGFnZU5hbWV9Lm1kYCk7XHJcblx0XHRpZiAoZXhpc3RpbmdGaWxlID09IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYEZpbGUgJHthdmF0YXJQYWdlTmFtZX0ubWQgZG9lcyBub3QgZXhpc3RgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgZmlsZSA9IGV4aXN0aW5nRmlsZSBhcyBURmlsZTtcclxuXHJcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblx0XHRsZXQgcmVmZXJlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2UyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBlbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBlbmQyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBzdGFydDI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTtcclxuXHRcdFx0aWYgKGxpbmUgPT09IFwiIyMjIyBhY2hpZXZlZFwiKSB7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZSA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0cmVmZXJlbmNlID0gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxpbmUgPT09IGJhZGdlLmxldmVsICsgXCI6ICpcIiArIGJhZGdlLm5hbWUgKyBcIipcIil7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZTIgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdHJlZmVyZW5jZTIgPSBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHJlZmVyZW5jZSAhPSBudWxsICYmIHJlZmVyZW5jZTIgIT0gbnVsbCl7XHJcblx0XHRcdGVuZCA9IHJlZmVyZW5jZSArIDE7XHJcblx0XHRcdHN0YXJ0ID0gcmVmZXJlbmNlICsgMTtcclxuXHJcblx0XHRcdGVuZDIgPSByZWZlcmVuY2UyICsgMjtcclxuXHRcdFx0c3RhcnQyID0gcmVmZXJlbmNlMiArIDE7XHJcblxyXG5cdFx0XHRjb25zdCBiYWRnZVN0cmluZyA9IFwiKipcIiArIGJhZGdlLm5hbWUgKyBcIioqIFwiICsgYmFkZ2UubGV2ZWwgKyBcIlxcbj4gXCIgKyBiYWRnZS5kZXNjcmlwdGlvbiArIFwiIC0gKlwiICsgd2luZG93Lm1vbWVudCgpLmZvcm1hdCgnRC5NLllZJykgKyBcIipcXG5cIlxyXG5cdFx0XHRjb25zdCBuZXdMaW5lcyA9IFsuLi5saW5lcy5zbGljZSgwLCBzdGFydCksIGJhZGdlU3RyaW5nLCAuLi5saW5lcy5zbGljZShlbmQpXTtcclxuXHRcdFx0Y29uc3QgbmV3TGluZXMyID0gWy4uLm5ld0xpbmVzLnNsaWNlKDAsIHN0YXJ0MiksIC4uLm5ld0xpbmVzLnNsaWNlKGVuZDIpXVxyXG5cdFx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0xpbmVzMi5qb2luKFwiXFxuXCIpKTtcclxuXHRcdFx0Y29uc29sZS5sb2coYGJhZGdlU3RyaW5nOiAke2JhZGdlU3RyaW5nfWApXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBnaXZlSW5pdEJhZGdlSW5Qcm9maWxlKGF2YXRhclBhZ2VOYW1lOiBzdHJpbmcsIGJhZGdlOiBCYWRnZSl7XHJcblx0XHRjb25zdCBleGlzdGluZ0ZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke2F2YXRhclBhZ2VOYW1lfS5tZGApO1xyXG5cdFx0aWYgKGV4aXN0aW5nRmlsZSA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGZpbGUgPSBleGlzdGluZ0ZpbGUgYXMgVEZpbGU7XHJcblxyXG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0bGV0IHJlZmVyZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCBzdGFydDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xyXG5cdFx0XHRpZiAobGluZSA9PT0gXCIjIyMjIGFjaGlldmVkXCIpIHtcclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRyZWZlcmVuY2UgPSBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHJlZmVyZW5jZSAhPSBudWxsICl7XHJcblx0XHRcdGVuZCA9IHJlZmVyZW5jZSArIDI7XHJcblx0XHRcdHN0YXJ0ID0gcmVmZXJlbmNlICsgMTtcclxuXHJcblx0XHRcdGNvbnN0IGJhZGdlU3RyaW5nID0gXCIqKlwiICsgYmFkZ2UubmFtZSArIFwiKipcXG4+IFwiICsgYmFkZ2UuZGVzY3JpcHRpb24gKyBcIiAtICpcIiArIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoJ0QuTS5ZWScpICsgXCIqXFxuXCJcclxuXHRcdFx0Y29uc3QgbmV3TGluZXMgPSBbLi4ubGluZXMuc2xpY2UoMCwgc3RhcnQpLCBiYWRnZVN0cmluZywgLi4ubGluZXMuc2xpY2UoZW5kKV07XHJcblx0XHRcdGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3TGluZXMuam9pbihcIlxcblwiKSk7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBiYWRnZVN0cmluZzogJHtiYWRnZVN0cmluZ31gKVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVtb3ZlQmFkZ2VzV2hlbkluaXRMZXZlbEhpZ2hlcihhdmF0YXJQYWdlTmFtZTogc3RyaW5nLCBsZXZlbDogbnVtYmVyKXtcclxuXHRcdGNvbnN0IGV4aXN0aW5nRmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoYCR7YXZhdGFyUGFnZU5hbWV9Lm1kYCk7XHJcblx0XHRpZiAoZXhpc3RpbmdGaWxlID09IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYEZpbGUgJHthdmF0YXJQYWdlTmFtZX0ubWQgZG9lcyBub3QgZXhpc3RgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgZmlsZSA9IGV4aXN0aW5nRmlsZSBhcyBURmlsZTtcclxuXHJcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblx0XHRsZXQgcmVmZXJlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2UyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGxpbmUgPSBsaW5lc1tpXS50cmltKCk7XHJcblx0XHRcdGlmIChsaW5lID09PSBcIiMjIyMgb3V0c3RhbmRpbmdcIikge1xyXG5cdFx0XHRcdGlmIChyZWZlcmVuY2UgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdHJlZmVyZW5jZSA9IGk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChyZWZlcmVuY2UgIT0gbnVsbCAmJiByZWZlcmVuY2UyID09IG51bGwpe1xyXG5cdFx0XHRcdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB0aGUgbGV2ZWwgbnVtYmVyXHJcblx0XHRcdFx0Y29uc3QgbGV2ZWxSZWdleCA9IC9sZXZlbCAoXFxkKykvO1xyXG5cdFx0XHRcdC8vIEV4dHJhY3QgdGhlIGxldmVsIG51bWJlciB1c2luZyB0aGUgcmVndWxhciBleHByZXNzaW9uXHJcblx0XHRcdFx0Y29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKGxldmVsUmVnZXgpO1xyXG5cclxuXHRcdFx0XHRpZihtYXRjaCl7XHJcblx0XHRcdFx0XHRjb25zdCBsZXZlbE51bWJlciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7IC8vIENvbnZlcnQgdGhlIG1hdGNoZWQgbnVtYmVyIHRvIGFuIGludGVnZXJcclxuXHRcdFx0XHRcdGlmIChsZXZlbE51bWJlciA+IGxldmVsKSB7XHJcblx0XHRcdFx0XHRcdHJlZmVyZW5jZTIgPSBpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlMiAhPSBudWxsKXtcclxuXHRcdFx0Y29uc3QgbmV3TGluZXMgPSBbLi4ubGluZXMuc2xpY2UoMCwgcmVmZXJlbmNlICsgMSksIC4uLmxpbmVzLnNsaWNlKHJlZmVyZW5jZTIpXTtcclxuXHRcdFx0YXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdMaW5lcy5qb2luKFwiXFxuXCIpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRhc3luYyBjcmVhdGVDaGFydCh2YXVsdDogVmF1bHQpOiBQcm9taXNlPHN0cmluZz57XHJcblx0XHRjb25zdCBmaWxlcyA9IHZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHRcdGNvbnN0IGVhcmxpZXN0RmlsZSA9IGZpbmRFYXJsaWVzdE1vZGlmaWVkRmlsZShmaWxlcylcclxuXHRcdC8vbGV0IGVhcmxpZXN0RGF0ZSA9IGVhcmxpZXN0RmlsZS5zdGF0LmN0aW1lXHJcblx0XHQvL2lmIChlYXJsaWVzdEZpbGUuc3RhdC5tdGltZSA8IGVhcmxpZXN0RmlsZS5zdGF0LmN0aW1lICl7XHJcblx0XHRjb25zdCBlYXJsaWVzdERhdGUgPSBlYXJsaWVzdEZpbGUuc3RhdC5tdGltZVxyXG5cdFx0Ly99XHJcblxyXG5cdFx0bGV0IG1vbnRoQ291bnRlciA9IDAgLy9mb3JtYXQobmV3IERhdGUoZWFybGllc3REYXRlKSwgJ01NJyk7XHJcblx0XHRsZXQgZGF0ZUNvdW50ID0gbmV3IERhdGUoZWFybGllc3REYXRlKTsgLy8gdW0gZXMgaG9jaHpcdTAwRTRobGVuIHp1IGtcdTAwRjZubmVuXHJcblx0XHQvL2NvbnN0IGZpbGVEYXRlTW9udGhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cdFx0Y29uc3QgZmlsZURhdGVNb250aE1hcE1vZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcblx0XHRjb25zdCBtb250aGNvdW50ID0gbW9udGhzQmV0d2VlbihuZXcgRGF0ZShlYXJsaWVzdERhdGUpLCBuZXcgRGF0ZSgpKVxyXG5cdFx0bGV0IGRhdGVTdHJpbmcgPSBkYXRlQ291bnQuZ2V0TW9udGgoKSsxICsgXCIuXCIgKyBkYXRlQ291bnQuZ2V0RnVsbFllYXIoKVxyXG5cdFx0bGV0IHlMYWJlbCA9IFwiXCJcclxuXHRcdC8vIGNyZWF0ZSBCYXNlIGZvciBjb3VudGluZyBjcmVhdGVkXHJcblx0XHQvKndoaWxlIChtb250aENvdW50ZXIgPCBtb250aGNvdW50KXtcclxuXHRcdFx0ZGF0ZVN0cmluZyA9IGRhdGVDb3VudC5nZXRNb250aCgpKzEgKyBcIi5cIiArIGRhdGVDb3VudC5nZXRGdWxsWWVhcigpXHJcblx0XHRcdC8vY29uc29sZS5sb2coYGRhdGVTdHJpbmc6ICR7ZGF0ZVN0cmluZ31gKVxyXG5cdFx0XHRkYXRlQ291bnQuc2V0TW9udGgoZGF0ZUNvdW50LmdldE1vbnRoKCkgKyAxKVxyXG5cdFx0XHRtb250aENvdW50ZXIgKz0gMTtcclxuXHRcdFx0ZmlsZURhdGVNb250aE1hcC5zZXQoZGF0ZVN0cmluZywgMClcclxuXHRcdH0qL1xyXG5cclxuXHRcdG1vbnRoQ291bnRlciA9IDBcclxuXHRcdGRhdGVDb3VudCA9IG5ldyBEYXRlKGVhcmxpZXN0RGF0ZSk7IC8vIHVtIGVzIGhvY2h6XHUwMEU0aGxlbiB6dSBrXHUwMEY2bm5lblxyXG5cdFx0ZGF0ZVN0cmluZyA9IGRhdGVDb3VudC5nZXRNb250aCgpKzEgKyBcIi5cIiArIGRhdGVDb3VudC5nZXRGdWxsWWVhcigpXHJcblx0XHQvLyBjcmVhdGUgQmFzZSBmb3IgY291bnRpbmcgbW9kaWZpZWRcclxuXHRcdHdoaWxlIChtb250aENvdW50ZXIgPCBtb250aGNvdW50KXtcclxuXHRcdFx0ZGF0ZVN0cmluZyA9IGRhdGVDb3VudC5nZXRNb250aCgpKzEgKyBcIi5cIiArIGRhdGVDb3VudC5nZXRGdWxsWWVhcigpXHJcblx0XHRcdC8vY29uc29sZS5sb2coYGRhdGVTdHJpbmc6ICR7ZGF0ZVN0cmluZ31gKVxyXG5cdFx0XHR5TGFiZWwgPSB5TGFiZWwgKyBkYXRlU3RyaW5nICsgXCIsIFwiXHJcblx0XHRcdGRhdGVDb3VudC5zZXRNb250aChkYXRlQ291bnQuZ2V0TW9udGgoKSArIDEpXHJcblx0XHRcdG1vbnRoQ291bnRlciArPSAxO1xyXG5cdFx0XHRmaWxlRGF0ZU1vbnRoTWFwTW9kLnNldChkYXRlU3RyaW5nLCAwKVxyXG5cdFx0fVxyXG5cdFx0eUxhYmVsID0geUxhYmVsLnNsaWNlKDAseUxhYmVsLmxlbmd0aC0yKVxyXG5cclxuXHRcdC8vIGNvdW50IGhvdyBtYW55IGZpbGVzIGluIGVhY2ggbW9udGhcclxuXHRcdC8qY29uc3QgY3JlYXRpb25EYXRlcyA9IGdldENyZWF0aW9uRGF0ZXMoZmlsZXMpXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNyZWF0aW9uRGF0ZXMubGVuZ3RoOyBpKyspe1xyXG5cdFx0XHQvL2ZpbGVEYXRlTW9udGhNYXAuc2V0KGZvcm1hdChjcmVhdGlvbkRhdGVzW2ldLCAnTS55eXl5JyksZmlsZURhdGVNb250aE1hcC5nZXQoZm9ybWF0KGNyZWF0aW9uRGF0ZXNbaV0sICdNLnl5eXknKSkrMSlcclxuXHRcdFx0Y29uc3QgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdChjcmVhdGlvbkRhdGVzW2ldLCAnTS55eXl5Jyk7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRDb3VudCA9IGZpbGVEYXRlTW9udGhNYXAuZ2V0KGZvcm1hdHRlZERhdGUpO1xyXG5cclxuXHRcdFx0aWYgKGN1cnJlbnRDb3VudCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0ZmlsZURhdGVNb250aE1hcC5zZXQoZm9ybWF0dGVkRGF0ZSwgY3VycmVudENvdW50ICsgMSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0IGluIHRoZSBtYXAsIGluaXRpYWxpemUgaXQgd2l0aCBhIGNvdW50IG9mIDFcclxuXHRcdFx0XHRmaWxlRGF0ZU1vbnRoTWFwLnNldChmb3JtYXR0ZWREYXRlLCAxKTtcclxuXHRcdFx0fVxyXG5cdFx0fSovXHJcblxyXG5cdFx0Ly8gY291bnQgaG93IG1hbnkgbW9kIGZpbGVzIGluIGVhY2ggbW9udGhcclxuXHRcdGNvbnN0IG1vZGlmaWNhdGlvbkRhdGVzID0gZ2V0TW9kaWZpY2F0aW9uRGF0ZXMoZmlsZXMpXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWNhdGlvbkRhdGVzLmxlbmd0aDsgaSsrKXtcclxuXHRcdFx0Ly9maWxlRGF0ZU1vbnRoTWFwTW9kLnNldChmb3JtYXQobW9kaWZpY2F0aW9uRGF0ZXNbaV0sICdNLnl5eXknKSxmaWxlRGF0ZU1vbnRoTWFwTW9kLmdldChmb3JtYXQobW9kaWZpY2F0aW9uRGF0ZXNbaV0sICdNLnl5eXknKSkrMSlcclxuXHRcdFx0Y29uc3QgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdChtb2RpZmljYXRpb25EYXRlc1tpXSwgJ00ueXl5eScpO1xyXG5cdFx0XHRjb25zdCBjdXJyZW50Q291bnQgPSBmaWxlRGF0ZU1vbnRoTWFwTW9kLmdldChmb3JtYXR0ZWREYXRlKTtcclxuXHJcblx0XHRcdGlmIChjdXJyZW50Q291bnQgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGZpbGVEYXRlTW9udGhNYXBNb2Quc2V0KGZvcm1hdHRlZERhdGUsIGN1cnJlbnRDb3VudCArIDEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBpbiB0aGUgbWFwLCBpbml0aWFsaXplIGl0IHdpdGggYSBjb3VudCBvZiAxXHJcblx0XHRcdFx0ZmlsZURhdGVNb250aE1hcE1vZC5zZXQoZm9ybWF0dGVkRGF0ZSwgMSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBDaGFydCBTdHJpbmcgY3JlYXRlZFxyXG5cdFx0LypsZXQgY2hhclN0cmluZ0NyZWF0ZWQgPSBcIlwiXHJcblx0XHRmb3IgKGNvbnN0IFt2YWx1ZV0gb2YgZmlsZURhdGVNb250aE1hcCkge1xyXG5cdFx0XHRjaGFyU3RyaW5nQ3JlYXRlZCA9IGNoYXJTdHJpbmdDcmVhdGVkICsgdmFsdWUgKyBcIiwgXCJcclxuXHRcdH1cclxuXHRcdGNoYXJTdHJpbmdDcmVhdGVkID0gY2hhclN0cmluZ0NyZWF0ZWQuc2xpY2UoMCxjaGFyU3RyaW5nQ3JlYXRlZC5sZW5ndGgtMikqL1xyXG5cclxuXHRcdC8vIGJ1aWxkIENoYXJ0IFN0cmluZyBtb2RpZmllZFxyXG5cdFx0bGV0IGNoYXJTdHJpbmdNb2RpZmllZCA9IFwiXCJcclxuXHRcdGZvciAoY29uc3QgW3ZhbHVlXSBvZiBmaWxlRGF0ZU1vbnRoTWFwTW9kKSB7XHJcblx0XHRcdC8vY29uc29sZS5sb2coYGtleTogJHtrZXl9LCB2YWx1ZTogJHt2YWx1ZX1gKTtcclxuXHRcdFx0Y2hhclN0cmluZ01vZGlmaWVkID0gY2hhclN0cmluZ01vZGlmaWVkICsgdmFsdWUgKyBcIiwgXCJcclxuXHRcdH1cclxuXHRcdGNoYXJTdHJpbmdNb2RpZmllZCA9IGNoYXJTdHJpbmdNb2RpZmllZC5zbGljZSgwLGNoYXJTdHJpbmdNb2RpZmllZC5sZW5ndGgtMilcclxuXHJcblx0XHRyZXR1cm4gY3JlYXRlQ2hhcnRGb3JtYXQoeUxhYmVsLCBjaGFyU3RyaW5nTW9kaWZpZWQsIHRoaXMuc2V0dGluZ3MuY2hhcnRSZWR1emllcnVuZ01vbmF0ZSlcclxuXHR9XHJcblxyXG5cdGFzeW5jIGRlY2lzaW9uSWZCYWRnZShuZXdMZXZlbDogUHJvbWlzZTxib29sZWFuPil7XHJcblx0XHRuZXdMZXZlbC50aGVuKChyZXN1bHQ6IGJvb2xlYW4pPT4ge1xyXG5cdFx0XHRpZihyZXN1bHQpe1xyXG5cdFx0XHRcdGNvbnN0IGJhZGdlIDogQmFkZ2UgPSBnZXRCYWRnZUZvckxldmVsKHRoaXMuc2V0dGluZ3Muc3RhdHVzTGV2ZWwsIGZhbHNlKVxyXG5cdFx0XHRcdG5ldyBOb3RpY2UoYFlvdSd2ZSBlYXJuZWQgdGhlIFwiJHtiYWRnZS5uYW1lfVwiIGJhZGdlLiAke2JhZGdlLmRlc2NyaXB0aW9ufWApXHJcblx0XHRcdFx0Y29uc29sZS5sb2coYFlvdSd2ZSBlYXJuZWQgdGhlIFwiJHtiYWRnZS5uYW1lfVwiIGJhZGdlLiAke2JhZGdlLmRlc2NyaXB0aW9ufWApXHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZyhgYmFkZ2UgZm9yIGxldmVsICR7dGhpcy5zZXR0aW5ncy5zdGF0dXNMZXZlbH0gaXMgJHtiYWRnZS5uYW1lfSAtICR7YmFkZ2UubGV2ZWx9YClcclxuXHRcdFx0XHR0aGlzLmdpdmVCYWRnZUluUHJvZmlsZSh0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lLCBiYWRnZSlcclxuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlclN0YXRlID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgPSAxO1xyXG5cdFx0XHRcdHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgcmVtb3ZlS2V5c0Zyb21Gcm9udG1hdHRlcigpIHtcclxuXHRcdC8vY29uc3QgeyBWYXVsdCwgVEZpbGUgfSA9IHdpbmRvdy5hcHA7XHJcblx0XHRjb25zdCB7IHZhdWx0IH0gPSB0aGlzLmFwcFxyXG5cdFx0Ly9jb25zdCB2YXVsdCA9IFZhdWx0LnJlb3BlbigpO1xyXG5cclxuXHRcdC8vIEdldCBhbGwgTWFya2Rvd24gZmlsZXMgaW4gdGhlIHZhdWx0XHJcblx0XHQvL2NvbnN0IG1hcmtkb3duRmlsZXMgPSB2YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRjb25zdCBmaWxlQ291bnRNYXAgPSBhd2FpdCBnZXRGaWxlQ291bnRNYXAodGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MudGFnc0V4Y2x1ZGUsIHRoaXMuc2V0dGluZ3MuZm9sZGVyRXhjbHVkZSk7XHJcblx0XHRmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVDb3VudE1hcC5rZXlzKCkpIHtcclxuXHRcdFx0Y29uc3QgZmlsZXMgPSB2YXVsdC5nZXRGaWxlcygpO1xyXG5cdFx0XHRjb25zdCBmaWxlID0gZmlsZXMuZmluZChmaWxlID0+IGZpbGUuYmFzZW5hbWUgPT09IGZpbGVOYW1lKTtcclxuXHRcdFx0aWYgKCFmaWxlKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKGBGaWxlICR7ZmlsZU5hbWV9IG5vdCBmb3VuZC5gKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvL2NvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyBmaWxlICR7ZmlsZU5hbWV9YCk7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucHJvY2Vzc0Zyb250TWF0dGVyKGZpbGUsIChmcm9udG1hdHRlcikgPT4ge1xyXG5cdFx0XHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyWyd0aXRsZS1jbGFzcyddXHJcblx0XHRcdFx0XHRkZWxldGUgZnJvbnRtYXR0ZXJbJ25vdGUtbGVuZ3RoLWNsYXNzJ11cclxuXHRcdFx0XHRcdGRlbGV0ZSBmcm9udG1hdHRlclsnaW5saW5rLWNsYXNzJ11cclxuXHRcdFx0XHRcdGRlbGV0ZSBmcm9udG1hdHRlclsnb3V0bGluay1jbGFzcyddXHJcblx0XHRcdFx0XHRkZWxldGUgZnJvbnRtYXR0ZXJbJ3Byb2dyZXNzaXZlLXN1bW1hcml6YXRpb24tbWF0dXJpdHknXVxyXG5cdFx0XHRcdFx0ZGVsZXRlIGZyb250bWF0dGVyWydub3RlLW1hdHVyaXR5J11cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdGlmIChlPy5uYW1lID09PSAnWUFNTFBhcnNlRXJyb3InKSB7XHJcblx0XHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBgVXBkYXRlIG1hanVyaXR5cyBmYWlsZWQgTWFsZm9ybWVkIGZyb250YW10dGVyICR7ZS5tZXNzYWdlfWA7XHJcblx0XHRcdFx0XHRuZXcgTm90aWNlKGVycm9yTWVzc2FnZSwgNDAwMCk7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIG5ldyBOb3RpY2UoYFJlbW92ZWQgc3BlY2lmaWVkIGtleXMgZnJvbSBmcm9udG1hdHRlciBmcm9tIGZpbGUgXFxcIiR7ZmlsZU5hbWV9XFxcIi5gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHdoaWNoTGV2ZWxOZXh0QmFkZ2UoY3VycmVudExldmVsOiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj57XHJcblx0XHRsZXQgbmV4dEJhZGdlTGV2ZWwgPSAwXHJcblx0XHRmb3IgKGxldCBpID0gY3VycmVudExldmVsOyBpIDwgMTEwOyBpKyspe1xyXG5cdFx0XHRjb25zdCBiYWRnZSA6IEJhZGdlID0gZ2V0QmFkZ2VGb3JMZXZlbChpLCB0cnVlKVxyXG5cdFx0XHQvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdGhlIGxldmVsIG51bWJlclxyXG5cdFx0XHRjb25zdCBsZXZlbFJlZ2V4ID0gL2xldmVsIChcXGQrKS87XHJcblx0XHRcdC8vIEV4dHJhY3QgdGhlIGxldmVsIG51bWJlciB1c2luZyB0aGUgcmVndWxhciBleHByZXNzaW9uXHJcblx0XHRcdGNvbnN0IG1hdGNoID0gYmFkZ2UubGV2ZWwubWF0Y2gobGV2ZWxSZWdleCk7XHJcblx0XHRcdGlmKG1hdGNoKXtcclxuXHRcdFx0XHRjb25zdCBsZXZlbE51bWJlciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7IC8vIENvbnZlcnQgdGhlIG1hdGNoZWQgbnVtYmVyIHRvIGFuIGludGVnZXJcclxuXHRcdFx0XHRpZiAobGV2ZWxOdW1iZXIgPiBjdXJyZW50TGV2ZWwgJiYgbmV4dEJhZGdlTGV2ZWwgPT0gMCApIHtcclxuXHRcdFx0XHRcdG5leHRCYWRnZUxldmVsID0gbGV2ZWxOdW1iZXI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV4dEJhZGdlTGV2ZWxcclxuXHR9XHJcblxyXG5cdGFzeW5jIGJvb3N0ZXJGb3JJbml0KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcblx0XHRjb25zdCBuZXh0QmFkZ2VBdCA9IGF3YWl0IHRoaXMud2hpY2hMZXZlbE5leHRCYWRnZSh0aGlzLnNldHRpbmdzLnN0YXR1c0xldmVsKVxyXG5cdFx0Y29uc3Qgc3RhdHVzUG9pbnRzVG9SZWFjaCA9IHN0YXR1c1BvaW50c0ZvckxldmVsKG5leHRCYWRnZUF0KVxyXG5cdFx0Ly9jb25zb2xlLmxvZyhgc3RhdHVzUG9pbnRzVG9SZWFjaCBmb3IgbmV4dCBCYWRnZTogJHtzdGF0dXNQb2ludHNUb1JlYWNofWApXHJcblx0XHQvLyA1MCBOb3RlcyBmcm9tIExldmVsIDEgdG8gNSB0byBnZXQgdGhlIGZpcnN0IGJhZGdlLlxyXG5cdFx0Ly8gMzAwIFBvaW50cyBpbiBhdmVyYWdlIGZvciBhIE5vdGUuXHJcblx0XHRjb25zdCBib29zdGVyRmFjdG9yID0gTWF0aC5yb3VuZCgoc3RhdHVzUG9pbnRzVG9SZWFjaCAtIHRoaXMuc2V0dGluZ3Muc3RhdHVzUG9pbnRzKS81MC8zMDApO1xyXG5cdFx0dGhpcy5zZXR0aW5ncy5iYWRnZUJvb3N0ZXJGYWN0b3IgPSBib29zdGVyRmFjdG9yXHJcblx0XHR0aGlzLnNldHRpbmdzLmJhZGdlQm9vc3RlclN0YXRlID0gdHJ1ZVxyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKVxyXG5cdFx0Ly9jb25zb2xlLmxvZyhgYm9vc3RlckZha3RvcjogJHtib29zdGVyRmFjdG9yfWApXHJcblx0XHRyZXR1cm4gYm9vc3RlckZhY3RvclxyXG5cdH1cclxuXHJcblx0YXN5bmMgb3BlbkF2YXRhckZpbGUoKSB7XHJcblx0XHRjb25zdCBleGlzdGluZ0ZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGAke3RoaXMuc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWV9Lm1kYCk7XHJcblx0XHRpZiAoZXhpc3RpbmdGaWxlKXtcclxuXHRcdFx0Y29uc3Qgc291cmNlUGF0aCA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk/LnBhdGggfHwgJyc7XHJcblx0XHRcdGF3YWl0IGFwcC53b3Jrc3BhY2Uub3BlbkxpbmtUZXh0KGV4aXN0aW5nRmlsZS5wYXRoLCBzb3VyY2VQYXRoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiRmlsZSBub3QgZm91bmQgb3IgdW5hYmxlIHRvIG9wZW4uXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Z2V0UmFuZG9tSW50KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XHJcblx0ICB9XHJcblx0XHJcblx0ICBhc3luYyBhY3F1aXJlSW5ncmVkaWVudHMoKSB7XHJcblx0XHRjb25zdCBjaGFuY2VUb0Vhcm5JbmdyZWRpZW50ID0gMC41O1xyXG5cdFxyXG5cdFx0aWYgKE1hdGgucmFuZG9tKCkgPCBjaGFuY2VUb0Vhcm5JbmdyZWRpZW50KSB7XHJcblx0XHRcdGNvbnN0IHJhbmRvbUluZ3JlZGllbnRJbmRleCA9IHRoaXMuZ2V0UmFuZG9tSW50KDAsIDMpO1xyXG5cdFx0XHRjb25zdCBlYXJuZWRJbmdyZWRpZW50ID0gZWxlbWVudHNbcmFuZG9tSW5ncmVkaWVudEluZGV4XTtcclxuXHRcdFx0bGV0IGVsZW1lbnRDb3VudCA9IHRoaXMuZ2V0U2V0dGluZyhlYXJuZWRJbmdyZWRpZW50LnZhck5hbWUpO1xyXG5cdFxyXG5cdFx0XHQvLyBQZXJmb3JtIGEgbnVsbCBjaGVja1xyXG5cdFx0XHRpZiAoZWxlbWVudENvdW50ICE9PSBudWxsICYmIHR5cGVvZiBlbGVtZW50Q291bnQgPT09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0dGhpcy5zZXRTZXR0aW5nKGVhcm5lZEluZ3JlZGllbnQudmFyTmFtZSwgZWxlbWVudENvdW50ICsgMSk7XHJcblx0XHRcdFx0dGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhgWW91IGVhcm5lZDogJHtlYXJuZWRJbmdyZWRpZW50Lm5hbWV9YCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgSW52YWxpZCBlbGVtZW50IGNvdW50IGZvciAke2Vhcm5lZEluZ3JlZGllbnQudmFyTmFtZX1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1lvdSBkaWQgbm90IGVhcm4gYW4gaW5ncmVkaWVudCB0aGlzIHRpbWUuJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG59XHJcblxyXG5cclxuICBcclxuZnVuY3Rpb24gZ2V0Qm9vc3RlclJ1blRpbWVGcm9tVmFyTmFtZShib29zdGVyVmFyTmFtZTogc3RyaW5nKSB7XHJcblx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRpZiAoZWxlbWVudC52YXJuYW1lID09PSBib29zdGVyVmFyTmFtZSkge1xyXG5cdFx0XHRyZXR1cm4gZWxlbWVudC5ib29zdGVyUnVuVGltZSBhcyBudW1iZXI7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiAwOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU2FtZURheShpbnB1dERhdGU6IE1vbWVudCk6IGJvb2xlYW4ge1xyXG5cdGNvbnN0IGN1cnJlbnREYXRlID0gd2luZG93Lm1vbWVudCgpOyAvLyBHZXQgdGhlIGN1cnJlbnQgZGF0ZVxyXG5cdHJldHVybiBjdXJyZW50RGF0ZS5pc1NhbWUoaW5wdXREYXRlLCAnZGF5Jyk7IC8vIENoZWNrIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGRheVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc09uZURheUJlZm9yZShpbnB1dERhdGU6IE1vbWVudCk6IGJvb2xlYW4ge1xyXG5cdGNvbnN0IG9uZURheUJlZm9yZUN1cnJlbnQgPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpOyAvLyBDYWxjdWxhdGUgb25lIGRheSBiZWZvcmUgY3VycmVudCBkYXRlXHJcblx0cmV0dXJuIGlucHV0RGF0ZS5pc1NhbWUob25lRGF5QmVmb3JlQ3VycmVudCwgJ2RheScpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNNaW51dGVzUGFzc2VkKGlucHV0RGF0ZTogTW9tZW50LCBtaW51dGVzUGFzc2VkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG1pbnV0ZXNBZ28gPSB3aW5kb3cubW9tZW50KCkuc3VidHJhY3QobWludXRlc1Bhc3NlZCwgJ21pbnV0ZXMnKTsgLy8gQ2FsY3VsYXRlIHRpbWUgJ21pbnV0ZXNQYXNzZWQnIG1pbnV0ZXMgYWdvXHJcbiAgICByZXR1cm4gaW5wdXREYXRlLmlzU2FtZU9yQmVmb3JlKG1pbnV0ZXNBZ28pO1xyXG59XHJcblxyXG4vKmZ1bmN0aW9uIGhvdXJzVW50aWxNaW51dGVzUGFzc2VkKGlucHV0RGF0ZTogTW9tZW50LCBtaW51dGVzUGFzc2VkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB3aW5kb3cubW9tZW50KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lXHJcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gaW5wdXREYXRlLmNsb25lKCkuYWRkKG1pbnV0ZXNQYXNzZWQsICdtaW51dGVzJyk7IC8vIENhbGN1bGF0ZSB0YXJnZXQgdGltZVxyXG5cclxuICAgIGlmIChjdXJyZW50VGltZS5pc1NhbWVPckFmdGVyKHRhcmdldFRpbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7IC8vIElmIHRoZSB0YXJnZXQgdGltZSBoYXMgYWxyZWFkeSBwYXNzZWQsIHJldHVybiAwIGhvdXJzXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGltZURpZmYgPSB0YXJnZXRUaW1lLmRpZmYoY3VycmVudFRpbWUsICdob3VycycsIHRydWUpOyAvLyBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgaW4gaG91cnNcclxuICAgIHJldHVybiBNYXRoLmNlaWwodGltZURpZmYpO1xyXG59Ki9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBob3Vyc1VudGlsTWludXRlc1Bhc3NlZChpbnB1dERhdGU6IE1vbWVudCwgbWludXRlc1RvUGFzczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gd2luZG93Lm1vbWVudCgpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZVxyXG4gICAgY29uc3QgdGFyZ2V0VGltZSA9IGlucHV0RGF0ZS5jbG9uZSgpLmFkZChtaW51dGVzVG9QYXNzLCAnbWludXRlcycpOyAvLyBDYWxjdWxhdGUgdGhlIHRhcmdldCB0aW1lXHJcblxyXG4gICAgaWYgKHRhcmdldFRpbWUuaXNBZnRlcihjdXJyZW50VGltZSkpIHtcclxuICAgICAgICBjb25zdCBob3Vyc1JlbWFpbmluZyA9IHRhcmdldFRpbWUuZGlmZihjdXJyZW50VGltZSwgJ2hvdXJzJyk7XHJcbiAgICAgICAgcmV0dXJuIGhvdXJzUmVtYWluaW5nO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXZhdGFyRmlsZShhcHA6IEFwcCwgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdC8vc2V0dGluZ3M6IEdhbWlmaWNhdGlvblBsdWdpblNldHRpbmdzO1xyXG5cdC8vIERlZmluZSB0aGUgZmlsZSBuYW1lIGFuZCBjb250ZW50XHJcblx0Ly9jb25zdCBmaWxlTmFtZSA9ICdBdmF0YXIgLSBHYW1pZmljYXRpb24nOyAvLyB0aGlzLnNldHRpbmdzLmF2YXRhclBhZ2VOYW1lO1xyXG5cdC8vY29uc29sZS5sb2coYGZpbGVOYW1lOiAke2ZpbGVOYW1lfWApXHJcblxyXG5cdGNvbnN0IGV4aXN0aW5nRmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoYCR7ZmlsZU5hbWV9Lm1kYCk7XHJcblx0aWYgKGV4aXN0aW5nRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRjb25zb2xlLmxvZyhgRmlsZSAke2ZpbGVOYW1lfS5tZCBhbHJlYWR5IGV4aXN0c2ApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHQvLyBDcmVhdGUgdGhlIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHZhdWx0XHJcblx0YXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShgJHtmaWxlTmFtZX0ubWRgLCBhdmF0YXJJbml0Q29udGVudCk7XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmZ1bmN0aW9uIHN0cmluZ1RvTGlzdChpbnB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIGlucHV0LnNwbGl0KCcsJyk7XHJcbn1cclxuXHJcblxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUZvcm1hdFN0cmluZ3MobGF5ZXIyOiBzdHJpbmcsIGxheWVyMzogc3RyaW5nKSB7XHJcblx0Y29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblxyXG5cdGlmICghYWN0aXZlVmlldykge1xyXG5cdFx0Y29uc29sZS5lcnJvcihcIk5vIGFjdGl2ZSBNYXJrZG93biB2aWV3IGZvdW5kLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IGVkaXRvciA9IGFjdGl2ZVZpZXcuZWRpdG9yO1xyXG5cdGNvbnN0IHNlbGVjdGVkVGV4dCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKTtcclxuXHJcblx0aWYgKCFzZWxlY3RlZFRleHQpIHtcclxuXHRcdGNvbnNvbGUuZXJyb3IoXCJObyB0ZXh0IHNlbGVjdGVkIChmb3IgcHJvZ3Jlc3NpdmUgc3VtbWFyaXphdGlvbiBzd2l0Y2ggTGF5ZXIgMiAmIDMpLlwiKTtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGxldCByZXBsYWNlZFRleHQgPSBzZWxlY3RlZFRleHQucmVwbGFjZUFsbChsYXllcjIsIFwiXHUwMEE3XHUwMEE3XHUwMEE3XHUwMEE3XCIpO1xyXG5cdHJlcGxhY2VkVGV4dCA9IHJlcGxhY2VkVGV4dC5yZXBsYWNlQWxsKGxheWVyMywgXCJcdTIwQUNcdTIwQUNcdTIwQUNcdTIwQUNcIilcclxuXHRyZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZUFsbChcIlx1MjBBQ1x1MjBBQ1x1MjBBQ1x1MjBBQ1wiLCBsYXllcjIpXHJcblx0cmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2VBbGwoXCJcdTAwQTdcdTAwQTdcdTAwQTdcdTAwQTdcIiwgbGF5ZXIzKVxyXG5cclxuXHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihyZXBsYWNlZFRleHQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByYXRlRGlyZWN0aW9uRm9yU3RhdHVzUG9pbnRzKHJhdGluZ0N1cnJlbnQ6IHN0cmluZywgcmF0aW5nTmV3OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdGxldCByYXRpbmdGYWt0b3I6IG51bWJlclxyXG5cdGlmIChwYXJzZUludChyYXRpbmdDdXJyZW50LCAxMCkgPCByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nRmFrdG9yID0gcmF0aW5nTmV3IC0gcGFyc2VJbnQocmF0aW5nQ3VycmVudCwgMTApXHJcblx0fSBlbHNlIHtcclxuXHRcdHJhdGluZ0Zha3RvciA9IDBcclxuXHR9XHJcblxyXG5cdHJldHVybiByYXRpbmdGYWt0b3JcclxufVxyXG5cclxuXHJcblxyXG4gIFxyXG4gIFxyXG5cclxuXHJcblxyXG5cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGdhbWlmaWNhdGlvbiBmcm9tICcuL21haW4nO1xyXG5pbXBvcnQgdHlwZSB7TW9tZW50SW5wdXR9IGZyb20gJ21vbWVudCc7XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdFNldHRpbmdzOiBQYXJ0aWFsPElTZXR0aW5ncz4gPSB7XHJcbiAgZW5hYmxlSW5pdENvbW1hbmQ6IHRydWUsXHJcbiAgYmluZEVudGVyOiB0cnVlLFxyXG4gIGJpbmRUYWI6IHRydWUsXHJcbiAgYXZhdGFyUGFnZU5hbWU6ICdBdmF0YXIgLSBHYW1pZmljYXRpb24nLFxyXG4gIHRhZ3NFeGNsdWRlOiAnJyxcclxuICBmb2xkZXJFeGNsdWRlOiAnRXhjYWxpZHJhdycsXHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjI6ICc9PScsXHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjM6ICcqKicsXHJcbiAgbnVtQWxsRmlsZXM6IDEsXHJcbiAgbnVtQWxsRmlsZXNDb3VudDogMCxcclxuICBjaGFydFJlZHV6aWVydW5nTW9uYXRlOiAwLFxyXG4gIHN0YXR1c1BvaW50czogMCxcclxuICBzdGF0dXNMZXZlbDogMSxcclxuICB4cEZvck5leHRMZXZlbDogMTAwMCxcclxuICBnYW1pZmljYXRpb25TdGFydERhdGU6ICcxMi4wOC4yMDIzJyxcclxuICBiYWRnZUJvb3N0ZXJTdGF0ZTogZmFsc2UsXHJcbiAgYmFkZ2VCb29zdGVyRmFjdG9yOiAxLFxyXG4gIGRlYnVnOiBmYWxzZSxcclxuICBkYWlseU5vdGVDcmVhdGlvblRhc2s6IDAsXHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25EYXRlOiAnMTIuMDguMjAyMycsXHJcbiAgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogMCxcclxuICB3ZWVrbHlOb3RlQ3JlYXRpb25EYXRlOiAnMTIuMDguMjAyMycsXHJcbiAgbmV4dXNOb2RlOiAwLFxyXG4gIGNvbm5lY3Rpb25DcnlzdGFsOiAwLFxyXG4gIG1hc3RlcnlTY3JvbGw6IDAsXHJcbiAgaW5zaWdodFByaXNtOiAwLFxyXG4gIHJlZmxlY3RpdmVFc3NlbmNlOiAwLFxyXG4gIGFtcGxpZmljYXRpb25DcnlzdGFsOiAwLFxyXG4gIGNyZWF0aXZlQ2F0YWx5c3Q6IDAsXHJcbiAgcHJlY2lzaW9uTGVuczogMCxcclxuICB0ZW1wb3JhbFR3ZWFrZXI6IDAsXHJcbiAgcGVycGV0dWFsUHJvZ3Jlc3M6IDAsXHJcbiAgc3RyYXRlZ2ljU3luYXBzZXM6IDAsXHJcbiAgYWNjZWxlcmF0ZWRBY3F1aXNpdGlvbjogMCxcclxuICBsaW5rZXJzTG9kZTogMCxcclxuICBlZmZvcnRsZXNzRXhwYW5zaW9uOiAwLFxyXG4gIHJlY3Vyc2l2ZVJlZmxlY3Rpb246IDAsXHJcbiAgc3luYXB0aWNTdXJnZTogMCxcclxuICBpbnNwaXJhdGlvbkluZnVzaW9uOiAwLFxyXG4gIHRpdGxlVGl0YW46IDAsXHJcbiAgcHJlY2lzaW9uUHJpc206IDAsXHJcbiAgaHlwZXJsaW5rSGFybW9ueTogMCxcclxuICBlcGhlbWVyYWxFdXBob3JpYTogMCxcclxuICBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3M6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlUGVycGV0dWFsUHJvZ3Jlc3M6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yU3RyYXRlZ2ljU3luYXBzZXM6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlU3RyYXRlZ2ljU3luYXBzZXM6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yTGlua2Vyc0xvZGU6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlTGlua2Vyc0xvZGU6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yUmVjdXJzaXZlUmVmbGVjdGlvbjogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVSZWN1cnNpdmVSZWZsZWN0aW9uOicyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yU3luYXB0aWNTdXJnZTogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVTeW5hcHRpY1N1cmdlOiAnMjAyMy0wOC0xNSAyMDowMDowMCcsXHJcbiAgYm9vc3RlckZhY3RvclRpdGxlVGl0YW46IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlVGl0bGVUaXRhbjogJzIwMjMtMDgtMTUgMjA6MDA6MDAnLFxyXG4gIGJvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbTogZmFsc2UsXHJcbiAgYm9vc3RlckRhdGVQcmVjaXNpb25QcmlzbTogJzIwMjMtMDgtMTUgMjA6MDA6MDAnLFxyXG4gIGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255OiBmYWxzZSxcclxuICBib29zdGVyRGF0ZUh5cGVybGlua0hhcm1vbnk6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWE6IGZhbHNlLFxyXG4gIGJvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWE6ICcyMDIzLTA4LTE1IDIwOjAwOjAwJyxcclxuICBzdHJlYWtib29zdGVyOiAwLFxyXG4gIHN0cmVha2Jvb3N0ZXJEYXRlOiBmYWxzZVxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljU2V0dGluZ3Mge1xyXG4gIFtrZXk6IHN0cmluZ106IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNldHRpbmdzIGV4dGVuZHMgRHluYW1pY1NldHRpbmdze1xyXG4gIGVuYWJsZUluaXRDb21tYW5kOiBib29sZWFuO1xyXG4gIGJpbmRFbnRlcjogYm9vbGVhbjtcclxuICBiaW5kVGFiOiBib29sZWFuO1xyXG4gIGF2YXRhclBhZ2VOYW1lOiBzdHJpbmc7XHJcbiAgdGFnc0V4Y2x1ZGU6IHN0cmluZztcclxuICBmb2xkZXJFeGNsdWRlOiBzdHJpbmc7XHJcbiAgcHJvZ3Jlc3NpdmVTdW1MYXllcjI6IHN0cmluZztcclxuICBwcm9ncmVzc2l2ZVN1bUxheWVyMzogc3RyaW5nO1xyXG4gIG51bUFsbEZpbGVzOiBudW1iZXI7XHJcbiAgbnVtQWxsRmlsZXNDb3VudDogbnVtYmVyO1xyXG4gIGNoYXJ0UmVkdXppZXJ1bmdNb25hdGU6IG51bWJlcjtcclxuICBzdGF0dXNQb2ludHM6IG51bWJlcjtcclxuICBzdGF0dXNMZXZlbDogbnVtYmVyO1xyXG4gIHhwRm9yTmV4dExldmVsOiBudW1iZXI7XHJcbiAgZ2FtaWZpY2F0aW9uU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgYmFkZ2VCb29zdGVyU3RhdGU6IGJvb2xlYW47XHJcbiAgYmFkZ2VCb29zdGVyRmFjdG9yOiBudW1iZXI7XHJcbiAgZGVidWc6IGJvb2xlYW47XHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25UYXNrOiBudW1iZXI7XHJcbiAgZGFpbHlOb3RlQ3JlYXRpb25EYXRlOiBzdHJpbmc7XHJcbiAgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHdlZWtseU5vdGVDcmVhdGlvbkRhdGU6IHN0cmluZztcclxuICBzdHJlYWtib29zdGVyOiBudW1iZXI7XHJcbiAgc3RyZWFrYm9vc3RlckRhdGU6IGJvb2xlYW47XHJcbiAgbmV4dXNOb2RlOiBudW1iZXI7XHJcbiAgY29ubmVjdGlvbkNyeXN0YWw6IG51bWJlcjtcclxuICBtYXN0ZXJ5U2Nyb2xsOiBudW1iZXI7XHJcbiAgaW5zaWdodFByaXNtOiBudW1iZXI7XHJcbiAgcmVmbGVjdGl2ZUVzc2VuY2U6IG51bWJlcjtcclxuICBhbXBsaWZpY2F0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIGNyZWF0aXZlQ2F0YWx5c3Q6IG51bWJlcjtcclxuICBwcmVjaXNpb25MZW5zOiBudW1iZXI7XHJcbiAgdGVtcG9yYWxUd2Vha2VyOiBudW1iZXI7XHJcbiAgcGVycGV0dWFsUHJvZ3Jlc3M6IG51bWJlcjtcclxuICBzdHJhdGVnaWNTeW5hcHNlczogbnVtYmVyO1xyXG4gIGFjY2VsZXJhdGVkQWNxdWlzaXRpb246IG51bWJlcjtcclxuICBsaW5rZXJzTG9kZTogbnVtYmVyO1xyXG4gIGVmZm9ydGxlc3NFeHBhbnNpb246IG51bWJlcjtcclxuICByZWN1cnNpdmVSZWZsZWN0aW9uOiBudW1iZXI7XHJcbiAgc3luYXB0aWNTdXJnZTogbnVtYmVyO1xyXG4gIGluc3BpcmF0aW9uSW5mdXNpb246IG51bWJlcjtcclxuICB0aXRsZVRpdGFuOiBudW1iZXI7XHJcbiAgcHJlY2lzaW9uUHJpc206IG51bWJlcjtcclxuICBoeXBlcmxpbmtIYXJtb255OiBudW1iZXI7XHJcbiAgZXBoZW1lcmFsRXVwaG9yaWE6IG51bWJlcjtcclxuICBib29zdGVyRmFjdG9yUGVycGV0dWFsUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgYm9vc3RlckRhdGVQZXJwZXR1YWxQcm9ncmVzczogc3RyaW5nXHJcbiAgYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlU3RyYXRlZ2ljU3luYXBzZXM6IHN0cmluZztcclxuICBib29zdGVyRmFjdG9yTGlua2Vyc0xvZGU6IGJvb2xlYW47XHJcbiAgYm9vc3RlckRhdGVMaW5rZXJzTG9kZTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JSZWN1cnNpdmVSZWZsZWN0aW9uOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlUmVjdXJzaXZlUmVmbGVjdGlvbjogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlU3luYXB0aWNTdXJnZTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JUaXRsZVRpdGFuOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlVGl0bGVUaXRhbjogc3RyaW5nXHJcbiAgYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtOiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlUHJlY2lzaW9uUHJpc206IHN0cmluZ1xyXG4gIGJvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255OiBib29sZWFuO1xyXG4gIGJvb3N0ZXJEYXRlSHlwZXJsaW5rSGFybW9ueTogc3RyaW5nO1xyXG4gIGJvb3N0ZXJGYWN0b3JFcGhlbWVyYWxFdXBob3JpYTogYm9vbGVhbjtcclxuICBib29zdGVyRGF0ZUVwaGVtZXJhbEV1cGhvcmlhOiBzdHJpbmc7XHJcbiAgLy9ba2V5OiBzdHJpbmddOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgTW9tZW50SW5wdXQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgR2FtaWZpY2F0aW9uUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogZ2FtaWZpY2F0aW9uO1xyXG4gIHB1YmxpYyBzZXR0aW5nczogSVNldHRpbmdzO1xyXG4gIFxyXG4gIHB1YmxpYyBlbmFibGVJbml0Q29tbWFuZDogYm9vbGVhbjtcclxuICBwdWJsaWMgYmluZEVudGVyOiBib29sZWFuO1xyXG4gIHB1YmxpYyBiaW5kVGFiOiBib29sZWFuO1xyXG4gIHB1YmxpYyBhdmF0YXJQYWdlTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyB0YWdzRXhjbHVkZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBmb2xkZXJFeGNsdWRlOiBzdHJpbmc7XHJcbiAgcHVibGljIHByb2dyZXNzaXZlU3VtTGF5ZXIyOiBzdHJpbmc7XHJcbiAgcHVibGljIHByb2dyZXNzaXZlU3VtTGF5ZXIzOiBzdHJpbmc7XHJcbiAgcHVibGljIG51bUFsbEZpbGVzOiBudW1iZXI7XHJcbiAgcHVibGljIG51bUFsbEZpbGVzQ291bnQ6IG51bWJlcjtcclxuICBwdWJsaWMgY2hhcnRSZWR1emllcnVuZ01vbmF0ZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBzdGF0dXNQb2ludHM6IG51bWJlcjtcclxuICBwdWJsaWMgc3RhdHVzTGV2ZWw6IG51bWJlcjtcclxuICBwdWJsaWMgeHBGb3JOZXh0TGV2ZWw6IG51bWJlcjtcclxuICBwdWJsaWMgZ2FtaWZpY2F0aW9uU3RhcnREYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIGJhZGdlQm9vc3RlclN0YXRlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBiYWRnZUJvb3N0ZXJGYWN0b3I6IG51bWJlcjtcclxuICBwdWJsaWMgZGVidWc6IGJvb2xlYW47XHJcbiAgcHVibGljIGRhaWx5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHB1YmxpYyBkYWlseU5vdGVDcmVhdGlvbkRhdGU6IHN0cmluZztcclxuICBwdWJsaWMgd2Vla2x5Tm90ZUNyZWF0aW9uVGFzazogbnVtYmVyO1xyXG4gIHB1YmxpYyB3ZWVrbHlOb3RlQ3JlYXRpb25EYXRlOiBzdHJpbmc7XHJcbiAgcHVibGljIHN0cmVha2Jvb3N0ZXI6IG51bWJlcjtcclxuICBwdWJsaWMgc3RyZWFrYm9vc3RlckRhdGU6IGJvb2xlYW47XHJcbiAgcHVibGljIG5leHVzTm9kZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBjb25uZWN0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtYXN0ZXJ5U2Nyb2xsOiBudW1iZXI7XHJcbiAgcHVibGljIGluc2lnaHRQcmlzbTogbnVtYmVyO1xyXG4gIHB1YmxpYyByZWZsZWN0aXZlRXNzZW5jZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBhbXBsaWZpY2F0aW9uQ3J5c3RhbDogbnVtYmVyO1xyXG4gIHB1YmxpYyBjcmVhdGl2ZUNhdGFseXN0OiBudW1iZXI7XHJcbiAgcHVibGljIHByZWNpc2lvbkxlbnM6IG51bWJlcjtcclxuICBwdWJsaWMgdGVtcG9yYWxUd2Vha2VyOiBudW1iZXI7XHJcbiAgcHVibGljIHBlcnBldHVhbFByb2dyZXNzOiBudW1iZXI7XHJcbiAgcHVibGljIHN0cmF0ZWdpY1N5bmFwc2VzOiBudW1iZXI7XHJcbiAgcHVibGljIGFjY2VsZXJhdGVkQWNxdWlzaXRpb246IG51bWJlcjtcclxuICBwdWJsaWMgbGlua2Vyc0xvZGU6IG51bWJlcjtcclxuICBwdWJsaWMgZWZmb3J0bGVzc0V4cGFuc2lvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyByZWN1cnNpdmVSZWZsZWN0aW9uOiBudW1iZXI7XHJcbiAgcHVibGljIHN5bmFwdGljU3VyZ2U6IG51bWJlcjtcclxuICBwdWJsaWMgaW5zcGlyYXRpb25JbmZ1c2lvbjogbnVtYmVyO1xyXG4gIHB1YmxpYyB0aXRsZVRpdGFuOiBudW1iZXI7XHJcbiAgcHVibGljIHByZWNpc2lvblByaXNtOiBudW1iZXI7XHJcbiAgcHVibGljIGh5cGVybGlua0hhcm1vbnk6IG51bWJlcjtcclxuICBwdWJsaWMgZXBoZW1lcmFsRXVwaG9yaWE6IG51bWJlcjtcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclBlcnBldHVhbFByb2dyZXNzOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVBlcnBldHVhbFByb2dyZXNzOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclN0cmF0ZWdpY1N5bmFwc2VzOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVN0cmF0ZWdpY1N5bmFwc2VzOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvckxpbmtlcnNMb2RlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZUxpbmtlcnNMb2RlOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb246IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlUmVjdXJzaXZlUmVmbGVjdGlvbjogc3RyaW5nXHJcbiAgcHVibGljIGJvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVN5bmFwdGljU3VyZ2U6IHN0cmluZ1xyXG4gIHB1YmxpYyBib29zdGVyRmFjdG9yVGl0bGVUaXRhbjogYm9vbGVhbjtcclxuICBwdWJsaWMgYm9vc3RlckRhdGVUaXRsZVRpdGFuOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3RvclByZWNpc2lvblByaXNtOiBib29sZWFuO1xyXG4gIHB1YmxpYyBib29zdGVyRGF0ZVByZWNpc2lvblByaXNtOiBzdHJpbmdcclxuICBwdWJsaWMgYm9vc3RlckZhY3Rvckh5cGVybGlua0hhcm1vbnk6IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlSHlwZXJsaW5rSGFybW9ueTogc3RyaW5nO1xyXG4gIHB1YmxpYyBib29zdGVyRmFjdG9yRXBoZW1lcmFsRXVwaG9yaWE6IGJvb2xlYW47XHJcbiAgcHVibGljIGJvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWE6IHN0cmluZztcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogZ2FtaWZpY2F0aW9uKSB7XHJcblx0ICBzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0ICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcbiAgXHJcblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGFpbmVyRWwuYWRkQ2xhc3MoXCJleGNhbGlkcmF3LXNldHRpbmdzXCIpO1xyXG5cdFx0dGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnN0IGNvZmZlZURpdiA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdihcImNvZmZlZVwiKTtcclxuXHRcdGNvZmZlZURpdi5hZGRDbGFzcyhcImV4LWNvZmZlZS1kaXZcIik7XHJcblx0XHRjb25zdCBjb2ZmZWVMaW5rID0gY29mZmVlRGl2LmNyZWF0ZUVsKFwiYVwiLCB7XHJcblx0XHRocmVmOiBcImh0dHBzOi8va28tZmkuY29tL2FuZHJlYXN0cmViaW5nXCIsXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGNvZmZlZUltZyA9IGNvZmZlZUxpbmsuY3JlYXRlRWwoXCJpbWdcIiwge1xyXG5cdFx0YXR0cjoge1xyXG5cdFx0XHRzcmM6IFwiaHR0cHM6Ly9jZG4ua28tZmkuY29tL2Nkbi9rb2ZpMy5wbmc/dj0zXCIsXHJcblx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHRjb2ZmZWVJbWcuaGVpZ2h0ID0gNDU7XHJcblxyXG5cdFx0Ly9jb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Ly9jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gIFxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnR2FtaWZ5IHlvdXIgUEtNIC0gU2V0dGluZ3MnIH0pO1xyXG5cdFx0Y29uc29sZS5sb2coJ3NldHRpbmdzIGNhbGxlZCcpXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJyN0YWdzIHRvIGlnbm9yZScpXHJcblx0XHRcdC5zZXREZXNjKCdlbnRlciB0YWdzIHdpdGhvdXQgIyBhbmQgc2VwYXJhdGUgd2l0aCBcIiwgXCIuXFxuSW5jbHVkZSBuZXN0ZWQgdGFncy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHlvdXIgdGFnMSwgdGFnMi9zdWJ0YWcsIFx1MjAyNicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NFeGNsdWRlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZ3NFeGNsdWRlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0XHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdmb2xkZXIgdG8gaWdub3JlJylcclxuXHRcdFx0LnNldERlc2MoJ2VudGVyIGZvbGRlciB3aGljaHMgY29udGVudCBzaGFsbCBiZSBpZ25vcmVkLiBTZXBhcmF0ZSB3aXRoIFwiLCBcIi4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHlvdXIgZm9sZGVyMSwgZm9sZGVyMiwgXHUyMDI2JylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyRXhjbHVkZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnZm9sZGVyIHRvIGV4Y2x1ZGU6ICcgKyB2YWx1ZSk7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb2xkZXJFeGNsdWRlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9maWxlIFBhZ2UgTmFtZScpXHJcblx0XHRcdC5zZXREZXNjKCd5b3UgY2FuIGNoYW5nZSBoZXJlIHRoZSBuYW1lIG9mIHlvdXIgcHJvZmlsZSBwYWdlIGlmIHlvdSBsaWtlLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCduYW1lJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ZvbGRlciB0byBleGNsdWRlOiAnICsgdmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdmF0YXJQYWdlTmFtZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdPdGhlciBTZXR0aW5ncycgfSk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0Rpc2FibGUgSW5pdCBDb21tYW5kJylcclxuXHRcdFx0LnNldERlc2MoJ3lvdSBjYW4gcmVtb3ZlIHRoZSBpbml0IGNvbW1hbmQgZnJvbSBjb21tYW5kIHByb21wdCBieSBzd2l0Y2hpbmcgb2ZmLlxcbnJlc3RhcnQgbmVlZGVkLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gXHJcblx0XHRcdFx0dG9nZ2xlXHJcbiAgICAgICAgICBcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUluaXRDb21tYW5kKVxyXG4gICAgICAgIFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlSW5pdENvbW1hbmQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgXHRcdFx0dGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG4gICAgICAgICAgXHRcdFx0fSksXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ2xpbWl0IHRoZSB2aXNpYmxlIG1vbnRoIGluIHRoZSBjaGFydCBvbiB5b3VyIGF2YXRhciBwYWdlOiAnICsgdGhpcy5wbHVnaW4uc2V0dGluZ3MuYXZhdGFyUGFnZU5hbWUpXHJcblx0XHRcdC5zZXREZXNjKCdpZiAwLCBhbGwgbW9udGggd2lsbCBiZSBzaG93bi4gRW50ZXIgYSBudW1iZXIgaG93IG1hbnkgbW9udGggc2hhbGwgYmUgc2hvd24uJylcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ051bWJlciBvZiBNb250aCB0byBzaG93JylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jaGFydFJlZHV6aWVydW5nTW9uYXRlLnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmNoYXJ0UmVkdXppZXJ1bmdNb25hdGUgPSBwYXJzZUludCh2YWx1ZSk7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcbiAgXHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdQcm9ncmVzc2l2ZSBTdW1tYXJpemF0aW9uJylcclxuXHRcdFx0LnNldERlc2MoJ3lvdSBjYW4gY2hhbmdlIHdoaWNoIGZvcm1hdHRpbmcgeW91IHVzZSBmb3IgTGF5ZXIgMiBhbmQgMy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignTGF5ZXIgMiBpcyB1c3VhbGx5ICoqJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ZvbGRlciB0byBleGNsdWRlOiAnICsgdmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9ncmVzc2l2ZVN1bUxheWVyMiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSlcclxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0xheWVyIDMgaXMgdXN1YWxseSA9PScpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdmb2xkZXIgdG8gZXhjbHVkZTogJyArIHZhbHVlKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvZ3Jlc3NpdmVTdW1MYXllcjMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pKTtcclxuXHJcblx0fVxyXG4gIH0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVxdWlyZWRBcmdzKHJlcXVpcmVkLCBhcmdzKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA8IHJlcXVpcmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihyZXF1aXJlZCArICcgYXJndW1lbnQnICsgKHJlcXVpcmVkID4gMSA/ICdzJyA6ICcnKSArICcgcmVxdWlyZWQsIGJ1dCBvbmx5ICcgKyBhcmdzLmxlbmd0aCArICcgcHJlc2VudCcpO1xuICB9XG59IiwgImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCBfdHlwZW9mKHZhbHVlKSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufSIsICJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSB0b0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIERhdGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0cyBjbG9uZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIGl0IGlzIHRyZWF0ZWQgYXMgYSB0aW1lc3RhbXAuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIG5vbmUgb2YgdGhlIGFib3ZlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gYXJndW1lbnQgLSB0aGUgdmFsdWUgdG8gY29udmVydFxuICogQHJldHVybnMge0RhdGV9IHRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7XG5cbiAgLy8gQ2xvbmUgdGhlIGRhdGVcbiAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fCBfdHlwZW9mKGFyZ3VtZW50KSA9PT0gJ29iamVjdCcgJiYgYXJnU3RyID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBkYXRlIHRvIGxvc2UgdGhlIG1pbGxpc2Vjb25kcyB3aGVuIHBhc3NlZCB0byBuZXcgRGF0ZSgpIGluIElFMTBcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdudW1iZXInIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmICgodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IFN0cmluZ10nKSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXCJTdGFydGluZyB3aXRoIHYyLjAuMC1iZXRhLjEgZGF0ZS1mbnMgZG9lc24ndCBhY2NlcHQgc3RyaW5ncyBhcyBkYXRlIGFyZ3VtZW50cy4gUGxlYXNlIHVzZSBgcGFyc2VJU09gIHRvIHBhcnNlIHN0cmluZ3MuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI3N0cmluZy1hcmd1bWVudHNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbn0iLCAiaW1wb3J0IGlzRGF0ZSBmcm9tIFwiLi4vaXNEYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzVmFsaWRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdmFsaWQ/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGZhbHNlIGlmIGFyZ3VtZW50IGlzIEludmFsaWQgRGF0ZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBBcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gRGF0ZSB1c2luZyBgdG9EYXRlYC4gU2VlIFt0b0RhdGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvdG9EYXRlfVxuICogSW52YWxpZCBEYXRlIGlzIGEgRGF0ZSwgd2hvc2UgdGltZSB2YWx1ZSBpcyBOYU4uXG4gKlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogQHBhcmFtIHsqfSBkYXRlIC0gdGhlIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZSBpcyB2YWxpZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoMjAxNCwgMSwgMzEpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgdmFsdWUsIGNvbnZlcnRhYmxlIGludG8gYSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZCgxMzkzODA0ODAwMDAwKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgnJykpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICBpZiAoIWlzRGF0ZShkaXJ0eURhdGUpICYmIHR5cGVvZiBkaXJ0eURhdGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHJldHVybiAhaXNOYU4oTnVtYmVyKGRhdGUpKTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9JbnRlZ2VyKGRpcnR5TnVtYmVyKSB7XG4gIGlmIChkaXJ0eU51bWJlciA9PT0gbnVsbCB8fCBkaXJ0eU51bWJlciA9PT0gdHJ1ZSB8fCBkaXJ0eU51bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bWJlciA8IDAgPyBNYXRoLmNlaWwobnVtYmVyKSA6IE1hdGguZmxvb3IobnVtYmVyKTtcbn0iLCAiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHRpbWVzdGFtcCA9IHRvRGF0ZShkaXJ0eURhdGUpLmdldFRpbWUoKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyBhbW91bnQpO1xufSIsICJpbXBvcnQgYWRkTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9hZGRNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdWJNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgc3VidHJhY3RlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgc3VidHJhY3RlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA3NTAgbWlsbGlzZWNvbmRzIGZyb20gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1Yk1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjI5LjI1MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCAtYW1vdW50KTtcbn0iLCAiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fREFZID0gODY0MDAwMDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENEYXlPZlllYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mWWVhclRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICB2YXIgZGlmZmVyZW5jZSA9IHRpbWVzdGFtcCAtIHN0YXJ0T2ZZZWFyVGltZXN0YW1wO1xuICByZXR1cm4gTWF0aC5mbG9vcihkaWZmZXJlbmNlIC8gTUlMTElTRUNPTkRTX0lOX0RBWSkgKyAxO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWsoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gMTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuICBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59IiwgImltcG9ydCBnZXRVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ0lTT1dlZWtZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIHllYXIgPSBnZXRVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpO1xuICB2YXIgZm91cnRoT2ZKYW51YXJ5ID0gbmV3IERhdGUoMCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeSk7XG4gIHJldHVybiBkYXRlO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRpZmYgPSBzdGFydE9mVVRDSVNPV2VlayhkYXRlKS5nZXRUaW1lKCkgLSBzdGFydE9mVVRDSVNPV2Vla1llYXIoZGF0ZSkuZ2V0VGltZSgpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSykgKyAxO1xufSIsICJ2YXIgZGVmYXVsdE9wdGlvbnMgPSB7fTtcbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufSIsICJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuLi9kZWZhdWx0T3B0aW9ucy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ1dlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfcmVmMiwgX3JlZjMsIF9vcHRpb25zJHdlZWtTdGFydHNPbiwgX29wdGlvbnMkbG9jYWxlLCBfb3B0aW9ucyRsb2NhbGUkb3B0aW8sIF9kZWZhdWx0T3B0aW9ucyRsb2NhbCwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMjtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSB0b0ludGVnZXIoKF9yZWYgPSAoX3JlZjIgPSAoX3JlZjMgPSAoX29wdGlvbnMkd2Vla1N0YXJ0c09uID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX29wdGlvbnMkd2Vla1N0YXJ0c09uICE9PSB2b2lkIDAgPyBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX29wdGlvbnMkbG9jYWxlJG9wdGlvID0gX29wdGlvbnMkbG9jYWxlLm9wdGlvbnMpID09PSBudWxsIHx8IF9vcHRpb25zJGxvY2FsZSRvcHRpbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbG9jYWxlJG9wdGlvLndlZWtTdGFydHNPbikgIT09IG51bGwgJiYgX3JlZjMgIT09IHZvaWQgMCA/IF9yZWYzIDogZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmMiAhPT0gdm9pZCAwID8gX3JlZjIgOiAoX2RlZmF1bHRPcHRpb25zJGxvY2FsID0gZGVmYXVsdE9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwyID0gX2RlZmF1bHRPcHRpb25zJGxvY2FsLm9wdGlvbnMpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogMCk7XG5cbiAgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAwIGFuZCA2IF9hbmRfIGlzIG5vdCBOYU5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCAiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgb3B0aW9ucykge1xuICB2YXIgX3JlZiwgX3JlZjIsIF9yZWYzLCBfb3B0aW9ucyRmaXJzdFdlZWtDb24sIF9vcHRpb25zJGxvY2FsZSwgX29wdGlvbnMkbG9jYWxlJG9wdGlvLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwsIF9kZWZhdWx0T3B0aW9ucyRsb2NhbDI7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IHRvSW50ZWdlcigoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8uZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAxKTtcblxuICAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDEgYW5kIDcgX2FuZF8gaXMgbm90IE5hTlxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldFVUQ0Z1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mVVRDV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcbiAgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufSIsICJpbXBvcnQgZ2V0VVRDV2Vla1llYXIgZnJvbSBcIi4uL2dldFVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENXZWVrWWVhcihkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9yZWYsIF9yZWYyLCBfcmVmMywgX29wdGlvbnMkZmlyc3RXZWVrQ29uLCBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbywgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyO1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IHRvSW50ZWdlcigoX3JlZiA9IChfcmVmMiA9IChfcmVmMyA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUkb3B0aW8gPSBfb3B0aW9ucyRsb2NhbGUub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlJG9wdGlvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUkb3B0aW8uZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmMyAhPT0gdm9pZCAwID8gX3JlZjMgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiAxKTtcbiAgdmFyIHllYXIgPSBnZXRVVENXZWVrWWVhcihkaXJ0eURhdGUsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vlay5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWsuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBkYXRlID0gc3RhcnRPZlVUQ1dlZWsoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwgImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrWWVhciBmcm9tIFwiLi4vc3RhcnRPZlVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbnZhciBNSUxMSVNFQ09ORFNfSU5fV0VFSyA9IDYwNDgwMDAwMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGlmZiA9IHN0YXJ0T2ZVVENXZWVrKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKSAtIHN0YXJ0T2ZVVENXZWVrWWVhcihkYXRlLCBvcHRpb25zKS5nZXRUaW1lKCk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdClcbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIE1JTExJU0VDT05EU19JTl9XRUVLKSArIDE7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgPyAnLScgOiAnJztcbiAgdmFyIG91dHB1dCA9IE1hdGguYWJzKG51bWJlcikudG9TdHJpbmcoKTtcbiAgd2hpbGUgKG91dHB1dC5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHNpZ24gKyBvdXRwdXQ7XG59IiwgImltcG9ydCBhZGRMZWFkaW5nWmVyb3MgZnJvbSBcIi4uLy4uL2FkZExlYWRpbmdaZXJvcy9pbmRleC5qc1wiO1xuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIHkoZGF0ZSwgdG9rZW4pIHtcbiAgICAvLyBGcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtMzEvdHIzNS1kYXRlcy5odG1sI0RhdGVfRm9ybWF0X3Rva2Vuc1xuICAgIC8vIHwgWWVhciAgICAgfCAgICAgeSB8IHl5IHwgICB5eXkgfCAgeXl5eSB8IHl5eXl5IHxcbiAgICAvLyB8LS0tLS0tLS0tLXwtLS0tLS0tfC0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18XG4gICAgLy8gfCBBRCAxICAgICB8ICAgICAxIHwgMDEgfCAgIDAwMSB8ICAwMDAxIHwgMDAwMDEgfFxuICAgIC8vIHwgQUQgMTIgICAgfCAgICAxMiB8IDEyIHwgICAwMTIgfCAgMDAxMiB8IDAwMDEyIHxcbiAgICAvLyB8IEFEIDEyMyAgIHwgICAxMjMgfCAyMyB8ICAgMTIzIHwgIDAxMjMgfCAwMDEyMyB8XG4gICAgLy8gfCBBRCAxMjM0ICB8ICAxMjM0IHwgMzQgfCAgMTIzNCB8ICAxMjM0IHwgMDEyMzQgfFxuICAgIC8vIHwgQUQgMTIzNDUgfCAxMjM0NSB8IDQ1IHwgMTIzNDUgfCAxMjM0NSB8IDEyMzQ1IHxcblxuICAgIHZhciBzaWduZWRZZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSAneXknID8geWVhciAlIDEwMCA6IHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSAnTScgPyBTdHJpbmcobW9udGggKyAxKSA6IGFkZExlYWRpbmdaZXJvcyhtb250aCArIDEsIDIpO1xuICB9LFxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDRGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBBTSBvciBQTVxuICBhOiBmdW5jdGlvbiBhKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0VVRDSG91cnMoKSAvIDEyID49IDEgPyAncG0nIDogJ2FtJztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdhJzpcbiAgICAgIGNhc2UgJ2FhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSAnYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICAgIGNhc2UgJ2FhYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgJ2FhYWEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gJ2FtJyA/ICdhLm0uJyA6ICdwLm0uJztcbiAgICB9XG4gIH0sXG4gIC8vIEhvdXIgWzEtMTJdXG4gIGg6IGZ1bmN0aW9uIGgoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBIb3VyIFswLTIzXVxuICBIOiBmdW5jdGlvbiBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ01pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gU2Vjb25kXG4gIHM6IGZ1bmN0aW9uIHMoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDU2Vjb25kcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gUyhkYXRlLCB0b2tlbikge1xuICAgIHZhciBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgICB2YXIgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCAiaW1wb3J0IGdldFVUQ0RheU9mWWVhciBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENEYXlPZlllYXIvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENJU09XZWVrIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBnZXRVVENJU09XZWVrWWVhciBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ1dlZWsgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ1dlZWtZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTGVhZGluZ1plcm9zIGZyb20gXCIuLi8uLi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanNcIjtcbmltcG9ydCBsaWdodEZvcm1hdHRlcnMgZnJvbSBcIi4uL2xpZ2h0Rm9ybWF0dGVycy9pbmRleC5qc1wiO1xudmFyIGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiAnYW0nLFxuICBwbTogJ3BtJyxcbiAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gIG5vb246ICdub29uJyxcbiAgbW9ybmluZzogJ21vcm5pbmcnLFxuICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICBldmVuaW5nOiAnZXZlbmluZycsXG4gIG5pZ2h0OiAnbmlnaHQnXG59O1xuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8gIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAhIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgIHwgIFAhIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHogIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgZm9ybWF0YCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqIC0gYFBgIGlzIGxvbmcgbG9jYWxpemVkIGRhdGUgZm9ybWF0XG4gKiAtIGBwYCBpcyBsb25nIGxvY2FsaXplZCB0aW1lIGZvcm1hdFxuICovXG5cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBFcmFcbiAgRzogZnVuY3Rpb24gRyhkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZXJhID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpID4gMCA/IDEgOiAwO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSAnRyc6XG4gICAgICBjYXNlICdHRyc6XG4gICAgICBjYXNlICdHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93J1xuICAgICAgICB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlICdHR0dHJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIFllYXJcbiAgeTogZnVuY3Rpb24geShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gJ3lvJykge1xuICAgICAgdmFyIHNpZ25lZFllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHllYXIsIHtcbiAgICAgICAgdW5pdDogJ3llYXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiBZKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBzaWduZWRXZWVrWWVhciA9IGdldFVUQ1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgdmFyIHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgICAgdmFyIHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpO1xuICAgIH1cblxuICAgIC8vIE9yZGluYWwgbnVtYmVyXG4gICAgaWYgKHRva2VuID09PSAnWW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwge1xuICAgICAgICB1bml0OiAneWVhcidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmdcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiBSKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGlzb1dlZWtZZWFyID0gZ2V0VVRDSVNPV2Vla1llYXIoZGF0ZSk7XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gdShkYXRlLCB0b2tlbikge1xuICAgIHZhciB5ZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiBRKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgJ1EnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgJ1FRJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSAnUW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7XG4gICAgICAgICAgdW5pdDogJ3F1YXJ0ZXInXG4gICAgICAgIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgJ1FRUSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgJ1FRUVFRJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSAnUVFRUSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIHEoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIC8gMyk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSAncSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSAncXEnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlICdxbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB1bml0OiAncXVhcnRlcidcbiAgICAgICAgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSAncXFxJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSAncXFxcXEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlICdxcXFxJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIE0oZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIG1vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ00nOlxuICAgICAgY2FzZSAnTU0nOlxuICAgICAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLk0oZGF0ZSwgdG9rZW4pO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSAnTW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHtcbiAgICAgICAgICB1bml0OiAnbW9udGgnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlICdNTU0nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlICdNTU1NJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gTChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSAnTCc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobW9udGggKyAxKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlICdMbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwge1xuICAgICAgICAgIHVuaXQ6ICdtb250aCdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgJ0xMTCc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSAnTExMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgJ0xMTEwnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBMb2NhbCB3ZWVrIG9mIHllYXJcbiAgdzogZnVuY3Rpb24gdyhkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgd2VlayA9IGdldFVUQ1dlZWsoZGF0ZSwgb3B0aW9ucyk7XG4gICAgaWYgKHRva2VuID09PSAnd28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7XG4gICAgICAgIHVuaXQ6ICd3ZWVrJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3Mod2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiBJKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBpc29XZWVrID0gZ2V0VVRDSVNPV2VlayhkYXRlKTtcbiAgICBpZiAodG9rZW4gPT09ICdJbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHtcbiAgICAgICAgdW5pdDogJ3dlZWsnXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIGQoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnZG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ0RhdGUoKSwge1xuICAgICAgICB1bml0OiAnZGF0ZSdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiBEKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBkYXlPZlllYXIgPSBnZXRVVENEYXlPZlllYXIoZGF0ZSk7XG4gICAgaWYgKHRva2VuID09PSAnRG8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHtcbiAgICAgICAgdW5pdDogJ2RheU9mWWVhcidcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHdlZWtcbiAgRTogZnVuY3Rpb24gRShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgJ0UnOlxuICAgICAgY2FzZSAnRUUnOlxuICAgICAgY2FzZSAnRUVFJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlICdFRUVFRUUnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnc2hvcnQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgJ0VFRUUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIGUoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pXG4gICAgICBjYXNlICdlJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlICdlZSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlICdlbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdlZWUnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2VlZWVlJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2VlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnZWVlZSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbiAgYzogZnVuY3Rpb24gYyhkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSAnY2MnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlICdjbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICBjYXNlICdjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2NjY2NjJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2NjY2NjYyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIGkoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGlzb0RheU9mV2VlayA9IGRheU9mV2VlayA9PT0gMCA/IDcgOiBkYXlPZldlZWs7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSAnaSc6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlICdpaSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMm5kXG4gICAgICBjYXNlICdpbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2Vlaywge1xuICAgICAgICAgIHVuaXQ6ICdkYXknXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlICdpaWknOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgJ2lpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgJ2lpaWlpaSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSAnaWlpaSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gYShkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICdwbScgOiAnYW0nO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnYWEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2FhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlICdhYWFhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2FhYWEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gYihkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gJ3BtJyA6ICdhbSc7XG4gICAgfVxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgY2FzZSAnYmInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2JiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlICdiYmJiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ2JiYmInOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gQihkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnQic6XG4gICAgICBjYXNlICdCQic6XG4gICAgICBjYXNlICdCQkInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIGNhc2UgJ0JCQkJCJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAnQkJCQic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gaChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdobycpIHtcbiAgICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyO1xuICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5oKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gSChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdIbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0VVRDSG91cnMoKSwge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLkgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiBLKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBob3VycyA9IGRhdGUuZ2V0VVRDSG91cnMoKSAlIDEyO1xuICAgIGlmICh0b2tlbiA9PT0gJ0tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSG91ciBbMS0yNF1cbiAgazogZnVuY3Rpb24gayhkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuICAgIGlmICh0b2tlbiA9PT0gJ2tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIG0oZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnbW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ01pbnV0ZXMoKSwge1xuICAgICAgICB1bml0OiAnbWludXRlJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiBzKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ3NvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENTZWNvbmRzKCksIHtcbiAgICAgICAgdW5pdDogJ3NlY29uZCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gUyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIFgoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSBvcmlnaW5hbERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiAnWic7XG4gICAgfVxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlICdYJzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuICAgICAgY2FzZSAnWFhYWCc6XG4gICAgICBjYXNlICdYWCc6XG4gICAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWFhgXG4gICAgICBjYXNlICdYWFhYWCc6XG4gICAgICBjYXNlICdYWFgnOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpXG4gIHg6IGZ1bmN0aW9uIHgoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSBvcmlnaW5hbERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSAneCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgJ3h4eHgnOlxuICAgICAgY2FzZSAneHgnOlxuICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuICAgICAgY2FzZSAneHh4eHgnOlxuICAgICAgY2FzZSAneHh4JzogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiBPKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ08nOlxuICAgICAgY2FzZSAnT08nOlxuICAgICAgY2FzZSAnT09PJzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgJ09PT08nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiB6KGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ3onOlxuICAgICAgY2FzZSAnenonOlxuICAgICAgY2FzZSAnenp6JzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgJ3p6enonOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsICc6Jyk7XG4gICAgfVxuICB9LFxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiB0KGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWVzdGFtcCA9IE1hdGguZmxvb3Iob3JpZ2luYWxEYXRlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIFQoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXN0YW1wID0gb3JpZ2luYWxEYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkaXJ0eURlbGltaXRlcikge1xuICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAnLScgOiAnKyc7XG4gIHZhciBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGFic09mZnNldCAvIDYwKTtcbiAgdmFyIG1pbnV0ZXMgPSBhYnNPZmZzZXQgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gc2lnbiArIFN0cmluZyhob3Vycyk7XG4gIH1cbiAgdmFyIGRlbGltaXRlciA9IGRpcnR5RGVsaW1pdGVyIHx8ICcnO1xuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkaXJ0eURlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICB2YXIgc2lnbiA9IG9mZnNldCA+IDAgPyAnLScgOiAnKyc7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkaXJ0eURlbGltaXRlcik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBkZWxpbWl0ZXIgPSBkaXJ0eURlbGltaXRlciB8fCAnJztcbiAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICB2YXIgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgdmFyIGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgdmFyIG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbmV4cG9ydCBkZWZhdWx0IGZvcm1hdHRlcnM7IiwgInZhciBkYXRlTG9uZ0Zvcm1hdHRlciA9IGZ1bmN0aW9uIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSAnUCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1BQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ1BQUCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG4gICAgY2FzZSAnUFBQUCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgfVxufTtcbnZhciB0aW1lTG9uZ0Zvcm1hdHRlciA9IGZ1bmN0aW9uIHRpbWVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpIHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSAncCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ3BwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuICAgIGNhc2UgJ3BwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG4gICAgY2FzZSAncHBwcCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgfVxufTtcbnZhciBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSBmdW5jdGlvbiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZykge1xuICB2YXIgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKC8oUCspKHArKT8vKSB8fCBbXTtcbiAgdmFyIGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIHZhciB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdO1xuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG4gIHZhciBkYXRlVGltZUZvcm1hdDtcbiAgc3dpdGNoIChkYXRlUGF0dGVybikge1xuICAgIGNhc2UgJ1AnOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdzaG9ydCdcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnUFAnOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHtcbiAgICAgICAgd2lkdGg6ICdtZWRpdW0nXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BQUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1BQUFAnOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2Z1bGwnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBkYXRlVGltZUZvcm1hdC5yZXBsYWNlKCd7e2RhdGV9fScsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSkucmVwbGFjZSgne3t0aW1lfX0nLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufTtcbnZhciBsb25nRm9ybWF0dGVycyA9IHtcbiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsXG4gIFA6IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlclxufTtcbmV4cG9ydCBkZWZhdWx0IGxvbmdGb3JtYXR0ZXJzOyIsICIvKipcbiAqIEdvb2dsZSBDaHJvbWUgYXMgb2YgNjcuMC4zMzk2Ljg3IGludHJvZHVjZWQgdGltZXpvbmVzIHdpdGggb2Zmc2V0IHRoYXQgaW5jbHVkZXMgc2Vjb25kcy5cbiAqIFRoZXkgdXN1YWxseSBhcHBlYXIgZm9yIGRhdGVzIHRoYXQgZGVub3RlIHRpbWUgYmVmb3JlIHRoZSB0aW1lem9uZXMgd2VyZSBpbnRyb2R1Y2VkXG4gKiAoZS5nLiBmb3IgJ0V1cm9wZS9QcmFndWUnIHRpbWV6b25lIHRoZSBvZmZzZXQgaXMgR01UKzAwOjU3OjQ0IGJlZm9yZSAxIE9jdG9iZXIgMTg5MVxuICogYW5kIEdNVCswMTowMDowMCBhZnRlciB0aGF0IGRhdGUpXG4gKlxuICogRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gbWludXRlcyBhbmQgd291bGQgcmV0dXJuIDU3IGZvciB0aGUgZXhhbXBsZSBhYm92ZSxcbiAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0YWtlcyBzZWNvbmRzIGluIGFjY291bnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkge1xuICB2YXIgdXRjRGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpKTtcbiAgdXRjRGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gZGF0ZS5nZXRUaW1lKCkgLSB1dGNEYXRlLmdldFRpbWUoKTtcbn0iLCAidmFyIHByb3RlY3RlZERheU9mWWVhclRva2VucyA9IFsnRCcsICdERCddO1xudmFyIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zID0gWydZWScsICdZWVlZJ107XG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gcHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGlmICh0b2tlbiA9PT0gJ1lZWVknKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0QnKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYGRgIGluc3RlYWQgb2YgYERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0REJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXCIpKTtcbiAgfVxufSIsICJ2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6ICdsZXNzIHRoYW4gYSBzZWNvbmQnLFxuICAgIG90aGVyOiAnbGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICB4U2Vjb25kczoge1xuICAgIG9uZTogJzEgc2Vjb25kJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICBoYWxmQU1pbnV0ZTogJ2hhbGYgYSBtaW51dGUnLFxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiAnbGVzcyB0aGFuIGEgbWludXRlJyxcbiAgICBvdGhlcjogJ2xlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6ICcxIG1pbnV0ZScsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIGhvdXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4SG91cnM6IHtcbiAgICBvbmU6ICcxIGhvdXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4RGF5czoge1xuICAgIG9uZTogJzEgZGF5JyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBkYXlzJ1xuICB9LFxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogJ2Fib3V0IDEgd2VlaycsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIHhXZWVrczoge1xuICAgIG9uZTogJzEgd2VlaycsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogJ2Fib3V0IDEgbW9udGgnLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgeE1vbnRoczoge1xuICAgIG9uZTogJzEgbW9udGgnLFxuICAgIG90aGVyOiAne3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIHllYXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IHllYXJzJ1xuICB9LFxuICB4WWVhcnM6IHtcbiAgICBvbmU6ICcxIHllYXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IHllYXJzJ1xuICB9LFxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiAnb3ZlciAxIHllYXInLFxuICAgIG90aGVyOiAnb3ZlciB7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogJ2FsbW9zdCAxIHllYXInLFxuICAgIG90aGVyOiAnYWxtb3N0IHt7Y291bnR9fSB5ZWFycydcbiAgfVxufTtcbnZhciBmb3JtYXREaXN0YW5jZSA9IGZ1bmN0aW9uIGZvcm1hdERpc3RhbmNlKHRva2VuLCBjb3VudCwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuICB2YXIgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcbiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoJ3t7Y291bnR9fScsIGNvdW50LnRvU3RyaW5nKCkpO1xuICB9XG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuICdpbiAnICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgJyBhZ28nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdERpc3RhbmNlOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZEZvcm1hdExvbmdGbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICB2YXIgZm9ybWF0ID0gYXJncy5mb3JtYXRzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHNbYXJncy5kZWZhdWx0V2lkdGhdO1xuICAgIHJldHVybiBmb3JtYXQ7XG4gIH07XG59IiwgImltcG9ydCBidWlsZEZvcm1hdExvbmdGbiBmcm9tIFwiLi4vLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi9pbmRleC5qc1wiO1xudmFyIGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiAnRUVFRSwgTU1NTSBkbywgeScsXG4gIGxvbmc6ICdNTU1NIGRvLCB5JyxcbiAgbWVkaXVtOiAnTU1NIGQsIHknLFxuICBzaG9ydDogJ01NL2RkL3l5eXknXG59O1xudmFyIHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiAnaDptbTpzcyBhIHp6enonLFxuICBsb25nOiAnaDptbTpzcyBhIHonLFxuICBtZWRpdW06ICdoOm1tOnNzIGEnLFxuICBzaG9ydDogJ2g6bW0gYSdcbn07XG52YXIgZGF0ZVRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbG9uZzogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIG1lZGl1bTogJ3t7ZGF0ZX19LCB7e3RpbWV9fScsXG4gIHNob3J0OiAne3tkYXRlfX0sIHt7dGltZX19J1xufTtcbnZhciBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSksXG4gIHRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KSxcbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiAnZnVsbCdcbiAgfSlcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtYXRMb25nOyIsICJ2YXIgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiAnUCdcbn07XG52YXIgZm9ybWF0UmVsYXRpdmUgPSBmdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZSh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtYXRSZWxhdGl2ZTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkaXJ0eUluZGV4LCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnRleHQgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6ICdzdGFuZGFsb25lJztcbiAgICB2YXIgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09ICdmb3JtYXR0aW5nJyAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIHZhciBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICB2YXIgd2lkdGggPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2RlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgdmFyIF93aWR0aCA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwICYmIG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbX3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tfZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKGRpcnR5SW5kZXgpIDogZGlydHlJbmRleDtcbiAgICAvLyBAdHMtaWdub3JlOiBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59IiwgImltcG9ydCBidWlsZExvY2FsaXplRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzXCI7XG52YXIgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnQicsICdBJ10sXG4gIGFiYnJldmlhdGVkOiBbJ0JDJywgJ0FEJ10sXG4gIHdpZGU6IFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXG59O1xudmFyIHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogWycxJywgJzInLCAnMycsICc0J10sXG4gIGFiYnJldmlhdGVkOiBbJ1ExJywgJ1EyJywgJ1EzJywgJ1E0J10sXG4gIHdpZGU6IFsnMXN0IHF1YXJ0ZXInLCAnMm5kIHF1YXJ0ZXInLCAnM3JkIHF1YXJ0ZXInLCAnNHRoIHF1YXJ0ZXInXVxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxudmFyIG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgd2lkZTogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ11cbn07XG52YXIgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLFxuICBzaG9ydDogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICBhYmJyZXZpYXRlZDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgd2lkZTogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddXG59O1xudmFyIGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06ICdhJyxcbiAgICBwbTogJ3AnLFxuICAgIG1pZG5pZ2h0OiAnbWknLFxuICAgIG5vb246ICduJyxcbiAgICBtb3JuaW5nOiAnbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnZXZlbmluZycsXG4gICAgbmlnaHQ6ICduaWdodCdcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogJ0FNJyxcbiAgICBwbTogJ1BNJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ21vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnbmlnaHQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ2EubS4nLFxuICAgIHBtOiAncC5tLicsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgICBuaWdodDogJ25pZ2h0J1xuICB9XG59O1xudmFyIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiAnYScsXG4gICAgcG06ICdwJyxcbiAgICBtaWRuaWdodDogJ21pJyxcbiAgICBub29uOiAnbicsXG4gICAgbW9ybmluZzogJ2luIHRoZSBtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdpbiB0aGUgYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnaW4gdGhlIGV2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnYXQgbmlnaHQnXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06ICdBTScsXG4gICAgcG06ICdQTScsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdpbiB0aGUgbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnaW4gdGhlIGFmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2luIHRoZSBldmVuaW5nJyxcbiAgICBuaWdodDogJ2F0IG5pZ2h0J1xuICB9LFxuICB3aWRlOiB7XG4gICAgYW06ICdhLm0uJyxcbiAgICBwbTogJ3AubS4nLFxuICAgIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICAgIG5vb246ICdub29uJyxcbiAgICBtb3JuaW5nOiAnaW4gdGhlIG1vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2luIHRoZSBhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdpbiB0aGUgZXZlbmluZycsXG4gICAgbmlnaHQ6ICdhdCBuaWdodCdcbiAgfVxufTtcbnZhciBvcmRpbmFsTnVtYmVyID0gZnVuY3Rpb24gb3JkaW5hbE51bWJlcihkaXJ0eU51bWJlciwgX29wdGlvbnMpIHtcbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICB2YXIgcmVtMTAwID0gbnVtYmVyICUgMTAwO1xuICBpZiAocmVtMTAwID4gMjAgfHwgcmVtMTAwIDwgMTApIHtcbiAgICBzd2l0Y2ggKHJlbTEwMCAlIDEwKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnc3QnO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ25kJztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArICdyZCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXIgKyAndGgnO1xufTtcbnZhciBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcjogb3JkaW5hbE51bWJlcixcbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBhcmd1bWVudENhbGxiYWNrOiBmdW5jdGlvbiBhcmd1bWVudENhbGxiYWNrKHF1YXJ0ZXIpIHtcbiAgICAgIHJldHVybiBxdWFydGVyIC0gMTtcbiAgICB9XG4gIH0pLFxuICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6ICd3aWRlJ1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsaXplOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZE1hdGNoRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgIHZhciBtYXRjaFBhdHRlcm4gPSB3aWR0aCAmJiBhcmdzLm1hdGNoUGF0dGVybnNbd2lkdGhdIHx8IGFyZ3MubWF0Y2hQYXR0ZXJuc1thcmdzLmRlZmF1bHRNYXRjaFdpZHRoXTtcbiAgICB2YXIgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpO1xuICAgIH0pIDogZmluZEtleShwYXJzZVBhdHRlcm5zLCBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKTtcbiAgICB9KTtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHByZWRpY2F0ZShvYmplY3Rba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSkgOiBwYXJzZVJlc3VsdFswXTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufSIsICJpbXBvcnQgYnVpbGRNYXRjaEZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi9pbmRleC5qc1wiO1xuaW1wb3J0IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gZnJvbSBcIi4uLy4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi9pbmRleC5qc1wiO1xudmFyIG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKSh0aHxzdHxuZHxyZCk/L2k7XG52YXIgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG52YXIgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihifGEpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihiXFwuP1xccz9jXFwuP3xiXFwuP1xccz9jXFwuP1xccz9lXFwuP3xhXFwuP1xccz9kXFwuP3xjXFwuP1xccz9lXFwuPykvaSxcbiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pXG59O1xudmFyIHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9eYi9pLCAvXihhfGMpL2ldXG59O1xudmFyIG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2lcbn07XG52YXIgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldXG59O1xudmFyIG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pXG59O1xudmFyIHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15qL2ksIC9eZi9pLCAvXm0vaSwgL15hL2ksIC9ebS9pLCAvXmovaSwgL15qL2ksIC9eYS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV0sXG4gIGFueTogWy9eamEvaSwgL15mL2ksIC9ebWFyL2ksIC9eYXAvaSwgL15tYXkvaSwgL15qdW4vaSwgL15qdWwvaSwgL15hdS9pLCAvXnMvaSwgL15vL2ksIC9ebi9pLCAvXmQvaV1cbn07XG52YXIgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaVxufTtcbnZhciBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV1cbn07XG52YXIgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2lcbn07XG52YXIgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pXG4gIH1cbn07XG52YXIgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogZnVuY3Rpb24gdmFsdWVDYWxsYmFjayh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9KSxcbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55JyxcbiAgICB2YWx1ZUNhbGxiYWNrOiBmdW5jdGlvbiB2YWx1ZUNhbGxiYWNrKGluZGV4KSB7XG4gICAgICByZXR1cm4gaW5kZXggKyAxO1xuICAgIH1cbiAgfSksXG4gIG1vbnRoOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogJ2FueSdcbiAgfSksXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogJ2FueSdcbiAgfSksXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnYW55JyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IG1hdGNoOyIsICJpbXBvcnQgZm9ybWF0RGlzdGFuY2UgZnJvbSBcIi4vX2xpYi9mb3JtYXREaXN0YW5jZS9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdExvbmcgZnJvbSBcIi4vX2xpYi9mb3JtYXRMb25nL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0UmVsYXRpdmUgZnJvbSBcIi4vX2xpYi9mb3JtYXRSZWxhdGl2ZS9pbmRleC5qc1wiO1xuaW1wb3J0IGxvY2FsaXplIGZyb20gXCIuL19saWIvbG9jYWxpemUvaW5kZXguanNcIjtcbmltcG9ydCBtYXRjaCBmcm9tIFwiLi9fbGliL21hdGNoL2luZGV4LmpzXCI7XG4vKipcbiAqIEB0eXBlIHtMb2NhbGV9XG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycH1cbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zc31cbiAqL1xudmFyIGxvY2FsZSA9IHtcbiAgY29kZTogJ2VuLVVTJyxcbiAgZm9ybWF0RGlzdGFuY2U6IGZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBmb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBsb2NhbGl6ZSxcbiAgbWF0Y2g6IG1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwIC8qIFN1bmRheSAqLyxcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDFcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTsiLCAiaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSBcIi4uLy4uL2xvY2FsZS9lbi1VUy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdExvY2FsZTsiLCAiaW1wb3J0IGlzVmFsaWQgZnJvbSBcIi4uL2lzVmFsaWQvaW5kZXguanNcIjtcbmltcG9ydCBzdWJNaWxsaXNlY29uZHMgZnJvbSBcIi4uL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgZm9ybWF0dGVycyBmcm9tIFwiLi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IGxvbmdGb3JtYXR0ZXJzIGZyb20gXCIuLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgZnJvbSBcIi4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbiwgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLCB0aHJvd1Byb3RlY3RlZEVycm9yIH0gZnJvbSBcIi4uL19saWIvcHJvdGVjdGVkVG9rZW5zL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4uL19saWIvZGVmYXVsdE9wdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCBkZWZhdWx0TG9jYWxlIGZyb20gXCIuLi9fbGliL2RlZmF1bHRMb2NhbGUvaW5kZXguanNcIjsgLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG52YXIgZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9beVlRcU1Md0lkRGVjaWhIS2ttc11vfChcXHcpXFwxKnwnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztcblxuLy8gVGhpcyBSZWdFeHAgY2F0Y2hlcyBzeW1ib2xzIGVzY2FwZWQgYnkgcXVvdGVzLCBhbmQgYWxzb1xuLy8gc2VxdWVuY2VzIG9mIHN5bWJvbHMgUCwgcCwgYW5kIHRoZSBjb21iaW5hdGlvbnMgbGlrZSBgUFBQUFBQUHBwcHBwYFxudmFyIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG52YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xudmFyIGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG52YXIgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBGb3JtYXQgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiA+IFx1MjZBMFx1RkUwRiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICogKHNlZSB0aGUgbGFzdCBleGFtcGxlKVxuICpcbiAqIEZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA3IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogQWNjZXB0ZWQgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAwdGgsIDE3dGggICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDIwMTd0aCAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IFIgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUiAgICAgIHwgLTQzLCAwMCwgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1LDcgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgdSAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNyAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhLi5hYSAgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhICAgICB8IGFtLCBwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgfCBhLm0uLCBwLm0uICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhYSAgIHwgYSwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgIHwgYi4uYmIgICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYiAgICAgfCBhbSwgcG0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3LyBaKSAgICAgICAgfCBYICAgICAgIHwgLTA4LCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFggICAgICB8IC0wODAwLCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWCAgICAgfCAtMDg6MDAsICswNTozMCwgWiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYICAgIHwgLTA4MDAsICswNTMwLCBaLCArMTIzNDU2ICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWFggICB8IC0wODowMCwgKzA1OjMwLCBaLCArMTI6MzQ6NTYgICAgICB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgICB8IHggICAgICAgfCAtMDgsICswNTMwLCArMDAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eCAgICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4ICAgICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHggICAgfCAtMDgwMCwgKzA1MzAsICswMDAwLCArMTIzNDU2ICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4eCAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCwgKzEyOjM0OjU2IHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgIHwgTy4uLk9PTyB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyICAgICB8XG4gKiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSAgfCB6Li4uenp6IHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgNiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgenp6eiAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIsNiAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgIHwgVCAgICAgICB8IDUxMjk2OTUyMDkwMCAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCBQICAgICAgIHwgMDQvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFAgICAgICB8IEFwciAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUCAgICAgfCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQICAgIHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHAgICAgIHwgMTI6MDA6MDAgQU0gR01UKzIgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwcCAgICB8IDEyOjAwOjAwIEFNIEdNVCswMjowMCAgICAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8IFBwICAgICAgfCAwNC8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUHBwICAgIHwgQXByIDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQcHBwICB8IEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFBwcHBwfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgfCAyLDcgICB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyOlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGUgKGUuZy4gYEVFRUVFRUVFRUVFYClcbiAqICAgIHRoZSBvdXRwdXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBkZWZhdWx0IHBhdHRlcm4gZm9yIHRoaXMgdW5pdCwgdXN1YWxseVxuICogICAgdGhlIGxvbmdlc3Qgb25lIChpbiBjYXNlIG9mIElTTyB3ZWVrZGF5cywgYEVFRUVgKS4gRGVmYXVsdCBwYXR0ZXJucyBmb3IgdW5pdHNcbiAqICAgIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NJykgLy89PiAnTm92J2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTScpIC8vPT4gJ04nYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAzLiBTb21lIHBhdHRlcm5zIGNvdWxkIGJlIHVubGltaXRlZCBsZW5ndGggKHN1Y2ggYXMgYHl5eXl5eXl5YCkuXG4gKiAgICBUaGUgb3V0cHV0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgcGF0dGVybi5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ3l5eXl5eXl5JykgLy89PiAnMDAwMDIwMTcnYFxuICpcbiAqIDQuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDUuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gKiAgICB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQ6XG4gKlxuICogICAgfCBZZWFyIHwgYHl5YCB8IGB1dWAgfFxuICogICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfFxuICogICAgfCAxICAgIHwgICAwMSB8ICAgMDEgfFxuICogICAgfCAxNCAgIHwgICAxNCB8ICAgMTQgfFxuICogICAgfCAzNzYgIHwgICA3NiB8ICAzNzYgfFxuICogICAgfCAxNDUzIHwgICA1MyB8IDE0NTMgfFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW2dldElTT1dlZWtZZWFyXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldElTT1dlZWtZZWFyfVxuICogICAgYW5kIFtnZXRXZWVrWWVhcl17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRXZWVrWWVhcn0pLlxuICpcbiAqIDYuIFNwZWNpZmljIG5vbi1sb2NhdGlvbiB0aW1lem9uZXMgYXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBpbiBgZGF0ZS1mbnNgLFxuICogICAgc28gcmlnaHQgbm93IHRoZXNlIHRva2VucyBmYWxsIGJhY2sgdG8gR01UIHRpbWV6b25lcy5cbiAqXG4gKiA3LiBUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGluIHRoZSBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiAgICAtIGBpYDogSVNPIGRheSBvZiB3ZWVrXG4gKiAgICAtIGBJYDogSVNPIHdlZWsgb2YgeWVhclxuICogICAgLSBgUmA6IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiAgICAtIGB0YDogc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYFRgOiBtaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBvYDogb3JkaW5hbCBudW1iZXIgbW9kaWZpZXJcbiAqICAgIC0gYFBgOiBsb25nIGxvY2FsaXplZCBkYXRlXG4gKiAgICAtIGBwYDogbG9uZyBsb2NhbGl6ZWQgdGltZVxuICpcbiAqIDguIGBZWWAgYW5kIGBZWVlZYCB0b2tlbnMgcmVwcmVzZW50IHdlZWstbnVtYmVyaW5nIHllYXJzIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIHllYXJzLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgLSB0aGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM9ZmFsc2VdIC0gaWYgdHJ1ZSwgYWxsb3dzIHVzYWdlIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyIHRva2VucyBgWVlgIGFuZCBgWVlZWWA7XG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zPWZhbHNlXSAtIGlmIHRydWUsIGFsbG93cyB1c2FnZSBvZiB0aGUgZGF5IG9mIHllYXIgdG9rZW5zIGBEYCBhbmQgYEREYDtcbiAqICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoZGlydHlEYXRlLCBkaXJ0eUZvcm1hdFN0ciwgb3B0aW9ucykge1xuICB2YXIgX3JlZiwgX29wdGlvbnMkbG9jYWxlLCBfcmVmMiwgX3JlZjMsIF9yZWY0LCBfb3B0aW9ucyRmaXJzdFdlZWtDb24sIF9vcHRpb25zJGxvY2FsZTIsIF9vcHRpb25zJGxvY2FsZTIkb3B0aSwgX2RlZmF1bHRPcHRpb25zJGxvY2FsLCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwyLCBfcmVmNSwgX3JlZjYsIF9yZWY3LCBfb3B0aW9ucyR3ZWVrU3RhcnRzT24sIF9vcHRpb25zJGxvY2FsZTMsIF9vcHRpb25zJGxvY2FsZTMkb3B0aSwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMywgX2RlZmF1bHRPcHRpb25zJGxvY2FsNDtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBmb3JtYXRTdHIgPSBTdHJpbmcoZGlydHlGb3JtYXRTdHIpO1xuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICB2YXIgbG9jYWxlID0gKF9yZWYgPSAoX29wdGlvbnMkbG9jYWxlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2FsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkbG9jYWxlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRsb2NhbGUgOiBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiBkZWZhdWx0TG9jYWxlO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gdG9JbnRlZ2VyKChfcmVmMiA9IChfcmVmMyA9IChfcmVmNCA9IChfb3B0aW9ucyRmaXJzdFdlZWtDb24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRmaXJzdFdlZWtDb24gIT09IHZvaWQgMCA/IF9vcHRpb25zJGZpcnN0V2Vla0NvbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTIgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTIkb3B0aSA9IF9vcHRpb25zJGxvY2FsZTIub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMiRvcHRpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUyJG9wdGkuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSAhPT0gbnVsbCAmJiBfcmVmNCAhPT0gdm9pZCAwID8gX3JlZjQgOiBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYzICE9PSB2b2lkIDAgPyBfcmVmMyA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwgPSBkZWZhdWx0T3B0aW9ucy5sb2NhbGUpID09PSBudWxsIHx8IF9kZWZhdWx0T3B0aW9ucyRsb2NhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9kZWZhdWx0T3B0aW9ucyRsb2NhbDIgPSBfZGVmYXVsdE9wdGlvbnMkbG9jYWwub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsMi5maXJzdFdlZWtDb250YWluc0RhdGUpICE9PSBudWxsICYmIF9yZWYyICE9PSB2b2lkIDAgPyBfcmVmMiA6IDEpO1xuXG4gIC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG4gIGlmICghKGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA+PSAxICYmIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA8PSA3KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdmaXJzdFdlZWtDb250YWluc0RhdGUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDcgaW5jbHVzaXZlbHknKTtcbiAgfVxuICB2YXIgd2Vla1N0YXJ0c09uID0gdG9JbnRlZ2VyKChfcmVmNSA9IChfcmVmNiA9IChfcmVmNyA9IChfb3B0aW9ucyR3ZWVrU3RhcnRzT24gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3ZWVrU3RhcnRzT24gIT09IHZvaWQgMCA/IF9vcHRpb25zJHdlZWtTdGFydHNPbiA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTMgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9vcHRpb25zJGxvY2FsZTMkb3B0aSA9IF9vcHRpb25zJGxvY2FsZTMub3B0aW9ucykgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlMyRvcHRpID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRsb2NhbGUzJG9wdGkud2Vla1N0YXJ0c09uKSAhPT0gbnVsbCAmJiBfcmVmNyAhPT0gdm9pZCAwID8gX3JlZjcgOiBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWY2ICE9PSB2b2lkIDAgPyBfcmVmNiA6IChfZGVmYXVsdE9wdGlvbnMkbG9jYWwzID0gZGVmYXVsdE9wdGlvbnMubG9jYWxlKSA9PT0gbnVsbCB8fCBfZGVmYXVsdE9wdGlvbnMkbG9jYWwzID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2RlZmF1bHRPcHRpb25zJGxvY2FsNCA9IF9kZWZhdWx0T3B0aW9ucyRsb2NhbDMub3B0aW9ucykgPT09IG51bGwgfHwgX2RlZmF1bHRPcHRpb25zJGxvY2FsNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRPcHRpb25zJGxvY2FsNC53ZWVrU3RhcnRzT24pICE9PSBudWxsICYmIF9yZWY1ICE9PSB2b2lkIDAgPyBfcmVmNSA6IDApO1xuXG4gIC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuICBpZiAoIWxvY2FsZS5sb2NhbGl6ZSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsb2NhbGUgbXVzdCBjb250YWluIGxvY2FsaXplIHByb3BlcnR5Jyk7XG4gIH1cbiAgaWYgKCFsb2NhbGUuZm9ybWF0TG9uZykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdsb2NhbGUgbXVzdCBjb250YWluIGZvcm1hdExvbmcgcHJvcGVydHknKTtcbiAgfVxuICB2YXIgb3JpZ2luYWxEYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGlmICghaXNWYWxpZChvcmlnaW5hbERhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICB9XG5cbiAgLy8gQ29udmVydCB0aGUgZGF0ZSBpbiBzeXN0ZW0gdGltZXpvbmUgdG8gdGhlIHNhbWUgZGF0ZSBpbiBVVEMrMDA6MDAgdGltZXpvbmUuXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gVVRDIGZ1bmN0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkLCBsb2NhbGVzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIHRoZW0uXG4gIC8vIFNlZSBhbiBpc3N1ZSBhYm91dCBVVEMgZnVuY3Rpb25zOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuICB2YXIgdGltZXpvbmVPZmZzZXQgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSk7XG4gIHZhciB1dGNEYXRlID0gc3ViTWlsbGlzZWNvbmRzKG9yaWdpbmFsRGF0ZSwgdGltZXpvbmVPZmZzZXQpO1xuICB2YXIgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT246IHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICBfb3JpZ2luYWxEYXRlOiBvcmlnaW5hbERhdGVcbiAgfTtcbiAgdmFyIHJlc3VsdCA9IGZvcm1hdFN0ci5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKGZ1bmN0aW9uIChzdWJzdHJpbmcpIHtcbiAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAncCcgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICdQJykge1xuICAgICAgdmFyIGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0cmluZztcbiAgfSkuam9pbignJykubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCkubWFwKGZ1bmN0aW9uIChzdWJzdHJpbmcpIHtcbiAgICAvLyBSZXBsYWNlIHR3byBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyB3aXRoIG9uZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyXG4gICAgaWYgKHN1YnN0cmluZyA9PT0gXCInJ1wiKSB7XG4gICAgICByZXR1cm4gXCInXCI7XG4gICAgfVxuICAgIHZhciBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICByZXR1cm4gY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZyk7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICBpZiAoIShvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucykgJiYgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHN1YnN0cmluZykpIHtcbiAgICAgICAgdGhyb3dQcm90ZWN0ZWRFcnJvcihzdWJzdHJpbmcsIGRpcnR5Rm9ybWF0U3RyLCBTdHJpbmcoZGlydHlEYXRlKSk7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCAmJiBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMpICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIFN0cmluZyhkaXJ0eURhdGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXR0ZXIodXRjRGF0ZSwgc3Vic3RyaW5nLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGAnICsgZmlyc3RDaGFyYWN0ZXIgKyAnYCcpO1xuICAgIH1cbiAgICByZXR1cm4gc3Vic3RyaW5nO1xuICB9KS5qb2luKCcnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICB2YXIgbWF0Y2hlZCA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApO1xuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufSIsICJleHBvcnQgY29uc3QgcG9pbnRzTm90ZU1hanVyaXR5ID0gMTAwO1xyXG5leHBvcnQgY29uc3QgcG9pbnRzTWFqdXJpdHkgPSAxMDtcclxuZXhwb3J0IGNvbnN0IHBvaW50c0ZvckRhaWx5Q2hhbGxlbmdlID0gNTAwO1xyXG5leHBvcnQgY29uc3QgcG9pbnRzRm9yV2Vla2x5Q2hhbGxlbmdlID0gMjAwMDtcclxuZXhwb3J0IGNvbnN0IHN0cmVha2Jvb3N0ZXJEZWNyZWFzZSA9IDAuMjtcclxuZXhwb3J0IGNvbnN0IHN0cmVha2Jvb3N0ZXJJbmNyZWFzZURhaWx5ID0gMC4xO1xyXG5leHBvcnQgY29uc3Qgc3RyZWFrYm9vc3RlckluY3JlYXNlV2Vla2x5ID0gMTtcclxuZXhwb3J0IGNvbnN0IGF2YXRhckluaXRDb250ZW50ID0gIGAjIEF2YXRhclxyXG5cclxufCAgICAgICAgfCAgICAgfFxyXG58IC0tLS0tLSB8IC0tLSB8XHJcbnwgTGV2ZWwgIHwgMCAgICB8XHJcbnwgUG9pbnRzIHwgMCAgICB8XHJcbl5sZXZlbEFuZFBvaW50c1x0XHJcblxcYFxcYFxcYGNoYXJ0XHJcbnR5cGU6IGJhclxyXG5sYWJlbHM6IFtFeHByaXJpZW5jZV1cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IHBvaW50cyByZWFjaGVkXHJcbiAgICBkYXRhOiBbMF1cclxuICAtIHRpdGxlOiBwb2ludHMgdG8gZWFybiB0byBsZXZlbCB1cFxyXG4gICAgZGF0YTogWzEwMDBdXHJcbnhNaW46IDBcclxueE1heDogMTAwMFxyXG50ZW5zaW9uOiAwLjJcclxud2lkdGg6IDQwJVxyXG5sYWJlbENvbG9yczogZmFsc2VcclxuZmlsbDogZmFsc2VcclxuYmVnaW5BdFplcm86IGZhbHNlXHJcbmJlc3RGaXQ6IGZhbHNlXHJcbmJlc3RGaXRUaXRsZTogdW5kZWZpbmVkXHJcbmJlc3RGaXROdW1iZXI6IDBcclxuc3RhY2tlZDogdHJ1ZVxyXG5pbmRleEF4aXM6IHlcclxueFRpdGxlOiBcInByb2dyZXNzXCJcclxubGVnZW5kOiBmYWxzZVxyXG5cXGBcXGBcXGBcclxuXHJcbnwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxyXG58IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tIHxcclxufCAqKmJvb3N0ZXIgZmFjdG9yKiogfCAqKjAqKiB8XHJcbl5ib29zdGVyRmFjdG9yXHJcblxyXG58ICAgICAgICAgICAgIHwgICAgIHwgICAgICAgfFxyXG58IC0tLS0tLS0tLS0tIHwgLS0tIHwgLS0tLS0gfFxyXG58ICoqZGFpbHkgTm90ZXMqKiB8ICo1MDBFUCogfCAqKjAvMioqIHxcclxuXmRhaWx5Tm90ZXNDaGFsbGVuZ2VcclxuXHJcbnwgIHwgICAgIHx8XHJcbnwgLS0tLSB8IC0tLSB8IC0tLSB8XHJcbnwgKip3ZWVrbHkgTm90ZXMqKiB8ICoyMDAwRVAqICAgICB8ICAqKjAvNyoqICAgfFxyXG5ed2Vla2x5Tm90ZXNDaGFsbGVuZ2VcclxuXHJcblxcYFxcYFxcYGNoYXJ0XHJcbnR5cGU6IGJhclxyXG5sYWJlbHM6IFtOb3Rlc11cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IGRheXMgZG9uZSBpbiBhIHJvd1xyXG4gICAgZGF0YTogWzBdXHJcbiAgLSB0aXRsZTogZGF5cyB0byBkbyBpbiBhIHJvd1xyXG4gICAgZGF0YTogWzddXHJcbnhNaW46IDBcclxueE1heDogN1xyXG50ZW5zaW9uOiAwLjJcclxud2lkdGg6IDQwJVxyXG5sYWJlbENvbG9yczogZmFsc2VcclxuZmlsbDogZmFsc2VcclxuYmVnaW5BdFplcm86IGZhbHNlXHJcbmJlc3RGaXQ6IGZhbHNlXHJcbmJlc3RGaXRUaXRsZTogdW5kZWZpbmVkXHJcbmJlc3RGaXROdW1iZXI6IDBcclxuc3RhY2tlZDogdHJ1ZVxyXG5pbmRleEF4aXM6IHlcclxueFRpdGxlOiBcImRheXNcIlxyXG5sZWdlbmQ6IGZhbHNlXHJcblxcYFxcYFxcYFxyXG5cclxufCBMZXZlbCB8IENvdW50IHxcclxufCA6LS0tOiB8IDotLS06IHxcclxufCBNYWp1cml0eSA1IHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbNSwgJzUnLCAnNVx1MjdBMVx1RkUwRicsICc1XHUyQjA3XHVGRTBGJywgJzVcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSA0IHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbNCwgJzQnLCAnNFx1MjdBMVx1RkUwRicsICc0XHUyQjA3XHVGRTBGJywgJzRcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAzIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMywgJzMnLCAnM1x1MjdBMVx1RkUwRicsICczXHUyQjA3XHVGRTBGJywgJzNcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAyIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMiwgJzInLCAnMlx1MjdBMVx1RkUwRicsICcyXHUyQjA3XHVGRTBGJywgJzJcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAxIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMSwgJzEnLCAnMVx1MjdBMVx1RkUwRicsICcxXHUyQjA3XHVGRTBGJywgJzFcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxufCBNYWp1cml0eSAwIHxcXGAkPWR2LnBhZ2VzKCkud2hlcmUocCA9PiBbMCwgJzAnLCAnMFx1MjdBMVx1RkUwRicsICcwXHUyQjA3XHVGRTBGJywgJzBcdTJCMDZcdUZFMEYnXS5pbmNsdWRlcyhwLmZpbGUuZnJvbnRtYXR0ZXJbJ25vdGUtbWF0dXJpdHknXSkpLmxlbmd0aFxcYHxcclxuXHJcblxyXG5cXGBcXGBcXGBjaGFydFxyXG50eXBlOiBiYXJcclxubGFiZWxzOiBbMCwgMCwgMF1cclxuc2VyaWVzOlxyXG4gIC0gdGl0bGU6IG1vZGlmaWVkXHJcbiAgICBkYXRhOiBbMCwgMCwgMF1cclxudGVuc2lvbjogMC4yXHJcbndpZHRoOiA4MCAlXHJcbmxhYmVsQ29sb3JzOiBmYWxzZVxyXG5maWxsOiBmYWxzZVxyXG5iZWdpbkF0WmVybzogZmFsc2VcclxuYmVzdEZpdDogZmFsc2VcclxuYmVzdEZpdFRpdGxlOiB1bmRlZmluZWRcclxuYmVzdEZpdE51bWJlcjogMFxyXG5zdGFja2VkOiB0cnVlXHJcbnlUaXRsZTogXCJOdW1iZXIgb2YgTm90ZXNcIlxyXG54VGl0bGU6IFwiTW9udGhzXCJcclxueE1pbjogMFxyXG5cXGBcXGBcXGBcclxuXkNoYXJ0TW9udGhcclxuXHJcblxyXG4jIyMgQmFkZ2VzXHJcbiMjIyMgYWNoaWV2ZWRcclxuXHJcblxyXG4jIyMjIG91dHN0YW5kaW5nXHJcbmxldmVsIDU6ICpFbmxpZ2h0ZW5lZCBOb3ZpY2UqXHJcbmxldmVsIDEwOiAqQ3VyaW91cyBDb25ub2lzc2V1cipcclxubGV2ZWwgMjA6ICpCcmFpbmlhYyBUcmFpbGJsYXplcipcclxubGV2ZWwgMjc6ICpTY2hvbGFybHkgVHJhaWxibGF6ZXIqXHJcbmxldmVsIDM1OiAqSW5mbyBOaW5qYSBNYXN0ZXIqXHJcbmxldmVsIDQyOiAqV2lzZSBPd2wgR3VydSpcclxubGV2ZWwgNTA6ICpFaW5zdGVpbiBJbmNhcm5hdGUqXHJcbmxldmVsIDYwOiAqTWFzdGVybWluZCBTYWdlKlxyXG5sZXZlbCA3NTogKkNlcmVicmFsIE1hZXN0cm8qXHJcbmxldmVsIDgyOiAqWmVuIEtub3dsZWRnZSBLZWVwZXIqXHJcbmxldmVsIDkwOiAqR3JhbmQgQXJjaGl2aXN0IE92ZXJsb3JkKlxyXG5sZXZlbCAxMDA6ICpPbW5pc2NpZW50IFNhZ2Ugb2YgRXZlcnl0aGluZypcclxuXHJcblxyXG5cclxuIyMjICoqbm90ZS1tYXR1cml0eSA9IDUqKlxyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gNSBvciBub3RlLW1hdHVyaXR5ID0gXCI1XCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiNVx1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjVcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCI1XHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcblxyXG4jIyMgKipub3RlLW1hdHVyaXR5ID0gNCoqXHJcblxcYFxcYFxcYGRhdGF2aWV3XHJcbkxpc3QgTm90ZU1hdHVyaXR5Q291bnRcclxuZnJvbSBcIlwiXHJcbldoZXJlIG5vdGUtbWF0dXJpdHkgPSA0IG9yIG5vdGUtbWF0dXJpdHkgPSBcIjRcIiBvciBub3RlLW1hdHVyaXR5ID0gXCI0XHUyN0ExXHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiNFx1MkIwNlx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjRcdTJCMDdcdUZFMEZcIlxyXG5cXGBcXGBcXGBcclxuXHJcbiMjIyBub3RlLW1hdHVyaXR5ID0gM1xyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gMyBvciBub3RlLW1hdHVyaXR5ID0gXCIzXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiM1x1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjNcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIzXHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcblxyXG4jIyMgbm90ZS1tYXR1cml0eSA9IDJcclxuXFxgXFxgXFxgZGF0YXZpZXdcclxuTGlzdCBOb3RlTWF0dXJpdHlDb3VudFxyXG5mcm9tIFwiXCJcclxuV2hlcmUgbm90ZS1tYXR1cml0eSA9IDIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjJcdTI3QTFcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIyXHUyQjA2XHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMlx1MkIwN1x1RkUwRlwiXHJcblxcYFxcYFxcYFxyXG5cclxuIyMjIG5vdGUtbWF0dXJpdHkgPSAxXHJcblxcYFxcYFxcYGRhdGF2aWV3XHJcbkxpc3QgTm90ZU1hdHVyaXR5Q291bnRcclxuZnJvbSBcIlwiXHJcbldoZXJlIG5vdGUtbWF0dXJpdHkgPSAxIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjFcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIxXHUyN0ExXHVGRTBGXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMVx1MkIwNlx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjFcdTJCMDdcdUZFMEZcIlxyXG5cXGBcXGBcXGBcclxuXHJcbiMjIyBub3RlLW1hdHVyaXR5ID0gMFxyXG5cXGBcXGBcXGBkYXRhdmlld1xyXG5MaXN0IE5vdGVNYXR1cml0eUNvdW50XHJcbmZyb20gXCJcIlxyXG5XaGVyZSBub3RlLW1hdHVyaXR5ID0gMCBvciBub3RlLW1hdHVyaXR5ID0gXCIwXCIgb3Igbm90ZS1tYXR1cml0eSA9IFwiMFx1MjdBMVx1RkUwRlwiIG9yIG5vdGUtbWF0dXJpdHkgPSBcIjBcdTJCMDZcdUZFMEZcIiBvciBub3RlLW1hdHVyaXR5ID0gXCIwXHUyQjA3XHVGRTBGXCJcclxuXFxgXFxgXFxgXHJcbmA7XHJcbmV4cG9ydCBjb25zdCBpbmNyZWRpbWVudHMgPSBbXHJcbiAgJ05leHVzIE5vZGUnLFxyXG4gICdDb25uZWN0aW9uIENyeXN0YWwnLFxyXG4gICdNYXN0ZXJ5IFNjcm9sbCcsXHJcbiAgJ0luc2lnaHQgUHJpc20nLFxyXG4gICdSZWZsZWN0aXZlIEVzc2VuY2UnLFxyXG4gICdBbXBsaWZpY2F0aW9uIENyeXN0YWwnLFxyXG4gICdDcmVhdGl2ZSBDYXRhbHlzdCcsXHJcbiAgJ1ByZWNpc2lvbiBMZW5zJ1xyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGluY3JlZGltZW50c0RhdGFOYW1lID0gW1xyXG4gICduZXh1c05vZGUnLFxyXG4gICdjb25uZWN0aW9uQ3J5c3RhbCcsXHJcbiAgJ21hc3RlcnlTY3JvbGwnLFxyXG4gICdpbnNpZ2h0UHJpc20nLFxyXG4gICdyZWZsZWN0aXZlRXNzZW5jZScsXHJcbiAgJ2FtcGxpZmljYXRpb25DcnlzdGFsJyxcclxuICAnY3JlYXRpdmVDYXRhbHlzdCcsXHJcbiAgJ3ByZWNpc2lvbkxlbnMnXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgY3JhZnRpbmdJdGVtcyA9IFtcclxuICB7IG5hbWU6ICdUZW1wb3JhbCBUd2Vha2VyJywgaW5jcmVkaWVudHM6IFsnMnhTMScsICcxeFM2J10gfSxcclxuICB7IG5hbWU6ICdQZXJwZXR1YWwgUHJvZ3Jlc3MnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzQnXSB9LFxyXG4gIHsgbmFtZTogJ1N0cmF0ZWdpYyBTeW5hcHNlcycsIGluY3JlZGllbnRzOiBbJzN4UzEnLCAnMnhTMiddIH0sXHJcbiAgeyBuYW1lOiAnQWNjZWxlcmF0ZWQgQWNxdWlzaXRpb24nLCBpbmNyZWRpZW50czogWycxeFMzJywgJzJ4UzQnXSB9LFxyXG4gIHsgbmFtZTogJ0xpbmtlcnMgTG9kZScsIGluY3JlZGllbnRzOiBbJzN4UzInLCAnMXhTMSddIH0sXHJcbiAgeyBuYW1lOiAnRWZmb3J0bGVzcyBFeHBhbnNpb24nLCBpbmNyZWRpZW50czogWycyeFMzJywgJzF4UzYnXSB9LFxyXG4gIHsgbmFtZTogJ1JlY3Vyc2l2ZSBSZWZsZWN0aW9uJywgaW5jcmVkaWVudHM6IFsnMnhTNCcsICcxeFM1J10gfSxcclxuICB7IG5hbWU6ICdTeW5hcHRpYyBTdXJnZScsIGluY3JlZGllbnRzOiBbJzJ4UzInLCAnMXhTMSddIH0sXHJcbiAgeyBuYW1lOiAnSW5zcGlyYXRpb24gSW5mdXNpb24nLCBpbmNyZWRpZW50czogWycyeFM3JywgJzF4UzEnXSB9LFxyXG4gIHsgbmFtZTogJ1RpdGxlIFRpdGFuJywgaW5jcmVkaWVudHM6IFsnMnhTOCcsICcxeFM3J10gfSxcclxuICB7IG5hbWU6ICdQcmVjaXNpb24gUHJpc20nLCBpbmNyZWRpZW50czogWycyeFM4JywgJzF4UzInXSB9LFxyXG4gIHsgbmFtZTogJ0h5cGVybGluayBIYXJtb255JywgaW5jcmVkaWVudHM6IFsnMnhTMicsICcxeFM2J10gfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBsaXN0T2ZVc2VhYmxlQm9vc3RlcnNUb0JlU2hvd24gPSBbJ1BlcnBldHVhbCBQcm9ncmVzcycsICdUaXRsZSBUaXRhbicsICdQcmVjaXNpb24gUHJpc20nXVxyXG5leHBvcnQgY29uc3QgbGlzdE9mVXNlYWJsZUluZ3JlZGllbnRzVG9CZVNob3duID0gWydDb25uZWN0aW9uIENyeXN0YWwnLCAnSW5zaWdodCBQcmlzbScsICdDcmVhdGl2ZSBDYXRhbHlzdCcsICdQcmVjaXNpb24gTGVucyddXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xyXG4gIHsgc2hvcnROYW1lOiAnUzInLCBuYW1lOiAnQ29ubmVjdGlvbiBDcnlzdGFsJywgdmFyTmFtZTogJ2Nvbm5lY3Rpb25DcnlzdGFsJyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzQnLCBuYW1lOiAnSW5zaWdodCBQcmlzbScsIHZhck5hbWU6ICdpbnNpZ2h0UHJpc20nIH0sXHJcbiAgeyBzaG9ydE5hbWU6ICdTNycsIG5hbWU6ICdDcmVhdGl2ZSBDYXRhbHlzdCcsIHZhck5hbWU6ICdjcmVhdGl2ZUNhdGFseXN0JyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzgnLCBuYW1lOiAnUHJlY2lzaW9uIExlbnMnLCB2YXJOYW1lOiAncHJlY2lzaW9uTGVucycgfSxcclxuICB7IHNob3J0TmFtZTogJ1MxJywgbmFtZTogJ05leHVzIE5vZGUnLCB2YXJOYW1lOiAnbmV4dXNOb2RlJyB9LFxyXG4gIHsgc2hvcnROYW1lOiAnUzMnLCBuYW1lOiAnTWFzdGVyeSBTY3JvbGwnLCB2YXJOYW1lOiAnbWFzdGVyeVNjcm9sbCcgfSxcclxuICB7IHNob3J0TmFtZTogJ1M1JywgbmFtZTogJ1JlZmxlY3RpdmUgRXNzZW5jZScsIHZhck5hbWU6ICdyZWZsZWN0aXZlRXNzZW5jZScgfSxcclxuICB7IHNob3J0TmFtZTogJ1M2JywgbmFtZTogJ0FtcGxpZmljYXRpb24gQ3J5c3RhbCcsIHZhck5hbWU6ICdhbXBsaWZpY2F0aW9uQ3J5c3RhbCcgfVxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJvb3N0ZXJSZWNpcGVzID0gW1xyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDAsIGJvb3N0ZXJDb29sZG93bjogMCwgYm9vc3RlckRhdGU6ICcnLCBib29zdGVyU3dpdGNoOiAnJywgdmFybmFtZTogJ3RlbXBvcmFsVHdlYWtlcicgLG5hbWU6ICdUZW1wb3JhbCBUd2Vha2VyJywgaW5jcmVkaWVudHM6IFsnMnhTMScsICcxeFM2J10sIGRlc2NyaXB0aW9uOiAnVGVtcG9yYWwgVHdlYWtlcjogcmVzZXQgdGhlIGNvb2xkb3duIHBoYXNlIGZvciBhIGJvb3N0ZXIgeW91ciBjaG9pY2UnIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogNCo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVBlcnBldHVhbFByb2dyZXNzJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JQZXJwZXR1YWxQcm9ncmVzcycsIHZhcm5hbWU6ICdwZXJwZXR1YWxQcm9ncmVzcycgLG5hbWU6ICdQZXJwZXR1YWwgUHJvZ3Jlc3MnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzQnXSwgZGVzY3JpcHRpb246ICdQZXJwZXR1YWwgUHJvZ3Jlc3M6IGdldCAzIHRpbWVzIHBvaW50cyBhbiBhbGwgeW91ciBhY3Rpb25zIGZvciB0aGUgbmV4dCA0IGhvdXJzLiBZb3UgY2FuIHVzZSBQZXJwZXR1YWwgUHJvZ3Jlc3MgZXZlcnkgdGhyZWUgZGF5cywgaWYgeW91IGhhdmUgdGhlIGluZ3JlZGllbnRzIHRvIGNyYWZ0IGl0LicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiA0KjYwLCBib29zdGVyQ29vbGRvd246IDEyMCo2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVN0cmF0ZWdpY1N5bmFwc2VzJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JTdHJhdGVnaWNTeW5hcHNlcycsIHZhcm5hbWU6ICdzdHJhdGVnaWNTeW5hcHNlcycgLG5hbWU6ICdTdHJhdGVnaWMgU3luYXBzZXMnLCBpbmNyZWRpZW50czogWyczeFMxJywgJzJ4UzInXSwgZGVzY3JpcHRpb246ICdTdHJhdGVnaWMgU3luYXBzZXM6IGdhaW4gMyB0aW1lcyBFUCBmb3IgYWxsIGFjdGlvbnMgb24gTWFwIE9mIENvbnRlbnQgcmF0aW5ncyBmb3IgdGhlIG5leHQgNCBob3Vycy4gVGhpcyBib29zdGVyIGhhcyBhIGNvb2xkb3duIHRpbWUgb2YgNSBkYXlzLicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiAwLCBib29zdGVyQ29vbGRvd246IDM2KjYwLCBib29zdGVyRGF0ZTogJycsIGJvb3N0ZXJTd2l0Y2g6ICcnLCB2YXJuYW1lOiAnYWNjZWxlcmF0ZWRBY3F1aXNpdGlvbicgLG5hbWU6ICdBY2NlbGVyYXRlZCBBY3F1aXNpdGlvbicsIGluY3JlZGllbnRzOiBbJzF4UzMnLCAnMnhTNCddLCBkZXNjcmlwdGlvbjogJ0FjY2VsZXJhdGVkIEFjcXVpc2l0aW9uOiBVc2UgQWNjZWxlcmF0ZWQgQWNxdWlzaXRpb24gYW5kIGNvbGxlY3QgbXVjaCBmYXN0ZXIgZm9yIHRoZSBuZXh0IDEyIGhvdXJzIGFsbCBzb3J0cyBvZiBpbmdyZWRpZW50cyB3aGVuIGNyZWF0aW5nIGFuZCBpbXByb3Zpbmcgbm90ZXMnIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMyo2MCwgYm9vc3RlckNvb2xkb3duOiA0OCo2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZUxpbmtlcnNMb2RlJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JMaW5rZXJzTG9kZScsIHZhcm5hbWU6ICdsaW5rZXJzTG9kZScgLG5hbWU6ICdMaW5rZXJzIExvZGUnLCBpbmNyZWRpZW50czogWyczeFMyJywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdMaW5rZXJzIExvZGU6IGNvbGxlY3QgZXh0cmEgcG9pbnRzIHdoZW4gY3JlYXRpbmcgY2hhaW4gb2YgdGhvdWdodHMgZm9yIHRoZSBuZXh0IDMgaG91cnMuIChjb29sZG93biAyIGRheXMpJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDAsIGJvb3N0ZXJDb29sZG93bjogNDgwKjYwLCBib29zdGVyRGF0ZTogJycsIGJvb3N0ZXJTd2l0Y2g6ICcnLCB2YXJuYW1lOiAnZWZmb3J0bGVzc0V4cGFuc2lvbicgLG5hbWU6ICdFZmZvcnRsZXNzIEV4cGFuc2lvbicsIGluY3JlZGllbnRzOiBbJzJ4UzMnLCAnMXhTNiddLCBkZXNjcmlwdGlvbjogJ0VmZm9ydGxlc3MgRXhwYW5zaW9uOiBDYXN0IFwiRWZmb3J0bGVzcyBFeHBhbnNpb25cIiBhbmQgbG93ZXIgdGhlIGNhcCB0byB0aGUgbmV4dCBsZXZlbCBhYm91dCAyMCUgaW4gdGhlIG5leHQgNSBkYXlzLiAoQ29vbGRvd24gMjAgZGF5cyknIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogNSo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVJlY3Vyc2l2ZVJlZmxlY3Rpb24nLCBib29zdGVyU3dpdGNoOiAnYm9vc3RlckZhY3RvclJlY3Vyc2l2ZVJlZmxlY3Rpb24nLCB2YXJuYW1lOiAncmVjdXJzaXZlUmVmbGVjdGlvbicgLG5hbWU6ICdSZWN1cnNpdmUgUmVmbGVjdGlvbicsIGluY3JlZGllbnRzOiBbJzJ4UzQnLCAnMXhTNSddLCBkZXNjcmlwdGlvbjogJ1JlY3Vyc2l2ZSBSZWZsZWN0aW9uOiBJbXByb3ZlIHlvdXIgbm90ZXMgYW5kIGdldCA1IHRpbWVzIHRoZSBwb2ludHMgeW91IGdldCBvbiBub3JtYWwgY29uZGl0aW9uIGZvciB0aGUgbmV4dCA1IGhvdXJzLiBDb29sZG93biAzIGRheXMuJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDIqNjAsIGJvb3N0ZXJDb29sZG93bjogMzYqNjAsIGJvb3N0ZXJEYXRlOiAnYm9vc3RlckRhdGVTeW5hcHRpY1N1cmdlJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JTeW5hcHRpY1N1cmdlJywgdmFybmFtZTogJ3N5bmFwdGljU3VyZ2UnICxuYW1lOiAnU3luYXB0aWMgU3VyZ2UnLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdTeW5hcHRpYyBTdXJnZTogTGluayB5b3VyIGlkZWFzIHRvZ2V0aGVyLCBldmVyeSBpbmNyZWFzZSBpbiBcImxpbmtpbmcgbWF0dXJpdHlcIiBwYXlzIG91dCAyMCB0aW1lcyBmb3IgdGhlIG5leHQgMiBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMCwgYm9vc3RlckNvb2xkb3duOiA0OCo2MCwgYm9vc3RlckRhdGU6ICcnLCBib29zdGVyU3dpdGNoOiAnJywgdmFybmFtZTogJ2luc3BpcmF0aW9uSW5mdXNpb24nICxuYW1lOiAnSW5zcGlyYXRpb24gSW5mdXNpb24nLCBpbmNyZWRpZW50czogWycyeFM3JywgJzF4UzEnXSwgZGVzY3JpcHRpb246ICdJbnNwaXJhdGlvbiBJbmZ1c2lvbjogSW5jcmVhc2UgdGhlIGZyZXF1ZW5jeSB0byBnZXQgaGVscGZ1bCBwcm9tcHRzIHRvIHBvd2VyIHVwIHlvdSBwZXJzb25hbCBrbm93bGVkZ2UgbWFuYWdlbWVudCBmb3IgdGhlIG5leHQgMiBkYXlzLicgfSxcclxuICB7IGJvb3N0ZXJSdW5UaW1lOiAzKjYwLCBib29zdGVyQ29vbGRvd246IDM2KjYwLCBib29zdGVyRGF0ZTogJ2Jvb3N0ZXJEYXRlVGl0bGVUaXRhbicsIGJvb3N0ZXJTd2l0Y2g6ICdib29zdGVyRmFjdG9yVGl0bGVUaXRhbicsIHZhcm5hbWU6ICd0aXRsZVRpdGFuJyAsbmFtZTogJ1RpdGxlIFRpdGFuJywgaW5jcmVkaWVudHM6IFsnMnhTOCcsICcxeFM3J10sIGRlc2NyaXB0aW9uOiAnVGl0bGUgVGl0YW46IFF1YWRybyB5b3VyIHBvaW50cyB3aGVuIG1ha2luZyB5b3VyIG5vdGUgdGl0bGUgbW9yZSB0byB0aGUgcG9pbnQgZXhwcmVzc2luZyB0aGUgaWRlYSBvZiB5b3Ugbm90ZSBmb3IgdGhlIG5leHQgMyBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMyo2MCwgYm9vc3RlckNvb2xkb3duOiAzNio2MCwgYm9vc3RlckRhdGU6ICdib29zdGVyRGF0ZVByZWNpc2lvblByaXNtJywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JQcmVjaXNpb25QcmlzbScsIHZhcm5hbWU6ICdwcmVjaXNpb25QcmlzbScgLG5hbWU6ICdQcmVjaXNpb24gUHJpc20nLCBpbmNyZWRpZW50czogWycyeFM4JywgJzF4UzInXSwgZGVzY3JpcHRpb246ICdQcmVjaXNpb24gUHJpc206IDQgdGltZXMgdGhlIHBvaW50cyB3aGVuIGluY3JlYXNpbmcgdGhlIFwibm90ZSBsZW5ndGggbWFqdXJpdHlcIiBmb3IgYSBub3RlIHRoZSBuZXh0IDMgaG91cnMuJyB9LFxyXG4gIHsgYm9vc3RlclJ1blRpbWU6IDMqNjAsIGJvb3N0ZXJDb29sZG93bjogMzYqNjAsIGJvb3N0ZXJEYXRlOiAnYm9vc3RlckRhdGVIeXBlcmxpbmtIYXJtb255JywgYm9vc3RlclN3aXRjaDogJ2Jvb3N0ZXJGYWN0b3JIeXBlcmxpbmtIYXJtb255JywgdmFybmFtZTogJ2h5cGVybGlua0hhcm1vbnknICxuYW1lOiAnSHlwZXJsaW5rIEhhcm1vbnknLCBpbmNyZWRpZW50czogWycyeFMyJywgJzF4UzYnXSwgZGVzY3JpcHRpb246ICdIeXBlcmxpbmsgSGFybW9ueTogR2V0IGZvciBcIklubGluayBtYWp1cml0eVwiIEFORCBcIm91dGxpbmsgbWFqdXJpdHlcIiBpbXByb3ZlbWVudHMgNSB0aW1lcyB0aGUgcG9pbnQgdGhlIG5leHQgMyBob3Vycy4nIH0sXHJcbiAgeyBib29zdGVyUnVuVGltZTogMio2MCwgYm9vc3RlckNvb2xkb3duOiAyMTYwKjYwLCBib29zdGVyRGF0ZTogJ2Jvb3N0ZXJEYXRlRXBoZW1lcmFsRXVwaG9yaWEnLCBib29zdGVyU3dpdGNoOiAnYm9vc3RlckZhY3RvckVwaGVtZXJhbEV1cGhvcmlhJywgdmFybmFtZTogJ2VwaGVtZXJhbEV1cGhvcmlhJyAsbmFtZTogJ0VwaGVtZXJhbCBFdXBob3JpYScsIGluY3JlZGllbnRzOiBbJzEwMDB4U1gnXSwgZGVzY3JpcHRpb246ICdVbmVhcnRoIHRoZSBoaWRkZW4gcG90ZW50aWFsIHdpdGhpbiB5b3VyIGtub3dsZWRnZSByZXBvc2l0b3J5IHdpdGggdGhlIEVwaGVtZXJhbCBFdXBob3JpYSBib29zdGVyLiBGb3IgYSBmbGVldGluZyB0d28taG91ciB3aW5kb3csIHlvdXIgbm90ZXMgd2lsbCByZXNvbmF0ZSB3aXRoIGFuIGV4dHJhb3JkaW5hcnkgdml0YWxpdHksIGFsbG93aW5nIHlvdSB0byBlYXJuIHBvaW50cyBhdCBhbiBhc3RvbmlzaGluZyByYXRlLiBTZWl6ZSB0aGlzIG1vbWVudCBvZiBib3VuZGxlc3Mgb3Bwb3J0dW5pdHkgYW5kIHdhdGNoIHlvdXIga25vd2xlZGdlIGZsb3VyaXNoIGxpa2UgbmV2ZXIgYmVmb3JlIScgfSxcclxuXTtcclxuXHJcbiIsICJpbXBvcnQgeyBURmlsZSwgQXBwLCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhdGVQcm9ncmVzc2l2ZVN1bW1hcml6YXRpb24oY2hhckNvdW50VG90YWw6IG51bWJlciwgbGF5ZXIyY291bnQ6IG51bWJlciwgbGF5ZXIzY291bnQ6IG51bWJlcik6IG51bWJlciB7XHJcblx0Y29uc3QgcGVyY2VudExheWVyMiA9IGxheWVyMmNvdW50ICogMTAwIC8gY2hhckNvdW50VG90YWw7XHJcbiAgICBjb25zdCBwZXJjZW50TGF5ZXIzID0gbGF5ZXIzY291bnQgKiAxMDAgLyBsYXllcjJjb3VudDtcclxuXHR2YXIgbGF5ZXIybWFqdXJpdHkgPSAwO1xyXG5cdHZhciBsYXllcjNtYWp1cml0eSA9IDA7XHJcblx0dmFyIG1hanVyaXR5ID0gMDtcclxuXHRpZiAoY2hhckNvdW50VG90YWwgPCAzMDAwKSB7XHJcblx0XHRtYWp1cml0eSA9IDA7XHJcblx0XHQvL2NvbnNvbGUubG9nKGBOb3RlIGlzIG5vdCBsb25nIGVub3VnaCB0byBnZXQgaW50byBjYWxjdWxhdGlvbiBmb3IgbWFqdXJpdHkuIFRoZSB0b3RhbCBjaGFyYWN0ZXIgY291bnQgaXMgJHtjaGFyQ291bnRUb3RhbH1gKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0aWYgKHBlcmNlbnRMYXllcjIgPT0gMCkge1xyXG5cdFx0XHRsYXllcjJtYWp1cml0eSA9IDA7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjIgPD0gMTApIHtcclxuXHRcdFx0bGF5ZXIybWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIyIDw9IDIwKSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gNDtcclxuXHRcdH0gZWxzZSBpZiAocGVyY2VudExheWVyMiA8PSAzMCkge1xyXG5cdFx0XHRsYXllcjJtYWp1cml0eSA9IDM7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjIgPD0gNDApIHtcclxuXHRcdFx0bGF5ZXIybWFqdXJpdHkgPSAyO1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIyIDw9IDQwKSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gMTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxheWVyMm1hanVyaXR5ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGF5ZXIzY291bnQgPT0gMCkge1xyXG5cdFx0XHRsYXllcjNtYWp1cml0eSA9IDA7XHJcblx0XHR9IGVsc2UgaWYgKHBlcmNlbnRMYXllcjMgPD0gMTApIHtcclxuXHRcdFx0bGF5ZXIzbWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIGlmIChwZXJjZW50TGF5ZXIzIDw9IDIwKSB7XHJcblx0XHRcdGxheWVyM21hanVyaXR5ID0gNDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxheWVyM21hanVyaXR5ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGF5ZXIybWFqdXJpdHkgPT0gMSAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMTtcclxuXHRcdH0gZWxzZSBpZiAobGF5ZXIybWFqdXJpdHkgPT0gMiAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMjtcclxuXHRcdH0gZWxzZSBpZiAobGF5ZXIybWFqdXJpdHkgPj0gMyAmJiBsYXllcjNtYWp1cml0eSA9PSAwKSB7XHJcblx0XHRcdG1hanVyaXR5ID0gMztcclxuXHRcdH0gZWxzZSBpZiAoKGxheWVyMm1hanVyaXR5ID09IDMgfHwgbGF5ZXIybWFqdXJpdHkgPT0gNCkgJiYgKGxheWVyM21hanVyaXR5ID09IDQgfHwgbGF5ZXIzbWFqdXJpdHkgPT0gNSkpIHtcclxuXHRcdFx0bWFqdXJpdHkgPSA0O1xyXG5cdFx0fSBlbHNlIGlmIChsYXllcjJtYWp1cml0eSA9PSA1ICYmIGxheWVyM21hanVyaXR5ID09IDUpIHtcclxuXHRcdFx0bWFqdXJpdHkgPSA1O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWFqdXJpdHkgPSAwO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0XHJcblx0Ly9jb25zb2xlLmxvZyhgbGF5ZXIybWFqdXJpdHk6ICR7bGF5ZXIybWFqdXJpdHl9IFxcdGxheWVyM21hanVyaXR5OiAke2xheWVyM21hanVyaXR5fSBcXHRtYWp1cml0eTogJHttYWp1cml0eX1gKTtcclxuXHQvL2NvbnNvbGUubG9nKGBwZXJjZW50TGF5ZXIyOiAke3BlcmNlbnRMYXllcjJ9IFxcdHBlcmNlbnRMYXllcjM6ICR7cGVyY2VudExheWVyM30gXFx0bWFqdXJpdHk6ICR7bWFqdXJpdHl9YCk7XHJcblx0Ly9jb25zb2xlLmxvZyhgY2hhckNvdW50VG90YWw6ICR7Y2hhckNvdW50VG90YWx9YCk7XHJcblx0cmV0dXJuIG1hanVyaXR5O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TGF5ZXIyQW5kTGF5ZXIzQ2hhcmFjdGVycyhjb250ZW50OiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIGxheWVyMjogc3RyaW5nLCBsYXllcjM6IHN0cmluZyk6IHsgY2hhckNvdW50OiBudW1iZXI7IGhpZ2hsaWdodGVkQ291bnQ6IG51bWJlcjsgYm9sZENvdW50OiBudW1iZXIgfSB7XHJcbiAgXHJcblx0Y29uc3QgZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZW5hbWU7IC8vLnNsaWNlKDAsIC1maWxlbmFtZS5sZW5ndGgpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb246ICR7ZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9ufWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWFya2Rvd24gZm9ybWF0dGluZyBzeW1ib2xzXHJcblx0Y29uc3Qgc3RyaXBwZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9bKl9+YF0vZywgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbjogJHtmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb259YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBtYXJrZG93biBoZWFkaW5ncyB0aGF0IG1hdGNoIHRoZSBmaWxlbmFtZVxyXG5cdGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCMrKVxccyguKikkL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0SGVhZGluZ3MgPSBzdHJpcHBlZENvbnRlbnQucmVwbGFjZShoZWFkaW5nUmVnZXgsIChtYXRjaCwgcDEsIHAyKSA9PiB7XHJcblx0XHJcblx0XHQvLyBjb25zb2xlLmxvZyhgcDI6ICR7cDJ9YCk7XHJcblx0XHRpZiAocDIgPT09IGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaDtcclxuXHR9KTtcclxuXHQvLyBjb25zb2xlLmxvZyhgY29udGVudFdpdGhvdXRIZWFkaW5nczogJHtjb250ZW50V2l0aG91dEhlYWRpbmdzfWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWV0YWRhdGEgYmxvY2tzIGZyb20gY291bnRcclxuXHRjb25zdCBtZXRhZGF0YVJlZ2V4ID0gL14tLS1bXFxzXFxTXSo/LS0tL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEgPSBjb250ZW50V2l0aG91dEhlYWRpbmdzLnJlcGxhY2UobWV0YWRhdGFSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0TWV0YWRhdGE6ICR7Y29udGVudFdpdGhvdXRNZXRhZGF0YX1gKTtcclxuXHJcblx0Ly8gUmVtb3ZlICN0YWdzIGZyb20gY291bnRcclxuXHRjb25zdCB0YWdSZWdleCA9IC8jW15cXHNdKy9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0VGFncyA9IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEucmVwbGFjZSh0YWdSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0VGFnczogJHtjb250ZW50V2l0aG91dFRhZ3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBsaW5rcyBhbmQgV2lraXBlZGlhLWxpbmtzIGZyb20gY291bnRcclxuXHRjb25zdCBsaW5rUmVnZXggPSAvXFxbLio/XFxdXFwoLio/XFwpfFxcW1xcWy4qP1xcXVxcXS9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TGlua3MgPSBjb250ZW50V2l0aG91dFRhZ3MucmVwbGFjZShsaW5rUmVnZXgsIFwiXCIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBjb250ZW50V2l0aG91dExpbmtzOiAke2NvbnRlbnRXaXRob3V0TGlua3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBibGFuayBuZXdsaW5lc1xyXG5cdGNvbnN0IGZpbHRlcmVkQ29udGVudDogc3RyaW5nID0gY29udGVudFdpdGhvdXRMaW5rc1xyXG5cdC5zcGxpdCgnXFxuJykgLy8gU3BsaXQgdGhlIGNvbnRlbnQgaW50byBhbiBhcnJheSBvZiBsaW5lc1xyXG5cdC5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpIC8vIEZpbHRlciBvdXQgbGluZXMgdGhhdCBhcmUgZW1wdHkgb3IgY29udGFpbiBvbmx5IHdoaXRlc3BhY2VcclxuXHQuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09ICctLS0nKSAvLyByZW1vdmUgLS0tIG9uIHNpbmdsZSBsaW5lc1xyXG5cdC5qb2luKCdcXG4nKTsgLy8gSm9pbiB0aGUgcmVtYWluaW5nIGxpbmVzIGJhY2sgaW50byBhIHN0cmluZywgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzXHJcblx0Ly8gY29uc29sZS5sb2coYGZpbHRlcmVkQ29udGVudDogJHtmaWx0ZXJlZENvbnRlbnR9YCk7XHJcblxyXG5cdC8vIENvdW50IHRoZSByZW1haW5pbmcgY2hhcmFjdGVyc1xyXG5cdGNvbnN0IGNoYXJDb3VudCA9IGZpbHRlcmVkQ29udGVudC5sZW5ndGg7XHJcblx0Ly8gY29uc29sZS5sb2coYGNoYXJDb3VudDogJHtjaGFyQ291bnR9YCk7XHJcblxyXG5cclxuXHQvLyBjYWxjdWxhdGUgTGF5ZXIgMiAmIDMgTGVuZ3RoXHJcblxyXG5cdC8vIENvdW50IHRoZSBoaWdobGlnaHRlZCBhbmQgYm9sZCBjaGFyYWN0ZXJzXHJcblx0bGV0IGhpZ2hsaWdodGVkQ291bnQgPSAwO1xyXG5cdGxldCBib2xkQ291bnQgPSAwO1xyXG4gIFxyXG5cdHZhciBsYXllcjJleGNsdWRlID0gJz0nXHJcblx0dmFyIGxheWVyM2V4Y2x1ZGUgPSAnXFxcXConXHJcblx0Ly8gdG8gaGF2ZSB0aGUgcmVnIGV4IGNvcnJlY3QuIG90aGVyd2lzZSBpdCB3aWxsIGdldCBzdHVjIHdpdGggKiouXHJcblx0aWYobGF5ZXIzID09ICcqKicpe1xyXG5cdFx0bGF5ZXIzID0gJ1xcXFwqXFxcXConXHJcblx0XHRsYXllcjNleGNsdWRlID0gJ1xcXFwqJ1xyXG5cdFx0bGF5ZXIyZXhjbHVkZSA9ICc9J1xyXG5cdH1cclxuXHRpZihsYXllcjIgPT0gJyoqJyl7XHJcblx0XHRsYXllcjIgPSAnXFxcXCpcXFxcKidcclxuXHRcdGxheWVyM2V4Y2x1ZGUgPSAnPSdcclxuXHRcdGxheWVyMmV4Y2x1ZGUgPSAnXFxcXConXHJcblx0fVxyXG4gIFx0XHJcblxyXG5cdGNvbnN0IGhpZ2hsaWdodFJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtsYXllcjJ9W14ke2xheWVyMmV4Y2x1ZGV9XSske2xheWVyMn1gLCBcImdcIik7XHJcbiAgICBjb25zdCBib2xkUmVnZXggPSBuZXcgUmVnRXhwKGAke2xheWVyM31bXiR7bGF5ZXIzZXhjbHVkZX1dKyR7bGF5ZXIzfWAsIFwiZ1wiKTtcclxuICBcclxuXHQvLyBDb3VudCBoaWdobGlnaHRlZCBjaGFyYWN0ZXJzXHJcblx0Y29uc3QgaGlnaGxpZ2h0ZWRNYXRjaGVzID0gY29udGVudC5tYXRjaChoaWdobGlnaHRSZWdleCk7XHJcblx0aWYgKGhpZ2hsaWdodGVkTWF0Y2hlcykge1xyXG5cdCAgaGlnaGxpZ2h0ZWRDb3VudCA9IGhpZ2hsaWdodGVkTWF0Y2hlcy5qb2luKFwiXCIpLmxlbmd0aCAtIChoaWdobGlnaHRlZE1hdGNoZXMubGVuZ3RoICogNCk7IC8vIFN1YnRyYWN0IHRoZSBsZW5ndGggb2YgJz09J1xyXG5cdCAgLy8gZmlyc3QgdGFrZSB0aGUgbGF5ZXIyIChoaWdobGlnaHRlZENvdW50KSBhbmQgcnVuIG9uIHRoaXMgdGhlICdib2xkUmVnZXgnXHJcblx0ICAvLyBDb3VudCBib2xkIGNoYXJhY3RlcnNcclxuXHQgIGNvbnN0IGxheWVyMlN0cmluZyA9IGhpZ2hsaWdodGVkTWF0Y2hlcy5qb2luKFwiXCIpO1xyXG5cdCAgY29uc3QgYm9sZE1hdGNoZXMgPSBsYXllcjJTdHJpbmcubWF0Y2goYm9sZFJlZ2V4KTtcclxuXHQgIGlmIChib2xkTWF0Y2hlcykge1xyXG5cdCAgICBib2xkQ291bnQgPSBib2xkTWF0Y2hlcy5qb2luKFwiXCIpLmxlbmd0aCAtIChib2xkTWF0Y2hlcy5sZW5ndGggKiA0KTsgLy8gU3VidHJhY3QgdGhlIGxlbmd0aCBvZiAnKionXHJcblx0ICB9XHJcblx0fVxyXG4gIFxyXG5cdFxyXG5cdFxyXG4gIFxyXG5cdHJldHVybiB7IGNoYXJDb3VudCwgaGlnaGxpZ2h0ZWRDb3VudCwgYm9sZENvdW50IH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJhdGVMZXZlbE9mTWF0dXJpdHkobm90ZUxlbmd0aDogbnVtYmVyLCBsZW5ndGhPZlRpdGxlOiBudW1iZXIsIElubGlua3M6IG51bWJlciwgb3V0Z29pbmdMaW5rczogbnVtYmVyLCBwcm9ncmVzc2l2ZVN1bU1hanVyaXR5OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdC8vIGNvbnNvbGUubG9nKGBub3RlTGVuZ3RoOiAke25vdGVMZW5ndGh9XFx0bGVuZ3RoT2ZUaXRsZTogJHtsZW5ndGhPZlRpdGxlfVxcdElubGlua3M6ICR7SW5saW5rc31cXHRvdXRnb2luZ0xpbmtzOiAke291dGdvaW5nTGlua3N9YClcclxuXHRcclxuXHQvLyBkZWNpZGUgaWYgbm90ZUxlbmd0aC1tYWp1cml0eSBvciBwcm9ncmVzc2l2ZVN1bS1tYWp1cml0eSBzaGFsbCBiZSB1c2VkXHJcblx0dmFyIGxlbmd0aE1hanVyaXR5ID0gMDtcclxuXHRpZihub3RlTGVuZ3RoID49IHByb2dyZXNzaXZlU3VtTWFqdXJpdHkpIHtcclxuXHRcdGxlbmd0aE1hanVyaXR5ID0gbm90ZUxlbmd0aDtcclxuXHR9IGVsc2Uge1xyXG5cdFx0bGVuZ3RoTWFqdXJpdHkgPSBwcm9ncmVzc2l2ZVN1bU1hanVyaXR5O1xyXG5cdH1cclxuXHRcclxuXHRjb25zdCB0b3RhbFdlaWdodCA6IG51bWJlciA9IGxlbmd0aE1hanVyaXR5ICsgbGVuZ3RoT2ZUaXRsZSArIElubGlua3MgKyBvdXRnb2luZ0xpbmtzO1xyXG5cdGNvbnN0IGF2ZXJhZ2VXZWlnaHQgPSB0b3RhbFdlaWdodCAvIDU7XHJcblx0Ly8gY29uc29sZS5sb2coYHRvdGFsV2VpZ2h0OiAke3RvdGFsV2VpZ2h0fVxcdGF2ZXJhZ2VXZWlnaHQ6ICR7YXZlcmFnZVdlaWdodH1gKVxyXG5cdGlmIChhdmVyYWdlV2VpZ2h0IDwgMC41KSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gMSkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIGlmIChhdmVyYWdlV2VpZ2h0IDw9IDIpIHtcclxuXHRcdHJldHVybiAyO1xyXG5cdH0gZWxzZSBpZiAoYXZlcmFnZVdlaWdodCA8PSAzKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gMy41KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKGF2ZXJhZ2VXZWlnaHQgPD0gNCkge1xyXG5cdFx0cmV0dXJuIDU7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByYXRlT3V0bGlua3Mob3V0bGlua3M6IG51bWJlcik6IG51bWJlciB7XHJcblx0Ly8gY29uc29sZS5sb2coYG91dGxpbmtzOiAke291dGxpbmtzfWApXHJcblx0aWYgKG91dGxpbmtzIDwgMikge1xyXG5cdFx0cmV0dXJuIDA7XHJcblx0fSBlbHNlIGlmIChvdXRsaW5rcyA8IDMpIHtcclxuXHRcdHJldHVybiAxO1xyXG5cdH0gZWxzZSBpZiAob3V0bGlua3MgPCA1KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKG91dGxpbmtzIDwgOSkge1xyXG5cdFx0cmV0dXJuIDU7XHJcblx0fSBlbHNlIGlmIChvdXRsaW5rcyA8IDExKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKG91dGxpbmtzIDwgMTIpIHtcclxuXHRcdHJldHVybiAxO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZUlubGlua3MobnVtSW5saW5rczogbnVtYmVyKTogbnVtYmVyIHtcclxuXHQvL3ZhciBwcm96ZW50SW5saW5rcyA9IG51bUlubGlua3MgKiAxMDAgLyBudW1BbGxGaWxlcztcclxuXHQvL2NvbnNvbGUubG9nKGBudW1JbmxpbmtzOiAke251bUlubGlua3N9XFx0bnVtQWxsRmlsZXM6ICR7bnVtQWxsRmlsZXN9XFx0cHJvemVudElubGlua3M6ICR7cHJvemVudElubGlua3N9YClcclxuXHQvKmlmIChwcm96ZW50SW5saW5rcyA8IDAuMDA1IHx8IHByb3plbnRJbmxpbmtzID4gMC4xKSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9IGVsc2UgKi8gaWYgKG51bUlubGlua3MgPT0gMCkge1xyXG5cdFx0cmV0dXJuIDA7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgNCkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgOCkge1xyXG5cdFx0cmV0dXJuIDI7XHJcblx0fSBlbHNlIGlmIChudW1JbmxpbmtzIDwgMTEpIHtcclxuXHRcdHJldHVybiAzO1xyXG5cdH0gZWxzZSBpZiAobnVtSW5saW5rcyA8IDE2KSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKG51bUlubGlua3MgPj0gMTYgJiYgbnVtSW5saW5rcyA8IDUwMCApIHtcclxuXHRcdHJldHVybiA1O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gMDtcclxuXHR9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZURpcmVjdGlvbihyYXRpbmdDdXJyZW50OiBzdHJpbmcsIHJhdGluZ05ldzogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRsZXQgcmF0aW5nID0gXCJcIlxyXG5cdGlmIChwYXJzZUludChyYXRpbmdDdXJyZW50LCAxMCkgPiByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nID0gcmF0aW5nTmV3ICsgXCJcdTJCMDdcdUZFMEZcIlxyXG5cdH0gZWxzZSBpZiAocGFyc2VJbnQocmF0aW5nQ3VycmVudCwgMTApIDwgcmF0aW5nTmV3KXtcclxuXHRcdHJhdGluZyA9IHJhdGluZ05ldyArIFwiXHUyQjA2XHVGRTBGXCJcclxuXHR9IGVsc2UgaWYgKHBhcnNlSW50KHJhdGluZ0N1cnJlbnQsIDEwKSA9PSByYXRpbmdOZXcpe1xyXG5cdFx0cmF0aW5nID0gcmF0aW5nTmV3ICsgXCJcdTI3QTFcdUZFMEZcIlxyXG5cdH0gZWxzZSB7XHJcblx0XHRyYXRpbmcgPSByYXRpbmdOZXcgKyBcIlwiXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmF0aW5nXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZUxlbmd0aEZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gIGlmIChmaWxlbmFtZS5sZW5ndGggPCAzMCkge1xyXG5cdHJldHVybiAwO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgODApIHtcclxuXHRyZXR1cm4gMTtcclxuICB9IGVsc2UgaWYgKGZpbGVuYW1lLmxlbmd0aCA8IDEwMCkge1xyXG5cdHJldHVybiAzO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgMTUwKSB7XHJcblx0cmV0dXJuIDU7XHJcbiAgfSBlbHNlIGlmIChmaWxlbmFtZS5sZW5ndGggPCAxOTApIHtcclxuXHRyZXR1cm4gNDtcclxuICB9IGVsc2UgaWYgKGZpbGVuYW1lLmxlbmd0aCA8IDIxMCkge1xyXG5cdHJldHVybiAyO1xyXG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUubGVuZ3RoIDwgMjUwKSB7XHJcblx0cmV0dXJuIDE7XHJcbiAgfSBlbHNlIHtcclxuXHRyZXR1cm4gMDtcclxuICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmF0ZU5vdGVMZW5ndGgoY29udGVubGVuZ3RoOiBudW1iZXIpOiBudW1iZXIge1xyXG5cdGlmIChjb250ZW5sZW5ndGggPCAyMDApIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgNTUwKSB7XHJcblx0XHRyZXR1cm4gNDtcclxuXHR9IGVsc2UgaWYgKGNvbnRlbmxlbmd0aCA8IDEwMDApIHtcclxuXHRcdHJldHVybiA1O1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgMTIwMCkge1xyXG5cdFx0cmV0dXJuIDQ7XHJcblx0fSBlbHNlIGlmIChjb250ZW5sZW5ndGggPCAyMDAwKSB7XHJcblx0XHRyZXR1cm4gMztcclxuXHR9IGVsc2UgaWYgKGNvbnRlbmxlbmd0aCA8IDI1MDApIHtcclxuXHRcdHJldHVybiAyO1xyXG5cdH0gZWxzZSBpZiAoY29udGVubGVuZ3RoIDwgMzAwMCkge1xyXG5cdFx0cmV0dXJuIDE7XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXROdW1iZXJPZk91dGxpbmtzKGFjdGl2ZUZpbGU6IFRGaWxlKTogbnVtYmVyIHtcclxuXHQvLyBjb25zdCBhY3RpdmVGaWxlOiBURmlsZSB8IG51bGwgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRpZiAoIWFjdGl2ZUZpbGUpIHtcclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHRjb25zdCBpbmxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGFjdGl2ZUZpbGUpPy5saW5rcztcclxuXHRyZXR1cm4gaW5saW5rcyA/IE9iamVjdC5rZXlzKGlubGlua3MpLmxlbmd0aCA6IDA7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY291bnRDaGFyYWN0ZXJzSW5BY3RpdmVGaWxlKGNvbnRlbnQ6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgXHJcblx0Y29uc3QgZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZW5hbWU7IC8vLnNsaWNlKDAsIC1maWxlbmFtZS5sZW5ndGgpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb246ICR7ZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9ufWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWFya2Rvd24gZm9ybWF0dGluZyBzeW1ib2xzXHJcblx0Y29uc3Qgc3RyaXBwZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9bKl9+YF0vZywgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbjogJHtmaWxlbmFtZVdpdGhvdXRFeHRlbnNpb259YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBtYXJrZG93biBoZWFkaW5ncyB0aGF0IG1hdGNoIHRoZSBmaWxlbmFtZVxyXG5cdGNvbnN0IGhlYWRpbmdSZWdleCA9IC9eKCMrKVxccyguKikkL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0SGVhZGluZ3MgPSBzdHJpcHBlZENvbnRlbnQucmVwbGFjZShoZWFkaW5nUmVnZXgsIChtYXRjaCwgcDEsIHAyKSA9PiB7XHJcblx0XHJcblx0XHQvLyBjb25zb2xlLmxvZyhgcDI6ICR7cDJ9YCk7XHJcblx0XHRpZiAocDIgPT09IGZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaDtcclxuXHR9KTtcclxuXHQvLyBjb25zb2xlLmxvZyhgY29udGVudFdpdGhvdXRIZWFkaW5nczogJHtjb250ZW50V2l0aG91dEhlYWRpbmdzfWApO1xyXG5cclxuXHQvLyBSZW1vdmUgbWV0YWRhdGEgYmxvY2tzIGZyb20gY291bnRcclxuXHRjb25zdCBtZXRhZGF0YVJlZ2V4ID0gL14tLS1bXFxzXFxTXSo/LS0tL2dtO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEgPSBjb250ZW50V2l0aG91dEhlYWRpbmdzLnJlcGxhY2UobWV0YWRhdGFSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0TWV0YWRhdGE6ICR7Y29udGVudFdpdGhvdXRNZXRhZGF0YX1gKTtcclxuXHJcblx0Ly8gUmVtb3ZlICN0YWdzIGZyb20gY291bnRcclxuXHRjb25zdCB0YWdSZWdleCA9IC8jW15cXHNdKy9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0VGFncyA9IGNvbnRlbnRXaXRob3V0TWV0YWRhdGEucmVwbGFjZSh0YWdSZWdleCwgXCJcIik7XHJcblx0Ly8gY29uc29sZS5sb2coYGNvbnRlbnRXaXRob3V0VGFnczogJHtjb250ZW50V2l0aG91dFRhZ3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBsaW5rcyBhbmQgV2lraXBlZGlhLWxpbmtzIGZyb20gY291bnRcclxuXHRjb25zdCBsaW5rUmVnZXggPSAvXFxbLio/XFxdXFwoLio/XFwpfFxcW1xcWy4qP1xcXVxcXS9nO1xyXG5cdGNvbnN0IGNvbnRlbnRXaXRob3V0TGlua3MgPSBjb250ZW50V2l0aG91dFRhZ3MucmVwbGFjZShsaW5rUmVnZXgsIFwiXCIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKGBjb250ZW50V2l0aG91dExpbmtzOiAke2NvbnRlbnRXaXRob3V0TGlua3N9YCk7XHJcblxyXG5cdC8vIFJlbW92ZSBibGFuayBuZXdsaW5lc1xyXG5cdGNvbnN0IGZpbHRlcmVkQ29udGVudDogc3RyaW5nID0gY29udGVudFdpdGhvdXRMaW5rc1xyXG5cdC5zcGxpdCgnXFxuJykgLy8gU3BsaXQgdGhlIGNvbnRlbnQgaW50byBhbiBhcnJheSBvZiBsaW5lc1xyXG5cdC5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpIC8vIEZpbHRlciBvdXQgbGluZXMgdGhhdCBhcmUgZW1wdHkgb3IgY29udGFpbiBvbmx5IHdoaXRlc3BhY2VcclxuXHQuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09ICctLS0nKSAvLyByZW1vdmUgLS0tIG9uIHNpbmdsZSBsaW5lc1xyXG5cdC5qb2luKCdcXG4nKTsgLy8gSm9pbiB0aGUgcmVtYWluaW5nIGxpbmVzIGJhY2sgaW50byBhIHN0cmluZywgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzXHJcblx0Ly8gY29uc29sZS5sb2coYGZpbHRlcmVkQ29udGVudDogJHtmaWx0ZXJlZENvbnRlbnR9YCk7XHJcblxyXG5cdC8vIENvdW50IHRoZSByZW1haW5pbmcgY2hhcmFjdGVyc1xyXG5cdGNvbnN0IGNoYXJDb3VudCA9IGZpbHRlcmVkQ29udGVudC5sZW5ndGg7XHJcblx0Ly8gY29uc29sZS5sb2coYGNoYXJDb3VudDogJHtjaGFyQ291bnR9YCk7XHJcblxyXG5cdHJldHVybiBjaGFyQ291bnQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY291bnRfaW5saW5rc19zaW5nbGUoZmlsZV9wYXRoOiBzdHJpbmcsIHZhdWx0X3BhdGg6IHN0cmluZyk6IG51bWJlciB7XHJcblx0Ly8gR2V0IHRoZSBmaWxlbmFtZSBhbmQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIHdlJ3JlIGNvdW50aW5nIGxpbmtzIHRvXHJcblx0Y29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVfcGF0aCk7XHJcblx0Y29uc3QgZGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZpbGVfcGF0aCk7XHJcblxyXG5cdC8vIENyZWF0ZSBhIHNldCB0byBob2xkIGFsbCB0aGUgZmlsZXMgdGhhdCBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdGNvbnN0IGxpbmtpbmdfZmlsZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xyXG5cclxuXHQvLyBSZWN1cnNpdmVseSBzZWFyY2ggZm9yIGZpbGVzIGluIHRoZSB2YXVsdCBkaXJlY3RvcnkgdGhhdCBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdGNvbnN0IHdhbGtTeW5jID0gKGRpcjogc3RyaW5nLCBmaWxlbGlzdDogc3RyaW5nW10pID0+IHtcclxuXHRcdGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoZGlyKTtcclxuXHRcdGZpbGVsaXN0ID0gZmlsZWxpc3QgfHwgW107XHJcblx0XHRmaWxlcy5mb3JFYWNoKChmaWxlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbihkaXIsIGZpbGUpKS5pc0RpcmVjdG9yeSgpKSB7XHJcblx0XHRcdFx0ZmlsZWxpc3QgPSB3YWxrU3luYyhwYXRoLmpvaW4oZGlyLCBmaWxlKSwgZmlsZWxpc3QpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdC8vIElnbm9yZSBub24tbWQgZmlsZXMgYW5kIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdXIgdGFyZ2V0IGZpbGVcclxuXHRcdFx0XHRpZiAoIWZpbGUuZW5kc1dpdGgoXCIubWRcIikgfHwgZmlsZSA9PT0gZmlsZW5hbWUpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFJlYWQgdGhlIGZpbGUgYW5kIGxvb2sgZm9yIGxpbmtzIHRvIG91ciB0YXJnZXQgZmlsZVxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpciwgZmlsZSksIFwidXRmLThcIik7XHJcblx0XHRcdFx0ZGF0YS5zcGxpdCgnXFxuJykuZm9yRWFjaCgobGluZTogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAobGluZS5pbmNsdWRlcyhgW1ske2ZpbGVuYW1lLnNsaWNlKDAsIC0zKX1dXWApIHx8IGxpbmUuaW5jbHVkZXMoYFske2ZpbGVuYW1lLnNsaWNlKDAsIC0zKX1dYCkpIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2UgZm91bmQgYSBsaW5rIHRvIG91ciB0YXJnZXQgZmlsZSFcclxuXHRcdFx0XHRcdFx0bGlua2luZ19maWxlcy5hZGQocGF0aC5yZWxhdGl2ZShkaXJlY3RvcnksIHBhdGguam9pbihkaXIsIGZpbGUpKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGZpbGVsaXN0O1xyXG5cdH07XHJcblxyXG5cdHdhbGtTeW5jKHZhdWx0X3BhdGgsIFtdKTtcclxuXHJcblx0Ly8gY291bnQgaG93IG1hbnkgZmlsZXMgYXJlIG1lbnRpb25pbmcgdGhlIGlucHV0IGZpbGVcclxuXHRyZXR1cm4gbGlua2luZ19maWxlcy5zaXplO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50X2lubGlua3MoZmlsZTogVEZpbGUpOiBudW1iZXIge1xyXG4gICAgY29uc3QgeyBhcHA6IHsgbWV0YWRhdGFDYWNoZTogeyByZXNvbHZlZExpbmtzIH0gfSB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgcGF0aCB9ID0gZmlsZTtcclxuXHJcbiAgICBjb25zdCBzdW1JbmxpbmtzID0gT2JqZWN0LnZhbHVlcyhyZXNvbHZlZExpbmtzKVxyXG4gICAgICAgIC5tYXAoKHZhbDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSkgPT4gdmFsW3BhdGhdID8/IDApXHJcbiAgICAgICAgLnJlZHVjZSgobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHN1bUlubGlua3M7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RmlsZUNvdW50TWFwID0gYXN5bmMgKGFwcDogQXBwLCBleGNsdWRlVGFnOiBzdHJpbmcsIGV4Y2x1ZGVGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPj4gPT4ge1xyXG5cclxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcclxuXHJcblx0XHJcblx0Ly8gZmlsZXMgd2l0aCB0aGlzICN0YWdzIGluIHRvIGlnbm9yZVxyXG5cdGxldCBleGNsdWRlZFN1YnN0cmluZ3MgOiBzdHJpbmdbXSA9IFtdXHJcblx0aWYgKGV4Y2x1ZGVUYWcgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBbXVxyXG5cdH0gZWxzZSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBleGNsdWRlVGFnLnNwbGl0KCcsICcpO1xyXG5cdH1cclxuXHRcclxuXHJcblx0Ly8gZm9sZGVycyB0byBpZ25vcmUgLm1kLWZpbGVzIGluXHJcblx0bGV0IGV4Y2x1ZGVkRm9sZGVycyA6IHN0cmluZ1tdID0gW11cclxuXHRpZiAoZXhjbHVkZUZvbGRlciA9PSB1bmRlZmluZWQpIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IFtdXHJcblx0fSBlbHNlIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IGV4Y2x1ZGVGb2xkZXIuc3BsaXQoJywgJyk7XHJcblx0fVxyXG5cdGV4Y2x1ZGVkRm9sZGVycy5wdXNoKCcub2JzaWRpYW4nLCAnLnRyYXNoJyk7IC8vIGhhcmRjb2RlIHRoZSBiYXNpYyBmb2xkZXJzXHJcblx0XHJcbiAgICBjb25zdCBmaWxlQ291bnRNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cclxuXHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvdW50ID0gZmlsZUNvdW50TWFwLmdldChmaWxlTmFtZSkgfHwgMDtcclxuXHJcbiAgICAgICAgZmlsZUNvdW50TWFwLnNldChmaWxlTmFtZSwgY3VycmVudENvdW50ICsgMSk7XHJcblxyXG5cdFx0Y29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcblxyXG4gICAgICAgIGlmICghZXhjbHVkZWRTdWJzdHJpbmdzLnNvbWUoc3Vic3RyaW5nID0+IGZpbGVDb250ZW50cy5pbmNsdWRlcyhzdWJzdHJpbmcpKSAmJiBcclxuICAgICAgICAgICAgIWV4Y2x1ZGVkRm9sZGVycy5zb21lKGZvbGRlciA9PiBmaWxlLnBhdGguaW5jbHVkZXMoZm9sZGVyKSkpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5iYXNlbmFtZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IGZpbGVDb3VudE1hcC5nZXQoZmlsZU5hbWUpIHx8IDA7XHJcblxyXG4gICAgICAgICAgICBmaWxlQ291bnRNYXAuc2V0KGZpbGVOYW1lLCBjdXJyZW50Q291bnQgKyAxKTtcclxuICAgICAgICB9XHJcblx0XHRcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmlsZUNvdW50TWFwO1xyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGaWxlTWFwID0gYXN5bmMgKGFwcDogQXBwLCBleGNsdWRlVGFnOiBzdHJpbmcsIGV4Y2x1ZGVGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8VEZpbGVbXT4gPT4ge1xyXG5cclxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcclxuXHJcblx0Ly8gZmlsZXMgd2l0aCB0aGlzICN0YWdzIGluIHRvIGlnbm9yZVxyXG5cdGxldCBleGNsdWRlZFN1YnN0cmluZ3MgOiBzdHJpbmdbXSA9IFtdXHJcblx0aWYgKGV4Y2x1ZGVUYWcgPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBbXVxyXG5cdH0gZWxzZSB7XHJcblx0XHRleGNsdWRlZFN1YnN0cmluZ3MgPSBleGNsdWRlVGFnLnNwbGl0KCcsICcpO1xyXG5cdH1cclxuXHQvL2NvbnNvbGUubG9nKGBleGNsdWRlZFN1YnN0cmluZ3M6ICR7ZXhjbHVkZWRTdWJzdHJpbmdzfWApXHJcblx0Ly8gZm9sZGVycyB0byBpZ25vcmUgLm1kLWZpbGVzIGluXHJcblx0bGV0IGV4Y2x1ZGVkRm9sZGVycyA6IHN0cmluZ1tdID0gW11cclxuXHRpZiAoZXhjbHVkZUZvbGRlciA9PSB1bmRlZmluZWQpIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IFtdXHJcblx0fSBlbHNlIHtcclxuXHRcdGV4Y2x1ZGVkRm9sZGVycyA9IGV4Y2x1ZGVGb2xkZXIuc3BsaXQoJywgJyk7XHJcblx0fVxyXG5cdGV4Y2x1ZGVkRm9sZGVycy5wdXNoKCcub2JzaWRpYW4nLCAnLnRyYXNoJyk7IC8vIGhhcmRjb2RlIHRoZSBiYXNpYyBmb2xkZXJzXHJcblx0Ly9jb25zb2xlLmxvZyhgZXhjbHVkZWRGb2xkZXJzOiAke2V4Y2x1ZGVkRm9sZGVyc31gKVx0XHJcbiAgICBsZXQgZmlsZUFycmF5OiBURmlsZVtdID0gW107XHJcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cclxuICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHRcdC8vY29uc29sZS5sb2coYGZpbGUucGF0aDogJHtmaWxlLnBhdGh9YClcclxuXHRcdGlmICgoIWV4Y2x1ZGVkU3Vic3RyaW5ncy5zb21lKHN1YnN0cmluZyA9PiBmaWxlQ29udGVudHMuaW5jbHVkZXMoc3Vic3RyaW5nKSkgfHwgZXhjbHVkZVRhZy5sZW5ndGggPT09IDApICYmIFxyXG4gICAgICAgICAgICAhZXhjbHVkZWRGb2xkZXJzLnNvbWUoZm9sZGVyID0+IGZpbGUucGF0aC5pbmNsdWRlcyhmb2xkZXIpKSkge1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGBmaWxlICR7ZmlsZX0gZ2V0J3MgYWRkZWQuYClcclxuXHRcdFx0ZmlsZUFycmF5LnB1c2goZmlsZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmlsZUFycmF5O1xyXG59O1xyXG4iLCAiaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFYXJsaWVzdENyZWF0ZWRGaWxlKGZpbGVzOiBURmlsZVtdKTogVEZpbGUge1xyXG5cdGxldCBlYXJsaWVzdENyZWF0ZWRGaWxlOiBURmlsZSA9IGZpbGVzWzBdO1xyXG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cdFx0aWYgKGZpbGUuc3RhdC5jdGltZSA8IGVhcmxpZXN0Q3JlYXRlZEZpbGUuc3RhdC5jdGltZSkge1xyXG5cdFx0XHRlYXJsaWVzdENyZWF0ZWRGaWxlID0gZmlsZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGVhcmxpZXN0Q3JlYXRlZEZpbGU7XHJcbn1cclxuXHJcbiAgXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWFybGllc3RNb2RpZmllZEZpbGUoZmlsZXM6IFRGaWxlW10pOiBURmlsZSB7XHJcblx0bGV0IGVhcmxpZXN0TW9kaWZpZWRGaWxlOiBURmlsZSA9IGZpbGVzWzBdO1xyXG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cdFx0aWYgKGZpbGUuc3RhdC5tdGltZSA8IGVhcmxpZXN0TW9kaWZpZWRGaWxlLnN0YXQubXRpbWUpIHtcclxuXHRcdFx0ZWFybGllc3RNb2RpZmllZEZpbGUgPSBmaWxlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gZWFybGllc3RNb2RpZmllZEZpbGU7XHJcbn0gIFxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWFybGllc3REYXRlRmlsZShmaWxlczogVEZpbGVbXSk6IFRGaWxlIHtcclxuXHRsZXQgZWFybGllc3RDcmVhdGVkRmlsZTogVEZpbGUgPSBmaWxlc1swXTtcclxuXHRmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcclxuXHRcdGlmIChmaWxlLnN0YXQuY3RpbWUgPCBlYXJsaWVzdENyZWF0ZWRGaWxlLnN0YXQuY3RpbWUpIHtcclxuXHRcdFx0ZWFybGllc3RDcmVhdGVkRmlsZSA9IGZpbGU7XHJcblx0XHR9XHJcblx0XHRpZiAoZmlsZS5zdGF0Lm10aW1lIDwgZWFybGllc3RDcmVhdGVkRmlsZS5zdGF0LmN0aW1lKSB7XHJcblx0XHRcdGVhcmxpZXN0Q3JlYXRlZEZpbGUgPSBmaWxlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gZWFybGllc3RDcmVhdGVkRmlsZTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtb250aHNCZXR3ZWVuKHN0YXJ0TW9udGg6IERhdGUsIGVuZE1vbnRoOiBEYXRlKTogbnVtYmVyIHtcclxuXHRsZXQgbW9udGhzID0gKGVuZE1vbnRoLmdldE1vbnRoKCkgLSBzdGFydE1vbnRoLmdldE1vbnRoKCkpICsgMTtcclxuXHRpZiAoZW5kTW9udGguZ2V0RnVsbFllYXIoKSA+IHN0YXJ0TW9udGguZ2V0RnVsbFllYXIoKSkge1xyXG5cdFx0bW9udGhzICs9IChlbmRNb250aC5nZXRGdWxsWWVhcigpIC0gc3RhcnRNb250aC5nZXRGdWxsWWVhcigpKSoxMjtcclxuXHR9XHJcblx0cmV0dXJuIG1vbnRocztcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGlvbkRhdGVzKGZpbGVzOiBURmlsZVtdKTogQXJyYXk8RGF0ZT4ge1xyXG5cdGNvbnN0IGNyZWF0aW9uRGF0ZXM6IEFycmF5PERhdGU+ID0gW107XHJcbiAgXHJcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcblx0XHRjcmVhdGlvbkRhdGVzLnB1c2gobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKSk7XHJcblx0fVxyXG4gIFxyXG5cdHJldHVybiBjcmVhdGlvbkRhdGVzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGVzKGZpbGVzOiBURmlsZVtdKTogQXJyYXk8RGF0ZT4ge1xyXG5cdGNvbnN0IGNyZWF0aW9uRGF0ZXM6IEFycmF5PERhdGU+ID0gW107XHJcbiAgXHJcblx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcblx0XHRjcmVhdGlvbkRhdGVzLnB1c2gobmV3IERhdGUoZmlsZS5zdGF0Lm10aW1lKSk7XHJcblx0fVxyXG4gIFxyXG5cdHJldHVybiBjcmVhdGlvbkRhdGVzO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0Rm9ybWF0KHlfYXhpczogc3RyaW5nLCBjb3VudHNTdHJpbmdNb2Q6IHN0cmluZywgY2hhcnRSZWR1emllcnVuZ01vbmF0ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRsZXQgbW9uYXRzYmVncmVuenVuZyA9IG51bGxcclxuXHRpZiAoY2hhcnRSZWR1emllcnVuZ01vbmF0ZSA9PSAwKXtcclxuXHRcdG1vbmF0c2JlZ3Jlbnp1bmcgPSAwXHJcblx0fSBlbHNlIHtcclxuXHRcdG1vbmF0c2JlZ3Jlbnp1bmcgPSBjb3VudHNTdHJpbmdNb2Quc3BsaXQoJywnKS5sZW5ndGggLSBjaGFydFJlZHV6aWVydW5nTW9uYXRlXHJcblx0fVxyXG5cdFxyXG5cdC8vY29uc3QgbW9uYXRzYmVncmVuenVuZyA9IGxlbmd0aGNvdW50c1N0cmluZ0NyZWF0ZSAtIHRoaXMuc2V0dGluZ3MuY2hhcnRSZWR1emllcnVuZ01vbmF0ZVxyXG5cdHJldHVybiBcImBgYGNoYXJ0XFxudHlwZTogYmFyXFxubGFiZWxzOiBbXCIgKyB5X2F4aXMgKyBcIl1cXG5zZXJpZXM6XFxuICAtIHRpdGxlOiBtb2RpZmllZFxcbiAgICBkYXRhOiBbXCIgKyBjb3VudHNTdHJpbmdNb2QgKyBcIl1cXG50ZW5zaW9uOiAwLjJcXG53aWR0aDogODAgJVxcbmxhYmVsQ29sb3JzOiBmYWxzZVxcbmZpbGw6IGZhbHNlXFxuYmVnaW5BdFplcm86IGZhbHNlXFxuYmVzdEZpdDogZmFsc2VcXG5iZXN0Rml0VGl0bGU6IHVuZGVmaW5lZFxcbmJlc3RGaXROdW1iZXI6IDBcXG5zdGFja2VkOiB0cnVlXFxueVRpdGxlOiBcXFwiTnVtYmVyIG9mIE5vdGVzXFxcIlxcbnhUaXRsZTogXFxcIk1vbnRoc1xcXCJcXG54TWluOiBcIiArIG1vbmF0c2JlZ3Jlbnp1bmcgKyBcIlxcbmBgYFwiO1xyXG59XHJcblxyXG4gIFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZUNoYXJ0Q29udGVudCAoYXZhdGFyUGFnZU5hbWU6IHN0cmluZywgbmV3Q29udGVudDogc3RyaW5nKSB7XHJcblx0Y29uc3QgZXhpc3RpbmdGaWxlID0gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChgJHthdmF0YXJQYWdlTmFtZX0ubWRgKTtcclxuXHRpZiAoZXhpc3RpbmdGaWxlID09IG51bGwpIHtcclxuXHRcdGNvbnNvbGUubG9nKGBGaWxlICR7YXZhdGFyUGFnZU5hbWV9Lm1kIGRvZXMgbm90IGV4aXN0YCk7XHJcblx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0Y29uc3QgZmlsZSA9IGV4aXN0aW5nRmlsZSBhcyBURmlsZTtcclxuXHJcblx0Y29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cdGxldCByZWZlcmVuY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBlbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cdGxldCBzdGFydDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xyXG5cdFx0aWYgKGxpbmUgPT09IFwiXkNoYXJ0TW9udGhcIikge1xyXG5cdFx0XHRpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XHJcblx0XHRcdFx0cmVmZXJlbmNlID0gaTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAocmVmZXJlbmNlICE9IG51bGwpe1xyXG5cdFx0ZW5kID0gcmVmZXJlbmNlO1xyXG5cdFx0c3RhcnQgPSByZWZlcmVuY2UgLSAxOTtcclxuXHRcdGNvbnN0IG5ld0xpbmVzID0gWy4uLmxpbmVzLnNsaWNlKDAsIHN0YXJ0KSwgbmV3Q29udGVudCwgLi4ubGluZXMuc2xpY2UoZW5kKV07XHJcblx0XHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0xpbmVzLmpvaW4oXCJcXG5cIikpO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsICJleHBvcnQgaW50ZXJmYWNlIEJhZGdlIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgICBsZXZlbDogc3RyaW5nO1xyXG4gIH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmUmVjZWl2ZUFCYWRnZShsZXZlbE9sZDogbnVtYmVyLCBsZXZlbE5ldzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgY29uc3QgYmFkZ2VMZXZlbHM6IG51bWJlcltdID0gWzUsIDEwLCAyMCwgMjcsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCAxMDBdO1xyXG4gIGxldCByZWNlaXZlQmFkZ2UgPSBmYWxzZVxyXG4gIGZvciAobGV0IGk9MDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKXtcclxuICAgIGlmIChsZXZlbE9sZCA8IGJhZGdlTGV2ZWxzW2ldICYmIGxldmVsTmV3ID49IGJhZGdlTGV2ZWxzW2ldKXtcclxuICAgICAgcmVjZWl2ZUJhZGdlID0gdHJ1ZVxyXG4gICAgfSBcclxuICB9XHJcbiAgcmV0dXJuIHJlY2VpdmVCYWRnZVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFkZ2VGb3JMZXZlbChsZXZlbDogbnVtYmVyLCBpbmZvcm06IGJvb2xlYW4pOiBCYWRnZSB7XHJcbiAgICBjb25zdCBiYWRnZUxldmVsczogbnVtYmVyW10gPSBbNSwgMTAsIDIwLCAyNywgMzUsIDQyLCA1MCwgNjAsIDc1LCA4MiwgOTAsIDEwMF07XHJcbiAgICBjb25zdCBiYWRnZU5hbWVzOiBCYWRnZVtdID0gW1xyXG4gICAgICB7IG5hbWU6IFwiRW5saWdodGVuZWQgTm92aWNlXCIsIGRlc2NyaXB0aW9uOiBcIkh1enphaCEgWW91J3ZlIGVtYmFya2VkIG9uIHRoZSBwYXRoIG9mIGtub3dsZWRnZSBhbmQgZWFybmVkIHRoZSB0aXRsZSBvZiAnRW5saWdodGVuZWQgTm92aWNlLicgVGhlIGpvdXJuZXkgaGFzIGp1c3QgYmVndW4sIGFuZCB5b3UncmUgYWxyZWFkeSByYWRpYXRpbmcgd2lzZG9tIGxpa2UgYSBiYWJ5IHN1biFcIiwgbGV2ZWw6IFwibGV2ZWwgNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJDdXJpb3VzIENvbm5vaXNzZXVyXCIsIGRlc2NyaXB0aW9uOiBcIkZhbnRhc3RpYyEgWW91J3ZlIGVtYnJhY2VkIHRoZSB3b25kZXJzIG9mIGxlYXJuaW5nIGFuZCBiZWNvbWUgYSAnQ3VyaW91cyBDb25ub2lzc2V1ci4nIFlvdXIgYXBwZXRpdGUgZm9yIGtub3dsZWRnZSBpcyBpbnNhdGlhYmxlLCBsaWtlIGEgYm90dG9tbGVzcyBib3dsIG9mIGljZSBjcmVhbSFcIiAsIGxldmVsOiBcImxldmVsIDEwXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkJyYWluaWFjIFRyYWlsYmxhemVyXCIsIGRlc2NyaXB0aW9uOiBcIkJyYXZvISBBcyBhICdCcmFpbmlhYyBUcmFpbGJsYXplciwnIHlvdSd2ZSBjYXJ2ZWQgeW91ciB3YXkgdGhyb3VnaCBhIGp1bmdsZSBvZiBpbmZvcm1hdGlvbiBhbmQgZW1lcmdlZCB2aWN0b3Jpb3VzLiBZb3VyIGludGVsbGVjdCBpcyBhIGJlYWNvbiBzaGluaW5nIGJyaWdodGx5IGZvciBvdGhlcnMgdG8gZm9sbG93IVwiICwgbGV2ZWw6IFwibGV2ZWwgMjBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU2Nob2xhcmx5IFRyYWlsYmxhemVyXCIsIGRlc2NyaXB0aW9uOiBcIkltcHJlc3NpdmUhIFlvdSdyZSBub3cgYSAnU2Nob2xhcmx5IFRyYWlsYmxhemVyLCcgYm9sZGx5IHZlbnR1cmluZyB0aHJvdWdoIGEgc2VhIG9mIGtub3dsZWRnZSB3aXRoIGEgY29tcGFzcyBvZiBjdXJpb3NpdHkgYW5kIGEgbWFwIG9mIGludGVsbGVjdCFcIiAsIGxldmVsOiBcImxldmVsIDI3XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkluZm8gTmluamEgTWFzdGVyXCIsIGRlc2NyaXB0aW9uOiBcIkluY3JlZGlibGUhIFlvdSd2ZSByZWFjaGVkIHRoZSBwaW5uYWNsZSBvZiBzdGVhbHRoeSBrbm93bGVkZ2UgbWFuYWdlbWVudC4gQXMgYW4gJ0luZm8gTmluamEgTWFzdGVyLCcgeW91IGNhbiBzbmF0Y2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgc2hhZG93cyBsaWtlIGEgZGlnaXRhbCBuaW5qYSFcIiAsIGxldmVsOiBcImxldmVsIDM1XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIldpc2UgT3dsIEd1cnVcIiwgZGVzY3JpcHRpb246IFwiV2hvby1ob28hIFlvdSd2ZSBhY2hpZXZlZCAnV2lzZSBPd2wgR3VydScgc3RhdHVzLiBZb3VyIHdpc2RvbSBpcyBsZWdlbmRhcnksIGFuZCB5b3VyIGhvb3RzIG9mIGtub3dsZWRnZSBlY2hvIHRocm91Z2ggdGhlIGZvcmVzdCBvZiBpZ25vcmFuY2UhXCIgLCBsZXZlbDogXCJsZXZlbCA0MlwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJFaW5zdGVpbiBJbmNhcm5hdGVcIiwgZGVzY3JpcHRpb246IFwiRXVyZWthISBZb3UndmUgYmVjb21lIGFuICdFaW5zdGVpbiBJbmNhcm5hdGUsJyBwdXNoaW5nIHRoZSBib3VuZGFyaWVzIG9mIHVuZGVyc3RhbmRpbmcgYW5kIGJlbmRpbmcgdGhlIGZhYnJpYyBvZiBrbm93bGVkZ2UgdG8geW91ciB3aWxsIVwiICwgbGV2ZWw6IFwibGV2ZWwgNTBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiTWFzdGVybWluZCBTYWdlXCIsIGRlc2NyaXB0aW9uOiBcIk1hZ25pZmljZW50ISBZb3UndmUgYXNjZW5kZWQgdG8gdGhlIHJhbmsgb2YgJ01hc3Rlcm1pbmQgU2FnZSwnIGd1aWRpbmcgdGhlIHJpdmVycyBvZiBpbmZvcm1hdGlvbiBhbmQgZW5saWdodGVuaW5nIGFsbCB3aG8gc2VlayB3aXNkb20hXCIgLCBsZXZlbDogXCJsZXZlbCA2MFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJDZXJlYnJhbCBNYWVzdHJvXCIsIGRlc2NyaXB0aW9uOiBcIkJyYXZpc3NpbW8hIFlvdSdyZSBub3cgYSAnQ2VyZWJyYWwgTWFlc3RybywnIGNvbmR1Y3RpbmcgdGhlIHN5bXBob255IG9mIGtub3dsZWRnZSB3aXRoIHRoZSBmaW5lc3NlIG9mIGEgdmlydHVvc28gY29uZHVjdG9yIVwiICwgbGV2ZWw6IFwibGV2ZWwgNzVcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiWmVuIEtub3dsZWRnZSBLZWVwZXJcIiwgZGVzY3JpcHRpb246IFwiU2VyZW5pdHkgYWNoaWV2ZWQhIEFzIGEgJ1plbiBLbm93bGVkZ2UgS2VlcGVyLCcgeW91IG1haW50YWluIGEgdHJhbnF1aWwgbWluZCB3aGlsZSBtYW5hZ2luZyB2YXN0IHBvb2xzIG9mIGtub3dsZWRnZSB3aXRoIGdyYWNlIGFuZCBwb2lzZS5cIiAsIGxldmVsOiBcImxldmVsIDgyXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkdyYW5kIEFyY2hpdmlzdCBPdmVybG9yZFwiLCBkZXNjcmlwdGlvbjogXCJBbGwgaGFpbCB0aGUgJ0dyYW5kIEFyY2hpdmlzdCBPdmVybG9yZCEnIFlvdSB3aWVsZCB0aGUga25vd2xlZGdlIG9mIGFnZXMgYW5kIGhvbGQgdGhlIGtleXMgdG8gdW5sb2NrIHRoZSBnYXRlcyBvZiB3aXNkb20hXCIgLCBsZXZlbDogXCJsZXZlbCA5MFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJPbW5pc2NpZW50IFNhZ2Ugb2YgRXZlcnl0aGluZ1wiLCBkZXNjcmlwdGlvbjogXCJDb25ncmF0dWxhdGlvbnMsIG9oIHdpc2Ugb25lISBZb3UndmUgYXR0YWluZWQgdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgZW5saWdodGVubWVudCBhcyB0aGUgJ09tbmlzY2llbnQgU2FnZSBvZiBFdmVyeXRoaW5nLicgWW91ciB1bmRlcnN0YW5kaW5nIGtub3dzIG5vIGJvdW5kcywgYW5kIHlvdXIgd2lzZG9tIGlzIGFzIHZhc3QgYXMgdGhlIGNvc21vcyBpdHNlbGYhXCIsIGxldmVsOiBcImxldmVsIDEwMFwiICB9LFxyXG4gICAgXTtcclxuICBcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChsZXZlbCA+PSBiYWRnZUxldmVsc1tpXSkge1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhZGdlTmFtZXNbaW5kZXhdXHJcbiAgfVxyXG4gIFxyXG5cclxuXHJcbiAgZXhwb3J0ICBmdW5jdGlvbiBnZXRCYWRnZUZvckluaXRMZXZlbChsZXZlbDogbnVtYmVyKTogQmFkZ2Uge1xyXG4gICAgY29uc3QgYmFkZ2VMZXZlbHM6IG51bWJlcltdID0gWzAsIDMsIDcsIDE1LCAyMywgMzAsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCAxMDBdO1xyXG4gICAgY29uc3QgYmFkZ2VOYW1lc0luaXQ6IEJhZGdlW10gPSBbXHJcbiAgICAgIHsgbmFtZTogXCJMb3JlIFNlZWtlciBJbml0aWF0ZVwiLCBkZXNjcmlwdGlvbjogXCJXZWxjb21lIHRvIHRoZSBqb3VybmV5IG9mIGtub3dsZWRnZSEgQXMgYSAnTG9yZSBTZWVrZXIgSW5pdGlhdGUsJyB5b3UndmUgdGFrZW4geW91ciBmaXJzdCBzdGVwcyBpbnRvIHRoZSB3b3JsZCBvZiBvcmdhbml6ZWQgd2lzZG9tLiBZb3VyIHF1ZXN0IGhhcyBqdXN0IGJlZ3VuLCBhbmQgd2l0aCBlYWNoIG5vdGUgeW91IG1ha2UsIHlvdSBsYXkgdGhlIGZvdW5kYXRpb24gZm9yIGEgZnV0dXJlIHJpY2ggd2l0aCBpbnNpZ2h0cyBhbmQgdW5kZXJzdGFuZGluZy4gWW91ciBqb3VybmV5IHN0YXJ0cyBoZXJlLCBhbmQgdGhlIHBhdGggYWhlYWQgaXMgZmlsbGVkIHdpdGggcG90ZW50aWFsIGFuZCBkaXNjb3ZlcnkuXCIsIGxldmVsOiBcImxldmVsIDFcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiTG9yZSBBcHByZW50aWNlXCIsIGRlc2NyaXB0aW9uOiBcIllvdSd2ZSBoaXQgdGhlIGdyb3VuZCBydW5uaW5nIHdpdGggeW91ciBleGlzdGluZyBrbm93bGVkZ2UgdHJlYXN1cmVzISBZb3UncmUgYWxyZWFkeSBhbiAnTG9yZSBBcHByZW50aWNlLCcgYXJtZWQgd2l0aCBhIHdlYWx0aCBvZiB3aXNkb20gYW5kIHJlYWR5IHRvIHNoYXBlIGl0IGZ1cnRoZXIuXCIsIGxldmVsOiBcImxldmVsIDNcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU2F2dnkgU2Nob2xhclwiLCBkZXNjcmlwdGlvbjogXCJZb3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgZ2l2ZW4geW91IGEgaGVhZCBzdGFydCEgWW91J3JlIG5vdyBhICdTYXZ2eSBTY2hvbGFyLCcgY29uZmlkZW50bHkgZGl2aW5nIGludG8gdGhlIHNlYSBvZiBpbmZvcm1hdGlvbiB3aXRoIGEgdHJlYXN1cmUgdHJvdmUgb2YgaW5zaWdodHMuXCIgLCBsZXZlbDogXCJsZXZlbCA3XCIgfSxcclxuICAgICAgeyBuYW1lOiBcIlNhZ2UncyBGb3VuZGF0aW9uXCIsIGRlc2NyaXB0aW9uOiBcIkJ1aWxkaW5nIHVwb24geW91ciBwcmUtZXhpc3Rpbmcgbm90ZXMsIHlvdSdyZSBlc3RhYmxpc2hpbmcgdGhlICdTYWdlJ3MgRm91bmRhdGlvbicgZm9yIGFuIGV2ZW4gZ3JhbmRlciBlZGlmaWNlIG9mIGtub3dsZWRnZS4gWW91ciBncm91bmR3b3JrIGlzIGltcHJlc3NpdmUhXCIgLCBsZXZlbDogXCJsZXZlbCAxNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJXaXNkb20gU2VlZGxpbmdcIiwgZGVzY3JpcHRpb246IFwiWW91ciBleGlzdGluZyBub3RlcyBoYXZlIG51cnR1cmVkIHRoZSBncm93dGggb2YgYSAnV2lzZG9tIFNlZWRsaW5nLicgWW91J3JlIGN1bHRpdmF0aW5nIHlvdXIgZ2FyZGVuIG9mIGtub3dsZWRnZSB3aXRoIGNhcmUgYW5kIHBhdGllbmNlLlwiICwgbGV2ZWw6IFwibGV2ZWwgMjNcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiUHJvZGlnaW91cyBQcmVwYXJlclwiLCBkZXNjcmlwdGlvbjogXCJUaGFua3MgdG8geW91ciBwcmlvciBlZmZvcnRzLCB5b3UncmUgYSAnUHJvZGlnaW91cyBQcmVwYXJlciwnIHN0YW5kaW5nIHRhbGwgYW1vbmcgeW91ciBub3RlcyBhbmQgcmVhZHkgdG8gY29ucXVlciBuZXcgcmVhbG1zIG9mIHVuZGVyc3RhbmRpbmcuXCIgLCBsZXZlbDogXCJsZXZlbCAzMFwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJFcGljIEVwaXBoYW55IEV4cGxvcmVyXCIsIGRlc2NyaXB0aW9uOiBcIllvdXIgcGFzdCBub3RlcyBoYXZlIGxlZCB5b3UgdG8gdGhlIGdyYW5kICdFcGljIEVwaXBoYW55IEV4cGxvcmVyJyBzdGF0dXMhIFlvdSd2ZSBhbHJlYWR5IGJlZW4gZG93biBhIGZldyByYWJiaXQgaG9sZXMgYW5kIGNvbWUgb3V0IHdpdGggZGF6emxpbmcgZGlzY292ZXJpZXMuXCIgLCBsZXZlbDogXCJsZXZlbCAzNVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJMb3JlIEx1bWluYXJ5XCIsIGRlc2NyaXB0aW9uOiBcIldpdGggeW91ciBleGlzdGluZyBub3RlcyBpbGx1bWluYXRpbmcgeW91ciBwYXRoLCB5b3UndmUgYmVjb21lIGEgJ0xvcmUgTHVtaW5hcnksJyBzaGluaW5nIGxpZ2h0IG9uIHRoZSBteXN0ZXJpZXMgb2YgdGhlIHVuaXZlcnNlLCBvbmUgaWRlYSBhdCBhIHRpbWUuXCIgLCBsZXZlbDogXCJsZXZlbCA0MlwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJTY3JpYmUgb2YgdGhlIEFuY2llbnRzXCIsIGRlc2NyaXB0aW9uOiBcIllvdXIgbWFzdGVyeSBvZiBwZXJzb25hbCBrbm93bGVkZ2UgbWFuYWdlbWVudCBoYXMgZWxldmF0ZWQgeW91IHRvIHRoZSBlc3RlZW1lZCByYW5rIG9mIHRoZSAnU2NyaWJlIG9mIHRoZSBBbmNpZW50cy4nIFlvdXIgZXhpc3Rpbmcgbm90ZXMgaGF2ZSB0cmFuc2Zvcm1lZCBpbnRvIHRyZWFzdXJlcywgYnJpZGdpbmcgdGhlIGdhcCBiZXR3ZWVuIG9sZCB3aXNkb20gYW5kIG5ldyBkaXNjb3Zlcmllcy5cIiAsIGxldmVsOiBcImxldmVsIDUwXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkV1cmVrYSBNYWVzdHJvXCIsIGRlc2NyaXB0aW9uOiBcIkFybWVkIHdpdGggeW91ciBleGlzdGluZyBub3RlcywgeW91J3JlIHRoZSAnRXVyZWthIE1hZXN0cm8sJyBjb21wb3NpbmcgYSBzeW1waG9ueSBvZiBpbnNpZ2h0cyB0aGF0IGhhcm1vbml6ZSB3aXRoIHRoZSBtZWxvZHkgb2YgZGlzY292ZXJ5LlwiICwgbGV2ZWw6IFwibGV2ZWwgNjBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiQ2hyb25pY2xlcyBDaGFtcGlvblwiLCBkZXNjcmlwdGlvbjogXCJXaXRoIHlvdXIgZXhpc3Rpbmcgbm90ZXMgc3RhbmRpbmcgYXMgYSB0ZXN0YW1lbnQsIHlvdSd2ZSBhc2NlbmRlZCB0byB0aGUgaWxsdXN0cmlvdXMgJ0Nocm9uaWNsZXMgQ2hhbXBpb24nIGxldmVsLiBZb3VyIGpvdXJuZXkgdGhyb3VnaCB0aW1lJ3MgdGFwZXN0cnkgaGFzIGJyb3VnaHQgZm9ydGggYSBzeW1waG9ueSBvZiBpbnNpZ2h0cyB0aGF0IGhhcm1vbml6ZSBwYXN0IGFuZCBwcmVzZW50LlwiICwgbGV2ZWw6IFwibGV2ZWwgNzVcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiVGhlIEN1cmlvdXMgQ2FydG9ncmFwaGVyXCIsIGRlc2NyaXB0aW9uOiBcIkFzICdUaGUgQ3VyaW91cyBDYXJ0b2dyYXBoZXIsJyB5b3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgbWFwcGVkIG91dCB1bmNoYXJ0ZWQgdGVycml0b3JpZXMgb2YgdW5kZXJzdGFuZGluZy4gWW91ciBjdXJpb3NpdHkga25vd3Mgbm8gYm91bmRzLCBhbmQgeW91ciBub3RlcyBhcmUgdGhlIGNvbXBhc3MgZ3VpZGluZyB5b3VyIGV4cGxvcmF0aW9uLlwiICwgbGV2ZWw6IFwibGV2ZWwgODJcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiU3VsdGFuIG9mIFN5bnRoZXNpc1wiLCBkZXNjcmlwdGlvbjogXCJZb3VyIGV4aXN0aW5nIG5vdGVzIGhhdmUgbWFkZSB5b3UgdGhlICdTdWx0YW4gb2YgU3ludGhlc2lzLicgWW91J3JlIHRoZSBtYXN0ZXIgd2VhdmVyLCB0aHJlYWRpbmcgdG9nZXRoZXIgdGhyZWFkcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmljaCB0YXBlc3RyeSBvZiBpbnNpZ2h0LlwiICwgbGV2ZWw6IFwibGV2ZWwgOTBcIiB9LFxyXG4gICAgICB7IG5hbWU6IFwiRXRlcm5hbCBBcmNoaXZpc3RcIiwgZGVzY3JpcHRpb246IFwiQXQgdGhlIHBpbm5hY2xlIG9mIHBlcnNvbmFsIGtub3dsZWRnZSBtYXN0ZXJ5LCB5b3UncmUgbm93IHJldmVyZWQgYXMgdGhlICdFdGVybmFsIEFyY2hpdmlzdC4nIFlvdXIgZXhpc3Rpbmcgbm90ZXMsIGNhcmVmdWxseSBjdXJhdGVkIGFuZCBudXJ0dXJlZCwgc3RhbmQgYXMgaW1tb3J0YWwgYmVhY29ucywgZ3VpZGluZyBzZWVrZXJzIHRocm91Z2ggdGhlIGxhYnlyaW50aCBvZiBrbm93bGVkZ2UgYWNyb3NzIGFnZXMuXCIgLCBsZXZlbDogXCJsZXZlbCAxMDBcIiB9LFxyXG4gICAgXTtcclxuICBcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhZGdlTGV2ZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChsZXZlbCA+PSBiYWRnZUxldmVsc1tpXSkge1xyXG4gICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhZGdlTmFtZXNJbml0W2luZGV4XVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIEV4YW1wbGUgdXNhZ2U6XHJcbiAgLy8gY29uc3QgY3VycmVudExldmVsID0gNDI7IC8vIFJlcGxhY2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgcGxheWVyJ3MgbGV2ZWxcclxuICAvLyBjb25zdCBiYWRnZSA9IGdldEJhZGdlRm9yTGV2ZWwoY3VycmVudExldmVsKTtcclxuICAvLyBjb25zb2xlLmxvZyhgQ29uZ3JhdHVsYXRpb25zISBZb3UndmUgcmVhY2hlZCBMZXZlbCAke2N1cnJlbnRMZXZlbH0uIFlvdSd2ZSBlYXJuZWQgdGhlIFwiJHtiYWRnZS5uYW1lfVwiIGJhZGdlLiAke2JhZGdlLmRlc2NyaXB0aW9ufWApO1xyXG4gIFxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEJhZGdlRm9yTGV2ZWwobGV2ZWw6IG51bWJlcik6IEJhZGdlIHtcclxuICAgIGNvbnN0IGJhZGdlczogQmFkZ2VbXSA9IFtcclxuICAgICAgeyBuYW1lOiBcIkVubGlnaHRlbmVkIE5vdmljZVwiLCBkZXNjcmlwdGlvbjogXCJIdXp6YWghIFlvdSd2ZSBlbWJhcmtlZCBvbiB0aGUgcGF0aCBvZiBrbm93bGVkZ2UgYW5kIGVhcm5lZCB0aGUgdGl0bGUgb2YgJ0VubGlnaHRlbmVkIE5vdmljZS4nIFRoZSBqb3VybmV5IGhhcyBqdXN0IGJlZ3VuLCBhbmQgeW91J3JlIGFscmVhZHkgcmFkaWF0aW5nIHdpc2RvbSBsaWtlIGEgYmFieSBzdW4hXCIgfSxcclxuICAgICAgeyBuYW1lOiBcIkN1cmlvdXMgQ29ubm9pc3NldXJcIiwgZGVzY3JpcHRpb246IFwiRmFudGFzdGljISBZb3UndmUgZW1icmFjZWQgdGhlIHdvbmRlcnMgb2YgbGVhcm5pbmcgYW5kIGJlY29tZSBhICdDdXJpb3VzIENvbm5vaXNzZXVyLicgWW91ciBhcHBldGl0ZSBmb3Iga25vd2xlZGdlIGlzIGluc2F0aWFibGUsIGxpa2UgYSBib3R0b21sZXNzIGJvd2wgb2YgaWNlIGNyZWFtIVwiIH0sXHJcbiAgICAgIHsgbmFtZTogXCJCcmFpbmlhYyBUcmFpbGJsYXplclwiLCBkZXNjcmlwdGlvbjogXCJCcmF2byEgQXMgYSAnQnJhaW5pYWMgVHJhaWxibGF6ZXIsJyB5b3UndmUgY2FydmVkIHlvdXIgd2F5IHRocm91Z2ggYSBqdW5nbGUgb2YgaW5mb3JtYXRpb24gYW5kIGVtZXJnZWQgdmljdG9yaW91cy4gWW91ciBpbnRlbGxlY3QgaXMgYSBiZWFjb24gc2hpbmluZyBicmlnaHRseSBmb3Igb3RoZXJzIHRvIGZvbGxvdyFcIiB9LFxyXG4gICAgICAvLyBBZGQgbW9yZSBiYWRnZXMgaGVyZSBmb3IgbGV2ZWxzIDUsIDEwLCAyMCwgMjcsIDM1LCA0MiwgNTAsIDYwLCA3NSwgODIsIDkwLCBhbmQgMTAwXHJcbiAgICAgIC8vIEV4YW1wbGU6XHJcbiAgICAgIC8vIHsgbmFtZTogXCJTY2hvbGFybHkgVHJhaWxibGF6ZXJcIiwgZGVzY3JpcHRpb246IFwiSW1wcmVzc2l2ZSEgWW91J3JlIG5vdyBhICdTY2hvbGFybHkgVHJhaWxibGF6ZXIsJyBib2xkbHkgdmVudHVyaW5nIHRocm91Z2ggYSBzZWEgb2Yga25vd2xlZGdlIHdpdGggYSBjb21wYXNzIG9mIGN1cmlvc2l0eSBhbmQgYSBtYXAgb2YgaW50ZWxsZWN0IVwiIH0sXHJcbiAgICAgIC8vIHsgbmFtZTogXCJJbmZvIE5pbmphIE1hc3RlclwiLCBkZXNjcmlwdGlvbjogXCJJbmNyZWRpYmxlISBZb3UndmUgcmVhY2hlZCB0aGUgcGlubmFjbGUgb2Ygc3RlYWx0aHkga25vd2xlZGdlIG1hbmFnZW1lbnQuIEFzIGFuICdJbmZvIE5pbmphIE1hc3RlciwnIHlvdSBjYW4gc25hdGNoIGluZm9ybWF0aW9uIGZyb20gdGhlIHNoYWRvd3MgbGlrZSBhIGRpZ2l0YWwgbmluamEhXCIgfSxcclxuICAgICAgLy8gLi4uYW5kIHNvIG9uXHJcbiAgICBdO1xyXG4gIFxyXG4gICAgY29uc3QgbWF4TGV2ZWwgPTEwMDsgLy8gQXNzdW1pbmcgZWFjaCBiYWRnZSBpcyBhd2FyZGVkIGV2ZXJ5IDUgbGV2ZWxzXHJcbiAgICBjb25zdCBjYXBwZWRMZXZlbCA9IE1hdGgubWluKGxldmVsLCBtYXhMZXZlbCk7XHJcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY2FwcGVkTGV2ZWwgLyA1KSAtIDE7XHJcbiAgICByZXR1cm4gYmFkZ2VzW2luZGV4XTtcclxuICB9XHJcbiAgXHJcblxyXG4gIGludGVyZmFjZSBCYWRnZSB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIH1cclxuICAqL1xyXG4iLCAiZXhwb3J0IGludGVyZmFjZSBMZXZlbERhdGEge1xyXG4gICAgcG9pbnRzOiBudW1iZXI7XHJcbiAgICBsZXZlbDogbnVtYmVyO1xyXG4gICAgcG9pbnRzTmV4dDogbnVtYmVyO1xyXG4gIH1cclxuICBcclxuICBjb25zdCBsZXZlbERhdGE6IExldmVsRGF0YVtdID0gW1xyXG4gICAgeyBwb2ludHM6IDAsIGxldmVsOiAwLCBwb2ludHNOZXh0OiAwfSxcclxuICAgIHsgcG9pbnRzOiAwLCBsZXZlbDogMSwgcG9pbnRzTmV4dDogMTAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEwMDAsIGxldmVsOiAyLCBwb2ludHNOZXh0OiAzMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMCwgbGV2ZWw6IDMsIHBvaW50c05leHQ6IDc1MDAgfSxcclxuICAgIHsgcG9pbnRzOiA3NTAwLCBsZXZlbDogNCwgcG9pbnRzTmV4dDogMTUwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNTAwMCwgbGV2ZWw6IDUsIHBvaW50c05leHQ6IDMwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMDAsIGxldmVsOiA2LCBwb2ludHNOZXh0OiA1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDUwMDAwLCBsZXZlbDogNywgcG9pbnRzTmV4dDogODAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4MDAwMCwgbGV2ZWw6IDgsIHBvaW50c05leHQ6IDEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEyMDAwMCwgbGV2ZWw6IDksIHBvaW50c05leHQ6IDE3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE3MDAwMCwgbGV2ZWw6IDEwLCBwb2ludHNOZXh0OiAyMzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyMzAwMDAsIGxldmVsOiAxMSwgcG9pbnRzTmV4dDogMzAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAwMDAwLCBsZXZlbDogMTIsIHBvaW50c05leHQ6IDM4MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM4MDAwMCwgbGV2ZWw6IDEzLCBwb2ludHNOZXh0OiA0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0NzAwMDAsIGxldmVsOiAxNCwgcG9pbnRzTmV4dDogNjAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjAwMDAwLCBsZXZlbDogMTUsIHBvaW50c05leHQ6IDc1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc1MDAwMCwgbGV2ZWw6IDE2LCBwb2ludHNOZXh0OiA5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MjAwMDAsIGxldmVsOiAxNywgcG9pbnRzTmV4dDogMTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDExMTAwMDAsIGxldmVsOiAxOCwgcG9pbnRzTmV4dDogMTMyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEzMjAwMDAsIGxldmVsOiAxOSwgcG9pbnRzTmV4dDogMTU1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE1NTAwMDAsIGxldmVsOiAyMCwgcG9pbnRzTmV4dDogMTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE4MDAwMDAsIGxldmVsOiAyMSwgcG9pbnRzTmV4dDogMjA3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIwNzAwMDAsIGxldmVsOiAyMiwgcG9pbnRzTmV4dDogMjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIzNjAwMDAsIGxldmVsOiAyMywgcG9pbnRzTmV4dDogMjY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI2NzAwMDAsIGxldmVsOiAyNCwgcG9pbnRzTmV4dDogMzAwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMwMDAwMDAsIGxldmVsOiAyNSwgcG9pbnRzTmV4dDogMzM1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMzNTAwMDAsIGxldmVsOiAyNiwgcG9pbnRzTmV4dDogMzcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM3MjAwMDAsIGxldmVsOiAyNywgcG9pbnRzTmV4dDogNDExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQxMTAwMDAsIGxldmVsOiAyOCwgcG9pbnRzTmV4dDogNDUyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ1MjAwMDAsIGxldmVsOiAyOSwgcG9pbnRzTmV4dDogNDk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ5NTAwMDAsIGxldmVsOiAzMCwgcG9pbnRzTmV4dDogNTQwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU0MDAwMDAsIGxldmVsOiAzMSwgcG9pbnRzTmV4dDogNTg3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU4NzAwMDAsIGxldmVsOiAzMiwgcG9pbnRzTmV4dDogNjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDYzNjAwMDAsIGxldmVsOiAzMywgcG9pbnRzTmV4dDogNjg3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDY4NzAwMDAsIGxldmVsOiAzNCwgcG9pbnRzTmV4dDogNzQwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc0MDAwMDAsIGxldmVsOiAzNSwgcG9pbnRzTmV4dDogNzk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc5NTAwMDAsIGxldmVsOiAzNiwgcG9pbnRzTmV4dDogODUyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDg1MjAwMDAsIGxldmVsOiAzNywgcG9pbnRzTmV4dDogOTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDkxMTAwMDAsIGxldmVsOiAzOCwgcG9pbnRzTmV4dDogOTcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDk3MjAwMDAsIGxldmVsOiAzOSwgcG9pbnRzTmV4dDogMTAzNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMDM1MDAwMCwgbGV2ZWw6IDQwLCBwb2ludHNOZXh0OiAxMTAwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDExMDAwMDAwLCBsZXZlbDogNDEsIHBvaW50c05leHQ6IDExNjcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTE2NzAwMDAsIGxldmVsOiA0MiwgcG9pbnRzTmV4dDogMTIzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMjM2MDAwMCwgbGV2ZWw6IDQzLCBwb2ludHNOZXh0OiAxMzA3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEzMDcwMDAwLCBsZXZlbDogNDQsIHBvaW50c05leHQ6IDEzODAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTM4MDAwMDAsIGxldmVsOiA0NSwgcG9pbnRzTmV4dDogMTQ1NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNDU1MDAwMCwgbGV2ZWw6IDQ2LCBwb2ludHNOZXh0OiAxNTMyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE1MzIwMDAwLCBsZXZlbDogNDcsIHBvaW50c05leHQ6IDE2MTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTYxMTAwMDAsIGxldmVsOiA0OCwgcG9pbnRzTmV4dDogMTY5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxNjkyMDAwMCwgbGV2ZWw6IDQ5LCBwb2ludHNOZXh0OiAxNzc1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDE3NzUwMDAwLCBsZXZlbDogNTAsIHBvaW50c05leHQ6IDE4NjAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTg2MDAwMDAsIGxldmVsOiA1MSwgcG9pbnRzTmV4dDogMTk0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxOTQ3MDAwMCwgbGV2ZWw6IDUyLCBwb2ludHNOZXh0OiAyMDM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIwMzYwMDAwLCBsZXZlbDogNTMsIHBvaW50c05leHQ6IDIxMjcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjEyNzAwMDAsIGxldmVsOiA1NCwgcG9pbnRzTmV4dDogMjIyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyMjIwMDAwMCwgbGV2ZWw6IDU1LCBwb2ludHNOZXh0OiAyMzE1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDIzMTUwMDAwLCBsZXZlbDogNTYsIHBvaW50c05leHQ6IDI0MTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjQxMjAwMDAsIGxldmVsOiA1NywgcG9pbnRzTmV4dDogMjUxMTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyNTExMDAwMCwgbGV2ZWw6IDU4LCBwb2ludHNOZXh0OiAyNjEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI2MTIwMDAwLCBsZXZlbDogNTksIHBvaW50c05leHQ6IDI3MTUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMjcxNTAwMDAsIGxldmVsOiA2MCwgcG9pbnRzTmV4dDogMjgyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAyODIwMDAwMCwgbGV2ZWw6IDYxLCBwb2ludHNOZXh0OiAyOTI3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDI5MjcwMDAwLCBsZXZlbDogNjIsIHBvaW50c05leHQ6IDMwMzYwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzAzNjAwMDAsIGxldmVsOiA2MywgcG9pbnRzTmV4dDogMzE0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzMTQ3MDAwMCwgbGV2ZWw6IDY0LCBwb2ludHNOZXh0OiAzMjYwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDMyNjAwMDAwLCBsZXZlbDogNjUsIHBvaW50c05leHQ6IDMzNzUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzM3NTAwMDAsIGxldmVsOiA2NiwgcG9pbnRzTmV4dDogMzQ5MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzNDkyMDAwMCwgbGV2ZWw6IDY3LCBwb2ludHNOZXh0OiAzNjExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM2MTEwMDAwLCBsZXZlbDogNjgsIHBvaW50c05leHQ6IDM3MzIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMzczMjAwMDAsIGxldmVsOiA2OSwgcG9pbnRzTmV4dDogMzg1NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAzODU1MDAwMCwgbGV2ZWw6IDcwLCBwb2ludHNOZXh0OiAzOTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDM5ODAwMDAwLCBsZXZlbDogNzEsIHBvaW50c05leHQ6IDQxMDcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDEwNzAwMDAsIGxldmVsOiA3MiwgcG9pbnRzTmV4dDogNDIzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0MjM2MDAwMCwgbGV2ZWw6IDczLCBwb2ludHNOZXh0OiA0MzY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQzNjcwMDAwLCBsZXZlbDogNzQsIHBvaW50c05leHQ6IDQ1MDAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDUwMDAwMDAsIGxldmVsOiA3NSwgcG9pbnRzTmV4dDogNDYzNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA0NjM1MDAwMCwgbGV2ZWw6IDc2LCBwb2ludHNOZXh0OiA0NzcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDQ3NzIwMDAwLCBsZXZlbDogNzcsIHBvaW50c05leHQ6IDQ5MTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNDkxMTAwMDAsIGxldmVsOiA3OCwgcG9pbnRzTmV4dDogNTA1MjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1MDUyMDAwMCwgbGV2ZWw6IDc5LCBwb2ludHNOZXh0OiA1MTk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDUxOTUwMDAwLCBsZXZlbDogODAsIHBvaW50c05leHQ6IDUzNDAwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNTM0MDAwMDAsIGxldmVsOiA4MSwgcG9pbnRzTmV4dDogNTQ4NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1NDg3MDAwMCwgbGV2ZWw6IDgyLCBwb2ludHNOZXh0OiA1NjM2MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDU2MzYwMDAwLCBsZXZlbDogODMsIHBvaW50c05leHQ6IDU3ODcwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNTc4NzAwMDAsIGxldmVsOiA4NCwgcG9pbnRzTmV4dDogNTk0MDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA1OTQwMDAwMCwgbGV2ZWw6IDg1LCBwb2ludHNOZXh0OiA2MDk1MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDYwOTUwMDAwLCBsZXZlbDogODYsIHBvaW50c05leHQ6IDYyNTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjI1MjAwMDAsIGxldmVsOiA4NywgcG9pbnRzTmV4dDogNjQxMTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA2NDExMDAwMCwgbGV2ZWw6IDg4LCBwb2ludHNOZXh0OiA2NTcyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDY1NzIwMDAwLCBsZXZlbDogODksIHBvaW50c05leHQ6IDY3MzUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNjczNTAwMDAsIGxldmVsOiA5MCwgcG9pbnRzTmV4dDogNjkwMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA2OTAwMDAwMCwgbGV2ZWw6IDkxLCBwb2ludHNOZXh0OiA3MDY3MDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDcwNjcwMDAwLCBsZXZlbDogOTIsIHBvaW50c05leHQ6IDcyMzYwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNzIzNjAwMDAsIGxldmVsOiA5MywgcG9pbnRzTmV4dDogNzQwNzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA3NDA3MDAwMCwgbGV2ZWw6IDk0LCBwb2ludHNOZXh0OiA3NTgwMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDc1ODAwMDAwLCBsZXZlbDogOTUsIHBvaW50c05leHQ6IDc3NTUwMDAwIH0sXHJcbiAgICB7IHBvaW50czogNzc1NTAwMDAsIGxldmVsOiA5NiwgcG9pbnRzTmV4dDogNzkzMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA3OTMyMDAwMCwgbGV2ZWw6IDk3LCBwb2ludHNOZXh0OiA4MTExMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDgxMTEwMDAwLCBsZXZlbDogOTgsIHBvaW50c05leHQ6IDgyOTIwMDAwIH0sXHJcbiAgICB7IHBvaW50czogODI5MjAwMDAsIGxldmVsOiA5OSwgcG9pbnRzTmV4dDogODQ3NTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4NDc1MDAwMCwgbGV2ZWw6IDEwMCwgcG9pbnRzTmV4dDogODY2MDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4NjYwMDAwMCwgbGV2ZWw6IDEwMSwgcG9pbnRzTmV4dDogODg0NzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA4ODQ3MDAwMCwgbGV2ZWw6IDEwMiwgcG9pbnRzTmV4dDogOTAzNjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MDM2MDAwMCwgbGV2ZWw6IDEwMywgcG9pbnRzTmV4dDogOTIyNzAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5MjI3MDAwMCwgbGV2ZWw6IDEwNCwgcG9pbnRzTmV4dDogOTQyMDAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5NDIwMDAwMCwgbGV2ZWw6IDEwNSwgcG9pbnRzTmV4dDogOTYxNTAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5NjE1MDAwMCwgbGV2ZWw6IDEwNiwgcG9pbnRzTmV4dDogOTgxMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiA5ODEyMDAwMCwgbGV2ZWw6IDEwNywgcG9pbnRzTmV4dDogMTAwMTEwMDAwIH0sXHJcbiAgICB7IHBvaW50czogMTAwMTEwMDAwLCBsZXZlbDogMTA4LCBwb2ludHNOZXh0OiAxMDIxMjAwMDAgfSxcclxuICAgIHsgcG9pbnRzOiAxMDIxMjAwMDAsIGxldmVsOiAxMDksIHBvaW50c05leHQ6IDEwMjEyMDAwMCB9LFxyXG4gICAgeyBwb2ludHM6IDEwNDE1MDAwMCwgbGV2ZWw6IDExMCwgcG9pbnRzTmV4dDogMTA2MTUwMDAwIH0sXHJcbiAgXTtcclxuICBcclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TGV2ZWxGb3JQb2ludHMocG9pbnRzOiBudW1iZXIpOiBMZXZlbERhdGEge1xyXG4gICAgbGV0IGxldmVsIDpMZXZlbERhdGEgPSBsZXZlbERhdGFbMF07XHJcbiAgICBmb3IgKGNvbnN0IGRhdGEgb2YgbGV2ZWxEYXRhKSB7XHJcbiAgICAgIGlmIChwb2ludHMgPj0gZGF0YS5wb2ludHMpIHtcclxuICAgICAgICBsZXZlbCA9IGRhdGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsZXZlbDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBzdGF0dXNQb2ludHNGb3JMZXZlbCh0YXJnZXRMZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBzdGF0dXNQb2ludHMgPSAwO1xyXG4gICAgZm9yIChjb25zdCBkYXRhIG9mIGxldmVsRGF0YSkge1xyXG4gICAgICBpZiAodGFyZ2V0TGV2ZWwgPT0gZGF0YS5sZXZlbCAmJiBzdGF0dXNQb2ludHMgPT0gMCkge1xyXG4gICAgICAgIHN0YXR1c1BvaW50cyA9IGRhdGEucG9pbnRzO1xyXG4gICAgICB9IFxyXG4gICAgfVxyXG5cclxuXHRcdFxyXG5cdFx0cmV0dXJuIHN0YXR1c1BvaW50c1xyXG4gIH1cclxuICBcclxuXHJcbi8qXHJcbmNvbnN0IHBvaW50cyA9IDU1MDA7XHJcbmNvbnN0IGxldmVsID0gZ2V0TGV2ZWxGb3JQb2ludHMocG9pbnRzKTtcclxuY29uc29sZS5sb2coYFdpdGggJHtwb2ludHN9IHBvaW50cywgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgJHtsZXZlbH0uYCk7XHJcbiovIiwgImNvbnN0IG1lc3NhZ2VzV2Vla2x5Q2hhbGxlbmdlOiBzdHJpbmdbXSA9IFtcclxuXHRcIlNldmVuIGRheXMgb2Ygbm90ZS10YWtpbmc/IFlvdSdyZSBwcmFjdGljYWxseSBhIG5vdGUgbmluamEgdHVydGxlIG5vdyEgXHVEODNEXHVEQzIyXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGNvd2FidW5nYSFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGNvbXBsZXRlZCBhIHdlZWstbG9uZyBub3RlLXRha2luZyBtYXJhdGhvbiEgXHVEODNDXHVERkMzXHUyMDBEXHUyNjQyXHVGRTBGXHVEODNEXHVEQ0REIFtYXSBwb2ludHMgZWFybmVkLiBSZWFkeSBmb3IgdGhlIG5leHQgbGFwP1wiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgb24gZmlyZSEgXHVEODNEXHVERDI1XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgdGhlIHNwYXJrIGFsaXZlIVwiLFxyXG5cdFwiU2V2ZW4gbm90ZXMgaW4gc2V2ZW4gZGF5cyAtIHRoYXQncyBsaWtlIGEgbm90ZSBzeW1waG9ueSEgXHVEODNDXHVERkI2XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIG1hZXN0cm8hXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgZmllc3RhISBcdUQ4M0NcdURGODlcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCB0aGUgcGFydHkgZ29pbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIFlvdSdyZSBsaWtlIHRoZSBKYW1lcyBCb25kIG9mIG5vdGUtdGFraW5nISBcdUQ4M0RcdURENzZcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgc2VjcmV0IGFnZW50IVwiLFxyXG5cdFwiWW91J3JlIG9mZmljaWFsbHkgYSAnTm90ZS1BLURheScgc3VwZXJoZXJvISBcdUQ4M0VcdUREQjhcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgY2FwZXMgb3B0aW9uYWwhXCIsXHJcblx0XCJBIHdob2xlIHdlZWsgb2Ygbm90ZXM/IFlvdSd2ZSBwcmFjdGljYWxseSB3cml0dGVuIGEgbWluaSBub3ZlbCBieSBub3chIFx1RDgzRFx1RENEQVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBhdXRob3Igc3RhdHVzIGFjaGlldmVkIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cyBzdHJhaWdodD8gWW91J3JlIHRoZSBVc2FpbiBCb2x0IG9mIG5vdGUtdGFraW5nISBcdUQ4M0NcdURGQzNcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgc3ByaW50aW5nIHRvd2FyZHMga25vd2xlZGdlIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHNwcmVlISBJdCdzIGxpa2UgYSBub3Rlcy1wbG9zaW9uISBcdUQ4M0RcdURDQTVcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCB0aGUgZmlyZXdvcmtzIGNvbWluZyFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGJhc2ljYWxseSB0aGUgTWljaGFlbCBKb3JkYW4gb2Ygbm90ZS10YWtpbmchIFx1RDgzQ1x1REZDMFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBzbGFtIGR1bmshXCIsXHJcblx0XCJBIHdob2xlIHdlZWsgb2Ygbm90ZXM/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgTVZQISBcdUQ4M0NcdURGQzZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzY29yaW5nIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgdW5sb2NrZWQgdGhlICdTZXZlbiBEYXkgTm90ZSBGZXZlcicgYWNoaWV2ZW1lbnQhIFx1RDgzQ1x1REYxRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBjYXRjaCB0aGUgZmV2ZXIhXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIHJvY2tzdGFyISBcdUQ4M0NcdURGQjhcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBqYW1taW4nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIG1hZ2ljIHNob3chIE5vdyB5b3Ugc2VlIHRoZSBub3Rlcywgbm93IHlvdSBkb24ndCEgXHVEODNDXHVERkE5XHUyNzI4IFtYXSBwb2ludHMsIGtlZXAgdGhlIG1hZ2ljIGFsaXZlIVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgbGlrZSBhIG5vdGUtdGFraW5nIEplZGkgTWFzdGVyISBcdUQ4M0NcdURGMENcdTI2OTRcdUZFMEYgW1hdIHBvaW50cywgbWF5IHRoZSBub3RlcyBiZSB3aXRoIHlvdSFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgVG9ueSBIYXdrIG9mIG5vdGUtdGFraW5nISBcdUQ4M0RcdURFRjlcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzaHJlZGRpbmchXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgcm9sbGVyY29hc3RlciEgVXAgYW5kIGRvd24sIGJ1dCBhbHdheXMgbW92aW5nIGZvcndhcmQhIFx1RDgzQ1x1REZBMlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBlbmpveSB0aGUgcmlkZSFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGEgbm90ZS10YWtpbmcgREogc3Bpbm5pbmcga25vd2xlZGdlIGJlYXRzISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgZHJvcCB0aGUga25vd2xlZGdlIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgY29ucXVlcmVkIHRoZSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgY2hhbGxlbmdlISBZb3UncmUgdGhlIG5vdGUtdGFraW5nIEluZGlhbmEgSm9uZXMhIFx1RDgzQ1x1REZGOVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGV4cGxvcmluZyFcIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIHRoZSBub3RlLXRha2luZyBTaGVybG9jayBIb2xtZXMsIHNvbHZpbmcga25vd2xlZGdlIG15c3RlcmllcyEgXHVEODNEXHVERDBEXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xldXRoaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBQaWNhc3NvLCBjcmVhdGluZyBhIG1hc3RlcnBpZWNlIG9mIGtub3dsZWRnZSEgXHVEODNDXHVERkE4XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgcGFpbnRpbmchXCIsXHJcblx0XCJZb3UncmUgb24gYSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgcm9ja2V0IHNoaXAhIERlc3RpbmF0aW9uOiBJbmZpbml0ZSBLbm93bGVkZ2UhIFx1RDgzRFx1REU4MFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBlbmpveSB0aGUgam91cm5leSFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgTWFjR3l2ZXIsIHR1cm5pbmcgaW5mb3JtYXRpb24gaW50byBzb2x1dGlvbnMhIFx1RDgzRFx1REQyN1x1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGNyYWZ0aW5nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHNhZmFyaSwgZXhwbG9yaW5nIHRoZSB3aWxkcyBvZiBrbm93bGVkZ2UhIFx1RDgzRFx1REMxOFx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIGV4cGxvcmluZyFcIixcclxuXHRcIlNldmVuIGRheXMsIHNldmVuIG5vdGVzIC0geW91J3JlIGEgbm90ZS10YWtpbmcgY2hlZiwgY29va2luZyB1cCBhIGtub3dsZWRnZSBmZWFzdCEgXHVEODNDXHVERjczXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgY29va2luZyFcIixcclxuXHRcIllvdSd2ZSBqdXN0IHVubG9ja2VkIHRoZSBzZXZlbi1kYXkgbm90ZS10YWtpbmcgYmFkZ2UhIFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgc3VwZXJoZXJvIHdlIG5lZWQhIFx1RDgzRVx1RERCOFx1MjAwRFx1MjY0MFx1RkUwRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIHNhdmluZyB0aGUgZGF5IVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgdGhlIG5vdGUtdGFraW5nIExld2lzIGFuZCBDbGFyaywgY2hhcnRpbmcgbmV3IHRlcnJpdG9yaWVzIG9mIGtub3dsZWRnZSEgXHVEODNEXHVEREZBXHVGRTBGXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgZXhwbG9yaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiwgZHJvcHBpbmcgYmVhdHMgb2Ygd2lzZG9tISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzcGlubmluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyB0cmVhc3VyZSBodW50LCBkaXNjb3ZlcmluZyBnZW1zIG9mIHdpc2RvbSEgXHVEODNEXHVEQzhFXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgaHVudGluZyFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgbmluamEgd2FycmlvciwgY29ucXVlcmluZyB0aGUga25vd2xlZGdlIG9ic3RhY2xlIGNvdXJzZSEgXHVEODNFXHVERDRCXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xheWluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyByb2NrZXQgc2hpcCEgRGVzdGluYXRpb246IEluZmluaXRlIEtub3dsZWRnZSEgXHVEODNEXHVERTgwXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGVuam95IHRoZSBqb3VybmV5IVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBkZXRlY3RpdmUsIHNvbHZpbmcgY2FzZXMgb2YgY3VyaW9zaXR5ISBcdUQ4M0RcdURENzVcdUZFMEZcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBkZXRlY3RpbmchXCIsXHJcblx0XCJZb3UndmUganVzdCB1bmxvY2tlZCB0aGUgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIGJhZGdlISBZb3UncmUgdGhlIG5vdGUtdGFraW5nIHN1cGVyaGVybyB3ZSBuZWVkISBcdUQ4M0VcdUREQjhcdTIwMERcdTI2NDJcdUZFMEZcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzYXZpbmcgdGhlIGRheSFcIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIHRoZSBub3RlLXRha2luZyBwaW9uZWVyLCBibGF6aW5nIHRyYWlscyB0aHJvdWdoIHRoZSBmb3Jlc3RzIG9mIGluZm9ybWF0aW9uISBcdUQ4M0NcdURGMzJcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBwaW9uZWVyaW5nIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiwgZHJvcHBpbmcgYmVhdHMgb2Ygd2lzZG9tISBcdUQ4M0NcdURGQTdcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzcGlubmluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyB0cmVhc3VyZSBodW50LCBkaXNjb3ZlcmluZyBnZW1zIG9mIHdpc2RvbSEgXHVEODNEXHVEQzhFXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgaHVudGluZyFcIixcclxuXHRcIlNldmVuIGRheXMgc3RyYWlnaHQ/IFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgbmluamEgd2FycmlvciwgY29ucXVlcmluZyB0aGUga25vd2xlZGdlIG9ic3RhY2xlIGNvdXJzZSEgXHVEODNFXHVERDRCXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2xheWluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyByb2xsZXJjb2FzdGVyISBVcCBhbmQgZG93biwgYnV0IGFsd2F5cyBtb3ZpbmcgZm9yd2FyZCEgXHVEODNDXHVERkEyXHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGVuam95IHRoZSByaWRlIVwiLFxyXG5cdFwiU2V2ZW4gZGF5cywgc2V2ZW4gbm90ZXMgLSB5b3UncmUgYSBub3RlLXRha2luZyBESiBzcGlubmluZyBrbm93bGVkZ2UgYmVhdHMhIFx1RDgzQ1x1REZBN1x1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBkcm9wIHRoZSBrbm93bGVkZ2UhXCIsXHJcblx0XCJZb3UndmUganVzdCBjb25xdWVyZWQgdGhlIHNldmVuLWRheSBub3RlLXRha2luZyBjaGFsbGVuZ2UhIFlvdSdyZSB0aGUgbm90ZS10YWtpbmcgSW5kaWFuYSBKb25lcyEgXHVEODNDXHVERkY5XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgZXhwbG9yaW5nIVwiLFxyXG5cdFwiQSB3aG9sZSB3ZWVrIG9mIG5vdGVzPyBZb3UncmUgdGhlIG5vdGUtdGFraW5nIFNoZXJsb2NrIEhvbG1lcywgc29sdmluZyBrbm93bGVkZ2UgbXlzdGVyaWVzISBcdUQ4M0RcdUREMERcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBzbGV1dGhpbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIFBpY2Fzc28sIGNyZWF0aW5nIGEgbWFzdGVycGllY2Ugb2Yga25vd2xlZGdlISBcdUQ4M0NcdURGQThcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBwYWludGluZyFcIixcclxuXHRcIllvdSdyZSBvbiBhIHNldmVuLWRheSBub3RlLXRha2luZyBzYWZhcmksIGV4cGxvcmluZyB0aGUgd2lsZHMgb2Yga25vd2xlZGdlISBcdUQ4M0RcdURDMThcdUQ4M0RcdURDREQgW1hdIHBvaW50cywga2VlcCBleHBsb3JpbmchXCIsXHJcblx0XCJTZXZlbiBkYXlzIHN0cmFpZ2h0PyBZb3UncmUgdGhlIFRvbnkgSGF3ayBvZiBub3RlLXRha2luZyEgXHVEODNEXHVERUY5XHVEODNEXHVEQ0REIFtYXSBwb2ludHMsIGtlZXAgc2hyZWRkaW5nIVwiLFxyXG5cdFwiWW91J3JlIG9uIGEgc2V2ZW4tZGF5IG5vdGUtdGFraW5nIHJvY2tldCBzaGlwISBEZXN0aW5hdGlvbjogSW5maW5pdGUgS25vd2xlZGdlISBcdUQ4M0RcdURFODBcdUQ4M0RcdURDREQgW1hdIHBvaW50cywgZW5qb3kgdGhlIGpvdXJuZXkhXCIsXHJcblx0XCJTZXZlbiBkYXlzLCBzZXZlbiBub3RlcyAtIHlvdSdyZSBhIG5vdGUtdGFraW5nIG5pbmphIHR1cnRsZSBub3chIFx1RDgzRFx1REMyMlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBjb3dhYnVuZ2EhXCIsXHJcblx0XCJZb3UndmUganVzdCBjb21wbGV0ZWQgYSB3ZWVrLWxvbmcgbm90ZS10YWtpbmcgbWFyYXRob24hIFx1RDgzQ1x1REZDM1x1MjAwRFx1MjY0Mlx1RkUwRlx1RDgzRFx1RENERCBbWF0gcG9pbnRzIGVhcm5lZC4gUmVhZHkgZm9yIHRoZSBuZXh0IGxhcD9cIixcclxuXHRcIkEgd2hvbGUgd2VlayBvZiBub3Rlcz8gWW91J3JlIG9uIGZpcmUhIFx1RDgzRFx1REQyNVx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBrZWVwIHRoZSBzcGFyayBhbGl2ZSFcIixcclxuXHRcIlNldmVuIG5vdGVzIGluIHNldmVuIGRheXMgLSB0aGF0J3MgbGlrZSBhIG5vdGUgc3ltcGhvbnkhIFx1RDgzQ1x1REZCNlx1RDgzRFx1RENERCBbWF0gcG9pbnRzLCBtYWVzdHJvIVwiXHJcbl07XHJcblxyXG5jb25zdCB0d29Ob3RlTWVzc2FnZXM6IHN0cmluZ1tdID0gW1xyXG5cdFwiQm9vbSEgWW91IGp1c3QgYWNlZCB0aGUgMi1ub3RlIHRhbmdvISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cyBpbiB0aGUgcG9ja2V0LiBLZWVwIGdyb292aW4nIVwiLFxyXG5cdFwiVHdvIG5vdGVzIGluIGEgZGF5PyBZb3UncmUgb2ZmaWNpYWxseSBhIE5vdGUgTmluamEhIFx1RDgzRVx1REQ0QiBbWF0gcG9pbnRzIGVhcm5lZC4gUm9jayBvbiFcIixcclxuXHRcIkhpZ2gtZml2ZSEgWW91J3ZlIGNvbnF1ZXJlZCB0aGUgMi1ub3RlIHJvZGVvISBcdUQ4M0VcdUREMjAgW1hdIHBvaW50cyBlYXJuZWQuIFllZWhhdyFcIixcclxuXHRcIkRvdWJsZSB0cm91YmxlISBUd28gbm90ZXMgaW4gb25lIGRheSwgeW91IGxlZ2VuZCEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMsIHJvY2tzdGFyIVwiLFxyXG5cdFwiWW91J3JlIG9uIGZpcmUhIFR3byBub3RlcyBpbiBhIGRheSAtIHdoYXQncyB5b3VyIHNlY3JldCB3ZWFwb24/IFx1RDgzRFx1REQyNSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiQmluZ28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNEXHVERTgwIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIGl0IHVwIVwiLFxyXG5cdFwiS2Fib29tISBZb3UganVzdCBibGV3IHRoZSAyLW5vdGUgY2hhbGxlbmdlIG91dCBvZiB0aGUgd2F0ZXIhIFx1RDgzRFx1RENBNSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiWW91J3JlIG9mZmljaWFsbHkgYSAyLW5vdGUgc3VwZXJzdGFyISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBpbiB0aGUgYmFnLiBLZWVwIHNoaW5pbmchXCIsXHJcblx0XCJEb3VibGUgdXAsIGRvdWJsZSBkb3duISBUd28gbm90ZXMgaW4gb25lIGRheSAtIHlvdSdyZSBhIHJvY2tzdGFyISBcdUQ4M0NcdURGQjggW1hdIHBvaW50cyFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGpvaW5lZCB0aGUgMi1ub3RlIHBhcnR5ISBcdUQ4M0VcdURENzMgW1hdIHBvaW50cyBlYXJuZWQuIExldCdzIGtlZXAgZGFuY2luZyFcIixcclxuXHRcIkthLWNoaW5nISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSByYWNraW5nIHVwIHRob3NlIHBvaW50cyEgXHVEODNEXHVEQ0IwIFtYXSBlYXJuZWQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFnaWNpYW4hIFx1RDgzQ1x1REZBOVx1MjcyOCBbWF0gcG9pbnRzIGVhcm5lZC4gV2hhdCdzIHlvdXIgbmV4dCB0cmljaz9cIixcclxuXHRcIlR3byBub3Rlcz8gTmFpbGVkIGl0ISBZb3UncmUgb24gYSByb2xsISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgaXQgZ29pbmchXCIsXHJcblx0XCJBYnJhLWNhZGFicmEhIFR3byBub3RlcyBhcHBlYXIhIFx1RDgzQ1x1REZBOVx1MjcyOCBbWF0gcG9pbnRzIGVhcm5lZC4gS2VlcCB0aGUgbWFnaWMgYWxpdmUhXCIsXHJcblx0XCJEb3VibGUgdHJvdWJsZSwgZG91YmxlIHRoZSBmdW4hIFR3byBub3RlcyBpbiBvbmUgZGF5ISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cywgc3VwZXJzdGFyIVwiLFxyXG5cdFwiWW91J3ZlIGp1c3QgdW5sb2NrZWQgdGhlIDItbm90ZSBhY2hpZXZlbWVudCEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIHNvYXJpbmchXCIsXHJcblx0XCJXb28taG9vISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSBvbiBmaXJlISBcdUQ4M0RcdUREMjUgW1hdIHBvaW50cywga2VlcCBpdCB1cCFcIixcclxuXHRcIllvdSdyZSBhIDItbm90ZSB3aXphcmQhIFx1MjcyOFx1RDgzRFx1REQyRSBbWF0gcG9pbnRzIGVhcm5lZC4gV2hhdCdzIHlvdXIgbmV4dCBzcGVsbD9cIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgYXdlc29tZW5lc3MhIFx1RDgzQ1x1REYxRiBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGtpY2tlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSBvdXQgb2YgdGhlIHBhcmshIFx1MjZCRSBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiQm9vbSEgWW91IGp1c3QgY29ucXVlcmVkIHRoZSAyLW5vdGUgY2hhbGxlbmdlISBcdUQ4M0NcdURGODkgW1hdIHBvaW50cywgc3VwZXJzdGFyIVwiLFxyXG5cdFwiRG91YmxlIHRoZSBub3RlcywgZG91YmxlIHRoZSBjZWxlYnJhdGlvbiEgXHVEODNFXHVERDczIFtYXSBwb2ludHMgZWFybmVkLiBQYXJ0eSBvbiFcIixcclxuXHRcIllvdSdyZSBhIDItbm90ZSBtYWVzdHJvISBcdUQ4M0NcdURGQjUgW1hdIHBvaW50cyBpbiB0aGUgcG9ja2V0LiBLZWVwIHRoZSBtdXNpYyBwbGF5aW5nIVwiLFxyXG5cdFwiS2Fib29tISBUd28gbm90ZXMgaW4gYSBkYXkhIFlvdSdyZSBvbiBhIHJvbGwhIFx1RDgzRFx1REU4MCBbWF0gcG9pbnRzIGVhcm5lZC4gS2VlcCBpdCB1cCFcIixcclxuXHRcIllvdSd2ZSBqdXN0IGpvaW5lZCB0aGUgMi1ub3RlIGZpZXN0YSEgXHVEODNFXHVERDczIFtYXSBwb2ludHMgZWFybmVkLiBMZXQncyBrZWVwIGRhbmNpbmchXCIsXHJcblx0XCJaYXAhIFlvdSd2ZSBqdXN0IGVsZWN0cmlmaWVkIHRoZSAyLW5vdGUgY2hhbGxlbmdlISBcdTI2QTEgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJEb3VibGUgbm90ZXMsIGRvdWJsZSB0aGUgc3BhcmtsZSEgXHVEODNDXHVERjFGIFtYXSBwb2ludHMgZWFybmVkLiBLZWVwIHNoaW5pbmcgYnJpZ2h0IVwiLFxyXG5cdFwiWW91J3JlIGEgMi1ub3RlIGR5bmFtbyEgXHVEODNEXHVEQ0E1IFtYXSBwb2ludHMgZWFybmVkLiBXaGF0J3MgeW91ciBuZXh0IGV4cGxvc2lvbj9cIixcclxuXHRcIkthYm9vbSEgVHdvIG5vdGVzIGluIGEgZGF5ISBZb3UncmUgb24gZmlyZSEgXHVEODNEXHVERDI1IFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UndmUganVzdCB1bmxvY2tlZCB0aGUgMi1ub3RlIGFjaGlldmVtZW50ISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc29hcmluZyFcIixcclxuXHRcIldvby1ob28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgd2l6YXJkISBcdTI3MjhcdUQ4M0RcdUREMkUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgc3BlbGw/XCIsXHJcblx0XCJEb3VibGUgdGhlIG5vdGVzLCBkb3VibGUgdGhlIGF3ZXNvbWVuZXNzISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJZb3UndmUganVzdCBraWNrZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2Ugb3V0IG9mIHRoZSBwYXJrISBcdTI2QkUgW1hdIHBvaW50cyFcIixcclxuXHRcIkJvb20hIFlvdSBqdXN0IGNvbnF1ZXJlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIHN1cGVyc3RhciFcIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgY2VsZWJyYXRpb24hIFx1RDgzRVx1REQ3MyBbWF0gcG9pbnRzIGVhcm5lZC4gUGFydHkgb24hXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFlc3RybyEgXHVEODNDXHVERkI1IFtYXSBwb2ludHMgaW4gdGhlIHBvY2tldC4gS2VlcCB0aGUgbXVzaWMgcGxheWluZyFcIixcclxuXHRcIlphcCEgWW91J3ZlIGp1c3QgZWxlY3RyaWZpZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2UhIFx1MjZBMSBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIkRvdWJsZSBub3RlcywgZG91YmxlIHRoZSBzcGFya2xlISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc2hpbmluZyBicmlnaHQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgZHluYW1vISBcdUQ4M0RcdURDQTUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgZXhwbG9zaW9uP1wiLFxyXG5cdFwiS2Fwb3chIFR3byBub3RlcyBpbiBhIGRheSAtIHlvdSdyZSBhIHN1cGVyaGVybyEgXHVEODNFXHVEREI4XHUyMDBEXHUyNjQyXHVGRTBGIFtYXSBwb2ludHMhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbGVnZW5kISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgYWR2ZW50dXJlP1wiLFxyXG5cdFwiQmluZ28hIFR3byBub3RlcyBpbiBhIGRheSEgWW91J3JlIG9uIGEgcm9sbCEgXHVEODNEXHVERTgwIFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgd2l6YXJkISBcdTI3MjhcdUQ4M0RcdUREMkUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgc3BlbGw/XCIsXHJcblx0XCJEb3VibGUgdGhlIG5vdGVzLCBkb3VibGUgdGhlIGF3ZXNvbWVuZXNzISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cywgcm9ja3N0YXIhXCIsXHJcblx0XCJZb3UndmUganVzdCBraWNrZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2Ugb3V0IG9mIHRoZSBwYXJrISBcdTI2QkUgW1hdIHBvaW50cyFcIixcclxuXHRcIkJvb20hIFlvdSBqdXN0IGNvbnF1ZXJlZCB0aGUgMi1ub3RlIGNoYWxsZW5nZSEgXHVEODNDXHVERjg5IFtYXSBwb2ludHMsIHN1cGVyc3RhciFcIixcclxuXHRcIkRvdWJsZSB0aGUgbm90ZXMsIGRvdWJsZSB0aGUgY2VsZWJyYXRpb24hIFx1RDgzRVx1REQ3MyBbWF0gcG9pbnRzIGVhcm5lZC4gUGFydHkgb24hXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgbWFlc3RybyEgXHVEODNDXHVERkI1IFtYXSBwb2ludHMgaW4gdGhlIHBvY2tldC4gS2VlcCB0aGUgbXVzaWMgcGxheWluZyFcIixcclxuXHRcIlphcCEgWW91J3ZlIGp1c3QgZWxlY3RyaWZpZWQgdGhlIDItbm90ZSBjaGFsbGVuZ2UhIFx1MjZBMSBbWF0gcG9pbnRzLCByb2Nrc3RhciFcIixcclxuXHRcIkRvdWJsZSBub3RlcywgZG91YmxlIHRoZSBzcGFya2xlISBcdUQ4M0NcdURGMUYgW1hdIHBvaW50cyBlYXJuZWQuIEtlZXAgc2hpbmluZyBicmlnaHQhXCIsXHJcblx0XCJZb3UncmUgYSAyLW5vdGUgZHluYW1vISBcdUQ4M0RcdURDQTUgW1hdIHBvaW50cyBlYXJuZWQuIFdoYXQncyB5b3VyIG5leHQgZXhwbG9zaW9uP1wiXHJcbl07XHJcblxyXG5jb25zdCByYW5kb21Qb2ludE5vdGljZXM6IHN0cmluZ1tdID0gW1xyXG5cdFwiQmF6aW5nYSEgWW91IGp1c3Qgc25hZ2dlZCBbWF0gcG9pbnRzIVwiLFxyXG5cdFwiS2Fib29tISBbWF0gcG9pbnRzIGFyZSBub3cgaW4geW91ciBwb2NrZXQhXCIsXHJcblx0XCJXb29ob28hIFtYXSBwb2ludHMgZWFybmVkISBLZWVwIGl0IHVwIVwiLFxyXG5cdFwiUG9pbnRzIGFob3khIFtYXSBtb3JlIGluIHRoZSBiYW5rIVwiLFxyXG5cdFwiU2NvcmUhIFtYXSBwb2ludHMgYWRkZWQgdG8geW91ciB0b3RhbCFcIixcclxuXHRcIllvdSdyZSBvbiBmaXJlISBbWF0gcG9pbnRzIGluIHRoZSBiYWchXCIsXHJcblx0XCJaaXBwaXR5LXphcCEgW1hdIHBvaW50cyBmb3IgeW91IVwiLFxyXG5cdFwiQ2hhbXBpb24gbW92ZSEgW1hdIHBvaW50cyBhcmUgeW91cnMhXCIsXHJcblx0XCJCaW5nbyEgW1hdIHBvaW50cyBqdXN0IGZvciB5b3UhXCIsXHJcblx0XCJTaGF6YW0hIFtYXSBwb2ludHMgdG8gdGhlIHJlc2N1ZSFcIixcclxuXHRcIkthLWNoaW5nISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlN1cGVyYiEgW1hdIG1vcmUgcG9pbnRzIGZvciB5b3UhXCIsXHJcblx0XCJCcmF2byEgW1hdIHBvaW50cyBhZGRlZCB0byB5b3VyIHN0YXNoIVwiLFxyXG5cdFwiV2VsbCBkb25lISBbWF0gbW9yZSBwb2ludHMgaW4gdG93IVwiLFxyXG5cdFwiWmFwISBbWF0gcG9pbnRzLCBqdXN0IGxpa2UgdGhhdCFcIixcclxuXHRcIkEgcm91bmQgb2YgYXBwbGF1c2UgZm9yIFtYXSBwb2ludHMhXCIsXHJcblx0XCJXaG9vc2ghIFtYXSBwb2ludHMgYXJlIHlvdXJzIVwiLFxyXG5cdFwiWmluZyEgW1hdIHBvaW50cyBmb3IgeW91ciBlZmZvcnRzIVwiLFxyXG5cdFwiV29vISBbWF0gcG9pbnRzLCB3YXkgdG8gZ28hXCIsXHJcblx0XCJaZXN0eSEgW1hdIHBvaW50cyBpbiB5b3VyIHRhbGx5IVwiLFxyXG5cdFwiR3JlYXQgam9iISBbWF0gbW9yZSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIkZhbnRhc3RpYyEgW1hdIHBvaW50cyBpbiB0aGUgYmFnIVwiLFxyXG5cdFwiWm93aWUhIFtYXSBwb2ludHMganVzdCBmb3IgeW91IVwiLFxyXG5cdFwiSG9vcmF5ISBbWF0gcG9pbnRzIGluIHlvdXIgYWNjb3VudCFcIixcclxuXHRcIk5pY2Ugb25lISBbWF0gcG9pbnRzIGluIHRoZSBwb2NrZXQhXCIsXHJcblx0XCJXb290IHdvb3QhIFtYXSBwb2ludHMsIG5pY2Ugd29yayFcIixcclxuXHRcIlppZ3phZyEgW1hdIHBvaW50cywga2VlcCBpdCB1cCFcIixcclxuXHRcIkJhbSEgW1hdIHBvaW50cywgd2VsbCBkb25lIVwiLFxyXG5cdFwiQ29vbCBiZWFucyEgW1hdIHBvaW50cyBmb3IgeW91IVwiLFxyXG5cdFwiWmVzdHkhIFtYXSBwb2ludHMsIGtlZXAgaXQgdXAhXCIsXHJcblx0XCJTcGxlbmRpZCEgW1hdIHBvaW50cyBmb3IgeW91ciBlZmZvcnRzIVwiLFxyXG5cdFwiTWFydmVsb3VzISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlphbnkhIFtYXSBwb2ludHMsIHdlbGwgZG9uZSFcIixcclxuXHRcIkV4cXVpc2l0ZSEgW1hdIHBvaW50cyBpbiB5b3VyIHN0YXNoIVwiLFxyXG5cdFwiT3V0c3RhbmRpbmchIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlplc3R5ISBbWF0gcG9pbnRzLCBuaWNlIGpvYiFcIixcclxuXHRcIk1hZ25pZmljZW50ISBbWF0gcG9pbnRzIGVhcm5lZCFcIixcclxuXHRcIlppZ3phZyEgW1hdIHBvaW50cyBpbiB5b3VyIHRhbGx5IVwiLFxyXG5cdFwiVGVycmlmaWMhIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlN1cGVyYiEgW1hdIHBvaW50cywgd2VsbCBkb25lIVwiLFxyXG5cdFwiWm93aWUhIFtYXSBwb2ludHMgZm9yIHlvdXIgZWZmb3J0cyFcIixcclxuXHRcIkV4Y2VsbGVudCEgW1hdIHBvaW50cyBlYXJuZWQhXCIsXHJcblx0XCJaYXAhIFtYXSBwb2ludHMgaW4geW91ciBhY2NvdW50IVwiLFxyXG5cdFwiQXdlc29tZSEgW1hdIHBvaW50cywgd2F5IHRvIGdvIVwiLFxyXG5cdFwiV2VsbCBwbGF5ZWQhIFtYXSBwb2ludHMgZm9yIHlvdSFcIixcclxuXHRcIlplc3R5ISBbWF0gcG9pbnRzLCBuaWNlIHdvcmshXCIsXHJcblx0XCJJbXByZXNzaXZlISBbWF0gcG9pbnRzLCBrZWVwIGl0IHVwIVwiLFxyXG5cdFwiQnJpbGxpYW50ISBbWF0gcG9pbnRzLCB3ZWxsIGRvbmUhXCIsXHJcblx0XCJaaW5nISBbWF0gcG9pbnRzIGZvciB5b3VyIGVmZm9ydHMhXCIsXHJcblx0XCJOaWNlIG1vdmUhIFtYXSBwb2ludHMgZWFybmVkIVwiLFxyXG5cdFwiWmVzdHkhIFtYXSBwb2ludHMgaW4gdGhlIGJhZyFcIixcclxuXHRcIlN0ZWxsYXIhIFtYXSBwb2ludHMganVzdCBmb3IgeW91IVwiLFxyXG5cdFwiV2VsbCBkZXNlcnZlZCEgW1hdIHBvaW50cyBlYXJuZWQhXCJcclxuXTtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVdlZWtseUNoYWxsZW5nZShwb2ludHM6IG51bWJlcik6IHN0cmluZyB7XHJcblx0Y29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtZXNzYWdlc1dlZWtseUNoYWxsZW5nZS5sZW5ndGgpO1xyXG5cdGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1dlZWtseUNoYWxsZW5nZVtyYW5kb21JbmRleF07XHJcblx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZShcIltYXVwiLCBwb2ludHMudG9TdHJpbmcoKSk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVR3b05vdGVDaGFsbGVuZ2UocG9pbnRzOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdGNvbnN0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdHdvTm90ZU1lc3NhZ2VzLmxlbmd0aCk7XHJcblx0Y29uc3QgbWVzc2FnZSA9IHR3b05vdGVNZXNzYWdlc1tyYW5kb21JbmRleF07XHJcblx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZShcIltYXVwiLCBwb2ludHMudG9TdHJpbmcoKSk7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tTWVzc2FnZVBvaW50cyhwb2ludHM6IG51bWJlcik6IHN0cmluZyB7XHJcblx0Y29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByYW5kb21Qb2ludE5vdGljZXMubGVuZ3RoKTtcclxuXHRjb25zdCBtZXNzYWdlID0gcmFuZG9tUG9pbnROb3RpY2VzW3JhbmRvbUluZGV4XTtcclxuXHRyZXR1cm4gbWVzc2FnZS5yZXBsYWNlKFwiW1hdXCIsIHBvaW50cy50b1N0cmluZygpKTtcclxufVxyXG5cclxuLy8gRXhhbXBsZSB1c2FnZVxyXG4vLyBjb25zdCByYW5kb21Qb2ludHMgPSAxMDA7IC8vIFJlcGxhY2Ugd2l0aCB5b3VyIGFjdHVhbCBwb2ludHMgdmFsdWVcclxuLy8gY29uc3QgcmFuZG9tTWVzc2FnZSA9IGdldFJhbmRvbU1lc3NhZ2VXZWVrbHlDaGFsbGVuZ2UocmFuZG9tUG9pbnRzKTtcclxuLy8gY29uc29sZS5sb2cocmFuZG9tTWVzc2FnZSk7XHJcblxyXG5cclxuIiwgImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5leHBvcnQgY2xhc3MgTW9kYWxJbmZvcm1hdGlvbmJveCBleHRlbmRzIE1vZGFsIHtcclxuXHRwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmc7IC8vIFN0b3JlIHRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZFxyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZGlzcGxheVRleHQ6IHN0cmluZykge1xyXG5cdFx0c3VwZXIoYXBwKTtcclxuXHRcdHRoaXMuZGlzcGxheVRleHQgPSBkaXNwbGF5VGV4dDsgLy8gU3RvcmUgdGhlIHBhc3NlZCB0ZXh0XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5zZXRUZXh0KHRoaXMuZGlzcGxheVRleHQpOyAvLyBVc2UgdGhlIHN0b3JlZCB0ZXh0XHJcblx0fVxyXG5cclxuXHRvbkNsb3NlKCkge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBnYW1pZmljYXRpb24gZnJvbSAnbWFpbic7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0TW9kYWwgfSBmcm9tICdNdWx0aVNlbGVjdE1vZGFsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBNb2RhbEJvb3N0ZXIgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgZ2FtaWZpY2F0aW9uSW5zdGFuY2U6IGdhbWlmaWNhdGlvbjtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGRpc3BsYXlUZXh0OiBzdHJpbmcsIGdhbWlmaWNhdGlvbkluc3RhbmNlOiBnYW1pZmljYXRpb24pIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLmRpc3BsYXlUZXh0ID0gZGlzcGxheVRleHQ7XHJcblx0XHR0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlID0gZ2FtaWZpY2F0aW9uSW5zdGFuY2U7XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5zZXRUZXh0KHRoaXMuZGlzcGxheVRleHQpO1xyXG5cclxuXHRcdGNvbnN0IG11bHRpU2VsZWN0TW9kYWwgPSBuZXcgTXVsdGlTZWxlY3RNb2RhbCh0aGlzLmFwcCwgW10sICdDcmFmdCBCb29zdGVyIEl0ZW0nLCB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlKTsgLy8gQ3JlYXRlIHRoZSBtb2RhbCBpbnN0YW5jZVxyXG5cclxuXHJcblx0XHQvLyBBZGQgYSBidXR0b24gdG8gb3BlbiB0aGUgbXVsdGktc2VsZWN0IG1vZGFsXHJcblx0XHRjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdGJ1dHRvbi5pbm5lclRleHQgPSAnT3BlbiBDcmFmdGluZyBUYWJsZSc7XHJcblx0XHRidXR0b24ub25jbGljayA9ICgpID0+IHtcclxuXHRcdFx0bXVsdGlTZWxlY3RNb2RhbC5zZXRVc2VCb29zdGVyKGZhbHNlKTsgLy8gU2V0IHRoZSBmbGFnIGZvciBjcmFmdGluZyB0YWJsZVxyXG5cdFx0XHRtdWx0aVNlbGVjdE1vZGFsLm9wZW4oKTtcclxuXHRcdH07XHJcblxyXG5cclxuXHRcdG11bHRpU2VsZWN0TW9kYWwucmVhZEJvb3N0ZXJzU3RvY2soKTtcclxuXHRcdG11bHRpU2VsZWN0TW9kYWwucmVhZEluZ3JlbWVudFN0b2NrKCk7XHJcblxyXG5cclxuXHRcdGNvbnN0IGJ1dHRvbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdGJ1dHRvbjIuaW5uZXJUZXh0ID0gJ09wZW4gQm9vc3RlciBCb2FyZCc7XHJcblx0XHRidXR0b24yLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdG11bHRpU2VsZWN0TW9kYWwuc2V0VXNlQm9vc3Rlcih0cnVlKTtcclxuXHRcdFx0bXVsdGlTZWxlY3RNb2RhbC5vcGVuKCk7XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnRlbnRFbC5hcHBlbmRDaGlsZChidXR0b24pO1xyXG5cdFx0Y29udGVudEVsLmFwcGVuZENoaWxkKGJ1dHRvbjIpO1xyXG5cdH1cclxuXHJcblx0b25DbG9zZSgpIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblx0fVxyXG5cclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtcclxuXHRjcmFmdGluZ0l0ZW1zLFxyXG5cdGVsZW1lbnRzLFxyXG5cdGJvb3N0ZXJSZWNpcGVzLFxyXG5cdGxpc3RPZlVzZWFibGVCb29zdGVyc1RvQmVTaG93bixcclxuXHRsaXN0T2ZVc2VhYmxlSW5ncmVkaWVudHNUb0JlU2hvd25cclxufSBmcm9tICcuL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IE1vZGFsSW5mb3JtYXRpb25ib3ggfSBmcm9tICdNb2RhbEluZm9ybWF0aW9uYm94JztcclxuaW1wb3J0IGdhbWlmaWNhdGlvbiwgeyBpc01pbnV0ZXNQYXNzZWQsIGhvdXJzVW50aWxNaW51dGVzUGFzc2VkIH0gZnJvbSAnbWFpbic7XHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuXHRwcml2YXRlIGl0ZW1zOiBzdHJpbmdbXTtcclxuXHRwcml2YXRlIHNlbGVjdGVkSXRlbXM6IHN0cmluZ1tdID0gW107XHJcblx0cHJpdmF0ZSByZW1haW5pbmdTdG9jazogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG5cdHByaXZhdGUgYnV0dG9uVGV4dDogc3RyaW5nO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgZ2FtaWZpY2F0aW9uSW5zdGFuY2U6IGdhbWlmaWNhdGlvbjtcclxuXHRwcml2YXRlIGJvb3N0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcblx0cHJpdmF0ZSB1c2VCb29zdGVyOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHJpdmF0ZSByZW1haW5pbmdCb29zdGVyU3RvY2s6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGl0ZW1zOiBzdHJpbmdbXSwgYnV0dG9uVGV4dDogc3RyaW5nLCBnYW1pZmljYXRpb25JbnN0YW5jZTogZ2FtaWZpY2F0aW9uKSB7XHJcblx0XHRzdXBlcihhcHApO1xyXG5cdFx0dGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG5cdFx0dGhpcy5idXR0b25UZXh0ID0gYnV0dG9uVGV4dDtcclxuXHRcdHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UgPSBnYW1pZmljYXRpb25JbnN0YW5jZTtcclxuXHR9XHJcblxyXG5cdG9uT3BlbigpIHtcclxuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Ly90aGlzLnJlYWRCb29zdGVyc1N0b2NrKCk7XHJcblx0XHQvLyB0YWtlIGNhcmUgb25seSB0byBydW4gc2V2ZXJhbCB0aW1lcyB0aHJvdWdoIHdoZW4gYm9vc3RlcnMgYXJlIHVzZWRcclxuXHRcdGlmICh0aGlzLnVzZUJvb3N0ZXIpIHtcclxuXHRcdFx0Ym9vc3RlclJlY2lwZXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5ib29zdGVyQXZhaWxhYmxlRm9yVXNlKGl0ZW0ubmFtZSkpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGxpc3RJdGVtID0gdGhpcy5jcmVhdGVJdGVtQ29udGFpbmVyKGl0ZW0ubmFtZSk7XHJcblx0XHRcdFx0XHRjb250ZW50RWwuYXBwZW5kQ2hpbGQobGlzdEl0ZW0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCBsaXN0SXRlbSA9IHRoaXMuY3JlYXRlSXRlbUNvbnRhaW5lcihcIlwiKTtcclxuXHRcdFx0Y29udGVudEVsLmFwcGVuZENoaWxkKGxpc3RJdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRvbkNsb3NlKCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGJvb3N0ZXJBdmFpbGFibGVGb3JVc2UoaXRlbTogc3RyaW5nKSB7XHJcblx0XHQvL2NvbnNvbGUubG9nKGBib29zdGVyQXZhaWxhYmxlRm9yVXNlOiAke2l0ZW19YClcclxuXHRcdGxldCBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0bGlzdE9mVXNlYWJsZUJvb3N0ZXJzVG9CZVNob3duLmZvckVhY2goZWxlbWVudCA9PiB7XHJcblx0XHRcdC8vY29uc29sZS5sb2coYCR7aXRlbX0gPT0gJHtlbGVtZW50fSA/P2ApXHJcblx0XHRcdGlmIChpdGVtID09IGVsZW1lbnQpIHtcclxuXHRcdFx0XHRpZiAoIWZvdW5kKSB7XHJcblx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGZvdW5kO1xyXG5cdH1cclxuXHJcblx0c2V0VXNlQm9vc3Rlcih1c2VCb29zdGVyOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLnVzZUJvb3N0ZXIgPSB1c2VCb29zdGVyO1xyXG5cdH1cclxuXHJcblxyXG5cdC8vIFVwZGF0ZWQgY3JlYXRlSXRlbUNvbnRhaW5lciBtZXRob2RcclxuXHRwcml2YXRlIGNyZWF0ZUl0ZW1Db250YWluZXIobGFiZWxUZXh0OiBzdHJpbmcpIHtcclxuXHRcdGlmICh0aGlzLnVzZUJvb3N0ZXIpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQm9vc3Rlckxpc3QobGFiZWxUZXh0KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vcmV0dXJuIHRoaXMuY3JlYXRlQ2hlY2tib3gobGFiZWxUZXh0KTtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ3JhZnRpbmdMYXlvdXQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUluY3JlbWVudFN0b2NrKGluY3JlbWVudDogc3RyaW5nLCBzdG9jazogbnVtYmVyKSB7XHJcblx0XHRjb25zb2xlLmxvZyhgdXBkYXRlSW5jcmVtZW50U3RvY2s6IGluY3JlbWVudCAke2luY3JlbWVudH0gIHN0b2NrICR7c3RvY2t9YCk7XHJcblx0XHR0aGlzLnJlbWFpbmluZ1N0b2NrW2luY3JlbWVudF0gPSBzdG9jaztcclxuXHRcdHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2Uuc2V0U2V0dGluZyh0aGlzLmdldEluZ2VyZW1lbnRWYXJOYW1lRnJvbU5hbWUoaW5jcmVtZW50KSB8fCAnJywgc3RvY2spO1xyXG5cdH1cclxuXHJcblxyXG5cdHVwZGF0ZUJvb3N0ZXJTdG9jayhib29zdGVyOiBzdHJpbmcsIHN0b2NrSW5jcmVhc2U6IG51bWJlcikge1xyXG5cdFx0dGhpcy5ib29zdGVyc1tib29zdGVyXSArPSBzdG9ja0luY3JlYXNlO1xyXG5cdH1cclxuXHJcblx0ZGVjcmVtZW50Qm9vc3Rlcihib29zdGVyOiBzdHJpbmcsIHN0b2NrSW5jcmVhc2U6IG51bWJlcikge1xyXG5cdFx0Y29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2Jvb3N0ZXJdO1xyXG5cdFx0Y29uc3QgbW9tZW50RGF0ZSA9IHdpbmRvdy5tb21lbnQoYm9vc3RlciwgJ1lZWVktTU0tREQgSEg6bW06c3MnKTtcclxuXHRcdGlmIChzdG9jayA+IDAgJiYgaXNNaW51dGVzUGFzc2VkKG1vbWVudERhdGUsIHRoaXMuZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUoYm9vc3RlcikpKSB7XHJcblx0XHRcdHRoaXMuYm9vc3RlcnNbYm9vc3Rlcl0gLT0gc3RvY2tJbmNyZWFzZTtcclxuXHRcdFx0dGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5zZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlclZhck5hbWVGcm9tTmFtZShib29zdGVyKSwgdGhpcy5ib29zdGVyc1tib29zdGVyXSk7XHJcblx0XHRcdHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2Uuc2V0U2V0dGluZ0Jvb2xlYW4odGhpcy5nZXRCb29zdGVyU3dpdGNoRnJvbU5hbWUoYm9vc3RlciksIHRydWUpO1xyXG5cdFx0XHR0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLnNldFNldHRpbmdTdHJpbmcodGhpcy5nZXRCb29zdGVyRGF0ZUZyb21OYW1lKGJvb3N0ZXIpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVF1YW50aXR5RGlzcGxheShib29zdGVyKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRyZWFkQm9vc3RlcnNTdG9jaygpIHtcclxuXHRcdGlmICh0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlKSB7XHJcblx0XHRcdHRoaXMuYm9vc3RlcnMgPSB7XHJcblx0XHRcdFx0J1RlbXBvcmFsIFR3ZWFrZXInOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3RlbXBvcmFsVHdlYWtlcicpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnUGVycGV0dWFsIFByb2dyZXNzJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdwZXJwZXR1YWxQcm9ncmVzcycpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnU3RyYXRlZ2ljIFN5bmFwc2VzJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdzdHJhdGVnaWNTeW5hcHNlcycpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnQWNjZWxlcmF0ZWQgQWNxdWlzaXRpb24nOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2FjY2VsZXJhdGVkQWNxdWlzaXRpb24nKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0xpbmtlcnMgTG9kZSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnbGlua2Vyc0xvZGUnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0VmZm9ydGxlc3MgRXhwYW5zaW9uJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdlZmZvcnRsZXNzRXhwYW5zaW9uJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdSZWN1cnNpdmUgUmVmbGVjdGlvbic6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygncmVjdXJzaXZlUmVmbGVjdGlvbicpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnU3luYXB0aWMgU3VyZ2UnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3N5bmFwdGljU3VyZ2UnKSBhcyBudW1iZXIsXHJcblx0XHRcdFx0J0luc3BpcmF0aW9uIEluZnVzaW9uJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdpbnNwaXJhdGlvbkluZnVzaW9uJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdUaXRsZSBUaXRhbic6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygndGl0bGVUaXRhbicpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnUHJlY2lzaW9uIFByaXNtJzogdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKCdwcmVjaXNpb25QcmlzbScpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnSHlwZXJsaW5rIEhhcm1vbnknOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2h5cGVybGlua0hhcm1vbnknKSBhcyBudW1iZXIsXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cmVhZEluZ3JlbWVudFN0b2NrKCkge1xyXG5cdFx0aWYgKHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UpIHtcclxuXHRcdFx0dGhpcy5yZW1haW5pbmdTdG9jayA9IHtcclxuXHRcdFx0XHQnTmV4dXMgTm9kZSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnbmV4dXNOb2RlJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdDb25uZWN0aW9uIENyeXN0YWwnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2Nvbm5lY3Rpb25DcnlzdGFsJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdNYXN0ZXJ5IFNjcm9sbCc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnbWFzdGVyeVNjcm9sbCcpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnSW5zaWdodCBQcmlzbSc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnaW5zaWdodFByaXNtJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdSZWZsZWN0aXZlIEVzc2VuY2UnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3JlZmxlY3RpdmVFc3NlbmNlJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdBbXBsaWZpY2F0aW9uIENyeXN0YWwnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ2FtcGxpZmljYXRpb25DcnlzdGFsJykgYXMgbnVtYmVyLFxyXG5cdFx0XHRcdCdDcmVhdGl2ZSBDYXRhbHlzdCc6IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZygnY3JlYXRpdmVDYXRhbHlzdCcpIGFzIG51bWJlcixcclxuXHRcdFx0XHQnUHJlY2lzaW9uIExlbnMnOiB0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLmdldFNldHRpbmcoJ3ByZWNpc2lvbkxlbnMnKSBhcyBudW1iZXIsXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVDcmFmdGluZ0xheW91dCgpIHtcclxuXHRcdGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0Y29udGFpbmVyLmNsYXNzTmFtZSA9ICdtb2RhbC1jcmFmdGluZy1jb250YWluZXInO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgdGhlIHN0b2NrIGluZm9ybWF0aW9uXHJcblx0XHRjb25zdCBzdG9ja0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0c3RvY2tDb250YWluZXIuY2xhc3NOYW1lID0gJ3N0b2NrLWNvbnRhaW5lcic7XHJcblxyXG5cclxuXHRcdGNyYWZ0aW5nSXRlbXMuZm9yRWFjaChyZWNpcGUgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5ib29zdGVyQXZhaWxhYmxlRm9yVXNlKHJlY2lwZS5uYW1lKSkge1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW1Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdFx0XHRpdGVtQ29udGFpbmVyLmNsYXNzTmFtZSA9ICdjcmFmdGluZy1pdGVtLWNvbnRhaW5lcic7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG5cdFx0XHRcdGJ1dHRvbi5pbm5lclRleHQgPSAnQ3JhZnQnO1xyXG5cdFx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4gdGhpcy5jcmFmdEJvb3N0ZXJJdGVtKHJlY2lwZSk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVzZUluZm9CdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuXHRcdFx0XHR1c2VJbmZvQnV0dG9uLmlubmVyVGV4dCA9ICc/JztcclxuXHRcdFx0XHR1c2VJbmZvQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdFx0XHRuZXcgTW9kYWxJbmZvcm1hdGlvbmJveCh0aGlzLmFwcCwgdGhpcy5nZXRCb29zdGVySW5mb3JGcm9tRnJvbU5hbWUocmVjaXBlLm5hbWUpKS5vcGVuKCk7XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29uc3QgaXRlbVRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcblx0XHRcdFx0aXRlbVRleHQuaW5uZXJUZXh0ID0gYCR7cmVjaXBlLm5hbWV9IFx1MjFEMiAke3JlY2lwZS5pbmNyZWRpZW50cy5qb2luKCcgICAgJyl9YDtcclxuXHJcblx0XHRcdFx0aXRlbUNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b24pO1xyXG5cdFx0XHRcdGl0ZW1Db250YWluZXIuYXBwZW5kQ2hpbGQodXNlSW5mb0J1dHRvbik7XHJcblx0XHRcdFx0aXRlbUNvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtVGV4dCk7XHJcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKGl0ZW1Db250YWluZXIpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBzdG9ja0luZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHN0b2NrSW5mby5jbGFzc05hbWUgPSAnc3RvY2staW5mbyc7XHJcblxyXG5cdFx0bGlzdE9mVXNlYWJsZUluZ3JlZGllbnRzVG9CZVNob3duLmZvckVhY2goZWxlbWVudCA9PiB7XHJcblx0XHRcdC8vY29uc29sZS5sb2coYCR7ZWxlbWVudC5uYW1lfSA6ICR7dGhpcy5yZW1haW5pbmdTdG9ja1tlbGVtZW50Lm5hbWVdfWApXHJcblx0XHRcdHN0b2NrSW5mby5pbm5lckhUTUwgKz0gYCR7dGhpcy5nZXRJbmdlcmVtZW50RnJvbU5hbWUoZWxlbWVudCkuc2hvcnROYW1lfSBbJHt0aGlzLnJlbWFpbmluZ1N0b2NrW3RoaXMuZ2V0SW5nZXJlbWVudEZyb21OYW1lKGVsZW1lbnQpLm5hbWVdIHx8IDB9XSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2A7XHJcblx0XHR9KTtcclxuXHJcblx0XHRzdG9ja0NvbnRhaW5lci5hcHBlbmRDaGlsZChzdG9ja0luZm8pO1xyXG5cclxuXHJcblxyXG5cdFx0Ly8gQWRkIHRoZSBzdG9jayBjb250YWluZXIgdG8gdGhlIG1haW4gY29udGFpbmVyXHJcblx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQoc3RvY2tDb250YWluZXIpO1xyXG5cclxuXHRcdHJldHVybiBjb250YWluZXI7XHJcblx0fVxyXG5cclxuXHJcblxyXG5cdHByaXZhdGUgY3JlYXRlQm9vc3Rlckxpc3QobGFiZWxUZXh0OiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0Y29udGFpbmVyLmNsYXNzTmFtZSA9ICdtb2RhbC1jaGVja2JveC1jb250YWluZXInO1xyXG5cclxuXHRcdC8vY29uc3Qgc3RvY2sgPSB0aGlzLnJlbWFpbmluZ1N0b2NrW2xhYmVsVGV4dF0gfHwgMDtcclxuXHRcdGNvbnN0IHN0b2NrID0gdGhpcy5ib29zdGVyc1tsYWJlbFRleHRdO1xyXG5cclxuXHRcdGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRsYWJlbC5jbGFzc05hbWUgPSBgJHtsYWJlbFRleHQucmVwbGFjZSgnICcsICctJyl9YDtcclxuXHRcdGNvbnN0IHVzZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG5cdFx0Y29uc3QgbW9tZW50RGF0ZSA9IHRoaXMuZ2FtaWZpY2F0aW9uSW5zdGFuY2UuZ2V0U2V0dGluZyh0aGlzLmdldEJvb3N0ZXJEYXRlRnJvbU5hbWUobGFiZWxUZXh0KSk7XHJcblx0XHRpZiAoaXNNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQobW9tZW50RGF0ZSBhcyBzdHJpbmcsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksIHRoaXMuZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUobGFiZWxUZXh0KSkgPT0gZmFsc2UpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coYEJvb3N0ZXIgJHtsYWJlbFRleHR9IGlzIHN0aWxsIGluIGNvb2xkb3duIGZvciAke3dpbmRvdy5tb21lbnQobW9tZW50RGF0ZSBhcyBzdHJpbmcsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksIHRoaXMuZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUobGFiZWxUZXh0KSAvIDYwfSBob3Vyc2ApO1xyXG5cdFx0XHRsYWJlbC5pbm5lckhUTUwgPSBgJHtsYWJlbFRleHR9IDogKCR7c3RvY2t9KWA7XHJcblx0XHRcdC8vY29uc3QgdXNlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRcdHVzZUJ1dHRvbi5pbm5lclRleHQgPSBgY29vbGRvd24gJHtob3Vyc1VudGlsTWludXRlc1Bhc3NlZCh3aW5kb3cubW9tZW50KG1vbWVudERhdGUgYXMgc3RyaW5nLCAnWVlZWS1NTS1ERCBISDptbTpzcycpLCB0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpfSBob3Vyc2A7XHJcblx0XHRcdHVzZUJ1dHRvbi5pZCA9IGB1c2UtYnV0dG9uLSR7bGFiZWxUZXh0LnJlcGxhY2UoJyAnLCAnLScpfWA7XHJcblx0XHRcdHVzZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdG5ldyBNb2RhbEluZm9ybWF0aW9uYm94KHRoaXMuYXBwLCBgJHtsYWJlbFRleHR9IGlzIGZvciAke2hvdXJzVW50aWxNaW51dGVzUGFzc2VkKHdpbmRvdy5tb21lbnQobW9tZW50RGF0ZSBhcyBzdHJpbmcsICdZWVlZLU1NLUREIEhIOm1tOnNzJyksIHRoaXMuZ2V0Qm9vc3RlckNvb2xkb3duRnJvbU5hbWUobGFiZWxUZXh0KSl9IGhvdXJzIGluIGNvb2xkb3duIGFuZCBjYW4gb25seSB0aGVuIGJlIHVzZWQgYWdhaW4uYCkub3BlbigpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGFiZWwuaW5uZXJIVE1MID0gYCR7bGFiZWxUZXh0fSA6ICgke3N0b2NrfSlgO1xyXG5cdFx0XHQvL2NvbnN0IHVzZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG5cdFx0XHR1c2VCdXR0b24uaW5uZXJUZXh0ID0gJ1VzZSc7XHJcblx0XHRcdHVzZUJ1dHRvbi5pZCA9IGB1c2UtYnV0dG9uLSR7bGFiZWxUZXh0LnJlcGxhY2UoJyAnLCAnLScpfWA7XHJcblx0XHRcdHVzZUJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudXNlQm9vc3Rlckl0ZW0obGFiZWxUZXh0KTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB1c2VJbmZvQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHR1c2VJbmZvQnV0dG9uLmlubmVyVGV4dCA9ICc/JztcclxuXHRcdHVzZUluZm9CdXR0b24uaWQgPSBgaW5mb3JtYXRpb24tJHtsYWJlbFRleHQucmVwbGFjZSgnICcsICctJyl9YDtcclxuXHRcdHVzZUluZm9CdXR0b24ub25jbGljayA9ICgpID0+IHtcclxuXHRcdFx0bmV3IE1vZGFsSW5mb3JtYXRpb25ib3godGhpcy5hcHAsIHRoaXMuZ2V0Qm9vc3RlckluZm9yRnJvbUZyb21OYW1lKGxhYmVsVGV4dCkpLm9wZW4oKTtcclxuXHRcdH07XHJcblxyXG5cclxuXHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCh1c2VCdXR0b24pO1xyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKHVzZUluZm9CdXR0b24pO1xyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcclxuXHJcblxyXG5cdFx0cmV0dXJuIGNvbnRhaW5lcjtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0aW5jcmVtZW50SXRlbShpdGVtOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IHN0b2NrID0gdGhpcy5yZW1haW5pbmdTdG9ja1tpdGVtXTtcclxuXHRcdGNvbnNvbGUubG9nKGBpbmNyZW1lbnRJdGVtOiBzdG9jayA9ICR7c3RvY2t9YCk7XHJcblx0XHRpZiAoc3RvY2sgPiAwKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR0aGlzLnJlbWFpbmluZ1N0b2NrW2l0ZW1dLS07XHJcblx0XHRcdHRoaXMudXBkYXRlUXVhbnRpdHlEaXNwbGF5KGl0ZW0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuYm9vc3RlcnNbaXRlbV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLmJvb3N0ZXJzW2l0ZW1dLS07XHJcblx0XHRcdHRoaXMudXBkYXRlUXVhbnRpdHlEaXNwbGF5KGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdGRlY3JlbWVudEl0ZW0oaXRlbTogc3RyaW5nKSB7XHJcblx0XHRjb25zdCBpdGVtSW5kZXggPSB0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuXHJcblx0XHRpZiAoaXRlbUluZGV4ID4gLTEpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zLnNwbGljZShpdGVtSW5kZXgsIDEpO1xyXG5cdFx0XHR0aGlzLnJlbWFpbmluZ1N0b2NrW2l0ZW1dKys7XHJcblx0XHRcdHRoaXMudXBkYXRlUXVhbnRpdHlEaXNwbGF5KGl0ZW0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuYm9vc3RlcnNbaXRlbV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLmJvb3N0ZXJzW2l0ZW1dKys7XHJcblx0XHRcdHRoaXMudXBkYXRlUXVhbnRpdHlEaXNwbGF5KGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdHByaXZhdGUgdXNlQm9vc3Rlckl0ZW0obGFiZWxUZXh0OiBzdHJpbmcpIHtcclxuXHRcdGNvbnNvbGUubG9nKGB1c2UgQm9vc3RlciAke2xhYmVsVGV4dH1gKTtcclxuXHRcdC8qY29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF07XHJcblx0XHRpZiAoc3RvY2sgPiAwKSB7XHJcblx0XHRcdC8vdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2gobGFiZWxUZXh0KTtcclxuXHRcdFx0Ly90aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF0tLTtcclxuXHRcdFx0dGhpcy51cGRhdGVRdWFudGl0eURpc3BsYXkobGFiZWxUZXh0KTtcclxuXHRcdH0qL1xyXG5cdFx0dGhpcy5kZWNyZW1lbnRCb29zdGVyKGxhYmVsVGV4dCwgMSk7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVF1YW50aXR5RGlzcGxheShsYWJlbFRleHQ6IHN0cmluZykge1xyXG5cdFx0Y29uc3Qgc3RvY2sgPSB0aGlzLmJvb3N0ZXJzW2xhYmVsVGV4dF07XHJcblx0XHRjb25zdCBzdG9ja0luZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsYWJlbFRleHQucmVwbGFjZSgnICcsICctJyl9YCk7XHJcblx0XHRpZiAoc3RvY2tJbmZvKSB7XHJcblx0XHRcdHN0b2NrSW5mby5pbm5lckhUTUwgPSAnJzsgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgY29udGVudFxyXG5cdFx0XHRzdG9ja0luZm8uaW5uZXJIVE1MID0gYCR7bGFiZWxUZXh0fSA6ICgke3N0b2NrfSlgO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgYnV0dG9uVXNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgI3VzZS1idXR0b24tJHtsYWJlbFRleHQucmVwbGFjZSgnICcsICctJyl9YCk7XHJcblx0XHRjb25zdCBkYXRlID0gdGhpcy5nYW1pZmljYXRpb25JbnN0YW5jZS5nZXRTZXR0aW5nKHRoaXMuZ2V0Qm9vc3RlckRhdGVGcm9tTmFtZShsYWJlbFRleHQpKTtcclxuXHRcdGNvbnN0IG1vbWVudERhdGUgPSB3aW5kb3cubW9tZW50KGRhdGUgYXMgc3RyaW5nLCAnWVlZWS1NTS1ERCBISDptbTpzcycpO1xyXG5cdFx0aWYgKGJ1dHRvblVzZSAmJiBpc01pbnV0ZXNQYXNzZWQobW9tZW50RGF0ZSwgdGhpcy5nZXRCb29zdGVyQ29vbGRvd25Gcm9tTmFtZShsYWJlbFRleHQpKSA9PSBmYWxzZSkge1xyXG5cdFx0XHRidXR0b25Vc2Uuc2V0VGV4dChgY29vbGRvd24gJHtob3Vyc1VudGlsTWludXRlc1Bhc3NlZChtb21lbnREYXRlLCB0aGlzLmdldEJvb3N0ZXJDb29sZG93bkZyb21OYW1lKGxhYmVsVGV4dCkpfSBob3Vyc2ApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdHByaXZhdGUgY2hlY2tJbmdyZWRpZW50c0F2YWlsYWJpbGl0eShpbmNyZWRpZW50czogeyBuYW1lOiBzdHJpbmc7IGluY3JlZGllbnRzOiBzdHJpbmdbXTsgfSkge1xyXG5cdFx0Zm9yIChjb25zdCBpbmdyZWRpZW50IG9mIGluY3JlZGllbnRzLmluY3JlZGllbnRzKSB7XHJcblx0XHRcdGNvbnN0IFtxdWFudGl0eSwgc2hvcnROYW1lXSA9IGluZ3JlZGllbnQuc3BsaXQoJ3gnKTtcclxuXHRcdFx0Ly9jb25zb2xlLmxvZyhgcXVhbnRpdHk6ICR7cXVhbnRpdHl9XFx0c2hvcnROYW1lOiAke3Nob3J0TmFtZX1gKVxyXG5cdFx0XHRjb25zdCByZXF1aXJlZFF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xyXG5cdFx0XHRjb25zdCBhdmFpbGFibGVTdG9jayA9IHRoaXMucmVtYWluaW5nU3RvY2tbdGhpcy5nZXRJbmdlcmVtZW50TmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lKSB8fCAwXTtcclxuXHRcdFx0Ly9jb25zb2xlLmxvZyhgcmVxdWlyZWRRdWFudGl0eTogJHtyZXF1aXJlZFF1YW50aXR5fVxcdGF2YWlsYWJsZVN0b2NrOiBcdTAzMDEke2F2YWlsYWJsZVN0b2NrfWApXHJcblx0XHRcdGlmIChyZXF1aXJlZFF1YW50aXR5ID4gYXZhaWxhYmxlU3RvY2spIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7IC8vIE5vdCBlbm91Z2ggc3RvY2sgZm9yIHRoaXMgaW5ncmVkaWVudFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSB1c2VJbmdyZWRpbWVudHMoaW5jcmVkaWVudHM6IHsgbmFtZTogc3RyaW5nOyBpbmNyZWRpZW50czogc3RyaW5nW107IH0pIHtcclxuXHRcdGNvbnNvbGUubG9nKGB1c2VJbmdyZWRpbWVudHM6ICR7aW5jcmVkaWVudHN9YCk7XHJcblx0XHRmb3IgKGNvbnN0IGluZ3JlZGllbnQgb2YgaW5jcmVkaWVudHMuaW5jcmVkaWVudHMpIHtcclxuXHRcdFx0Y29uc3QgW3F1YW50aXR5LCBzaG9ydE5hbWVdID0gaW5ncmVkaWVudC5zcGxpdCgneCcpO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgcXVhbnRpdHk6ICR7cXVhbnRpdHl9XFx0c2hvcnROYW1lOiAke3Nob3J0TmFtZX1gKTtcclxuXHRcdFx0Y29uc3QgcmVxdWlyZWRRdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5KTtcclxuXHRcdFx0Y29uc3QgYXZhaWxhYmxlU3RvY2sgPSB0aGlzLnJlbWFpbmluZ1N0b2NrW3RoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSkgfHwgMF07XHJcblx0XHRcdGNvbnN0IGluZ3JlbWVudE5hbWUgPSB0aGlzLmdldEluZ2VyZW1lbnROYW1lRnJvbVNob3J0TmFtZShzaG9ydE5hbWUpIHx8ICcnO1xyXG5cdFx0XHQvL2NvbnNvbGUubG9nKGByZXF1aXJlZFF1YW50aXR5OiAke3JlcXVpcmVkUXVhbnRpdHl9XFx0YXZhaWxhYmxlU3RvY2s6IFx1MDMwMSR7YXZhaWxhYmxlU3RvY2t9YClcclxuXHRcdFx0Ly90aGlzLnJlbWFpbmluZ1N0b2NrW3RoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSkgPSB0aGlzLnJlbWFpbmluZ1N0b2NrW3RoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSkgfHwgMF0gLT0gcXVhbnRpdHk7XHJcblx0XHRcdGNvbnNvbGUubG9nKGB0aGlzLmdldEluZ2VyZW1lbnROYW1lRnJvbVNob3J0TmFtZShzaG9ydE5hbWUpOiAke3RoaXMuZ2V0SW5nZXJlbWVudE5hbWVGcm9tU2hvcnROYW1lKHNob3J0TmFtZSl9YCk7XHJcblx0XHRcdHRoaXMudXBkYXRlSW5jcmVtZW50U3RvY2soaW5ncmVtZW50TmFtZSwgYXZhaWxhYmxlU3RvY2sgLSByZXF1aXJlZFF1YW50aXR5KTtcclxuXHRcdFx0Y29uc29sZS5sb2coYCR7aW5jcmVkaWVudHMubmFtZX0gICR7YXZhaWxhYmxlU3RvY2sgLSByZXF1aXJlZFF1YW50aXR5fWApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblxyXG5cdHByaXZhdGUgdXBkYXRlU3RvY2tJbmZvcm1hdGlvbigpIHtcclxuXHRcdGNvbnN0IHN0b2NrSW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdG9jay1pbmZvJyk7XHJcblx0XHRpZiAoc3RvY2tJbmZvKSB7XHJcblx0XHRcdHN0b2NrSW5mby5pbm5lckhUTUwgPSAnJzsgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgY29udGVudFxyXG5cclxuXHRcdFx0ZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuXHRcdFx0XHRzdG9ja0luZm8uaW5uZXJIVE1MICs9IGAke2VsZW1lbnQuc2hvcnROYW1lfSBbJHt0aGlzLnJlbWFpbmluZ1N0b2NrW2VsZW1lbnQubmFtZV0gfHwgMH1dJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YDtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBjcmFmdEJvb3N0ZXJJdGVtKHNlbGVjdGVkSXRlbXM6IHsgbmFtZTogc3RyaW5nOyBpbmNyZWRpZW50czogc3RyaW5nW107IH0pIHtcclxuXHRcdC8vIGNhbGwgaGVyZSB0aGUgcmVjaXBlIGxvZ2ljIGFuZCByZWR1Y2UgdGhlIHN0b2NrXHJcblx0XHRpZiAodGhpcy5jaGVja0luZ3JlZGllbnRzQXZhaWxhYmlsaXR5KHNlbGVjdGVkSXRlbXMpKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKGBjcmFmdCBib29zdGVyICR7c2VsZWN0ZWRJdGVtcy5uYW1lfWApO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUJvb3N0ZXJTdG9jayhzZWxlY3RlZEl0ZW1zLm5hbWUsIDEpO1xyXG5cdFx0XHR0aGlzLmdhbWlmaWNhdGlvbkluc3RhbmNlLnNldFNldHRpbmcodGhpcy5nZXRCb29zdGVyVmFyTmFtZUZyb21OYW1lKHNlbGVjdGVkSXRlbXMubmFtZSksIHRoaXMuYm9vc3RlcnNbc2VsZWN0ZWRJdGVtcy5uYW1lXSk7XHJcblx0XHRcdHRoaXMudXNlSW5ncmVkaW1lbnRzKHNlbGVjdGVkSXRlbXMpO1xyXG5cdFx0XHQvL3RoaXMudXBkYXRlUXVhbnRpdHlEaXNwbGF5KHNlbGVjdGVkSXRlbXMubmFtZSlcclxuXHRcdFx0dGhpcy51cGRhdGVTdG9ja0luZm9ybWF0aW9uKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgbm90IGVub3VnaCBpbmdyZWRpZW50cyBmb3IgYm9vc3RlciAke3NlbGVjdGVkSXRlbXMubmFtZX0gaW4gc3RvY2tgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGdldEluZ2VyZW1lbnROYW1lRnJvbVNob3J0TmFtZShzaG9ydE5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50LnNob3J0TmFtZSA9PT0gc2hvcnROYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQubmFtZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmRcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0SW5nZXJlbWVudFNob3J0TmFtZUZyb21OYW1lKG5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IG5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC5zaG9ydE5hbWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEluZ2VyZW1lbnRGcm9tTmFtZShuYW1lOiBzdHJpbmcpIHtcclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG5cdFx0XHRpZiAoZWxlbWVudC5uYW1lID09PSBuYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB7IHNob3J0TmFtZTogJycsIG5hbWU6ICcnLCB2YXJOYW1lOiAnJyB9OyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBnZXRJbmdlcmVtZW50VmFyTmFtZUZyb21TaG9ydE5hbWUoc2hvcnROYW1lOiBzdHJpbmcpIHtcclxuXHRcdGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG5cdFx0XHRpZiAoZWxlbWVudC5zaG9ydE5hbWUgPT09IHNob3J0TmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtZW50LnZhck5hbWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEluZ2VyZW1lbnRWYXJOYW1lRnJvbU5hbWUobmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gbmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtZW50LnZhck5hbWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEJvb3N0ZXJWYXJOYW1lRnJvbU5hbWUoYm9vc3Rlck5hbWU6IHN0cmluZykge1xyXG5cdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIGJvb3N0ZXJSZWNpcGVzKSB7XHJcblx0XHRcdGlmIChlbGVtZW50Lm5hbWUgPT09IGJvb3N0ZXJOYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQudmFybmFtZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICcnOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEJvb3N0ZXJJbmZvckZyb21Gcm9tTmFtZShib29zdGVyTmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm9vc3RlclJlY2lwZXMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gYm9vc3Rlck5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC5kZXNjcmlwdGlvbjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICcnOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEJvb3N0ZXJTd2l0Y2hGcm9tTmFtZShib29zdGVyTmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm9vc3RlclJlY2lwZXMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gYm9vc3Rlck5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC5ib29zdGVyU3dpdGNoO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gJyc7IC8vIFJldHVybiBudWxsIGlmIG5vIG1hdGNoaW5nIGVsZW1lbnQgaXMgZm91bmRcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Qm9vc3RlckRhdGVGcm9tTmFtZShib29zdGVyTmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm9vc3RlclJlY2lwZXMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gYm9vc3Rlck5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC5ib29zdGVyRGF0ZSBhcyBzdHJpbmc7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAnJzsgLy8gUmV0dXJuIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZFxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRCb29zdGVyQ29vbGRvd25Gcm9tTmFtZShib29zdGVyTmFtZTogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm9vc3RlclJlY2lwZXMpIHtcclxuXHRcdFx0aWYgKGVsZW1lbnQubmFtZSA9PT0gYm9vc3Rlck5hbWUpIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudC5ib29zdGVyQ29vbGRvd247XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAwOyAvLyBSZXR1cm4gbnVsbCBpZiBubyBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kXHJcblx0fVxyXG5cclxufVxyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLGlCQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxJQUFBQyxtQkFBOEQ7OztBQ2Q5RCxzQkFBK0M7QUFJeEMsSUFBTSxrQkFBc0M7QUFBQSxFQUNqRCxtQkFBbUI7QUFBQSxFQUNuQixXQUFXO0FBQUEsRUFDWCxTQUFTO0FBQUEsRUFDVCxnQkFBZ0I7QUFBQSxFQUNoQixhQUFhO0FBQUEsRUFDYixlQUFlO0FBQUEsRUFDZixzQkFBc0I7QUFBQSxFQUN0QixzQkFBc0I7QUFBQSxFQUN0QixhQUFhO0FBQUEsRUFDYixrQkFBa0I7QUFBQSxFQUNsQix3QkFBd0I7QUFBQSxFQUN4QixjQUFjO0FBQUEsRUFDZCxhQUFhO0FBQUEsRUFDYixnQkFBZ0I7QUFBQSxFQUNoQix1QkFBdUI7QUFBQSxFQUN2QixtQkFBbUI7QUFBQSxFQUNuQixvQkFBb0I7QUFBQSxFQUNwQixPQUFPO0FBQUEsRUFDUCx1QkFBdUI7QUFBQSxFQUN2Qix1QkFBdUI7QUFBQSxFQUN2Qix3QkFBd0I7QUFBQSxFQUN4Qix3QkFBd0I7QUFBQSxFQUN4QixXQUFXO0FBQUEsRUFDWCxtQkFB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LEVBQzlDLEVBQUUsUUFBUSxNQUFRLE9BQU8sR0FBRyxZQUFZLEtBQU87QUFBQSxFQUMvQyxFQUFFLFFBQVEsTUFBUSxPQUFPLElBQUksWUFBWSxLQUFPO0FBQUEsRUFDaEQsRUFBRSxRQUFRLE1BQVEsT0FBTyxJQUFJLFlBQVksSUFBTztBQUFBLEVBQ2hELEVBQUUsUUFBUSxLQUFRLE9BQU8sSUFBSSxZQUFZLEtBQU87QUFBQSxFQUNoRCxFQUFFLFFBQVEsTUFBUSxPQUFPLElBQUksWUFBWSxLQUFPO0FBQUEsRUFDaEQsRUFBRSxRQUFRLE1BQVEsT0FBTyxJQUFJLFlBQVksSUFBTztBQUFBLEVBQ2hELEVBQUUsUUFBUSxLQUFRLE9BQU8sSUFBSSxZQUFZLEtBQU87QUFBQSxFQUNoRCxFQUFFLFFBQVEsTUFBUSxPQUFPLElBQUksWUFBWSxLQUFPO0FBQUEsRUFDaEQsRUFBRSxRQUFRLE1BQVEsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2pELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksS0FBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxNQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLElBQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsS0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLEtBQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsTUFBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxLQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE1BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE1BQVE7QUFBQSxFQUNsRCxFQUFFLFFBQVEsT0FBUyxPQUFPLElBQUksWUFBWSxNQUFRO0FBQUEsRUFDbEQsRUFBRSxRQUFRLE9BQVMsT0FBTyxJQUFJLFlBQVksTUFBUTtBQUFBLEVBQ2xELEVBQUUsUUFBUSxPQUFTLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNuRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxLQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE1BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksS0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxNQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksTUFBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxPQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE1BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsT0FBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLEtBQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsTUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxNQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLE9BQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLElBQUksWUFBWSxPQUFTO0FBQUEsRUFDcEQsRUFBRSxRQUFRLFFBQVUsT0FBTyxJQUFJLFlBQVksT0FBUztBQUFBLEVBQ3BELEVBQUUsUUFBUSxRQUFVLE9BQU8sSUFBSSxZQUFZLE9BQVM7QUFBQSxFQUNwRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxNQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLE9BQVUsT0FBTyxLQUFLLFlBQVksT0FBUztBQUFBLEVBQ3JELEVBQUUsUUFBUSxRQUFVLE9BQU8sS0FBSyxZQUFZLE9BQVM7QUFBQSxFQUNyRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxPQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLFFBQVUsT0FBTyxLQUFLLFlBQVksTUFBUztBQUFBLEVBQ3JELEVBQUUsUUFBUSxPQUFVLE9BQU8sS0FBSyxZQUFZLE9BQVM7QUFBQSxFQUNyRCxFQUFFLFFBQVEsUUFBVSxPQUFPLEtBQUssWUFBWSxPQUFTO0FBQUEsRUFDckQsRUFBRSxRQUFRLFFBQVUsT0FBTyxLQUFLLFlBQVksUUFBVTtBQUFBLEVBQ3RELEVBQUUsUUFBUSxTQUFXLE9BQU8sS0FBSyxZQUFZLFFBQVU7QUFBQSxFQUN2RCxFQUFFLFFBQVEsU0FBVyxPQUFPLEtBQUssWUFBWSxRQUFVO0FBQUEsRUFDdkQsRUFBRSxRQUFRLFNBQVcsT0FBTyxLQUFLLFlBQVksUUFBVTtBQUN6RDtBQUVPLFNBQVMsa0JBQWtCLFFBQTJCO0FBQzNELE1BQUksUUFBbUIsVUFBVSxDQUFDO0FBQ2xDLGFBQVcsUUFBUSxXQUFXO0FBQzVCLFFBQUksVUFBVSxLQUFLLFFBQVE7QUFDekIsY0FBUTtBQUFBLElBQ1YsT0FBTztBQUNMO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFTyxTQUFTLHFCQUFxQixhQUE2QjtBQUNoRSxNQUFJLGVBQWU7QUFDbkIsYUFBVyxRQUFRLFdBQVc7QUFDNUIsUUFBSSxlQUFlLEtBQUssU0FBUyxnQkFBZ0IsR0FBRztBQUNsRCxxQkFBZSxLQUFLO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBR0YsU0FBTztBQUNQOzs7QUM5SUYsSUFBTSwwQkFBb0M7QUFBQSxFQUN6QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUVBLElBQU0sa0JBQTRCO0FBQUEsRUFDakM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRDtBQUVBLElBQU0scUJBQStCO0FBQUEsRUFDcEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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QUFnQixRQUFnQjtBQUNuRSxRQUFNLGFBQWEsS0FBSyxJQUFJLFVBQVUsb0JBQW9CLDZCQUFZO0FBRXRFLE1BQUksQ0FBQyxZQUFZO0FBQ2hCLFlBQVEsTUFBTSxnQ0FBZ0M7QUFDOUM7QUFBQSxFQUNEO0FBRUEsUUFBTSxTQUFTLFdBQVc7QUFDMUIsUUFBTSxlQUFlLE9BQU8sYUFBYTtBQUV6QyxNQUFJLENBQUMsY0FBYztBQUNsQixZQUFRLE1BQU0sc0VBQXNFO0FBQ3BGO0FBQUEsRUFDRDtBQUVBLE1BQUksZUFBZSxhQUFhLFdBQVcsUUFBUSxrQkFBTTtBQUN6RCxpQkFBZSxhQUFhLFdBQVcsUUFBUSwwQkFBTTtBQUNyRCxpQkFBZSxhQUFhLFdBQVcsNEJBQVEsTUFBTTtBQUNyRCxpQkFBZSxhQUFhLFdBQVcsb0JBQVEsTUFBTTtBQUVyRCxTQUFPLGlCQUFpQixZQUFZO0FBQ3JDO0FBRUEsU0FBUyw2QkFBNkIsZUFBdUIsV0FBMkI7QUFDdkYsTUFBSTtBQUNKLE1BQUksU0FBUyxlQUFlLEVBQUUsSUFBSSxXQUFVO0FBQzNDLG1CQUFlLFlBQVksU0FBUyxlQUFlLEVBQUU7QUFBQSxFQUN0RCxPQUFPO0FBQ04sbUJBQWU7QUFBQSxFQUNoQjtBQUVBLFNBQU87QUFDUjsiLAogICJuYW1lcyI6IFsiZ2FtaWZpY2F0aW9uIiwgImltcG9ydF9vYnNpZGlhbiIsICJhcHAiLCAib2JqIiwgImRlZmF1bHRPcHRpb25zIiwgImRlZmF1bHRPcHRpb25zIiwgImRlZmF1bHRPcHRpb25zIiwgIk1JTExJU0VDT05EU19JTl9XRUVLIiwgImZvcm1hdHRlcnMiLCAibG9jYWxpemUiLCAieSIsICJNIiwgImQiLCAiYSIsICJoIiwgIkgiLCAibSIsICJzIiwgIlMiLCAiZGF0ZUxvbmdGb3JtYXR0ZXIiLCAiZm9ybWF0TG9uZyIsICJ0aW1lTG9uZ0Zvcm1hdHRlciIsICJkYXRlVGltZUxvbmdGb3JtYXR0ZXIiLCAiZm9ybWF0IiwgImZvcm1hdERpc3RhbmNlIiwgImZvcm1hdCIsICJmb3JtYXRSZWxhdGl2ZSIsICJvcmRpbmFsTnVtYmVyIiwgInZhbHVlQ2FsbGJhY2siLCAiZGVmYXVsdE9wdGlvbnMiLCAibG9jYWxlIiwgIm1hdGNoIiwgInBhdGgiLCAiYXBwIiwgImZpbGVOYW1lIiwgImN1cnJlbnRDb3VudCIsICJpIiwgImkiLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJhcHAiLCAiZ2FtaWZpY2F0aW9uIiwgImUiLCAiaSIsICJtYXRjaCIsICJmaWxlIiwgImFwcCJdCn0K diff --git a/src/ModalBooster.ts b/src/ModalBooster.ts new file mode 100644 index 0000000..10acfa4 --- /dev/null +++ b/src/ModalBooster.ts @@ -0,0 +1,51 @@ +import { App, Modal } from 'obsidian'; +import gamification from 'main'; +import { MultiSelectModal } from 'MultiSelectModal'; + +export class ModalBooster extends Modal { + private readonly displayText: string; + private readonly gamificationInstance: gamification; + + constructor(app: App, displayText: string, gamificationInstance: gamification) { + super(app); + this.displayText = displayText; + this.gamificationInstance = gamificationInstance; + } + + onOpen() { + const { contentEl } = this; + contentEl.setText(this.displayText); + + const multiSelectModal = new MultiSelectModal(this.app, [], 'Craft Booster Item', this.gamificationInstance); // Create the modal instance + + + // Add a button to open the multi-select modal + const button = document.createElement('button'); + button.innerText = 'Open Crafting Table'; + button.onclick = () => { + multiSelectModal.setUseBooster(false); // Set the flag for crafting table + multiSelectModal.open(); + }; + + + multiSelectModal.readBoostersStock(); + multiSelectModal.readIngrementStock(); + + + const button2 = document.createElement('button'); + button2.innerText = 'Open Booster Board'; + button2.onclick = () => { + multiSelectModal.setUseBooster(true); + multiSelectModal.open(); + }; + + contentEl.appendChild(button); + contentEl.appendChild(button2); + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } + +} diff --git a/src/ModalInformationbox.ts b/src/ModalInformationbox.ts new file mode 100644 index 0000000..c2d6c52 --- /dev/null +++ b/src/ModalInformationbox.ts @@ -0,0 +1,20 @@ +import { App, Modal } from 'obsidian'; + +export class ModalInformationbox extends Modal { + private readonly displayText: string; // Store the text to be displayed + + constructor(app: App, displayText: string) { + super(app); + this.displayText = displayText; // Store the passed text + } + + onOpen() { + const { contentEl } = this; + contentEl.setText(this.displayText); // Use the stored text + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/src/MultiSelectModal.ts b/src/MultiSelectModal.ts new file mode 100644 index 0000000..8533f00 --- /dev/null +++ b/src/MultiSelectModal.ts @@ -0,0 +1,462 @@ +import { App, Modal } from 'obsidian'; +import { + craftingItems, + elements, + boosterRecipes, + listOfUseableBoostersToBeShown, + listOfUseableIngredientsToBeShown +} from './constants'; +import { ModalInformationbox } from 'ModalInformationbox'; +import gamification, { isMinutesPassed, hoursUntilMinutesPassed } from 'main'; + + + + +export class MultiSelectModal extends Modal { + private items: string[]; + private selectedItems: string[] = []; + private remainingStock: Record = {}; + private buttonText: string; + private readonly gamificationInstance: gamification; + private boosters: Record = {}; + private useBooster: boolean = false; + private remainingBoosterStock: Record = {}; + + constructor(app: App, items: string[], buttonText: string, gamificationInstance: gamification) { + super(app); + this.items = items; + this.buttonText = buttonText; + this.gamificationInstance = gamificationInstance; + } + + onOpen() { + const { contentEl } = this; + contentEl.empty(); + + //this.readBoostersStock(); + // take care only to run several times through when boosters are used + if (this.useBooster) { + boosterRecipes.forEach(item => { + if (this.boosterAvailableForUse(item.name)) { + const listItem = this.createItemContainer(item.name); + contentEl.appendChild(listItem); + } + }); + } else { + const listItem = this.createItemContainer(""); + contentEl.appendChild(listItem); + } + } + + + onClose() { + this.selectedItems = []; + } + + private boosterAvailableForUse(item: string) { + //console.log(`boosterAvailableForUse: ${item}`) + let found = false; + listOfUseableBoostersToBeShown.forEach(element => { + //console.log(`${item} == ${element} ??`) + if (item == element) { + if (!found) { + found = true; + } + + } + + }); + return found; + } + + setUseBooster(useBooster: boolean) { + this.useBooster = useBooster; + } + + + // Updated createItemContainer method + private createItemContainer(labelText: string) { + if (this.useBooster) { + return this.createBoosterList(labelText); + } else { + //return this.createCheckbox(labelText); + return this.createCraftingLayout(); + } + } + + updateIncrementStock(increment: string, stock: number) { + console.log(`updateIncrementStock: increment ${increment} stock ${stock}`); + this.remainingStock[increment] = stock; + this.gamificationInstance.setSetting(this.getIngerementVarNameFromName(increment) || '', stock); + } + + + updateBoosterStock(booster: string, stockIncrease: number) { + this.boosters[booster] += stockIncrease; + } + + decrementBooster(booster: string, stockIncrease: number) { + const stock = this.boosters[booster]; + const momentDate = window.moment(booster, 'YYYY-MM-DD HH:mm:ss'); + if (stock > 0 && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(booster))) { + this.boosters[booster] -= stockIncrease; + this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(booster), this.boosters[booster]); + this.gamificationInstance.setSettingBoolean(this.getBoosterSwitchFromName(booster), true); + this.gamificationInstance.setSettingString(this.getBoosterDateFromName(booster), window.moment().format('YYYY-MM-DD HH:mm:ss')); + this.updateQuantityDisplay(booster); + } + } + + + readBoostersStock() { + if (this.gamificationInstance) { + this.boosters = { + 'Temporal Tweaker': this.gamificationInstance.getSetting('temporalTweaker') as number, + 'Perpetual Progress': this.gamificationInstance.getSetting('perpetualProgress') as number, + 'Strategic Synapses': this.gamificationInstance.getSetting('strategicSynapses') as number, + 'Accelerated Acquisition': this.gamificationInstance.getSetting('acceleratedAcquisition') as number, + 'Linkers Lode': this.gamificationInstance.getSetting('linkersLode') as number, + 'Effortless Expansion': this.gamificationInstance.getSetting('effortlessExpansion') as number, + 'Recursive Reflection': this.gamificationInstance.getSetting('recursiveReflection') as number, + 'Synaptic Surge': this.gamificationInstance.getSetting('synapticSurge') as number, + 'Inspiration Infusion': this.gamificationInstance.getSetting('inspirationInfusion') as number, + 'Title Titan': this.gamificationInstance.getSetting('titleTitan') as number, + 'Precision Prism': this.gamificationInstance.getSetting('precisionPrism') as number, + 'Hyperlink Harmony': this.gamificationInstance.getSetting('hyperlinkHarmony') as number, + }; + } + } + + + readIngrementStock() { + if (this.gamificationInstance) { + this.remainingStock = { + 'Nexus Node': this.gamificationInstance.getSetting('nexusNode') as number, + 'Connection Crystal': this.gamificationInstance.getSetting('connectionCrystal') as number, + 'Mastery Scroll': this.gamificationInstance.getSetting('masteryScroll') as number, + 'Insight Prism': this.gamificationInstance.getSetting('insightPrism') as number, + 'Reflective Essence': this.gamificationInstance.getSetting('reflectiveEssence') as number, + 'Amplification Crystal': this.gamificationInstance.getSetting('amplificationCrystal') as number, + 'Creative Catalyst': this.gamificationInstance.getSetting('creativeCatalyst') as number, + 'Precision Lens': this.gamificationInstance.getSetting('precisionLens') as number, + }; + } + } + + + private createCraftingLayout() { + const container = document.createElement('div'); + container.className = 'modal-crafting-container'; + + // Create a container for the stock information + const stockContainer = document.createElement('div'); + stockContainer.className = 'stock-container'; + + + craftingItems.forEach(recipe => { + if (this.boosterAvailableForUse(recipe.name)) { + const itemContainer = document.createElement('div'); + itemContainer.className = 'crafting-item-container'; + + const button = document.createElement('button'); + button.innerText = 'Craft'; + button.onclick = () => this.craftBoosterItem(recipe); + + const useInfoButton = document.createElement('button'); + useInfoButton.innerText = '?'; + useInfoButton.onclick = () => { + new ModalInformationbox(this.app, this.getBoosterInforFromFromName(recipe.name)).open(); + }; + + const itemText = document.createElement('span'); + itemText.innerText = `${recipe.name} ⇒ ${recipe.incredients.join(' ')}`; + + itemContainer.appendChild(button); + itemContainer.appendChild(useInfoButton); + itemContainer.appendChild(itemText); + container.appendChild(itemContainer); + } + }); + + const stockInfo = document.createElement('div'); + stockInfo.className = 'stock-info'; + + listOfUseableIngredientsToBeShown.forEach(element => { + //console.log(`${element.name} : ${this.remainingStock[element.name]}`) + stockInfo.innerHTML += `${this.getIngerementFromName(element).shortName} [${this.remainingStock[this.getIngerementFromName(element).name] || 0}]      `; + }); + + stockContainer.appendChild(stockInfo); + + + + // Add the stock container to the main container + container.appendChild(stockContainer); + + return container; + } + + + + private createBoosterList(labelText: string) { + const container = document.createElement('div'); + container.className = 'modal-checkbox-container'; + + //const stock = this.remainingStock[labelText] || 0; + const stock = this.boosters[labelText]; + + const label = document.createElement('div'); + label.className = `${labelText.replace(' ', '-')}`; + const useButton = document.createElement('button'); + const momentDate = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); + if (isMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'), this.getBoosterCooldownFromName(labelText)) == false) { + console.log(`Booster ${labelText} is still in cooldown for ${window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'), this.getBoosterCooldownFromName(labelText) / 60} hours`); + label.innerHTML = `${labelText} : (${stock})`; + //const useButton = document.createElement('button'); + useButton.innerText = `cooldown ${hoursUntilMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'), this.getBoosterCooldownFromName(labelText))} hours`; + useButton.id = `use-button-${labelText.replace(' ', '-')}`; + useButton.onclick = () => { + new ModalInformationbox(this.app, `${labelText} is for ${hoursUntilMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'), this.getBoosterCooldownFromName(labelText))} hours in cooldown and can only then be used again.`).open(); + }; + } else { + label.innerHTML = `${labelText} : (${stock})`; + //const useButton = document.createElement('button'); + useButton.innerText = 'Use'; + useButton.id = `use-button-${labelText.replace(' ', '-')}`; + useButton.onclick = () => { + this.useBoosterItem(labelText); + }; + } + + const useInfoButton = document.createElement('button'); + useInfoButton.innerText = '?'; + useInfoButton.id = `information-${labelText.replace(' ', '-')}`; + useInfoButton.onclick = () => { + new ModalInformationbox(this.app, this.getBoosterInforFromFromName(labelText)).open(); + }; + + + container.appendChild(useButton); + container.appendChild(useInfoButton); + container.appendChild(label); + + + return container; + + } + + + incrementItem(item: string) { + const stock = this.remainingStock[item]; + console.log(`incrementItem: stock = ${stock}`); + if (stock > 0) { + this.selectedItems.push(item); + this.remainingStock[item]--; + this.updateQuantityDisplay(item); + } + if (this.boosters[item] !== undefined) { + this.boosters[item]--; + this.updateQuantityDisplay(item); + } + } + + + decrementItem(item: string) { + const itemIndex = this.selectedItems.indexOf(item); + + if (itemIndex > -1) { + this.selectedItems.splice(itemIndex, 1); + this.remainingStock[item]++; + this.updateQuantityDisplay(item); + } + if (this.boosters[item] !== undefined) { + this.boosters[item]++; + this.updateQuantityDisplay(item); + } + } + + + private useBoosterItem(labelText: string) { + console.log(`use Booster ${labelText}`); + /*const stock = this.boosters[labelText]; + if (stock > 0) { + //this.selectedItems.push(labelText); + //this.boosters[labelText]--; + this.updateQuantityDisplay(labelText); + }*/ + this.decrementBooster(labelText, 1); + + } + + + + private updateQuantityDisplay(labelText: string) { + const stock = this.boosters[labelText]; + const stockInfo = document.querySelector(`.${labelText.replace(' ', '-')}`); + if (stockInfo) { + stockInfo.innerHTML = ''; // Clear the current content + stockInfo.innerHTML = `${labelText} : (${stock})`; + } + const buttonUse = document.querySelector(`#use-button-${labelText.replace(' ', '-')}`); + const date = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); + const momentDate = window.moment(date as string, 'YYYY-MM-DD HH:mm:ss'); + if (buttonUse && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText)) == false) { + buttonUse.setText(`cooldown ${hoursUntilMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText))} hours`); + } + } + + + private checkIngredientsAvailability(incredients: { name: string; incredients: string[]; }) { + for (const ingredient of incredients.incredients) { + const [quantity, shortName] = ingredient.split('x'); + //console.log(`quantity: ${quantity}\tshortName: ${shortName}`) + const requiredQuantity = parseInt(quantity); + const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; + //console.log(`requiredQuantity: ${requiredQuantity}\tavailableStock: ́${availableStock}`) + if (requiredQuantity > availableStock) { + return false; // Not enough stock for this ingredient + } + } + + return true; + } + + + private useIngrediments(incredients: { name: string; incredients: string[]; }) { + console.log(`useIngrediments: ${incredients}`); + for (const ingredient of incredients.incredients) { + const [quantity, shortName] = ingredient.split('x'); + console.log(`quantity: ${quantity}\tshortName: ${shortName}`); + const requiredQuantity = parseInt(quantity); + const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; + const ingrementName = this.getIngerementNameFromShortName(shortName) || ''; + //console.log(`requiredQuantity: ${requiredQuantity}\tavailableStock: ́${availableStock}`) + //this.remainingStock[this.getIngerementNameFromShortName(shortName) = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0] -= quantity; + console.log(`this.getIngerementNameFromShortName(shortName): ${this.getIngerementNameFromShortName(shortName)}`); + this.updateIncrementStock(ingrementName, availableStock - requiredQuantity); + console.log(`${incredients.name} ${availableStock - requiredQuantity}`); + } + + return true; + } + + + private updateStockInformation() { + const stockInfo = document.querySelector('.stock-info'); + if (stockInfo) { + stockInfo.innerHTML = ''; // Clear the current content + + elements.forEach(element => { + stockInfo.innerHTML += `${element.shortName} [${this.remainingStock[element.name] || 0}]      `; + }); + } + } + + + private craftBoosterItem(selectedItems: { name: string; incredients: string[]; }) { + // call here the recipe logic and reduce the stock + if (this.checkIngredientsAvailability(selectedItems)) { + console.log(`craft booster ${selectedItems.name}`); + this.updateBoosterStock(selectedItems.name, 1); + this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(selectedItems.name), this.boosters[selectedItems.name]); + this.useIngrediments(selectedItems); + //this.updateQuantityDisplay(selectedItems.name) + this.updateStockInformation(); + } else { + console.log(`not enough ingredients for booster ${selectedItems.name} in stock`); + } + } + + + private getIngerementNameFromShortName(shortName: string) { + for (const element of elements) { + if (element.shortName === shortName) { + return element.name; + } + } + return null; // Return null if no matching element is found + } + + private getIngerementShortNameFromName(name: string) { + for (const element of elements) { + if (element.name === name) { + return element.shortName; + } + } + return null; // Return null if no matching element is found + } + + private getIngerementFromName(name: string) { + for (const element of elements) { + if (element.name === name) { + return element; + } + } + return { shortName: '', name: '', varName: '' }; // Return null if no matching element is found + } + + + private getIngerementVarNameFromShortName(shortName: string) { + for (const element of elements) { + if (element.shortName === shortName) { + return element.varName; + } + } + return null; // Return null if no matching element is found + } + + private getIngerementVarNameFromName(name: string) { + for (const element of elements) { + if (element.name === name) { + return element.varName; + } + } + return null; // Return null if no matching element is found + } + + private getBoosterVarNameFromName(boosterName: string) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.varname; + } + } + return ''; // Return null if no matching element is found + } + + private getBoosterInforFromFromName(boosterName: string) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.description; + } + } + return ''; // Return null if no matching element is found + } + + private getBoosterSwitchFromName(boosterName: string) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterSwitch; + } + } + return ''; // Return null if no matching element is found + } + + private getBoosterDateFromName(boosterName: string) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterDate as string; + } + } + return ''; // Return null if no matching element is found + } + + private getBoosterCooldownFromName(boosterName: string) { + for (const element of boosterRecipes) { + if (element.name === boosterName) { + return element.boosterCooldown; + } + } + return 0; // Return null if no matching element is found + } + +} diff --git a/src/main.ts b/src/main.ts index 61f132a..e07ab6e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,7 @@ style.textContent = ` `; document.head.append(style); -import {App, MarkdownView, Modal, Notice, Plugin, TFile, Vault} from 'obsidian'; +import {App, MarkdownView, Notice, Plugin, TFile, Vault} from 'obsidian'; import {defaultSettings, ISettings, GamificationPluginSettings} from './settings'; import format from 'date-fns/format'; import { @@ -22,11 +22,8 @@ import { pointsForDailyChallenge, pointsForWeeklyChallenge, incrediments, - craftingItems, elements, boosterRecipes, - listOfUseableBoostersToBeShown, - listOfUseableIngredientsToBeShown, streakboosterDecrease, streakboosterIncreaseDaily, streakboosterIncreaseWeekly @@ -57,6 +54,8 @@ import {Badge, checkIfReceiveABadge, getBadgeForInitLevel, getBadgeForLevel} fro import {getLevelForPoints, statusPointsForLevel} from './levels' import type {Moment} from 'moment'; import { getRandomMessageWeeklyChallenge, getRandomMessageTwoNoteChallenge , getRandomMessagePoints } from './randomNotificationText' +import { ModalInformationbox } from 'ModalInformationbox'; +import { ModalBooster } from 'ModalBooster'; export default class gamification extends Plugin { //public settings: GamificationPluginSettings; @@ -1250,7 +1249,7 @@ function isOneDayBefore(inputDate: Moment): boolean { return inputDate.isSame(oneDayBeforeCurrent, 'day'); } -function isMinutesPassed(inputDate: Moment, minutesPassed: number): boolean { +export function isMinutesPassed(inputDate: Moment, minutesPassed: number): boolean { const minutesAgo = window.moment().subtract(minutesPassed, 'minutes'); // Calculate time 'minutesPassed' minutes ago return inputDate.isSameOrBefore(minutesAgo); } @@ -1267,7 +1266,7 @@ function isMinutesPassed(inputDate: Moment, minutesPassed: number): boolean { return Math.ceil(timeDiff); }*/ -function hoursUntilMinutesPassed(inputDate: Moment, minutesToPass: number): number { +export function hoursUntilMinutesPassed(inputDate: Moment, minutesToPass: number): number { const currentTime = window.moment(); // Get the current time const targetTime = inputDate.clone().add(minutesToPass, 'minutes'); // Calculate the target time @@ -1306,530 +1305,6 @@ function stringToList(input: string): string[] { -class MultiSelectModal extends Modal { - private items: string[]; - private selectedItems: string[] = []; - private remainingStock: Record = {}; - private buttonText: string; - private readonly gamificationInstance: gamification; - private boosters: Record = {}; - private useBooster: boolean = false; - private remainingBoosterStock: Record = {}; - - constructor(app: App, items: string[], buttonText: string,gamificationInstance: gamification) { - super(app); - this.items = items; - this.buttonText = buttonText; - this.gamificationInstance = gamificationInstance; - } - - onOpen() { - const { contentEl } = this; - contentEl.empty(); - - //this.readBoostersStock(); - - // take care only to run several times through when boosters are used - if (this.useBooster){ - boosterRecipes.forEach(item => { - if(this.boosterAvailableForUse(item.name)){ - const listItem = this.createItemContainer(item.name); - contentEl.appendChild(listItem); - } - }); - } else { - const listItem = this.createItemContainer(""); - contentEl.appendChild(listItem); - } - } - - - onClose() { - this.selectedItems = []; - } - - private boosterAvailableForUse(item:string){ - //console.log(`boosterAvailableForUse: ${item}`) - let found = false - listOfUseableBoostersToBeShown.forEach(element => { - //console.log(`${item} == ${element} ??`) - if(item == element){ - if(!found){ - found = true; - } - - } - - }); - return found - } - - setUseBooster(useBooster: boolean) { - this.useBooster = useBooster; - } - - - // Updated createItemContainer method - private createItemContainer(labelText: string) { - if (this.useBooster) { - return this.createBoosterList(labelText); - } else { - //return this.createCheckbox(labelText); - return this.createCraftingLayout() - } - } - - updateIncrementStock(increment: string, stock: number) { - console.log(`updateIncrementStock: increment ${increment} stock ${stock}`) - this.remainingStock[increment] = stock; - this.gamificationInstance.setSetting(this.getIngerementVarNameFromName(increment)|| '', stock) - } - - - updateBoosterStock(booster: string, stockIncrease: number) { - this.boosters[booster] += stockIncrease; - } - - decrementBooster(booster: string, stockIncrease: number) { - const stock = this.boosters[booster]; - const momentDate = window.moment(booster, 'YYYY-MM-DD HH:mm:ss'); - if (stock > 0 && isMinutesPassed(momentDate,this.getBoosterCooldownFromName(booster))) { - this.boosters[booster] -= stockIncrease; - this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(booster),this.boosters[booster]) - this.gamificationInstance.setSettingBoolean(this.getBoosterSwitchFromName(booster),true) - this.gamificationInstance.setSettingString(this.getBoosterDateFromName(booster),window.moment().format('YYYY-MM-DD HH:mm:ss')) - this.updateQuantityDisplay(booster); - } - } - - - readBoostersStock(){ - if (this.gamificationInstance) { - this.boosters = { - 'Temporal Tweaker': this.gamificationInstance.getSetting('temporalTweaker') as number, - 'Perpetual Progress': this.gamificationInstance.getSetting('perpetualProgress') as number, - 'Strategic Synapses': this.gamificationInstance.getSetting('strategicSynapses') as number, - 'Accelerated Acquisition': this.gamificationInstance.getSetting('acceleratedAcquisition') as number, - 'Linkers Lode': this.gamificationInstance.getSetting('linkersLode') as number, - 'Effortless Expansion': this.gamificationInstance.getSetting('effortlessExpansion') as number, - 'Recursive Reflection': this.gamificationInstance.getSetting('recursiveReflection') as number, - 'Synaptic Surge': this.gamificationInstance.getSetting('synapticSurge') as number, - 'Inspiration Infusion': this.gamificationInstance.getSetting('inspirationInfusion') as number, - 'Title Titan': this.gamificationInstance.getSetting('titleTitan') as number, - 'Precision Prism': this.gamificationInstance.getSetting('precisionPrism') as number, - 'Hyperlink Harmony': this.gamificationInstance.getSetting('hyperlinkHarmony') as number, - }; - } - } - - - readIngrementStock(){ - if (this.gamificationInstance) { - this.remainingStock = { - 'Nexus Node': this.gamificationInstance.getSetting('nexusNode') as number, - 'Connection Crystal': this.gamificationInstance.getSetting('connectionCrystal') as number, - 'Mastery Scroll': this.gamificationInstance.getSetting('masteryScroll') as number, - 'Insight Prism': this.gamificationInstance.getSetting('insightPrism') as number, - 'Reflective Essence': this.gamificationInstance.getSetting('reflectiveEssence') as number, - 'Amplification Crystal': this.gamificationInstance.getSetting('amplificationCrystal') as number, - 'Creative Catalyst': this.gamificationInstance.getSetting('creativeCatalyst') as number, - 'Precision Lens': this.gamificationInstance.getSetting('precisionLens') as number, - }; - } - } - - - private createCraftingLayout() { - const container = document.createElement('div'); - container.className = 'modal-crafting-container'; - - // Create a container for the stock information - const stockContainer = document.createElement('div'); - stockContainer.className = 'stock-container'; - - - craftingItems.forEach(recipe => { - if(this.boosterAvailableForUse(recipe.name)){ - const itemContainer = document.createElement('div'); - itemContainer.className = 'crafting-item-container'; - - const button = document.createElement('button'); - button.innerText = 'Craft'; - button.onclick = () => this.craftBoosterItem(recipe); - - const useInfoButton = document.createElement('button'); - useInfoButton.innerText = '?'; - useInfoButton.onclick = () => { - new ModalInformationbox(this.app, this.getBoosterInforFromFromName(recipe.name)).open(); - }; - - const itemText = document.createElement('span'); - itemText.innerText = `${recipe.name} ⇒ ${recipe.incredients.join(' ')}`; - - itemContainer.appendChild(button); - itemContainer.appendChild(useInfoButton); - itemContainer.appendChild(itemText); - container.appendChild(itemContainer); - } - }); - - const stockInfo = document.createElement('div'); - stockInfo.className = 'stock-info'; - - listOfUseableIngredientsToBeShown.forEach(element => { - //console.log(`${element.name} : ${this.remainingStock[element.name]}`) - stockInfo.innerHTML += `${this.getIngerementFromName(element).shortName} [${this.remainingStock[this.getIngerementFromName(element).name] || 0}]      `; - }); - - stockContainer.appendChild(stockInfo); - - - - // Add the stock container to the main container - container.appendChild(stockContainer); - - return container; - } - - - - private createBoosterList(labelText: string) { - const container = document.createElement('div'); - container.className = 'modal-checkbox-container'; - - //const stock = this.remainingStock[labelText] || 0; - const stock = this.boosters[labelText] - - const label = document.createElement('div'); - label.className = `${labelText.replace(' ','-')}`; - const useButton = document.createElement('button'); - const momentDate = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); - if(isMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'),this.getBoosterCooldownFromName(labelText)) == false){ - console.log(`Booster ${labelText} is still in cooldown for ${window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'),this.getBoosterCooldownFromName(labelText)/60} hours`) - label.innerHTML = `${labelText} : (${stock})`; - //const useButton = document.createElement('button'); - useButton.innerText = `cooldown ${hoursUntilMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'),this.getBoosterCooldownFromName(labelText))} hours`; - useButton.id = `use-button-${labelText.replace(' ','-')}`; - useButton.onclick = () => { - new ModalInformationbox(this.app, `${labelText} is for ${hoursUntilMinutesPassed(window.moment(momentDate as string, 'YYYY-MM-DD HH:mm:ss'),this.getBoosterCooldownFromName(labelText))} hours in cooldown and can only then be used again.`).open(); - }; - } else { - label.innerHTML = `${labelText} : (${stock})`; - //const useButton = document.createElement('button'); - useButton.innerText = 'Use'; - useButton.id = `use-button-${labelText.replace(' ','-')}`; - useButton.onclick = () => { - this.useBoosterItem(labelText); - }; - } - - const useInfoButton = document.createElement('button'); - useInfoButton.innerText = '?'; - useInfoButton.id = `information-${labelText.replace(' ','-')}`; - useInfoButton.onclick = () => { - new ModalInformationbox(this.app, this.getBoosterInforFromFromName(labelText)).open(); - }; - - - container.appendChild(useButton); - container.appendChild(useInfoButton); - container.appendChild(label); - - - return container; - - } - - - incrementItem(item: string) { - const stock = this.remainingStock[item]; - console.log(`incrementItem: stock = ${stock}`) - if (stock > 0) { - this.selectedItems.push(item); - this.remainingStock[item]--; - this.updateQuantityDisplay(item); - } - if (this.boosters[item] !== undefined) { - this.boosters[item]--; - this.updateQuantityDisplay(item); - } - } - - - decrementItem(item: string) { - const itemIndex = this.selectedItems.indexOf(item); - - if (itemIndex > -1) { - this.selectedItems.splice(itemIndex, 1); - this.remainingStock[item]++; - this.updateQuantityDisplay(item); - } - if (this.boosters[item] !== undefined) { - this.boosters[item]++; - this.updateQuantityDisplay(item); - } - } - - - private useBoosterItem(labelText: string) { - console.log(`use Booster ${labelText}`) - /*const stock = this.boosters[labelText]; - if (stock > 0) { - //this.selectedItems.push(labelText); - //this.boosters[labelText]--; - this.updateQuantityDisplay(labelText); - }*/ - this.decrementBooster(labelText,1) - - } - - - - private updateQuantityDisplay(labelText: string) { - const stock = this.boosters[labelText] - const stockInfo = document.querySelector(`.${labelText.replace(' ','-')}`); - if (stockInfo) { - stockInfo.innerHTML = ''; // Clear the current content - stockInfo.innerHTML = `${labelText} : (${stock})` - } - const buttonUse = document.querySelector(`#use-button-${labelText.replace(' ','-')}`); - const date = this.gamificationInstance.getSetting(this.getBoosterDateFromName(labelText)); - const momentDate = window.moment(date as string, 'YYYY-MM-DD HH:mm:ss') - if (buttonUse && isMinutesPassed(momentDate, this.getBoosterCooldownFromName(labelText)) == false){ - buttonUse.setText(`cooldown ${hoursUntilMinutesPassed(momentDate,this.getBoosterCooldownFromName(labelText))} hours`) - } - } - - - private checkIngredientsAvailability(incredients: {name: string; incredients: string[];}) { - for (const ingredient of incredients.incredients) { - const [quantity, shortName] = ingredient.split('x'); - //console.log(`quantity: ${quantity}\tshortName: ${shortName}`) - const requiredQuantity = parseInt(quantity); - const availableStock = this.remainingStock[this.getIngerementNameFromShortName - (shortName) || 0]; - //console.log(`requiredQuantity: ${requiredQuantity}\tavailableStock: ́${availableStock}`) - - if (requiredQuantity > availableStock) { - return false; // Not enough stock for this ingredient - } - } - - return true; - } - - - private useIngrediments(incredients: {name: string; incredients: string[];}) { - console.log(`useIngrediments: ${incredients}`) - for (const ingredient of incredients.incredients) { - const [quantity, shortName] = ingredient.split('x'); - console.log(`quantity: ${quantity}\tshortName: ${shortName}`) - const requiredQuantity = parseInt(quantity); - const availableStock = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0]; - const ingrementName = this.getIngerementNameFromShortName(shortName) || ''; - //console.log(`requiredQuantity: ${requiredQuantity}\tavailableStock: ́${availableStock}`) - //this.remainingStock[this.getIngerementNameFromShortName(shortName) = this.remainingStock[this.getIngerementNameFromShortName(shortName) || 0] -= quantity; - console.log(`this.getIngerementNameFromShortName(shortName): ${this.getIngerementNameFromShortName(shortName)}`) - this.updateIncrementStock(ingrementName,availableStock - requiredQuantity) - console.log(`${incredients.name} ${availableStock - requiredQuantity}`) - } - - return true; - } - - - private updateStockInformation() { - const stockInfo = document.querySelector('.stock-info'); - if (stockInfo) { - stockInfo.innerHTML = ''; // Clear the current content - - elements.forEach(element => { - stockInfo.innerHTML += `${element.shortName} [${this.remainingStock[element.name] || 0}]      `; - }); - } - } - - - private craftBoosterItem(selectedItems: {name: string; incredients: string[];}) { - // call here the recipe logic and reduce the stock - if(this.checkIngredientsAvailability(selectedItems)){ - console.log(`craft booster ${selectedItems.name}`) - this.updateBoosterStock(selectedItems.name, 1) - this.gamificationInstance.setSetting(this.getBoosterVarNameFromName(selectedItems.name), this.boosters[selectedItems.name]) - this.useIngrediments(selectedItems) - //this.updateQuantityDisplay(selectedItems.name) - this.updateStockInformation() - } else { - console.log(`not enough ingredients for booster ${selectedItems.name} in stock`) - } - } - - - private getIngerementNameFromShortName(shortName: string) { - for (const element of elements) { - if (element.shortName === shortName) { - return element.name; - } - } - return null; // Return null if no matching element is found - } - - private getIngerementShortNameFromName(name: string) { - for (const element of elements) { - if (element.name === name) { - return element.shortName; - } - } - return null; // Return null if no matching element is found - } - - private getIngerementFromName(name: string) { - for (const element of elements) { - if (element.name === name) { - return element; - } - } - return {shortName: '', name: '', varName: ''}; // Return null if no matching element is found - } - - - private getIngerementVarNameFromShortName(shortName: string) { - for (const element of elements) { - if (element.shortName === shortName) { - return element.varName; - } - } - return null; // Return null if no matching element is found - } - - private getIngerementVarNameFromName(name: string) { - for (const element of elements) { - if (element.name === name) { - return element.varName; - } - } - return null; // Return null if no matching element is found - } - - private getBoosterVarNameFromName(boosterName: string) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.varname; - } - } - return ''; // Return null if no matching element is found - } - - private getBoosterInforFromFromName(boosterName: string) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.description; - } - } - return ''; // Return null if no matching element is found - } - - private getBoosterSwitchFromName(boosterName: string) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterSwitch; - } - } - return ''; // Return null if no matching element is found - } - - private getBoosterDateFromName(boosterName: string) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterDate as string; - } - } - return ''; // Return null if no matching element is found - } - - private getBoosterCooldownFromName(boosterName: string) { - for (const element of boosterRecipes) { - if (element.name === boosterName) { - return element.boosterCooldown; - } - } - return 0; // Return null if no matching element is found - } - -} - - - -class ModalBooster extends Modal { - private readonly displayText: string; - private readonly gamificationInstance: gamification; - - constructor(app: App, displayText: string, gamificationInstance: gamification) { - super(app); - this.displayText = displayText; - this.gamificationInstance = gamificationInstance; - } - - onOpen() { - const { contentEl } = this; - contentEl.setText(this.displayText); - - const multiSelectModal = new MultiSelectModal(this.app, [], 'Craft Booster Item', this.gamificationInstance); // Create the modal instance - - // Add a button to open the multi-select modal - const button = document.createElement('button'); - button.innerText = 'Open Crafting Table'; - button.onclick = () => { - multiSelectModal.setUseBooster(false); // Set the flag for crafting table - multiSelectModal.open(); - }; - - - multiSelectModal.readBoostersStock(); - multiSelectModal.readIngrementStock(); - - - const button2 = document.createElement('button'); - button2.innerText = 'Open Booster Board'; - button2.onclick = () => { - multiSelectModal.setUseBooster(true); - multiSelectModal.open(); - }; - - contentEl.appendChild(button); - contentEl.appendChild(button2); - } - - onClose() { - const { contentEl } = this; - contentEl.empty(); - } - -} - - - - -class ModalInformationbox extends Modal { - private readonly displayText: string; // Store the text to be displayed - - constructor(app: App, displayText: string) { - super(app); - this.displayText = displayText; // Store the passed text - } - - onOpen() { - const { contentEl } = this; - contentEl.setText(this.displayText); // Use the stored text - } - - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -} - - async function replaceFormatStrings(layer2: string, layer3: string) { const activeView = this.app.workspace.getActiveViewOfType(MarkdownView);