function arrayUnique(a) { for (var i = 0; i < a.length; ++i) { for (var j = i + 1; j < a.length; ++j) { if (a[i] === a[j]) a.splice(j--, 1); } } return a; } function arrayUniqueNewArray(a) { a = a.slice(); arrayUnique(a); return a; } function arrayShuffle(a) { for (let i = 0; i < a.length; i++) { let pos = Math.floor(Math.random() * (a.length - i)) + i; let temp = a[i]; a[i] = a[pos]; a[pos] = temp; } } function arrayShuffleNewArray(a) { let nA = a.slice(); arrayShuffle(nA); return nA; } class StoredVariable { constructor(options) { this.id = options.id; this.value = options.value; this.defValue = this.value; StoredVariable.registerVariable(this); } reset() { this.value = this.defValue; } updateFromObject(obj) { this.value = obj; } exportAsObject() { return this.value; } static registerVariable(variable) { if (StoredVariable.storedVariables[variable.id] == undefined) { StoredVariable.storedVariables[variable.id] = variable; } else { console.warn("[StoredVariable] " + variable.id + " already defined. Ignoring:", variable); } } static getVariable(id) { return StoredVariable.storedVariables[id]; } static getVariables() { let list = []; for (let key in StoredVariable.storedVariables) { list.push(StoredVariable.storedVariables[key]); } return list; } static exportAsObject() { let list = {}; for (let key in StoredVariable.storedVariables) { list[key] = StoredVariable.storedVariables[key].value; } return list; } static updateFromObject(obj) { for (let key in StoredVariable.storedVariables) { if (obj[key] != undefined) { StoredVariable.storedVariables[key].updateFromObject(obj[key]); } else { StoredVariable.storedVariables[key].reset(); } } } } StoredVariable.storedVariables = {}; class RulebookRunner { constructor(rulebook, noun) { this.rulesToExecute = []; this.ruleRunner = -1; this.rulebook = rulebook; this.noun = noun; } addRulebooks(...rulebooks) { rulebooks = arrayUniqueNewArray(rulebooks); rulebooks.forEach((rulebook) => { this.addRules(...rulebook.rules); }); } addRules(...rules) { if (this.ruleRunner < 0) { this.rulesToExecute.push(...rules); } } skipRule(rule) { if (this.ruleRunner >= 0) { let index = this.rulesToExecute.indexOf(rule); if (index > this.ruleRunner) { this.rulesToExecute.splice(index, 1); console.debug("[Rulebook]" + this.rulebook.name + ", skipping Rule " + rule.name + " due to request."); } else { console.warn("[Rulebook]" + this.rulebook.name + ": uname to skip Rule" + rule.name + " due to it being too late to stop it."); } } } async execute() { arrayUnique(this.rulesToExecute).sort(function (a, b) { return a.compareTo(b); }); for (this.ruleRunner = 0; this.ruleRunner < this.rulesToExecute.length; this.ruleRunner++) { this.rule = this.rulesToExecute[this.ruleRunner]; let result = await this.rule.execute(this); if (result != undefined) { return result; } } } } class Rulebook { constructor(name) { this.rules = []; this.name = name; } static getStack() { let stack = []; Rulebook.rulebookStack.forEach((rl) => { if (rl instanceof Object && rl.name != undefined) { stack.push(rl.name); } else if (typeof rl == "string") { stack.push(rl); } else if (rl instanceof Object && rl.id != undefined) { stack.push(rl.id); } else { stack.push("Undefined"); } }); return stack; } static getIndentation() { return " ".repeat(Rulebook.indentantionSpaces).repeat(Rulebook.rulebookStack.length); } static increaseIndentation(rulebook) { Rulebook.rulebookStack.push(rulebook); } static decreaseIndentation() { Rulebook.rulebookStack.pop(); } static isRunning(r) { return Rulebook.rulebookStack.indexOf(r) != -1; } isRunning() { return Rulebook.isRunning(this); } async execute(options, ...rulebooks) { options = options == undefined ? {} : options; let runner = new RulebookRunner(this, options.noun); runner.addRulebooks(this, ...rulebooks); var names = []; for (let i = 0; i < rulebooks.length; i++) { if (rulebooks[i] === this) continue; names.push(rulebooks[i].name); } console.debug(Rulebook.getIndentation() + "[RULEBOOK] " + this.name + (names.length > 0 ? (" merged with " + names.join(", ")) : "")); Rulebook.increaseIndentation(this); let result = await runner.execute(); Rulebook.decreaseIndentation(); return result; } createAndAddRule(r) { let rule = new Rule(r); this.addRule(rule); return rule; } addRule(r) { this.rules.push(r); } sortRules() { this.rules.sort(function (a, b) { return a.compareTo(b); }); } } Rulebook.indentantionSpaces = 2; Rulebook.rulebookStack = []; var Settings; (function (Settings) { var debug = console.debug; var debugEmpty = () => { }; Settings.hardDebug = false; Settings.sayTurnTime = true; function setDebug(isDebug) { if (isDebug) { console.debug = debug; } else { console.debug = debugEmpty; } } Settings.setDebug = setDebug; function isDebug() { return console.debug == debug; } Settings.isDebug = isDebug; function setHardDebug(isHardDebug) { Settings.hardDebug = isHardDebug; } Settings.setHardDebug = setHardDebug; })(Settings || (Settings = {})); class Rule { constructor(options) { this._priority = 0; this.firstPriority = 0; this.priority = options.priority != undefined ? options.priority : Rule.PRIORITY_MEDIUM; this.firstPriority = options.firstPriority != undefined ? options.firstPriority : Rule.PRIORITY_MEDIUM; this.name = options.name; this.code = options.code; this.createdWhere = (new Error()); this.conditions = options.conditions != undefined ? options.conditions : () => { return true; }; } async execute(rulebook) { if (!this.conditions(rulebook)) { return; } console.debug(Rulebook.getIndentation() + "[RULE] " + this.name); Settings.hardDebug && console.debug(this.name, this.createdWhere); Rulebook.increaseIndentation(this); rulebook.rule = this; let result = this.code(rulebook); if (result instanceof Promise) { result = await result; } if (result != undefined) { console.debug(Rulebook.getIndentation() + "Result:", result); } Rulebook.decreaseIndentation(); return result; } get priority() { return this._priority; } set priority(value) { this._priority = value; } compareTo(b) { var a = this; if (b.firstPriority < a.firstPriority) return -1; if (a.firstPriority < b.firstPriority) return 1; if (b.priority < a.priority) return -1; if (a.priority < b.priority) return 1; return 0; } } Rule.PRIORITY_HIGHEST = 20; Rule.PRIORITY_HIGH = 15; Rule.PRIORITY_MEDIUM = 10; Rule.PRIORITY_LOW = 5; Rule.PRIORITY_LOWEST = 0; var TurnSequence; (function (TurnSequence) { TurnSequence.rulebook = new Rulebook("Turn Sequence"); TurnSequence.playerActions = []; TurnSequence.lastTurnTime = 0; async function execute(action) { if (TurnSequence.playerActions.push(action) == 1) { let t0 = performance.now(); console.debug(Rulebook.getIndentation() + " Player Action: " + (action ? action.getCommandText() : "none")); await TurnSequence.rulebook.execute({ noun: action }); TurnSequence.playerActions = []; let t1 = performance.now(); TurnSequence.lastTurnTime = t1 - t0; console.debug("Total: " + (t1 - t0) + " milliseconds."); if (Settings.sayTurnTime) { Elements.CurrentTurnHandler.printAsContent(new Say(new SayBold("Time taken for turn: "), (t1 - t0), " milliseconds.")); } } } TurnSequence.execute = execute; TurnSequence.PrepareElementsRule = new Rule({ firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_MEDIUM, name: "Begin Turn (Elements Side)", code: function (runner) { Elements.CurrentTurnHandler.startTurn(runner.noun); } }); TurnSequence.rulebook.addRule(TurnSequence.PrepareElementsRule); TurnSequence.PlayerActionRule = new Rule({ firstPriority: Rule.PRIORITY_HIGH, priority: Rule.PRIORITY_MEDIUM, name: "Do Player Action", code: async (rulebook) => { let playerAction = rulebook.noun; if (playerAction != undefined) { let promise = playerAction.execute(); await promise; Elements.CurrentTurnHandler.printAsContent(playerAction.say); if (playerAction.requiresTurn) { WorldState.incrementPlayerTurn(); } } } }); TurnSequence.rulebook.addRule(TurnSequence.PlayerActionRule); TurnSequence.RunEveryTurnRulesRule = new Rule({ firstPriority: Rule.PRIORITY_MEDIUM, priority: Rule.PRIORITY_MEDIUM, name: "Run Every Turn Rules", code: async function () { while (WorldState.isTurnWaiting()) { await EveryTurn.EveryTurn.execute({}); } } }); TurnSequence.rulebook.addRule(TurnSequence.RunEveryTurnRulesRule); TurnSequence.RemoveTurnFromElementsRule = new Rule({ firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_MEDIUM, name: "End Turn (Elements/Controls Side)", code: async function (rulebook) { Elements.CurrentTurnHandler.endTurn(); Controls.KeyHandler.reset(); await Elements.HyperlinkHandler.hyperlinkCommonActions(); await Elements.RoomHandler.updateRoom(); await Elements.RememberedHandler.updateMap(); let playerAction = rulebook.noun; if (playerAction) { await Elements.HyperlinkHandler.hyperlinkObject(playerAction.getNoun(0)); } else { await Elements.HyperlinkHandler.hyperlinkObject(); } await Elements.InventoryHandler.updateInventory(); await Elements.AppearanceHandler.updateAppearance(); } }); TurnSequence.rulebook.addRule(TurnSequence.RemoveTurnFromElementsRule); })(TurnSequence || (TurnSequence = {})); var Version; (function (Version) { Version.currentVersion = [0, 1, 0]; function compareVersion(v1, v2) { if (v1[0] < v2[0]) return -1; else if (v1[0] > v2[0]) return 1; if (v1[1] < v2[1]) return -1; else if (v1[1] > v2[1]) return 1; if (v1[2] < v2[2]) return -1; else if (v1[2] > v2[2]) return 1; return 0; } Version.compareVersion = compareVersion; function getCurrentVersion() { let v = Version.currentVersion; return v[0] + "." + v[1] + "." + v[2]; } Version.getCurrentVersion = getCurrentVersion; document.title = document.title + " [" + getCurrentVersion() + "] "; })(Version || (Version = {})); var Controls; (function (Controls) { var Memory; (function (Memory) { let versionSet = false; let settingsVersion = Version.currentVersion; let versionId = "Version"; let memoryPrefix = "obelisk_"; let memories = {}; function getValue(id, defValue) { let storage = localStorage.getItem(memoryPrefix + id); return storage == undefined ? defValue : JSON.parse(storage); } Memory.getValue = getValue; function setValue(id, value) { localStorage.setItem(memoryPrefix + id, JSON.stringify(value)); if (!versionSet) { versionSet = true; settingsVersion = getValue(versionId, Version.currentVersion); setValue(versionId, Version.currentVersion); } if (settingsVersion == undefined) { } } Memory.setValue = setValue; function registerMemory(mem) { if (memories[mem.getId()] != undefined) { console.error("[Controls.Memory] Memory already registered on id " + mem.getId(), "Old:", memories[mem.getId()], "New:", mem); } else { memories[mem.getId()] = mem; mem.setValueFromLocalStorageDoNotInvoke(getValue(mem.getId(), mem.getValue())); let updateF = () => { Controls.Memory.setValue(mem.getId(), mem.getValue()); }; mem.addListener(updateF); updateF(); } } Memory.registerMemory = registerMemory; })(Memory = Controls.Memory || (Controls.Memory = {})); })(Controls || (Controls = {})); class StoredMemory { constructor(id, value) { this.listeners = []; this.id = id; this.value = value; Controls.Memory.registerMemory(this); } setValueFromLocalStorageDoNotInvoke(value) { this.value = value; } storeValue(value) { if (JSON.stringify(value) !== JSON.stringify(this.value)) { this.value = value; this.triggerListeners(); } } getValue() { return this.value; } getId() { return this.id; } addListener(listener) { this.listeners.push(listener); } triggerListeners() { for (var i = 0; i < this.listeners.length; i++) { this.listeners[i](this); } } } var SaveHandler; (function (SaveHandler) { let saveName = "Obelisk_Save"; let saveExtension = "obsav"; let storagePrefix = "save_"; let saveSlot = 0; let errors = []; let erasing = false; let virgin = new StoredMemory("First time saving", true); SaveHandler.AfterLoad = new Rulebook("After loading"); async function readFile() { let element = document.createElement("input"); element.type = "file"; element.accept = "." + saveExtension; let promise = new Promise((resolve, reject) => { element.onchange = () => { if (element.files.length == 0) { resolve(undefined); } else { var fr = new FileReader(); fr.onload = (ev) => { resolve(ev.target['result']); }; fr.readAsText(element.files[0]); } }; }); element.click(); return promise; } SaveHandler.readFile = readFile; function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } function loadSave() { let input = document.createElement("input"); input.type = "file"; input.accept = "." + saveExtension; document.body.appendChild(input); input.addEventListener("change", () => { let reader = new FileReader(); reader.onload = () => { let text = reader.result; SaveHandler.loadGame(JSON.parse(text)); }; reader.readAsText(input.files[0]); }); input.click(); document.body.removeChild(input); } SaveHandler.loadSave = loadSave; function getItem(thing) { let item; if (thing.Unique) { item = Thing.getUnique(thing.Name); } else { let items = Thing.getNonUnique(thing.Name); if (items.length > 0) { item = items[0]; } if (item == undefined) { let error = thing.Name + " no longer exists."; console.error("[SaveHandler] " + error); errors.push(error); return undefined; } else { item = item.clone(true); } } item.setChanges(thing.Changes); return item; } function loadGame(saveStruc) { let player = WorldState.player; StoredVariable.updateFromObject(saveStruc.Variables); WorldState.setCurrentTurn(saveStruc.Rounds); Thing.WearRelation.getRight(player).forEach((thing) => { Thing.WearRelation.unsetRight(thing); }); Thing.WieldRelation.getRight(player).forEach((thing) => { Thing.WieldRelation.unsetRight(thing); }); Thing.CarryRelation.getRight(player).forEach((thing) => { Thing.CarryRelation.unsetRight(thing); }); saveStruc.Wielded.forEach((thing) => { let item = getItem(thing); if (item != undefined) WorldState.player.setWielded(item); }); saveStruc.Worn.forEach((thing) => { let item = getItem(thing); if (item != undefined) WorldState.player.setWorn(item); }); saveStruc.Carried.forEach((thing) => { let item = getItem(thing); if (item != undefined) WorldState.player.setCarried(item); }); let savedPlayer = saveStruc.Player; player.setName(savedPlayer.Name); player.setChanges(savedPlayer.PlayerChanges); savedPlayer.Parts.forEach((part) => { let bpList = player.getPartsByName(part.Name); if (bpList != undefined) { bpList[0].setChanges(part.Changes); } }); saveStruc.UniqueThings.forEach((savedThing) => { let thing = Thing.getUnique(savedThing.Name); if (thing != undefined) { thing.setChanges(savedThing.Changes); } }); } SaveHandler.loadGame = loadGame; function exportPlayer() { return { Name: WorldState.player.getName(), PlayerChanges: WorldState.player.getChanges(), Parts: exportThings(WorldState.player.getParts()) }; } function exportThings(arr, changedOnly) { let obj = []; for (let i = 0; i < arr.length; i++) { let thing = arr[i]; let savedThing = { Unique: thing.isUnique(), Name: thing.getName(), Changes: thing.getChanges() }; if (!changedOnly || Object.keys(savedThing.Changes).length > 0) { obj.push(savedThing); } } return obj; } SaveHandler.exportThings = exportThings; function getSaveStructure() { let variables = StoredVariable.getVariables(); let savedVariables = {}; for (let i = 0; i < variables.length; i++) { savedVariables[variables[i].id] = variables[i].exportAsObject(); } let wielded = Thing.WieldRelation.getRight(WorldState.player); let worn = Thing.WearRelation.getRight(WorldState.player); let carried = Thing.CarryRelation.getRight(WorldState.player); let saveStruc = { Variables: savedVariables, UniqueThings: exportThings(Thing.getUniques()), Wielded: exportThings(wielded), Worn: exportThings(worn), Carried: exportThings(carried), Player: exportPlayer(), Rounds: WorldState.getCurrentTurn(), Date: new Date().toLocaleString() }; console.debug("[SaveHandler] Created Save Structure", saveStruc); return saveStruc; } SaveHandler.getSaveStructure = getSaveStructure; function setSlot(slotN) { saveSlot = slotN; } SaveHandler.setSlot = setSlot; function saveToStorage() { Controls.Memory.setValue(storagePrefix + saveSlot, getSaveStructure()); } SaveHandler.saveToStorage = saveToStorage; async function loadFromStorage() { if (!erasing) { let saveStruct = (Controls.Memory.getValue(storagePrefix + saveSlot, undefined)); if (saveStruct != undefined) { loadGame(saveStruct); return await SaveHandler.AfterLoad.execute({ noun: saveStruct }); } } await CharacterCreation.rulebook.execute({}); } SaveHandler.loadFromStorage = loadFromStorage; async function loadFromFile() { PlayBegins.LOAD_FAILED = false; let promise = readFile(); let finishedAny; let realPromise = new Promise((resolve) => { finishedAny = resolve; }); let say = new Say("No save file was loaded.", Say.PARAGRAPH_BREAK, Say.CENTERED, new SayBold("Press any key to return.")); let sayElements = await Elements.CurrentTurnHandler.getSayElementsAsContent(say); Elements.CurrentTurnHandler.print(...sayElements); let nextKey = Controls.KeyHandler.getNextKey(); promise.then((file) => { Controls.KeyHandler.stopGivingNextKey(nextKey); Elements.CurrentTurnHandler.unprint(...sayElements); loadGame(getFromFile(file)); finishedAny(); }); nextKey.then((keyCode) => { PlayBegins.LOAD_FAILED = true; finishedAny(); }); await realPromise; } SaveHandler.loadFromFile = loadFromFile; function getSayForSlot(slotNumber) { let saveStruct = (Controls.Memory.getValue(storagePrefix + slotNumber, undefined)); if (saveStruct == undefined) { return new Say("New Game"); } else { let erasingText = erasing ? "(ERASE) - " : ""; return new Say(erasingText, saveStruct.Player.Name + " - Turns: " + saveStruct.Rounds + " - Last Played: " + saveStruct.Date); } } SaveHandler.getSayForSlot = getSayForSlot; function getFromFile(saveText) { return JSON.parse(decodeURIComponent(atob(saveText))); } SaveHandler.getFromFile = getFromFile; function saveToFile() { download(saveName + "." + saveExtension, btoa(unescape(encodeURIComponent((JSON.stringify(getSaveStructure())))))); } SaveHandler.saveToFile = saveToFile; function isErasing() { return erasing; } SaveHandler.isErasing = isErasing; function toggleErasing() { erasing = !erasing; } SaveHandler.toggleErasing = toggleErasing; function isVirgin() { let was = virgin.getValue(); virgin.storeValue(false); return was; } SaveHandler.isVirgin = isVirgin; })(SaveHandler || (SaveHandler = {})); TurnSequence.rulebook.createAndAddRule({ name: "Save game to Storage", priority: Rule.PRIORITY_LOWEST, firstPriority: Rule.PRIORITY_LOWEST, code: () => { SaveHandler.saveToStorage(); } }); class CharacterOrigin { constructor(id) { this.confirmPicked = () => { }; this.id = id; CharacterOrigin.storeOrigin(this); } static storeOrigin(origin) { CharacterOrigin.origins[origin.id] = origin; } static getOrigin(id) { return CharacterOrigin.origins[id]; } static getOrigins() { let origins = []; for (let id in CharacterOrigin.origins) { origins.push(CharacterOrigin.origins[id]); } origins.sort((a, b) => { let na = a.name.toUpperCase(); let nb = b.name.toUpperCase(); if (na < nb) return -1; if (na > nb) return 1; return 0; }); return origins; } } CharacterOrigin.origins = {}; var CharacterCreation; (function (CharacterCreation) { CharacterCreation.ChampionOrigin = new CharacterOrigin("Champion"); CharacterCreation.ChampionOrigin.name = "Champion"; CharacterCreation.ChampionOrigin.description = "You were born in the small village of Southwood in the post-Tower world. Chosen by the village elder, you were trained relentlessly as soon as you became able to walk. Your mission: get to the Tower and find a way to destroy it. Unbeknownst to you, this is little more than a sacrifice ritual and you are just it's latest victim. The village doesn't actually expect you to succeed, you are merely a gift to the Tower, so that it will not destroy Southwood."; CharacterCreation.ChampionOrigin.bonusStats = "This origin grants a +1 Bonus to every attribute, but you will be stuck with some perks gained through your training."; CharacterCreation.ChampionOrigin.confirmPicked = () => { let player = WorldState.player; function increaseStat(attr) { player.setStat(attr, player.getStat(attr) + 1); } increaseStat(Attributes.Strength); increaseStat(Attributes.Charm); increaseStat(Attributes.Agility); increaseStat(Attributes.Intelligence); }; })(CharacterCreation || (CharacterCreation = {})); var CharacterCreation; (function (CharacterCreation) { CharacterCreation.PlayerOrigin = new StoredVariable({ id: "Player Origin", value: CharacterCreation.ChampionOrigin.id }); function getOrigin() { return CharacterOrigin.getOrigin(CharacterCreation.PlayerOrigin.value); } CharacterCreation.getOrigin = getOrigin; CharacterCreation.rulebook = new Rulebook("Character Creation"); })(CharacterCreation || (CharacterCreation = {})); class Perk extends StoredVariable { constructor(id) { super({ id: "Perk_" + id, value: false }); this.forcedStatus = () => { return undefined; }; this.description = "Undefined"; this.confirmPicked = () => { }; this.name = id; Perk.storePerk(this); } isEnabled(valueOnly) { if (valueOnly != true) { let forced = this.forcedStatus(this); if (forced != undefined) { return forced; } } return this.value; } isForced() { return this.forcedStatus(this) != undefined; } getDescription() { if (typeof this.description == "function") { return this.description(this); } else { return this.description; } } static storePerk(perk) { Perk.perks[perk.id] = perk; } static getPerk(id) { return Perk.perks[id]; } static getPerks() { let perks = []; for (let id in Perk.perks) { perks.push(Perk.perks[id]); } perks.sort((a, b) => { let na = a.name.toUpperCase(); let nb = b.name.toUpperCase(); if (na < nb) return -1; if (na > nb) return 1; return 0; }); return perks; } static updatePerks() { for (let id in Perk.perks) { let perk = Perk.perks[id]; if (perk.isForced()) { perk.value = perk.forcedStatus(perk); } } } } Perk.perks = {}; class OneOf { constructor(randomMode, ...poss) { this.possibilities = []; this.cyclingOrder = 0; this.randomMode = randomMode; this.possibilities = poss; if (this.randomMode == OneOf.ROTATING_RANDOM) { this.availablePossibilites = this.possibilities.slice(); } } getOne() { if (this.randomMode == OneOf.PURELY_AT_RANDOM) { return this.possibilities[Math.floor(Math.random() * this.possibilities.length)]; } else if (this.randomMode == OneOf.ROTATING_RANDOM) { if (this.availablePossibilites.length < 1) { this.availablePossibilites = this.possibilities.slice(); } return this.availablePossibilites.splice(Math.floor(Math.random() * this.availablePossibilites.length), 1)[0]; } else if (this.randomMode == OneOf.CYCLING) { var r = this.possibilities[this.cyclingOrder++]; if (this.cyclingOrder > this.possibilities.length) { this.cyclingOrder = 0; } return r; } } } OneOf.PURELY_AT_RANDOM = 0; OneOf.ROTATING_RANDOM = 1; OneOf.CYCLING = 2; var MachineBegins; (function (MachineBegins) { MachineBegins.rulebook = new Rulebook("Machine Begins"); function execute() { MachineBegins.rulebook.execute({}); } MachineBegins.execute = execute; })(MachineBegins || (MachineBegins = {})); document.addEventListener("DOMContentLoaded", () => { MachineBegins.execute(); }); var Elements; (function (Elements) { Elements.animationTime = 1000; Elements.isMobile = /Mobi/i.test(navigator.userAgent); Elements.screenWidth = document.body.clientWidth; Elements.screenHeight = document.body.clientHeight; function getLinkElements(image) { if (Elements.CurrentTurnHandler == undefined) return []; if (Elements.CurrentTurnHandler.isTurn() || image) { return [Elements.CurrentTurnHandler.currentTurnTab]; } else { return [Elements.HyperlinkHandler.linkedActionsTab, Elements.RoomHandler.currentRoomTab, Elements.HyperlinkHandler.commonActionsTab, Elements.CurrentTurnHandler.currentTurnTab, Elements.RoomHandler.currentRoomExits]; } } Elements.getLinkElements = getLinkElements; function updateScreenSize() { Elements.screenWidth = document.body.clientWidth; Elements.screenHeight = document.body.clientHeight; } Elements.updateScreenSize = updateScreenSize; Elements.mainPage = document.getElementById("mainPage"); function startTurn() { Elements.mainPage.classList.add("turn"); } Elements.startTurn = startTurn; function endTurn() { Elements.mainPage.classList.remove("turn"); } Elements.endTurn = endTurn; function isInTurn() { return Elements.mainPage.classList.contains("turn"); } Elements.isInTurn = isInTurn; let menuOutsideofTurn = false; let menus = 0; function startMenu() { if (!isInTurn()) { menuOutsideofTurn = true; startTurn(); } Elements.mainPage.classList.add("mainmenu"); menus++; Elements.CurrentTurnHandler.clear(); Controls.KeyHandler.reset(); } Elements.startMenu = startMenu; function endMenu() { Elements.CurrentTurnHandler.clear(); if (--menus == 0) { if (menuOutsideofTurn) { endTurn(); } resetMenus(); } } Elements.endMenu = endMenu; function resetMenus() { if (menus != 0) { console.error("A menu wasn't finished properly. Please correct the dialogue."); } menus = 0; menuOutsideofTurn = false; Elements.mainPage.classList.remove("mainmenu"); } Elements.resetMenus = resetMenus; function clearMainScreen() { Elements.CurrentTurnHandler.clear(); } Elements.clearMainScreen = clearMainScreen; let loadingScreen = document.getElementById("loadingScreen"); function stopLoading() { document.body.removeChild(loadingScreen); } Elements.stopLoading = stopLoading; async function waitForAnyKey() { let say = new Say(Say.CENTERED, new SayBold("Press any key to continue.")); let elements = await say.getHTML("p", ["content"]); Elements.CurrentTurnHandler.print(...elements); await Controls.KeyHandler.getNextKey(); Elements.CurrentTurnHandler.unprint(...elements); } Elements.waitForAnyKey = waitForAnyKey; async function waitForSpaceKey() { let say = new Say(Say.CENTERED, new SayBold("Press Space to continue.")); let elements = await say.getHTML("p", ["content"]); Elements.CurrentTurnHandler.print(...elements); let lastKey = "notSpace"; while (lastKey != "Space" && lastKey != "Click") { lastKey = (await Controls.KeyHandler.getNextKey()).evCode; } Elements.CurrentTurnHandler.unprint(...elements); } Elements.waitForSpaceKey = waitForSpaceKey; function printObeliskLogo() { let say = new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure.")); Elements.CurrentTurnHandler.printAsContent(say); } Elements.printObeliskLogo = printObeliskLogo; })(Elements || (Elements = {})); if (Elements.isMobile) { Elements.mainPage.classList.add("mobile"); } window.addEventListener("resize", function () { Elements.updateScreenSize(); }); var MachineBegins; (function (MachineBegins) { MachineBegins.HideLoadingDivRule = MachineBegins.rulebook.createAndAddRule({ name: "Hide loading div", code: runner => { Elements.stopLoading(); } }); })(MachineBegins || (MachineBegins = {})); var TurnSequence; (function (TurnSequence) { TurnSequence.LazilyFixMenus = TurnSequence.rulebook.createAndAddRule({ name: "Fix menus that were never closed because the dev is stupid", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, code: () => { Elements.resetMenus(); } }); })(TurnSequence || (TurnSequence = {})); var Controls; (function (Controls) { var KeyHandler; (function (KeyHandler) { let promiseStack = []; let promiseOriginalStack = []; function rejectPromise(promise) { promiseStack.splice(promiseStack.indexOf(promise), 1); promiseOriginalStack.splice(promiseStack.indexOf(promise), 1); } KeyHandler.rejectPromise = rejectPromise; function createKeyCode(ev) { let name = ev.key.toUpperCase(); let representation = name; let evCode = ev.code; if (ev.shiftKey) { name = "Shift + " + name; evCode = "Sh" + evCode; representation = "S" + representation; } if (ev.altKey) { name = "Alt + " + name; evCode = "Al" + evCode; representation = "A" + representation; } if (ev.ctrlKey) { name = "Control + " + name; evCode = "Ct" + evCode; representation = "C" + representation; } let keyCode = { evCode: evCode, name: name, representation: representation }; return keyCode; } KeyHandler.createKeyCode = createKeyCode; window.addEventListener("mousedown", function (event) { let keyCode = { representation: "Click", evCode: "Click", name: "Click" }; let promise = promiseStack.shift(); if (promise != undefined) { promise(keyCode); promiseOriginalStack.shift(); return; } }); window.addEventListener("keydown", function (event) { let keyCode = createKeyCode(event); let promise = promiseStack.shift(); if (promise != undefined) { promise(keyCode); promiseOriginalStack.shift(); return; } if (keyCode.evCode == KeyHandler.scrollKeyCode.getValue().evCode) { Elements.CurrentTurnHandler.scrollSpace(); return; } else if (keyCode.evCode == KeyHandler.imageKeyCode.getValue().evCode) { if (SayImage.imageViewer.style.display == "block") { SayImage.imageViewer.style.display = "none"; } else { let images = Elements.CurrentTurnHandler.currentTurnTab.getElementsByClassName("contentImage"); if (images.length > 0) { images[images.length - 1].click(); } } return; } let ele; Elements.getLinkElements().some((element) => { let keyables = element.getElementsByClassName("keyable"); for (let i = 0; i < keyables.length; i++) { if (keyables[i].dataset['shortcutcode'] == keyCode.evCode) { ele = keyables[i]; return true; } } return false; }); if (ele != undefined) { ele.click(); } }); function createKeyCodes(codes, keys, mods) { let arr = []; for (let mod = 0; mod < 4; mod++) { if (mod == 0 || mods[mod] == true) { for (let i = 0; i < codes.length; i++) { let name = keys[i]; let representation = keys[i]; let evCode = codes[i]; if (mod == 1) { name = "Shift + " + name; evCode = "Sh" + evCode; representation = "S" + representation; } if (mod == 2) { name = "Alt + " + name; evCode = "Al" + evCode; representation = "A" + representation; } if (mod == 3) { name = "Control + " + name; evCode = "Ct" + evCode; representation = "C" + representation; } let keyCode = { evCode: evCode, representation: representation, name: name }; arr.push(keyCode); } } } return arr; } KeyHandler.createKeyCodes = createKeyCodes; KeyHandler.scrollKeyCode = new StoredMemory("scrollKeyCode", { evCode: "Space", representation: "Space" }); KeyHandler.imageKeyCode = new StoredMemory("imageKeyCode", { evCode: "KeyI", representation: "I" }); KeyHandler.keyCodes1 = new StoredMemory("keyCodesRoom", createKeyCodes(["Digit1", "Digit2", "Digit3", "Digit4", "Digit5"], ["1", "2", "3", "4", "5"], [true, true, true, true])); KeyHandler.keyCodes2 = new StoredMemory("keyCodesActions", createKeyCodes(["KeyQ", "KeyW", "KeyE", "KeyR", "KeyT"], ["Q", "W", "E", "R", "T"], [true, true, true, true])); KeyHandler.keyCodes3 = new StoredMemory("keyCodesGlobal", createKeyCodes(["KeyF", "KeyV", "KeyG", "KeyB"], ["F", "V", "G", "B"], [true, true, true, true])); KeyHandler.keyCodeNorth = new StoredMemory("keyCodeNorth", { evCode: "KeyS", representation: "S" }); KeyHandler.keyCodeEast = new StoredMemory("keyCodeEast", { evCode: "KeyC", representation: "C" }); KeyHandler.keyCodeSouth = new StoredMemory("keyCodeSouth", { evCode: "KeyX", representation: "X" }); KeyHandler.keyCodeWest = new StoredMemory("keyCodeWest", { evCode: "KeyZ", representation: "Z" }); KeyHandler.keyCodeUp = new StoredMemory("keyCodeUp", { evCode: "KeyA", representation: "A" }); KeyHandler.keyCodeDown = new StoredMemory("keyCodeDown", { evCode: "KeyD", representation: "D" }); var directionCodeByIndex = [KeyHandler.keyCodeNorth, undefined, KeyHandler.keyCodeEast, undefined, KeyHandler.keyCodeSouth, undefined, KeyHandler.keyCodeWest, undefined, KeyHandler.keyCodeUp, KeyHandler.keyCodeDown]; function getDirectionCode(direction) { return getDirectionCodeByIndex(Room.DIRECTIONS.indexOf(direction)); } KeyHandler.getDirectionCode = getDirectionCode; function getDirectionCodeByIndex(index) { return directionCodeByIndex[index].getValue(); } KeyHandler.getDirectionCodeByIndex = getDirectionCodeByIndex; KeyHandler.available1 = []; KeyHandler.available2 = []; KeyHandler.available3 = []; function reset() { KeyHandler.available1 = KeyHandler.keyCodes1.getValue().slice(); KeyHandler.available2 = KeyHandler.keyCodes2.getValue().slice(); KeyHandler.available3 = KeyHandler.keyCodes3.getValue().slice(); } KeyHandler.reset = reset; let showKeys = new StoredMemory("ShowKeys", !Elements.isMobile); function applyCode(element, code) { if (code == undefined) { delete (element.dataset['shortcut']); delete (element.dataset['shortcutcode']); element.classList.remove("keyable"); } else { element.dataset['shortcutcode'] = code.evCode; if (showKeys.getValue()) { element.dataset['shortcut'] = code.representation; } element.classList.add("keyable"); } } KeyHandler.applyCode = applyCode; function getFirstKeyCode() { let chosen = KeyHandler.available1.length > 0 ? KeyHandler.available1 : KeyHandler.available2.length > 0 ? KeyHandler.available2 : KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined; if (chosen != undefined) { return chosen.shift(); } return undefined; } KeyHandler.getFirstKeyCode = getFirstKeyCode; function getSecondKeyCode() { let chosen = KeyHandler.available2.length > 0 ? KeyHandler.available2 : KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined; if (chosen != undefined) { return chosen.splice(0, 1)[0]; } return undefined; } KeyHandler.getSecondKeyCode = getSecondKeyCode; function getThirdKeyCode() { let chosen = KeyHandler.available3.length > 0 ? KeyHandler.available3 : undefined; if (chosen != undefined) { return chosen.splice(0, 1)[0]; } return undefined; } KeyHandler.getThirdKeyCode = getThirdKeyCode; function getNextKey(timeout) { let timeoutNumber; let promise = (new Promise((resolve, reject) => { promiseStack.push(resolve); if (timeout != undefined) { timeoutNumber = setTimeout(() => { KeyHandler.rejectPromise(resolve); reject(); }, timeout * 1000); } })); promise.then(() => { clearTimeout(timeoutNumber); }); return promise; } KeyHandler.getNextKey = getNextKey; function stopGivingNextKey(originalPromise) { let index = promiseOriginalStack.indexOf(originalPromise); if (index != -1) { rejectPromise(promiseStack[index]); } } KeyHandler.stopGivingNextKey = stopGivingNextKey; })(KeyHandler = Controls.KeyHandler || (Controls.KeyHandler = {})); })(Controls || (Controls = {})); class SayImage { constructor(imgName) { this.imgName = imgName; if (!SayImage.loadTimeCheck && SayImage.imageNames.indexOf(this) == -1) { SayImage.imageNames.push(this); } } isImageDefined() { try { for (var i = 0; i < document.styleSheets.length; i++) { var rules = document.styleSheets[i]['rules'] || document.styleSheets[i]['cssRules']; for (var x in rules) { if (typeof rules[x].selectorText == 'string' && rules[x].selectorText == "." + this.imgName) { return true; } } } return false; } catch (e) { console.warn("Can't check for undefined images."); return true; } } getImageElement() { let img = document.createElement("div"); if (this.isImageDefined()) { img.classList.add(this.imgName); img.classList.add("contentImage"); } else { img.classList.add("error"); img.appendChild(document.createTextNode("Image \"" + this.imgName + "\" not found.")); } img.addEventListener("click", () => { SayImage.showInViewer(this); }); Controls.KeyHandler.applyCode(img, Controls.KeyHandler.imageKeyCode.getValue()); return img; } getPrintedElement() { return [this.getImageElement()]; } static doLoadTimeCheck() { for (let i = 0; i < SayImage.imageNames.length; i++) { let image = SayImage.imageNames[i]; if (!image.isImageDefined()) { if (Settings.hardDebug) { Elements.CurrentTurnHandler.printAsError("Image \"" + image.imgName + "\" was not found."); } console.error("Image \"" + image.imgName + "\" was not found."); } } SayImage.loadTimeCheck = true; } static showInViewer(image) { if (!(SayImage.imageViewer.style.display == 'block')) { SayImage.imageViewer.addEventListener("click", () => { SayImage.imageViewer.style.display = "none"; }); SayImage.imageViewer.className = image.imgName; SayImage.imageViewer.style.display = "block"; } else { SayImage.imageViewer.style.display = "none"; } } } SayImage.imageNames = []; SayImage.loadTimeCheck = false; SayImage.imageViewer = document.getElementById("imageViewer"); var MachineBegins; (function (MachineBegins) { MachineBegins.ImageLoadTimeCheck = MachineBegins.rulebook.createAndAddRule({ firstPriority: Rule.PRIORITY_HIGHEST, name: "Check for undefined images", code: () => { try { SayImage.doLoadTimeCheck(); } catch (e) { console.warn("Can't check for undefined images."); } } }); })(MachineBegins || (MachineBegins = {})); class SayableObject { } class Say { constructor(...objs) { this.sequence = []; this.skipbreaks = false; this.centered = false; this.add(...objs); } add(...objs) { this.sequence.push(...objs); } remove(...objs) { for (let i = 0; i < objs.length; i++) { let index = this.sequence.indexOf(objs[i]); if (index >= 0) { this.sequence.splice(index, 1); } } } isEmpty() { return this.sequence.length < 1; } async getTextOf(index, seq) { let elements = await this.getElementFor(index, seq); let div = document.createElement("div"); for (let i = 0; i < elements.length; i++) { if (typeof elements[i] != "number") { div.appendChild(elements[i]); } } return div.innerText; } doLineBreak() { if (this.currentParagraph.length > 0 && !this.skipbreaks) { let br = document.createElement("br"); br.classList.add("linebreak"); let ti = document.createElement("span"); ti.classList.add("textIndenter"); this.currentParagraph.push(br, ti); } } doParagraphBreak() { if (this.currentParagraph.length > 0 && !this.skipbreaks) { this.paragraphs.push(this.currentParagraph); this.currentParagraph = []; } } async getParagraphs() { this.paragraphs = []; this.currentParagraph = []; this.skipbreaks = false; for (this.sequenceRunner = 0; this.sequenceRunner < this.sequence.length; this.sequenceRunner++) { let seq = this.sequence[this.sequenceRunner]; if (seq instanceof OneOf) { seq = seq.getOne(); } if (seq == Say.CENTERED) { this.setCentered(true); } else if (seq == Say.b) { let boldObjects = []; for (let i = this.sequenceRunner + 1; i < this.sequence.length; i++) { let candidate = this.sequenceRunner[i]; if (candidate == Say.b) { this.sequence.splice(i, 1); break; } else { boldObjects.push(this.sequence.splice(i, 1)); } } if (boldObjects.length > 0) { let bold = new SayBold(...boldObjects); this.sequence.splice(this.sequenceRunner + 1, 0, bold); } } else if (seq == Say.COCK) { if (HumanoidPenis != undefined) { let cock = HumanoidPenis.getSynonym(); this.currentParagraph.push(document.createTextNode(cock)); } } else if (seq == Say.PUSSY) { if (HumanoidVagina != undefined) { let vagina = HumanoidVagina.getSynonym(); this.currentParagraph.push(document.createTextNode(vagina)); } } else if (seq == Say.LINE_BREAK) { this.doLineBreak(); } else if (seq == Say.PARAGRAPH_BREAK) { this.doParagraphBreak(); } else if (seq == Say.RUN_PARAGRAPH) { this.skipbreaks = true; } else if (seq == Say.RUN_PARAGRAPH_OFF) { this.skipbreaks = false; } else if (typeof seq == "function") { let fObj = seq(this); if (Array.isArray(fObj)) { for (let k = fObj.length - 1; k >= 0; k--) { this.sequence.splice(this.sequenceRunner + 1, 0, fObj[k]); } } else if (fObj != undefined) { this.sequence.splice(this.sequenceRunner + 1, 0, fObj); } this.sequence.splice(this.sequenceRunner, 1); this.sequenceRunner--; } else if (seq.constructor == this.constructor) { for (let k = seq.sequence.length - 1; k >= 0; k--) { this.sequence.splice(this.sequenceRunner + 1, 0, seq.sequence[k]); } this.sequence.splice(this.sequenceRunner, 1); this.sequenceRunner--; } else if (seq != undefined) { let elements = await this.getElementFor(this.sequenceRunner, seq); for (let i = 0; i < elements.length; i++) { if (elements[i] === Say.DO_LINE_BREAK) { this.doLineBreak(); } else if (elements[i] === Say.DO_PARAGRAPH_BREAK) { this.doParagraphBreak(); } else { this.currentParagraph.push(elements[i]); } } } } if (this.currentParagraph.length > 0) { this.paragraphs.push(this.currentParagraph); } return this.paragraphs; } async getElementFor(index, obj) { if (obj instanceof Promise) { obj = await obj; } if (typeof obj == "string" || obj instanceof String) { return [document.createTextNode(obj)]; } else if (typeof obj == "number" || obj instanceof Number) { return [document.createTextNode((parseFloat(obj.toFixed(2)) / 1).toString())]; } else if (typeof obj == "function") { let elements = await this.getElementFor(-1, obj(this)); return elements; } else if (obj instanceof SayImage) { return [obj.getImageElement()]; } else if (obj instanceof SayLeftRight) { return (await obj.getPureElements()); } else if (obj instanceof Say) { let elements = await obj.getPureElements(this); return elements; } else if (this.isProperElement(obj)) { return [obj]; } else if (obj instanceof Object) { let elements = await this.printName(obj); return elements; } } async getPureElements(say) { let paragraphs = await this.getParagraphs(); return paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs); } setCentered(bool) { this.centered = bool; } async getHTML(tagName, classList, singleParagraph) { let paragraphs = await this.getParagraphs(); if (singleParagraph == true && paragraphs.length > 1) { paragraphs = [Array.prototype.concat.apply([], paragraphs)]; } let elements = []; for (let i = 0, paragraph = paragraphs[i]; paragraph != undefined; paragraph = paragraphs[++i]) { let parent = document.createElement(tagName); if (classList.length > 0) { parent.classList.add(...classList); } for (let k = 0, ele = paragraph[k]; ele != undefined; ele = paragraph[++k]) { parent.appendChild(ele); } elements.push(parent); if (this.centered) { parent.classList.add("centered"); } } return elements; } getHTMLContent() { return this.getHTML("p", ["content"]); } isProperElement(o) { return (typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string") || (typeof HTMLElement === "object" ? o instanceof HTMLElement : o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string"); } async printName(thing) { this.currentNoun = thing; this.currentNounElements = []; let before = Say.beforePrinting.execute({ noun: this }); await before; let print = Say.printing.execute({ noun: this }); await print; let after = Say.afterPrinting.execute({ noun: this }); await after; return this.currentNounElements; } static hisHersIts(target, startOfSentence) { return new SayHisHersIts(target); } } Say.LINE_BREAK = new SayableObject(); Say.PARAGRAPH_BREAK = new SayableObject(); Say.RUN_PARAGRAPH = new SayableObject(); Say.RUN_PARAGRAPH_OFF = new SayableObject(); Say.CENTERED = new SayableObject(); Say.b = new SayableObject(); Say.DO_PARAGRAPH_BREAK = new SayableObject(); Say.DO_LINE_BREAK = new SayableObject(); Say.COCK = new SayableObject(); Say.PUSSY = new SayableObject(); Say.beforePrinting = new Rulebook("Before printing the name of something"); Say.printing = new Rulebook("Printing the name of something"); Say.afterPrinting = new Rulebook("After printing the name of something"); Say.printing.addRule(new Rule({ name: "Printing the name of a Printable Element", firstPriority: Rule.PRIORITY_LOW, code: (rulebook) => { let say = rulebook.noun; if (say.currentNoun.getPrintedElement) { say.currentNounElements.push(...say.currentNoun.getPrintedElement()); return true; } } })); Say.printing.addRule(new Rule({ name: "Printing the name of a Printable", firstPriority: Rule.PRIORITY_LOW, code: (rulebook) => { let say = rulebook.noun; if (say.currentNoun.getPrintedName) { let thingEle = document.createTextNode(say.currentNoun.getPrintedName()); say.currentNounElements.push(thingEle); return true; } } })); Say.printing.addRule(new Rule({ name: "Printing the name of an unknown object", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, code: (rulebook) => { let say = rulebook.noun; if (say.currentNoun.getPrintedName) { say.currentNounElements.push((document.createTextNode(say.currentNoun.toString()))); return true; } } })); var CharacterCreation; (function (CharacterCreation) { CharacterCreation.FalselyAccused = new CharacterOrigin("Falsely Accused"); CharacterCreation.FalselyAccused.name = "Falsely Accused"; CharacterCreation.FalselyAccused.description = new Say("You made some allegations against a powerful man in your village. Whether those were true or not didn't matter, he was most displeased with your actions and did all he could to end your life as you knew it. Just as you were about to be executed for your inexistent crimes, the man asked for mercy. You thought he wasn't willing to go this far with his lies, only to have your hopes crushed when you noticed a smirk in his evil face.\n", Say.PARAGRAPH_BREAK, "The man claimed he wanted to forgive you, but would need proof of your regret. You received an alternative sentence: go to the Tower and find a way to destroy it. Surely an impossible task. Surely just another death sentence... or worse. But it's not like you have a choice in the matter."); CharacterCreation.FalselyAccused.bonusStats = "This origin confers no bonuses, but you have complete freedom with your perks."; })(CharacterCreation || (CharacterCreation = {})); var CharacterCreation; (function (CharacterCreation) { CharacterCreation.HornyVirgin = new Perk("Horny Virgin"); CharacterCreation.HornyVirgin.description = new Say("Whichever life you led up to this point never allowed you to explore your sexuality. As a result, you're both virgin AND extremely horny. This perk makes it so that the World Depravity around the Tower is initially higher and rises faster, however you are not as affected by this rising Depravity around you.", Say.PARAGRAPH_BREAK, "This perk is mandatory for Champions and is not compatible with most sex-related perks."); CharacterCreation.HornyVirgin.forcedStatus = (hornyVirgin) => { if (CharacterCreation.getOrigin() == CharacterCreation.ChampionOrigin) { return true; } else if (CharacterCreation.Slut.isEnabled(true)) { return false; } }; CharacterCreation.Slut = new Perk("Unredeemable Slut"); CharacterCreation.Slut.description = new Say("Simply put: you really like sex. Your Depravity starts off higher and rises even faster, also affecting World Depravity. However, you level up sex-related Skills faster.", Say.PARAGRAPH_BREAK, "This perk is not compatible with ", CharacterCreation.HornyVirgin.name, "."); CharacterCreation.Slut.forcedStatus = () => { if (CharacterCreation.HornyVirgin.isEnabled(true)) { return false; } }; CharacterCreation.SensitiveHoles = new Perk("Sensitive Holes"); CharacterCreation.SensitiveHoles.description = "You are very sensitive to any kind of receptive penetration. You have a harder time escaping grapples while being penetrated and an easier time orgasming from it, but getting aroused faster also means you take less damage from it."; })(CharacterCreation || (CharacterCreation = {})); var ContentHandler; (function (ContentHandler) { let contentHash = {}; let contentArray = []; function registerContentType(type) { if (contentHash[type.getId()] != undefined) { console.error("[ContentHandler} Can't register the content.", type, "Old:", contentHash[type.getId()]); return; } else { contentHash[type.getId()] = type; contentArray.push(type); } } ContentHandler.registerContentType = registerContentType; function getContentTypes() { return contentArray.slice(); } ContentHandler.getContentTypes = getContentTypes; })(ContentHandler || (ContentHandler = {})); class ContentType extends StoredMemory { constructor(options) { super(ContentType.memoryPrefix + options.id, options.defaultValue); this.valueDescription = () => { return new Say(JSON.stringify(this.getValue())); }; this.changeable = true; this.description = options.description instanceof Say ? options.description : new Say(options.description); this.valueDescription = options.currentValueDescription == undefined ? this.valueDescription : options.currentValueDescription; if (options.changeable == false) { this.storeValue(options.defaultValue); this.changeable = false; } ContentHandler.registerContentType(this); } getDescription() { return this.description; } getValueDescription() { let desc = this.valueDescription(this); if (desc instanceof Say) { return desc; } else { return new Say(desc); } } toggle() { if (this.changeable) { this.storeValue(!this.getValue()); } } isAllowed() { return this.getValue(); } } ContentType.memoryPrefix = "ct_"; ContentType.MM = new ContentType({ changeable: false, description: "Homosexual (M/M) sexual events", id: "MM", defaultValue: true }); ContentType.FF = new ContentType({ changeable: false, description: "Homosexual (F/F) sexual events", id: "FF", defaultValue: true }); ContentType.MF = new ContentType({ changeable: false, description: "Heterosexual (M/F) sexual events", id: "MF", defaultValue: true }); ContentType.Beast = new ContentType({ changeable: true, description: "Sexual events with either monsters or magical beasts. MM/MF/FF take precedence over this one if blocked. Sufficiently human creatures do not get counted into this.", id: "Beast", defaultValue: true }); ContentType.Scat = new ContentType({ changeable: false, description: "Scatologic sexual events", id: "Scat", defaultValue: false }); ContentType.Pee = new ContentType({ changeable: false, description: "Sexual events with urine", id: "Urophilia", defaultValue: false }); var Elements; (function (Elements) { var CurrentTurnHandler; (function (CurrentTurnHandler) { CurrentTurnHandler.currentTurnTab = document.getElementById("currentTurnTab"); CurrentTurnHandler.currentTurn = document.getElementById("currentTurn"); CurrentTurnHandler.turnHr = document.createElement("p"); CurrentTurnHandler.lastReadOffset = CurrentTurnHandler.currentTurnTab.clientHeight / 2; CurrentTurnHandler.turnHr.classList.add("turnStart"); CurrentTurnHandler.turnHr.appendChild(document.createTextNode("Start of Turn")); function startTurn(action) { let oldContent = CurrentTurnHandler.currentTurnTab.getElementsByClassName("content"); for (let i = 0; i < oldContent.length; i++) { oldContent[i].classList.add("contentOld"); oldContent[i].classList.remove("content"); } CurrentTurnHandler.currentTurnTab.appendChild(CurrentTurnHandler.turnHr); Elements.startTurn(); scrollToNewTurn(); } CurrentTurnHandler.startTurn = startTurn; function isTurn() { return Elements.isInTurn(); } CurrentTurnHandler.isTurn = isTurn; function endTurn() { Elements.endTurn(); } CurrentTurnHandler.endTurn = endTurn; function getSayElementsAsContent(say) { return say.getHTML("p", ["content"]); } CurrentTurnHandler.getSayElementsAsContent = getSayElementsAsContent; function printAsContent(say) { let node = getMarker(); getSayElementsAsContent(say).then(value => { insertBefore(value, node); unprint(node); }); } CurrentTurnHandler.printAsContent = printAsContent; function simplePrint(...sayValues) { printAsContent(new Say(...sayValues)); } CurrentTurnHandler.simplePrint = simplePrint; function printAsError(msg) { if (msg instanceof Say) { msg.getHTML("div", ["error"], true).then(value => { print(...value); }); } else { let div = document.createElement("div"); div.classList.add("error"); div.appendChild(document.createTextNode(msg)); print(div); } } CurrentTurnHandler.printAsError = printAsError; function clear() { while (CurrentTurnHandler.currentTurnTab.firstChild != undefined) { CurrentTurnHandler.currentTurnTab.removeChild(CurrentTurnHandler.currentTurnTab.firstChild); } Controls.KeyHandler.reset(); } CurrentTurnHandler.clear = clear; function print(...elements) { if (elements.length > 0) { elements.forEach((element) => { CurrentTurnHandler.currentTurnTab.appendChild(element); }); scrollTo(CurrentTurnHandler.lastReadOffset); } } CurrentTurnHandler.print = print; function getMarker() { let node = document.createTextNode(""); CurrentTurnHandler.currentTurnTab.appendChild(node); return node; } CurrentTurnHandler.getMarker = getMarker; function insertBefore(newChilds, oldChild) { newChilds.forEach((newChild) => { CurrentTurnHandler.currentTurnTab.insertBefore(newChild, oldChild); }); scrollTo(CurrentTurnHandler.lastReadOffset); } CurrentTurnHandler.insertBefore = insertBefore; function unprint(...elements) { elements.forEach((element) => { if (element.parentElement == CurrentTurnHandler.currentTurnTab) { CurrentTurnHandler.currentTurnTab.removeChild(element); } }); } CurrentTurnHandler.unprint = unprint; function scrollToNewTurn() { let target = CurrentTurnHandler.turnHr.offsetTop + CurrentTurnHandler.turnHr.offsetHeight; CurrentTurnHandler.lastReadOffset = target; if (target < CurrentTurnHandler.currentTurn.scrollTop) { return; } scrollTo(target); } CurrentTurnHandler.scrollToNewTurn = scrollToNewTurn; function scrollToBottom() { scrollTo(CurrentTurnHandler.currentTurn.scrollHeight - CurrentTurnHandler.currentTurn.clientHeight); } CurrentTurnHandler.scrollToBottom = scrollToBottom; function scrollSpace() { scrollTo(CurrentTurnHandler.currentTurn.scrollTop + (CurrentTurnHandler.currentTurn.clientHeight / 2)); } CurrentTurnHandler.scrollSpace = scrollSpace; CurrentTurnHandler.currentTurn.addEventListener("scroll", () => { let currentRead = CurrentTurnHandler.currentTurn.scrollTop + CurrentTurnHandler.currentTurn.clientHeight; if (currentRead > CurrentTurnHandler.lastReadOffset) { CurrentTurnHandler.lastReadOffset = currentRead; } }); var startOffset; var targetOffset; var startTime; var finishTime; var totalTime; var animationRequest; function scrollTo(offset) { if (offset <= CurrentTurnHandler.lastReadOffset) { startOffset = CurrentTurnHandler.currentTurn.scrollTop; targetOffset = offset; startTime = new Date().getTime(); finishTime = startTime + Elements.animationTime; totalTime = finishTime - startTime; startScrolling(); } } CurrentTurnHandler.scrollTo = scrollTo; function startScrolling() { if (animationRequest == undefined) { animationRequest = requestAnimationFrame(CurrentTurnHandler.updateFrame); } } CurrentTurnHandler.startScrolling = startScrolling; CurrentTurnHandler.updateFrame = () => { animationRequest = undefined; let movingOffset = (targetOffset - startOffset); let timePassed = new Date().getTime() - startTime; let idealOffset = movingOffset * (timePassed / totalTime); let maxScroll = CurrentTurnHandler.currentTurn.scrollHeight - CurrentTurnHandler.currentTurn.clientHeight; CurrentTurnHandler.currentTurn.scrollTop = startOffset + idealOffset; if (CurrentTurnHandler.currentTurn.scrollTop < targetOffset && CurrentTurnHandler.currentTurn.scrollTop < maxScroll) { startScrolling(); } }; })(CurrentTurnHandler = Elements.CurrentTurnHandler || (Elements.CurrentTurnHandler = {})); })(Elements || (Elements = {})); var Controls; (function (Controls) { var Links; (function (Links) { function makeCustomLink(element, options) { if (options.mouseover != undefined && options.mouseout != undefined) { element.addEventListener("mouseover", options.mouseover); element.addEventListener("mouseout", options.mouseout); } element.addEventListener("click", options.click); } Links.makeCustomLink = makeCustomLink; function makeLink(element, action) { makeCustomLink(element, { mouseover: () => { Elements.HyperlinkHandler.hoverAction(action); }, mouseout: () => { Elements.HyperlinkHandler.unhoverAction(); }, click: (e) => { TurnSequence.execute(action); Elements.HyperlinkHandler.unhoverAction(); e.stopPropagation(); e.preventDefault(); } }); } Links.makeLink = makeLink; })(Links = Controls.Links || (Controls.Links = {})); })(Controls || (Controls = {})); class RoomNode { constructor(room) { this.mainDiv = document.createElement("div"); this.room = room; this.mainDiv.classList.add("mapRoom"); if (room != undefined) { this.mainDiv.classList.add("linked", room.getBackgroundClass()); Room.DIRECTIONS.forEach((direction) => { if (room.connections[direction] != undefined) { let directionDiv = document.createElement("div"); directionDiv.classList.add("mapRoomConnection" + DirectionNames[Direction[direction]]); this.mainDiv.appendChild(directionDiv); } }); Controls.Links.makeLink(this.mainDiv, new ActionGo(WorldState.player, room)); } } async createRoomNameFloater() { if (this.room != undefined) { let roomName = document.createElement("div"); let sayName = new Say(this.room); await sayName.getPureElements().then(value => { value.forEach(element => { roomName.appendChild(element); }); Elements.HoverInfo.makeHoverable(this.mainDiv, value); }); } } async update() { if (this.room != undefined) { if (WorldState.player.getRoom() == this.room) { this.mainDiv.classList.add("current"); } else { this.mainDiv.classList.remove("current"); } let isRemembered = await WorldState.isRoomRemembered(this.room); if (!isRemembered) { this.mainDiv.classList.add("unknown"); } else { this.mainDiv.classList.remove("unknown"); } } } getElement() { return this.mainDiv; } } class SayAn extends Say { constructor(autoUppercase) { super(); this.node = document.createTextNode("a "); this.uppercase = true; if (autoUppercase != undefined) { this.uppercase = autoUppercase; } } async getPureElements(say) { let next = say.sequence[say.sequenceRunner + 1]; if (next == undefined || (next instanceof Thing && next.properlyNamed)) { this.node.nodeValue = ""; } else { let aan = AvsAn.query((await say.getTextOf(say.sequenceRunner + 1, next)).trim()); if (aan.prefix != "") { this.node.nodeValue = aan.article + " "; } if (this.uppercase && say.currentParagraph.length == 0) { this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase() + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1); } this.node.nodeValue = this.node.nodeValue + " "; } return [this.node]; } } var AvsAn = (function () { var dict = "p3ezz;4wrlg;2h;#2rg;22;2;a;7;;if;z;;&4h;1c;1;N;6;;*yp;6a;4;a2;q;;e1;q;;i1;h;;o;7;;/op;5n;9;a3;i;;e5;h;;h;;1;o5;;;i;r;;l;;1;/;6;;n;;1;o6;;;o1;a;;r;;1;e7;;;s;;1;/2;j;;09pa;y3;1;8e;10;;17qoq;qmm;2;12hp;7nw;a;0o4;45;1;0n;2w;;15r;1n;2;8;7;;9;5;;28s;x;;34q;z;1;7;5;;45n;n;;598;w;;65k;u;;74j;y;;850;y;;93x;g;;81ux;hgk;a;0zb;el;a;0p;4h;;11;16;;21;10;;32;15;;4;18;;54;v;;6;12;;7;s;;8;v;;9;17;;11k;bq;1; v;2;;229;f3;2; 1a;3;;–5;;;31x;jc;1; 12;2;;41w;kq;2; z;4;;–5;;;559;sp;5; 2k;1;;,h;;;h7;;;kd;;;m6;;;62p;rm;2; 1b;5;;k5;;;72n;y6;2; 14;;;–5;;;82r;192;2; 19;4;;,5;;;93i;1ig;2; 10;4;;–5;;;8ys;nsu;;= n[1] ? "a" : "an" }; dict = dict.substr(1 + a.join(';').length); for (var i = 0; i < n[2]; i++) dict = fill(prefix + dict[0], node[dict[0]] = {}, dict.substr(1)); return dict; } fill("", root, dict); return { raw: root, query: function (word) { var node = root, sI = 0, result, c; do { c = word[sI++]; } while ('"‘’“”$\'-('.indexOf(c) >= 0); while (1) { result = node.data || result; node = node[c]; if (!node) return result; c = word[sI++] || " "; } } }; })(); class SayBold extends Say { async getPureElements() { let paragraphs = await this.getParagraphs(); let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs); let b = document.createElement("b"); elements.forEach((element) => { b.appendChild(element); }); return [b]; } } class SayHeSheIt extends Say { constructor(target, autoUppercase) { super(); this.node = document.createTextNode("a "); this.uppercase = true; this.target = target; if (autoUppercase != undefined) { this.uppercase = autoUppercase; } } async getPureElements(say) { let next = this.target; if (next == undefined) { this.node.nodeValue = ""; } else { if (next instanceof Humanoid) { let gender = next.getGenderValue(); if (gender.genderValueCorrected > 65) { this.node.nodeValue = "she "; } else if (gender.genderValueCorrected < 35) { this.node.nodeValue = "he "; } else { if (gender.hasPenisBulge || gender.hasPenis) { this.node.nodeValue = "he "; } else if (gender.hasVagina || gender.hasTits) { this.node.nodeValue = "she "; } else { this.node.nodeValue = "they "; } } } else { this.node.nodeValue = "it "; } if (this.uppercase && say.currentParagraph.length == 0) { this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase() + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1); } } return [this.node]; } } class SayHimHerIt extends Say { constructor(target, autoUppercase) { super(); this.node = document.createTextNode("a "); this.uppercase = true; this.target = target; if (autoUppercase != undefined) { this.uppercase = autoUppercase; } } async getPureElements(say) { let next = this.target; if (next == undefined) { this.node.nodeValue = ""; } else { if (next instanceof Humanoid) { let gender = next.getGenderValue(); if (gender.genderValueCorrected > 65) { this.node.nodeValue = "her "; } else if (gender.genderValueCorrected < 35) { this.node.nodeValue = "him "; } else { if (gender.hasPenisBulge || gender.hasPenis) { this.node.nodeValue = "him "; } else if (gender.hasVagina || gender.hasTits) { this.node.nodeValue = "her "; } else { this.node.nodeValue = "them "; } } } else { this.node.nodeValue = "it "; } if (this.uppercase && say.currentParagraph.length == 0) { this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase() + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1); } } return [this.node]; } } class SayHisHersIts extends Say { constructor(target, autoUppercase) { super(); this.node = document.createTextNode("a "); this.uppercase = true; this.target = target; if (autoUppercase != undefined) { this.uppercase = autoUppercase; } } async getPureElements(say) { let next = this.target; if (next == undefined) { this.node.nodeValue = ""; } else { if (next instanceof Humanoid) { let gender = next.getGenderValue(); if (gender.genderValueCorrected > 65) { this.node.nodeValue = "hers "; } else if (gender.genderValueCorrected < 35) { this.node.nodeValue = "his "; } else { if (gender.hasPenisBulge || gender.hasPenis) { this.node.nodeValue = "his "; } else if (gender.hasVagina || gender.hasTits) { this.node.nodeValue = "hers "; } else { this.node.nodeValue = "their "; } } } else { this.node.nodeValue = "its "; } if (this.uppercase && say.currentParagraph.length == 0) { this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase() + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1); } } return [this.node]; } } class SayIf extends Say { constructor(condition, ...objs) { super(...objs); this.condition = condition != undefined ? condition : () => { return true; }; } async getPureElements() { if (this.condition()) { let paragraphs = await this.getParagraphs(); return paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs); } return []; } } class SayItalic extends Say { async getPureElements() { let paragraphs = await this.getParagraphs(); let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs); let b = document.createElement("i"); elements.forEach((element) => { b.appendChild(element); }); return [b]; } } class SayLeftRight extends Say { constructor() { super(); this.left = new Say(); this.right = new Say(); } addLeft(...objs) { this.left.add(...objs); } addRight(...objs) { this.right.add(...objs); } async getPureElements() { if (this.left.sequence.length == 0) { return await this.right.getPureElements(); } else if (this.right.sequence.length == 0) { return await this.left.getPureElements(); } let mainDiv = document.createElement("div"); mainDiv.classList.add("horFlex"); let left = document.createElement("div"); left.classList.add("horFlexColumn"); mainDiv.appendChild(left); let right = document.createElement("div"); right.classList.add("horFlexColumn"); mainDiv.appendChild(right); await this.left.getPureElements().then(value => { value.forEach(element => { left.appendChild(element); }); }); await this.right.getPureElements().then(value => { value.forEach(element => { right.appendChild(element); }); }); return [mainDiv]; } } class SayLink extends Say { setAction(action) { this.linkedAction = action; } async getPureElements() { let paragraphs = await this.getParagraphs(); let elements = paragraphs.length == 1 ? paragraphs[0] : Array.prototype.concat.apply([], paragraphs); let b = document.createElement("b"); b.classList.add("textLink"); elements.forEach((element) => { b.appendChild(element); }); Controls.Links.makeLink(b, this.linkedAction); return [b]; } } class SayThe extends Say { constructor(autoUppercase, alwaysPrint) { super(); this.node = document.createTextNode(""); this.uppercase = true; this.alwaysPrint = false; if (autoUppercase != undefined) { this.uppercase = autoUppercase; } if (alwaysPrint) { this.alwaysPrint = alwaysPrint; } } async getPureElements(say) { let next = say.sequence[say.sequenceRunner + 1]; if (this.alwaysPrint) { this.node.nodeValue = "the "; } else if (next == undefined) { this.node.nodeValue = ""; } else { if (next instanceof Thing) { if (!next.properlyNamed) { this.node.nodeValue = "the "; } else { this.node.nodeValue = ""; } } else { this.node.nodeValue = ""; } } if (this.node.nodeValue != "") { if (this.uppercase && say.currentParagraph.length == 0) { this.node.nodeValue = this.node.nodeValue.charAt(0).toUpperCase() + this.node.nodeValue.substr(1, this.node.nodeValue.length - 1); } } return [this.node]; } } var Elements; (function (Elements) { var AppearanceHandler; (function (AppearanceHandler) { var target = document.getElementById("appearanceTarget"); function empty() { while (target.firstChild) { target.removeChild(target.firstChild); } } async function print(say) { await say.getHTML("p", ["appearanceDescription"]).then(value => { for (let i = 0; i < value.length; i++) { target.appendChild(value[i]); } }); } AppearanceHandler.print = print; async function updateAppearance() { empty(); let player = WorldState.player; let playerGender = player.getGenderValue(); let playerSluttiness = player.getSluttiness(); let you = new SayLink("You"); you.setAction(new ActionExamine(WorldState.player, WorldState.player)); let presentation = new Say(you, " are presenting as ", new SayAn(), player.getShortestDescription(), "."); if (playerSluttiness.naked) { presentation.add(" You are naked."); } else if (playerSluttiness.halfNaked) { presentation.add(" You are almost naked."); } let tits = Thing.PartRelation.getRightTypeOne(player, HumanoidBreasts); let penis = Thing.PartRelation.getRightTypeOne(player, HumanoidPenis); let bulges = player.getBulges(); if (bulges.breasts > 0 || playerGender.genderValueCorrected > 60) { let realTits = tits.getSizeText(); let fakeTits = HumanoidBreasts.getSizeText(bulges.breasts); presentation.add(" You have " + realTits + " breasts"); if (bulges.breasts != tits.getSize() && realTits != fakeTits) { presentation.add(", padded to appear as " + fakeTits + " through your clothing."); } else { if (!tits.isUncovered()) { presentation.add(", safely covered."); } else { presentation.add("."); } } } if (penis == undefined) { presentation.add(" You have ", new SayAn(), HumanoidPenis.getSizeText(bulges.crotch) + " crotch bulge visible through your clothing."); } else { let realDick = penis.getSizeText(); let fakeDick = HumanoidPenis.getSizeText(bulges.crotch); presentation.add(" You have ", new SayAn(), realDick + " dick"); if (penis.getActualSize() != bulges.crotch && realDick != fakeDick) { presentation.add(", which looks like it is " + fakeDick + " due to your clothing."); } else { if (!penis.isUncovered()) { presentation.add(", which is covered."); } else { presentation.add("."); } } } await print(presentation); } AppearanceHandler.updateAppearance = updateAppearance; })(AppearanceHandler = Elements.AppearanceHandler || (Elements.AppearanceHandler = {})); })(Elements || (Elements = {})); function updateFontSize() { var minWidth = Elements.isMobile ? 800 : 1280; var proportion = Elements.isMobile ? 17 : 14.5; var width = document.body.clientWidth < minWidth ? minWidth : document.body.clientWidth; document.documentElement.style["font-size"] = (width * proportion / 1280) + "px"; } updateFontSize(); window.addEventListener("resize", updateFontSize); function toggleFullScreen() { var doc = window.document; var docEl = doc.documentElement; var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen; var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen; if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { requestFullScreen.call(docEl); } else { cancelFullScreen.call(doc); } } var Elements; (function (Elements) { var HoverInfo; (function (HoverInfo) { var hoverbox = document.getElementById("hoverInfo"); var contentTarget = document.getElementById("hoverContent"); var width = 0; var height = 0; function empty() { while (contentTarget.firstChild != undefined) { contentTarget.removeChild(contentTarget.firstChild); } } function makeHoverable(element, contents) { element.addEventListener("mouseenter", (e) => { Elements.HoverInfo.hoverStart(e, contents); }); element.addEventListener("mousemove", (e) => { Elements.HoverInfo.hoverMove(e); }); element.addEventListener("mouseout", (e) => { Elements.HoverInfo.hoverEnd(); }); } HoverInfo.makeHoverable = makeHoverable; function hoverStart(e, contents) { empty(); for (let i = 0; i < contents.length; i++) { contentTarget.appendChild(contents[i]); } hoverbox.style.display = "block"; hoverbox.style.left = "0px"; hoverbox.style.top = "0px"; width = hoverbox.offsetWidth; height = hoverbox.offsetHeight; hoverMove(e); } HoverInfo.hoverStart = hoverStart; function hoverMove(e) { let left = e.clientX - (width / 2); let top = e.clientY - (height) - 6; if (top < 0) { top = e.clientY + 6; } if (left < width) { left = width; } if (left + width > Elements.screenWidth) { left = Elements.screenWidth - width; } hoverbox.style.left = Math.round(left) + "px"; hoverbox.style.top = Math.round(top) + "px"; } HoverInfo.hoverMove = hoverMove; function hoverEnd() { hoverbox.style.display = "none"; } HoverInfo.hoverEnd = hoverEnd; })(HoverInfo = Elements.HoverInfo || (Elements.HoverInfo = {})); })(Elements || (Elements = {})); var Elements; (function (Elements) { var HyperlinkHandler; (function (HyperlinkHandler) { HyperlinkHandler.linkedActionsTab = document.getElementById("linkActions"); HyperlinkHandler.commonActionsTab = document.getElementById("commonActionsTab"); var currentCommand = document.createTextNode(""); document.getElementById("currentCommand").appendChild(currentCommand); var currentActionTarget = document.createTextNode(""); document.getElementById("linkTarget").appendChild(currentActionTarget); var commonActions = []; var availableActions = []; function resetCommonActions() { commonActions.splice(0, commonActions.length); while (HyperlinkHandler.commonActionsTab.firstChild) { HyperlinkHandler.commonActionsTab.removeChild(HyperlinkHandler.commonActionsTab.firstChild); } } HyperlinkHandler.resetCommonActions = resetCommonActions; function addCommonAction(name, action) { commonActions.push([name, action]); } HyperlinkHandler.addCommonAction = addCommonAction; function resetAvailableActions() { availableActions = []; currentActionTarget.nodeValue = ""; while (HyperlinkHandler.linkedActionsTab.firstChild) { HyperlinkHandler.linkedActionsTab.removeChild(HyperlinkHandler.linkedActionsTab.firstChild); } } function addAvailableAction(name, action) { availableActions.push([name, action]); } HyperlinkHandler.addAvailableAction = addAvailableAction; function hoverAction(action) { currentCommand.nodeValue = action.getCommandText().toLowerCase(); } HyperlinkHandler.hoverAction = hoverAction; function unhoverAction() { currentCommand.nodeValue = ""; } HyperlinkHandler.unhoverAction = unhoverAction; async function hyperlinkObject(thing) { resetAvailableActions(); if (thing instanceof Thing && thing != WorldState.player && thing.isVisibleTo(WorldState.player)) { await HyperlinkHandler.HyperlinkingRulebook.execute({ noun: thing }); currentActionTarget.nodeValue = thing.getPrintedName() + ": "; for (let i = 0, value = availableActions[i]; value != undefined; value = availableActions[++i]) { let link = createLink(value); link.classList.add("columnLink"); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getSecondKeyCode()); HyperlinkHandler.linkedActionsTab.appendChild(link); } } } HyperlinkHandler.hyperlinkObject = hyperlinkObject; function createLink(value) { let link = document.createElement("a"); link.appendChild(document.createTextNode(value[0])); Controls.Links.makeLink(link, value[1]); return link; } async function hyperlinkCommonActions() { resetCommonActions(); await HyperlinkHandler.CommonActionsRulebook.execute({}); for (let i = 0, value = commonActions[i]; value != undefined; value = commonActions[++i]) { let link = createLink(value); link.classList.add("lineLink"); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getThirdKeyCode()); HyperlinkHandler.commonActionsTab.appendChild(link); } } HyperlinkHandler.hyperlinkCommonActions = hyperlinkCommonActions; HyperlinkHandler.HyperlinkingRulebook = new Rulebook("Hyperlinking something"); HyperlinkHandler.CommonActionsRulebook = new Rulebook("Common Actions Rulebook"); })(HyperlinkHandler = Elements.HyperlinkHandler || (Elements.HyperlinkHandler = {})); })(Elements || (Elements = {})); class Action { constructor(actor, ...nouns) { this.extraChecks = []; this.extraCarries = []; this.nouns = []; this.say = new Say(); this.actingAgressively = false; this.actingSubmissively = false; this.requiresTurn = true; this.requiresNoun = true; this.requiresVisibility = true; this.actor = actor; nouns.forEach((value, index, array) => { this.setNoun(index, value); }); } async execute() { this.say = new Say(); let checkRulebooks = []; let carryRulebooks = []; let cClass = this.constructor; while (cClass != Action) { if (cClass.check != undefined) { checkRulebooks.push(cClass.check); } if (cClass.carry != undefined) { carryRulebooks.push(cClass.carry); } cClass = Object.getPrototypeOf(cClass); } let result = await Action.check.execute({ noun: this }, ...checkRulebooks); if (result == false) { return; } else if (result instanceof Action) { console.debug(Rulebook.getIndentation() + "[ACTION] Instead of..."); await result.execute(); this.say.add(result.say); this.nouns = result.nouns; return; } await Action.carry.execute({ noun: this }, ...carryRulebooks); return this.say; } get actor() { return this._actor; } set actor(value) { this._actor = value; } getNoun(n) { if (this.nouns.length > n) { return this.nouns[n]; } return undefined; } setNoun(n, noun) { while (this.nouns.length < n) { this.nouns.push(undefined); } this.nouns[n] = noun; } getCommandText() { return "do"; } stop() { this.requiresTurn = false; } } Action.check = new Rulebook("Check any Action"); Action.carry = new Rulebook("Carry out any Action"); Action.check.addRule(new Rule({ name: "Check any Action - Requires Noun", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let action = rulebook.noun; if (action.getNoun(0) == undefined) { return false; } }, conditions: runner => { return runner.noun.requiresNoun; } })); Action.check.addRule(new Rule({ name: "Check any Action - Requires Visibility", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; if (!action.getNoun(0).isVisibleTo(actor)) { return false; } }, conditions: runner => { return runner.noun.requiresVisibility; } })); class ActionExamine extends Action { constructor() { super(...arguments); this.requiresTurn = false; } getCommandText() { if (this.getNoun(0) == WorldState.player) { return "examine myself"; } return "examine " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } } ActionExamine.check = new Rulebook("Check Examining"); ActionExamine.carry = new Rulebook("Carry out Examining"); ActionExamine.PrintDescriptionOfExaminedThingRule = ActionExamine.carry.createAndAddRule({ name: "Examine - Print Description of Examined Thing", code: (rulebook) => { let action = rulebook.noun; let noun = action.getNoun(0); if (noun instanceof Thing && noun.image != undefined) { action.say.add(noun.image, Say.PARAGRAPH_BREAK); } action.say.add(action.getNoun(0).getPrintedDescription()); } }); Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({ name: "Look at me!", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_HIGH, code: (rulebook) => { Elements.HyperlinkHandler.addCommonAction("Inspect", new ActionExamine(WorldState.player, WorldState.player)); } })); class RelationHandler { constructor(...relations) { relations.forEach(relation => { relation.setHandler(this); }); this.relations = relations; } addRelation(relation) { this.relations.push(relation); relation.setHandler(this); } } class Relation { setHandler(handler) { this.handler = handler; } hasHandler() { return this.handler != undefined; } static createString(obj1, obj2) { if (obj1 instanceof Object && obj2 instanceof Object) { let id1 = Relation.getId(obj1); let id2 = Relation.getId(obj2); return id1 < id2 ? (id1 + ";" + id2) : (id2 + ";" + id1); } } static getId(obj) { if (obj[Relation.objectIdField] == undefined) { obj[Relation.objectIdField] = Relation.objectCount++; } return obj[Relation.objectIdField]; } } Relation.objectCount = 0; Relation.objectIdField = "_RELATIONINTERNALID"; class RelationHandlerStrictOneToMany extends RelationHandler { setRelation(relation, left, right, value) { let parents = this.getAllLeft(left); if (parents.indexOf(right) != -1) { console.warn("[Relation] Attempt to create a circular relation:", this, left, right); return false; } this.unsetRight(right); return true; } unset(thing) { this.unsetLeft(thing); this.unsetRight(thing); } unsetLeft(left) { this.relations.forEach(relation => { relation.unsetLeft(left); }); } unsetRight(right) { this.relations.forEach(relation => { relation.unsetRight(right); }); } getLeft(right) { let result; for (let i = 0; i < this.relations.length; i++) { result = this.relations[i].getLeft(right); if (result != undefined) { return result; } } } getAllLeft(right) { let newParent = this.getLeft(right); let parents = []; while (newParent != undefined) { parents.push(newParent); newParent = this.getLeft(newParent); } return parents; } getAllLeftType(right, type) { return this.getAllLeft(right).filter(left => { return left instanceof type; }); } getLastLeft(right) { let parent = this.getLeft(right); let newParent = this.getLeft(parent); while (newParent != undefined) { parent = newParent; newParent = this.getLeft(parent); } return parent; } getAllRight(left) { let rights = []; this.relations.forEach(relation => { rights.push(...relation.getRight(left)); }); arrayUnique(rights); return rights; } getAllRightTypes(left, rightType) { return this.getAllRight(left).filter(right => { return right instanceof rightType; }); } } class RelationOneToMany extends Relation { constructor() { super(...arguments); this.valuesHash = {}; this.oneMap = new Map(); this.manyMap = new Map(); } getValue(left, right) { return this.valuesHash[Relation.createString(left, right)]; } setValue(left, right, value) { if (this.manyMap.get(right) == left) { let string = Relation.createString(left, right); if (string != undefined) { this.valuesHash[string] = value; } } } setRelation(left, right, value) { let proceed; if (this.handler != undefined) { proceed = this.handler.setRelation(this, left, right, value); } if (proceed) { this.unsetRight(left); this.unsetLeft(right); this.unsetRight(right); let string = Relation.createString(left, right); if (string != undefined) { this.valuesHash[string] = value; } this.manyMap.set(right, left); if (this.oneMap.get(left) == undefined) { this.oneMap.set(left, [right]); } else { this.oneMap.get(left).push(right); } } } getLeft(right) { return this.manyMap.get(right); } getAnyLeft() { let left = []; this.oneMap.forEach((value, key) => { left.push(key); }); arrayUnique(left); return left; } getAnyRight() { let rights = []; this.oneMap.forEach((value) => { rights.push(...value); }); arrayUnique(rights); return rights; } getAnyRightType(type) { return this.getAnyRight().filter(value => { return value instanceof type; }); } isRight(left, needle) { let right = this.oneMap.get(left); if (right != undefined) { return right.indexOf(needle) != -1; } return false; } getRight(left) { let right = this.oneMap.get(left); if (right != undefined) { return [].concat(...right); } return []; } getRightType(left, type) { return this.getRight(left).filter(right => { return right instanceof type; }); } getRightTypeOne(left, type) { let rights = this.getRightType(left, type); if (rights.length > 0) { return rights[0]; } } getRelationValue(left, right) { return this.valuesHash[Relation.createString(left, right)]; } unsetRight(right) { let left = this.manyMap.get(right); if (left != undefined) { let allRight = this.oneMap.get(left); allRight.splice(allRight.indexOf(right), 1); this.manyMap.delete(right); if (allRight.length == 0) { this.oneMap.delete(left); } let string = Relation.createString(left, right); if (string != undefined) { delete (this.valuesHash[string]); } } } unsetLeft(left) { let allRight = this.oneMap.get(left); if (allRight != undefined) { allRight.forEach((right) => { this.manyMap.delete(right); let string = Relation.createString(left, right); if (string != undefined) { delete (this.valuesHash[string]); } }); this.oneMap.delete(left); } } } class Thing { constructor(options) { this.properlyNamed = false; this.scenery = false; this.fixedInPlace = false; this.animated = false; this.visible = true; this.unique = false; this.shiny = false; this.setAlterations = []; this.getAlterations = []; this.clone = function () { throw new Error("Non-unique Objects can't be cloned."); }; options = options == undefined ? {} : options; if (options.properName != undefined) { this.name = options.properName; this.properlyNamed = true; } else if (options.name != undefined) { this.name = options.name; } else { this.name = this.constructor.name; } if (options.description != undefined) { if (options.description instanceof Say) { this.description = options.description; } else { this.description = new Say(options.description); } } if (options.unique) { Thing.storeUnique(this); this.unique = true; } else { Thing.storeNonUnique(this); this.cloneOptions = options; this.clone = (includeChanges) => { let cons = eval(this.constructor.name); let newThing = new cons(this.cloneOptions); if (includeChanges == undefined || includeChanges) { newThing.setChanges(this.getChanges()); } return newThing; }; } if (options.image != undefined) { if (options.image instanceof SayImage) { this.image = options.image; } else { this.image = new SayImage(options.image); } } this.shiny = options.shiny == true; this.addGetAlterations((thing) => { function getClosestRoom(currentRoom, rooms) { if (currentRoom instanceof RoomRandom && rooms.length > 0) { rooms.sort((a, b) => { if (!(a instanceof RoomRandom)) return -1; if (!(b instanceof RoomRandom)) return 1; let da = a.getDistanceTo(currentRoom); let db = b.getDistanceTo(currentRoom); return da - db; }); return { Location: rooms[0].getName() }; } } if (Thing.EnclosedRelation.getLeft(thing) == thing.getRoom() && thing.getRoom() != undefined) { if (thing.getRoom().fodder) { if (thing.isPlayer()) { let rooms = WorldState.getRememberedRoomsAsRooms(); let currentRoom = thing.getRoom(); return getClosestRoom(currentRoom, rooms); } else { let rooms = thing.getRoom().getConnectedRooms(); let currentRoom = thing.getRoom(); let foundRoom = getClosestRoom(currentRoom, rooms); if (foundRoom != undefined) { return foundRoom; } else { rooms = Region.InRelation.getLeft(thing.getRoom()).getRooms(); return getClosestRoom(currentRoom, rooms); } } } else { return { Location: thing.getRoom().getName() }; } } }); this.addSetAlterations((thing, changes) => { if (changes.Location != undefined) { let room = Room.getRoom(changes.Location); if (room != undefined) { room.place(thing); } else { console.error("Unable to place ", thing, " at room ", changes.Location); } } }); } addGetAlterations(newGet) { this.getAlterations.push(newGet); } addSetAlterations(newSet) { this.setAlterations.push(newSet); } getChanges() { let changes = {}; for (let i = 0; i < this.getAlterations.length; i++) { let change = this.getAlterations[i](this); for (let key in change) { changes[key] = change[key]; } } return changes; } setChanges(simpleAlterationObject) { for (let i = 0; i < this.setAlterations.length; i++) { this.setAlterations[i](this, simpleAlterationObject); } } getShiny() { return this.shiny; } setName(name) { this.name = name; } getName() { return this.name; } static storeNonUnique(thing) { if (Thing.things[thing.name] == undefined) { Thing.things[thing.name] = [thing]; } else { Thing.things[thing.name].push(thing); } } static getNonUnique(name) { return Thing.things[name] == undefined ? [] : Thing.things[name]; } static getOneThing(name) { let thing = Thing.getUnique(name); if (thing == undefined) { let things = Thing.getNonUnique(name); if (things.length > 0) { thing = things[0]; } } return thing; } static storeUnique(unique) { if (Thing.uniqueThings[unique.name] != undefined) { console.warn(unique.name, Thing.uniqueThings[unique.name], new Error("Unique Thing Already Exists")); } else { Thing.uniqueThings[unique.name] = unique; } } static getUnique(name) { return Thing.uniqueThings[name]; } static getUniques() { let things = []; for (let name in Thing.uniqueThings) { things.push(Thing.uniqueThings[name]); } return things; } getPrintedName() { return this.name; } getPrintedDescription() { if (this.description == undefined) { return new Say("You see nothing special about ", new SayThe(), this, "."); } else { return this.description; } } getPartOne() { return Thing.PartRelation.getLeft(this); } getCarryOne() { return Thing.CarryRelation.getLeft(this); } getWieldOne() { return Thing.WieldRelation.getLeft(this); } getWearOne() { return Thing.WearRelation.getLeft(this); } getEnclosedOne() { return Thing.EnclosedRelation.getLeft(this); } removeParts(partType) { let parts = this.getParts(partType); for (let i = 0; i < parts.length; i++) { Thing.PartRelation.unsetRight(parts[i]); } } getParts(partType) { if (partType != undefined) { return Thing.PartRelation.getRightType(this, partType); } return Thing.PartRelation.getRight(this); } getPartsByName(name) { let parts = this.getParts(); return parts.filter((part) => { return (part.getName() == name); }); } getPart(partType) { if (partType != undefined) { return Thing.PartRelation.getRightTypeOne(this, partType); } return Thing.PartRelation.getRight(this); } getHighestEnclosedOne() { return Thing.EnclosedRelation.getLastLeft(this); } getHighestEnclosedOneNotRoom() { let parent = Thing.EnclosedRelation.getLeft(this); if (parent != undefined) { let newParent = Thing.EnclosedRelation.getLeft(parent); while (newParent != undefined) { parent = newParent; newParent = Thing.EnclosedRelation.getLeft(parent); } return parent; } return this; } getRoom() { var partOf = Thing.EnclosedRelation.getLeft(this); if (partOf instanceof Room) { return partOf; } else if (partOf instanceof Thing) { return partOf.getRoom(); } } removeFromRoom() { this.getRoom().remove(this); } isVisibleTo(thing) { return (this.getRoom() == thing.getRoom() && this.visible); } isPlayer() { return false; } addParts(...parts) { parts.forEach(part => { Thing.PartRelation.setRelation(this, part); }); } isUnique() { return this.unique; } setCarried(thing) { Thing.CarryRelation.setRelation(this, thing); } setWorn(thing) { Thing.WearRelation.setRelation(this, thing); } setWielded(thing) { Thing.WieldRelation.setRelation(this, thing); } unsetCarried(thing) { if (Thing.EnclosedRelation.getAllRight(this).indexOf(thing) != -1) { Thing.EnclosedRelation.unsetRight(thing); this.getRoom().place(thing); } } destroy() { let relatedRight = Thing.EnclosedRelation.getAllRight(this); relatedRight.push(this); relatedRight.forEach(related => { Thing.EnclosedRelation.unset(related); }); } } Thing.uniqueThings = {}; Thing.things = {}; Thing.InsideRoomRelation = new RelationOneToMany(); Thing.PartRelation = new RelationOneToMany(); Thing.CarryRelation = new RelationOneToMany(); Thing.WieldRelation = new RelationOneToMany(); Thing.WearRelation = new RelationOneToMany(); Thing.EnclosedRelation = new RelationHandlerStrictOneToMany(Thing.InsideRoomRelation, Thing.PartRelation, Thing.CarryRelation, Thing.WieldRelation, Thing.WearRelation); class ActionTake extends Action { getCommandText() { return "take " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } } ActionTake.check = new Rulebook("Check Taking"); ActionTake.carry = new Rulebook("Carry out Taking"); ActionTake.defaultCarryTakingRule = new Rule({ name: "Taking - Add the thing to your inventory", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); if (thing.getEnclosedOne() != undefined) { Thing.EnclosedRelation.unsetRight(thing); } else { thing.removeFromRoom(); } Thing.CarryRelation.setRelation(actor, action.getNoun(0)); if (actor == WorldState.player) { action.say.add(new SayBold(action.getNoun(0).getPrintedName() + ": "), "Taken."); } else { action.say.add(new SayThe(), actor, " takes ", new SayThe(undefined, true), action.getNoun(0), "."); } } }); ActionTake.check.addRule(new Rule({ name: "Check Taking - Who has it, really?", priority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); let owner = thing.getEnclosedOne(); if (owner == actor) { if (owner == WorldState.player) { action.say.add("You already have it."); } return false; } } })); ActionTake.check.addRule(new Rule({ name: "Check Taking - Donut steal", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); let owner = thing.getEnclosedOne(); if (owner != undefined && owner.animated) { if (actor == WorldState.player) { action.say.add(owner.getPrintedName() + " wouldn't like that."); } return false; } } })); ActionTake.check.addRule(new Rule({ name: "Check Taking - Can't take fixed in place", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); if (thing.fixedInPlace) { if (actor == WorldState.player) { action.say.add("You can't take that."); } return false; } } })); ActionTake.carry.addRule(ActionTake.defaultCarryTakingRule); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({ name: "Hyperlink - Take", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let thing = rulebook.noun; if (!thing.animated && !thing.fixedInPlace && thing.getRoom() == WorldState.player.getRoom() && thing.getEnclosedOne() instanceof Room) { Elements.HyperlinkHandler.addAvailableAction("Take", new ActionTake(WorldState.player, thing)); } } })); class ActionGo extends Action { constructor(actor, ...nouns) { super(actor, ...nouns); this.originalTarget = nouns[0]; this.requiresNoun = false; this.requiresVisibility = false; } getCommandText() { let name; if (typeof this.originalTarget == "number") { name = DirectionNames[Direction[this.originalTarget]]; } else if (this.originalTarget instanceof Room) { name = "to " + this.originalTarget.getPrintedName(); } return "go " + name; } } ActionGo.check = new Rulebook("Check Going"); ActionGo.carry = new Rulebook("Carry out Going"); ActionGo.ruleCheckRestoreOriginalNoun = ActionGo.check.createAndAddRule({ firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGHEST, name: "Check Going - Restore original noun", code: (rulebook) => { let action = rulebook.noun; action.setNoun(0, action.originalTarget); } }); ActionGo.ruleCheckIsthereactor = ActionGo.check.createAndAddRule({ firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGHEST, name: "Check Going - Is there an actor?", code: (rulebook) => { let action = rulebook.noun; if (action.actor == undefined) { return false; } } }); ActionGo.ruleCheckConvertRoomToDirection = ActionGo.check.createAndAddRule({ firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGH, name: "Change Room to Direction", code: (rulebook) => { let action = rulebook.noun; if (action.getNoun(0) instanceof RoomRandom) { let actor = action.actor; let cRoom = actor.getRoom(); if (cRoom instanceof RoomRandom) { let dRoom = action.getNoun(0); if (cRoom == dRoom) { if (actor.isPlayer()) { action.say.add("You are already there!"); } action.stop(); return false; } let code; if (actor == WorldState.player) { code = (room) => { return WorldState.isRoomRemembered(room); }; } let direction = cRoom.getAStarBestDirectionTo(dRoom, code); if (direction == undefined) { if (actor.isPlayer()) { action.say.add("You don't remember how to get there."); } return false; } else { action.setNoun(0, direction); } } } } }); ActionGo.ruleCheckIstheredirectionandroom = ActionGo.check.createAndAddRule({ name: "Check Going - is there a direction? Does it lead anywhere?", code: (rulebook) => { let action = rulebook.noun; let cRoom = action.actor.getRoom(); if (cRoom == undefined) { return false; } let direction = action.getNoun(0); if (direction == undefined) { return false; } let nextRoom = cRoom.connections[direction]; if (nextRoom == undefined) { return false; } action.roomGoneFrom = action.actor.getRoom(); action.roomGoneTo = nextRoom; } }); ActionGo.ruleCarryMove = ActionGo.carry.createAndAddRule({ name: "Going - Move Actor to Next Room", code: (rulebook) => { let action = rulebook.noun; let roomGoneFrom = action.actor.getRoom(); let direction = action.getNoun(0); let roomGoneInto = roomGoneFrom.connections[direction]; roomGoneInto.place(action.actor); let actor = action.actor; if (actor == WorldState.player) { action.say.add("You go " + DirectionNames[Direction[direction]].toLowerCase() + "."); } else { if (roomGoneFrom == WorldState.player.getRoom()) { action.say.add(new SayThe(), actor, " goes " + DirectionNames[Direction[direction]].toLowerCase() + "."); } else { let oppositeName = DirectionNames[OppositeDirection[direction]]; action.say.add(new SayThe(), actor, " arrives from the " + oppositeName.toLowerCase() + "."); } } } }); ActionGo.ruleCarryRememberRooms = ActionGo.carry.createAndAddRule({ name: "Going - Remember the involved rooms", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let roomGoneInto = action.actor.getRoom(); let direction = action.getNoun(0); let roomGoneFrom = roomGoneInto.connections[OppositeDirection[Direction[direction]]]; if (actor.isPlayer()) { WorldState.rememberRoom(roomGoneFrom, roomGoneInto); } } }); var Elements; (function (Elements) { var RoomHandler; (function (RoomHandler) { RoomHandler.currentRoomTab = document.getElementById("currentRoomTab"); RoomHandler.currentRoomDescription = document.getElementById("roomDescription"); RoomHandler.currentRoomExits = document.getElementById("roomExits"); RoomHandler.currentRoomName = document.createTextNode(""); document.getElementById("roomName").appendChild(RoomHandler.currentRoomName); function linkObjects() { let objs = RoomHandler.currentRoomTab.getElementsByClassName("roomObject"); for (let i = 0; i < objs.length; i++) { let linkKeyCode = Controls.KeyHandler.getFirstKeyCode(); Controls.KeyHandler.applyCode(objs[i], linkKeyCode); } } RoomHandler.linkObjects = linkObjects; function emptyRoom() { while (RoomHandler.currentRoomDescription.firstChild) { RoomHandler.currentRoomDescription.removeChild(RoomHandler.currentRoomDescription.firstChild); } while (RoomHandler.currentRoomExits.firstChild) { RoomHandler.currentRoomExits.removeChild(RoomHandler.currentRoomExits.firstChild); } RoomHandler.currentRoomName.nodeValue = ""; } RoomHandler.emptyRoom = emptyRoom; async function updateRoom() { emptyRoom(); let room = WorldState.player.getRoom(); if (room != undefined) { RoomHandler.currentRoomName.nodeValue = room.getPrintedName(); let description = room.description.getHTML("p", ["roomDescription"]); await description.then(value => { for (let i = 0, p = value[i]; p != undefined; p = value[++i]) { RoomHandler.currentRoomDescription.appendChild(p); } }); let things = room.getContainedAndVisible(); if (things.length > 0) { let thingList = document.createElement("p"); thingList.classList.add("roomDescription"); await RoomHandler.PrintingVisibleThingsRulebook.execute({ noun: { things: things, container: thingList } }); RoomHandler.currentRoomDescription.appendChild(thingList); } for (let index = 0, value = room.connections[index]; index < room.connections.length; value = room.connections[++index]) { if (value != undefined) { let p = document.createElement("p"); p.classList.add("roomExit"); let link = document.createElement("a"); link.classList.add("roomDirection"); link.appendChild(document.createTextNode(DirectionNames[Direction[index]])); Controls.Links.makeLink(link, new ActionGo(WorldState.player, index)); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getDirectionCodeByIndex(index)); p.appendChild(link); let directionResult = ": "; if (WorldState.isRoomRemembered(value)) { directionResult += value.getPrintedName(); } else { directionResult += "A new place"; } p.appendChild(document.createTextNode(directionResult)); RoomHandler.currentRoomExits.appendChild(p); } } } } RoomHandler.updateRoom = updateRoom; RoomHandler.PrintingVisibleThingsRulebook = new Rulebook("Printing the name of visible things in a room"); RoomHandler.PrintIntroToVisibleThingsRule = new Rule({ name: "Print \"You can see\" text", firstPriority: Rule.PRIORITY_HIGH, code: (rulebook) => { let noun = rulebook.noun; noun.container.appendChild(document.createTextNode("You can see ")); } }); RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintIntroToVisibleThingsRule); RoomHandler.PrintVisibleThingsRule = new Rule({ name: "Print all visible things", code: async (rulebook) => { let noun = rulebook.noun; for (let i = 0; i < noun.things.length; i++) { let value = noun.things[i]; let link = document.createElement("a"); link.classList.add("roomObject"); let say; if (value instanceof Thing && value.unique) { say = new Say(new SayThe(false), value); } else { say = new Say(new SayAn(false), value); } await say.getPureElements().then(value2 => { for (let i = 0, element = value2[i]; element != undefined; element = value2[++i]) { link.appendChild(element); } }); Controls.Links.makeLink(link, new ActionExamine(WorldState.player, value)); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getFirstKeyCode()); noun.container.appendChild(link); if ((i + 1) < noun.things.length) { noun.container.appendChild(document.createTextNode(", ")); } } } }); RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintVisibleThingsRule); RoomHandler.PrintOutroToVisibleThingsRule = new Rule({ name: "Print \"... here\" text", firstPriority: Rule.PRIORITY_LOW, code: (rulebook) => { let noun = rulebook.noun; noun.container.appendChild(document.createTextNode(" here.")); } }); RoomHandler.PrintingVisibleThingsRulebook.addRule(RoomHandler.PrintOutroToVisibleThingsRule); })(RoomHandler = Elements.RoomHandler || (Elements.RoomHandler = {})); })(Elements || (Elements = {})); class CoinPouch extends Thing { constructor(options) { super(options); this.coins = 0; this.addGetAlterations((purse) => { return { coins: purse.getCoins() }; }); this.addSetAlterations((purse, changeObj) => { purse.coins = (changeObj.coins); }); } addCoins(coins) { this.coins += coins; } removeCoins(coins) { this.coins -= coins; } getCoins() { return this.coins; } getShiny() { return this.coins > 0; } } CoinPouch.carryOutTakingCoinPouches = new Rule({ name: "Carry out taking coin pouches", firstPriority: ActionTake.defaultCarryTakingRule.firstPriority, priority: ActionTake.defaultCarryTakingRule.priority + 1, code: async (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); let actorPouches = Thing.CarryRelation.getRightType(actor, CoinPouch); if (actorPouches.length > 0) { let thingCoins = thing.getCoins(); if (thingCoins > 0) { rulebook.skipRule(ActionTake.defaultCarryTakingRule); actorPouches[0].addCoins(thingCoins); thing.removeCoins(thing.getCoins()); if (actor == WorldState.player) { action.say.add("You empty ", new SayThe(), thing, " into your ", actorPouches[0], ". Your ", actorPouches[0], " now has " + actorPouches[0].getCoins().toString() + " coins."); } else { action.say.add(new SayThe(), actor, " empties ", new SayThe(), thing, " into ", Say.hisHersIts(actor), actorPouches[0], "."); } } else { let myCoins = actorPouches[0].getCoins(); actorPouches[0].removeCoins(myCoins); thing.addCoins(myCoins); if (actor == WorldState.player) { action.say.add("You empty your ", actorPouches[0], " into ", new SayThe(), thing, ".", Say.PARAGRAPH_BREAK); } let drop = new ActionDrop(actor, actorPouches[0]); await drop.execute(); if (Thing.EnclosedRelation.getLeft(actorPouches[0]) == actor) { if (actor == WorldState.player) { action.say.add("You can't get rid of your ", actorPouches[0], "!"); } return false; } } } }, conditions: (rulebook) => { return (rulebook.noun.getNoun(0) instanceof CoinPouch); } }); ActionTake.carry.addRule(CoinPouch.carryOutTakingCoinPouches); Say.afterPrinting.addRule(new Rule({ name: "Include contents of Coin Pouch while Printing Visible Things in a Room", code: (rulebook) => { let say = rulebook.noun; let pouch = say.currentNoun; say.currentNounElements.push(document.createTextNode(" with " + pouch.getCoins().toString() + " coins")); }, conditions: (rulebook) => { return Elements.RoomHandler.PrintingVisibleThingsRulebook.isRunning() && rulebook.noun.currentNoun instanceof CoinPouch && rulebook.noun.currentNoun.getCoins() > 0; } })); ActionExamine.carry.addRule(new Rule({ name: "Print description of coins in Coin Pouch", firstPriority: ActionExamine.PrintDescriptionOfExaminedThingRule.firstPriority, priority: ActionExamine.PrintDescriptionOfExaminedThingRule.priority - 1, code: (rulebook) => { let action = rulebook.noun; let thing = action.getNoun(0); if (thing.getCoins() > 0) { action.say.add(" There are " + thing.getCoins().toString() + " coins in it."); } else { action.say.add(" There are no coins in it."); } }, conditions: (rulebook) => { return (rulebook.noun.getNoun(0) instanceof CoinPouch); } })); var Elements; (function (Elements) { var InventoryHandler; (function (InventoryHandler) { var container = document.getElementById("inventoryTarget"); function empty() { while (container.firstChild) { container.removeChild(container.firstChild); } } function printHeader(header) { let p = document.createElement("p"); p.classList.add("inventoryHeader"); p.appendChild(document.createTextNode(header + ":")); container.appendChild(p); } let currentRow; InventoryHandler.LinkingThing = new Rulebook("Inventory - Links for a Thing"); function printThingLink(shortcut, action) { let nameLink = document.createElement("div"); nameLink.classList.add("inventoryLink"); nameLink.appendChild(document.createTextNode(shortcut)); currentRow.appendChild(nameLink); Controls.Links.makeLink(nameLink, action); } InventoryHandler.printThingLink = printThingLink; async function printThing(thing) { currentRow = document.createElement("div"); currentRow.classList.add("inventoryRow"); let nameLink = document.createElement("div"); nameLink.classList.add("inventoryLink", "name"); nameLink.appendChild(document.createTextNode(thing.getPrintedName())); currentRow.appendChild(nameLink); Controls.Links.makeLink(nameLink, new ActionExamine(WorldState.player, thing)); await InventoryHandler.LinkingThing.execute({ noun: thing }); container.appendChild(currentRow); } function thingSort(a, b) { let na = a.getPrintedName().toLowerCase(); let nb = b.getPrintedName().toLowerCase(); if (na < nb) return -1; if (na > nb) return 1; return 0; } InventoryHandler.thingSort = thingSort; async function updateInventory() { let player = WorldState.player; empty(); let wielded = Thing.WieldRelation.getRight(player).sort(thingSort); let worn = Thing.WearRelation.getRight(player).sort(thingSort); let carried = Thing.CarryRelation.getRight(player).sort(thingSort); if (wielded.length > 0) { printHeader("Wielded"); for (let i = 0; i < wielded.length; i++) { await printThing(wielded[i]); } } if (worn.length > 0) { printHeader("Worn"); for (let i = 0; i < worn.length; i++) { await printThing(worn[i]); } } if (carried.length > 0) { printHeader("Carried"); for (let i = 0; i < carried.length; i++) { await printThing(carried[i]); } } let pouch = Thing.CarryRelation.getRightType(WorldState.player, CoinPouch); if (pouch.length > 0) { let p = document.createElement("p"); p.classList.add("inventoryGold"); let s; if (pouch[0].getCoins() > 0) { s = new Say("There are " + pouch[0].getCoins().toString() + " coins in your ", pouch[0], "."); } else { s = new Say("There are no coins in your ", pouch[0], "."); } await s.getPureElements().then(elements => { elements.forEach(element => { p.appendChild(element); }); }); container.appendChild(p); } } InventoryHandler.updateInventory = updateInventory; })(InventoryHandler = Elements.InventoryHandler || (Elements.InventoryHandler = {})); })(Elements || (Elements = {})); class ActionRetrace extends Action { constructor(actor, ...nouns) { super(actor, ...nouns); this.requiresNoun = false; this.requiresVisibility = false; this.requiresTurn = false; } getCommandText() { let name; if (typeof this.getNoun(0) == "number") { name = DirectionNames[Direction[this.getNoun(0)]]; } else if (this.getNoun(0) instanceof Room) { name = this.getNoun(0).getPrintedName(); } return "think about how to get to " + name; } } ActionRetrace.check = new Rulebook("Check Retracing"); ActionRetrace.carry = new Rulebook("Carry out Retracing"); ActionRetrace.check.addRule(new Rule({ firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGH, name: "Change Room to Direction", code: (rulebook) => { let action = rulebook.noun; if (action.getNoun(0) instanceof Room) { let actor = action.actor; let cRoom = actor.getRoom(); if (cRoom == undefined) { return false; } let dRoom = action.getNoun(0); if (cRoom == dRoom) { if (actor.isPlayer()) { action.say.add("You are already there!"); } action.stop(); return false; } let code; if (actor == WorldState.player) { code = (room) => { return WorldState.isRoomRemembered(room); }; } let direction = cRoom.bestDirectionTo(dRoom, code); if (direction == undefined) { if (actor.isPlayer()) { action.say.add("You don't remember how to get there."); } return false; } else { action.setNoun(0, direction); } } } })); ActionRetrace.carry.addRule(new Rule({ name: "Retracing - Find Direction", code: (rulebook) => { let action = rulebook.noun; action.say.add("To get there, you should go " + DirectionNames[Direction[action.getNoun(0)]] + "."); } })); var Elements; (function (Elements) { var RememberedHandler; (function (RememberedHandler) { var mapTarget = document.getElementById("mapTarget"); var lastMap; var elements; function empty() { elements = {}; lastMap = undefined; while (mapTarget.firstChild) { mapTarget.removeChild(mapTarget.firstChild); } } RememberedHandler.empty = empty; async function updateMap() { console.debug(Rulebook.getIndentation() + "[MAP] Creating Map"); let regions = Region.InRelation.getAllLeftType(WorldState.player.getRoom(), RegionRandom); let biggestRegion = regions[regions.length - 1]; if (biggestRegion == undefined) { empty(); return; } if (biggestRegion.map != lastMap) { empty(); } else { await updateOldMap(); return; } let map = biggestRegion.map; lastMap = map; map.updateAllLimits(); for (let y = map.highestY; y >= map.lowestY; y--) { let row = document.createElement("div"); row.classList.add("mapRow"); for (let x = map.lowestX; x <= map.highestX; x++) { let room = map.getRoom(x, y); let roomNode = new RoomNode(room); await roomNode.createRoomNameFloater(); let roomDiv = roomNode.getElement(); row.appendChild(roomDiv); elements[x.toString() + ";" + y.toString()] = roomNode; } mapTarget.appendChild(row); } await updateOldMap(); } RememberedHandler.updateMap = updateMap; async function updateOldMap() { let map = lastMap; for (let y = map.highestY; y >= map.lowestY; y--) { for (let x = map.lowestX; x <= map.highestX; x++) { await elements[x.toString() + ";" + y.toString()].update(); } } } RememberedHandler.updateOldMap = updateOldMap; })(RememberedHandler = Elements.RememberedHandler || (Elements.RememberedHandler = {})); })(Elements || (Elements = {})); var Debug; (function (Debug) { function knowdewae() { let map = new MapNote({ name: "De Wae", description: "This map shows de wae all de wae to Zimbabwe." }); map.addRoom(...Region.RegionRoom.getAnyRightType(RoomRandom)); WorldState.player.setCarried(map); } Debug.knowdewae = knowdewae; function hurt(target, amount) { let bp; if (target instanceof Person) { bp = target.getPart(HumanoidTorso); if (bp == undefined) return; } else if (target instanceof Bodypart) { bp = target; } bp.changeSoreness(amount); } Debug.hurt = hurt; function goTo(str) { } Debug.goTo = goTo; })(Debug || (Debug = {})); class AI { constructor(options) { this.wanderer = true; this.wanderChance = 50; this.picksShinies = true; this.extraRules = []; this.extraCombatRules = []; for (let key in options) { this[key] = options[key]; } } async execute(actor) { let promise; if (promise != undefined) { promise = AI.combatRules.execute({ noun: actor }, ...this.extraCombatRules); } else { promise = AI.rules.execute({ noun: actor }, ...this.extraRules); } let result = await promise; return result; } addRulesBook(...books) { this.extraRules.push(...books); arrayUnique(this.extraRules); } addCombatRulesBook(...books) { this.extraCombatRules.push(...books); arrayUnique(this.extraCombatRules); } } AI.rules = new Rulebook("Default AI Rules"); AI.combatRules = new Rulebook("Default AI Combat Rules"); var AIRules; (function (AIRules) { AIRules.PRIORITY_ACTING_ON_SITUATION = 5; AIRules.PRIORITY_ACTING_ON_PLACE = 3; AIRules.PRIORITY_ACTING_ON_IDLE = 1; })(AIRules || (AIRules = {})); class PersonStat { constructor(id, description) { this.defaultValue = 0; this.maxValue = 10; this.id = id; this.description = description == undefined ? "Not defined" : description; } getDescription(value) { if (typeof this.description == "string" || this.description instanceof Say) { return this.description; } else { return this.description(value); } } } class Attribute extends PersonStat { constructor(id, description, defValue, maxValue) { super(id, description); this.defaultValue = 2; this.maxValue = 5; if (defValue != undefined) { this.defaultValue = defValue; } if (maxValue != undefined) { this.maxValue = maxValue; } Attribute.Attributes[id] = this; } static getAttributes() { let attributes = []; for (let key in Attribute.Attributes) { attributes.push(Attribute.Attributes[key]); } return attributes; } static getAttribute(id) { return Attribute.Attributes[id]; } } Attribute.Attributes = {}; var Attributes; (function (Attributes) { Attributes.Strength = new Attribute("Strength", value => { switch (value) { case 5: return "Hercules' Bigger Cousin"; case 4: return ("Circus Strong" + (WorldState.player.isMale() ? "man" : "woman")); case 3: return "Beach Bully"; case 2: return ("Average " + (WorldState.player.isMale() ? "Joe" : "Jane")); case 1: return "Wet Noodle"; default: return "Out of bounds."; } }); Attributes.Agility = new Attribute("Agility", value => { switch (value) { case 5: return "Catlike"; case 4: return "Gymnast"; case 3: return "Accurate"; case 2: return "Common"; case 1: return "Accident-prone"; default: return "Out of bounds."; } }); Attributes.Intelligence = new Attribute("Intelligence", value => { switch (value) { case 5: return "Genius"; case 4: return "Gifted"; case 3: return "Knowledgeable"; case 2: return "Normal"; case 1: return "Door"; default: return "Out of bounds."; } }); Attributes.Charm = new Attribute("Charm", value => { switch (value) { case 5: return (WorldState.player.isMale() ? "Casanova" : "Seductress"); case 4: return "Diplomat"; case 3: return ("Cheery Sales" + (WorldState.player.isMale() ? "man" : "woman")); case 2: return "Not even trying"; case 1: return "Unpleasant"; default: return "Out of bounds."; } }); Attributes.Corruption = new Attribute("Corruption", value => { return "Not defined"; }, 0, 100); Attributes.GenderIdentity = new Attribute("Gender Identity", value => { if (value >= 75) { return "You strongly feel, and act, like a woman."; } else if (value >= 60) { return "You feel, and act, like a woman."; } else if (value >= 40) { return "You don't feel nor act like any particular gender."; } else if (value >= 20) { return "You feel, and act, like a man."; } else { return "You strongly feel, and act, like a man."; } }, 50, 100); Attributes.Degeneration = new Attribute("Degeneration", value => { if (value >= 75) { return "Sex is about the only thing on your mind, and you don't even try to hide it anymore."; } else if (value >= 60) { return "Sometimes you can't hide how naughty you'd like to be."; } else if (value >= 40) { return ""; } else if (value >= 20) { return "Your composure is prudish and calm."; } else { return "You have the composure of a saint."; } }, 30, 100); })(Attributes || (Attributes = {})); class Skill extends PersonStat { constructor(id, description) { super(id, description); this.defaultValue = 0; this.maxValue = 5; Skill.Skills[id] = this; } static getSkills() { let skills = []; for (let key in Skill.Skills) { skills.push(Skill.Skills[key]); } skills.sort((a, b) => { let na = a.id.toUpperCase(); let nb = b.id.toUpperCase(); if (na > nb) return 1; if (na < nb) return -1; return 0; }); return skills; } static getSkill(id) { return Skill.Skills[id]; } } Skill.Skills = {}; var Skills; (function (Skills) { Skills.Survival = new Skill("Survival", (value) => { switch (value) { case 5: return ""; case 4: return ""; case 3: return ""; case 2: return ""; case 1: return "Alert Chihuahua"; } }); })(Skills || (Skills = {})); class Container extends Thing { put(...things) { } } class Corpse extends Container { } class Person extends Thing { constructor(options) { super(options); this.AI = new AI({}); this.animated = true; this.soreness = 0; this.lastHealthUpdate = 0; this.stamina = 10; this.lastStaminaUpdate = 0; this.staminaPerTurn = 1; this.attributeValue = {}; this.skillValue = {}; this.addGetAlterations((person) => { if (person.isPlayer()) { return { Stats: this.attributeValue, Skills: this.skillValue }; } }); this.addSetAlterations((person, changes) => { if (person.isPlayer()) { if (changes.Stats != undefined) { for (let name in changes.Stats) { let attr = Attribute.getAttribute(name); if (attr != undefined) { this.setStat(attr, changes.Stats[name]); } } } if (changes.Skills != undefined) { for (let name in changes.Skills) { let attr = Skill.getSkill(name); if (attr != undefined) { this.setSkill(attr, changes.Skills[name]); } } } } }); } changeHealth(n) { let bodyparts = this.getParts(Bodypart); for (let i = 0; i < bodyparts.length; i++) { bodyparts[i].changeSoreness(n); } this.updateHealth(); } getHealthOnScale() { return Math.round(((this.getHealth() * 10) / (this.getStat(Attributes.Strength) * 2))); } getHealth(important) { if (important === true || this.lastHealthUpdate != WorldState.getCurrentTurn()) { this.updateHealth(); } return this.soreness / (this.getStat(Attributes.Strength) * Person.STRENGTH_SORENESS_MULTIPLIER); } updateHealth() { let health = 0; let bodyparts = this.getParts(Bodypart); for (let i = 0; i < bodyparts.length; i++) { health += bodyparts[i].getWeightedSoreness(); } this.soreness = health; this.lastHealthUpdate = WorldState.getCurrentTurn(); } changeStamina(n) { this.updateStamina(); this.stamina += n; if (this.stamina > Person.MAX_STAMINA) { this.stamina = Person.MAX_STAMINA; } else if (this.stamina < 0) { this.stamina = 0; } } getStaminaOnScale() { return Math.round(((this.stamina * 10) / Person.MAX_STAMINA)); } updateStamina() { var nTurns = WorldState.getCurrentTurn() - this.lastStaminaUpdate; this.stamina += this.staminaPerTurn * nTurns; if (this.stamina > Person.MAX_STAMINA) { this.stamina = Person.MAX_STAMINA; } } isPlayer() { return this == WorldState.player; } getStat(stat) { if (this.attributeValue[stat.id] == undefined) { this.attributeValue[stat.id] = stat.defaultValue; } return this.attributeValue[stat.id]; } setStat(stat, value) { this.attributeValue[stat.id] = value; } getSkill(stat) { if (this.skillValue[stat.id] == undefined) { this.skillValue[stat.id] = stat.defaultValue; } return this.skillValue[stat.id]; } setSkill(stat, value) { this.skillValue[stat.id] = value; } die() { let corpse = new Corpse({ name: this.name + "'s corpse", unique: false, description: new Say("The lifeless body of ", this, ". May ", new SayHeSheIt(this), " rest in peace.") }); corpse.put(...Thing.CarryRelation.getRight(this)); corpse.put(...Thing.WearRelation.getRight(this)); this.getRoom().place(corpse); OutOfPlay.removeFromPlay(this); } } Person.MAX_STAMINA = 10; Person.STRENGTH_SORENESS_MULTIPLIER = 4; var EveryTurn; (function (EveryTurn_1) { EveryTurn_1.EveryTurn = new Rulebook("Every Turn"); EveryTurn_1.RunAIRule = EveryTurn_1.EveryTurn.createAndAddRule({ name: "Run NPC AI Rule", code: async function () { function isAIAvailable(person) { return (person != WorldState.player && ((person.getRoom() instanceof RoomRandom && person.getRoom().placed))); } let people = Thing.InsideRoomRelation.getAnyRightType(Person).filter(isAIAvailable); for (let i = 0; i < people.length; i++) { let action = await people[i].AI.execute(people[i]); let person = people[i]; let visible = people[i].isVisibleTo(WorldState.player); if (action != undefined) { let printValue = await action.execute(); if ((visible || person.isVisibleTo(WorldState.player)) && printValue != undefined) { Elements.CurrentTurnHandler.printAsContent(printValue); } } } } }); EveryTurn_1.incrementTurnCounterRule = EveryTurn_1.EveryTurn.createAndAddRule({ firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, name: "Increment Turn Counter", code: function () { WorldState.incrementWorldTurn(); } }); })(EveryTurn || (EveryTurn = {})); var Direction; (function (Direction) { Direction[Direction["NORTH"] = 0] = "NORTH"; Direction[Direction["NORTHEAST"] = 1] = "NORTHEAST"; Direction[Direction["EAST"] = 2] = "EAST"; Direction[Direction["SOUTHEAST"] = 3] = "SOUTHEAST"; Direction[Direction["SOUTH"] = 4] = "SOUTH"; Direction[Direction["SOUTHWEST"] = 5] = "SOUTHWEST"; Direction[Direction["WEST"] = 6] = "WEST"; Direction[Direction["NORTHWEST"] = 7] = "NORTHWEST"; Direction[Direction["UP"] = 8] = "UP"; Direction[Direction["DOWN"] = 9] = "DOWN"; })(Direction || (Direction = {})); var DirectionNames = (() => { let names; (function (names) { names["NORTH"] = "North"; names["SOUTH"] = "South"; names["EAST"] = "East"; names["WEST"] = "West"; names["SOUTHEAST"] = "Southeast"; names["NORTHWEST"] = "Northwest"; names["SOUTHWEST"] = "Southwest"; names["NORTHEAST"] = "Northeast"; names["UP"] = "Down"; names["DOWN"] = "Up"; })(names || (names = {})); ; let obj = {}; for (let name in names) { obj[name] = names[name]; obj[Direction[name]] = names[name]; } return obj; })(); var OppositeDirection = (() => { let obj = {}; obj[Direction.NORTH] = Direction.SOUTH; obj[Direction.SOUTH] = Direction.NORTH; obj[Direction.EAST] = Direction.WEST; obj[Direction.WEST] = Direction.EAST; obj[Direction.SOUTHEAST] = Direction.NORTHWEST; obj[Direction.NORTHWEST] = Direction.SOUTHEAST; obj[Direction.SOUTHWEST] = Direction.NORTHEAST; obj[Direction.NORTHEAST] = Direction.SOUTHWEST; obj[Direction.UP] = Direction.DOWN; obj[Direction.DOWN] = Direction.UP; for (let i = 0; i < Object.keys(Direction).length / 2; i++) { obj[Direction[i]] = obj[i]; } return obj; })(); class Room { constructor(id, fodder) { this.description = new Say(); this.name = id == undefined ? "Room" : id; this.connections = new Array(Room.DIRECTIONS.length); this.fodder = fodder; if (fodder != true) { Room.addRoom(this); } } getName() { return this.name; } place(thing) { Thing.InsideRoomRelation.setRelation(this, thing); } remove(thing) { if (Thing.InsideRoomRelation.getLeft(thing) == this) { Thing.InsideRoomRelation.unsetRight(thing); } } getContained() { return Thing.InsideRoomRelation.getRight(this); } getContainedAndVisibleTo(observer) { let contained = this.getContained(); let result = []; contained.forEach((value) => { if (value.visible && value !== observer) { result.push(value); } }); return result; } getContainedAndVisible() { return this.getContainedAndVisibleTo(WorldState.player); } mapRoom(r, direction) { let oppositeDirection = OppositeDirection[direction]; if (this.connections[direction] != undefined) { console.warn("Replacing a connected room.", this, " connected through ", direction, " to ", this.connections[direction]); this.connections[direction].unmapRoom(oppositeDirection); } this.connections[direction] = r; if (r.connections[oppositeDirection] != undefined) { console.warn("Replacing a connected room.", r, " connected through ", oppositeDirection, " to ", r.connections[oppositeDirection]); r.unmapRoom(oppositeDirection); } r.connections[oppositeDirection] = this; } unmapRoom(direction) { if (this.connections[direction] != undefined) { let r = this.connections[direction]; this.connections[direction] = undefined; r.unmapRoom(OppositeDirection[direction]); } } getPrintedName() { return this.name; } getConnectedRooms() { let rooms = []; this.connections.forEach(room => { if (room != undefined) { rooms.push(room); } }); return rooms; } bestDirectionTo(room, validityCode) { if (validityCode == undefined) validityCode = () => { return true; }; let maxSteps = 10; maxSteps = maxSteps > WorldState.getMaximumRememberedRooms() ? maxSteps : WorldState.getMaximumRememberedRooms(); let recursiveBestPath = (cPath, cRoom, destination) => { if (!validityCode(cRoom)) { return; } if (cRoom == destination) { maxSteps = maxSteps > cPath.length ? cPath.length : maxSteps; return cPath; } else if (cPath.length > maxSteps) { return undefined; } else { let paths = []; for (let index in Room.DIRECTIONS) { let direction = Room.DIRECTIONS[index]; let nextRoom = cRoom.connections[direction]; if (nextRoom != undefined && cPath.indexOf(nextRoom) == -1 && validityCode(nextRoom)) { let path = recursiveBestPath(cPath.concat([nextRoom]), nextRoom, destination); if (path != undefined) { paths.push(path); } } } let shortestIndex = 0; paths.forEach((value, index, array) => { if (value.length < paths[shortestIndex].length) { shortestIndex = index; } }); return paths[shortestIndex]; } }; let paths = Array(Room.DIRECTIONS.length); let shortestIndex; for (let index in Room.DIRECTIONS) { let direction = Room.DIRECTIONS[index]; let nextRoom = this.connections[direction]; if (nextRoom != undefined) { paths[direction] = recursiveBestPath([this, nextRoom], nextRoom, room); if (paths[direction] != undefined && (shortestIndex == undefined || paths[shortestIndex].length > paths[direction].length)) { shortestIndex = direction; } } } return shortestIndex; } static getDirectionXYZ(direction) { var y = 0; if ([Direction.NORTH, Direction.NORTHEAST, Direction.NORTHWEST].indexOf(direction) != -1) { y = 1; } else if ([Direction.SOUTH, Direction.SOUTHEAST, Direction.SOUTHWEST].indexOf(direction) != -1) { y = -1; } var x = 0; if ([Direction.EAST, Direction.SOUTHEAST, Direction.NORTHEAST].indexOf(direction) != -1) { x = 1; } else if ([Direction.WEST, Direction.SOUTHWEST, Direction.NORTHWEST].indexOf(direction) != -1) { x = -1; } var z = direction == Direction.UP ? 1 : direction == Direction.DOWN ? -1 : 0; return [x, y, z]; } static shift(coordinates, direction) { let coordinatesVector = Room.getDirectionXYZ(direction); coordinates.forEach((value, index, array) => { coordinatesVector[index] += coordinates[index]; }); return coordinatesVector; } static addRoom(room) { Room.rooms[room.name] = room; } static getRooms() { let rooms = []; for (let name in Room.rooms) { rooms.push(Room.rooms[name]); } return rooms; } static getRoom(id) { return Room.rooms[id]; } } Room.DIRECTIONS = (() => { let directions = []; for (let i = 0; i < Object.keys(Direction).length / 2; i++) { directions.push(i); } return directions; })(); Room.rooms = {}; var OutOfPlay; (function (OutOfPlay) { OutOfPlay.Heaven = new Room("__Heaven__RIP__"); function removeFromPlay(thing) { OutOfPlay.Heaven.place(thing); } OutOfPlay.removeFromPlay = removeFromPlay; })(OutOfPlay || (OutOfPlay = {})); var PlayBegins; (function (PlayBegins) { PlayBegins.rulebook = new Rulebook("Play Begins"); PlayBegins.LOAD_FAILED = false; let startingRoom; function execute() { PlayBegins.rulebook.execute({}); } PlayBegins.execute = execute; function setStartingRoom(room) { if (startingRoom != undefined) { console.warn("[InitialRoom] Multiple requests for starting room, please check.", startingRoom, room); } startingRoom = room; } PlayBegins.setStartingRoom = setStartingRoom; PlayBegins.PutPlayerIntoFirstRoom = PlayBegins.rulebook.createAndAddRule({ name: "Place player into initial room", firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_MEDIUM, code: () => { if (WorldState.player.getRoom() != undefined) { console.debug(Rulebook.getIndentation() + "[InitialRoom] Player already in a room.", WorldState.player.getRoom()); } else { startingRoom.place(WorldState.player); } } }); PlayBegins.RunEmptyTurnSequenceRule = new Rule({ name: "Run Empty Turn Sequence Rule", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, code: (rulebook2) => { TurnSequence.execute(); } }); PlayBegins.rulebook.addRule(PlayBegins.RunEmptyTurnSequenceRule); })(PlayBegins || (PlayBegins = {})); var MachineBegins; (function (MachineBegins) { MachineBegins.RunPlayBegins = MachineBegins.rulebook.createAndAddRule({ firstPriority: Rule.PRIORITY_LOW, name: "Run Play Begins", code: () => { PlayBegins.execute(); } }); })(MachineBegins || (MachineBegins = {})); var Tests; (function (Tests) { Tests.MIN_DICE = 0; Tests.MAX_DICE = 3; function rollDice() { return Math.floor(Math.random() * (Tests.MAX_DICE - Tests.MIN_DICE)) + 1 + Tests.MIN_DICE; } Tests.rollDice = rollDice; function test(attr, difficulty) { return (attr + rollDice()) >= difficulty; } Tests.test = test; })(Tests || (Tests = {})); class MapNote extends Thing { constructor() { super(...arguments); this.rooms = []; this.regions = []; } addRoom(...rooms) { rooms.forEach((room) => { this.rooms.push(room); }); } addRegion(...regions) { regions.forEach(region => { this.regions.push(region); }); } contains(room) { if (this.rooms.indexOf(room) != -1) { return true; } else { for (var i = 0; i < this.regions.length; i++) { if (this.regions[i].getRooms().indexOf(room) != -1) { return true; } } } } } class Bodypart extends Thing { constructor(options) { super(options); this.sorenessWeight = 1; this.soreness = 0; this.sorenessPerTurn = 0.05; this.lastSorenessUpdate = 0; this.slots = []; this.visibleSlots = []; this.genderValue = Bodypart.GENDER_MEDIUM_ANDROGYNE; this.genderWeight = 1; this.sluttiness = 10; this.sluttinessWeight = Bodypart.WEIGHT_LOWEST; this.addGetAlterations((bp) => { return { Soreness: bp.soreness, GenderValue: bp.genderValue, Sluttiness: bp.getSluttiness() }; }); this.addSetAlterations((bp, changes) => { this.soreness = changes.Soreness; this.genderValue = changes.GenderValue; this.sluttiness = changes.Sluttiness; }); } updateSoreness() { let cTurn = WorldState.getCurrentTurn(); if (cTurn > this.lastSorenessUpdate) { if (this.soreness > 0) { this.soreness -= (this.sorenessPerTurn * (cTurn - this.lastSorenessUpdate)); if (this.soreness < 0) { this.soreness = 0; } } this.lastSorenessUpdate = cTurn; } } changeSoreness(soreness) { this.updateSoreness(); this.soreness += soreness; if (this.soreness < 0) { this.soreness = 0; } } getSoreness() { this.updateSoreness(); return this.soreness; } getWeightedSoreness() { return this.getSoreness() * this.sorenessWeight; } getSorenessWeight() { return this.sorenessWeight; } getGenderWeight() { if (this.slots.length == 0) { return 0; } return this.genderWeight * (this.visibleSlots.length / this.slots.length); } getGenderValue() { return this.genderValue; } getWeightedGenderValue() { return this.getGenderValue() * this.getGenderWeight(); } getSluttiness() { return this.sluttiness; } getSluttinessWeight() { if (this.slots.length == 0) { return 0; } return this.sluttinessWeight * (this.visibleSlots.length / this.slots.length); } getWeightedSluttinessValue() { return this.getSluttiness() * this.getSluttinessWeight(); } updateVisibility() { this.visibleSlots = this.slots.slice(0); let parent = Thing.PartRelation.getLeft(this); if (parent != undefined) { let clothing = Thing.WearRelation.getRight(parent); for (let i = 0; i < clothing.length; i++) { let covering = clothing[i].getCoveringSlots(); for (let k = 0; k < covering.length; k++) { let idx = this.visibleSlots.indexOf(covering[k]); if (idx >= 0) { this.visibleSlots.splice(idx, 1); } } if (this.visibleSlots.length == 0) break; } } } isUncovered() { this.updateVisibility(); return this.visibleSlots.length == this.slots.length && this.slots.length > 0; } updateStatus() { this.updateVisibility(); } static getSoreness(thing) { let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart); let soreness = 0; bodyparts.forEach((bodypart) => { soreness += bodypart.getWeightedSoreness(); }); return soreness; } static getGenderValueOn(thing) { let weight = 0; let value = 0; let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart); bodyparts.forEach((bodypart) => { weight += bodypart.getGenderWeight(); value += bodypart.getWeightedGenderValue(); }); return { weight: weight, value: value }; } static getSluttinessValueOn(thing) { let weight = 0; let value = 0; let bodyparts = Thing.PartRelation.getRightType(thing, Bodypart); bodyparts.forEach((bodypart) => { weight += bodypart.getSluttinessWeight(); value += bodypart.getWeightedSluttinessValue(); }); return { weight: weight, value: value }; } arrangeGenderValue(genderValue) { this.genderValue = genderValue; this.getPartOne().invalidateCaches(); } increaseFemininity(amount) { let currentGV = this.getGenderValue(); this.arrangeGenderValue(currentGV + (5 * amount)); } increaseMasculinity(amount) { let currentGV = this.getGenderValue(); this.arrangeGenderValue(currentGV - (5 * amount)); } } Bodypart.WEIGHT_LOWEST = 1; Bodypart.WEIGHT_LOW = 3; Bodypart.WEIGHT_MEDIUM = 5; Bodypart.WEIGHT_HIGH = 7; Bodypart.WEIGHT_HIGHEST = 9; Bodypart.SLUTTINESS_LOWEST_SAINTLY = 0; Bodypart.SLUTTINESS_LOW_PRUDE = 25; Bodypart.SLUTTINESS_MEDIUM_AVERAGE = 50; Bodypart.SLUTTINESS_HIGH_SLUT = 75; Bodypart.SLUTTINESS_HIGHEST_WHORE = 100; Bodypart.GENDER_LOWEST_MANLIEST = 0; Bodypart.GENDER_LOW_MANLY = 25; Bodypart.GENDER_MEDIUM_ANDROGYNE = 50; Bodypart.GENDER_HIGH_FEMININE = 75; Bodypart.GENDER_HIGHEST_FEMININEST = 100; class SexStick extends Bodypart { getWide() { return new Measure(); } getLong() { return new Measure(); } } class SexHole extends Bodypart { } class Measure { constructor(...sides) { this.superscript = ["", "", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"]; this.units = 1; sides.forEach((side) => { this.units *= side; }); this.sides = sides.length; } getText() { let meters = Math.pow(this.sides, 100); if (this.units > meters) { return (+(this.units / meters).toFixed(2)).toString() + "m" + this.superscript[this.sides]; } else { return this.units.toString() + "cm" + this.superscript[this.sides]; } } getNumber() { return this.units; } getSides() { return this.sides; } static fromInches(inches) { return inches * 2.54; } static fromFeet(feet) { return feet * 30.48; } } class MeasureLiquid { constructor(milliliters) { this.units = milliliters; } getText() { if (this.units > 1000) { return (+(this.units / 1000).toFixed(2)).toString() + "L"; } else { return this.units.toString() + "mL"; } } static fromLiters(liters) { return liters * 1000; } } class HumanoidArms extends Bodypart { constructor() { super(...arguments); this.sorenessWeight = Bodypart.WEIGHT_LOW; this.genderWeight = Bodypart.WEIGHT_MEDIUM; this.slots = [Humanoid.SLOT_ARMS]; } get sluttinessWeight() { if (this.getPartOne().isMale()) { return Bodypart.WEIGHT_HIGHEST; } else { return Bodypart.WEIGHT_MEDIUM; } } set sluttinessWeight(val) { } getSluttiness() { if (this.getPartOne().isMale()) { return this.getGenderValue(); } else { return 100 - this.getGenderValue(); } } getDescription() { let humanoid = this.getPartOne(); let str = humanoid.getStat(Attributes.Strength); if (str > 4) { return "Your arms and legs are ridiculously huge, showing off just how strong you are."; } else if (str > 2) { return "Your arms and legs are pretty big because of your muscles."; } else if (str == 2) { return ""; } else { return "You look like you don't even lift."; } } getGenderValue() { let humanoid = this.getPartOne(); let str = humanoid.getStat(Attributes.Strength); return 20 * str; } } class HumanoidBreasts extends Bodypart { constructor(options) { super(options); this.size = 0; this.silicone = 0; this.milk = 0; this.sorenessWeight = Bodypart.WEIGHT_MEDIUM; this.genderWeight = Bodypart.WEIGHT_HIGH; this.slots = [Humanoid.SLOT_BREASTS]; this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT; this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM; this.addGetAlterations((thing) => { return { Size: this.size, Silicone: this.silicone, Milk: this.milk }; }); this.addSetAlterations((thing, changes) => { this.size = changes.Size; this.silicone = changes.Silicone; this.milk = changes.Milk; }); } getSize() { return this.size + this.silicone + this.milk; } getSizeText() { return HumanoidBreasts.getSizeText(this.getSize()); } static getSizeText(size) { let names = ["flat", "AA-cup", "A-cup", "B-cup", "C-cup", "D-cup", "E-cup", "F-cup", "G-cup", "H-cup"]; if (size >= names.length) { return "HUGE"; } else { return names[size]; } } getGenderValue() { return HumanoidBreasts.getGenderFromSize(this.getSize()); } getSluttiness() { return this.getGenderValue(); } static getGenderFromSize(size) { if (size <= 0) { return 20; } else if (size <= 3) { return 20 * size; } else { return 80; } } arrangeGenderValue(gv) { if (gv <= 20) { this.size = 0; this.silicone = 0; this.milk = 0; } else if (gv < 80) { this.size = Math.round(gv / 20); } else { this.size = 4; } } } class HumanoidButt extends Bodypart { constructor(options) { super(options); this.size = 0; this.silicone = 0; this.sorenessWeight = Bodypart.WEIGHT_MEDIUM; this.genderWeight = Bodypart.WEIGHT_MEDIUM; this.slots = [Humanoid.SLOT_BUTT]; this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT; this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM; this.addGetAlterations((thing) => { return { Size: this.size, Silicone: this.silicone }; }); this.addSetAlterations((thing, changes) => { this.size = changes.Size; this.silicone = changes.Silicone; }); } getSluttiness() { return this.getSize() * 33; } getSize() { return this.size + this.silicone; } getSizeText() { return HumanoidButt.getSizeText(this.getSize()); } static getSizeText(size) { let names = ["flat", "tiny", "round", "plump"]; if (size >= names.length) { return "gargantuan"; } else { return names[size]; } } getGenderValue() { return HumanoidBreasts.getGenderFromSize(this.getSize()); } static getGenderFromSize(size) { if (size <= 0) { return 20; } else if (size <= 2) { return 30 * size; } else { return 80; } } arrangeGenderValue(gv) { if (gv <= 20) { this.size = 0; } else if (gv <= 60) { this.size = 1; } else { this.size = 3; } } } class HumanoidExtremity extends Bodypart { constructor(options) { super(options); this.nailsPainted = false; this.nailColor = 0; this.addGetAlterations((thing) => { return { Painted: this.nailsPainted, Color: this.nailColor }; }); this.addSetAlterations((thing, changes) => { this.nailsPainted = changes.Painted; this.nailColor = changes.Color; }); } static getColor(index) { return HumanoidExtremity.nailColorNames[index]; } getSluttiness() { return this.getGenderValue(); } getGenderValue() { let nailPaintedCorrection = this.nailColor * 50; let nailPaintedCorrectionWeight = this.nailsPainted ? 3 : 0; let gv = this.genderValue; let gw = this.genderWeight; return ((gv * gw) + (nailPaintedCorrection * nailPaintedCorrectionWeight)) / (gw + nailPaintedCorrectionWeight); } arrangeGenderValue(gv) { this.genderValue = gv; this.nailsPainted = gv > 60; if (this.nailsPainted) { if (gv > 70) { this.nailColor = 2; } else { this.nailColor = 1; } } this.getPartOne().invalidateCaches(); } } HumanoidExtremity.nailColorNames = ['none', 'red', 'pink']; class HumanoidFeet extends HumanoidExtremity { constructor() { super(...arguments); this.sorenessWeight = Bodypart.WEIGHT_LOW; this.genderWeight = Bodypart.WEIGHT_LOW; this.slots = [Humanoid.SLOT_FEET]; } getDescription() { let say = new Say(); if (this.genderValue > 55) { say.add("Your feet are small and cute."); } else if (this.genderValue < 45) { say.add("Your feet are big and mannish."); } if (this.nailsPainted) { say.add(" Your toenails are painted " + HumanoidExtremity.getColor(this.nailColor) + "."); } return say; } } class HumanoidHands extends HumanoidExtremity { constructor() { super(...arguments); this.sorenessWeight = Bodypart.WEIGHT_LOW; this.genderWeight = Bodypart.WEIGHT_MEDIUM; this.slots = [Humanoid.SLOT_HANDS]; } getDescription() { let say = new Say(); if (this.genderValue > 55) { say.add("Your hands are delicate and slender."); } else if (this.genderValue < 45) { say.add("Your hands are rough and large."); } if (this.nailsPainted) { say.add(" Your toenails are painted " + HumanoidExtremity.getColor(this.nailColor) + "."); } return say; } } class HumanoidHead extends Bodypart { constructor() { super(...arguments); this.sorenessWeight = Bodypart.WEIGHT_MEDIUM; this.genderWeight = Bodypart.WEIGHT_LOW; this.slots = [Humanoid.SLOT_HEADGEAR, Humanoid.SLOT_HAIR, Humanoid.SLOT_EARS, Humanoid.SLOT_FACE, Humanoid.SLOT_EYES, , Humanoid.SLOT_NOSE, Humanoid.SLOT_MOUTH]; } } class HumanoidPenis extends SexStick { constructor(options) { super(options); this.sorenessWeight = Bodypart.WEIGHT_HIGH; this.genderValue = 25; this.genderWeight = Bodypart.WEIGHT_HIGHEST; this.slots = [Humanoid.SLOT_CROTCH_FRONT]; this.sluttiness = Bodypart.SLUTTINESS_HIGH_SLUT; this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM; this.flaccidSize = new Measure(6); this.flaccidWidth = new Measure(3); this.erectSize = new Measure(15); this.erectWidth = new Measure(6); this.arousalMinimum = 5; this.arousalErect = 25; if (Math.random() >= 0.5) { this.flaccidMult = 0.33; } else { this.flaccidMult = 0.77; } this.addGetAlterations((thing) => { return { FSize: this.flaccidSize.getNumber(), FWidth: this.flaccidWidth.getNumber(), ESize: this.erectSize.getNumber(), EWidth: this.erectWidth.getNumber(), AMin: this.arousalMinimum, AErect: this.arousalErect, FMult: this.flaccidMult }; }); this.addSetAlterations((thing, changes) => { this.flaccidSize = new Measure(changes.FSize); this.flaccidWidth = new Measure(changes.FWidth); this.erectSize = new Measure(changes.ESize); this.erectWidth = new Measure(changes.EWidth); this.arousalMinimum = changes.AMin; this.arousalErect = changes.AErect; this.flaccidMult = changes.FMult; }); } getSluttiness() { return this.getBulgeSize() * 3; } isGrower() { return this.flaccidMult < 0.5; } getActualSize() { let min = this.flaccidSize.getNumber(); let max = this.erectSize.getNumber(); let variableSize = (max - min); let finalSize = min + (variableSize * this.getArousalPerc()); return finalSize; } isBig() { return this.getBulgeSize() > 22; } getArousalPerc() { let arousal = 0; let numSteps = this.arousalErect - this.arousalMinimum; let arousalPerc = (arousal - this.arousalMinimum) / numSteps; arousalPerc = arousalPerc < 0 ? 0 : arousalPerc > 1 ? 1 : arousalPerc; return arousalPerc; } isFlaccid() { return this.getArousalPerc() < 0.6; } isErect() { return !this.isFlaccid(); } getActualWidth() { let min = this.flaccidWidth.getNumber(); let max = this.erectWidth.getNumber(); let variableSize = (max - min); let numSteps = this.arousalErect - this.arousalMinimum; let arousal = 0; let arousalPerc = (arousal - this.arousalMinimum) / numSteps; arousalPerc = arousalPerc < 0 ? 0 : arousalPerc > 1 ? 1 : arousalPerc; let finalSize = min + (variableSize * arousalPerc); return finalSize; } getLong() { return new Measure(this.getActualSize()); } getWide() { return new Measure(this.getActualWidth()); } getBulgeSize() { return this.getActualSize() + (3 * this.getActualWidth()); } getSizeText() { return HumanoidPenis.getSizeText(this.getBulgeSize()); } static getSizeText(size) { let sizeTable = [ [0, "nonexistent"], [1, "tiny"], [20, "small"], [23, "medium"], [27, "big"], [32, "huge"], [36, "monstrous"] ]; let i; for (i = 1; i < sizeTable.length && sizeTable[i][0] < size; i++) { } return sizeTable[i - 1][1]; } getGenderValue() { let sizeTable = [ [10, 60], [20, 45], [23, 35], [27, 28], [32, 24], [36, 18] ]; let i; for (i = 1; i < sizeTable.length && sizeTable[i][0] < this.getActualSize(); i++) { } return sizeTable[i - 1][1]; } arrangeGenderValue(gv) { let sizeTable = [ [60, 3, 2], [45, 10, 3], [35, 14, 3], [28, 17, 3], [24, 19, 4], [18, 22, 4.5] ]; let i; for (i = 1; i < sizeTable.length && sizeTable[i][0] > gv; i++) { } this.flaccidSize = new Measure(this.flaccidMult * sizeTable[i - 1][1]); this.flaccidWidth = new Measure(this.flaccidMult * sizeTable[i - 1][2]); this.erectSize = new Measure(sizeTable[i - 1][1]); this.erectWidth = new Measure(sizeTable[i - 1][2]); this.getPartOne().invalidateCaches(); } static getSynonym() { let cockNames = [ "cock", "dick" ]; return (new OneOf(OneOf.PURELY_AT_RANDOM, ...cockNames).getOne()); } } class HumanoidSkin extends Bodypart { constructor(options) { super(options); this.sorenessWeight = 0; this.genderWeight = Bodypart.WEIGHT_MEDIUM; this.slots = [ Humanoid.SLOT_FACE, Humanoid.SLOT_NECK, Humanoid.SLOT_SHOULDERS, Humanoid.SLOT_ARMS, Humanoid.SLOT_HANDS, Humanoid.SLOT_UPPER_CHEST, Humanoid.SLOT_MIDRIFF, Humanoid.SLOT_WAIST, Humanoid.SLOT_BACK, Humanoid.SLOT_HIPS, Humanoid.SLOT_BUTT, Humanoid.SLOT_LEG_UPPER, Humanoid.SLOT_LEG_LOWER ]; this.skinSoftness = 5; this.skinHairiness = 2; this.addGetAlterations((thing) => { return { Softness: this.skinSoftness, Hairiness: this.skinHairiness }; }); this.addSetAlterations((thing, changes) => { this.skinSoftness = changes.Softness; this.skinHairiness = changes.Hairiness; }); } getSluttiness() { return this.getGenderValue(); } getDescription() { let owner = this.getPartOne(); let green = (owner.getStat(Attributes.Corruption) > 50); let say = new Say("Your skin is "); if (this.skinSoftness > 7) { say.add("perfectly smooth"); } else if (this.skinSoftness > 4) { say.add("smooth"); } else { say.add("rough"); } say.add(" and "); if (this.skinHairiness > 8) { say.add("hairy, like a gorilla's"); } else if (this.skinHairiness > 6) { say.add("hairy"); } else if (this.skinHairiness > 3) { say.add("somewhat hairless"); } else { say.add("completely hairless"); } say.add("."); if (green) { say.add(" The taint of your corruption has turned your skin green, like an orc's."); } return say; } getGenderValue() { let softnessRank = this.skinSoftness * 100; let hairinessRank = 1000 - (this.skinHairiness * 100); return (softnessRank + hairinessRank) / 20; } arrangeGenderValue(genderValue) { let ideal = genderValue / 10; this.skinHairiness = 10 - Math.round(ideal); this.skinSoftness = Math.round(ideal); this.getPartOne().invalidateCaches(); } } class HumanoidTesticles extends Bodypart { constructor(options) { super(options); this.size = 1; this.sorenessWeight = Bodypart.WEIGHT_HIGH; this.genderWeight = Bodypart.WEIGHT_HIGHEST; this.slots = [Humanoid.SLOT_CROTCH_FRONT]; this.sluttiness = Bodypart.SLUTTINESS_MEDIUM_AVERAGE; this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM; this.addGetAlterations((thing) => { return { Size: this.size }; }); this.addSetAlterations((thing, changes) => { this.size = changes.Size; }); } getBulgeSize() { return this.size; } getGenderWeight() { return 80; } } class HumanoidVagina extends SexHole { constructor() { super(...arguments); this.genderValue = 85; this.genderWeight = Bodypart.WEIGHT_HIGHEST; this.slots = [Humanoid.SLOT_CROTCH_FRONT]; this.sluttiness = 50; this.sluttinessWeight = Bodypart.WEIGHT_MEDIUM; } getSluttiness() { let slut = 100 - this.genderValue; let obscenelyOpen = false; slut += obscenelyOpen ? 25 : 0; return slut; } getDescription() { let say = new Say("Your "); let hairless = this.genderValue >= 80; let smallClit = this.genderValue >= 55; let innie = this.genderValue > 70; let obscenelyOpen = false; if (hairless) { say.add("hairless ", Say.PUSSY); } else { say.add("hairy ", Say.PUSSY); } say.add(" "); if (innie) { say.add("is usually completely covered by its lips"); } else { say.add("has some curtains escaping its lips"); } if (!smallClit) { say.add(" and has an oversized clit"); } say.add("."); if (obscenelyOpen) { say.add(" It is currently stretched open obscenely."); } return say; } arrangeGenderValue(gv) { gv = (gv / 2) + 50; this.genderValue = gv; this.getPartOne().invalidateCaches(); return; } static getSynonym() { let cockNames = [ "pussy", "womanhood" ]; return (new OneOf(OneOf.PURELY_AT_RANDOM, ...cockNames).getOne()); } } class HumanoidTorso extends Bodypart { constructor() { super(...arguments); this.genderWeight = 0; this.sluttinessWeight = 0; } } class Clothing extends Thing { constructor() { super(...arguments); this.slots = []; this.transparentSlots = []; this.layer = Clothing.LAYER_MEDIUM; this.isVisible = false; this.visibleOn = []; this.breastPadding = 0; this.maxBreastSize = -1; this.tightBreastSize = -1; this.looseBreastSize = 0; this.crotchPadding = 0; this.maxCrotchSize = -1; this.tightCrotchSize = -1; this.looseCrotchSize = 0; this.buttPadding = 0; this.maxButtSize = -1; this.tightButtSize = -1; this.looseButtSize = 0; this.genderValue = 50; this.sluttinessValue = 40; } updateStatus() { this.visibleOn = []; this.visibleOn.push(...this.slots); let wearer = Thing.WearRelation.getLeft(this); if (wearer == undefined) return; let cloths = Thing.WearRelation.getRight(wearer); let coveredSlots = []; for (let i = 0; i < cloths.length; i++) { let worn = cloths[i]; if ((worn != this) && worn.layer > this.layer) { coveredSlots.push(...worn.getCoveringSlots()); } } this.visibleOn = this.visibleOn.filter(visible => { return coveredSlots.indexOf(visible) == -1; }); this.isVisible = this.visibleOn.length > 0; } getCoveringSlots() { if (this.transparentSlots.length == 0) { return this.slots.slice(0); } return this.slots.filter((value, index, array) => { return this.transparentSlots.indexOf(value) == -1; }); } getGenderWeight() { return this.visibleOn.length; } getGenderValue() { return this.genderValue; } getSluttinessWeight() { return this.visibleOn.length; } getSluttinessValue() { return this.sluttinessValue; } static getGenderValueOn(p) { let weight = 0; let value = 0; let clothes = Thing.WearRelation.getRight(p); for (let i = 0; i < clothes.length; i++) { weight += clothes[i].getGenderWeight(); value += clothes[i].getGenderWeight() * clothes[i].getGenderValue(); } return { weight: weight, value: value }; } static getSluttinessValueOn(p) { let weight = 0; let value = 0; let clothes = Thing.WearRelation.getRight(p); for (let i = 0; i < clothes.length; i++) { weight += clothes[i].getSluttinessWeight(); value += clothes[i].getSluttinessWeight() * clothes[i].getSluttinessValue(); } return { weight: weight, value: value }; } } Clothing.LAYER_LOWEST = 0; Clothing.LAYER_LOW = 5; Clothing.LAYER_MEDIUM = 10; Clothing.LAYER_HIGH = 15; Clothing.LAYER_HIGHEST = 20; class ActionRemove extends Action { getCommandText() { return "take off " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } getClothing() { return this.getNoun(0); } } ActionRemove.check = new Rulebook("Check Removing"); ActionRemove.carry = new Rulebook("Carry out Removing"); ActionRemove.checkIsWearable = ActionRemove.check.createAndAddRule({ name: "Is noun a clothing", firstPriority: Rule.PRIORITY_HIGHEST, code: (runner) => { let action = runner.noun; let noun = action.getClothing(); if (!(noun instanceof Clothing)) { if (action.actor == WorldState.player) { action.say.add("You can only remove Clothing."); } return false; } } }); ActionRemove.checkIsHeld = ActionRemove.check.createAndAddRule({ name: "Is noun worn", firstPriority: Rule.PRIORITY_HIGH, code: async (runner) => { let action = runner.noun; let noun = action.getClothing(); if (!Thing.WearRelation.isRight(action.actor, noun)) { if (action.actor == WorldState.player) { action.say.add("You are not wearing it."); } return false; } } }); ActionRemove.carryDefault = ActionRemove.carry.createAndAddRule({ name: "Set Clothing as Carried", firstPriority: Rule.PRIORITY_MEDIUM, code: (runner) => { let action = runner.noun; let noun = action.getClothing(); Thing.CarryRelation.setRelation(action.actor, noun); let actor = action.actor; let thing = action.getNoun(0); if (actor == WorldState.player) { action.say.add(new SayBold(thing, ": "), "Removed."); } else { action.say.add(new SayThe(), actor, " takes off ", new SayThe(), thing, "."); } } }); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({ name: "Hyperlink - Remove", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let thing = rulebook.noun; if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) { Elements.HyperlinkHandler.addAvailableAction("Remove", new ActionRemove(WorldState.player, thing)); } } })); Elements.InventoryHandler.LinkingThing.addRule(new Rule({ name: "Inventory - Remove", firstPriority: Rule.PRIORITY_LOWEST, code: (rulebook) => { let thing = rulebook.noun; if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) { Elements.InventoryHandler.printThingLink("R", new ActionRemove(WorldState.player, thing)); } } })); class ActionWear extends Action { getCommandText() { return "wear " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } getClothing() { return this.getNoun(0); } } ActionWear.check = new Rulebook("Check Wearing"); ActionWear.carry = new Rulebook("Carry out Wearing"); ActionWear.checkIsWearable = ActionWear.check.createAndAddRule({ name: "Is noun a clothing", firstPriority: Rule.PRIORITY_HIGHEST, code: (runner) => { let action = runner.noun; let noun = action.getClothing(); if (!(noun instanceof Clothing)) { if (action.actor == WorldState.player) { action.say.add("You can only wear Clothing."); } return false; } } }); ActionWear.checkIsHeld = ActionWear.check.createAndAddRule({ name: "Is noun held", firstPriority: Rule.PRIORITY_HIGH, code: async (runner) => { let action = runner.noun; let noun = action.getClothing(); if (!Thing.CarryRelation.isRight(action.actor, noun)) { if (action.actor == WorldState.player) { action.say.add("(first taking the ", noun, ")", Say.LINE_BREAK); } let takingAction = new ActionTake(action.actor, noun); await takingAction.execute(); action.say.add(takingAction.say); if (!Thing.CarryRelation.isRight(action.actor, noun)) { return false; } } } }); ActionWear.carryDefault = ActionWear.carry.createAndAddRule({ name: "Set Clothing as Worn", firstPriority: Rule.PRIORITY_MEDIUM, code: (runner) => { let action = runner.noun; let noun = action.getClothing(); Thing.WearRelation.setRelation(action.actor, noun); let actor = action.actor; let thing = action.getNoun(0); if (actor == WorldState.player) { action.say.add(new SayBold(thing, ": "), "Worn."); } else { action.say.add(new SayThe(), actor, " puts on ", new SayThe(), thing, "."); } } }); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({ name: "Hyperlink - Wear", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let thing = rulebook.noun; if (thing instanceof Clothing && !(Thing.WearRelation.isRight(WorldState.player, thing))) { Elements.HyperlinkHandler.addAvailableAction("Wear", new ActionWear(WorldState.player, thing)); } } })); Elements.InventoryHandler.LinkingThing.addRule(new Rule({ name: "Inventory - Wear", firstPriority: Rule.PRIORITY_LOWEST, code: (rulebook) => { let thing = rulebook.noun; if (thing instanceof Clothing && !(Thing.WearRelation.isRight(WorldState.player, thing))) { Elements.InventoryHandler.printThingLink("W", new ActionWear(WorldState.player, thing)); } } })); class Humanoid extends Person { constructor(options) { super(options); this.breastVisibleSize = 0; this.isBreastVisible = false; this.isBreastTight = false; this.isBreastLoose = false; this.crotchVisibleSize = 0; this.isCrotchVisible = false; this.isCrotchTight = false; this.buttVisibleSize = 0; this.isButtVisible = false; this.isButtTight = false; this.isGenderCached = false; this.isSluttinessCached = false; this.uncoveredSlots = []; this.addParts(new HumanoidSkin(), new HumanoidHead(), new HumanoidArms(), new HumanoidHands(), new HumanoidBreasts(), new HumanoidFeet(), new HumanoidTorso(), new HumanoidButt()); if (options.isMale) { this.addMaleParts(); this.setGenderValue(25); } else { this.addFemaleParts(); this.setGenderValue(75); } this.addGetAlterations((humanoid) => { if (humanoid.isPlayer()) { return { HumanoidGender: humanoid.isMale() ? Humanoid.SEX_MALE : humanoid.isFemale() ? Humanoid.SEX_FEMALE : Humanoid.SEX_HERM }; } }); this.addSetAlterations((humanoid, changes) => { if (humanoid.isPlayer()) { humanoid.removeGenderedParts(); if (changes.HumanoidGender == Humanoid.SEX_MALE) { humanoid.addMaleParts(); } else if (changes.HumanoidGender == Humanoid.SEX_FEMALE) { humanoid.addFemaleParts(); } else { humanoid.addMaleParts(); humanoid.addFemaleParts(); } } }); } invalidateCaches() { this.isGenderCached = false; this.isSluttinessCached = false; } getGenderValue() { if (!this.isSluttinessCached) { this.updateCaches(); } return this.cachedGenderValue; } getSluttiness() { if (!this.isSluttinessCached) { this.updateCaches(); } return this.cachedSluttiness; } getBulges() { if (!this.isGenderCached) { this.updateCaches(); } return this.cachedBulges; } updateCaches() { this.updateClothing(); this.updateSlots(); this.updateBodyparts(); this.updateBulges(); this.updateGenderValue(); this.updateSluttiness(); } updateSlots() { this.uncoveredSlots = []; for (let i = 0; i < Humanoid.SLOT_SLOT_COUNT; i++) { this.uncoveredSlots.push(i); } let clothing = Thing.WearRelation.getRightType(this, Clothing); for (let i = 0; i < clothing.length; i++) { let covering = clothing[i].getCoveringSlots(); for (let k = 0; k < covering.length; k++) { let idx = this.uncoveredSlots.indexOf(covering[k]); if (idx >= 0) { this.uncoveredSlots.splice(idx, 1); } } if (this.uncoveredSlots.length == 0) break; } } updateGenderValue() { let clothingGender = Clothing.getGenderValueOn(this); let bodypartGender = Bodypart.getGenderValueOn(this); let genderWeight = clothingGender.weight + bodypartGender.weight; let genderValue = clothingGender.value + bodypartGender.value; let correctionWeight = Bodypart.WEIGHT_HIGHEST; let correctionValue = this.getStat(Attributes.GenderIdentity) * Bodypart.WEIGHT_HIGHEST; let hasPenis = false; let hasVagina = false; if (this.isCrotchVisible) { if (Thing.PartRelation.getRightTypeOne(this, HumanoidPenis) != undefined) { hasPenis = true; hasVagina = false; correctionValue += 0 * Bodypart.WEIGHT_LOWEST; correctionWeight += Bodypart.WEIGHT_LOWEST; } else if (Thing.PartRelation.getRightTypeOne(this, HumanoidVagina) != undefined) { hasPenis = false; hasVagina = true; correctionValue += 100 * Bodypart.WEIGHT_LOWEST; correctionWeight += Bodypart.WEIGHT_LOWEST; } } if (this.breastVisibleSize > 0) { correctionValue += 100 * Bodypart.WEIGHT_LOWEST; correctionWeight += Bodypart.WEIGHT_LOWEST; } if (this.crotchVisibleSize > 0 && !hasVagina) { correctionValue += 0 * Bodypart.WEIGHT_LOWEST; correctionWeight += Bodypart.WEIGHT_LOWEST; } let genderValueFinal = genderValue / genderWeight; let genderValueCorrected = (genderValue + correctionValue) / (genderWeight + correctionWeight); this.cachedGenderValue = { hasTits: this.breastVisibleSize > 1, hasPenisBulge: this.crotchVisibleSize > 0 && !hasVagina, hasPenis: hasPenis, hasVagina: hasVagina, genderValue: genderValueFinal, genderValueCorrected: genderValueCorrected }; this.isGenderCached = true; } isVisibleOn(slot) { return this.uncoveredSlots.indexOf(slot) != -1; } updateSluttiness() { let clothingSluttiness = Clothing.getSluttinessValueOn(this); let bodypartSluttiness = Bodypart.getSluttinessValueOn(this); let sluttinessWeight = clothingSluttiness.weight + bodypartSluttiness.weight; let sluttinessValue = clothingSluttiness.value + bodypartSluttiness.value; let correctionWeight = 0; let correctionValue = 0; let somewhatSlutty = [Humanoid.SLOT_MIDRIFF, Humanoid.SLOT_LEG_UPPER, Humanoid.SLOT_WAIST, Humanoid.SLOT_HIPS, Humanoid.SLOT_BACK]; for (let i = 0; i < somewhatSlutty.length; i++) { if (this.isVisibleOn(somewhatSlutty[i])) { correctionWeight += 1; correctionValue += 75; } } let verySlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]; for (let i = 0; i < verySlutty.length; i++) { if (this.isVisibleOn(verySlutty[i])) { correctionWeight += 3; correctionValue += 75; } } if ((this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) > 0.75) { let extremeSlutty = [Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]; for (let i = 0; i < extremeSlutty.length; i++) { if (this.isVisibleOn(extremeSlutty[i])) { correctionWeight += 5; correctionValue += 85; } } } let halfNaked; let naked; if (!this.isMale()) { halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 && !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]); naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 && this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]); } else { if (this.hasBreasts()) { halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 && !this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]); naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 && this.isVisibleOnArray([Humanoid.SLOT_BREASTS, Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]); } else { halfNaked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.5 && !this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK]); naked = (this.isVisibleOn.length / Humanoid.SLOT_SLOT_COUNT) < 0.3 && this.isVisibleOnArray([Humanoid.SLOT_CROTCH_FRONT, Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_BUTT]); } } let sluttinessValueFinal = sluttinessValue / sluttinessWeight; let sluttinessCorrected = (sluttinessValue + correctionValue) / (sluttinessWeight + correctionWeight); this.cachedSluttiness = { halfNaked: halfNaked, naked: naked, sluttiness: sluttinessValueFinal, sluttinessCorrected: sluttinessCorrected }; this.isSluttinessCached = true; } isVisibleOnArray(arr) { for (let i = 0; i < arr.length; i++) { if (!this.isVisibleOn(arr[i])) { return false; } } return true; } addMaleParts() { if (!this.isMale() && !this.isHerm()) { this.addParts(new HumanoidTesticles(), new HumanoidPenis()); } this.invalidateCaches(); } addFemaleParts() { if (!this.isFemale() && !this.isHerm()) { this.addParts(new HumanoidVagina()); } this.invalidateCaches(); } removeGenderedParts() { this.removeParts(HumanoidVagina); this.removeParts(HumanoidPenis); this.removeParts(HumanoidTesticles); this.invalidateCaches(); } setGenderValue(value) { let bp = this.getParts(Bodypart); for (let i = 0; i < bp.length; i++) { if (bp[i] instanceof HumanoidBreasts && this.isMale()) { bp[i].arrangeGenderValue(0); } else { bp[i].arrangeGenderValue(value); } } } updateBodyparts() { let parts = Thing.PartRelation.getRightType(this, Bodypart); for (let i = 0; i < parts.length; i++) { parts[i].updateStatus(); } } updateClothing() { let clothes = Thing.WearRelation.getRightType(this, Clothing); for (let i = 0; i < clothes.length; i++) { clothes[i].updateStatus(); } } updateBulges() { let clothes = Thing.WearRelation.getRightType(this, Clothing).sort(function (a, b) { return a.layer - b.layer; }); this.isBreastVisible = true; this.isCrotchVisible = true; this.isButtVisible = true; let bras = []; let butts = []; let junks = []; clothes.forEach((cloth) => { cloth.updateStatus(); if (cloth.slots.indexOf(Humanoid.SLOT_BREASTS) != -1) { bras.push(cloth); if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BREASTS) == -1) { this.isBreastVisible = false; } } if (cloth.slots.indexOf(Humanoid.SLOT_BUTT) != -1) { butts.push(cloth); if (cloth.transparentSlots.indexOf(Humanoid.SLOT_BUTT) == -1) { this.isButtVisible = false; } } if (cloth.slots.indexOf(Humanoid.SLOT_CROTCH_FRONT) != -1) { junks.push(cloth); if (cloth.transparentSlots.indexOf(Humanoid.SLOT_CROTCH_FRONT) == -1) { this.isCrotchVisible = false; } } }); this.updateBreastSizes(bras); this.updateCrotchSizes(junks); this.updateButtSizes(butts); this.cachedBulges = { breasts: this.breastVisibleSize, butt: this.buttVisibleSize, crotch: this.crotchVisibleSize, waist: 0 }; } getTopClothOn(slot) { return Thing.WearRelation.getRightType(this, Clothing).filter(otherCloth => { return otherCloth.visibleOn.includes(slot); }).sort((a, b) => { return a.layer - b.layer; })[0]; } updateBreastSizes(bras) { this.isBreastTight = false; this.isBreastLoose = true; let breasts = Thing.PartRelation.getRightTypeOne(this, HumanoidBreasts); this.breastVisibleSize = breasts.getSize(); bras.forEach((bra) => { if (bra.tightBreastSize >= 0 && this.breastVisibleSize > bra.tightBreastSize) { this.isBreastTight = true; } if (bra.maxBreastSize >= 0 && this.breastVisibleSize > bra.maxBreastSize) { this.breastVisibleSize = bra.maxBreastSize; } if (this.breastVisibleSize >= bra.looseBreastSize) { this.isBreastLoose = false; } this.breastVisibleSize += bra.breastPadding; if (this.breastVisibleSize < 0) { this.breastVisibleSize = 0; } }); } updateCrotchSizes(cloths) { this.isCrotchTight = false; this.crotchVisibleSize = 0; let penis = Thing.PartRelation.getRightTypeOne(this, HumanoidPenis); let testicles = Thing.PartRelation.getRightTypeOne(this, HumanoidTesticles); this.crotchVisibleSize = 0; if (penis != undefined) { this.crotchVisibleSize += penis.getBulgeSize(); } if (testicles != undefined) { this.crotchVisibleSize += testicles.getBulgeSize(); } this.crotchVisibleSize = Math.floor(this.crotchVisibleSize * 10) / 10; cloths.forEach((worn) => { if (worn.tightCrotchSize >= 0 && this.crotchVisibleSize > worn.tightCrotchSize) { this.isCrotchTight = true; } if (worn.maxCrotchSize >= 0 && this.crotchVisibleSize > worn.maxCrotchSize) { this.crotchVisibleSize = worn.maxCrotchSize; } this.crotchVisibleSize += worn.crotchPadding; if (this.crotchVisibleSize < 0) { this.crotchVisibleSize = 0; } }); } updateButtSizes(cloths) { this.isButtTight = false; let butt = Thing.PartRelation.getRightTypeOne(this, HumanoidButt); this.buttVisibleSize = butt == undefined ? 0 : butt.getSize(); cloths.forEach((worn) => { if (worn.tightButtSize >= 0 && this.buttVisibleSize > worn.tightButtSize) { this.isButtTight = true; } if (worn.maxButtSize >= 0 && this.buttVisibleSize > worn.maxButtSize) { this.buttVisibleSize = worn.maxButtSize; } this.buttVisibleSize += worn.buttPadding; if (this.buttVisibleSize < 0) { this.buttVisibleSize = 0; } }); } hasBreasts() { let breasts = this.getPart(HumanoidBreasts); if (breasts.size > 1) { return true; } return false; } isMale() { return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length == 0; } isFemale() { return this.getParts(HumanoidPenis).length == 0 && this.getParts(HumanoidVagina).length > 0; } isHerm() { return this.getParts(HumanoidPenis).length > 0 && this.getParts(HumanoidVagina).length > 0; } getShortestDescription() { let playerGender = this.getGenderValue(); let playerSluttiness = this.getSluttiness(); let presentation = ""; if (playerSluttiness.sluttinessCorrected > 75) { presentation += ("slutty, "); } else if (playerSluttiness.sluttinessCorrected > 35) { } else if (playerSluttiness.sluttinessCorrected > 20) { presentation += ("prude, "); } else { presentation += ("saintly, "); } if (playerGender.genderValueCorrected < 40) { presentation += ("masculine "); } else if (playerGender.genderValueCorrected < 60) { presentation += ("androgynous "); } else { presentation += ("feminine "); } if (playerGender.hasTits) { if (playerGender.hasPenis || playerGender.hasPenisBulge) { presentation += ("shemale"); } else if (playerGender.hasVagina) { presentation += ("woman"); } } else { if (playerGender.hasPenis) { if (playerGender.genderValueCorrected < 60) { presentation += ("man"); } else { presentation += ("trap"); } } else if (playerGender.hasPenisBulge) { if (playerGender.genderValueCorrected < 60) { presentation += ("man"); } else { presentation += ("trap"); } } else if (playerGender.hasVagina) { presentation += ("woman"); } } return presentation; } static getPlayerDescription() { let say = new Say(); say.add("You are "); let player = WorldState.player; let male = player.getParts(HumanoidPenis).length > 0; let female = player.getParts(HumanoidVagina).length > 0; if (male && female) { say.add("hermaphrodite"); } else if (male) { say.add("male"); } else { say.add("female"); } say.add(". You are presenting as ", new SayAn(), player.getShortestDescription() + ". "); say.add(Attributes.GenderIdentity.getDescription(player.getStat(Attributes.GenderIdentity))); let sv = player.getSluttiness(); let bulges = player.getBulges(); let coveredPerc = 1 - (player.uncoveredSlots.length / Humanoid.SLOT_SLOT_COUNT); say.add(" ", player.getPart(HumanoidSkin).getDescription()); if (sv.halfNaked) { say.add(" You are almost naked. "); } else if (sv.naked) { say.add(" You are naked. "); } else if (coveredPerc < 0.2) { say.add("You are not showing much of it, though."); } say.add(Attributes.Degeneration.getDescription(player.getStat(Attributes.Degeneration))); say.add(Say.PARAGRAPH_BREAK); say.add(player.getPart(HumanoidArms).getDescription(), " "); say.add(player.getPart(HumanoidHands).getDescription(), " "); say.add(player.getPart(HumanoidFeet).getDescription(), " "); let penis = player.getPart(HumanoidPenis); let vagina = player.getPart(HumanoidVagina); if (penis != undefined) { say.add("You have a ", penis.getSizeText(), (penis.isFlaccid() ? " flaccid " : " erect "), Say.COCK, " between your legs"); if (!penis.isBig() && penis.isGrower() && penis.isFlaccid()) { say.add(", which is okay, since you're a grower, not a shower"); } if (penis.isUncovered()) { let oneOf = new OneOf(OneOf.PURELY_AT_RANDOM, ...[ ", it is not covered by any clothing", ", it is not covered by any clothes", ", it is uncovered", ", it is visible to all", ", it is hanging freely" ]); say.add(oneOf.getOne()); } let testicles = player.getPart(HumanoidTesticles); if (HumanoidPenis.getSizeText(bulges.crotch) != HumanoidPenis.getSizeText(penis.getBulgeSize() + testicles.getBulgeSize())) { say.add(", but it looks like it's actually ", HumanoidPenis.getSizeText(bulges.crotch), " due to your clothing"); } say.add(". "); if (testicles != undefined) { } } else { say.add(vagina.getDescription()); } say.add(" "); let breasts = player.getPart(HumanoidBreasts); let butt = player.getPart(HumanoidButt); say.add("You have ", breasts.getSizeText(), " breasts and a ", butt.getSizeText(), " butt."); if (bulges.breasts != breasts.getSize() && bulges.butt != butt.getSize()) { say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts), " and make your butt appear ", HumanoidButt.getSizeText(bulges.butt), "."); } else if (bulges.breasts != breasts.getSize()) { say.add(" Your clothing makes your breasts look like they're actually ", HumanoidBreasts.getSizeText(bulges.breasts), "."); } else if (bulges.butt != butt.getSize()) { say.add(" Your clothing makes your butt appear ", HumanoidButt.getSizeText(bulges.butt), "."); } say.add(Say.PARAGRAPH_BREAK); let clothingSluttiness = Clothing.getSluttinessValueOn(player); let bodypartSluttiness = Bodypart.getSluttinessValueOn(player); if (clothingSluttiness.weight > 0) { let clothingSluttinessFinal = clothingSluttiness.value / clothingSluttiness.weight; if (clothingSluttinessFinal > 75) { say.add("Your outfit can only be described as \"whore-ish\", it is far too nasty."); } else if (clothingSluttinessFinal > 60) { say.add("Your clothing are obviously making you look a bit naughty."); } else if (clothingSluttinessFinal < 30 && sv.sluttinessCorrected < 30) { say.add("Your clothing are definitely a bit prude."); } else if (clothingSluttinessFinal < 15 && sv.sluttinessCorrected < 30) { say.add("Your outfit is so prude that it could be worn by a saint."); } } say.add(" "); if (bodypartSluttiness.weight > 0) { let bodypartSluttinessFinal = bodypartSluttiness.value / bodypartSluttiness.weight; if (bodypartSluttinessFinal > 75) { say.add("The way your body is makes you look like you were made purely for sex"); if (coveredPerc > 0.7) { say.add(", thankfully it's mostly covered"); } else if (coveredPerc < 0.2) { say.add(", and you didn't even bother covering it up"); } say.add("."); } else if (bodypartSluttinessFinal > 60) { say.add("Your body definitely has a lot of sex-appeal going on"); if (coveredPerc > 0.7) { say.add(", although it's covered"); } else if (coveredPerc < 0.2) { say.add(", proudly displayed for all to see"); } say.add("."); } else if (bodypartSluttinessFinal < 30) { say.add("You have very little sex-appeal, maybe you are a kitchen table?"); if (coveredPerc > 0.7) { say.add(" At least you covered it up."); } else if (coveredPerc < 0.2) { say.add(" Maybe you could cover it up a bit."); } } } say.add(Say.PARAGRAPH_BREAK); let stats = new SayLeftRight(); stats.addLeft(new SayBold("Strength: "), Attributes.Strength.getDescription(player.getStat(Attributes.Strength))); stats.addLeft(Say.LINE_BREAK); stats.addLeft(new SayBold("Agility: "), Attributes.Agility.getDescription(player.getStat(Attributes.Agility))); stats.addLeft(Say.LINE_BREAK); stats.addLeft(new SayBold("Charm: "), Attributes.Charm.getDescription(player.getStat(Attributes.Charm))); stats.addLeft(Say.LINE_BREAK); stats.addLeft(new SayBold("Intelligence: "), Attributes.Intelligence.getDescription(player.getStat(Attributes.Intelligence))); Skill.getSkills().forEach((skill) => { if (player.getSkill(skill) > 0) { stats.addRight(new SayBold(skill.id + ": "), skill.getDescription(player.getSkill(skill))); } }); say.add(stats); return say; } } Humanoid.SEX_MALE = 0; Humanoid.SEX_FEMALE = 1; Humanoid.SEX_HERM = 2; Humanoid.SLOT_HAIR = 0; Humanoid.SLOT_HEADGEAR = 1; Humanoid.SLOT_FACE = 2; Humanoid.SLOT_EARS = 3; Humanoid.SLOT_EYES = 4; Humanoid.SLOT_NOSE = 5; Humanoid.SLOT_MOUTH = 6; Humanoid.SLOT_NECK = 7; Humanoid.SLOT_SHOULDERS = 8; Humanoid.SLOT_ARMS = 9; Humanoid.SLOT_HANDS = 10; Humanoid.SLOT_FINGERS = 11; Humanoid.SLOT_FINGERNAILS = 12; Humanoid.SLOT_UPPER_CHEST = 13; Humanoid.SLOT_MIDRIFF = 14; Humanoid.SLOT_WAIST = 15; Humanoid.SLOT_BACK = 16; Humanoid.SLOT_HIPS = 17; Humanoid.SLOT_CROTCH_FRONT = 18; Humanoid.SLOT_CROTCH_BACK = 19; Humanoid.SLOT_BUTT = 20; Humanoid.SLOT_LEG_UPPER = 21; Humanoid.SLOT_LEG_LOWER = 22; Humanoid.SLOT_FEET = 23; Humanoid.SLOT_FEET_NAILS = 24; Humanoid.SLOT_BREASTS = 25; Humanoid.SLOT_SLOT_COUNT = 26; Humanoid.cacheInvalidationActionRule = new Rule({ name: "Invalidate humanoid caches", firstPriority: Rule.PRIORITY_LOWEST, code: (runner) => { runner.noun.actor.invalidateCaches(); }, conditions: (runner) => { return runner.noun.actor instanceof Humanoid; } }); ActionWear.carry.addRule(Humanoid.cacheInvalidationActionRule); ActionRemove.carry.addRule(Humanoid.cacheInvalidationActionRule); var WorldState; (function (WorldState) { var worldTurn = 0; var playerTurn = 0; WorldState.player = new Humanoid({ isMale: false }); WorldState.player.description = Humanoid.getPlayerDescription; var rememberedRooms = new StoredVariable({ id: "Remembered Rooms", value: [] }); var rememberedFodder = []; let rememberedRoomsForIntelligence = 2; let rememberedRoomsForSurvival = 1; WorldState.RememberingRoomRulebook = new Rulebook("Remembering Room something"); function isTurnWaiting() { return worldTurn < playerTurn; } WorldState.isTurnWaiting = isTurnWaiting; function incrementWorldTurn() { worldTurn++; } WorldState.incrementWorldTurn = incrementWorldTurn; function incrementPlayerTurn() { playerTurn++; } WorldState.incrementPlayerTurn = incrementPlayerTurn; function getCurrentTurn() { return playerTurn; } WorldState.getCurrentTurn = getCurrentTurn; function setCurrentTurn(turn) { playerTurn = turn; worldTurn = turn; } WorldState.setCurrentTurn = setCurrentTurn; WorldState.RememberingRoomInList = WorldState.RememberingRoomRulebook.createAndAddRule({ name: "Is room listed in remembered rooms?", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOW, code: runner => { if (rememberedRooms.value.indexOf(runner.noun.getName()) != -1 || rememberedFodder.indexOf(runner.noun) != -1) { return true; } } }); WorldState.RememberingRoomInMap = WorldState.RememberingRoomRulebook.createAndAddRule({ name: "Is room shown on a map?", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, code: runner => { let maps = Thing.CarryRelation.getRightType(WorldState.player, MapNote); for (let i = 0; i < maps.length; i++) { if (maps[i].contains(runner.noun)) { return true; } } } }); async function isRoomRemembered(room) { let result = await WorldState.RememberingRoomRulebook.execute({ noun: room }); return result == true; } WorldState.isRoomRemembered = isRoomRemembered; function getRememberedRooms() { return rememberedRooms.value; } WorldState.getRememberedRooms = getRememberedRooms; function getRememberedRoomsAsRooms() { let rooms = []; rememberedRooms.value.forEach(roomName => { let room = Room.getRoom(roomName); if (room != undefined) rooms.push(room); }); return rooms; } WorldState.getRememberedRoomsAsRooms = getRememberedRoomsAsRooms; function getMaximumRememberedRooms() { let intRooms = WorldState.player.getStat(Attributes.Intelligence) * rememberedRoomsForIntelligence; let skillRooms = WorldState.player.getSkill(Skills.Survival) * rememberedRoomsForSurvival; return intRooms + skillRooms; } WorldState.getMaximumRememberedRooms = getMaximumRememberedRooms; function truncateRooms() { while (rememberedRooms.value.length > getMaximumRememberedRooms()) { rememberedRooms.value.pop(); } } WorldState.truncateRooms = truncateRooms; function rememberRoom(...rooms) { rooms.forEach((value) => { if (value instanceof Room) { if (value.fodder) { if (rememberedFodder.indexOf(value) == -1) { rememberedFodder.push(value); } } else { let idx = rememberedRooms.value.indexOf(value.getName()); if (idx != -1) { rememberedRooms.value.splice(idx, 1); } rememberedRooms.value.unshift(value.getName()); } } }); truncateRooms(); } WorldState.rememberRoom = rememberRoom; function saveState() { let things = { carried: [], worn: [], wielded: [] }; return { Things: things }; } WorldState.saveState = saveState; WorldState.CorrectRememberedRoomsRule = PlayBegins.rulebook.createAndAddRule({ name: "Correct remembered rooms", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_MEDIUM, code: () => { let allRooms = rememberedRooms.value; let currentRoom = WorldState.player.getRoom(); if (allRooms.length == 0) { rememberedRooms.value = [currentRoom.getName()]; return; } let newRooms = []; function recursivelyAddRooms(room) { if (room instanceof RoomRandom) { if (room.fodder) { rememberedFodder.push(room); room.connections.forEach((newRoom) => { recursivelyAddRooms(newRoom); }); } else if (allRooms.indexOf(room.getName()) != -1 && newRooms.indexOf(room.getName()) == -1) { newRooms.push(room.getName()); room.connections.forEach((newRoom) => { recursivelyAddRooms(newRoom); }); } } } recursivelyAddRooms(currentRoom); rememberedRooms.value = newRooms; } }); })(WorldState || (WorldState = {})); class Region { constructor(name) { this.name = name; } place(...rooms) { rooms.forEach(room => { if (room instanceof Room) { Region.RegionRoom.setRelation(this, room); } else { Region.RegionRegion.setRelation(this, room); } }); } getRooms() { let rooms = Region.RegionRoom.getRight(this); Region.RegionRegion.getRight(this).forEach((region) => { Region.RegionRoom.getRight(region).forEach((room) => { rooms.push(room); }); }); return rooms; } containsRoom(room) { let directlyContained = Region.RegionRoom.getLeft(room) == this; if (directlyContained) { return true; } else if (Region.RegionRegion.getLeft(this) != undefined) { return this.getRooms().indexOf(room) != -1; } return false; } contains(thing) { let room = thing.getRoom(); if (room == undefined) { return false; } else { let regions = Region.InRelation.getAllLeft(room); return regions.indexOf(this) != -1; } } } Region.RegionRoom = new RelationOneToMany(); Region.RegionRegion = new RelationOneToMany(); Region.InRelation = new RelationHandlerStrictOneToMany(Region.RegionRegion, Region.RegionRoom); class Shuffler { constructor(array, rng) { this.position = 0; this.rng = rng == undefined ? Math.random : rng; this.array = array; } restart() { this.position = 0; } getOne() { if (this.position >= this.array.length) { return undefined; } let randomIndex = Math.floor(this.rng() * (this.array.length - this.position)) + this.position; let localCopy = this.array[this.position]; this.array[this.position] = this.array[randomIndex]; this.array[randomIndex] = localCopy; return this.array[this.position++]; } getShuffled() { let array = this.array.slice(0); var m = array.length, t, i; while (m) { i = Math.floor(this.rng() * m--); t = array[m]; array[m] = array[i]; array[i] = t; } return array; } } var AIRules; (function (AIRules) { AIRules.PickShiny = AI.rules.createAndAddRule({ name: "Pick Shinies", firstPriority: AIRules.PRIORITY_ACTING_ON_PLACE, conditions: (runner) => { let person = runner.noun; return person.AI.picksShinies; }, code: (runner) => { let person = runner.noun; let room = person.getRoom(); let visibleThings = room.getContainedAndVisibleTo(person); if (visibleThings.length > 0) { for (let i = 0; i < visibleThings.length; i++) { if (!visibleThings[i].fixedInPlace && visibleThings[i].getShiny()) { return new ActionTake(person, visibleThings[i]); } } } } }); })(AIRules || (AIRules = {})); var AIRules; (function (AIRules) { AIRules.Wander = AI.rules.createAndAddRule({ name: "Wander", firstPriority: AIRules.PRIORITY_ACTING_ON_IDLE, conditions: (runner) => { let person = runner.noun; return person.AI.wanderer && (Math.random() * 100) > person.AI.wanderChance; }, code: (runner) => { let person = runner.noun; let room = person.getRoom(); if (person.AI.wandersOn != undefined) { if (person.AI.wandersOn.containsRoom(room)) { let connections = room.connections.slice(); let realConnections = []; for (let i = 0; i < connections.length; i++) { if (connections[i] != undefined && person.AI.wandersOn.containsRoom(connections[i])) { realConnections.push(i); } } let direction = ((new Shuffler(realConnections)).getOne()); return new ActionGo(person, direction); } else { let regionRooms = person.AI.wandersOn.getRooms().filter((a) => { if (a instanceof RoomRandom && a.placed) { return true; } }); regionRooms.sort((a, b) => { let dist = a.getDistanceTo(b); if (dist != undefined) { return -dist; } else { return 0; } }); let targetRoom = regionRooms.pop(); return new ActionGo(person, targetRoom); } } else { let direction = room.getConnectedDirection(); return new ActionGo(person, direction); } } }); })(AIRules || (AIRules = {})); class ActionDrop extends Action { getCommandText() { return "drop " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } } ActionDrop.check = new Rulebook("Check Dropping"); ActionDrop.carry = new Rulebook("Carry out Dropping"); ActionDrop.check.addRule(new Rule({ name: "Check Dropping - Are you Wearing it?", firstPriority: Rule.PRIORITY_LOWEST, code: async (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); if (Thing.WearRelation.getLeft(thing) == actor || Thing.WieldRelation.getLeft(thing) == actor) { if (action.actor == WorldState.player) { action.say.add("(first taking off the ", thing, ")", Say.LINE_BREAK); } let takingAction = new ActionRemove(actor, thing); await takingAction.execute(); action.say.add(takingAction.say); if (Thing.WearRelation.getLeft(thing) == actor || Thing.WieldRelation.getLeft(thing) == actor) { return false; } action.say.add(Say.LINE_BREAK); } } })); ActionDrop.check.addRule(new Rule({ name: "Check Dropping - Do you have it??", firstPriority: Rule.PRIORITY_LOWEST, code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); if (Thing.CarryRelation.getLeft(thing) != actor) { if (actor == WorldState.player) { action.say.add("You don't have it."); } return false; } } })); ActionDrop.carry.addRule(new Rule({ name: "Dropping - Place the noun on the floor", code: (rulebook) => { let action = rulebook.noun; let actor = action.actor; let thing = action.getNoun(0); Thing.EnclosedRelation.unsetRight(thing); actor.getRoom().place(thing); if (actor == WorldState.player) { action.say.add(new SayBold(action.getNoun(0).getPrintedName() + ": "), "Dropped."); } else { action.say.add(new SayThe(), actor, " drops ", new SayThe(), action.getNoun(0), " on the floor."); } } })); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({ name: "Hyperlink - Drop", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let thing = rulebook.noun; if (Thing.CarryRelation.getLeft(thing) == WorldState.player || Thing.WieldRelation.getLeft(thing) == WorldState.player || Thing.WearRelation.getLeft(thing) == WorldState.player) { Elements.HyperlinkHandler.addAvailableAction("Drop", new ActionDrop(WorldState.player, thing)); } } })); Elements.InventoryHandler.LinkingThing.addRule(new Rule({ name: "Inventory - Drop", firstPriority: Rule.PRIORITY_LOWEST, code: (rulebook) => { let thing = rulebook.noun; Elements.InventoryHandler.printThingLink("D", new ActionDrop(WorldState.player, thing)); } })); class ActionInventory extends Action { constructor() { super(...arguments); this.requiresTurn = false; this.requiresNoun = false; this.requiresVisibility = false; } getCommandText() { return "take inventory"; } static async createButton(thing, resolve) { let p = document.createElement("p"); p.classList.add("choice"); let elements = await ((new Say(thing)).getPureElements()); elements.forEach(ele => { p.appendChild(ele); }); p.addEventListener("click", () => { resolve(thing); }); Controls.KeyHandler.applyCode(p, Controls.KeyHandler.getFirstKeyCode()); return p; } } ActionInventory.check = new Rulebook("Check Taking Inventory"); ActionInventory.carry = new Rulebook("Carry out Taking Inventory"); ActionInventory.checkInventoryRule = ActionInventory.check.createAndAddRule({ name: "List inventory as options", code: async (rulebook) => { let player = WorldState.player; let wielded = Thing.WieldRelation.getRight(player).sort(Elements.InventoryHandler.thingSort); let worn = Thing.WearRelation.getRight(player).sort(Elements.InventoryHandler.thingSort); let carried = Thing.CarryRelation.getRight(player).sort(Elements.InventoryHandler.thingSort); let buttons; let chosenPromise = new Promise((async (resolve) => { Controls.KeyHandler.reset(); let say = new Say(); if (wielded.length > 0) { say.add(new SayBold("Wielded:"), Say.LINE_BREAK); for (let i = 0; i < wielded.length; i++) { say.add(await ActionInventory.createButton(wielded[i], resolve)); } } if (worn.length > 0) { if (say.sequence.length > 0) { say.add(Say.PARAGRAPH_BREAK); } say.add(new SayBold("Worn:"), Say.LINE_BREAK); for (let i = 0; i < worn.length; i++) { say.add(await ActionInventory.createButton(worn[i], resolve)); } } if (carried.length > 0) { if (say.sequence.length > 0) { say.add(Say.PARAGRAPH_BREAK); } say.add(new SayBold("Carried:"), Say.LINE_BREAK); for (let i = 0; i < carried.length; i++) { say.add(await ActionInventory.createButton(carried[i], resolve)); } } if (say.sequence.length == 0) { return resolve(undefined); } buttons = await say.getHTMLContent(); Elements.CurrentTurnHandler.print(...(buttons)); })); let chosenThing = await chosenPromise; if (chosenThing != undefined) { Elements.CurrentTurnHandler.unprint(...buttons); Controls.KeyHandler.reset(); return new ActionExamine(WorldState.player, chosenThing); } else { rulebook.noun.say.add("You have nothing."); return false; } } }); Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({ name: "Add Take Inventory Command Rule", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_MEDIUM, code: (rulebook) => { Elements.HyperlinkHandler.addCommonAction("Inventory", new ActionInventory(WorldState.player)); } })); class ActionSaveGame extends Action { constructor() { super(...arguments); this.requiresTurn = false; this.requiresNoun = false; this.requiresVisibility = false; } getCommandText() { return "save to file"; } } ActionSaveGame.check = new Rulebook("Check Saving"); ActionSaveGame.carry = new Rulebook("Carry out Saving"); ActionSaveGame.carry.addRule(new Rule({ name: "Save the game", code: runner => { SaveHandler.saveToFile(); runner.noun.say.add("Saved."); } })); Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({ name: "Add Save Command Rule", firstPriority: Rule.PRIORITY_LOWEST, priority: Rule.PRIORITY_LOWEST, code: (rulebook) => { Elements.HyperlinkHandler.addCommonAction("Save", new ActionSaveGame(WorldState.player)); } })); class ActionTalk extends Action { getCommandText() { return "talk to " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } } ActionTalk.PRIORITY_SITUATION_DIALOGUE = 9; ActionTalk.PRIORITY_POSSESSION_DIALOGUE = 7; ActionTalk.PRIORITY_LOCATION_DIALOGUE = 5; ActionTalk.PRIORITY_COMMON_DIALOGUE = 3; ActionTalk.PRIORITY_GLOBAL_DIALOGUE = 1; ActionTalk.check = new Rulebook("Check Talking"); ActionTalk.carry = new Rulebook("Carry out Talking"); ActionTalk.defaultCarryTalkingRule = ActionTalk.carry.createAndAddRule({ name: "Talking - Doesn't want to talk", firstPriority: -1, priority: -1, code: (rulebook) => { let action = rulebook.noun; let thing = action.getNoun(0); if (thing instanceof Person) { action.say = new Say("It doesn't look like ", new SayHeSheIt(thing), " wants to talk."); } else { action.say = new Say("How are you going to talk to that?"); } } }); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule({ name: "Hyperlink - Talk", firstPriority: Rule.PRIORITY_HIGHEST, code: (rulebook) => { let thing = rulebook.noun; if (thing instanceof Person && thing.getRoom() == WorldState.player.getRoom()) { Elements.HyperlinkHandler.addAvailableAction("Talk", new ActionTalk(WorldState.player, thing)); } } })); class ActionWait extends Action { constructor() { super(...arguments); this.requiresTurn = true; this.requiresNoun = false; this.requiresVisibility = false; } getCommandText() { return "wait"; } } ActionWait.check = new Rulebook("Check Waiting"); ActionWait.carry = new Rulebook("Carry out Waiting"); ActionWait.carry.addRule(new Rule({ name: "Print waiting message", code: runner => { if (runner.noun.actor == WorldState.player) { runner.noun.say.add("You wait."); } } })); Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({ name: "Add Wait Command Rule", firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_MEDIUM, code: (rulebook) => { Elements.HyperlinkHandler.addCommonAction("Wait", new ActionWait(WorldState.player)); } })); class ContentDescription { constructor(name, group) { this.saidCount = 0; this.name = name; this.group = group; } getScore() { return (this.group).getScore(); } getDescription(group) { this.saidCount++; if (typeof this.description == "function") { return this.description(this, group); } return this.description; } setDescription(description) { if (!(description instanceof Say)) { this.description = new Say(description); } else { this.description = description; } return this; } static pickDescriptions(cda, target) { let a = cda.slice(); let groups = []; for (let i = 0; i < a.length; i++) { let randomIndex = Math.floor(Math.random() * (a.length - i)) + i; let temp = a[i]; a[i] = a[randomIndex]; a[randomIndex] = temp; } a.sort((a, b) => { let scoreA = a.getScore() / (a.saidCount + 1); let scoreB = b.getScore() / (b.saidCount + 1); if (scoreA != scoreB) return scoreB - scoreA; return 0; }); a.forEach(description => { groups.push(description.group); }); let matches = target.matchAgainst(groups); if (matches != undefined) { let result = []; matches.forEach(i => { result.push(a[i].getDescription(target)); result.push(new Say(" ")); }); return result; } else { console.warn("No description available for", target); return [new Say("Warning: No description available for the current situation. Please report so it can be corrected.")]; } } } class ContentDifferential { constructor(...nouns) { this.nouns = []; this.score = 0; this.addNoun(...nouns); } addNoun(...nouns) { nouns.forEach(noun => { this.nouns.push(noun); }); this.score = this.getScore(); return this; } getNouns() { return this.nouns; } replaceNouns(...nouns) { this.nouns = nouns; return this; } isMatch(cd, allowPartial = false) { let check = this.getUnmatched(cd); if ((allowPartial || check.unmatched.length == 0) && check.matching.length == 0) { return true; } else if (check.matching.length == 0) { for (let i = 0; i < check.unmatched.length; i++) { if (!(check.unmatched[i] instanceof ContentMarker)) { return false; } else { if (check.unmatched[i].isImportant()) { return false; } } } return true; } return false; } getUnmatched(cd) { let unmatched = cd.nouns.slice(); let matching = this.nouns.slice(); for (let i = matching.length - 1; i >= 0; i--) { for (let k = unmatched.length - 1; k >= 0; k--) { if (ContentDifferential.compareNouns(matching[i], unmatched[k])) { unmatched.splice(k, 1); matching.splice(i, 1); break; } } } return { matching: matching, unmatched: unmatched }; } getScore() { let highest = 0; let count = this.nouns.length; this.nouns.forEach((noun) => { let level = ContentDifferential.getNounLevel(noun); if (highest < level) { highest = level; } }); return highest + (count / 100); } static getNounLevel(noun) { if (noun == undefined || noun == null) { return 0; } else if (typeof noun == "function") { if (noun.prototype instanceof Thing) { let specifity = 2; let parentClass = Object.getPrototypeOf(noun); while (parentClass != Thing) { specifity += 0.1; parentClass = Object.getPrototypeOf(parentClass); } return specifity; } else { return 2.5; } } else if (noun instanceof Thing) { return 4; } else if (noun instanceof ContentDifferential) { return 1; } else { return 0.5; } } static compareNouns(a, b) { if (a == undefined || a == null) { return true; } if (typeof a == "function") { return b == a || b instanceof a || (typeof b == "function" && b.prototype instanceof a); } else if (a instanceof Thing) { return b == a; } return a === b; } static isMatch(matchFrom, matchAgainst) { let unmatched = matchAgainst.slice(); let matching = matchFrom.slice(); for (let i = matching.length - 1; i >= 0; i--) { for (let k = unmatched.length - 1; k >= 0; k--) { if (matching[i].isMatch(unmatched[k])) { unmatched.splice(k, 1); matching.splice(i, 1); break; } } } if (unmatched.length == 0 && matching.length == 0) { return true; } else if (unmatched.length == 0) { for (let i = 0; i < matching.length; i++) { let nouns = matching[i].getNouns(); for (let k = 0; k < nouns.length; k++) { if (!(nouns[k] instanceof ContentMarker)) { return false; } else { if (nouns[k].isImportant()) { return false; } } } } return true; } return false; } } var ContentGroupMatch; (function (ContentGroupMatch) { ContentGroupMatch[ContentGroupMatch["NO_MATCH"] = 0] = "NO_MATCH"; ContentGroupMatch[ContentGroupMatch["PARTIAL_MATCH"] = 1] = "PARTIAL_MATCH"; ContentGroupMatch[ContentGroupMatch["PERFECT_MATCH"] = 2] = "PERFECT_MATCH"; })(ContentGroupMatch || (ContentGroupMatch = {})); class ContentGroup { constructor(...units) { this.units = []; units.forEach(unit => { this.addUnit(unit); }); } addUnit(unit) { this.units.push(unit); return this; } reset() { this.matching = this.units.slice(); } isMatching() { return this.matching.length; } setMatching(matching) { this.matching = matching; } isMatch(cg) { let unmatched = cg.matching.slice(); let matching = this.units.slice(); for (let i = matching.length - 1; i >= 0; i--) { for (let k = unmatched.length - 1; k >= 0; k--) { if (matching[i].isMatch(unmatched[k])) { unmatched.splice(k, 1); matching.splice(i, 1); break; } } } return { type: matching.length > 0 ? ContentGroupMatch.NO_MATCH : unmatched.length == 0 ? ContentGroupMatch.PERFECT_MATCH : ContentGroupMatch.PARTIAL_MATCH, unmatched: unmatched }; } getScore() { let score = 0; this.units.forEach(unit => { score += unit.getScore(); }); return score; } matchAgainst(a) { let matches = []; this.reset(); for (let i = 0; i < a.length; i++) { let match = a[i].isMatch(this); if (match.type != ContentGroupMatch.NO_MATCH) { matches.push(i); this.setMatching(match.unmatched); } if (!this.isMatching()) { return matches; } } return undefined; } } class ContentMarker { constructor(name, important) { this.important = false; this.name = name; this.important = important == true; } isImportant() { return this.important; } } class ContentUnit { constructor() { this.categories = []; } addCategory(...nouns) { this.categories.push(new ContentDifferential(...nouns)); } isMatch(cu) { return ContentDifferential.isMatch(this.categories, cu.categories); } getScore() { let score = 0; this.categories.forEach(diff => { score += diff.score; }); return score / this.categories.length; } matchAgainst(a) { for (let i = 0; i < a.length; i++) { if (a[i].isMatch(this)) { return [i]; } } } } class CombatDescription extends ContentDescription { constructor(name) { super(name, new ContentGroup()); CombatDescription.DESCRIPTIONS.push(this); } addUnit() { let unit = new CombatUnit(); this.group.addUnit(unit); return unit; } static getDescription(target) { return ContentDescription.pickDescriptions(CombatDescription.DESCRIPTIONS, target); } } CombatDescription.DESCRIPTIONS = []; class CombatHit extends ContentMarker { } CombatHit.FULL_DODGE = new CombatHit("Full Dodge", true); CombatHit.PARTIAL_DODGE = new CombatHit("Partial Dodge", true); CombatHit.FULL_HIT = new CombatHit("Full Hit", true); class CombatDamage extends ContentMarker { } CombatDamage.LOW_DAMAGE = new CombatDamage("Low Damage"); CombatDamage.MEDIUM_DAMAGE = new CombatDamage("Medium Damage"); CombatDamage.HIGH_DAMAGE = new CombatDamage("High Damage"); class CombatResult extends ContentMarker { } CombatResult.KNOCKED = new CombatResult("Target was knocked down by the attack", true); CombatResult.KNOCKED_OFF = new CombatResult("Target was knocked off by the attack, becoming unconscious", true); CombatResult.KILLED = new CombatResult("Target was killed by this attack", true); class CombatUnit extends ContentUnit { constructor() { super(); this.actor = new ContentDifferential(Person); this.target = new ContentDifferential(Person); this.weapon = new ContentDifferential(Thing); this.markers = new ContentDifferential(); } setActor(it) { this.actor = new ContentDifferential(it); return this; } setTarget(it) { this.target = new ContentDifferential(it); return this; } setWeapon(it) { this.weapon = new ContentDifferential(it); return this; } addMarker(marker) { this.markers.addNoun(marker); return this; } getScore() { return this.actor.getScore() + this.target.getScore() + this.weapon.getScore() + this.markers.getScore(); } isMatch(cu) { if (cu instanceof CombatUnit) { return this.actor.isMatch(cu.actor) && this.target.isMatch(cu.target) && this.weapon.isMatch(cu.weapon) && this.markers.isMatch(cu.markers); } return false; } } class FuckingDescription extends ContentDescription { constructor(name) { super(name, new ContentGroup()); FuckingDescription.DESCRIPTIONS.push(this); } addUnit() { let unit = new FuckingUnit(); this.group.addUnit(unit); return unit; } static getDescription(target) { return ContentDescription.pickDescriptions(FuckingDescription.DESCRIPTIONS, target); } } FuckingDescription.DESCRIPTIONS = []; class FuckingStyle extends ContentMarker { } FuckingStyle.GENTLE = new FuckingStyle("Gentle"); FuckingStyle.ROUGH = new FuckingStyle("Rough"); class FuckingState extends ContentMarker { } FuckingState.PENETRATING = new FuckingState("Penetration Start", true); FuckingState.REMOVING = new FuckingState("Removing Stick", true); FuckingState.SPEEDING_UP = new FuckingState("Speeding up", true); FuckingState.CUM_START = new FuckingState("Started Cumming", true); FuckingState.CUMMING = new FuckingState("Cumming", true); FuckingState.CUM_END = new FuckingState("Finished Cumming", true); FuckingState.CUM_INSIDE = new FuckingState("Cum Inside", true); FuckingState.CUM_OUTSIDE = new FuckingState("Cum Outside", true); class FuckingUnit extends ContentUnit { constructor() { super(); this.fucker = new ContentDifferential(Person); this.fucked = new ContentDifferential(Person); this.hole = new ContentDifferential(SexHole); this.stick = new ContentDifferential(SexStick); this.markers = new ContentDifferential(); } setFucker(it) { this.fucker = new ContentDifferential(it); return this; } setFucked(it) { this.fucked = new ContentDifferential(it); return this; } setHole(it) { this.hole = new ContentDifferential(it); return this; } setStick(it) { this.stick = new ContentDifferential(it); return this; } addMarker(marker) { this.markers.addNoun(marker); return this; } getScore() { return this.fucker.getScore() + this.fucked.getScore() + this.hole.getScore() + this.stick.getScore() + this.markers.getScore(); } isMatch(fu) { if (fu instanceof FuckingUnit) { return this.fucker.isMatch(fu.fucker) && this.fucked.isMatch(fu.fucked) && this.hole.isMatch(fu.hole) && this.stick.isMatch(fu.stick) && this.markers.isMatch(fu.markers); } return false; } } class BranchingOption { constructor(say, appearCondition) { this.previouslyPicked = false; this.say = say; this.appearCondition = appearCondition; } } class BranchingDialogue { constructor(...options) { this.options = []; this.addOptions(...options); } addOptions(...options) { this.options.push(...options); arrayUnique(this.options); } async getChosenOption() { let validOptions = []; for (let i = 0, value = this.options[i]; value != undefined; value = this.options[++i]) { if (value.appearCondition == undefined || (typeof value.appearCondition == "function" && value.appearCondition()) || value.appearCondition) { validOptions.push(value); } } let choiceButtons = []; for (let i = 0; i < validOptions.length; i++) { let value = validOptions[i]; let classes = ["choice"]; if (value.previouslyPicked) { classes.push("picked"); } choiceButtons.push((await value.say.getHTML("p", classes))[0]); } let PlayerInput = new Promise((resolve, reject) => { this.resolve = resolve; }); Controls.KeyHandler.reset(); for (let index = 0, value = choiceButtons[index]; value != undefined; value = choiceButtons[++index]) { Controls.KeyHandler.applyCode(value, Controls.KeyHandler.getFirstKeyCode()); value.addEventListener("click", (e) => { validOptions[index].previouslyPicked = true; this.resolve(validOptions[index]); e.preventDefault(); }); } await Elements.CurrentTurnHandler.print(...choiceButtons); let choice = await PlayerInput; await Elements.CurrentTurnHandler.unprint(...choiceButtons); return choice; } } var NodeType; (function (NodeType) { NodeType[NodeType["Node"] = 0] = "Node"; NodeType[NodeType["Tree"] = 1] = "Tree"; NodeType[NodeType["Text"] = 2] = "Text"; NodeType[NodeType["Set"] = 3] = "Set"; NodeType[NodeType["Choice"] = 4] = "Choice"; NodeType[NodeType["Branch"] = 5] = "Branch"; })(NodeType || (NodeType = {})); class DialogueNode { constructor(id) { this.type = NodeType.Node; this.id = id; } setName(name) { this.name = name; } setNext(next) { this.next = next; } getNext() { return this.next; } setChoices(choices) { this.choices = choices; } hasChoices() { return this.choices != undefined && this.choices.length > 0; } } class DialogueBranch extends DialogueNode { constructor() { super(...arguments); this.type = NodeType.Branch; this.variable = () => { return false; }; this.branchIds = []; this.branchConditions = []; } setVariable(varFunc) { this.variable = varFunc; } addBranch(targetid, valueFunc) { this.branchIds.push(targetid); this.branchConditions.push(valueFunc); } getNext() { let variable = this.variable(); for (let i = 0; i < this.branchIds.length; i++) { let comparing = this.branchConditions[i](); if (comparing == variable) { return this.branchIds[i]; } } return this.next; } } class DialogueText extends DialogueNode { constructor() { super(...arguments); this.type = NodeType.Text; } setSay(sayCreator) { this.sayCreator = sayCreator; } getSay() { return this.sayCreator(); } } class DialogueChoice extends DialogueText { constructor() { super(...arguments); this.type = NodeType.Choice; this.conditions = () => { return true; }; } isAvailable() { return this.conditions(); } setConditions(conditions) { this.conditions = conditions; } } class DialogueNodeTree extends DialogueNode { constructor() { super(...arguments); this.type = NodeType.Tree; } setTree(treeFinder) { this.tree = treeFinder; } } class DialogueSet extends DialogueNode { constructor() { super(...arguments); this.type = NodeType.Set; } setFunction(code) { this.code = code; } run() { return this.code(); } } class DialogueTree { constructor(id) { this.nodes = {}; this.startNode = undefined; this.repeatChoices = true; this.id = id; } addNode(node) { this.nodes[node.id] = node; if (node.type == NodeType.Node) { this.nodes[node.name] = node; } } addStartNode(node) { this.addNode(node); this.startNode = node; } getNode(id) { return this.nodes[id]; } getNext(node) { let next = node.getNext(); if (next != undefined) { return this.getNode(next); } } setRepeatChoices(doIt) { this.repeatChoices = doIt; } async execute(startId) { console.debug(Rulebook.getIndentation() + "[DialogueTree] Running " + this.id); Rulebook.increaseIndentation(this); let node; if (startId == undefined) { node = this.startNode; } else { node = this.getNode(startId); } if (node == undefined) { Elements.CurrentTurnHandler.printAsError("Unable to start dialogue " + this.id + ": A starting node could not be found."); return; } let previousNode; while (node != undefined) { let nextNode = await this.processNode(node, previousNode); previousNode = node; node = nextNode; } Rulebook.decreaseIndentation(); } async processNode(node, previousNode) { console.debug(Rulebook.getIndentation() + "[" + node.type + "] " + node.id); Rulebook.increaseIndentation(node); let doChoices = node.hasChoices(); if (node.type == NodeType.Tree) { await node.tree().execute(); } else if (node.type == NodeType.Text) { let say = node.getSay(); Elements.CurrentTurnHandler.printAsContent(say); } else if (node.type == NodeType.Set) { let runningSet = node.run(); if (runningSet instanceof Promise) { await runningSet; } } if (doChoices) { let branchingDialogue = new BranchingDialogue(); let choices = node.choices; let options = []; for (let i = 0; i < choices.length; i++) { let choice = this.getNode(choices[i]); let branchingOption = new BranchingOption(choice.getSay(), choice.isAvailable()); options.push(branchingOption); branchingDialogue.addOptions(branchingOption); } let chosenOption = await branchingDialogue.getChosenOption(); let chosenNodeId = choices[options.indexOf(chosenOption)]; let chosenNode = this.getNode(chosenNodeId); if (this.repeatChoices) { let say = new Say(new SayBold(" > ", chosenNode.getSay())); this.lastPrintedChoice = await Elements.CurrentTurnHandler.getSayElementsAsContent(say); await Elements.CurrentTurnHandler.print(...this.lastPrintedChoice); } console.debug(Rulebook.getIndentation() + "[Choice] Picked " + chosenNodeId); console.debug(Rulebook.getIndentation() + "[Choice] Going to " + chosenNode.getNext()); Rulebook.increaseIndentation(chosenNodeId); Rulebook.decreaseIndentation(); Rulebook.decreaseIndentation(); return this.getNext(chosenNode); } else { Rulebook.decreaseIndentation(); return this.getNext(node); } } unprintLastChoice() { Elements.CurrentTurnHandler.unprint(...this.lastPrintedChoice); } } var DialogueTrees; (function (DialogueTrees) { function findUnusedTrees() { let allCode = document.getElementById("appCode").innerHTML; let useCount = {}; let unused = []; for (let dialogueName in DialogueTrees) { if (dialogueName != "findUnusedTrees") { let count = occurrences(allCode, "DialogueTrees." + dialogueName, false) - 1; if (count > 0) { useCount[dialogueName] = count; } else { unused.push(dialogueName); } } } for (let dialogueName in useCount) { let times = useCount[dialogueName]; console.debug("[DialogueUsage] " + dialogueName + " is referenced " + times + (times > 1 ? " times." : " time.")); } for (let i = 0; i < unused.length; i++) { console.error("[DialogueUsage] " + unused[i] + " is never referenced and will not appear in-game."); } } DialogueTrees.findUnusedTrees = findUnusedTrees; function occurrences(string, subString, allowOverlapping) { string += ""; subString += ""; if (subString.length <= 0) return (string.length + 1); var n = 0, pos = 0, step = allowOverlapping ? 1 : subString.length; while (true) { pos = string.indexOf(subString, pos); if (pos >= 0) { ++n; pos += step; } else break; } return n; } })(DialogueTrees || (DialogueTrees = {})); class RoomRandom extends Room { constructor(id, fodder) { super(id, fodder); this.connectableOn = [Direction.NORTH, Direction.SOUTH, Direction.EAST, Direction.WEST]; this.randomizable = true; this.placed = false; this.appearChance = 75; this.extraConnectionChance = 75; this.backgroundImage = "tomato"; } getBackgroundClass() { if (this.isImageDefined()) { return this.backgroundImage; } return "tomato"; } isImageDefined() { try { for (var i = 0; i < document.styleSheets.length; i++) { var rules = document.styleSheets[i]['rules'] || document.styleSheets[i]['cssRules']; for (var x in rules) { if (typeof rules[x].selectorText == 'string' && rules[x].selectorText == "." + this.backgroundImage) { return true; } } } return false; } catch (e) { console.warn("Unable to read image"); return true; } } isConnectableOn(oppositeDirection) { return this.connectableOn.indexOf(oppositeDirection) != -1; } getAnyDirection(options) { let directionShuffler = new Shuffler(this.connectableOn); for (let direction = directionShuffler.getOne(); direction != undefined; direction = directionShuffler.getOne()) { let oppositeDirection = OppositeDirection[Direction[direction]]; let otherCoordinates = options.map.getCoordinates(options.otherRoom); let wouldbeCoordinates = Room.shift(otherCoordinates, oppositeDirection); let trickyOptions = { otherRoom: options.otherRoom, otherRoomDirection: oppositeDirection, trickyRoomDirection: direction, map: options.map, region: options.region, x: wouldbeCoordinates[0], y: wouldbeCoordinates[1] }; if (this.isPlaceable(trickyOptions)) { return trickyOptions; } } } isPlaceable(options) { if (!this.isConnectableOn(options.trickyRoomDirection) || !options.map.isFree(options.x, options.y)) { return false; } if (options.otherRoom == undefined || !options.otherRoom.isConnectableOn(options.otherRoomDirection)) { return false; } if (this.trickyCode != undefined) { return this.trickyCode(options); } return true; } getDistanceTo(room) { let myCoordinates = this.lastMap.getCoordinates(this); let otherCoordinates = this.lastMap.getCoordinates(room); if (myCoordinates != undefined && otherCoordinates != undefined) { let c1 = myCoordinates; let c2 = otherCoordinates; return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]); } } findPathTo(pathEnd, validRoom) { validRoom = validRoom == undefined ? () => { return true; } : validRoom; let map = this.lastMap; let endPosition = map.getCoordinates(pathEnd); let open = []; let distance = (c1, c2) => { return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]); }; let neighbors = (room, x, y) => { let neighs = []; for (let direction = 0; direction < room.connections.length; direction++) { let otherRoom = room.connections[direction]; if (otherRoom != undefined && open.indexOf(otherRoom) == -1 && validRoom(otherRoom)) { let dirCoordinates = Room.shift([x, y], direction); let dir = [otherRoom, dirCoordinates, distance(endPosition, dirCoordinates)]; neighs.push(dir); } } return neighs.sort((a, b) => { return a[2] - b[2]; }); }; let shortestPath = { length: map.getRoomCount() }; let noPath = shortestPath; let cPath = []; let findPath = (myArray) => { let room = myArray[0]; cPath.push(myArray); if (room == pathEnd) { if (shortestPath.length >= cPath.length) { shortestPath = cPath.slice(0); } } else if (shortestPath.length > (cPath.length)) { open.push(room); let otherRooms = neighbors(room, myArray[1][0], myArray[1][1]); for (let i = 0; i < otherRooms.length; i++) { if ((cPath.length + 1) < shortestPath.length) { findPath(otherRooms[i]); } } open.pop(); } cPath.pop(); }; findPath([this, map.getCoordinates(this)]); return shortestPath != noPath ? shortestPath : undefined; } getBestDirectionTo(otherRoom, validRoom) { let path = this.findPathTo(otherRoom, validRoom); if (path != undefined) { if (path.length == 1) { return undefined; } return this.connections.indexOf(path[1][0]); } } getAStarPathTo(otherRoom, validRoom) { validRoom = validRoom != undefined ? validRoom : () => { return true; }; let distance = (c1, c2) => { return Math.abs(c1[0] - c2[0]) + Math.abs(c1[1] - c2[1]); }; let isVisited = (room) => { return visited.indexOf(room) != -1; }; let getNeighbors = (node) => { let neighbors = []; for (let direction = 0; direction < node.room.connections.length; direction++) { if (node.room.connections[direction] != undefined && !isVisited(node.room.connections[direction]) && validRoom(node.room.connections[direction])) { let coordinates = Room.shift(node.coordinates, direction); neighbors.push({ room: node.room.connections[direction], coordinates: coordinates, distance: distance(coordinates, endNode.coordinates) }); visited.push(node.room.connections[direction]); } } return neighbors; }; let getClosestPath = () => { let shortest = 0; for (let i = 1; i < open.length; i++) { let lastPoint = open[i][open[i].length - 1]; if (lastPoint.distance < open[shortest][open[shortest].length - 1].distance) { shortest = i; } } return shortest; }; let endNode = { room: otherRoom, coordinates: this.lastMap.getCoordinates(otherRoom), distance: 0 }; let startCoordinates = this.lastMap.getCoordinates(this); let startNode = { room: this, coordinates: startCoordinates, distance: distance(startCoordinates, endNode.coordinates) }; let open = [[startNode]]; let closed = []; let shortestPath = this.lastMap.getRoomCount(); let shortestIndex; let myPath; let closest = 0; let visited = [this]; while (open.length > 0) { myPath = open.splice(closest, 1)[0]; if (myPath[myPath.length - 1].distance == 0) { let push = closed.push(myPath); if (myPath.length < shortestPath) { shortestPath = myPath.length; shortestIndex = push - 1; } break; } else { let neighbors = getNeighbors(myPath[myPath.length - 1]); for (let i = 0; i < neighbors.length; i++) { open.push(myPath.concat([neighbors[i]])); } } for (let i = open.length - 1; i >= 0; i--) { if (open[i].length >= shortestPath) { open.splice(i, 1); } } closest = getClosestPath(); } return closed[shortestIndex]; } getAStarBestDirectionTo(otherRoom, validRoom) { let path = this.getAStarPathTo(otherRoom, validRoom); if (path != undefined) { if (path.length == 1) { return undefined; } return this.connections.indexOf(path[1].room); } } getConnectedDirection() { let shuffler = new Shuffler(Room.DIRECTIONS); for (let direction = shuffler.getOne(); direction != undefined; direction = shuffler.getOne()) { if (this.connections[direction] != undefined) { return direction; } } } static getActive(type) { } } class RoomRandomMap { constructor() { this.positionTable = {}; this.roomMap = new Map(); this.lowestX = 0; this.lowestY = 0; this.highestX = 0; this.highestY = 0; this.limitsInvalid = false; } emptyCache() { this.availableConnections = []; Room.DIRECTIONS.forEach(() => { this.availableConnections.push([]); }); this.rooms = 0; } getAvailableConnections() { return this.availableConnections.reduce((previousValue, currentValue, currentIndex, array) => { return previousValue + (currentValue.length); }, 0); } removeFromCache(coordinatesToRemove, direction) { let directionArray = this.availableConnections[direction]; for (let k = 0, coordinates = directionArray[k]; coordinates != undefined; coordinates = directionArray[++k]) { if (coordinates.x == coordinatesToRemove.x && coordinates.y == coordinatesToRemove.y) { directionArray.splice(k, 1); return; } } } addToCache(coordinatesToAdd, direction) { let directionArray = this.availableConnections[direction]; for (let k = 0, coordinates = directionArray[k]; coordinates != undefined; coordinates = directionArray[++k]) { if (coordinates.x == coordinatesToAdd.x && coordinates.y == coordinatesToAdd.y) { return; } } directionArray.push(coordinatesToAdd); } getAnyFromCache(direction) { let array = this.availableConnections[direction]; if (array.length > 0) { let randomIndex = Math.floor(Math.random() * (array.length)); let randomCoordinates = array[randomIndex]; if (randomCoordinates != undefined) { return this.getRoom(randomCoordinates.x, randomCoordinates.y); } } } isFree(x, y) { return (this.positionTable[x] == undefined || this.positionTable[x][y] === undefined); } block(x, y) { if (this.isFree(x, y)) { if (this.positionTable[x] == undefined) { this.positionTable[x] = {}; } this.positionTable[x][y] = null; this.updateCacheOnPosition(x, y); this.updateLimits(x, y); } } updateAllLimits() { this.highestX = 0; this.highestY = 0; this.lowestX = 0; this.lowestY = 0; for (let x in this.positionTable) { for (let y in this.positionTable[x]) { if (this.positionTable[x][y] != undefined && this.positionTable[x][y] != null) { this.updateLimits(parseInt(x), parseInt(y)); } } } this.limitsInvalid = false; } updateLimits(x, y) { if (x > this.highestX) this.highestX = x; if (y > this.highestY) this.highestY = y; if (y < this.lowestY) this.lowestY = y; if (x < this.lowestX) this.lowestX = x; } map(room, x, y) { if (this.positionTable[x] == undefined) { this.positionTable[x] = {}; } this.positionTable[x][y] = room; this.roomMap.set(room, [x, y]); this.updateCacheOnPosition(x, y); this.updateLimits(x, y); room.placed = true; room.lastMap = this; this.rooms++; } unmap(x, y) { if (this.positionTable[x] != undefined && this.positionTable[x][y] != undefined) { this.roomMap.delete(this.positionTable[x][y]); delete (this.positionTable[x][y]); this.rooms--; this.updateCacheOnPosition(x, y); this.limitsInvalid = true; } } updateCacheOnPosition(x, y) { let coordinates = [x, y, 0]; let coordinatesMap = { x: x, y: y }; let coordinatesBlocked = !this.isFree(x, y); let coordinatesRoom = this.getRoom(x, y); Room.DIRECTIONS.forEach(direction => { let oppositeDirection = OppositeDirection[Direction[direction]]; let shifted = Room.shift(coordinates, direction); let shiftedMap = { x: shifted[0], y: shifted[1] }; let shiftedBlocked = !this.isFree(shifted[0], shifted[1]); let shiftedRoom = this.getRoom(shifted[0], shifted[1]); if (coordinatesRoom != undefined) { if (shiftedBlocked) { this.removeFromCache(coordinatesMap, direction); } else if (coordinatesRoom.isConnectableOn(direction)) { this.addToCache(coordinatesMap, direction); } } else { this.removeFromCache(coordinatesMap, direction); } if (shiftedRoom != undefined) { if (coordinatesBlocked) { this.removeFromCache(shiftedMap, oppositeDirection); } else if (shiftedRoom.isConnectableOn(oppositeDirection)) { this.addToCache(shiftedMap, oppositeDirection); } } else { this.removeFromCache(shiftedMap, oppositeDirection); } }); } getRoom(x, y) { if (this.positionTable[x] != undefined) { if (this.positionTable[x][y] != null) { return this.positionTable[x][y]; } } return undefined; } getCoordinates(room) { return this.roomMap.get(room); } getRoomCount() { return this.roomMap.size; } getWidth() { return this.highestX - this.lowestX; } getHeight() { return this.highestY - this.lowestY; } getPreferredGrowth() { let ratio = this.getHeight() / this.getWidth(); let idealRatio = 2.5; let difference = Math.abs(ratio - idealRatio); if (difference < 0.5) { return RoomRandomMap.PREFERRED_GROWTH_ANY; } else { if (ratio < idealRatio) { return RoomRandomMap.PREFERRED_GROWTH_VERTICAL; } else { return RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL; } } } static isDirectionPreferred(direction, growth) { if (growth == RoomRandomMap.PREFERRED_GROWTH_ANY) { return true; } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { return growth == RoomRandomMap.PREFERRED_GROWTH_VERTICAL; } else { return growth == RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL; } } } RoomRandomMap.PREFERRED_GROWTH_HORIZONTAL = 0; RoomRandomMap.PREFERRED_GROWTH_VERTICAL = 1; RoomRandomMap.PREFERRED_GROWTH_ANY = 2; class ShufflerDirection extends Shuffler { constructor(array, preferredGrowth, rng) { super(array, rng); this.runner = 0; this.preferredGrowth = preferredGrowth; let goodDirections = []; let badDirections = []; for (let direction = this.getOne(); direction != undefined; direction = this.getOne()) { if (RoomRandomMap.isDirectionPreferred(direction, this.preferredGrowth)) { goodDirections.push(direction); } else { badDirections.push(direction); } } this.directionsArray = goodDirections.concat(badDirections); } getDirection() { return this.directionsArray[this.runner++]; } } class RoomRandomFodder extends RoomRandom { constructor(id) { super(id, true); } } class RegionRandom extends Region { constructor(name, map) { super(name); this.randomized = false; this.fodderRoomClass = RoomRandomFodder; this.placedRooms = []; this.map = map == undefined ? new RoomRandomMap() : map; } async randomize() { if (!this.randomized) { await RegionRandom.rulebookRandomizeRegion.execute({ noun: this }); } } } RegionRandom.rng = () => { return Math.random(); }; RegionRandom.rulebookRandomizeRegion = new Rulebook("Randomizing Random Region something"); RegionRandom.rulebookPlaceRoom = new Rulebook("Placing Random Room something"); RegionRandom.rulebookBeforePlaceRoom = new Rulebook("Before placing Random Room something"); RegionRandom.rulebookAfterPlaceRoom = new Rulebook("After placing Random Room something"); RegionRandom.ruleFirstRandomizeRegion = RegionRandom.rulebookRandomizeRegion.createAndAddRule({ name: "Empty map cache to start randomizing region", firstPriority: Rule.PRIORITY_HIGHEST, code: runner => { let region = runner.noun; region.map.emptyCache(); } }); RegionRandom.ruleBasicRandomizeRegion = RegionRandom.rulebookRandomizeRegion.createAndAddRule({ name: "Randomize all unplaced, randomizable rooms in region something", code: async (runner) => { let region = runner.noun; let roomShuffler = new Shuffler(Region.InRelation.getAllRightTypes(region, RoomRandom).filter((room) => { return room.randomizable && !room.placed && (room == WorldState.player.getRoom() || (RegionRandom.rng() * 100) <= room.appearChance); }), RegionRandom.rng); for (let room = roomShuffler.getOne(); room != undefined; room = roomShuffler.getOne()) { while (region.map.rooms > 0 && region.map.getAvailableConnections() < 4) { let fodder = new region.fodderRoomClass(); let options = { map: region.map, room: fodder, region: region }; region.place(fodder); await RegionRandom.rulebookBeforePlaceRoom.execute({ noun: options }); await RegionRandom.rulebookPlaceRoom.execute({ noun: options }); await RegionRandom.rulebookAfterPlaceRoom.execute({ noun: options }); } let options = { map: region.map, room: room, region: region }; await RegionRandom.rulebookBeforePlaceRoom.execute({ noun: options }); await RegionRandom.rulebookPlaceRoom.execute({ noun: options }); await RegionRandom.rulebookAfterPlaceRoom.execute({ noun: options }); if (!room.placed) { Elements.CurrentTurnHandler.printAsError(new Say("Was unable to place room ", room, ". Game might be unplayable.")); } } } }); RegionRandom.ruleAddExtraConnections = RegionRandom.rulebookRandomizeRegion.createAndAddRule({ firstPriority: Rule.PRIORITY_LOWEST, name: "Add extra connections to rooms in region", code: runner => { let region = runner.noun; let placedRooms = Region.InRelation.getAllRightTypes(region, RoomRandom).filter((room) => { return room.randomizable && room.placed; }); placedRooms.forEach((room) => { let myCoordinates = region.map.getCoordinates(room); let directionShuffler = new Shuffler(room.connectableOn.slice(0), RegionRandom.rng); for (let direction = directionShuffler.getOne(); direction != undefined && (RegionRandom.rng() * 100) <= room.extraConnectionChance; direction = directionShuffler.getOne()) { if (room.connections[direction] == undefined) { let otherCoordinates = Room.shift(myCoordinates, direction); let otherRoom = region.map.getRoom(otherCoordinates[0], otherCoordinates[1]); if (otherRoom != undefined && otherRoom.randomizable && otherRoom.isConnectableOn(OppositeDirection[Direction[direction]]) && (RegionRandom.rng() * 100) <= otherRoom.extraConnectionChance) { room.mapRoom(otherRoom, direction); } } } }); } }); RegionRandom.rulePlaceFirstRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({ name: "Placing First room something", firstPriority: Rule.PRIORITY_HIGHEST, code: runner => { let placingOptions = runner.noun; if (placingOptions.map.isFree(0, 0)) { placingOptions.map.map(placingOptions.room, 0, 0); return true; } }, conditions: runner => { return runner.noun.map.rooms == 0; } }); RegionRandom.rulePlaceNonTrickyRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({ name: "Placing non-tricky room something", firstPriority: Rule.PRIORITY_HIGH, code: runner => { let placingOptions = runner.noun; let preferredGrowthDirection = placingOptions.map.getPreferredGrowth(); let directionShuffler = new ShufflerDirection(placingOptions.room.connectableOn, preferredGrowthDirection); for (let direction = directionShuffler.getDirection(); direction != undefined; direction = directionShuffler.getDirection()) { let oppositeDirection = OppositeDirection[Direction[direction]]; let connectableRoom = placingOptions.map.getAnyFromCache(oppositeDirection); if (connectableRoom != undefined) { let otherCoordinates = placingOptions.map.getCoordinates(connectableRoom); let myCoordinates = Room.shift(otherCoordinates, oppositeDirection); placingOptions.room.mapRoom(connectableRoom, direction); placingOptions.map.map(placingOptions.room, myCoordinates[0], myCoordinates[1]); return true; } } }, conditions: runner => { return runner.noun.room.trickyCode == undefined; } }); RegionRandom.rulePlaceTrickyRoom = RegionRandom.rulebookPlaceRoom.createAndAddRule({ name: "Placing tricky room something", code: runner => { let placingOptions = runner.noun; let placedRooms = placingOptions.region.getRooms().filter((room) => { return room instanceof RoomRandom && room.placed; }); if (placedRooms.length == 0) { Elements.CurrentTurnHandler.printAsError("Unable to place room " + placingOptions.room.getPrintedName() + ": There are no rooms to connect to!"); return false; } let roomShuffler = new Shuffler(placedRooms, RegionRandom.rng); for (let connectableRoom = roomShuffler.getOne(); connectableRoom != undefined; connectableRoom = roomShuffler.getOne()) { let trickier = { region: placingOptions.region, map: placingOptions.map, otherRoom: connectableRoom }; let tricky = placingOptions.room.getAnyDirection(trickier); if (tricky != undefined) { placingOptions.room.mapRoom(connectableRoom, tricky.trickyRoomDirection); placingOptions.map.map(placingOptions.room, tricky.x, tricky.y); return true; } } let connectableThroughFodder = (fodderStep, connectingRoom) => { let trickier = { region: placingOptions.region, map: placingOptions.map, otherRoom: connectingRoom }; if (fodderStep == 0) { return placingOptions.room.getAnyDirection(trickier); } else { let newFodder = new (placingOptions.region.fodderRoomClass)(); let preferredGrowthDirection = placingOptions.map.getPreferredGrowth(); let directionShuffler = new ShufflerDirection(placingOptions.room.connectableOn, preferredGrowthDirection); for (let direction = directionShuffler.getDirection(); direction != undefined; direction = directionShuffler.getDirection()) { let oppositeDirection = OppositeDirection[Direction[direction]]; let otherCoordinates = placingOptions.map.getCoordinates(connectingRoom); let wouldbeCoordinates = Room.shift(otherCoordinates, oppositeDirection); let fodderTricky = { otherRoom: connectingRoom, otherRoomDirection: oppositeDirection, trickyRoomDirection: direction, map: placingOptions.map, region: placingOptions.region, x: wouldbeCoordinates[0], y: wouldbeCoordinates[1] }; if (newFodder.isPlaceable(fodderTricky)) { newFodder.mapRoom(connectingRoom, fodderTricky.trickyRoomDirection); placingOptions.map.map(newFodder, fodderTricky.x, fodderTricky.y); let nextTricky = connectableThroughFodder(fodderStep - 1, newFodder); if (nextTricky != undefined) { placingOptions.region.place(newFodder); return nextTricky; } else { newFodder.unmapRoom(fodderTricky.trickyRoomDirection); placingOptions.map.unmap(fodderTricky.x, fodderTricky.y); } } } } }; for (let fodderLevel = 1; fodderLevel < 10; fodderLevel++) { roomShuffler.restart(); for (let connectableRoom = roomShuffler.getOne(); connectableRoom != undefined; connectableRoom = roomShuffler.getOne()) { let tricky = connectableThroughFodder(fodderLevel, connectableRoom); if (tricky != undefined) { placingOptions.room.mapRoom(tricky.otherRoom, tricky.trickyRoomDirection); placingOptions.map.map(placingOptions.room, tricky.x, tricky.y); return true; } } } Elements.CurrentTurnHandler.printAsError("Unable to place room " + placingOptions.room.getPrintedName() + ": All attempts failed"); return false; } }); class SavedEvent extends StoredVariable { constructor(options) { super(options); this.description = options.description; this.getValueDescription = options.valueDescription; } getDescription() { return this.description; } } let EVENT_ORC_CHIEF_KILLED = new SavedEvent({ id: "EVENT_ORC_CHIEF_KILLED", description: "Describer whether the orc chief is alive or dead.", value: false, valueDescription: (value) => { if (EVENT_ORC_CHIEF_KILLED.value) { return "The orc chief has been killed."; } else { return "The orc chief is alive."; } } }); class Dice { constructor(testString) { this.range = [0, 0, 1, 1]; this.minResult = 0; this.testString = testString; } roll(stat) { let rng = this.range.slice(); if (stat >= 10) { rng.push(2, 1); } else if (stat >= 7) { rng.push(1, 1); } else if (stat >= 4) { rng.push(1); } let results = []; for (let i = 0; i < stat; i++) { let index = Math.floor(Math.random() * (rng.length)); results.push(rng[index]); } return results; } static sum(a, b) { return a + b; } getSay(results) { let finalResult = results.reduce(Dice.sum); return new Say(new SayBold("[", this.testString, "] "), " = [", results.join("] ["), "]", results.length == 1 ? "" : (" = " + finalResult)); } static testAgainstRoll(player, enemy) { let playerDice = new Dice(player.name); let playerResult = playerDice.roll(player.value); let enemyDice = new Dice(enemy.name); let enemyResult = enemyDice.roll(enemy.value); return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum); } static testAgainstDifficulty(player, difficulty) { let playerDice = new Dice(player.name); let playerResult = playerDice.roll(player.value); return playerResult.reduce(Dice.sum) - difficulty; } } class DiceCommon extends Dice { constructor() { super(...arguments); this.range = [-1, 0, 0, 0, 1, 1, 1]; this.minResult = -1; } static testAgainstRoll(player, enemy) { let playerDice = new DiceCommon(player.name); let playerResult = playerDice.roll(player.value); let enemyDice = new DiceCommon(enemy.name); let enemyResult = enemyDice.roll(enemy.value); return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum); } static testAgainstDifficulty(player, difficulty) { let playerDice = new DiceCommon(player.name); let playerResult = playerDice.roll(player.value); return playerResult.reduce(Dice.sum) - difficulty; } } class DiceDangerous extends Dice { constructor() { super(...arguments); this.range = [-2, -1, 0, 0, 0, 0, 1, 1, 1, 1]; this.minResult = -2; } static testAgainstRoll(player, enemy) { let playerDice = new DiceDangerous(player.name); let playerResult = playerDice.roll(player.value); let enemyDice = new DiceDangerous(enemy.name); let enemyResult = enemyDice.roll(enemy.value); return playerResult.reduce(Dice.sum) - enemyResult.reduce(Dice.sum); } static testAgainstDifficulty(player, difficulty) { let playerDice = new DiceDangerous(player.name); let playerResult = playerDice.roll(player.value); return playerResult.reduce(Dice.sum) - difficulty; } } class Liquid extends Thing { constructor(options) { super(options); options = options == undefined ? {} : options; if (options.taste != undefined) { this.taste = options.taste; } else { this.taste = new OneOf(OneOf.ROTATING_RANDOM, "It goes easily through your throat with no particular taste.", "You taste nothing as it softly slides through your tongue."); } } static async mix(container) { let result = await Liquid.rulebookMixing.execute({ noun: container }); if (result != undefined) { let finalQuantity = result.quantityMultiplier != undefined ? (result.quantityMultiplier * container.liquidContents.length) : (container.liquidContents.length); container.liquidContents = new Array(finalQuantity); for (let i = 0; i < finalQuantity; i++) { container.liquidContents[i] = result.result; } } } static getMixtures() { if (Liquid.sortedMixtures) { return Liquid.mixtures; } Liquid.mixtures.sort((a, b) => { if (b.firstPriority < a.firstPriority) return -1; if (a.firstPriority < b.firstPriority) return 1; if (b.priority < a.priority) return -1; if (a.priority < b.priority) return 1; return 0; }); Liquid.sortedMixtures = true; return Liquid.mixtures; } static addMixture(mixture) { Liquid.mixtures.push(mixture); Liquid.sortedMixtures = false; } } Liquid.rulebookMixing = new Rulebook("Mixing the liquid contents of something"); Liquid.mixtures = []; Liquid.sortedMixtures = false; Liquid.ruleDefaultMixing = Liquid.rulebookMixing.createAndAddRule({ name: "Mixing through Mixtures", code: runner => { if (runner.noun.liquidContents.length == 0) { return; } let mixture; for (let i = 0; i < Liquid.mixtures.length; i++) { mixture = Liquid.mixtures[i]; let proportions = []; let mixtureIterator = mixture.quantities.entries(); for (let mixtureLiquid = mixtureIterator.next(); !mixtureLiquid.done; mixtureLiquid = mixtureIterator.next()) { let mixtureType = mixtureLiquid.value[0]; let mixtureQuantity = mixtureLiquid.value[1]; let matchedQuantity = 0; runner.noun.liquidContents.forEach((liquidType) => { try { if (liquidType == mixtureType || (typeof mixtureType == "function" && (liquidType instanceof mixtureType || mixtureType(liquidType)))) { matchedQuantity++; } } catch (e) { } }); proportions.push(matchedQuantity / mixtureQuantity); } if (proportions.every(function (element, index, array) { return element === array[0]; })) { return mixture; } } } }); class Scenery extends Thing { constructor() { super(...arguments); this.fixedInPlace = true; this.scenery = true; } } class OrcDebugger extends Humanoid { constructor() { super({ isMale: true, name: (() => { let nameMod = OrcDebugger.nameModifier.getOne(); if (nameMod == undefined) { nameMod = (OrcDebugger.counter++).toString(); } return nameMod + " Orc"; })(), unique: true, description: "This is one extremely ugly fellow." }); this.AI.wanderer = true; this.AI.picksShinies = true; } } OrcDebugger.nameModifier = new Shuffler([ "Ugly", "Muscular", "Veiny", "Angry", "Sad", "Smart", "Agile", "Short", "Bulging", "Intense", "Smouldering" ]); OrcDebugger.counter = 1; ActionTalk.carry.createAndAddRule({ name: "Talking to the orc", firstPriority: ActionTalk.PRIORITY_GLOBAL_DIALOGUE, priority: ActionTalk.PRIORITY_COMMON_DIALOGUE, conditions: (runner) => { return runner.noun.getNoun(0) instanceof OrcDebugger; }, code: (runner) => { let orc = runner.noun.getNoun(0); let result = Dice.testAgainstRoll({ name: "Charm + 2", value: WorldState.player.getStat(Attributes.Charm) + 2 }, { name: "Orc's wits + 2", value: orc.getStat(Attributes.Intelligence) + 2 }); if (result > 0) { Elements.CurrentTurnHandler.printAsContent(new Say("You win!")); } else { Elements.CurrentTurnHandler.printAsContent(new Say("You lose.")); } return true; } }); class Semen extends Liquid { constructor(cummer, options) { super(options); this.cummer = cummer; } } var rooma = new RoomRandom("Room A"); rooma.description = new Say("You are inside a box of metal painted blue. Your head almost touches the ceiling, making the room look smaller than it really is.", Say.LINE_BREAK, new SayIf(() => { return Thing.InsideRoomRelation.getLeft(vase) == rooma || Thing.InsideRoomRelation.getLeft(urn) == rooma; }, " Still, there are some things thrown about.")); PlayBegins.setStartingRoom(rooma); let paddedBra = new Clothing({ name: "Padded Bra", unique: true }); paddedBra.breastPadding = 3; paddedBra.slots = [Humanoid.SLOT_BREASTS]; let paddedUnderwear = new Clothing({ name: "Padded Underwear", unique: true }); paddedUnderwear.crotchPadding = 15; paddedUnderwear.slots = [Humanoid.SLOT_CROTCH_BACK, Humanoid.SLOT_CROTCH_FRONT]; let player = WorldState.player; WorldState.player = player; var vase = new Thing({ name: "Vase" }); vase.description = new Say("This is an ornamental vase that'd look very nice on your lap. Why? Who knows."); rooma.place(vase); let mapOfTest = new MapNote({ name: "Map of this Region", description: "This is a simple map showing all the rooms here.", unique: true }); rooma.place(mapOfTest); let urn = new Thing({ unique: true, name: "Urn of Dreams", image: "image001" }); urn.description = new Say("This appears to be a simple, black urn containing the ashes of your dreams."); rooma.place(urn); var roomb = new RoomRandom("Room B"); roomb.place(vase); let frillyPouch = new CoinPouch({ name: "Frilly Pouch", description: new Say("This is a very gay little pink pouch full of little hearts.") }); frillyPouch.addCoins(502); rooma.place(frillyPouch); let bigSack = new CoinPouch({ name: "Big Sack" }); bigSack.addCoins(100); rooma.place(bigSack); let region = new RegionRandom("Test Region"); region.place(rooma, roomb); for (let i = 1; i < 6; i++) { let room = new RoomRandom("Room " + i.toString()); region.place(room); if (Math.random() > 0.5) { } } mapOfTest.addRegion(region); let southestRoom = new RoomRandom("Southest Room"); region.place(southestRoom); southestRoom.appearChance = 100; southestRoom.backgroundImage = "bloo"; southestRoom.trickyCode = (options) => { let myCoordinates = [options.x, options.y]; for (let i = 0; i < Room.DIRECTIONS.length; i++) { let direction = Room.DIRECTIONS[i]; if (direction != Direction.NORTH) { let coordinates = Room.shift(myCoordinates, direction); if (!options.map.isFree(coordinates[0], coordinates[1])) { return false; } coordinates = Room.shift(coordinates, direction); if (!options.map.isFree(coordinates[0], coordinates[1])) { return false; } } } return true; }; RegionRandom.rulebookAfterPlaceRoom.addRule(new Rule({ name: "After placing the southest room", code: runner => { let options = runner.noun; let myCoordinates = options.map.getCoordinates(options.room); if (myCoordinates != undefined) { for (let i = 0; i < Room.DIRECTIONS.length; i++) { let direction = Room.DIRECTIONS[i]; if (direction != Direction.NORTH) { let coordinates = Room.shift(myCoordinates, direction); options.map.block(coordinates[0], coordinates[1]); coordinates = Room.shift(coordinates, direction); options.map.block(coordinates[0], coordinates[1]); } } } }, conditions: runner => { return runner.noun.room == southestRoom; } })); Thing.CarryRelation.setRelation(WorldState.player, mapOfTest); PlayBegins.rulebook.addRule(new Rule({ name: "randomize region", firstPriority: Rule.PRIORITY_HIGHEST, code: async (runner) => { await region.randomize(); } })); RegionRandom.rulebookRandomizeRegion.addRule(new Rule({ name: "Add room A and B to region", firstPriority: Rule.PRIORITY_HIGHEST, code: async (runner) => { await RegionRandom.rulebookPlaceRoom.execute({ noun: { map: region.map, room: rooma, region: region } }).then(); await RegionRandom.rulebookPlaceRoom.execute({ noun: { map: region.map, room: roomb, region: region } }).then(); }, conditions: runner => { return runner.noun == region; } })); function getPath(rooma, roomb) { console.debug("The best path from " + rooma.getPrintedName() + " to " + roomb.getPrintedName() + " is:"); let t0, dir, t1; t0 = performance.now(); dir = rooma.bestDirectionTo(roomb); t1 = performance.now(); if (dir != undefined) { console.debug(DirectionNames[Direction[dir]]); } else { console.debug("There is no path."); } console.debug("Call to doSomething took " + (t1 - t0) + " milliseconds."); } let wanderRegion = new RegionRandom("OrcableRegion"); wanderRegion.place(rooma, roomb); region.place(wanderRegion); let rooms = region.getRooms(); let shuffler = new Shuffler(rooms); for (let i = 0; i < 0; i++) { AI.rules.createAndAddRule({ name: "Pick Shinies", firstPriority: AIRules.PRIORITY_ACTING_ON_PLACE, conditions: (runner) => { let person = runner.noun; return person.AI.picksShinies; }, code: (runner) => { let person = runner.noun; let room = person.getRoom(); let visibleThings = room.getContainedAndVisibleTo(person); if (visibleThings.length > 0) { for (let i = 0; i < visibleThings.length; i++) { if (!visibleThings[i].fixedInPlace && visibleThings[i].getShiny()) { return new ActionTake(person, visibleThings[i]); } } } } }); } let randomOrc; let randomOrc2; for (let i = 0; i < 10; i++) { let orc = new OrcDebugger(); randomOrc = orc; if (randomOrc2 == undefined) { randomOrc2 = orc; } orc.AI.wanderer = true; orc.AI.picksShinies = true; orc.AI.wandersOn = wanderRegion; let room = new Shuffler(region.getRooms()).getOne(); room.place(orc); } var fTarget = new ContentGroup(); fTarget.addUnit(new FuckingUnit() .setFucked(WorldState.player) .setFucker(randomOrc) .setHole(WorldState.player.getPart(HumanoidVagina)) .setStick(randomOrc.getPart(HumanoidPenis))); fTarget.addUnit(new FuckingUnit() .setFucked(WorldState.player) .setFucker(randomOrc2) .setHole(WorldState.player.getPart(HumanoidHead)) .setStick(randomOrc2.getPart(HumanoidPenis))); let spitroast = (new FuckingDescription("Orc spitroast!")); spitroast.setDescription(new Say("Orc Spitroast!")) .addUnit() .setFucker(OrcDebugger) .setHole(HumanoidVagina) .setStick(HumanoidPenis); spitroast.addUnit() .setFucker(OrcDebugger) .setHole(HumanoidHead) .setStick(HumanoidPenis); (new FuckingDescription("Specific Orc in Vagina")) .setDescription(new Say("Specific Orc in Vagina.")) .addUnit() .setFucker(randomOrc) .setHole(WorldState.player.getPart(HumanoidVagina)) .setStick(randomOrc.getPart(HumanoidPenis)); (new FuckingDescription("Specific Orc Starts Cumming in Vagina")) .setDescription(new Say("Specific Orc Starts Cumming in Vagina")) .addUnit() .setFucker(randomOrc) .setHole(WorldState.player.getPart(HumanoidVagina)) .addMarker(FuckingState.CUM_START) .setStick(randomOrc.getPart(HumanoidPenis)); (new FuckingDescription("Orc in mouth")) .setDescription(new Say("Orc in mouth.")) .addUnit() .setFucker(OrcDebugger) .setHole(HumanoidHead) .setStick(HumanoidPenis); var DialogueTrees; (function (DialogueTrees) { DialogueTrees.CreationIntro = (function () { let tree = new DialogueTree("CreationIntro"); let node; let text; let set; node = new DialogueNode("ae981322-9151-49c8-a889-94455db7c262"); node.setNext("81582dea-ba27-4baa-8df2-a77fbb5ed9ef"); tree.addStartNode(node); text = new DialogueText("f72bf099-bae2-49df-9433-c9c3ec6a020d"); text.setSay(() => { return new Say("As you approach the Obelisk, many dreams and nightmares will become reality as it attempts to dissuade you from getting too close, with the intensity increasing the closer you get to your objective.", Say.PARAGRAPH_BREAK, "Ultimately, the Obelisk wishes you no harm, for it is better to have you around as a protector than as a dead enemy, so the Obelisk will attempt to give you exactly what you want deep in your heart, trying to make you completely satisfied so that you no longer wish for the Obelisk's destruction or become unable to continue your quest. Of course, what your heart wants is not necessarily what you think it wants.", Say.PARAGRAPH_BREAK, "Orcs, the most common creature to come out of the Obelisk, are nothing more than humans warped by their own desire for unbridled violence. What will the Obelisk do to you?", Say.PARAGRAPH_BREAK, "On the following screens, you will define who you will be in this story. Please confirm carefully, as there is no turning back."); }); text.setNext("66d4b27a-ff40-4a8e-a749-2b5e8237695a"); tree.addNode(text); set = new DialogueSet("81582dea-ba27-4baa-8df2-a77fbb5ed9ef"); set.setFunction(() => { Elements.startMenu(); }); set.setNext("f72bf099-bae2-49df-9433-c9c3ec6a020d"); tree.addNode(set); set = new DialogueSet("0b4fec87-a2b0-4e3b-81ed-a4150f94fc10"); set.setFunction(() => { Elements.endMenu(); }); tree.addNode(set); set = new DialogueSet("66d4b27a-ff40-4a8e-a749-2b5e8237695a"); set.setFunction(() => { return Elements.waitForAnyKey(); }); set.setNext("0b4fec87-a2b0-4e3b-81ed-a4150f94fc10"); tree.addNode(set); return tree; })(); })(DialogueTrees || (DialogueTrees = {})); var CharacterCreation; (function (CharacterCreation) { CharacterCreation.CreationIntro = CharacterCreation.rulebook.createAndAddRule({ name: "Show small Intro", firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGHEST, code: async () => { await DialogueTrees.CreationIntro.execute(); } }); })(CharacterCreation || (CharacterCreation = {})); var CharacterCreation; (function (CharacterCreation) { let ccDiv = document.createElement("div"); ccDiv.id = "characterCreation"; let rightSide = document.createElement("div"); rightSide.id = "ccRight"; let leftSide = document.createElement("div"); leftSide.id = "ccLeft"; ccDiv.appendChild(leftSide); ccDiv.appendChild(rightSide); let resolver; async function printTable() { printOrigin(); while (leftSide.firstChild) leftSide.removeChild(leftSide.firstChild); await (new Say(new SayBold("Character Origin:")).getHTMLContent().then(eles => { eles.forEach(ele => { leftSide.appendChild(ele); }); })); let origins = CharacterOrigin.getOrigins(); for (let i = 0; i < origins.length; i++) { let origin = origins[i]; let say = new Say(origin.name); if (origin.id == CharacterCreation.PlayerOrigin.value) { say.add(" - SELECTED"); } await (say).getHTML("p", ["choice"]).then(elementArray => { Controls.Links.makeCustomLink(elementArray[0], { mouseover: () => { printOrigin(origin); }, mouseout: () => { printOrigin(); }, click: () => { CharacterCreation.PlayerOrigin.value = origin.id; reset(); } }); Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode()); leftSide.appendChild(elementArray[0]); }); } } function printConfirm() { (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => { elementArray[0].addEventListener("click", () => { resolver(); }); Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode()); Elements.CurrentTurnHandler.print(elementArray[0]); }); } function printOrigin(origin) { if (origin == undefined) { origin = CharacterOrigin.getOrigin(CharacterCreation.PlayerOrigin.value); } let say = new Say(origin.description); if (origin.bonusStats != undefined) { say.add(Say.PARAGRAPH_BREAK, origin.bonusStats); } say.getHTMLContent().then((eles => { while (rightSide.firstChild) rightSide.removeChild(rightSide.firstChild); for (let i = 0; i < eles.length; i++) { rightSide.appendChild(eles[i]); } })); } function reset() { Elements.CurrentTurnHandler.clear(); Elements.CurrentTurnHandler.print(ccDiv); printTable(); Elements.CurrentTurnHandler.print(document.createElement("br")); Elements.CurrentTurnHandler.print(document.createElement("br")); printConfirm(); } CharacterCreation.CCOrigin = CharacterCreation.rulebook.createAndAddRule({ name: "Character Creation - Origin", firstPriority: Rule.PRIORITY_MEDIUM, priority: Rule.PRIORITY_HIGH, code: async () => { Elements.startMenu(); let promise = new Promise(resolve => { resolver = resolve; }); reset(); await promise; CharacterCreation.getOrigin().confirmPicked(); Elements.endMenu(); } }); })(CharacterCreation || (CharacterCreation = {})); var CharacterCreation; (function (CharacterCreation) { let ccDiv = document.createElement("div"); ccDiv.id = "characterCreation"; let rightSide = document.createElement("div"); rightSide.id = "ccRight"; let leftSide = document.createElement("div"); leftSide.id = "ccLeft"; ccDiv.appendChild(leftSide); ccDiv.appendChild(rightSide); let resolver; async function printTable() { while (leftSide.firstChild) leftSide.removeChild(leftSide.firstChild); await (new Say(new SayBold("Perks (Choose any):")).getHTMLContent().then(eles => { eles.forEach(ele => { leftSide.appendChild(ele); }); })); let perks = Perk.getPerks(); for (let i = 0; i < perks.length; i++) { let perk = perks[i]; let say = new Say(perk.name); if (perk.isEnabled()) { if (perk.isForced()) { say.add(" (Mandatory)"); } else { say.add(" - Selected"); } } else if (perk.isForced()) { say.add(" (Forbidden)"); } await (say).getHTML("p", ["choice"]).then(elementArray => { Controls.Links.makeCustomLink(elementArray[0], { mouseover: () => { printPerk(perk); }, mouseout: () => { emptyPerk(); }, click: () => { if (!perk.isForced()) { perk.value = !perk.value; } reset(); } }); Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode()); leftSide.appendChild(elementArray[0]); }); } } function printConfirm() { (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => { elementArray[0].addEventListener("click", () => { resolver(); }); Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode()); Elements.CurrentTurnHandler.print(elementArray[0]); }); } function emptyPerk() { while (rightSide.firstChild) rightSide.removeChild(rightSide.firstChild); } function printPerk(perk) { let say = new Say(perk.description); say.getHTMLContent().then((eles => { emptyPerk(); for (let i = 0; i < eles.length; i++) { rightSide.appendChild(eles[i]); } })); } function reset() { Perk.updatePerks(); Elements.CurrentTurnHandler.clear(); Elements.CurrentTurnHandler.print(ccDiv); printTable(); Elements.CurrentTurnHandler.print(document.createElement("br")); Elements.CurrentTurnHandler.print(document.createElement("br")); printConfirm(); } CharacterCreation.CCPerk = CharacterCreation.rulebook.createAndAddRule({ name: "Character Creation - Origin", firstPriority: Rule.PRIORITY_LOW, priority: Rule.PRIORITY_HIGH, code: async () => { Elements.startMenu(); let promise = new Promise(resolve => { resolver = resolve; }); reset(); await promise; let perks = Perk.getPerks(); perks.forEach(perk => { if (perk.isEnabled()) { perk.confirmPicked(); } }); Elements.endMenu(); } }); })(CharacterCreation || (CharacterCreation = {})); var CharacterCreation; (function (CharacterCreation) { function createRange(options) { let valueNode = document.createTextNode(String(options.value)); let div = document.createElement("div"); div.classList.add("ccOption"); if (options.topLabel != undefined) { let topLabel = document.createElement("div"); topLabel.classList.add("ccOptionTopLabel"); topLabel.appendChild(document.createTextNode(options.topLabel + ":")); div.appendChild(topLabel); } let label = document.createElement("div"); if (options.showValue != false) { label.classList.add("rangeValue"); if (options.label != undefined) { let b = document.createElement("b"); b.appendChild(document.createTextNode(options.label + ": ")); label.appendChild(b); } label.appendChild(valueNode); } let input = document.createElement("input"); input.classList.add("ccRange"); input.type = "range"; input.min = options.minValue.toString(); input.max = options.maxValue.toString(); input.step = options.step.toString(); input.value = options.value.toString(); let onChange = () => { valueNode.nodeValue = input.value; options.onChange(Number(input.value), valueNode, input); }; input.addEventListener("change", onChange); let leftButton = document.createElement("a"); leftButton.classList.add("ccButton"); leftButton.addEventListener("click", () => { input.value = String(Number(input.value) - options.step); onChange(); }); Controls.KeyHandler.applyCode(leftButton, Controls.KeyHandler.getFirstKeyCode()); if (options.leftLabel != undefined) { leftButton.appendChild(document.createTextNode(options.leftLabel)); } let rightButton = document.createElement("a"); rightButton.classList.add("ccButton"); rightButton.addEventListener("click", () => { input.value = String(Number(input.value) + options.step); onChange(); }); Controls.KeyHandler.applyCode(rightButton, Controls.KeyHandler.getFirstKeyCode()); ; if (options.rightLabel != undefined) { rightButton.appendChild(document.createTextNode(options.rightLabel)); } div.appendChild(leftButton); div.appendChild(input); div.appendChild(rightButton); div.appendChild(label); onChange(); return div; } CharacterCreation.CCSexStats = CharacterCreation.rulebook.createAndAddRule({ name: "Character Creation - Sex and Stats", firstPriority: Rule.PRIORITY_HIGH, priority: Rule.PRIORITY_HIGH, code: () => { Elements.startMenu(); let ccDiv = document.createElement("div"); ccDiv.id = "characterCreation"; let ccLeft = document.createElement("div"); ccLeft.id = "ccLeft"; ccDiv.appendChild(ccLeft); let ccRight = document.createElement("div"); ccRight.id = "ccRight"; ccDiv.appendChild(ccRight); let onChange = () => { (new Say(WorldState.player.description)).getHTMLContent().then((value => { while (ccRight.firstChild) ccRight.removeChild(ccRight.firstChild); value.forEach(val => { ccRight.appendChild(val); }); })); }; ccLeft.appendChild(createRange({ minValue: 0, maxValue: 1, step: 1, value: 0, leftLabel: "Male", rightLabel: "Female", topLabel: "Sex", onChange: (value, labelValue, input) => { labelValue.nodeValue = (value == 0 ? "Male" : "Female"); WorldState.player.removeGenderedParts(); if (value == 0) { WorldState.player.addMaleParts(); } else { WorldState.player.addFemaleParts(); } let otherInputs = ccDiv.getElementsByTagName("input"); for (let i = 0; i < otherInputs.length; i++) { let otherInput = otherInputs[i]; if (otherInput != input) { otherInput.dispatchEvent(new Event("change")); } } onChange(); } })); ccLeft.appendChild(createRange({ minValue: 0, maxValue: 4, step: 1, value: 2, leftLabel: "Masculine", rightLabel: "Feminine", topLabel: "Gender", onChange: (value, labelValue) => { let names = ["Masculine", "Somewhat masculine", "Androgynous", "Somewhat feminine", "Feminine"]; labelValue.nodeValue = names[value]; let player = WorldState.player; let intendedValue; if (player.isMale()) { let values = [10, 25, 50, 55, 60]; intendedValue = values[value]; } else { let values = [35, 40, 50, 65, 75]; intendedValue = values[value]; } WorldState.player.setGenderValue(intendedValue); WorldState.player.setStat(Attributes.GenderIdentity, intendedValue); onChange(); } })); let statsHeader = document.createElement("div"); ccLeft.appendChild(statsHeader); statsHeader.classList.add("ccHeader"); statsHeader.appendChild(document.createTextNode("Stats (")); let maxStats = 12; let statsRemaining = document.createTextNode("4 points remaining"); statsHeader.appendChild(statsRemaining); statsHeader.appendChild(document.createTextNode(")")); let setStat = (attr, value, input) => { player.setStat(attr, value); let remaining = maxStats - player.getStat(Attributes.Strength) - player.getStat(Attributes.Agility) - player.getStat(Attributes.Intelligence) - player.getStat(Attributes.Charm); if (remaining < 0) { value += remaining; remaining = 0; input.value = value.toString(); input.dispatchEvent(new Event("change")); return; } statsRemaining.nodeValue = (remaining == 0 ? "Done" : remaining > 1 ? remaining.toString() + " points remaining" : remaining.toString() + " point remaining"); }; ccLeft.appendChild(createRange({ minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Strength", onChange: (value, labelValue, input) => { setStat(Attributes.Strength, value, input); onChange(); } })); ccLeft.appendChild(createRange({ minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Agility", onChange: (value, labelValue, input) => { setStat(Attributes.Agility, value, input); onChange(); } })); ccLeft.appendChild(createRange({ minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Charm", onChange: (value, labelValue, input) => { setStat(Attributes.Charm, value, input); onChange(); } })); ccLeft.appendChild(createRange({ minValue: 1, maxValue: 5, step: 1, value: 2, leftLabel: "-", rightLabel: "+", topLabel: "Intelligence", onChange: (value, labelValue, input) => { setStat(Attributes.Intelligence, value, input); onChange(); } })); let creationDone = new Promise((resolve) => { (new Say("Confirm")).getHTML("p", ["choice"]).then(elementArray => { elementArray[0].addEventListener("click", () => { Elements.endMenu(); resolve(); }); Controls.KeyHandler.applyCode(elementArray[0], Controls.KeyHandler.getSecondKeyCode()); Elements.CurrentTurnHandler.print(elementArray[0]); }); }); Elements.CurrentTurnHandler.print(ccDiv); return creationDone; } }); })(CharacterCreation || (CharacterCreation = {})); var PlayBegins; (function (PlayBegins) { PlayBegins.LOAD_FAILED = false; PlayBegins.CONTINUE_FAILED = false; PlayBegins.IntroMenuRule = PlayBegins.rulebook.createAndAddRule({ name: "Intro Menu Rule", firstPriority: Rule.PRIORITY_HIGHEST, priority: Rule.PRIORITY_HIGHEST, code: async (runner) => { await DialogueTrees.IntroMenu.execute(); } }); })(PlayBegins || (PlayBegins = {})); var DialogueTrees; (function (DialogueTrees) { DialogueTrees.IntroMenu = (function () { let tree = new DialogueTree("IntroMenu"); let node; let choice; let text; let branch; let set; node = new DialogueNode("b018bb28-4efc-493b-ac37-31634c4e6406"); node.setNext("f448e718-9d24-4191-9913-ccc36d97c4c0"); tree.addStartNode(node); choice = new DialogueChoice("3b8c8bcb-0ac8-40dc-9f62-4abbde0d0f7f"); choice.setSay(() => { return new Say("Start Game"); }); choice.setNext("719e71dd-9989-4015-93af-9fb7096002c1"); tree.addNode(choice); choice = new DialogueChoice("53710087-4002-41b7-b089-cadabedbcafd"); choice.setSay(() => { return new Say("Load from file"); }); choice.setNext("f25f6525-dad6-45d7-a391-246c1b02b569"); tree.addNode(choice); choice = new DialogueChoice("b4593a36-ca83-4afc-b01b-e71344ca6e1f"); choice.setSay(() => { return new Say("Settings"); }); choice.setNext("d4a379b5-06c9-4fca-a25c-b1a31b6bf93d"); tree.addNode(choice); choice = new DialogueChoice("4c5032a5-5509-4a00-b8c7-788e7ddbf17d"); choice.setSay(() => { return new Say("About"); }); choice.setNext("6b3f385b-8283-4635-9c73-e2303d77642d"); tree.addNode(choice); node = new DialogueNode("674841a6-3752-4c81-977d-19e111536203"); node.setName("2"); node.setChoices(["3b8c8bcb-0ac8-40dc-9f62-4abbde0d0f7f", "53710087-4002-41b7-b089-cadabedbcafd", "4c5032a5-5509-4a00-b8c7-788e7ddbf17d", "b4593a36-ca83-4afc-b01b-e71344ca6e1f", "a55f46fa-98a9-4dff-9f1c-4f88c18ce8dd"]); tree.addNode(node); text = new DialogueText("bc32e411-3c54-4747-ad79-506fc5a9d6c9"); text.setSay(() => { return new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure.")); }); text.setNext("36da9ea6-909c-4c0c-94d1-a17fef44452d"); tree.addNode(text); text = new DialogueText("36da9ea6-909c-4c0c-94d1-a17fef44452d"); text.setSay(() => { return new Say("A sleek, black obelisk appeared, monsters pouring from it, threatening the world. Many tried to reach the obelisk, only to return changed - monstrous. Civilization was unable to cope with the creatures and humanity soon returned to its old, tribal ways, humans becoming rarer with each passing day. Centuries have passed and technology is now scarce, with people leading simpler lives in small settlements.", Say.PARAGRAPH_BREAK, "You were born in the ashes of the old world, living in isolation as you and your fellow men attempt to stay safe from the evils of The Obelisk. ", Say.PARAGRAPH_BREAK, "Now, fate has decided you must go, reach The Obelisk and destroy it. Will you succeed in stopping it, or will you lose yourself to all the changes it will bring to you?"); }); text.setNext("674841a6-3752-4c81-977d-19e111536203"); tree.addNode(text); node = new DialogueNode("9f11871f-eebd-4b9a-b3db-ed9be8cf78e7"); node.setName("1"); node.setNext("9eeb2100-917d-41fd-b756-6d3b80e92463"); tree.addNode(node); branch = new DialogueBranch("5d1dfb86-abd9-4ad6-bf07-8ced5476e401"); branch.setVariable(() => { return PlayBegins.LOAD_FAILED; }); branch.addBranch("415dc32a-1549-429d-9ac4-8cd1b4c92c14", () => { return true; }); branch.setNext("f82fc177-b4bd-4f06-b7ab-216259e056a5"); tree.addNode(branch); set = new DialogueSet("f82fc177-b4bd-4f06-b7ab-216259e056a5"); set.setFunction(() => { Elements.endMenu(); }); tree.addNode(set); set = new DialogueSet("9eeb2100-917d-41fd-b756-6d3b80e92463"); set.setFunction(() => { Elements.clearMainScreen(); }); set.setNext("bc32e411-3c54-4747-ad79-506fc5a9d6c9"); tree.addNode(set); node = new DialogueNode("415dc32a-1549-429d-9ac4-8cd1b4c92c14"); node.setNext("1"); tree.addNode(node); set = new DialogueSet("f448e718-9d24-4191-9913-ccc36d97c4c0"); set.setFunction(() => { Elements.startMenu(); tree.setRepeatChoices(false); }); set.setNext("9f11871f-eebd-4b9a-b3db-ed9be8cf78e7"); tree.addNode(set); choice = new DialogueChoice("ef9253b9-5c24-46cc-8e2d-5562a1544f07"); choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(0)); }); choice.setNext("9594cf06-6062-4952-b378-6aedaafe2951"); tree.addNode(choice); choice = new DialogueChoice("82c512c6-0115-4d72-a413-5728a623f04b"); choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(1)); }); choice.setNext("fe95cfb3-b9f5-4b12-83aa-94d26e5bcac0"); tree.addNode(choice); choice = new DialogueChoice("7315835a-4d95-4377-828c-8a4ca7e49f87"); choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(2)); }); choice.setNext("dc884974-7bb2-436f-b3a4-cdf8550bd494"); tree.addNode(choice); choice = new DialogueChoice("50afd6f8-87ce-49bf-b689-4819bc5dc8e7"); choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(3)); }); choice.setNext("62f5ea88-c6f0-4469-87f2-ea3b37638509"); tree.addNode(choice); choice = new DialogueChoice("d79e9955-f81e-4ac9-8246-a02b0bd49dae"); choice.setSay(() => { return new Say(SaveHandler.getSayForSlot(4)); }); choice.setNext("ee4ecd8b-59e2-43a6-8150-8a835d6eeae1"); tree.addNode(choice); node = new DialogueNode("719e71dd-9989-4015-93af-9fb7096002c1"); node.setName("SlotChoices"); node.setChoices(["ef9253b9-5c24-46cc-8e2d-5562a1544f07", "82c512c6-0115-4d72-a413-5728a623f04b", "7315835a-4d95-4377-828c-8a4ca7e49f87", "50afd6f8-87ce-49bf-b689-4819bc5dc8e7", "d79e9955-f81e-4ac9-8246-a02b0bd49dae", "9483a087-04d0-48dd-884f-946930771b95", "defe0f4c-4452-40f3-aff1-ba076263fcbc"]); tree.addNode(node); set = new DialogueSet("9594cf06-6062-4952-b378-6aedaafe2951"); set.setFunction(() => { SaveHandler.setSlot(0); }); set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); tree.addNode(set); set = new DialogueSet("fe95cfb3-b9f5-4b12-83aa-94d26e5bcac0"); set.setFunction(() => { SaveHandler.setSlot(1); }); set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); tree.addNode(set); set = new DialogueSet("dc884974-7bb2-436f-b3a4-cdf8550bd494"); set.setFunction(() => { SaveHandler.setSlot(2); }); set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); tree.addNode(set); set = new DialogueSet("62f5ea88-c6f0-4469-87f2-ea3b37638509"); set.setFunction(() => { SaveHandler.setSlot(3); }); set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); tree.addNode(set); set = new DialogueSet("ee4ecd8b-59e2-43a6-8150-8a835d6eeae1"); set.setFunction(() => { SaveHandler.setSlot(4); }); set.setNext("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); tree.addNode(set); set = new DialogueSet("f25f6525-dad6-45d7-a391-246c1b02b569"); set.setFunction(() => { return SaveHandler.loadFromFile(); }); set.setNext("5d1dfb86-abd9-4ad6-bf07-8ced5476e401"); tree.addNode(set); choice = new DialogueChoice("9483a087-04d0-48dd-884f-946930771b95"); choice.setSay(() => { return new Say("Erase a save"); }); choice.setConditions(() => { return !SaveHandler.isErasing(); }); choice.setNext("ee65c84a-021f-44d3-aa34-50235f438c96"); tree.addNode(choice); choice = new DialogueChoice("defe0f4c-4452-40f3-aff1-ba076263fcbc"); choice.setSay(() => { return new Say("Don't erase my saves!"); }); choice.setConditions(() => { return SaveHandler.isErasing(); }); choice.setNext("ee65c84a-021f-44d3-aa34-50235f438c96"); tree.addNode(choice); set = new DialogueSet("ee65c84a-021f-44d3-aa34-50235f438c96"); set.setFunction(() => { SaveHandler.toggleErasing(); }); set.setNext("6f15f7d6-4944-4b93-9d47-7046e8ae1f15"); tree.addNode(set); node = new DialogueNode("6f15f7d6-4944-4b93-9d47-7046e8ae1f15"); node.setNext("SlotChoices"); tree.addNode(node); set = new DialogueSet("915492f1-8fa7-4ddc-9dc0-6b0340f738c8"); set.setFunction(() => { return SaveHandler.loadFromStorage(); }); set.setNext("f82fc177-b4bd-4f06-b7ab-216259e056a5"); tree.addNode(set); node = new DialogueNode("d4a379b5-06c9-4fca-a25c-b1a31b6bf93d"); node.setNext("Settings"); tree.addNode(node); node = new DialogueNode("6b3f385b-8283-4635-9c73-e2303d77642d"); node.setNext("About"); tree.addNode(node); node = new DialogueNode("b75c038c-654c-4c62-8f49-2f4518f52cff"); node.setName("Settings"); node.setNext("d33456b8-72b6-4214-90b3-3eba2442b287"); tree.addNode(node); text = new DialogueText("d33456b8-72b6-4214-90b3-3eba2442b287"); text.setSay(() => { return new Say("Not implemented."); }); text.setNext("bc24b446-d6a2-4284-93fb-67ad3598fcd1"); tree.addNode(text); set = new DialogueSet("bc24b446-d6a2-4284-93fb-67ad3598fcd1"); set.setFunction(() => { return Elements.waitForAnyKey(); }); set.setNext("81f9d62b-907e-48ae-84fe-78c7cecc4fe3"); tree.addNode(set); node = new DialogueNode("81f9d62b-907e-48ae-84fe-78c7cecc4fe3"); node.setNext("1"); tree.addNode(node); node = new DialogueNode("c342e112-5c73-4c82-8882-47ca3a71c914"); node.setName("About"); node.setNext("d33456b8-72b6-4214-90b3-3eba2442b287"); tree.addNode(node); choice = new DialogueChoice("a55f46fa-98a9-4dff-9f1c-4f88c18ce8dd"); choice.setSay(() => { return new Say("Note about content (Spoiler Alert)"); }); choice.setNext("7c2060aa-66ce-4dbb-88d2-0c8f190e0a6c"); tree.addNode(choice); text = new DialogueText("59a3cb30-d4ba-4b46-8157-b900fc7022dd"); text.setSay(() => { return new Say(Say.CENTERED, new SayImage("introLogo"), Say.LINE_BREAK, new SayItalic("The Obelisk is an adult interactive fiction game set in a post-apocalyptic world ravaged by a magical structure.")); }); text.setNext("1b8bdc9d-a4bf-40aa-a382-f7813c158840"); tree.addNode(text); set = new DialogueSet("c27829b7-7199-4b1e-9334-536258546cfc"); set.setFunction(() => { return Elements.waitForAnyKey(); }); set.setNext("42401145-9154-40c3-a9d3-4f83df97b89e"); tree.addNode(set); node = new DialogueNode("42401145-9154-40c3-a9d3-4f83df97b89e"); node.setNext("1"); tree.addNode(node); set = new DialogueSet("7c2060aa-66ce-4dbb-88d2-0c8f190e0a6c"); set.setFunction(() => { Elements.clearMainScreen(); }); set.setNext("59a3cb30-d4ba-4b46-8157-b900fc7022dd"); tree.addNode(set); text = new DialogueText("1b8bdc9d-a4bf-40aa-a382-f7813c158840"); text.setSay(() => { return new Say("In this story, the Obelisk will attempt to give the player exactly what the player wants, but that's not always what the player thinks they want. This is a pornographic game first and a roleplaying game second, which means that it is assumed that the player character wants sex - even if they don't act like it.", Say.PARAGRAPH_BREAK, "Therefore, this game will \"fit\" for players who go in with that mentality, but it ", new SayBold("will"), " look differently for players with a different point of view for their characters. While roleplaying is encouraged, that is not how the game was written, so if you're playing it that way, it's just your choice.", Say.PARAGRAPH_BREAK, "There is no sex without explicit consent from the NPCs: implicit consent is only used for the player character, because that's part of the story. It is possible to remove the player's consent, thereby having no unwanted sex scenes occur, by setting up the content options, which will disable content without explicit consent (i.e. disabling M/M Sex Scenes means this kind of thing will only happen if you actively ask an NPC for it).", Say.PARAGRAPH_BREAK, "While the content options are there to tailor your experience, the game is made with \"all content is available\" in mind, which might result in a playthrough that's not much fun if you disable too many things. Still, that's your choice. Game on."); }); text.setNext("c27829b7-7199-4b1e-9334-536258546cfc"); tree.addNode(text); branch = new DialogueBranch("a6b6b3d2-25ef-41b1-a5b5-25143f1b41f9"); branch.setVariable(() => { return SaveHandler.isVirgin(); }); branch.addBranch("d0dcd7c6-26ae-41d0-99a6-e0cae17ae381", () => { return true; }); branch.setNext("915492f1-8fa7-4ddc-9dc0-6b0340f738c8"); tree.addNode(branch); text = new DialogueText("b8ee6702-8d38-4bd7-9b24-df8c901a50d4"); text.setSay(() => { return new Say(new SayBold("A note on saves: "), "The selected slot will be saved to browser storage, so it will be deleted if the browser ever decides to delete it. The game will write to that save slot every turn, so you don't need to worry about that. Alternatively, you can manually save in-game, which will save to a file."); }); text.setNext("50876e13-23b9-43c0-b6b1-a89b1683d5e7"); tree.addNode(text); set = new DialogueSet("50876e13-23b9-43c0-b6b1-a89b1683d5e7"); set.setFunction(() => { return Elements.waitForAnyKey(); }); set.setNext("915492f1-8fa7-4ddc-9dc0-6b0340f738c8"); tree.addNode(set); set = new DialogueSet("d0dcd7c6-26ae-41d0-99a6-e0cae17ae381"); set.setFunction(() => { Elements.clearMainScreen(); }); set.setNext("b8ee6702-8d38-4bd7-9b24-df8c901a50d4"); tree.addNode(set); return tree; })(); })(DialogueTrees || (DialogueTrees = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9hcHAvRnVuY3Rpb25zLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvU2F2ZS9TdG9yZWRWYXJpYWJsZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1J1bGVib29rLnRzIiwiLi4vYXBwL1dvcmxkL1NldHRpbmdzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUnVsZS50cyIsIi4uL2FwcC9Xb3JsZC9UdXJuU2VxdWVuY2UudHMiLCIuLi9hcHAvVmVyc2lvbi50cyIsIi4uL2FwcC9Db250cm9scy9Nb2R1bGVzL01lbW9yeS50cyIsIi4uL2FwcC9Db250cm9scy9DbGFzc2VzL1N0b3JlZE1lbW9yeS50cyIsIi4uL2FwcC9TYXZlSGFuZGxlci50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9DaGFyYWN0ZXJPcmlnaW4udHMiLCIuLi9hcHAvQ2hhcmFjdGVyQ3JlYXRpb24vT3JpZ2lucy9DaGFtcGlvbk9yaWdpbi50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9DaGFyYWN0ZXJDcmVhdGlvbi50cyIsIi4uL2FwcC9DaGFyYWN0ZXJDcmVhdGlvbi9QZXJrLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L09uZU9mLnRzIiwiLi4vYXBwL0NvbnRyb2xzL0NvbnRyb2xzLnRzIiwiLi4vYXBwL1dvcmxkL01hY2hpbmVCZWdpbnMudHMiLCIuLi9hcHAvRWxlbWVudHMvRWxlbWVudHMudHMiLCIuLi9hcHAvQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUltYWdlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzIiwiLi4vYXBwL0NoYXJhY3RlckNyZWF0aW9uL09yaWdpbnMvRmFsc2VseUFjY3VzZWQudHMiLCIuLi9hcHAvQ2hhcmFjdGVyQ3JlYXRpb24vUGVya3MvSG9ybnlWaXJnaW4udHMiLCIuLi9hcHAvQ29udHJvbHMvTW9kdWxlcy9Db250ZW50SGFuZGxlci50cyIsIi4uL2FwcC9Db250cm9scy9DbGFzc2VzL0NvbnRlbnRUeXBlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL01vZHVsZXMvQ3VycmVudFR1cm5IYW5kbGVyLnRzIiwiLi4vYXBwL0NvbnRyb2xzL01vZHVsZXMvTGlua3MudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9Sb29tTm9kZS50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlBbi50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUhlU2hlSXQudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5SGltSGVySXQudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5SGlzSGVyc0l0cy50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlJZi50cyIsIi4uL2FwcC9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlJdGFsaWMudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5TGVmdFJpZ2h0LnRzIiwiLi4vYXBwL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUxpbmsudHMiLCIuLi9hcHAvRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5VGhlLnRzIiwiLi4vYXBwL0VsZW1lbnRzL01vZHVsZXMvQXBwZWFyYW5jZUhhbmRsZXIudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Gb250U2l6ZS50cyIsIi4uL2FwcC9FbGVtZW50cy9Nb2R1bGVzL0Z1bGxzY3JlZW4udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Ib3ZlckluZm8udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvbkV4YW1pbmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SZWxhdGlvbi50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1JlbGF0aW9ucy9SZWxhdGlvbk9uZVRvTWFueS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5nLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblRha2UudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uR28udHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9Sb29tSGFuZGxlci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9Db2luUG91Y2gudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9JbnZlbnRvcnlIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblJldHJhY2UudHMiLCIuLi9hcHAvRWxlbWVudHMvTW9kdWxlcy9SZW1lbWJlcmVkSGFuZGxlci50cyIsIi4uL2FwcC9FbGVtZW50cy9Nb2R1bGVzL1N0YXR1c0xpbmVIYW5kbGVyLnRzIiwiLi4vYXBwL1dvcmxkL0RlYnVnLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQUkudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvUGVyc29uL1BlcnNvblN0YXQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvUGVyc29uL0F0dHJpYnV0ZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9QZXJzb24vU2tpbGwudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250YWluZXIvQ29udGFpbmVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGFpbmVyL0NvcnBzZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9QZXJzb24udHMiLCIuLi9hcHAvV29ybGQvRXZlcnlUdXJuLnRzIiwiLi4vYXBwL1dvcmxkL0Z1Y2tpbmcudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Sb29tLnRzIiwiLi4vYXBwL1dvcmxkL091dE9mUGxheS50cyIsIi4uL2FwcC9Xb3JsZC9QbGF5QmVnaW5zLnRzIiwiLi4vYXBwL1dvcmxkL1Rlc3RzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL01hcE5vdGUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvU2V4U3RpY2sudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvU2V4SG9sZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL01lYXN1cmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRBcm1zLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkQnJlYXN0cy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9Cb2R5cGFydC9IdW1hbm9pZC9IdW1hbm9pZEJ1dHQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRFeHRyZW1pdHkudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRGZWV0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkSGFuZHMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRIZWFkLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkUGVuaXMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWQvSHVtYW5vaWRTa2luLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVGVzdGljbGVzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVmFnaW5hLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0JvZHlwYXJ0L0h1bWFub2lkL0h1bWFub2lkVG9yc28udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvQm9keXBhcnQvSHVtYW5vaWRQYXJ0cy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9DbG90aGluZy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0FjdGlvbi9BY3Rpb25SZW1vdmUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uV2Vhci50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9IdW1hbm9pZC9IdW1hbm9pZC50cyIsIi4uL2FwcC9Xb3JsZC9Xb3JsZFN0YXRlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUmVnaW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvU2h1ZmZsZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BSS9BSVBpY2tTaGlueS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0FJL0FJV2FuZGVyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvbkRyb3AudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uSW52ZW50b3J5LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblNhdmVHYW1lLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvblRhbGsudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uV2FpdC50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0NvbnRlbnRQaWNrZXIvQ29udGVudERlc2NyaXB0aW9uLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db250ZW50RGlmZmVyZW50aWFsLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db250ZW50R3JvdXAudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbnRlbnRNYXJrZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbnRlbnRVbml0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9Db21iYXQvQ29tYmF0RGVzY3JpcHRpb24udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbWJhdC9Db21iYXRNYXJrZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9Db250ZW50UGlja2VyL0NvbWJhdC9Db21iYXRVbml0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9GdWNraW5nL0Z1Y2tpbmdEZXNjcmlwdGlvbi50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0NvbnRlbnRQaWNrZXIvRnVja2luZy9GdWNraW5nTWFya2VyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvQ29udGVudFBpY2tlci9GdWNraW5nL0Z1Y2tpbmdVbml0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvQnJhbmNoaW5nT3B0aW9ucy50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0RpYWxvZ3VlTm9kZS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL0RpYWxvZ3VlL0RpYWxvZ3VlQnJhbmNoLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVUZXh0LnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVDaG9pY2UudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9EaWFsb2d1ZS9EaWFsb2d1ZU5vZGVUcmVlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvRGlhbG9ndWUvRGlhbG9ndWVTZXQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9EaWFsb2d1ZS9EaWFsb2d1ZVRyZWUudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9EaWFsb2d1ZS9EaWFsb2d1ZVRyZWVzLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvUmFuZG9tRHVuZ2VvbnMvUm9vbVJhbmRvbS50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1JhbmRvbUR1bmdlb25zL1Jvb21SYW5kb21NYXAudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SYW5kb21EdW5nZW9ucy9TaHVmZmxlckRpcmVjdGlvbi50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1JhbmRvbUR1bmdlb25zL1Jvb21SYW5kb21Gb2RkZXIudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9SYW5kb21EdW5nZW9ucy9SZWdpb25SYW5kb20udHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9TYXZlL1NhdmVkRXZlbnQudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UZXN0cy9EaWNlLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGVzdHMvRGljZUNvbW1vbi50cyIsIi4uL2FwcC9Xb3JsZC9DbGFzc2VzL1Rlc3RzL0RpY2VEYW5nZXJvdXMudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvTGlxdWlkLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL1NjZW5lcnkudHMiLCIuLi9hcHAvV29ybGQvQ2xhc3Nlcy9UaGluZ3MvSHVtYW5vaWQvT3JjL09yY0RlYnVnZ2VyLnRzIiwiLi4vYXBwL1dvcmxkL0NsYXNzZXMvVGhpbmdzL0xpcXVpZHMvU2VtZW4udHMiLCIuLi9jb250ZW50L21haW4udHMiLCIuLi9jb250ZW50L0NoYXJhY3RlckNyZWF0aW9uL0RpYWxvZ3VlL0NyZWF0aW9uSW50cm8uZGwudHMiLCIuLi9jb250ZW50L0NoYXJhY3RlckNyZWF0aW9uL0RpYWxvZ3Vlcy50cyIsIi4uL2NvbnRlbnQvQ2hhcmFjdGVyQ3JlYXRpb24vT3JpZ2luLnRzIiwiLi4vY29udGVudC9DaGFyYWN0ZXJDcmVhdGlvbi9QZXJrcy50cyIsIi4uL2NvbnRlbnQvQ2hhcmFjdGVyQ3JlYXRpb24vU2V4U3RhdHMudHMiLCIuLi9jb250ZW50L1BsYXlCZWdpbnMvSW50cm9NZW51LnRzIiwiLi4vY29udGVudC9QbGF5QmVnaW5zL0RpYWxvZ3VlL0ludHJvTWVudS5kbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxTQUFTLFdBQVcsQ0FBQyxDQUFjO0lBQy9CLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzFCLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUM1QixJQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDeEI7S0FDSjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsQ0FBYztJQUN2QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2QsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUUsQ0FBYztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxN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LENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUFTTSxVQUFVLENBQUUsT0FBb0IsRUFBRSxTQUEyQztRQUNoRixTQUFTLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0RSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFFRixJQUFJLFNBQVMsR0FBRyxDQUFDLElBQWlCLEVBQUUsQ0FBVSxFQUFFLENBQVUsRUFBRSxFQUFFO1lBQzFELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUU7Z0JBQ3RFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFX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LENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxPQUFPLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdB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SSxXQUFXLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUM5RCxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFFLE9BQU8sUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFDMUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHbEIsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRSxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUNyRCxHQUFHLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVsQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxFQXZTTSxhQUFhLEtBQWIsYUFBYSxRQXVTbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogTWFrZXMgdGhlIGFycmF5IGEgaGF2ZSB1bmlxdWUgZWxlbWVudHMuXHJcbiAqIFdBUk5JTkc6IFdJTEwgQUxURVIgVEhFIEFSUkFZIEdJVkVOXHJcbiAqIEBwYXJhbSBhXHJcbiAqL1xyXG5mdW5jdGlvbiBhcnJheVVuaXF1ZShhIDogQXJyYXk8YW55Pikge1xyXG4gICAgZm9yKHZhciBpPTA7IGk8YS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGZvcih2YXIgaj1pKzE7IGo8YS5sZW5ndGg7ICsraikge1xyXG4gICAgICAgICAgICBpZihhW2ldID09PSBhW2pdKVxyXG4gICAgICAgICAgICAgICAgYS5zcGxpY2Uoai0tLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlVbmlxdWVOZXdBcnJheShhIDogQXJyYXk8YW55Pikge1xyXG4gICAgYSA9IGEuc2xpY2UoKTtcclxuICAgIGFycmF5VW5pcXVlKGEpO1xyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5U2h1ZmZsZSAoYSA6IEFycmF5PGFueT4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBwb3MgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoYS5sZW5ndGggLSBpKSkgKyBpO1xyXG4gICAgICAgIGxldCB0ZW1wID0gYVtpXTtcclxuICAgICAgICBhW2ldID0gYVtwb3NdO1xyXG4gICAgICAgIGFbcG9zXSA9IHRlbXA7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5U2h1ZmZsZU5ld0FycmF5IChhIDogQXJyYXk8YW55Pikge1xyXG4gICAgbGV0IG5BID0gYS5zbGljZSgpO1xyXG4gICAgYXJyYXlTaHVmZmxlKG5BKTtcclxuICAgIHJldHVybiBuQTtcclxufSIsImludGVyZmFjZSBTdG9yZWRWYXJpYWJsZU9wdGlvbnM8VD4ge1xyXG4gICAgaWQgOiBzdHJpbmc7XHJcbiAgICB2YWx1ZSA6IFQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdG9yZWRWYXJpYWJsZXMgYXJlIHRoZSBvbmx5IHRoaW5nIHRoYXQgZ2V0cyBzdG9yZWQgb24gYSBTYXZlL1JlbG9hZC5cclxuICogSXQncyBvbmx5IGFsbG93ZWQgdG8gaGF2ZSBTdG9yZWRWYXJpYWJsZXMgdGhhdCBhcmUgZWl0aGVyIHByaW1pdGl2ZSBvciBzaW1wbGUgb2JqZWN0cy5cclxuICovXHJcbmNsYXNzIFN0b3JlZFZhcmlhYmxlPFQ+IHtcclxuICAgIHB1YmxpYyBpZCA6IHN0cmluZztcclxuICAgIHB1YmxpYyB2YWx1ZSA6IFQ7XHJcbiAgICBwdWJsaWMgZGVmVmFsdWUgOiBUO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucyA6IFN0b3JlZFZhcmlhYmxlT3B0aW9uczxUPikge1xyXG4gICAgICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuZGVmVmFsdWUgPSB0aGlzLnZhbHVlO1xyXG5cclxuICAgICAgICBTdG9yZWRWYXJpYWJsZS5yZWdpc3RlclZhcmlhYmxlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldCAoKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZGVmVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUZyb21PYmplY3QgKG9iaiA6IFQpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBleHBvcnRBc09iamVjdCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3RvcmVkVmFyaWFibGVzIDoge1tpZCA6IHN0cmluZ10gOiBTdG9yZWRWYXJpYWJsZTxhbnk+fSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJWYXJpYWJsZSAodmFyaWFibGUgOiBTdG9yZWRWYXJpYWJsZTxhbnk+KSB7XHJcbiAgICAgICAgaWYgKFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1t2YXJpYWJsZS5pZF0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1t2YXJpYWJsZS5pZF0gPSB2YXJpYWJsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RvcmVkVmFyaWFibGVdIFwiICsgdmFyaWFibGUuaWQgKyBcIiBhbHJlYWR5IGRlZmluZWQuIElnbm9yaW5nOlwiLCB2YXJpYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1tpZF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMgKCkgOiBBcnJheTxTdG9yZWRWYXJpYWJsZTxhbnk+PntcclxuICAgICAgICBsZXQgbGlzdCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1trZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBleHBvcnRBc09iamVjdCAoKSA6IHtbaWQgOiBzdHJpbmddIDogYW55fSB7XHJcbiAgICAgICAgbGV0IGxpc3QgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gU3RvcmVkVmFyaWFibGUuc3RvcmVkVmFyaWFibGVzKSB7XHJcbiAgICAgICAgICAgIGxpc3Rba2V5XSA9IFN0b3JlZFZhcmlhYmxlLnN0b3JlZFZhcmlhYmxlc1trZXldLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZUZyb21PYmplY3QgKG9iaiA6IHtbaWQgOiBzdHJpbmddIDogYW55fSkge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgaWYgKG9ialtrZXldICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgU3RvcmVkVmFyaWFibGUuc3RvcmVkVmFyaWFibGVzW2tleV0udXBkYXRlRnJvbU9iamVjdChvYmpba2V5XSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBTdG9yZWRWYXJpYWJsZS5zdG9yZWRWYXJpYWJsZXNba2V5XS5yZXNldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0Z1bmN0aW9ucy50c1wiIC8+XHJcbmludGVyZmFjZSBSdWxlYm9va09wdGlvbnM8VD4ge1xyXG4gICAgbm91bj8gOiBUO1xyXG59XHJcblxyXG4vKipcclxuICogV2l0aG91dCB0aGUgUnVubmVyLCBSdWxlYm9va3Mgd2VyZSBub3QgXCJ0aHJlYWQtc2FmZVwiLCBzbyB3ZSBuZWVkIHRoZSBydW5uZXIuXHJcbiAqL1xyXG5jbGFzcyBSdWxlYm9va1J1bm5lcjxUPiB7XHJcbiAgICBwdWJsaWMgbm91biA6IFQ7XHJcbiAgICBwcml2YXRlIHJ1bGVzVG9FeGVjdXRlIDogQXJyYXk8UnVsZT4gPSBbXTtcclxuICAgIHB1YmxpYyBydWxlYm9vayA6IFJ1bGVib29rPFQ+O1xyXG4gICAgcHVibGljIHJ1bGUgOiBSdWxlO1xyXG4gICAgcHJpdmF0ZSBydWxlUnVubmVyIDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChydWxlYm9vayA6IFJ1bGVib29rPFQ+LCBub3VuIDogVCkge1xyXG4gICAgICAgIHRoaXMucnVsZWJvb2sgPSBydWxlYm9vaztcclxuICAgICAgICB0aGlzLm5vdW4gPSBub3VuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSdWxlYm9va3MgKC4uLnJ1bGVib29rcyA6IEFycmF5PFJ1bGVib29rPFQ+Pikge1xyXG4gICAgICAgIHJ1bGVib29rcyA9IGFycmF5VW5pcXVlTmV3QXJyYXkocnVsZWJvb2tzKTtcclxuICAgICAgICBydWxlYm9va3MuZm9yRWFjaCgocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRSdWxlcyguLi5ydWxlYm9vay5ydWxlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFJ1bGVzICguLi5ydWxlcykge1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bGVSdW5uZXIgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnVsZXNUb0V4ZWN1dGUucHVzaCguLi5ydWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBza2lwUnVsZSAocnVsZSA6IFJ1bGUpIHtcclxuICAgICAgICBpZiAodGhpcy5ydWxlUnVubmVyID49IDApIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ydWxlc1RvRXhlY3V0ZS5pbmRleE9mKHJ1bGUpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiB0aGlzLnJ1bGVSdW5uZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVsZXNUb0V4ZWN1dGUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJbUnVsZWJvb2tdXCIgKyB0aGlzLnJ1bGVib29rLm5hbWUgKyBcIiwgc2tpcHBpbmcgUnVsZSBcIiArIHJ1bGUubmFtZSArIFwiIGR1ZSB0byByZXF1ZXN0LlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIltSdWxlYm9va11cIiArIHRoaXMucnVsZWJvb2submFtZSArIFwiOiB1bmFtZSB0byBza2lwIFJ1bGVcIiArIHJ1bGUubmFtZSArIFwiIGR1ZSB0byBpdCBiZWluZyB0b28gbGF0ZSB0byBzdG9wIGl0LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSAoKSB7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUodGhpcy5ydWxlc1RvRXhlY3V0ZSkuc29ydChmdW5jdGlvbiAoYTogUnVsZSwgYjogUnVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvciAodGhpcy5ydWxlUnVubmVyID0gMDsgdGhpcy5ydWxlUnVubmVyIDwgdGhpcy5ydWxlc1RvRXhlY3V0ZS5sZW5ndGg7IHRoaXMucnVsZVJ1bm5lcisrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucnVsZSA9IHRoaXMucnVsZXNUb0V4ZWN1dGVbdGhpcy5ydWxlUnVubmVyXTtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVsZS5leGVjdXRlKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJ1bGVib29rPFQ+IHtcclxuICAgIHB1YmxpYyBydWxlcyA6IEFycmF5PFJ1bGU+ID0gW107XHJcbiAgICBwdWJsaWMgbmFtZSA6IHN0cmluZztcclxuICAgIHByaXZhdGUgc3RhdGljIGluZGVudGFudGlvblNwYWNlcyA9IDI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVib29rU3RhY2sgOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTdGFjayAoKSB7XHJcbiAgICAgICAgbGV0IHN0YWNrID0gW107XHJcbiAgICAgICAgUnVsZWJvb2sucnVsZWJvb2tTdGFjay5mb3JFYWNoKChybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmwgaW5zdGFuY2VvZiBPYmplY3QgJiYgcmwubmFtZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gocmwubmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJsID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gocmwpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJsIGluc3RhbmNlb2YgT2JqZWN0ICYmIHJsLmlkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChybC5pZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKFwiVW5kZWZpbmVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5kZW50YXRpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBcIiBcIi5yZXBlYXQoUnVsZWJvb2suaW5kZW50YW50aW9uU3BhY2VzKS5yZXBlYXQoUnVsZWJvb2sucnVsZWJvb2tTdGFjay5sZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5jcmVhc2VJbmRlbnRhdGlvbiAocnVsZWJvb2sgOiBhbnkpIHtcclxuICAgICAgICBSdWxlYm9vay5ydWxlYm9va1N0YWNrLnB1c2gocnVsZWJvb2spO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGVjcmVhc2VJbmRlbnRhdGlvbiAoKSB7XHJcbiAgICAgICAgUnVsZWJvb2sucnVsZWJvb2tTdGFjay5wb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzUnVubmluZyAociA6IFJ1bGUgfCBSdWxlYm9vazxhbnk+KSB7XHJcbiAgICAgICAgcmV0dXJuIFJ1bGVib29rLnJ1bGVib29rU3RhY2suaW5kZXhPZihyKSAhPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gUnVsZWJvb2suaXNSdW5uaW5nKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobmFtZSA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUgKG9wdGlvbnMgOiBSdWxlYm9va09wdGlvbnM8VD4sIC4uLnJ1bGVib29rcykgOiBQcm9taXNlPGFueT57XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPT0gdW5kZWZpbmVkID8ge30gOiBvcHRpb25zO1xyXG5cclxuICAgICAgICBsZXQgcnVubmVyID0gbmV3IFJ1bGVib29rUnVubmVyPFQ+KHRoaXMsIG9wdGlvbnMubm91bik7IC8vIGR1cGxpY2F0ZSBhcnJheVxyXG4gICAgICAgIHJ1bm5lci5hZGRSdWxlYm9va3ModGhpcywgLi4ucnVsZWJvb2tzKTtcclxuXHJcbiAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlYm9va3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHJ1bGVib29rc1tpXSA9PT0gdGhpcykgY29udGludWU7XHJcbiAgICAgICAgICAgIG5hbWVzLnB1c2gocnVsZWJvb2tzW2ldLm5hbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbUlVMRUJPT0tdIFwiICsgdGhpcy5uYW1lICsgKG5hbWVzLmxlbmd0aCA+IDAgPyAoXCIgbWVyZ2VkIHdpdGggXCIgKyBuYW1lcy5qb2luKFwiLCBcIikpIDogXCJcIikpO1xyXG4gICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24odGhpcyk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW5uZXIuZXhlY3V0ZSgpO1xyXG5cclxuICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlQW5kQWRkUnVsZSAociA6IFJ1bGVPcHRpb25zPFQ+KSA6IFJ1bGUge1xyXG4gICAgICAgIGxldCBydWxlID0gbmV3IFJ1bGUocik7XHJcbiAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUpO1xyXG4gICAgICAgIHJldHVybiBydWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSdWxlIChyIDogUnVsZSkge1xyXG4gICAgICAgIHRoaXMucnVsZXMucHVzaChyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc29ydFJ1bGVzICgpIHtcclxuICAgICAgICB0aGlzLnJ1bGVzLnNvcnQoZnVuY3Rpb24gKGEgOiBSdWxlLCBiIDogUnVsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlVG8oYik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUgU2V0dGluZ3Mge1xuICAgIHZhciBkZWJ1ZyA9IGNvbnNvbGUuZGVidWc7XG4gICAgdmFyIGRlYnVnRW1wdHkgPSAoKSA9PiB7fTtcblxuICAgIGV4cG9ydCB2YXIgaGFyZERlYnVnID0gZmFsc2U7XG4gICAgZXhwb3J0IHZhciBzYXlUdXJuVGltZSA9IHRydWU7XG5cbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0RGVidWcgKGlzRGVidWcgOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpc0RlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnID0gZGVidWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnID0gZGVidWdFbXB0eTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RlYnVnICgpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWcgPT0gZGVidWc7XG4gICAgfVxuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldEhhcmREZWJ1ZyAoaXNIYXJkRGVidWcgOiBib29sZWFuKSB7XG4gICAgICAgIGhhcmREZWJ1ZyA9IGlzSGFyZERlYnVnO1xuICAgIH1cbn1cblxuLy9TZXR0aW5ncy5zZXREZWJ1ZyhmYWxzZSk7XG4vL1NldHRpbmdzLnNheVR1cm5UaW1lID0gdHJ1ZTtcblxuLyoqXG4gKiBGdXR1cmUgbm90ZXMgb24gUGVyZm9ybWFuY2UgSXNzdWVzOlxuICogLSBJdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaWYgbW9zdCBvZiB0aGUgY29kZSBpcyBvcHRpbWl6ZWQgb3Igbm90LiBDUFVzIGFyZSBmYXN0LlxuICogLSBJdCAqZG9lcyogbWF0dGVyIGlmIGNvZGUgdGhhdCBpcyBydW4gZnJlcXVlbnRseSBpcyBzdWItb3B0aW1pemVkLlxuICogLS0tIEJpZ2dlc3QgcGxhY2UgdG8gbG9vayBhdCBpcyBhdCBFdmVyeSBUdXJuIFJ1bGVzLCBwYXJ0aWN1bGFybHkgQUk6IHRoZXNlIHdpbGwgcnVuIGZvciBldmVyeSBhY3Rpb24gdGhlIHBsYXllciBkb2VzIGZvciBldmVyeSBzaW5nbGUgTlBDIGluIHRoZSBnYW1lLlxuICogLSBUaGlzIGJlaW5nIGEgdGV4dCBnYW1lLCB3ZSBoYXZlIHVwIHRvIDEwMG1zIGJlZm9yZSB0aGUgcGxheWVyIFwiZmVlbHNcIiB0aGUgZ2FtZSBpc24ndCBpbnN0YW50YW5lb3VzLlxuICogLSBCZXlvbmQgdGhhdCwgd2UgaGF2ZSB1bnRpbCBhYm91dCAyNTBtcyBiZWZvcmUgdGhlIHBsYXllciBzdGFydHMgZ2V0dGluZyBsZWdpdCBwaXNzZWQuIFRoZXNlIGFyZSBib3RoIHBlciB0dXJuLlxuICpcbiAqIEJlaW5nIHRoYXQgYWxsIG90aGVyIGNvZGUgd2lsbCBydW4gb25jZSBhbmQgdGhhdCdzIHRoZSBlbmQgb2YgaXQsIHRoZSBvbmx5IHBvcnRpb24gb2YgdGhlIGdhbWUgdGhhdCBDQU4gYnJpbmcgcGVyZm9ybWFuY2UgaXNzdWVzIHdpbGwgYmUgdGhlIEFJLlxuICogRWFjaCBOUEMgYWRkZWQgaW5jcmVhc2VzIHRpbWUgc3BlbnQgYnkgQUkgYnkgYXJvdW5kICgobiArIDEpL24pLiBFYWNoIHJ1bGUgYWRkZWQgZG9lcyB0aGUgc2FtZS5cbiAqIFNpbmNlIE5QQ3Mgd2lsbCBiZSBhZGRlZCBhbmQgbW9yZSBhbmQgbW9yZSBydWxlcyB3aWxsIGtlZXAgZ2V0dGluZyBhZGRlZCwgQVQgU09NRSBQT0lOVCB3ZSdsbCBoYXZlIHByb2JsZW1zLlxuICogU3RyZXNzIHRlc3Rpbmcgd2l0aCBQaWNrIFNoaW5pZXMgYW5kIE5QQ3Mgc3VnZ2VzdHMgdGhhdCB3ZSBjYW4gaGF2ZSBhYm91dCAyMDAgTlBDcyBhbmQgYWJvdXQgODAwIHJ1bGVzIGJlZm9yZSBwcm9ibGVtcywgYnV0IHRoZSB0ZXN0aW5nIGlzIG5vdCBpZGVhbDpcbiAqIC0gUGljayBTaGluaWVzIGluY3JlYXNlcyBpbiBjb21wbGV4aXR5IHdpdGggdGhlIGFtb3VudCBvZiB0aGluZ3MgaW4gYSByb29tLiBTbyB0aGUgdGVzdCBtYWRlIHRoaXMgcnVsZSBwYXJ0aWN1bGFybHkgbmFzdHksIHNpbmNlIGFsbCBOUENzIHdlcmUgZ29pbmcgYW5kIGNvbWluZyBmcm9tIHRoZSBzYW1lIHJvb21zLlxuICogLSBJbiBhIHJlYWwgZ2FtZSBzaXR1YXRpb24sIGl0J3MgZXhwZWN0ZWQgZm9yIHJvb21zIHRvIHJhcmVseSBoYXZlIG1vcmUgdGhhbiA1IHRoaW5ncy9wZW9wbGUgaW4gdGhlbSBhbmQgZm9yIE5QQ3MgdG8gYmUgZGlzcGVyc2UuXG4gKiBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggb3VyIDI1MG1zIGxpbWl0IG9uIHBvd2VyZnVsIENQVXMuXG4gKlxuICogUmVnYXJkbGVzcywgaWYgcGVyZm9ybWFuY2UgZXZlciBiZWNvbWVzIGFuIGlzc3VlOlxuICogLSBPcHRpbWl6ZSBBSSB0cmVlcyBzbyB0aGF0IENvbmRpdGlvbnMgZG9uJ3QgaGF2ZSB0byBiZSBjaGVja2VkLiBDb29rIGVhY2ggTlBDJ3MgUnVsZWJvb2sgc28gdGhhdCBhbGwgcnVsZXMgdGhhdCBhcmVuJ3QgaGlzIGFyZW4ndCBldmVyIGxvb2tlZCBhdC4gVGhpcyBpcyB0aGUgc2ltcGxlc3QsIG5vLWxvc3MgaW1wcm92ZW1lbnQsIGJ1dCBvbmx5IG9mZmVycyBpbXByb3ZlbWVudHMgaWYgdGhlIE5QQyAqIFJVTEVTIG51bWJlciBpcyBiaWcuXG4gKiAtIElmIHRoZSBudW1iZXIgb2YgUnVsZXMgKiBOUENzIGlzIG5vdCB0aGUgaXNzdWUsIHRoZW4gZmlndXJlIG91dCB3aGljaCBzcGVjaWZpYyBydWxlcyBhcmUgYmVpbmcgYSBwcm9ibGVtIGFuZCBvcHRpbWl6ZSB0aGVtIHNwZWNpZmljYWxseS4gSW4gZ2VuZXJhbCwgZXhwZW5zaXZlIHJ1bGVzIHNob3VsZCBhbHNvIGJlIHJhcmUuIFRoaXMgc29sdXRpb24gbWlnaHQgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUgYW5kIG1pZ2h0IG5vdCBnZXQgYWxsIHRoYXQgbXVjaCByZXN1bHQuXG4gKiAtIFNsb3cgZG93biBBSSBmb3IgTlBDcyBhd2F5IGZyb20gdGhlIHBsYXllci4gUG9zc2liaWxpdGllczogaWYgYW4gTlBDIGlzIG1vcmUgdGhhbiAyMCByb29tcyBhd2F5LCBpdCBvbmx5IGdldHMgb25lIGFjdGlvbiBldmVyeSA0IHR1cm5zLCB0aGVuIDMsIHRoZW4gMi4uLiB1bnRpbCBpdCdzIGNsb3NlIGVub3VnaCB0byBhY3QgZXZlcnkgdHVybi5cbiAqIC0gU2ltcGx5IHNraXAgQUkgZm9yIE5QQ3MgaW4gZGlmZmVyZW50IHJlZ2lvbnMuIGkuZS46IGlmIHRoZSBwbGF5ZXIgaXMgaW5zaWRlIHRoZSBPYmVsaXNrLCBkb24ndCBldmVuIGJvdGhlciB3aXRoIE5QQ3MgaW4gdGhlIGZvcmVzdC5cbiAqXG4gKlxuICogV2UgYWxzbyBkbyBhIGxvdCBvZiBkZWJ1Z2dpbmcuXG4gKiBXaGlsZSBkaXNhYmxpbmcgY29uc29sZS5kZWJ1ZyBvZmZlcnMgYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBnYWluIChhcm91bmQgNTAlKSBhbmQgaXMgYXZhaWxhYmxlIGFzIGFuIE9wdGlvbixcbiAqIGVudGlyZWx5IGNvbW1lbnRpbmcgb3V0IGNvbnNvbGUuZGVidWcgY2FsbHMgZ2l2ZXMgdXMgYW4gYWRkaXRpb25hbCAyMCUgZ2FpbiBvbiB0b3Agb2YgdGhhdCwgZm9yIGEgdG90YWwgb2YgYXJvdW5kIDYwJSBwZXJmb3JtYW5jZSBnYWluLlxuICogQ29uc2lkZXJpbmcgZGVidWdnaW5nIGlzIG5vdCByZWFsbHkgdXNlZnVsIGZvciBwbGF5ZXJzLCB0aGlzIHNob3VsZCBhbHdheXMgYmUga2VwdCBpbiBtaW5kLlxuICovIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NldHRpbmdzLnRzXCIgLz5cclxuaW50ZXJmYWNlIFJ1bGVPcHRpb25zPFQ+IHtcclxuICAgIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBmaXJzdFByaW9yaXR5PyA6IG51bWJlcjtcclxuICAgIHByaW9yaXR5PyA6IG51bWJlcjtcclxuICAgIGNvZGUgOiAocnVubmVyPyA6IFJ1bGVib29rUnVubmVyPFQ+KSA9PiAoUHJvbWlzZTxhbnk+IHwgYW55KTtcclxuICAgIGNvbmRpdGlvbnM/IDogKHJ1bm5lcj8gOiBSdWxlYm9va1J1bm5lcjxUPikgPT4gKGJvb2xlYW4pO1xyXG59XHJcblxyXG5jbGFzcyBSdWxlIHtcclxuICAgIHByaXZhdGUgX3ByaW9yaXR5IDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBmaXJzdFByaW9yaXR5IDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgY29kZSA6IEZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVkV2hlcmUgOiBFcnJvcjtcclxuICAgIHByaXZhdGUgY29uZGl0aW9ucyA6IChydWxlYm9vaz8gOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiAoYm9vbGVhbik7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogUnVsZU9wdGlvbnM8YW55Pikge1xyXG4gICAgICAgIHRoaXMucHJpb3JpdHkgPSBvcHRpb25zLnByaW9yaXR5ICE9IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTTtcclxuICAgICAgICB0aGlzLmZpcnN0UHJpb3JpdHkgPSBvcHRpb25zLmZpcnN0UHJpb3JpdHkgIT0gdW5kZWZpbmVkID8gb3B0aW9ucy5maXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU07XHJcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xyXG4gICAgICAgIHRoaXMuY29kZSA9IG9wdGlvbnMuY29kZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZWRXaGVyZSA9IChuZXcgRXJyb3IoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyAhPSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbmRpdGlvbnMgOiAoKSA9PiB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlIChydWxlYm9vaz8gOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMocnVsZWJvb2spKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbUlVMRV0gXCIgKyB0aGlzLm5hbWUpO1xyXG4gICAgICAgIFNldHRpbmdzLmhhcmREZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKHRoaXMubmFtZSwgdGhpcy5jcmVhdGVkV2hlcmUpO1xyXG4gICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24odGhpcyk7XHJcblxyXG4gICAgICAgIHJ1bGVib29rLnJ1bGUgPSB0aGlzO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvZGUocnVsZWJvb2spO1xyXG4gICAgICAgIC8vIFdhcyB0aGUgZnVuY3Rpb24gYXN5bmM/XHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJSZXN1bHQ6XCIsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByaW9yaXR5KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW9yaXR5O1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwcmlvcml0eSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fcHJpb3JpdHkgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29tcGFyZVRvIChiIDogUnVsZSkge1xyXG4gICAgICAgIHZhciBhID0gdGhpcztcclxuICAgICAgICAvLyBIaWdoZXIgcHJpb3JpdHkgZ29lcyBmaXJzdCBhcyB0aGlzIGlzIGEgcm9sbGluZyBhcnJheVxyXG4gICAgICAgIGlmIChiLmZpcnN0UHJpb3JpdHkgPCBhLmZpcnN0UHJpb3JpdHkpIHJldHVybiAtMTtcclxuICAgICAgICBpZiAoYS5maXJzdFByaW9yaXR5IDwgYi5maXJzdFByaW9yaXR5KSByZXR1cm4gMTtcclxuICAgICAgICBpZiAoYi5wcmlvcml0eSA8IGEucHJpb3JpdHkpIHJldHVybiAtMTtcclxuICAgICAgICBpZiAoYS5wcmlvcml0eSA8IGIucHJpb3JpdHkpIHJldHVybiAxO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUFJJT1JJVFlfSElHSEVTVCA6IG51bWJlciA9IDIwO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9ISUdIIDogbnVtYmVyID0gMTU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX01FRElVTSA6IG51bWJlciA9IDEwO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9MT1cgOiBudW1iZXIgPSA1O1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9MT1dFU1QgOiBudW1iZXIgPSAwO1xyXG59XHJcblxyXG4vLyB2YXIgZ29ibGluSnVtcGluZ1J1bGUgPSBuZXcgUnVsZSh7XHJcbi8vICAgICBuYW1lIDogXCJHb2JsaW4gSnVtcGluZyBSdWxlXCIsXHJcbi8vICAgICBjb2RlIDogYXN5bmMgKHJ1bGUgOiBSdWxlLCBydWxlUmVzb2x2ZXIgOiBGdW5jdGlvbikgPT4ge1xyXG4vLyAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJ3ZWVlXCIpO1xyXG4vLyAgICAgfVxyXG4vLyB9KTtcclxuLy9cclxuLy8gZ29ibGluSnVtcGluZ1J1bGUuZXhlY3V0ZSgpO1xyXG5cclxuLyoqXHJcbiB2YXIgZ29ibGluSnVtcGluZ1J1bGUgPSBuZXcgUnVsZSh7bmFtZSA6IFwiR29ibGluIEp1bXBpbmcgUnVsZVwiLCBjb2RlIDogKGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBub3cgdGhlIFJ1bGUgYW5kIGhhcyBhY2Nlc3MgdG8gdGhpcy5jdXJyZW50UnVsZWJvb2tcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZWVkIGZvciBvd24gbW9kdWxlLCBpdCdzIG9rYXkgdG8gdXNlIGEgc2ltcGxlIGZ1bmN0aW9uXHJcbiAgICAgICAgLy8gSUYgWU9VUiBGVU5DVElPTiBTSE9VTEQgTk9UIENPTVBMRVRFIEFVVE9NQVRJQ0FMTFksIElUIE5FRURTIFRPIFJFVFVSTiBGQUxTRVxyXG4gICAgICAgIC8vIEZVTkNUSU9OUyBUSEFUIFJFVFVSTiBBTllUSElORyBFTFNFIFdJTEwgQVVUTyBDT01QTEVURSBBVCBUSEUgRU5EIE9GIFRIRUlSIENPREVcclxuXHJcbiAgICAgICAgLy8gSWYgeW91ciBydWxlIGRvZXMgbm90IGF1dG8tY29tcGxldGUsIHRoZW4gaXQgbXVzdCBjb21wbGV0ZSBtYW51YWxseSwgb3IgdGhlIGdhbWUgd2lsbCBTVEFMTC5cclxuXHJcbiAgICAgICAgLy8gSWYgYSBydWxlIG11c3QgcmV0dXJuIGVpdGhlciBcInRydWVcIiBvciBcImZhbHNlXCIgdG8gdGhlIHJ1bGVib29rLCB5b3UgbmVlZCB0byBzZXQgdGhlIHJ1bGUncyByZXN1bHQgdGhhdCB3YXk6XHJcbiAgICAgICAgLy8gdGhpcy5yZXN1bHQgPSB0cnVlIChvciBmYWxzZSlcclxuICAgIH07XHJcbiB9KSgpfSk7XHJcbiAqLyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG5cclxubW9kdWxlIFR1cm5TZXF1ZW5jZSB7XHJcbiAgICBleHBvcnQgdmFyIHJ1bGVib29rID0gbmV3IFJ1bGVib29rPEFjdGlvbj4oXCJUdXJuIFNlcXVlbmNlXCIpO1xyXG4gICAgZXhwb3J0IHZhciBwbGF5ZXJBY3Rpb25zID0gW107XHJcblxyXG4gICAgZXhwb3J0IGxldCBsYXN0VHVyblRpbWUgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChhY3Rpb24/IDogQWN0aW9uKSB7XHJcbiAgICAgICAgLy8gT25seSBvbmUgYWN0aW9uIGF0IGEgdGltZVxyXG4gICAgICAgIGlmIChwbGF5ZXJBY3Rpb25zLnB1c2goYWN0aW9uKSA9PSAxKSB7XHJcbiAgICAgICAgICAgIGxldCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIiAgIFBsYXllciBBY3Rpb246IFwiICsgKGFjdGlvbiA/IGFjdGlvbi5nZXRDb21tYW5kVGV4dCgpIDogXCJub25lXCIpKTtcclxuICAgICAgICAgICAgYXdhaXQgcnVsZWJvb2suZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICBub3VuOiBhY3Rpb25cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwbGF5ZXJBY3Rpb25zID0gW107XHJcbiAgICAgICAgICAgIGxldCB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICAgICAgICBsYXN0VHVyblRpbWUgPSB0MSAtIHQwO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiVG90YWw6IFwiICsgKHQxIC0gdDApICsgXCIgbWlsbGlzZWNvbmRzLlwiKTtcclxuICAgICAgICAgICAgaWYgKFNldHRpbmdzLnNheVR1cm5UaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0NvbnRlbnQobmV3IFNheShuZXcgU2F5Qm9sZChcIlRpbWUgdGFrZW4gZm9yIHR1cm46IFwiKSwgKHQxIC0gdDApLCBcIiBtaWxsaXNlY29uZHMuXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgdGhlIFByZXBhcmUgRWxlbWVudHMgZm9yIHRoZSB0dXJuIHJ1bGUuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBQcmVwYXJlRWxlbWVudHNSdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCwgLy8gVGhpcyB3aWxsIGJlIGFib3V0IHRoZSBmaXJzdCBSdWxlIHRvIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLCAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHRoZSBtYWpvcml0eSBvZiB0aGUgcnVsZXMsIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIGJlIHRoZSB2ZXJ5IGZpcnN0IG5vIG1hdHRlciB3aGF0XHJcbiAgICAgICAgbmFtZTogXCJCZWdpbiBUdXJuIChFbGVtZW50cyBTaWRlKVwiLFxyXG4gICAgICAgIGNvZGU6IGZ1bmN0aW9uIChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5zdGFydFR1cm4ocnVubmVyLm5vdW4pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgVHVyblNlcXVlbmNlLnJ1bGVib29rLmFkZFJ1bGUoUHJlcGFyZUVsZW1lbnRzUnVsZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHRoZSBEbyBQbGF5ZXIgQWN0aW9uIFJ1bGUuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGxldCBQbGF5ZXJBY3Rpb25SdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgbmFtZTogXCJEbyBQbGF5ZXIgQWN0aW9uXCIsXHJcbiAgICAgICAgY29kZTogYXN5bmMgKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGxheWVyQWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKHBsYXllckFjdGlvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gcGxheWVyQWN0aW9uLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwcm9taXNlO1xyXG5cclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChwbGF5ZXJBY3Rpb24uc2F5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocGxheWVyQWN0aW9uLnJlcXVpcmVzVHVybikge1xyXG4gICAgICAgICAgICAgICAgICAgIFdvcmxkU3RhdGUuaW5jcmVtZW50UGxheWVyVHVybigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBydWxlYm9vay5hZGRSdWxlKFBsYXllckFjdGlvblJ1bGUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyB0aGUgUnVuIEV2ZXJ5IFR1cm4gUnVsZXMuXHJcbiAgICAgKiBAdHlwZSB7UnVsZX1cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciBSdW5FdmVyeVR1cm5SdWxlc1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgICAgIG5hbWU6IFwiUnVuIEV2ZXJ5IFR1cm4gUnVsZXNcIixcclxuICAgICAgICBjb2RlOiBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChXb3JsZFN0YXRlLmlzVHVybldhaXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRXZlcnlUdXJuLkV2ZXJ5VHVybi5leGVjdXRlKHt9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcnVsZWJvb2suYWRkUnVsZShSdW5FdmVyeVR1cm5SdWxlc1J1bGUpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyB0aGUgSW5mb3JtIEVsZW1lbnRzIHRoZSB0dXJuIGhhcyBlbmRlZCBydWxlLlxyXG4gICAgICogQHR5cGUge1J1bGV9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgUmVtb3ZlVHVybkZyb21FbGVtZW50c1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9MT1dFU1QsIC8vIFRoaXMgd2lsbCBiZSBhYm91dCB0aGUgbGFzdCBydWxlIHRvIGJlIGV4ZWN1dGVkXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLCAvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIG1ham9yaXR5IG9mIHRoZSBydWxlcywgYnV0IHdlIGRvbid0IGNhcmUgaWYgaXQncyB0aGUgdmVyeSBsYXN0IG9yIG5vdFxyXG4gICAgICAgIG5hbWU6IFwiRW5kIFR1cm4gKEVsZW1lbnRzL0NvbnRyb2xzIFNpZGUpXCIsXHJcbiAgICAgICAgY29kZTogYXN5bmMgZnVuY3Rpb24gKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuZW5kVHVybigpO1xyXG5cclxuICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtDb21tb25BY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IEVsZW1lbnRzLlJvb21IYW5kbGVyLnVwZGF0ZVJvb20oKTtcclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuUmVtZW1iZXJlZEhhbmRsZXIudXBkYXRlTWFwKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGxheWVyQWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKHBsYXllckFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtPYmplY3QocGxheWVyQWN0aW9uLmdldE5vdW4oMCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5oeXBlcmxpbmtPYmplY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci51cGRhdGVJbnZlbnRvcnkoKTtcclxuICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuQXBwZWFyYW5jZUhhbmRsZXIudXBkYXRlQXBwZWFyYW5jZSgpO1xyXG4gICAgICAgICAgICAvL2F3YWl0IEVsZW1lbnRzLlN0YXR1c0xpbmVIYW5kbGVyLnVwZGF0ZVN0YXR1c0xpbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFR1cm5TZXF1ZW5jZS5ydWxlYm9vay5hZGRSdWxlKFJlbW92ZVR1cm5Gcm9tRWxlbWVudHNSdWxlKTtcclxufSIsIm1vZHVsZSBWZXJzaW9uIHtcclxuICAgIGV4cG9ydCBsZXQgY3VycmVudFZlcnNpb24gPSBbMCwgMSwgMF07XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uICh2MSA6IEFycmF5PG51bWJlcj4sIHYyIDogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgICAgIGlmICh2MVswXSA8IHYyWzBdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMF0gPiB2MlswXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIGlmICh2MVsxXSA8IHYyWzFdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMV0gPiB2MlsxXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIGlmICh2MVsyXSA8IHYyWzJdKSByZXR1cm4gLTE7XHJcbiAgICAgICAgZWxzZSBpZiAodjFbMl0gPiB2MlsyXSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VmVyc2lvbiAoKSB7XHJcbiAgICAgICAgbGV0IHYgPSBjdXJyZW50VmVyc2lvbjtcclxuICAgICAgICByZXR1cm4gdlswXSArIFwiLlwiICsgdlsxXSArIFwiLlwiICsgdlsyXTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudC50aXRsZSA9IGRvY3VtZW50LnRpdGxlICsgXCIgW1wiICsgZ2V0Q3VycmVudFZlcnNpb24oKSArIFwiXSAgXCI7XHJcbn1cclxuXHJcbi8vIFRoaXMgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkuLi5cclxuLy8gY2xhc3MgVmVyc2lvblVwZGF0ZSB7XHJcbi8vICAgICBwcml2YXRlIHZlcnNpb24gOiBBcnJheTxudW1iZXI+O1xyXG4vLyAgICAgcHJpdmF0ZSBmdW5jIDogRnVuY3Rpb247XHJcbi8vXHJcbi8vICAgICBwdWJsaWMgY29uc3RydWN0b3IgKHZlcnNpb24gOiBBcnJheTxudW1iZXI+LCBmdW5jIDogRnVuY3Rpb24pIHtcclxuLy8gICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xyXG4vLyAgICAgICAgIHRoaXMuZnVuYyA9IGZ1bmM7XHJcbi8vICAgICB9XHJcbi8vXHJcbi8vICAgICBwdWJsaWMgcnVuICgpIHtcclxuLy8gICAgICAgICB0aGlzLmZ1bmMoKTtcclxuLy8gICAgIH1cclxuLy8gfVxyXG4vL1xyXG4vLyBjbGFzcyBWZXJzaW9uVXBkYXRlTGlzdCB7XHJcbi8vXHJcbi8vIH0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVmVyc2lvbi50c1wiIC8+XHJcbm1vZHVsZSBDb250cm9scy5NZW1vcnkge1xyXG4gICAgbGV0IHZlcnNpb25TZXQgPSBmYWxzZTtcclxuICAgIGxldCBzZXR0aW5nc1ZlcnNpb24gOiBBcnJheTxudW1iZXI+ID0gVmVyc2lvbi5jdXJyZW50VmVyc2lvbjtcclxuICAgIGxldCB2ZXJzaW9uSWQgPSBcIlZlcnNpb25cIjtcclxuICAgIGxldCBtZW1vcnlQcmVmaXggPSBcIm9iZWxpc2tfXCI7XHJcbiAgICBsZXQgbWVtb3JpZXMgOiB7W2lkIDogc3RyaW5nXSA6IFN0b3JlZE1lbW9yeTxhbnk+fSA9IHt9O1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZSAoaWQgOiBzdHJpbmcsIGRlZlZhbHVlIDogYW55KSB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShtZW1vcnlQcmVmaXggKyBpZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2UgPT0gdW5kZWZpbmVkID8gZGVmVmFsdWUgOiBKU09OLnBhcnNlKHN0b3JhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZSAoaWQgOiBzdHJpbmcsIHZhbHVlIDogYW55KSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obWVtb3J5UHJlZml4ICsgaWQsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGlmICghdmVyc2lvblNldCkge1xyXG4gICAgICAgICAgICB2ZXJzaW9uU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2V0dGluZ3NWZXJzaW9uID0gZ2V0VmFsdWUodmVyc2lvbklkLCBWZXJzaW9uLmN1cnJlbnRWZXJzaW9uKTtcclxuICAgICAgICAgICAgc2V0VmFsdWUodmVyc2lvbklkLCBWZXJzaW9uLmN1cnJlbnRWZXJzaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHNldHRpbmdzVmVyc2lvbiBleGlzdHMuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzVmVyc2lvbiA9PSB1bmRlZmluZWQpIHt9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTWVtb3J5IChtZW0gOiBTdG9yZWRNZW1vcnk8YW55Pikge1xyXG4gICAgICAgIGlmIChtZW1vcmllc1ttZW0uZ2V0SWQoKV0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQ29udHJvbHMuTWVtb3J5XSBNZW1vcnkgYWxyZWFkeSByZWdpc3RlcmVkIG9uIGlkIFwiICsgbWVtLmdldElkKCksIFwiT2xkOlwiLCBtZW1vcmllc1ttZW0uZ2V0SWQoKV0sIFwiTmV3OlwiLCBtZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1lbW9yaWVzW21lbS5nZXRJZCgpXSA9IG1lbTtcclxuICAgICAgICAgICAgbWVtLnNldFZhbHVlRnJvbUxvY2FsU3RvcmFnZURvTm90SW52b2tlKGdldFZhbHVlKG1lbS5nZXRJZCgpLCBtZW0uZ2V0VmFsdWUoKSkpO1xyXG4gICAgICAgICAgICBsZXQgdXBkYXRlRiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLk1lbW9yeS5zZXRWYWx1ZShtZW0uZ2V0SWQoKSwgbWVtLmdldFZhbHVlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1lbS5hZGRMaXN0ZW5lcih1cGRhdGVGKTtcclxuICAgICAgICAgICAgdXBkYXRlRigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8qKlxyXG4gKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHZhbHVlcyB0by9mcm9tIERhdGEgU3RvcmFnZS5cclxuICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG1lcmVseSB0aGUgRGVmYXVsdCB2YWx1ZS4gSXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ycmVjdCB2YWx1ZSB3aWxsIGJlIGxvYWRlZCBpbW1lZGlhdGVseS5cclxuICogV0FSTklORzogSUYgWU9VIENIQU5HRSBUSEUgVFlQRSBPRiBWQUxVRSBBIE1FTU9SWSBTVE9SRVMsIFlPVSBBTFNPIE5FRUQgQSBORVcgSUQuIE9SIENIRUNLUy4gTkVXIElEIElTIEVBU0lFUi5cclxuICogT3B0aW9uYWxseTogdXNlIGxpc3RlbmVycyBpZiB5b3UgaGF2ZSB0byBjaGFuZ2UgdmFsdWUgb24gdGhlIGZseS5cclxuICovXHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Nb2R1bGVzL01lbW9yeS50c1wiIC8+XHJcbmNsYXNzIFN0b3JlZE1lbW9yeTxUPiB7XHJcbiAgICBwcml2YXRlIGlkIDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSB2YWx1ZSA6IFQ7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVycyA6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcsIHZhbHVlIDogVCkge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgQ29udHJvbHMuTWVtb3J5LnJlZ2lzdGVyTWVtb3J5ICh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciB1c2UgZXhjbHVzaXZlbHkgYnkgQ29udHJvbHMuTWVtb3J5LiBEbyBub3QgaW52b2tlLiBVc2Ugc3RvcmVWYWx1ZSBpbnN0ZWFkLlxyXG4gICAgICogQHBhcmFtIHtUfSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VmFsdWVGcm9tTG9jYWxTdG9yYWdlRG9Ob3RJbnZva2UgKHZhbHVlIDogVCkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RvcmVWYWx1ZSAodmFsdWUgOiBUKSB7XHJcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMaXN0ZW5lcnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SWQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRMaXN0ZW5lciAobGlzdGVuZXIgOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlnZ2VyTGlzdGVuZXJzICgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW2ldKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJXb3JsZC9DbGFzc2VzL1NhdmUvU3RvcmVkVmFyaWFibGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiV29ybGQvVHVyblNlcXVlbmNlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIldvcmxkL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDb250cm9scy9DbGFzc2VzL1N0b3JlZE1lbW9yeS50c1wiIC8+XHJcbmludGVyZmFjZSBTYXZlZFRoaW5nIHtcclxuICAgIE5hbWUgOiBzdHJpbmc7XHJcbiAgICBVbmlxdWUgOiBib29sZWFuO1xyXG4gICAgQ2hhbmdlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fVxyXG59XHJcblxyXG4vLyBUaGUgcGxheWVyIGlzIGFsd2F5cyBhIGh1bWFub2lkXHJcbmludGVyZmFjZSBTYXZlZFBsYXllciB7XHJcbiAgICBQYXJ0cyA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG4gICAgUGxheWVyQ2hhbmdlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgIE5hbWUgOiBzdHJpbmc7IC8vIEFyZSB3ZSBnb2luZyB0byBkbyBuYW1lcz8gSSBNZWFuIGl0J2QgYmUgZnVuXHJcbn1cclxuXHJcbmludGVyZmFjZSBTYXZlU3RydWN0dXJlIHtcclxuICAgIFZhcmlhYmxlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgIFdpZWxkZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIFdvcm4gOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIENhcnJpZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgIFBsYXllciA6IFNhdmVkUGxheWVyO1xyXG4gICAgUm91bmRzIDogbnVtYmVyO1xyXG4gICAgRGF0ZSA6IHN0cmluZztcclxuICAgIFVuaXF1ZVRoaW5ncyA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG59XHJcblxyXG5tb2R1bGUgU2F2ZUhhbmRsZXIge1xyXG4gICAgbGV0IHNhdmVOYW1lID0gXCJPYmVsaXNrX1NhdmVcIlxyXG4gICAgbGV0IHNhdmVFeHRlbnNpb24gPSBcIm9ic2F2XCI7XHJcbiAgICBsZXQgc3RvcmFnZVByZWZpeCA9IFwic2F2ZV9cIjtcclxuICAgIGxldCBzYXZlU2xvdCA9IDA7XHJcbiAgICBsZXQgZXJyb3JzIDogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgbGV0IGVyYXNpbmcgPSBmYWxzZTtcclxuICAgIGxldCB2aXJnaW4gPSBuZXcgU3RvcmVkTWVtb3J5KFwiRmlyc3QgdGltZSBzYXZpbmdcIiwgdHJ1ZSk7XHJcblxyXG4gICAgZXhwb3J0IGxldCBBZnRlckxvYWQgPSBuZXcgUnVsZWJvb2s8U2F2ZVN0cnVjdHVyZT4oXCJBZnRlciBsb2FkaW5nXCIpO1xyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlsZSAoKSA6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSA8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgIGVsZW1lbnQudHlwZSA9IFwiZmlsZVwiO1xyXG4gICAgICAgIGVsZW1lbnQuYWNjZXB0ID0gXCIuXCIgKyBzYXZlRXh0ZW5zaW9uO1xyXG5cclxuICAgICAgICBsZXQgcHJvbWlzZSA6IFByb21pc2U8c3RyaW5nPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5vbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmZpbGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZnIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmci5vbmxvYWQgPSAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShldi50YXJnZXRbJ3Jlc3VsdCddKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZyLnJlYWRBc1RleHQoZWxlbWVudC5maWxlc1swXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGljaygpO1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRvd25sb2FkKGZpbGVuYW1lLCB0ZXh0KSB7XHJcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZW5hbWUpO1xyXG5cclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGljaygpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBsb2FkU2F2ZSAoKSB7XHJcbiAgICAgICAgbGV0IGlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gXCIuXCIgKyBzYXZlRXh0ZW5zaW9uO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIGlzIGFjdHVhbGx5IHdvcmtpbmcuIFR5cGVzY3JpcHQgMyBzdWdnZXN0ZWQgaXQgd291bGRuJ3QuXHJcbiAgICAgICAgICAgICAgICBTYXZlSGFuZGxlci5sb2FkR2FtZSg8U2F2ZVN0cnVjdHVyZT4gSlNPTi5wYXJzZSg8c3RyaW5nPiB0ZXh0KSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGlucHV0LmZpbGVzWzBdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpbnB1dC5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEl0ZW0gKHRoaW5nIDogU2F2ZWRUaGluZykgOiBUaGluZyB7XHJcbiAgICAgICAgbGV0IGl0ZW0gOiBUaGluZztcclxuICAgICAgICBpZiAodGhpbmcuVW5pcXVlKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBUaGluZy5nZXRVbmlxdWUodGhpbmcuTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gVGhpbmcuZ2V0Tm9uVW5pcXVlKHRoaW5nLk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gdGhpbmcuTmFtZSArIFwiIG5vIGxvbmdlciBleGlzdHMuXCI7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NhdmVIYW5kbGVyXSBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNsb25lKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGl0ZW0uc2V0Q2hhbmdlcyh0aGluZy5DaGFuZ2VzKTtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbG9hZEdhbWUgKHNhdmVTdHJ1YyA6IFNhdmVTdHJ1Y3R1cmUpIHtcclxuICAgICAgICAvLyBpbnRlcmZhY2UgU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgLy8gICAgIFZhcmlhYmxlcyA6IHtbaWQgOiBzdHJpbmddIDogYW55fTtcclxuICAgICAgICAvLyAgICAgV2llbGRlZCA6IEFycmF5PFNhdmVkVGhpbmc+O1xyXG4gICAgICAgIC8vICAgICBXb3JuIDogQXJyYXk8U2F2ZWRUaGluZz47XHJcbiAgICAgICAgLy8gICAgIENhcnJpZWQgOiBBcnJheTxTYXZlZFRoaW5nPjtcclxuICAgICAgICAvLyAgICAgUGxheWVyIDogU2F2ZWRQbGF5ZXI7XHJcbiAgICAgICAgLy8gICAgIFJvdW5kcyA6IG51bWJlcjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xyXG4gICAgICAgIFN0b3JlZFZhcmlhYmxlLnVwZGF0ZUZyb21PYmplY3Qoc2F2ZVN0cnVjLlZhcmlhYmxlcyk7XHJcblxyXG4gICAgICAgIFdvcmxkU3RhdGUuc2V0Q3VycmVudFR1cm4oc2F2ZVN0cnVjLlJvdW5kcyk7XHJcblxyXG4gICAgICAgIFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLmZvckVhY2goKHRoaW5nIDogVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgVGhpbmcuV2VhclJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBUaGluZy5XaWVsZFJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuZm9yRWFjaCgodGhpbmcgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICBUaGluZy5XaWVsZFJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBUaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuZm9yRWFjaCgodGhpbmcgOiBUaGluZykgPT4ge1xyXG4gICAgICAgICAgICBUaGluZy5DYXJyeVJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuV2llbGRlZC5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRXaWVsZGVkKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuV29ybi5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRXb3JuKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuQ2FycmllZC5mb3JFYWNoKCh0aGluZyA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBnZXRJdGVtKHRoaW5nKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT0gdW5kZWZpbmVkKSBXb3JsZFN0YXRlLnBsYXllci5zZXRDYXJyaWVkKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgc2F2ZWRQbGF5ZXIgPSBzYXZlU3RydWMuUGxheWVyO1xyXG4gICAgICAgIHBsYXllci5zZXROYW1lKHNhdmVkUGxheWVyLk5hbWUpO1xyXG4gICAgICAgIHBsYXllci5zZXRDaGFuZ2VzKHNhdmVkUGxheWVyLlBsYXllckNoYW5nZXMpOyAvLyB0aGlzIGFkZHMgdGhlIHJpZ2h0IGdlbmRlcmVkIHBhcnRzXHJcbiAgICAgICAgc2F2ZWRQbGF5ZXIuUGFydHMuZm9yRWFjaCgocGFydCA6IFNhdmVkVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgbGV0IGJwTGlzdCA9IDxBcnJheTxCb2R5cGFydD4+IHBsYXllci5nZXRQYXJ0c0J5TmFtZShwYXJ0Lk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoYnBMaXN0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgYnBMaXN0WzBdLnNldENoYW5nZXMocGFydC5DaGFuZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzYXZlU3RydWMuVW5pcXVlVGhpbmdzLmZvckVhY2goKHNhdmVkVGhpbmcgOiBTYXZlZFRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IFRoaW5nLmdldFVuaXF1ZShzYXZlZFRoaW5nLk5hbWUpO1xyXG4gICAgICAgICAgICBpZiAodGhpbmcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGluZy5zZXRDaGFuZ2VzKHNhdmVkVGhpbmcuQ2hhbmdlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBleHBvcnRQbGF5ZXIgKCkgOiBTYXZlZFBsYXllciB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgTmFtZSA6IFdvcmxkU3RhdGUucGxheWVyLmdldE5hbWUoKSxcclxuICAgICAgICAgICAgUGxheWVyQ2hhbmdlcyA6IFdvcmxkU3RhdGUucGxheWVyLmdldENoYW5nZXMoKSxcclxuICAgICAgICAgICAgUGFydHMgOiBleHBvcnRUaGluZ3MoV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0UGFydHMoKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydFRoaW5ncyAoYXJyIDogQXJyYXk8VGhpbmc+LCBjaGFuZ2VkT25seT8gOiBib29sZWFuKSA6IEFycmF5PFNhdmVkVGhpbmc+IHtcclxuICAgICAgICBsZXQgb2JqID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gPFRoaW5nPiBhcnJbaV07XHJcbiAgICAgICAgICAgIGxldCBzYXZlZFRoaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgVW5pcXVlIDogdGhpbmcuaXNVbmlxdWUoKSxcclxuICAgICAgICAgICAgICAgIE5hbWUgOiB0aGluZy5nZXROYW1lKCksXHJcbiAgICAgICAgICAgICAgICBDaGFuZ2VzIDogdGhpbmcuZ2V0Q2hhbmdlcygpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICghY2hhbmdlZE9ubHkgfHwgT2JqZWN0LmtleXMoc2F2ZWRUaGluZy5DaGFuZ2VzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvYmoucHVzaChzYXZlZFRoaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRTYXZlU3RydWN0dXJlICgpIDogU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgbGV0IHZhcmlhYmxlcyA9IFN0b3JlZFZhcmlhYmxlLmdldFZhcmlhYmxlcygpO1xyXG4gICAgICAgIGxldCBzYXZlZFZhcmlhYmxlcyA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNhdmVkVmFyaWFibGVzW3ZhcmlhYmxlc1tpXS5pZF0gPSB2YXJpYWJsZXNbaV0uZXhwb3J0QXNPYmplY3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB3aWVsZGVkID0gVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRSaWdodChXb3JsZFN0YXRlLnBsYXllcik7XHJcbiAgICAgICAgbGV0IHdvcm4gPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQoV29ybGRTdGF0ZS5wbGF5ZXIpO1xyXG4gICAgICAgIGxldCBjYXJyaWVkID0gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodChXb3JsZFN0YXRlLnBsYXllcik7XHJcblxyXG4gICAgICAgIGxldCBzYXZlU3RydWMgOiBTYXZlU3RydWN0dXJlID0ge1xyXG4gICAgICAgICAgICBWYXJpYWJsZXMgOiBzYXZlZFZhcmlhYmxlcyxcclxuICAgICAgICAgICAgVW5pcXVlVGhpbmdzIDogZXhwb3J0VGhpbmdzKFRoaW5nLmdldFVuaXF1ZXMoKSksXHJcbiAgICAgICAgICAgIFdpZWxkZWQgOiBleHBvcnRUaGluZ3Mod2llbGRlZCksXHJcbiAgICAgICAgICAgIFdvcm4gOiBleHBvcnRUaGluZ3Mod29ybiksXHJcbiAgICAgICAgICAgIENhcnJpZWQgOiBleHBvcnRUaGluZ3MoY2FycmllZCksXHJcbiAgICAgICAgICAgIFBsYXllciA6IGV4cG9ydFBsYXllcigpLFxyXG4gICAgICAgICAgICBSb3VuZHMgOiBXb3JsZFN0YXRlLmdldEN1cnJlbnRUdXJuKCksXHJcbiAgICAgICAgICAgIERhdGUgOiBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiW1NhdmVIYW5kbGVyXSBDcmVhdGVkIFNhdmUgU3RydWN0dXJlXCIsIHNhdmVTdHJ1Yyk7XHJcblxyXG4gICAgICAgIHJldHVybiBzYXZlU3RydWM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldFNsb3QgKHNsb3ROIDogbnVtYmVyKSB7XHJcbiAgICAgICAgc2F2ZVNsb3QgPSBzbG90TjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2F2ZVRvU3RvcmFnZSAoKSB7XHJcbiAgICAgICAgQ29udHJvbHMuTWVtb3J5LnNldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzYXZlU2xvdCwgZ2V0U2F2ZVN0cnVjdHVyZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZyb21TdG9yYWdlICgpIHtcclxuICAgICAgICBpZiAoIWVyYXNpbmcpIHtcclxuICAgICAgICAgICAgbGV0IHNhdmVTdHJ1Y3QgPSAoQ29udHJvbHMuTWVtb3J5LmdldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzYXZlU2xvdCwgdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGlmIChzYXZlU3RydWN0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbG9hZEdhbWUoc2F2ZVN0cnVjdCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWZ0ZXJMb2FkLmV4ZWN1dGUoe25vdW4gOiBzYXZlU3RydWN0fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIG5ldyBnYW1lIVxyXG4gICAgICAgIGF3YWl0IENoYXJhY3RlckNyZWF0aW9uLnJ1bGVib29rLmV4ZWN1dGUoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRnJvbUZpbGUgKCkge1xyXG4gICAgICAgIFBsYXlCZWdpbnMuTE9BRF9GQUlMRUQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcHJvbWlzZSA9IHJlYWRGaWxlKCk7XHJcblxyXG4gICAgICAgIGxldCBmaW5pc2hlZEFueTtcclxuICAgICAgICBsZXQgcmVhbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBmaW5pc2hlZEFueSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KFwiTm8gc2F2ZSBmaWxlIHdhcyBsb2FkZWQuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFNheS5DRU5URVJFRCwgbmV3IFNheUJvbGQoXCJQcmVzcyBhbnkga2V5IHRvIHJldHVybi5cIikpO1xyXG4gICAgICAgIGxldCBzYXlFbGVtZW50cyA9IGF3YWl0IEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5nZXRTYXlFbGVtZW50c0FzQ29udGVudChzYXkpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi5zYXlFbGVtZW50cyk7XHJcblxyXG4gICAgICAgIGxldCBuZXh0S2V5ID0gQ29udHJvbHMuS2V5SGFuZGxlci5nZXROZXh0S2V5KCk7XHJcblxyXG4gICAgICAgIHByb21pc2UudGhlbigoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLnN0b3BHaXZpbmdOZXh0S2V5KG5leHRLZXkpO1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5zYXlFbGVtZW50cyk7XHJcbiAgICAgICAgICAgIGxvYWRHYW1lKGdldEZyb21GaWxlKGZpbGUpKTsgLy8gSWYgbm8gZmlsZSB3YXMgY2hvc2VuIHRoZW4gY2hhbmdlIGlzbid0IHRyaWdnZXJlZCwgc28gaXQncyBuZXZlciB1bmRlZmluZWQuLi5cclxuICAgICAgICAgICAgZmluaXNoZWRBbnkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbmV4dEtleS50aGVuKChrZXlDb2RlIDogS2V5Q29kZSkgPT4ge1xyXG4gICAgICAgICAgICBQbGF5QmVnaW5zLkxPQURfRkFJTEVEID0gdHJ1ZTtcclxuICAgICAgICAgICAgZmluaXNoZWRBbnkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgcmVhbFByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNheUZvclNsb3QgKHNsb3ROdW1iZXIgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgc2F2ZVN0cnVjdCA6IFNhdmVTdHJ1Y3R1cmUgPSAoQ29udHJvbHMuTWVtb3J5LmdldFZhbHVlKHN0b3JhZ2VQcmVmaXggKyBzbG90TnVtYmVyLCB1bmRlZmluZWQpKTtcclxuICAgICAgICBpZiAoc2F2ZVN0cnVjdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXkoXCJOZXcgR2FtZVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZXJhc2luZ1RleHQgPSBlcmFzaW5nID8gXCIoRVJBU0UpIC0gXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNheShlcmFzaW5nVGV4dCwgc2F2ZVN0cnVjdC5QbGF5ZXIuTmFtZSArIFwiIC0gVHVybnM6IFwiICsgc2F2ZVN0cnVjdC5Sb3VuZHMgKyBcIiAtIExhc3QgUGxheWVkOiBcIiArIHNhdmVTdHJ1Y3QuRGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRGcm9tRmlsZSAoc2F2ZVRleHQpIDogU2F2ZVN0cnVjdHVyZSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGF0b2Ioc2F2ZVRleHQpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNhdmVUb0ZpbGUgKCkge1xyXG4gICAgICAgIC8vIEl0J3Mgb2theSBpZiB5b3Ugd2FudCB0byBjaGVhdCwgYnV0IGlmIHlvdSB0YW1wZXIgd2l0aCB0aGUgc2F2ZSBmaWxlLCBwbGVhc2UgYmUgbWluZGZ1bCB3aGVuIHJlcG9ydGluZyBcImJ1Z3NcIi5cclxuICAgICAgICBkb3dubG9hZChzYXZlTmFtZSArIFwiLlwiICsgc2F2ZUV4dGVuc2lvbiwgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoKEpTT04uc3RyaW5naWZ5KGdldFNhdmVTdHJ1Y3R1cmUoKSkpKSkpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNFcmFzaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gZXJhc2luZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdG9nZ2xlRXJhc2luZyAoKSB7XHJcbiAgICAgICAgZXJhc2luZyA9ICFlcmFzaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1ZpcmdpbiAoKSB7XHJcbiAgICAgICAgbGV0IHdhcyA9IHZpcmdpbi5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIHZpcmdpbi5zdG9yZVZhbHVlKGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gd2FzO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIlNhdmVHYW1lQnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbi8vICAgICBTYXZlSGFuZGxlci5zYXZlVG9GaWxlKCk7XHJcbi8vIH0pO1xyXG5cclxuVHVyblNlcXVlbmNlLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiU2F2ZSBnYW1lIHRvIFN0b3JhZ2VcIixcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgIFNhdmVIYW5kbGVyLnNhdmVUb1N0b3JhZ2UoKTtcclxuICAgIH1cclxufSkiLCJjbGFzcyBDaGFyYWN0ZXJPcmlnaW4ge1xyXG4gICAgcHVibGljIGlkIDogc3RyaW5nO1xyXG4gICAgcHVibGljIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24gOiBzdHJpbmcgfCBTYXk7XHJcbiAgICBwdWJsaWMgYm9udXNTdGF0cyA6IHN0cmluZztcclxuICAgIHB1YmxpYyBjb25maXJtUGlja2VkIDogKCgpID0+IHZvaWQpID0gKCkgPT4ge307XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICBDaGFyYWN0ZXJPcmlnaW4uc3RvcmVPcmlnaW4odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBvcmlnaW5zIDoge1tpZCA6IHN0cmluZ10gOiBDaGFyYWN0ZXJPcmlnaW59ID0ge307XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzdG9yZU9yaWdpbiAob3JpZ2luIDogQ2hhcmFjdGVyT3JpZ2luKSB7XHJcbiAgICAgICAgQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnNbb3JpZ2luLmlkXSA9IG9yaWdpbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9yaWdpbiAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnNbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3JpZ2lucyAoKSA6IEFycmF5PENoYXJhY3Rlck9yaWdpbj4ge1xyXG4gICAgICAgIGxldCBvcmlnaW5zID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gQ2hhcmFjdGVyT3JpZ2luLm9yaWdpbnMpIHtcclxuICAgICAgICAgICAgb3JpZ2lucy5wdXNoKENoYXJhY3Rlck9yaWdpbi5vcmlnaW5zW2lkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9yaWdpbnMuc29ydCgoYSA6IENoYXJhY3Rlck9yaWdpbiwgYiA6IENoYXJhY3Rlck9yaWdpbikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbmEgPSBhLm5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgbGV0IG5iID0gYi5uYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChuYSA8IG5iKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIGlmIChuYSA+IG5iKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9yaWdpbnM7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ2hhcmFjdGVyT3JpZ2luLnRzXCIgLz5cclxubW9kdWxlIENoYXJhY3RlckNyZWF0aW9uIHtcclxuICAgIGV4cG9ydCBsZXQgQ2hhbXBpb25PcmlnaW4gPSBuZXcgQ2hhcmFjdGVyT3JpZ2luKFwiQ2hhbXBpb25cIik7XHJcbiAgICBDaGFtcGlvbk9yaWdpbi5uYW1lID0gXCJDaGFtcGlvblwiO1xyXG4gICAgQ2hhbXBpb25PcmlnaW4uZGVzY3JpcHRpb249IFwiWW91IHdlcmUgYm9ybiBpbiB0aGUgc21hbGwgdmlsbGFnZSBvZiBTb3V0aHdvb2QgaW4gdGhlIHBvc3QtVG93ZXIgd29ybGQuIENob3NlbiBieSB0aGUgdmlsbGFnZSBlbGRlciwgeW91IHdlcmUgdHJhaW5lZCByZWxlbnRsZXNzbHkgYXMgc29vbiBhcyB5b3UgYmVjYW1lIGFibGUgdG8gd2Fsay4gWW91ciBtaXNzaW9uOiBnZXQgdG8gdGhlIFRvd2VyIGFuZCBmaW5kIGEgd2F5IHRvIGRlc3Ryb3kgaXQuIFVuYmVrbm93bnN0IHRvIHlvdSwgdGhpcyBpcyBsaXR0bGUgbW9yZSB0aGFuIGEgc2FjcmlmaWNlIHJpdHVhbCBhbmQgeW91IGFyZSBqdXN0IGl0J3MgbGF0ZXN0IHZpY3RpbS4gVGhlIHZpbGxhZ2UgZG9lc24ndCBhY3R1YWxseSBleHBlY3QgeW91IHRvIHN1Y2NlZWQsIHlvdSBhcmUgbWVyZWx5IGEgZ2lmdCB0byB0aGUgVG93ZXIsIHNvIHRoYXQgaXQgd2lsbCBub3QgZGVzdHJveSBTb3V0aHdvb2QuXCI7XHJcbiAgICBDaGFtcGlvbk9yaWdpbi5ib251c1N0YXRzID0gXCJUaGlzIG9yaWdpbiBncmFudHMgYSArMSBCb251cyB0byBldmVyeSBhdHRyaWJ1dGUsIGJ1dCB5b3Ugd2lsbCBiZSBzdHVjayB3aXRoIHNvbWUgcGVya3MgZ2FpbmVkIHRocm91Z2ggeW91ciB0cmFpbmluZy5cIjtcclxuXHJcbiAgICAvLyBHaXZlICsxIHRvIGFsbCBzdGF0cyBpZiBwaWNrZWRcclxuICAgIENoYW1waW9uT3JpZ2luLmNvbmZpcm1QaWNrZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xyXG4gICAgICAgIGZ1bmN0aW9uIGluY3JlYXNlU3RhdCAoYXR0ciA6IEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICBwbGF5ZXIuc2V0U3RhdChhdHRyLCBwbGF5ZXIuZ2V0U3RhdChhdHRyKSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmNyZWFzZVN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCk7XHJcbiAgICAgICAgaW5jcmVhc2VTdGF0KEF0dHJpYnV0ZXMuQ2hhcm0pO1xyXG4gICAgICAgIGluY3JlYXNlU3RhdChBdHRyaWJ1dGVzLkFnaWxpdHkpO1xyXG4gICAgICAgIGluY3JlYXNlU3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvQ2xhc3Nlcy9TYXZlL1N0b3JlZFZhcmlhYmxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIk9yaWdpbnMvQ2hhbXBpb25PcmlnaW4udHNcIiAvPlxyXG5tb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgZXhwb3J0IGxldCBQbGF5ZXJPcmlnaW4gPSBuZXcgU3RvcmVkVmFyaWFibGUoe2lkIDogXCJQbGF5ZXIgT3JpZ2luXCIsIHZhbHVlIDogQ2hhbXBpb25PcmlnaW4uaWR9KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0T3JpZ2luICgpIDogQ2hhcmFjdGVyT3JpZ2luIHtcclxuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyT3JpZ2luLmdldE9yaWdpbihQbGF5ZXJPcmlnaW4udmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgcnVsZWJvb2sgPSBuZXcgUnVsZWJvb2soXCJDaGFyYWN0ZXIgQ3JlYXRpb25cIik7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvQ2xhc3Nlcy9TYXZlL1N0b3JlZFZhcmlhYmxlLnRzXCIgLz5cclxuY2xhc3MgUGVyayBleHRlbmRzIFN0b3JlZFZhcmlhYmxlPGJvb2xlYW4+IHtcclxuICAgIHB1YmxpYyBmb3JjZWRTdGF0dXMgOiAoKGUgOiBQZXJrKSA9PiBib29sZWFuIHwgdm9pZCkgPSAoKSA9PiB7IHJldHVybiB1bmRlZmluZWQgfTtcclxuICAgIHB1YmxpYyBkZXNjcmlwdGlvbiA6IFNheSB8IHN0cmluZyB8ICgocGVyayA6IFBlcmspID0+IFNheSB8IHN0cmluZykgPSBcIlVuZGVmaW5lZFwiO1xyXG4gICAgcHVibGljIG5hbWUgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgY29uZmlybVBpY2tlZCA6ICgoKSA9PiB2b2lkKSA9ICgpID0+IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWQgOiBcIlBlcmtfXCIgKyBpZCxcclxuICAgICAgICAgICAgdmFsdWUgOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IGlkO1xyXG5cclxuICAgICAgICBQZXJrLnN0b3JlUGVyayh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNFbmFibGVkICh2YWx1ZU9ubHk/IDogYm9vbGVhbikgOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodmFsdWVPbmx5ICE9IHRydWUpIHtcclxuICAgICAgICAgICAgbGV0IGZvcmNlZCA9IHRoaXMuZm9yY2VkU3RhdHVzKHRoaXMpO1xyXG4gICAgICAgICAgICBpZiAoZm9yY2VkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxib29sZWFuPiBmb3JjZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRm9yY2VkICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZWRTdGF0dXModGhpcykgIT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBwZXJrcyA6IHtbaWQgOiBzdHJpbmddIDogUGVya30gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlUGVyayAocGVyayA6IFBlcmspIHtcclxuICAgICAgICBQZXJrLnBlcmtzW3BlcmsuaWRdID0gcGVyaztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFBlcmsgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIFBlcmsucGVya3NbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGVya3MgKCkgOiBBcnJheTxQZXJrPiB7XHJcbiAgICAgICAgbGV0IHBlcmtzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gUGVyay5wZXJrcykge1xyXG4gICAgICAgICAgICBwZXJrcy5wdXNoKFBlcmsucGVya3NbaWRdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGVya3Muc29ydCgoYSA6IFBlcmssIGIgOiBQZXJrKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBuYSA9IGEubmFtZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBsZXQgbmIgPSBiLm5hbWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKG5hIDwgbmIpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgaWYgKG5hID4gbmIpIHJldHVybiAxO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcGVya3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1cGRhdGVQZXJrcygpIHtcclxuICAgICAgICBmb3IgKGxldCBpZCBpbiBQZXJrLnBlcmtzKSB7XHJcbiAgICAgICAgICAgIGxldCBwZXJrID0gUGVyay5wZXJrc1tpZF07XHJcbiAgICAgICAgICAgIGlmIChwZXJrLmlzRm9yY2VkKCkpIHtcclxuICAgICAgICAgICAgICAgIHBlcmsudmFsdWUgPSA8Ym9vbGVhbj4gcGVyay5mb3JjZWRTdGF0dXMocGVyayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2F5LnRzXCIgLz5cclxuY2xhc3MgT25lT2Yge1xyXG4gICAgcHJpdmF0ZSBwb3NzaWJpbGl0aWVzID0gW107XHJcbiAgICBwcml2YXRlIGF2YWlsYWJsZVBvc3NpYmlsaXRlcztcclxuICAgIHByaXZhdGUgcmFuZG9tTW9kZSA6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFBVUkVMWV9BVF9SQU5ET00gOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBST1RBVElOR19SQU5ET00gOiBudW1iZXIgPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBDWUNMSU5HIDogbnVtYmVyID0gMjtcclxuXHJcbiAgICBwcml2YXRlIGN5Y2xpbmdPcmRlciA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChyYW5kb21Nb2RlIDogbnVtYmVyLCAuLi5wb3NzIDogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHRoaXMucmFuZG9tTW9kZSA9IHJhbmRvbU1vZGU7XHJcbiAgICAgICAgdGhpcy5wb3NzaWJpbGl0aWVzID0gcG9zcztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tTW9kZSA9PSBPbmVPZi5ST1RBVElOR19SQU5ET00pIHtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMgPSB0aGlzLnBvc3NpYmlsaXRpZXMuc2xpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE9uZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tTW9kZSA9PSBPbmVPZi5QVVJFTFlfQVRfUkFORE9NKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3NpYmlsaXRpZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5wb3NzaWJpbGl0aWVzLmxlbmd0aCldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5kb21Nb2RlID09IE9uZU9mLlJPVEFUSU5HX1JBTkRPTSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMgPSB0aGlzLnBvc3NpYmlsaXRpZXMuc2xpY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVQb3NzaWJpbGl0ZXMuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuYXZhaWxhYmxlUG9zc2liaWxpdGVzLmxlbmd0aCksIDEpWzBdXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJhbmRvbU1vZGUgPT0gT25lT2YuQ1lDTElORykge1xyXG4gICAgICAgICAgICB2YXIgciA9IHRoaXMucG9zc2liaWxpdGllc1t0aGlzLmN5Y2xpbmdPcmRlcisrXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3ljbGluZ09yZGVyID4gdGhpcy5wb3NzaWJpbGl0aWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jeWNsaW5nT3JkZXIgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIm1vZHVsZSBDb250cm9scyB7XHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZS50c1wiIC8+XHJcbm1vZHVsZSBNYWNoaW5lQmVnaW5zIHtcclxuICAgIGV4cG9ydCB2YXIgcnVsZWJvb2sgPSBuZXcgUnVsZWJvb2s8dm9pZD4oXCJNYWNoaW5lIEJlZ2luc1wiKTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZXhlY3V0ZSAoKSB7XHJcbiAgICAgICAgcnVsZWJvb2suZXhlY3V0ZSh7fSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcclxuICAgIE1hY2hpbmVCZWdpbnMuZXhlY3V0ZSgpO1xyXG59KTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vV29ybGQvTWFjaGluZUJlZ2lucy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Xb3JsZC9UdXJuU2VxdWVuY2UudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMge1xyXG4gICAgZXhwb3J0IHZhciBhbmltYXRpb25UaW1lID0gMTAwMDtcclxuICAgIGV4cG9ydCB2YXIgaXNNb2JpbGUgPSAvTW9iaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7IC8vIFRoaXMgY29ycmVjdGx5IGxldHMgTW9iaWxlIHVzZXJzIHdobyByZXF1ZXN0ZWQgdGhlIERlc2t0b3AgYXBwIG9yIGFyZSBvbiBhIHN1ZmZpY2llbnRseSBiaWcgdGFibGV0IHRvIGdldCB0aGUgcmlnaHQgZGVza3RvcCB2ZXJzaW9uXHJcblxyXG4gICAgZXhwb3J0IHZhciBzY3JlZW5XaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICBleHBvcnQgdmFyIHNjcmVlbkhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRMaW5rRWxlbWVudHMgKGltYWdlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoQ3VycmVudFR1cm5IYW5kbGVyID09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xyXG4gICAgICAgIGlmIChDdXJyZW50VHVybkhhbmRsZXIuaXNUdXJuKCkgfHwgaW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtDdXJyZW50VHVybkhhbmRsZXIuY3VycmVudFR1cm5UYWJdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbSHlwZXJsaW5rSGFuZGxlci5saW5rZWRBY3Rpb25zVGFiLCBSb29tSGFuZGxlci5jdXJyZW50Um9vbVRhYiwgSHlwZXJsaW5rSGFuZGxlci5jb21tb25BY3Rpb25zVGFiLCBDdXJyZW50VHVybkhhbmRsZXIuY3VycmVudFR1cm5UYWIsIFJvb21IYW5kbGVyLmN1cnJlbnRSb29tRXhpdHNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdXBkYXRlU2NyZWVuU2l6ZSAoKSB7XHJcbiAgICAgICAgc2NyZWVuV2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHNjcmVlbkhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB2YXIgbWFpblBhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW5QYWdlXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyB0aGUgYmx1ciBlZmZlY3QgdG8gdGhlIHNjcmVlblxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRUdXJuICgpIHtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QuYWRkKFwidHVyblwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSB0aGUgYmx1ciBlZmZlY3QgZnJvbSB0aGUgc2NyZWVuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRUdXJuICgpIHtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QucmVtb3ZlKFwidHVyblwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyZSB3ZSBjdXJyZW50bHkgaW4gYSB0dXJuP1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0luVHVybiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG1haW5QYWdlLmNsYXNzTGlzdC5jb250YWlucyhcInR1cm5cIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGxldCBtZW51T3V0c2lkZW9mVHVybiA9IGZhbHNlO1xyXG4gICAgbGV0IG1lbnVzID0gMDtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRNZW51ICgpIHtcclxuICAgICAgICBpZiAoIWlzSW5UdXJuKCkpIHtcclxuICAgICAgICAgICAgbWVudU91dHNpZGVvZlR1cm4gPSB0cnVlO1xyXG4gICAgICAgICAgICBzdGFydFR1cm4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFpblBhZ2UuY2xhc3NMaXN0LmFkZChcIm1haW5tZW51XCIpO1xyXG4gICAgICAgIG1lbnVzKys7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmNsZWFyKCk7XHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRNZW51ICgpIHtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuY2xlYXIoKTtcclxuICAgICAgICBpZiAoLS1tZW51cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChtZW51T3V0c2lkZW9mVHVybikge1xyXG4gICAgICAgICAgICAgICAgZW5kVHVybigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc2V0TWVudXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TWVudXMgKCkge1xyXG4gICAgICAgIGlmIChtZW51cyAhPSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG1lbnUgd2Fzbid0IGZpbmlzaGVkIHByb3Blcmx5LiBQbGVhc2UgY29ycmVjdCB0aGUgZGlhbG9ndWUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZW51cyA9IDA7XHJcbiAgICAgICAgbWVudU91dHNpZGVvZlR1cm4gPSBmYWxzZTtcclxuICAgICAgICBtYWluUGFnZS5jbGFzc0xpc3QucmVtb3ZlKFwibWFpbm1lbnVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNsZWFyTWFpblNjcmVlbiAoKSB7XHJcbiAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGxvYWRpbmdTY3JlZW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvYWRpbmdTY3JlZW5cIik7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHN0b3BMb2FkaW5nICgpIHtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxvYWRpbmdTY3JlZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yQW55S2V5ICgpIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShTYXkuQ0VOVEVSRUQsIG5ldyBTYXlCb2xkKFwiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS5cIikpO1xyXG4gICAgICAgIGxldCBlbGVtZW50cyA9IGF3YWl0IHNheS5nZXRIVE1MKFwicFwiLCBbXCJjb250ZW50XCJdKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoLi4uZWxlbWVudHMpO1xyXG5cclxuICAgICAgICBhd2FpdCBDb250cm9scy5LZXlIYW5kbGVyLmdldE5leHRLZXkoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5lbGVtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTcGFjZUtleSAoKSB7XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoU2F5LkNFTlRFUkVELCBuZXcgU2F5Qm9sZChcIlByZXNzIFNwYWNlIHRvIGNvbnRpbnVlLlwiKSk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgc2F5LmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludCguLi5lbGVtZW50cyk7XHJcblxyXG4gICAgICAgIGxldCBsYXN0S2V5ID0gXCJub3RTcGFjZVwiO1xyXG4gICAgICAgIHdoaWxlIChsYXN0S2V5ICE9IFwiU3BhY2VcIiAmJiBsYXN0S2V5ICE9IFwiQ2xpY2tcIikge1xyXG4gICAgICAgICAgICBsYXN0S2V5ID0gKGF3YWl0IENvbnRyb2xzLktleUhhbmRsZXIuZ2V0TmV4dEtleSgpKS5ldkNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi5lbGVtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHByaW50T2JlbGlza0xvZ28gKCkge1xyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KFNheS5DRU5URVJFRCwgbmV3IFNheUltYWdlKFwiaW50cm9Mb2dvXCIpLCBTYXkuTElORV9CUkVBSywgbmV3IFNheUl0YWxpYyhcIlRoZSBPYmVsaXNrIGlzIGFuIGFkdWx0IGludGVyYWN0aXZlIGZpY3Rpb24gZ2FtZSBzZXQgaW4gYSBwb3N0LWFwb2NhbHlwdGljIHdvcmxkIHJhdmFnZWQgYnkgYSBtYWdpY2FsIHN0cnVjdHVyZS5cIikpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChzYXkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pZiAoRWxlbWVudHMuaXNNb2JpbGUpIHtcclxuICAgIEVsZW1lbnRzLm1haW5QYWdlLmNsYXNzTGlzdC5hZGQoXCJtb2JpbGVcIik7XHJcbn1cclxuXHJcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgIEVsZW1lbnRzLnVwZGF0ZVNjcmVlblNpemUoKTtcclxufSk7XHJcblxyXG5cclxubW9kdWxlIE1hY2hpbmVCZWdpbnMge1xyXG4gICAgZXhwb3J0IGxldCBIaWRlTG9hZGluZ0RpdlJ1bGUgPSBNYWNoaW5lQmVnaW5zLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkhpZGUgbG9hZGluZyBkaXZcIixcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuc3RvcExvYWRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxubW9kdWxlIFR1cm5TZXF1ZW5jZSB7XHJcbiAgICBleHBvcnQgbGV0IExhemlseUZpeE1lbnVzID0gVHVyblNlcXVlbmNlLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkZpeCBtZW51cyB0aGF0IHdlcmUgbmV2ZXIgY2xvc2VkIGJlY2F1c2UgdGhlIGRldiBpcyBzdHVwaWRcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5yZXNldE1lbnVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250cm9scy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9DbGFzc2VzL1N0b3JlZE1lbW9yeS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9FbGVtZW50cy50c1wiIC8+XHJcbmludGVyZmFjZSBLZXlDb2RlIHtcclxuICAgIGV2Q29kZSA6IHN0cmluZztcclxuICAgIHJlcHJlc2VudGF0aW9uIDogc3RyaW5nO1xyXG4gICAgbmFtZSA6IHN0cmluZztcclxufVxyXG5cclxubW9kdWxlIENvbnRyb2xzLktleUhhbmRsZXIge1xyXG4gICAgbGV0IHByb21pc2VTdGFjayA6IEFycmF5PCh2YWx1ZT86IEtleUNvZGUgfCBQcm9taXNlTGlrZTxLZXlDb2RlPikgPT4gdm9pZD4gPSBbXTtcclxuICAgIGxldCBwcm9taXNlT3JpZ2luYWxTdGFjayA6IEFycmF5PFByb21pc2U8S2V5Q29kZT4+ID0gW107XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlamVjdFByb21pc2UgKHByb21pc2UgOiAodmFsdWU/OiBLZXlDb2RlIHwgUHJvbWlzZUxpa2U8S2V5Q29kZT4pID0+IHZvaWQpIHtcclxuICAgICAgICBwcm9taXNlU3RhY2suc3BsaWNlKHByb21pc2VTdGFjay5pbmRleE9mKHByb21pc2UpLCAxKTtcclxuICAgICAgICBwcm9taXNlT3JpZ2luYWxTdGFjay5zcGxpY2UocHJvbWlzZVN0YWNrLmluZGV4T2YocHJvbWlzZSksIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLZXlDb2RlIChldiA6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBsZXQgbmFtZSA9IGV2LmtleS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGxldCByZXByZXNlbnRhdGlvbiA9IG5hbWU7XHJcbiAgICAgICAgbGV0IGV2Q29kZSA9IGV2LmNvZGU7XHJcbiAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBcIlNoaWZ0ICsgXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBldkNvZGUgPSBcIlNoXCIgKyBldkNvZGU7XHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gXCJTXCIgKyByZXByZXNlbnRhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2LmFsdEtleSkge1xyXG4gICAgICAgICAgICBuYW1lID0gXCJBbHQgKyBcIiArIG5hbWU7XHJcbiAgICAgICAgICAgIGV2Q29kZSA9IFwiQWxcIiArIGV2Q29kZTtcclxuICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gPSBcIkFcIiArIHJlcHJlc2VudGF0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXYuY3RybEtleSkge1xyXG4gICAgICAgICAgICBuYW1lID0gXCJDb250cm9sICsgXCIgKyBuYW1lO1xyXG4gICAgICAgICAgICBldkNvZGUgPSBcIkN0XCIgKyBldkNvZGU7XHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gXCJDXCIgKyByZXByZXNlbnRhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGtleUNvZGUgOiBLZXlDb2RlID0gIHtcclxuICAgICAgICAgICAgZXZDb2RlIDogZXZDb2RlLFxyXG4gICAgICAgICAgICBuYW1lIDogbmFtZSxcclxuICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gOiByZXByZXNlbnRhdGlvblxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGtleUNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGtleUNvZGUgOiBLZXlDb2RlID0ge1xyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiQ2xpY2tcIixcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJDbGlja1wiLFxyXG4gICAgICAgICAgICBuYW1lIDogXCJDbGlja1wiXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHByb21pc2UgPSBwcm9taXNlU3RhY2suc2hpZnQoKTtcclxuICAgICAgICBpZiAocHJvbWlzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcHJvbWlzZShrZXlDb2RlKTtcclxuICAgICAgICAgICAgcHJvbWlzZU9yaWdpbmFsU3RhY2suc2hpZnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IFRoaXMgZnVja3MgdXAgYnJvd3NlciBjb250cm9sLiBMZXQncyBqdXN0IGFzc3VtZSB0aGF0IHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGNhdGNoIGEga2V5LlxyXG4gICAgICAgIGxldCBrZXlDb2RlID0gY3JlYXRlS2V5Q29kZShldmVudCk7XHJcblxyXG4gICAgICAgIGxldCBwcm9taXNlID0gcHJvbWlzZVN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgaWYgKHByb21pc2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHByb21pc2Uoa2V5Q29kZSk7XHJcbiAgICAgICAgICAgIHByb21pc2VPcmlnaW5hbFN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChrZXlDb2RlLmV2Q29kZSA9PSBzY3JvbGxLZXlDb2RlLmdldFZhbHVlKCkuZXZDb2RlKSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5zY3JvbGxTcGFjZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlLmV2Q29kZSA9PSBpbWFnZUtleUNvZGUuZ2V0VmFsdWUoKS5ldkNvZGUpIHtcclxuICAgICAgICAgICAgaWYgKFNheUltYWdlLmltYWdlVmlld2VyLnN0eWxlLmRpc3BsYXkgPT0gXCJibG9ja1wiKSB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLmN1cnJlbnRUdXJuVGFiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjb250ZW50SW1hZ2VcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAoPEhUTUxFbGVtZW50PiBpbWFnZXNbaW1hZ2VzLmxlbmd0aCAtIDFdKS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbGU7XHJcblxyXG4gICAgICAgIEVsZW1lbnRzLmdldExpbmtFbGVtZW50cygpLnNvbWUoKGVsZW1lbnQgOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQga2V5YWJsZXMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJrZXlhYmxlXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleWFibGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxIVE1MRWxlbWVudD4ga2V5YWJsZXNbaV0pLmRhdGFzZXRbJ3Nob3J0Y3V0Y29kZSddID09IGtleUNvZGUuZXZDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlID0ga2V5YWJsZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoZWxlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBlbGUuY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlS2V5Q29kZXMgKGNvZGVzIDogQXJyYXk8c3RyaW5nPiwga2V5cyA6IEFycmF5PHN0cmluZz4sIG1vZHM/IDogQXJyYXk8Ym9vbGVhbj4pIHtcclxuICAgICAgICBsZXQgYXJyID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbW9kID0gMDsgbW9kIDwgNDsgbW9kKyspIHtcclxuICAgICAgICAgICAgaWYgKG1vZCA9PSAwIHx8IG1vZHNbbW9kXSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBrZXlzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXByZXNlbnRhdGlvbiA9IGtleXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2Q29kZSA9IGNvZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJTaGlmdCArIFwiICsgbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZDb2RlID0gXCJTaFwiICsgZXZDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiA9IFwiU1wiICsgcmVwcmVzZW50YXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gXCJBbHQgKyBcIiArIG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2Q29kZSA9IFwiQWxcIiArIGV2Q29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gPSBcIkFcIiArIHJlcHJlc2VudGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwiQ29udHJvbCArIFwiICsgbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZDb2RlID0gXCJDdFwiICsgZXZDb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiA9IFwiQ1wiICsgcmVwcmVzZW50YXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXlDb2RlOiBLZXlDb2RlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldkNvZGU6IGV2Q29kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb246IHJlcHJlc2VudGF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lIDogbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goa2V5Q29kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdmFyIHNjcm9sbEtleUNvZGUgPSBuZXcgU3RvcmVkTWVtb3J5KFwic2Nyb2xsS2V5Q29kZVwiLCA8S2V5Q29kZT4ge1xyXG4gICAgICAgIGV2Q29kZSA6IFwiU3BhY2VcIixcclxuICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiU3BhY2VcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBpbWFnZUtleUNvZGUgPSBuZXcgU3RvcmVkTWVtb3J5KFwiaW1hZ2VLZXlDb2RlXCIsIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgZXZDb2RlIDogXCJLZXlJXCIsXHJcbiAgICAgICAgcmVwcmVzZW50YXRpb24gOiBcIklcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZXhwb3J0IHZhciBrZXlDb2RlczEgPSBuZXcgU3RvcmVkTWVtb3J5KFxyXG4gICAgICAgIFwia2V5Q29kZXNSb29tXCIsXHJcbiAgICAgICAgY3JlYXRlS2V5Q29kZXMoIFtcIkRpZ2l0MVwiLCBcIkRpZ2l0MlwiLCBcIkRpZ2l0M1wiLCBcIkRpZ2l0NFwiLCBcIkRpZ2l0NVwiXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pXHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZXMyID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVzQWN0aW9uc1wiLFxyXG4gICAgICAgIGNyZWF0ZUtleUNvZGVzKCBbXCJLZXlRXCIsIFwiS2V5V1wiLCBcIktleUVcIiwgXCJLZXlSXCIsIFwiS2V5VFwiXSxcclxuICAgICAgICAgICAgW1wiUVwiLCBcIldcIiwgXCJFXCIsIFwiUlwiLCBcIlRcIl0sXHJcbiAgICAgICAgICAgIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSlcclxuICAgICk7XHJcblxyXG5cclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVzMyA9IG5ldyBTdG9yZWRNZW1vcnkoXHJcbiAgICAgICAgXCJrZXlDb2Rlc0dsb2JhbFwiLFxyXG4gICAgICAgIGNyZWF0ZUtleUNvZGVzKCBbXCJLZXlGXCIsIFwiS2V5VlwiLCBcIktleUdcIiwgXCJLZXlCXCJdLFxyXG4gICAgICAgICAgICBbXCJGXCIsIFwiVlwiLCBcIkdcIiwgXCJCXCJdLFxyXG4gICAgICAgICAgICBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pXHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZU5vcnRoID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVOb3J0aFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5U1wiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiU1wiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVFYXN0ID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVFYXN0XCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlDXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJDXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZVNvdXRoID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVTb3V0aFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5WFwiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiWFwiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVXZXN0ID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVXZXN0XCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlaXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJaXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIGV4cG9ydCB2YXIga2V5Q29kZVVwID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVVcFwiLFxyXG4gICAgICAgIDxLZXlDb2RlPiB7XHJcbiAgICAgICAgICAgIGV2Q29kZSA6IFwiS2V5QVwiLFxyXG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiA6IFwiQVwiXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGtleUNvZGVEb3duID0gbmV3IFN0b3JlZE1lbW9yeShcclxuICAgICAgICBcImtleUNvZGVEb3duXCIsXHJcbiAgICAgICAgPEtleUNvZGU+IHtcclxuICAgICAgICAgICAgZXZDb2RlIDogXCJLZXlEXCIsXHJcbiAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIDogXCJEXCJcclxuICAgICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBzYWZlciBieSBjcmVhdGluZyBpdCB1c2luZyBSb29tLkRJUkVDVElPTlMuXHJcbiAgICB2YXIgZGlyZWN0aW9uQ29kZUJ5SW5kZXggPSBba2V5Q29kZU5vcnRoLCB1bmRlZmluZWQsIGtleUNvZGVFYXN0LCB1bmRlZmluZWQsXHJcbiAgICAgICAga2V5Q29kZVNvdXRoLCB1bmRlZmluZWQsIGtleUNvZGVXZXN0LCB1bmRlZmluZWQsIGtleUNvZGVVcCwga2V5Q29kZURvd25dO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXREaXJlY3Rpb25Db2RlIChkaXJlY3Rpb24gOiBEaXJlY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gZ2V0RGlyZWN0aW9uQ29kZUJ5SW5kZXgoUm9vbS5ESVJFQ1RJT05TLmluZGV4T2YoZGlyZWN0aW9uKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldERpcmVjdGlvbkNvZGVCeUluZGV4IChpbmRleCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkaXJlY3Rpb25Db2RlQnlJbmRleFtpbmRleF0uZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdmFyIGF2YWlsYWJsZTEgOiBBcnJheTxLZXlDb2RlPiA9IFtdO1xyXG4gICAgZXhwb3J0IHZhciBhdmFpbGFibGUyIDogQXJyYXk8S2V5Q29kZT4gPSBbXTtcclxuICAgIGV4cG9ydCB2YXIgYXZhaWxhYmxlMyA6IEFycmF5PEtleUNvZGU+ID0gW107XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc2V0ICgpIHtcclxuICAgICAgICBhdmFpbGFibGUxID0ga2V5Q29kZXMxLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgICAgICBhdmFpbGFibGUyID0ga2V5Q29kZXMyLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgICAgICBhdmFpbGFibGUzID0ga2V5Q29kZXMzLmdldFZhbHVlKCkuc2xpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2hvd0tleXMgPSBuZXcgU3RvcmVkTWVtb3J5KFwiU2hvd0tleXNcIiwgIUVsZW1lbnRzLmlzTW9iaWxlKTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gYXBwbHlDb2RlIChlbGVtZW50IDogSFRNTEVsZW1lbnQsIGNvZGUgOiBLZXlDb2RlKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZShlbGVtZW50LmRhdGFzZXRbJ3Nob3J0Y3V0J10pO1xyXG4gICAgICAgICAgICBkZWxldGUoZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dGNvZGUnXSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImtleWFibGVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dGNvZGUnXSA9IGNvZGUuZXZDb2RlO1xyXG4gICAgICAgICAgICBpZiAoc2hvd0tleXMuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0WydzaG9ydGN1dCddID0gY29kZS5yZXByZXNlbnRhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJrZXlhYmxlXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RLZXlDb2RlICgpIHtcclxuICAgICAgICBsZXQgY2hvc2VuID0gYXZhaWxhYmxlMS5sZW5ndGggPiAwID8gYXZhaWxhYmxlMSA6XHJcbiAgICAgICAgICAgIGF2YWlsYWJsZTIubGVuZ3RoID4gMCA/IGF2YWlsYWJsZTIgOlxyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNlY29uZEtleUNvZGUgKCkge1xyXG4gICAgICAgIGxldCBjaG9zZW4gPSBhdmFpbGFibGUyLmxlbmd0aCA+IDAgPyBhdmFpbGFibGUyIDpcclxuICAgICAgICAgICAgYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNwbGljZSgwLCAxKVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VGhpcmRLZXlDb2RlICgpIHtcclxuICAgICAgICBsZXQgY2hvc2VuID0gYXZhaWxhYmxlMy5sZW5ndGggPiAwID8gYXZhaWxhYmxlMyA6IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY2hvc2VuICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuLnNwbGljZSgwLCAxKVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIG9mIGEga2V5IHByZXNzLlxyXG4gICAgICogSWYgYWZ0ZXIgdGltZW91dCBzZWNvbmRzIGEga2V5IHdhcyBub3QgcHJlc3NlZCwgdGhlIHByb21pc2UgZmFpbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0TmV4dEtleSAodGltZW91dD8gOiBudW1iZXIpIDogUHJvbWlzZTxLZXlDb2RlPiB7XHJcbiAgICAgICAgbGV0IHRpbWVvdXROdW1iZXI7XHJcbiAgICAgICAgbGV0IHByb21pc2UgPSA8UHJvbWlzZTxLZXlDb2RlPj4gKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcHJvbWlzZVN0YWNrLnB1c2gocmVzb2x2ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGltZW91dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRpbWVvdXROdW1iZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBLZXlIYW5kbGVyLnJlamVjdFByb21pc2UocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0ICogMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0TnVtYmVyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHN0b3BHaXZpbmdOZXh0S2V5IChvcmlnaW5hbFByb21pc2UgOiBQcm9taXNlPEtleUNvZGU+KSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gcHJvbWlzZU9yaWdpbmFsU3RhY2suaW5kZXhPZihvcmlnaW5hbFByb21pc2UpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2VTdGFja1tpbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TYXkudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL1dvcmxkL01hY2hpbmVCZWdpbnMudHNcIiAvPlxyXG5jbGFzcyBTYXlJbWFnZSBpbXBsZW1lbnRzIFByaW50YWJsZUVsZW1lbnQge1xyXG4gICAgcHVibGljIHN0YXRpYyBpbWFnZU5hbWVzIDogQXJyYXk8U2F5SW1hZ2U+ID0gW107XHJcbiAgICBwdWJsaWMgc3RhdGljIGxvYWRUaW1lQ2hlY2sgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc3RhdGljIGltYWdlVmlld2VyIDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW1hZ2VWaWV3ZXJcIik7XHJcbiAgICBwcml2YXRlIGltZ05hbWUgOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ltYWdlRGVmaW5lZCAoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcnVsZXMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsncnVsZXMnXSB8fCBkb2N1bWVudC5zdHlsZVNoZWV0c1tpXVsnY3NzUnVsZXMnXTtcclxuICAgICAgICAgICAgICAgIGZvcih2YXIgeCBpbiBydWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBydWxlc1t4XS5zZWxlY3RvclRleHQgPT0gJ3N0cmluZycgJiYgcnVsZXNbeF0uc2VsZWN0b3JUZXh0ID09IFwiLlwiICsgdGhpcy5pbWdOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDYW4ndCBjaGVjayBmb3IgdW5kZWZpbmVkIGltYWdlcy5cIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGltZ05hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmltZ05hbWUgPSBpbWdOYW1lO1xyXG5cclxuICAgICAgICBpZiAoIVNheUltYWdlLmxvYWRUaW1lQ2hlY2sgJiYgU2F5SW1hZ2UuaW1hZ2VOYW1lcy5pbmRleE9mKHRoaXMpID09IC0xKSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlTmFtZXMucHVzaCh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEltYWdlRWxlbWVudCAoKSA6IEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW1hZ2VEZWZpbmVkKCkpIHtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQodGhpcy5pbWdOYW1lKTtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJjb250ZW50SW1hZ2VcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgaW1nLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiSW1hZ2UgXFxcIlwiICsgdGhpcy5pbWdOYW1lICsgXCJcXFwiIG5vdCBmb3VuZC5cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLnNob3dJblZpZXdlcih0aGlzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoaW1nLCBDb250cm9scy5LZXlIYW5kbGVyLmltYWdlS2V5Q29kZS5nZXRWYWx1ZSgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGltZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJpbnRlZEVsZW1lbnQgKCkge1xyXG4gICAgICAgIHJldHVybiBbdGhpcy5nZXRJbWFnZUVsZW1lbnQoKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkb0xvYWRUaW1lQ2hlY2soKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBTYXlJbWFnZS5pbWFnZU5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IFNheUltYWdlLmltYWdlTmFtZXNbaV07XHJcbiAgICAgICAgICAgIGlmICghaW1hZ2UuaXNJbWFnZURlZmluZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFNldHRpbmdzLmhhcmREZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzRXJyb3IoXCJJbWFnZSBcXFwiXCIgKyBpbWFnZS5pbWdOYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkltYWdlIFxcXCJcIiArIGltYWdlLmltZ05hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgU2F5SW1hZ2UubG9hZFRpbWVDaGVjayA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzaG93SW5WaWV3ZXIgKGltYWdlIDogU2F5SW1hZ2UpIHtcclxuICAgICAgICBpZiAoIShTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID09ICdibG9jaycpKSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlVmlld2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5jbGFzc05hbWUgPSBpbWFnZS5pbWdOYW1lO1xyXG4gICAgICAgICAgICBTYXlJbWFnZS5pbWFnZVZpZXdlci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFNheUltYWdlLmltYWdlVmlld2VyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5tb2R1bGUgTWFjaGluZUJlZ2lucyB7XHJcbiAgICBleHBvcnQgbGV0IEltYWdlTG9hZFRpbWVDaGVjayA9IE1hY2hpbmVCZWdpbnMucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCwgLy8gV2Ugd2FudCB0aGlzIHRvIHByaW50IHRvIHRoZSB0b3Agb2YgdGhlIGNvbnNvbGVcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBmb3IgdW5kZWZpbmVkIGltYWdlc1wiLFxyXG4gICAgICAgIGNvZGUgOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBTYXlJbWFnZS5kb0xvYWRUaW1lQ2hlY2soKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ2FuJ3QgY2hlY2sgZm9yIHVuZGVmaW5lZCBpbWFnZXMuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2F5L09uZU9mLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlNheS9TYXlJbWFnZS50c1wiIC8+XHJcblxyXG5pbnRlcmZhY2UgUHJpbnRhYmxlIHtcclxuICAgIGdldFByaW50ZWROYW1lICgpIDogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJpbnRhYmxlRWxlbWVudCB7XHJcbiAgICBnZXRQcmludGVkRWxlbWVudCAoKSA6IEFycmF5PEVsZW1lbnQ+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgU2F5Tm91biB7XHJcbiAgICBzYXkgOiBTYXk7XHJcbiAgICBub3VuIDogYW55O1xyXG59XHJcblxyXG5jbGFzcyBTYXlhYmxlT2JqZWN0IHt9XHJcblxyXG5jbGFzcyBTYXkge1xyXG4gICAgLy8gVE9ETzogU2VwYXJhdGUgb3duIHNlcXVlbmNlIGZyb20gcHJvY2Vzc2luZyBxdWV1ZS4gVGhpcyB3YXkgYSBTYXkgd2l0aCBmdW5jdGlvbnMvb3RoZXIgc2F5cyBjYW4gYmUgcmV1dGlsaXplZCB3aXRoIGZyZXNoIHZhbHVlcy5cclxuICAgIHB1YmxpYyBzZXF1ZW5jZSA6IEFycmF5IDxPYmplY3Q+ID0gW107XHJcbiAgICBwdWJsaWMgc2tpcGJyZWFrcyA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIExJTkVfQlJFQUsgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBQQVJBR1JBUEhfQlJFQUsgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBSVU5fUEFSQUdSQVBIIDogT2JqZWN0ID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgUlVOX1BBUkFHUkFQSF9PRkYgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDRU5URVJFRCA6IE9iamVjdCA9IG5ldyBTYXlhYmxlT2JqZWN0KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIGIgOiBPYmplY3QgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBET19QQVJBR1JBUEhfQlJFQUsgPSBuZXcgU2F5YWJsZU9iamVjdCgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBET19MSU5FX0JSRUFLID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ09DSyA9IG5ldyBTYXlhYmxlT2JqZWN0KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBVU1NZID0gbmV3IFNheWFibGVPYmplY3QoKTtcclxuXHJcbiAgICBwcml2YXRlIGNlbnRlcmVkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoLi4ub2Jqcykge1xyXG4gICAgICAgIHRoaXMuYWRkKC4uLm9ianMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGQgKC4uLm9ianMgOiBBcnJheTxTYXkgfCBPbmVPZiB8IE9iamVjdCB8IFByaW50YWJsZSB8IHN0cmluZyB8IG51bWJlciB8IFN0cmluZyB8ICgoc2F5IDogU2F5KSA9PiBzdHJpbmcpPikge1xyXG4gICAgICAgIHRoaXMuc2VxdWVuY2UucHVzaCguLi5vYmpzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlICguLi5vYmpzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuc2VxdWVuY2UuaW5kZXhPZihvYmpzW2ldKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNFbXB0eSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVuY2UubGVuZ3RoIDwgMTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGFyYWdyYXBocyA6IEFycmF5PEFycmF5PEVsZW1lbnQgfCBUZXh0Pj47XHJcbiAgICBwdWJsaWMgY3VycmVudFBhcmFncmFwaCA6IEFycmF5PEVsZW1lbnQgfCBUZXh0PjtcclxuICAgIHB1YmxpYyBzZXF1ZW5jZVJ1bm5lciA6IG51bWJlcjtcclxuXHJcbiAgICAvLyBUT0RPOiBDcmVhdGUgYSBzaW5nbGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBlbGVtZW50IG9mIGFueXRoaW5nXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGV4dE9mIChpbmRleCA6IG51bWJlciwgc2VxIDogYW55KSA6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Rm9yKGluZGV4LCBzZXEpO1xyXG5cclxuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHNbaV0gIT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGl2LmlubmVyVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZG9MaW5lQnJlYWsgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXJhZ3JhcGgubGVuZ3RoID4gMCAmJiAhdGhpcy5za2lwYnJlYWtzKSB7XHJcbiAgICAgICAgICAgIGxldCBiciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcclxuICAgICAgICAgICAgYnIuY2xhc3NMaXN0LmFkZChcImxpbmVicmVha1wiKTtcclxuICAgICAgICAgICAgbGV0IHRpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgICAgIHRpLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0SW5kZW50ZXJcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcmFncmFwaC5wdXNoKGJyLCB0aSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkb1BhcmFncmFwaEJyZWFrICgpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA+IDAgJiYgIXRoaXMuc2tpcGJyZWFrcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHMucHVzaCh0aGlzLmN1cnJlbnRQYXJhZ3JhcGgpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXJhZ3JhcGggPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFBhcmFncmFwaHMgKCkgOiBQcm9taXNlPEFycmF5PEFycmF5PEVsZW1lbnR8VGV4dD4+PiB7XHJcbiAgICAgICAgdGhpcy5wYXJhZ3JhcGhzID0gW107XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoID0gW107XHJcbiAgICAgICAgdGhpcy5za2lwYnJlYWtzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGZvciAodGhpcy5zZXF1ZW5jZVJ1bm5lciA9IDA7IHRoaXMuc2VxdWVuY2VSdW5uZXIgPCB0aGlzLnNlcXVlbmNlLmxlbmd0aDsgdGhpcy5zZXF1ZW5jZVJ1bm5lcisrKSB7XHJcbiAgICAgICAgICAgIGxldCBzZXEgPSB0aGlzLnNlcXVlbmNlW3RoaXMuc2VxdWVuY2VSdW5uZXJdO1xyXG4gICAgICAgICAgICBpZiAoc2VxIGluc3RhbmNlb2YgT25lT2YpIHtcclxuICAgICAgICAgICAgICAgIHNlcSA9IHNlcS5nZXRPbmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlcSA9PSBTYXkuQ0VOVEVSRUQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2VudGVyZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5iKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYm9sZE9iamVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlcXVlbmNlUnVubmVyICsgMTsgaSA8IHRoaXMuc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FuZGlkYXRlID0gdGhpcy5zZXF1ZW5jZVJ1bm5lcltpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IFNheS5iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2xkT2JqZWN0cy5wdXNoKHRoaXMuc2VxdWVuY2Uuc3BsaWNlKGksIDEpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9sZE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBib2xkID0gbmV3IFNheUJvbGQoLi4uYm9sZE9iamVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKHRoaXMuc2VxdWVuY2VSdW5uZXIgKyAxLCAwLCBib2xkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEgPT0gU2F5LkNPQ0spIHtcclxuICAgICAgICAgICAgICAgIGlmIChIdW1hbm9pZFBlbmlzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2NrID0gSHVtYW5vaWRQZW5pcy5nZXRTeW5vbnltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoLnB1c2goZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29jaykpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKHNlcSA9PSBTYXkuUFVTU1kpIHtcclxuICAgICAgICAgICAgICAgIGlmIChIdW1hbm9pZFZhZ2luYSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFnaW5hID0gSHVtYW5vaWRWYWdpbmEuZ2V0U3lub255bSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhcmFncmFwaC5wdXNoKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhZ2luYSkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5MSU5FX0JSRUFLKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvTGluZUJyZWFrKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VxID09IFNheS5QQVJBR1JBUEhfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG9QYXJhZ3JhcGhCcmVhaygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcSA9PSBTYXkuUlVOX1BBUkFHUkFQSCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwYnJlYWtzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEgPT0gU2F5LlJVTl9QQVJBR1JBUEhfT0ZGKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBicmVha3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VxID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZPYmogPSAoPChzOiBTYXkpID0+IGFueT4gc2VxKSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZPYmopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGZPYmoubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZS5zcGxpY2UodGhpcy5zZXF1ZW5jZVJ1bm5lciArIDEsIDAsIGZPYmpba10pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZk9iaiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcXVlbmNlLnNwbGljZSh0aGlzLnNlcXVlbmNlUnVubmVyICsgMSwgMCwgZk9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlcXVlbmNlLnNwbGljZSh0aGlzLnNlcXVlbmNlUnVubmVyLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VSdW5uZXItLTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZXEuY29uc3RydWN0b3IgPT0gdGhpcy5jb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9ICg8U2F5PiBzZXEpLnNlcXVlbmNlLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZS5zcGxpY2UodGhpcy5zZXF1ZW5jZVJ1bm5lciArIDEsIDAsICg8U2F5PiBzZXEpLnNlcXVlbmNlW2tdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2Uuc3BsaWNlKHRoaXMuc2VxdWVuY2VSdW5uZXIsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZVJ1bm5lci0tO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudEZvcih0aGlzLnNlcXVlbmNlUnVubmVyLCBzZXEpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXSA9PT0gU2F5LkRPX0xJTkVfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0xpbmVCcmVhaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0gPT09IFNheS5ET19QQVJBR1JBUEhfQlJFQUspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb1BhcmFncmFwaEJyZWFrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFyYWdyYXBoLnB1c2goZWxlbWVudHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGxpbmUgYnJlYWsgKyB0ZXh0IGluZGVudGVyIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGluIHRoZSBzYXlcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhZ3JhcGhzLnB1c2godGhpcy5jdXJyZW50UGFyYWdyYXBoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb3JkIEhhdmUgbWVyY3ksIEkgd2lzaCB0byBuZXZlciBoYXZlIHRvIGRlYnVnIHRoaXMgcGllY2Ugb2YgZ29kLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XHJcbiAgICAgKiBAcGFyYW0ge1NheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgKChzYXk6IFNheSkgPT4gc3RyaW5nKSB8ICgoc2F5OiBTYXkpID0+IFByb21pc2U8c3RyaW5nPikgfCBFbGVtZW50IHwgVGV4dH0gb2JqXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RWxlbWVudEZvciAoaW5kZXggOiBudW1iZXIsIG9iaiA6IFNheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgU3RyaW5nIHwgKChzYXkgOiBTYXkpID0+IHN0cmluZykgfCAoKHNheSA6IFNheSkgPT4gUHJvbWlzZTxzdHJpbmc+KSB8IEVsZW1lbnQgfCBUZXh0KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudHxUZXh0Pj4ge1xyXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IGF3YWl0IG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT0gXCJzdHJpbmdcIiB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSg8c3RyaW5nPiBvYmopXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT0gXCJudW1iZXJcIiB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgocGFyc2VGbG9hdCgoPG51bWJlcj4gb2JqKS50b0ZpeGVkKDIpKS8xKS50b1N0cmluZygpKV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRGb3IoLTEsICg8YW55PiBvYmopKHRoaXMpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2F5SW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtvYmouZ2V0SW1hZ2VFbGVtZW50KCldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2F5TGVmdFJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgb2JqLmdldFB1cmVFbGVtZW50cygpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNheSkge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBhd2FpdCBvYmouZ2V0UHVyZUVsZW1lbnRzKHRoaXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUHJvcGVyRWxlbWVudChvYmopKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbPEVsZW1lbnQ+IG9ial07XHJcbiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgbGV0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5wcmludE5hbWUob2JqKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXk/IDogU2F5KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuICAgICAgICByZXR1cm4gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2VudGVyZWQgKGJvb2wgOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jZW50ZXJlZCA9IGJvb2w7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEhUTUwgKHRhZ05hbWUgOiBzdHJpbmcsIGNsYXNzTGlzdCA6IEFycmF5PHN0cmluZz4sIHNpbmdsZVBhcmFncmFwaD8gOiBib29sZWFuKSA6IFByb21pc2U8QXJyYXk8SFRNTEVsZW1lbnQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuXHJcbiAgICAgICAgLy8gUmVkdWNlIHRvIHNpbmdsZSBwYXJhZ3JhcGhcclxuICAgICAgICBpZiAoc2luZ2xlUGFyYWdyYXBoID09IHRydWUgJiYgcGFyYWdyYXBocy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHBhcmFncmFwaHMgPSBbQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgcGFyYWdyYXBocyldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gW107XHJcblxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgcGFyYWdyYXBoID0gcGFyYWdyYXBoc1tpXTsgcGFyYWdyYXBoICE9IHVuZGVmaW5lZDsgcGFyYWdyYXBoID0gcGFyYWdyYXBoc1srK2ldKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSA8SFRNTEVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc0xpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3NMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIGVsZSA9IHBhcmFncmFwaFtrXTsgZWxlIT0gdW5kZWZpbmVkOyBlbGUgPSBwYXJhZ3JhcGhbKytrXSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudHMucHVzaChwYXJlbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2VudGVyZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwiY2VudGVyZWRcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbGVtZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SFRNTENvbnRlbnQgKCkgOiBQcm9taXNlPEFycmF5PEhUTUxFbGVtZW50Pj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Byb3BlckVsZW1lbnQgKG8pIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgdHlwZW9mIE5vZGUgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgTm9kZSA6XHJcbiAgICAgICAgICAgICAgICBvICYmIHR5cGVvZiBvID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvLm5vZGVUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBvLm5vZGVOYW1lPT09XCJzdHJpbmdcIlxyXG4gICAgICAgICkgfHwgKFxyXG4gICAgICAgICAgICB0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwib2JqZWN0XCIgPyBvIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgOiAvL0RPTTJcclxuICAgICAgICAgICAgICAgIG8gJiYgdHlwZW9mIG8gPT09IFwib2JqZWN0XCIgJiYgbyAhPT0gbnVsbCAmJiBvLm5vZGVUeXBlID09PSAxICYmIHR5cGVvZiBvLm5vZGVOYW1lPT09XCJzdHJpbmdcIlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBiZWZvcmVQcmludGluZyA9IG5ldyBSdWxlYm9vazxhbnk+KFwiQmVmb3JlIHByaW50aW5nIHRoZSBuYW1lIG9mIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcHJpbnRpbmcgPSBuZXcgUnVsZWJvb2s8YW55PihcIlByaW50aW5nIHRoZSBuYW1lIG9mIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgYWZ0ZXJQcmludGluZyA9IG5ldyBSdWxlYm9vazxhbnk+KFwiQWZ0ZXIgcHJpbnRpbmcgdGhlIG5hbWUgb2Ygc29tZXRoaW5nXCIpO1xyXG5cclxuICAgIHB1YmxpYyBjdXJyZW50Tm91biA6IGFueTtcclxuICAgIHB1YmxpYyBjdXJyZW50Tm91bkVsZW1lbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+O1xyXG5cclxuICAgIHB1YmxpYyBhc3luYyBwcmludE5hbWUgKHRoaW5nIDogYW55KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm91biA9IHRoaW5nO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vdW5FbGVtZW50cyA9IFtdO1xyXG4gICAgICAgIGxldCBiZWZvcmUgPSBTYXkuYmVmb3JlUHJpbnRpbmcuZXhlY3V0ZSh7bm91biA6IHRoaXN9KTtcclxuICAgICAgICBhd2FpdCBiZWZvcmU7XHJcbiAgICAgICAgbGV0IHByaW50ID0gU2F5LnByaW50aW5nLmV4ZWN1dGUoe25vdW4gOiB0aGlzfSk7XHJcbiAgICAgICAgYXdhaXQgcHJpbnQ7XHJcbiAgICAgICAgbGV0IGFmdGVyID0gU2F5LmFmdGVyUHJpbnRpbmcuZXhlY3V0ZSh7bm91biA6IHRoaXN9KTtcclxuICAgICAgICBhd2FpdCBhZnRlcjtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Tm91bkVsZW1lbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaGlzSGVyc0l0cyAodGFyZ2V0IDogVGhpbmcsIHN0YXJ0T2ZTZW50ZW5jZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTYXlIaXNIZXJzSXRzKHRhcmdldCk7XHJcbiAgICAgICAgLy8gbGV0IHJlc3VsdCA6IFN0cmluZztcclxuICAgICAgICAvLyBpZiAodGFyZ2V0ID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgLy8gICAgIHJlc3VsdCA9IFwieW91clwiO1xyXG4gICAgICAgIC8vIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGVyc29uKSB7XHJcbiAgICAgICAgLy8gICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hldGhlciB0YXJnZXQgaXMgbWFsZSBvciBmZW1hbGVcclxuICAgICAgICAvLyAgICAgcmVzdWx0ID0gXCJoaXNcIjtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICByZXN1bHQgPSBcIml0c1wiO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoc3RhcnRPZlNlbnRlbmNlID09IHRydWUpIHtcclxuICAgICAgICAvLyAgICAgcmVzdWx0ID0gcmVzdWx0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdWx0LnN1YnN0cigxLCByZXN1bHQubGVuZ3RoIC0xKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuU2F5LnByaW50aW5nLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUHJpbnRpbmcgdGhlIG5hbWUgb2YgYSBQcmludGFibGUgRWxlbWVudFwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPGFueT4pID0+IHtcclxuICAgICAgICBsZXQgc2F5ID0gPFNheT4gcnVsZWJvb2subm91bjtcclxuICAgICAgICBpZiAoKDxhbnk+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2F5LmN1cnJlbnROb3VuRWxlbWVudHMucHVzaCguLi4oPFByaW50YWJsZUVsZW1lbnQ+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZEVsZW1lbnQoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBvbmx5IHdhbnQgdG8gcHJpbnQgc29tZXRoaW5nIG9uY2UsIHNvIHJldHVybiB0cnVlIHRvIHN0b3Agb3RoZXJzIGZyb20gcnVubmluZ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuU2F5LnByaW50aW5nLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUHJpbnRpbmcgdGhlIG5hbWUgb2YgYSBQcmludGFibGVcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPVyxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiB7XHJcbiAgICAgICAgbGV0IHNheSA9IDxTYXk+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgaWYgKCg8YW55PiBzYXkuY3VycmVudE5vdW4pLmdldFByaW50ZWROYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZ0VsZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxyXG4gICAgICAgICAgICAgICAgKDxQcmludGFibGU+IHNheS5jdXJyZW50Tm91bikuZ2V0UHJpbnRlZE5hbWUoKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzYXkuY3VycmVudE5vdW5FbGVtZW50cy5wdXNoKHRoaW5nRWxlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIG9ubHkgd2FudCB0byBwcmludCBzb21ldGhpbmcgb25jZSwgc28gcmV0dXJuIHRydWUgdG8gc3RvcCBvdGhlcnMgZnJvbSBydW5uaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSk7XHJcblxyXG5TYXkucHJpbnRpbmcuYWRkUnVsZShuZXcgUnVsZSh7XHJcbiAgICBuYW1lIDogXCJQcmludGluZyB0aGUgbmFtZSBvZiBhbiB1bmtub3duIG9iamVjdFwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxhbnk+KSA9PiB7XHJcbiAgICAgICAgbGV0IHNheSA9IDxTYXk+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgaWYgKCg8YW55PiBzYXkuY3VycmVudE5vdW4pLmdldFByaW50ZWROYW1lKSB7XHJcbiAgICAgICAgICAgIHNheS5jdXJyZW50Tm91bkVsZW1lbnRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoKDxPYmplY3Q+IHNheS5jdXJyZW50Tm91bikudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBvbmx5IHdhbnQgdG8gcHJpbnQgc29tZXRoaW5nIG9uY2UsIHNvIHJldHVybiB0cnVlIHRvIHN0b3Agb3RoZXJzIGZyb20gcnVubmluZ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSkpO1xyXG5cclxuLy8gdmFyIG1zZyA9IG5ldyBTYXkgKFwiSGVsbG8hIFdlbGNvbWUgdG8gVGhlIE9iZWxpc2shIFRoaXMgaXMgYSBnYW1lIHdpdGggXCIsIGpvaG5UaGVPZ3JlLCBcIiBzbyB5b3UgbXVzdCBiZSBjYXJlZnVsIVwiKTtcclxuLy9cclxuLy8gdmFyIG90aGVyU2F5ID0gbmV3IFNheSAobXNnLCBcIldpbGwgaGF2ZSB0byBsZWFybiBob3cgdG8gaGFuZGxlIGRvdHMuXCIpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9DaGFyYWN0ZXJPcmlnaW4udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkudHNcIiAvPlxyXG5tb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgZXhwb3J0IGxldCBGYWxzZWx5QWNjdXNlZCA9IG5ldyBDaGFyYWN0ZXJPcmlnaW4oXCJGYWxzZWx5IEFjY3VzZWRcIik7XHJcbiAgICBGYWxzZWx5QWNjdXNlZC5uYW1lID0gXCJGYWxzZWx5IEFjY3VzZWRcIjtcclxuICAgIEZhbHNlbHlBY2N1c2VkLmRlc2NyaXB0aW9uPSBuZXcgU2F5KFxyXG4gICAgICAgIFwiWW91IG1hZGUgc29tZSBhbGxlZ2F0aW9ucyBhZ2FpbnN0IGEgcG93ZXJmdWwgbWFuIGluIHlvdXIgdmlsbGFnZS4gV2hldGhlciB0aG9zZSB3ZXJlIHRydWUgb3Igbm90IGRpZG4ndCBtYXR0ZXIsIGhlIHdhcyBtb3N0IGRpc3BsZWFzZWQgd2l0aCB5b3VyIGFjdGlvbnMgYW5kIGRpZCBhbGwgaGUgY291bGQgdG8gZW5kIHlvdXIgbGlmZSBhcyB5b3Uga25ldyBpdC4gSnVzdCBhcyB5b3Ugd2VyZSBhYm91dCB0byBiZSBleGVjdXRlZCBmb3IgeW91ciBpbmV4aXN0ZW50IGNyaW1lcywgdGhlIG1hbiBhc2tlZCBmb3IgbWVyY3kuIFlvdSB0aG91Z2h0IGhlIHdhc24ndCB3aWxsaW5nIHRvIGdvIHRoaXMgZmFyIHdpdGggaGlzIGxpZXMsIG9ubHkgdG8gaGF2ZSB5b3VyIGhvcGVzIGNydXNoZWQgd2hlbiB5b3Ugbm90aWNlZCBhIHNtaXJrIGluIGhpcyBldmlsIGZhY2UuXFxuXCIsXHJcbiAgICAgICAgU2F5LlBBUkFHUkFQSF9CUkVBSyxcclxuICAgICAgICBcIlRoZSBtYW4gY2xhaW1lZCBoZSB3YW50ZWQgdG8gZm9yZ2l2ZSB5b3UsIGJ1dCB3b3VsZCBuZWVkIHByb29mIG9mIHlvdXIgcmVncmV0LiBZb3UgcmVjZWl2ZWQgYW4gYWx0ZXJuYXRpdmUgc2VudGVuY2U6IGdvIHRvIHRoZSBUb3dlciBhbmQgZmluZCBhIHdheSB0byBkZXN0cm95IGl0LiBTdXJlbHkgYW4gaW1wb3NzaWJsZSB0YXNrLiBTdXJlbHkganVzdCBhbm90aGVyIGRlYXRoIHNlbnRlbmNlLi4uIG9yIHdvcnNlLiBCdXQgaXQncyBub3QgbGlrZSB5b3UgaGF2ZSBhIGNob2ljZSBpbiB0aGUgbWF0dGVyLlwiXHJcbiAgICApO1xyXG4gICAgRmFsc2VseUFjY3VzZWQuYm9udXNTdGF0cyA9IFwiVGhpcyBvcmlnaW4gY29uZmVycyBubyBib251c2VzLCBidXQgeW91IGhhdmUgY29tcGxldGUgZnJlZWRvbSB3aXRoIHlvdXIgcGVya3MuXCI7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUGVyay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS50c1wiIC8+XHJcbm1vZHVsZSBDaGFyYWN0ZXJDcmVhdGlvbiB7XHJcbiAgICBleHBvcnQgbGV0IEhvcm55VmlyZ2luID0gbmV3IFBlcmsoXCJIb3JueSBWaXJnaW5cIik7XHJcbiAgICBIb3JueVZpcmdpbi5kZXNjcmlwdGlvbiA9IG5ldyBTYXkoXCJXaGljaGV2ZXIgbGlmZSB5b3UgbGVkIHVwIHRvIHRoaXMgcG9pbnQgbmV2ZXIgYWxsb3dlZCB5b3UgdG8gZXhwbG9yZSB5b3VyIHNleHVhbGl0eS4gQXMgYSByZXN1bHQsIHlvdSdyZSBib3RoIHZpcmdpbiBBTkQgZXh0cmVtZWx5IGhvcm55LiBUaGlzIHBlcmsgbWFrZXMgaXQgc28gdGhhdCB0aGUgV29ybGQgRGVwcmF2aXR5IGFyb3VuZCB0aGUgVG93ZXIgaXMgaW5pdGlhbGx5IGhpZ2hlciBhbmQgcmlzZXMgZmFzdGVyLCBob3dldmVyIHlvdSBhcmUgbm90IGFzIGFmZmVjdGVkIGJ5IHRoaXMgcmlzaW5nIERlcHJhdml0eSBhcm91bmQgeW91LlwiLFxyXG4gICAgICAgIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiVGhpcyBwZXJrIGlzIG1hbmRhdG9yeSBmb3IgQ2hhbXBpb25zIGFuZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG1vc3Qgc2V4LXJlbGF0ZWQgcGVya3MuXCIpO1xyXG5cclxuICAgIEhvcm55VmlyZ2luLmZvcmNlZFN0YXR1cyA9IChob3JueVZpcmdpbiA6IFBlcmspID0+IHtcclxuICAgICAgICBpZiAoQ2hhcmFjdGVyQ3JlYXRpb24uZ2V0T3JpZ2luKCkgPT0gQ2hhcmFjdGVyQ3JlYXRpb24uQ2hhbXBpb25PcmlnaW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChTbHV0LmlzRW5hYmxlZCh0cnVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIGV4cG9ydCBsZXQgU2x1dCA9IG5ldyBQZXJrKFwiVW5yZWRlZW1hYmxlIFNsdXRcIik7XHJcbiAgICBTbHV0LmRlc2NyaXB0aW9uID0gbmV3IFNheShcIlNpbXBseSBwdXQ6IHlvdSByZWFsbHkgbGlrZSBzZXguIFlvdXIgRGVwcmF2aXR5IHN0YXJ0cyBvZmYgaGlnaGVyIGFuZCByaXNlcyBldmVuIGZhc3RlciwgYWxzbyBhZmZlY3RpbmcgV29ybGQgRGVwcmF2aXR5LiBIb3dldmVyLCB5b3UgbGV2ZWwgdXAgc2V4LXJlbGF0ZWQgU2tpbGxzIGZhc3Rlci5cIixcclxuICAgICAgICBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIlRoaXMgcGVyayBpcyBub3QgY29tcGF0aWJsZSB3aXRoIFwiLCBIb3JueVZpcmdpbi5uYW1lLCBcIi5cIik7XHJcbiAgICBTbHV0LmZvcmNlZFN0YXR1cyA9ICgpID0+IHtcclxuICAgICAgICBpZiAoSG9ybnlWaXJnaW4uaXNFbmFibGVkKHRydWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcblxyXG4gICAgZXhwb3J0IGxldCBTZW5zaXRpdmVIb2xlcyA9IG5ldyBQZXJrKFwiU2Vuc2l0aXZlIEhvbGVzXCIpO1xyXG4gICAgU2Vuc2l0aXZlSG9sZXMuZGVzY3JpcHRpb24gPSBcIllvdSBhcmUgdmVyeSBzZW5zaXRpdmUgdG8gYW55IGtpbmQgb2YgcmVjZXB0aXZlIHBlbmV0cmF0aW9uLiBZb3UgaGF2ZSBhIGhhcmRlciB0aW1lIGVzY2FwaW5nIGdyYXBwbGVzIHdoaWxlIGJlaW5nIHBlbmV0cmF0ZWQgYW5kIGFuIGVhc2llciB0aW1lIG9yZ2FzbWluZyBmcm9tIGl0LCBidXQgZ2V0dGluZyBhcm91c2VkIGZhc3RlciBhbHNvIG1lYW5zIHlvdSB0YWtlIGxlc3MgZGFtYWdlIGZyb20gaXQuXCI7XHJcblxyXG5cclxuXHJcbn0iLCIvKipcclxuICogQ29udGVudCB0eXBlcyBuZWVkIHRvIGJlIGFsbG93ZWQvZm9yYmlkZGVuIGF0IHRoZSBnbG9iYWwgbGV2ZWwsIHJhdGhlciB0aGFuIGEgc2F2ZSBsZXZlbC5cclxuICogVGhleSBzaG91bGQgYmUgYWJsZSB0byBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lLlxyXG4gKiBUaGV5IHNob3VsZCBiZSBhcyBsaXR0bGUgdmFndWUgYXMgaXMgcmVhc29uYWJsZS5cclxuICovXHJcbm1vZHVsZSBDb250ZW50SGFuZGxlciB7XHJcbiAgICBsZXQgY29udGVudEhhc2ggOiB7W2lkIDogc3RyaW5nXSA6IENvbnRlbnRUeXBlfSA9IHt9O1xyXG4gICAgbGV0IGNvbnRlbnRBcnJheSA6IEFycmF5PENvbnRlbnRUeXBlPiA9IFtdO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbnRlbnRUeXBlICh0eXBlIDogQ29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoY29udGVudEhhc2hbdHlwZS5nZXRJZCgpXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb250ZW50SGFuZGxlcn0gQ2FuJ3QgcmVnaXN0ZXIgdGhlIGNvbnRlbnQuXCIsIHR5cGUsIFwiT2xkOlwiLCBjb250ZW50SGFzaFt0eXBlLmdldElkKCldKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRIYXNoW3R5cGUuZ2V0SWQoKV0gPSB0eXBlO1xyXG4gICAgICAgICAgICBjb250ZW50QXJyYXkucHVzaCh0eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRBcnJheS5zbGljZSgpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlN0b3JlZE1lbW9yeS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Nb2R1bGVzL0NvbnRlbnRIYW5kbGVyLnRzXCIgLz5cclxuaW50ZXJmYWNlIENvbnRlbnRUeXBlT3B0aW9ucyB7XHJcbiAgICBpZCA6IHN0cmluZztcclxuICAgIGRlZmF1bHRWYWx1ZSA6IGJvb2xlYW47XHJcbiAgICBkZXNjcmlwdGlvbiA6IFNheSB8IHN0cmluZztcclxuICAgIGN1cnJlbnRWYWx1ZURlc2NyaXB0aW9uPyA6IChjIDogQ29udGVudFR5cGUpID0+IFNheSB8IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZSBzcGFyaW5nbHkuIENvbnRlbnQtVHlwZXMgdGhhdCBzaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBjaGFuZ2UgYXJlIHRob3NlIHRoYXQgZWl0aGVyOlxyXG4gICAgICogLSBGdW5kYW1lbnRhbCB0byB0aGUgZ2FtZSBpbiBzb21lIHdheS4gTW9zdCBvZiB0aGVzZSB3aWxsIG9ubHkgcmVtYWluIHN0dWNrIHVudGlsIHRoZSBnYW1lIGhhcyBlbm91Z2ggY29udGVudCB0byBtYWtlIGRvIHdpdGhvdXQgaXQuXHJcbiAgICAgKiAtIFNvbWV0aGluZyB0aGF0J3Mgb25seSBhIG5lZ2F0aXZlIHNpZ25hbDogc2lnbmFsaXppbmcgdGhhdCB0aGlzIGNvbnRlbnQgd2lsbCBub3QgYXBwZWFyIGR1cmluZyBkZXZlbG9wbWVudC9nYW1lcGxheSBhdCBhbGwsIGxldHRpbmcgcGxheWVycyBrbm93IGl0IGlzbid0IGF2YWlsYWJsZSBhbmQgcHJvYmFibHkgd29uJ3QgYmUuXHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWFibGU/IDogYm9vbGVhbjtcclxufVxyXG5cclxuY2xhc3MgQ29udGVudFR5cGUgZXh0ZW5kcyBTdG9yZWRNZW1vcnk8Ym9vbGVhbj4ge1xyXG4gICAgcHJpdmF0ZSBkZXNjcmlwdGlvbiA6IFNheTtcclxuICAgIHByaXZhdGUgdmFsdWVEZXNjcmlwdGlvbiA6IChjIDogQ29udGVudFR5cGUpID0+IFNheSB8IHN0cmluZyA9ICgpID0+IHsgcmV0dXJuIG5ldyBTYXkgKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0VmFsdWUoKSkpOyB9O1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2VhYmxlIDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5UHJlZml4ID0gXCJjdF9cIjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnMgOiBDb250ZW50VHlwZU9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihDb250ZW50VHlwZS5tZW1vcnlQcmVmaXggKyBvcHRpb25zLmlkLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uIGluc3RhbmNlb2YgU2F5ID8gb3B0aW9ucy5kZXNjcmlwdGlvbiA6IG5ldyBTYXkob3B0aW9ucy5kZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMudmFsdWVEZXNjcmlwdGlvbiA9IG9wdGlvbnMuY3VycmVudFZhbHVlRGVzY3JpcHRpb24gPT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZURlc2NyaXB0aW9uIDogb3B0aW9ucy5jdXJyZW50VmFsdWVEZXNjcmlwdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhbmdlYWJsZSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlVmFsdWUob3B0aW9ucy5kZWZhdWx0VmFsdWUpOyAvLyBwcmV2ZW50IGxvY2FsU3RvcmFnZSBhbHRlcmF0aW9ucyBmcm9tIGFmZmVjdGluZyBzb21ldGhpbmcgdGhhdCBjYW4ndCBiZSBjaGFuZ2VkXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ29udGVudEhhbmRsZXIucmVnaXN0ZXJDb250ZW50VHlwZSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRWYWx1ZURlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmFsdWVEZXNjcmlwdGlvbih0aGlzKTtcclxuICAgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIFNheSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGVzYztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNheShkZXNjKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvZ2dsZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlVmFsdWUoIXRoaXMuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0FsbG93ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIE1NID0gbmV3IENvbnRlbnRUeXBlKHtcclxuICAgICAgICBjaGFuZ2VhYmxlIDogZmFsc2UsIC8vIFRoZXJlIHdpbGwgYmUgdG9vIGxpdHRsZSBjb250ZW50IGF0IGZpcnN0IGZvciB1cyB0byBibG9jayBwYXJ0IG9mIGl0IGZvciBubyBnb29kIHJlYXNvbiwgbWF5YmUgYXQgc29tZSBwb2ludFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJIb21vc2V4dWFsIChNL00pIHNleHVhbCBldmVudHNcIixcclxuICAgICAgICBpZCA6IFwiTU1cIixcclxuICAgICAgICBkZWZhdWx0VmFsdWUgOiB0cnVlXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBGRiA9IG5ldyBDb250ZW50VHlwZSh7XHJcbiAgICAgICAgY2hhbmdlYWJsZSA6IGZhbHNlLCAvLyBUaGVyZSB3aWxsIGJlIHRvbyBsaXR0bGUgY29udGVudCBhdCBmaXJzdCBmb3IgdXMgdG8gYmxvY2sgcGFydCBvZiBpdCBmb3Igbm8gZ29vZCByZWFzb24sIG1heWJlIGF0IHNvbWUgcG9pbnRcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFwiSG9tb3NleHVhbCAoRi9GKSBzZXh1YWwgZXZlbnRzXCIsXHJcbiAgICAgICAgaWQgOiBcIkZGXCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTUYgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiBmYWxzZSwgLy8gVGhlcmUgd2lsbCBiZSB0b28gbGl0dGxlIGNvbnRlbnQgYXQgZmlyc3QgZm9yIHVzIHRvIGJsb2NrIHBhcnQgb2YgaXQgZm9yIG5vIGdvb2QgcmVhc29uLCBtYXliZSBhdCBzb21lIHBvaW50XHJcbiAgICAgICAgZGVzY3JpcHRpb24gOiBcIkhldGVyb3NleHVhbCAoTS9GKSBzZXh1YWwgZXZlbnRzXCIsXHJcbiAgICAgICAgaWQgOiBcIk1GXCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQmVhc3QgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiB0cnVlLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJTZXh1YWwgZXZlbnRzIHdpdGggZWl0aGVyIG1vbnN0ZXJzIG9yIG1hZ2ljYWwgYmVhc3RzLiBNTS9NRi9GRiB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzIG9uZSBpZiBibG9ja2VkLiBTdWZmaWNpZW50bHkgaHVtYW4gY3JlYXR1cmVzIGRvIG5vdCBnZXQgY291bnRlZCBpbnRvIHRoaXMuXCIsXHJcbiAgICAgICAgaWQgOiBcIkJlYXN0XCIsXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlIDogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU2NhdCA9IG5ldyBDb250ZW50VHlwZSh7XHJcbiAgICAgICAgY2hhbmdlYWJsZSA6IGZhbHNlLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uIDogXCJTY2F0b2xvZ2ljIHNleHVhbCBldmVudHNcIixcclxuICAgICAgICBpZCA6IFwiU2NhdFwiLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA6IGZhbHNlIC8vIFRoZXJlIGlzIG5vIGludGVudGlvbiBvZiBldmVyIGFkZGluZyB0aGVzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBQZWUgPSBuZXcgQ29udGVudFR5cGUoe1xyXG4gICAgICAgIGNoYW5nZWFibGUgOiBmYWxzZSxcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFwiU2V4dWFsIGV2ZW50cyB3aXRoIHVyaW5lXCIsXHJcbiAgICAgICAgaWQgOiBcIlVyb3BoaWxpYVwiLFxyXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA6IGZhbHNlIC8vIFRoZXJlIGlzIG5vIGludGVudGlvbiBvZiBldmVyIGFkZGluZyB0aGVzZVxyXG4gICAgfSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQ29udHJvbHMvTW9kdWxlcy9LZXlIYW5kbGVyLnRzXCIgLz5cclxubW9kdWxlIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlciB7XHJcbiAgICBleHBvcnQgdmFyIGN1cnJlbnRUdXJuVGFiID0gPEhUTUxFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImN1cnJlbnRUdXJuVGFiXCIpO1xyXG4gICAgZXhwb3J0IHZhciBjdXJyZW50VHVybiA9IDxIVE1MRWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50VHVyblwiKTtcclxuICAgIGV4cG9ydCB2YXIgdHVybkhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICBleHBvcnQgdmFyIGxhc3RSZWFkT2Zmc2V0ID0gY3VycmVudFR1cm5UYWIuY2xpZW50SGVpZ2h0IC8gMjtcclxuICAgIHR1cm5Ici5jbGFzc0xpc3QuYWRkKFwidHVyblN0YXJ0XCIpO1xyXG4gICAgdHVybkhyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU3RhcnQgb2YgVHVyblwiKSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBcIlN0YXJ0IG9mIFR1cm5cIiBlbGVtZW50cyBhbmQgc2Nyb2xscyB0aGUgY29udGVudCBwYW5lbCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5ldyB0dXJuLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc3RhcnRUdXJuIChhY3Rpb24/IDogQWN0aW9uKSB7XHJcblxyXG4gICAgICAgIGxldCBvbGRDb250ZW50ID0gY3VycmVudFR1cm5UYWIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNvbnRlbnRcIik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRDb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG9sZENvbnRlbnRbaV0uY2xhc3NMaXN0LmFkZChcImNvbnRlbnRPbGRcIik7XHJcbiAgICAgICAgICAgIG9sZENvbnRlbnRbaV0uY2xhc3NMaXN0LnJlbW92ZShcImNvbnRlbnRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjdXJyZW50VHVyblRhYi5hcHBlbmRDaGlsZCh0dXJuSHIpO1xyXG5cclxuICAgICAgICBFbGVtZW50cy5zdGFydFR1cm4oKTtcclxuXHJcbiAgICAgICAgc2Nyb2xsVG9OZXdUdXJuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcmUgd2UgaW4gdGhlIG1pZGRsZSBvZiBhIHR1cm4/XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1R1cm4gKCkge1xyXG4gICAgICAgIHJldHVybiBFbGVtZW50cy5pc0luVHVybigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYmx1ciBlZmZlY3QgYXJvdW5kIHRoZSB0dXJuIHBhbmVsXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbmRUdXJuICgpIHtcclxuICAgICAgICBFbGVtZW50cy5lbmRUdXJuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNheUVsZW1lbnRzQXNDb250ZW50IChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxIVE1MRWxlbWVudD4+IHtcclxuICAgICAgICByZXR1cm4gc2F5LmdldEhUTUwoXCJwXCIsIFtcImNvbnRlbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpbnRzIGdpdmVuIFNheSBkaXJlY3RseVxyXG4gICAgICogQHBhcmFtIHNheVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnRBc0NvbnRlbnQgKHNheSA6IFNheSkge1xyXG4gICAgICAgIGxldCBub2RlID0gZ2V0TWFya2VyKCk7XHJcbiAgICAgICAgZ2V0U2F5RWxlbWVudHNBc0NvbnRlbnQoc2F5KS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlKHZhbHVlLCBub2RlKTtcclxuICAgICAgICAgICAgdW5wcmludChub2RlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBzYXkgZm9yIHNheVZhbHVlcyBhbmQgdGhlbiBwcmludHMgaXQgYXMgY29udGVudC5cclxuICAgICAqIEBwYXJhbSBzYXlWYWx1ZXNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNpbXBsZVByaW50ICguLi5zYXlWYWx1ZXMgOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgcHJpbnRBc0NvbnRlbnQobmV3IFNheSguLi5zYXlWYWx1ZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnRBc0Vycm9yIChtc2cgOiBTYXkgfCBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgU2F5KSB7XHJcbiAgICAgICAgICAgIG1zZy5nZXRIVE1MKFwiZGl2XCIsIFtcImVycm9yXCJdLCB0cnVlKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHByaW50KC4uLnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtc2cpKTtcclxuICAgICAgICAgICAgcHJpbnQoZGl2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNsZWFyICgpIHtcclxuICAgICAgICB3aGlsZSAoY3VycmVudFR1cm5UYWIuZmlyc3RDaGlsZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY3VycmVudFR1cm5UYWIucmVtb3ZlQ2hpbGQoY3VycmVudFR1cm5UYWIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluY2x1ZGVzIHRoZSBnaXZlbiBlbGVtZW50cyBhcyBjb250ZW50LlxyXG4gICAgICogVGhpcyBpcyB0aGUgb25seSBjb3JyZWN0IHdheSBvZiBwcmludGluZyBlbGVtZW50cy5cclxuICAgICAqIEBwYXJhbSBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcHJpbnQgKC4uLmVsZW1lbnRzIDogQXJyYXk8Tm9kZT4pIHtcclxuICAgICAgICBpZihlbGVtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUdXJuVGFiLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNjcm9sbFRvKGxhc3RSZWFkT2Zmc2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtlciAoKSB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgICAgICBjdXJyZW50VHVyblRhYi5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmVmb3JlIChuZXdDaGlsZHMgOiBBcnJheTxOb2RlPiwgb2xkQ2hpbGQpIHtcclxuICAgICAgICBuZXdDaGlsZHMuZm9yRWFjaCgobmV3Q2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY3VycmVudFR1cm5UYWIuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBvbGRDaGlsZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2Nyb2xsVG8obGFzdFJlYWRPZmZzZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBwcmludGVkIGluIHRoZSBwYXN0LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB1bnByaW50ICguLi5lbGVtZW50cyA6IEFycmF5PE5vZGU+KSB7XHJcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50ID09IGN1cnJlbnRUdXJuVGFiKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VHVyblRhYi5yZW1vdmVDaGlsZChlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Nyb2xscyB0byB0aGUgZmlyc3QgY3VycmVudCB0dXJuIGVsZW1lbnQuIChPciByYXRoZXIsIHRvIGp1c3QgYWZ0ZXIgdGhlIFN0YXJ0IG9mIFR1cm4gZWxlbWVudClcclxuICAgICAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGEgbmV3IHR1cm4gYmVnaW5zLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9OZXdUdXJuICgpIHtcclxuICAgICAgICBsZXQgdGFyZ2V0ID0gdHVybkhyLm9mZnNldFRvcCArIHR1cm5Ici5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGFzdFJlYWRPZmZzZXQgPSB0YXJnZXQ7XHJcblxyXG4gICAgICAgIC8vdHVybkhyLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvciA6IFwic21vb3RoXCIsIGJsb2NrIDogXCJzdGFydFwifSk7XHJcbiAgICAgICAgaWYgKHRhcmdldCA8IGN1cnJlbnRUdXJuLnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICByZXR1cm47IC8vIFdlIGRvbid0IHdhbnQgdG8gc2Nyb2xsIFVQLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2Nyb2xsVG8odGFyZ2V0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbHMgdG8gdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBjb250ZW50IHBhbmVsLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2Nyb2xsVG9Cb3R0b20gKCkge1xyXG4gICAgICAgIHNjcm9sbFRvKGN1cnJlbnRUdXJuLnNjcm9sbEhlaWdodCAtIGN1cnJlbnRUdXJuLmNsaWVudEhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgaGFsZiBhIHNjcmVlbiBmb3J3YXJkXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzY3JvbGxTcGFjZSAoKSB7XHJcbiAgICAgICAgc2Nyb2xsVG8oY3VycmVudFR1cm4uc2Nyb2xsVG9wICsgKGN1cnJlbnRUdXJuLmNsaWVudEhlaWdodCAvIDIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0ZXh0IHRoYXQgd2FzIHJlYWQgYXMgcGxheWVyIHNjcm9sbHNcclxuICAgICAqL1xyXG4gICAgY3VycmVudFR1cm4uYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRSZWFkID0gY3VycmVudFR1cm4uc2Nyb2xsVG9wICsgY3VycmVudFR1cm4uY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgIGlmIChjdXJyZW50UmVhZCA+IGxhc3RSZWFkT2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIGxhc3RSZWFkT2Zmc2V0ID0gY3VycmVudFJlYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW5pbWF0aW9uLi4uIHJlbW92aW5nIGpxdWVyeVxyXG4gICAgICovXHJcbiAgICB2YXIgc3RhcnRPZmZzZXQgOiBudW1iZXI7XHJcbiAgICB2YXIgdGFyZ2V0T2Zmc2V0IDogbnVtYmVyO1xyXG4gICAgdmFyIHN0YXJ0VGltZSA6IG51bWJlcjtcclxuICAgIHZhciBmaW5pc2hUaW1lIDogbnVtYmVyO1xyXG4gICAgdmFyIHRvdGFsVGltZSA6IG51bWJlcjtcclxuICAgIHZhciBhbmltYXRpb25SZXF1ZXN0IDogbnVtYmVyO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyAob2Zmc2V0IDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG9mZnNldCA8PSBsYXN0UmVhZE9mZnNldCkge1xyXG4gICAgICAgICAgICBzdGFydE9mZnNldCA9IGN1cnJlbnRUdXJuLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgZmluaXNoVGltZSA9IHN0YXJ0VGltZSArIEVsZW1lbnRzLmFuaW1hdGlvblRpbWU7XHJcbiAgICAgICAgICAgIHRvdGFsVGltZSA9IGZpbmlzaFRpbWUgLSBzdGFydFRpbWU7XHJcbiAgICAgICAgICAgIHN0YXJ0U2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzdGFydFNjcm9sbGluZyAoKSB7XHJcbiAgICAgICAgaWYgKGFuaW1hdGlvblJlcXVlc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGFuaW1hdGlvblJlcXVlc3QgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodXBkYXRlRnJhbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IHVwZGF0ZUZyYW1lID0gKCkgPT4ge1xyXG4gICAgICAgIGFuaW1hdGlvblJlcXVlc3QgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBtb3ZpbmdPZmZzZXQgPSAodGFyZ2V0T2Zmc2V0IC0gc3RhcnRPZmZzZXQpO1xyXG4gICAgICAgIGxldCB0aW1lUGFzc2VkID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWU7XHJcbiAgICAgICAgbGV0IGlkZWFsT2Zmc2V0ID0gbW92aW5nT2Zmc2V0ICogKHRpbWVQYXNzZWQgLyB0b3RhbFRpbWUpO1xyXG5cclxuICAgICAgICBsZXQgbWF4U2Nyb2xsID0gY3VycmVudFR1cm4uc2Nyb2xsSGVpZ2h0IC0gY3VycmVudFR1cm4uY2xpZW50SGVpZ2h0O1xyXG5cclxuICAgICAgICBjdXJyZW50VHVybi5zY3JvbGxUb3AgPSBzdGFydE9mZnNldCArIGlkZWFsT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudFR1cm4uc2Nyb2xsVG9wIDwgdGFyZ2V0T2Zmc2V0ICYmIGN1cnJlbnRUdXJuLnNjcm9sbFRvcCA8IG1heFNjcm9sbCkge1xyXG4gICAgICAgICAgICBzdGFydFNjcm9sbGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0N1cnJlbnRUdXJuSGFuZGxlci50c1wiIC8+XHJcbmludGVyZmFjZSBDdXN0b21MaW5rT3B0aW9ucyB7XHJcbiAgICBtb3VzZW92ZXI/IDogKCkgPT4gdm9pZDtcclxuICAgIG1vdXNlb3V0PyA6ICgpID0+IHZvaWQ7XHJcbiAgICBjbGljaz8gOiAoZSA6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbn1cclxuXHJcbm1vZHVsZSBDb250cm9scy5MaW5rcyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWFrZUN1c3RvbUxpbmsgKGVsZW1lbnQgOiBFbGVtZW50LCBvcHRpb25zIDogQ3VzdG9tTGlua09wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5tb3VzZW92ZXIgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMubW91c2VvdXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBvcHRpb25zLm1vdXNlb3Zlcik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIG9wdGlvbnMubW91c2VvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb3B0aW9ucy5jbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIG1ha2VMaW5rIChlbGVtZW50IDogRWxlbWVudCwgYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgbWFrZUN1c3RvbUxpbmsoZWxlbWVudCwge1xyXG4gICAgICAgICAgICBtb3VzZW92ZXIgOiAoKSA9PiB7IEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuaG92ZXJBY3Rpb24oYWN0aW9uKTsgfSxcclxuICAgICAgICAgICAgbW91c2VvdXQgOiAoKSA9PiB7IEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIudW5ob3ZlckFjdGlvbigpOyB9LFxyXG4gICAgICAgICAgICBjbGljayA6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBUdXJuU2VxdWVuY2UuZXhlY3V0ZShhY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci51bmhvdmVyQWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJjbGFzcyBSb29tTm9kZSB7XHJcbiAgICBwcml2YXRlIHJvb20gOiBSb29tUmFuZG9tO1xyXG4gICAgcHJpdmF0ZSBtYWluRGl2IDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocm9vbSA6IFJvb21SYW5kb20pIHtcclxuICAgICAgICB0aGlzLnJvb20gPSByb29tO1xyXG4gICAgICAgIHRoaXMubWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwibWFwUm9vbVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwibGlua2VkXCIsIHJvb20uZ2V0QmFja2dyb3VuZENsYXNzKCkpO1xyXG5cclxuICAgICAgICAgICAgUm9vbS5ESVJFQ1RJT05TLmZvckVhY2goKGRpcmVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25EaXYuY2xhc3NMaXN0LmFkZChcIm1hcFJvb21Db25uZWN0aW9uXCIgKyBEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25bZGlyZWN0aW9uXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbkRpdi5hcHBlbmRDaGlsZChkaXJlY3Rpb25EaXYpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKHRoaXMubWFpbkRpdiwgbmV3IEFjdGlvbkdvKFdvcmxkU3RhdGUucGxheWVyLCByb29tKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBU1NVTUUgVEhJUyBJUyBOT1QgVVBEQVRFRFxyXG4gICAgICAgICAgICAvL3RoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVSb29tTmFtZUZsb2F0ZXIgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCByb29tTmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2F5TmFtZSA9IG5ldyBTYXkodGhpcy5yb29tKTtcclxuICAgICAgICAgICAgYXdhaXQgc2F5TmFtZS5nZXRQdXJlRWxlbWVudHMoKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbU5hbWUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5Ib3ZlckluZm8ubWFrZUhvdmVyYWJsZSh0aGlzLm1haW5EaXYsIHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCkgPT0gdGhpcy5yb29tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LmFkZChcImN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LnJlbW92ZShcImN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBsZXQgaXNSZW1lbWJlcmVkID0gYXdhaXQgV29ybGRTdGF0ZS5pc1Jvb21SZW1lbWJlcmVkKHRoaXMucm9vbSk7XHJcbiAgICAgICAgICAgIGlmICghaXNSZW1lbWJlcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LmFkZChcInVua25vd25cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5EaXYuY2xhc3NMaXN0LnJlbW92ZShcInVua25vd25cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVsZW1lbnQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1haW5EaXY7XHJcbiAgICB9XHJcbn0iLCJjbGFzcyBTYXlBbiBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB1cHBlcmNhc2UgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYXV0b1VwcGVyY2FzZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZiAoYXV0b1VwcGVyY2FzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cHBlcmNhc2UgPSBhdXRvVXBwZXJjYXNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgbmV4dCA9IHNheS5zZXF1ZW5jZVtzYXkuc2VxdWVuY2VSdW5uZXIgKyAxXTtcclxuICAgICAgICBpZiAobmV4dCA9PSB1bmRlZmluZWQgfHwgKG5leHQgaW5zdGFuY2VvZiBUaGluZyAmJiAoPFRoaW5nPiBuZXh0KS5wcm9wZXJseU5hbWVkKSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYWFuID0gQXZzQW4ucXVlcnkoKGF3YWl0IHNheS5nZXRUZXh0T2Yoc2F5LnNlcXVlbmNlUnVubmVyICsgMSwgbmV4dCkpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIGlmIChhYW4ucHJlZml4ICE9IFwiXCIpIHsgLy8gYXZvaWQgXCJhIDUyIGNvaW5zXCJcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBhYW4uYXJ0aWNsZSArIFwiIFwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy51cHBlcmNhc2UgJiYgc2F5LmN1cnJlbnRQYXJhZ3JhcGgubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSB0aGlzLm5vZGUubm9kZVZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm5vZGUubm9kZVZhbHVlLnN1YnN0cigxLCB0aGlzLm5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSB0aGlzLm5vZGUubm9kZVZhbHVlICsgXCIgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbdGhpcy5ub2RlXTtcclxuICAgIH1cclxufVxyXG5cclxuLy9ieSBFYW1vbiBOZXJib25uZSAoZnJvbSBodHRwOi8vaG9tZS5uZXJib25uZS5vcmcvQS12cy1BbiksIEFwYWNoZSAyLjAgbGljZW5zZVxyXG52YXIgQXZzQW4gPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGRpY3QgPSBcInAzZXp6OzR3cmxnOzJoOyMycmc7MjI7MjthOzc7O2lmO3o7OyY0aDsxYzsxO047Njs7KnlwOzZhOzQ7YTI7cTs7ZTE7cTs7aTE7aDs7bzs3Ozsvb3A7NW47OTthMztpOztlNTtoOztoOzsxO281Ozs7aTtyOztsOzsxOy87Njs7bjs7MTtvNjs7O28xO2E7O3I7OzE7ZTc7OztzOzsxOy8yO2o7OzA5cGE7eTM7MTs4ZTsxMDs7MTdxb3E7cW1tOzI7MTJocDs3bnc7YTswbzQ7NDU7MTswbjsydzs7MTVyOzFuOzI7ODs3Ozs5OzU7OzI4czt4OzszNHE7ejsxOzc7NTs7NDVuO247OzU5ODt3Ozs2NWs7dTs7NzRqO3k7Ozg1MDt5Ozs5M3g7Zzs7ODF1eDtoZ2s7YTswemI7ZWw7YTswcDs0aDs7MTE7MTY7OzIxOzEwOzszMjsxNTs7NDsxODs7NTQ7djs7NjsxMjs7NztzOzs4O3Y7Ozk7MTc7OzExazticTsxOyB2OzI7OzIyOTtmMzsyOyAxYTszOzvigJM1Ozs7MzF4O2pjOzE7IDEyOzI7OzQxdztrcTsyOyB6OzQ7O+KAkzU7Ozs1NTk7c3A7NTsgMms7MTs7LGg7OztoNzs7O2tkOzs7bTY7Ozs2MnA7cm07MjsgMWI7NTs7azU7Ozs3Mm47eTY7MjsgMTQ7OzvigJM1Ozs7ODJyOzE5MjsyOyAxOTs0OzssNTs7OzkzaTsxaWc7MjsgMTA7NDs74oCTNTs7Ozh5cztuc3U7OzxlOTsxeDsyO207OzE7ZDs2OztvOzY7Oz1rcTsxeDsxOz0zbTtnOzE7RTs2OztAMTY7MmE7O0Ezd247YnU3ZDs2O0Ficjt5MTsxO0E4Yjs1bzsxO1MzO2U7O2kyZzs0cmg7MTtyMjY7NGRnOzE7b2I7Mjs7bWc5OzU0OTA7MTthMWs7MTQwOzE7cnY7MWU7MTsgdDsxOztuNm47Z2ZsOzE7ZDI1OzFhZTsxO2ExYzs1YjsxO2wxYjs0YzsxO3UxYjszcjsxO2MxODtjOzE7aTs7MTthOzsxO247Njs7czNmO2ZldTsxO3RuO3NjOzE7dWg7MXQ7MTtyaDsxczsxO2loOzFxOzE7YWg7MXE7MTtzZzsxOzt0NzE7NDFoOzE7aDUzOzExMjsxO2w0eDs3aTsxO2U0dzs2bTsxO3Q0dzs2bTsxO2U0dzsyajsxO3M7Zjs7QjdjZWw7c3o7MjtobGI7NDI7MjthYXc7Mjg7MTtpajsxeTsxO3JmOzFzOzE7YWU7OzvDoTsxMTs7b2xoajsyODsxO3IxY3k7ajsxO2RlcztmOzE7IDM7Zjs7QzhsMDU7MTBqOzM7YTI5bmc7NXQ7MTtpOWM7YjsxO3M7OzE7czU7OztoMXNrYTs5cDs0O2FhMWE7MXg7MjtpMTE1O287MTtzNTtnOzE7ZTU7OztvNXA7NzsxO2k7Njs7bDE3O2w7MTvDoTtmOztya3hrOzE5OzE7bzl0O2E7MTvDrTs1Ozt1MnJlO3k7MjtpMTthOztyMmZxO2U7MTtyZTs1OzE7YTs1OztvMXZyazs4ODsxO25qcHk7MW07MTtnMzgwO2Y7MTtqOzU7O0Q0MGR4O2hoOzc7YWo1NjsxeTsxO28zNTs2OzE7cTs1OztpamhjOzJ0OzI7bmJ3O2o7MTthMTc7ZjsxO3M0O2Y7O29nejtnOzE7dDE7OTs7dWl2djsxcjsxO2FkMjs3OzE7bGNpOzc7MTtjOzc7O8OhMzA7NzsxOyA7NTs7w7I7NTs7w7kxO2U7O8awOzc7O0Vmb2U7NDJ6eTs3O1UzdDt6azsxO1Ixcjs0OztiZTs0MjsxO29jOzF0OzE7bGI7cDsxO2liOzs7bTJrOzczbTsxO3B3OzEzdzsxO2VoOzkxOzE7emQ7OztuN3g7Mjd6ejsxO2FmOzE0OzE7bWQ7Mzs7c3lwOzM1eDsxO3B3czs5Yzs1O2F3bjtwOzE7Yzs3OztlNDs3ZDs7aDs1OztvO2I7O3I7aDs7dWRqbDtoYzsxO2xqOzZvOzE7bzY7Ozt3cjsxZTsxO2lkOzI7O0Y0ZXRhO2hoeDsxMTsgY2Y7MXJ6OzssOzE3OzsuMmo7Nmg7Oy9pOzI5OzswNTsyeTs7MTI4O2UxOzsyMTY7OWc7OzMxMTs3ZDs7NDE4OzhpOzs1aTs1dTs7Njk7ejs7Nzs7MTswYTs7Ozg2O2o7Ozk3O2w7O0E0MDQ7NWlqO2U7QmU7Mzs7Q3Q5O215OztEeDs5OztGYzs7O0k7OzI7TDg7OztScTs7O0sxMTs7O0xsOzQ7O00xeDsxOztOeTsyOztQMTM7Mjs7UTloOzVqOztSYWQ7M3A7O1Mxbjs5OztUMnQ7Mjs7QjU3OzFqaTs7QzRzO2pwOzE7TWI7MTs7RDJnO2FrOztFN3I7Mzk7MjtDNjtrOztJNTtmOztGMzM7NjQ7MTtyNTs7O0h6OzF1OztJMXZ4O2JrOzM7QTI0OzQ1OzE7VG07MTs7Ujs7MTsgdzszMDs7VTI7YTs7SjU7Zjs7TGtrO2cxOzM7QzJwOzN2OztONDtlOztQMTtmOztNNnc7MWRzOztPZzM7MmU7MTsgNTtpOztQczQ7dzc7MTsuN2k7NTM7O1I4djszejsyO0ExZTtnOzE7IDM7ZTs7U2U7eTs7UzNnOzkxOztUOGE7MWFoOzE7UzF4OzY7O1VlbDszbTsyOywyO2I7Oy47azs7WG07MW87O1l6OzV3OzE7VjY7OztjMztsOztmOzsxO283Ozs7aDE7MzE7O8+DMTtpOztHNTV6MDtpZzs3O2Uxc2N0OzNoOzE7cjFmdmg7MW47MTtuOzsxO2U7YTs7aDFzZDszMTsxO2ExN2s7MmU7MztlO3E7O2k7bjs7bzs2OztpNGI5O3M7MTthbHQ7YzsxO25sMDtiOzE7ZzE7YTs7b3ZpMjsyZDsyO2Y7OzE7IDtiOzt0MjM4O2Y7MTt0Mno7NzsxOyA7Njs7cjE3anY7MzI7MTtpcWw7ZTsxO2E7OTs7dzQzOzY7MTthMXA7NTsxO3JkOzU7MTtyOzU7O8O6OzU7O0gyNHNuO2N3ZDtzOyA1aTttazs7JmI7MTc7OywxO2Y7Oy4zNzs0MjsyO0FpOzs7SWU7NDs7MWk7MWo7OzJyOzIyOzszOTtuOzs1YTsxOTs7NzI7YTs7QjJ6O2N4OzE7UDc7OztDMXE7MzU7O0RkMTt0Yjs7RjFsOzJ4OztHbDsxNDs7SHk7MzA7MTtJNTs7O0k4MDtpOTs2O0NjOzE7O0cxMDsyOztOYjsxOztQcTsyOztTOzsxO0QxO2o7O1RmOzE7O0s0azsxdzsxOzk7Nzs7TDFlOzM1OztNMzY7NnU7MTsuYzs7O055OzJ2OztPOTU7M2c7MjsgNzt0OztWYzsxNjs7UDRiO2JmOztSMnY7NHY7MTtUbjs3OztTOzsxO0Y1Ozs7VDljOzExNTs7VjFrOzN1OztlYW94OzdwOzI7aW0xOzExOzE7cjQ7bzs7cjI5dDsybTsxO3IxZDs3OzE7bjs1OztvaGgxOzZkMDsyO24zanI7NjV2OzY7ZDEyMTt2OztlNGM7MW07MTtzNzsxbTs7ZzIxZjtlOztrcDs7O29hZDs2MWI7MjtsMjY7MTs7cjdjOzVqejsxO2k7OzE7Zjs1Ozt2Njs7O3UycTQ7MzI7MTtyMjsyeDs7STI2Njs0bWdiOzM7STRvOzhmOzI7KjY7OztJMXY7ajs7bmlqOzFobTQ7MTtkOXA7d3RwOzE7ZTFjOzN3eTsxO3AxMjszcjY7MTtlMTI7M3I2OzE7bjEyOzNyNDsxO2QxMjszcjQ7MjtldDszcXc7MTtudDszcXc7MTtjNzs0MTsxO2k2Ozs7w6o4Ozs7czRoO2NpZjsxO2wyaTs0Mno7MTthMmg7M3lyOzE7bmU7Z3k7MTtkZTtneTsxO3NkOzM7O0oyNGI2OzdoOzE7aXc5O3Q7MTthOzsxO28yO287O0wydTk4O2FiZTt5OyA1czsxN3Q7OywyO3M7Oy4yNTs5cTs7MWw7MXQ7OzJqOzJoOzszYTsxMDs7NDg7bDs7ODtjOztBbmM7Y2U7MzsgMWU7NnE7O1BvOzJ0OztYMTthOztCMWo7MnI7O0M1OTtyNDs7RDQyO2xjOztFamc7aGc7MjsgMjtpOztENHg7ZTk7O0YyMDszczsxO1RpOzI7O0c4cztrbzs7SDs7MTtEazs2OztJZHk7MW07MTtSZDt1OztMYzA7MjVrOztNM2s7OTQ7O04yNjs1MTs7UDYzOzFnMDs7UjIzOzZ6OztTMno7ZjY7MTttNzs7O1QzNjs4Njs7VTFzO247MTsgNTtoOztWMTQ7MzU7MTtDNzs7O1c7OzE7VDs1OztaOTt0OzteOzU7O2FtNWQ7M2c7MTtvOTE7ZTsxO2k7OzE7ZztlOztvbG4yOzNyOzE7YzJpazsxOTsxO2gxczsxMTsxO2E3O3o7MTtiNjs7O3AxO2g7O3U1MWk7MXE7MTtzNHA7eDsxO2hnO3c7MTtvYjs7O+G7mTs1OztNNWJodTtza2Q7MTU7IDZuO24yOzsmYjsxaDs7LDtnOzsuMWtyOzVlcjsxO0FsbTsya2Y7MTsua2Y7Mmh0OzE7U2E7Mjs7LzQ7MWY7OzE0ZjtmNDs7MjJhOzZrOzszeTszMTs7NDFqOzVoOzs1bjsxYTs7NnI7M3E7Ozd0OzFmOzs4NzsxMTs7QTFmeDsybXQ7aTtCNTs7O0M5cTsxOztEMmQ7Mzs7RjEyOzQ7O0cxNzs0OztKMzg7OztMMTE7Mjs7TXY7MTs7TjJpO2E7O1AyZjs2OztSMm87OztTMnQ7Njs7VDJsO2Y7O1ZjOzI7O1c3Ozs7WDFoOzs7WWE7OztaNzs7O0JidjszOXM7MTtTYjtyOzE7VDk7OztDNWU7bmk7O0Q1ZTtuYTs7RWZqO2Q0OzM7UDFqOzlmOzE7Uzc7OztXOzc7O242O2k7O0Y2NDsxNHk7O0czMTthejs7SDJpOzdkOztJenE7aWo7NDsgZjt3Ozs1OzJvOzs2ZjszNTs7VDI1Ozd5OzE7TWk7MTs7SzFvOzNjOztMY2w7MTdyOztNY2M7cnA7O04xaTs0MDs7T3NsO2F2OzE7VTE3OzJjOztQZWw7M3h6OztRYTsxZzs7UjRsO253OztTa3U7MWxkOztUYWk7eWo7MTtSMXk7dzs7VWFzOzF0OzI7IDI7aTs7VjM7ZDs7VjNzO2E1OztYcTsycDs7YjFhO2k7MTt1cjtkOzE7bTE7YTs7ZjJxO2VrOztoZjsxZzs7b200ejs3aDsyO0Q7OzE7ZTc7OztVMmI7MzQ7MTsuNTs7O3A7OzE7MzE7Yjs7czIzO2g7MTtjMztjOztOM3F5eDtpcGk7eTsgN3A7cWU7Oys7OTs7Ljs7MTtFZzs1Ozs0NjtrOzs3Ozc7Ozg7Nzs7Ojs1OztBNGdhO2luOzM7QTNnOzZqOzE7Rm87Mjs7STFtOzUyOztTMmwzOzF4OzE7TGI7MWI7O0I4azsyZ2Q7O0NraDsyaWI7O0QydDthcTs7RWpwOzlyOzM7QTEwOzJyOztINTsxNjs7Uzs7MTsgMXk7MnY7O0Zhczsyc207MTtVYzsyOztHNXg7emI7O0g4bzsxb3E7O0k7Ozc7QzF3O2o7O0Q7OzE7IDs5OztLYTs7O0xkOzI7O05qOzs7Tzg7OztTMjA7bjs7SzFjOzRnOztMMnQ7OTQ7O00xczs5YTsxO001Ozs7TmRsOzM2OzI7UjE7ZDs7VDQ7aDs7UDs7MTtPMjVrOzFqNDsxO1YyNHk7MWk4OzE7Lzs7MTtCOzU7O1I5bjtmNjsyO0plOzM7O1QzeTtlOztTYnk7bHQ7MTtXNW07Zzs7VDNtOzloOzE7TDs7MTtENTs7O1U2MDsxYTsxO1M0O2k7O1YxYTs0aDs7VzY0OzRuOzI7QXU7MzA7O087OzE7SDs4OztYcDs0cDs7WXM1O2FmOzM7QzY0OzFpOzE7TDs2OztQMWs7M3Q7O1VqOzFwOzthMTBwejs4ZjsxO3NxMTtkOzE7YTs7MTtuMTs4Ozt0OzsxO2gxO2E7O3ZrOzFjOzvCsjs3OzvDlzs1OztPMW45OzFnN2Y7NTtOMTc7M2w7MTtFMTI7Mjs7bDI5Ozh5YjsxO3ZsOzI7O251aDsxdGk7MjtjOzsxO2VjOzI7O2V0YzsyMTsxO2kyOzFrOztvaTszZTsxO3BmOzE7O3UzeDsxZXk7MTtpM2M7Yjs7UDVkc2c7a2c7MTtobWI2OzNyOzI7aTM5ajt2OzE7YTs5OztvMTI4OzFzOzI7Ymg7MTk7MjtpODs7O285Ozs7aTE7ajs7UWIzYzsxbDsxO2k4Yzt0OzE7bjYxO2w7MTtnNHg7bDsxO3gxO2Y7O1IzdGU2O3Uwbjt6OyA2aDsxMTk7OyY4dDt6ZTs7LDtrOzsuMnI7NHQ7MTtKajszOzsvYTtxOzsxMXM7M2s7OzRhO3I7OzY3O2o7O0ExMmM7eW07MzsgZDsxbzs7LjE7YTs7Rjd2O3JhOzE7VGY7OztCNGI7djQ7MTtSazszOztDNTI7bDc7O0QzNDs5Yjs7RW5wOzNhOzM7IGI7cTs7UzN6O3E7MTtQYTtwOztVOzU7O0Z4bDs1Y2c7O0cxMTs1dzs7SDF4OzFhOzE7UzQ7Zjs7SWYyOzZvOzI7QTE3OzNzOztDOzsxOyBhOzFjOztKbjsyZTs7S3o7NWc7O0wxaDsyazsxO1A2Ozs7TTV1O2NnOzU7MWU7NDs7MjY7OzszNjs7OzU5Ozs7NjU7OztONHk7cTM7O09nczs4NjsyO0hrOzE2OztUMW47M2I7MjtBdjs7O083Ozs7UDR1O3E3OztRODtxOztSMjE7Mzc7MTtGNjs7O1MxcGw7MXVwOzQ7LDg1OzZiOzsuYmE7N2w7Oz8ybDt5OztUdjs2OztUNXQ7aXo7O1UyMzs0dTs0O0I1Ozs7TTU7OztOYjs7O1M5OzE7O1YxaDs4dTs7WGE7bzs7Yzs4OztmM3FoO2RiODsxO007OzE7Lmg7NDs7aDF4azsxYTsyO0E7NTs7Qjs1OzvDsjs1OztTN2xkZjtlYTc7MTE7IDluOzE4YTs7JjFvOzNzOzssMjtmOzsuZTg7OTE7NDtFNzttOztNYzsxMDs7T2E7MTg7O1Q7OzE7Ljs7MztCMjtiOztEMztjOztNMjtjOzsxbTsyOTs7MzU7bzs7NGI7czs7NTU7aTs7Njg7czs7ODQ7aTs7OTI7Yjs7QTFiMTtsMzszOyAyYTs3ZDs7ODs1OztTMnY7M3Q7MjtFcDs0OztJNjs7O0IzMDs3NDs7Q2xmO2E3OzM7QTJ6OzE1OzE7IDM7eTs7Ujs7MjtBcDs7O1U1Ozs7VDY7czs7RDY2O25zOztFcmk7anE7NjsgczsxZzs7NTs3OztDM2c7YmE7MztBYzs7O09oOzs7Umg7Mzs7STs7MTtGOTs7O08xYTsyODs7VTs1OztGNTg7N3c7MzsmNTs7O0g2Ozs7Tzs7MTtTODs7O0cyNDs1djsxO0RmOzU7O0g2bTszdDszOzI1O2g7OzMyO2c7O0w7Nzs7SXQwOzgzOzI7IGY7NTA7O1M7OzE7TzY7OztLOzsyO0k5OzE7O1loOzs7TDZ6OzhtOzM7QTJrO287MjsgMTtnOzsuOzU7O0l1O2U7MTsgMztjOztPbTs1OztNOWo7bGg7MztBMjg7bzsxOyA0O207O0lpOzU7O1U7OzE7UjY7OztOOzs1O0ExZTtiOztDOzszO0E4Ozs7QjU7OztDODsxOztFMTg7bzs7RmE7OztPNGc7MTs7T2k3O2RjOzU7IGM7dTs7QTRjOzFoOzE7STU7Zzs7RWc7MW07O1N2OzVtOzE7VTU7OztWOTtwOztQMXI4OzMyMDs3O0ExMDI7MWRuOzc7QWE7OztDaDs7O0QyMjs7O01yOzs7TmU7OztSMmY7OztTODsxOztFM2s7ajsxOyA0O2c7O0liOTsxNTU7NDtDbzs7O0Q2Ozs7TjU7OztSNTs7O0wxMzsyNjsxO082Ozs7TzE4O2U7O1UxeDs1OztZNTs7O1E7OzE7IDE7ZTs7UjNpOzl6OztTZjc7MWt2OzE7V2U7OztUamc7ZTc7OTtBNDY7dzsxOyA4O3M7O0M3O3I7O0RuOzJ6OztGNDtuOztJcTsxYzs7TDY7azs7TW07MTU7O1NiOzEyOztWNTsxMjs7VTs7NztCbjsxOztMNDI7Mjg7O01qOzs7TjE4Ozs7UDE1OzI7O1JmOzs7U2Y7OztWNmo7eTc7O1doZTsydjsxO1I1O207O1g7OzE7TTI7Yzs7aGE5bTsxNDsxO2kybTc7aTsxO2c7OzE7YTs7MTtvOzc7O3B4Ymw7M3U7MTtpMWxnO3M7MTtvNjtqOzE7bjY7Ozt0cG12OzMzOzI7Qjs1Oztpa3o7YjsxO2M1YjthOzE7aTs4OztUM2RhdjtpZjs0O2Fjenk7NGY7MjtpMXdqOzE1OzI7Zzs7MTthNjs7O3M7OzE7Yzs4Ozt2MXE7cTsxO2UxNztoOzE7cztoOztlZ2E2OzI5OzE7YTFvMjtvOzE7bWcyOzY7MTtwOzY7O3VjNHQ7MjI7MTtpOzsyO2wxOzg7O3I7ODs7w6AxO247O1Uyb2g4O2ExajttOy5qcWs7ODA7MTtONzg7aDsxOy43MDtoOzE7QztmOzsvMnI7ZjsxOzE7OTs7MTs7MTsgYzs7OzI0Yjt4OzE7MTc7azs7TDNxO2o7MTtUOzY7O003aDsxZDsxO044O3E7O040YnA7YW07NDtDMnU7azsxO0w7NTs7RDs7MjsgNjs7O1AxNDsyOztLOzU7O1I7OzE7IDU7OzthMzs0MDs7YjJyOzQzOzI7YW07NDs7aXM7OTs7ZGU7MTY7O2dscDszYTsxO2w7MW47O2k7OzE7Z3E7YTs7bDJ1OzE0cjsyO2lnOzQ7O3ljOzs7bXk7OG47O250cmM7MnVoO287IDU7azs7YTs7MTtuMWU7Yjs7YjM7MXE7O2NlOzl3OztkMXU7eDI7O2UxOTsxdDsxO3MxNjsyOztmMzsyZDs7ZztsOztoNjtsOztpdGozO2tiOzI7ZDM7ZTs7bjI7NjU7O2o7Nzs7azM7NTU7O2wzOzJjOzttNTsxZTs7bjI7dDs7bzQ7MTM7O3AyOzFwOztxOzU7O3I2OzcxOztzNTsydTs7dDExOzRhOzt1Njt2Ozt2MTthOzt3MTsxMDs7cDEyO3plOztyMWFwOzFyczszO2E0aDtrOztlYTs7O3V6NTtlMjsxO2sxO2Q7O3MxYXQ7NDE7MzsgOzc7O2g5O3Q7O3R3OzFyOzE7cnA7MTs7dGxhOzQ5OzQ7aDI7YTs7bjE7bjs7cmE7dTs7dDc7ajs7eDI7ajs7ejJkO2R5OzvDrTI7ZTs7VzNmemg7MXhwOzI7UGdoODsxa3c7MTs6ZHRwOzFqcjs0O0E7OzE7RnA7MWI7O0k7OzI7QjE7OTs7Tjs7MTtIODsxOztPZTI7N2I7MTtWO2E7O1Ixbjc7Y3Y7MTtGOzsxO0M7OzI7TjU7OztVMWI7ZTs7aTE1MHo7Nmw7MTtrdWNiOzVuOzE7aXUwczs1bDsxO0VsOzg7MTtsOzsxO2kxOzg7O1gxOGs7NXJ1Ozc7YTJvOzY7O2U3bzs1OztoMjI7OztpOHY7Yzs7b207NDs7dXg7NDs7eXQ7NDs7WWRyMTs1czszO2UxeHE7djsxO3QzNTthOzE7aDI7YTs7cDM7ZDs7czE7ODs7WzFmMztiMzs1O0E2O207O0U7Yjs7STE7YTs7YWk7MTM7O2VkOzMwOztfMXBkZTs1ZjM7MjtfMXBhMjs1ZW07MTtpOzY7O2U7NTs7YDRqOzE5OzM7YTE7Zzs7ZTs1OztpOzc7O2FhNGU7MWsxY3I7NzsgMmU2OzFyNDs7bTZoOzFibWM7MTthMms7Z2RrOzE7cjs7MTsgOTs7O24xeXE7NHRjejsxO2RzejsxMzY7Mjsgc207Njk7O8SbNTs7O3A4eDsydG4xOzE7cmo7ZTg7MTt0Njs7O3IxcWw7ZG02ZDsxO3QxYmI7N3JycDsxO8OtNjs7O3VhdDsyNzF5OzE7c2M7d207MTtzNjtsOzE7aTs7MTsgNTs7O3YzMTsycXN2OzE7dTU7MjE7MTt0NTs7O2QxNDEzMjs0c3A7MzthNGJoNzszaTsxO3MxcTM7MWo7MTsgOzFoOztlZGV6MjszdGw7Mjttb3NhOzFuOzE7IDI7MTA7O3I5b2M7M2IxOzE7IDE7M2FuOztpZHNkMDtreTsyO2NmZzE7azsxO2hkajtkOzE7IDtjOztlNTdrOzZ3OzE7czFybDtsOzE7ZTFwcDtrOzI7bTs1OztyOzU7O2U3d247emxyejs4O2MydTttbzI7MTtvMXo7ZWd5OzE7bjFnO2JidjsxO28xZTtiYmc7MTttMWU7YmJjOzE7aTFiOzljODsxO2E2Ozs7ZWU7MTVkOzE7dzg7OztsYnI7MnlpcTsxO2l0OzViaTsxO3RqOzNxaDsxO2VnOzNoczsxO2k1Ozs7bThnOzF0NWM7MTtwMno7b2llOzE7ZWQ7djY7MTt6ZDs7O255cDs2YjRqOzE7dDdqOzFnMnM7MTtlMTY7NWQ0OzE7bjU7cjsxO2Q1Ozs7czk2OzF5cHI7MjthOzsxOyA1Ozs7dDQ1OzE3MTY7NDthMmc7YzNsOzE7IGQ7OztlODtpMDsxOyA2Ozs7aWw7dGw4OzE7bWw7dGw1OzE7YWw7dGw0OzE7cjU7OztyZDtibzsxO3U7OzE7dDY7Ozt1MnFvOzc0OzE7cDExYTsyajsxOyA7aTs7dzJlO287O2YxbjlodDsxY3Q7MzsgMWI7NDQ7O003OzJqOzt5MWw7NzsxO2k7Nzs7aHBwNm87MXQwNDs5OyAzNztrcTs7LDE7OTs7Ljs1OztDMjsxZDs7YTR0cGU7bGE7MTt1MWplOzFyOzE7dG47MWo7MTtiNTs7O2UzcTNnOzN3bjsyO2lhamQ7MjRiOzE7cjF6OzIzMjsxO2ExNTsxOztyamFqOzFlcDsxO20xdWo7MTQ7MTthODM7ZTsxO247NTs7bzYzdDU7MWViMzs0O215bWc7MXJkOzI7YTE2dDsxbW47MTsgNjs7O21tOzFnOztuMWF3O293bzs4OyBhOzE7O2I4Ozs7ZGY7OztlejM7MzJyOzM7IDY7OztkZTs7O3l2bjsxOztnYTs7O2lmOzE7O2s0ZTs7O3ZkOzs7cm8yNzs3YjsxO3NjOGM7MXY7MTsgODsxNTs7dTFseXk7bXZyOzE7cjI2O211czs7cnk7NzsxOyA7NTs7dDJ0OzUxOzE7dDFlOzI0OzE7cDFlOzI0OzE7OnU7Zjs7aTU1MDt0NWM4OzY7YmM7M2E7MTtuNzs7O2U5O2w7MTtyNzs7O24yeDM7am1rYTsyO2Zibzsxam53OzI7bDFzO2ZsMzsxO3UxNztjdWg7MTvDqjk7OztvNnA7Z2FqOzE7YWQ7MTs7czg0OzFwdjE7MTt0M3k7d2hrOzE7YTE3OzlncTsxO2xkOzIxYzsxO2E1Ozs7cjJqO2VrZzsxOyA4OzE7O3NxejsxYWdrOzE7IGpkOzRxOzt1MTY7ODs7azN2NjM7NWY7MTt1cnM7bjsxOyAzO247O2wxZXd6bzt6cDszO2NqOzc7MTtkOzY7O3NsOzU7MTsgOzU7O3ZtOzg7MTthOzg7O20xcWw5ODsyNDM7YTsgMWI7OTM7Oyw7Nzs7UnM7M2U7O2I7OzE7YTU7OztlZ3VyMjs5cjsxO2kyYztkOzE7bjM7ZDs7ZjU7Zzs7cHo7NmI7O3Q7OzE7YWE7Ozt1NXFsODs1dDsxO2wxOTN0OzJ0OzE7dDE3dXM7MnQ7MTtpMTd0eTsydDsxO2MxZDQ7ODsxO2E0ejs2OzE7bW87NjsxO3A7OzE7aTs2OzvDlzthOztuMTRzZXE7M2I3OzY7IDlyOzFlaTs7Vjc7dzs7VzQ7cTs7ZHg7MW47MTsgZTs7O3RlO3U7O8OXMTtiOztvMXBvMTtnbXNlOzg7YzJsO2V3eTsyO2hiOzR3OzE7b2E7MTs7dTc7NnU7MTtwNzs7O2QyMTs2aWk7MTtkMW87NTllOzE7eWE7Oztma3o7MmNnOTsxOyBicjs1MTs7Z3A7ZmQ7MTtnZTsxMTsxO2lhOzs7bjFtdXk7MTUxdjtvOyA0YTs2eTY7Oyc7NTs7LDs4OzsvMTszdDs7YTE7ZTs7YjtkYjs7YzFxYztzZTsxO28zO3JuOztkMTtuOztlMWtxeDtidTsyO2k7Yjs7cjY7M2E7O2Y7OTs7ZzF0O2FkbTs7aTM7Y2E7O2w2cTtqdzc7O200OzE0OztuO2M7O28yOzU3OztyOzFhOztzNjsxMGY7O3Q2O2hiOzt1MTsxbDs7dzE7MWs7O3k7MTU7O3o7Nzs74oCTOzY7O3JodDsyc2FzOzE7aTMwO2d3bjsxO2cycDtmbDQ7MTtlNjs7O3QzNzs1MGk7MTtyOzsxO3M7ODs7dTdqOzFlNnQ7MTtpMTY7Njs7cjFmeGk2OzF1MTszOyAxNDs2Zzs7JjE7ODs7ZjEyOzUyOztzM2FybzU7M2lvOzk7LDtlOzs/OzU7O1IyO2g7O2Y7OzI7ZTg7OztvODs7O2lnZ244O2I5OzE7YzF2cDsxODsxO2hiOzE3OztsMjB1NDsxbTsxOyA7NTs7cGJhZG87ZGU7MjszMztqOztpcGljOzEyOzE7IDs1OztyMXQ7azsxO2c7Yzs7djs7MzthZTs7O2UxMTs7O2k2Ozs7dDFjMXA3OzFtdDsyO0ExOzk7O1MzOzJ1Ozt1NGRocTs4cm5jO2M7IDd4O247Oy45Ozs7YmVoOzNmOzI7ZTc7MW07O2w7NTs7Zmw7Njs7azZoOzJlOzI7YWU7MTE7O2k4O247O20xajs0a2o7MTthOzsxOyBmOzU7O24yZW81OzZ6bnk7MzthM2xuOzdqMDszOyAxcjs0OztuM2R6O2luOzU7YTI7Yzs7Yzs4OztuNTthNzs7czszNzs7dDszaDs7cjRhO2poOzE7eTQ2OzQ7O2UyODthOG07MjsgbTs7O2k3Ozs7aTI5cDM7d2Z1Ozg7YzE0YTsxNzsyO29lZztpOzE7cmNsO2g7MTtwO2E7O3U7OzE7bTs2OztkNHg7MmI5OzE7aTRkO2Y7MTtvOzc7O2c7OzE7bjs1Oztsc2w7MTc7MTtsO2k7O20yaTtyOTsxO28yYTsyOztuM3k7c3NwOztzOWo7bTsxO3M7Zjs7dmhnNTs1eDsxO29qOzE3OzE7Y2Q7Mzs7cjFjYjtiZDQ7NTthY287cjs7ZTN2O2g7O2loNztpOztsN207MWo7O280NztrOztzMXN6dzsxaWc7MzsgaDszZjs7aDE7OWY7O3UxYmg7aXY7MTtyZGE7Z3M7MjtlcTthOztwY2Q7Z2c7MzthM2I7MXk7O2U3cTszNjs7aWc7Ozt0MzNqOzFhaTsyO207cjs7dGE7MTZiOzt2M2M7Yzs7dzNlO2Q7MTthOzc7O3g7O2I7IDIzO2h3OzsnOzY7OywxO2M7Oy4yO2E7OzhvOzQ3OztiNTtmOztrOzEzOztsMTs4OzttZDt4OzE7YTc7Ozt0O2M7O3k0eTtlOzE7IDthOzt5NmF0bjtjYTsxO2wxO2M7O3s2cztyOzE7YTs3Ozt8NTg7bTsxO2ExO2I7O8KjNmNzOzhsOzE7ODJiOzZvOzvDgDs5OzvDgWE7bzs7w4QzO2M7O8OFMjtrOzvDhjQ7azs7w4lmOzJxOzvDkjtjOzvDkzE7MWQ7O8OWYTsxNjs7w5w0O3Y7O8OgNzt2OzvDoTU7bDs7w6YxO207O8OoOzY7O8OpNGM7Ymc7MTt0M2g7Mjk7MzthNDsxbjs7bzthOzt1MTtiOzvDrTs1OzvDtjI7ZTs7w7xkO3I7MTsgNzs7O8SAMTtiOzvEgTM7czs7xKs7NTs7xLA0O287O8WMMztvOzvFjTsybTs7xZM7ODs7zqkyO2U7O86xMWM7YzE7O861NTsxczs7z4k3OzF4OzvPtTs4OzvQtTs1OzvigJMzYTsxazsyO2U7YTs7aTs5OzvihJM7ZDs7XCI7XHJcbiAgICB2YXIgcm9vdCA9IHt9O1xyXG4gICAgZnVuY3Rpb24gZmlsbChwcmVmaXgsIG5vZGUsIGRpY3QpIHtcclxuICAgICAgICB2YXIgYSA9IGRpY3Quc3BsaXQoJzsnLCAzKVxyXG4gICAgICAgICAgICAsIG4gPSBhLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcGFyc2VJbnQoeCwgMzYpfHwwOyB9KTtcclxuICAgICAgICBub2RlLmRhdGE9e1xyXG4gICAgICAgICAgICBhQ291bnQ6blswXSxcclxuICAgICAgICAgICAgYW5Db3VudDpuWzFdLFxyXG4gICAgICAgICAgICBwcmVmaXg6cHJlZml4LFxyXG4gICAgICAgICAgICBhcnRpY2xlOm5bMF0+PW5bMV0/XCJhXCI6XCJhblwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpY3QgPSBkaWN0LnN1YnN0cigxICsgYS5qb2luKCc7JykubGVuZ3RoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5bMl07IGkrKylcclxuICAgICAgICAgICAgZGljdCA9IGZpbGwocHJlZml4ICsgZGljdFswXSwgbm9kZVtkaWN0WzBdXSA9IHt9LCBkaWN0LnN1YnN0cigxKSk7XHJcbiAgICAgICAgcmV0dXJuIGRpY3Q7XHJcbiAgICB9XHJcbiAgICBmaWxsKFwiXCIsIHJvb3QsIGRpY3QpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByYXc6IHJvb3QsXHJcbiAgICAgICAgLy9Vc2FnZSBleGFtcGxlOiBBdnNBbi5xdWVyeShcImV4YW1wbGUgXCIpXHJcbiAgICAgICAgLy9Ob3RlIHRoYXQgdGhlIHRlcm1pbmFsIHNwYWNlIGluZGljYXRlcyB0aGlzIGlzIGEgY29tcGxldGUgd29yZCAtIHRoaXMgaXMgc29tZXRpbWVzIHNpZ25pZmljYW50LCBwYXJ0aWN1bGFybHkgZm9yIGFjcm9ueW1zIVxyXG4gICAgICAgIC8vcmV0dXJuczoge1xyXG4gICAgICAgIC8vICAgcHJlZml4OiBcImVcIiwgLy90aGUgcHJlZml4IHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBhcnRpY2xlXHJcbiAgICAgICAgLy8gICBhQ291bnQ6IDk2ODIsIC8vdGhlIG51bWJlciBvZiB0aW1lcyBcImFcIiB3YXMgc2VlbiBmb3IgdGhpcyBwcmVmaXhcclxuICAgICAgICAvLyAgIGFuQ291bnQ6IDEwMjgyNDYsIC8vdGhlIG51bWJlciBvZiB0aW1lcyBcImFuXCIgd2FzIHNlZW4gZm9yIHRoaXMgcHJlZml4XHJcbiAgICAgICAgLy8gICBhcnRpY2xlOiBcImFuXCIsIC8vdGhlIG1vc3QgY29tbW9uIGFydGljbGVcclxuICAgICAgICAvL31cclxuICAgICAgICBxdWVyeTogZnVuY3Rpb24gKHdvcmQpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBub2RlIDogYW55ID0gcm9vdCwgc0kgPSAwLCByZXN1bHQsIGM7XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIGMgPSB3b3JkW3NJKytdO1xyXG4gICAgICAgICAgICB9IHdoaWxlICgnXCLigJjigJnigJzigJ0kXFwnLSgnLmluZGV4T2YoYykgPj0gMCk7Ly9hbHNvIHRlcm1pbmF0ZXMgb24gZW5kLW9mLXN0cmluZyBcInVuZGVmaW5lZFwiLlxyXG5cclxuICAgICAgICAgICAgd2hpbGUgKDEpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUuZGF0YSB8fCByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZVtjXTtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGMgPSB3b3JkW3NJKytdIHx8IFwiIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufSkoKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2F5LnRzXCIgLz5cclxuY2xhc3MgU2F5Qm9sZCBleHRlbmRzIFNheSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzICgpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgcGFyYWdyYXBocyA9IGF3YWl0IHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudHMgPSBwYXJhZ3JhcGhzLmxlbmd0aCA9PSAxID8gcGFyYWdyYXBoc1swXSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHBhcmFncmFwaHMpO1xyXG5cclxuICAgICAgICBsZXQgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiXCIpO1xyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gW2JdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGVTaGVJdCBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB0YXJnZXQgOiBUaGluZztcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRhcmdldCA6IFRoaW5nLCBhdXRvVXBwZXJjYXNlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIGlmIChhdXRvVXBwZXJjYXNlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwcGVyY2FzZSA9IGF1dG9VcHBlcmNhc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKHNheSA6IFNheSkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICAgICAgaWYgKG5leHQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSHVtYW5vaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBnZW5kZXIgPSBuZXh0LmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkID4gNjUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJzaGUgXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA8IDM1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGUgXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcGVyc29uIGlzIGFuZHJvZ3lub3VzLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmRlci5oYXNQZW5pc0J1bGdlIHx8IGdlbmRlci5oYXNQZW5pcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJoZSBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwic2hlIFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcInRoZXkgXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgd2UgZXZlciBoYXZlIGdlbmRlcmVkIG5vbi1odW1hbm9pZHMsIHRoZXkgbXVzdCBiZSBhZGRlZCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaXQgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGltSGVySXQgZXh0ZW5kcyBTYXkge1xyXG4gICAgcHJpdmF0ZSBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJhIFwiKTtcclxuICAgIHByaXZhdGUgdGFyZ2V0IDogVGhpbmc7XHJcbiAgICBwcml2YXRlIHVwcGVyY2FzZSA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh0YXJnZXQgOiBUaGluZywgYXV0b1VwcGVyY2FzZT8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICBpZiAoYXV0b1VwcGVyY2FzZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cHBlcmNhc2UgPSBhdXRvVXBwZXJjYXNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzIChzYXkgOiBTYXkpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgICAgIGlmIChuZXh0ID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEh1bWFub2lkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2VuZGVyID0gbmV4dC5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdlbmRlci5nZW5kZXJWYWx1ZUNvcnJlY3RlZCA+IDY1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVyIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCAzNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpbSBcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwZXJzb24gaXMgYW5kcm9neW5vdXMuLi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmhhc1BlbmlzQnVsZ2UgfHwgZ2VuZGVyLmhhc1BlbmlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpbSBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVyIFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcInRoZW0gXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgd2UgZXZlciBoYXZlIGdlbmRlcmVkIG5vbi1odW1hbm9pZHMsIHRoZXkgbXVzdCBiZSBhZGRlZCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaXQgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiY2xhc3MgU2F5SGlzSGVyc0l0cyBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcImEgXCIpO1xyXG4gICAgcHJpdmF0ZSB0YXJnZXQgOiBUaGluZztcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRhcmdldCA6IFRoaW5nLCBhdXRvVXBwZXJjYXNlPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIGlmIChhdXRvVXBwZXJjYXNlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwcGVyY2FzZSA9IGF1dG9VcHBlcmNhc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKHNheSA6IFNheSkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy50YXJnZXQ7XHJcbiAgICAgICAgaWYgKG5leHQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSHVtYW5vaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBnZW5kZXIgPSBuZXh0LmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkID4gNjUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJoZXJzIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCAzNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpcyBcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwZXJzb24gaXMgYW5kcm9neW5vdXMuLi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZGVyLmhhc1BlbmlzQnVsZ2UgfHwgZ2VuZGVyLmhhc1BlbmlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcImhpcyBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmRlci5oYXNWYWdpbmEgfHwgZ2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiaGVycyBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJ0aGVpciBcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBJZiB3ZSBldmVyIGhhdmUgZ2VuZGVyZWQgbm9uLWh1bWFub2lkcywgdGhleSBtdXN0IGJlIGFkZGVkIGhlcmUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJpdHMgXCI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwcGVyY2FzZSAmJiBzYXkuY3VycmVudFBhcmFncmFwaC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IHRoaXMubm9kZS5ub2RlVmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICArIHRoaXMubm9kZS5ub2RlVmFsdWUuc3Vic3RyKDEsIHRoaXMubm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5vZGVdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUlmIGV4dGVuZHMgU2F5IHtcclxuICAgIHByaXZhdGUgY29uZGl0aW9uIDogKCkgPT4gYm9vbGVhbjtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY29uZGl0aW9uIDogKCkgPT4gYm9vbGVhbiwgLi4ub2JqcyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBzdXBlciguLi5vYmpzKTtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbiAhPSB1bmRlZmluZWQgPyBjb25kaXRpb24gOiAoKSA9PiB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKCkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbigpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXJhZ3JhcGhzID0gYXdhaXQgIHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUl0YWxpYyBleHRlbmRzIFNheSB7XHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHVyZUVsZW1lbnRzICgpIDogUHJvbWlzZTxBcnJheTxFbGVtZW50IHwgVGV4dD4+IHtcclxuICAgICAgICBsZXQgcGFyYWdyYXBocyA9IGF3YWl0IHRoaXMuZ2V0UGFyYWdyYXBocygpO1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudHMgPSBwYXJhZ3JhcGhzLmxlbmd0aCA9PSAxID8gcGFyYWdyYXBoc1swXSA6IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHBhcmFncmFwaHMpO1xyXG5cclxuICAgICAgICBsZXQgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpXCIpO1xyXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gW2JdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUxlZnRSaWdodCBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIGxlZnQgOiBTYXkgPSBuZXcgU2F5KCk7XHJcbiAgICBwcml2YXRlIHJpZ2h0IDogU2F5ID0gbmV3IFNheSgpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkTGVmdCAoLi4ub2JqcyA6IEFycmF5PFNheSB8IE9uZU9mIHwgT2JqZWN0IHwgUHJpbnRhYmxlIHwgc3RyaW5nIHwgbnVtYmVyIHwgU3RyaW5nIHwgKChzYXkgOiBTYXkpID0+IHN0cmluZyk+KSB7XHJcbiAgICAgICAgdGhpcy5sZWZ0LmFkZCguLi5vYmpzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUmlnaHQgKC4uLm9ianMgOiBBcnJheTxTYXkgfCBPbmVPZiB8IE9iamVjdCB8IFByaW50YWJsZSB8IHN0cmluZyB8IG51bWJlciB8IFN0cmluZyB8ICgoc2F5IDogU2F5KSA9PiBzdHJpbmcpPikge1xyXG4gICAgICAgIHRoaXMucmlnaHQuYWRkKC4uLm9ianMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRQdXJlRWxlbWVudHMgKCkgOiBQcm9taXNlPEFycmF5PEVsZW1lbnQgfCBUZXh0Pj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQuc2VxdWVuY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmlnaHQuZ2V0UHVyZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJpZ2h0LnNlcXVlbmNlLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxlZnQuZ2V0UHVyZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWFpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbWFpbkRpdi5jbGFzc0xpc3QuYWRkKFwiaG9yRmxleFwiKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGxlZnQuY2xhc3NMaXN0LmFkZChcImhvckZsZXhDb2x1bW5cIik7XHJcbiAgICAgICAgbWFpbkRpdi5hcHBlbmRDaGlsZChsZWZ0KTtcclxuXHJcbiAgICAgICAgbGV0IHJpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICByaWdodC5jbGFzc0xpc3QuYWRkKFwiaG9yRmxleENvbHVtblwiKTtcclxuICAgICAgICBtYWluRGl2LmFwcGVuZENoaWxkKHJpZ2h0KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5sZWZ0LmdldFB1cmVFbGVtZW50cygpLnRoZW4odmFsdWUgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5yaWdodC5nZXRQdXJlRWxlbWVudHMoKS50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gW21haW5EaXZdO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NheS50c1wiIC8+XHJcbmNsYXNzIFNheUxpbmsgZXh0ZW5kcyBTYXkge1xyXG4gICAgcHJpdmF0ZSBsaW5rZWRBY3Rpb24gOiBBY3Rpb247XHJcblxyXG4gICAgcHVibGljIHNldEFjdGlvbiAoYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5saW5rZWRBY3Rpb24gPSBhY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFB1cmVFbGVtZW50cyAoKSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IHBhcmFncmFwaHMgPSBhd2FpdCB0aGlzLmdldFBhcmFncmFwaHMoKTtcclxuXHJcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gcGFyYWdyYXBocy5sZW5ndGggPT0gMSA/IHBhcmFncmFwaHNbMF0gOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBwYXJhZ3JhcGhzKTtcclxuXHJcbiAgICAgICAgbGV0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYlwiKTtcclxuICAgICAgICBiLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0TGlua1wiKTtcclxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKGIsIHRoaXMubGlua2VkQWN0aW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtiXTtcclxuICAgIH1cclxufSIsImNsYXNzIFNheVRoZSBleHRlbmRzIFNheSB7XHJcbiAgICBwcml2YXRlIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgIHByaXZhdGUgdXBwZXJjYXNlID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYWx3YXlzUHJpbnQgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGF1dG9VcHBlcmNhc2U/IDogYm9vbGVhbiwgYWx3YXlzUHJpbnQ/IDogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgaWYgKGF1dG9VcHBlcmNhc2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBwZXJjYXNlID0gYXV0b1VwcGVyY2FzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsd2F5c1ByaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWx3YXlzUHJpbnQgPSBhbHdheXNQcmludDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFB1cmVFbGVtZW50cyAoc2F5IDogU2F5KSA6IFByb21pc2U8QXJyYXk8RWxlbWVudCB8IFRleHQ+PiB7XHJcbiAgICAgICAgbGV0IG5leHQgPSBzYXkuc2VxdWVuY2Vbc2F5LnNlcXVlbmNlUnVubmVyICsgMV07XHJcbiAgICAgICAgaWYgKHRoaXMuYWx3YXlzUHJpbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwidGhlIFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBUaGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoPFRoaW5nPiBuZXh0KS5wcm9wZXJseU5hbWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLm5vZGVWYWx1ZSA9IFwidGhlIFwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVZhbHVlICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudXBwZXJjYXNlICYmIHNheS5jdXJyZW50UGFyYWdyYXBoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9kZVZhbHVlID0gdGhpcy5ub2RlLm5vZGVWYWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgICsgdGhpcy5ub2RlLm5vZGVWYWx1ZS5zdWJzdHIoMSwgdGhpcy5ub2RlLm5vZGVWYWx1ZS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW3RoaXMubm9kZV07XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuQXBwZWFyYW5jZUhhbmRsZXIge1xyXG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwZWFyYW5jZVRhcmdldFwiKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKHRhcmdldC5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZCh0YXJnZXQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludCAoc2F5IDogU2F5KSB7XHJcbiAgICAgICAgYXdhaXQgc2F5LmdldEhUTUwoXCJwXCIsIFtcImFwcGVhcmFuY2VEZXNjcmlwdGlvblwiXSkudGhlbih2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCh2YWx1ZVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQXBwZWFyYW5jZSAoKSB7XHJcbiAgICAgICAgZW1wdHkoKTtcclxuICAgICAgICAvLyBUT0RPOiBtYXliZSB1c2UgbXVsdGlwbGUgbmFtZXMgZm9yIFwiZGlja1wiXHJcbiAgICAgICAgbGV0IHBsYXllcjogSHVtYW5vaWQgPSA8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyO1xyXG5cclxuICAgICAgICBsZXQgcGxheWVyR2VuZGVyID0gcGxheWVyLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgbGV0IHBsYXllclNsdXR0aW5lc3MgPSBwbGF5ZXIuZ2V0U2x1dHRpbmVzcygpO1xyXG4gICAgICAgIC8vIGxldCBwbGF5ZXJUb3AgPSBwbGF5ZXIuZ2V0VG9wQ2xvdGhPbihIdW1hbm9pZC5TTE9UX0JSRUFTVFMpO1xyXG4gICAgICAgIC8vIGxldCBwbGF5ZXJCb3R0b20gPSBwbGF5ZXIuZ2V0VG9wQ2xvdGhPbihIdW1hbm9pZC5TTE9UX0xFR19VUFBFUik7XHJcbiAgICAgICAgLy8gbGV0IHBsYXllclNob2VzID0gcGxheWVyLmdldFRvcENsb3RoT24oSHVtYW5vaWQuU0xPVF9GRUVUKTtcclxuXHJcbiAgICAgICAgbGV0IHlvdSA9IG5ldyBTYXlMaW5rKFwiWW91XCIpO1xyXG4gICAgICAgIHlvdS5zZXRBY3Rpb24obmV3IEFjdGlvbkV4YW1pbmUoV29ybGRTdGF0ZS5wbGF5ZXIsIFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvbiA9IG5ldyBTYXkoeW91LCBcIiBhcmUgcHJlc2VudGluZyBhcyBcIiwgbmV3IFNheUFuKCksIHBsYXllci5nZXRTaG9ydGVzdERlc2NyaXB0aW9uKCksIFwiLlwiKTtcclxuXHJcbiAgICAgICAgaWYgKHBsYXllclNsdXR0aW5lc3MubmFrZWQpIHtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiBZb3UgYXJlIG5ha2VkLlwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBsYXllclNsdXR0aW5lc3MuaGFsZk5ha2VkKSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIgWW91IGFyZSBhbG1vc3QgbmFrZWQuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpdHMgPSA8SHVtYW5vaWRCcmVhc3RzPiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHBsYXllciwgSHVtYW5vaWRCcmVhc3RzKTtcclxuICAgICAgICBsZXQgcGVuaXMgPSA8SHVtYW5vaWRQZW5pcz4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZShwbGF5ZXIsIEh1bWFub2lkUGVuaXMpO1xyXG4gICAgICAgIGxldCBidWxnZXMgPSBwbGF5ZXIuZ2V0QnVsZ2VzKCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgaWYgKGJ1bGdlcy5icmVhc3RzID4gMCB8fCBwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPiA2MCkge1xyXG4gICAgICAgICAgICBsZXQgcmVhbFRpdHMgPSB0aXRzLmdldFNpemVUZXh0KCk7XHJcbiAgICAgICAgICAgIGxldCBmYWtlVGl0cyA9IEh1bWFub2lkQnJlYXN0cy5nZXRTaXplVGV4dChidWxnZXMuYnJlYXN0cyk7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIgWW91IGhhdmUgXCIgKyByZWFsVGl0cyArIFwiIGJyZWFzdHNcIik7XHJcbiAgICAgICAgICAgIGlmIChidWxnZXMuYnJlYXN0cyAhPSB0aXRzLmdldFNpemUoKSAmJiByZWFsVGl0cyAhPSBmYWtlVGl0cykge1xyXG4gICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiwgcGFkZGVkIHRvIGFwcGVhciBhcyBcIiArIGZha2VUaXRzICsgXCIgdGhyb3VnaCB5b3VyIGNsb3RoaW5nLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGl0cy5pc1VuY292ZXJlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiwgc2FmZWx5IGNvdmVyZWQuXCIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLLCBuZXcgU2F5Qm9sZChcIkdlbmRlciBWYWx1ZTogXCIpLCBwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQpO1xyXG4gICAgICAgIC8vIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSywgbmV3IFNheUJvbGQoXCJTbHV0dGluZXNzIFZhbHVlOiBcIiksIHBsYXllclNsdXR0aW5lc3Muc2x1dHRpbmVzc0NvcnJlY3RlZCk7XHJcbiAgICAgICAgLy9wcmVzZW50YXRpb24uYWRkKFNheS5QQVJBR1JBUEhfQlJFQUssIG5ldyBTYXlCb2xkKFwiQnJlYXN0czogXCIpLCB0aXRzLmdldFNpemVUZXh0KCksIFwiIChWaXNpYmxlIGFzIFwiICsgSHVtYW5vaWRCcmVhc3RzLmdldFNpemVUZXh0KGJ1bGdlcy5icmVhc3RzKSArIFwiKVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHBlbmlzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiIFlvdSBoYXZlIFwiLCBuZXcgU2F5QW4oKSwgSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKSArIFwiIGNyb3RjaCBidWxnZSB2aXNpYmxlIHRocm91Z2ggeW91ciBjbG90aGluZy5cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlYWxEaWNrID0gcGVuaXMuZ2V0U2l6ZVRleHQoKTtcclxuICAgICAgICAgICAgbGV0IGZha2VEaWNrID0gSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dChidWxnZXMuY3JvdGNoKTtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZChcIiBZb3UgaGF2ZSBcIiwgbmV3IFNheUFuKCksIHJlYWxEaWNrICsgXCIgZGlja1wiKTtcclxuICAgICAgICAgICAgaWYgKHBlbmlzLmdldEFjdHVhbFNpemUoKSAhPSBidWxnZXMuY3JvdGNoICYmIHJlYWxEaWNrICE9IGZha2VEaWNrKSB7XHJcbiAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiLCB3aGljaCBsb29rcyBsaWtlIGl0IGlzIFwiICsgZmFrZURpY2sgKyBcIiBkdWUgdG8geW91ciBjbG90aGluZy5cIilcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghcGVuaXMuaXNVbmNvdmVyZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoXCIsIHdoaWNoIGlzIGNvdmVyZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkKFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHBlbmlzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgICBpZiAoYnVsZ2VzLmNyb3RjaCA+IDApIHtcclxuICAgICAgICAvLyAgICAgICAgIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSywgXCJZb3UgaGF2ZSBcIiwgbmV3IFNheUFuKCksIEh1bWFub2lkUGVuaXMuZ2V0U2l6ZVRleHQoYnVsZ2VzLmNyb3RjaCkgKyBcIiBidWxnZSB2aXNpYmxlIG9uIHlvdXIgY3JvdGNoLlwiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHByZXNlbnRhdGlvbi5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSyxcclxuICAgICAgICAvLyAgICAgICAgIG5ldyBTYXlCb2xkKFwiRGljazogXCIpLFxyXG4gICAgICAgIC8vICAgICAgICAgcGVuaXMuZ2V0U2l6ZVRleHQoKSxcclxuICAgICAgICAvLyAgICAgICAgIFwiIChWaXNpYmxlIGFzIFwiLFxyXG4gICAgICAgIC8vICAgICAgICAgbmV3IFNheUFuKCksXHJcbiAgICAgICAgLy8gICAgICAgICBIdW1hbm9pZFBlbmlzLmdldFNpemVUZXh0KGJ1bGdlcy5jcm90Y2gpLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHBsYXllckdlbmRlci5oYXNQZW5pcyA/XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIChwZW5pcy5pc0ZsYWNjaWQgPyBcIiBmbGFjY2lkXCIgOiBcIiBlcmVjdFwiKSArXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIChwZW5pcy5nZXRBY3R1YWxTaXplKCkgPCA5ID8gXCIgbWljcm9kaWNrXCIgOiBcIiBjb2NrXCIpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgOiBcIiBidWxnZVwiLFxyXG4gICAgICAgIC8vICAgICAgICAgXCIpXCJcclxuICAgICAgICAvLyAgICAgKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGhhcyBhIHNwZWNpZmljIGxvb2sgdG8gaXQuIE9wdGlvbmFsLiBIYXJkIHRvIGRvLlxyXG4gICAgICAgIC8vIEV4YW1wbGVzOiBcIllvdSBhcmUgZHJlc3NlZCBjYXN1YWxseSBsaWtlIGEgd29tYW4uXCIsIFwiWW91IGFyZSB3ZWFyaW5nIGZvcm1hbCB3b21lbidzIGNsb3RoaW5nLlwiIGV0Yy5cclxuXHJcbiAgICAgICAgYXdhaXQgcHJpbnQocHJlc2VudGF0aW9uKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcblxyXG4vKipcclxuICogVXBkYXRlIGZvbnQgc2l6ZXMgYWNjb3JkaW5nIHRvIHNjcmVlbiByZXNvbHV0aW9uIGFuZC9vciBtb2JpbGUgc3RhdHVzXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVGb250U2l6ZSAoKSB7XHJcbiAgICB2YXIgbWluV2lkdGggPSBFbGVtZW50cy5pc01vYmlsZT8gODAwIDogMTI4MDtcclxuICAgIHZhciBwcm9wb3J0aW9uID0gRWxlbWVudHMuaXNNb2JpbGUgPyAxNyA6IDE0LjU7XHJcbiAgICB2YXIgd2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgbWluV2lkdGggPyBtaW5XaWR0aCA6IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGVbIFwiZm9udC1zaXplXCIgXSA9ICh3aWR0aCAqIHByb3BvcnRpb24gLyAxMjgwKSArIFwicHhcIjtcclxufVxyXG5cclxudXBkYXRlRm9udFNpemUoKTtcclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlRm9udFNpemUpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9FbGVtZW50cy50c1wiIC8+XHJcbmZ1bmN0aW9uIHRvZ2dsZUZ1bGxTY3JlZW4oKSB7XHJcbiAgICB2YXIgZG9jID0gPGFueT4gd2luZG93LmRvY3VtZW50O1xyXG4gICAgdmFyIGRvY0VsID0gPGFueT4gZG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHJcbiAgICB2YXIgcmVxdWVzdEZ1bGxTY3JlZW4gPSBkb2NFbC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBkb2NFbC5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBkb2NFbC53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbiB8fCBkb2NFbC5tc1JlcXVlc3RGdWxsc2NyZWVuO1xyXG4gICAgdmFyIGNhbmNlbEZ1bGxTY3JlZW4gPSBkb2MuZXhpdEZ1bGxzY3JlZW4gfHwgZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4gfHwgZG9jLndlYmtpdEV4aXRGdWxsc2NyZWVuIHx8IGRvYy5tc0V4aXRGdWxsc2NyZWVuO1xyXG5cclxuICAgIGlmKCFkb2MuZnVsbHNjcmVlbkVsZW1lbnQgJiYgIWRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCAmJiAhZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ICYmICFkb2MubXNGdWxsc2NyZWVuRWxlbWVudCkge1xyXG4gICAgICAgIHJlcXVlc3RGdWxsU2NyZWVuLmNhbGwoZG9jRWwpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY2FuY2VsRnVsbFNjcmVlbi5jYWxsKGRvYyk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuSG92ZXJJbmZvIHtcclxuICAgIHZhciBob3ZlcmJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaG92ZXJJbmZvXCIpO1xyXG4gICAgdmFyIGNvbnRlbnRUYXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhvdmVyQ29udGVudFwiKTtcclxuICAgIHZhciB3aWR0aCA9IDA7XHJcbiAgICB2YXIgaGVpZ2h0ID0gMDtcclxuXHJcbiAgICBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgd2hpbGUgKGNvbnRlbnRUYXJnZXQuZmlyc3RDaGlsZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29udGVudFRhcmdldC5yZW1vdmVDaGlsZChjb250ZW50VGFyZ2V0LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWFrZUhvdmVyYWJsZSAoZWxlbWVudCA6IEVsZW1lbnQsIGNvbnRlbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+KSB7XHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoZSA6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuSG92ZXJJbmZvLmhvdmVyU3RhcnQoZSwgY29udGVudHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgKGUgOiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkhvdmVySW5mby5ob3Zlck1vdmUoZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChlIDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5Ib3ZlckluZm8uaG92ZXJFbmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaG92ZXJTdGFydCAoZSA6IE1vdXNlRXZlbnQsIGNvbnRlbnRzIDogQXJyYXk8RWxlbWVudCB8IFRleHQ+KSB7XHJcbiAgICAgICAgZW1wdHkoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRUYXJnZXQuYXBwZW5kQ2hpbGQoY29udGVudHNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBob3ZlcmJveC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG5cclxuXHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUubGVmdCA9IFwiMHB4XCI7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUudG9wID0gXCIwcHhcIjtcclxuICAgICAgICB3aWR0aCA9IGhvdmVyYm94Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGhlaWdodCA9IGhvdmVyYm94Lm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgaG92ZXJNb3ZlKGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3Zlck1vdmUgKGUgOiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGxlZnQgPSBlLmNsaWVudFggLSAod2lkdGgvMik7XHJcbiAgICAgICAgbGV0IHRvcCA9IGUuY2xpZW50WSAtIChoZWlnaHQpIC0gNjtcclxuXHJcbiAgICAgICAgaWYgKHRvcCA8IDApIHtcclxuICAgICAgICAgICAgdG9wID0gZS5jbGllbnRZICsgNjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsZWZ0IDwgd2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdCA9IHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gV2lkdGggc2VlbXMgdG8gbm90IGJlIGNvbnNpZGVyaW5nIHRoZSBib3JkZXIsIGV2ZW4gdGhvdWdoIHdlIGFwcGxpZWQgYm9yZGVyLWJveFxyXG4gICAgICAgIC8vIEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gZmlndXJlIHRoaXMgb3V0IHNvIHRoZXJlJ3MgYSBtYXJnaW4gb24gdGhlIHNpZGUhXHJcbiAgICAgICAgaWYgKGxlZnQgKyB3aWR0aCA+IEVsZW1lbnRzLnNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSBFbGVtZW50cy5zY3JlZW5XaWR0aCAtIHdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUubGVmdCA9IE1hdGgucm91bmQobGVmdCkgKyBcInB4XCI7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUudG9wID0gTWF0aC5yb3VuZCh0b3ApICsgXCJweFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3ZlckVuZCAoKSB7XHJcbiAgICAgICAgaG92ZXJib3guc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0VsZW1lbnRzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlciB7XHJcbiAgICBleHBvcnQgdmFyIGxpbmtlZEFjdGlvbnNUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtBY3Rpb25zXCIpO1xyXG4gICAgZXhwb3J0IHZhciBjb21tb25BY3Rpb25zVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb21tb25BY3Rpb25zVGFiXCIpO1xyXG5cclxuICAgIHZhciBjdXJyZW50Q29tbWFuZCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjdXJyZW50Q29tbWFuZFwiKS5hcHBlbmRDaGlsZChjdXJyZW50Q29tbWFuZCk7XHJcblxyXG4gICAgdmFyIGN1cnJlbnRBY3Rpb25UYXJnZXQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua1RhcmdldFwiKS5hcHBlbmRDaGlsZChjdXJyZW50QWN0aW9uVGFyZ2V0KTtcclxuXHJcbiAgICB2YXIgY29tbW9uQWN0aW9ucyA9IFtdO1xyXG4gICAgdmFyIGF2YWlsYWJsZUFjdGlvbnMgPSBbXTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzZXRDb21tb25BY3Rpb25zICgpIHtcclxuICAgICAgICBjb21tb25BY3Rpb25zLnNwbGljZSgwLCBjb21tb25BY3Rpb25zLmxlbmd0aCk7XHJcbiAgICAgICAgd2hpbGUgKGNvbW1vbkFjdGlvbnNUYWIuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICBjb21tb25BY3Rpb25zVGFiLnJlbW92ZUNoaWxkKGNvbW1vbkFjdGlvbnNUYWIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBhZGRDb21tb25BY3Rpb24gKG5hbWUgOiBzdHJpbmcsIGFjdGlvbiA6IEFjdGlvbikge1xyXG4gICAgICAgIGNvbW1vbkFjdGlvbnMucHVzaChbbmFtZSwgYWN0aW9uXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRBdmFpbGFibGVBY3Rpb25zICgpIHtcclxuICAgICAgICBhdmFpbGFibGVBY3Rpb25zID0gW107XHJcbiAgICAgICAgY3VycmVudEFjdGlvblRhcmdldC5ub2RlVmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHdoaWxlIChsaW5rZWRBY3Rpb25zVGFiLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgbGlua2VkQWN0aW9uc1RhYi5yZW1vdmVDaGlsZChsaW5rZWRBY3Rpb25zVGFiLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gYWRkQXZhaWxhYmxlQWN0aW9uIChuYW1lIDogc3RyaW5nLCBhY3Rpb24gOiBBY3Rpb24pIHtcclxuICAgICAgICBhdmFpbGFibGVBY3Rpb25zLnB1c2goW25hbWUsIGFjdGlvbl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBob3ZlckFjdGlvbiAoYWN0aW9uIDogQWN0aW9uKSB7XHJcbiAgICAgICAgY3VycmVudENvbW1hbmQubm9kZVZhbHVlID0gYWN0aW9uLmdldENvbW1hbmRUZXh0KCkudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdW5ob3ZlckFjdGlvbiAoKSB7XHJcbiAgICAgICAgY3VycmVudENvbW1hbmQubm9kZVZhbHVlID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlwZXJsaW5rT2JqZWN0ICh0aGluZz8gOiBhbnkpIHtcclxuICAgICAgICByZXNldEF2YWlsYWJsZUFjdGlvbnMoKTtcclxuICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBUaGluZyAmJiB0aGluZyAhPSBXb3JsZFN0YXRlLnBsYXllciAmJiB0aGluZy5pc1Zpc2libGVUbyhXb3JsZFN0YXRlLnBsYXllcikpIHtcclxuICAgICAgICAgICAgYXdhaXQgSHlwZXJsaW5raW5nUnVsZWJvb2suZXhlY3V0ZSh7bm91bjogdGhpbmd9KTtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRBY3Rpb25UYXJnZXQubm9kZVZhbHVlID0gdGhpbmcuZ2V0UHJpbnRlZE5hbWUoKSArIFwiOiBcIjtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCB2YWx1ZSA9IGF2YWlsYWJsZUFjdGlvbnNbaV07IHZhbHVlICE9IHVuZGVmaW5lZDsgdmFsdWUgPSBhdmFpbGFibGVBY3Rpb25zWysraV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaW5rID0gY3JlYXRlTGluayh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoXCJjb2x1bW5MaW5rXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUobGluaywgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRTZWNvbmRLZXlDb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgbGlua2VkQWN0aW9uc1RhYi5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGVMaW5rICh2YWx1ZSA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWVbMF0pKTtcclxuICAgICAgICBDb250cm9scy5MaW5rcy5tYWtlTGluayhsaW5rLCB2YWx1ZVsxXSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbms7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5cGVybGlua0NvbW1vbkFjdGlvbnMgKCkge1xyXG4gICAgICAgIHJlc2V0Q29tbW9uQWN0aW9ucygpO1xyXG5cclxuICAgICAgICBhd2FpdCBDb21tb25BY3Rpb25zUnVsZWJvb2suZXhlY3V0ZSh7fSk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCB2YWx1ZSA9IGNvbW1vbkFjdGlvbnNbaV07IHZhbHVlICE9IHVuZGVmaW5lZDsgdmFsdWUgPSBjb21tb25BY3Rpb25zWysraV0pIHtcclxuICAgICAgICAgICAgbGV0IGxpbmsgPSBjcmVhdGVMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKFwibGluZUxpbmtcIik7XHJcbiAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKGxpbmssIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0VGhpcmRLZXlDb2RlKCkpO1xyXG4gICAgICAgICAgICBjb21tb25BY3Rpb25zVGFiLmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoeXBlcmxpbmtpbmcgcnVsZWJvb2sgaXMgcmFuIG92ZXIgdGhlIGxhc3QgdGhpbmcgdGhlIHBsYXllciBpbnRlcmFjdGVkIHdpdGguXHJcbiAgICAgKiAgSXQgcG9wdWxhdGVzIHRoZSBoeXBlcmxpbmtzIHRhYiB3aXRoIGluZm9ybWF0aW9uIG9uIHRoZSB0aGluZyB0aGF0IHdhcyBpbnRlcmFjdGVkIHdpdGguXHJcbiAgICAgKiBAdHlwZSB7UnVsZWJvb2t9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgSHlwZXJsaW5raW5nUnVsZWJvb2sgPSBuZXcgUnVsZWJvb2s8VGhpbmc+KFwiSHlwZXJsaW5raW5nIHNvbWV0aGluZ1wiKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjb21tb24gYWN0aW9ucyBydWxlYm9vayBzZXJ2ZXMgdG8gc2V0IHVwIGFsbCB0aGUgYXZhaWxhYmxlIGNvbW1vbiBhY3Rpb25zIGZvciB0aGUgcGxheWVyLlxyXG4gICAgICogIEl0IHNob3VsZCBjaGVjayB0aGUgcGxheWVyJ3MgY3VycmVudCBzdGF0ZSB0byBzZWUgaWYgYSBjb21tYW5kIGlzIGFwcGxpY2FibGUgYW5kXHJcbiAgICAgKiAgICB0aGVuIEFERCBzYWlkIGNvbW1hbmQgdG8gdGhlIEh5cGVybGlua0hhbmRsZXIuXHJcbiAgICAgKiBAdHlwZSB7UnVsZWJvb2t9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgQ29tbW9uQWN0aW9uc1J1bGVib29rID0gbmV3IFJ1bGVib29rPHZvaWQ+KFwiQ29tbW9uIEFjdGlvbnMgUnVsZWJvb2tcIik7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS50c1wiIC8+XHJcbmNsYXNzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrID0gbmV3IFJ1bGVib29rPEFjdGlvbj4oXCJDaGVjayBhbnkgQWN0aW9uXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeSA9IG5ldyBSdWxlYm9vazxBY3Rpb24+KFwiQ2Fycnkgb3V0IGFueSBBY3Rpb25cIik7XHJcblxyXG4gICAgcHVibGljIGV4dHJhQ2hlY2tzIDogQXJyYXk8UnVsZWJvb2s8QWN0aW9uPj4gPSBbXTtcclxuICAgIHB1YmxpYyBleHRyYUNhcnJpZXMgOiBBcnJheTxSdWxlYm9vazxBY3Rpb24+PiA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBfYWN0b3IgOiBUaGluZztcclxuICAgIHB1YmxpYyBub3VucyA6IEFycmF5PFRoaW5nPiA9IFtdO1xyXG4gICAgcHVibGljIHNheSA6IFNheSA9IG5ldyBTYXkoKTtcclxuXHJcbiAgICBwdWJsaWMgYWN0aW5nQWdyZXNzaXZlbHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBhY3RpbmdTdWJtaXNzaXZlbHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc1R1cm4gPSB0cnVlO1xyXG4gICAgcHVibGljIHJlcXVpcmVzTm91biA9IHRydWU7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNWaXNpYmlsaXR5ID0gdHJ1ZTsgLy8gRmlyc3Qgbm91biBtdXN0IGJlIHZpc2libGUgYW5kIGluIHRoZSBzYW1lIHJvb21cclxuXHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChhY3RvciA6IFRoaW5nLCAuLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLmFjdG9yID0gYWN0b3I7XHJcbiAgICAgICAgbm91bnMuZm9yRWFjaCgodmFsdWUsIGluZGV4LCBhcnJheSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldE5vdW4oaW5kZXgsIHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUgKCkgOiBQcm9taXNlPFNheT4ge1xyXG4gICAgICAgIHRoaXMuc2F5ID0gbmV3IFNheSgpO1xyXG5cclxuICAgICAgICBsZXQgY2hlY2tSdWxlYm9va3MgPSBbXTtcclxuICAgICAgICBsZXQgY2FycnlSdWxlYm9va3MgPSBbXTtcclxuICAgICAgICBsZXQgY0NsYXNzID0gdGhpcy5jb25zdHJ1Y3RvcjtcclxuICAgICAgICB3aGlsZSAoY0NsYXNzICE9IEFjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAoKDx0eXBlb2YgQWN0aW9uPiBjQ2xhc3MpLmNoZWNrICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tSdWxlYm9va3MucHVzaCgoPHR5cGVvZiBBY3Rpb24+IGNDbGFzcykuY2hlY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgoPHR5cGVvZiBBY3Rpb24+IGNDbGFzcykuY2FycnkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjYXJyeVJ1bGVib29rcy5wdXNoKCg8dHlwZW9mIEFjdGlvbj4gY0NsYXNzKS5jYXJyeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY0NsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNDbGFzcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDaGVjayBpZiBhY3Rpb24gZ29lcyB0aHJvdWdoXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IEFjdGlvbi5jaGVjay5leGVjdXRlKHtcclxuICAgICAgICAgICAgbm91biA6IHRoaXNcclxuICAgICAgICB9LCAuLi5jaGVja1J1bGVib29rcyk7XHJcblxyXG4gICAgICAgIC8vIFRoZXJlIGFyZSBub3cgbXVsdGlwbGUgcmVzdWx0cyEgQSBmYWxzZSByZXN1bHQgbWVhbnMgYSBmYWlsIENoZWNrISBCdXQgaXQgY2FuIGFsc28gcmV0dXJuIGEgbmV3IGFjdGlvbiFcclxuICAgICAgICBpZiAocmVzdWx0ID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYocmVzdWx0IGluc3RhbmNlb2YgQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoUnVsZWJvb2suZ2V0SW5kZW50YXRpb24oKSArIFwiW0FDVElPTl0gSW5zdGVhZCBvZi4uLlwiKTtcclxuICAgICAgICAgICAgYXdhaXQgcmVzdWx0LmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgdGhpcy5zYXkuYWRkKHJlc3VsdC5zYXkpO1xyXG4gICAgICAgICAgICB0aGlzLm5vdW5zID0gcmVzdWx0Lm5vdW5zO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDYXJyeSBPdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBhd2FpdCBBY3Rpb24uY2FycnkuZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgIG5vdW4gOiB0aGlzXHJcbiAgICAgICAgfSwgLi4uY2FycnlSdWxlYm9va3MpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zYXk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGFjdG9yKCk6IFRoaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGFjdG9yKHZhbHVlOiBUaGluZykge1xyXG4gICAgICAgIHRoaXMuX2FjdG9yID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vdW4gKG4gOiBudW1iZXIpIDogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5ub3Vucy5sZW5ndGggPiBuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vdW5zW25dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROb3VuIChuIDogbnVtYmVyLCBub3VuIDogYW55KSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMubm91bnMubGVuZ3RoIDwgbikge1xyXG4gICAgICAgICAgICB0aGlzLm5vdW5zLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ub3Vuc1tuXSA9IG5vdW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiZG9cIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIGFuIGFjdGlvbiBpcyBzdG9wcGVkLCBpdCBtZWFucyBpdCBmYWlsZWQgc28gc3BlY3RhY3VsYXJseSB0aGF0IGl0IGRpZG4ndCBldmVuIGJlZ2luLlxyXG4gICAgICogV2hpY2ggbWVhbnMgaWYgdGhlIHBsYXllciBpcyBkb2luZyBpdCwgaXQnbGwgbm90IHRha2UgYSB0dXJuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcCAoKSB7XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1R1cm4gPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gQWN0aW9uLmFkZENhcnJ5UnVsZShuZXcgUnVsZSh7XHJcbi8vICAgICBuYW1lIDogXCJUZXN0aW5nIHNheSBpbiBhY3Rpb25zIHJ1bGVcIixcclxuLy8gICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbi8vICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbi8vICAgICBjb2RlIDogKHJ1bGUsIHJ1bGVib29rKSA9PiB7XHJcbi8vICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb24+IHJ1bGVib29rLm5vdW47XHJcbi8vICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgZG8gbm90aGluZyBhbGwgdHVybi4gV2hhdCB3YXMgdGhlIHBvaW50LCByZWFsbHk/XCIpO1xyXG4vLyAgICAgfVxyXG4vLyB9KSlcclxuXHJcbkFjdGlvbi5jaGVjay5hZGRSdWxlKFxyXG4gICAgbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkNoZWNrIGFueSBBY3Rpb24gLSBSZXF1aXJlcyBOb3VuXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXROb3VuKDApID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLnJlcXVpcmVzTm91bjtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4pO1xyXG5cclxuQWN0aW9uLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgYW55IEFjdGlvbiAtIFJlcXVpcmVzIFZpc2liaWxpdHlcIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbj4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBpZiAoIWFjdGlvbi5nZXROb3VuKDApLmlzVmlzaWJsZVRvKGFjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLnJlcXVpcmVzVmlzaWJpbGl0eTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4pOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzXCIgLz5cclxuXHJcbmNsYXNzIEFjdGlvbkV4YW1pbmUgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHJlcXVpcmVzVHVybiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgPSBuZXcgUnVsZWJvb2s8QWN0aW9uRXhhbWluZT4oXCJDaGVjayBFeGFtaW5pbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5ID0gbmV3IFJ1bGVib29rPEFjdGlvbkV4YW1pbmU+KFwiQ2Fycnkgb3V0IEV4YW1pbmluZ1wiKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZWRzIHRvIHJldHVybiBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgdGhlIHBsYXllciB3aWxsIGRvIGlmIGhlIGRvZXMgdGhpcyBhY3Rpb24uXHJcbiAgICAgKiBGb3IgaW5zdGFuY2UsIEFjdGlvblRha2luZyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBsaWtlIHJldHVybiBcInRha2UgXCIgKyB0aGlzLm5vdW5zWzBdLmdldE5hbWUoKSxcclxuICAgICAqICAgd2hpY2ggd291bGQgcmVhZCBhcyBcInRha2UgdGhpbmdcIi5cclxuICAgICAqICAgcmVtZW1iZXIgdGhhdCB0aGluZ3MgaW1wbGVtZW50IFBSSU5UQUJMRSBpbnRlcmZhY2UsIHNvIHlvdSBjYW4gZ2V0IHRoZWlyIG5hbWVzLlxyXG4gICAgICogQHJldHVybnMge1NheX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXROb3VuKDApID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcImV4YW1pbmUgbXlzZWxmXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcImV4YW1pbmUgXCIgKyAodGhpcy5nZXROb3VuKDApICE9IHVuZGVmaW5lZCA/IHRoaXMuZ2V0Tm91bigwKS5nZXRQcmludGVkTmFtZSgpIDogXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBQcmludERlc2NyaXB0aW9uT2ZFeGFtaW5lZFRoaW5nUnVsZSA9IEFjdGlvbkV4YW1pbmUuY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiRXhhbWluZSAtIFByaW50IERlc2NyaXB0aW9uIG9mIEV4YW1pbmVkIFRoaW5nXCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vaykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGxldCBub3VuID0gYWN0aW9uLmdldE5vdW4oMCk7XHJcbiAgICAgICAgICAgIGlmIChub3VuIGluc3RhbmNlb2YgVGhpbmcgJiYgKDxUaGluZz4gbm91bikuaW1hZ2UgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZCgoPFRoaW5nPiBub3VuKS5pbWFnZSwgU2F5LlBBUkFHUkFQSF9CUkVBSyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKCg8VGhpbmc+IGFjdGlvbi5nZXROb3VuKDApKS5nZXRQcmludGVkRGVzY3JpcHRpb24oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbkVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuQ29tbW9uQWN0aW9uc1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiTG9vayBhdCBtZSFcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5hZGRDb21tb25BY3Rpb24oXCJJbnNwZWN0XCIsIG5ldyBBY3Rpb25FeGFtaW5lKFdvcmxkU3RhdGUucGxheWVyLCBXb3JsZFN0YXRlLnBsYXllcikpO1xyXG4gICAgfVxyXG59KSk7IiwiYWJzdHJhY3QgY2xhc3MgUmVsYXRpb25IYW5kbGVyIHtcclxuICAgIHByb3RlY3RlZCByZWxhdGlvbnMgOiBBcnJheTxSZWxhdGlvbj47XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICguLi5yZWxhdGlvbnMgOiBBcnJheSA8UmVsYXRpb24+KSB7XHJcbiAgICAgICAgcmVsYXRpb25zLmZvckVhY2gocmVsYXRpb24gPT4ge1xyXG4gICAgICAgICAgICByZWxhdGlvbi5zZXRIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVsYXRpb25zID0gcmVsYXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSZWxhdGlvbiAocmVsYXRpb24gOiBSZWxhdGlvbikge1xyXG4gICAgICAgIHRoaXMucmVsYXRpb25zLnB1c2gocmVsYXRpb24pO1xyXG4gICAgICAgIHJlbGF0aW9uLnNldEhhbmRsZXIodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFic3RyYWN0IHNldFJlbGF0aW9uIChyZWxhdGlvbiA6IFJlbGF0aW9uLCBsZWZ0IDogYW55LCByaWdodCA6IGFueSwgdmFsdWU/IDogYW55KSA6IGJvb2xlYW47XHJcbn1cclxuXHJcbmFic3RyYWN0IGNsYXNzIFJlbGF0aW9uIHtcclxuICAgIHB1YmxpYyBoYW5kbGVyIDogUmVsYXRpb25IYW5kbGVyO1xyXG5cclxuICAgIHB1YmxpYyBzZXRIYW5kbGVyIChoYW5kbGVyIDogUmVsYXRpb25IYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzSGFuZGxlciAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlciAhPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFic3RyYWN0IHNldFJlbGF0aW9uIChsZWZ0IDogYW55LCByaWdodCA6IGFueSwgdmFsdWU/IDogYW55KSA6IHZvaWQ7XHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgdW5zZXRSaWdodCAocmlnaHQgOiBhbnkpIDogdm9pZDtcclxuICAgIHB1YmxpYyBhYnN0cmFjdCB1bnNldExlZnQgKGxlZnQgOiBhbnkpIDogdm9pZDtcclxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRMZWZ0IChyaWdodCA6IGFueSkgOiBhbnk7XHJcbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0UmlnaHQgKGxlZnQgOiBhbnkpIDogYW55O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlU3RyaW5nIChvYmoxIDogYW55LCBvYmoyIDogYW55KSA6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBPYmplY3QgJiYgb2JqMiBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBsZXQgaWQxID0gUmVsYXRpb24uZ2V0SWQob2JqMSk7XHJcbiAgICAgICAgICAgIGxldCBpZDIgPSBSZWxhdGlvbi5nZXRJZChvYmoyKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlkMSA8IGlkMiA/XHJcbiAgICAgICAgICAgICAgICAoaWQxICsgXCI7XCIgKyBpZDIpIDpcclxuICAgICAgICAgICAgICAgIChpZDIgKyBcIjtcIiArIGlkMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdENvdW50ID0gMDtcclxuICAgIHByaXZhdGUgc3RhdGljIG9iamVjdElkRmllbGQgPSBcIl9SRUxBVElPTklOVEVSTkFMSURcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIGlmIGdldElkID49IDAsIHRoZW4gb2JqIGlzIE5PVCBhbiBPYmplY3RcclxuICAgICAqIGlmIGdldElkICA8IDAsIHRoZW4gb2JqIGlzIGFuIE9iamVjdFxyXG4gICAgICogQHBhcmFtIG9ialxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJZCAob2JqIDogT2JqZWN0KSA6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKG9ialtSZWxhdGlvbi5vYmplY3RJZEZpZWxkXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb2JqW1JlbGF0aW9uLm9iamVjdElkRmllbGRdID0gUmVsYXRpb24ub2JqZWN0Q291bnQrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9ialtSZWxhdGlvbi5vYmplY3RJZEZpZWxkXTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SZWxhdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9GdW5jdGlvbnMudHNcIiAvPlxyXG5jbGFzcyBSZWxhdGlvbkhhbmRsZXJTdHJpY3RPbmVUb01hbnkgZXh0ZW5kcyBSZWxhdGlvbkhhbmRsZXIge1xyXG5cclxuICAgIHB1YmxpYyBzZXRSZWxhdGlvbiAocmVsYXRpb24gOiBSZWxhdGlvbiwgbGVmdCA6IGFueSwgcmlnaHQgOiBhbnksIHZhbHVlPyA6IGFueSkgOiBib29sZWFuIHtcclxuICAgICAgICAvLyBhIExFRlQgbXVzdCBub3QgY2lyY2xlIGluIG9uIGl0c2VsZlxyXG4gICAgICAgIC8vIElzIHJpZ2h0IGFueSBvZiB0aGUgbGVmdCdzIHBhcmVudHM/XHJcbiAgICAgICAgbGV0IHBhcmVudHMgPSB0aGlzLmdldEFsbExlZnQobGVmdCk7XHJcbiAgICAgICAgaWYgKHBhcmVudHMuaW5kZXhPZihyaWdodCkgIT0gLTEpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiW1JlbGF0aW9uXSBBdHRlbXB0IHRvIGNyZWF0ZSBhIGNpcmN1bGFyIHJlbGF0aW9uOlwiLCB0aGlzLCBsZWZ0LCByaWdodCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQWxsb3dpbmcgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhciByZWxhdGlvblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZnJvbSB0aGlzIHBvaW50IG9uIHdlJ2xsIGd1YXJhbnRlZSB0aGF0IHRoZSBuZXcgcmVsYXRpb24gY2FuIGJlIG1hZGUuXHJcbiAgICAgICAgLy8gQ2hhbmdlcyB3aWxsIG9jY3VyLCBzbyBcInJldHVybiBmYWxzZVwiIGlzIG5vIGxvbmdlciBhY2NlcHRhYmxlLlxyXG4gICAgICAgIC8vIGEgUklHSFQgY2FuIG9ubHkgcG9pbnQgdG8gYSBzaW5nbGUgTEVGVFxyXG4gICAgICAgIHRoaXMudW5zZXRSaWdodChyaWdodCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldCAodGhpbmcgOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnVuc2V0TGVmdCh0aGluZyk7XHJcbiAgICAgICAgdGhpcy51bnNldFJpZ2h0KHRoaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5zZXRMZWZ0IChsZWZ0OiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJlbGF0aW9ucy5mb3JFYWNoKHJlbGF0aW9uID0+IHtcclxuICAgICAgICAgICAgcmVsYXRpb24udW5zZXRMZWZ0KGxlZnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldFJpZ2h0IChyaWdodCA6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVsYXRpb25zLmZvckVhY2gocmVsYXRpb24gPT4ge1xyXG4gICAgICAgICAgICByZWxhdGlvbi51bnNldFJpZ2h0KHJpZ2h0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBIG1hbnkgY2FuIG9ubHkgaGF2ZSBvbmUgb25lXHJcbiAgICBwdWJsaWMgZ2V0TGVmdCAocmlnaHQgOiBhbnkpIHtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZWxhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5yZWxhdGlvbnNbaV0uZ2V0TGVmdChyaWdodCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyByZXR1cm5zIGFsbCBvbmVzIHRoYXQgYXJlIHJlbGV2YW50LlxyXG4gICAgICogU28gaW4gYSByZWxhdGlvbnNoaXAgbGlrZSBBIC0+IEIgLT4gQyBhbmQgYXNraW5nIGZvciBDLCB0aGlzIHdpbGwgcmV0dXJuXHJcbiAgICAgKiBCIGJlY2F1c2UgaXQncyByZWxhdGVkIHRvIEMgYW5kIHRoZW4gQSBiZWNhdXNlIHRoYXQncyByZWxhdGVkIHRvIEIuXHJcbiAgICAgKiBAcGFyYW0gcmlnaHRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFsbExlZnQgKHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IG5ld1BhcmVudCA9IHRoaXMuZ2V0TGVmdChyaWdodCk7XHJcbiAgICAgICAgbGV0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICB3aGlsZSAobmV3UGFyZW50ICE9IHVuZGVmaW5lZCApIHtcclxuICAgICAgICAgICAgcGFyZW50cy5wdXNoKG5ld1BhcmVudCk7XHJcbiAgICAgICAgICAgIG5ld1BhcmVudCA9IHRoaXMuZ2V0TGVmdChuZXdQYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsTGVmdFR5cGUgKHJpZ2h0IDogYW55LCB0eXBlIDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGVmdChyaWdodCkuZmlsdGVyKGxlZnQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHR5cGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBoaWdoZXN0IE9uZSB0aGF0IGNhbiBiZSBmb3VuZC5cclxuICAgICAqIGZvciBBIC0+IEIgLT4gQyBhbmQgYXNraW5nIGZvciBDLCB0aGlzIHdvdWxkIHJldHVybiBBXHJcbiAgICAgKiBhcyB0aGF0J3MgdGhlIG9uZSBcIm9yaWdpbmF0aW5nXCIgdGhlIG90aGVyIHJlbGF0aW9ucy5cclxuICAgICAqIEBwYXJhbSByaWdodFxyXG4gICAgICogQHJldHVybnMge2FueX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExhc3RMZWZ0IChyaWdodCA6IGFueSkge1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmdldExlZnQocmlnaHQpO1xyXG4gICAgICAgIGxldCBuZXdQYXJlbnQgPSB0aGlzLmdldExlZnQocGFyZW50KTtcclxuICAgICAgICB3aGlsZSAobmV3UGFyZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwYXJlbnQgPSBuZXdQYXJlbnQ7XHJcbiAgICAgICAgICAgIG5ld1BhcmVudCA9IHRoaXMuZ2V0TGVmdChwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxSaWdodCAobGVmdCA6IGFueSkge1xyXG4gICAgICAgIGxldCByaWdodHMgPSBbXTtcclxuICAgICAgICB0aGlzLnJlbGF0aW9ucy5mb3JFYWNoKHJlbGF0aW9uID0+IHtcclxuICAgICAgICAgICAgcmlnaHRzLnB1c2goLi4ucmVsYXRpb24uZ2V0UmlnaHQobGVmdCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFycmF5VW5pcXVlKHJpZ2h0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsUmlnaHRUeXBlcyAobGVmdCA6IGFueSwgcmlnaHRUeXBlIDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsUmlnaHQobGVmdCkuZmlsdGVyKHJpZ2h0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJpZ2h0IGluc3RhbmNlb2YgcmlnaHRUeXBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBSZWxhdGlvbk9uZVRvTWFueSBleHRlbmRzIFJlbGF0aW9uIHtcclxuICAgIHByaXZhdGUgdmFsdWVzSGFzaCA6IHtbaWRpZCA6IHN0cmluZ10gOiBhbnl9ID0ge307XHJcbiAgICBwcml2YXRlIG9uZU1hcCA9IG5ldyBNYXA8YW55LCBBcnJheTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBtYW55TWFwID0gbmV3IE1hcDxhbnksIGFueT4oKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWUgKGxlZnQgOiBhbnksIHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzSGFzaFtSZWxhdGlvbi5jcmVhdGVTdHJpbmcobGVmdCwgcmlnaHQpXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ubHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIE9iamV0cyBjYW4gaGF2ZSB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSBsZWZ0XHJcbiAgICAgKiBAcGFyYW0gcmlnaHRcclxuICAgICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VmFsdWUgKGxlZnQgOiBhbnksIHJpZ2h0IDogYW55LCB2YWx1ZSA6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLm1hbnlNYXAuZ2V0KHJpZ2h0KSA9PSBsZWZ0KSB7XHJcbiAgICAgICAgICAgIGxldCBzdHJpbmcgPSBSZWxhdGlvbi5jcmVhdGVTdHJpbmcobGVmdCwgcmlnaHQpO1xyXG4gICAgICAgICAgICBpZiAoc3RyaW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNIYXNoW3N0cmluZ10gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0UmVsYXRpb24gKGxlZnQgOiBhbnksIHJpZ2h0IDogYW55LCB2YWx1ZT8gOiBhbnkpIHtcclxuICAgICAgICBsZXQgcHJvY2VlZDtcclxuICAgICAgICBpZiAodGhpcy5oYW5kbGVyICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwcm9jZWVkID0gdGhpcy5oYW5kbGVyLnNldFJlbGF0aW9uKHRoaXMsIGxlZnQsIHJpZ2h0LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvY2VlZCkge1xyXG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgb24gdGhlIGxlZnQgY2FuJ3QgYmUgb24gdGhlIHJpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMudW5zZXRSaWdodChsZWZ0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBvbiB0aGUgcmlnaHQgY2FuJ3QgYmUgb24gdGhlIGxlZnRcclxuICAgICAgICAgICAgdGhpcy51bnNldExlZnQocmlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIG9uIHRoZSByaWdodCBjYW4gb25seSBoYXZlIG9uZSBsZWZ0XHJcbiAgICAgICAgICAgIHRoaXMudW5zZXRSaWdodChyaWdodCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RyaW5nID0gUmVsYXRpb24uY3JlYXRlU3RyaW5nKGxlZnQsIHJpZ2h0KTtcclxuICAgICAgICAgICAgaWYgKHN0cmluZyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzSGFzaFtzdHJpbmddID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tYW55TWFwLnNldChyaWdodCwgbGVmdCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9uZU1hcC5nZXQobGVmdCkgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uZU1hcC5zZXQobGVmdCwgW3JpZ2h0XSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uZU1hcC5nZXQobGVmdCkucHVzaChyaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldExlZnQgKHJpZ2h0IDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWFueU1hcC5nZXQocmlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbnlMZWZ0ICgpIHtcclxuICAgICAgICBsZXQgbGVmdCA9IFtdO1xyXG4gICAgICAgIHRoaXMub25lTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgbGVmdC5wdXNoKGtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXJyYXlVbmlxdWUobGVmdCk7XHJcbiAgICAgICAgcmV0dXJuIGxlZnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFueVJpZ2h0ICgpIHtcclxuICAgICAgICBsZXQgcmlnaHRzID0gW107XHJcbiAgICAgICAgdGhpcy5vbmVNYXAuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgcmlnaHRzLnB1c2goLi4udmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFycmF5VW5pcXVlKHJpZ2h0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJpZ2h0cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QW55UmlnaHRUeXBlICh0eXBlIDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW55UmlnaHQoKS5maWx0ZXIodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1JpZ2h0IChsZWZ0IDogYW55LCBuZWVkbGUgOiBhbnkpIHtcclxuICAgICAgICBsZXQgcmlnaHQgPSB0aGlzLm9uZU1hcC5nZXQobGVmdCk7XHJcbiAgICAgICAgaWYgKHJpZ2h0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmlnaHQuaW5kZXhPZihuZWVkbGUpICE9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJpZ2h0IChsZWZ0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IHJpZ2h0ID0gdGhpcy5vbmVNYXAuZ2V0KGxlZnQpO1xyXG4gICAgICAgIGlmIChyaWdodCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5yaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmlnaHRUeXBlIChsZWZ0IDogYW55LCB0eXBlIDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmlnaHQobGVmdCkuZmlsdGVyKHJpZ2h0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJpZ2h0IGluc3RhbmNlb2YgdHlwZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmlnaHRUeXBlT25lIChsZWZ0IDogYW55LCB0eXBlIDogYW55KSB7XHJcbiAgICAgICAgbGV0IHJpZ2h0cyA9IHRoaXMuZ2V0UmlnaHRUeXBlKGxlZnQsIHR5cGUpO1xyXG4gICAgICAgIGlmIChyaWdodHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmlnaHRzWzBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVsYXRpb25WYWx1ZSAobGVmdCA6IGFueSwgcmlnaHQgOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNIYXNoW1JlbGF0aW9uLmNyZWF0ZVN0cmluZyhsZWZ0LCByaWdodCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldFJpZ2h0IChyaWdodCA6IGFueSkge1xyXG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5tYW55TWFwLmdldChyaWdodCk7XHJcbiAgICAgICAgaWYgKGxlZnQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBhbGxSaWdodCA9IHRoaXMub25lTWFwLmdldChsZWZ0KTtcclxuICAgICAgICAgICAgYWxsUmlnaHQuc3BsaWNlKGFsbFJpZ2h0LmluZGV4T2YocmlnaHQpLCAxKTtcclxuICAgICAgICAgICAgdGhpcy5tYW55TWFwLmRlbGV0ZShyaWdodCk7XHJcbiAgICAgICAgICAgIGlmIChhbGxSaWdodC5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbmVNYXAuZGVsZXRlKGxlZnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzdHJpbmcgPSBSZWxhdGlvbi5jcmVhdGVTdHJpbmcobGVmdCwgcmlnaHQpO1xyXG4gICAgICAgICAgICBpZiAoc3RyaW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlKHRoaXMudmFsdWVzSGFzaFtzdHJpbmddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5zZXRMZWZ0IChsZWZ0IDogYW55KSB7XHJcbiAgICAgICAgbGV0IGFsbFJpZ2h0ID0gdGhpcy5vbmVNYXAuZ2V0KGxlZnQpO1xyXG4gICAgICAgIGlmIChhbGxSaWdodCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgYWxsUmlnaHQuZm9yRWFjaCgocmlnaHQgOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWFueU1hcC5kZWxldGUocmlnaHQpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0cmluZyA9IFJlbGF0aW9uLmNyZWF0ZVN0cmluZyhsZWZ0LCByaWdodCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RyaW5nICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSh0aGlzLnZhbHVlc0hhc2hbc3RyaW5nXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9uZU1hcC5kZWxldGUobGVmdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJlbGF0aW9ucy9SZWxhdGlvbk9uZVRvTWFueS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlJbWFnZS50c1wiIC8+XHJcblxyXG5pbnRlcmZhY2UgVGhpbmdPcHRpb25zIHtcclxuICAgIG5hbWU/IDogc3RyaW5nO1xyXG4gICAgcHJvcGVyTmFtZT8gOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbj8gOiBTYXkgfCBhbnk7XHJcbiAgICB1bmlxdWU/IDogYm9vbGVhbjtcclxuICAgIGltYWdlPyA6IFNheUltYWdlIHwgc3RyaW5nO1xyXG4gICAgc2hpbnk/IDogYm9vbGVhbjtcclxufVxyXG5cclxuLy8gQSB0aGluZyBpcyBzb21ldGhpbmcgdGhhdCBleGlzdHMgaW4gdGhlIFdvcmxkXHJcbmNsYXNzIFRoaW5nIGltcGxlbWVudHMgUHJpbnRhYmxlIHtcclxuICAgIHByb3RlY3RlZCBuYW1lIDogc3RyaW5nO1xyXG4gICAgcHVibGljIHByb3Blcmx5TmFtZWQgOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHNjZW5lcnkgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgZml4ZWRJblBsYWNlIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGFuaW1hdGVkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHZpc2libGUgOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB1bmlxdWUgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaW1hZ2UgOiBTYXlJbWFnZTtcclxuICAgIHByb3RlY3RlZCBzaGlueSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2V0QWx0ZXJhdGlvbnMgOiBBcnJheTwodGhpc09iamVjdCA6IFRoaW5nLCBzaW1wbGVBbHRlcmF0aW9uT2JqZWN0IDoge1tpZCA6IHN0cmluZ10gOiBhbnl9KSA9PiB2b2lkPiA9IFtdO1xyXG4gICAgcHJvdGVjdGVkIGdldEFsdGVyYXRpb25zIDogQXJyYXk8KHRoaXNPYmplY3QgOiBUaGluZykgPT4ge1tpZCA6IHN0cmluZ10gOiBhbnl9PiA9IFtdO1xyXG4gICAgcHVibGljIGNsb25lIDogKGluY2x1ZGVDaGFuZ2VzPyA6IGJvb2xlYW4pID0+IFRoaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi11bmlxdWUgT2JqZWN0cyBjYW4ndCBiZSBjbG9uZWQuXCIpO1xyXG4gICAgfTtcclxuICAgIHB1YmxpYyBjbG9uZU9wdGlvbnMgOiBUaGluZ09wdGlvbnM7XHJcblxyXG4gICAgcHVibGljIGRlc2NyaXB0aW9uIDogU2F5IHwgc3RyaW5nIHwgKCgpID0+IFNheSB8IHN0cmluZyk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1bmlxdWVUaGluZ3MgOiB7W2lkIDogc3RyaW5nXSA6IFRoaW5nfSA9IHt9O1xyXG4gICAgcHVibGljIHN0YXRpYyB0aGluZ3MgOiB7W2lkIDogc3RyaW5nXSA6IEFycmF5PFRoaW5nPn0gPSB7fTtcclxuXHJcbiAgICAvLyBUaGlzIGlzIG5vdCBzYWZlLlxyXG4gICAgLy8gcHVibGljIGR1cGxpY2F0ZSAoKSB7XHJcbiAgICAvLyAgICAgcmV0dXJuIG5ldyAoPGFueT4gdGhpcy5jb25zdHJ1Y3RvcikoPFRoaW5nT3B0aW9ucz4ge1xyXG4gICAgLy8gICAgICAgICBuYW1lIDogdGhpcy5uYW1lLFxyXG4gICAgLy8gICAgICAgICBwcm9wZXJOYW1lIDogdGhpcy5wcm9wZXJseU5hbWVkID8gdGhpcy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgLy8gICAgICAgICBkZXNjcmlwdGlvbiA6IHRoaXMuZGVzY3JpcHRpb24sXHJcbiAgICAvLyAgICAgICAgIHVuaXF1ZSA6IHRoaXMudW5pcXVlLFxyXG4gICAgLy8gICAgICAgICBpbWFnZSA6IHRoaXMuaW1hZ2VcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnM/IDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPT0gdW5kZWZpbmVkID8ge30gOiBvcHRpb25zO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5wcm9wZXJOYW1lICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLnByb3Blck5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcGVybHlOYW1lZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm5hbWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSAoPGFueT4gdGhpcy5jb25zdHJ1Y3RvcikubmFtZTsgLy8gSWYgdGhlcmUgaXMgbm8gbmFtZSwgdXNlIENsYXNzIGFzIG5hbWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFNheSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gbmV3IFNheShvcHRpb25zLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMudW5pcXVlKSB7XHJcbiAgICAgICAgICAgIFRoaW5nLnN0b3JlVW5pcXVlKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnVuaXF1ZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhpbmcuc3RvcmVOb25VbmlxdWUodGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvbmVPcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICAgICAgdGhpcy5jbG9uZSA9IChpbmNsdWRlQ2hhbmdlcz8gOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29ucyA9IDxhbnk+IGV2YWwoKDxhbnk+IHRoaXMuY29uc3RydWN0b3IpLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5ld1RoaW5nID0gPFRoaW5nPiBuZXcgY29ucyh0aGlzLmNsb25lT3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVDaGFuZ2VzID09IHVuZGVmaW5lZCB8fCBpbmNsdWRlQ2hhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1RoaW5nLnNldENoYW5nZXModGhpcy5nZXRDaGFuZ2VzKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXdUaGluZztcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmltYWdlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbWFnZSBpbnN0YW5jZW9mIFNheUltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gb3B0aW9ucy5pbWFnZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBuZXcgU2F5SW1hZ2Uob3B0aW9ucy5pbWFnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2hpbnkgPSBvcHRpb25zLnNoaW55ID09IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHRoaW5nIDogVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0Q2xvc2VzdFJvb20gKGN1cnJlbnRSb29tIDogUm9vbVJhbmRvbSwgcm9vbXMgOiBBcnJheTxSb29tUmFuZG9tPikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSb29tIGluc3RhbmNlb2YgUm9vbVJhbmRvbSAmJiByb29tcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbXMuc29ydCgoYSA6IFJvb21SYW5kb20sIGIgOiBSb29tUmFuZG9tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgaW5zdGFuY2VvZiBSb29tUmFuZG9tKSkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShiIGluc3RhbmNlb2YgUm9vbVJhbmRvbSkpIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGEgPSBhLmdldERpc3RhbmNlVG8oPFJvb21SYW5kb20+IGN1cnJlbnRSb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRiID0gYi5nZXREaXN0YW5jZVRvKDxSb29tUmFuZG9tPiBjdXJyZW50Um9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYSAtIGRiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIDogcm9vbXNbMF0uZ2V0TmFtZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KHRoaW5nKSA9PSB0aGluZy5nZXRSb29tKCkgJiYgdGhpbmcuZ2V0Um9vbSgpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaW5nLmdldFJvb20oKS5mb2RkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpbmcuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgYXQgY2xvc2VzdCByZW1lbWJlcmVkIHJvb21cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvb21zID0gV29ybGRTdGF0ZS5nZXRSZW1lbWJlcmVkUm9vbXNBc1Jvb21zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Um9vbSA9IHRoaW5nLmdldFJvb20oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENsb3Nlc3RSb29tKDxSb29tUmFuZG9tPiBjdXJyZW50Um9vbSwgPEFycmF5PFJvb21SYW5kb20+PiByb29tcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHV0IGF0IGNsb3Nlc3Qgcm9vbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vbXMgPSB0aGluZy5nZXRSb29tKCkuZ2V0Q29ubmVjdGVkUm9vbXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRSb29tID0gdGhpbmcuZ2V0Um9vbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmRSb29tID0gZ2V0Q2xvc2VzdFJvb20oPFJvb21SYW5kb20+IGN1cnJlbnRSb29tLCA8QXJyYXk8Um9vbVJhbmRvbT4+IHJvb21zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFJvb207XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tcyA9ICg8UmVnaW9uPiBSZWdpb24uSW5SZWxhdGlvbi5nZXRMZWZ0KHRoaW5nLmdldFJvb20oKSkpLmdldFJvb21zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xvc2VzdFJvb20oPFJvb21SYW5kb20+IGN1cnJlbnRSb29tLCA8QXJyYXk8Um9vbVJhbmRvbT4+IHJvb21zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb246IHRoaW5nLmdldFJvb20oKS5nZXROYW1lKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygodGhpbmcgOiBUaGluZywgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5Mb2NhdGlvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCByb29tID0gUm9vbS5nZXRSb29tKGNoYW5nZXMuTG9jYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbS5wbGFjZSh0aGluZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmFibGUgdG8gcGxhY2UgXCIsIHRoaW5nLCBcIiBhdCByb29tIFwiLCBjaGFuZ2VzLkxvY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRHZXRBbHRlcmF0aW9ucyAobmV3R2V0KSB7XHJcbiAgICAgICAgdGhpcy5nZXRBbHRlcmF0aW9ucy5wdXNoKG5ld0dldCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGFkZHMgYSBmdW5jdGlvbiB0byBydW4gb3ZlciB3aGVuIGxvYWRpbmcgZnJvbSBhIHNhdmUgZmlsZS5cclxuICAgICAqIEFsd2F5cyByZW1lbWJlciB0aGF0IHNhdmUgZmlsZXMgYXJlIE5PVCBTQUZFLiBJZGVhbGx5IHdlIHNob3VsZCBjaGVjayBmb3IgaW52YWxpZCBpbmZvcm1hdGlvbixcclxuICAgICAqIGJ1dCBhdCBsZWFzdCBjaGVjayBpZiB0aGV5IGV4aXN0LCBiZWNhdXNlIGlmIHlvdSBhZGRlZCBzb21ldGhpbmcgbmV3LCBvbGQgc2F2ZXMgd2lsbCBub3QgaGF2ZSB0aGVtLlxyXG4gICAgICogSXQncyBva2F5IHRvIGJyZWFrIG9uIGJhZCBpbmZvcm1hdGlvbiBiZWNhdXNlIGlmIHNvbWVvbmUgZGVjaWRlZCB0byBoYWNrIHRoZWlyIHNhdmUsIHRoZW0gdGhleSBzaG91bGRcclxuICAgICAqIGRlYWwgd2l0aCB0aGUgaXNzdWVzLlxyXG4gICAgICogQHBhcmFtIG5ld1NldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkU2V0QWx0ZXJhdGlvbnMgKG5ld1NldCkge1xyXG4gICAgICAgIHRoaXMuc2V0QWx0ZXJhdGlvbnMucHVzaChuZXdTZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VzICgpIDoge1tpZCA6IHN0cmluZ10gOiBhbnl9e1xyXG4gICAgICAgIGxldCBjaGFuZ2VzID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdldEFsdGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSB0aGlzLmdldEFsdGVyYXRpb25zW2ldKHRoaXMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VzW2tleV0gPSBjaGFuZ2Vba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2hhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2hhbmdlcyAoc2ltcGxlQWx0ZXJhdGlvbk9iamVjdCA6IHtbaWQgOiBzdHJpbmddIDogYW55fSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXRBbHRlcmF0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFsdGVyYXRpb25zW2ldKHRoaXMsIHNpbXBsZUFsdGVyYXRpb25PYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2hpbnkgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNoaW55O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROYW1lIChuYW1lIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsgLy8gRG9uJ3QgcmVzdG9yZS4gVGhlIG9ubHkgdGhpbmcgdGhhdCBjaGFuZ2VzIG5hbWVzIGlzIHBsYXllci5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmFtZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlTm9uVW5pcXVlICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgaWYgKFRoaW5nLnRoaW5nc1t0aGluZy5uYW1lXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgVGhpbmcudGhpbmdzW3RoaW5nLm5hbWVdID0gW3RoaW5nXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBUaGluZy50aGluZ3NbdGhpbmcubmFtZV0ucHVzaCh0aGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Tm9uVW5pcXVlIChuYW1lIDogc3RyaW5nKSA6IEFycmF5PFRoaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLnRoaW5nc1tuYW1lXSA9PSB1bmRlZmluZWQgPyBbXSA6IFRoaW5nLnRoaW5nc1tuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9uZVRoaW5nIChuYW1lIDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHRoaW5nIDogVGhpbmcgPSBUaGluZy5nZXRVbmlxdWUobmFtZSk7XHJcbiAgICAgICAgaWYgKHRoaW5nID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmdzID0gVGhpbmcuZ2V0Tm9uVW5pcXVlKG5hbWUpO1xyXG4gICAgICAgICAgICBpZiAodGhpbmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaW5nID0gdGhpbmdzWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHN0b3JlVW5pcXVlICh1bmlxdWUgOiBUaGluZykge1xyXG4gICAgICAgIGlmIChUaGluZy51bmlxdWVUaGluZ3NbdW5pcXVlLm5hbWVdICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4odW5pcXVlLm5hbWUsIFRoaW5nLnVuaXF1ZVRoaW5nc1t1bmlxdWUubmFtZV0sIG5ldyBFcnJvcihcIlVuaXF1ZSBUaGluZyBBbHJlYWR5IEV4aXN0c1wiKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgVGhpbmcudW5pcXVlVGhpbmdzW3VuaXF1ZS5uYW1lXSA9IHVuaXF1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRVbmlxdWUgKG5hbWUgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcudW5pcXVlVGhpbmdzW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VW5pcXVlcyAoKSA6IEFycmF5PFRoaW5nPiB7XHJcbiAgICAgICAgbGV0IHRoaW5ncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gVGhpbmcudW5pcXVlVGhpbmdzKSB7XHJcbiAgICAgICAgICAgIHRoaW5ncy5wdXNoKFRoaW5nLnVuaXF1ZVRoaW5nc1tuYW1lXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGluZ3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByaW50ZWROYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByaW50ZWREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2F5IChcIllvdSBzZWUgbm90aGluZyBzcGVjaWFsIGFib3V0IFwiLCBuZXcgU2F5VGhlKCksIHRoaXMsIFwiLlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBJbnNpZGVSb29tUmVsYXRpb24gOiBSZWxhdGlvbk9uZVRvTWFueT0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBhcnRSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbk9uZVRvTWFueSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDYXJyeVJlbGF0aW9uID0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdpZWxkUmVsYXRpb24gPSBuZXcgUmVsYXRpb25PbmVUb01hbnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgV2VhclJlbGF0aW9uID0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIEVuY2xvc2VkUmVsYXRpb24gPSBuZXcgUmVsYXRpb25IYW5kbGVyU3RyaWN0T25lVG9NYW55KFRoaW5nLkluc2lkZVJvb21SZWxhdGlvbiwgVGhpbmcuUGFydFJlbGF0aW9uLCBUaGluZy5DYXJyeVJlbGF0aW9uLCBUaGluZy5XaWVsZFJlbGF0aW9uLCBUaGluZy5XZWFyUmVsYXRpb24pO1xyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJ0T25lICgpIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcuUGFydFJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhcnJ5T25lICgpIHtcclxuICAgICAgICByZXR1cm4gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXaWVsZE9uZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLldpZWxkUmVsYXRpb24uZ2V0TGVmdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2Vhck9uZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLldlYXJSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNsb3NlZE9uZSAoKSA6IFRoaW5nIHwgUm9vbSB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0TGVmdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlUGFydHMgKHBhcnRUeXBlPyA6IGFueSkge1xyXG4gICAgICAgIGxldCBwYXJ0cyA9IHRoaXMuZ2V0UGFydHMocGFydFR5cGUpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgVGhpbmcuUGFydFJlbGF0aW9uLnVuc2V0UmlnaHQocGFydHNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UGFydHMgKHBhcnRUeXBlPyA6IGFueSkge1xyXG4gICAgICAgIGlmIChwYXJ0VHlwZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpcywgcGFydFR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJ0c0J5TmFtZSAobmFtZSA6IHN0cmluZykgOiBBcnJheTxUaGluZz4ge1xyXG4gICAgICAgIGxldCBwYXJ0cyA9IHRoaXMuZ2V0UGFydHMoKTtcclxuICAgICAgICByZXR1cm4gcGFydHMuZmlsdGVyKChwYXJ0IDogVGhpbmcpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJ0LmdldE5hbWUoKSA9PSBuYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UGFydCAocGFydFR5cGU/IDogYW55KSB7XHJcbiAgICAgICAgaWYgKHBhcnRUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZSh0aGlzLCBwYXJ0VHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2lsbCB1c3VhbGx5IHJldHVybiB0aGUgcm9vbSBhdCB3aGljaCB0aGlzIGlzLlxyXG4gICAgLy8gV2lsbCByZXR1cm4gdGhlIGhpZ2hlc3QgcGFyZW50IGlmIHRoYXQgcGFyZW50IGlzIG91dCBvZiB3b3JsZC5cclxuICAgIHB1YmxpYyBnZXRIaWdoZXN0RW5jbG9zZWRPbmUgKCkgOiBUaGluZyB8IFJvb20ge1xyXG4gICAgICAgIHJldHVybiBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldExhc3RMZWZ0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRIaWdoZXN0RW5jbG9zZWRPbmVOb3RSb29tICgpIDogVGhpbmcge1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IG5ld1BhcmVudCA9IFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0TGVmdChwYXJlbnQpO1xyXG4gICAgICAgICAgICB3aGlsZSAobmV3UGFyZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gbmV3UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgbmV3UGFyZW50ID0gVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KHBhcmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvb20gKCkgOiBSb29tIHtcclxuICAgICAgICB2YXIgcGFydE9mID0gPFRoaW5nIHwgUm9vbT4gVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgICAgIGlmIChwYXJ0T2YgaW5zdGFuY2VvZiBSb29tKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0T2Y7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0T2YgaW5zdGFuY2VvZiBUaGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFydE9mLmdldFJvb20oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUZyb21Sb29tICgpIHtcclxuICAgICAgICB0aGlzLmdldFJvb20oKS5yZW1vdmUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZVRvICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgLy8gRWl0aGVyIGluIHRoZSBzYW1lIHJvb20gb3IgcGFydCBvZiAvd2llbGRlZCAvIGNhcnJpZWQgYnkgcGVyc29uXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFJvb20oKSA9PSB0aGluZy5nZXRSb29tKCkgJiYgdGhpcy52aXNpYmxlKTtcclxuICAgICAgICAvLyBUT0RPIDogVXBkYXRlIHRoaXMgY29kZSBmb3IgdGhlIGNhc2VzIHdoZXJlIGEgY3JlYXR1cmUgaXMgbm90IHZpc2libGUgYnV0IHRoZSBvYnNlcnZlciBjYW4gc2VlIHRoZW0gYW55d2F5XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzUGxheWVyICgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFBhcnRzICguLi5wYXJ0cyA6IEFycmF5PFRoaW5nPikge1xyXG4gICAgICAgIHBhcnRzLmZvckVhY2gocGFydCA9PiB7XHJcbiAgICAgICAgICAgIFRoaW5nLlBhcnRSZWxhdGlvbi5zZXRSZWxhdGlvbih0aGlzLCBwYXJ0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNVbmlxdWUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuaXF1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2FycmllZCAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIFRoaW5nLkNhcnJ5UmVsYXRpb24uc2V0UmVsYXRpb24odGhpcywgdGhpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRXb3JuICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgVGhpbmcuV2VhclJlbGF0aW9uLnNldFJlbGF0aW9uKHRoaXMsIHRoaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0V2llbGRlZCAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIFRoaW5nLldpZWxkUmVsYXRpb24uc2V0UmVsYXRpb24odGhpcywgdGhpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldENhcnJpZWQgKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICBpZiAoVGhpbmcuRW5jbG9zZWRSZWxhdGlvbi5nZXRBbGxSaWdodCh0aGlzKS5pbmRleE9mKHRoaW5nKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFJvb20oKS5wbGFjZSh0aGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU28gbG9uZyBhcyBhIHRoaW5nIGlzIGluIGEgcmVsYXRpb24sIGl0IGNhbid0IGJlIGdhcmJhZ2UgY2xlYW5lZC5cclxuICAgICAqIElmIHlvdSdyZSB0aHJvd2luZyBhIHRoaW5nIGF3YXksIGRvIHJ1biBkZXN0cm95LlxyXG4gICAgICogV2FybmluZzogdGhpcyB3aWxsIGFsc28gZGVzdHJveSBldmVyeXRoaW5nIHRoYXQncyBiZWxvdyBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlc3Ryb3kgKCkge1xyXG4gICAgICAgIGxldCByZWxhdGVkUmlnaHQgPSBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLmdldEFsbFJpZ2h0KHRoaXMpO1xyXG4gICAgICAgIHJlbGF0ZWRSaWdodC5wdXNoKHRoaXMpO1xyXG4gICAgICAgIHJlbGF0ZWRSaWdodC5mb3JFYWNoKHJlbGF0ZWQgPT4ge1xyXG4gICAgICAgICAgICBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLnVuc2V0KHJlbGF0ZWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheVRoZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0h5cGVybGlua0hhbmRsZXIudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uVGFrZSBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrIDogUnVsZWJvb2s8QWN0aW9uVGFrZT4gPSBuZXcgUnVsZWJvb2soXCJDaGVjayBUYWtpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5IDogUnVsZWJvb2s8QWN0aW9uVGFrZT4gPSBuZXcgUnVsZWJvb2soXCJDYXJyeSBvdXQgVGFraW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcInRha2UgXCIgKyAodGhpcy5nZXROb3VuKDApICE9IHVuZGVmaW5lZCA/IHRoaXMuZ2V0Tm91bigwKS5nZXRQcmludGVkTmFtZSgpIDogXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0Q2FycnlUYWtpbmdSdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlRha2luZyAtIEFkZCB0aGUgdGhpbmcgdG8geW91ciBpbnZlbnRvcnlcIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uVGFrZT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZy5nZXRFbmNsb3NlZE9uZSgpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIFBhcnQgT2YsIENhcnJpZWQgb3IgV2llbGRlZC4gSXQncyBlc3NlbnRpYWxseSBzdGVhbGluZy5cclxuICAgICAgICAgICAgICAgIFRoaW5nLkVuY2xvc2VkUmVsYXRpb24udW5zZXRSaWdodCh0aGluZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGluZy5yZW1vdmVGcm9tUm9vbSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBUaGluZy5DYXJyeVJlbGF0aW9uLnNldFJlbGF0aW9uKGFjdG9yLCBhY3Rpb24uZ2V0Tm91bigwKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlCb2xkKCg8VGhpbmc+IGFjdGlvbi5nZXROb3VuKDApKS5nZXRQcmludGVkTmFtZSgpICsgXCI6IFwiKSwgXCJUYWtlbi5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiB0YWtlcyBcIiwgbmV3IFNheVRoZSh1bmRlZmluZWQsIHRydWUpLCAoPFRoaW5nPiBhY3Rpb24uZ2V0Tm91bigwKSksIFwiLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5BY3Rpb25UYWtlLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgVGFraW5nIC0gV2hvIGhhcyBpdCwgcmVhbGx5P1wiLFxyXG4gICAgICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG4gICAgICAgICAgICBsZXQgb3duZXIgPSA8VGhpbmc+IHRoaW5nLmdldEVuY2xvc2VkT25lKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3duZXIgPT0gYWN0b3Ipe1xyXG4gICAgICAgICAgICAgICAgaWYgKG93bmVyID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgYWxyZWFkeSBoYXZlIGl0LlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7XHJcblxyXG5BY3Rpb25UYWtlLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgVGFraW5nIC0gRG9udXQgc3RlYWxcIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uVGFrZT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuICAgICAgICAgICAgbGV0IG93bmVyID0gPFRoaW5nPiB0aGluZy5nZXRFbmNsb3NlZE9uZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG93bmVyICE9IHVuZGVmaW5lZCAmJiBvd25lci5hbmltYXRlZCl7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChvd25lci5nZXRQcmludGVkTmFtZSgpICsgXCIgd291bGRuJ3QgbGlrZSB0aGF0LlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7XHJcblxyXG5BY3Rpb25UYWtlLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgVGFraW5nIC0gQ2FuJ3QgdGFrZSBmaXhlZCBpbiBwbGFjZVwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaW5nLmZpeGVkSW5QbGFjZSl7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBjYW4ndCB0YWtlIHRoYXQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuKTtcclxuXHJcbkFjdGlvblRha2UuY2FycnkuYWRkUnVsZShcclxuICAgIEFjdGlvblRha2UuZGVmYXVsdENhcnJ5VGFraW5nUnVsZVxyXG4pO1xyXG5cclxuRWxlbWVudHMuSHlwZXJsaW5rSGFuZGxlci5IeXBlcmxpbmtpbmdSdWxlYm9vay5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkh5cGVybGluayAtIFRha2VcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxUaGluZz4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gPFRoaW5nPiBydWxlYm9vay5ub3VuO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGluZy5hbmltYXRlZCAmJiAhdGhpbmcuZml4ZWRJblBsYWNlICYmIHRoaW5nLmdldFJvb20oKSA9PSBXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCkgJiYgdGhpbmcuZ2V0RW5jbG9zZWRPbmUoKSBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuYWRkQXZhaWxhYmxlQWN0aW9uKFwiVGFrZVwiLCBuZXcgQWN0aW9uVGFrZShXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGVib29rLnRzXCIgLz5cclxuXHJcbmNsYXNzIEFjdGlvbkdvIGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgPSBuZXcgUnVsZWJvb2s8QWN0aW9uR28+KFwiQ2hlY2sgR29pbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5ID0gbmV3IFJ1bGVib29rPEFjdGlvbkdvPihcIkNhcnJ5IG91dCBHb2luZ1wiKTtcclxuXHJcbiAgICBwdWJsaWMgcm9vbUdvbmVGcm9tIDogUm9vbTtcclxuICAgIHB1YmxpYyByb29tR29uZVRvIDogUm9vbTtcclxuICAgIHB1YmxpYyBvcmlnaW5hbFRhcmdldCA6IFJvb20gfCBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChhY3RvciA6IFRoaW5nLCAuLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBzdXBlcihhY3RvciwgLi4ubm91bnMpO1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxUYXJnZXQgPSBub3Vuc1swXTtcclxuICAgICAgICB0aGlzLnJlcXVpcmVzTm91biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVxdWlyZXNWaXNpYmlsaXR5ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgbGV0IG5hbWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9yaWdpbmFsVGFyZ2V0ID09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgbmFtZSA9IERpcmVjdGlvbk5hbWVzW0RpcmVjdGlvblt0aGlzLm9yaWdpbmFsVGFyZ2V0XV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9yaWdpbmFsVGFyZ2V0IGluc3RhbmNlb2YgUm9vbSkge1xyXG4gICAgICAgICAgICBuYW1lID0gXCJ0byBcIiArICg8Um9vbT4gdGhpcy5vcmlnaW5hbFRhcmdldCkuZ2V0UHJpbnRlZE5hbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiZ28gXCIgKyBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZUNoZWNrUmVzdG9yZU9yaWdpbmFsTm91biA9IEFjdGlvbkdvLmNoZWNrLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgR29pbmcgLSBSZXN0b3JlIG9yaWdpbmFsIG5vdW5cIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBhY3Rpb24uc2V0Tm91bigwLCBhY3Rpb24ub3JpZ2luYWxUYXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZUNoZWNrSXN0aGVyZWFjdG9yID0gQWN0aW9uR28uY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBuYW1lIDogXCJDaGVjayBHb2luZyAtIElzIHRoZXJlIGFuIGFjdG9yP1wiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgaWYgKGFjdGlvbi5hY3RvciA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUnVsZSBmYWlsc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2hlY2tDb252ZXJ0Um9vbVRvRGlyZWN0aW9uID0gQWN0aW9uR28uY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBuYW1lIDogXCJDaGFuZ2UgUm9vbSB0byBEaXJlY3Rpb25cIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICAvLyBTb21lb25lIGFza2VkIGZvciBhIHJvb20uLi5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbi5nZXROb3VuKDApIGluc3RhbmNlb2YgUm9vbVJhbmRvbSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNSb29tID0gYWN0b3IuZ2V0Um9vbSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNSb29tIGluc3RhbmNlb2YgUm9vbVJhbmRvbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkUm9vbSA9IGFjdGlvbi5nZXROb3VuKDApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY1Jvb20gPT0gZFJvb20pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yLmlzUGxheWVyKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiWW91IGFyZSBhbHJlYWR5IHRoZXJlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAocm9vbTogUm9vbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdvcmxkU3RhdGUuaXNSb29tUmVtZW1iZXJlZChyb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGNSb29tLmdldEFTdGFyQmVzdERpcmVjdGlvblRvKGRSb29tLCBjb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0b3IuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgZG9uJ3QgcmVtZW1iZXIgaG93IHRvIGdldCB0aGVyZS5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5zZXROb3VuKDAsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2hlY2tJc3RoZXJlZGlyZWN0aW9uYW5kcm9vbSA9IEFjdGlvbkdvLmNoZWNrLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkNoZWNrIEdvaW5nIC0gaXMgdGhlcmUgYSBkaXJlY3Rpb24/IERvZXMgaXQgbGVhZCBhbnl3aGVyZT9cIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBjUm9vbSA9IGFjdGlvbi5hY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGlmIChjUm9vbSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUnVsZSBmYWlscywgYWN0b3IgaXMgb3V0IG9mIHdvcmxkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGlvbi5nZXROb3VuKDApO1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSdWxlIGZhaWxzLCBubyBkaXJlY3Rpb25cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgbmV4dFJvb20gPSBjUm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICBpZiAobmV4dFJvb20gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFJ1bGUgZmFpbHMsIGNhbid0IGdvIGRpcmVjdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHJvb21cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWN0aW9uLnJvb21Hb25lRnJvbSA9IGFjdGlvbi5hY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGFjdGlvbi5yb29tR29uZVRvID0gbmV4dFJvb207XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2FycnlNb3ZlID0gQWN0aW9uR28uY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiR29pbmcgLSBNb3ZlIEFjdG9yIHRvIE5leHQgUm9vbVwiLFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2spID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IHJvb21Hb25lRnJvbSA9IGFjdGlvbi5hY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBhY3Rpb24uZ2V0Tm91bigwKTtcclxuICAgICAgICAgICAgbGV0IHJvb21Hb25lSW50byA9IHJvb21Hb25lRnJvbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICByb29tR29uZUludG8ucGxhY2UoYWN0aW9uLmFjdG9yKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBnbyBcIiArIERpcmVjdGlvbk5hbWVzW0RpcmVjdGlvbltkaXJlY3Rpb25dXS50b0xvd2VyQ2FzZSgpICsgXCIuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvb21Hb25lRnJvbSA9PSBXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiBnb2VzIFwiICsgRGlyZWN0aW9uTmFtZXNbRGlyZWN0aW9uW2RpcmVjdGlvbl1dLnRvTG93ZXJDYXNlKCkgKyBcIi5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHBvc2l0ZU5hbWUgPSBEaXJlY3Rpb25OYW1lc1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGVEaXJlY3Rpb25bZGlyZWN0aW9uXVxyXG4gICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheVRoZSgpLCBhY3RvciwgXCIgYXJyaXZlcyBmcm9tIHRoZSBcIiArIG9wcG9zaXRlTmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlQ2FycnlSZW1lbWJlclJvb21zID0gQWN0aW9uR28uY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiR29pbmcgLSBSZW1lbWJlciB0aGUgaW52b2x2ZWQgcm9vbXNcIixcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHJvb21Hb25lSW50byA9IGFjdGlvbi5hY3Rvci5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBhY3Rpb24uZ2V0Tm91bigwKTtcclxuICAgICAgICAgICAgbGV0IHJvb21Hb25lRnJvbSA9IHJvb21Hb25lSW50by5jb25uZWN0aW9uc1tPcHBvc2l0ZURpcmVjdGlvbltEaXJlY3Rpb25bZGlyZWN0aW9uXV1dO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdG9yLmlzUGxheWVyKCkpIHtcclxuICAgICAgICAgICAgICAgIFdvcmxkU3RhdGUucmVtZW1iZXJSb29tKHJvb21Hb25lRnJvbSwgcm9vbUdvbmVJbnRvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0VsZW1lbnRzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1dvcmxkL0NsYXNzZXMvQWN0aW9uL0FjdGlvbkV4YW1pbmUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uR28udHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuUm9vbUhhbmRsZXIge1xyXG4gICAgZXhwb3J0IHZhciBjdXJyZW50Um9vbVRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3VycmVudFJvb21UYWJcIik7XHJcbiAgICBleHBvcnQgdmFyIGN1cnJlbnRSb29tRGVzY3JpcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb21EZXNjcmlwdGlvblwiKTtcclxuICAgIGV4cG9ydCB2YXIgY3VycmVudFJvb21FeGl0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vbUV4aXRzXCIpO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgY3VycmVudFJvb21OYW1lIDogVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb29tTmFtZVwiKS5hcHBlbmRDaGlsZChjdXJyZW50Um9vbU5hbWUpO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBsaW5rT2JqZWN0cyAoKSB7XHJcbiAgICAgICAgbGV0IG9ianMgPSBjdXJyZW50Um9vbVRhYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwicm9vbU9iamVjdFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBsaW5rS2V5Q29kZSA9IENvbnRyb2xzLktleUhhbmRsZXIuZ2V0Rmlyc3RLZXlDb2RlKCk7XHJcbiAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKDxIVE1MRWxlbWVudD4gb2Jqc1tpXSwgbGlua0tleUNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZW1wdHlSb29tICgpIHtcclxuICAgICAgICB3aGlsZSAoY3VycmVudFJvb21EZXNjcmlwdGlvbi5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSb29tRGVzY3JpcHRpb24ucmVtb3ZlQ2hpbGQoY3VycmVudFJvb21EZXNjcmlwdGlvbi5maXJzdENoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Um9vbUV4aXRzLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgY3VycmVudFJvb21FeGl0cy5yZW1vdmVDaGlsZChjdXJyZW50Um9vbUV4aXRzLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3VycmVudFJvb21OYW1lLm5vZGVWYWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJvb20gKCkge1xyXG4gICAgICAgIGVtcHR5Um9vbSgpO1xyXG5cclxuICAgICAgICBsZXQgcm9vbSA9IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKTtcclxuXHJcbiAgICAgICAgaWYgKHJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSb29tTmFtZS5ub2RlVmFsdWUgPSByb29tLmdldFByaW50ZWROYW1lKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSByb29tLmRlc2NyaXB0aW9uLmdldEhUTUwoXCJwXCIsIFtcInJvb21EZXNjcmlwdGlvblwiXSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRlc2NyaXB0aW9uLnRoZW4odmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHAgPSB2YWx1ZVtpXTsgcCAhPSB1bmRlZmluZWQ7IHAgPSB2YWx1ZVsrK2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJvb21EZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGhpbmdzID0gcm9vbS5nZXRDb250YWluZWRBbmRWaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGluZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoaW5nTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpbmdMaXN0LmNsYXNzTGlzdC5hZGQoXCJyb29tRGVzY3JpcHRpb25cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJpbnRpbmdWaXNpYmxlVGhpbmdzUnVsZWJvb2suZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbm91biA6IDxWaXNpYmxlVGhpbmdzT3B0aW9ucz4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGluZ3MgOiB0aGluZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA6IHRoaW5nTGlzdFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRSb29tRGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQodGhpbmdMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwLCB2YWx1ZSA9IHJvb20uY29ubmVjdGlvbnNbaW5kZXhdOyBpbmRleCA8IHJvb20uY29ubmVjdGlvbnMubGVuZ3RoOyB2YWx1ZSA9IHJvb20uY29ubmVjdGlvbnNbKytpbmRleF0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHAuY2xhc3NMaXN0LmFkZChcInJvb21FeGl0XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZChcInJvb21EaXJlY3Rpb25cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25baW5kZXhdXSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBDb250cm9scy5MaW5rcy5tYWtlTGluayhsaW5rLCBuZXcgQWN0aW9uR28oV29ybGRTdGF0ZS5wbGF5ZXIsIGluZGV4KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUobGluaywgQ29udHJvbHMuS2V5SGFuZGxlci5nZXREaXJlY3Rpb25Db2RlQnlJbmRleChpbmRleCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKGxpbmspO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uUmVzdWx0ID0gXCI6IFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChXb3JsZFN0YXRlLmlzUm9vbVJlbWVtYmVyZWQodmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvblJlc3VsdCArPSB2YWx1ZS5nZXRQcmludGVkTmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvblJlc3VsdCArPSBcIkEgbmV3IHBsYWNlXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpcmVjdGlvblJlc3VsdCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um9vbUV4aXRzLmFwcGVuZENoaWxkKHApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVmlzaWJsZVRoaW5nc09wdGlvbnMge1xyXG4gICAgICAgIGNvbnRhaW5lciA6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIHRoaW5ncyA6IEFycmF5PFRoaW5nPlxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTm91biA9IFZpc2libGVUaGluZ3NPcHRpb25zXHJcbiAgICAgKiBAdHlwZSB7UnVsZWJvb2t9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgUHJpbnRpbmdWaXNpYmxlVGhpbmdzUnVsZWJvb2sgPSBuZXcgUnVsZWJvb2soXCJQcmludGluZyB0aGUgbmFtZSBvZiB2aXNpYmxlIHRoaW5ncyBpbiBhIHJvb21cIik7XHJcblxyXG4gICAgZXhwb3J0IHZhciBQcmludEludHJvVG9WaXNpYmxlVGhpbmdzUnVsZSA9IG5ldyBSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJQcmludCBcXFwiWW91IGNhbiBzZWVcXFwiIHRleHRcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxWaXNpYmxlVGhpbmdzT3B0aW9ucz4pID0+ICB7XHJcbiAgICAgICAgICAgIGxldCBub3VuID0gPFZpc2libGVUaGluZ3NPcHRpb25zPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBub3VuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIllvdSBjYW4gc2VlIFwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBQcmludGluZ1Zpc2libGVUaGluZ3NSdWxlYm9vay5hZGRSdWxlKFByaW50SW50cm9Ub1Zpc2libGVUaGluZ3NSdWxlKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFByaW50VmlzaWJsZVRoaW5nc1J1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUHJpbnQgYWxsIHZpc2libGUgdGhpbmdzXCIsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFZpc2libGVUaGluZ3NPcHRpb25zPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IDxWaXNpYmxlVGhpbmdzT3B0aW9ucz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub3VuLnRoaW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gbm91bi50aGluZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKFwicm9vbU9iamVjdFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2F5IDogU2F5XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUaGluZyAmJiB2YWx1ZS51bmlxdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkgPSBuZXcgU2F5KG5ldyBTYXlUaGUoZmFsc2UpLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheSA9IG5ldyBTYXkobmV3IFNheUFuKGZhbHNlKSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgc2F5LmdldFB1cmVFbGVtZW50cygpLnRoZW4odmFsdWUyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgZWxlbWVudCA9IHZhbHVlMltpXTsgZWxlbWVudCAhPSB1bmRlZmluZWQ7IGVsZW1lbnQgPSB2YWx1ZTJbKytpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIENvbnRyb2xzLkxpbmtzLm1ha2VMaW5rKGxpbmssIG5ldyBBY3Rpb25FeGFtaW5lKFdvcmxkU3RhdGUucGxheWVyLCB2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUobGluaywgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRGaXJzdEtleUNvZGUoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgbm91bi5jb250YWluZXIuYXBwZW5kQ2hpbGQobGluayk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChpICsgMSkgPCBub3VuLnRoaW5ncy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub3VuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIiwgXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgUHJpbnRpbmdWaXNpYmxlVGhpbmdzUnVsZWJvb2suYWRkUnVsZShQcmludFZpc2libGVUaGluZ3NSdWxlKTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFByaW50T3V0cm9Ub1Zpc2libGVUaGluZ3NSdWxlID0gbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlByaW50IFxcXCIuLi4gaGVyZVxcXCIgdGV4dFwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPVyxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VmlzaWJsZVRoaW5nc09wdGlvbnM+KSA9PiAge1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IDxWaXNpYmxlVGhpbmdzT3B0aW9ucz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbm91bi5jb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgaGVyZS5cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgUHJpbnRpbmdWaXNpYmxlVGhpbmdzUnVsZWJvb2suYWRkUnVsZShQcmludE91dHJvVG9WaXNpYmxlVGhpbmdzUnVsZSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uL0FjdGlvblRha2UudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9Sb29tSGFuZGxlci50c1wiIC8+XHJcblxyXG5jbGFzcyBDb2luUG91Y2ggZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwcml2YXRlIGNvaW5zIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgYWRkQ29pbnMgKGNvaW5zIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5jb2lucyArPSBjb2lucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlQ29pbnMgKGNvaW5zIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5jb2lucyAtPSBjb2lucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29pbnMgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaGlueSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29pbnMgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKChwdXJzZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29pbnMgOiBwdXJzZS5nZXRDb2lucygpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHB1cnNlLCBjaGFuZ2VPYmopID0+IHtcclxuICAgICAgICAgICAgcHVyc2UuY29pbnMgPSAoY2hhbmdlT2JqLmNvaW5zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5T3V0VGFraW5nQ29pblBvdWNoZXMgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2Fycnkgb3V0IHRha2luZyBjb2luIHBvdWNoZXNcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogQWN0aW9uVGFrZS5kZWZhdWx0Q2FycnlUYWtpbmdSdWxlLmZpcnN0UHJpb3JpdHksXHJcbiAgICAgICAgcHJpb3JpdHkgOiBBY3Rpb25UYWtlLmRlZmF1bHRDYXJyeVRha2luZ1J1bGUucHJpb3JpdHkgKyAxLFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWtlPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvblRha2U+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxDb2luUG91Y2g+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3JQb3VjaGVzID0gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodFR5cGUoYWN0b3IsIENvaW5Qb3VjaCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3JQb3VjaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCB0aGluZ0NvaW5zID0gdGhpbmcuZ2V0Q29pbnMoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGluZ0NvaW5zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVib29rLnNraXBSdWxlKEFjdGlvblRha2UuZGVmYXVsdENhcnJ5VGFraW5nUnVsZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICg8Q29pblBvdWNoPiBhY3RvclBvdWNoZXNbMF0pLmFkZENvaW5zKHRoaW5nQ29pbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaW5nLnJlbW92ZUNvaW5zKHRoaW5nLmdldENvaW5zKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgZW1wdHkgXCIsIG5ldyBTYXlUaGUoKSwgdGhpbmcsIFwiIGludG8geW91ciBcIiwgYWN0b3JQb3VjaGVzWzBdLCBcIi4gWW91ciBcIiwgYWN0b3JQb3VjaGVzWzBdLCBcIiBub3cgaGFzIFwiICsgYWN0b3JQb3VjaGVzWzBdLmdldENvaW5zKCkudG9TdHJpbmcoKSArIFwiIGNvaW5zLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiBlbXB0aWVzIFwiLCBuZXcgU2F5VGhlKCksIHRoaW5nLCBcIiBpbnRvIFwiLCBTYXkuaGlzSGVyc0l0cyhhY3RvciksIGFjdG9yUG91Y2hlc1swXSwgXCIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB0aGVtIHRoZSBvbCcgc3dpdGNoYXJvb1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteUNvaW5zID0gYWN0b3JQb3VjaGVzWzBdLmdldENvaW5zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0b3JQb3VjaGVzWzBdLnJlbW92ZUNvaW5zKG15Q29pbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaW5nLmFkZENvaW5zKG15Q29pbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBlbXB0eSB5b3VyIFwiLCBhY3RvclBvdWNoZXNbMF0sIFwiIGludG8gXCIsIG5ldyBTYXlUaGUoKSwgdGhpbmcsIFwiLlwiLCBTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyb3AgPSBuZXcgQWN0aW9uRHJvcChhY3RvciwgYWN0b3JQb3VjaGVzWzBdKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkcm9wLmV4ZWN1dGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRoaW5nLkVuY2xvc2VkUmVsYXRpb24uZ2V0TGVmdChhY3RvclBvdWNoZXNbMF0pID09IGFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgY2FuJ3QgZ2V0IHJpZCBvZiB5b3VyIFwiLCBhY3RvclBvdWNoZXNbMF0sIFwiIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uVGFrZT4pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICgoPEFjdGlvblRha2U+IHJ1bGVib29rLm5vdW4pLmdldE5vdW4oMCkgaW5zdGFuY2VvZiBDb2luUG91Y2gpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5BY3Rpb25UYWtlLmNhcnJ5LmFkZFJ1bGUoQ29pblBvdWNoLmNhcnJ5T3V0VGFraW5nQ29pblBvdWNoZXMpO1xyXG5cclxuU2F5LmFmdGVyUHJpbnRpbmcuYWRkUnVsZShuZXcgUnVsZShcclxuICAgIHtcclxuICAgICAgICBuYW1lIDogXCJJbmNsdWRlIGNvbnRlbnRzIG9mIENvaW4gUG91Y2ggd2hpbGUgUHJpbnRpbmcgVmlzaWJsZSBUaGluZ3MgaW4gYSBSb29tXCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFNheT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHNheSA9IDxTYXk+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBwb3VjaCA9IDxDb2luUG91Y2g+IHNheS5jdXJyZW50Tm91bjtcclxuICAgICAgICAgICAgc2F5LmN1cnJlbnROb3VuRWxlbWVudHMucHVzaChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIiB3aXRoIFwiICsgcG91Y2guZ2V0Q29pbnMoKS50b1N0cmluZygpICsgXCIgY29pbnNcIikpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29uZGl0aW9ucyA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFNheT4pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIEVsZW1lbnRzLlJvb21IYW5kbGVyLlByaW50aW5nVmlzaWJsZVRoaW5nc1J1bGVib29rLmlzUnVubmluZygpXHJcbiAgICAgICAgICAgICAgICAmJiAoPFNheT4gcnVsZWJvb2subm91bikuY3VycmVudE5vdW4gaW5zdGFuY2VvZiBDb2luUG91Y2hcclxuICAgICAgICAgICAgICAgICYmICg8Q29pblBvdWNoPiAoPFNheT4gcnVsZWJvb2subm91bikuY3VycmVudE5vdW4pLmdldENvaW5zKCkgPiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7XHJcblxyXG5BY3Rpb25FeGFtaW5lLmNhcnJ5LmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUHJpbnQgZGVzY3JpcHRpb24gb2YgY29pbnMgaW4gQ29pbiBQb3VjaFwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IEFjdGlvbkV4YW1pbmUuUHJpbnREZXNjcmlwdGlvbk9mRXhhbWluZWRUaGluZ1J1bGUuZmlyc3RQcmlvcml0eSxcclxuICAgIHByaW9yaXR5IDogQWN0aW9uRXhhbWluZS5QcmludERlc2NyaXB0aW9uT2ZFeGFtaW5lZFRoaW5nUnVsZS5wcmlvcml0eSAtIDEsXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uRXhhbWluZT4pID0+IHtcclxuICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkV4YW1pbmU+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgbGV0IHRoaW5nID0gPENvaW5Qb3VjaD4gYWN0aW9uLmdldE5vdW4oMCk7XHJcbiAgICAgICAgaWYgKHRoaW5nLmdldENvaW5zKCkgPiAwKSB7XHJcbiAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFwiIFRoZXJlIGFyZSBcIiArIHRoaW5nLmdldENvaW5zKCkudG9TdHJpbmcoKSArIFwiIGNvaW5zIGluIGl0LlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIiBUaGVyZSBhcmUgbm8gY29pbnMgaW4gaXQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjb25kaXRpb25zIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uRXhhbWluZT4pID0+IHtcclxuICAgICAgICByZXR1cm4gKCg8QWN0aW9uRXhhbWluZT4gcnVsZWJvb2subm91bikuZ2V0Tm91bigwKSBpbnN0YW5jZW9mIENvaW5Qb3VjaCk7XHJcbiAgICB9XHJcbn0pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRWxlbWVudHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uRXhhbWluZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL1RoaW5ncy9Db2luUG91Y2gudHNcIiAvPlxyXG5tb2R1bGUgRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlciB7XHJcbiAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbnZlbnRvcnlUYXJnZXRcIik7XHJcblxyXG4gICAgZnVuY3Rpb24gZW1wdHkgKCkge1xyXG4gICAgICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwcmludEhlYWRlciAoaGVhZGVyIDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoXCJpbnZlbnRvcnlIZWFkZXJcIik7XHJcbiAgICAgICAgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShoZWFkZXIgKyBcIjpcIikpO1xyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChwKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY3VycmVudFJvdyA6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGV4cG9ydCBsZXQgTGlua2luZ1RoaW5nID0gbmV3IFJ1bGVib29rPFRoaW5nPihcIkludmVudG9yeSAtIExpbmtzIGZvciBhIFRoaW5nXCIpO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBwcmludFRoaW5nTGluayAoc2hvcnRjdXQgOiBzdHJpbmcsIGFjdGlvbiA6IEFjdGlvbikge1xyXG4gICAgICAgIGxldCBuYW1lTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbmFtZUxpbmsuY2xhc3NMaXN0LmFkZChcImludmVudG9yeUxpbmtcIik7XHJcbiAgICAgICAgbmFtZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2hvcnRjdXQpKTtcclxuICAgICAgICBjdXJyZW50Um93LmFwcGVuZENoaWxkKG5hbWVMaW5rKTtcclxuXHJcbiAgICAgICAgQ29udHJvbHMuTGlua3MubWFrZUxpbmsobmFtZUxpbmssIGFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJpbnRUaGluZyAodGhpbmcgOiBUaGluZykge1xyXG4gICAgICAgIGN1cnJlbnRSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGN1cnJlbnRSb3cuY2xhc3NMaXN0LmFkZChcImludmVudG9yeVJvd1wiKTtcclxuXHJcbiAgICAgICAgbGV0IG5hbWVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBuYW1lTGluay5jbGFzc0xpc3QuYWRkKFwiaW52ZW50b3J5TGlua1wiLCBcIm5hbWVcIik7XHJcbiAgICAgICAgbmFtZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpbmcuZ2V0UHJpbnRlZE5hbWUoKSkpO1xyXG4gICAgICAgIGN1cnJlbnRSb3cuYXBwZW5kQ2hpbGQobmFtZUxpbmspO1xyXG5cclxuICAgICAgICBDb250cm9scy5MaW5rcy5tYWtlTGluayhuYW1lTGluaywgbmV3IEFjdGlvbkV4YW1pbmUoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSk7XHJcblxyXG4gICAgICAgIGF3YWl0IExpbmtpbmdUaGluZy5leGVjdXRlKHtub3VuIDogdGhpbmd9KTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGN1cnJlbnRSb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0aGluZ1NvcnQgKGEgOiBUaGluZywgYiA6IFRoaW5nKSB7XHJcbiAgICAgICAgbGV0IG5hID0gYS5nZXRQcmludGVkTmFtZSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgbGV0IG5iID0gYi5nZXRQcmludGVkTmFtZSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKG5hIDwgbmIpIHJldHVybiAtMTtcclxuICAgICAgICBpZiAobmEgPiBuYikgcmV0dXJuIDE7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUludmVudG9yeSAoKSB7XHJcbiAgICAgICAgbGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xyXG5cclxuICAgICAgICBlbXB0eSgpO1xyXG5cclxuICAgICAgICBsZXQgd2llbGRlZCA9IFRoaW5nLldpZWxkUmVsYXRpb24uZ2V0UmlnaHQocGxheWVyKS5zb3J0KHRoaW5nU29ydCk7XHJcbiAgICAgICAgbGV0IHdvcm4gPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQocGxheWVyKS5zb3J0KHRoaW5nU29ydCk7XHJcbiAgICAgICAgbGV0IGNhcnJpZWQgPSBUaGluZy5DYXJyeVJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuc29ydCh0aGluZ1NvcnQpO1xyXG5cclxuICAgICAgICBpZiAod2llbGRlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByaW50SGVhZGVyKFwiV2llbGRlZFwiKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWVsZGVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwcmludFRoaW5nKHdpZWxkZWRbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod29ybi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByaW50SGVhZGVyKFwiV29yblwiKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwcmludFRoaW5nKHdvcm5baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FycmllZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByaW50SGVhZGVyKFwiQ2FycmllZFwiKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYXJyaWVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwcmludFRoaW5nKGNhcnJpZWRbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcG91Y2ggPSA8QXJyYXk8Q29pblBvdWNoPj4gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodFR5cGUoV29ybGRTdGF0ZS5wbGF5ZXIsIENvaW5Qb3VjaCk7XHJcbiAgICAgICAgaWYgKHBvdWNoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICAgICAgcC5jbGFzc0xpc3QuYWRkKFwiaW52ZW50b3J5R29sZFwiKTtcclxuICAgICAgICAgICAgbGV0IHMgOiBTYXk7XHJcbiAgICAgICAgICAgIGlmIChwb3VjaFswXS5nZXRDb2lucygpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcyA9IG5ldyBTYXkoXCJUaGVyZSBhcmUgXCIgKyBwb3VjaFswXS5nZXRDb2lucygpLnRvU3RyaW5nKCkgKyBcIiBjb2lucyBpbiB5b3VyIFwiLCBwb3VjaFswXSwgXCIuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcyA9IG5ldyBTYXkoXCJUaGVyZSBhcmUgbm8gY29pbnMgaW4geW91ciBcIiwgcG91Y2hbMF0sIFwiLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBzLmdldFB1cmVFbGVtZW50cygpLnRoZW4oZWxlbWVudHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGVib29rLnRzXCIgLz5cclxuXHJcbmNsYXNzIEFjdGlvblJldHJhY2UgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVjayA9IG5ldyBSdWxlYm9vazxBY3Rpb25SZXRyYWNlPihcIkNoZWNrIFJldHJhY2luZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgPSBuZXcgUnVsZWJvb2s8QWN0aW9uUmV0cmFjZT4oXCJDYXJyeSBvdXQgUmV0cmFjaW5nXCIpO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYWN0b3IgOiBUaGluZywgLi4ubm91bnMgOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgc3VwZXIoYWN0b3IsIC4uLm5vdW5zKTtcclxuICAgICAgICB0aGlzLnJlcXVpcmVzTm91biA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVxdWlyZXNWaXNpYmlsaXR5ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1R1cm4gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5lZWRzIHRvIHJldHVybiBhIHN0cmluZyBleHBsYWluaW5nIHdoYXQgdGhlIHBsYXllciB3aWxsIGRvIGlmIGhlIGRvZXMgdGhpcyBhY3Rpb24uXHJcbiAgICAgKiBGb3IgaW5zdGFuY2UsIEFjdGlvblRha2luZyBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBsaWtlIHJldHVybiBcInRha2UgXCIgKyB0aGlzLm5vdW5zWzBdLmdldE5hbWUoKSxcclxuICAgICAqICAgd2hpY2ggd291bGQgcmVhZCBhcyBcInRha2UgdGhpbmdcIi5cclxuICAgICAqICAgcmVtZW1iZXIgdGhhdCB0aGluZ3MgaW1wbGVtZW50IFBSSU5UQUJMRSBpbnRlcmZhY2UsIHNvIHlvdSBjYW4gZ2V0IHRoZWlyIG5hbWVzLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmRUZXh0ICgpIHtcclxuICAgICAgICBsZXQgbmFtZTtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2V0Tm91bigwKSA9PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSBEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25bdGhpcy5nZXROb3VuKDApXV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE5vdW4oMCkgaW5zdGFuY2VvZiBSb29tKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSAoPFJvb20+IHRoaXMuZ2V0Tm91bigwKSkuZ2V0UHJpbnRlZE5hbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwidGhpbmsgYWJvdXQgaG93IHRvIGdldCB0byBcIiArIG5hbWU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5BY3Rpb25SZXRyYWNlLmNoZWNrLmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgbmFtZSA6IFwiQ2hhbmdlIFJvb20gdG8gRGlyZWN0aW9uXCIsXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uUmV0cmFjZT4pID0+IHtcclxuICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG5cclxuICAgICAgICAvLyBTb21lb25lIGFza2VkIGZvciBhIHJvb20uLi5cclxuICAgICAgICBpZiAoYWN0aW9uLmdldE5vdW4oMCkgaW5zdGFuY2VvZiBSb29tKSB7XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IGNSb29tID0gYWN0b3IuZ2V0Um9vbSgpO1xyXG4gICAgICAgICAgICBpZiAoY1Jvb20gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRSb29tID0gYWN0aW9uLmdldE5vdW4oMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY1Jvb20gPT0gZFJvb20pIHtcclxuICAgICAgICAgICAgICAgIGlmIChhY3Rvci5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgYXJlIGFscmVhZHkgdGhlcmUhXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvZGUgPSAocm9vbSA6IFJvb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gV29ybGRTdGF0ZS5pc1Jvb21SZW1lbWJlcmVkKHJvb20pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gY1Jvb20uYmVzdERpcmVjdGlvblRvKGRSb29tLCBjb2RlKTtcclxuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhY3Rvci5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgZG9uJ3QgcmVtZW1iZXIgaG93IHRvIGdldCB0aGVyZS5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2V0Tm91bigwLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSk7XHJcblxyXG5BY3Rpb25SZXRyYWNlLmNhcnJ5LmFkZFJ1bGUobmV3IFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiUmV0cmFjaW5nIC0gRmluZCBEaXJlY3Rpb25cIixcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25SZXRyYWNlPikgPT4ge1xyXG4gICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uUmV0cmFjZT4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJUbyBnZXQgdGhlcmUsIHlvdSBzaG91bGQgZ28gXCIgKyBEaXJlY3Rpb25OYW1lc1tEaXJlY3Rpb25bYWN0aW9uLmdldE5vdW4oMCldXSArIFwiLlwiKTtcclxuICAgIH1cclxufSkpO1xyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vV29ybGQvQ2xhc3Nlcy9BY3Rpb24vQWN0aW9uUmV0cmFjZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Xb3JsZC9DbGFzc2VzL0FjdGlvbi9BY3Rpb25Hby50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Db250cm9scy9Nb2R1bGVzL0xpbmtzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0VsZW1lbnRzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkhvdmVySW5mby50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9DbGFzc2VzL1Jvb21Ob2RlLnRzXCIgLz5cclxubW9kdWxlIEVsZW1lbnRzLlJlbWVtYmVyZWRIYW5kbGVyIHtcclxuICAgIC8vdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVtZW1iZXJlZFJvb21zVGFyZ2V0XCIpO1xyXG4gICAgdmFyIG1hcFRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFwVGFyZ2V0XCIpO1xyXG4gICAgdmFyIGxhc3RNYXAgOiBSb29tUmFuZG9tTWFwO1xyXG4gICAgdmFyIGVsZW1lbnRzIDogeyBbeHkgOiBzdHJpbmddIDogUm9vbU5vZGV9O1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBlbXB0eSAoKSB7XHJcbiAgICAgICAgLy8gd2hpbGUgKHRhcmdldC5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgLy8gICAgIHRhcmdldC5yZW1vdmVDaGlsZCh0YXJnZXQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBlbGVtZW50cyA9IHt9O1xyXG4gICAgICAgIGxhc3RNYXAgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHdoaWxlIChtYXBUYXJnZXQuZmlyc3RDaGlsZCkge1xyXG4gICAgICAgICAgICBtYXBUYXJnZXQucmVtb3ZlQ2hpbGQobWFwVGFyZ2V0LmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWFwICgpIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIltNQVBdIENyZWF0aW5nIE1hcFwiKTtcclxuXHJcbiAgICAgICAgbGV0IHJlZ2lvbnMgPSBSZWdpb24uSW5SZWxhdGlvbi5nZXRBbGxMZWZ0VHlwZShXb3JsZFN0YXRlLnBsYXllci5nZXRSb29tKCksIFJlZ2lvblJhbmRvbSk7XHJcbiAgICAgICAgbGV0IGJpZ2dlc3RSZWdpb24gPSA8UmVnaW9uUmFuZG9tPiByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKGJpZ2dlc3RSZWdpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGVtcHR5KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChiaWdnZXN0UmVnaW9uLm1hcCAhPSBsYXN0TWFwKSB7XHJcbiAgICAgICAgICAgIGVtcHR5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdXBkYXRlT2xkTWFwKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtYXAgPSBiaWdnZXN0UmVnaW9uLm1hcDtcclxuICAgICAgICBsYXN0TWFwID0gbWFwO1xyXG5cclxuICAgICAgICBtYXAudXBkYXRlQWxsTGltaXRzKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHkgPSBtYXAuaGlnaGVzdFk7IHkgPj0gbWFwLmxvd2VzdFk7IHktLSkge1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgcm93LmNsYXNzTGlzdC5hZGQoXCJtYXBSb3dcIik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSBtYXAubG93ZXN0WDsgeCA8PSBtYXAuaGlnaGVzdFg7IHgrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb20gPSBtYXAuZ2V0Um9vbSh4LCB5KTtcclxuICAgICAgICAgICAgICAgIGxldCByb29tTm9kZSA9IG5ldyBSb29tTm9kZShyb29tKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHJvb21Ob2RlLmNyZWF0ZVJvb21OYW1lRmxvYXRlcigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCByb29tRGl2ID0gcm9vbU5vZGUuZ2V0RWxlbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHJvb21EaXYpO1xyXG5cclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzW3gudG9TdHJpbmcoKSArIFwiO1wiICsgeS50b1N0cmluZygpXSA9IHJvb21Ob2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1hcFRhcmdldC5hcHBlbmRDaGlsZChyb3cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdXBkYXRlT2xkTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU9sZE1hcCAoKSB7XHJcbiAgICAgICAgbGV0IG1hcCA9IGxhc3RNYXA7XHJcbiAgICAgICAgZm9yIChsZXQgeSA9IG1hcC5oaWdoZXN0WTsgeSA+PSBtYXAubG93ZXN0WTsgeS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHggPSBtYXAubG93ZXN0WDsgeCA8PSBtYXAuaGlnaGVzdFg7IHgrKykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZWxlbWVudHNbeC50b1N0cmluZygpICsgXCI7XCIgKyB5LnRvU3RyaW5nKCldLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8gLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0VsZW1lbnRzLnRzXCIgLz5cclxuLy8gbW9kdWxlIEVsZW1lbnRzLlN0YXR1c0xpbmVIYW5kbGVyIHtcclxuLy8gICAgIHZhciBzdGF0dXNMaW5lRmxleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3RhdHVzTGluZUZsZXhcIik7XHJcbi8vICAgICB2YXIgc3RhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXR1c0xpbmVTdGFydFwiKTtcclxuLy8gICAgIHZhciBlbmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXR1c0xpbmVFbmRcIik7XHJcbi8vICAgICBlbmQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4vL1xyXG4vLyAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpdmlkZXIgKCkge1xyXG4vLyAgICAgICAgIC8vIC5ub3Nocmlua0ZsZXguc3RhdHVzQ29sdW1uRGl2aWRlclxyXG4vLyAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4vLyAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwibm9zaHJpbmtGbGV4XCIsIFwic3RhdHVzQ29sdW1uRGl2aWRlclwiKTtcclxuLy8gICAgICAgICByZXR1cm4gZGl2O1xyXG4vLyAgICAgfVxyXG4vL1xyXG4vLyAgICAgZXhwb3J0IGZ1bmN0aW9uIHByaW50ICguLi5lbGVzIDogQXJyYXk8Tm9kZT4pIHtcclxuLy8gICAgICAgICBmb3IgKGxldCBlbGUgb2YgZWxlcykge1xyXG4vLyAgICAgICAgICAgICBzdGF0dXNMaW5lRmxleC5pbnNlcnRCZWZvcmUoZWxlLCBlbmQpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH1cclxuLy9cclxuLy8gICAgIGZ1bmN0aW9uIGVtcHR5ICgpIHtcclxuLy8gICAgICAgICB3aGlsZSAoc3RhcnQubmV4dFNpYmxpbmcgIT0gZW5kKSB7XHJcbi8vICAgICAgICAgICAgIHN0YXR1c0xpbmVGbGV4LnJlbW92ZUNoaWxkKHN0YXJ0Lm5leHRTaWJsaW5nKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vXHJcbi8vICAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlU3RhdHVzTGluZSAoKSB7XHJcbi8vICAgICAgICAgZW1wdHkoKTtcclxuLy9cclxuLy8gICAgICAgICBsZXQgc2F5ID0gbmV3IFNheSgoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcikuZ2V0U2hvcnRlc3REZXNjcmlwdGlvbigpKTtcclxuLy9cclxuLy8gICAgICAgICAoYXdhaXQgc2F5LmdldFB1cmVFbGVtZW50cygpKS5mb3JFYWNoKChlbGUpID0+IHtcclxuLy8gICAgICAgICAgICAgcHJpbnQoZWxlLCBjcmVhdGVEaXZpZGVyKCkpO1xyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG4vLyB9IiwibW9kdWxlIERlYnVnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBrbm93ZGV3YWUgKCkge1xyXG4gICAgICAgIGxldCBtYXAgPSBuZXcgTWFwTm90ZSh7XHJcbiAgICAgICAgICAgIG5hbWUgOiBcIkRlIFdhZVwiLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA6IFwiVGhpcyBtYXAgc2hvd3MgZGUgd2FlIGFsbCBkZSB3YWUgdG8gWmltYmFid2UuXCJcclxuICAgICAgICB9KTtcclxuICAgICAgICBtYXAuYWRkUm9vbSguLi5SZWdpb24uUmVnaW9uUm9vbS5nZXRBbnlSaWdodFR5cGUoUm9vbVJhbmRvbSkpO1xyXG4gICAgICAgIFdvcmxkU3RhdGUucGxheWVyLnNldENhcnJpZWQobWFwKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaHVydCAodGFyZ2V0IDogUGVyc29uIHwgQm9keXBhcnQsIGFtb3VudCA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBicCA6IEJvZHlwYXJ0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQZXJzb24pIHtcclxuICAgICAgICAgICAgYnAgPSB0YXJnZXQuZ2V0UGFydChIdW1hbm9pZFRvcnNvKTtcclxuICAgICAgICAgICAgaWYgKGJwID09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQm9keXBhcnQpIHtcclxuICAgICAgICAgICAgYnAgPSB0YXJnZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJwLmNoYW5nZVNvcmVuZXNzKGFtb3VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdvVG8gKHN0ciA6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCB0aGluZyA9IFRoaW5nLmdldE9uZVRoaW5nKHN0cik7XHJcbiAgICAgICAgLy8gbGV0IHJvb20gOiBSb29tO1xyXG4gICAgICAgIC8vIGlmICh0aGluZyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgICAgcm9vbSA9IHRoaW5nLmdldFJvb20oKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJ1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJ1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vRXZlcnlUdXJuLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0Z1bmN0aW9ucy50c1wiIC8+XHJcblxyXG5pbnRlcmZhY2UgQUlPcHRpb25zIHtcclxuICAgIHdhbmRlcmVyPyA6IGJvb2xlYW4sXHJcbiAgICB3YW5kZXJzT24/IDogUmVnaW9uLFxyXG4gICAgcGlja3NTaGluaWVzPyA6IGJvb2xlYW5cclxufVxyXG5cclxuY2xhc3MgQUkge1xyXG4gICAgcHVibGljIHdhbmRlcmVyID0gdHJ1ZTtcclxuICAgIHB1YmxpYyB3YW5kZXJzT24gOiBSZWdpb247XHJcbiAgICBwdWJsaWMgd2FuZGVyQ2hhbmNlID0gNTA7XHJcbiAgICBwdWJsaWMgcGlja3NTaGluaWVzID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnMgOiBBSU9wdGlvbnMpIHtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb3B0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXhlY3V0aW5nIGFuIEFJIHJldHVybnMgYW4gQWN0aW9uLiBET0VTTidUIGV4ZWN1dGUgdGhlIGFjdGlvbiwganVzdCBmaW5kcyBpdCFcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGlvbj59XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlIChhY3RvciA6IFRoaW5nKSA6IFByb21pc2U8QWN0aW9uPiB7XHJcbiAgICAgICAgbGV0IHByb21pc2UgOiBQcm9taXNlPEFjdGlvbj47XHJcbiAgICAgICAgLy8gVE9ETzogaWYgYWN0b3IuaXNJbkNvbWJhdCgpO1xyXG4gICAgICAgIGlmIChwcm9taXNlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwcm9taXNlID0gQUkuY29tYmF0UnVsZXMuZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICBub3VuIDogYWN0b3JcclxuICAgICAgICAgICAgfSwgLi4udGhpcy5leHRyYUNvbWJhdFJ1bGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcm9taXNlID0gQUkucnVsZXMuZXhlY3V0ZSh7XHJcbiAgICAgICAgICAgICAgICBub3VuIDogYWN0b3JcclxuICAgICAgICAgICAgfSwgLi4udGhpcy5leHRyYVJ1bGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQgOiBBY3Rpb24gPSBhd2FpdCBwcm9taXNlO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRSdWxlc0Jvb2sgKC4uLmJvb2tzIDogQXJyYXk8UnVsZWJvb2s8VGhpbmc+Pikge1xyXG4gICAgICAgIHRoaXMuZXh0cmFSdWxlcy5wdXNoKC4uLmJvb2tzKVxyXG4gICAgICAgIGFycmF5VW5pcXVlKHRoaXMuZXh0cmFSdWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZENvbWJhdFJ1bGVzQm9vayAoLi4uYm9va3MgOiBBcnJheTxSdWxlYm9vazxUaGluZz4+KSB7XHJcbiAgICAgICAgdGhpcy5leHRyYUNvbWJhdFJ1bGVzLnB1c2goLi4uYm9va3MpXHJcbiAgICAgICAgYXJyYXlVbmlxdWUodGhpcy5leHRyYUNvbWJhdFJ1bGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzID0gbmV3IFJ1bGVib29rPFRoaW5nPihcIkRlZmF1bHQgQUkgUnVsZXNcIik7XHJcbiAgICBwdWJsaWMgZXh0cmFSdWxlcyA6IEFycmF5PFJ1bGVib29rPFRoaW5nPj4gPSBbXTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY29tYmF0UnVsZXMgPSBuZXcgUnVsZWJvb2s8VGhpbmc+KFwiRGVmYXVsdCBBSSBDb21iYXQgUnVsZXNcIik7XHJcbiAgICBwdWJsaWMgZXh0cmFDb21iYXRSdWxlcyA6IEFycmF5PFJ1bGVib29rPFRoaW5nPj4gPSBbXTtcclxufVxyXG5cclxubW9kdWxlIEFJUnVsZXMge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIG9yIGJlaGF2aW9yYWwgcnVsZXMgcmVnYXJkaW5nIHNvbWV0aGluZyB0aGF0IGlzIGhhcHBlbmluZyBSSUdIVCBOT1cuXHJcbiAgICAgKiBpLmUuIFJ1bGUgZm9yIHdoYXQgYSBtb25zdGVyIGRvZXMgd2hlbiB0aGUgcGxheWVyIGhhcyBqdXN0IGluc3VsdGVkIHRoZW0sIG9yIGZvciB3aGVuIHRoZSBwbGF5ZXIgdHJpZ2dlcnMgYW4gYWxhcm0sIGV0Yy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgUFJJT1JJVFlfQUNUSU5HX09OX1NJVFVBVElPTiA9IDU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBiZWhhdmlvcmFsIHJ1bGVzIGFib3V0IHdoYXQgdGhlIE5QQyBTRUVTLlxyXG4gICAgICogaS5lLiBJcyB0aGVyZSBhIHNoaW55IG9uIHRoZSBncm91bmQgZm9yIG1lIHRvIHRha2U/IERvIEkgc2VlIHRoZSBwbGF5ZXIgYW5kIGlmIHNvIGhvdyBkbyBJIGZlZWwgYWJvdXQgaXQ/XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIFBSSU9SSVRZX0FDVElOR19PTl9QTEFDRSA9IDM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIGZvciBydWxlcyBmb3Igd2hlbiB0aGUgTlBDIGhhcyBub3RoaW5nIGJldHRlciB0byBkby5cclxuICAgICAqIGkuZS4gU3RhbmRhcmQgZ3VhcmRpbmcgcm91dGVzLCBldGMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIFBSSU9SSVRZX0FDVElOR19PTl9JRExFID0gMTtcclxufSIsImNsYXNzIFBlcnNvblN0YXQge1xyXG4gICAgcHVibGljIGlkIDogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIGRlc2NyaXB0aW9uIDogc3RyaW5nIHwgU2F5IHwgKCh2YWx1ZSA6IG51bWJlcikgPT4gc3RyaW5nIHwgU2F5KTtcclxuICAgIHB1YmxpYyBkZWZhdWx0VmFsdWUgOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG1heFZhbHVlIDogbnVtYmVyID0gMTA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZywgZGVzY3JpcHRpb24/IDogc3RyaW5nIHwgU2F5IHwgKCh2YWx1ZSA6IG51bWJlcikgPT4gc3RyaW5nIHwgU2F5KSkge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT0gdW5kZWZpbmVkID8gXCJOb3QgZGVmaW5lZFwiIDogZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICh2YWx1ZSA6IG51bWJlcikgOiBTYXkgfCBzdHJpbmcgfCAoKHZhbHVlIDogbnVtYmVyKSA9PiAoc3RyaW5nIHwgU2F5KSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXNjcmlwdGlvbiA9PSBcInN0cmluZ1wiIHx8IHRoaXMuZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBTYXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb24odmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQZXJzb25TdGF0LnRzXCIgLz5cclxuaW50ZXJmYWNlIEF0dHJpYnV0ZUJlYXJlciB7XHJcbiAgICBnZXRTdGF0IChhdHRyIDogQXR0cmlidXRlKSA6IG51bWJlcjtcclxuICAgIHNldFN0YXQgKGF0dHIgOiBBdHRyaWJ1dGUsIHZhbHVlIDogbnVtYmVyKSA6IHZvaWQ7XHJcbn1cclxuXHJcbmNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIFBlcnNvblN0YXQge1xyXG4gICAgcHVibGljIGRlZmF1bHRWYWx1ZSA6IG51bWJlciA9IDI7XHJcbiAgICBwdWJsaWMgbWF4VmFsdWUgOiBudW1iZXIgPSA1O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoaWQgOiBzdHJpbmcsIGRlc2NyaXB0aW9uPyA6IHN0cmluZyB8IFNheSB8ICgodmFsdWUgOiBudW1iZXIpID0+IHN0cmluZyB8IFNheSksIGRlZlZhbHVlPyA6bnVtYmVyLCBtYXhWYWx1ZT86bnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRlc2NyaXB0aW9uKTtcclxuICAgICAgICBpZiAoZGVmVmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmVmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF4VmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEF0dHJpYnV0ZS5BdHRyaWJ1dGVzW2lkXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQXR0cmlidXRlcyA6IHtbaWQgOiBzdHJpbmddIDogQXR0cmlidXRlfSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXR0cmlidXRlcyAoKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gQXR0cmlidXRlLkF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKEF0dHJpYnV0ZS5BdHRyaWJ1dGVzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEF0dHJpYnV0ZSAoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gQXR0cmlidXRlLkF0dHJpYnV0ZXNbaWRdO1xyXG4gICAgfVxyXG59XHJcblxyXG5tb2R1bGUgQXR0cmlidXRlcyB7XHJcbiAgICBleHBvcnQgbGV0IFN0cmVuZ3RoID0gbmV3IEF0dHJpYnV0ZShcclxuICAgICAgICBcIlN0cmVuZ3RoXCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBcIkhlcmN1bGVzJyBCaWdnZXIgQ291c2luXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiAoXCJDaXJjdXMgU3Ryb25nXCIgKyAoKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmlzTWFsZSgpID8gXCJtYW5cIiA6IFwid29tYW5cIikpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gXCJCZWFjaCBCdWxseVwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gKFwiQXZlcmFnZSBcIiArICgoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcikuaXNNYWxlKCkgPyBcIkpvZVwiIDogXCJKYW5lXCIpKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFwiV2V0IE5vb2RsZVwiO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIFwiT3V0IG9mIGJvdW5kcy5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcbiAgICBleHBvcnQgbGV0IEFnaWxpdHkgPSBuZXcgQXR0cmlidXRlKFxyXG4gICAgICAgIFwiQWdpbGl0eVwiLFxyXG4gICAgICAgIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gXCJDYXRsaWtlXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBcIkd5bW5hc3RcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFwiQWNjdXJhdGVcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFwiQ29tbW9uXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBcIkFjY2lkZW50LXByb25lXCI7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gXCJPdXQgb2YgYm91bmRzLlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgbGV0IEludGVsbGlnZW5jZSA9IG5ldyBBdHRyaWJ1dGUoXHJcbiAgICAgICAgXCJJbnRlbGxpZ2VuY2VcIixcclxuICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFwiR2VuaXVzXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBcIkdpZnRlZFwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gXCJLbm93bGVkZ2VhYmxlXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBcIk5vcm1hbFwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gXCJEb29yXCI7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gXCJPdXQgb2YgYm91bmRzLlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBleHBvcnQgbGV0IENoYXJtID0gbmV3IEF0dHJpYnV0ZShcclxuICAgICAgICBcIkNoYXJtXCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiAoKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmlzTWFsZSgpID8gXCJDYXNhbm92YVwiIDogXCJTZWR1Y3RyZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gXCJEaXBsb21hdFwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gKFwiQ2hlZXJ5IFNhbGVzXCIgKyAoKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmlzTWFsZSgpID8gXCJtYW5cIiA6IFwid29tYW5cIikpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gXCJOb3QgZXZlbiB0cnlpbmdcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFwiVW5wbGVhc2FudFwiO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIFwiT3V0IG9mIGJvdW5kcy5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgZXhwb3J0IGxldCBDb3JydXB0aW9uID0gbmV3IEF0dHJpYnV0ZShcclxuICAgICAgICBcIkNvcnJ1cHRpb25cIixcclxuICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIk5vdCBkZWZpbmVkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIDAsIDEwMFxyXG4gICAgKTtcclxuXHJcblxyXG4gICAgZXhwb3J0IGxldCBHZW5kZXJJZGVudGl0eSA9IG5ldyBBdHRyaWJ1dGUoXHJcbiAgICAgICAgXCJHZW5kZXIgSWRlbnRpdHlcIixcclxuICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSA3NSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IHN0cm9uZ2x5IGZlZWwsIGFuZCBhY3QsIGxpa2UgYSB3b21hbi5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA2MCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IGZlZWwsIGFuZCBhY3QsIGxpa2UgYSB3b21hbi5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA0MCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IGRvbid0IGZlZWwgbm9yIGFjdCBsaWtlIGFueSBwYXJ0aWN1bGFyIGdlbmRlci5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91IGZlZWwsIGFuZCBhY3QsIGxpa2UgYSBtYW4uXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJZb3Ugc3Ryb25nbHkgZmVlbCwgYW5kIGFjdCwgbGlrZSBhIG1hbi5cIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgNTAsIDEwMFxyXG4gICAgKTtcclxuXHJcblxyXG4gICAgZXhwb3J0IGxldCBEZWdlbmVyYXRpb24gPSBuZXcgQXR0cmlidXRlKFxyXG4gICAgICAgIFwiRGVnZW5lcmF0aW9uXCIsXHJcbiAgICAgICAgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gNzUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlNleCBpcyBhYm91dCB0aGUgb25seSB0aGluZyBvbiB5b3VyIG1pbmQsIGFuZCB5b3UgZG9uJ3QgZXZlbiB0cnkgdG8gaGlkZSBpdCBhbnltb3JlLlwiO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDYwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJTb21ldGltZXMgeW91IGNhbid0IGhpZGUgaG93IG5hdWdodHkgeW91J2QgbGlrZSB0byBiZS5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA0MCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIllvdXIgY29tcG9zdXJlIGlzIHBydWRpc2ggYW5kIGNhbG0uXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJZb3UgaGF2ZSB0aGUgY29tcG9zdXJlIG9mIGEgc2FpbnQuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIDMwLCAxMDBcclxuICAgICk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGVyc29uU3RhdC50c1wiIC8+XHJcbmludGVyZmFjZSBTa2lsbEJlYXJlciB7XHJcbiAgICBnZXRTa2lsbCAoYXR0ciA6IFNraWxsKSA6IG51bWJlcjtcclxuICAgIHNldFNraWxsIChhdHRyIDogU2tpbGwsIHZhbHVlIDogbnVtYmVyKSA6IHZvaWQ7XHJcbn1cclxuXHJcbmNsYXNzIFNraWxsIGV4dGVuZHMgUGVyc29uU3RhdCB7XHJcbiAgICBwdWJsaWMgZGVmYXVsdFZhbHVlIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtYXhWYWx1ZSA6IG51bWJlciA9IDU7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChpZCA6IHN0cmluZywgZGVzY3JpcHRpb24/IDogc3RyaW5nIHwgU2F5IHwgKCh2YWx1ZSA6IG51bWJlcikgPT4gc3RyaW5nIHwgU2F5KSkge1xyXG4gICAgICAgIHN1cGVyKGlkLCBkZXNjcmlwdGlvbik7XHJcbiAgICAgICAgU2tpbGwuU2tpbGxzW2lkXSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU2tpbGxzIDoge1tpZCA6IHN0cmluZ10gOiBTa2lsbH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNraWxscyAoKSB7XHJcbiAgICAgICAgbGV0IHNraWxscyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBTa2lsbC5Ta2lsbHMpIHtcclxuICAgICAgICAgICAgc2tpbGxzLnB1c2goU2tpbGwuU2tpbGxzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBza2lsbHMuc29ydCgoYSA6IFNraWxsLCBiIDogU2tpbGwpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5hID0gYS5pZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBsZXQgbmIgPSBiLmlkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChuYSA+IG5iKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKG5hIDwgbmIpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNraWxscztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNraWxsIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBTa2lsbC5Ta2lsbHNbaWRdO1xyXG4gICAgfVxyXG59XHJcblxyXG5tb2R1bGUgU2tpbGxzIHtcclxuICAgIGV4cG9ydCBsZXQgU3Vydml2YWwgPSBuZXcgU2tpbGwoXHJcbiAgICBcIlN1cnZpdmFsXCIsXHJcbiAgICAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFwiQWxlcnQgQ2hpaHVhaHVhXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApO1xyXG59IiwiLy8gQSBjb250YWluZXIgaGFzIHRoaW5ncyBpbnNpZGUgdGhhdCBjYW4gYmUgc2VlbiBhbmQgaW50ZXJhY3RlZCB3aXRoLlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG5jbGFzcyBDb250YWluZXIgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgcHV0ICguLi50aGluZ3MgOiBBcnJheTxUaGluZz4pIHtcclxuXHJcbiAgICB9XHJcbn0iLCIvLyBBIGNvcnBzZSBpcyBqdXN0IHRoZSBjb250YWluZXIgb2YgYSBkZWFkIHBlcnNvbi5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbnRhaW5lci50c1wiIC8+XHJcbmNsYXNzIENvcnBzZSBleHRlbmRzIENvbnRhaW5lciB7XHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5nLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FJLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlBlcnNvbi9BdHRyaWJ1dGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUGVyc29uL1NraWxsLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbnRhaW5lci9Db3Jwc2UudHNcIiAvPlxyXG4vKipcclxuICogQSBwZXJzb24gaXMgYSB0aGluZyB0aGF0IGhhcHBlbnMgdG8gYmUgXCJhbGl2ZVwiIGluIHNvbWUgc2lnbmlmaWNhbnQgd2F5LCBub3QgbmVjZXNzYXJpbHkgaHVtYW4uXHJcbiAqIEEgcm9ib3QgaXMgYSBwZXJzb24uXHJcbiAqIEEgZG9nIGlzIGEgcGVyc29uLlxyXG4gKlxyXG4gKiBGdWNrIHlvdXIgc3RhbmRhcmRzLlxyXG4gKi9cclxuY2xhc3MgUGVyc29uIGV4dGVuZHMgVGhpbmcgaW1wbGVtZW50cyBBdHRyaWJ1dGVCZWFyZXIsIFNraWxsQmVhcmVyIHtcclxuICAgIHB1YmxpYyBBSSA9IG5ldyBBSSh7fSk7XHJcbiAgICBwdWJsaWMgYW5pbWF0ZWQgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBzb3JlbmVzcyA9IDA7XHJcbiAgICBwdWJsaWMgbGFzdEhlYWx0aFVwZGF0ZSA9IDA7XHJcblxyXG4gICAgcHVibGljIHN0YW1pbmEgPSAxMDtcclxuICAgIHB1YmxpYyBsYXN0U3RhbWluYVVwZGF0ZSA9IDA7XHJcbiAgICBwdWJsaWMgc3RhbWluYVBlclR1cm4gPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBNQVhfU1RBTUlOQSA9IDEwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTVFJFTkdUSF9TT1JFTkVTU19NVUxUSVBMSUVSID0gNDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnMgOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygocGVyc29uIDogUGVyc29uKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIExldCdzIG5vdCBkbyB0aGlzIGZvciBOUENzLiBJdCBjYW4gYnJlYWsgcGF0Y2hlcy5cclxuICAgICAgICAgICAgaWYgKHBlcnNvbi5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIFN0YXRzOiB0aGlzLmF0dHJpYnV0ZVZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgIFNraWxsczogdGhpcy5za2lsbFZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygocGVyc29uIDogUGVyc29uLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIExldCdzIG5vdCBkbyB0aGlzIGZvciBOUENzLiBJdCBjYW4gYnJlYWsgcGF0Y2hlcy5cclxuICAgICAgICAgICAgaWYgKHBlcnNvbi5pc1BsYXllcigpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5TdGF0cyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNoYW5nZXMuU3RhdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHIgPSBBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdChhdHRyLCBjaGFuZ2VzLlN0YXRzW25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLlNraWxscyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNoYW5nZXMuU2tpbGxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyID0gU2tpbGwuZ2V0U2tpbGwobmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTa2lsbChhdHRyLCBjaGFuZ2VzLlNraWxsc1tuYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2hhbmdlSGVhbHRoIChuIDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0cyA9IDxBcnJheTxCb2R5cGFydD4+IHRoaXMuZ2V0UGFydHMoQm9keXBhcnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keXBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJvZHlwYXJ0c1tpXS5jaGFuZ2VTb3JlbmVzcyhuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWFsdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaGVhbHRoIGFzIGEgbnVtYmVyIGZyb20gMCB0byAxMC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEhlYWx0aE9uU2NhbGUgKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKFxyXG4gICAgICAgICAgICAoKHRoaXMuZ2V0SGVhbHRoKCkgKiAxMCkgLyAodGhpcy5nZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgpICogMikpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgY3VycmVudCBoZWFsdGguXHJcbiAgICAgKiBJbXBvcnRhbnQgPSBmb3JjZSB1cGRhdGUsIG90aGVyd2lzZSB1c2Ugc3VmZmljaWVudGx5IGFjY3VyYXRlIGN1cnJlbnQgdmFsdWUuIHRvIHByZXZlbnQgbG9vcGluZyB0b28gbXVjaC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW1wb3J0YW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SGVhbHRoIChpbXBvcnRhbnQ/IDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChpbXBvcnRhbnQgPT09IHRydWUgfHwgdGhpcy5sYXN0SGVhbHRoVXBkYXRlICE9IFdvcmxkU3RhdGUuZ2V0Q3VycmVudFR1cm4oKSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhlYWx0aCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5zb3JlbmVzcyAvICh0aGlzLmdldFN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCkgKiBQZXJzb24uU1RSRU5HVEhfU09SRU5FU1NfTVVMVElQTElFUilcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhenkgdXBkYXRlcyBhbGxvdyB1cyB0byBjb3VudCBIZWFsdGgvU3RhbWluYSBmb3IgTlBDcyB3aXRob3V0IG92ZXJsb2FkaW5nIHRoZSBFdmVyeSBUdXJuIHJ1bGVib29rLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlSGVhbHRoICgpIHtcclxuICAgICAgICBsZXQgaGVhbHRoID0gMDtcclxuICAgICAgICBsZXQgYm9keXBhcnRzID0gdGhpcy5nZXRQYXJ0cyhCb2R5cGFydCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2R5cGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaGVhbHRoICs9IGJvZHlwYXJ0c1tpXS5nZXRXZWlnaHRlZFNvcmVuZXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc29yZW5lc3MgPSBoZWFsdGg7XHJcbiAgICAgICAgdGhpcy5sYXN0SGVhbHRoVXBkYXRlID0gV29ybGRTdGF0ZS5nZXRDdXJyZW50VHVybigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2VTdGFtaW5hIChuIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTdGFtaW5hKCk7XHJcbiAgICAgICAgdGhpcy5zdGFtaW5hICs9IG47XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhbWluYSA+IFBlcnNvbi5NQVhfU1RBTUlOQSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YW1pbmEgPSBQZXJzb24uTUFYX1NUQU1JTkE7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YW1pbmEgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhbWluYSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBzdGFtaW5hIGFzIGEgbnVtYmVyIGZyb20gMCB0byAxMC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0YW1pbmFPblNjYWxlICgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChcclxuICAgICAgICAgICAgKCh0aGlzLnN0YW1pbmEgKiAxMCkgLyBQZXJzb24uTUFYX1NUQU1JTkEpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU3RhbWluYSAoKSB7XHJcbiAgICAgICAgdmFyIG5UdXJucyA9IFdvcmxkU3RhdGUuZ2V0Q3VycmVudFR1cm4oKSAtIHRoaXMubGFzdFN0YW1pbmFVcGRhdGU7XHJcbiAgICAgICAgdGhpcy5zdGFtaW5hICs9IHRoaXMuc3RhbWluYVBlclR1cm4gKiBuVHVybnM7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhbWluYSA+IFBlcnNvbi5NQVhfU1RBTUlOQSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YW1pbmEgPSBQZXJzb24uTUFYX1NUQU1JTkE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1BsYXllciAoKSB7XHJcbiAgICAgICAgcmV0dXJuICg8YW55PiB0aGlzKSA9PSBXb3JsZFN0YXRlLnBsYXllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXR0cmlidXRlVmFsdWUgOiB7W2lkIDogc3RyaW5nXSA6IG51bWJlcn0gPSB7fTtcclxuICAgIHByb3RlY3RlZCBza2lsbFZhbHVlIDoge1tpZCA6IHN0cmluZ10gOiBudW1iZXJ9ID0ge307XHJcblxyXG4gICAgcHVibGljIGdldFN0YXQgKHN0YXQgOiBBdHRyaWJ1dGUpIHtcclxuICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZVtzdGF0LmlkXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVtzdGF0LmlkXSA9IHN0YXQuZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVtzdGF0LmlkXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0U3RhdCAoc3RhdCA6IEF0dHJpYnV0ZSwgdmFsdWUgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlW3N0YXQuaWRdID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNraWxsIChzdGF0IDogU2tpbGwpIHtcclxuICAgICAgICBpZiAodGhpcy5za2lsbFZhbHVlW3N0YXQuaWRdID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNraWxsVmFsdWVbc3RhdC5pZF0gPSBzdGF0LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxWYWx1ZVtzdGF0LmlkXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0U2tpbGwgKHN0YXQgOiBTa2lsbCwgdmFsdWUgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnNraWxsVmFsdWVbc3RhdC5pZF0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGllICgpIHtcclxuICAgICAgICBsZXQgY29ycHNlID0gbmV3IENvcnBzZSh7XHJcbiAgICAgICAgICAgIG5hbWUgOiB0aGlzLm5hbWUgKyBcIidzIGNvcnBzZVwiLFxyXG4gICAgICAgICAgICB1bmlxdWUgOiBmYWxzZSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24gOiBuZXcgU2F5KFwiVGhlIGxpZmVsZXNzIGJvZHkgb2YgXCIsIHRoaXMsIFwiLiBNYXkgXCIsIG5ldyBTYXlIZVNoZUl0KHRoaXMpLCBcIiByZXN0IGluIHBlYWNlLlwiKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb3Jwc2UucHV0KC4uLlRoaW5nLkNhcnJ5UmVsYXRpb24uZ2V0UmlnaHQodGhpcykpO1xyXG4gICAgICAgIGNvcnBzZS5wdXQoLi4uVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRSb29tKCkucGxhY2UoY29ycHNlKTtcclxuICAgICAgICBPdXRPZlBsYXkucmVtb3ZlRnJvbVBsYXkodGhpcyk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9DbGFzc2VzL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vQ2xhc3Nlcy9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvVGhpbmdzL1BlcnNvbi50c1wiIC8+XHJcbm1vZHVsZSBFdmVyeVR1cm4ge1xyXG4gICAgZXhwb3J0IHZhciBFdmVyeVR1cm4gPSBuZXcgUnVsZWJvb2soXCJFdmVyeSBUdXJuXCIpO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgUnVuQUlSdWxlID0gRXZlcnlUdXJuLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlJ1biBOUEMgQUkgUnVsZVwiLFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQUlBdmFpbGFibGUgKHBlcnNvbiA6IFBlcnNvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChwZXJzb24gIT0gV29ybGRTdGF0ZS5wbGF5ZXJcclxuICAgICAgICAgICAgICAgICAgICAmJiAoKHBlcnNvbi5nZXRSb29tKCkgaW5zdGFuY2VvZiBSb29tUmFuZG9tXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmICg8Um9vbVJhbmRvbT4gcGVyc29uLmdldFJvb20oKSkucGxhY2VkKSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgbGV0IHBlb3BsZSA9IDxBcnJheTxQZXJzb24+PiBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uZ2V0QW55UmlnaHRUeXBlKFBlcnNvbikuZmlsdGVyKGlzQUlBdmFpbGFibGUpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlb3BsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGF3YWl0IHBlb3BsZVtpXS5BSS5leGVjdXRlKHBlb3BsZVtpXSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyc29uID0gcGVvcGxlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHZpc2libGUgPSBwZW9wbGVbaV0uaXNWaXNpYmxlVG8oV29ybGRTdGF0ZS5wbGF5ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW50VmFsdWU6IFNheSA9IGF3YWl0IGFjdGlvbi5leGVjdXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uLmlzVmlzaWJsZVRvKFdvcmxkU3RhdGUucGxheWVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApICYmIHByaW50VmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChwcmludFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgdmFyIGluY3JlbWVudFR1cm5Db3VudGVyUnVsZSA9IEV2ZXJ5VHVybi5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBmaXJzdFByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBwcmlvcml0eTogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgbmFtZTogXCJJbmNyZW1lbnQgVHVybiBDb3VudGVyXCIsXHJcbiAgICAgICAgY29kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBXb3JsZFN0YXRlLmluY3JlbWVudFdvcmxkVHVybigpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwiLyoqXHJcbiAqIEN1cnJlbnQgcGxhbnM6XHJcbiAqIE1ha2UgY2hlY2tzIGhpZ2hlciBsZXZlbC4gSXQgc2hvdWxkIGJlIHNpbXBsZSB0byB3cml0ZSwgZXZlbiBpZiB0aGUgdW5kZXJseWluZyBjb2RlIGJlY29tZXMgbW9yZSBjb21wbGV4IGluIHRoZSBwcm9jZXNzLlxyXG4gKiBDaGVja3Mgc2hvdWxkIGJlIHNtYXJ0IGVub3VnaCB0byB1bmRlcnN0YW5kIHdoYXQga2luZCBvZiBzcGVjaWZpY2l0eSBpcyBiZWluZyB1c2VkIGluIHRoZSB0ZXN0LlxyXG4gKiBDaGVja3Mgc2hvdWxkIGFsc28gYmUgY2FwYWJsZSBvZiBzYXlpbmcgXCJ0aGlzIGZpdHMgdGhlIHNpdHVhdGlvbiBwZXJmZWN0bHlcIi5cclxuICogU2V4IHNjZW5lcyBzaG91bGQgY2hhbmdlIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGluIGNoZWNrcy5cclxuICpcclxuICogQ3VycmVudCBob3cgdG86XHJcbiAqIENsYXNzOiBGdWNraW5nU2l0dWF0aW9uLCB3aGljaCBzaG91bGQgaW5jbHVkZSBhbGwgdGhlIHZhcmlhYmxlcyB0byB0aGUgY3VycmVudCBmdWNraW5nIHNjZW5lLlxyXG4gKiBDbGFzczogRnVja2luZ0NoZWNrLCB3aGljaCBzaG91bGQgaW5jbHVkZSBhIHBvcnRpb24gb2YgdmFyaWFibGVzIHRoYXQgYXJlIHRoZW4gY29tcGFyZWQgdG8gdGhlIEZ1Y2tpbmdTaXR1YXRpb24uXHJcbiAqIE1vZHVsZTogRnVja2luZywgd2hpY2ggY29udHJvbHMgd2hhdCBUaGluZ3MgYXJlIGZ1Y2tpbmcgd2hpY2ggVGhpbmdzIGFuZCBhcHBsaWVzIHRoZSBhYm92ZSB0d28uIFNob3VsZCBwcm92aWRlIGdlbmVyYXRvcnMgZm9yIEZ1Y2tpbmdDaGVjay5cclxuICovXHJcblxyXG5tb2R1bGUgRnVja2luZyB7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkudHNcIiAvPlxyXG5lbnVtIERpcmVjdGlvbiB7XHJcbiAgICBOT1JUSCwgTk9SVEhFQVNULCBFQVNULFxyXG4gICAgU09VVEhFQVNULCBTT1VUSCwgU09VVEhXRVNULFxyXG4gICAgV0VTVCwgTk9SVEhXRVNULCBVUCwgRE9XTlxyXG59XHJcblxyXG5cclxuXHJcbnZhciBEaXJlY3Rpb25OYW1lcyA6IHtbaWQ6IHN0cmluZ10gOiBzdHJpbmd9ID0gKCgpID0+IHtcclxuICAgIGVudW0gbmFtZXMge1xyXG4gICAgICAgIE5PUlRIID0gXCJOb3J0aFwiLFxyXG4gICAgICAgIFNPVVRIID0gXCJTb3V0aFwiLFxyXG4gICAgICAgIEVBU1QgPSBcIkVhc3RcIixcclxuICAgICAgICBXRVNUID0gXCJXZXN0XCIsXHJcbiAgICAgICAgU09VVEhFQVNUID0gXCJTb3V0aGVhc3RcIixcclxuICAgICAgICBOT1JUSFdFU1QgPSBcIk5vcnRod2VzdFwiLFxyXG4gICAgICAgIFNPVVRIV0VTVCA9IFwiU291dGh3ZXN0XCIsXHJcbiAgICAgICAgTk9SVEhFQVNUID0gXCJOb3J0aGVhc3RcIixcclxuICAgICAgICBVUCA9IFwiRG93blwiLFxyXG4gICAgICAgIERPV04gPSBcIlVwXCJcclxuICAgIH07XHJcbiAgICBsZXQgb2JqIDoge1tpZDogc3RyaW5nXSA6IHN0cmluZ30gPSB7fTtcclxuICAgIGZvciAobGV0IG5hbWUgaW4gbmFtZXMpIHtcclxuICAgICAgICBvYmpbbmFtZV0gPSBuYW1lc1tuYW1lXTtcclxuICAgICAgICBvYmpbRGlyZWN0aW9uW25hbWVdXSA9IG5hbWVzW25hbWVdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxufSkoKTtcclxuXHJcbnZhciBPcHBvc2l0ZURpcmVjdGlvbiA6IHtbaWQgOiBudW1iZXJdIDogRGlyZWN0aW9ufSA9ICgoKSA9PiB7XHJcbiAgICBsZXQgb2JqID0ge307XHJcbiAgICBvYmpbRGlyZWN0aW9uLk5PUlRIXSA9IERpcmVjdGlvbi5TT1VUSDtcclxuICAgIG9ialtEaXJlY3Rpb24uU09VVEhdID0gRGlyZWN0aW9uLk5PUlRIO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5FQVNUXSA9IERpcmVjdGlvbi5XRVNUO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5XRVNUXSA9IERpcmVjdGlvbi5FQVNUO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5TT1VUSEVBU1RdID0gRGlyZWN0aW9uLk5PUlRIV0VTVDtcclxuICAgIG9ialtEaXJlY3Rpb24uTk9SVEhXRVNUXSA9IERpcmVjdGlvbi5TT1VUSEVBU1Q7XHJcbiAgICBvYmpbRGlyZWN0aW9uLlNPVVRIV0VTVF0gPSBEaXJlY3Rpb24uTk9SVEhFQVNUO1xyXG4gICAgb2JqW0RpcmVjdGlvbi5OT1JUSEVBU1RdID0gRGlyZWN0aW9uLlNPVVRIV0VTVDtcclxuICAgIG9ialtEaXJlY3Rpb24uVVBdID0gRGlyZWN0aW9uLkRPV047XHJcbiAgICBvYmpbRGlyZWN0aW9uLkRPV05dID0gRGlyZWN0aW9uLlVQO1xyXG5cclxuICAgIC8vIE1ha2UgaXQgd29yayB3aXRoIHRoZSBuYW1lIHRvb1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBPYmplY3Qua2V5cyhEaXJlY3Rpb24pLmxlbmd0aCAvIDI7IGkrKykge1xyXG4gICAgICAgIG9ialtEaXJlY3Rpb25baV1dID0gb2JqW2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxufSkoKTtcclxuXHJcbmNsYXNzIFJvb20gaW1wbGVtZW50cyBQcmludGFibGUge1xyXG4gICAgcHJpdmF0ZSBuYW1lIDogc3RyaW5nO1xyXG4gICAgcHVibGljIGNvbm5lY3Rpb25zIDogQXJyYXk8Um9vbT47XHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24gOiBTYXkgPSBuZXcgU2F5KCk7XHJcbiAgICBwdWJsaWMgZm9kZGVyIDogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkPyA6IHN0cmluZywgZm9kZGVyPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBpZCA9PSB1bmRlZmluZWQgPyBcIlJvb21cIiA6IGlkO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQXJyYXkoUm9vbS5ESVJFQ1RJT05TLmxlbmd0aCk7IC8vIEFycmF5IHRoZSBzYW1lIHNpemUgYXMgZGlyZWN0aW9ucywgYnV0IGZpbGxlZCB3aXRoIHVuZGVmaW5lZFxyXG5cclxuICAgICAgICB0aGlzLmZvZGRlciA9IGZvZGRlcjtcclxuICAgICAgICBpZiAoZm9kZGVyICE9IHRydWUpIHtcclxuICAgICAgICAgICAgUm9vbS5hZGRSb29tKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmFtZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGxhY2UgKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uc2V0UmVsYXRpb24odGhpcywgdGhpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmUgKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICAvLyBEb24ndCByZW1vdmUgc3R1ZmYgZnJvbSBvdGhlciByb29tc1xyXG4gICAgICAgIGlmIChUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gdGhpcykge1xyXG4gICAgICAgICAgICBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24udW5zZXRSaWdodCh0aGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250YWluZWQgKCkgOiBBcnJheTxUaGluZz4ge1xyXG4gICAgICAgIHJldHVybiA8QXJyYXk8VGhpbmc+PiBUaGluZy5JbnNpZGVSb29tUmVsYXRpb24uZ2V0UmlnaHQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRhaW5lZEFuZFZpc2libGVUbyAob2JzZXJ2ZXIgOiBUaGluZykgOiBBcnJheTxUaGluZz4ge1xyXG4gICAgICAgIGxldCBjb250YWluZWQgPSB0aGlzLmdldENvbnRhaW5lZCgpO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuXHJcbiAgICAgICAgY29udGFpbmVkLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS52aXNpYmxlICYmIHZhbHVlICE9PSBvYnNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBESVJFQ1RJT05TIDogQXJyYXk8RGlyZWN0aW9uPiA9ICgoKSA9PiB7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbnMgOiBBcnJheTxEaXJlY3Rpb24+ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBPYmplY3Qua2V5cyhEaXJlY3Rpb24pLmxlbmd0aCAvIDI7IGkrKykge1xyXG4gICAgICAgICAgICBkaXJlY3Rpb25zLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkaXJlY3Rpb25zO1xyXG4gICAgfSkoKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGFpbmVkQW5kVmlzaWJsZSAoKSA6IEFycmF5PFRoaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVkQW5kVmlzaWJsZVRvKFdvcmxkU3RhdGUucGxheWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWFwUm9vbSAociA6IFJvb20sIGRpcmVjdGlvbiA6IERpcmVjdGlvbikge1xyXG4gICAgICAgIGxldCBvcHBvc2l0ZURpcmVjdGlvbiA9IE9wcG9zaXRlRGlyZWN0aW9uW2RpcmVjdGlvbl07XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUmVwbGFjaW5nIGEgY29ubmVjdGVkIHJvb20uXCIsIHRoaXMsIFwiIGNvbm5lY3RlZCB0aHJvdWdoIFwiLCBkaXJlY3Rpb24sIFwiIHRvIFwiLCB0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0pO1xyXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0udW5tYXBSb29tKG9wcG9zaXRlRGlyZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dID0gcjtcclxuXHJcbiAgICAgICAgaWYgKHIuY29ubmVjdGlvbnNbb3Bwb3NpdGVEaXJlY3Rpb25dICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJSZXBsYWNpbmcgYSBjb25uZWN0ZWQgcm9vbS5cIiwgciwgXCIgY29ubmVjdGVkIHRocm91Z2ggXCIsIG9wcG9zaXRlRGlyZWN0aW9uLCBcIiB0byBcIiwgci5jb25uZWN0aW9uc1tvcHBvc2l0ZURpcmVjdGlvbl0pO1xyXG4gICAgICAgICAgICByLnVubWFwUm9vbShvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHIuY29ubmVjdGlvbnNbb3Bwb3NpdGVEaXJlY3Rpb25dID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5tYXBSb29tIChkaXJlY3Rpb24gOiBEaXJlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgciA9IHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXTtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICByLnVubWFwUm9vbShPcHBvc2l0ZURpcmVjdGlvbltkaXJlY3Rpb25dKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByaW50ZWROYW1lICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb25uZWN0ZWRSb29tcyAoKSA6IEFycmF5PFJvb20+IHtcclxuICAgICAgICBsZXQgcm9vbXMgPSBbXTtcclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25zLmZvckVhY2gocm9vbSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyb29tICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcm9vbXMucHVzaChyb29tKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByb29tcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgcmV0dXJucyB0aGUgYmVzdCBkaXJlY3Rpb24gdG8gZm9sbG93IGlmIGdvaW5nIGZyb20gdGhlIGN1cnJlbnQgcm9vbSB0byBhbm90aGVyIHJvb20uXHJcbiAgICAgKiBUSElTIENPREUgSVMgUkVBTExZIEVYUEVOU0lWRSBBTkQgU0hPVUxEIE9OTFkgQkUgVVNFRCBBUyBBIExBU1QgUkVTT1JUXHJcbiAgICAgKiBXQVJOSU5HOiBUSElTIENPREUgV0lMTCBGQUlMIElGIFRIRSBUQVJHRVQgUk9PTSBJUyBUT08gRkFSIEZST00gVEhFIENVUlJFTlQgUk9PTSAoRk9SIFNFQ1VSSVRZIFJFQVNPTlMpLlxyXG4gICAgICogVGhpcyBjb2RlIHJ1bnMgdGhyb3VnaCBldmVyeS4gc2luZ2xlLiByb29tLiB0byBmaW5kIHRoZSBiZXN0IHJvdXRlIHRvIHRha2UuXHJcbiAgICAgKiBJZiB5b3UgbmVlZCBhbiBOUEMgdG8gc3RpY2sgdG8gYSByZWdpb24sIGRvbid0IGxldCBpdCBnbyBvdXQgb2YgaXQgaW4gdGhlIGZpcnN0IHBsYWNlIVxyXG4gICAgICogQHBhcmFtIHJvb21cclxuICAgICAqIEBwYXJhbSB2YWxpZGl0eUNvZGVcclxuICAgICAqIEByZXR1cm5zIHthbnl9XHJcbiAgICAgKi9cclxuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBzaGl0IGZhc3RcclxuICAgIHB1YmxpYyBiZXN0RGlyZWN0aW9uVG8gKHJvb20gOiBSb29tLCB2YWxpZGl0eUNvZGU/IDogKHJvb20gOiBSb29tKSA9PiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbGlkaXR5Q29kZSA9PSB1bmRlZmluZWQpIHZhbGlkaXR5Q29kZSA9ICgpID0+IHtyZXR1cm4gdHJ1ZX07XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1heGltdW0gYW1vdW50IG9mIHN0ZXBzIHRoYXQgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBhIHJvdXRlLlxyXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZnVsIHRvIHByZXZlbnQgdGhlIGNvZGUgZnJvbSBzcGFubmluZyB0b28gbWFueSByb29tcywgYXMgZWFjaCByb29tIGNhbiBoYXZlIFJvb20uRElSRUNUSU9OUy5sZW5ndGggZGlyZWN0aW9ucyB0byBtYWtlIGFub3RoZXIgY2FsbCwgZXRjLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAgICAgKi9cclxuICAgICAgICBsZXQgbWF4U3RlcHMgPSAxMDtcclxuICAgICAgICBtYXhTdGVwcyA9IG1heFN0ZXBzID4gV29ybGRTdGF0ZS5nZXRNYXhpbXVtUmVtZW1iZXJlZFJvb21zKCkgPyBtYXhTdGVwcyA6IFdvcmxkU3RhdGUuZ2V0TWF4aW11bVJlbWVtYmVyZWRSb29tcygpO1xyXG5cclxuICAgICAgICBsZXQgcmVjdXJzaXZlQmVzdFBhdGggPSAoY1BhdGggOiBBcnJheTxSb29tPiwgY1Jvb20gOiBSb29tLCBkZXN0aW5hdGlvbiA6IFJvb20pID0+IHtcclxuICAgICAgICAgICAgLy8gSWdub3JlIFwiYmFkXCIgcm9vbXNcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGl0eUNvZGUoY1Jvb20pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgY29kZSBmcm9tIHN0cmF5aW5nIHRvbyBmYXJcclxuICAgICAgICAgICAgaWYgKGNSb29tID09IGRlc3RpbmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBtYXhTdGVwcyA9IG1heFN0ZXBzID4gY1BhdGgubGVuZ3RoID8gY1BhdGgubGVuZ3RoIDogbWF4U3RlcHM7IC8vIFN0b3AgY29uc2lkZXJpbmcgd29yc2Ugcm91dGVzXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY1BhdGg7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY1BhdGgubGVuZ3RoID4gbWF4U3RlcHMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGF0aHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4IGluIFJvb20uRElSRUNUSU9OUykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBSb29tLkRJUkVDVElPTlNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Um9vbSA9IGNSb29tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRSb29tICE9IHVuZGVmaW5lZCAmJiBjUGF0aC5pbmRleE9mKG5leHRSb29tKSA9PSAtMSAmJiB2YWxpZGl0eUNvZGUobmV4dFJvb20pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcmVjdXJzaXZlQmVzdFBhdGgoY1BhdGguY29uY2F0KFtuZXh0Um9vbV0pLCBuZXh0Um9vbSwgZGVzdGluYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvcnRlc3RJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICBwYXRocy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHBhdGhzW3Nob3J0ZXN0SW5kZXhdLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aHNbc2hvcnRlc3RJbmRleF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcGF0aHMgPSBBcnJheShSb29tLkRJUkVDVElPTlMubGVuZ3RoKTtcclxuICAgICAgICBsZXQgc2hvcnRlc3RJbmRleDtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCBpbiBSb29tLkRJUkVDVElPTlMpIHtcclxuICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IFJvb20uRElSRUNUSU9OU1tpbmRleF07XHJcbiAgICAgICAgICAgIGxldCBuZXh0Um9vbSA9IHRoaXMuY29ubmVjdGlvbnNbZGlyZWN0aW9uXTtcclxuICAgICAgICAgICAgaWYgKG5leHRSb29tICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcGF0aHNbZGlyZWN0aW9uXSA9IHJlY3Vyc2l2ZUJlc3RQYXRoKFt0aGlzLCBuZXh0Um9vbV0sIG5leHRSb29tLCByb29tKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXRoc1tkaXJlY3Rpb25dICE9IHVuZGVmaW5lZCAmJiAoc2hvcnRlc3RJbmRleCA9PSB1bmRlZmluZWQgfHwgcGF0aHNbc2hvcnRlc3RJbmRleF0ubGVuZ3RoID4gcGF0aHNbZGlyZWN0aW9uXS5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvcnRlc3RJbmRleCA9IGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2hvcnRlc3RJbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldERpcmVjdGlvblhZWiAoZGlyZWN0aW9uIDogRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgdmFyIHkgPSAwO1xyXG4gICAgICAgIGlmIChbRGlyZWN0aW9uLk5PUlRILCBEaXJlY3Rpb24uTk9SVEhFQVNULCBEaXJlY3Rpb24uTk9SVEhXRVNUXS5pbmRleE9mKGRpcmVjdGlvbikgIT0gLTEpIHtcclxuICAgICAgICAgICAgeSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChbRGlyZWN0aW9uLlNPVVRILCBEaXJlY3Rpb24uU09VVEhFQVNULCBEaXJlY3Rpb24uU09VVEhXRVNUXS5pbmRleE9mKGRpcmVjdGlvbikgIT0gLTEpIHtcclxuICAgICAgICAgICAgeSA9IC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHggPSAwO1xyXG4gICAgICAgIGlmIChbRGlyZWN0aW9uLkVBU1QsIERpcmVjdGlvbi5TT1VUSEVBU1QsIERpcmVjdGlvbi5OT1JUSEVBU1RdLmluZGV4T2YoZGlyZWN0aW9uKSAhPSAtMSkge1xyXG4gICAgICAgICAgICB4ID0gMTtcclxuICAgICAgICB9IGVsc2UgaWYgKFtEaXJlY3Rpb24uV0VTVCwgRGlyZWN0aW9uLlNPVVRIV0VTVCwgRGlyZWN0aW9uLk5PUlRIV0VTVF0uaW5kZXhPZihkaXJlY3Rpb24pICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHggPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB6ID0gZGlyZWN0aW9uID09IERpcmVjdGlvbi5VUCA/IDEgOlxyXG4gICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uRE9XTiA/IC0xIDpcclxuICAgICAgICAgICAgICAgICAwO1xyXG5cclxuICAgICAgICByZXR1cm4gW3gsIHksIHpdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0YXRpYyBzaGlmdCAoY29vcmRpbmF0ZXMgOiBBcnJheTxudW1iZXI+LCBkaXJlY3Rpb24gOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXNWZWN0b3IgPSBSb29tLmdldERpcmVjdGlvblhZWihkaXJlY3Rpb24pO1xyXG4gICAgICAgIGNvb3JkaW5hdGVzLmZvckVhY2goKHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcclxuICAgICAgICAgICAgY29vcmRpbmF0ZXNWZWN0b3JbaW5kZXhdICs9IGNvb3JkaW5hdGVzW2luZGV4XTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gY29vcmRpbmF0ZXNWZWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0YXRpYyByb29tcyA6IHtbaWQgOiBzdHJpbmddIDogUm9vbX0gPSB7fTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIGFkZFJvb20gKHJvb20gOiBSb29tKSB7XHJcbiAgICAgICAgUm9vbS5yb29tc1tyb29tLm5hbWVdID0gcm9vbTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFJvb21zICgpIDogQXJyYXk8Um9vbT4ge1xyXG4gICAgICAgIGxldCByb29tcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gUm9vbS5yb29tcykge1xyXG4gICAgICAgICAgICByb29tcy5wdXNoKFJvb20ucm9vbXNbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcm9vbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb29tIChpZCA6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBSb29tLnJvb21zW2lkXTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJDbGFzc2VzL1Jvb20udHNcIiAvPlxyXG5tb2R1bGUgT3V0T2ZQbGF5IHtcclxuICAgIC8qKiBUaGUgcmVhc29uIHdlIGhhdmUgdGhpcyBpcyBzbyB0aGF0IE5QQ3MgYWN0dWFsbHkgU0FWRSB3aGVuIHRoZXkncmUgZGVhZC4gVGhpbmdzIHRoYXQgYXJlIHNpbXBseSBvdXRzaWRlIG9mIHJvb21zIGRvIG5vdCBoYXZlIHRoZWlyIHBvc2l0aW9uIHN0b3JlZCwgc2luY2UgdGhleSBoYXZlIG5vIHBvc2l0aW9uLiAqKi9cclxuICAgIGV4cG9ydCBsZXQgSGVhdmVuID0gbmV3IFJvb20oXCJfX0hlYXZlbl9fUklQX19cIik7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21QbGF5ICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgSGVhdmVuLnBsYWNlKHRoaW5nKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL0NsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9DbGFzc2VzL1J1bGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiTWFjaGluZUJlZ2lucy50c1wiIC8+XHJcbm1vZHVsZSBQbGF5QmVnaW5zIHtcclxuICAgIGV4cG9ydCB2YXIgcnVsZWJvb2sgPSBuZXcgUnVsZWJvb2s8dm9pZD4oXCJQbGF5IEJlZ2luc1wiKTtcclxuICAgIGV4cG9ydCB2YXIgTE9BRF9GQUlMRUQgPSBmYWxzZTtcclxuICAgIGxldCBzdGFydGluZ1Jvb207XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUgKCkge1xyXG4gICAgICAgIHJ1bGVib29rLmV4ZWN1dGUoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRTdGFydGluZ1Jvb20gKHJvb20gOiBSb29tKSB7XHJcbiAgICAgICAgaWYgKHN0YXJ0aW5nUm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiW0luaXRpYWxSb29tXSBNdWx0aXBsZSByZXF1ZXN0cyBmb3Igc3RhcnRpbmcgcm9vbSwgcGxlYXNlIGNoZWNrLlwiLCBzdGFydGluZ1Jvb20sIHJvb20pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFydGluZ1Jvb20gPSByb29tO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgUHV0UGxheWVySW50b0ZpcnN0Um9vbSA9IHJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlBsYWNlIHBsYXllciBpbnRvIGluaXRpYWwgcm9vbVwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTSxcclxuICAgICAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbSW5pdGlhbFJvb21dIFBsYXllciBhbHJlYWR5IGluIGEgcm9vbS5cIiwgV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0aW5nUm9vbS5wbGFjZShXb3JsZFN0YXRlLnBsYXllcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFJ1bkVtcHR5VHVyblNlcXVlbmNlUnVsZSA9IG5ldyBSdWxlICh7XHJcbiAgICAgICAgbmFtZSA6IFwiUnVuIEVtcHR5IFR1cm4gU2VxdWVuY2UgUnVsZVwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2syIDogUnVsZWJvb2tSdW5uZXI8dm9pZD4pID0+IHtcclxuICAgICAgICAgICAgVHVyblNlcXVlbmNlLmV4ZWN1dGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJ1bGVib29rLmFkZFJ1bGUoUnVuRW1wdHlUdXJuU2VxdWVuY2VSdWxlKTtcclxufVxyXG5cclxubW9kdWxlIE1hY2hpbmVCZWdpbnMge1xyXG4gICAgZXhwb3J0IGxldCBSdW5QbGF5QmVnaW5zID0gTWFjaGluZUJlZ2lucy5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1csXHJcbiAgICAgICAgbmFtZSA6IFwiUnVuIFBsYXkgQmVnaW5zXCIsXHJcbiAgICAgICAgY29kZSA6ICgpID0+IHtcclxuICAgICAgICAgICAgUGxheUJlZ2lucy5leGVjdXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCJtb2R1bGUgVGVzdHMge1xyXG4gICAgZXhwb3J0IHZhciBNSU5fRElDRSA9IDA7IC8vIERpY2VzIGNhbiBiZSA8IDBcclxuICAgIGV4cG9ydCB2YXIgTUFYX0RJQ0UgPSAzOyAvLyBEaWNlcyBjYW4gZ28gcmVhbCBoaWdoXHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJvbGxEaWNlICgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKE1BWF9ESUNFIC0gTUlOX0RJQ0UpKSArIDEgKyBNSU5fRElDRTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdGVzdCAoYXR0ciA6IG51bWJlciwgZGlmZmljdWx0eSA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiAoYXR0ciArIHJvbGxEaWNlKCkpID49IGRpZmZpY3VsdHk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUm9vbS50c1wiIC8+XHJcbi8qKlxyXG4gKiBNYXBzIGNhbiBob2xkIGluZm9ybWF0aW9uIG9mIGNlcnRhaW4gcm9vbXMgb3IgYSByZWdpb24uXHJcbiAqIElmIGEgcGxheWVyIGhhcyBhIG1hcCwgYWxsIHRoZSByb29tcyBpbiB0aGUgbWFwIGFyZSBhbHdheXMgcmVtZW1iZXJlZC5cclxuICovXHJcbmNsYXNzIE1hcE5vdGUgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgcm9vbXMgOiBBcnJheTxSb29tPiA9IFtdO1xyXG4gICAgcHVibGljIHJlZ2lvbnMgOiBBcnJheTxSZWdpb24+ID0gW107XHJcblxyXG4gICAgcHVibGljIGFkZFJvb20gKC4uLnJvb21zIDogQXJyYXk8Um9vbT4pIHtcclxuICAgICAgICByb29tcy5mb3JFYWNoKChyb29tKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vbXMucHVzaChyb29tKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUmVnaW9uICguLi5yZWdpb25zIDogQXJyYXk8UmVnaW9uPikge1xyXG4gICAgICAgIHJlZ2lvbnMuZm9yRWFjaChyZWdpb24gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlZ2lvbnMucHVzaChyZWdpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWlucyAocm9vbSA6IFJvb20pIHtcclxuICAgICAgICBpZih0aGlzLnJvb21zLmluZGV4T2Yocm9vbSkgIT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlZ2lvbnNbaV0uZ2V0Um9vbXMoKS5pbmRleE9mKHJvb20pICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG5pbnRlcmZhY2UgQm9keXBhcnRWYWx1ZVJlc3VsdCB7XHJcbiAgICB2YWx1ZSA6IG51bWJlcjtcclxuICAgIHdlaWdodCA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgQm9keXBhcnQgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdFSUdIVF9MT1dFU1QgPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBXRUlHSFRfTE9XID0gMztcclxuICAgIHB1YmxpYyBzdGF0aWMgV0VJR0hUX01FRElVTSA9IDU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFdFSUdIVF9ISUdIID0gNztcclxuICAgIHB1YmxpYyBzdGF0aWMgV0VJR0hUX0hJR0hFU1QgPSA5O1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgU0xVVFRJTkVTU19MT1dFU1RfU0FJTlRMWSA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMVVRUSU5FU1NfTE9XX1BSVURFID0gMjU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMVVRUSU5FU1NfTUVESVVNX0FWRVJBR0UgPSA1MDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xVVFRJTkVTU19ISUdIX1NMVVQgPSA3NTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xVVFRJTkVTU19ISUdIRVNUX1dIT1JFID0gMTAwO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR0VOREVSX0xPV0VTVF9NQU5MSUVTVCA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdFTkRFUl9MT1dfTUFOTFkgPSAyNTtcclxuICAgIHB1YmxpYyBzdGF0aWMgR0VOREVSX01FRElVTV9BTkRST0dZTkUgPSA1MDtcclxuICAgIHB1YmxpYyBzdGF0aWMgR0VOREVSX0hJR0hfRkVNSU5JTkUgPSA3NTtcclxuICAgIHB1YmxpYyBzdGF0aWMgR0VOREVSX0hJR0hFU1RfRkVNSU5JTkVTVCA9IDEwMDtcclxuXHJcbiAgICAvLyBUaGUgaGlnaGVyIHRoaXMgbnVtYmVyLCB0aGUgbW9yZSB0aGUgYm9keXBhcnQgd2lsbCBiZSB3b3J0aCBmb3IgaGVhbHRoLlxyXG4gICAgLy8gRm9yIGluc3RhbmNlLCBIRUFEIHNob3VsZCBiZSB3b3J0aCBtb3JlIHRoYW4gRklOR0VSTkFJTC5cclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA6IG51bWJlciA9IDE7XHJcblxyXG4gICAgLy8gMCB0byAxMFxyXG4gICAgLy8gc2F5cyBob3cgZnVja2VkIHVwIHRoZSBib2R5cGFydCBpc1xyXG4gICAgcHVibGljIHNvcmVuZXNzIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBIb3cgbXVjaCBzb3JlbmVzcyBpcyBoZWFsZWQgZXZlcnkgdHVyblxyXG4gICAgcHVibGljIHNvcmVuZXNzUGVyVHVybiA6IG51bWJlciA9IDAuMDU7XHJcblxyXG4gICAgLy8gTGFzdCB0dXJuIHNvcmVuZXNzIGdvdCB1cGRhdGVkXHJcbiAgICBwdWJsaWMgbGFzdFNvcmVuZXNzVXBkYXRlIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKG9wdGlvbnM/IDogVGhpbmdPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5hZGRHZXRBbHRlcmF0aW9ucygoYnAgOiBCb2R5cGFydCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgU29yZW5lc3MgOiBicC5zb3JlbmVzcyxcclxuICAgICAgICAgICAgICAgIEdlbmRlclZhbHVlIDogYnAuZ2VuZGVyVmFsdWUsXHJcbiAgICAgICAgICAgICAgICBTbHV0dGluZXNzIDogYnAuZ2V0U2x1dHRpbmVzcygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygoYnAgOiBCb2R5cGFydCwgY2hhbmdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNvcmVuZXNzID0gY2hhbmdlcy5Tb3JlbmVzcztcclxuICAgICAgICAgICAgdGhpcy5nZW5kZXJWYWx1ZSA9IGNoYW5nZXMuR2VuZGVyVmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2x1dHRpbmVzcyA9IGNoYW5nZXMuU2x1dHRpbmVzcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU29yZW5lc3MgKCkge1xyXG4gICAgICAgIGxldCBjVHVybiA9IFdvcmxkU3RhdGUuZ2V0Q3VycmVudFR1cm4oKTtcclxuICAgICAgICBpZiAoY1R1cm4gPiB0aGlzLmxhc3RTb3JlbmVzc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zb3JlbmVzcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc29yZW5lc3MgLT0gKHRoaXMuc29yZW5lc3NQZXJUdXJuICogKGNUdXJuIC0gdGhpcy5sYXN0U29yZW5lc3NVcGRhdGUpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3JlbmVzcyA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcmVuZXNzID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxhc3RTb3JlbmVzc1VwZGF0ZSA9IGNUdXJuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2hhbmdlU29yZW5lc3MgKHNvcmVuZXNzIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTb3JlbmVzcygpO1xyXG4gICAgICAgIHRoaXMuc29yZW5lc3MgKz0gc29yZW5lc3M7XHJcbiAgICAgICAgaWYgKHRoaXMuc29yZW5lc3MgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29yZW5lc3MgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U29yZW5lc3MgKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU29yZW5lc3MoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zb3JlbmVzcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldFdlaWdodGVkU29yZW5lc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U29yZW5lc3MoKSAqIHRoaXMuc29yZW5lc3NXZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNvcmVuZXNzV2VpZ2h0ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zb3JlbmVzc1dlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGVzZSBhcmUgdGhlIHNsb3RzIHRoZSBib2R5cGFydCBpcyB2aXNpYmxlIG9uXHJcbiAgICAvLyBTaG91bGQgdXNlIEh1bWFub2lkLlNMT1RfKiAhXHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICBwdWJsaWMgdmlzaWJsZVNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIC8vIEdlbmRlclZhbHVlIGlzIGhvdyBtYXNjdWxpbmUvZmVtaW5pbmUgdGhpcyBib2R5cGFydCBpcy5cclxuICAgIC8vIEF0IDAgPSB0aGUgbW9zdCBtYXNjdWxpbmUgcG9zc2libGUsIGF0IDEwMCA9IHRoZSBtb3N0IGZlbWluaW5lIGV2ZXRlclxyXG4gICAgLy8gNTAgd291bGQgYmUgY29tcGxldGVseSBhbmRyb2d5bm91c1xyXG4gICAgcHVibGljIGdlbmRlclZhbHVlIDogbnVtYmVyID0gQm9keXBhcnQuR0VOREVSX01FRElVTV9BTkRST0dZTkU7XHJcblxyXG4gICAgLy8gTGlrZSB3aXRoIGhlYWx0aCwgdGhlIHdlaWdodCBtYWtlcyB0aGlzIGJvZHlwYXJ0IG1hdHRlciBtb3JlIGZvciBkZWNpZGluZyBnZW5kZXIuXHJcbiAgICAvLyBHZW5kZXIgcHJlc2VudGF0aW9uIGlzIG5vdCBhYm91dCBwcmV0dGluZXNzLCBzbywgZm9yIGluc3RhbmNlLCBoYXZpbmcgaHVnZSBicmVhc3RzIHdpbGxcclxuICAgIC8vIHN0cm9uZ2x5IHB1c2ggeW91IHRvIHRoZSBcImlzIGEgd29tYW5cIiBzaWRlLCBldmVuIGlmIHlvdSdyZSBtYW5seSBhcyBmdWNrIGV2ZXJ5d2hlcmUgZWxzZS5cclxuICAgIC8vIElmIHlvdSdyZSB0b28gbWFubHkgZXZlcnl3aGVyZSBlbHNlLCB0aG91Z2gsIHlvdSdsbCBwcm9iYWJseSBlbmQgdXAgY2xvc2VyIG9uIHRoZSBzcGVjdHJ1bSB0byBtYWxlXHJcbiAgICAvLyBvciBhdCBsZWFzdCBhbmRyb2d5bm91cywgd2hpY2ggbWlnaHQgcmVzdWx0IGluIG5vdCBwYXNzaW5nLlxyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA6IG51bWJlciA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTbHV0dGluZXNzIGdvZXMgZnJvbSAwIHRvIDEwMC5cclxuICAgICAqIEEgYm9keXBhcnQncyBzbHV0dGluZXNzIGlzIGRlcGVuZGVudCBvbiBpdCBiZWluZyBzZWVuLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3MgOiBudW1iZXIgPSAxMDtcclxuXHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA6IG51bWJlciA9IEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlcldlaWdodCAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xvdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmRlcldlaWdodCAqICh0aGlzLnZpc2libGVTbG90cy5sZW5ndGggLyB0aGlzLnNsb3RzLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlclZhbHVlICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5kZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2VpZ2h0ZWRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R2VuZGVyVmFsdWUoKSAqIHRoaXMuZ2V0R2VuZGVyV2VpZ2h0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2x1dHRpbmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzc1dlaWdodCAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xvdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNsdXR0aW5lc3NXZWlnaHQgKiAodGhpcy52aXNpYmxlU2xvdHMubGVuZ3RoIC8gdGhpcy5zbG90cy5sZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXZWlnaHRlZFNsdXR0aW5lc3NWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2x1dHRpbmVzcygpICogdGhpcy5nZXRTbHV0dGluZXNzV2VpZ2h0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVZpc2liaWxpdHkgKCkge1xyXG4gICAgICAgIHRoaXMudmlzaWJsZVNsb3RzID0gdGhpcy5zbG90cy5zbGljZSgwKTtcclxuICAgICAgICBsZXQgcGFyZW50ID0gVGhpbmcuUGFydFJlbGF0aW9uLmdldExlZnQodGhpcyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IGNsb3RoaW5nID0gPEFycmF5PENsb3RoaW5nPj5UaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQocGFyZW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG90aGluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvdmVyaW5nID0gY2xvdGhpbmdbaV0uZ2V0Q292ZXJpbmdTbG90cygpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb3ZlcmluZy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSB0aGlzLnZpc2libGVTbG90cy5pbmRleE9mKGNvdmVyaW5nW2tdKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlU2xvdHMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVTbG90cy5sZW5ndGggPT0gMCkgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVW5jb3ZlcmVkICgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlU2xvdHMubGVuZ3RoID09IHRoaXMuc2xvdHMubGVuZ3RoICYmIHRoaXMuc2xvdHMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU3RhdHVzICgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNvcmVuZXNzICh0aGluZyA6IFRoaW5nKSB7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0cyA9IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpbmcsIEJvZHlwYXJ0KTtcclxuICAgICAgICBsZXQgc29yZW5lc3MgPSAwO1xyXG4gICAgICAgIGJvZHlwYXJ0cy5mb3JFYWNoKChib2R5cGFydCA6IEJvZHlwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIHNvcmVuZXNzICs9IGJvZHlwYXJ0LmdldFdlaWdodGVkU29yZW5lc3MoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc29yZW5lc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRHZW5kZXJWYWx1ZU9uICh0aGluZyA6IFRoaW5nKSA6IEJvZHlwYXJ0VmFsdWVSZXN1bHQge1xyXG4gICAgICAgIGxldCB3ZWlnaHQgPSAwO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XHJcblxyXG4gICAgICAgIGxldCBib2R5cGFydHMgPSBUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaW5nLCBCb2R5cGFydCk7XHJcbiAgICAgICAgYm9keXBhcnRzLmZvckVhY2goKGJvZHlwYXJ0IDogQm9keXBhcnQpID0+IHtcclxuICAgICAgICAgICAgd2VpZ2h0ICs9IGJvZHlwYXJ0LmdldEdlbmRlcldlaWdodCgpO1xyXG4gICAgICAgICAgICB2YWx1ZSArPSBib2R5cGFydC5nZXRXZWlnaHRlZEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdlaWdodCA6IHdlaWdodCxcclxuICAgICAgICAgICAgdmFsdWUgOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTbHV0dGluZXNzVmFsdWVPbiAodGhpbmcgOiBUaGluZykgOiBCb2R5cGFydFZhbHVlUmVzdWx0IHtcclxuICAgICAgICBsZXQgd2VpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xyXG5cclxuICAgICAgICBsZXQgYm9keXBhcnRzID0gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGluZywgQm9keXBhcnQpO1xyXG4gICAgICAgIGJvZHlwYXJ0cy5mb3JFYWNoKChib2R5cGFydCA6IEJvZHlwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIHdlaWdodCArPSBib2R5cGFydC5nZXRTbHV0dGluZXNzV2VpZ2h0KCk7XHJcbiAgICAgICAgICAgIHZhbHVlICs9IGJvZHlwYXJ0LmdldFdlaWdodGVkU2x1dHRpbmVzc1ZhbHVlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdlaWdodCA6IHdlaWdodCxcclxuICAgICAgICAgICAgdmFsdWUgOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIHRoZSBib2R5cGFydCBzbyB0aGF0IGl0IG1hdGNoZXMgdGhlIGRlc2lyZWQgZ2VuZGVyVmFsdWUuXHJcbiAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGluIGFsbCBjbGFzc2VzIGluaGVyaXRpbmcgZnJvbSBCb2R5cGFydCwgYXMgbm90IGFsbCBib2R5cGFydHMgaGF2ZSBhIHNpbXBsZSBcImdlbmRlclZhbHVlXCIgdG8gYXNzaWduLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGdlbmRlclZhbHVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJhbmdlR2VuZGVyVmFsdWUgKGdlbmRlclZhbHVlIDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5nZW5kZXJWYWx1ZSA9IGdlbmRlclZhbHVlO1xyXG4gICAgICAgICg8SHVtYW5vaWQ+IHRoaXMuZ2V0UGFydE9uZSgpKS5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBpbmNyZWFzZSBGZW1pbmluaXR5IGJ5IDUgKiBhbW91bnQuIFdpbGwgcmVhZCBDdXJyZW50IEdlbmRlciBWYWx1ZSBhbmQgdHJ5IHRvIHJlYXNzaWduIGl0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5jcmVhc2VGZW1pbmluaXR5IChhbW91bnQgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY3VycmVudEdWID0gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuYXJyYW5nZUdlbmRlclZhbHVlKGN1cnJlbnRHViArICg1ICogYW1vdW50KSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdHMgdG8gaW5jcmVhc2UgTWFzY3VsaW5pdHkgYnkgNSAqIGFtb3VudC4gV2lsbCByZWFkIEN1cnJlbnQgR2VuZGVyIFZhbHVlIGFuZCB0cnkgdG8gcmVhc3NpZ24gaXQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmNyZWFzZU1hc2N1bGluaXR5IChhbW91bnQgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY3VycmVudEdWID0gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuYXJyYW5nZUdlbmRlclZhbHVlKGN1cnJlbnRHViAtICg1ICogYW1vdW50KSk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQm9keXBhcnQudHNcIiAvPlxyXG5jbGFzcyBTZXhTdGljayBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBob3cgd2lkZSB0aGUgbWVtYmVyIGlzLiBJZiB0aGlzIFNleFN0aWNrIGRlcGVuZHNvIG4gYXJvdXNhbCwgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBvY25zaWRlciB0aGF0LlxyXG4gICAgICogVGhpcyBpcyByZWxldmFudCB0byBob3cgbXVjaCBhIFNleEhvbGUgd2lsbCBiZSBzdHJldGNoZWQgb3V0IGJ5IHRoaXMgU2V4U3RpY2suXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0V2lkZSAoKSA6IE1lYXN1cmUge1xyXG4gICAgICAgIHJldHVybiBuZXcgTWVhc3VyZSgpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGhvdyBsb25nIHRoZSBtZW1iZXIgaXMuIElmIHRoaXMgU2V4U3RpY2sgZGVwZW5kcyBvbiBhcm91c2FsLCB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvbnNpZGVyIHRoYXQuXHJcbiAgICAgKiBUaGlzIGlzIHJlbGV2YW50IHRvIGhvdyBtdWNoIGEgU2V4SG9sZSB3aWxsIGJlIHN0cmV0Y2hlZCBvdXQgYnkgdGhpcyBTZXhTdGljay5cclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMb25nICgpIDogTWVhc3VyZXtcclxuICAgICAgICByZXR1cm4gbmV3IE1lYXN1cmUoKVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuY2xhc3MgU2V4SG9sZSBleHRlbmRzIEJvZHlwYXJ0IHtcclxuXHJcbn0iLCJpbnRlcmZhY2UgTWVhc3VyZW1lbnQge1xyXG4gICAgZ2V0VGV4dCA6ICgpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbWVhc3VyZSBpcyBBTFdBWVMgY3JlYXRlZCBpbiBDZW50aW1ldGVycy5cclxuICogSG93IGEgbWVhc3VyZSBnZXRzIGRpc3BsYXllZCBjYW4gZ2V0IGNoYW5nZWQgbGF0ZXIsIHNvIGFsd2F5cyB1c2UgdGhpcyBjbGFzcyBmb3IgbWVhc3VyZXMhXHJcbiAqIElmIHlvdSdyZSBhbWVyaWNhbiwgdXNlIHRoZSBoZWxwZXIgc3RhdGljIGZ1bmN0aW9ucyBmcm9tSW5jaGVzLCBmcm9tRmVldCB0byBnZXQgY2VudGltZXRlcnMuXHJcbiAqIEZvciBpbnN0YW5jZSwgNScxMFwiIHdvdWxkIGdldCBjcmVhdGVkIGFzOlxyXG4gKiBuZXcgTWVhc3VyZShNZWFzdXJlLmZyb21GZWV0KDUpICsgTWVhc3VyZS5mcm9tSW5jaGVzKDEwKVxyXG4gKlxyXG4gKiBJZiBtdWx0aXBsZSBtZWFzdXJlbWVudHMgYXJlIGFkZGVkLCBpdCdzIHRyZWF0ZWQgYXMgYXJlYSBvZiBzb21ldGhpbmcgc2ltcGxlIGxpa2UgcmVjdGFuZ2xlcyBvciBjdWJlcyBvciB3aGF0ZXZlciwgdGhleSdyZSBqdXN0IG11bHRpcGxpZWQuXHJcbiAqL1xyXG5jbGFzcyBNZWFzdXJlIGltcGxlbWVudHMgTWVhc3VyZW1lbnQge1xyXG4gICAgcHJpdmF0ZSB1bml0cyA6IG51bWJlcjtcclxuICAgIHByaXZhdGUgc2lkZXMgOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICguLi5zaWRlcyA6IEFycmF5PG51bWJlcj4pIHtcclxuICAgICAgICB0aGlzLnVuaXRzID0gMTtcclxuICAgICAgICBzaWRlcy5mb3JFYWNoKChzaWRlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudW5pdHMgKj0gc2lkZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNpZGVzID0gc2lkZXMubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFtcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIl1cclxuICAgIHByaXZhdGUgc3VwZXJzY3JpcHQgPSAgIFtcIlwiICwgXCJcIiAsIFwiwrJcIiwgXCLCs1wiLCBcIuKBtFwiLCBcIuKBtVwiLCBcIuKBtlwiLCBcIuKBt1wiLCBcIuKBuFwiLCBcIuKBuVwiXTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0VGV4dCAoKSB7XHJcbiAgICAgICAgbGV0IG1ldGVycyA9IE1hdGgucG93KHRoaXMuc2lkZXMsIDEwMCk7XHJcbiAgICAgICAgaWYgKHRoaXMudW5pdHMgPiBtZXRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuICgrKHRoaXMudW5pdHMgLyBtZXRlcnMpLnRvRml4ZWQoMikpLnRvU3RyaW5nKCkgKyBcIm1cIiArIHRoaXMuc3VwZXJzY3JpcHRbdGhpcy5zaWRlc107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5pdHMudG9TdHJpbmcoKSArIFwiY21cIiArIHRoaXMuc3VwZXJzY3JpcHRbdGhpcy5zaWRlc107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROdW1iZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuaXRzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaWRlcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSW5jaGVzIChpbmNoZXMgOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gaW5jaGVzICogMi41NDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGZyb21GZWV0IChmZWV0IDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZlZXQgKiAzMC40ODtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgTWVhc3VyZUxpcXVpZCBpbXBsZW1lbnRzIE1lYXN1cmVtZW50IHtcclxuICAgIHByaXZhdGUgdW5pdHMgOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChtaWxsaWxpdGVycyA6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMudW5pdHMgPSBtaWxsaWxpdGVycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGV4dCAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudW5pdHMgPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoKyh0aGlzLnVuaXRzIC8gMTAwMCkudG9GaXhlZCgyKSkudG9TdHJpbmcoKSArIFwiTFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuaXRzLnRvU3RyaW5nKCkgKyBcIm1MXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUxpdGVycyAobGl0ZXJzIDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGxpdGVycyAqIDEwMDA7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRBcm1zIGV4dGVuZHMgQm9keXBhcnQge1xyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0xPVztcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtIdW1hbm9pZC5TTE9UX0FSTVNdO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2x1dHRpbmVzc1dlaWdodCgpIHtcclxuICAgICAgICBpZiAoKDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCkpLmlzTWFsZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBCb2R5cGFydC5XRUlHSFRfSElHSEVTVDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzbHV0dGluZXNzV2VpZ2h0KHZhbCkge31cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzcyAoKSB7XHJcbiAgICAgICAgaWYgKCg8SHVtYW5vaWQ+IHRoaXMuZ2V0UGFydE9uZSgpKS5pc01hbGUoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxMDAgLSB0aGlzLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGh1bWFub2lkID0gPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKTtcclxuICAgICAgICBsZXQgc3RyID0gaHVtYW5vaWQuZ2V0U3RhdChBdHRyaWJ1dGVzLlN0cmVuZ3RoKTtcclxuICAgICAgICBpZiAoc3RyID4gNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJZb3VyIGFybXMgYW5kIGxlZ3MgYXJlIHJpZGljdWxvdXNseSBodWdlLCBzaG93aW5nIG9mZiBqdXN0IGhvdyBzdHJvbmcgeW91IGFyZS5cIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0ciA+IDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBhcm1zIGFuZCBsZWdzIGFyZSBwcmV0dHkgYmlnIGJlY2F1c2Ugb2YgeW91ciBtdXNjbGVzLlwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RyID09IDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiWW91IGxvb2sgbGlrZSB5b3UgZG9uJ3QgZXZlbiBsaWZ0LlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIGxldCBodW1hbm9pZCA9IDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCk7XHJcbiAgICAgICAgbGV0IHN0ciA9IGh1bWFub2lkLmdldFN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuIDIwICogc3RyO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkQnJlYXN0cyBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBzaXplIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBzaWxpY29uZSA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbWlsayA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSDtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9CUkVBU1RTXTtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzID0gQm9keXBhcnQuU0xVVFRJTkVTU19ISUdIX1NMVVQ7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBTaXplIDogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICAgICAgU2lsaWNvbmUgOiB0aGlzLnNpbGljb25lLFxyXG4gICAgICAgICAgICAgICAgTWlsayA6IHRoaXMubWlsa1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGNoYW5nZXMuU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5zaWxpY29uZSA9IGNoYW5nZXMuU2lsaWNvbmU7XHJcbiAgICAgICAgICAgIHRoaXMubWlsayA9IGNoYW5nZXMuTWlsaztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2l6ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZSArIHRoaXMuc2lsaWNvbmUgKyB0aGlzLm1pbGs7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNpemVUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gSHVtYW5vaWRCcmVhc3RzLmdldFNpemVUZXh0KHRoaXMuZ2V0U2l6ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNpemVUZXh0IChzaXplIDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IG5hbWVzID0gW1wiZmxhdFwiLCBcIkFBLWN1cFwiLCBcIkEtY3VwXCIsIFwiQi1jdXBcIiwgXCJDLWN1cFwiLCBcIkQtY3VwXCIsIFwiRS1jdXBcIiwgXCJGLWN1cFwiLCBcIkctY3VwXCIsIFwiSC1jdXBcIl07XHJcbiAgICAgICAgaWYgKHNpemUgPj0gbmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIkhVR0VcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXNbc2l6ZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEh1bWFub2lkQnJlYXN0cy5nZXRHZW5kZXJGcm9tU2l6ZSh0aGlzLmdldFNpemUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRHZW5kZXJGcm9tU2l6ZSAoc2l6ZSA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChzaXplIDw9IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIDIwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSAzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAyMCAqIHNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDgwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXJyYW5nZUdlbmRlclZhbHVlIChndiA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChndiA8PSAyMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnNpbGljb25lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5taWxrID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGd2IDwgODApIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gTWF0aC5yb3VuZChndiAvIDIwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSA0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZEJ1dHQgZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICBwdWJsaWMgc2l6ZSA6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgc2lsaWNvbmUgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9CVVRUXTtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzID0gQm9keXBhcnQuU0xVVFRJTkVTU19ISUdIX1NMVVQ7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpemUoKSAqIDMzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgU2l6ZSA6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgICAgIFNpbGljb25lIDogdGhpcy5zaWxpY29uZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IGNoYW5nZXMuU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5zaWxpY29uZSA9IGNoYW5nZXMuU2lsaWNvbmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNpemUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpemUgKyB0aGlzLnNpbGljb25lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaXplVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEh1bWFub2lkQnV0dC5nZXRTaXplVGV4dCh0aGlzLmdldFNpemUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaXplVGV4dCAoc2l6ZSA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBuYW1lcyA9IFtcImZsYXRcIiwgXCJ0aW55XCIsIFwicm91bmRcIiwgXCJwbHVtcFwiXTsgLy8gVE9ETzogZmluaXNoIHRoaXNcclxuICAgICAgICBpZiAoc2l6ZSA+PSBuYW1lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiZ2FyZ2FudHVhblwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lc1tzaXplXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlclZhbHVlICgpIHtcclxuICAgICAgICByZXR1cm4gSHVtYW5vaWRCcmVhc3RzLmdldEdlbmRlckZyb21TaXplKHRoaXMuZ2V0U2l6ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEdlbmRlckZyb21TaXplIChzaXplIDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHNpemUgPD0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMjA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzaXplIDw9IDIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDMwICogc2l6ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gODA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IFJFUExBQ0UgTlVNQkVSUyBXSVRIIFRBQkxFXHJcbiAgICBwdWJsaWMgYXJyYW5nZUdlbmRlclZhbHVlIChndiA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChndiA8PSAyMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZ3YgPD0gNjApIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSAzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZEV4dHJlbWl0eSBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBuYWlsc1BhaW50ZWQgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgbmFpbENvbG9yID0gMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgbmFpbENvbG9yTmFtZXMgPSBbJ25vbmUnLCAncmVkJywgJ3BpbmsnXTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldENvbG9yIChpbmRleCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBIdW1hbm9pZEV4dHJlbWl0eS5uYWlsQ29sb3JOYW1lc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBQYWludGVkIDogdGhpcy5uYWlsc1BhaW50ZWQsXHJcbiAgICAgICAgICAgICAgICBDb2xvciA6IHRoaXMubmFpbENvbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygodGhpbmcsIGNoYW5nZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5uYWlsc1BhaW50ZWQgPSBjaGFuZ2VzLlBhaW50ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMubmFpbENvbG9yID0gY2hhbmdlcy5Db2xvcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0R2VuZGVyVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIGxldCBuYWlsUGFpbnRlZENvcnJlY3Rpb24gPSB0aGlzLm5haWxDb2xvciAqIDUwOyAvLyBUT0RPOiBEb24ndCBsZWF2ZSB0aGlzIGFzLWlzLi4uIHRoZXJlIHNob3VsZCBiZSBwbGVudHkgb2YgY29sb3JzLlxyXG4gICAgICAgIGxldCBuYWlsUGFpbnRlZENvcnJlY3Rpb25XZWlnaHQgPSB0aGlzLm5haWxzUGFpbnRlZCA/IDMgOiAwO1xyXG5cclxuICAgICAgICBsZXQgZ3YgPSB0aGlzLmdlbmRlclZhbHVlO1xyXG4gICAgICAgIGxldCBndyA9IHRoaXMuZ2VuZGVyV2VpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gKChndiAqIGd3KSArIChuYWlsUGFpbnRlZENvcnJlY3Rpb24gKiBuYWlsUGFpbnRlZENvcnJlY3Rpb25XZWlnaHQpKSAvIChndyArIG5haWxQYWludGVkQ29ycmVjdGlvbldlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFycmFuZ2VHZW5kZXJWYWx1ZSAoZ3YgOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmdlbmRlclZhbHVlID0gZ3Y7IC8vIFRPRE86IFRoaXMgd2lsbCBiZSBleHRyZW1pdHkgc2l6ZS9hcHBlYXJhbmNlLiBNYXliZSBtYWtlIGl0IG1vcmUgZGV0YWlsZWQgaWYgaW50ZXJlc3RlZC5cclxuICAgICAgICB0aGlzLm5haWxzUGFpbnRlZCA9IGd2ID4gNjA7XHJcbiAgICAgICAgaWYgKHRoaXMubmFpbHNQYWludGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChndiA+IDcwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5haWxDb2xvciA9IDI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5haWxDb2xvciA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKDxIdW1hbm9pZD4gdGhpcy5nZXRQYXJ0T25lKCkpLmludmFsaWRhdGVDYWNoZXMoKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWRFeHRyZW1pdHkudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZEZlZXQgZXh0ZW5kcyBIdW1hbm9pZEV4dHJlbWl0eSB7XHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTE9XO1xyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9MT1c7XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW0h1bWFub2lkLlNMT1RfRkVFVF07XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmdlbmRlclZhbHVlID4gNTUpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgZmVldCBhcmUgc21hbGwgYW5kIGN1dGUuXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZW5kZXJWYWx1ZSA8IDQ1KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIGZlZXQgYXJlIGJpZyBhbmQgbWFubmlzaC5cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubmFpbHNQYWludGVkKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIgWW91ciB0b2VuYWlscyBhcmUgcGFpbnRlZCBcIiArIEh1bWFub2lkRXh0cmVtaXR5LmdldENvbG9yKHRoaXMubmFpbENvbG9yKSArIFwiLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNheTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9IdW1hbm9pZC9IdW1hbm9pZC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhTdGljay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL01lYXN1cmUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWRFeHRyZW1pdHkudHNcIiAvPlxyXG5jbGFzcyBIdW1hbm9pZEhhbmRzIGV4dGVuZHMgSHVtYW5vaWRFeHRyZW1pdHkge1xyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0xPVztcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtIdW1hbm9pZC5TTE9UX0hBTkRTXTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24gKCkge1xyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2VuZGVyVmFsdWUgPiA1NSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBoYW5kcyBhcmUgZGVsaWNhdGUgYW5kIHNsZW5kZXIuXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZW5kZXJWYWx1ZSA8IDQ1KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIGhhbmRzIGFyZSByb3VnaCBhbmQgbGFyZ2UuXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm5haWxzUGFpbnRlZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdXIgdG9lbmFpbHMgYXJlIHBhaW50ZWQgXCIgKyBIdW1hbm9pZEV4dHJlbWl0eS5nZXRDb2xvcih0aGlzLm5haWxDb2xvcikgKyBcIi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzYXk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRIZWFkIGV4dGVuZHMgQm9keXBhcnQge1xyXG4gICAgcHVibGljIHNvcmVuZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTE9XO1xyXG4gICAgLy8gVE9ETzogbWFrZSB0aGVzZSBzbG90cyBhcyBvd24gYm9keXBhcnRzIHNvIHRoYXQgdGhleSBjYW4gYmUgaGFuZGxlZCBiZXR0ZXJcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9IRUFER0VBUiwgSHVtYW5vaWQuU0xPVF9IQUlSLCBIdW1hbm9pZC5TTE9UX0VBUlMsIEh1bWFub2lkLlNMT1RfRkFDRSwgSHVtYW5vaWQuU0xPVF9FWUVTLCAsIEh1bWFub2lkLlNMT1RfTk9TRSwgSHVtYW5vaWQuU0xPVF9NT1VUSF07XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQm9keXBhcnQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4U3RpY2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9NZWFzdXJlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L09uZU9mLnRzXCIgLz5cclxuY2xhc3MgSHVtYW5vaWRQZW5pcyBleHRlbmRzIFNleFN0aWNrIHtcclxuXHJcbiAgICBwdWJsaWMgc29yZW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSDtcclxuICAgIHB1YmxpYyBnZW5kZXJWYWx1ZSA9IDI1O1xyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9ISUdIRVNUO1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVF07XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzcyA9IEJvZHlwYXJ0LlNMVVRUSU5FU1NfSElHSF9TTFVUO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3NXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfTUVESVVNO1xyXG5cclxuICAgIHB1YmxpYyBmbGFjY2lkU2l6ZSA9IG5ldyBNZWFzdXJlKDYpO1xyXG4gICAgcHVibGljIGZsYWNjaWRXaWR0aCA9IG5ldyBNZWFzdXJlKDMpO1xyXG4gICAgcHVibGljIGVyZWN0U2l6ZSA9IG5ldyBNZWFzdXJlKDE1KTtcclxuICAgIHB1YmxpYyBlcmVjdFdpZHRoID0gbmV3IE1lYXN1cmUoNik7XHJcblxyXG4gICAgcHJpdmF0ZSBhcm91c2FsTWluaW11bSA6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIGFyb3VzYWxFcmVjdCA6IG51bWJlciA9IDI1O1xyXG4gICAgcHJpdmF0ZSBmbGFjY2lkTXVsdCA6IG51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVsZ2VTaXplKCkgKiAzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0dyb3dlciAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhY2NpZE11bHQgPCAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID49IDAuNSkge1xyXG4gICAgICAgICAgICAvLyBncm93ZXI/XHJcbiAgICAgICAgICAgIHRoaXMuZmxhY2NpZE11bHQgPSAwLjMzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHNob3dlcj9cclxuICAgICAgICAgICAgdGhpcy5mbGFjY2lkTXVsdCA9IDAuNzc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBGU2l6ZSA6IHRoaXMuZmxhY2NpZFNpemUuZ2V0TnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICBGV2lkdGggOiB0aGlzLmZsYWNjaWRXaWR0aC5nZXROdW1iZXIoKSxcclxuICAgICAgICAgICAgICAgIEVTaXplIDogdGhpcy5lcmVjdFNpemUuZ2V0TnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICBFV2lkdGggOiB0aGlzLmVyZWN0V2lkdGguZ2V0TnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICBBTWluIDogdGhpcy5hcm91c2FsTWluaW11bSxcclxuICAgICAgICAgICAgICAgIEFFcmVjdCA6IHRoaXMuYXJvdXNhbEVyZWN0LFxyXG4gICAgICAgICAgICAgICAgRk11bHQgOiB0aGlzLmZsYWNjaWRNdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygodGhpbmcsIGNoYW5nZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mbGFjY2lkU2l6ZSA9IG5ldyBNZWFzdXJlKGNoYW5nZXMuRlNpemUpO1xyXG4gICAgICAgICAgICB0aGlzLmZsYWNjaWRXaWR0aCA9IG5ldyBNZWFzdXJlKGNoYW5nZXMuRldpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5lcmVjdFNpemUgPSBuZXcgTWVhc3VyZShjaGFuZ2VzLkVTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5lcmVjdFdpZHRoID0gbmV3IE1lYXN1cmUoY2hhbmdlcy5FV2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmFyb3VzYWxNaW5pbXVtID0gY2hhbmdlcy5BTWluO1xyXG4gICAgICAgICAgICB0aGlzLmFyb3VzYWxFcmVjdCA9IGNoYW5nZXMuQUVyZWN0O1xyXG4gICAgICAgICAgICB0aGlzLmZsYWNjaWRNdWx0ID0gY2hhbmdlcy5GTXVsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWN0dWFsU2l6ZSAoKSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHRoaXMuZmxhY2NpZFNpemUuZ2V0TnVtYmVyKCk7XHJcbiAgICAgICAgbGV0IG1heCA9IHRoaXMuZXJlY3RTaXplLmdldE51bWJlcigpO1xyXG4gICAgICAgIGxldCB2YXJpYWJsZVNpemUgPSAobWF4IC0gbWluKTtcclxuXHJcbiAgICAgICAgbGV0IGZpbmFsU2l6ZSA9IG1pbiArICh2YXJpYWJsZVNpemUgKiB0aGlzLmdldEFyb3VzYWxQZXJjKCkpO1xyXG4gICAgICAgIHJldHVybiBmaW5hbFNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQmlnICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWxnZVNpemUoKSA+IDIyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcm91c2FsUGVyYyAoKSB7XHJcbiAgICAgICAgLy9UT0RPOiBHZXQgYXJvdXNhbCBmcm9tIG93bmVyXHJcbiAgICAgICAgbGV0IGFyb3VzYWwgPSAwO1xyXG4gICAgICAgIGxldCBudW1TdGVwcyA9IHRoaXMuYXJvdXNhbEVyZWN0IC0gdGhpcy5hcm91c2FsTWluaW11bTtcclxuICAgICAgICBsZXQgYXJvdXNhbFBlcmMgPSAoYXJvdXNhbCAtIHRoaXMuYXJvdXNhbE1pbmltdW0pIC8gbnVtU3RlcHM7XHJcbiAgICAgICAgYXJvdXNhbFBlcmMgPSBhcm91c2FsUGVyYyA8IDAgPyAwIDpcclxuICAgICAgICAgICAgYXJvdXNhbFBlcmMgPiAxID8gMSA6XHJcbiAgICAgICAgICAgICAgICBhcm91c2FsUGVyYztcclxuICAgICAgICByZXR1cm4gYXJvdXNhbFBlcmM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRmxhY2NpZCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXJvdXNhbFBlcmMoKSA8IDAuNjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNFcmVjdCAoKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRmxhY2NpZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBY3R1YWxXaWR0aCAoKSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHRoaXMuZmxhY2NpZFdpZHRoLmdldE51bWJlcigpO1xyXG4gICAgICAgIGxldCBtYXggPSB0aGlzLmVyZWN0V2lkdGguZ2V0TnVtYmVyKCk7XHJcbiAgICAgICAgbGV0IHZhcmlhYmxlU2l6ZSA9IChtYXggLSBtaW4pO1xyXG4gICAgICAgIGxldCBudW1TdGVwcyA9IHRoaXMuYXJvdXNhbEVyZWN0IC0gdGhpcy5hcm91c2FsTWluaW11bTtcclxuXHJcbiAgICAgICAgLy9UT0RPOiBHZXQgYXJvdXNhbCBmcm9tIG93bmVyXHJcbiAgICAgICAgbGV0IGFyb3VzYWwgPSAwO1xyXG4gICAgICAgIGxldCBhcm91c2FsUGVyYyA9IChhcm91c2FsIC0gdGhpcy5hcm91c2FsTWluaW11bSkgLyBudW1TdGVwcztcclxuICAgICAgICBhcm91c2FsUGVyYyA9IGFyb3VzYWxQZXJjIDwgMCA/IDAgOlxyXG4gICAgICAgICAgICBhcm91c2FsUGVyYyA+IDEgPyAxIDpcclxuICAgICAgICAgICAgICAgIGFyb3VzYWxQZXJjO1xyXG5cclxuICAgICAgICBsZXQgZmluYWxTaXplID0gbWluICsgKHZhcmlhYmxlU2l6ZSAqIGFyb3VzYWxQZXJjKTtcclxuICAgICAgICByZXR1cm4gZmluYWxTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRMb25nICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1lYXN1cmUodGhpcy5nZXRBY3R1YWxTaXplKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXaWRlICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1lYXN1cmUodGhpcy5nZXRBY3R1YWxXaWR0aCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QnVsZ2VTaXplICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3R1YWxTaXplKCkgKyAoMyAqIHRoaXMuZ2V0QWN0dWFsV2lkdGgoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNpemVUZXh0ICgpIHtcclxuICAgICAgICByZXR1cm4gSHVtYW5vaWRQZW5pcy5nZXRTaXplVGV4dCh0aGlzLmdldEJ1bGdlU2l6ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFNpemVUZXh0IChzaXplIDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gc2l6ZSA9IGxvbmcgKyAod2lkdGggKiAzKVxyXG4gICAgICAgIC8vIHNvIGxvbmcgZnJvbSAxIHRvIDIwLCBsZXRzIHNheVxyXG4gICAgICAgIC8vIHdpZHRoIGZyb20gMSB0byA2LCBzbyAzIHRvIDE4XHJcbiAgICAgICAgbGV0IHNpemVUYWJsZSA9IFtcclxuICAgICAgICAgICAgWzAsIFwibm9uZXhpc3RlbnRcIl0sXHJcbiAgICAgICAgICAgIFsxLCBcInRpbnlcIl0sIC8vIDNsIDJ3ID0gOVxyXG4gICAgICAgICAgICBbMjAsIFwic21hbGxcIl0sIC8vIDEwbCAzdyA9IDE5XHJcbiAgICAgICAgICAgIFsyMywgXCJtZWRpdW1cIl0sIC8vIDE0bCAzdyA9IDI0XHJcbiAgICAgICAgICAgIFsyNywgXCJiaWdcIl0sXHJcbiAgICAgICAgICAgIFszMiwgXCJodWdlXCJdLFxyXG4gICAgICAgICAgICBbMzYsIFwibW9uc3Ryb3VzXCJdXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IGk7XHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IHNpemVUYWJsZS5sZW5ndGggJiYgc2l6ZVRhYmxlW2ldWzBdIDwgc2l6ZTsgaSsrKSB7fVxyXG4gICAgICAgIHJldHVybiBzaXplVGFibGVbaSAtIDFdWzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgbGV0IHNpemVUYWJsZSA9IFtcclxuICAgICAgICAgICAgWzEwLCA2MF0sIC8vIDNsIDJ3ID0gOVxyXG4gICAgICAgICAgICBbMjAsIDQ1XSwgLy8gMTBsIDN3ID0gMTlcclxuICAgICAgICAgICAgWzIzLCAzNV0sIC8vIDE0bCAzdyA9IDI0XHJcbiAgICAgICAgICAgIFsyNywgMjhdLFxyXG4gICAgICAgICAgICBbMzIsIDI0XSxcclxuICAgICAgICAgICAgWzM2LCAxOF1cclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBsZXQgaTtcclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZVRhYmxlLmxlbmd0aCAmJiBzaXplVGFibGVbaV1bMF0gPCB0aGlzLmdldEFjdHVhbFNpemUoKTsgaSsrKSB7fVxyXG4gICAgICAgIHJldHVybiBzaXplVGFibGVbaSAtIDFdWzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcnJhbmdlR2VuZGVyVmFsdWUgKGd2IDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHNpemVUYWJsZSA9IFtcclxuICAgICAgICAgICAgWzYwLCAzLCAyXSwgLy8gM2wgMncgPSA5XHJcbiAgICAgICAgICAgIFs0NSwgMTAsIDNdLCAvLyAxMGwgM3cgPSAxOVxyXG4gICAgICAgICAgICBbMzUsIDE0LCAzXSwgLy8gMTRsIDN3ID0gMjRcclxuICAgICAgICAgICAgWzI4LCAxNywgM10sXHJcbiAgICAgICAgICAgIFsyNCwgMTksIDRdLFxyXG4gICAgICAgICAgICBbMTgsIDIyLCA0LjVdXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgbGV0IGk7XHJcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IHNpemVUYWJsZS5sZW5ndGggJiYgc2l6ZVRhYmxlW2ldWzBdID4gZ3Y7IGkrKykge31cclxuXHJcbiAgICAgICAgdGhpcy5mbGFjY2lkU2l6ZSA9IG5ldyBNZWFzdXJlKHRoaXMuZmxhY2NpZE11bHQgKiBzaXplVGFibGVbaSAtIDFdWzFdKTtcclxuICAgICAgICB0aGlzLmZsYWNjaWRXaWR0aCA9IG5ldyBNZWFzdXJlKHRoaXMuZmxhY2NpZE11bHQgKiBzaXplVGFibGVbaSAtIDFdWzJdKTtcclxuICAgICAgICB0aGlzLmVyZWN0U2l6ZSA9IG5ldyBNZWFzdXJlKHNpemVUYWJsZVtpIC0gMV1bMV0pO1xyXG4gICAgICAgIHRoaXMuZXJlY3RXaWR0aCA9IG5ldyBNZWFzdXJlKHNpemVUYWJsZVtpIC0gMV1bMl0pO1xyXG5cclxuICAgICAgICAoPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKSkuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U3lub255bSAoKSB7XHJcbiAgICAgICAgLy8gVE9ETzogQWRkIG1vcmUgd2hlbiBjcmVhdGl2ZS5cclxuICAgICAgICBsZXQgY29ja05hbWVzID0gW1xyXG4gICAgICAgICAgICBcImNvY2tcIixcclxuICAgICAgICAgICAgXCJkaWNrXCJcclxuICAgICAgICBdO1xyXG4gICAgICAgIHJldHVybiAobmV3IE9uZU9mKE9uZU9mLlBVUkVMWV9BVF9SQU5ET00sIC4uLmNvY2tOYW1lcykuZ2V0T25lKCkpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkU2tpbiBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IDA7XHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbXHJcbiAgICAgICAgSHVtYW5vaWQuU0xPVF9GQUNFLCBIdW1hbm9pZC5TTE9UX05FQ0ssIEh1bWFub2lkLlNMT1RfU0hPVUxERVJTLFxyXG4gICAgICAgIEh1bWFub2lkLlNMT1RfQVJNUywgSHVtYW5vaWQuU0xPVF9IQU5EUywgSHVtYW5vaWQuU0xPVF9VUFBFUl9DSEVTVCxcclxuICAgICAgICBIdW1hbm9pZC5TTE9UX01JRFJJRkYsIEh1bWFub2lkLlNMT1RfV0FJU1QsIEh1bWFub2lkLlNMT1RfQkFDSyxcclxuICAgICAgICBIdW1hbm9pZC5TTE9UX0hJUFMsIEh1bWFub2lkLlNMT1RfQlVUVCwgSHVtYW5vaWQuU0xPVF9MRUdfVVBQRVIsXHJcbiAgICAgICAgSHVtYW5vaWQuU0xPVF9MRUdfTE9XRVJcclxuICAgIF07XHJcblxyXG4gICAgcHVibGljIHNraW5Tb2Z0bmVzcyA9IDU7IC8vIDAgdG8gMTAsIDAgYmVpbmcgcm91Z2ggYW5kIDEwIGJlaW5nIHNpbGt5XHJcbiAgICBwdWJsaWMgc2tpbkhhaXJpbmVzcyA9IDI7IC8vIDAgdG8gMTAsIDEwIGJlaW5nIGxpdGVyYWwgZ29yaWxsYSBhbmQgMCBiZWluZyBzbW9vdGggZXZlcnl3aGVyZSwgMX4yIHByb2JhYmx5IHNvbWUgYXJtcGl0IG9yIHNvbWV0aGluZ1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgU29mdG5lc3MgOiB0aGlzLnNraW5Tb2Z0bmVzcyxcclxuICAgICAgICAgICAgICAgIEhhaXJpbmVzcyA6IHRoaXMuc2tpbkhhaXJpbmVzc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKHRoaW5nLCBjaGFuZ2VzKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2tpblNvZnRuZXNzID0gY2hhbmdlcy5Tb2Z0bmVzcztcclxuICAgICAgICAgICAgdGhpcy5za2luSGFpcmluZXNzID0gY2hhbmdlcy5IYWlyaW5lc3M7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEdlbmRlclZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgb3duZXIgPSA8UGVyc29uPiB0aGlzLmdldFBhcnRPbmUoKTtcclxuICAgICAgICBsZXQgZ3JlZW4gPSAob3duZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkNvcnJ1cHRpb24pID4gNTApO1xyXG5cclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShcIllvdXIgc2tpbiBpcyBcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNraW5Tb2Z0bmVzcyA+IDcpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcInBlcmZlY3RseSBzbW9vdGhcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNraW5Tb2Z0bmVzcyA+IDQpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcInNtb290aFwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwicm91Z2hcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzYXkuYWRkKFwiIGFuZCBcIik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNraW5IYWlyaW5lc3MgPiA4KSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJoYWlyeSwgbGlrZSBhIGdvcmlsbGEnc1wiKVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5za2luSGFpcmluZXNzID4gNikge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiaGFpcnlcIilcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2tpbkhhaXJpbmVzcyA+IDMpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcInNvbWV3aGF0IGhhaXJsZXNzXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJjb21wbGV0ZWx5IGhhaXJsZXNzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChcIi5cIik7XHJcblxyXG4gICAgICAgIGlmIChncmVlbikge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFRoZSB0YWludCBvZiB5b3VyIGNvcnJ1cHRpb24gaGFzIHR1cm5lZCB5b3VyIHNraW4gZ3JlZW4sIGxpa2UgYW4gb3JjJ3MuXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2F5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgbGV0IHNvZnRuZXNzUmFuayA9IHRoaXMuc2tpblNvZnRuZXNzICogMTAwO1xyXG4gICAgICAgIGxldCBoYWlyaW5lc3NSYW5rID0gMTAwMCAtICh0aGlzLnNraW5IYWlyaW5lc3MgKiAxMDApO1xyXG5cclxuICAgICAgICByZXR1cm4gKHNvZnRuZXNzUmFuayArIGhhaXJpbmVzc1JhbmspIC8gMjA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFycmFuZ2VHZW5kZXJWYWx1ZSAoZ2VuZGVyVmFsdWUgOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgaWRlYWwgPSBnZW5kZXJWYWx1ZSAvIDEwO1xyXG4gICAgICAgIHRoaXMuc2tpbkhhaXJpbmVzcz0gMTAgLSBNYXRoLnJvdW5kKGlkZWFsKTtcclxuICAgICAgICB0aGlzLnNraW5Tb2Z0bmVzcyAgPSBNYXRoLnJvdW5kKGlkZWFsKTtcclxuICAgICAgICAoPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKSkuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbi8vIFRPRE86IERlY2lkZSB3aHRoZXIgdGhlcmUgd2lsbCBiZSBhIHNlbWVuLXByb2R1Y2luZyBib2R5cGFydFxyXG5jbGFzcyBIdW1hbm9pZFRlc3RpY2xlcyBleHRlbmRzIEJvZHlwYXJ0IHtcclxuICAgIHB1YmxpYyBzaXplIDogbnVtYmVyID0gMTsgLy8gXCJOb3JtYWxcIlxyXG5cclxuICAgIHB1YmxpYyBzb3JlbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9ISUdIO1xyXG4gICAgcHVibGljIGdlbmRlcldlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9ISUdIRVNUO1xyXG4gICAgcHVibGljIHNsb3RzIDogQXJyYXk8bnVtYmVyPiA9IFtIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVF07XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzcyA9IEJvZHlwYXJ0LlNMVVRUSU5FU1NfTUVESVVNX0FWRVJBR0U7XHJcbiAgICBwdWJsaWMgc2x1dHRpbmVzc1dlaWdodCA9IEJvZHlwYXJ0LldFSUdIVF9NRURJVU07XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zPyA6IFRoaW5nT3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkR2V0QWx0ZXJhdGlvbnMoKHRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBTaXplIDogdGhpcy5zaXplXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRTZXRBbHRlcmF0aW9ucygodGhpbmcsIGNoYW5nZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaXplID0gY2hhbmdlcy5TaXplO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRCdWxnZVNpemUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlcldlaWdodCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIDgwOyAvLyBtYWxlIHNleCBvcmdhblxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0JvZHlwYXJ0LnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL0h1bWFub2lkL0h1bWFub2lkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleFN0aWNrLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1NleEhvbGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vTWVhc3VyZS50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkVmFnaW5hIGV4dGVuZHMgU2V4SG9sZSB7XHJcbiAgICBwdWJsaWMgZ2VuZGVyVmFsdWUgPSA4NTtcclxuICAgIHB1YmxpYyBnZW5kZXJXZWlnaHQgPSBCb2R5cGFydC5XRUlHSFRfSElHSEVTVDtcclxuICAgIHB1YmxpYyBzbG90cyA6IEFycmF5PG51bWJlcj4gPSBbSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlRdO1xyXG4gICAgcHVibGljIHNsdXR0aW5lc3MgPSA1MDtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX01FRElVTTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0U2x1dHRpbmVzcyAoKSB7XHJcbiAgICAgICAgLy8gcmV2ZXJzZSBmZW1pbmluaXR5IVxyXG4gICAgICAgIGxldCBzbHV0ID0gMTAwIC0gdGhpcy5nZW5kZXJWYWx1ZTsgLy8gZ2VuZGVyVmFsdWUgZ29lcyBmcm9tIDUwIHRvIDEwMCwgc28gdGhpcyBpcyA1MCBtYXguXHJcbiAgICAgICAgbGV0IG9ic2NlbmVseU9wZW4gPSBmYWxzZTsgLy8gVE9ETzogR3JhYiBmcm9tIHNleEhvbGUgb3Blbm5lc3MuXHJcblxyXG4gICAgICAgIHNsdXQgKz0gb2JzY2VuZWx5T3BlbiA/IDI1IDogMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNsdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShcIllvdXIgXCIpO1xyXG4gICAgICAgIGxldCBoYWlybGVzcyA9IHRoaXMuZ2VuZGVyVmFsdWUgPj0gODA7XHJcbiAgICAgICAgbGV0IHNtYWxsQ2xpdCA9IHRoaXMuZ2VuZGVyVmFsdWUgPj0gNTU7XHJcbiAgICAgICAgbGV0IGlubmllID0gdGhpcy5nZW5kZXJWYWx1ZSA+IDcwO1xyXG4gICAgICAgIGxldCBvYnNjZW5lbHlPcGVuID0gZmFsc2U7IC8vIFRPRE86IEdyYWIgZnJvbSBzZXhIb2xlIG9wZW5uZXNzLlxyXG5cclxuICAgICAgICBpZiAoaGFpcmxlc3MpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcImhhaXJsZXNzIFwiLCBTYXkuUFVTU1kpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCJoYWlyeSBcIiwgU2F5LlBVU1NZKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCIgXCIpO1xyXG5cclxuICAgICAgICBpZiAoaW5uaWUpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcImlzIHVzdWFsbHkgY29tcGxldGVseSBjb3ZlcmVkIGJ5IGl0cyBsaXBzXCIpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcImhhcyBzb21lIGN1cnRhaW5zIGVzY2FwaW5nIGl0cyBsaXBzXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNtYWxsQ2xpdCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIGFuZCBoYXMgYW4gb3ZlcnNpemVkIGNsaXRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzYXkuYWRkKFwiLlwiKTtcclxuXHJcbiAgICAgICAgaWYgKG9ic2NlbmVseU9wZW4pIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIiBJdCBpcyBjdXJyZW50bHkgc3RyZXRjaGVkIG9wZW4gb2JzY2VuZWx5LlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzYXk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFycmFuZ2VHZW5kZXJWYWx1ZSAoZ3YgOiBudW1iZXIpIHtcclxuICAgICAgICAvLyBQdXNzaWVzIHJhbmdlIGZyb20gNTAgdG8gMTAwIG9ubHkuXHJcbiAgICAgICAgZ3YgPSAoZ3YgLyAyKSArIDUwO1xyXG4gICAgICAgIHRoaXMuZ2VuZGVyVmFsdWUgPSBndjtcclxuICAgICAgICAoPEh1bWFub2lkPiB0aGlzLmdldFBhcnRPbmUoKSkuaW52YWxpZGF0ZUNhY2hlcygpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldFN5bm9ueW0gKCkge1xyXG4gICAgICAgIC8vIFRPRE86IEFkZCBtb3JlIHdoZW4gY3JlYXRpdmUuXHJcbiAgICAgICAgbGV0IGNvY2tOYW1lcyA9IFtcclxuICAgICAgICAgICAgXCJwdXNzeVwiLFxyXG4gICAgICAgICAgICBcIndvbWFuaG9vZFwiXHJcbiAgICAgICAgXTtcclxuICAgICAgICByZXR1cm4gKG5ldyBPbmVPZihPbmVPZi5QVVJFTFlfQVRfUkFORE9NLCAuLi5jb2NrTmFtZXMpLmdldE9uZSgpKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9Cb2R5cGFydC50c1wiIC8+XHJcbmNsYXNzIEh1bWFub2lkVG9yc28gZXh0ZW5kcyBCb2R5cGFydCB7XHJcbiAgICAvLyBUaGlzIG9uZSBpcyBtb3N0bHkgdXNlZCBmb3Igc29yZW5lc3MuIEl0J3MgdGhlIGRlZmF1bHQgYXR0YWNrIHRhcmdldC5cclxuXHJcbiAgICBwdWJsaWMgZ2VuZGVyV2VpZ2h0IDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzV2VpZ2h0IDogbnVtYmVyID0gMDtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZEFybXMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRCcmVhc3RzLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkh1bWFub2lkL0h1bWFub2lkQnV0dC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZEV4dHJlbWl0eS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZEZlZXQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRIYW5kcy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZEhlYWQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRQZW5pcy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJIdW1hbm9pZC9IdW1hbm9pZFNraW4udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRUZXN0aWNsZXMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRWYWdpbmEudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiSHVtYW5vaWQvSHVtYW5vaWRUb3Jzby50c1wiIC8+XHJcblxyXG5cclxuLy8gVE9ETzogQWRkIG5lY2sgaWYgdGhlcmUncyBhIHBvaW50IHRvIGl0IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5nLnRzXCIgLz5cclxuaW50ZXJmYWNlIENsb3RoaW5nT3B0aW9ucyBleHRlbmRzIFRoaW5nT3B0aW9ucyB7XHJcbiAgICB0b3BEZXNjcmlwdGlvbj8gOiBTYXk7XHJcbiAgICBib3R0b21EZXNjcmlwdGlvbj8gOiBTYXk7XHJcbiAgICBmZWV0RGVzY3JpcHRpb24/IDogU2F5O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ2xvdGhpbmdXZWFyZXJWYWx1ZSB7XHJcbiAgICB3ZWlnaHQgOiBudW1iZXI7XHJcbiAgICB2YWx1ZSA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgQ2xvdGhpbmcgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgc2xvdHMgOiBBcnJheTxudW1iZXI+ID0gW107XHJcbiAgICBwdWJsaWMgdHJhbnNwYXJlbnRTbG90cyA6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgIHB1YmxpYyBsYXllciA6IG51bWJlciA9IENsb3RoaW5nLkxBWUVSX01FRElVTTtcclxuICAgIHB1YmxpYyBpc1Zpc2libGUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyB2aXNpYmxlT24gOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgLy8gUGFkZGluZzogZ2V0cyBhZGRlZCB0byBjdXJyZW50IHNpemUuIENhbiBiZSBuZWdhdGl2ZVxyXG4gICAgLy8gbWF4OiBJZiBjdXJyZW50IHNpemUgPiBtYXgsIGN1cnJlbnQgc2l6ZSA9IG1heC4gT24gLTEgdGhpcyBpcyBub3QgY29uc2lkZXJlZC5cclxuICAgIC8vIHRpZ2h0OiBJZiBjdXJyZW50IHNpemUgPiB0aWdodCwgcGVyc29uIGJlY29tZXMgdGlnaHQuIE9uIC0xIHRoaXMgaXMgbm90IGNvbnNpZGVyZWQuXHJcbiAgICAvLyBsb29zZTogaWYgY3VycmVudCBzaXplIDwgbG9vc2UsIHBlcnNvbiBiZWNvbWVzIGxvb3NlIC0gY2FuIGJlIG92ZXJyaWRlbiBieSBjb3ZlcmluZyBjbG90aGVzXHJcbiAgICAvLyBJZiBzb21ldGhpbmcgaXMgbm90IHVzZWQsIGxlYXZlIGFzIHVuZGVmaW5lZFxyXG4gICAgLy8gV291bGQgYmUgZnVuIHRvIG1ha2UgdGhlbSBidXJzdCBpZiB0b28gbXVjaCBvdmVyIG1heCwgYnV0IHRoYXQncyBub3QgZ29pbmcgdG8gYmUgdXNlZCByaWdodCBub3dcclxuICAgIHB1YmxpYyBicmVhc3RQYWRkaW5nIDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBtYXhCcmVhc3RTaXplIDogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgdGlnaHRCcmVhc3RTaXplIDogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgbG9vc2VCcmVhc3RTaXplIDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAvLyBQYWRkaW5nOiBnZXRzIGFkZGVkIHRvIGN1cnJlbnQgc2l6ZS4gQ2FuIGJlIG5lZ2F0aXZlXHJcbiAgICAvLyBtYXg6IElmIGN1cnJlbnQgc2l6ZSA+IG1heCwgY3VycmVudCBzaXplID0gbWF4LiBPbiAtMSB0aGlzIGlzIG5vdCBjb25zaWRlcmVkLlxyXG4gICAgLy8gdGlnaHQ6IElmIGN1cnJlbnQgc2l6ZSA+IHRpZ2h0LCBwZXJzb24gYmVjb21lcyB0aWdodC4gT24gLTEgdGhpcyBpcyBub3QgY29uc2lkZXJlZC5cclxuICAgIC8vIGxvb3NlOiBpZiBjdXJyZW50IHNpemUgPCBsb29zZSwgcGVyc29uIGJlY29tZXMgbG9vc2UgLSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGNvdmVyaW5nIGNsb3RoZXNcclxuICAgIC8vIElmIHNvbWV0aGluZyBpcyBub3QgdXNlZCwgbGVhdmUgYXMgdW5kZWZpbmVkXHJcbiAgICAvLyBXb3VsZCBiZSBmdW4gdG8gbWFrZSB0aGVtIGJ1cnN0IGlmIHRvbyBtdWNoIG92ZXIgbWF4LCBidXQgdGhhdCdzIG5vdCBnb2luZyB0byBiZSB1c2VkIHJpZ2h0IG5vd1xyXG4gICAgcHVibGljIGNyb3RjaFBhZGRpbmcgOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG1heENyb3RjaFNpemUgOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyB0aWdodENyb3RjaFNpemUgOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBsb29zZUNyb3RjaFNpemUgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIFBhZGRpbmc6IGdldHMgYWRkZWQgdG8gY3VycmVudCBzaXplLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgIC8vIG1heDogSWYgY3VycmVudCBzaXplID4gbWF4LCBjdXJyZW50IHNpemUgPSBtYXguIE9uIC0xIHRoaXMgaXMgbm90IGNvbnNpZGVyZWQuXHJcbiAgICAvLyB0aWdodDogSWYgY3VycmVudCBzaXplID4gdGlnaHQsIHBlcnNvbiBiZWNvbWVzIHRpZ2h0LiBPbiAtMSB0aGlzIGlzIG5vdCBjb25zaWRlcmVkLlxyXG4gICAgLy8gbG9vc2U6IGlmIGN1cnJlbnQgc2l6ZSA8IGxvb3NlLCBwZXJzb24gYmVjb21lcyBsb29zZSAtIGNhbiBiZSBvdmVycmlkZW4gYnkgY292ZXJpbmcgY2xvdGhlc1xyXG4gICAgLy8gSWYgc29tZXRoaW5nIGlzIG5vdCB1c2VkLCBsZWF2ZSBhcyB1bmRlZmluZWRcclxuICAgIC8vIFdvdWxkIGJlIGZ1biB0byBtYWtlIHRoZW0gYnVyc3QgaWYgdG9vIG11Y2ggb3ZlciBtYXgsIGJ1dCB0aGF0J3Mgbm90IGdvaW5nIHRvIGJlIHVzZWQgcmlnaHQgbm93XHJcbiAgICBwdWJsaWMgYnV0dFBhZGRpbmcgOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG1heEJ1dHRTaXplIDogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgdGlnaHRCdXR0U2l6ZSA6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIGxvb3NlQnV0dFNpemUgOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhbnkgdGltZSBhbnl0aGluZyBjb3VsZCBjaGFuZ2UgY2xvdGhpbmcgb24gYSBwZXJzb24uXHJcbiAgICAgKiBSaXBwZWQgYSBjbG90aGluZz8gVXBkYXRlIGFsbCBjbG90aGVzLlxyXG4gICAgICogQ2hhbmdlZCBicmVhc3Qgc2l6ZT8gVXBkYXRlIGFsbCBjbG90aGVzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlU3RhdHVzICgpIHtcclxuICAgICAgICB0aGlzLnZpc2libGVPbiA9IFtdO1xyXG4gICAgICAgIHRoaXMudmlzaWJsZU9uLnB1c2goLi4udGhpcy5zbG90cyk7XHJcbiAgICAgICAgbGV0IHdlYXJlciA9IFRoaW5nLldlYXJSZWxhdGlvbi5nZXRMZWZ0KHRoaXMpO1xyXG4gICAgICAgIGlmICh3ZWFyZXIgPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBjbG90aHMgPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQod2VhcmVyKTtcclxuICAgICAgICBsZXQgY292ZXJlZFNsb3RzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG90aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHdvcm4gPSBjbG90aHNbaV07XHJcbiAgICAgICAgICAgIGlmICgod29ybiAhPSB0aGlzKSAmJiB3b3JuLmxheWVyID4gdGhpcy5sYXllcikge1xyXG4gICAgICAgICAgICAgICAgY292ZXJlZFNsb3RzLnB1c2goLi4ud29ybi5nZXRDb3ZlcmluZ1Nsb3RzKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnZpc2libGVPbiA9IHRoaXMudmlzaWJsZU9uLmZpbHRlcih2aXNpYmxlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvdmVyZWRTbG90cy5pbmRleE9mKHZpc2libGUpID09IC0xO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IHRoaXMudmlzaWJsZU9uLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvdmVyaW5nU2xvdHMgKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zcGFyZW50U2xvdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2xvdHMuc2xpY2UoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zbG90cy5maWx0ZXIoKHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwYXJlbnRTbG90cy5pbmRleE9mKHZhbHVlKSA9PSAtMTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIExBWUVSX0xPV0VTVCA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIExBWUVSX0xPVyA9IDU7XHJcbiAgICBwdWJsaWMgc3RhdGljIExBWUVSX01FRElVTSA9IDEwO1xyXG4gICAgcHVibGljIHN0YXRpYyBMQVlFUl9ISUdIID0gMTU7XHJcbiAgICBwdWJsaWMgc3RhdGljIExBWUVSX0hJR0hFU1QgPSAyMDtcclxuXHJcbiAgICBwdWJsaWMgZ2VuZGVyVmFsdWUgOiBudW1iZXIgPSA1MDtcclxuICAgIHB1YmxpYyBzbHV0dGluZXNzVmFsdWUgOiBudW1iZXIgPSA0MDtcclxuXHJcbiAgICBwdWJsaWMgZ2V0R2VuZGVyV2VpZ2h0ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlT24ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRHZW5kZXJWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZGVyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3NXZWlnaHQgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVPbi5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNsdXR0aW5lc3NWYWx1ZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2x1dHRpbmVzc1ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0R2VuZGVyVmFsdWVPbiAocCA6IFRoaW5nKSA6IENsb3RoaW5nV2VhcmVyVmFsdWUge1xyXG4gICAgICAgIGxldCB3ZWlnaHQgPSAwO1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XHJcbiAgICAgICAgbGV0IGNsb3RoZXMgPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHQocCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG90aGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHdlaWdodCArPSBjbG90aGVzW2ldLmdldEdlbmRlcldlaWdodCgpO1xyXG4gICAgICAgICAgICB2YWx1ZSArPSBjbG90aGVzW2ldLmdldEdlbmRlcldlaWdodCgpICogY2xvdGhlc1tpXS5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3ZWlnaHQgOiB3ZWlnaHQsXHJcbiAgICAgICAgICAgIHZhbHVlIDogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2x1dHRpbmVzc1ZhbHVlT24gKHAgOiBUaGluZykgOiBDbG90aGluZ1dlYXJlclZhbHVlIHtcclxuICAgICAgICBsZXQgd2VpZ2h0ID0gMDtcclxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xyXG4gICAgICAgIGxldCBjbG90aGVzID0gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHApO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvdGhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB3ZWlnaHQgKz0gY2xvdGhlc1tpXS5nZXRTbHV0dGluZXNzV2VpZ2h0KCk7XHJcbiAgICAgICAgICAgIHZhbHVlICs9IGNsb3RoZXNbaV0uZ2V0U2x1dHRpbmVzc1dlaWdodCgpICogY2xvdGhlc1tpXS5nZXRTbHV0dGluZXNzVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2VpZ2h0IDogd2VpZ2h0LFxyXG4gICAgICAgICAgICB2YWx1ZSA6IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmdzL0Nsb3RoaW5nLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUJvbGQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzXCIgLz5cclxuXHJcbmNsYXNzIEFjdGlvblJlbW92ZSBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrOiBSdWxlYm9vazxBY3Rpb25SZW1vdmU+ID0gbmV3IFJ1bGVib29rKFwiQ2hlY2sgUmVtb3ZpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5OiBSdWxlYm9vazxBY3Rpb25SZW1vdmU+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFJlbW92aW5nXCIpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcGxheWVyIHdpbGwgZG8gaWYgaGUgZG9lcyB0aGlzIGFjdGlvbi5cclxuICAgICAqIEZvciBpbnN0YW5jZSwgQWN0aW9uVGFraW5nIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGxpa2UgcmV0dXJuIFwidGFrZSBcIiArIHRoaXMubm91bnNbMF0uZ2V0TmFtZSgpLFxyXG4gICAgICogICB3aGljaCB3b3VsZCByZWFkIGFzIFwidGFrZSB0aGluZ1wiLlxyXG4gICAgICogICByZW1lbWJlciB0aGF0IHRoaW5ncyBpbXBsZW1lbnQgUFJJTlRBQkxFIGludGVyZmFjZSwgc28geW91IGNhbiBnZXQgdGhlaXIgbmFtZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7U2F5fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcInRha2Ugb2ZmIFwiICsgKHRoaXMuZ2V0Tm91bigwKSAhPSB1bmRlZmluZWQgPyB0aGlzLmdldE5vdW4oMCkuZ2V0UHJpbnRlZE5hbWUoKSA6IFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDbG90aGluZyAoKSA6IENsb3RoaW5ne1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vdW4oMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0lzV2VhcmFibGUgPSBBY3Rpb25SZW1vdmUuY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgbm91biBhIGNsb3RoaW5nXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvblJlbW92ZT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IGFjdGlvbi5nZXRDbG90aGluZygpO1xyXG4gICAgICAgICAgICBpZiAoIShub3VuIGluc3RhbmNlb2YgQ2xvdGhpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgY2FuIG9ubHkgcmVtb3ZlIENsb3RoaW5nLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tJc0hlbGQgPSBBY3Rpb25SZW1vdmUuY2hlY2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSXMgbm91biB3b3JuXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBjb2RlIDogYXN5bmMgKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvblJlbW92ZT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IGFjdGlvbi5nZXRDbG90aGluZygpO1xyXG4gICAgICAgICAgICBpZiAoIVRoaW5nLldlYXJSZWxhdGlvbi5pc1JpZ2h0KGFjdGlvbi5hY3Rvciwgbm91bikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uYWN0b3IgPT0gV29ybGRTdGF0ZS5wbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChcIllvdSBhcmUgbm90IHdlYXJpbmcgaXQuXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeURlZmF1bHQgPSBBY3Rpb25SZW1vdmUuY2FycnkuY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiU2V0IENsb3RoaW5nIGFzIENhcnJpZWRcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25SZW1vdmU+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgVGhpbmcuQ2FycnlSZWxhdGlvbi5zZXRSZWxhdGlvbihhY3Rpb24uYWN0b3IsIG5vdW4pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheUJvbGQodGhpbmcsIFwiOiBcIiksIFwiUmVtb3ZlZC5cIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5VGhlKCksIGFjdG9yLCBcIiB0YWtlcyBvZmYgXCIsIG5ldyBTYXlUaGUoKSwgdGhpbmcsIFwiLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBIeXBlcmxpbmtpbmdcclxuICovXHJcbkVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuSHlwZXJsaW5raW5nUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZShcclxuICAgIHtcclxuICAgICAgICBuYW1lIDogXCJIeXBlcmxpbmsgLSBSZW1vdmVcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxUaGluZz4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gPFRoaW5nPiBydWxlYm9vay5ub3VuO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgQ2xvdGhpbmcgJiYgKFRoaW5nLldlYXJSZWxhdGlvbi5pc1JpZ2h0KFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZEF2YWlsYWJsZUFjdGlvbihcIlJlbW92ZVwiLCBuZXcgQWN0aW9uUmVtb3ZlKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTtcclxuXHJcbi8qKlxyXG4gSW52ZW50b3J5XHJcbiAqL1xyXG5FbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLkxpbmtpbmdUaGluZy5hZGRSdWxlKG5ldyBSdWxlKFxyXG4gICAge1xyXG4gICAgICAgIG5hbWUgOiBcIkludmVudG9yeSAtIFJlbW92ZVwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENsb3RoaW5nICYmIChUaGluZy5XZWFyUmVsYXRpb24uaXNSaWdodChXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKSkge1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci5wcmludFRoaW5nTGluayhcIlJcIiwgbmV3IEFjdGlvblJlbW92ZShXb3JsZFN0YXRlLnBsYXllciwgdGhpbmcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1RoaW5ncy9DbG90aGluZy50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlYm9vay50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9DbGFzc2VzL1NheS9TYXlCb2xkLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcblxyXG5jbGFzcyBBY3Rpb25XZWFyIGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2s6IFJ1bGVib29rPEFjdGlvbldlYXI+ID0gbmV3IFJ1bGVib29rKFwiQ2hlY2sgV2VhcmluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2Fycnk6IFJ1bGVib29rPEFjdGlvbldlYXI+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFdlYXJpbmdcIik7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtTYXl9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwid2VhciBcIiArICh0aGlzLmdldE5vdW4oMCkgIT0gdW5kZWZpbmVkID8gdGhpcy5nZXROb3VuKDApLmdldFByaW50ZWROYW1lKCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2xvdGhpbmcgKCkgOiBDbG90aGluZ3tcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXROb3VuKDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tJc1dlYXJhYmxlID0gQWN0aW9uV2Vhci5jaGVjay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJJcyBub3VuIGEgY2xvdGhpbmdcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uV2Vhcj4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IGFjdGlvbi5nZXRDbG90aGluZygpO1xyXG4gICAgICAgICAgICBpZiAoIShub3VuIGluc3RhbmNlb2YgQ2xvdGhpbmcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgY2FuIG9ubHkgd2VhciBDbG90aGluZy5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrSXNIZWxkID0gQWN0aW9uV2Vhci5jaGVjay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJJcyBub3VuIGhlbGRcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyAocnVubmVyIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uV2Vhcj4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgbm91biA9IGFjdGlvbi5nZXRDbG90aGluZygpO1xyXG4gICAgICAgICAgICBpZiAoIVRoaW5nLkNhcnJ5UmVsYXRpb24uaXNSaWdodChhY3Rpb24uYWN0b3IsIG5vdW4pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCIoZmlyc3QgdGFraW5nIHRoZSBcIiwgbm91biwgXCIpXCIsIFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCB0YWtpbmdBY3Rpb24gPSBuZXcgQWN0aW9uVGFrZShhY3Rpb24uYWN0b3IsIG5vdW4pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGFraW5nQWN0aW9uLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKHRha2luZ0FjdGlvbi5zYXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFUaGluZy5DYXJyeVJlbGF0aW9uLmlzUmlnaHQoYWN0aW9uLmFjdG9yLCBub3VuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnlEZWZhdWx0ID0gQWN0aW9uV2Vhci5jYXJyeS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJTZXQgQ2xvdGhpbmcgYXMgV29yblwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTSxcclxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvbldlYXI+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IG5vdW4gPSBhY3Rpb24uZ2V0Q2xvdGhpbmcoKTtcclxuICAgICAgICAgICAgVGhpbmcuV2VhclJlbGF0aW9uLnNldFJlbGF0aW9uKGFjdGlvbi5hY3Rvciwgbm91bik7XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZChuZXcgU2F5Qm9sZCh0aGluZywgXCI6IFwiKSwgXCJXb3JuLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKG5ldyBTYXlUaGUoKSwgYWN0b3IsIFwiIHB1dHMgb24gXCIsIG5ldyBTYXlUaGUoKSwgdGhpbmcsIFwiLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogSHlwZXJsaW5raW5nXHJcbiAqL1xyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkh5cGVybGlua2luZ1J1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSHlwZXJsaW5rIC0gV2VhclwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPFRoaW5nPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSA8VGhpbmc+IHJ1bGVib29rLm5vdW47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBDbG90aGluZyAmJiAhKFRoaW5nLldlYXJSZWxhdGlvbi5pc1JpZ2h0KFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZEF2YWlsYWJsZUFjdGlvbihcIldlYXJcIiwgbmV3IEFjdGlvbldlYXIoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbikpO1xyXG5cclxuLyoqXHJcbiBJbnZlbnRvcnlcclxuICovXHJcbkVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIuTGlua2luZ1RoaW5nLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSW52ZW50b3J5IC0gV2VhclwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIENsb3RoaW5nICYmICEoVGhpbmcuV2VhclJlbGF0aW9uLmlzUmlnaHQoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSkpIHtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIucHJpbnRUaGluZ0xpbmsoXCJXXCIsIG5ldyBBY3Rpb25XZWFyKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUGVyc29uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0JvZHlwYXJ0L0h1bWFub2lkUGFydHMudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vQWN0aW9uL0FjdGlvblJlbW92ZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9BY3Rpb24vQWN0aW9uV2Vhci50c1wiIC8+XHJcbi8vIFRPRE8gOiBJbXBsZW1lbnRzIExpcXVpZENvbnRhaW5lciBmb3IgTWlsayB1ZGRlcnMuIE1heWJlIHByb3N0YXRlcy5cclxuXHJcbmludGVyZmFjZSBIdW1hbm9pZE9wdGlvbnMgZXh0ZW5kcyBUaGluZ09wdGlvbnMge1xyXG4gICAgaXNNYWxlIDogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIEh1bWFub2lkR2VuZGVyIHtcclxuICAgIGhhc1BlbmlzIDogYm9vbGVhbjtcclxuICAgIGhhc1BlbmlzQnVsZ2UgOiBib29sZWFuO1xyXG4gICAgaGFzVmFnaW5hIDogYm9vbGVhbjtcclxuICAgIGhhc1RpdHMgOiBib29sZWFuO1xyXG4gICAgZ2VuZGVyVmFsdWUgOiBudW1iZXI7IC8vIE9ubHkgaW5jbHVkZXMgY2xvdGhpbmcgYW5kIGJvZHlwYXJ0cywgZ29vZCBtZWFzdXJlIGZvciBiaXNleHVhbCBOUENzXHJcbiAgICBnZW5kZXJWYWx1ZUNvcnJlY3RlZCA6IG51bWJlcjsgLy8gSW5jbHVkZXMgc2V4dWFsIGNoYXJhY3RlcmlzdGljcyBiZWluZyB2aXNpYmxlOiBicmVhc3Qgc2l6ZSBleGlzdGluZywgYSBjcm90Y2ggYnVsZ2UsIGV0Yy4gSGVhdmlseSBhbHRlcmVkIGJ5IGEgcGVuaXMvdmFnaW5hIGJlaW5nIG91dCBpbiB0aGUgb3BlblxyXG59XHJcblxyXG5pbnRlcmZhY2UgSHVtYW5vaWRTbHV0dGluZXNzIHtcclxuICAgIGhhbGZOYWtlZCA6IGJvb2xlYW47XHJcbiAgICBuYWtlZCA6IGJvb2xlYW47XHJcbiAgICBzbHV0dGluZXNzIDogbnVtYmVyOyAvLyBPbmx5IGluY2x1ZGVzIGNsb3RoaW5nXHJcbiAgICBzbHV0dGluZXNzQ29ycmVjdGVkIDogbnVtYmVyOyAvLyBJbmNsdWRlcyBtYW5uZXJpc21zIGNhdXNlZCBieSBwZXJzb25hbGl0eVxyXG59XHJcblxyXG5pbnRlcmZhY2UgSHVtYW5vaWRCdWxnZXMge1xyXG4gICAgYnJlYXN0cyA6IG51bWJlcjtcclxuICAgIGNyb3RjaCA6IG51bWJlcjtcclxuICAgIGJ1dHQgOiBudW1iZXI7XHJcbiAgICB3YWlzdCA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgSHVtYW5vaWQgZXh0ZW5kcyBQZXJzb24ge1xyXG4gICAgcHVibGljIHN0YXRpYyBTRVhfTUFMRSA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNFWF9GRU1BTEUgPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBTRVhfSEVSTSA9IDI7XHJcblxyXG4gICAgcHVibGljIGJyZWFzdFZpc2libGVTaXplID0gMDtcclxuICAgIHB1YmxpYyBpc0JyZWFzdFZpc2libGUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpc0JyZWFzdFRpZ2h0ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNCcmVhc3RMb29zZSA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjcm90Y2hWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICBwdWJsaWMgaXNDcm90Y2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNDcm90Y2hUaWdodCA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBidXR0VmlzaWJsZVNpemUgPSAwO1xyXG4gICAgcHVibGljIGlzQnV0dFZpc2libGUgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpc0J1dHRUaWdodCA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBpc0dlbmRlckNhY2hlZCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpc1NsdXR0aW5lc3NDYWNoZWQgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY2FjaGVkR2VuZGVyVmFsdWUgOiBIdW1hbm9pZEdlbmRlcjtcclxuICAgIHB1YmxpYyBjYWNoZWRTbHV0dGluZXNzIDogSHVtYW5vaWRTbHV0dGluZXNzO1xyXG4gICAgcHVibGljIGNhY2hlZEJ1bGdlcyA6IEh1bWFub2lkQnVsZ2VzO1xyXG5cclxuICAgIHB1YmxpYyB1bmNvdmVyZWRTbG90cyA6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgaW52YWxpZGF0ZUNhY2hlcyAoKSB7XHJcbiAgICAgICAgdGhpcy5pc0dlbmRlckNhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNTbHV0dGluZXNzQ2FjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEdlbmRlclZhbHVlICgpIDogSHVtYW5vaWRHZW5kZXIge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1NsdXR0aW5lc3NDYWNoZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEdlbmRlclZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTbHV0dGluZXNzICgpIDogSHVtYW5vaWRTbHV0dGluZXNzIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNTbHV0dGluZXNzQ2FjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRTbHV0dGluZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRCdWxnZXMgKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0dlbmRlckNhY2hlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRCdWxnZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUNhY2hlcyAoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDbG90aGluZygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2xvdHMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUJvZHlwYXJ0cygpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQnVsZ2VzKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2x1dHRpbmVzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTbG90cyAoKSB7XHJcbiAgICAgICAgdGhpcy51bmNvdmVyZWRTbG90cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UOyBpKyspIHsgdGhpcy51bmNvdmVyZWRTbG90cy5wdXNoKGkpOyB9XHJcblxyXG4gICAgICAgIGxldCBjbG90aGluZyA9IDxBcnJheTxDbG90aGluZz4+VGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0VHlwZSh0aGlzLCBDbG90aGluZyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbG90aGluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgY292ZXJpbmcgPSBjbG90aGluZ1tpXS5nZXRDb3ZlcmluZ1Nsb3RzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY292ZXJpbmcubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBpZHggPSB0aGlzLnVuY292ZXJlZFNsb3RzLmluZGV4T2YoY292ZXJpbmdba10pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmNvdmVyZWRTbG90cy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudW5jb3ZlcmVkU2xvdHMubGVuZ3RoID09IDApIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlR2VuZGVyVmFsdWUgKCkge1xyXG4gICAgICAgIGxldCBjbG90aGluZ0dlbmRlciA9IENsb3RoaW5nLmdldEdlbmRlclZhbHVlT24odGhpcyk7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0R2VuZGVyID0gQm9keXBhcnQuZ2V0R2VuZGVyVmFsdWVPbih0aGlzKTtcclxuXHJcbiAgICAgICAgbGV0IGdlbmRlcldlaWdodCA9IGNsb3RoaW5nR2VuZGVyLndlaWdodCArIGJvZHlwYXJ0R2VuZGVyLndlaWdodDtcclxuICAgICAgICBsZXQgZ2VuZGVyVmFsdWUgPSBjbG90aGluZ0dlbmRlci52YWx1ZSArIGJvZHlwYXJ0R2VuZGVyLnZhbHVlO1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uV2VpZ2h0ID0gQm9keXBhcnQuV0VJR0hUX0hJR0hFU1Q7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb25WYWx1ZSA9IHRoaXMuZ2V0U3RhdChBdHRyaWJ1dGVzLkdlbmRlcklkZW50aXR5KSAqIEJvZHlwYXJ0LldFSUdIVF9ISUdIRVNUOyAvLyBHZW5kZXIgSWRlbnRpdHkgaGFzIHdlaWdodCBmb3IgR2VuZGVyIFZhbHVlLiBJdCBpbmNsdWRlcyB0aGluZ3Mgc3VjaCBhcyBpbnRvbmF0aW9uIGFuZCBtYW5uZWlyaXNtcywgc28gaXQgY291bnRzLlxyXG5cclxuICAgICAgICBsZXQgaGFzUGVuaXMgOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGhhc1ZhZ2luYSA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5pc0Nyb3RjaFZpc2libGUpIHtcclxuICAgICAgICAgICAgLy8gRG9lcyB0aGlzIGhhdmUgYSB2YWdpbmEgb3Igbm90PyBJdCdzIHZpc2libGUsIHNvIGl0IGFmZmVjdHMgT0JWSU9VU0xZIE1BTEUvRkVNQUxFXHJcbiAgICAgICAgICAgIGlmIChUaGluZy5QYXJ0UmVsYXRpb24uZ2V0UmlnaHRUeXBlT25lKHRoaXMsIEh1bWFub2lkUGVuaXMpICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaGFzUGVuaXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaGFzVmFnaW5hID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gMCAqIEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uV2VpZ2h0ICs9IEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZSh0aGlzLCBIdW1hbm9pZFZhZ2luYSkgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNQZW5pcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaGFzVmFnaW5hID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25WYWx1ZSArPSAxMDAgKiBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgY29ycmVjdGlvblZhbHVlICs9IDEwMCAqIEJvZHlwYXJ0LldFSUdIVF9MT1dFU1Q7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb25XZWlnaHQgKz0gQm9keXBhcnQuV0VJR0hUX0xPV0VTVDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNyb3RjaFZpc2libGVTaXplID4gMCAmJiAhaGFzVmFnaW5hKSB7XHJcbiAgICAgICAgICAgIGNvcnJlY3Rpb25WYWx1ZSArPSAwICogQm9keXBhcnQuV0VJR0hUX0xPV0VTVDtcclxuICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSBCb2R5cGFydC5XRUlHSFRfTE9XRVNUO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGdlbmRlclZhbHVlRmluYWwgPSBnZW5kZXJWYWx1ZSAvIGdlbmRlcldlaWdodDtcclxuICAgICAgICBsZXQgZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPSAoZ2VuZGVyVmFsdWUgKyBjb3JyZWN0aW9uVmFsdWUpIC8gKGdlbmRlcldlaWdodCArIGNvcnJlY3Rpb25XZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLmNhY2hlZEdlbmRlclZhbHVlID0ge1xyXG4gICAgICAgICAgICBoYXNUaXRzIDogdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA+IDEsIC8vIGlnbm9yZSBtaWNyb3RpdHNcclxuICAgICAgICAgICAgaGFzUGVuaXNCdWxnZSA6IHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgPiAwICYmICFoYXNWYWdpbmEsIC8vc2FmZSBndWFyZCBhZ2FpbnN0IHB1ZmZ5IHZhZ2luYXMgaWYgdGhleSBldmVyIGNvbWUgdXBcclxuICAgICAgICAgICAgaGFzUGVuaXMgOiBoYXNQZW5pcyxcclxuICAgICAgICAgICAgaGFzVmFnaW5hIDogaGFzVmFnaW5hLFxyXG4gICAgICAgICAgICBnZW5kZXJWYWx1ZSA6IGdlbmRlclZhbHVlRmluYWwsXHJcbiAgICAgICAgICAgIGdlbmRlclZhbHVlQ29ycmVjdGVkIDogZ2VuZGVyVmFsdWVDb3JyZWN0ZWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaXNHZW5kZXJDYWNoZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1Zpc2libGVPbiAoc2xvdCA6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVuY292ZXJlZFNsb3RzLmluZGV4T2Yoc2xvdCkgIT0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLyogVE9ETzogVGhpcyB3aWxsIHN1Y2suIEdvYWxzOiBTbHV0dGluZXNzIG9mIGEgbmFrZWQgbm9ybWFsIHBlcnNvbiBzaG91bGQgYmUgYmV0d2VlbiA0NS01MC5cclxuICAgICAqICAgICAgICBBIG5ha2VkIHBlcnNvbiBzaG91bGQgbWF4IG91dCBhdCBhcm91bmQgODAgd2l0aCBURVJSSUJMRSBob2xlcy4gU28gc29tZSBjbG90aGluZyBpcyBzbHV0dGllciB0aGFuIGJlaW5nIG91dHJpZ2h0IG5ha2VkLCBhbmQgYmVpbmcgbmFrZWQgaXMgbm90IHRoYXQgc2x1dHR5IHVubGVzcyB5b3UncmUgZnVja2VkIHVwLlxyXG4gICAgICogICAgICAgIEJlaW5nIG1vc3RseSBjb3ZlcmVkIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBnZW5pdGFscyBzaG91bGQgYmUgc2VlbiBhcyB3b3JzZSB0aGFuIGJlaW5nIG5ha2UtZGVyIGFzIHdlbGwuIE1pZ2h0IGp1c3QgbGVhdmUgdGhhdCBmb3IgdGhlIG91dGZpdHMsIHRob3VnaC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVNsdXR0aW5lc3MgKCkge1xyXG4gICAgICAgIC8vIFRPRE86IE1heWJlIHVzZSB0aGVzZS5cclxuICAgICAgICAvLyBsZXQgbmFrZWRCcmVha3BvaW50ID0gMC4zO1xyXG4gICAgICAgIC8vIGxldCBoYWxmbmFrZWRCcmVha3BvaW50ID0gMC41O1xyXG4gICAgICAgIGxldCBjbG90aGluZ1NsdXR0aW5lc3MgPSBDbG90aGluZy5nZXRTbHV0dGluZXNzVmFsdWVPbih0aGlzKTtcclxuICAgICAgICBsZXQgYm9keXBhcnRTbHV0dGluZXNzID0gQm9keXBhcnQuZ2V0U2x1dHRpbmVzc1ZhbHVlT24odGhpcyk7XHJcblxyXG4gICAgICAgIGxldCBzbHV0dGluZXNzV2VpZ2h0ID0gY2xvdGhpbmdTbHV0dGluZXNzLndlaWdodCArIGJvZHlwYXJ0U2x1dHRpbmVzcy53ZWlnaHQ7XHJcbiAgICAgICAgbGV0IHNsdXR0aW5lc3NWYWx1ZSA9IGNsb3RoaW5nU2x1dHRpbmVzcy52YWx1ZSArIGJvZHlwYXJ0U2x1dHRpbmVzcy52YWx1ZTtcclxuXHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb25XZWlnaHQgPSAwO1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uVmFsdWUgPSAwO1xyXG5cclxuICAgICAgICBsZXQgc29tZXdoYXRTbHV0dHkgPSBbSHVtYW5vaWQuU0xPVF9NSURSSUZGLCBIdW1hbm9pZC5TTE9UX0xFR19VUFBFUiwgSHVtYW5vaWQuU0xPVF9XQUlTVCwgSHVtYW5vaWQuU0xPVF9ISVBTLCBIdW1hbm9pZC5TTE9UX0JBQ0tdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29tZXdoYXRTbHV0dHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlT24oc29tZXdoYXRTbHV0dHlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uV2VpZ2h0ICs9IDE7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gNzU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2ZXJ5U2x1dHR5ID0gW0h1bWFub2lkLlNMT1RfQlJFQVNUUywgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfRlJPTlQsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0JBQ0ssIEh1bWFub2lkLlNMT1RfQlVUVF07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ5U2x1dHR5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZU9uKHZlcnlTbHV0dHlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uV2VpZ2h0ICs9IDM7XHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVmFsdWUgKz0gNzU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpID4gMC43NSkge1xyXG4gICAgICAgICAgICBsZXQgZXh0cmVtZVNsdXR0eSA9IFtIdW1hbm9pZC5TTE9UX0JSRUFTVFMsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05ULCBIdW1hbm9pZC5TTE9UX0NST1RDSF9CQUNLLCBIdW1hbm9pZC5TTE9UX0JVVFRdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dHJlbWVTbHV0dHkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZU9uKGV4dHJlbWVTbHV0dHlbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29ycmVjdGlvbldlaWdodCArPSA1O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25WYWx1ZSArPSA4NTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhhbGZOYWtlZCA6IGJvb2xlYW47XHJcbiAgICAgICAgbGV0IG5ha2VkIDogYm9vbGVhbjtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWxlKCkpIHtcclxuICAgICAgICAgICAgaGFsZk5ha2VkID0gKHRoaXMuaXNWaXNpYmxlT24ubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKSA8IDAuNSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9CUkVBU1RTLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDS10pO1xyXG4gICAgICAgICAgICBuYWtlZCA9ICh0aGlzLmlzVmlzaWJsZU9uLmxlbmd0aCAvIEh1bWFub2lkLlNMT1RfU0xPVF9DT1VOVCkgPCAwLjMgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9CUkVBU1RTLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDSywgSHVtYW5vaWQuU0xPVF9CVVRUXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQnJlYXN0cygpKSB7XHJcbiAgICAgICAgICAgICAgICBoYWxmTmFrZWQgPSAodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpIDwgMC41ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaXNWaXNpYmxlT25BcnJheShbSHVtYW5vaWQuU0xPVF9CUkVBU1RTLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDS10pO1xyXG4gICAgICAgICAgICAgICAgbmFrZWQgPSAodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpIDwgMC4zICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Zpc2libGVPbkFycmF5KFtIdW1hbm9pZC5TTE9UX0JSRUFTVFMsIEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05ULCBIdW1hbm9pZC5TTE9UX0NST1RDSF9CQUNLLCBIdW1hbm9pZC5TTE9UX0JVVFRdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGhhbGZOYWtlZCA9ICh0aGlzLmlzVmlzaWJsZU9uLmxlbmd0aCAvIEh1bWFub2lkLlNMT1RfU0xPVF9DT1VOVCkgPCAwLjUgJiZcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc1Zpc2libGVPbkFycmF5KFtIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDS10pO1xyXG4gICAgICAgICAgICAgICAgbmFrZWQgPSAodGhpcy5pc1Zpc2libGVPbi5sZW5ndGggLyBIdW1hbm9pZC5TTE9UX1NMT1RfQ09VTlQpIDwgMC4zICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Zpc2libGVPbkFycmF5KFtIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVCwgSHVtYW5vaWQuU0xPVF9DUk9UQ0hfQkFDSywgSHVtYW5vaWQuU0xPVF9CVVRUXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzbHV0dGluZXNzVmFsdWVGaW5hbCA9IHNsdXR0aW5lc3NWYWx1ZSAvIHNsdXR0aW5lc3NXZWlnaHQ7XHJcbiAgICAgICAgbGV0IHNsdXR0aW5lc3NDb3JyZWN0ZWQgPSAoc2x1dHRpbmVzc1ZhbHVlICsgY29ycmVjdGlvblZhbHVlKSAvIChzbHV0dGluZXNzV2VpZ2h0ICsgY29ycmVjdGlvbldlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FjaGVkU2x1dHRpbmVzcyA9IHtcclxuICAgICAgICAgICAgaGFsZk5ha2VkIDogaGFsZk5ha2VkLFxyXG4gICAgICAgICAgICBuYWtlZCA6IG5ha2VkLFxyXG4gICAgICAgICAgICBzbHV0dGluZXNzIDogc2x1dHRpbmVzc1ZhbHVlRmluYWwsXHJcbiAgICAgICAgICAgIHNsdXR0aW5lc3NDb3JyZWN0ZWQgOiBzbHV0dGluZXNzQ29ycmVjdGVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmlzU2x1dHRpbmVzc0NhY2hlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzVmlzaWJsZU9uQXJyYXkgKGFyciA6IEFycmF5PG51bWJlcj4pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0wIDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlT24oYXJyW2ldKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNYWxlUGFydHMgKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc01hbGUoKSAmJiAhdGhpcy5pc0hlcm0oKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcnRzKFxyXG4gICAgICAgICAgICAgICAgbmV3IEh1bWFub2lkVGVzdGljbGVzKCksIG5ldyBIdW1hbm9pZFBlbmlzKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZEZlbWFsZVBhcnRzICgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNGZW1hbGUoKSAmJiAhdGhpcy5pc0hlcm0oKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcnRzKFxyXG4gICAgICAgICAgICAgICAgbmV3IEh1bWFub2lkVmFnaW5hKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUdlbmRlcmVkUGFydHMgKCkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUGFydHMoSHVtYW5vaWRWYWdpbmEpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUGFydHMoSHVtYW5vaWRQZW5pcyk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVQYXJ0cyhIdW1hbm9pZFRlc3RpY2xlcyk7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEdlbmRlclZhbHVlICh2YWx1ZSA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBicCA9IHRoaXMuZ2V0UGFydHMoQm9keXBhcnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGJwW2ldIGluc3RhbmNlb2YgSHVtYW5vaWRCcmVhc3RzICYmIHRoaXMuaXNNYWxlKCkpIHsgLy8gZG9uJ3QgYWRkIGJyZWFzdHMgYXV0b21hdGljYWxseSB0byBhIG1hbGUhXHJcbiAgICAgICAgICAgICAgICBicFtpXS5hcnJhbmdlR2VuZGVyVmFsdWUoMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicFtpXS5hcnJhbmdlR2VuZGVyVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBIdW1hbm9pZE9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmFkZFBhcnRzKFxyXG4gICAgICAgICAgICBuZXcgSHVtYW5vaWRTa2luKCksIG5ldyBIdW1hbm9pZEhlYWQoKSwgbmV3IEh1bWFub2lkQXJtcygpLFxyXG4gICAgICAgICAgICBuZXcgSHVtYW5vaWRIYW5kcygpLCBuZXcgSHVtYW5vaWRCcmVhc3RzKCksIG5ldyBIdW1hbm9pZEZlZXQoKSxcclxuICAgICAgICAgICAgbmV3IEh1bWFub2lkVG9yc28oKSwgbmV3IEh1bWFub2lkQnV0dCgpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNNYWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R2VuZGVyVmFsdWUoMjUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkRmVtYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRHZW5kZXJWYWx1ZSg3NSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZEdldEFsdGVyYXRpb25zKChodW1hbm9pZCA6IEh1bWFub2lkKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIExldCdzIG5vdCBkbyB0aGlzIGZvciBOUENzLiBJdCBjYW4gYnJlYWsgcGF0Y2hlcy5cclxuICAgICAgICAgICAgaWYgKGh1bWFub2lkLmlzUGxheWVyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgSHVtYW5vaWRHZW5kZXI6IGh1bWFub2lkLmlzTWFsZSgpID8gSHVtYW5vaWQuU0VYX01BTEUgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodW1hbm9pZC5pc0ZlbWFsZSgpID8gSHVtYW5vaWQuU0VYX0ZFTUFMRSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdW1hbm9pZC5TRVhfSEVSTVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkU2V0QWx0ZXJhdGlvbnMoKGh1bWFub2lkIDogSHVtYW5vaWQsIGNoYW5nZXMpID0+IHtcclxuICAgICAgICAgICAgLy8gTGV0J3Mgbm90IGRvIHRoaXMgZm9yIE5QQ3MuIEl0IGNhbiBicmVhayBwYXRjaGVzLlxyXG4gICAgICAgICAgICBpZiAoaHVtYW5vaWQuaXNQbGF5ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgaHVtYW5vaWQucmVtb3ZlR2VuZGVyZWRQYXJ0cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMuSHVtYW5vaWRHZW5kZXIgPT0gSHVtYW5vaWQuU0VYX01BTEUpIHtcclxuICAgICAgICAgICAgICAgICAgICBodW1hbm9pZC5hZGRNYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5IdW1hbm9pZEdlbmRlciA9PSBIdW1hbm9pZC5TRVhfRkVNQUxFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHVtYW5vaWQuYWRkRmVtYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaHVtYW5vaWQuYWRkTWFsZVBhcnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaHVtYW5vaWQuYWRkRmVtYWxlUGFydHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVCb2R5cGFydHMgKCkge1xyXG4gICAgICAgIGxldCBwYXJ0cyA9IDxBcnJheTxCb2R5cGFydD4+IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpcywgQm9keXBhcnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcGFydHNbaV0udXBkYXRlU3RhdHVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDbG90aGluZyAoKSB7XHJcbiAgICAgICAgbGV0IGNsb3RoZXMgPSA8QXJyYXk8Q2xvdGhpbmc+PiBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaXMsIENsb3RoaW5nKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsb3RoZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY2xvdGhlc1tpXS51cGRhdGVTdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUJ1bGdlcyAoKSB7XHJcbiAgICAgICAgbGV0IGNsb3RoZXMgPSBUaGluZy5XZWFyUmVsYXRpb24uZ2V0UmlnaHRUeXBlKHRoaXMsIENsb3RoaW5nKS5zb3J0KGZ1bmN0aW9uIChhIDogQ2xvdGhpbmcsIGIgOiBDbG90aGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5sYXllciAtIGIubGF5ZXI7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNCcmVhc3RWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzQ3JvdGNoVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0J1dHRWaXNpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IGJyYXMgPSBbXTtcclxuICAgICAgICBsZXQgYnV0dHMgPSBbXTtcclxuICAgICAgICBsZXQganVua3MgPSBbXTtcclxuXHJcbiAgICAgICAgY2xvdGhlcy5mb3JFYWNoKChjbG90aCA6IENsb3RoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNsb3RoLnVwZGF0ZVN0YXR1cygpO1xyXG4gICAgICAgICAgICBpZiAoY2xvdGguc2xvdHMuaW5kZXhPZihIdW1hbm9pZC5TTE9UX0JSRUFTVFMpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBicmFzLnB1c2goY2xvdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsb3RoLnRyYW5zcGFyZW50U2xvdHMuaW5kZXhPZihIdW1hbm9pZC5TTE9UX0JSRUFTVFMpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0JyZWFzdFZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY2xvdGguc2xvdHMuaW5kZXhPZihIdW1hbm9pZC5TTE9UX0JVVFQpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0cy5wdXNoKGNsb3RoKTtcclxuICAgICAgICAgICAgICAgIGlmIChjbG90aC50cmFuc3BhcmVudFNsb3RzLmluZGV4T2YoSHVtYW5vaWQuU0xPVF9CVVRUKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCdXR0VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjbG90aC5zbG90cy5pbmRleE9mKEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05UKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAganVua3MucHVzaChjbG90aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xvdGgudHJhbnNwYXJlbnRTbG90cy5pbmRleE9mKEh1bWFub2lkLlNMT1RfQ1JPVENIX0ZST05UKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDcm90Y2hWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVCcmVhc3RTaXplcyhicmFzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNyb3RjaFNpemVzKGp1bmtzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUJ1dHRTaXplcyhidXR0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FjaGVkQnVsZ2VzID0ge1xyXG4gICAgICAgICAgICBicmVhc3RzIDogdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSxcclxuICAgICAgICAgICAgYnV0dCA6IHRoaXMuYnV0dFZpc2libGVTaXplLFxyXG4gICAgICAgICAgICBjcm90Y2ggOiB0aGlzLmNyb3RjaFZpc2libGVTaXplLFxyXG4gICAgICAgICAgICB3YWlzdCA6IDBcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUb3BDbG90aE9uIChzbG90IDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIFRoaW5nLldlYXJSZWxhdGlvbi5nZXRSaWdodFR5cGUodGhpcywgQ2xvdGhpbmcpLmZpbHRlcihvdGhlckNsb3RoID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG90aGVyQ2xvdGgudmlzaWJsZU9uLmluY2x1ZGVzKHNsb3QpO1xyXG4gICAgICAgIH0pLnNvcnQoKGEgOiBDbG90aGluZywgYiA6IENsb3RoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhLmxheWVyIC0gYi5sYXllcjtcclxuICAgICAgICB9KVswXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlQnJlYXN0U2l6ZXMgKGJyYXMgOiBBcnJheTxDbG90aGluZz4pIHtcclxuICAgICAgICB0aGlzLmlzQnJlYXN0VGlnaHQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQnJlYXN0TG9vc2UgPSB0cnVlO1xyXG4gICAgICAgIGxldCBicmVhc3RzID0gPEh1bWFub2lkQnJlYXN0cz4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZSh0aGlzLCBIdW1hbm9pZEJyZWFzdHMpO1xyXG4gICAgICAgIHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPSBicmVhc3RzLmdldFNpemUoKTtcclxuICAgICAgICBicmFzLmZvckVhY2goKGJyYSA6IENsb3RoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChicmEudGlnaHRCcmVhc3RTaXplID49IDAgJiYgdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA+IGJyYS50aWdodEJyZWFzdFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNCcmVhc3RUaWdodCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChicmEubWF4QnJlYXN0U2l6ZSA+PSAwICYmIHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPiBicmEubWF4QnJlYXN0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA9IGJyYS5tYXhCcmVhc3RTaXplO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5icmVhc3RWaXNpYmxlU2l6ZSA+PSBicmEubG9vc2VCcmVhc3RTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQnJlYXN0TG9vc2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5icmVhc3RWaXNpYmxlU2l6ZSArPSBicmEuYnJlYXN0UGFkZGluZztcclxuICAgICAgICAgICAgaWYgKHRoaXMuYnJlYXN0VmlzaWJsZVNpemUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFzdFZpc2libGVTaXplID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDcm90Y2hTaXplcyAoY2xvdGhzIDogQXJyYXk8Q2xvdGhpbmc+KSB7XHJcbiAgICAgICAgdGhpcy5pc0Nyb3RjaFRpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICAgICAgbGV0IHBlbmlzID0gPEh1bWFub2lkUGVuaXM+IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGVPbmUodGhpcywgSHVtYW5vaWRQZW5pcyk7XHJcbiAgICAgICAgbGV0IHRlc3RpY2xlcyA9IDxIdW1hbm9pZFRlc3RpY2xlcz4gVGhpbmcuUGFydFJlbGF0aW9uLmdldFJpZ2h0VHlwZU9uZSh0aGlzLCBIdW1hbm9pZFRlc3RpY2xlcyk7XHJcbiAgICAgICAgdGhpcy5jcm90Y2hWaXNpYmxlU2l6ZSA9IDA7XHJcbiAgICAgICAgaWYgKHBlbmlzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplICs9IHBlbmlzLmdldEJ1bGdlU2l6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGVzdGljbGVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplICs9IHRlc3RpY2xlcy5nZXRCdWxnZVNpemUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgPSBNYXRoLmZsb29yKHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgKiAxMCkgLyAxMDtcclxuXHJcbiAgICAgICAgY2xvdGhzLmZvckVhY2goKHdvcm4gOiBDbG90aGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAod29ybi50aWdodENyb3RjaFNpemUgPj0gMCAmJiB0aGlzLmNyb3RjaFZpc2libGVTaXplID4gd29ybi50aWdodENyb3RjaFNpemUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDcm90Y2hUaWdodCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh3b3JuLm1heENyb3RjaFNpemUgPj0gMCAmJiB0aGlzLmNyb3RjaFZpc2libGVTaXplID4gd29ybi5tYXhDcm90Y2hTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplID0gd29ybi5tYXhDcm90Y2hTaXplO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplICs9IHdvcm4uY3JvdGNoUGFkZGluZztcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3JvdGNoVmlzaWJsZVNpemUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyb3RjaFZpc2libGVTaXplID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVCdXR0U2l6ZXMgKGNsb3RocyA6IEFycmF5PENsb3RoaW5nPikge1xyXG4gICAgICAgIHRoaXMuaXNCdXR0VGlnaHQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgYnV0dCA9IDxIdW1hbm9pZEJ1dHQ+IFRoaW5nLlBhcnRSZWxhdGlvbi5nZXRSaWdodFR5cGVPbmUodGhpcywgSHVtYW5vaWRCdXR0KTtcclxuICAgICAgICB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSA9IGJ1dHQgPT0gdW5kZWZpbmVkID8gMCA6IGJ1dHQuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBjbG90aHMuZm9yRWFjaCgod29ybiA6IENsb3RoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh3b3JuLnRpZ2h0QnV0dFNpemUgPj0gMCAmJiB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSA+IHdvcm4udGlnaHRCdXR0U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0J1dHRUaWdodCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh3b3JuLm1heEJ1dHRTaXplID49IDAgJiYgdGhpcy5idXR0VmlzaWJsZVNpemUgPiB3b3JuLm1heEJ1dHRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRWaXNpYmxlU2l6ZSA9IHdvcm4ubWF4QnV0dFNpemU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYnV0dFZpc2libGVTaXplICs9IHdvcm4uYnV0dFBhZGRpbmc7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1dHRWaXNpYmxlU2l6ZSA8IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnV0dFZpc2libGVTaXplID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNCcmVhc3RzICgpIHtcclxuICAgICAgICBsZXQgYnJlYXN0cyA9IDxIdW1hbm9pZEJyZWFzdHM+IHRoaXMuZ2V0UGFydChIdW1hbm9pZEJyZWFzdHMpO1xyXG4gICAgICAgIGlmIChicmVhc3RzLnNpemUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzTWFsZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydHMoSHVtYW5vaWRQZW5pcykubGVuZ3RoID4gMCAmJiB0aGlzLmdldFBhcnRzKEh1bWFub2lkVmFnaW5hKS5sZW5ndGggPT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNGZW1hbGUgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRzKEh1bWFub2lkUGVuaXMpLmxlbmd0aCA9PSAwICYmIHRoaXMuZ2V0UGFydHMoSHVtYW5vaWRWYWdpbmEpLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzSGVybSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydHMoSHVtYW5vaWRQZW5pcykubGVuZ3RoID4gMCAmJiB0aGlzLmdldFBhcnRzKEh1bWFub2lkVmFnaW5hKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTaG9ydGVzdERlc2NyaXB0aW9uICgpIHtcclxuICAgICAgICBsZXQgcGxheWVyR2VuZGVyID0gdGhpcy5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBwbGF5ZXJTbHV0dGluZXNzID0gdGhpcy5nZXRTbHV0dGluZXNzKCk7XHJcblxyXG4gICAgICAgIGxldCBwcmVzZW50YXRpb24gPSBcIlwiO1xyXG4gICAgICAgIGlmIChwbGF5ZXJTbHV0dGluZXNzLnNsdXR0aW5lc3NDb3JyZWN0ZWQgPiA3NSkge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwic2x1dHR5LCBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJTbHV0dGluZXNzLnNsdXR0aW5lc3NDb3JyZWN0ZWQgPiAzNSkge1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHBsYXllclNsdXR0aW5lc3Muc2x1dHRpbmVzc0NvcnJlY3RlZCA+IDIwKSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJwcnVkZSwgXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJzYWludGx5LCBcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGxheWVyR2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkIDwgNDApIHtcclxuICAgICAgICAgICAgcHJlc2VudGF0aW9uICs9IChcIm1hc2N1bGluZSBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCA2MCkge1xyXG4gICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwiYW5kcm9neW5vdXMgXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJmZW1pbmluZSBcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGxheWVyR2VuZGVyLmhhc1RpdHMpIHtcclxuICAgICAgICAgICAgaWYgKHBsYXllckdlbmRlci5oYXNQZW5pcyB8fCBwbGF5ZXJHZW5kZXIuaGFzUGVuaXNCdWxnZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2hlbWFsZSBTdGF0dXMgKFRpdHMgKyBQZW5pcylcclxuICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJzaGVtYWxlXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYXllckdlbmRlci5oYXNWYWdpbmEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlzIGEgd29tYW5cclxuICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJ3b21hblwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE5vIHRpdHNcclxuICAgICAgICAgICAgaWYgKHBsYXllckdlbmRlci5oYXNQZW5pcykge1xyXG4gICAgICAgICAgICAgICAgLy8gU2ltcGx5IG1hbGVcclxuICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJHZW5kZXIuZ2VuZGVyVmFsdWVDb3JyZWN0ZWQgPCA2MCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJtYW5cIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbiArPSAoXCJ0cmFwXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYXllckdlbmRlci5oYXNQZW5pc0J1bGdlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBTaGVtYWxlIHN0YXR1cyAtIGhhcyBidWxnZSBhbmQgdGl0cyBtYXliZSBnZXQgYmV0dGVyIHRlcm1zIHNvbWV0aW1lXHJcbiAgICAgICAgICAgICAgICBpZiAocGxheWVyR2VuZGVyLmdlbmRlclZhbHVlQ29ycmVjdGVkIDwgNjApIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwibWFuXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwidHJhcFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5ZXJHZW5kZXIuaGFzVmFnaW5hKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpcyBhIHdvbWFuXHJcbiAgICAgICAgICAgICAgICBwcmVzZW50YXRpb24gKz0gKFwid29tYW5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmVzZW50YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0hBSVIgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0hFQURHRUFSID0gMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9GQUNFID0gMjtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9FQVJTID0gMztcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9FWUVTID0gNDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9OT1NFID0gNTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9NT1VUSCA9IDY7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTkVDSyA9IDc7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfU0hPVUxERVJTID0gODtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9BUk1TID0gOTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9IQU5EUyA9IDEwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0ZJTkdFUlMgPSAxMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9GSU5HRVJOQUlMUyA9IDEyO1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX1VQUEVSX0NIRVNUID0gMTM7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfTUlEUklGRiA9IDE0O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX1dBSVNUID0gMTU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfQkFDSyA9IDE2O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0hJUFMgPSAxNztcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9DUk9UQ0hfRlJPTlQgPSAxODtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9DUk9UQ0hfQkFDSyA9IDE5O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0JVVFQgPSAyMDtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9MRUdfVVBQRVIgPSAyMTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9MRUdfTE9XRVIgPSAyMjtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9GRUVUID0gMjM7XHJcbiAgICBwdWJsaWMgc3RhdGljIFNMT1RfRkVFVF9OQUlMUyA9IDI0O1xyXG4gICAgcHVibGljIHN0YXRpYyBTTE9UX0JSRUFTVFMgPSAyNTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU0xPVF9TTE9UX0NPVU5UID0gMjY7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjYWNoZUludmFsaWRhdGlvbkFjdGlvblJ1bGUgPSBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSW52YWxpZGF0ZSBodW1hbm9pZCBjYWNoZXNcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb24+KSA9PiB7XHJcbiAgICAgICAgICAgICg8SHVtYW5vaWQ+IHJ1bm5lci5ub3VuLmFjdG9yKS5pbnZhbGlkYXRlQ2FjaGVzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPEFjdGlvbj4pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLmFjdG9yIGluc3RhbmNlb2YgSHVtYW5vaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRQbGF5ZXJEZXNjcmlwdGlvbiAoKSA6IFNheSB7XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoKTtcclxuXHJcbiAgICAgICAgc2F5LmFkZChcIllvdSBhcmUgXCIpO1xyXG5cclxuICAgICAgICBsZXQgcGxheWVyID0gPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcjtcclxuXHJcbiAgICAgICAgbGV0IG1hbGUgPSBwbGF5ZXIuZ2V0UGFydHMoSHVtYW5vaWRQZW5pcykubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgZmVtYWxlID0gcGxheWVyLmdldFBhcnRzKEh1bWFub2lkVmFnaW5hKS5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICBpZiAobWFsZSAmJiBmZW1hbGUpIHtcclxuICAgICAgICAgICAgc2F5LmFkZCggXCJoZXJtYXBocm9kaXRlXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWFsZSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwibWFsZVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiZmVtYWxlXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChcIi4gWW91IGFyZSBwcmVzZW50aW5nIGFzIFwiLCBuZXcgU2F5QW4oKSwgcGxheWVyLmdldFNob3J0ZXN0RGVzY3JpcHRpb24oKSArIFwiLiBcIik7XHJcblxyXG4gICAgICAgIHNheS5hZGQoQXR0cmlidXRlcy5HZW5kZXJJZGVudGl0eS5nZXREZXNjcmlwdGlvbihwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkdlbmRlcklkZW50aXR5KSkpO1xyXG5cclxuICAgICAgICAvL2xldCBndiA9IHBsYXllci5nZXRHZW5kZXJWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBzdiA9IHBsYXllci5nZXRTbHV0dGluZXNzKCk7XHJcbiAgICAgICAgbGV0IGJ1bGdlcyA9IHBsYXllci5nZXRCdWxnZXMoKTtcclxuXHJcbiAgICAgICAgbGV0IGNvdmVyZWRQZXJjID0gMSAtIChwbGF5ZXIudW5jb3ZlcmVkU2xvdHMubGVuZ3RoIC8gSHVtYW5vaWQuU0xPVF9TTE9UX0NPVU5UKTtcclxuXHJcbiAgICAgICAgc2F5LmFkZChcIiBcIiwgKDxIdW1hbm9pZFNraW4+IHBsYXllci5nZXRQYXJ0KEh1bWFub2lkU2tpbikpLmdldERlc2NyaXB0aW9uKCkpO1xyXG5cclxuICAgICAgICBpZiAoc3YuaGFsZk5ha2VkKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIgWW91IGFyZSBhbG1vc3QgbmFrZWQuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN2Lm5ha2VkKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIgWW91IGFyZSBuYWtlZC4gXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY292ZXJlZFBlcmMgPCAwLjIpIHtcclxuICAgICAgICAgICAgc2F5LmFkZChcIllvdSBhcmUgbm90IHNob3dpbmcgbXVjaCBvZiBpdCwgdGhvdWdoLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNheS5hZGQoQXR0cmlidXRlcy5EZWdlbmVyYXRpb24uZ2V0RGVzY3JpcHRpb24ocGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5EZWdlbmVyYXRpb24pKSk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSyk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoKDxIdW1hbm9pZEFybXM+IHBsYXllci5nZXRQYXJ0KEh1bWFub2lkQXJtcykpLmdldERlc2NyaXB0aW9uKCksIFwiIFwiKTtcclxuICAgICAgICBzYXkuYWRkKCg8SHVtYW5vaWRIYW5kcz4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRIYW5kcykpLmdldERlc2NyaXB0aW9uKCksIFwiIFwiKTtcclxuICAgICAgICBzYXkuYWRkKCg8SHVtYW5vaWRGZWV0PiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZEZlZXQpKS5nZXREZXNjcmlwdGlvbigpLCBcIiBcIik7XHJcblxyXG4gICAgICAgIGxldCBwZW5pcyA9IDxIdW1hbm9pZFBlbmlzPiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZFBlbmlzKTtcclxuICAgICAgICBsZXQgdmFnaW5hID0gPEh1bWFub2lkVmFnaW5hPiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZFZhZ2luYSk7XHJcbiAgICAgICAgaWYgKHBlbmlzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiWW91IGhhdmUgYSBcIixcclxuICAgICAgICAgICAgICAgIHBlbmlzLmdldFNpemVUZXh0KCksIChwZW5pcy5pc0ZsYWNjaWQoKSA/IFwiIGZsYWNjaWQgXCIgOiBcIiBlcmVjdCBcIiksXHJcbiAgICAgICAgICAgICAgICBTYXkuQ09DSywgXCIgYmV0d2VlbiB5b3VyIGxlZ3NcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoIXBlbmlzLmlzQmlnKCkgJiYgcGVuaXMuaXNHcm93ZXIoKSAmJiBwZW5pcy5pc0ZsYWNjaWQoKSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIiwgd2hpY2ggaXMgb2theSwgc2luY2UgeW91J3JlIGEgZ3Jvd2VyLCBub3QgYSBzaG93ZXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBlbmlzLmlzVW5jb3ZlcmVkKCkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBvbmVPZiA9IG5ldyBPbmVPZihPbmVPZi5QVVJFTFlfQVRfUkFORE9NLCAuLi5bXHJcbiAgICAgICAgICAgICAgICAgICAgXCIsIGl0IGlzIG5vdCBjb3ZlcmVkIGJ5IGFueSBjbG90aGluZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiLCBpdCBpcyBub3QgY292ZXJlZCBieSBhbnkgY2xvdGhlc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiLCBpdCBpcyB1bmNvdmVyZWRcIixcclxuICAgICAgICAgICAgICAgICAgICBcIiwgaXQgaXMgdmlzaWJsZSB0byBhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICBcIiwgaXQgaXMgaGFuZ2luZyBmcmVlbHlcIlxyXG4gICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKG9uZU9mLmdldE9uZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgdGVzdGljbGVzID0gPEh1bWFub2lkVGVzdGljbGVzPiBwbGF5ZXIuZ2V0UGFydChIdW1hbm9pZFRlc3RpY2xlcyk7XHJcbiAgICAgICAgICAgIGlmIChIdW1hbm9pZFBlbmlzLmdldFNpemVUZXh0KGJ1bGdlcy5jcm90Y2gpICE9IEh1bWFub2lkUGVuaXMuZ2V0U2l6ZVRleHQocGVuaXMuZ2V0QnVsZ2VTaXplKCkgKyB0ZXN0aWNsZXMuZ2V0QnVsZ2VTaXplKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiLCBidXQgaXQgbG9va3MgbGlrZSBpdCdzIGFjdHVhbGx5IFwiLCBIdW1hbm9pZFBlbmlzLmdldFNpemVUZXh0KGJ1bGdlcy5jcm90Y2gpLCBcIiBkdWUgdG8geW91ciBjbG90aGluZ1wiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIuIFwiKTtcclxuICAgICAgICAgICAgaWYgKHRlc3RpY2xlcyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IERlc2NyaWJlIHRlc3RpY2xlcy4gQXJlIHdlIG1ha2luZyB0aGVzZSB2YXJpYWJsZT9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQodmFnaW5hLmdldERlc2NyaXB0aW9uKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9zYXkuYWRkKFNheS5QQVJBR1JBUEhfQlJFQUspO1xyXG5cclxuICAgICAgICBzYXkuYWRkKCBcIiBcIik7XHJcblxyXG4gICAgICAgIGxldCBicmVhc3RzID0gPEh1bWFub2lkQnJlYXN0cz4gcGxheWVyLmdldFBhcnQoSHVtYW5vaWRCcmVhc3RzKTtcclxuICAgICAgICBsZXQgYnV0dCA9IDxIdW1hbm9pZEJ1dHQ+IHBsYXllci5nZXRQYXJ0KEh1bWFub2lkQnV0dCk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoXCJZb3UgaGF2ZSBcIiwgYnJlYXN0cy5nZXRTaXplVGV4dCgpLCBcIiBicmVhc3RzIGFuZCBhIFwiLCBidXR0LmdldFNpemVUZXh0KCksIFwiIGJ1dHQuXCIpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGJ1bGdlcy5icmVhc3RzICE9IGJyZWFzdHMuZ2V0U2l6ZSgpICYmIGJ1bGdlcy5idXR0ICE9IGJ1dHQuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoXCIgWW91ciBjbG90aGluZyBtYWtlcyB5b3VyIGJyZWFzdHMgbG9vayBsaWtlIHRoZXkncmUgYWN0dWFsbHkgXCIsIEh1bWFub2lkQnJlYXN0cy5nZXRTaXplVGV4dChidWxnZXMuYnJlYXN0cyksXHJcbiAgICAgICAgICAgICAgICBcIiBhbmQgbWFrZSB5b3VyIGJ1dHQgYXBwZWFyIFwiLCBIdW1hbm9pZEJ1dHQuZ2V0U2l6ZVRleHQoYnVsZ2VzLmJ1dHQpLCBcIi5cIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChidWxnZXMuYnJlYXN0cyAhPSBicmVhc3RzLmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdXIgY2xvdGhpbmcgbWFrZXMgeW91ciBicmVhc3RzIGxvb2sgbGlrZSB0aGV5J3JlIGFjdHVhbGx5IFwiLCBIdW1hbm9pZEJyZWFzdHMuZ2V0U2l6ZVRleHQoYnVsZ2VzLmJyZWFzdHMpLCBcIi5cIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChidWxnZXMuYnV0dCAhPSBidXR0LmdldFNpemUoKSkge1xyXG4gICAgICAgICAgICBzYXkuYWRkKFwiIFlvdXIgY2xvdGhpbmcgbWFrZXMgeW91ciBidXR0IGFwcGVhciBcIiwgSHVtYW5vaWRCdXR0LmdldFNpemVUZXh0KGJ1bGdlcy5idXR0KSwgXCIuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuXHJcbiAgICAgICAgbGV0IGNsb3RoaW5nU2x1dHRpbmVzcyA9IENsb3RoaW5nLmdldFNsdXR0aW5lc3NWYWx1ZU9uKHBsYXllcik7XHJcbiAgICAgICAgbGV0IGJvZHlwYXJ0U2x1dHRpbmVzcyA9IEJvZHlwYXJ0LmdldFNsdXR0aW5lc3NWYWx1ZU9uKHBsYXllcik7XHJcblxyXG4gICAgICAgIGlmIChjbG90aGluZ1NsdXR0aW5lc3Mud2VpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgY2xvdGhpbmdTbHV0dGluZXNzRmluYWwgPSBjbG90aGluZ1NsdXR0aW5lc3MudmFsdWUgLyBjbG90aGluZ1NsdXR0aW5lc3Mud2VpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoY2xvdGhpbmdTbHV0dGluZXNzRmluYWwgPiA3NSkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgb3V0Zml0IGNhbiBvbmx5IGJlIGRlc2NyaWJlZCBhcyBcXFwid2hvcmUtaXNoXFxcIiwgaXQgaXMgZmFyIHRvbyBuYXN0eS5cIilcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbG90aGluZ1NsdXR0aW5lc3NGaW5hbCA+IDYwKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBjbG90aGluZyBhcmUgb2J2aW91c2x5IG1ha2luZyB5b3UgbG9vayBhIGJpdCBuYXVnaHR5LlwiKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNsb3RoaW5nU2x1dHRpbmVzc0ZpbmFsIDwgMzAgJiYgc3Yuc2x1dHRpbmVzc0NvcnJlY3RlZCA8IDMwKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiWW91ciBjbG90aGluZyBhcmUgZGVmaW5pdGVseSBhIGJpdCBwcnVkZS5cIilcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbG90aGluZ1NsdXR0aW5lc3NGaW5hbCA8IDE1ICYmIHN2LnNsdXR0aW5lc3NDb3JyZWN0ZWQgPCAzMCkge1xyXG4gICAgICAgICAgICAgICAgc2F5LmFkZChcIllvdXIgb3V0Zml0IGlzIHNvIHBydWRlIHRoYXQgaXQgY291bGQgYmUgd29ybiBieSBhIHNhaW50LlwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzYXkuYWRkKFwiIFwiKTtcclxuXHJcbiAgICAgICAgaWYgKGJvZHlwYXJ0U2x1dHRpbmVzcy53ZWlnaHQgPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5cGFydFNsdXR0aW5lc3NGaW5hbCA9IGJvZHlwYXJ0U2x1dHRpbmVzcy52YWx1ZSAvIGJvZHlwYXJ0U2x1dHRpbmVzcy53ZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmIChib2R5cGFydFNsdXR0aW5lc3NGaW5hbCA+IDc1KSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiVGhlIHdheSB5b3VyIGJvZHkgaXMgbWFrZXMgeW91IGxvb2sgbGlrZSB5b3Ugd2VyZSBtYWRlIHB1cmVseSBmb3Igc2V4XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWRQZXJjID4gMC43KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChcIiwgdGhhbmtmdWxseSBpdCdzIG1vc3RseSBjb3ZlcmVkXCIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdmVyZWRQZXJjIDwgMC4yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChcIiwgYW5kIHlvdSBkaWRuJ3QgZXZlbiBib3RoZXIgY292ZXJpbmcgaXQgdXBcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNheS5hZGQoXCIuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHlwYXJ0U2x1dHRpbmVzc0ZpbmFsID4gNjApIHtcclxuICAgICAgICAgICAgICAgIHNheS5hZGQoXCJZb3VyIGJvZHkgZGVmaW5pdGVseSBoYXMgYSBsb3Qgb2Ygc2V4LWFwcGVhbCBnb2luZyBvblwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkUGVyYyA+IDAuNykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQoXCIsIGFsdGhvdWdoIGl0J3MgY292ZXJlZFwiKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3ZlcmVkUGVyYyA8IDAuMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQoXCIsIHByb3VkbHkgZGlzcGxheWVkIGZvciBhbGwgdG8gc2VlXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiLlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChib2R5cGFydFNsdXR0aW5lc3NGaW5hbCA8IDMwKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiWW91IGhhdmUgdmVyeSBsaXR0bGUgc2V4LWFwcGVhbCwgbWF5YmUgeW91IGFyZSBhIGtpdGNoZW4gdGFibGU/XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWRQZXJjID4gMC43KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChcIiBBdCBsZWFzdCB5b3UgY292ZXJlZCBpdCB1cC5cIilcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY292ZXJlZFBlcmMgPCAwLjIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFwiIE1heWJlIHlvdSBjb3VsZCBjb3ZlciBpdCB1cCBhIGJpdC5cIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2F5LmFkZChTYXkuUEFSQUdSQVBIX0JSRUFLKTtcclxuXHJcblxyXG5cclxuICAgICAgICBsZXQgc3RhdHMgPSBuZXcgU2F5TGVmdFJpZ2h0KCk7XHJcblxyXG4gICAgICAgIHN0YXRzLmFkZExlZnQobmV3IFNheUJvbGQoXCJTdHJlbmd0aDogXCIpLCBBdHRyaWJ1dGVzLlN0cmVuZ3RoLmdldERlc2NyaXB0aW9uKHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgpKSk7XHJcbiAgICAgICAgc3RhdHMuYWRkTGVmdChTYXkuTElORV9CUkVBSyk7XHJcbiAgICAgICAgc3RhdHMuYWRkTGVmdChuZXcgU2F5Qm9sZChcIkFnaWxpdHk6IFwiKSwgQXR0cmlidXRlcy5BZ2lsaXR5LmdldERlc2NyaXB0aW9uKHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuQWdpbGl0eSkpKTtcclxuICAgICAgICBzdGF0cy5hZGRMZWZ0KFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICBzdGF0cy5hZGRMZWZ0KG5ldyBTYXlCb2xkKFwiQ2hhcm06IFwiKSwgQXR0cmlidXRlcy5DaGFybS5nZXREZXNjcmlwdGlvbihwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkNoYXJtKSkpO1xyXG4gICAgICAgIHN0YXRzLmFkZExlZnQoU2F5LkxJTkVfQlJFQUspO1xyXG4gICAgICAgIHN0YXRzLmFkZExlZnQobmV3IFNheUJvbGQoXCJJbnRlbGxpZ2VuY2U6IFwiKSwgQXR0cmlidXRlcy5JbnRlbGxpZ2VuY2UuZ2V0RGVzY3JpcHRpb24ocGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5JbnRlbGxpZ2VuY2UpKSk7XHJcblxyXG4gICAgICAgIFNraWxsLmdldFNraWxscygpLmZvckVhY2goKHNraWxsOiBTa2lsbCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGxheWVyLmdldFNraWxsKHNraWxsKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHN0YXRzLmFkZFJpZ2h0KG5ldyBTYXlCb2xkKHNraWxsLmlkICsgXCI6IFwiKSwgc2tpbGwuZ2V0RGVzY3JpcHRpb24ocGxheWVyLmdldFNraWxsKHNraWxsKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNheS5hZGQoc3RhdHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2F5O1xyXG4gICAgfVxyXG59XHJcblxyXG5BY3Rpb25XZWFyLmNhcnJ5LmFkZFJ1bGUoSHVtYW5vaWQuY2FjaGVJbnZhbGlkYXRpb25BY3Rpb25SdWxlKTtcclxuQWN0aW9uUmVtb3ZlLmNhcnJ5LmFkZFJ1bGUoSHVtYW5vaWQuY2FjaGVJbnZhbGlkYXRpb25BY3Rpb25SdWxlKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiQ2xhc3Nlcy9UaGluZ3MvUGVyc29uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvVGhpbmdzL01hcE5vdGUudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiQ2xhc3Nlcy9UaGluZ3MvSHVtYW5vaWQvSHVtYW5vaWQudHNcIiAvPlxyXG5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiQ2xhc3Nlcy9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNsYXNzZXMvU2F2ZS9TdG9yZWRWYXJpYWJsZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJQbGF5QmVnaW5zLnRzXCIgLz5cclxubW9kdWxlIFdvcmxkU3RhdGUge1xyXG4gICAgdmFyIHdvcmxkVHVybiA6IG51bWJlciA9IDA7XHJcbiAgICB2YXIgcGxheWVyVHVybiA6IG51bWJlciA9IDA7XHJcbiAgICBleHBvcnQgdmFyIHBsYXllciA6IEh1bWFub2lkID0gbmV3IEh1bWFub2lkKHtpc01hbGUgOiBmYWxzZX0pO1xyXG5cclxuICAgIHBsYXllci5kZXNjcmlwdGlvbiA9IEh1bWFub2lkLmdldFBsYXllckRlc2NyaXB0aW9uO1xyXG5cclxuICAgIHZhciByZW1lbWJlcmVkUm9vbXMgPSBuZXcgU3RvcmVkVmFyaWFibGU8QXJyYXk8c3RyaW5nPj4oe1xyXG4gICAgICAgIGlkIDogXCJSZW1lbWJlcmVkIFJvb21zXCIsXHJcbiAgICAgICAgdmFsdWUgOiBbXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIHJlbWVtYmVyZWRGb2RkZXIgOiBBcnJheTxSb29tPiA9IFtdO1xyXG5cclxuICAgIGxldCByZW1lbWJlcmVkUm9vbXNGb3JJbnRlbGxpZ2VuY2UgPSAyO1xyXG4gICAgbGV0IHJlbWVtYmVyZWRSb29tc0ZvclN1cnZpdmFsID0gMTtcclxuXHJcbiAgICBleHBvcnQgdmFyIFJlbWVtYmVyaW5nUm9vbVJ1bGVib29rIDogUnVsZWJvb2s8Um9vbT4gPSBuZXcgUnVsZWJvb2soXCJSZW1lbWJlcmluZyBSb29tIHNvbWV0aGluZ1wiKTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNUdXJuV2FpdGluZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHdvcmxkVHVybiA8IHBsYXllclR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlbWVudFdvcmxkVHVybiAoKSB7XHJcbiAgICAgICAgd29ybGRUdXJuKys7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGluY3JlbWVudFBsYXllclR1cm4gKCkge1xyXG4gICAgICAgIHBsYXllclR1cm4rKztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFR1cm4gKCkge1xyXG4gICAgICAgIHJldHVybiBwbGF5ZXJUdXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50VHVybiAodHVybiA6IG51bWJlcikge1xyXG4gICAgICAgIHBsYXllclR1cm4gPSB0dXJuO1xyXG4gICAgICAgIHdvcmxkVHVybiA9IHR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGxldCBSZW1lbWJlcmluZ1Jvb21Jbkxpc3QgPSBSZW1lbWJlcmluZ1Jvb21SdWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJJcyByb29tIGxpc3RlZCBpbiByZW1lbWJlcmVkIHJvb21zP1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XLFxyXG4gICAgICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVtZW1iZXJlZFJvb21zLnZhbHVlLmluZGV4T2YocnVubmVyLm5vdW4uZ2V0TmFtZSgpKSAhPSAtMSB8fCByZW1lbWJlcmVkRm9kZGVyLmluZGV4T2YocnVubmVyLm5vdW4pICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGV4cG9ydCBsZXQgUmVtZW1iZXJpbmdSb29tSW5NYXAgPSBSZW1lbWJlcmluZ1Jvb21SdWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJJcyByb29tIHNob3duIG9uIGEgbWFwP1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbWFwcyA9IDxBcnJheTxNYXBOb3RlPj4gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodFR5cGUocGxheWVyLCBNYXBOb3RlKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwc1tpXS5jb250YWlucyhydW5uZXIubm91bikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1Jvb21SZW1lbWJlcmVkIChyb29tIDogUm9vbSkgOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUmVtZW1iZXJpbmdSb29tUnVsZWJvb2suZXhlY3V0ZSh7bm91biA6IHJvb219KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0ID09IHRydWU7IC8vIGNhbiByZXR1cm4gXCJ1bmRlZmluZWRcIlxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSZW1lbWJlcmVkUm9vbXMgKCkge1xyXG4gICAgICAgIHJldHVybiByZW1lbWJlcmVkUm9vbXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJlbWVtYmVyZWRSb29tc0FzUm9vbXMgKCkgOiBBcnJheTxSb29tPiB7XHJcbiAgICAgICAgbGV0IHJvb21zID0gW107XHJcbiAgICAgICAgcmVtZW1iZXJlZFJvb21zLnZhbHVlLmZvckVhY2gocm9vbU5hbWUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcm9vbSA9IFJvb20uZ2V0Um9vbShyb29tTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChyb29tICE9IHVuZGVmaW5lZCkgcm9vbXMucHVzaChyb29tKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRNYXhpbXVtUmVtZW1iZXJlZFJvb21zICgpIHtcclxuICAgICAgICBsZXQgaW50Um9vbXMgPSBwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSkgKiByZW1lbWJlcmVkUm9vbXNGb3JJbnRlbGxpZ2VuY2U7XHJcbiAgICAgICAgbGV0IHNraWxsUm9vbXMgPSBwbGF5ZXIuZ2V0U2tpbGwoU2tpbGxzLlN1cnZpdmFsKSAqIHJlbWVtYmVyZWRSb29tc0ZvclN1cnZpdmFsO1xyXG4gICAgICAgIHJldHVybiBpbnRSb29tcyArIHNraWxsUm9vbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlUm9vbXMgKCkge1xyXG4gICAgICAgIHdoaWxlIChyZW1lbWJlcmVkUm9vbXMudmFsdWUubGVuZ3RoID4gZ2V0TWF4aW11bVJlbWVtYmVyZWRSb29tcygpKXtcclxuICAgICAgICAgICAgcmVtZW1iZXJlZFJvb21zLnZhbHVlLnBvcCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVtZW1iZXJSb29tICguLi5yb29tcyA6IEFycmF5PFJvb20+KSB7XHJcbiAgICAgICAgcm9vbXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUm9vbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmZvZGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1lbWJlcmVkRm9kZGVyLmluZGV4T2YodmFsdWUpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyZWRGb2RkZXIucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gcmVtZW1iZXJlZFJvb21zLnZhbHVlLmluZGV4T2YodmFsdWUuZ2V0TmFtZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyZWRSb29tcy52YWx1ZS5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJlZFJvb21zLnZhbHVlLnVuc2hpZnQodmFsdWUuZ2V0TmFtZSgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRydW5jYXRlUm9vbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2F2ZVN0YXRlICgpIHtcclxuICAgICAgICBsZXQgdGhpbmdzID0ge1xyXG4gICAgICAgICAgICBjYXJyaWVkOiBbXSxcclxuICAgICAgICAgICAgd29ybjogW10sXHJcbiAgICAgICAgICAgIHdpZWxkZWQ6IFtdXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgVGhpbmdzIDogdGhpbmdzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IENvcnJlY3RSZW1lbWJlcmVkUm9vbXNSdWxlID0gUGxheUJlZ2lucy5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJDb3JyZWN0IHJlbWVtYmVyZWQgcm9vbXNcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9MT1dFU1QsXHJcbiAgICAgICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX01FRElVTSxcclxuICAgICAgICBjb2RlIDogKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWxsUm9vbXMgPSByZW1lbWJlcmVkUm9vbXMudmFsdWU7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50Um9vbSA9IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKTtcclxuICAgICAgICAgICAgaWYgKGFsbFJvb21zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZW1lbWJlcmVkUm9vbXMudmFsdWUgPSBbY3VycmVudFJvb20uZ2V0TmFtZSgpXTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgbmV3Um9vbXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5QWRkUm9vbXMgKHJvb20gOiBSb29tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm9vbSBpbnN0YW5jZW9mIFJvb21SYW5kb20pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vbS5mb2RkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJlZEZvZGRlci5wdXNoKHJvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb29tLmNvbm5lY3Rpb25zLmZvckVhY2goKG5ld1Jvb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5QWRkUm9vbXMobmV3Um9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsUm9vbXMuaW5kZXhPZihyb29tLmdldE5hbWUoKSkgIT0gLTEgJiYgbmV3Um9vbXMuaW5kZXhPZihyb29tLmdldE5hbWUoKSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um9vbXMucHVzaChyb29tLmdldE5hbWUoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb20uY29ubmVjdGlvbnMuZm9yRWFjaCgobmV3Um9vbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlbHlBZGRSb29tcyhuZXdSb29tKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWN1cnNpdmVseUFkZFJvb21zKGN1cnJlbnRSb29tKTtcclxuICAgICAgICAgICAgcmVtZW1iZXJlZFJvb21zLnZhbHVlID0gbmV3Um9vbXM7XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSZWxhdGlvbnMvUmVsYXRpb25PbmVUb01hbnkudHNcIiAvPlxyXG5jbGFzcyBSZWdpb24ge1xyXG4gICAgcHVibGljIG5hbWUgOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChuYW1lIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlZ2lvblJvb20gPSBuZXcgUmVsYXRpb25PbmVUb01hbnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgUmVnaW9uUmVnaW9uID0gbmV3IFJlbGF0aW9uT25lVG9NYW55KCk7XHJcbiAgICBwdWJsaWMgc3RhdGljIEluUmVsYXRpb24gPSBuZXcgUmVsYXRpb25IYW5kbGVyU3RyaWN0T25lVG9NYW55KFJlZ2lvbi5SZWdpb25SZWdpb24sIFJlZ2lvbi5SZWdpb25Sb29tKTtcclxuXHJcbiAgICBwdWJsaWMgcGxhY2UgKC4uLnJvb21zIDogQXJyYXk8Um9vbSB8IFJlZ2lvbj4pIHtcclxuICAgICAgICByb29tcy5mb3JFYWNoKHJvb20gPT4ge1xyXG4gICAgICAgICAgICBpZiAocm9vbSBpbnN0YW5jZW9mIFJvb20pIHtcclxuICAgICAgICAgICAgICAgIFJlZ2lvbi5SZWdpb25Sb29tLnNldFJlbGF0aW9uKHRoaXMsIHJvb20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVnaW9uLlJlZ2lvblJlZ2lvbi5zZXRSZWxhdGlvbih0aGlzLCByb29tKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb29tcyAoKSB7XHJcbiAgICAgICAgbGV0IHJvb21zID0gPEFycmF5PFJvb20+PiBSZWdpb24uUmVnaW9uUm9vbS5nZXRSaWdodCh0aGlzKTtcclxuICAgICAgICBSZWdpb24uUmVnaW9uUmVnaW9uLmdldFJpZ2h0KHRoaXMpLmZvckVhY2goKHJlZ2lvbiA6IFJlZ2lvbikgPT4ge1xyXG4gICAgICAgICAgICAoPEFycmF5PFJvb20+PiBSZWdpb24uUmVnaW9uUm9vbS5nZXRSaWdodChyZWdpb24pKS5mb3JFYWNoKChyb29tIDogUm9vbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcm9vbXMucHVzaChyb29tKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJvb21zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWluc1Jvb20gKHJvb20gOiBSb29tKSB7XHJcbiAgICAgICAgbGV0IGRpcmVjdGx5Q29udGFpbmVkID0gUmVnaW9uLlJlZ2lvblJvb20uZ2V0TGVmdChyb29tKSA9PSB0aGlzO1xyXG4gICAgICAgIGlmIChkaXJlY3RseUNvbnRhaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKFJlZ2lvbi5SZWdpb25SZWdpb24uZ2V0TGVmdCh0aGlzKSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um9vbXMoKS5pbmRleE9mKHJvb20pICE9IC0xOyAvLyBJZiBpdCdzIG5vdCBkaXJlY3RseSBjb250YWluZWQsIHdlIGhhdmUgdG8gY2hlY2sgcm9vbXMgZm9yIGV2ZXJ5IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHRoaXMgb25lIGFuZCBJIGRvbid0IGNhcmUgZW5vdWdoIHRvIGRvIHRoYXQgcmlnaHQgbm93XHJcbiAgICAgICAgICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29udGFpbnMgKHRoaW5nIDogVGhpbmcpIHtcclxuICAgICAgICBsZXQgcm9vbSA9IHRoaW5nLmdldFJvb20oKTtcclxuICAgICAgICBpZiAocm9vbSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByZWdpb25zID0gUmVnaW9uLkluUmVsYXRpb24uZ2V0QWxsTGVmdChyb29tKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZ2lvbnMuaW5kZXhPZih0aGlzKSAhPSAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogV2FybmluZzogU2h1ZmZsZXJzIHdpbGwgYWx0ZXIgdGhlIGdpdmVuIGFycmF5XHJcbiAqL1xyXG5jbGFzcyBTaHVmZmxlcjxUPiB7XHJcbiAgICBwcml2YXRlIGFycmF5IDogQXJyYXk8VD47XHJcbiAgICBwcml2YXRlIHBvc2l0aW9uID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heWJlIHVzZSBzZWVkZWQgcmFuZG9tIHNvbWUgZGF5XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcm5nIDogKCkgPT4gbnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoYXJyYXkgOiBBcnJheTxUPiwgcm5nPyA6ICgpID0+IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMucm5nID0gcm5nID09IHVuZGVmaW5lZCA/IE1hdGgucmFuZG9tIDogcm5nO1xyXG4gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzdGFydCAoKSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSB0aGUgU2h1ZmZsZXIgQXJyYXlcclxuICAgICAqIENhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseVxyXG4gICAgICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBsZWZ0LCByZXR1cm5zIHVuZGVmaW5lZFxyXG4gICAgICogQHJldHVybnMge1R9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPbmUgKCkgOiBUIHtcclxuICAgICAgICAvLyBnZXQgYSByYW5kb20gZWxlbWVudCBmcm9tIHRoaXMucG9zaXRpb24gdG8gKGFycmF5Lmxlbmd0aCAtIDEpXHJcbiAgICAgICAgLy8gc3RvcmUgaXQgbG9jYWxseVxyXG4gICAgICAgIC8vIHN3aXRjaCBpdCB3aXRoIGFycmF5W3RoaXMucG9zaXRpb25dXHJcbiAgICAgICAgLy8gcmV0dXJuIGl0XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5hcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcih0aGlzLnJuZygpICogKHRoaXMuYXJyYXkubGVuZ3RoIC0gdGhpcy5wb3NpdGlvbikpICsgdGhpcy5wb3NpdGlvbjtcclxuICAgICAgICBsZXQgbG9jYWxDb3B5ID0gdGhpcy5hcnJheVt0aGlzLnBvc2l0aW9uXTtcclxuICAgICAgICB0aGlzLmFycmF5W3RoaXMucG9zaXRpb25dID0gdGhpcy5hcnJheVtyYW5kb21JbmRleF07XHJcbiAgICAgICAgdGhpcy5hcnJheVtyYW5kb21JbmRleF0gPSBsb2NhbENvcHk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbdGhpcy5wb3NpdGlvbisrXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZXJlIHNob3VsZCBiZSBubyByZWFzb24gdG8gdXNlIHRoaXMgd2l0aCB0aGUgXCJnZXRPbmVcIiBjb2RlIGFib3ZlLlxyXG4gICAgICogQHJldHVybnMge1RbXX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNodWZmbGVkICgpIDogQXJyYXk8VD4ge1xyXG4gICAgICAgIGxldCBhcnJheSA9IHRoaXMuYXJyYXkuc2xpY2UoMCk7XHJcbiAgICAgICAgdmFyIG0gPSBhcnJheS5sZW5ndGgsIHQsIGk7XHJcbiAgICAgICAgd2hpbGUgKG0pIHtcclxuICAgICAgICAgICAgaSA9IE1hdGguZmxvb3IodGhpcy5ybmcoKSAqIG0tLSk7XHJcbiAgICAgICAgICAgIHQgPSBhcnJheVttXTtcclxuICAgICAgICAgICAgYXJyYXlbbV0gPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgYXJyYXlbaV0gPSB0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FJLnRzXCIgLz5cclxubW9kdWxlIEFJUnVsZXMge1xyXG4gICAgZXhwb3J0IHZhciBQaWNrU2hpbnkgPSBBSS5ydWxlcy5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJQaWNrIFNoaW5pZXNcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogQUlSdWxlcy5QUklPUklUWV9BQ1RJTkdfT05fUExBQ0UsXHJcbiAgICAgICAgY29uZGl0aW9ucyA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxQZXJzb24+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgcmV0dXJuIHBlcnNvbi5BSS5waWNrc1NoaW5pZXM7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPFBlcnNvbj4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgcm9vbSA9IHBlcnNvbi5nZXRSb29tKCk7XHJcbiAgICAgICAgICAgIGxldCB2aXNpYmxlVGhpbmdzID0gcm9vbS5nZXRDb250YWluZWRBbmRWaXNpYmxlVG8ocGVyc29uKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh2aXNpYmxlVGhpbmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVRoaW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmlzaWJsZVRoaW5nc1tpXS5maXhlZEluUGxhY2UgJiYgdmlzaWJsZVRoaW5nc1tpXS5nZXRTaGlueSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aW9uVGFrZShwZXJzb24sIHZpc2libGVUaGluZ3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FJLnRzXCIgLz5cclxubW9kdWxlIEFJUnVsZXMge1xyXG4gICAgZXhwb3J0IHZhciBXYW5kZXIgPSBBSS5ydWxlcy5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJXYW5kZXJcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogQUlSdWxlcy5QUklPUklUWV9BQ1RJTkdfT05fSURMRSxcclxuICAgICAgICBjb25kaXRpb25zIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPFBlcnNvbj4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICByZXR1cm4gcGVyc29uLkFJLndhbmRlcmVyICYmIChNYXRoLnJhbmRvbSgpICogMTAwKSA+IHBlcnNvbi5BSS53YW5kZXJDaGFuY2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPFBlcnNvbj4pID0+IHtcclxuICAgICAgICAgICAgbGV0IHBlcnNvbiA9IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgcm9vbSA9IDxSb29tUmFuZG9tPiBwZXJzb24uZ2V0Um9vbSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBlcnNvbi5BSS53YW5kZXJzT24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzdGljayB0byByZWdpb24gd2hpbGUgd2FuZGVyaW5nXHJcbiAgICAgICAgICAgICAgICBpZiAocGVyc29uLkFJLndhbmRlcnNPbi5jb250YWluc1Jvb20ocm9vbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBbHJlZHkgaW4gcmVnaW9uLCBzbyBqdXN0IHdhbmRlciBvZmYgaW5zaWRlIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb25zID0gcm9vbS5jb25uZWN0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWFsQ29ubmVjdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uc1tpXSAhPSB1bmRlZmluZWQgJiYgcGVyc29uLkFJLndhbmRlcnNPbi5jb250YWluc1Jvb20oY29ubmVjdGlvbnNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsQ29ubmVjdGlvbnMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gKChuZXcgU2h1ZmZsZXIocmVhbENvbm5lY3Rpb25zKSkuZ2V0T25lKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aW9uR28ocGVyc29uLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gcmVnaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2lvblJvb21zID0gcGVyc29uLkFJLndhbmRlcnNPbi5nZXRSb29tcygpLmZpbHRlcigoYSA6IFJvb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBSb29tUmFuZG9tICYmIGEucGxhY2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBhY3R1YWxseSBtYWtlIGEgcGF0aCB0byBpdCBhbmQgY2hlY2sgdGhlIGRpc3RhbmNlLCBzaW5jZSBtYXplcyBjYW4gbWFrZSBpdCBiZSBsb25nZXIgdGhhbiBpdCByZWFsbHkgaXNcclxuICAgICAgICAgICAgICAgICAgICAvLyBCdXQgdGhpcyBpcyBxdWljayBhbmQgZGlydHkgZW5vdWdoLiBBbmQgc2luY2UgcmVnaW9ucyBhcmUgY2xvc2VseSBwYWNrZWQsIGV2ZW4gaWYgdGhpcyBpcyBub3QgcmVhbGx5IHRoZSBjbG9zZXN0IHJvb20sIHRoZSBOUEMgd2lsbCBlbmQgdXBcclxuICAgICAgICAgICAgICAgICAgICAvLyBlbnRlcmluZyB0aGUgcmVnaW9uIGVhcmxpZXIgYnkgYWNjaWRlbnQuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVnaW9uUm9vbXMuc29ydCgoYSA6IFJvb21SYW5kb20sIGIgOiBSb29tUmFuZG9tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXN0ID0gYS5nZXREaXN0YW5jZVRvKGIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtZGlzdDsgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBsYXRlc3QgZWxlbWVudCB3aWxsIGJlIHRoZSBjbG9zZXN0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgZWxlbWVudHMgd2lsbCBiZSB1bnJlYWNoYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRSb29tID0gcmVnaW9uUm9vbXMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25HbyhwZXJzb24sIHRhcmdldFJvb20pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8ganVzdCB3YW5kZXIgaW4gcmFuZG9tIGRpcmVjdGlvblxyXG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IHJvb20uZ2V0Q29ubmVjdGVkRGlyZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkdvKHBlcnNvbiwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SdWxlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL1J1bGVib29rLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUJvbGQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSW52ZW50b3J5SGFuZGxlci50c1wiIC8+XHJcblxyXG5jbGFzcyBBY3Rpb25Ecm9wIGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgPSBuZXcgUnVsZWJvb2s8QWN0aW9uRHJvcD4oXCJDaGVjayBEcm9wcGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgPSBuZXcgUnVsZWJvb2s8QWN0aW9uRHJvcD4oXCJDYXJyeSBvdXQgRHJvcHBpbmdcIik7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtTYXl9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiZHJvcCBcIiArICh0aGlzLmdldE5vdW4oMCkgIT0gdW5kZWZpbmVkID8gdGhpcy5nZXROb3VuKDApLmdldFByaW50ZWROYW1lKCkgOiBcIlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuQWN0aW9uRHJvcC5jaGVjay5hZGRSdWxlKFxyXG4gICAgbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkNoZWNrIERyb3BwaW5nIC0gQXJlIHlvdSBXZWFyaW5nIGl0P1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogYXN5bmMgKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uRHJvcD4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgbGV0IGFjdG9yID0gYWN0aW9uLmFjdG9yO1xyXG4gICAgICAgICAgICBsZXQgdGhpbmcgPSAoPFRoaW5nPmFjdGlvbi5nZXROb3VuKDApKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChUaGluZy5XZWFyUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gYWN0b3IgfHwgVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRMZWZ0KHRoaW5nKSA9PSBhY3Rvcil7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCIoZmlyc3QgdGFraW5nIG9mZiB0aGUgXCIsIHRoaW5nLCBcIilcIiwgU2F5LkxJTkVfQlJFQUspO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRha2luZ0FjdGlvbiA9IG5ldyBBY3Rpb25SZW1vdmUoYWN0b3IsIHRoaW5nKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRha2luZ0FjdGlvbi5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5LmFkZCh0YWtpbmdBY3Rpb24uc2F5KTtcclxuICAgICAgICAgICAgICAgIGlmIChUaGluZy5XZWFyUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gYWN0b3IgfHwgVGhpbmcuV2llbGRSZWxhdGlvbi5nZXRMZWZ0KHRoaW5nKSA9PSBhY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGFjdGlvbi5zYXkuYWRkKFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbik7XHJcblxyXG5BY3Rpb25Ecm9wLmNoZWNrLmFkZFJ1bGUoXHJcbiAgICBuZXcgUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiQ2hlY2sgRHJvcHBpbmcgLSBEbyB5b3UgaGF2ZSBpdD8/XCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25Ecm9wPikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gPEFjdGlvbkdvPiBydWxlYm9vay5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFRoaW5nLkNhcnJ5UmVsYXRpb24uZ2V0TGVmdCh0aGluZykgIT0gYWN0b3Ipe1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQoXCJZb3UgZG9uJ3QgaGF2ZSBpdC5cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4pO1xyXG5cclxuQWN0aW9uRHJvcC5jYXJyeS5hZGRSdWxlKFxyXG4gICAgbmV3IFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkRyb3BwaW5nIC0gUGxhY2UgdGhlIG5vdW4gb24gdGhlIGZsb29yXCIsXHJcbiAgICAgICAgY29kZSA6IChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvbkRyb3A+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSA8QWN0aW9uR28+IHJ1bGVib29rLm5vdW47XHJcbiAgICAgICAgICAgIGxldCBhY3RvciA9IGFjdGlvbi5hY3RvcjtcclxuICAgICAgICAgICAgbGV0IHRoaW5nID0gKDxUaGluZz5hY3Rpb24uZ2V0Tm91bigwKSk7XHJcblxyXG4gICAgICAgICAgICBUaGluZy5FbmNsb3NlZFJlbGF0aW9uLnVuc2V0UmlnaHQodGhpbmcpO1xyXG5cclxuICAgICAgICAgICAgYWN0b3IuZ2V0Um9vbSgpLnBsYWNlKHRoaW5nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RvciA9PSBXb3JsZFN0YXRlLnBsYXllcikge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheUJvbGQoKDxUaGluZz4gYWN0aW9uLmdldE5vdW4oMCkpLmdldFByaW50ZWROYW1lKCkgKyBcIjogXCIpLCBcIkRyb3BwZWQuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheS5hZGQobmV3IFNheVRoZSgpLCBhY3RvciwgXCIgZHJvcHMgXCIsIG5ldyBTYXlUaGUoKSwgKDxUaGluZz4gYWN0aW9uLmdldE5vdW4oMCkpLCBcIiBvbiB0aGUgZmxvb3IuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBIeXBlcmxpbmtpbmdcclxuICovXHJcbkVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuSHlwZXJsaW5raW5nUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZShcclxuICAgIHtcclxuICAgICAgICBuYW1lIDogXCJIeXBlcmxpbmsgLSBEcm9wXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmIChUaGluZy5DYXJyeVJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IFdvcmxkU3RhdGUucGxheWVyIHx8IFRoaW5nLldpZWxkUmVsYXRpb24uZ2V0TGVmdCh0aGluZykgPT0gV29ybGRTdGF0ZS5wbGF5ZXIgfHwgVGhpbmcuV2VhclJlbGF0aW9uLmdldExlZnQodGhpbmcpID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZEF2YWlsYWJsZUFjdGlvbihcIkRyb3BcIiwgbmV3IEFjdGlvbkRyb3AoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbikpO1xyXG5cclxuLyoqXHJcbiBJbnZlbnRvcnlcclxuICovXHJcbkVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIuTGlua2luZ1RoaW5nLmFkZFJ1bGUobmV3IFJ1bGUoXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZSA6IFwiSW52ZW50b3J5IC0gRHJvcFwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkludmVudG9yeUhhbmRsZXIucHJpbnRUaGluZ0xpbmsoXCJEXCIsIG5ldyBBY3Rpb25Ecm9wKFdvcmxkU3RhdGUucGxheWVyLCB0aGluZykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuKSk7IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0FjdGlvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi9FbGVtZW50cy9Nb2R1bGVzL0ludmVudG9yeUhhbmRsZXIudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkvU2F5Qm9sZC50c1wiIC8+XHJcblxyXG5jbGFzcyBBY3Rpb25JbnZlbnRvcnkgZXh0ZW5kcyBBY3Rpb24ge1xyXG4gICAgcHVibGljIHJlcXVpcmVzVHVybiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlcXVpcmVzTm91biA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlcXVpcmVzVmlzaWJpbGl0eSA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgOiBSdWxlYm9vazxBY3Rpb25JbnZlbnRvcnk+ID0gbmV3IFJ1bGVib29rKFwiQ2hlY2sgVGFraW5nIEludmVudG9yeVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2FycnkgOiBSdWxlYm9vazxBY3Rpb25JbnZlbnRvcnk+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFRha2luZyBJbnZlbnRvcnlcIik7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gYSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSBwbGF5ZXIgd2lsbCBkbyBpZiBoZSBkb2VzIHRoaXMgYWN0aW9uLlxyXG4gICAgICogRm9yIGluc3RhbmNlLCBBY3Rpb25UYWtpbmcgc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbGlrZSByZXR1cm4gXCJ0YWtlIFwiICsgdGhpcy5ub3Vuc1swXS5nZXROYW1lKCksXHJcbiAgICAgKiAgIHdoaWNoIHdvdWxkIHJlYWQgYXMgXCJ0YWtlIHRoaW5nXCIuXHJcbiAgICAgKiAgIHJlbWVtYmVyIHRoYXQgdGhpbmdzIGltcGxlbWVudCBQUklOVEFCTEUgaW50ZXJmYWNlLCBzbyB5b3UgY2FuIGdldCB0aGVpciBuYW1lcy5cclxuICAgICAqIEByZXR1cm5zIHtTYXl9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21tYW5kVGV4dCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwidGFrZSBpbnZlbnRvcnlcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUJ1dHRvbiAodGhpbmcgOiBUaGluZywgcmVzb2x2ZSA6ICh0IDogVGhpbmcpID0+IHZvaWQpIHtcclxuICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgIHAuY2xhc3NMaXN0LmFkZChcImNob2ljZVwiKTtcclxuICAgICAgICBsZXQgZWxlbWVudHMgPSBhd2FpdCAoKG5ldyBTYXkodGhpbmcpKS5nZXRQdXJlRWxlbWVudHMoKSk7XHJcbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGUgPT4ge1xyXG4gICAgICAgICAgICBwLmFwcGVuZENoaWxkKGVsZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHAuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0aGluZyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKHAsIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0Rmlyc3RLZXlDb2RlKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrSW52ZW50b3J5UnVsZSA9IEFjdGlvbkludmVudG9yeS5jaGVjay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJMaXN0IGludmVudG9yeSBhcyBvcHRpb25zXCIsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jIChydWxlYm9vayA6IFJ1bGVib29rUnVubmVyPEFjdGlvblRha2U+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwbGF5ZXIgPSBXb3JsZFN0YXRlLnBsYXllcjtcclxuICAgICAgICAgICAgbGV0IHdpZWxkZWQgPSBUaGluZy5XaWVsZFJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuc29ydChFbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLnRoaW5nU29ydCk7XHJcbiAgICAgICAgICAgIGxldCB3b3JuID0gVGhpbmcuV2VhclJlbGF0aW9uLmdldFJpZ2h0KHBsYXllcikuc29ydChFbGVtZW50cy5JbnZlbnRvcnlIYW5kbGVyLnRoaW5nU29ydCk7XHJcbiAgICAgICAgICAgIGxldCBjYXJyaWVkID0gVGhpbmcuQ2FycnlSZWxhdGlvbi5nZXRSaWdodChwbGF5ZXIpLnNvcnQoRWxlbWVudHMuSW52ZW50b3J5SGFuZGxlci50aGluZ1NvcnQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGJ1dHRvbnM7XHJcbiAgICAgICAgICAgIGxldCBjaG9zZW5Qcm9taXNlID0gbmV3IFByb21pc2UoKGFzeW5jIHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkoKTtcclxuICAgICAgICAgICAgICAgIGlmICh3aWVsZGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKG5ldyBTYXlCb2xkKFwiV2llbGRlZDpcIiksIFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZWxkZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChhd2FpdCBBY3Rpb25JbnZlbnRvcnkuY3JlYXRlQnV0dG9uKHdpZWxkZWRbaV0sIHJlc29sdmUpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdvcm4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzYXkuc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFNheS5QQVJBR1JBUEhfQlJFQUspO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKG5ldyBTYXlCb2xkKFwiV29ybjpcIiksIFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcm4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChhd2FpdCBBY3Rpb25JbnZlbnRvcnkuY3JlYXRlQnV0dG9uKHdvcm5baV0sIHJlc29sdmUpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNhcnJpZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzYXkuc2VxdWVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFNheS5QQVJBR1JBUEhfQlJFQUspO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKG5ldyBTYXlCb2xkKFwiQ2FycmllZDpcIiksIFNheS5MSU5FX0JSRUFLKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhcnJpZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F5LmFkZChhd2FpdCBBY3Rpb25JbnZlbnRvcnkuY3JlYXRlQnV0dG9uKGNhcnJpZWRbaV0sIHJlc29sdmUpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNheS5zZXF1ZW5jZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9ucyA9IGF3YWl0IHNheS5nZXRIVE1MQ29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KC4uLihidXR0b25zKSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjaG9zZW5UaGluZyA9IGF3YWl0IGNob3NlblByb21pc2U7XHJcbiAgICAgICAgICAgIGlmIChjaG9zZW5UaGluZyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci51bnByaW50KC4uLmJ1dHRvbnMpO1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25FeGFtaW5lKFdvcmxkU3RhdGUucGxheWVyLCBjaG9zZW5UaGluZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBydWxlYm9vay5ub3VuLnNheS5hZGQoXCJZb3UgaGF2ZSBub3RoaW5nLlwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkNvbW1vbkFjdGlvbnNSdWxlYm9vay5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIkFkZCBUYWtlIEludmVudG9yeSBDb21tYW5kIFJ1bGVcIixcclxuICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8dm9pZD4pID0+IHtcclxuICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZENvbW1vbkFjdGlvbihcIkludmVudG9yeVwiLCBuZXcgQWN0aW9uSW52ZW50b3J5KFdvcmxkU3RhdGUucGxheWVyKSk7XHJcbiAgICB9XHJcbn0pKTsiLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQWN0aW9uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL01vZHVsZXMvSHlwZXJsaW5rSGFuZGxlci50c1wiIC8+XHJcbmNsYXNzIEFjdGlvblNhdmVHYW1lIGV4dGVuZHMgQWN0aW9uIHtcclxuICAgIHB1YmxpYyByZXF1aXJlc1R1cm4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc05vdW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc1Zpc2liaWxpdHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgOiBSdWxlYm9vazxBY3Rpb25TYXZlR2FtZT4gPSBuZXcgUnVsZWJvb2soXCJDaGVjayBTYXZpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5IDogUnVsZWJvb2s8QWN0aW9uU2F2ZUdhbWU+ID0gbmV3IFJ1bGVib29rKFwiQ2Fycnkgb3V0IFNhdmluZ1wiKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcInNhdmUgdG8gZmlsZVwiO1xyXG4gICAgfVxyXG59XHJcblxyXG5BY3Rpb25TYXZlR2FtZS5jYXJyeS5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIlNhdmUgdGhlIGdhbWVcIixcclxuICAgIGNvZGUgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgIFNhdmVIYW5kbGVyLnNhdmVUb0ZpbGUoKTtcclxuICAgICAgICBydW5uZXIubm91bi5zYXkuYWRkKFwiU2F2ZWQuXCIpO1xyXG4gICAgfVxyXG59KSk7XHJcblxyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkNvbW1vbkFjdGlvbnNSdWxlYm9vay5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIkFkZCBTYXZlIENvbW1hbmQgUnVsZVwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgcHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0xPV0VTVCxcclxuICAgIGNvZGUgOiAocnVsZWJvb2sgOiBSdWxlYm9va1J1bm5lcjx2b2lkPikgPT4ge1xyXG4gICAgICAgIEVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuYWRkQ29tbW9uQWN0aW9uKFwiU2F2ZVwiLCBuZXcgQWN0aW9uU2F2ZUdhbWUoV29ybGRTdGF0ZS5wbGF5ZXIpKTtcclxuICAgIH1cclxufSkpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL0VsZW1lbnRzL0NsYXNzZXMvU2F5L1NheUhlU2hlSXQudHNcIiAvPlxyXG5cclxuY2xhc3MgQWN0aW9uVGFsayBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX1NJVFVBVElPTl9ESUFMT0dVRSA9IDk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX1BPU1NFU1NJT05fRElBTE9HVUUgPSA3O1xyXG4gICAgcHVibGljIHN0YXRpYyBQUklPUklUWV9MT0NBVElPTl9ESUFMT0dVRSA9IDU7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX0NPTU1PTl9ESUFMT0dVRSA9IDM7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSSU9SSVRZX0dMT0JBTF9ESUFMT0dVRSA9IDE7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjaGVjazogUnVsZWJvb2s8QWN0aW9uVGFsaz4gPSBuZXcgUnVsZWJvb2soXCJDaGVjayBUYWxraW5nXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBjYXJyeTogUnVsZWJvb2s8QWN0aW9uVGFsaz4gPSBuZXcgUnVsZWJvb2soXCJDYXJyeSBvdXQgVGFsa2luZ1wiKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRDYXJyeVRhbGtpbmdSdWxlID0gQWN0aW9uVGFsay5jYXJyeS5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJUYWxraW5nIC0gRG9lc24ndCB3YW50IHRvIHRhbGtcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogLTEsXHJcbiAgICAgICAgcHJpb3JpdHkgOiAtMSxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8QWN0aW9uVGFrZT4pID0+IHtcclxuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IDxBY3Rpb25Hbz4gcnVsZWJvb2subm91bjtcclxuICAgICAgICAgICAgLy9sZXQgYWN0b3IgPSBhY3Rpb24uYWN0b3I7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9ICg8VGhpbmc+YWN0aW9uLmdldE5vdW4oMCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgUGVyc29uKSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb24uc2F5ID0gbmV3IFNheShcIkl0IGRvZXNuJ3QgbG9vayBsaWtlIFwiLCBuZXcgU2F5SGVTaGVJdCh0aGluZyksIFwiIHdhbnRzIHRvIHRhbGsuXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnNheSA9IG5ldyBTYXkoXCJIb3cgYXJlIHlvdSBnb2luZyB0byB0YWxrIHRvIHRoYXQ/XCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcInRhbGsgdG8gXCIgKyAodGhpcy5nZXROb3VuKDApICE9IHVuZGVmaW5lZCA/IHRoaXMuZ2V0Tm91bigwKS5nZXRQcmludGVkTmFtZSgpIDogXCJcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbkVsZW1lbnRzLkh5cGVybGlua0hhbmRsZXIuSHlwZXJsaW5raW5nUnVsZWJvb2suYWRkUnVsZShuZXcgUnVsZShcclxuICAgIHtcclxuICAgICAgICBuYW1lIDogXCJIeXBlcmxpbmsgLSBUYWxrXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8VGhpbmc+KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB0aGluZyA9IDxUaGluZz4gcnVsZWJvb2subm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFBlcnNvbiAmJiB0aGluZy5nZXRSb29tKCkgPT0gV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0Um9vbSgpKSB7XHJcbiAgICAgICAgICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZEF2YWlsYWJsZUFjdGlvbihcIlRhbGtcIiwgbmV3IEFjdGlvblRhbGsoV29ybGRTdGF0ZS5wbGF5ZXIsIHRoaW5nKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbikpOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9BY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvTW9kdWxlcy9IeXBlcmxpbmtIYW5kbGVyLnRzXCIgLz5cclxuY2xhc3MgQWN0aW9uV2FpdCBleHRlbmRzIEFjdGlvbiB7XHJcbiAgICBwdWJsaWMgcmVxdWlyZXNUdXJuID0gdHJ1ZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc05vdW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZXF1aXJlc1Zpc2liaWxpdHkgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2sgOiBSdWxlYm9vazxBY3Rpb25XYWl0PiA9IG5ldyBSdWxlYm9vayhcIkNoZWNrIFdhaXRpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIGNhcnJ5IDogUnVsZWJvb2s8QWN0aW9uV2FpdD4gPSBuZXcgUnVsZWJvb2soXCJDYXJyeSBvdXQgV2FpdGluZ1wiKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29tbWFuZFRleHQgKCkge1xyXG4gICAgICAgIHJldHVybiBcIndhaXRcIjtcclxuICAgIH1cclxufVxyXG5cclxuQWN0aW9uV2FpdC5jYXJyeS5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIlByaW50IHdhaXRpbmcgbWVzc2FnZVwiLFxyXG4gICAgY29kZSA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgaWYgKHJ1bm5lci5ub3VuLmFjdG9yID09IFdvcmxkU3RhdGUucGxheWVyKSB7XHJcbiAgICAgICAgICAgIHJ1bm5lci5ub3VuLnNheS5hZGQoXCJZb3Ugd2FpdC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KSk7XHJcblxyXG5FbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLkNvbW1vbkFjdGlvbnNSdWxlYm9vay5hZGRSdWxlKG5ldyBSdWxlKHtcclxuICAgIG5hbWUgOiBcIkFkZCBXYWl0IENvbW1hbmQgUnVsZVwiLFxyXG4gICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbiAgICBjb2RlIDogKHJ1bGVib29rIDogUnVsZWJvb2tSdW5uZXI8dm9pZD4pID0+IHtcclxuICAgICAgICBFbGVtZW50cy5IeXBlcmxpbmtIYW5kbGVyLmFkZENvbW1vbkFjdGlvbihcIldhaXRcIiwgbmV3IEFjdGlvbldhaXQoV29ybGRTdGF0ZS5wbGF5ZXIpKTtcclxuICAgIH1cclxufSkpOyIsImNsYXNzIENvbnRlbnREZXNjcmlwdGlvbiB7XHJcbiAgICBwdWJsaWMgbmFtZSA6IHN0cmluZztcclxuICAgIHB1YmxpYyBncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwO1xyXG5cdHB1YmxpYyBkZXNjcmlwdGlvbiA6IFNheSB8ICgoZGVzY3JpcHRpb24gOiBDb250ZW50RGVzY3JpcHRpb24sIGdyb3VwIDogQ29udGVudFVuaXQgfCBDb250ZW50R3JvdXApID0+IFNheSk7XHJcblx0cHJpdmF0ZSBzYWlkQ291bnQgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobmFtZSA6IHN0cmluZywgZ3JvdXAgOiBDb250ZW50VW5pdCB8IENvbnRlbnRHcm91cCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTY29yZSAoKSB7XHJcbiAgICBcdHJldHVybiAodGhpcy5ncm91cCkuZ2V0U2NvcmUoKTtcclxuXHR9XHJcblx0XHJcblx0cHVibGljIGdldERlc2NyaXB0aW9uIChncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwKSA6IFNheSB7XHJcblx0XHR0aGlzLnNhaWRDb3VudCsrO1xyXG5cdFx0aWYgKHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0ICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uKHRoaXMsIGdyb3VwKTtcclxuICAgICAgICB9XHJcblx0XHRyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXREZXNjcmlwdGlvbiAoZGVzY3JpcHRpb24gOiBTYXkgfCBzdHJpbmcgfCAoKGRlc2NyaXB0aW9uIDogQ29udGVudERlc2NyaXB0aW9uLCBncm91cCA6IENvbnRlbnRVbml0IHwgQ29udGVudEdyb3VwKSA9PiBTYXkpICkge1xyXG4gICAgXHRpZiAoIShkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIFNheSkpIHtcclxuICAgIFx0XHR0aGlzLmRlc2NyaXB0aW9uID0gbmV3IFNheShkZXNjcmlwdGlvbik7XHJcblx0XHR9IGVsc2Uge1xyXG4gICAgXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHRcclxuXHRwdWJsaWMgc3RhdGljIHBpY2tEZXNjcmlwdGlvbnMgKGNkYSA6IEFycmF5PENvbnRlbnREZXNjcmlwdGlvbj4sIHRhcmdldCA6IENvbnRlbnRHcm91cCB8IENvbnRlbnRVbml0KSA6IEFycmF5PFNheT4ge1xyXG5cdFx0bGV0IGEgPSBjZGEuc2xpY2UoKTtcclxuXHRcdGxldCBncm91cHMgPSBbXTtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoYS5sZW5ndGggLSBpKSkgKyBpO1xyXG4gICAgICAgICAgICBsZXQgdGVtcCA9IGFbaV07XHJcbiAgICAgICAgICAgIGFbaV0gPSBhW3JhbmRvbUluZGV4XTtcclxuICAgICAgICAgICAgYVtyYW5kb21JbmRleF0gPSB0ZW1wO1xyXG4gICAgICAgIH1cclxuXHRcdFxyXG5cdFx0Ly8gQWZ0ZXIgc2h1ZmZsaW5nIHRoZSBsaXN0LCBkZXNjcmlwdGlvbnMgd2l0aCB0aGUgaGlnaGVzdCBzY29yZXMgZ28gYXQgdGhlIHRvcCwgYW5kIGJldHdlZW4gdGhvc2UgdGhlIG9uZXMgd2l0aCB0aGUgbG93ZXN0IHNhaWRDb3VudHMgZ28gZmlyc3RcclxuICAgICAgICAvLyBJZiBtdWx0aXBsZSBkZXNjcmlwdGlvbnMgaGF2ZSB0aGUgc2FtZSBzY29yZS9zYWlkQ291bnQsIHRoZXkgYXJlIHBpY2tlZCByYW5kb21seSBkdWUgdG8gdGhlIHByZXZpb3VzIHNodWZmbGluZy5cclxuICAgICAgICBhLnNvcnQoKGEgOiBDb250ZW50RGVzY3JpcHRpb24sIGIgOiBDb250ZW50RGVzY3JpcHRpb24pID0+IHtcclxuICAgICAgICAgICAgbGV0IHNjb3JlQSA9IGEuZ2V0U2NvcmUoKSAvIChhLnNhaWRDb3VudCArIDEpO1xyXG4gICAgICAgICAgICBsZXQgc2NvcmVCID0gYi5nZXRTY29yZSgpIC8gKGIuc2FpZENvdW50ICsgMSk7IC8vIEJ5IGRpdmlkaW5nIHRoZSBzY29yZSBnYnkgdGhlIGFtb3VudCBvZiB0aW1lcyBpdCB3YXMgc2FpZCB3ZSBpbmNyZWFzZSByb3RhdGlvbiBvZiBkZXNjcmlwdGlvbnNcclxuICAgICAgICAgICAgaWYgKHNjb3JlQSAhPSBzY29yZUIpIHJldHVybiBzY29yZUIgLSBzY29yZUE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHRcdGEuZm9yRWFjaChkZXNjcmlwdGlvbiA9PiB7XHJcblx0XHRcdGdyb3Vwcy5wdXNoKGRlc2NyaXB0aW9uLmdyb3VwKTtcclxuXHRcdH0pO1xyXG5cclxuICAgICAgICBsZXQgbWF0Y2hlcyA9ICg8YW55PiB0YXJnZXQpLm1hdGNoQWdhaW5zdCg8YW55PiBncm91cHMpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzICE9IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRcdG1hdGNoZXMuZm9yRWFjaChpID0+IHtcclxuXHRcdFx0XHRyZXN1bHQucHVzaChhW2ldLmdldERlc2NyaXB0aW9uKHRhcmdldCkpO1xyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKG5ldyBTYXkoXCIgXCIpKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9IGVsc2Uge1xyXG4gICAgICAgIFx0Y29uc29sZS53YXJuKFwiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvclwiLCB0YXJnZXQpO1xyXG4gICAgICAgIFx0cmV0dXJuIFtuZXcgU2F5KFwiV2FybmluZzogTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBzaXR1YXRpb24uIFBsZWFzZSByZXBvcnQgc28gaXQgY2FuIGJlIGNvcnJlY3RlZC5cIildO1xyXG5cdFx0fVxyXG5cdH1cclxufSIsImludGVyZmFjZSBDb250ZW50RGlmZmVyZW50aWFsQ29tcGFyaXNvblJlc3VsdCB7XHJcbiAgICBtYXRjaGluZyA6IEFycmF5PFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXI+O1xyXG4gICAgdW5tYXRjaGVkIDogQXJyYXk8VGhpbmcgfCB0eXBlb2YgVGhpbmcgfCBDb250ZW50RGlmZmVyZW50aWFsIHwgQ29udGVudE1hcmtlcj47XHJcbn1cclxuXHJcbmNsYXNzIENvbnRlbnREaWZmZXJlbnRpYWwge1xyXG4gICAgcHVibGljIG5vdW5zIDogQXJyYXk8VGhpbmcgfCB0eXBlb2YgVGhpbmcgfCBDb250ZW50RGlmZmVyZW50aWFsIHwgQ29udGVudE1hcmtlcj4gPSBbXTtcclxuICAgIHB1YmxpYyBzY29yZSA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICguLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLmFkZE5vdW4oLi4ubm91bnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGROb3VuICguLi5ub3VucyA6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBub3Vucy5mb3JFYWNoKG5vdW4gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm5vdW5zLnB1c2gobm91bik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ2V0U2NvcmUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm91bnMgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vdW5zO1xyXG4gICAgfVxyXG5cdFxyXG5cdHB1YmxpYyByZXBsYWNlTm91bnMgKC4uLm5vdW5zIDogQXJyYXk8YW55Pikge1xyXG5cdFx0dGhpcy5ub3VucyA9IG5vdW5zO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuICAgIHB1YmxpYyBpc01hdGNoIChjZCA6IENvbnRlbnREaWZmZXJlbnRpYWwsIGFsbG93UGFydGlhbCA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGNoZWNrID0gdGhpcy5nZXRVbm1hdGNoZWQoY2QpO1xyXG4gICAgICAgIGlmICgoYWxsb3dQYXJ0aWFsIHx8IGNoZWNrLnVubWF0Y2hlZC5sZW5ndGggPT0gMCkgJiYgY2hlY2subWF0Y2hpbmcubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5tYXRjaGluZy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrLnVubWF0Y2hlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hlY2sudW5tYXRjaGVkW2ldIGluc3RhbmNlb2YgQ29udGVudE1hcmtlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoPENvbnRlbnRNYXJrZXI+IGNoZWNrLnVubWF0Y2hlZFtpXSkuaXNJbXBvcnRhbnQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFVubWF0Y2hlZCAoY2QgOiBDb250ZW50RGlmZmVyZW50aWFsKSA6IENvbnRlbnREaWZmZXJlbnRpYWxDb21wYXJpc29uUmVzdWx0IHtcclxuICAgICAgICBsZXQgdW5tYXRjaGVkID0gY2Qubm91bnMuc2xpY2UoKTtcclxuICAgICAgICBsZXQgbWF0Y2hpbmcgPSB0aGlzLm5vdW5zLnNsaWNlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSB1bm1hdGNoZWQubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50RGlmZmVyZW50aWFsLmNvbXBhcmVOb3VucyhtYXRjaGluZ1tpXSwgdW5tYXRjaGVkW2tdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5zcGxpY2UoaywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG1hdGNoaW5nIDogbWF0Y2hpbmcsXHJcbiAgICAgICAgICAgIHVubWF0Y2hlZCA6IHVubWF0Y2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNjb3JlICgpIHtcclxuICAgICAgICBsZXQgaGlnaGVzdCA9IDA7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5ub3Vucy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMubm91bnMuZm9yRWFjaCgobm91bikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSBDb250ZW50RGlmZmVyZW50aWFsLmdldE5vdW5MZXZlbChub3VuKTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hlc3QgPCBsZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaGVzdCA9IGxldmVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBoaWdoZXN0ICsgKGNvdW50IC8gMTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE5vdW5MZXZlbCAobm91biA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXIpIHtcclxuICAgICAgICBpZiAobm91biA9PSB1bmRlZmluZWQgfHwgbm91biA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5vdW4gPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIGlmICg8YW55Pm5vdW4ucHJvdG90eXBlIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzcGVjaWZpdHkgPSAyOyAvLyBWYWd1ZSBUaGluZ1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5vdW4pO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudENsYXNzICE9IFRoaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaXR5ICs9IDAuMTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJlbnRDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaXR5O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDIuNTsgLy8gSXQncyBub3QgYSBcIlRoaW5nXCIsIHNvIGl0J3MgcHJvYmFibHkgYSB3ZWlyZCBjbGFzcywgd2hpY2ggaXMga2luZCBvZiBzcGVjaWZpY1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChub3VuIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDQ7IC8vIFNwZWNpZmljIHRoaW5nXHJcbiAgICAgICAgfSBlbHNlIGlmIChub3VuIGluc3RhbmNlb2YgQ29udGVudERpZmZlcmVudGlhbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTsgLy8gTWlub3IgdGhpbmdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMC41O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmVOb3VucyAoYSA6IFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbCB8IENvbnRlbnRNYXJrZXIsIGIgOiBUaGluZyB8IHR5cGVvZiBUaGluZyB8IENvbnRlbnREaWZmZXJlbnRpYWwgfCBDb250ZW50TWFya2VyKSB7XHJcbiAgICAgICAgaWYgKGEgPT0gdW5kZWZpbmVkIHx8IGEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBhID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAvLyBiIG11c3QgaW5oZXJpdCBhIG9yIGJlIGFcclxuICAgICAgICAgICAgcmV0dXJuIGIgPT0gYSB8fCBiIGluc3RhbmNlb2YgYSB8fCAodHlwZW9mIGIgPT0gXCJmdW5jdGlvblwiICYmICg8YW55PmIpLnByb3RvdHlwZSBpbnN0YW5jZW9mIGEpXHJcbiAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgVGhpbmcpIHtcclxuICAgICAgICAgICAgLy8gYiBtdXN0IGJlIGFcclxuICAgICAgICAgICAgcmV0dXJuIGIgPT0gYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpc01hdGNoIChtYXRjaEZyb20gOiBBcnJheTxDb250ZW50RGlmZmVyZW50aWFsPiwgbWF0Y2hBZ2FpbnN0IDogQXJyYXk8Q29udGVudERpZmZlcmVudGlhbD4pIHtcclxuICAgICAgICBsZXQgdW5tYXRjaGVkID0gbWF0Y2hBZ2FpbnN0LnNsaWNlKCk7XHJcbiAgICAgICAgbGV0IG1hdGNoaW5nID0gbWF0Y2hGcm9tLnNsaWNlKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSB1bm1hdGNoZWQubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ1tpXS5pc01hdGNoKHVubWF0Y2hlZFtrXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWQuc3BsaWNlKGssIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodW5tYXRjaGVkLmxlbmd0aCA9PSAwICYmIG1hdGNoaW5nLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodW5tYXRjaGVkLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBvbmx5IHRoaW5nIG1pc3NpbmcgYXJlIHVuaW1wb3J0YW50IENvbnRlbnRNYXJrZXJzXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBub3VucyA9IG1hdGNoaW5nW2ldLmdldE5vdW5zKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG5vdW5zLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobm91bnNba10gaW5zdGFuY2VvZiBDb250ZW50TWFya2VyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCg8Q29udGVudE1hcmtlcj4gbm91bnNba10pLmlzSW1wb3J0YW50KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBOb3RoaW5nIGltcG9ydGFudCBmb3VuZFxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59IiwiZW51bSBDb250ZW50R3JvdXBNYXRjaCB7XG4gICAgTk9fTUFUQ0gsXG4gICAgUEFSVElBTF9NQVRDSCxcbiAgICBQRVJGRUNUX01BVENIXG59XG5cbmludGVyZmFjZSBDb250ZW50R3JvdXBNYXRjaFJlc3VsdCB7XG4gICAgdHlwZSA6IENvbnRlbnRHcm91cE1hdGNoO1xuICAgIHVubWF0Y2hlZCA6IEFycmF5PENvbnRlbnRVbml0Pjtcbn1cblxuY2xhc3MgQ29udGVudEdyb3VwIHtcbiAgICBwcml2YXRlIHVuaXRzIDogQXJyYXk8Q29udGVudFVuaXQ+ID0gW107XG4gICAgcHJpdmF0ZSBtYXRjaGluZyA6IEFycmF5PENvbnRlbnRVbml0PjtcblxuICAgIGNvbnN0cnVjdG9yICguLi51bml0cyA6IEFycmF5PENvbnRlbnRVbml0Pikge1xuICAgICAgICB1bml0cy5mb3JFYWNoKHVuaXQgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRVbml0KHVuaXQpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRVbml0ICh1bml0IDogQ29udGVudFVuaXQpIHtcbiAgICAgICAgdGhpcy51bml0cy5wdXNoKHVuaXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLm1hdGNoaW5nID0gdGhpcy51bml0cy5zbGljZSgpO1xuICAgIH1cblx0XG5cdHB1YmxpYyBpc01hdGNoaW5nICgpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXRjaGluZy5sZW5ndGg7XG5cdH1cblxuICAgIHB1YmxpYyBzZXRNYXRjaGluZyAobWF0Y2hpbmcgOiBBcnJheTxDb250ZW50VW5pdD4pIHtcbiAgICAgICAgdGhpcy5tYXRjaGluZyA9IG1hdGNoaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc01hdGNoIChjZyA6IENvbnRlbnRHcm91cCkgOiBDb250ZW50R3JvdXBNYXRjaFJlc3VsdCB7XG4gICAgICAgIGxldCB1bm1hdGNoZWQgPSBjZy5tYXRjaGluZy5zbGljZSgpO1xuICAgICAgICBsZXQgbWF0Y2hpbmcgPSB0aGlzLnVuaXRzLnNsaWNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gdW5tYXRjaGVkLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nW2ldLmlzTWF0Y2godW5tYXRjaGVkW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWQuc3BsaWNlKGssIDEpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGluZy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlIDogbWF0Y2hpbmcubGVuZ3RoID4gMCA/IENvbnRlbnRHcm91cE1hdGNoLk5PX01BVENIIDpcbiAgICAgICAgICAgICAgICAgICAgdW5tYXRjaGVkLmxlbmd0aCA9PSAwID8gQ29udGVudEdyb3VwTWF0Y2guUEVSRkVDVF9NQVRDSCA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50R3JvdXBNYXRjaC5QQVJUSUFMX01BVENILFxuICAgICAgICAgICAgdW5tYXRjaGVkIDogdW5tYXRjaGVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2NvcmUgKCkge1xuICAgICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgICB0aGlzLnVuaXRzLmZvckVhY2godW5pdCA9PiB7XG4gICAgICAgICAgICBzY29yZSArPSB1bml0LmdldFNjb3JlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzY29yZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hBZ2FpbnN0IChhIDogQXJyYXk8Q29udGVudEdyb3VwPikgOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGFbaV0uaXNNYXRjaCh0aGlzKTtcbiAgICAgICAgICAgIGlmIChtYXRjaC50eXBlICE9IENvbnRlbnRHcm91cE1hdGNoLk5PX01BVENIKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWF0Y2hpbmcobWF0Y2gudW5tYXRjaGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5pc01hdGNoaW5nKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn0iLCJjbGFzcyBDb250ZW50TWFya2VyIHtcclxuICAgIHB1YmxpYyBuYW1lIDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRhbnQgOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IgKG5hbWUgOiBzdHJpbmcsIGltcG9ydGFudD8gOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLmltcG9ydGFudCA9IGltcG9ydGFudCA9PSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0ltcG9ydGFudCAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0YW50O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkNvbnRlbnREaWZmZXJlbnRpYWwudHNcIiAvPlxyXG5jbGFzcyBDb250ZW50VW5pdCB7XHJcbiAgICBwdWJsaWMgY2F0ZWdvcmllcyA6IEFycmF5PENvbnRlbnREaWZmZXJlbnRpYWw+ID0gW107XHJcblxyXG4gICAgcHVibGljIGFkZENhdGVnb3J5ICguLi5ub3VucyA6IEFycmF5PFRoaW5nIHwgdHlwZW9mIFRoaW5nIHwgQ29udGVudERpZmZlcmVudGlhbD4pIHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaChuZXcgQ29udGVudERpZmZlcmVudGlhbCguLi5ub3VucykpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc01hdGNoIChjdSA6IENvbnRlbnRVbml0KSB7XHJcbiAgICAgICAgcmV0dXJuIENvbnRlbnREaWZmZXJlbnRpYWwuaXNNYXRjaCh0aGlzLmNhdGVnb3JpZXMsIGN1LmNhdGVnb3JpZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTY29yZSAoKSB7XHJcbiAgICAgICAgbGV0IHNjb3JlID0gMDtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXMuZm9yRWFjaChkaWZmID0+IHtcclxuICAgICAgICAgICAgc2NvcmUgKz0gZGlmZi5zY29yZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjb3JlIC8gdGhpcy5jYXRlZ29yaWVzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWF0Y2hBZ2FpbnN0IChhIDogQXJyYXk8Q29udGVudFVuaXQ+KSA6IEFycmF5PG51bWJlcj4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYVtpXS5pc01hdGNoKHRoaXMpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL0NvbnRlbnREZXNjcmlwdGlvbi50c1wiIC8+XHJcbi8qKlxyXG4gKiBRdWljayBDaGVhdCBTaGVldCBvZiBtYXJrZXJzIVxyXG4gKiBXaGVuIG1ha2luZyBhIGRlc2NyaXB0aW9uIHRha2UgdGhlc2UgbWFya2VycyBpbnRvIGFjY291bnQgd2hpbGUgZGVzY3JpYmluZyB0aGUgYWN0aW9uISBJZiBhIG1hcmtlciBkZXNjcmliZXMgc29tZXRoaW5nXHJcbiAqIHBsZWFzZSBpbmNsdWRlIGl0IGlmIHlvdSBhZGQgaXQgdG8gdGhlIGRlc2NyaXB0aW9uLiBFeGFtcGxlOiBpZiB5b3UgZGVzY3JpYmUgdGhlIGF0dGFjayBhcyBhIFwiaGVhdnkgaGl0IVwiLCBtYWtlIHN1cmVcclxuICogdG8gYWRkIHRoZSBISUdIX0RBTUFHRSBtYXJrZXIsIHdlIGRvbid0IHdhbnQgYSBcImhlYXZ5IGhpdCFcIiB0byBiZSBkaXNwbGF5ZWQgZm9yIGFuIGF0dGFjayB0aGF0IGNhdXNlZCAxIGRhbWFnZS5cclxuICpcclxuICogTWFuZGF0b3J5IE1hcmtlcnMgLSBJbmNsdWRlIG9ubHkgb25lIGFuZCBjbG9uZSBkZXNjcmlwdGlvbiBmb3IgZWFjaFxyXG4gKiBDb21iYXRIaXQuRlVMTF9ET0RHRVxyXG4gKiBDb21iYXRIaXQuUEFSVElBTF9ET0RHRVxyXG4gKiBDb21iYXRIaXQuRlVMTF9ISVRcclxuICpcclxuICogTWFuZGF0b3J5IE1hcmtlcnMgLSBJbmNsdWRlIG9ubHkgb25lIGFuZCBjbG9uZSBkZXNjcmlwdGlvbiBmb3IgZWFjaC4gVGhlc2UgZG9uJ3Qgc2hvdyB1cCBpbiBGVUxMX0RPREdFXHJcbiAqIENvbWJhdFJlc3VsdC5LTk9DS0VEXHJcbiAqIENvbWJhdFJlc3VsdC5LTk9DS0VEX09GRlxyXG4gKiBDb21iYXRSZXN1bHQuS0lMTEVEXHJcbiAqXHJcbiAqIE5vbi1NYW5kYXRvcnkgTWFya2VycyAtIEluY2x1ZGUgYXQgbW9zdCBvbmUgcGVyIGRlc2NyaXB0aW9uLCBub25lIG1ha2VzIGEgZGVzY3JpcHRpb24gZml0IG1vcmUgYXR0YWNrcy4gVGhlc2UgZG9uJ3Qgc2hvdyB1cCBpbiBGVUxMX0RPREdFLlxyXG4gKiBDb21iYXREYW1hZ2UuTE9XX0RBTUFHRVxyXG4gKiBDb21iYXREYW1hZ2UuTUVESVVNX0RBTUFHRVxyXG4gKiBDb21iYXREYW1hZ2UuSElHSF9EQU1BR0VcclxuICovXHJcbmNsYXNzIENvbWJhdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgREVTQ1JJUFRJT05TID0gW107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChuYW1lIDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgbmV3IENvbnRlbnRHcm91cCgpKTtcclxuICAgICAgICBDb21iYXREZXNjcmlwdGlvbi5ERVNDUklQVElPTlMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVW5pdCAoKSB7XHJcbiAgICAgICAgbGV0IHVuaXQgPSBuZXcgQ29tYmF0VW5pdCgpO1xyXG4gICAgICAgICg8Q29udGVudEdyb3VwPiB0aGlzLmdyb3VwKS5hZGRVbml0KHVuaXQpO1xyXG4gICAgICAgIHJldHVybiB1bml0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVzY3JpcHRpb24gKHRhcmdldCA6IENvbnRlbnRHcm91cCkge1xyXG4gICAgICAgIHJldHVybiBDb250ZW50RGVzY3JpcHRpb24ucGlja0Rlc2NyaXB0aW9ucyhDb21iYXREZXNjcmlwdGlvbi5ERVNDUklQVElPTlMsIHRhcmdldCk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29udGVudE1hcmtlci50c1wiIC8+XHJcbi8qKlxyXG4gKiBUaGVzZSBhcmUgdGhlIG92ZXJhbGwgcmVzdWx0cyBvZiB0aGUgcm9sbC4gRXZlcnkgYXR0YWNrIHdpbGwgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgdGhlc2UuXHJcbiAqIElmIG1ha2luZyBhIG5ldyBkZXNjcmlwdGlvbiwgeW91IHNob3VsZCBjbG9uZSBpdCBmb3IgZWFjaCBDb21iYXRSZXN1bHQgdmFyaWFudC5cclxuICovXHJcbmNsYXNzIENvbWJhdEhpdCBleHRlbmRzIENvbnRlbnRNYXJrZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBGVUxMX0RPREdFID0gbmV3IENvbWJhdEhpdChcIkZ1bGwgRG9kZ2VcIiwgdHJ1ZSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBBUlRJQUxfRE9ER0UgPSBuZXcgQ29tYmF0SGl0KFwiUGFydGlhbCBEb2RnZVwiLCB0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgRlVMTF9ISVQgPSBuZXcgQ29tYmF0SGl0KFwiRnVsbCBIaXRcIiwgdHJ1ZSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGVzZSBhcmUgbWFya2VycyB0aGF0IGV4cGxhaW4gaG93IG11Y2ggZGFtYWdlIHdhcyBjYXVzZWQgYnkgdGhlIGF0dGFjay5cclxuICogTG93L0hpZ2ggaXMgcmVsYXRpdmUgdG8gYSBwZXJjZW50YWdlIG9mIG92ZXJhbGwgSFAuIExvdyA8IDI1JSwgTWVkaXVtIDwgNTAlLCBIaWdoID49IDUwJSBvZiBtYXggaGVhbHRoLlxyXG4gKiBUaGVzZSBhcmUgbm9uLW1hbmRhdG9yeSwgYnV0IGlmIGRlc2NyaWJpbmcgdGhlIGFtb3VudCBvZiBkYW1hZ2UgY2F1c2VkIG9uZSBvZiB0aGVtIHNob3VsZCBiZSBpbmNsdWRlZC5cclxuICogTm90ZTogd2hpbGUgYSBkZXNjcmlwdGlvbiB3aXRob3V0IGFueSBvZiB0aGVzZSB3aWxsIHN0aWxsIHdvcmssIGEgZGVzY3JpcHRpb24gd2l0aCBtb3JlIHRoYW4gb25lIHdpbGwgbmV2ZXIgYmUgcGlja2VkLlxyXG4gKi9cclxuY2xhc3MgQ29tYmF0RGFtYWdlIGV4dGVuZHMgQ29udGVudE1hcmtlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIExPV19EQU1BR0UgPSBuZXcgQ29tYmF0RGFtYWdlKFwiTG93IERhbWFnZVwiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgTUVESVVNX0RBTUFHRSA9IG5ldyBDb21iYXREYW1hZ2UoXCJNZWRpdW0gRGFtYWdlXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBISUdIX0RBTUFHRSA9IG5ldyBDb21iYXREYW1hZ2UoXCJIaWdoIERhbWFnZVwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZXNlIGFyZSBtYXJrZXJzIHRoYXQgZXhwbGFpbiB3aGF0IGhhcHBlbmVkIGJlY2F1c2Ugb2YgdGhlIGF0dGFjay5cclxuICogVGhleSBhcmUgbWFuZGF0b3J5LlxyXG4gKiBXaGVuIG1ha2luZyBhbiBhdHRhY2ssIHlvdSBzaG91bGQgY2xvbmUgdGhlIGRlc2NyaXB0aW9uIGZvciBlYWNoIG9mIHRob3NlLCBhZGRpbmcgdGhpcyBpbmZvcm1hdGlvbiB0byBpdC5cclxuICovXHJcbmNsYXNzIENvbWJhdFJlc3VsdCBleHRlbmRzIENvbnRlbnRNYXJrZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBLTk9DS0VEID0gbmV3IENvbWJhdFJlc3VsdChcIlRhcmdldCB3YXMga25vY2tlZCBkb3duIGJ5IHRoZSBhdHRhY2tcIiwgdHJ1ZSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIEtOT0NLRURfT0ZGID0gbmV3IENvbWJhdFJlc3VsdChcIlRhcmdldCB3YXMga25vY2tlZCBvZmYgYnkgdGhlIGF0dGFjaywgYmVjb21pbmcgdW5jb25zY2lvdXNcIiwgdHJ1ZSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIEtJTExFRCA9IG5ldyBDb21iYXRSZXN1bHQoXCJUYXJnZXQgd2FzIGtpbGxlZCBieSB0aGlzIGF0dGFja1wiLCB0cnVlKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Db250ZW50VW5pdC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9UaGluZ3MvUGVyc29uLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1RoaW5ncy9Cb2R5cGFydC9TZXhIb2xlLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL1RoaW5ncy9Cb2R5cGFydC9TZXhTdGljay50c1wiIC8+XHJcbmNsYXNzIENvbWJhdFVuaXQgZXh0ZW5kcyBDb250ZW50VW5pdCB7XHJcblx0cHJpdmF0ZSBhY3RvciA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChQZXJzb24pO1xyXG5cdHByaXZhdGUgdGFyZ2V0IDogQ29udGVudERpZmZlcmVudGlhbCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKFBlcnNvbik7XHJcblx0cHJpdmF0ZSB3ZWFwb24gOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoVGhpbmcpO1xyXG5cdHByaXZhdGUgbWFya2VycyA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbCgpO1xyXG5cclxuXHRwdWJsaWMgY29uc3RydWN0b3IgKCkge1xyXG5cdFx0c3VwZXIoKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXRBY3RvciAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xyXG5cdFx0dGhpcy5hY3RvciA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKGl0KTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHNldFRhcmdldCAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xyXG5cdFx0dGhpcy50YXJnZXQgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChpdCk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXRXZWFwb24gKGl0IDogVGhpbmcgfCB0eXBlb2YgVGhpbmcpIHtcclxuXHRcdHRoaXMud2VhcG9uID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYWRkTWFya2VyIChtYXJrZXIgOiBDb250ZW50TWFya2VyKSB7XHJcblx0XHR0aGlzLm1hcmtlcnMuYWRkTm91bihtYXJrZXIpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0U2NvcmUgKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuYWN0b3IuZ2V0U2NvcmUoKSArIHRoaXMudGFyZ2V0LmdldFNjb3JlKCkgKyB0aGlzLndlYXBvbi5nZXRTY29yZSgpICsgdGhpcy5tYXJrZXJzLmdldFNjb3JlKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgaXNNYXRjaCAoY3UgOiBDb21iYXRVbml0KSB7XHJcblx0XHRpZiAoY3UgaW5zdGFuY2VvZiBDb21iYXRVbml0KSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmFjdG9yLmlzTWF0Y2goY3UuYWN0b3IpICYmIHRoaXMudGFyZ2V0LmlzTWF0Y2goY3UudGFyZ2V0KSAmJlxyXG5cdFx0XHRcdHRoaXMud2VhcG9uLmlzTWF0Y2goY3Uud2VhcG9uKSAmJiB0aGlzLm1hcmtlcnMuaXNNYXRjaChjdS5tYXJrZXJzKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29udGVudERlc2NyaXB0aW9uLnRzXCIgLz5cbmNsYXNzIEZ1Y2tpbmdEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTlMgPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAobmFtZSA6IHN0cmluZykge1xuICAgICAgICBzdXBlcihuYW1lLCBuZXcgQ29udGVudEdyb3VwKCkpO1xuICAgICAgICBGdWNraW5nRGVzY3JpcHRpb24uREVTQ1JJUFRJT05TLnB1c2godGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFVuaXQgKCkge1xuICAgICAgICBsZXQgdW5pdCA9IG5ldyBGdWNraW5nVW5pdCgpO1xuICAgICAgICAoPENvbnRlbnRHcm91cD4gdGhpcy5ncm91cCkuYWRkVW5pdCh1bml0KTtcbiAgICAgICAgcmV0dXJuIHVuaXQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjcmlwdGlvbiAodGFyZ2V0IDogQ29udGVudEdyb3VwKSB7XG4gICAgICAgIHJldHVybiBDb250ZW50RGVzY3JpcHRpb24ucGlja0Rlc2NyaXB0aW9ucyhGdWNraW5nRGVzY3JpcHRpb24uREVTQ1JJUFRJT05TLCB0YXJnZXQpO1xuICAgIH1cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29udGVudE1hcmtlci50c1wiIC8+XHJcbi8qKlxyXG4gKiBDSEVBVCBTSEVFVCBGT1IgRlVDS0lORyBNQVJLRVJTXHJcbiAqXHJcbiAqIE1hbmRhdG9yeSBpZiBwcmVzZW50IC0gVGhlc2UgbWF5IGFsbCBhcHBlYXIgYXQgb25jZSBvciBzZXBhcmF0ZWRseSEgTXVsdGlwbGVzIGlzIGFsd2F5cyByYXJlciwgc28geW91IGNhbiBnZXQgYXdheSB3aXRoIGxlc3MgZGVzY3JpcHRpb25zXHJcbiAqIEZ1Y2tpbmdTdGF0ZS5DVU1fU1RBUlRcclxuICogRnVja2luZ1N0YXRlLkNVTU1JTkdcclxuICogRnVja2luZ1N0YXRlLkNVTV9FTkRcclxuICpcclxuICogTWFuZGF0b3J5IGlmIHByZXNlbnQgLSB0aGVzZSBhbHdheXMgYWNjb21wYW55IHRoZSBvbmVzIGFib3ZlLCB0aGV5IG5ldmVyIGFwcGVhciB3aXRob3V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgb25lcyBhYm92ZS4gVGhleSBtaWdodCBiZSBib3RoIGF0IG9uY2UsIGJ1dCB2ZXJ5IGZldyBlbmVtaWVzIGRvIHRoYXQgc28gYWx3YXlzIGNoZWNrIHRoZSBlbmVteSBmaXJzdFxyXG4gKiBGdWNraW5nU3RhdGUuQ1VNX0lOU0lERVxyXG4gKiBGdWNraW5nU3RhdGUuQ1VNX09VVFNJREVcclxuICpcclxuICogTWFuZGF0b3J5IGlmIHByZXNlbnQgLSBUaGVzZSBtYXkgYWxsIGFwcGVhciBhdCBvbmNlIG9yIHNlcGFyYXRlZGx5ISBNdWx0aXBsZXMgaXMgYWx3YXlzIHJhcmVyLCBzbyB5b3UgY2FuIGdldCBhd2F5IHdpdGggbGVzcyBkZXNjcmlwdGlvbnNcclxuICogRnVja2luZ1N0YXRlLlBFTkVUUkFUSU5HXHJcbiAqIEZ1Y2tpbmdTdGF0ZS5SRU1PVklOR1xyXG4gKi9cclxuXHJcbmNsYXNzIEZ1Y2tpbmdTdHlsZSBleHRlbmRzIENvbnRlbnRNYXJrZXIge1xyXG4gICAgcHVibGljIHN0YXRpYyBHRU5UTEUgPSBuZXcgRnVja2luZ1N0eWxlKFwiR2VudGxlXCIpO1xyXG4gICAgcHVibGljIHN0YXRpYyBST1VHSCA9IG5ldyBGdWNraW5nU3R5bGUoXCJSb3VnaFwiKTtcclxufVxyXG5cclxuY2xhc3MgRnVja2luZ1N0YXRlIGV4dGVuZHMgQ29udGVudE1hcmtlciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBFTkVUUkFUSU5HID0gbmV3IEZ1Y2tpbmdTdGF0ZShcIlBlbmV0cmF0aW9uIFN0YXJ0XCIsIHRydWUpO1xyXG4gICAgcHVibGljIHN0YXRpYyBSRU1PVklORyA9IG5ldyBGdWNraW5nU3RhdGUoXCJSZW1vdmluZyBTdGlja1wiLCB0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgU1BFRURJTkdfVVAgPSBuZXcgRnVja2luZ1N0YXRlKFwiU3BlZWRpbmcgdXBcIix0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ1VNX1NUQVJUID0gbmV3IEZ1Y2tpbmdTdGF0ZShcIlN0YXJ0ZWQgQ3VtbWluZ1wiLCB0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ1VNTUlORyA9IG5ldyBGdWNraW5nU3RhdGUoXCJDdW1taW5nXCIsIHRydWUpO1xyXG4gICAgcHVibGljIHN0YXRpYyBDVU1fRU5EID0gbmV3IEZ1Y2tpbmdTdGF0ZShcIkZpbmlzaGVkIEN1bW1pbmdcIiwgdHJ1ZSk7XHJcbiAgICBwdWJsaWMgc3RhdGljIENVTV9JTlNJREUgPSBuZXcgRnVja2luZ1N0YXRlKFwiQ3VtIEluc2lkZVwiLCB0cnVlKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgQ1VNX09VVFNJREUgPSBuZXcgRnVja2luZ1N0YXRlKFwiQ3VtIE91dHNpZGVcIiwgdHJ1ZSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vQ29udGVudFVuaXQudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vVGhpbmdzL1BlcnNvbi50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9UaGluZ3MvQm9keXBhcnQvU2V4SG9sZS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9UaGluZ3MvQm9keXBhcnQvU2V4U3RpY2sudHNcIiAvPlxyXG5jbGFzcyBGdWNraW5nVW5pdCBleHRlbmRzIENvbnRlbnRVbml0IHtcclxuICAgIHByaXZhdGUgZnVja2VyIDogQ29udGVudERpZmZlcmVudGlhbCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKFBlcnNvbik7XHJcbiAgICBwcml2YXRlIGZ1Y2tlZCA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChQZXJzb24pO1xyXG4gICAgcHJpdmF0ZSBob2xlIDogQ29udGVudERpZmZlcmVudGlhbCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKFNleEhvbGUpO1xyXG4gICAgcHJpdmF0ZSBzdGljayA6IENvbnRlbnREaWZmZXJlbnRpYWwgPSBuZXcgQ29udGVudERpZmZlcmVudGlhbChTZXhTdGljayk7XHJcbiAgICBwcml2YXRlIG1hcmtlcnMgOiBDb250ZW50RGlmZmVyZW50aWFsID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoKTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldEZ1Y2tlciAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xyXG4gICAgICAgIHRoaXMuZnVja2VyID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGdWNrZWQgKGl0IDogVGhpbmcgfCB0eXBlb2YgVGhpbmcpIHtcclxuICAgICAgICB0aGlzLmZ1Y2tlZCA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKGl0KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG9sZSAoaXQgOiBUaGluZyB8IHR5cGVvZiBUaGluZykge1xyXG4gICAgICAgIHRoaXMuaG9sZSA9IG5ldyBDb250ZW50RGlmZmVyZW50aWFsKGl0KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0U3RpY2sgKGl0IDogVGhpbmcgfCB0eXBlb2YgVGhpbmcpIHtcclxuICAgICAgICB0aGlzLnN0aWNrID0gbmV3IENvbnRlbnREaWZmZXJlbnRpYWwoaXQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRNYXJrZXIgKG1hcmtlciA6IENvbnRlbnRNYXJrZXIpIHtcclxuICAgICAgICB0aGlzLm1hcmtlcnMuYWRkTm91bihtYXJrZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRTY29yZSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVja2VyLmdldFNjb3JlKCkgKyB0aGlzLmZ1Y2tlZC5nZXRTY29yZSgpICsgdGhpcy5ob2xlLmdldFNjb3JlKCkgKyB0aGlzLnN0aWNrLmdldFNjb3JlKCkgKyB0aGlzLm1hcmtlcnMuZ2V0U2NvcmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNNYXRjaCAoZnUgOiBGdWNraW5nVW5pdCkge1xyXG4gICAgICAgIGlmIChmdSBpbnN0YW5jZW9mIEZ1Y2tpbmdVbml0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZ1Y2tlci5pc01hdGNoKGZ1LmZ1Y2tlcikgJiYgdGhpcy5mdWNrZWQuaXNNYXRjaChmdS5mdWNrZWQpICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvbGUuaXNNYXRjaChmdS5ob2xlKSAmJiB0aGlzLnN0aWNrLmlzTWF0Y2goZnUuc3RpY2spICYmIHRoaXMubWFya2Vycy5pc01hdGNoKGZ1Lm1hcmtlcnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRnVuY3Rpb25zLnRzXCIgLz5cclxuY2xhc3MgQnJhbmNoaW5nT3B0aW9uIHtcclxuICAgIHB1YmxpYyBzYXkgOiBTYXk7XHJcbiAgICBwdWJsaWMgYXBwZWFyQ29uZGl0aW9uIDogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcclxuICAgIHB1YmxpYyBwcmV2aW91c2x5UGlja2VkIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoc2F5IDogU2F5LCBhcHBlYXJDb25kaXRpb24/IDogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuc2F5ID0gc2F5O1xyXG4gICAgICAgIHRoaXMuYXBwZWFyQ29uZGl0aW9uID0gYXBwZWFyQ29uZGl0aW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBCcmFuY2hpbmdEaWFsb2d1ZSB7XHJcbiAgICBwcml2YXRlIG9wdGlvbnMgOiBBcnJheTxCcmFuY2hpbmdPcHRpb24+ID0gW107XHJcbiAgICBwcml2YXRlIHJlc29sdmUgOiBGdW5jdGlvbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKC4uLm9wdGlvbnMgOiBBcnJheTxCcmFuY2hpbmdPcHRpb24+KSB7XHJcbiAgICAgICAgdGhpcy5hZGRPcHRpb25zKC4uLm9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRPcHRpb25zICguLi5vcHRpb25zIDogQXJyYXk8QnJhbmNoaW5nT3B0aW9uPikge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKC4uLm9wdGlvbnMpO1xyXG4gICAgICAgIGFycmF5VW5pcXVlKHRoaXMub3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldENob3Nlbk9wdGlvbiAoKSA6IFByb21pc2U8QnJhbmNoaW5nT3B0aW9uPiB7XHJcbiAgICAgICAgbGV0IHZhbGlkT3B0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgdmFsdWUgPSB0aGlzLm9wdGlvbnNbaV07IHZhbHVlICE9IHVuZGVmaW5lZDsgdmFsdWUgPSB0aGlzLm9wdGlvbnNbKytpXSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuYXBwZWFyQ29uZGl0aW9uID09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbHVlLmFwcGVhckNvbmRpdGlvbiA9PSBcImZ1bmN0aW9uXCIgJiYgdmFsdWUuYXBwZWFyQ29uZGl0aW9uKCkpIHx8IHZhbHVlLmFwcGVhckNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRPcHRpb25zLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY2hvaWNlQnV0dG9ucyA6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB2YWxpZE9wdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGxldCBjbGFzc2VzID0gW1wiY2hvaWNlXCJdO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUucHJldmlvdXNseVBpY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFwicGlja2VkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNob2ljZUJ1dHRvbnMucHVzaCgoYXdhaXQgdmFsdWUuc2F5LmdldEhUTUwoXCJwXCIsIGNsYXNzZXMpKVswXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgUGxheWVySW5wdXQgOiBQcm9taXNlPEJyYW5jaGluZ09wdGlvbj4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIucmVzZXQoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwLCB2YWx1ZSA9IGNob2ljZUJ1dHRvbnNbaW5kZXhdOyB2YWx1ZSAhPSB1bmRlZmluZWQ7IHZhbHVlID0gY2hvaWNlQnV0dG9uc1srK2luZGV4XSkge1xyXG4gICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZSh2YWx1ZSwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRGaXJzdEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgIHZhbHVlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRPcHRpb25zW2luZGV4XS5wcmV2aW91c2x5UGlja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZSh2YWxpZE9wdGlvbnNbaW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoLi4uY2hvaWNlQnV0dG9ucyk7XHJcblxyXG4gICAgICAgIGxldCBjaG9pY2UgPSBhd2FpdCBQbGF5ZXJJbnB1dDtcclxuXHJcbiAgICAgICAgYXdhaXQgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnVucHJpbnQoLi4uY2hvaWNlQnV0dG9ucyk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaG9pY2U7XHJcbiAgICB9XHJcbn0iLCJlbnVtIE5vZGVUeXBlIHtcclxuICAgIE5vZGUsIFRyZWUsIFRleHQsIFNldCwgQ2hvaWNlLCBCcmFuY2hcclxufVxyXG5cclxuY2xhc3MgRGlhbG9ndWVOb2RlIHtcclxuICAgIHB1YmxpYyB0eXBlIDogTm9kZVR5cGUgPSBOb2RlVHlwZS5Ob2RlO1xyXG4gICAgLy8gRW5kIG5vZGVzIGFyZSBub3QgbmVjZXNzYXJ5LiBJZiBuZXh0IGlzIHVuZGVmaW5lZCwgdGhlbiB0aGF0J3MgdGhlIGVuZC5cclxuICAgIC8vcHVibGljIHN0YXRpYyBFTkRfTk9ERSA9IFwiRW5kXCI7XHJcbiAgICBwdWJsaWMgaWQgOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgbmFtZSA6IHN0cmluZztcclxuXHJcbiAgICBwcm90ZWN0ZWQgbmV4dCA6IHN0cmluZztcclxuICAgIHB1YmxpYyBjaG9pY2VzIDogQXJyYXk8c3RyaW5nPjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXROYW1lIChuYW1lIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TmV4dCAobmV4dCA6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubmV4dCA9IG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5leHQgKCkgOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENob2ljZXMgKGNob2ljZXMgOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdGhpcy5jaG9pY2VzID0gY2hvaWNlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzQ2hvaWNlcyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hvaWNlcyAhPSB1bmRlZmluZWQgJiYgdGhpcy5jaG9pY2VzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGlhbG9ndWVOb2RlLnRzXCIgLz5cclxuY2xhc3MgRGlhbG9ndWVCcmFuY2ggZXh0ZW5kcyBEaWFsb2d1ZU5vZGUge1xyXG4gICAgcHVibGljIHR5cGUgPSBOb2RlVHlwZS5CcmFuY2g7XHJcbiAgICBwdWJsaWMgdmFyaWFibGUgOiAoKSA9PiBhbnkgPSAoKSA9PiB7cmV0dXJuIGZhbHNlO31cclxuICAgIHB1YmxpYyBicmFuY2hJZHMgOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwdWJsaWMgYnJhbmNoQ29uZGl0aW9ucyA6IEFycmF5PCgpID0+IGFueT4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgc2V0VmFyaWFibGUgKHZhckZ1bmMgOiAoKSA9PiBhbnkpIHtcclxuICAgICAgICB0aGlzLnZhcmlhYmxlID0gdmFyRnVuYztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkQnJhbmNoICh0YXJnZXRpZCA6IHN0cmluZywgdmFsdWVGdW5jIDogKCkgPT4gYW55KSB7XHJcbiAgICAgICAgdGhpcy5icmFuY2hJZHMucHVzaCh0YXJnZXRpZCk7XHJcbiAgICAgICAgdGhpcy5icmFuY2hDb25kaXRpb25zLnB1c2godmFsdWVGdW5jKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dCAoKSB7XHJcbiAgICAgICAgbGV0IHZhcmlhYmxlID0gdGhpcy52YXJpYWJsZSgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5icmFuY2hJZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbXBhcmluZyA9IHRoaXMuYnJhbmNoQ29uZGl0aW9uc1tpXSgpO1xyXG4gICAgICAgICAgICBpZiAoY29tcGFyaW5nID09IHZhcmlhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5icmFuY2hJZHNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dDtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWFsb2d1ZU5vZGUudHNcIiAvPlxyXG5jbGFzcyBEaWFsb2d1ZVRleHQgZXh0ZW5kcyBEaWFsb2d1ZU5vZGUge1xyXG4gICAgcHVibGljIHR5cGUgPSBOb2RlVHlwZS5UZXh0O1xyXG4gICAgcHJpdmF0ZSBzYXlDcmVhdG9yIDogKCkgPT4gU2F5O1xyXG5cclxuICAgIHB1YmxpYyBzZXRTYXkgKHNheUNyZWF0b3IgOiAoKSA9PiBTYXkpIHtcclxuICAgICAgICB0aGlzLnNheUNyZWF0b3I9IHNheUNyZWF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNheSAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2F5Q3JlYXRvcigpO1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRpYWxvZ3VlVGV4dC50c1wiIC8+XHJcbmNsYXNzIERpYWxvZ3VlQ2hvaWNlIGV4dGVuZHMgRGlhbG9ndWVUZXh0IHtcclxuICAgIHB1YmxpYyB0eXBlID0gTm9kZVR5cGUuQ2hvaWNlO1xyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25zIDogKCkgPT4gYm9vbGVhbiA9ICgpID0+IHsgcmV0dXJuIHRydWU7IH07XHJcblxyXG4gICAgcHVibGljIGlzQXZhaWxhYmxlICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENvbmRpdGlvbnMgKGNvbmRpdGlvbnMgOiAoKSA9PiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25kaXRpb25zID0gY29uZGl0aW9ucztcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWFsb2d1ZU5vZGUudHNcIiAvPlxyXG5jbGFzcyBEaWFsb2d1ZU5vZGVUcmVlIGV4dGVuZHMgRGlhbG9ndWVOb2RlIHtcclxuICAgIHB1YmxpYyB0eXBlID0gTm9kZVR5cGUuVHJlZTtcclxuICAgIHB1YmxpYyB0cmVlIDogKCkgPT4gRGlhbG9ndWVUcmVlO1xyXG5cclxuICAgIHB1YmxpYyBzZXRUcmVlICh0cmVlRmluZGVyIDogKCkgPT4gRGlhbG9ndWVUcmVlKSB7XHJcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZUZpbmRlcjtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWFsb2d1ZU5vZGUudHNcIiAvPlxyXG5jbGFzcyBEaWFsb2d1ZVNldCBleHRlbmRzIERpYWxvZ3VlTm9kZSB7XHJcbiAgICBwdWJsaWMgdHlwZSA9IE5vZGVUeXBlLlNldDtcclxuICAgIHByaXZhdGUgY29kZSA6ICgpID0+ICh2b2lkIHwgUHJvbWlzZTx2b2lkPik7XHJcblxyXG4gICAgcHVibGljIHNldEZ1bmN0aW9uIChjb2RlIDogKCkgPT4gKHZvaWQgfCBQcm9taXNlPHZvaWQ+KSkge1xyXG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJ1biAoKSA6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb2RlKCk7XHJcbiAgICB9XHJcbn0iLCJjbGFzcyBEaWFsb2d1ZVRyZWUge1xyXG4gICAgcHVibGljIGlkIDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBub2RlcyA6IHtbaWQgOiBzdHJpbmddIDogRGlhbG9ndWVOb2RlfSA9IHt9O1xyXG4gICAgcHVibGljIHN0YXJ0Tm9kZSA6IERpYWxvZ3VlTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgcmVwZWF0Q2hvaWNlcyA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBsYXN0UHJpbnRlZENob2ljZSA6IEFycmF5PEhUTUxFbGVtZW50PjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGROb2RlIChub2RlIDogRGlhbG9ndWVOb2RlKSB7XHJcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlLmlkXSA9IG5vZGU7XHJcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PSBOb2RlVHlwZS5Ob2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZS5uYW1lXSA9IG5vZGU7IC8vIFRoaXMgaXMgYSBsYWJlbCFcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFN0YXJ0Tm9kZSAobm9kZSA6IERpYWxvZ3VlTm9kZSkge1xyXG4gICAgICAgIHRoaXMuYWRkTm9kZShub2RlKTtcclxuICAgICAgICB0aGlzLnN0YXJ0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vZGUgKGlkIDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0IChub2RlIDogRGlhbG9ndWVOb2RlKSB7XHJcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmdldE5leHQoKTtcclxuICAgICAgICBpZiAobmV4dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZShuZXh0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFJlcGVhdENob2ljZXMgKGRvSXQgOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5yZXBlYXRDaG9pY2VzID0gZG9JdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSAoc3RhcnRJZD8gOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhSdWxlYm9vay5nZXRJbmRlbnRhdGlvbigpICsgXCJbRGlhbG9ndWVUcmVlXSBSdW5uaW5nIFwiICsgdGhpcy5pZCk7XHJcbiAgICAgICAgUnVsZWJvb2suaW5jcmVhc2VJbmRlbnRhdGlvbih0aGlzKTtcclxuXHJcbiAgICAgICAgbGV0IG5vZGUgOiBEaWFsb2d1ZU5vZGU7XHJcbiAgICAgICAgaWYgKHN0YXJ0SWQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlID0gdGhpcy5nZXROb2RlKHN0YXJ0SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50QXNFcnJvcihcIlVuYWJsZSB0byBzdGFydCBkaWFsb2d1ZSBcIiArIHRoaXMuaWQgKyBcIjogQSBzdGFydGluZyBub2RlIGNvdWxkIG5vdCBiZSBmb3VuZC5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcmV2aW91c05vZGUgOiBEaWFsb2d1ZU5vZGU7XHJcbiAgICAgICAgd2hpbGUgKG5vZGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IGF3YWl0IHRoaXMucHJvY2Vzc05vZGUobm9kZSwgcHJldmlvdXNOb2RlKTtcclxuICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgbm9kZSA9IG5leHROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBSdWxlYm9vay5kZWNyZWFzZUluZGVudGF0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc3NOb2RlIChub2RlIDogRGlhbG9ndWVOb2RlLCBwcmV2aW91c05vZGUgOiBEaWFsb2d1ZU5vZGUpIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIltcIiArIG5vZGUudHlwZSArIFwiXSBcIiArIG5vZGUuaWQpO1xyXG4gICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24obm9kZSk7XHJcbiAgICAgICAgbGV0IGRvQ2hvaWNlcyA9IG5vZGUuaGFzQ2hvaWNlcygpO1xyXG5cclxuICAgICAgICBpZiAobm9kZS50eXBlID09IE5vZGVUeXBlLlRyZWUpIHtcclxuICAgICAgICAgICAgYXdhaXQgKDxEaWFsb2d1ZU5vZGVUcmVlPiBub2RlKS50cmVlKCkuZXhlY3V0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09IE5vZGVUeXBlLlRleHQpIHtcclxuICAgICAgICAgICAgbGV0IHNheSA9ICg8RGlhbG9ndWVUZXh0PiBub2RlKS5nZXRTYXkoKTtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50QXNDb250ZW50KHNheSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT0gTm9kZVR5cGUuU2V0KSB7XHJcbiAgICAgICAgICAgIGxldCBydW5uaW5nU2V0ID0gKDxEaWFsb2d1ZVNldD4gbm9kZSkucnVuKCk7XHJcbiAgICAgICAgICAgIGlmIChydW5uaW5nU2V0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgcnVubmluZ1NldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRvQ2hvaWNlcykge1xyXG4gICAgICAgICAgICAvLyBOZXh0IG5vZGUgaXMgZGVjaWRlZCBieSB0aGUgY2hvaWNlc1xyXG4gICAgICAgICAgICBsZXQgYnJhbmNoaW5nRGlhbG9ndWUgPSBuZXcgQnJhbmNoaW5nRGlhbG9ndWUoKTtcclxuICAgICAgICAgICAgbGV0IGNob2ljZXMgPSBub2RlLmNob2ljZXM7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNob2ljZSA9IDxEaWFsb2d1ZUNob2ljZT4gdGhpcy5nZXROb2RlKGNob2ljZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJyYW5jaGluZ09wdGlvbiA9IG5ldyBCcmFuY2hpbmdPcHRpb24oY2hvaWNlLmdldFNheSgpLCBjaG9pY2UuaXNBdmFpbGFibGUoKSk7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goYnJhbmNoaW5nT3B0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyYW5jaGluZ0RpYWxvZ3VlLmFkZE9wdGlvbnMoYnJhbmNoaW5nT3B0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgY2hvc2VuT3B0aW9uIDogQnJhbmNoaW5nT3B0aW9uID0gYXdhaXQgYnJhbmNoaW5nRGlhbG9ndWUuZ2V0Q2hvc2VuT3B0aW9uKCk7XHJcbiAgICAgICAgICAgIGxldCBjaG9zZW5Ob2RlSWQgPSBjaG9pY2VzW29wdGlvbnMuaW5kZXhPZihjaG9zZW5PcHRpb24pXTtcclxuICAgICAgICAgICAgbGV0IGNob3Nlbk5vZGUgPSA8RGlhbG9ndWVDaG9pY2U+IHRoaXMuZ2V0Tm9kZShjaG9zZW5Ob2RlSWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0Q2hvaWNlcykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkobmV3IFNheUJvbGQoXCIgPiBcIiwgY2hvc2VuTm9kZS5nZXRTYXkoKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UHJpbnRlZENob2ljZSA9IGF3YWl0IEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5nZXRTYXlFbGVtZW50c0FzQ29udGVudChzYXkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KC4uLnRoaXMubGFzdFByaW50ZWRDaG9pY2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFJ1bGVib29rLmdldEluZGVudGF0aW9uKCkgKyBcIltDaG9pY2VdIFBpY2tlZCBcIiArIGNob3Nlbk5vZGVJZCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoUnVsZWJvb2suZ2V0SW5kZW50YXRpb24oKSArIFwiW0Nob2ljZV0gR29pbmcgdG8gXCIgKyBjaG9zZW5Ob2RlLmdldE5leHQoKSk7XHJcbiAgICAgICAgICAgIFJ1bGVib29rLmluY3JlYXNlSW5kZW50YXRpb24oY2hvc2VuTm9kZUlkKTtcclxuICAgICAgICAgICAgUnVsZWJvb2suZGVjcmVhc2VJbmRlbnRhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgUnVsZWJvb2suZGVjcmVhc2VJbmRlbnRhdGlvbigpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0KGNob3Nlbk5vZGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFJ1bGVib29rLmRlY3JlYXNlSW5kZW50YXRpb24oKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV4dChub2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVucHJpbnRMYXN0Q2hvaWNlICgpIHtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIudW5wcmludCguLi50aGlzLmxhc3RQcmludGVkQ2hvaWNlKTtcclxuICAgIH1cclxufSIsIm1vZHVsZSBEaWFsb2d1ZVRyZWVzIHtcclxuICAgIC8vIGxldCB0cmVlcyA6IHtbbmFtZSA6IHN0cmluZ10gOiBEaWFsb2d1ZVRyZWV9ID0ge307XHJcbiAgICAvL1xyXG4gICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGFkZFRyZWUodHJlZSA6IERpYWxvZ3VlVHJlZSkge1xyXG4gICAgLy8gICAgIHRyZWVzW3RyZWUuaWRdID0gdHJlZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgcHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IHVzYWdlIG9mIGV2ZXJ5IERpYWxvZ3VlVHJlZSBhdmFpbGFibGUuXHJcbiAgICAgKiBOb3RlOiBFdmVuIHRob3VnaCBhIERpYWxvZ3VlVHJlZSBpcyByZWZlcmVuY2VkLCBpdCAqbWlnaHQqIHN0aWxsIG5vdCBiZSBhY2Nlc3NpYmxlIGlmIHRoZSBjb2RlIGxlYWRpbmcgdG8gaXQgaXMgZmF1bHR5LlxyXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB0byBrbm93IHdoZXRoZXIgb3Igbm90IGEgRGlhbG9ndWVUcmVlIHdhcyBcImZvcmdvdHRlblwiLCBzaW5jZSB0aGUgSURFIGNhbiBvbmx5IGRvIHRoaXMgbWFudWFsbHkuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmaW5kVW51c2VkVHJlZXMgKCkge1xyXG4gICAgICAgIGxldCBhbGxDb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhcHBDb2RlXCIpLmlubmVySFRNTDtcclxuXHJcbiAgICAgICAgbGV0IHVzZUNvdW50ID0ge307XHJcbiAgICAgICAgbGV0IHVudXNlZCA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBkaWFsb2d1ZU5hbWUgaW4gRGlhbG9ndWVUcmVlcykge1xyXG4gICAgICAgICAgICBpZiAoZGlhbG9ndWVOYW1lICE9IFwiZmluZFVudXNlZFRyZWVzXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBtZW50aW9uIHdpbGwgYmUgdGhlIG9uZSBkZWZpbmluZyBpdCB0byBleGlzdCwgc28gd2UgbmVlZCBhdCBsZWFzdCB0d28gb2NjdXJyZW5jZXMgZm9yIGl0IHRvIGJlIHVzZWQuXHJcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSBvY2N1cnJlbmNlcyhhbGxDb2RlLCBcIkRpYWxvZ3VlVHJlZXMuXCIgKyBkaWFsb2d1ZU5hbWUsIGZhbHNlKSAtIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlQ291bnRbZGlhbG9ndWVOYW1lXSA9IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1bnVzZWQucHVzaChkaWFsb2d1ZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBkaWFsb2d1ZU5hbWUgaW4gdXNlQ291bnQpIHtcclxuICAgICAgICAgICAgbGV0IHRpbWVzID0gdXNlQ291bnRbZGlhbG9ndWVOYW1lXTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIltEaWFsb2d1ZVVzYWdlXSBcIiArIGRpYWxvZ3VlTmFtZSArIFwiIGlzIHJlZmVyZW5jZWQgXCIgKyB0aW1lcyArICh0aW1lcyA+IDEgPyBcIiB0aW1lcy5cIiA6IFwiIHRpbWUuXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW51c2VkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRGlhbG9ndWVVc2FnZV0gXCIgKyB1bnVzZWRbaV0gKyBcIiBpcyBuZXZlciByZWZlcmVuY2VkIGFuZCB3aWxsIG5vdCBhcHBlYXIgaW4tZ2FtZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBGdW5jdGlvbiB0aGF0IGNvdW50IG9jY3VycmVuY2VzIG9mIGEgc3Vic3RyaW5nIGluIGEgc3RyaW5nO1xyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyAgICAgICAgICAgICAgIFRoZSBzdHJpbmdcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdWJTdHJpbmcgICAgICAgICAgICBUaGUgc3ViIHN0cmluZyB0byBzZWFyY2ggZm9yXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxvd092ZXJsYXBwaW5nXSAgT3B0aW9uYWwuIChEZWZhdWx0OmZhbHNlKVxyXG4gICAgICpcclxuICAgICAqIEBhdXRob3IgVml0aW0udXMgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdmljdG9ybnBiLzc3MzY4NjVcclxuICAgICAqIEBzZWUgVW5pdCBUZXN0IGh0dHBzOi8vanNmaWRkbGUubmV0L1ZpY3Rvcm5wYi81YXh1aDk2dS9cclxuICAgICAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDA5NzU2L2hvdy10by1jb3VudC1zdHJpbmctb2NjdXJyZW5jZS1pbi1zdHJpbmcvNzkyNDI0MCM3OTI0MjQwXHJcbiAgICAgKi9cclxuICAgIGZ1bmN0aW9uIG9jY3VycmVuY2VzKHN0cmluZywgc3ViU3RyaW5nLCBhbGxvd092ZXJsYXBwaW5nKSB7XHJcblxyXG4gICAgICAgIHN0cmluZyArPSBcIlwiO1xyXG4gICAgICAgIHN1YlN0cmluZyArPSBcIlwiO1xyXG4gICAgICAgIGlmIChzdWJTdHJpbmcubGVuZ3RoIDw9IDApIHJldHVybiAoc3RyaW5nLmxlbmd0aCArIDEpO1xyXG5cclxuICAgICAgICB2YXIgbiA9IDAsXHJcbiAgICAgICAgICAgIHBvcyA9IDAsXHJcbiAgICAgICAgICAgIHN0ZXAgPSBhbGxvd092ZXJsYXBwaW5nID8gMSA6IHN1YlN0cmluZy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIHBvcyA9IHN0cmluZy5pbmRleE9mKHN1YlN0cmluZywgcG9zKTtcclxuICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgICAgICBwb3MgKz0gc3RlcDtcclxuICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbjtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9Sb29tLnRzXCIgLz5cclxuaW50ZXJmYWNlIFRyaWNraWVyT3B0aW9ucyB7XHJcbiAgICByZWdpb24gOiBSZWdpb25SYW5kb207XHJcbiAgICBtYXAgOiBSb29tUmFuZG9tTWFwO1xyXG4gICAgb3RoZXJSb29tIDogUm9vbVJhbmRvbTtcclxufVxyXG5cclxuaW50ZXJmYWNlIFRyaWNreU9wdGlvbnMgZXh0ZW5kcyBUcmlja2llck9wdGlvbnMge1xyXG4gICAgb3RoZXJSb29tRGlyZWN0aW9uIDogbnVtYmVyO1xyXG4gICAgdHJpY2t5Um9vbURpcmVjdGlvbiA6IG51bWJlcjtcclxuICAgIHggOiBudW1iZXI7XHJcbiAgICB5IDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUm9vbVJhbmRvbU5vZGUge1xyXG4gICAgcm9vbSA6IFJvb21SYW5kb207XHJcbiAgICBjb29yZGluYXRlcyA6IEFycmF5PG51bWJlcj47XHJcbiAgICBkaXN0YW5jZSA6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgUm9vbVJhbmRvbSBleHRlbmRzIFJvb20ge1xyXG4gICAgcHVibGljIGNvbm5lY3RhYmxlT24gOiBBcnJheTxudW1iZXI+ID0gW0RpcmVjdGlvbi5OT1JUSCwgRGlyZWN0aW9uLlNPVVRILCBEaXJlY3Rpb24uRUFTVCwgRGlyZWN0aW9uLldFU1RdO1xyXG4gICAgcHVibGljIHJhbmRvbWl6YWJsZSA9IHRydWU7IC8vIG5vbi1yYW5kb21pemFibGUgcm9vbXMgZG9uJ3QgZ2V0IHBsYWNlZCBhdXRvbWF0aWNhbGx5XHJcbiAgICBwdWJsaWMgcGxhY2VkID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgYXBwZWFyQ2hhbmNlID0gNzU7XHJcbiAgICBwdWJsaWMgZXh0cmFDb25uZWN0aW9uQ2hhbmNlID0gNzU7IC8vIFJlcXVpcmVzIHR3byBzdWNjZXNzZXNcclxuICAgIHB1YmxpYyBiYWNrZ3JvdW5kSW1hZ2UgPSBcInRvbWF0b1wiO1xyXG5cclxuICAgIHB1YmxpYyBsYXN0TWFwIDogUm9vbVJhbmRvbU1hcDtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkPyA6IHN0cmluZywgZm9kZGVyPyA6IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihpZCwgZm9kZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QmFja2dyb3VuZENsYXNzICgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0ltYWdlRGVmaW5lZCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhY2tncm91bmRJbWFnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwidG9tYXRvXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0ltYWdlRGVmaW5lZCAoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJ1bGVzID0gZG9jdW1lbnQuc3R5bGVTaGVldHNbaV1bJ3J1bGVzJ10gfHwgZG9jdW1lbnQuc3R5bGVTaGVldHNbaV1bJ2Nzc1J1bGVzJ107XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIHJ1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBydWxlc1t4XS5zZWxlY3RvclRleHQgPT0gJ3N0cmluZycgJiYgcnVsZXNbeF0uc2VsZWN0b3JUZXh0ID09IFwiLlwiICsgdGhpcy5iYWNrZ3JvdW5kSW1hZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlVuYWJsZSB0byByZWFkIGltYWdlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQ29ubmVjdGFibGVPbiAob3Bwb3NpdGVEaXJlY3Rpb24gOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0YWJsZU9uLmluZGV4T2Yob3Bwb3NpdGVEaXJlY3Rpb24pICE9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0cmlja3lDb2RlIDogKG9wdGlvbnMgOiBUcmlja3lPcHRpb25zKSA9PiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBnZXRBbnlEaXJlY3Rpb24gKG9wdGlvbnMgOiBUcmlja2llck9wdGlvbnMpIDogVHJpY2t5T3B0aW9ucyB7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvblNodWZmbGVyID0gbmV3IFNodWZmbGVyPG51bWJlcj4odGhpcy5jb25uZWN0YWJsZU9uKTtcclxuICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXRPbmUoKTsgZGlyZWN0aW9uICE9IHVuZGVmaW5lZDsgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgbGV0IG9wcG9zaXRlRGlyZWN0aW9uID0gT3Bwb3NpdGVEaXJlY3Rpb25bRGlyZWN0aW9uW2RpcmVjdGlvbl1dO1xyXG4gICAgICAgICAgICBsZXQgb3RoZXJDb29yZGluYXRlcyA9IG9wdGlvbnMubWFwLmdldENvb3JkaW5hdGVzKG9wdGlvbnMub3RoZXJSb29tKTtcclxuICAgICAgICAgICAgbGV0IHdvdWxkYmVDb29yZGluYXRlcyA9IFJvb20uc2hpZnQob3RoZXJDb29yZGluYXRlcywgb3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICBsZXQgdHJpY2t5T3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIG90aGVyUm9vbSA6IG9wdGlvbnMub3RoZXJSb29tLFxyXG4gICAgICAgICAgICAgICAgb3RoZXJSb29tRGlyZWN0aW9uIDogb3Bwb3NpdGVEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB0cmlja3lSb29tRGlyZWN0aW9uIDogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgbWFwIDogb3B0aW9ucy5tYXAsXHJcbiAgICAgICAgICAgICAgICByZWdpb24gOiBvcHRpb25zLnJlZ2lvbixcclxuICAgICAgICAgICAgICAgIHggOiB3b3VsZGJlQ29vcmRpbmF0ZXNbMF0sXHJcbiAgICAgICAgICAgICAgICB5IDogd291bGRiZUNvb3JkaW5hdGVzWzFdXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BsYWNlYWJsZSh0cmlja3lPcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyaWNreU9wdGlvbnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzUGxhY2VhYmxlIChvcHRpb25zIDogVHJpY2t5T3B0aW9ucykge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RhYmxlT24ob3B0aW9ucy50cmlja3lSb29tRGlyZWN0aW9uKSB8fCAhb3B0aW9ucy5tYXAuaXNGcmVlKG9wdGlvbnMueCwgb3B0aW9ucy55KSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGNhbid0IGNvbm5lY3QgdGhyb3VnaCB0aGF0IVxyXG4gICAgICAgICAgICAvLyBUaGF0IGNvb3JkaW5hdGUgaXNuJ3QgZnJlZSFcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMub3RoZXJSb29tID09IHVuZGVmaW5lZCB8fCAhb3B0aW9ucy5vdGhlclJvb20uaXNDb25uZWN0YWJsZU9uKG9wdGlvbnMub3RoZXJSb29tRGlyZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBvdGhlciByb29tIHRoZXJlP1xyXG4gICAgICAgICAgICAvLyBUaGUgb3RoZXIgcm9vbSBkb2Vzbid0IGxpa2UgaXQgdGhpcyB3YXlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRG8gSSBoYXZlIG15IG93biB0cmlja3kgY29kZT9cclxuICAgICAgICBpZiAodGhpcy50cmlja3lDb2RlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmlja3lDb2RlKG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREaXN0YW5jZVRvIChyb29tIDogUm9vbVJhbmRvbSkge1xyXG4gICAgICAgIGxldCBteUNvb3JkaW5hdGVzID0gdGhpcy5sYXN0TWFwLmdldENvb3JkaW5hdGVzKHRoaXMpO1xyXG4gICAgICAgIGxldCBvdGhlckNvb3JkaW5hdGVzID0gdGhpcy5sYXN0TWFwLmdldENvb3JkaW5hdGVzKHJvb20pO1xyXG4gICAgICAgIGlmIChteUNvb3JkaW5hdGVzICE9IHVuZGVmaW5lZCAmJiBvdGhlckNvb3JkaW5hdGVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgYzEgPSBteUNvb3JkaW5hdGVzO1xyXG4gICAgICAgICAgICBsZXQgYzIgPSBvdGhlckNvb3JkaW5hdGVzO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoYzFbMF0gLSBjMlswXSkgKyBNYXRoLmFicyhjMVsxXSAtIGMyWzFdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1ZmZpY2llbnRseSBmYXN0IGZvciBjb25zdGFudCB1c2UuXHJcbiAgICAgKiBAcGFyYW0gcGF0aEVuZFxyXG4gICAgICogQHBhcmFtIG1hcFxyXG4gICAgICogQHBhcmFtIGF2YWlsYWJsZVJvb21zXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kUGF0aFRvIChwYXRoRW5kIDogUm9vbVJhbmRvbSwgdmFsaWRSb29tPyA6IChyb29tIDogUm9vbVJhbmRvbSkgPT4gYm9vbGVhbikge1xyXG4gICAgICAgIHZhbGlkUm9vbSA9IHZhbGlkUm9vbSA9PSB1bmRlZmluZWQgPyAoKSA9PiB7cmV0dXJuIHRydWU7fSA6IHZhbGlkUm9vbTtcclxuICAgICAgICBsZXQgbWFwID0gdGhpcy5sYXN0TWFwO1xyXG4gICAgICAgIGxldCBlbmRQb3NpdGlvbiA9IG1hcC5nZXRDb29yZGluYXRlcyhwYXRoRW5kKTtcclxuICAgICAgICBsZXQgb3BlbiA9IFtdO1xyXG5cclxuICAgICAgICBsZXQgZGlzdGFuY2UgPSAoYzEsIGMyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhjMVswXSAtIGMyWzBdKSArIE1hdGguYWJzKGMxWzFdIC0gYzJbMV0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBuZWlnaGJvcnMgPSAocm9vbSA6IFJvb21SYW5kb20sIHggOiBudW1iZXIsIHkgOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgbGV0IG5laWdocyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSAwOyBkaXJlY3Rpb24gPCByb29tLmNvbm5lY3Rpb25zLmxlbmd0aDsgZGlyZWN0aW9uKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBvdGhlclJvb20gPSByb29tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgICAgICBpZiAob3RoZXJSb29tICE9IHVuZGVmaW5lZCAmJiBvcGVuLmluZGV4T2Yob3RoZXJSb29tKSA9PSAtMSAmJiB2YWxpZFJvb20oPFJvb21SYW5kb20+IG90aGVyUm9vbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyQ29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KFt4LCB5XSwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyID0gW290aGVyUm9vbSwgZGlyQ29vcmRpbmF0ZXMsIGRpc3RhbmNlKGVuZFBvc2l0aW9uLCBkaXJDb29yZGluYXRlcyldO1xyXG4gICAgICAgICAgICAgICAgICAgIG5laWdocy5wdXNoKGRpcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5laWdocy5zb3J0KChhLGIpID0+IHsgcmV0dXJuICg8bnVtYmVyPiBhWzJdKSAtICg8bnVtYmVyPiBiWzJdKTt9KTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgbGV0IHNob3J0ZXN0UGF0aCA9IHtcclxuICAgICAgICAgICAgbGVuZ3RoIDogbWFwLmdldFJvb21Db3VudCgpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgbm9QYXRoID0gc2hvcnRlc3RQYXRoO1xyXG4gICAgICAgIGxldCBjUGF0aCA9IFtdO1xyXG4gICAgICAgIGxldCBmaW5kUGF0aCA9IChteUFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByb29tID0gbXlBcnJheVswXTtcclxuICAgICAgICAgICAgY1BhdGgucHVzaChteUFycmF5KTtcclxuICAgICAgICAgICAgaWYgKHJvb20gPT0gcGF0aEVuZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3J0ZXN0UGF0aC5sZW5ndGggPj0gY1BhdGgubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvcnRlc3RQYXRoID0gY1BhdGguc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvcnRlc3RQYXRoLmxlbmd0aCA+IChjUGF0aC5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICBvcGVuLnB1c2gocm9vbSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXJSb29tcyA9IG5laWdoYm9ycyhyb29tLCBteUFycmF5WzFdWzBdLCBteUFycmF5WzFdWzFdKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3RoZXJSb29tcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoY1BhdGgubGVuZ3RoICsgMSkgPCBzaG9ydGVzdFBhdGgubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRQYXRoKG90aGVyUm9vbXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9wZW4ucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY1BhdGgucG9wKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZmluZFBhdGgoW3RoaXMsIG1hcC5nZXRDb29yZGluYXRlcyh0aGlzKV0pO1xyXG4gICAgICAgIHJldHVybiBzaG9ydGVzdFBhdGggIT0gbm9QYXRoID8gc2hvcnRlc3RQYXRoIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRCZXN0RGlyZWN0aW9uVG8gKG90aGVyUm9vbSA6IFJvb21SYW5kb20sIHZhbGlkUm9vbT8gOiAocm9vbSA6IFJvb21SYW5kb20pID0+IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgcGF0aCA9IHRoaXMuZmluZFBhdGhUbyhvdGhlclJvb20sIHZhbGlkUm9vbSk7XHJcbiAgICAgICAgaWYgKHBhdGggIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmluZGV4T2YocGF0aFsxXVswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBU3RhclBhdGhUbyAob3RoZXJSb29tIDogUm9vbVJhbmRvbSwgdmFsaWRSb29tPyA6IChyb29tIDogUm9vbVJhbmRvbSkgPT4gYm9vbGVhbikge1xyXG4gICAgICAgIHZhbGlkUm9vbSA9IHZhbGlkUm9vbSAhPSB1bmRlZmluZWQgPyB2YWxpZFJvb20gOiAoKSA9PiB7cmV0dXJuIHRydWV9O1xyXG5cclxuICAgICAgICBsZXQgZGlzdGFuY2UgPSAoYzEsIGMyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhjMVswXSAtIGMyWzBdKSArIE1hdGguYWJzKGMxWzFdIC0gYzJbMV0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBpc1Zpc2l0ZWQgPSAocm9vbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmlzaXRlZC5pbmRleE9mKHJvb20pICE9IC0xO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBnZXROZWlnaGJvcnMgPSAobm9kZSA6IFJvb21SYW5kb21Ob2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBuZWlnaGJvcnMgOiBBcnJheTxSb29tUmFuZG9tTm9kZT4gPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgZGlyZWN0aW9uID0gMDsgZGlyZWN0aW9uIDwgbm9kZS5yb29tLmNvbm5lY3Rpb25zLmxlbmd0aDsgZGlyZWN0aW9uKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLnJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSAhPSB1bmRlZmluZWQgJiYgIWlzVmlzaXRlZChub2RlLnJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSkgJiYgdmFsaWRSb29tKDxSb29tUmFuZG9tPiBub2RlLnJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG5vZGUuY29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3JzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb29tIDogPFJvb21SYW5kb20+IG5vZGUucm9vbS5jb25uZWN0aW9uc1tkaXJlY3Rpb25dLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA6IGNvb3JkaW5hdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA6IGRpc3RhbmNlKGNvb3JkaW5hdGVzLCBlbmROb2RlLmNvb3JkaW5hdGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQucHVzaCg8Um9vbVJhbmRvbT4gbm9kZS5yb29tLmNvbm5lY3Rpb25zW2RpcmVjdGlvbl0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuZWlnaGJvcnM7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGdldENsb3Nlc3RQYXRoID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2hvcnRlc3QgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG9wZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsYXN0UG9pbnQgPSBvcGVuW2ldW29wZW5baV0ubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBvaW50LmRpc3RhbmNlIDwgb3BlbltzaG9ydGVzdF1bb3BlbltzaG9ydGVzdF0ubGVuZ3RoIC0gMV0uZGlzdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdCA9IGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHNob3J0ZXN0O1xyXG4gICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICBsZXQgZW5kTm9kZSA9IHtyb29tIDogb3RoZXJSb29tLCBjb29yZGluYXRlcyA6IHRoaXMubGFzdE1hcC5nZXRDb29yZGluYXRlcyhvdGhlclJvb20pLCBkaXN0YW5jZSA6IDB9O1xyXG4gICAgICAgIGxldCBzdGFydENvb3JkaW5hdGVzID0gdGhpcy5sYXN0TWFwLmdldENvb3JkaW5hdGVzKHRoaXMpO1xyXG4gICAgICAgIGxldCBzdGFydE5vZGUgPSB7cm9vbSA6IHRoaXMsIGNvb3JkaW5hdGVzIDogc3RhcnRDb29yZGluYXRlcywgZGlzdGFuY2UgOiBkaXN0YW5jZShzdGFydENvb3JkaW5hdGVzLCBlbmROb2RlLmNvb3JkaW5hdGVzKX07XHJcbiAgICAgICAgbGV0IG9wZW4gOiBBcnJheTxBcnJheTxSb29tUmFuZG9tTm9kZT4+ID0gW1tzdGFydE5vZGVdXTtcclxuICAgICAgICBsZXQgY2xvc2VkIDogQXJyYXk8QXJyYXk8Um9vbVJhbmRvbU5vZGU+PiA9IFtdO1xyXG4gICAgICAgIGxldCBzaG9ydGVzdFBhdGggPSB0aGlzLmxhc3RNYXAuZ2V0Um9vbUNvdW50KCk7XHJcbiAgICAgICAgbGV0IHNob3J0ZXN0SW5kZXg7XHJcbiAgICAgICAgbGV0IG15UGF0aDtcclxuICAgICAgICBsZXQgY2xvc2VzdCA9IDA7XHJcbiAgICAgICAgbGV0IHZpc2l0ZWQgOiBBcnJheTxSb29tUmFuZG9tPiA9IFt0aGlzXTtcclxuICAgICAgICB3aGlsZSAob3Blbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG15UGF0aCA9IG9wZW4uc3BsaWNlKGNsb3Nlc3QsIDEpWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKG15UGF0aFtteVBhdGgubGVuZ3RoIC0gMV0uZGlzdGFuY2UgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHB1c2ggPSBjbG9zZWQucHVzaChteVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG15UGF0aC5sZW5ndGggPCBzaG9ydGVzdFBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdFBhdGggPSBteVBhdGgubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3J0ZXN0SW5kZXggPSBwdXNoIC0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGxhenksIGZpcnN0IHBhdGggaXMgdmVyeSBsaWtlbHkgdG8gYmUgdGhlIGJlc3RcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5laWdoYm9ycyA9IGdldE5laWdoYm9ycyhteVBhdGhbbXlQYXRoLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3Blbi5wdXNoKG15UGF0aC5jb25jYXQoW25laWdoYm9yc1tpXV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gb3Blbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wZW5baV0ubGVuZ3RoID49IHNob3J0ZXN0UGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wZW4uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsb3Nlc3QgPSBnZXRDbG9zZXN0UGF0aCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb3NlZFtzaG9ydGVzdEluZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QVN0YXJCZXN0RGlyZWN0aW9uVG8gKG90aGVyUm9vbSA6IFJvb21SYW5kb20sIHZhbGlkUm9vbT8gOiAocm9vbSA6IFJvb21SYW5kb20pID0+IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgcGF0aCA9IHRoaXMuZ2V0QVN0YXJQYXRoVG8ob3RoZXJSb29tLCB2YWxpZFJvb20pO1xyXG4gICAgICAgIGlmIChwYXRoICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5pbmRleE9mKHBhdGhbMV0ucm9vbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb25uZWN0ZWREaXJlY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzaHVmZmxlciA9IG5ldyBTaHVmZmxlcihSb29tLkRJUkVDVElPTlMpO1xyXG4gICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IHNodWZmbGVyLmdldE9uZSgpOyBkaXJlY3Rpb24gIT0gdW5kZWZpbmVkOyBkaXJlY3Rpb24gPSBzaHVmZmxlci5nZXRPbmUoKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uc1tkaXJlY3Rpb25dICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiBSZXR1cm4gYWxsIHRoaW5ncyBvZiB0eXBlIHRoYXQgYXJlIGluIHBsYWNlZCBSb29tUmFuZG9tLlxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRBY3RpdmUgKHR5cGUgOiB0eXBlb2YgVGhpbmcpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIHJhbmRvbSA9IG5ldyBSb29tUmFuZG9tLi4uXHJcbi8vIHJhbmRvbS5jb25uZWN0YWJsZU9uID0gW1Jvb20uRElSRUNUSU9OX05PUlRILCBSb29tLkRJUkVDVElPTl9TT1VUSC4uLl0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUm9vbS50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSb29tUmFuZG9tLnRzXCIgLz5cclxuXHJcbmludGVyZmFjZSBNYXBDb29yZGluYXRlcyB7XHJcbiAgICB4IDogbnVtYmVyO1xyXG4gICAgeSA6IG51bWJlcjtcclxuICAgIHogOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIFJvb21SYW5kb21NYXAge1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvblRhYmxlIDoge1t4IDogbnVtYmVyXSA6IHtbeSA6IG51bWJlcl0gOiBSb29tUmFuZG9tfX0gPSB7fTtcclxuICAgIHByaXZhdGUgcm9vbU1hcCA9IG5ldyBNYXA8Um9vbSwgQXJyYXk8bnVtYmVyPj4oKTtcclxuICAgIHB1YmxpYyBsb3dlc3RYID0gMDtcclxuICAgIHB1YmxpYyBsb3dlc3RZID0gMDtcclxuICAgIHB1YmxpYyBoaWdoZXN0WCA9IDA7XHJcbiAgICBwdWJsaWMgaGlnaGVzdFkgPSAwO1xyXG4gICAgcHVibGljIGxpbWl0c0ludmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgYSBjb3VudCBvZiBob3cgbWFueSBjb25uZWN0aW9ucyBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLCBhc3N1bWluZyByb29tcyB0aGF0IGNhbiBjb25uZWN0IHRocm91Z2ggc29tZSBkaXJlY3Rpb24uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXZhaWxhYmxlQ29ubmVjdGlvbnMgOiBBcnJheTxBcnJheTxNYXBDb29yZGluYXRlcz4+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBhIGNvdW50IG9mIHJvb21zIHNpbmNlIHRoZSBsYXN0IGNhY2hlIGNsZWFyLiBVc2VkIHRvIG1lYW4gbW9yZSwgYnV0IG5vdyBpcyBqdXN0IGEgY291bnQgb2YgaG93IG1hbnkgcm9vbXMgd2VyZSBwbGFjZWQgZnJvbSB0aGUgY3VycmVudCByZWdpb24uXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm9vbXM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgcm9vbSBjYWNoZSBhbmQgY3JlYXRlcyBhIG5ldyBvbmUgdGhhdCBpcyBlbXB0eVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW1wdHlDYWNoZSAoKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVDb25uZWN0aW9ucyA9IFtdO1xyXG4gICAgICAgIFJvb20uRElSRUNUSU9OUy5mb3JFYWNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVDb25uZWN0aW9ucy5wdXNoKFtdKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJvb21zID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXZhaWxhYmxlQ29ubmVjdGlvbnMgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUNvbm5lY3Rpb25zLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIGFycmF5KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlICsgKGN1cnJlbnRWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVGcm9tQ2FjaGUgKGNvb3JkaW5hdGVzVG9SZW1vdmUgOiBNYXBDb29yZGluYXRlcywgZGlyZWN0aW9uIDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGRpcmVjdGlvbkFycmF5ID0gdGhpcy5hdmFpbGFibGVDb25uZWN0aW9uc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgIGZvciAobGV0IGsgPSAwLCBjb29yZGluYXRlcyA9IGRpcmVjdGlvbkFycmF5W2tdOyBjb29yZGluYXRlcyAhPSB1bmRlZmluZWQ7IGNvb3JkaW5hdGVzID0gZGlyZWN0aW9uQXJyYXlbKytrXSkge1xyXG4gICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMueCA9PSBjb29yZGluYXRlc1RvUmVtb3ZlLnggJiYgY29vcmRpbmF0ZXMueSA9PSBjb29yZGluYXRlc1RvUmVtb3ZlLnkpIHtcclxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbkFycmF5LnNwbGljZShrLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVG9DYWNoZSAoY29vcmRpbmF0ZXNUb0FkZCA6IE1hcENvb3JkaW5hdGVzLCBkaXJlY3Rpb24gOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGlyZWN0aW9uQXJyYXkgPSB0aGlzLmF2YWlsYWJsZUNvbm5lY3Rpb25zW2RpcmVjdGlvbl07XHJcbiAgICAgICAgZm9yIChsZXQgayA9IDAsIGNvb3JkaW5hdGVzID0gZGlyZWN0aW9uQXJyYXlba107IGNvb3JkaW5hdGVzICE9IHVuZGVmaW5lZDsgY29vcmRpbmF0ZXMgPSBkaXJlY3Rpb25BcnJheVsrK2tdKSB7XHJcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy54ID09IGNvb3JkaW5hdGVzVG9BZGQueCAmJiBjb29yZGluYXRlcy55ID09IGNvb3JkaW5hdGVzVG9BZGQueSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpcmVjdGlvbkFycmF5LnB1c2goY29vcmRpbmF0ZXNUb0FkZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFueUZyb21DYWNoZSAoZGlyZWN0aW9uIDogbnVtYmVyKSA6IFJvb21SYW5kb20ge1xyXG4gICAgICAgIGxldCBhcnJheSA9IHRoaXMuYXZhaWxhYmxlQ29ubmVjdGlvbnNbZGlyZWN0aW9uXTtcclxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoYXJyYXkubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIGxldCByYW5kb21Db29yZGluYXRlcyA9IGFycmF5W3JhbmRvbUluZGV4XTtcclxuICAgICAgICAgICAgaWYgKHJhbmRvbUNvb3JkaW5hdGVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um9vbShyYW5kb21Db29yZGluYXRlcy54LCByYW5kb21Db29yZGluYXRlcy55KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNGcmVlICh4IDogbnVtYmVyLCB5IDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBvc2l0aW9uVGFibGVbeF0gPT0gdW5kZWZpbmVkIHx8IHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSA9PT0gdW5kZWZpbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmxvY2sgKHggOiBudW1iZXIsIHkgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0ZyZWUoeCwgeSkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25UYWJsZVt4XSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25UYWJsZVt4XSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGVPblBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbWl0cyh4LCB5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUFsbExpbWl0cyAoKSB7XHJcbiAgICAgICAgdGhpcy5oaWdoZXN0WCA9IDA7XHJcbiAgICAgICAgdGhpcy5oaWdoZXN0WSA9IDA7XHJcbiAgICAgICAgdGhpcy5sb3dlc3RYID0gMDtcclxuICAgICAgICB0aGlzLmxvd2VzdFkgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IHggaW4gdGhpcy5wb3NpdGlvblRhYmxlKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHkgaW4gdGhpcy5wb3NpdGlvblRhYmxlW3hdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldICE9IHVuZGVmaW5lZCAmJiB0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGltaXRzKHBhcnNlSW50KHgpLCBwYXJzZUludCh5KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW1pdHNJbnZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZUxpbWl0cyAoeCwgeSkge1xyXG4gICAgICAgIGlmICh4ID4gdGhpcy5oaWdoZXN0WCkgdGhpcy5oaWdoZXN0WCA9IHg7XHJcbiAgICAgICAgaWYgKHkgPiB0aGlzLmhpZ2hlc3RZKSB0aGlzLmhpZ2hlc3RZID0geTtcclxuICAgICAgICBpZiAoeSA8IHRoaXMubG93ZXN0WSkgdGhpcy5sb3dlc3RZID0geTtcclxuICAgICAgICBpZiAoeCA8IHRoaXMubG93ZXN0WCkgdGhpcy5sb3dlc3RYID0geDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWFwIChyb29tIDogUm9vbVJhbmRvbSwgeCA6IG51bWJlciwgeSA6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uVGFibGVbeF0gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25UYWJsZVt4XSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0gPSByb29tO1xyXG4gICAgICAgIHRoaXMucm9vbU1hcC5zZXQocm9vbSwgW3gsIHldKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZU9uUG9zaXRpb24oeCwgeSk7XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGV2ZXIgd2FudCB0byBkcmF3IG1hcHMsIHRoaXMgd2lsbCBiZSB1c2VmdWxcclxuICAgICAgICB0aGlzLnVwZGF0ZUxpbWl0cyh4LCB5KTtcclxuXHJcbiAgICAgICAgcm9vbS5wbGFjZWQgPSB0cnVlO1xyXG4gICAgICAgIHJvb20ubGFzdE1hcCA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMucm9vbXMrKztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdW5tYXAgKHggOiBudW1iZXIsIHkgOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvblRhYmxlW3hdICE9IHVuZGVmaW5lZCAmJiB0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vbU1hcC5kZWxldGUodGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldKTtcclxuICAgICAgICAgICAgZGVsZXRlICh0aGlzLnBvc2l0aW9uVGFibGVbeF1beV0pO1xyXG4gICAgICAgICAgICB0aGlzLnJvb21zLS07XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FjaGVPblBvc2l0aW9uKHgsIHkpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbWl0c0ludmFsaWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNhY2hlT25Qb3NpdGlvbiAoeCA6IG51bWJlciwgeSA6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjb29yZGluYXRlcyA9IFt4LCB5LCAwXTtcclxuICAgICAgICBsZXQgY29vcmRpbmF0ZXNNYXAgPSA8TWFwQ29vcmRpbmF0ZXM+IHt4IDogeCwgeSA6IHl9O1xyXG4gICAgICAgIGxldCBjb29yZGluYXRlc0Jsb2NrZWQgPSAhdGhpcy5pc0ZyZWUoeCwgeSk7XHJcbiAgICAgICAgbGV0IGNvb3JkaW5hdGVzUm9vbSA9IHRoaXMuZ2V0Um9vbSh4LCB5KTtcclxuXHJcbiAgICAgICAgUm9vbS5ESVJFQ1RJT05TLmZvckVhY2goZGlyZWN0aW9uID0+IHtcclxuICAgICAgICAgICAgbGV0IG9wcG9zaXRlRGlyZWN0aW9uID0gT3Bwb3NpdGVEaXJlY3Rpb25bRGlyZWN0aW9uW2RpcmVjdGlvbl1dO1xyXG4gICAgICAgICAgICBsZXQgc2hpZnRlZCA9IFJvb20uc2hpZnQoY29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIGxldCBzaGlmdGVkTWFwID0gPE1hcENvb3JkaW5hdGVzPiB7eCA6IHNoaWZ0ZWRbMF0sIHkgOiBzaGlmdGVkWzFdfTtcclxuICAgICAgICAgICAgbGV0IHNoaWZ0ZWRCbG9ja2VkID0gIXRoaXMuaXNGcmVlKHNoaWZ0ZWRbMF0sIHNoaWZ0ZWRbMV0pO1xyXG4gICAgICAgICAgICBsZXQgc2hpZnRlZFJvb20gPSB0aGlzLmdldFJvb20oc2hpZnRlZFswXSwgc2hpZnRlZFsxXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNSb29tICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNoaWZ0ZWRCbG9ja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tQ2FjaGUoY29vcmRpbmF0ZXNNYXAsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvb3JkaW5hdGVzUm9vbS5pc0Nvbm5lY3RhYmxlT24oZGlyZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9DYWNoZShjb29yZGluYXRlc01hcCwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUNhY2hlKGNvb3JkaW5hdGVzTWFwLCBkaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hpZnRlZFJvb20gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNCbG9ja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tQ2FjaGUoc2hpZnRlZE1hcCwgb3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaGlmdGVkUm9vbS5pc0Nvbm5lY3RhYmxlT24ob3Bwb3NpdGVEaXJlY3Rpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0NhY2hlKHNoaWZ0ZWRNYXAsIG9wcG9zaXRlRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbUNhY2hlKHNoaWZ0ZWRNYXAsIG9wcG9zaXRlRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb29tICh4IDogbnVtYmVyLCB5IDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25UYWJsZVt4XSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25UYWJsZVt4XVt5XSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvblRhYmxlW3hdW3ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvb3JkaW5hdGVzIChyb29tIDogUm9vbSkgOiBBcnJheTxudW1iZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb29tTWFwLmdldChyb29tKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Um9vbUNvdW50ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb29tTWFwLnNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpZHRoICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oaWdoZXN0WCAtIHRoaXMubG93ZXN0WDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SGVpZ2h0ICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oaWdoZXN0WSAtIHRoaXMubG93ZXN0WTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFBSRUZFUlJFRF9HUk9XVEhfSE9SSVpPTlRBTCA9IDA7XHJcbiAgICBwdWJsaWMgc3RhdGljIFBSRUZFUlJFRF9HUk9XVEhfVkVSVElDQUwgPSAxO1xyXG4gICAgcHVibGljIHN0YXRpYyBQUkVGRVJSRURfR1JPV1RIX0FOWSA9IDI7XHJcblxyXG4gICAgcHVibGljIGdldFByZWZlcnJlZEdyb3d0aCAoKSB7XHJcbiAgICAgICAgbGV0IHJhdGlvID0gdGhpcy5nZXRIZWlnaHQoKSAvIHRoaXMuZ2V0V2lkdGgoKTtcclxuICAgICAgICBsZXQgaWRlYWxSYXRpbyA9IDIuNTsgLy8gVGhpcyBtZWFucyB3ZSdkIHByZWZlciBhIHRhbGwgbWFwIHRoYXQnZCBsb29rIGdvb2Qgb24gb3VyIHNjcmVlblxyXG5cclxuICAgICAgICBsZXQgZGlmZmVyZW5jZSA9IE1hdGguYWJzKHJhdGlvIC0gaWRlYWxSYXRpbyk7XHJcbiAgICAgICAgaWYgKGRpZmZlcmVuY2UgPCAwLjUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJvb21SYW5kb21NYXAuUFJFRkVSUkVEX0dST1dUSF9BTlk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJhdGlvIDwgaWRlYWxSYXRpbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJvb21SYW5kb21NYXAuUFJFRkVSUkVEX0dST1dUSF9WRVJUSUNBTDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSb29tUmFuZG9tTWFwLlBSRUZFUlJFRF9HUk9XVEhfSE9SSVpPTlRBTDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzRGlyZWN0aW9uUHJlZmVycmVkIChkaXJlY3Rpb24gOiBudW1iZXIsIGdyb3d0aCA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChncm93dGggPT0gUm9vbVJhbmRvbU1hcC5QUkVGRVJSRURfR1JPV1RIX0FOWSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTk9SVEggfHwgZGlyZWN0aW9uID09IERpcmVjdGlvbi5TT1VUSCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ3Jvd3RoID09IFJvb21SYW5kb21NYXAuUFJFRkVSUkVEX0dST1dUSF9WRVJUSUNBTDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZ3Jvd3RoID09IFJvb21SYW5kb21NYXAuUFJFRkVSUkVEX0dST1dUSF9IT1JJWk9OVEFMO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9TaHVmZmxlci50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSb29tUmFuZG9tTWFwLnRzXCIgLz5cclxuY2xhc3MgU2h1ZmZsZXJEaXJlY3Rpb24gZXh0ZW5kcyBTaHVmZmxlcjxudW1iZXI+IHtcclxuICAgIHByaXZhdGUgcHJlZmVycmVkR3Jvd3RoIDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb25zQXJyYXkgOiBBcnJheTxudW1iZXI+O1xyXG4gICAgcHVibGljIHJ1bm5lciA6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChhcnJheSA6IEFycmF5PG51bWJlcj4sIHByZWZlcnJlZEdyb3d0aCA6IG51bWJlciwgcm5nPyA6ICgpID0+IG51bWJlcikge1xyXG4gICAgICAgIHN1cGVyKGFycmF5LCBybmcpO1xyXG4gICAgICAgIHRoaXMucHJlZmVycmVkR3Jvd3RoID0gcHJlZmVycmVkR3Jvd3RoO1xyXG5cclxuICAgICAgICBsZXQgZ29vZERpcmVjdGlvbnMgPSBbXTtcclxuICAgICAgICBsZXQgYmFkRGlyZWN0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSB0aGlzLmdldE9uZSgpOyBkaXJlY3Rpb24gIT0gdW5kZWZpbmVkOyBkaXJlY3Rpb24gPSB0aGlzLmdldE9uZSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChSb29tUmFuZG9tTWFwLmlzRGlyZWN0aW9uUHJlZmVycmVkKGRpcmVjdGlvbiwgdGhpcy5wcmVmZXJyZWRHcm93dGgpKSB7XHJcbiAgICAgICAgICAgICAgICBnb29kRGlyZWN0aW9ucy5wdXNoKGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiYWREaXJlY3Rpb25zLnB1c2goZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zQXJyYXkgPSBnb29kRGlyZWN0aW9ucy5jb25jYXQoYmFkRGlyZWN0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljICBnZXREaXJlY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbnNBcnJheVt0aGlzLnJ1bm5lcisrXTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSb29tUmFuZG9tLnRzXCIgLz5cclxuLyoqXHJcbiAqIEZvZGRlciBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGEgcmFuZG9tIHJvb20sIGV4Y2VwdDpcclxuICogMSAtIEl0IG11c3QgYmUgY3JlYXRlZCBhcyBuZWVkZWQgYnkgYSBSZWdpb25SYW5kb20gYXMgaXQgYXR0ZW1wdHMgdG8gcGxhY2UgVHJpY2t5IHJvb21zLlxyXG4gKiAyIC0gSXQgZG9lc24ndCBjb3VudCB0b3dhcmRzIGEgcGxheWVyJ3MgbWF4aW11bSByZW1lbWJlcmVkIHJvb21zXHJcbiAqL1xyXG5jbGFzcyBSb29tUmFuZG9tRm9kZGVyIGV4dGVuZHMgUm9vbVJhbmRvbSB7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGlkPyA6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGlkLCB0cnVlKTtcclxuICAgIH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9SZWdpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vU2h1ZmZsZXIudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiU2h1ZmZsZXJEaXJlY3Rpb24udHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiUm9vbVJhbmRvbU1hcC50c1wiIC8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJSb29tUmFuZG9tLnRzXCIgLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlJvb21SYW5kb21Gb2RkZXIudHNcIiAvPlxyXG5pbnRlcmZhY2UgUmFuZG9taXppbmdSb29tT3B0aW9ucyB7XHJcbiAgICByZWdpb24gOiBSZWdpb25SYW5kb207XHJcbiAgICByb29tIDogUm9vbVJhbmRvbTtcclxuICAgIG1hcCA6IFJvb21SYW5kb21NYXA7XHJcbn1cclxuXHJcbmNsYXNzIFJlZ2lvblJhbmRvbSBleHRlbmRzIFJlZ2lvbiB7XHJcbiAgICBwcml2YXRlIHJhbmRvbWl6ZWQgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBtYXAgOiBSb29tUmFuZG9tTWFwO1xyXG4gICAgcHVibGljIGZvZGRlclJvb21DbGFzcyA6IHR5cGVvZiBSb29tUmFuZG9tID0gUm9vbVJhbmRvbUZvZGRlcjtcclxuICAgIHB1YmxpYyBwbGFjZWRSb29tcyA6IEFycmF5PFJvb21SYW5kb20+ID0gW107XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChuYW1lIDogc3RyaW5nLCBtYXA/IDogUm9vbVJhbmRvbU1hcCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHRoaXMubWFwID0gbWFwID09IHVuZGVmaW5lZCA/IG5ldyBSb29tUmFuZG9tTWFwKCkgOiBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJhbmRvbWl6ZSAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmRvbWl6ZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgUmVnaW9uUmFuZG9tLnJ1bGVib29rUmFuZG9taXplUmVnaW9uLmV4ZWN1dGUoe1xyXG4gICAgICAgICAgICAgICAgbm91biA6IHRoaXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcm5nIDogKCkgPT4gbnVtYmVyID0gKCkgPT4geyByZXR1cm4gTWF0aC5yYW5kb20oKTsgfTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVib29rUmFuZG9taXplUmVnaW9uID0gbmV3IFJ1bGVib29rPFJlZ2lvbj4oXCJSYW5kb21pemluZyBSYW5kb20gUmVnaW9uIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZWJvb2tQbGFjZVJvb20gPSBuZXcgUnVsZWJvb2s8UmFuZG9taXppbmdSb29tT3B0aW9ucz4oXCJQbGFjaW5nIFJhbmRvbSBSb29tIHNvbWV0aGluZ1wiKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZWJvb2tCZWZvcmVQbGFjZVJvb20gPSBuZXcgUnVsZWJvb2s8UmFuZG9taXppbmdSb29tT3B0aW9ucz4oXCJCZWZvcmUgcGxhY2luZyBSYW5kb20gUm9vbSBzb21ldGhpbmdcIik7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVib29rQWZ0ZXJQbGFjZVJvb20gPSBuZXcgUnVsZWJvb2s8UmFuZG9taXppbmdSb29tT3B0aW9ucz4oXCJBZnRlciBwbGFjaW5nIFJhbmRvbSBSb29tIHNvbWV0aGluZ1wiKTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVGaXJzdFJhbmRvbWl6ZVJlZ2lvbiA9IFJlZ2lvblJhbmRvbS5ydWxlYm9va1JhbmRvbWl6ZVJlZ2lvbi5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJFbXB0eSBtYXAgY2FjaGUgdG8gc3RhcnQgcmFuZG9taXppbmcgcmVnaW9uXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlZ2lvbiA9IDxSZWdpb25SYW5kb20+IHJ1bm5lci5ub3VuO1xyXG5cclxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBjb25uZWN0IGEgcmVnaW9uIHRvIGFub3RoZXIgcmVnaW9uIHVuaW50ZW50aW9uYWxseVxyXG4gICAgICAgICAgICByZWdpb24ubWFwLmVtcHR5Q2FjaGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVCYXNpY1JhbmRvbWl6ZVJlZ2lvbiA9IFJlZ2lvblJhbmRvbS5ydWxlYm9va1JhbmRvbWl6ZVJlZ2lvbi5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lIDogXCJSYW5kb21pemUgYWxsIHVucGxhY2VkLCByYW5kb21pemFibGUgcm9vbXMgaW4gcmVnaW9uIHNvbWV0aGluZ1wiLFxyXG4gICAgICAgIGNvZGUgOiBhc3luYyBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVnaW9uID0gPFJlZ2lvblJhbmRvbT4gcnVubmVyLm5vdW47XHJcblxyXG4gICAgICAgICAgICBsZXQgcm9vbVNodWZmbGVyID0gbmV3IFNodWZmbGVyKFxyXG4gICAgICAgICAgICAgICAgUmVnaW9uLkluUmVsYXRpb24uZ2V0QWxsUmlnaHRUeXBlcyhyZWdpb24sIFJvb21SYW5kb20pLmZpbHRlcigocm9vbSA6IFJvb21SYW5kb20pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vbS5yYW5kb21pemFibGUgJiYgIXJvb20ucGxhY2VkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChyb29tID09IFdvcmxkU3RhdGUucGxheWVyLmdldFJvb20oKSB8fCAoUmVnaW9uUmFuZG9tLnJuZygpICogMTAwKSA8PSByb29tLmFwcGVhckNoYW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9KSwgUmVnaW9uUmFuZG9tLnJuZ1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgcm9vbSA9IHJvb21TaHVmZmxlci5nZXRPbmUoKTsgcm9vbSAhPSB1bmRlZmluZWQ7IHJvb20gPSByb29tU2h1ZmZsZXIuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgYXZhaWxhYmxlIGNvbm5lY3Rpb25zIGZyb20gZ2V0dGluZyB0b28gbG93XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBwbGFjaW5nIHJvb21zIHdpdGggdG9vIGZldyBhdmFpbGFibGVDb25uZWN0aW9ucywgd2UgbWlnaHQgZW5kIHVwIHJlYWNoaW5nIDAgYXZhaWxhYmxlQ29ubmVjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIFdoaWNoIHdvdWxkIG1lYW4gbm8gbW9yZSByb29tcyBjYW4gYmUgcGxhY2VkLlxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlZ2lvbi5tYXAucm9vbXMgPiAwICYmIHJlZ2lvbi5tYXAuZ2V0QXZhaWxhYmxlQ29ubmVjdGlvbnMoKSA8IDQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9kZGVyID0gbmV3IHJlZ2lvbi5mb2RkZXJSb29tQ2xhc3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IDxSYW5kb21pemluZ1Jvb21PcHRpb25zPiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA6IHJlZ2lvbi5tYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb20gOiBmb2RkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHJlZ2lvblxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbi5wbGFjZShmb2RkZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tCZWZvcmVQbGFjZVJvb20uZXhlY3V0ZSh7bm91biA6IG9wdGlvbnN9KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uZXhlY3V0ZSh7bm91biA6IG9wdGlvbnN9KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tBZnRlclBsYWNlUm9vbS5leGVjdXRlKHtub3VuIDogb3B0aW9uc30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXAgOiByZWdpb24ubWFwLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvb20gOiByb29tLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHJlZ2lvblxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFJlZ2lvblJhbmRvbS5ydWxlYm9va0JlZm9yZVBsYWNlUm9vbS5leGVjdXRlKHtub3VuIDogb3B0aW9uc30pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgUmVnaW9uUmFuZG9tLnJ1bGVib29rUGxhY2VSb29tLmV4ZWN1dGUoe25vdW4gOiBvcHRpb25zfSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tBZnRlclBsYWNlUm9vbS5leGVjdXRlKHtub3VuIDogb3B0aW9uc30pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghcm9vbS5wbGFjZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0Vycm9yKG5ldyBTYXkoXCJXYXMgdW5hYmxlIHRvIHBsYWNlIHJvb20gXCIsIHJvb20sIFwiLiBHYW1lIG1pZ2h0IGJlIHVucGxheWFibGUuXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcnVsZUFkZEV4dHJhQ29ubmVjdGlvbnMgPSBSZWdpb25SYW5kb20ucnVsZWJvb2tSYW5kb21pemVSZWdpb24uY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfTE9XRVNULFxyXG4gICAgICAgIG5hbWUgOiBcIkFkZCBleHRyYSBjb25uZWN0aW9ucyB0byByb29tcyBpbiByZWdpb25cIixcclxuICAgICAgICBjb2RlIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlZ2lvbiA9IDxSZWdpb25SYW5kb20+IHJ1bm5lci5ub3VuO1xyXG4gICAgICAgICAgICBsZXQgcGxhY2VkUm9vbXMgPSBSZWdpb24uSW5SZWxhdGlvbi5nZXRBbGxSaWdodFR5cGVzKHJlZ2lvbiwgUm9vbVJhbmRvbSkuZmlsdGVyKChyb29tIDogUm9vbVJhbmRvbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb20ucmFuZG9taXphYmxlICYmIHJvb20ucGxhY2VkO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHBsYWNlZFJvb21zLmZvckVhY2goKHJvb20gOiBSb29tUmFuZG9tKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbXlDb29yZGluYXRlcyA9IHJlZ2lvbi5tYXAuZ2V0Q29vcmRpbmF0ZXMocm9vbSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXI8bnVtYmVyPihyb29tLmNvbm5lY3RhYmxlT24uc2xpY2UoMCksIFJlZ2lvblJhbmRvbS5ybmcpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0T25lKCk7IGRpcmVjdGlvbiAhPSB1bmRlZmluZWQgJiYgKFJlZ2lvblJhbmRvbS5ybmcoKSAqIDEwMCkgPD0gcm9vbS5leHRyYUNvbm5lY3Rpb25DaGFuY2U7IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldE9uZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb20uY29ubmVjdGlvbnNbZGlyZWN0aW9uXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyQ29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG15Q29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdGhlclJvb20gPSByZWdpb24ubWFwLmdldFJvb20ob3RoZXJDb29yZGluYXRlc1swXSwgb3RoZXJDb29yZGluYXRlc1sxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclJvb20gIT0gdW5kZWZpbmVkICYmIG90aGVyUm9vbS5yYW5kb21pemFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG90aGVyUm9vbS5pc0Nvbm5lY3RhYmxlT24oT3Bwb3NpdGVEaXJlY3Rpb25bRGlyZWN0aW9uW2RpcmVjdGlvbl1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFJlZ2lvblJhbmRvbS5ybmcoKSAqIDEwMCkgPD0gb3RoZXJSb29tLmV4dHJhQ29ubmVjdGlvbkNoYW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbS5tYXBSb29tKG90aGVyUm9vbSwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlUGxhY2VGaXJzdFJvb20gPSBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiUGxhY2luZyBGaXJzdCByb29tIHNvbWV0aGluZ1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwbGFjaW5nT3B0aW9ucyA9IDxSYW5kb21pemluZ1Jvb21PcHRpb25zPiBydW5uZXIubm91bjtcclxuXHJcbiAgICAgICAgICAgIGlmIChwbGFjaW5nT3B0aW9ucy5tYXAuaXNGcmVlKDAsIDApKSB7XHJcbiAgICAgICAgICAgICAgICBwbGFjaW5nT3B0aW9ucy5tYXAubWFwKHBsYWNpbmdPcHRpb25zLnJvb20sIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbmRpdGlvbnMgOiBydW5uZXIgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcnVubmVyLm5vdW4ubWFwLnJvb21zID09IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlUGxhY2VOb25Ucmlja3lSb29tID0gUmVnaW9uUmFuZG9tLnJ1bGVib29rUGxhY2VSb29tLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlBsYWNpbmcgbm9uLXRyaWNreSByb29tIHNvbWV0aGluZ1wiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHkgOiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZSA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwbGFjaW5nT3B0aW9ucyA9IDxSYW5kb21pemluZ1Jvb21PcHRpb25zPiBydW5uZXIubm91bjtcclxuXHJcblxyXG4gICAgICAgICAgICAvL2xldCBkaXJlY3Rpb25TaHVmZmxlciA9IG5ldyBTaHVmZmxlcjxudW1iZXI+KHBsYWNpbmdPcHRpb25zLnJvb20uY29ubmVjdGFibGVPbik7XHJcbiAgICAgICAgICAgIGxldCBwcmVmZXJyZWRHcm93dGhEaXJlY3Rpb24gPSBwbGFjaW5nT3B0aW9ucy5tYXAuZ2V0UHJlZmVycmVkR3Jvd3RoKCk7XHJcbiAgICAgICAgICAgIGxldCBkaXJlY3Rpb25TaHVmZmxlciA9IG5ldyBTaHVmZmxlckRpcmVjdGlvbihwbGFjaW5nT3B0aW9ucy5yb29tLmNvbm5lY3RhYmxlT24sIHByZWZlcnJlZEdyb3d0aERpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIC8vZm9yIChsZXQgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0T25lKCk7IGRpcmVjdGlvbiAhPSB1bmRlZmluZWQ7IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldE9uZSgpKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGRpcmVjdGlvbiA9IGRpcmVjdGlvblNodWZmbGVyLmdldERpcmVjdGlvbigpOyBkaXJlY3Rpb24gIT0gdW5kZWZpbmVkOyBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXREaXJlY3Rpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9wcG9zaXRlRGlyZWN0aW9uID0gT3Bwb3NpdGVEaXJlY3Rpb25bRGlyZWN0aW9uW2RpcmVjdGlvbl1dO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbm5lY3RhYmxlUm9vbSA9IHBsYWNpbmdPcHRpb25zLm1hcC5nZXRBbnlGcm9tQ2FjaGUob3Bwb3NpdGVEaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RhYmxlUm9vbSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXJDb29yZGluYXRlcyA9IHBsYWNpbmdPcHRpb25zLm1hcC5nZXRDb29yZGluYXRlcyhjb25uZWN0YWJsZVJvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteUNvb3JkaW5hdGVzID0gUm9vbS5zaGlmdChvdGhlckNvb3JkaW5hdGVzLCBvcHBvc2l0ZURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMucm9vbS5tYXBSb29tKGNvbm5lY3RhYmxlUm9vbSwgZGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBwbGFjaW5nT3B0aW9ucy5tYXAubWFwKHBsYWNpbmdPcHRpb25zLnJvb20sIG15Q29vcmRpbmF0ZXNbMF0sIG15Q29vcmRpbmF0ZXNbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb25kaXRpb25zIDogcnVubmVyID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLnJvb20udHJpY2t5Q29kZSA9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBydWxlUGxhY2VUcmlja3lSb29tID0gUmVnaW9uUmFuZG9tLnJ1bGVib29rUGxhY2VSb29tLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlBsYWNpbmcgdHJpY2t5IHJvb20gc29tZXRoaW5nXCIsXHJcbiAgICAgICAgY29kZSA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwbGFjaW5nT3B0aW9ucyA9IDxSYW5kb21pemluZ1Jvb21PcHRpb25zPiBydW5uZXIubm91bjtcclxuICAgICAgICAgICAgbGV0IHBsYWNlZFJvb21zID0gPEFycmF5PFJvb21SYW5kb20+PiBwbGFjaW5nT3B0aW9ucy5yZWdpb24uZ2V0Um9vbXMoKS5maWx0ZXIoKHJvb20pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByb29tIGluc3RhbmNlb2YgUm9vbVJhbmRvbSAmJiByb29tLnBsYWNlZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocGxhY2VkUm9vbXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzRXJyb3IoXCJVbmFibGUgdG8gcGxhY2Ugcm9vbSBcIiArIHBsYWNpbmdPcHRpb25zLnJvb20uZ2V0UHJpbnRlZE5hbWUoKSArIFwiOiBUaGVyZSBhcmUgbm8gcm9vbXMgdG8gY29ubmVjdCB0byFcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCByb29tU2h1ZmZsZXIgPSBuZXcgU2h1ZmZsZXIocGxhY2VkUm9vbXMsIFJlZ2lvblJhbmRvbS5ybmcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjb25uZWN0YWJsZVJvb20gPSByb29tU2h1ZmZsZXIuZ2V0T25lKCk7IGNvbm5lY3RhYmxlUm9vbSAhPSB1bmRlZmluZWQ7IGNvbm5lY3RhYmxlUm9vbSA9IHJvb21TaHVmZmxlci5nZXRPbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyaWNraWVyID0gPFRyaWNraWVyT3B0aW9ucz4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA6IHBsYWNpbmdPcHRpb25zLnJlZ2lvbixcclxuICAgICAgICAgICAgICAgICAgICBtYXAgOiBwbGFjaW5nT3B0aW9ucy5tYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJSb29tIDogY29ubmVjdGFibGVSb29tXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyaWNreSA9IHBsYWNpbmdPcHRpb25zLnJvb20uZ2V0QW55RGlyZWN0aW9uKHRyaWNraWVyKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmlja3kgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMucm9vbS5tYXBSb29tKGNvbm5lY3RhYmxlUm9vbSwgdHJpY2t5LnRyaWNreVJvb21EaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC5tYXAocGxhY2luZ09wdGlvbnMucm9vbSwgdHJpY2t5LngsIHRyaWNreS55KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVEhJUyBXT1JLU1xyXG4gICAgICAgICAgICAvLyBJIERPTidUIEtOT1cgV0hZXHJcbiAgICAgICAgICAgIC8vIEkgRE9OJ1QgQ0FSRSBXSFlcclxuICAgICAgICAgICAgLy8gTEVBVkVcclxuICAgICAgICAgICAgbGV0IGNvbm5lY3RhYmxlVGhyb3VnaEZvZGRlciA9IChmb2RkZXJTdGVwIDogbnVtYmVyLCBjb25uZWN0aW5nUm9vbSA6IFJvb21SYW5kb20pID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB0cmlja2llciA9IDxUcmlja2llck9wdGlvbnM+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWdpb24gOiBwbGFjaW5nT3B0aW9ucy5yZWdpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwIDogcGxhY2luZ09wdGlvbnMubWFwLFxyXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUm9vbSA6IGNvbm5lY3RpbmdSb29tXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb2RkZXJTdGVwID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2luZ09wdGlvbnMucm9vbS5nZXRBbnlEaXJlY3Rpb24odHJpY2tpZXIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3Rm9kZGVyID0gbmV3IChwbGFjaW5nT3B0aW9ucy5yZWdpb24uZm9kZGVyUm9vbUNsYXNzKSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IGRpcmVjdGlvblNodWZmbGVyID0gbmV3IFNodWZmbGVyPG51bWJlcj4obmV3Rm9kZGVyLmNvbm5lY3RhYmxlT24sIFJlZ2lvblJhbmRvbS5ybmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVmZXJyZWRHcm93dGhEaXJlY3Rpb24gPSBwbGFjaW5nT3B0aW9ucy5tYXAuZ2V0UHJlZmVycmVkR3Jvd3RoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvblNodWZmbGVyID0gbmV3IFNodWZmbGVyRGlyZWN0aW9uKHBsYWNpbmdPcHRpb25zLnJvb20uY29ubmVjdGFibGVPbiwgcHJlZmVycmVkR3Jvd3RoRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBkaXJlY3Rpb24gPSBkaXJlY3Rpb25TaHVmZmxlci5nZXREaXJlY3Rpb24oKTsgZGlyZWN0aW9uICE9IHVuZGVmaW5lZDsgZGlyZWN0aW9uID0gZGlyZWN0aW9uU2h1ZmZsZXIuZ2V0RGlyZWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wcG9zaXRlRGlyZWN0aW9uID0gT3Bwb3NpdGVEaXJlY3Rpb25bRGlyZWN0aW9uW2RpcmVjdGlvbl1dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXJDb29yZGluYXRlcyA9IHBsYWNpbmdPcHRpb25zLm1hcC5nZXRDb29yZGluYXRlcyhjb25uZWN0aW5nUm9vbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3VsZGJlQ29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG90aGVyQ29vcmRpbmF0ZXMsIG9wcG9zaXRlRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvZGRlclRyaWNreSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUm9vbSA6IGNvbm5lY3RpbmdSb29tLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSb29tRGlyZWN0aW9uIDogb3Bwb3NpdGVEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlja3lSb29tRGlyZWN0aW9uIDogZGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwIDogcGxhY2luZ09wdGlvbnMubWFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uIDogcGxhY2luZ09wdGlvbnMucmVnaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA6IHdvdWxkYmVDb29yZGluYXRlc1swXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgOiB3b3VsZGJlQ29vcmRpbmF0ZXNbMV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGb2RkZXIuaXNQbGFjZWFibGUoZm9kZGVyVHJpY2t5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9kZGVyLm1hcFJvb20oY29ubmVjdGluZ1Jvb20sIGZvZGRlclRyaWNreS50cmlja3lSb29tRGlyZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC5tYXAobmV3Rm9kZGVyLCBmb2RkZXJUcmlja3kueCwgZm9kZGVyVHJpY2t5LnkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0VHJpY2t5ID0gY29ubmVjdGFibGVUaHJvdWdoRm9kZGVyKGZvZGRlclN0ZXAgLSAxLCBuZXdGb2RkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUcmlja3kgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2luZ09wdGlvbnMucmVnaW9uLnBsYWNlKG5ld0ZvZGRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRUcmlja3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvZGRlci51bm1hcFJvb20oZm9kZGVyVHJpY2t5LnRyaWNreVJvb21EaXJlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC51bm1hcChmb2RkZXJUcmlja3kueCwgZm9kZGVyVHJpY2t5LnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgZm9kZGVyTGV2ZWwgPSAxOyBmb2RkZXJMZXZlbCA8IDEwOyBmb2RkZXJMZXZlbCsrKSB7XHJcbiAgICAgICAgICAgICAgICByb29tU2h1ZmZsZXIucmVzdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29ubmVjdGFibGVSb29tID0gcm9vbVNodWZmbGVyLmdldE9uZSgpOyBjb25uZWN0YWJsZVJvb20gIT0gdW5kZWZpbmVkOyBjb25uZWN0YWJsZVJvb20gPSByb29tU2h1ZmZsZXIuZ2V0T25lKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdHJpY2t5ID0gY29ubmVjdGFibGVUaHJvdWdoRm9kZGVyKGZvZGRlckxldmVsLCBjb25uZWN0YWJsZVJvb20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlja3kgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLnJvb20ubWFwUm9vbSh0cmlja3kub3RoZXJSb29tLCB0cmlja3kudHJpY2t5Um9vbURpcmVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNpbmdPcHRpb25zLm1hcC5tYXAocGxhY2luZ09wdGlvbnMucm9vbSwgdHJpY2t5LngsIHRyaWNreS55KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnRBc0Vycm9yKFwiVW5hYmxlIHRvIHBsYWNlIHJvb20gXCIgKyBwbGFjaW5nT3B0aW9ucy5yb29tLmdldFByaW50ZWROYW1lKCkgKyBcIjogQWxsIGF0dGVtcHRzIGZhaWxlZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIlN0b3JlZFZhcmlhYmxlLnRzXCIgLz5cclxuaW50ZXJmYWNlIFNhdmVkRXZlbnRPcHRpb25zPFQ+IGV4dGVuZHMgU3RvcmVkVmFyaWFibGVPcHRpb25zPFQ+IHtcclxuICAgIGRlc2NyaXB0aW9uIDogc3RyaW5nO1xyXG4gICAgdmFsdWVEZXNjcmlwdGlvbiA6ICh2YWx1ZSA6IFQpID0+IHN0cmluZztcclxufVxyXG5cclxuY2xhc3MgU2F2ZWRFdmVudDxUPiBleHRlbmRzIFN0b3JlZFZhcmlhYmxlPFQ+IHtcclxuICAgIHByaXZhdGUgZGVzY3JpcHRpb24gOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlRGVzY3JpcHRpb24gOiAodmFsdWUgOiBUKSA9PiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChvcHRpb25zIDogU2F2ZWRFdmVudE9wdGlvbnM8VD4pIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb247XHJcbiAgICAgICAgdGhpcy5nZXRWYWx1ZURlc2NyaXB0aW9uID0gb3B0aW9ucy52YWx1ZURlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vL0V4YW1wbGVcclxubGV0IEVWRU5UX09SQ19DSElFRl9LSUxMRUQgPSBuZXcgU2F2ZWRFdmVudDxib29sZWFuPihcclxuICAgIDxTYXZlZEV2ZW50T3B0aW9uczxib29sZWFuPj4ge1xyXG4gICAgICAgIGlkOiBcIkVWRU5UX09SQ19DSElFRl9LSUxMRURcIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJEZXNjcmliZXIgd2hldGhlciB0aGUgb3JjIGNoaWVmIGlzIGFsaXZlIG9yIGRlYWQuXCIsXHJcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlRGVzY3JpcHRpb246ICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoRVZFTlRfT1JDX0NISUVGX0tJTExFRC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVGhlIG9yYyBjaGllZiBoYXMgYmVlbiBraWxsZWQuXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUaGUgb3JjIGNoaWVmIGlzIGFsaXZlLlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbik7XHJcbiIsImludGVyZmFjZSBUZXN0aW5nT3B0aW9ucyB7XHJcbiAgICBuYW1lIDogc3RyaW5nO1xyXG4gICAgdmFsdWUgOiBudW1iZXI7XHJcbn1cclxuXHJcbmNsYXNzIERpY2Uge1xyXG4gICAgcHJvdGVjdGVkIHJhbmdlIDogQXJyYXk8bnVtYmVyPiA9IFswLCAwLCAxLCAxXTtcclxuICAgIHB1YmxpYyBtaW5SZXN1bHQgPSAwO1xyXG4gICAgcHJvdGVjdGVkIHRlc3RTdHJpbmcgOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh0ZXN0U3RyaW5nIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy50ZXN0U3RyaW5nID0gdGVzdFN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcm9sbCAoc3RhdCA6IG51bWJlcikgOiBBcnJheTxudW1iZXI+ICB7XHJcbiAgICAgICAgbGV0IHJuZyA9IHRoaXMucmFuZ2Uuc2xpY2UoKTtcclxuICAgICAgICBpZiAoc3RhdCA+PSAxMCkge1xyXG4gICAgICAgICAgICBybmcucHVzaCgyLCAxKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPj0gNykge1xyXG4gICAgICAgICAgICBybmcucHVzaCgxLCAxKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPj0gNCkge1xyXG4gICAgICAgICAgICBybmcucHVzaCgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXQ7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAocm5nLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocm5nW2luZGV4XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUT0RPOiBQcmludCB0aGUgZGljZSByZXN1bHRzIGlmIE1lbW9yeS5TaG93RGljZSA9IDFcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBzdW0gKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gYSArIGI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNheSAocmVzdWx0cyA6IEFycmF5PG51bWJlcj4pIDogU2F5IHtcclxuICAgICAgICBsZXQgZmluYWxSZXN1bHQgPSByZXN1bHRzLnJlZHVjZShEaWNlLnN1bSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTYXkoXHJcbiAgICAgICAgICAgIG5ldyBTYXlCb2xkKFwiW1wiLCB0aGlzLnRlc3RTdHJpbmcsIFwiXSBcIiksXHJcbiAgICAgICAgICAgIFwiID0gW1wiLCByZXN1bHRzLmpvaW4oXCJdIFtcIiksIFwiXVwiLFxyXG4gICAgICAgICAgICByZXN1bHRzLmxlbmd0aCA9PSAxID8gXCJcIiA6XHJcbiAgICAgICAgICAgICAgICAoXCIgPSBcIiArIGZpbmFsUmVzdWx0KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdFJvbGwgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBlbmVteSA6IFRlc3RpbmdPcHRpb25zKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZShwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIGxldCBlbmVteURpY2UgPSBuZXcgRGljZShlbmVteS5uYW1lKTtcclxuICAgICAgICBsZXQgZW5lbXlSZXN1bHQgPSBlbmVteURpY2Uucm9sbChlbmVteS52YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGVuZW15UmVzdWx0LnJlZHVjZShEaWNlLnN1bSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdERpZmZpY3VsdHkgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBkaWZmaWN1bHR5IDogbnVtYmVyKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZShwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGRpZmZpY3VsdHk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiRGljZS50c1wiIC8+XHJcbmNsYXNzIERpY2VDb21tb24gZXh0ZW5kcyBEaWNlIHtcclxuICAgIHByb3RlY3RlZCByYW5nZSA6IEFycmF5PG51bWJlcj4gPSBbLTEsIDAsIDAsIDAsIDEsIDEsIDFdO1xyXG4gICAgcHVibGljIG1pblJlc3VsdCA9IC0xO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgdGVzdEFnYWluc3RSb2xsIChwbGF5ZXIgOiBUZXN0aW5nT3B0aW9ucywgZW5lbXkgOiBUZXN0aW5nT3B0aW9ucykgOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwbGF5ZXJEaWNlID0gbmV3IERpY2VDb21tb24ocGxheWVyLm5hbWUpO1xyXG4gICAgICAgIGxldCBwbGF5ZXJSZXN1bHQgPSBwbGF5ZXJEaWNlLnJvbGwocGxheWVyLnZhbHVlKTtcclxuICAgICAgICBsZXQgZW5lbXlEaWNlID0gbmV3IERpY2VDb21tb24oZW5lbXkubmFtZSk7XHJcbiAgICAgICAgbGV0IGVuZW15UmVzdWx0ID0gZW5lbXlEaWNlLnJvbGwoZW5lbXkudmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gcGxheWVyUmVzdWx0LnJlZHVjZShEaWNlLnN1bSkgLSBlbmVteVJlc3VsdC5yZWR1Y2UoRGljZS5zdW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgdGVzdEFnYWluc3REaWZmaWN1bHR5IChwbGF5ZXIgOiBUZXN0aW5nT3B0aW9ucywgZGlmZmljdWx0eSA6IG51bWJlcikgOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBwbGF5ZXJEaWNlID0gbmV3IERpY2VDb21tb24ocGxheWVyLm5hbWUpO1xyXG4gICAgICAgIGxldCBwbGF5ZXJSZXN1bHQgPSBwbGF5ZXJEaWNlLnJvbGwocGxheWVyLnZhbHVlKTtcclxuICAgICAgICByZXR1cm4gcGxheWVyUmVzdWx0LnJlZHVjZShEaWNlLnN1bSkgLSBkaWZmaWN1bHR5O1xyXG4gICAgfVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIkRpY2UudHNcIiAvPlxyXG5jbGFzcyBEaWNlRGFuZ2Vyb3VzIGV4dGVuZHMgRGljZSB7XHJcbiAgICBwcm90ZWN0ZWQgcmFuZ2UgOiBBcnJheTxudW1iZXI+ID0gWy0yLCAtMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMV07XHJcbiAgICBwdWJsaWMgbWluUmVzdWx0ID0gLTI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdFJvbGwgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBlbmVteSA6IFRlc3RpbmdPcHRpb25zKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZURhbmdlcm91cyhwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIGxldCBlbmVteURpY2UgPSBuZXcgRGljZURhbmdlcm91cyhlbmVteS5uYW1lKTtcclxuICAgICAgICBsZXQgZW5lbXlSZXN1bHQgPSBlbmVteURpY2Uucm9sbChlbmVteS52YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGVuZW15UmVzdWx0LnJlZHVjZShEaWNlLnN1bSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB0ZXN0QWdhaW5zdERpZmZpY3VsdHkgKHBsYXllciA6IFRlc3RpbmdPcHRpb25zLCBkaWZmaWN1bHR5IDogbnVtYmVyKSA6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHBsYXllckRpY2UgPSBuZXcgRGljZURhbmdlcm91cyhwbGF5ZXIubmFtZSk7XHJcbiAgICAgICAgbGV0IHBsYXllclJlc3VsdCA9IHBsYXllckRpY2Uucm9sbChwbGF5ZXIudmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBwbGF5ZXJSZXN1bHQucmVkdWNlKERpY2Uuc3VtKSAtIGRpZmZpY3VsdHk7XHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vLi4vRWxlbWVudHMvQ2xhc3Nlcy9TYXkvT25lT2YudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZWJvb2sudHNcIiAvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vUnVsZS50c1wiIC8+XHJcbmludGVyZmFjZSBMaXF1aWRPcHRpb25zIGV4dGVuZHMgVGhpbmdPcHRpb25zIHtcclxuICAgIHRhc3RlPyA6IE9uZU9mO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGlxdWlkQ29udGFpbmVyIHtcclxuICAgIGxpcXVpZENvbnRlbnRzIDogQXJyYXk8TGlxdWlkPjtcclxufVxyXG5cclxuaW50ZXJmYWNlIExpcXVpZE1peHR1cmUge1xyXG4gICAgcXVhbnRpdGllcyA6IE1hcDxhbnksIG51bWJlcj47XHJcbiAgICByZXN1bHQgOiBMaXF1aWQ7XHJcbiAgICBxdWFudGl0eU11bHRpcGxpZXI/IDogbnVtYmVyO1xyXG4gICAgZmlyc3RQcmlvcml0eSA6IG51bWJlcjtcclxuICAgIHByaW9yaXR5IDogbnVtYmVyO1xyXG59XHJcblxyXG5jbGFzcyBMaXF1aWQgZXh0ZW5kcyBUaGluZyB7XHJcbiAgICBwdWJsaWMgdGFzdGUgOiBPbmVPZjtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAob3B0aW9ucz8gOiBMaXF1aWRPcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPT0gdW5kZWZpbmVkID8ge30gOiBvcHRpb25zO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnRhc3RlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRhc3RlID0gb3B0aW9ucy50YXN0ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhc3RlID0gbmV3IE9uZU9mKFxyXG4gICAgICAgICAgICAgICAgT25lT2YuUk9UQVRJTkdfUkFORE9NLFxyXG4gICAgICAgICAgICAgICAgXCJJdCBnb2VzIGVhc2lseSB0aHJvdWdoIHlvdXIgdGhyb2F0IHdpdGggbm8gcGFydGljdWxhciB0YXN0ZS5cIixcclxuICAgICAgICAgICAgICAgIFwiWW91IHRhc3RlIG5vdGhpbmcgYXMgaXQgc29mdGx5IHNsaWRlcyB0aHJvdWdoIHlvdXIgdG9uZ3VlLlwiXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBydWxlYm9vayB3aWxsIHJldHVybiBhIExpcXVpZE1peHR1cmVcclxuICAgICAqIEB0eXBlIHtSdWxlYm9vazxMaXF1aWRDb250YWluZXI+fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVib29rTWl4aW5nID0gbmV3IFJ1bGVib29rPExpcXVpZENvbnRhaW5lcj4oXCJNaXhpbmcgdGhlIGxpcXVpZCBjb250ZW50cyBvZiBzb21ldGhpbmdcIik7IC8vIG5vdW4gPSBMaXF1aWRDb250YWluZXJcclxuICAgIHB1YmxpYyBzdGF0aWMgbWl4dHVyZXMgOiBBcnJheTxMaXF1aWRNaXh0dXJlPiA9IFtdO1xyXG4gICAgcHVibGljIHN0YXRpYyBzb3J0ZWRNaXh0dXJlcyA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbWl4IChjb250YWluZXIgOiBMaXF1aWRDb250YWluZXIpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgTGlxdWlkLnJ1bGVib29rTWl4aW5nLmV4ZWN1dGUoe25vdW4gOiBjb250YWluZXJ9KTtcclxuICAgICAgICAvLyBEaWQgd2UgZmluZCBhIGxpcXVpZD9cclxuICAgICAgICBpZiAocmVzdWx0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZXQgZmluYWxRdWFudGl0eSA9IHJlc3VsdC5xdWFudGl0eU11bHRpcGxpZXIgIT0gdW5kZWZpbmVkID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5xdWFudGl0eU11bHRpcGxpZXIgKiBjb250YWluZXIubGlxdWlkQ29udGVudHMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIubGlxdWlkQ29udGVudHMubGVuZ3RoKTtcclxuXHJcblxyXG4gICAgICAgICAgICBjb250YWluZXIubGlxdWlkQ29udGVudHMgPSBuZXcgQXJyYXkoZmluYWxRdWFudGl0eSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxRdWFudGl0eTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIubGlxdWlkQ29udGVudHNbaV0gPSByZXN1bHQucmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWl4dHVyZXMgKCkge1xyXG4gICAgICAgIGlmIChMaXF1aWQuc29ydGVkTWl4dHVyZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExpcXVpZC5taXh0dXJlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgTGlxdWlkLm1peHR1cmVzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGIuZmlyc3RQcmlvcml0eSA8IGEuZmlyc3RQcmlvcml0eSkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICBpZiAoYS5maXJzdFByaW9yaXR5IDwgYi5maXJzdFByaW9yaXR5KSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKGIucHJpb3JpdHkgPCBhLnByaW9yaXR5KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIGlmIChhLnByaW9yaXR5IDwgYi5wcmlvcml0eSkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIExpcXVpZC5zb3J0ZWRNaXh0dXJlcyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIExpcXVpZC5taXh0dXJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZE1peHR1cmUobWl4dHVyZSA6IExpcXVpZE1peHR1cmUpIHtcclxuICAgICAgICBMaXF1aWQubWl4dHVyZXMucHVzaChtaXh0dXJlKTtcclxuICAgICAgICBMaXF1aWQuc29ydGVkTWl4dHVyZXMgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVEZWZhdWx0TWl4aW5nID0gTGlxdWlkLnJ1bGVib29rTWl4aW5nLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIk1peGluZyB0aHJvdWdoIE1peHR1cmVzXCIsXHJcbiAgICAgICAgY29kZSA6IHJ1bm5lciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChydW5uZXIubm91bi5saXF1aWRDb250ZW50cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbWl4dHVyZSA6IExpcXVpZE1peHR1cmU7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTGlxdWlkLm1peHR1cmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBtaXh0dXJlID0gTGlxdWlkLm1peHR1cmVzW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BvcnRpb25zID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgbWl4dHVyZUl0ZXJhdG9yID0gbWl4dHVyZS5xdWFudGl0aWVzLmVudHJpZXMoKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IG1peHR1cmVMaXF1aWQgPSBtaXh0dXJlSXRlcmF0b3IubmV4dCgpOyAhbWl4dHVyZUxpcXVpZC5kb25lOyBtaXh0dXJlTGlxdWlkID0gbWl4dHVyZUl0ZXJhdG9yLm5leHQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtaXh0dXJlVHlwZSA9IG1peHR1cmVMaXF1aWQudmFsdWVbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1peHR1cmVRdWFudGl0eSA9IG1peHR1cmVMaXF1aWQudmFsdWVbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoZWRRdWFudGl0eSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcnVubmVyLm5vdW4ubGlxdWlkQ29udGVudHMuZm9yRWFjaCgobGlxdWlkVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpcXVpZFR5cGUgPT0gbWl4dHVyZVR5cGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG1peHR1cmVUeXBlID09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlxdWlkVHlwZSBpbnN0YW5jZW9mIG1peHR1cmVUeXBlIHx8IG1peHR1cmVUeXBlKGxpcXVpZFR5cGUpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRRdWFudGl0eSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4dHVyZVR5cGUgaXMgbm90IGFsd2F5cyBjYWxsYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcm9wb3J0aW9ucy5wdXNoKG1hdGNoZWRRdWFudGl0eSAvIG1peHR1cmVRdWFudGl0eSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHZhbGlkIG1peCwgdGhlbiBldmVyeSBwYXJ0IG9mIHRoZSByZWNpcGUgaXMgcmVwcmVzZW50ZWQgcHJvcG9ydGlvbmFsbHlcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wb3J0aW9ucy5ldmVyeShmdW5jdGlvbihlbGVtZW50LCBpbmRleCwgYXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFycmF5WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1peHR1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuLy8gY2xhc3MgU2VtZW4gZXh0ZW5kcyBMaXF1aWQge31cclxuLy8gY2xhc3MgT3JjU2VtZW4gZXh0ZW5kcyBTZW1lbiB7fVxyXG4vLyBjbGFzcyBNaW5vdGF1clNlbWVuIGV4dGVuZHMgU2VtZW4ge31cclxuLy8gY2xhc3MgUG93ZXJmdWxEcmluayBleHRlbmRzIExpcXVpZCB7fVxyXG4vL1xyXG4vLyBsZXQgcG93ZXJmdWxEcmlua1F1YW50aXRpZXMgPSBuZXcgTWFwKCk7XHJcbi8vIHBvd2VyZnVsRHJpbmtRdWFudGl0aWVzLnNldChPcmNTZW1lbiwgMik7XHJcbi8vIHBvd2VyZnVsRHJpbmtRdWFudGl0aWVzLnNldChNaW5vdGF1clNlbWVuLCAxKTtcclxuLy8gTGlxdWlkLmFkZE1peHR1cmUoe1xyXG4vLyAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuLy8gICAgIHByaW9yaXR5IDogUnVsZS5QUklPUklUWV9NRURJVU0sXHJcbi8vICAgICBxdWFudGl0eU11bHRpcGxpZXIgOiAwLjUsXHJcbi8vICAgICByZXN1bHQgOiBuZXcgUG93ZXJmdWxEcmluayhcIlBvd2VyZnVsIERyaW5rXCIpLFxyXG4vLyAgICAgcXVhbnRpdGllcyA6IHBvd2VyZnVsRHJpbmtRdWFudGl0aWVzXHJcbi8vIH0pO1xyXG4vLyBsZXQgcmVjaXBpZW50ID0gbmV3IFJlY2lwaWVudChcIkN1cFwiKTtcclxuLy8gcmVjaXBpZW50LmxpcXVpZENvbnRlbnRzLnB1c2gobmV3IE9yY1NlbWVuKFwiU2VtZW4gb2YgdGhlIENoaWVmXCIpKTtcclxuLy8gcmVjaXBpZW50LmxpcXVpZENvbnRlbnRzLnB1c2gobmV3IE9yY1NlbWVuKFwiU2VtZW4gb2YgdGhlIENoaWVmXCIpKTtcclxuLy8gcmVjaXBpZW50LmxpcXVpZENvbnRlbnRzLnB1c2gobmV3IE9yY1NlbWVuKFwiU2VtZW4gb2YgdGhlIENoaWVmXCIpKTtcclxuLy8gcmVjaXBpZW50LmxpcXVpZENvbnRlbnRzLnB1c2gobmV3IE9yY1NlbWVuKFwiU2VtZW4gb2YgdGhlIENoaWVmXCIpKTtcclxuLy8gcmVjaXBpZW50LmxpcXVpZENvbnRlbnRzLnB1c2gobmV3IE1pbm90YXVyU2VtZW4oXCJTZW1lbiBvZiBIYXJvbGRcIikpO1xyXG4vLyByZWNpcGllbnQubGlxdWlkQ29udGVudHMucHVzaChuZXcgTWlub3RhdXJTZW1lbihcIlNlbWVuIG9mIEhhcm9sZFwiKSk7XHJcbi8vXHJcbi8vIHtcclxuLy8gICAgIFNldHRpbmdzLnNldERlYnVnKGZhbHNlKTtcclxuLy8gICAgIGxldCB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4vLyAgICAgbGV0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbi8vICAgICBMaXF1aWQubWl4KHJlY2lwaWVudCk7XHJcbi8vICAgICB0MSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4vLyAgICAgY29uc29sZS5sb2codDEgLSB0MCk7XHJcbi8vIH0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vVGhpbmcudHNcIiAvPlxyXG5jbGFzcyBTY2VuZXJ5IGV4dGVuZHMgVGhpbmcge1xyXG4gICAgcHVibGljIGZpeGVkSW5QbGFjZSA9IHRydWU7XHJcbiAgICBwdWJsaWMgc2NlbmVyeSA9IHRydWU7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vSHVtYW5vaWQudHNcIiAvPlxyXG5jbGFzcyBPcmNEZWJ1Z2dlciBleHRlbmRzIEh1bWFub2lkIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgbmFtZU1vZGlmaWVyID0gbmV3IFNodWZmbGVyKFtcclxuICAgICAgICBcIlVnbHlcIiwgXCJNdXNjdWxhclwiLCBcIlZlaW55XCIsIFwiQW5ncnlcIiwgXCJTYWRcIiwgXCJTbWFydFwiLCBcIkFnaWxlXCIsIFwiU2hvcnRcIiwgXCJCdWxnaW5nXCIsIFwiSW50ZW5zZVwiLCBcIlNtb3VsZGVyaW5nXCJcclxuICAgIF0pO1xyXG4gICAgcHVibGljIHN0YXRpYyBjb3VudGVyID0gMTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpc01hbGU6IHRydWUsXHJcbiAgICAgICAgICAgIG5hbWUgOiAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hbWVNb2QgPSBPcmNEZWJ1Z2dlci5uYW1lTW9kaWZpZXIuZ2V0T25lKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZU1vZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lTW9kID0gKE9yY0RlYnVnZ2VyLmNvdW50ZXIrKykudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lTW9kICsgXCIgT3JjXCI7XHJcbiAgICAgICAgICAgIH0pKCksXHJcbiAgICAgICAgICAgIHVuaXF1ZSA6IHRydWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uIDogXCJUaGlzIGlzIG9uZSBleHRyZW1lbHkgdWdseSBmZWxsb3cuXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5BSS53YW5kZXJlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BSS5waWNrc1NoaW5pZXMgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcblxyXG5BY3Rpb25UYWxrLmNhcnJ5LmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgbmFtZSA6IFwiVGFsa2luZyB0byB0aGUgb3JjXCIsXHJcbiAgICBmaXJzdFByaW9yaXR5IDogQWN0aW9uVGFsay5QUklPUklUWV9HTE9CQUxfRElBTE9HVUUsXHJcbiAgICBwcmlvcml0eSA6IEFjdGlvblRhbGsuUFJJT1JJVFlfQ09NTU9OX0RJQUxPR1VFLFxyXG4gICAgY29uZGl0aW9ucyA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWxrPikgPT4ge1xyXG4gICAgICAgIHJldHVybiBydW5uZXIubm91bi5nZXROb3VuKDApIGluc3RhbmNlb2YgT3JjRGVidWdnZXI7XHJcbiAgICB9LFxyXG4gICAgY29kZSA6IChydW5uZXIgOiBSdWxlYm9va1J1bm5lcjxBY3Rpb25UYWxrPikgPT4ge1xyXG4gICAgICAgIGxldCBvcmMgPSA8T3JjRGVidWdnZXI+IHJ1bm5lci5ub3VuLmdldE5vdW4oMCk7XHJcbiAgICAgICAgLy9hd2FpdCBEaWFsb2d1ZVRyZWVzLkNvbXBpbGFibGVUZXN0LmV4ZWN1dGUoKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gRGljZS50ZXN0QWdhaW5zdFJvbGwoXHJcbiAgICAgICAgICAgIHtuYW1lOiBcIkNoYXJtICsgMlwiLCB2YWx1ZSA6IFdvcmxkU3RhdGUucGxheWVyLmdldFN0YXQoQXR0cmlidXRlcy5DaGFybSkgKyAyfSxcclxuICAgICAgICAgICAge25hbWU6IFwiT3JjJ3Mgd2l0cyArIDJcIiwgdmFsdWUgOiBvcmMuZ2V0U3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSkgKyAyfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgPiAwKSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChuZXcgU2F5KFwiWW91IHdpbiFcIikpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludEFzQ29udGVudChuZXcgU2F5KFwiWW91IGxvc2UuXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbn0pOyIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi9MaXF1aWQudHNcIiAvPlxyXG5cclxuY2xhc3MgU2VtZW4gZXh0ZW5kcyBMaXF1aWQge1xyXG4gICAgcHVibGljIGN1bW1lciA6IFBlcnNvbjtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGN1bW1lciA6IFBlcnNvbiwgb3B0aW9ucz8gOiBUaGluZ09wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB0aGlzLmN1bW1lciA9IGN1bW1lcjtcclxuICAgIH1cclxufSIsInZhciByb29tYSA9IG5ldyBSb29tUmFuZG9tKFwiUm9vbSBBXCIpO1xucm9vbWEuZGVzY3JpcHRpb24gPSBuZXcgU2F5KFxuICAgIFwiWW91IGFyZSBpbnNpZGUgYSBib3ggb2YgbWV0YWwgcGFpbnRlZCBibHVlLiBZb3VyIGhlYWQgYWxtb3N0IHRvdWNoZXMgdGhlIGNlaWxpbmcsIG1ha2luZyB0aGUgcm9vbSBsb29rIHNtYWxsZXIgdGhhbiBpdCByZWFsbHkgaXMuXCIsXG4gICAgU2F5LkxJTkVfQlJFQUssXG4gICAgbmV3IFNheUlmKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLmdldExlZnQodmFzZSkgPT0gcm9vbWEgfHwgVGhpbmcuSW5zaWRlUm9vbVJlbGF0aW9uLmdldExlZnQodXJuKSA9PSByb29tYTtcbiAgICAgICAgfSxcbiAgICAgICAgXCIgU3RpbGwsIHRoZXJlIGFyZSBzb21lIHRoaW5ncyB0aHJvd24gYWJvdXQuXCJcbiAgICApXG4pO1xuXG5QbGF5QmVnaW5zLnNldFN0YXJ0aW5nUm9vbShyb29tYSk7XG5cbmxldCBwYWRkZWRCcmEgPSBuZXcgQ2xvdGhpbmcoe25hbWUgOiBcIlBhZGRlZCBCcmFcIiwgdW5pcXVlIDogdHJ1ZX0pO1xucGFkZGVkQnJhLmJyZWFzdFBhZGRpbmcgPSAzO1xucGFkZGVkQnJhLnNsb3RzID0gW0h1bWFub2lkLlNMT1RfQlJFQVNUU107XG5cbmxldCBwYWRkZWRVbmRlcndlYXIgPSBuZXcgQ2xvdGhpbmcoe25hbWUgOiBcIlBhZGRlZCBVbmRlcndlYXJcIiwgdW5pcXVlIDogdHJ1ZX0pO1xucGFkZGVkVW5kZXJ3ZWFyLmNyb3RjaFBhZGRpbmcgPSAxNTtcbnBhZGRlZFVuZGVyd2Vhci5zbG90cyA9IFtIdW1hbm9pZC5TTE9UX0NST1RDSF9CQUNLLCBIdW1hbm9pZC5TTE9UX0NST1RDSF9GUk9OVF07XG5cbi8vIFRoaW5nLldlYXJSZWxhdGlvbi5zZXRSZWxhdGlvbihXb3JsZFN0YXRlLnBsYXllciwgcGFkZGVkQnJhKTtcbi8vIFRoaW5nLldlYXJSZWxhdGlvbi5zZXRSZWxhdGlvbihXb3JsZFN0YXRlLnBsYXllciwgcGFkZGVkVW5kZXJ3ZWFyKTtcblxubGV0IHBsYXllciA9IFdvcmxkU3RhdGUucGxheWVyO1xuV29ybGRTdGF0ZS5wbGF5ZXIgPSBwbGF5ZXI7XG52YXIgdmFzZSA9IG5ldyBUaGluZyh7bmFtZSA6IFwiVmFzZVwifSk7XG52YXNlLmRlc2NyaXB0aW9uID0gbmV3IFNheShcIlRoaXMgaXMgYW4gb3JuYW1lbnRhbCB2YXNlIHRoYXQnZCBsb29rIHZlcnkgbmljZSBvbiB5b3VyIGxhcC4gV2h5PyBXaG8ga25vd3MuXCIpO1xucm9vbWEucGxhY2UodmFzZSk7XG5cbmxldCBtYXBPZlRlc3QgPSBuZXcgTWFwTm90ZSh7bmFtZTogXCJNYXAgb2YgdGhpcyBSZWdpb25cIixcbmRlc2NyaXB0aW9uIDogXCJUaGlzIGlzIGEgc2ltcGxlIG1hcCBzaG93aW5nIGFsbCB0aGUgcm9vbXMgaGVyZS5cIiwgdW5pcXVlIDogdHJ1ZX0pO1xucm9vbWEucGxhY2UobWFwT2ZUZXN0KTtcblxubGV0IHVybiA9IG5ldyBUaGluZyh7dW5pcXVlOiB0cnVlLCBuYW1lIDogXCJVcm4gb2YgRHJlYW1zXCIsIGltYWdlIDogXCJpbWFnZTAwMVwifSk7XG51cm4uZGVzY3JpcHRpb24gPSBuZXcgU2F5KFwiVGhpcyBhcHBlYXJzIHRvIGJlIGEgc2ltcGxlLCBibGFjayB1cm4gY29udGFpbmluZyB0aGUgYXNoZXMgb2YgeW91ciBkcmVhbXMuXCIpO1xucm9vbWEucGxhY2UodXJuKTtcblxudmFyIHJvb21iID0gbmV3IFJvb21SYW5kb20oXCJSb29tIEJcIik7XG5cbnJvb21iLnBsYWNlKHZhc2UpO1xuXG5cbmxldCBmcmlsbHlQb3VjaCA9IG5ldyBDb2luUG91Y2goe1xuICAgIG5hbWUgOiBcIkZyaWxseSBQb3VjaFwiLFxuICAgIC8vaW1hZ2UgOiBuZXcgU2F5SW1hZ2UoXCJpbWFnZTAwMVwiKSxcbiAgICBkZXNjcmlwdGlvbiA6IG5ldyBTYXkoXCJUaGlzIGlzIGEgdmVyeSBnYXkgbGl0dGxlIHBpbmsgcG91Y2ggZnVsbCBvZiBsaXR0bGUgaGVhcnRzLlwiKVxufSk7XG5mcmlsbHlQb3VjaC5hZGRDb2lucyg1MDIpO1xucm9vbWEucGxhY2UoZnJpbGx5UG91Y2gpO1xuXG4vLyBBY3Rpb25UYWtlLmNoZWNrLmFkZFJ1bGUobmV3IFJ1bGUoPFJ1bGVPcHRpb25zPGFueT4+IHtcbi8vICAgICBjb2RlIDogZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbi8vICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4vLyAgICAgfVxuLy8gfSkpO1xuXG5sZXQgYmlnU2FjayA9IG5ldyBDb2luUG91Y2goe25hbWUgOiBcIkJpZyBTYWNrXCJ9KTtcbmJpZ1NhY2suYWRkQ29pbnMoMTAwKTtcbnJvb21hLnBsYWNlKGJpZ1NhY2spO1xuXG5sZXQgcmVnaW9uID0gbmV3IFJlZ2lvblJhbmRvbShcIlRlc3QgUmVnaW9uXCIpO1xuXG5cbnJlZ2lvbi5wbGFjZShyb29tYSwgcm9vbWIpO1xuZm9yIChsZXQgaSA9IDE7IGkgPCA2OyBpKyspIHtcbiAgICBsZXQgcm9vbSA9IG5ldyBSb29tUmFuZG9tKFwiUm9vbSBcIiArIGkudG9TdHJpbmcoKSk7XG4gICAgLy8gbGV0IHJhbmRvbURpcmVjdGlvbiA9IG5ldyBTaHVmZmxlcihbUm9vbS5OT1JUSCwgUm9vbS5TT1VUSCwgUm9vbS5FQVNULCBSb29tLldFU1RdKVxuICAgIC8vIHJvb20uY29ubmVjdGFibGVPbiA9IFtyYW5kb21EaXJlY3Rpb24uZ2V0T25lKCldO1xuICAgIC8vcm9vbS5jb25uZWN0YWJsZU9uID0gW1Jvb20uTk9SVEgsIFJvb20uU09VVEgsIFJvb20uRUFTVCwgUm9vbS5XRVNUXTtcbiAgICByZWdpb24ucGxhY2Uocm9vbSk7XG5cbiAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDAuNSkge1xuICAgICAgICAvL21hcE9mVGVzdC5hZGRSb29tKHJvb20pO1xuICAgIH1cblxufVxuXG5tYXBPZlRlc3QuYWRkUmVnaW9uKHJlZ2lvbik7XG5cbmxldCBzb3V0aGVzdFJvb20gPSBuZXcgUm9vbVJhbmRvbShcIlNvdXRoZXN0IFJvb21cIik7XG4vL3NvdXRoZXN0Um9vbS5hcHBlYXJDaGFuY2UgPSAwO1xuXG5yZWdpb24ucGxhY2Uoc291dGhlc3RSb29tKTtcblxuLy9zb3V0aGVzdFJvb20uY29ubmVjdGFibGVPbiA9IFtSb29tLk5PUlRIXTtcbnNvdXRoZXN0Um9vbS5hcHBlYXJDaGFuY2UgPSAxMDA7XG5zb3V0aGVzdFJvb20uYmFja2dyb3VuZEltYWdlID0gXCJibG9vXCI7XG5cbnNvdXRoZXN0Um9vbS50cmlja3lDb2RlID0gKG9wdGlvbnMgOiBUcmlja3lPcHRpb25zKSA9PiB7XG4gICAgbGV0IG15Q29vcmRpbmF0ZXMgPSBbb3B0aW9ucy54LCBvcHRpb25zLnldO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgUm9vbS5ESVJFQ1RJT05TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSBSb29tLkRJUkVDVElPTlNbaV07XG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT0gRGlyZWN0aW9uLk5PUlRIKSB7XG4gICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KG15Q29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMubWFwLmlzRnJlZShjb29yZGluYXRlc1swXSwgY29vcmRpbmF0ZXNbMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBUaGlzIHJvb20gY2FuIG9ubHkgaGF2ZSByb29tcyBvbiBub3J0aCBvZiBpdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBSb29tLnNoaWZ0KGNvb3JkaW5hdGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm1hcC5pc0ZyZWUoY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gVGhpcyByb29tIGNhbiBvbmx5IGhhdmUgcm9vbXMgb24gbm9ydGggb2YgaXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cblJlZ2lvblJhbmRvbS5ydWxlYm9va0FmdGVyUGxhY2VSb29tLmFkZFJ1bGUobmV3IFJ1bGUoe1xuICAgIG5hbWUgOiBcIkFmdGVyIHBsYWNpbmcgdGhlIHNvdXRoZXN0IHJvb21cIixcbiAgICBjb2RlIDogcnVubmVyID0+IHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSA8UmFuZG9taXppbmdSb29tT3B0aW9ucz4gcnVubmVyLm5vdW47XG4gICAgICAgIGxldCBteUNvb3JkaW5hdGVzID0gb3B0aW9ucy5tYXAuZ2V0Q29vcmRpbmF0ZXMob3B0aW9ucy5yb29tKTtcbiAgICAgICAgaWYgKG15Q29vcmRpbmF0ZXMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFJvb20uRElSRUNUSU9OUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBSb29tLkRJUkVDVElPTlNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTk9SVEgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gUm9vbS5zaGlmdChteUNvb3JkaW5hdGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1hcC5ibG9jayhjb29yZGluYXRlc1swXSwgY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IFJvb20uc2hpZnQoY29vcmRpbmF0ZXMsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubWFwLmJsb2NrKGNvb3JkaW5hdGVzWzBdLCBjb29yZGluYXRlc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb25kaXRpb25zIDogcnVubmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHJ1bm5lci5ub3VuLnJvb20gPT0gc291dGhlc3RSb29tO1xuICAgIH1cbn0pKVxuXG5UaGluZy5DYXJyeVJlbGF0aW9uLnNldFJlbGF0aW9uKFdvcmxkU3RhdGUucGxheWVyLCBtYXBPZlRlc3QpO1xuXG4vLyBTZXR0aW5ncy5zZXREZWJ1ZyhmYWxzZSk7XG5QbGF5QmVnaW5zLnJ1bGVib29rLmFkZFJ1bGUobmV3IFJ1bGUoe1xuICAgIG5hbWUgOiBcInJhbmRvbWl6ZSByZWdpb25cIixcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxuICAgIGNvZGUgOiBhc3luYyBydW5uZXIgPT4ge1xuICAgICAgICAvL2xldCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICBhd2FpdCByZWdpb24ucmFuZG9taXplKCk7XG4gICAgICAgIC8vbGV0IHQxID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfVxufSkpO1xuXG5SZWdpb25SYW5kb20ucnVsZWJvb2tSYW5kb21pemVSZWdpb24uYWRkUnVsZShuZXcgUnVsZSh7XG4gICAgbmFtZSA6IFwiQWRkIHJvb20gQSBhbmQgQiB0byByZWdpb25cIixcbiAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxuICAgIGNvZGUgOiBhc3luYyBydW5uZXIgPT4ge1xuICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uZXhlY3V0ZSh7XG4gICAgICAgICAgICBub3VuIDogPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHtcbiAgICAgICAgICAgICAgICBtYXAgOiByZWdpb24ubWFwLFxuICAgICAgICAgICAgICAgIHJvb20gOiByb29tYSxcbiAgICAgICAgICAgICAgICByZWdpb24gOiByZWdpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbigpO1xuICAgICAgICBhd2FpdCBSZWdpb25SYW5kb20ucnVsZWJvb2tQbGFjZVJvb20uZXhlY3V0ZSh7XG4gICAgICAgICAgICBub3VuIDogPFJhbmRvbWl6aW5nUm9vbU9wdGlvbnM+IHtcbiAgICAgICAgICAgICAgICBtYXAgOiByZWdpb24ubWFwLFxuICAgICAgICAgICAgICAgIHJvb20gOiByb29tYixcbiAgICAgICAgICAgICAgICByZWdpb24gOiByZWdpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbigpO1xuICAgIH0sXG4gICAgY29uZGl0aW9ucyA6IHJ1bm5lciA9PiB7XG4gICAgICAgIHJldHVybiBydW5uZXIubm91biA9PSByZWdpb247XG4gICAgfVxufSkpO1xuXG5mdW5jdGlvbiBnZXRQYXRoIChyb29tYSA6IFJvb20sIHJvb21iIDogUm9vbSkge1xuICAgIGNvbnNvbGUuZGVidWcoXCJUaGUgYmVzdCBwYXRoIGZyb20gXCIgKyByb29tYS5nZXRQcmludGVkTmFtZSgpICsgXCIgdG8gXCIgKyByb29tYi5nZXRQcmludGVkTmFtZSgpICsgXCIgaXM6XCIpO1xuICAgIGxldCB0MCwgZGlyLCB0MTtcbiAgICB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGRpciA9IHJvb21hLmJlc3REaXJlY3Rpb25Ubyhyb29tYik7XG4gICAgdDEgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBpZiAoZGlyICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKERpcmVjdGlvbk5hbWVzW0RpcmVjdGlvbltkaXJdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlRoZXJlIGlzIG5vIHBhdGguXCIpO1xuICAgIH1cbiAgICBjb25zb2xlLmRlYnVnKFwiQ2FsbCB0byBkb1NvbWV0aGluZyB0b29rIFwiICsgKHQxIC0gdDApICsgXCIgbWlsbGlzZWNvbmRzLlwiKTtcbn1cblxuLy8gbGV0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4vLyBmb3IgKHZhciBpID0gMDsgaSA8IDE7IGkrKykge1xuLy8gICAgIGdldFBhdGgocm9vbWEsIHJvb21qKTtcbi8vIH1cbi8vIHdpbmRvd1sncm9vbWUnXSA9IHJvb21lO1xuLy8gbGV0IHQxID0gcGVyZm9ybWFuY2Uubm93KCk7XG4vLyBjb25zb2xlLmRlYnVnKFwiVG90YWw6IFwiICsgKHQxIC0gdDApICsgXCIgbWlsbGlzZWNvbmRzLlwiKTtcblxuXG5sZXQgd2FuZGVyUmVnaW9uID0gbmV3IFJlZ2lvblJhbmRvbShcIk9yY2FibGVSZWdpb25cIik7XG53YW5kZXJSZWdpb24ucGxhY2Uocm9vbWEsIHJvb21iKTtcbnJlZ2lvbi5wbGFjZSh3YW5kZXJSZWdpb24pO1xuXG4vLyBUZXN0IGRvbmUgd2l0aCBhIHRob3VzYW5kIG9yY3Mgc2VhcmNoaW5nIHBhdGhzIGFuZCByZWFkaW5nIHJvb21zLiBUb3RhbCB0aW1lIHRha2VuOiAyMDBtcy5cbi8vIDEwMDAgb3Jjcywgbm8gd2FuZGVyZXJzOiAxMzBtc1xuLy8gMTAwIG9yY3MsIG5vIHdhbmRlcmVyOiAxM21zIChzbyB0aGUgc2FtZSBhbW91bnQgb2YgdGltZSBhcyBub3QgaGF2aW5nIGFueSBvcmNzKVxuLy8gMTAwIG9yY3MsIHdhbmRlcmVyOiAzMG1zXG4vLyAxMDAgb3Jjcywgbm8gc2hpbnkgcGlja2VyLCB3YW5kZXJlcjogMzBtc1xuLy8gMTAwIG9yY3MsIG5vIHdhbmRlcmVyLCBubyBzaGlueSBwaWNrZXI6IDEzbXNcbi8vIDEwMDAgb3Jjcywgbm8gd2FuZGVyZXIsIG5vIHNoaW55IHBpY2tlcjogNTFtc1xuLyoqXG4gKiBDb25jbHVzaW9uOlxuICogVGhlIHRlc3QgaGFkIGFsbCBvcmNzIHBsYWNlZCBpbiB0aGUgc2FtZSByb29tLCBzbyBldmVyeSB0aW1lIFNoaW55UGlja2VyIEFJIHJ1bnMsIGFsbCB0aGUgb3JjcyB3ZXJlIGxvb2tpbmcgYXQgYWxsIHRoZSBvdGhlciBvcmNzLlxuICogR2FtZSBmZWVscyBcImluc3RhbnRcIiB1cCB0byAxMDBtcyB0dXJucywgd2hpY2ggd2FzIHJlYWNoZWQgYXQgMjUwIG9yY3Mgd2l0aCBKVVNUIG9uZSBQSWNrcyBTaGlueSBhbmQgV2FuZGVyZXIgcnVsZXMuXG4gKiBXaXRoIDEwMCBFTVBUWSBzaGlueSBydWxlcywgMjUwIG9yY3MgYWxyZWFkeSB0YWtlIHVwIDUwMG1zIHBlciB0dXJuIVxuICogSWYgdGhlIG9yY3MgZmFpbCB0aGUgY29uZGl0aW9ucyBmb3Igd2FuZGVyZXIgYW5kIHNoaW55IHJ1bGVzLCB0aGVuIHRoZXJlIGlzIGp1c3QgYSBzbWFsbCBvdmVyaGVhZCB0byBoYXZpbmcgdGhlc2UgcnVsZXMgdGhlcmUuXG4gKiAxMDAgUnVsZXMgZmFpbGluZyB0aGUgY29uZGl0aW9ucyBhbGxvd3MgZm9yIDgwMCBvcmNzIGJlbG93IDEwMG1zLlxuICogNTAgb3JjcyB3aXRoIDE1MCBTaGlueSBSdWxlcyB3aGljaCBnbyB0aHJvdWdoIGFsbCB0aGUgb3RoZXIgb3JjcyB3aGlsZSB0aGV5IHdhbmRlciB0b3dhcmRzIGEgcmVnaW9uIHJlc3VsdHMgaW4gYSAyNTBtcyB3YWl0LlxuICogVGhhdCdzIG5vdCBnb29kIHNpbmNlIHRob3NlIG51bWJlcnMgYXJlIHNpbWlsYXIgdG8gd2hhdCBlbmQgZ2FtZSBzaG91bGQgaGF2ZSwgaG93ZXZlciByZWFsIHJ1bGVzIG1pZ2h0IG5vdCBiZSBhcyBleHBlbnNpdmUgYXMgUGljayBTaGluaWVzIHdpdGggYSByb29tIGZ1bGwgb2Ygb3Jjcy4uXG4gKiBXYWl0IGlzIGJlYXJhYmxlIGZvciAxMDAgb3JjcyB3aXRoIDgwMCBkaXNhYmxlZCBydWxlcywgc28gaXQgc2hvdWxkIGJlIFwiZmluZVwiIHRvIGhhdmUgYWxsIHJ1bGVzIGluIHRoZSBzYW1lIHJ1bGVib29rLlxuICogRmlyc3QgcG9zc2libGUgb3B0aW1pemF0aW9uOiBtYWtlIEFJIHJ1bGVzIGhhdmUgYSBzdGF0aWMgXCJjaGVja1wiIGFuZCBiYWtlIHRoZW0gaW50byBlYWNoIE5QQydzIHJ1bGVib29rIHNvIHRoYXQgdGhleSBkb24ndCBoYXZlIHRvIGJlIGNoZWNrZWQgZXZlcnkgdHVybi5cbiAqIFNlY29uZCBwb3NzaWJsZSBvcHRpbWl6YXRpb246IHVzZSBtYXhpbXVtIGRpc3RhbmNlIGZyb20gcGxheWVyIHRvIGRlY2lkZSB3aGljaCBOUENzIGhhdmUgdGhlaXIgQUlzIGV4ZWN1dGVkIChldmVuIGJldHRlcjogb25seSBydW4gQUkgZm9yIHRoZSBjdXJyZW50IHJlZ2lvbikuXG4gKiBUaGlyZCBvcHRpbWl6YXRpb246IHJlZHVjZSBudW1iZXIgb2YgcnVsZXMuIExhc3QgcmVzb3J0LlxuICovXG5sZXQgcm9vbXMgPSByZWdpb24uZ2V0Um9vbXMoKTtcbmxldCBzaHVmZmxlciA9IG5ldyBTaHVmZmxlcihyb29tcyk7XG5mb3IgKGxldCBpID0gMDsgaSA8IDA7IGkrKykge1xuICAgIEFJLnJ1bGVzLmNyZWF0ZUFuZEFkZFJ1bGUoe1xuICAgICAgICBuYW1lIDogXCJQaWNrIFNoaW5pZXNcIixcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IEFJUnVsZXMuUFJJT1JJVFlfQUNUSU5HX09OX1BMQUNFLFxuICAgICAgICBjb25kaXRpb25zIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPFBlcnNvbj4pID0+IHtcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcbiAgICAgICAgICAgIHJldHVybiBwZXJzb24uQUkucGlja3NTaGluaWVzO1xuICAgICAgICB9LFxuICAgICAgICBjb2RlIDogKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPFBlcnNvbj4pID0+IHtcbiAgICAgICAgICAgIGxldCBwZXJzb24gPSBydW5uZXIubm91bjtcbiAgICAgICAgICAgIGxldCByb29tID0gcGVyc29uLmdldFJvb20oKTtcbiAgICAgICAgICAgIGxldCB2aXNpYmxlVGhpbmdzID0gcm9vbS5nZXRDb250YWluZWRBbmRWaXNpYmxlVG8ocGVyc29uKTtcblxuICAgICAgICAgICAgaWYgKHZpc2libGVUaGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVRoaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2libGVUaGluZ3NbaV0uZml4ZWRJblBsYWNlICYmIHZpc2libGVUaGluZ3NbaV0uZ2V0U2hpbnkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25UYWtlKHBlcnNvbiwgdmlzaWJsZVRoaW5nc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmxldCByYW5kb21PcmM7XG5sZXQgcmFuZG9tT3JjMjtcbmZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgIGxldCBvcmMgPSBuZXcgT3JjRGVidWdnZXIoKTtcbiAgICByYW5kb21PcmMgPSBvcmM7XG4gICAgaWYgKHJhbmRvbU9yYzIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJhbmRvbU9yYzIgPSBvcmM7XG4gICAgfVxuICAgIG9yYy5BSS53YW5kZXJlciA9IHRydWU7XG4gICAgb3JjLkFJLnBpY2tzU2hpbmllcyA9IHRydWU7XG4gICAgb3JjLkFJLndhbmRlcnNPbiA9IHdhbmRlclJlZ2lvbjtcbiAgICBsZXQgcm9vbSA9IG5ldyBTaHVmZmxlcihyZWdpb24uZ2V0Um9vbXMoKSkuZ2V0T25lKCk7XG4gICAgcm9vbS5wbGFjZShvcmMpO1xufVxuXG52YXIgZlRhcmdldCA9IG5ldyBDb250ZW50R3JvdXAoKTtcbmZUYXJnZXQuYWRkVW5pdChcbiAgICBuZXcgRnVja2luZ1VuaXQoKVxuICAgICAgICAuc2V0RnVja2VkKFdvcmxkU3RhdGUucGxheWVyKVxuICAgICAgICAuc2V0RnVja2VyKHJhbmRvbU9yYylcbiAgICAgICAgLnNldEhvbGUoV29ybGRTdGF0ZS5wbGF5ZXIuZ2V0UGFydChIdW1hbm9pZFZhZ2luYSkpXG4gICAgICAgIC5zZXRTdGljayhyYW5kb21PcmMuZ2V0UGFydChIdW1hbm9pZFBlbmlzKSlcbik7XG5mVGFyZ2V0LmFkZFVuaXQoXG4gICAgbmV3IEZ1Y2tpbmdVbml0KClcbiAgICAgICAgLnNldEZ1Y2tlZChXb3JsZFN0YXRlLnBsYXllcilcbiAgICAgICAgLnNldEZ1Y2tlcihyYW5kb21PcmMyKVxuICAgICAgICAuc2V0SG9sZShXb3JsZFN0YXRlLnBsYXllci5nZXRQYXJ0KEh1bWFub2lkSGVhZCkpXG4gICAgICAgIC5zZXRTdGljayhyYW5kb21PcmMyLmdldFBhcnQoSHVtYW5vaWRQZW5pcykpXG4pO1xuXG5sZXQgc3BpdHJvYXN0ID0gKG5ldyBGdWNraW5nRGVzY3JpcHRpb24oXCJPcmMgc3BpdHJvYXN0IVwiKSk7XG5zcGl0cm9hc3Quc2V0RGVzY3JpcHRpb24obmV3IFNheShcIk9yYyBTcGl0cm9hc3QhXCIpKVxuICAgIC5hZGRVbml0KClcbiAgICAuc2V0RnVja2VyKE9yY0RlYnVnZ2VyKVxuICAgIC5zZXRIb2xlKEh1bWFub2lkVmFnaW5hKVxuICAgIC5zZXRTdGljayhIdW1hbm9pZFBlbmlzKTtcbnNwaXRyb2FzdC5hZGRVbml0KClcbiAgICAuc2V0RnVja2VyKE9yY0RlYnVnZ2VyKVxuICAgIC5zZXRIb2xlKEh1bWFub2lkSGVhZClcbiAgICAuc2V0U3RpY2soSHVtYW5vaWRQZW5pcyk7XG5cbihuZXcgRnVja2luZ0Rlc2NyaXB0aW9uKFwiU3BlY2lmaWMgT3JjIGluIFZhZ2luYVwiKSlcbiAgICAuc2V0RGVzY3JpcHRpb24obmV3IFNheShcIlNwZWNpZmljIE9yYyBpbiBWYWdpbmEuXCIpKVxuICAgIC5hZGRVbml0KClcbiAgICAuc2V0RnVja2VyKHJhbmRvbU9yYylcbiAgICAuc2V0SG9sZShXb3JsZFN0YXRlLnBsYXllci5nZXRQYXJ0KEh1bWFub2lkVmFnaW5hKSlcbiAgICAuc2V0U3RpY2socmFuZG9tT3JjLmdldFBhcnQoSHVtYW5vaWRQZW5pcykpO1xuXG4obmV3IEZ1Y2tpbmdEZXNjcmlwdGlvbihcIlNwZWNpZmljIE9yYyBTdGFydHMgQ3VtbWluZyBpbiBWYWdpbmFcIikpXG4gICAgLnNldERlc2NyaXB0aW9uKG5ldyBTYXkoXCJTcGVjaWZpYyBPcmMgU3RhcnRzIEN1bW1pbmcgaW4gVmFnaW5hXCIpKVxuICAgIC5hZGRVbml0KClcbiAgICAuc2V0RnVja2VyKHJhbmRvbU9yYylcbiAgICAuc2V0SG9sZShXb3JsZFN0YXRlLnBsYXllci5nZXRQYXJ0KEh1bWFub2lkVmFnaW5hKSlcbiAgICAuYWRkTWFya2VyKEZ1Y2tpbmdTdGF0ZS5DVU1fU1RBUlQpXG4gICAgLnNldFN0aWNrKHJhbmRvbU9yYy5nZXRQYXJ0KEh1bWFub2lkUGVuaXMpKTtcblxuKG5ldyBGdWNraW5nRGVzY3JpcHRpb24oXCJPcmMgaW4gbW91dGhcIikpXG4gICAgLnNldERlc2NyaXB0aW9uKG5ldyBTYXkoXCJPcmMgaW4gbW91dGguXCIpKVxuICAgIC5hZGRVbml0KClcbiAgICAuc2V0RnVja2VyKE9yY0RlYnVnZ2VyKVxuICAgIC5zZXRIb2xlKEh1bWFub2lkSGVhZClcbiAgICAuc2V0U3RpY2soSHVtYW5vaWRQZW5pcyk7IiwiLy8gRmlsZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3VzdG9tIERpYWxvZ2dlciBvbiA1LzIwLzIwMTgsIDQ6NTM6NTIgUE1cclxuLy8gRG8gbm90IHRhbXBlciB3aXRoIHRoaXMgZmlsZS5cclxuLy8gSXQgd2lsbCBiZSByZXBsYWNlZCBhdXRvbWF0aWNhbGx5IGJ5IERpYWxvZ2dlciBhbmQgYWxsIGNoYW5nZXMgd2lsbCBiZSBsb3N0LlxyXG4vLyBJbnN0ZWFkIGNoYW5nZSBDcmVhdGlvbkludHJvLmRsLlxyXG5tb2R1bGUgRGlhbG9ndWVUcmVlcyB7XHJcblx0ZXhwb3J0IGxldCBDcmVhdGlvbkludHJvID0gKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgdHJlZSA6IERpYWxvZ3VlVHJlZSA9IG5ldyBEaWFsb2d1ZVRyZWUoXCJDcmVhdGlvbkludHJvXCIpO1xyXG4gICAgICAgIGxldCBub2RlIDogRGlhbG9ndWVOb2RlO1xyXG4gICAgICAgIGxldCB0ZXh0IDogRGlhbG9ndWVUZXh0O1xyXG4gICAgICAgIGxldCBzZXQgOiBEaWFsb2d1ZVNldDtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcImFlOTgxMzIyLTkxNTEtNDljOC1hODg5LTk0NDU1ZGI3YzI2MlwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCI4MTU4MmRlYS1iYTI3LTRiYWEtOGRmMi1hNzdmYmI1ZWQ5ZWZcIik7XHJcbiAgICAgICAgdHJlZS5hZGRTdGFydE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCJmNzJiZjA5OS1iYWUyLTQ5ZGYtOTQzMy1jOWMzZWM2YTAyMGRcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkFzIHlvdSBhcHByb2FjaCB0aGUgT2JlbGlzaywgbWFueSBkcmVhbXMgYW5kIG5pZ2h0bWFyZXMgd2lsbCBiZWNvbWUgcmVhbGl0eSBhcyBpdCBhdHRlbXB0cyB0byBkaXNzdWFkZSB5b3UgZnJvbSBnZXR0aW5nIHRvbyBjbG9zZSwgd2l0aCB0aGUgaW50ZW5zaXR5IGluY3JlYXNpbmcgdGhlIGNsb3NlciB5b3UgZ2V0IHRvIHlvdXIgb2JqZWN0aXZlLlwiLCBTYXkuUEFSQUdSQVBIX0JSRUFLLCBcIlVsdGltYXRlbHksIHRoZSBPYmVsaXNrIHdpc2hlcyB5b3Ugbm8gaGFybSwgZm9yIGl0IGlzIGJldHRlciB0byBoYXZlIHlvdSBhcm91bmQgYXMgYSBwcm90ZWN0b3IgdGhhbiBhcyBhIGRlYWQgZW5lbXksIHNvIHRoZSBPYmVsaXNrIHdpbGwgYXR0ZW1wdCB0byBnaXZlIHlvdSBleGFjdGx5IHdoYXQgeW91IHdhbnQgZGVlcCBpbiB5b3VyIGhlYXJ0LCB0cnlpbmcgdG8gbWFrZSB5b3UgY29tcGxldGVseSBzYXRpc2ZpZWQgc28gdGhhdCB5b3Ugbm8gbG9uZ2VyIHdpc2ggZm9yIHRoZSBPYmVsaXNrJ3MgZGVzdHJ1Y3Rpb24gb3IgYmVjb21lIHVuYWJsZSB0byBjb250aW51ZSB5b3VyIHF1ZXN0LiBPZiBjb3Vyc2UsIHdoYXQgeW91ciBoZWFydCB3YW50cyBpcyBub3QgbmVjZXNzYXJpbHkgd2hhdCB5b3UgdGhpbmsgaXQgd2FudHMuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiT3JjcywgdGhlIG1vc3QgY29tbW9uIGNyZWF0dXJlIHRvIGNvbWUgb3V0IG9mIHRoZSBPYmVsaXNrLCBhcmUgbm90aGluZyBtb3JlIHRoYW4gaHVtYW5zIHdhcnBlZCBieSB0aGVpciBvd24gZGVzaXJlIGZvciB1bmJyaWRsZWQgdmlvbGVuY2UuIFdoYXQgd2lsbCB0aGUgT2JlbGlzayBkbyB0byB5b3U/XCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiT24gdGhlIGZvbGxvd2luZyBzY3JlZW5zLCB5b3Ugd2lsbCBkZWZpbmUgd2hvIHlvdSB3aWxsIGJlIGluIHRoaXMgc3RvcnkuIFBsZWFzZSBjb25maXJtIGNhcmVmdWxseSwgYXMgdGhlcmUgaXMgbm8gdHVybmluZyBiYWNrLlwiKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCI2NmQ0YjI3YS1mZjQwLTRhOGUtYTc0OS0yYjVlODIzNzY5NWFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcIjgxNTgyZGVhLWJhMjctNGJhYS04ZGYyLWE3N2ZiYjVlZDllZlwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge0VsZW1lbnRzLnN0YXJ0TWVudSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiZjcyYmYwOTktYmFlMi00OWRmLTk0MzMtYzljM2VjNmEwMjBkXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcIjBiNGZlYzg3LWEyYjAtNGUzYi04MWVkLWE0MTUwZjk0ZmMxMFwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge0VsZW1lbnRzLmVuZE1lbnUoKTt9KTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI2NmQ0YjI3YS1mZjQwLTRhOGUtYTc0OS0yYjVlODIzNzY5NWFcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtyZXR1cm4gRWxlbWVudHMud2FpdEZvckFueUtleSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiMGI0ZmVjODctYTJiMC00ZTNiLTgxZWQtYTQxNTBmOTRmYzEwXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfSkoKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJEaWFsb2d1ZS9DcmVhdGlvbkludHJvLmRsLnRzXCIgLz5cclxubW9kdWxlIENoYXJhY3RlckNyZWF0aW9uIHtcclxuICAgIGV4cG9ydCBsZXQgQ3JlYXRpb25JbnRybyA9IENoYXJhY3RlckNyZWF0aW9uLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIlNob3cgc21hbGwgSW50cm9cIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdIRVNULFxyXG4gICAgICAgIHByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX0hJR0hFU1QsXHJcbiAgICAgICAgY29kZSA6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgYXdhaXQgRGlhbG9ndWVUcmVlcy5DcmVhdGlvbkludHJvLmV4ZWN1dGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIm1vZHVsZSBDaGFyYWN0ZXJDcmVhdGlvbiB7XHJcbiAgICBsZXQgY2NEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgY2NEaXYuaWQgPSBcImNoYXJhY3RlckNyZWF0aW9uXCI7XHJcbiAgICBsZXQgcmlnaHRTaWRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIHJpZ2h0U2lkZS5pZCA9IFwiY2NSaWdodFwiO1xyXG4gICAgbGV0IGxlZnRTaWRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIGxlZnRTaWRlLmlkID0gXCJjY0xlZnRcIjtcclxuICAgIGNjRGl2LmFwcGVuZENoaWxkKGxlZnRTaWRlKTtcclxuICAgIGNjRGl2LmFwcGVuZENoaWxkKHJpZ2h0U2lkZSk7XHJcblxyXG4gICAgbGV0IHJlc29sdmVyO1xyXG5cclxuICAgIGFzeW5jIGZ1bmN0aW9uIHByaW50VGFibGUgKCkge1xyXG4gICAgICAgIHByaW50T3JpZ2luKCk7XHJcblxyXG4gICAgICAgIHdoaWxlIChsZWZ0U2lkZS5maXJzdENoaWxkKSBsZWZ0U2lkZS5yZW1vdmVDaGlsZChsZWZ0U2lkZS5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgYXdhaXQgKG5ldyBTYXkobmV3IFNheUJvbGQoXCJDaGFyYWN0ZXIgT3JpZ2luOlwiKSkuZ2V0SFRNTENvbnRlbnQoKS50aGVuKGVsZXMgPT4ge1xyXG4gICAgICAgICAgICBlbGVzLmZvckVhY2goZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRTaWRlLmFwcGVuZENoaWxkKGVsZSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBsZXQgb3JpZ2lucyA9IENoYXJhY3Rlck9yaWdpbi5nZXRPcmlnaW5zKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5zW2ldO1xyXG4gICAgICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShvcmlnaW4ubmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW4uaWQgPT0gQ2hhcmFjdGVyQ3JlYXRpb24uUGxheWVyT3JpZ2luLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiIC0gU0VMRUNURURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgKHNheSkuZ2V0SFRNTChcInBcIiwgW1wiY2hvaWNlXCJdKS50aGVuKGVsZW1lbnRBcnJheSA9PiB7XHJcbiAgICAgICAgICAgICAgICBDb250cm9scy5MaW5rcy5tYWtlQ3VzdG9tTGluayhlbGVtZW50QXJyYXlbMF0sIHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZW92ZXI6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW4ob3JpZ2luKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJDcmVhdGlvbi5QbGF5ZXJPcmlnaW4udmFsdWUgPSBvcmlnaW4uaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShlbGVtZW50QXJyYXlbMF0sIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0U2Vjb25kS2V5Q29kZSgpKTtcclxuICAgICAgICAgICAgICAgIGxlZnRTaWRlLmFwcGVuZENoaWxkKGVsZW1lbnRBcnJheVswXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwcmludENvbmZpcm0gKCkge1xyXG4gICAgICAgIChuZXcgU2F5KFwiQ29uZmlybVwiKSkuZ2V0SFRNTChcInBcIiwgW1wiY2hvaWNlXCJdKS50aGVuKGVsZW1lbnRBcnJheSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRBcnJheVswXS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKGVsZW1lbnRBcnJheVswXSwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRTZWNvbmRLZXlDb2RlKCkpO1xyXG4gICAgICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZWxlbWVudEFycmF5WzBdKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwcmludE9yaWdpbiAob3JpZ2luPyA6IENoYXJhY3Rlck9yaWdpbikge1xyXG4gICAgICAgIGlmIChvcmlnaW4gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9yaWdpbiA9IENoYXJhY3Rlck9yaWdpbi5nZXRPcmlnaW4oQ2hhcmFjdGVyQ3JlYXRpb24uUGxheWVyT3JpZ2luLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNheSA9IG5ldyBTYXkob3JpZ2luLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICBpZiAob3JpZ2luLmJvbnVzU3RhdHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHNheS5hZGQoU2F5LlBBUkFHUkFQSF9CUkVBSywgb3JpZ2luLmJvbnVzU3RhdHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzYXkuZ2V0SFRNTENvbnRlbnQoKS50aGVuKChlbGVzID0+IHtcclxuICAgICAgICAgICAgd2hpbGUgKHJpZ2h0U2lkZS5maXJzdENoaWxkKSByaWdodFNpZGUucmVtb3ZlQ2hpbGQocmlnaHRTaWRlLmZpcnN0Q2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodFNpZGUuYXBwZW5kQ2hpbGQoZWxlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXQgKCkge1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5jbGVhcigpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChjY0Rpdik7XHJcbiAgICAgICAgcHJpbnRUYWJsZSgpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIHByaW50Q29uZmlybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgQ0NPcmlnaW4gPSBDaGFyYWN0ZXJDcmVhdGlvbi5ydWxlYm9vay5jcmVhdGVBbmRBZGRSdWxlKHtcclxuICAgICAgICBuYW1lOiBcIkNoYXJhY3RlciBDcmVhdGlvbiAtIE9yaWdpblwiLFxyXG4gICAgICAgIGZpcnN0UHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfTUVESVVNLFxyXG4gICAgICAgIHByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBFbGVtZW50cy5zdGFydE1lbnUoKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlciA9IHJlc29sdmU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHByb21pc2U7XHJcblxyXG4gICAgICAgICAgICBDaGFyYWN0ZXJDcmVhdGlvbi5nZXRPcmlnaW4oKS5jb25maXJtUGlja2VkKCk7XHJcblxyXG4gICAgICAgICAgICBFbGVtZW50cy5lbmRNZW51KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iLCJtb2R1bGUgQ2hhcmFjdGVyQ3JlYXRpb24ge1xyXG4gICAgbGV0IGNjRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIGNjRGl2LmlkID0gXCJjaGFyYWN0ZXJDcmVhdGlvblwiO1xyXG4gICAgbGV0IHJpZ2h0U2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICByaWdodFNpZGUuaWQgPSBcImNjUmlnaHRcIjtcclxuICAgIGxldCBsZWZ0U2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICBsZWZ0U2lkZS5pZCA9IFwiY2NMZWZ0XCI7XHJcbiAgICBjY0Rpdi5hcHBlbmRDaGlsZChsZWZ0U2lkZSk7XHJcbiAgICBjY0Rpdi5hcHBlbmRDaGlsZChyaWdodFNpZGUpO1xyXG5cclxuICAgIGxldCByZXNvbHZlcjtcclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBwcmludFRhYmxlICgpIHtcclxuICAgICAgICB3aGlsZSAobGVmdFNpZGUuZmlyc3RDaGlsZCkgbGVmdFNpZGUucmVtb3ZlQ2hpbGQobGVmdFNpZGUuZmlyc3RDaGlsZCk7XHJcblxyXG4gICAgICAgIGF3YWl0IChuZXcgU2F5KG5ldyBTYXlCb2xkKFwiUGVya3MgKENob29zZSBhbnkpOlwiKSkuZ2V0SFRNTENvbnRlbnQoKS50aGVuKGVsZXMgPT4ge1xyXG4gICAgICAgICAgICBlbGVzLmZvckVhY2goZWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRTaWRlLmFwcGVuZENoaWxkKGVsZSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICBsZXQgcGVya3MgPSBQZXJrLmdldFBlcmtzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZXJrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgcGVyayA9IHBlcmtzW2ldO1xyXG4gICAgICAgICAgICBsZXQgc2F5ID0gbmV3IFNheShwZXJrLm5hbWUpO1xyXG4gICAgICAgICAgICBpZiAocGVyay5pc0VuYWJsZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBlcmsuaXNGb3JjZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNheS5hZGQgKFwiIChNYW5kYXRvcnkpXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzYXkuYWRkKFwiIC0gU2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyay5pc0ZvcmNlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBzYXkuYWRkKFwiIChGb3JiaWRkZW4pXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IChzYXkpLmdldEhUTUwoXCJwXCIsIFtcImNob2ljZVwiXSkudGhlbihlbGVtZW50QXJyYXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuTGlua3MubWFrZUN1c3RvbUxpbmsoZWxlbWVudEFycmF5WzBdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VvdmVyOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UGVyayhwZXJrKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlb3V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5UGVyaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZXJrLmlzRm9yY2VkKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmsudmFsdWUgPSAhcGVyay52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgQ29udHJvbHMuS2V5SGFuZGxlci5hcHBseUNvZGUoZWxlbWVudEFycmF5WzBdLCBDb250cm9scy5LZXlIYW5kbGVyLmdldFNlY29uZEtleUNvZGUoKSk7XHJcbiAgICAgICAgICAgICAgICBsZWZ0U2lkZS5hcHBlbmRDaGlsZChlbGVtZW50QXJyYXlbMF0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRDb25maXJtICgpIHtcclxuICAgICAgICAobmV3IFNheShcIkNvbmZpcm1cIikpLmdldEhUTUwoXCJwXCIsIFtcImNob2ljZVwiXSkudGhlbihlbGVtZW50QXJyYXkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50QXJyYXlbMF0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShlbGVtZW50QXJyYXlbMF0sIENvbnRyb2xzLktleUhhbmRsZXIuZ2V0U2Vjb25kS2V5Q29kZSgpKTtcclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGVsZW1lbnRBcnJheVswXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZW1wdHlQZXJrICgpIHtcclxuICAgICAgICB3aGlsZSAocmlnaHRTaWRlLmZpcnN0Q2hpbGQpIHJpZ2h0U2lkZS5yZW1vdmVDaGlsZChyaWdodFNpZGUuZmlyc3RDaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJpbnRQZXJrIChwZXJrIDogUGVyaykge1xyXG4gICAgICAgIGxldCBzYXkgPSBuZXcgU2F5KHBlcmsuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgIHNheS5nZXRIVE1MQ29udGVudCgpLnRoZW4oKGVsZXMgPT4ge1xyXG4gICAgICAgICAgICBlbXB0eVBlcmsoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodFNpZGUuYXBwZW5kQ2hpbGQoZWxlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXQgKCkge1xyXG4gICAgICAgIFBlcmsudXBkYXRlUGVya3MoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIuY2xlYXIoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoY2NEaXYpO1xyXG4gICAgICAgIHByaW50VGFibGUoKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICBFbGVtZW50cy5DdXJyZW50VHVybkhhbmRsZXIucHJpbnQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICBwcmludENvbmZpcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbGV0IENDUGVyayA9IENoYXJhY3RlckNyZWF0aW9uLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWU6IFwiQ2hhcmFjdGVyIENyZWF0aW9uIC0gT3JpZ2luXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eTogUnVsZS5QUklPUklUWV9MT1csXHJcbiAgICAgICAgcHJpb3JpdHk6IFJ1bGUuUFJJT1JJVFlfSElHSCxcclxuICAgICAgICBjb2RlOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIEVsZW1lbnRzLnN0YXJ0TWVudSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVyID0gcmVzb2x2ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgcHJvbWlzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBwZXJrcyA9IFBlcmsuZ2V0UGVya3MoKTtcclxuICAgICAgICAgICAgcGVya3MuZm9yRWFjaChwZXJrID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwZXJrLmlzRW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVyay5jb25maXJtUGlja2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgRWxlbWVudHMuZW5kTWVudSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59IiwibW9kdWxlIENoYXJhY3RlckNyZWF0aW9uIHtcclxuICAgIGludGVyZmFjZSByYW5nZU9wdGlvbnMge1xyXG4gICAgICAgIGxhYmVsPyA6IHN0cmluZztcclxuICAgICAgICBzaG93VmFsdWU/IDogYm9vbGVhbjtcclxuICAgICAgICBvbkNoYW5nZSA6ICh2YWx1ZSA6IG51bWJlciwgbGFiZWxWYWx1ZSA6IFRleHQsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4gdm9pZDtcclxuICAgICAgICBtaW5WYWx1ZSA6IG51bWJlcjtcclxuICAgICAgICBtYXhWYWx1ZSA6IG51bWJlcjtcclxuICAgICAgICBsZWZ0TGFiZWw/IDogc3RyaW5nO1xyXG4gICAgICAgIHJpZ2h0TGFiZWw/IDogc3RyaW5nO1xyXG4gICAgICAgIHRvcExhYmVsPyA6IHN0cmluZztcclxuICAgICAgICB2YWx1ZSA6IG51bWJlcjtcclxuICAgICAgICBzdGVwIDogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlIChvcHRpb25zIDogcmFuZ2VPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhvcHRpb25zLnZhbHVlKSk7XHJcblxyXG4gICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiY2NPcHRpb25cIik7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMudG9wTGFiZWwgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCB0b3BMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRvcExhYmVsLmNsYXNzTGlzdC5hZGQoXCJjY09wdGlvblRvcExhYmVsXCIpO1xyXG4gICAgICAgICAgICB0b3BMYWJlbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvcHRpb25zLnRvcExhYmVsICsgXCI6XCIpKTtcclxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHRvcExhYmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd1ZhbHVlICE9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTGlzdC5hZGQoXCJyYW5nZVZhbHVlXCIpO1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sYWJlbCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJcIik7XHJcbiAgICAgICAgICAgICAgICBiLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9wdGlvbnMubGFiZWwgKyBcIjogXCIpKTtcclxuICAgICAgICAgICAgICAgIGxhYmVsLmFwcGVuZENoaWxkKGIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhYmVsLmFwcGVuZENoaWxkKHZhbHVlTm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaW5wdXQgPSA8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJjY1JhbmdlXCIpO1xyXG4gICAgICAgIGlucHV0LnR5cGUgPSBcInJhbmdlXCI7XHJcbiAgICAgICAgaW5wdXQubWluID0gb3B0aW9ucy5taW5WYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIGlucHV0Lm1heCA9IG9wdGlvbnMubWF4VmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICBpbnB1dC5zdGVwID0gb3B0aW9ucy5zdGVwLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW5wdXQudmFsdWUgPSBvcHRpb25zLnZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGxldCBvbkNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgdmFsdWVOb2RlLm5vZGVWYWx1ZSA9IGlucHV0LnZhbHVlO1xyXG4gICAgICAgICAgICBvcHRpb25zLm9uQ2hhbmdlKE51bWJlcihpbnB1dC52YWx1ZSksIHZhbHVlTm9kZSwgaW5wdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBvbkNoYW5nZSk7XHJcblxyXG4gICAgICAgIGxldCBsZWZ0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgbGVmdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiY2NCdXR0b25cIik7XHJcbiAgICAgICAgbGVmdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9IFN0cmluZyhOdW1iZXIoaW5wdXQudmFsdWUpIC0gb3B0aW9ucy5zdGVwKTtcclxuICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShsZWZ0QnV0dG9uLCBDb250cm9scy5LZXlIYW5kbGVyLmdldEZpcnN0S2V5Q29kZSgpKTtcclxuICAgICAgICBpZiAob3B0aW9ucy5sZWZ0TGFiZWwgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnRCdXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUob3B0aW9ucy5sZWZ0TGFiZWwpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByaWdodEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgIHJpZ2h0QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJjY0J1dHRvblwiKTtcclxuICAgICAgICByaWdodEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnB1dC52YWx1ZSA9IFN0cmluZyhOdW1iZXIoaW5wdXQudmFsdWUpICsgb3B0aW9ucy5zdGVwKTtcclxuICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBDb250cm9scy5LZXlIYW5kbGVyLmFwcGx5Q29kZShyaWdodEJ1dHRvbiwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRGaXJzdEtleUNvZGUoKSk7O1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJpZ2h0TGFiZWwgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0QnV0dG9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG9wdGlvbnMucmlnaHRMYWJlbCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxlZnRCdXR0b24pO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKHJpZ2h0QnV0dG9uKTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobGFiZWwpO1xyXG5cclxuICAgICAgICBvbkNoYW5nZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGl2O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBsZXQgQ0NTZXhTdGF0cyA9IENoYXJhY3RlckNyZWF0aW9uLnJ1bGVib29rLmNyZWF0ZUFuZEFkZFJ1bGUoe1xyXG4gICAgICAgIG5hbWUgOiBcIkNoYXJhY3RlciBDcmVhdGlvbiAtIFNleCBhbmQgU3RhdHNcIixcclxuICAgICAgICBmaXJzdFByaW9yaXR5IDogUnVsZS5QUklPUklUWV9ISUdILFxyXG4gICAgICAgIHByaW9yaXR5OiBSdWxlLlBSSU9SSVRZX0hJR0gsXHJcbiAgICAgICAgY29kZSA6ICgpID0+IHtcclxuICAgICAgICAgICAgRWxlbWVudHMuc3RhcnRNZW51KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2NEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICBjY0Rpdi5pZCA9IFwiY2hhcmFjdGVyQ3JlYXRpb25cIjtcclxuXHJcbiAgICAgICAgICAgIGxldCBjY0xlZnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICBjY0xlZnQuaWQgPSBcImNjTGVmdFwiO1xyXG4gICAgICAgICAgICBjY0Rpdi5hcHBlbmRDaGlsZChjY0xlZnQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGNjUmlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICBjY1JpZ2h0LmlkID0gXCJjY1JpZ2h0XCI7XHJcbiAgICAgICAgICAgIGNjRGl2LmFwcGVuZENoaWxkKGNjUmlnaHQpO1xyXG5cclxuICAgICAgICAgICAgbGV0IG9uQ2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgKG5ldyBTYXkoV29ybGRTdGF0ZS5wbGF5ZXIuZGVzY3JpcHRpb24pKS5nZXRIVE1MQ29udGVudCgpLnRoZW4oKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2NSaWdodC5maXJzdENoaWxkKSBjY1JpZ2h0LnJlbW92ZUNoaWxkKGNjUmlnaHQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjY1JpZ2h0LmFwcGVuZENoaWxkKHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjY0xlZnQuYXBwZW5kQ2hpbGQoY3JlYXRlUmFuZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWluVmFsdWUgOiAwLCBtYXhWYWx1ZSA6IDEsIHN0ZXA6IDEsIHZhbHVlIDogMCwgbGVmdExhYmVsIDogXCJNYWxlXCIsIHJpZ2h0TGFiZWwgOiBcIkZlbWFsZVwiLCB0b3BMYWJlbCA6IFwiU2V4XCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZSA6ICh2YWx1ZSA6IG51bWJlciwgbGFiZWxWYWx1ZSA6IFRleHQsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsVmFsdWUubm9kZVZhbHVlID0gKHZhbHVlID09IDAgPyBcIk1hbGVcIiA6IFwiRmVtYWxlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5yZW1vdmVHZW5kZXJlZFBhcnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKDxIdW1hbm9pZD4gV29ybGRTdGF0ZS5wbGF5ZXIpLmFkZE1hbGVQYXJ0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5hZGRGZW1hbGVQYXJ0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBTb21lIHN0YXRzIGJlY29tZSBkaWZmZXJlbnQgd2hldGhlciB0ZSBwbGF5ZXIgaXMgbWFsZSBvciBmZW1hbGUsIHNvIHdlIGhhdmUgdG8gdXBkYXRlIHRoZW0gYWxsLlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvdGhlcklucHV0cyA9IGNjRGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdGhlcklucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXJJbnB1dCA9IG90aGVySW5wdXRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJJbnB1dCAhPSBpbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJJbnB1dC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImNoYW5nZVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgICBjY0xlZnQuYXBwZW5kQ2hpbGQoY3JlYXRlUmFuZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWluVmFsdWUgOiAwLCBtYXhWYWx1ZSA6IDQsIHN0ZXA6IDEsIHZhbHVlIDogMiwgbGVmdExhYmVsIDogXCJNYXNjdWxpbmVcIiwgcmlnaHRMYWJlbCA6IFwiRmVtaW5pbmVcIiwgdG9wTGFiZWwgOiBcIkdlbmRlclwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgOiAodmFsdWUgOiBudW1iZXIsIGxhYmVsVmFsdWUgOiBUZXh0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVzID0gW1wiTWFzY3VsaW5lXCIsIFwiU29tZXdoYXQgbWFzY3VsaW5lXCIsIFwiQW5kcm9neW5vdXNcIiwgXCJTb21ld2hhdCBmZW1pbmluZVwiLCBcIkZlbWluaW5lXCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsVmFsdWUubm9kZVZhbHVlID0gbmFtZXNbdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXIgPSAoPEh1bWFub2lkPiBXb3JsZFN0YXRlLnBsYXllcik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVuZGVkVmFsdWUgOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5pc01hbGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gWzEwLCAyNSwgNTAsIDU1LCA2MF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVuZGVkVmFsdWUgPSB2YWx1ZXNbdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBbMzUsIDQwLCA1MCwgNjUsIDc1XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5kZWRWYWx1ZSA9IHZhbHVlc1t2YWx1ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICg8SHVtYW5vaWQ+IFdvcmxkU3RhdGUucGxheWVyKS5zZXRHZW5kZXJWYWx1ZShpbnRlbmRlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBXb3JsZFN0YXRlLnBsYXllci5zZXRTdGF0KEF0dHJpYnV0ZXMuR2VuZGVySWRlbnRpdHksIGludGVuZGVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0c0hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIGNjTGVmdC5hcHBlbmRDaGlsZChzdGF0c0hlYWRlcik7XHJcbiAgICAgICAgICAgIHN0YXRzSGVhZGVyLmNsYXNzTGlzdC5hZGQoXCJjY0hlYWRlclwiKTtcclxuICAgICAgICAgICAgc3RhdHNIZWFkZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJTdGF0cyAoXCIpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBtYXhTdGF0cyA9IDEyO1xyXG4gICAgICAgICAgICBsZXQgc3RhdHNSZW1haW5pbmcgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIjQgcG9pbnRzIHJlbWFpbmluZ1wiKTtcclxuXHJcblxyXG4gICAgICAgICAgICBzdGF0c0hlYWRlci5hcHBlbmRDaGlsZChzdGF0c1JlbWFpbmluZyk7XHJcbiAgICAgICAgICAgIHN0YXRzSGVhZGVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiKVwiKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2V0U3RhdCA9IChhdHRyIDogQXR0cmlidXRlLCB2YWx1ZSA6IG51bWJlciwgaW5wdXQgOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0U3RhdChhdHRyLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nID0gbWF4U3RhdHNcclxuICAgICAgICAgICAgICAgICAgICAtIHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuU3RyZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkFnaWxpdHkpXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwbGF5ZXIuZ2V0U3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSlcclxuICAgICAgICAgICAgICAgICAgICAtIHBsYXllci5nZXRTdGF0KEF0dHJpYnV0ZXMuQ2hhcm0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gcmVtYWluaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2hhbmdlXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdHNSZW1haW5pbmcubm9kZVZhbHVlID0gKHJlbWFpbmluZyA9PSAwID8gXCJEb25lXCIgOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA+IDEgPyByZW1haW5pbmcudG9TdHJpbmcoKSArIFwiIHBvaW50cyByZW1haW5pbmdcIiA6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLnRvU3RyaW5nKCkgKyBcIiBwb2ludCByZW1haW5pbmdcIik7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjY0xlZnQuYXBwZW5kQ2hpbGQoY3JlYXRlUmFuZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWluVmFsdWUgOiAxLCBtYXhWYWx1ZSA6IDUsIHN0ZXA6IDEsIHZhbHVlIDogMiwgbGVmdExhYmVsIDogXCItXCIsIHJpZ2h0TGFiZWwgOiBcIitcIiwgdG9wTGFiZWwgOiBcIlN0cmVuZ3RoXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZSA6ICh2YWx1ZSA6IG51bWJlciwgbGFiZWxWYWx1ZSA6IFRleHQsIGlucHV0IDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFN0YXQoQXR0cmlidXRlcy5TdHJlbmd0aCwgdmFsdWUsIGlucHV0KTtcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBjY0xlZnQuYXBwZW5kQ2hpbGQoY3JlYXRlUmFuZ2Uoe1xyXG4gICAgICAgICAgICAgICAgbWluVmFsdWUgOiAxLCBtYXhWYWx1ZSA6IDUsIHN0ZXA6IDEsIHZhbHVlIDogMiwgbGVmdExhYmVsIDogXCItXCIsIHJpZ2h0TGFiZWwgOiBcIitcIiwgdG9wTGFiZWwgOiBcIkFnaWxpdHlcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlIDogKHZhbHVlIDogbnVtYmVyLCBsYWJlbFZhbHVlIDogVGV4dCwgaW5wdXQgOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdChBdHRyaWJ1dGVzLkFnaWxpdHksIHZhbHVlLCBpbnB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMSwgbWF4VmFsdWUgOiA1LCBzdGVwOiAxLCB2YWx1ZSA6IDIsIGxlZnRMYWJlbCA6IFwiLVwiLCByaWdodExhYmVsIDogXCIrXCIsIHRvcExhYmVsIDogXCJDaGFybVwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgOiAodmFsdWUgOiBudW1iZXIsIGxhYmVsVmFsdWUgOiBUZXh0LCBpbnB1dCA6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRTdGF0KEF0dHJpYnV0ZXMuQ2hhcm0sIHZhbHVlLCBpbnB1dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgY2NMZWZ0LmFwcGVuZENoaWxkKGNyZWF0ZVJhbmdlKHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlIDogMSwgbWF4VmFsdWUgOiA1LCBzdGVwOiAxLCB2YWx1ZSA6IDIsIGxlZnRMYWJlbCA6IFwiLVwiLCByaWdodExhYmVsIDogXCIrXCIsIHRvcExhYmVsIDogXCJJbnRlbGxpZ2VuY2VcIixcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlIDogKHZhbHVlIDogbnVtYmVyLCBsYWJlbFZhbHVlIDogVGV4dCwgaW5wdXQgOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdChBdHRyaWJ1dGVzLkludGVsbGlnZW5jZSwgdmFsdWUsIGlucHV0KTtcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY3JlYXRpb25Eb25lID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgIChuZXcgU2F5KFwiQ29uZmlybVwiKSkuZ2V0SFRNTChcInBcIiwgW1wiY2hvaWNlXCJdKS50aGVuKGVsZW1lbnRBcnJheSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEFycmF5WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLmVuZE1lbnUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLktleUhhbmRsZXIuYXBwbHlDb2RlKGVsZW1lbnRBcnJheVswXSwgQ29udHJvbHMuS2V5SGFuZGxlci5nZXRTZWNvbmRLZXlDb2RlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRzLkN1cnJlbnRUdXJuSGFuZGxlci5wcmludChlbGVtZW50QXJyYXlbMF0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgRWxlbWVudHMuQ3VycmVudFR1cm5IYW5kbGVyLnByaW50KGNjRGl2KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8vIFRPRE86IFBpY2sgb3JpZ2luXHJcbiAgICAvLyBUT0RPOiBQaWNrIFBlcmtzXHJcbn0iLCJtb2R1bGUgUGxheUJlZ2lucyB7XHJcbiAgICBleHBvcnQgdmFyIExPQURfRkFJTEVEID0gZmFsc2U7XHJcbiAgICBleHBvcnQgdmFyIENPTlRJTlVFX0ZBSUxFRCA9IGZhbHNlO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgSW50cm9NZW51UnVsZSA9IFBsYXlCZWdpbnMucnVsZWJvb2suY3JlYXRlQW5kQWRkUnVsZSh7XHJcbiAgICAgICAgbmFtZSA6IFwiSW50cm8gTWVudSBSdWxlXCIsXHJcbiAgICAgICAgZmlyc3RQcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBwcmlvcml0eSA6IFJ1bGUuUFJJT1JJVFlfSElHSEVTVCxcclxuICAgICAgICBjb2RlIDogYXN5bmMgKHJ1bm5lciA6IFJ1bGVib29rUnVubmVyPHZvaWQ+KSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IERpYWxvZ3VlVHJlZXMuSW50cm9NZW51LmV4ZWN1dGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSIsIi8vIEZpbGUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGN1c3RvbSBEaWFsb2dnZXIgb24gNS8yMC8yMDE4LCA0OjUzOjIyIFBNXHJcbi8vIERvIG5vdCB0YW1wZXIgd2l0aCB0aGlzIGZpbGUuXHJcbi8vIEl0IHdpbGwgYmUgcmVwbGFjZWQgYXV0b21hdGljYWxseSBieSBEaWFsb2dnZXIgYW5kIGFsbCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC5cclxuLy8gSW5zdGVhZCBjaGFuZ2UgSW50cm9NZW51LmRsLlxyXG5tb2R1bGUgRGlhbG9ndWVUcmVlcyB7XHJcblx0ZXhwb3J0IGxldCBJbnRyb01lbnUgPSAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCB0cmVlIDogRGlhbG9ndWVUcmVlID0gbmV3IERpYWxvZ3VlVHJlZShcIkludHJvTWVudVwiKTtcclxuICAgICAgICBsZXQgbm9kZSA6IERpYWxvZ3VlTm9kZTtcclxuICAgICAgICBsZXQgY2hvaWNlIDogRGlhbG9ndWVDaG9pY2U7XHJcbiAgICAgICAgbGV0IHRleHQgOiBEaWFsb2d1ZVRleHQ7XHJcbiAgICAgICAgbGV0IGJyYW5jaCA6IERpYWxvZ3VlQnJhbmNoO1xyXG4gICAgICAgIGxldCBzZXQgOiBEaWFsb2d1ZVNldDtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcImIwMThiYjI4LTRlZmMtNDkzYi1hYzM3LTMxNjM0YzRlNjQwNlwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCJmNDQ4ZTcxOC05ZDI0LTQxOTEtOTkxMy1jY2MzNmQ5N2M0YzBcIik7XHJcbiAgICAgICAgdHJlZS5hZGRTdGFydE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiM2I4YzhiY2ItMGFjOC00MGRjLTlmNjItNGFiYmRlMGQwZjdmXCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIlN0YXJ0IEdhbWVcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCI3MTllNzFkZC05OTg5LTQwMTUtOTNhZi05ZmI3MDk2MDAyYzFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiNTM3MTAwODctNDAwMi00MWI3LWIwODktY2FkYWJlZGJjYWZkXCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkxvYWQgZnJvbSBmaWxlXCIpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiZjI1ZjY1MjUtZGFkNi00NWQ3LWEzOTEtMjQ2YzFiMDJiNTY5XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcImI0NTkzYTM2LWNhODMtNGFmYy1iMDFiLWU3MTM0NGNhNmUxZlwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoXCJTZXR0aW5nc1wiKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcImQ0YTM3OWI1LTA2YzktNGZjYS1hMjVjLWIxYTMxYjZiZjkzZFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCI0YzUwMzJhNS01NTA5LTRhMDAtYjhjNy03ODhlN2RkYmYxN2RcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFwiQWJvdXRcIik7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCI2YjNmMzg1Yi04MjgzLTQ2MzUtOWM3My1lMjMwM2Q3NzY0MmRcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI2NzQ4NDFhNi0zNzUyLTRjODEtOTc3ZC0xOWUxMTE1MzYyMDNcIik7XHJcbiAgICAgICAgbm9kZS5zZXROYW1lKFwiMlwiKTtcclxuICAgICAgICBub2RlLnNldENob2ljZXMoW1wiM2I4YzhiY2ItMGFjOC00MGRjLTlmNjItNGFiYmRlMGQwZjdmXCIsXCI1MzcxMDA4Ny00MDAyLTQxYjctYjA4OS1jYWRhYmVkYmNhZmRcIixcIjRjNTAzMmE1LTU1MDktNGEwMC1iOGM3LTc4OGU3ZGRiZjE3ZFwiLFwiYjQ1OTNhMzYtY2E4My00YWZjLWIwMWItZTcxMzQ0Y2E2ZTFmXCIsXCJhNTVmNDZmYS05OGE5LTRkZmYtOWYxYy00Zjg4YzE4Y2U4ZGRcIl0pO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICB0ZXh0ID0gbmV3IERpYWxvZ3VlVGV4dChcImJjMzJlNDExLTNjNTQtNDc0Ny1hZDc5LTUwNmZjNWE5ZDZjOVwiKTtcclxuICAgICAgICB0ZXh0LnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNheS5DRU5URVJFRCwgbmV3IFNheUltYWdlKFwiaW50cm9Mb2dvXCIpLCBTYXkuTElORV9CUkVBSywgbmV3IFNheUl0YWxpYyhcIlRoZSBPYmVsaXNrIGlzIGFuIGFkdWx0IGludGVyYWN0aXZlIGZpY3Rpb24gZ2FtZSBzZXQgaW4gYSBwb3N0LWFwb2NhbHlwdGljIHdvcmxkIHJhdmFnZWQgYnkgYSBtYWdpY2FsIHN0cnVjdHVyZS5cIikpO30pO1xyXG4gICAgICAgIHRleHQuc2V0TmV4dChcIjM2ZGE5ZWE2LTkwOWMtNGMwYy05NGQxLWExN2ZlZjQ0NDUyZFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUodGV4dCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCIzNmRhOWVhNi05MDljLTRjMGMtOTRkMS1hMTdmZWY0NDQ1MmRcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkEgc2xlZWssIGJsYWNrIG9iZWxpc2sgYXBwZWFyZWQsIG1vbnN0ZXJzIHBvdXJpbmcgZnJvbSBpdCwgdGhyZWF0ZW5pbmcgdGhlIHdvcmxkLiBNYW55IHRyaWVkIHRvIHJlYWNoIHRoZSBvYmVsaXNrLCBvbmx5IHRvIHJldHVybiBjaGFuZ2VkIC0gbW9uc3Ryb3VzLiBDaXZpbGl6YXRpb24gd2FzIHVuYWJsZSB0byBjb3BlIHdpdGggdGhlIGNyZWF0dXJlcyBhbmQgaHVtYW5pdHkgc29vbiByZXR1cm5lZCB0byBpdHMgb2xkLCB0cmliYWwgd2F5cywgaHVtYW5zIGJlY29taW5nIHJhcmVyIHdpdGggZWFjaCBwYXNzaW5nIGRheS4gQ2VudHVyaWVzIGhhdmUgcGFzc2VkIGFuZCB0ZWNobm9sb2d5IGlzIG5vdyBzY2FyY2UsIHdpdGggcGVvcGxlIGxlYWRpbmcgc2ltcGxlciBsaXZlcyBpbiBzbWFsbCBzZXR0bGVtZW50cy5cIiwgICAgICAgICAgICAgICAgICAgICBTYXkuUEFSQUdSQVBIX0JSRUFLLCAgICAgICAgICAgICAgICAgICAgIFwiWW91IHdlcmUgYm9ybiBpbiB0aGUgYXNoZXMgb2YgdGhlIG9sZCB3b3JsZCwgbGl2aW5nIGluIGlzb2xhdGlvbiBhcyB5b3UgYW5kIHlvdXIgZmVsbG93IG1lbiBhdHRlbXB0IHRvIHN0YXkgc2FmZSBmcm9tIHRoZSBldmlscyBvZiBUaGUgT2JlbGlzay4gXCIsICAgICAgICAgICAgICAgICAgICAgU2F5LlBBUkFHUkFQSF9CUkVBSywgICAgICAgICAgICAgICAgICAgICBcIk5vdywgZmF0ZSBoYXMgZGVjaWRlZCB5b3UgbXVzdCBnbywgcmVhY2ggVGhlIE9iZWxpc2sgYW5kIGRlc3Ryb3kgaXQuIFdpbGwgeW91IHN1Y2NlZWQgaW4gc3RvcHBpbmcgaXQsIG9yIHdpbGwgeW91IGxvc2UgeW91cnNlbGYgdG8gYWxsIHRoZSBjaGFuZ2VzIGl0IHdpbGwgYnJpbmcgdG8geW91P1wiKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCI2NzQ4NDFhNi0zNzUyLTRjODEtOTc3ZC0xOWUxMTE1MzYyMDNcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiOWYxMTg3MWYtZWViZC00YjlhLWIzZGItZWQ5YmU4Y2Y3OGU3XCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmFtZShcIjFcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiOWVlYjIxMDAtOTE3ZC00MWZkLWI3NTYtNmQzYjgwZTkyNDYzXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBicmFuY2ggPSBuZXcgRGlhbG9ndWVCcmFuY2goXCI1ZDFkZmI4Ni1hYmQ5LTRhZDYtYmYwNy04Y2VkNTQ3NmU0MDFcIik7XHJcbiAgICAgICAgYnJhbmNoLnNldFZhcmlhYmxlKCgpID0+IHsgcmV0dXJuIFBsYXlCZWdpbnMuTE9BRF9GQUlMRUQ7fSk7XHJcbiAgICAgICAgYnJhbmNoLmFkZEJyYW5jaChcIjQxNWRjMzJhLTE1NDktNDI5ZC05YWM0LThjZDFiNGM5MmMxNFwiLCAoKSA9PiB7IHJldHVybiB0cnVlO30pO1xyXG4gICAgICAgIGJyYW5jaC5zZXROZXh0KFwiZjgyZmMxNzctYjRiZC00ZjA2LWI3YWItMjE2MjU5ZTA1NmE1XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShicmFuY2gpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImY4MmZjMTc3LWI0YmQtNGYwNi1iN2FiLTIxNjI1OWUwNTZhNVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge0VsZW1lbnRzLmVuZE1lbnUoKTt9KTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI5ZWViMjEwMC05MTdkLTQxZmQtYjc1Ni02ZDNiODBlOTI0NjNcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5jbGVhck1haW5TY3JlZW4oKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImJjMzJlNDExLTNjNTQtNDc0Ny1hZDc5LTUwNmZjNWE5ZDZjOVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcIjQxNWRjMzJhLTE1NDktNDI5ZC05YWM0LThjZDFiNGM5MmMxNFwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCIxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJmNDQ4ZTcxOC05ZDI0LTQxOTEtOTkxMy1jY2MzNmQ5N2M0YzBcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5zdGFydE1lbnUoKTsgdHJlZS5zZXRSZXBlYXRDaG9pY2VzKGZhbHNlKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjlmMTE4NzFmLWVlYmQtNGI5YS1iM2RiLWVkOWJlOGNmNzhlN1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCJlZjkyNTNiOS01YzI0LTQ2Y2MtOGUyZC01NTYyYTE1NDRmMDdcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNhdmVIYW5kbGVyLmdldFNheUZvclNsb3QoMCkpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiOTU5NGNmMDYtNjA2Mi00OTUyLWIzNzgtNmFlZGFhZmUyOTUxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcIjgyYzUxMmM2LTAxMTUtNGQ3Mi1hNDEzLTU3MjhhNjIzZjA0YlwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoU2F2ZUhhbmRsZXIuZ2V0U2F5Rm9yU2xvdCgxKSk7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJmZTk1Y2ZiMy1iOWY1LTRiMTItODNhYS05NGQyNmU1YmNhYzBcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiNzMxNTgzNWEtNGQ5NS00Mzc3LTgyOGMtOGE0Y2E3ZTQ5Zjg3XCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShTYXZlSGFuZGxlci5nZXRTYXlGb3JTbG90KDIpKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcImRjODg0OTc0LTdiYjItNDM2Zi1iM2E0LWNkZjg1NTBiZDQ5NFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCI1MGFmZDZmOC04N2NlLTQ5YmYtYjY4OS00ODE5YmM1ZGM4ZTdcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNhdmVIYW5kbGVyLmdldFNheUZvclNsb3QoMykpO30pO1xyXG4gICAgICAgIGNob2ljZS5zZXROZXh0KFwiNjJmNWVhODgtYzZmMC00NDY5LTg3ZjItZWEzYjM3NjM4NTA5XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShjaG9pY2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNob2ljZSA9IG5ldyBEaWFsb2d1ZUNob2ljZShcImQ3OWU5OTU1LWY4MWUtNGFjOS04MjQ2LWEwMmIwYmQ0OWRhZVwiKTtcclxuICAgICAgICBjaG9pY2Uuc2V0U2F5KCgpID0+IHsgcmV0dXJuIG5ldyBTYXkoU2F2ZUhhbmRsZXIuZ2V0U2F5Rm9yU2xvdCg0KSk7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJlZTRlY2Q4Yi01OWUyLTQzYTYtODE1MC04YTgzNWQ2ZWVhZTFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI3MTllNzFkZC05OTg5LTQwMTUtOTNhZi05ZmI3MDk2MDAyYzFcIik7XHJcbiAgICAgICAgbm9kZS5zZXROYW1lKFwiU2xvdENob2ljZXNcIik7XHJcbiAgICAgICAgbm9kZS5zZXRDaG9pY2VzKFtcImVmOTI1M2I5LTVjMjQtNDZjYy04ZTJkLTU1NjJhMTU0NGYwN1wiLFwiODJjNTEyYzYtMDExNS00ZDcyLWE0MTMtNTcyOGE2MjNmMDRiXCIsXCI3MzE1ODM1YS00ZDk1LTQzNzctODI4Yy04YTRjYTdlNDlmODdcIixcIjUwYWZkNmY4LTg3Y2UtNDliZi1iNjg5LTQ4MTliYzVkYzhlN1wiLFwiZDc5ZTk5NTUtZjgxZS00YWM5LTgyNDYtYTAyYjBiZDQ5ZGFlXCIsXCI5NDgzYTA4Ny0wNGQwLTQ4ZGQtODg0Zi05NDY5MzA3NzFiOTVcIixcImRlZmUwZjRjLTQ0NTItNDBmMy1hZmYxLWJhMDc2MjYzZmNiY1wiXSk7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcIjk1OTRjZjA2LTYwNjItNDk1Mi1iMzc4LTZhZWRhYWZlMjk1MVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge1NhdmVIYW5kbGVyLnNldFNsb3QoMCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCJhNmI2YjNkMi0yNWVmLTQxYjEtYTViNS0yNTE0M2YxYjQxZjlcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZmU5NWNmYjMtYjlmNS00YjEyLTgzYWEtOTRkMjZlNWJjYWMwXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7U2F2ZUhhbmRsZXIuc2V0U2xvdCgxKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImE2YjZiM2QyLTI1ZWYtNDFiMS1hNWI1LTI1MTQzZjFiNDFmOVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJkYzg4NDk3NC03YmIyLTQzNmYtYjNhNC1jZGY4NTUwYmQ0OTRcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtTYXZlSGFuZGxlci5zZXRTbG90KDIpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiYTZiNmIzZDItMjVlZi00MWIxLWE1YjUtMjUxNDNmMWI0MWY5XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcIjYyZjVlYTg4LWM2ZjAtNDQ2OS04N2YyLWVhM2IzNzYzODUwOVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge1NhdmVIYW5kbGVyLnNldFNsb3QoMyk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCJhNmI2YjNkMi0yNWVmLTQxYjEtYTViNS0yNTE0M2YxYjQxZjlcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiZWU0ZWNkOGItNTllMi00M2E2LTgxNTAtOGE4MzVkNmVlYWUxXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7U2F2ZUhhbmRsZXIuc2V0U2xvdCg0KTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcImE2YjZiM2QyLTI1ZWYtNDFiMS1hNWI1LTI1MTQzZjFiNDFmOVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJmMjVmNjUyNS1kYWQ2LTQ1ZDctYTM5MS0yNDZjMWIwMmI1NjlcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtyZXR1cm4gU2F2ZUhhbmRsZXIubG9hZEZyb21GaWxlKCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI1ZDFkZmI4Ni1hYmQ5LTRhZDYtYmYwNy04Y2VkNTQ3NmU0MDFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiOTQ4M2EwODctMDRkMC00OGRkLTg4NGYtOTQ2OTMwNzcxYjk1XCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkVyYXNlIGEgc2F2ZVwiKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0Q29uZGl0aW9ucygoKSA9PiB7IHJldHVybiAhU2F2ZUhhbmRsZXIuaXNFcmFzaW5nKCk7fSk7XHJcbiAgICAgICAgY2hvaWNlLnNldE5leHQoXCJlZTY1Yzg0YS0wMjFmLTQ0ZDMtYWEzNC01MDIzNWY0MzhjOTZcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGNob2ljZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY2hvaWNlID0gbmV3IERpYWxvZ3VlQ2hvaWNlKFwiZGVmZTBmNGMtNDQ1Mi00MGYzLWFmZjEtYmEwNzYyNjNmY2JjXCIpO1xyXG4gICAgICAgIGNob2ljZS5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShcIkRvbid0IGVyYXNlIG15IHNhdmVzIVwiKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0Q29uZGl0aW9ucygoKSA9PiB7IHJldHVybiBTYXZlSGFuZGxlci5pc0VyYXNpbmcoKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcImVlNjVjODRhLTAyMWYtNDRkMy1hYTM0LTUwMjM1ZjQzOGM5NlwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCJlZTY1Yzg0YS0wMjFmLTQ0ZDMtYWEzNC01MDIzNWY0MzhjOTZcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtTYXZlSGFuZGxlci50b2dnbGVFcmFzaW5nKCl9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjZmMTVmN2Q2LTQ5NDQtNGI5My05ZDQ3LTcwNDZlOGFlMWYxNVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcIjZmMTVmN2Q2LTQ5NDQtNGI5My05ZDQ3LTcwNDZlOGFlMWYxNVwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCJTbG90Q2hvaWNlc1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiOTE1NDkyZjEtOGZhNy00ZGRjLTlkYzAtNmIwMzQwZjczOGM4XCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7cmV0dXJuIFNhdmVIYW5kbGVyLmxvYWRGcm9tU3RvcmFnZSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiZjgyZmMxNzctYjRiZC00ZjA2LWI3YWItMjE2MjU5ZTA1NmE1XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIG5vZGUgPSBuZXcgRGlhbG9ndWVOb2RlKFwiZDRhMzc5YjUtMDZjOS00ZmNhLWEyNWMtYjFhMzFiNmJmOTNkXCIpO1xyXG4gICAgICAgIG5vZGUuc2V0TmV4dChcIlNldHRpbmdzXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcIjZiM2YzODViLTgyODMtNDYzNS05YzczLWUyMzAzZDc3NjQyZFwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCJBYm91dFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCJiNzVjMDM4Yy02NTRjLTRjNjItOGY0OS0yZjQ1MThmNTJjZmZcIik7XHJcbiAgICAgICAgbm9kZS5zZXROYW1lKFwiU2V0dGluZ3NcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiZDMzNDU2YjgtNzJiNi00MjE0LTkwYjMtM2ViYTI0NDJiMjg3XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICB0ZXh0ID0gbmV3IERpYWxvZ3VlVGV4dChcImQzMzQ1NmI4LTcyYjYtNDIxNC05MGIzLTNlYmEyNDQyYjI4N1wiKTtcclxuICAgICAgICB0ZXh0LnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFwiTm90IGltcGxlbWVudGVkLlwiKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCJiYzI0YjQ0Ni1kNmEyLTQyODQtOTNmYi02N2FkMzU5OGZjZDFcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImJjMjRiNDQ2LWQ2YTItNDI4NC05M2ZiLTY3YWQzNTk4ZmNkMVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge3JldHVybiBFbGVtZW50cy53YWl0Rm9yQW55S2V5KCk7fSk7XHJcbiAgICAgICAgc2V0LnNldE5leHQoXCI4MWY5ZDYyYi05MDdlLTQ4YWUtODRmZS03OGM3Y2VjYzRmZTNcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHNldCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCI4MWY5ZDYyYi05MDdlLTQ4YWUtODRmZS03OGM3Y2VjYzRmZTNcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiMVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUobm9kZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgbm9kZSA9IG5ldyBEaWFsb2d1ZU5vZGUoXCJjMzQyZTExMi01YzczLTRjODItODg4Mi00N2NhM2E3MWM5MTRcIik7XHJcbiAgICAgICAgbm9kZS5zZXROYW1lKFwiQWJvdXRcIik7XHJcbiAgICAgICAgbm9kZS5zZXROZXh0KFwiZDMzNDU2YjgtNzJiNi00MjE0LTkwYjMtM2ViYTI0NDJiMjg3XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjaG9pY2UgPSBuZXcgRGlhbG9ndWVDaG9pY2UoXCJhNTVmNDZmYS05OGE5LTRkZmYtOWYxYy00Zjg4YzE4Y2U4ZGRcIik7XHJcbiAgICAgICAgY2hvaWNlLnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFwiTm90ZSBhYm91dCBjb250ZW50IChTcG9pbGVyIEFsZXJ0KVwiKTt9KTtcclxuICAgICAgICBjaG9pY2Uuc2V0TmV4dChcIjdjMjA2MGFhLTY2Y2UtNGRiYi04OGQyLTBjOGYxOTBlMGE2Y1wiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoY2hvaWNlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICB0ZXh0ID0gbmV3IERpYWxvZ3VlVGV4dChcIjU5YTNjYjMwLWQ0YmEtNGI0Ni04MTU3LWI5MDBmYzcwMjJkZFwiKTtcclxuICAgICAgICB0ZXh0LnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFNheS5DRU5URVJFRCwgbmV3IFNheUltYWdlKFwiaW50cm9Mb2dvXCIpLCBTYXkuTElORV9CUkVBSywgbmV3IFNheUl0YWxpYyhcIlRoZSBPYmVsaXNrIGlzIGFuIGFkdWx0IGludGVyYWN0aXZlIGZpY3Rpb24gZ2FtZSBzZXQgaW4gYSBwb3N0LWFwb2NhbHlwdGljIHdvcmxkIHJhdmFnZWQgYnkgYSBtYWdpY2FsIHN0cnVjdHVyZS5cIikpO30pO1xyXG4gICAgICAgIHRleHQuc2V0TmV4dChcIjFiOGJkYzlkLWE0YmYtNDBhYS1hMzgyLWY3ODEzYzE1ODg0MFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUodGV4dCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0ID0gbmV3IERpYWxvZ3VlU2V0KFwiYzI3ODI5YjctNzE5OS00YjFlLTkzMzQtNTM2MjU4NTQ2Y2ZjXCIpO1xyXG4gICAgICAgIHNldC5zZXRGdW5jdGlvbigoKSA9PiB7cmV0dXJuIEVsZW1lbnRzLndhaXRGb3JBbnlLZXkoKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjQyNDAxMTQ1LTkxNTQtNDBjMy1hOWQzLTRmODNkZjk3Yjg5ZVwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBub2RlID0gbmV3IERpYWxvZ3VlTm9kZShcIjQyNDAxMTQ1LTkxNTQtNDBjMy1hOWQzLTRmODNkZjk3Yjg5ZVwiKTtcclxuICAgICAgICBub2RlLnNldE5leHQoXCIxXCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShub2RlKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI3YzIwNjBhYS02NmNlLTRkYmItODhkMi0wYzhmMTkwZTBhNmNcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtFbGVtZW50cy5jbGVhck1haW5TY3JlZW4oKTt9KTtcclxuICAgICAgICBzZXQuc2V0TmV4dChcIjU5YTNjYjMwLWQ0YmEtNGI0Ni04MTU3LWI5MDBmYzcwMjJkZFwiKTtcclxuICAgICAgICB0cmVlLmFkZE5vZGUoc2V0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICB0ZXh0ID0gbmV3IERpYWxvZ3VlVGV4dChcIjFiOGJkYzlkLWE0YmYtNDBhYS1hMzgyLWY3ODEzYzE1ODg0MFwiKTtcclxuICAgICAgICB0ZXh0LnNldFNheSgoKSA9PiB7IHJldHVybiBuZXcgU2F5KFwiSW4gdGhpcyBzdG9yeSwgdGhlIE9iZWxpc2sgd2lsbCBhdHRlbXB0IHRvIGdpdmUgdGhlIHBsYXllciBleGFjdGx5IHdoYXQgdGhlIHBsYXllciB3YW50cywgYnV0IHRoYXQncyBub3QgYWx3YXlzIHdoYXQgdGhlIHBsYXllciB0aGlua3MgdGhleSB3YW50LiBUaGlzIGlzIGEgcG9ybm9ncmFwaGljIGdhbWUgZmlyc3QgYW5kIGEgcm9sZXBsYXlpbmcgZ2FtZSBzZWNvbmQsIHdoaWNoIG1lYW5zIHRoYXQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBwbGF5ZXIgY2hhcmFjdGVyIHdhbnRzIHNleCAtIGV2ZW4gaWYgdGhleSBkb24ndCBhY3QgbGlrZSBpdC5cIiwgU2F5LlBBUkFHUkFQSF9CUkVBSywgXCJUaGVyZWZvcmUsIHRoaXMgZ2FtZSB3aWxsIFxcXCJmaXRcXFwiIGZvciBwbGF5ZXJzIHdobyBnbyBpbiB3aXRoIHRoYXQgbWVudGFsaXR5LCBidXQgaXQgXCIsIG5ldyBTYXlCb2xkKFwid2lsbFwiKSwgXCIgbG9vayBkaWZmZXJlbnRseSBmb3IgcGxheWVycyB3aXRoIGEgZGlmZmVyZW50IHBvaW50IG9mIHZpZXcgZm9yIHRoZWlyIGNoYXJhY3RlcnMuIFdoaWxlIHJvbGVwbGF5aW5nIGlzIGVuY291cmFnZWQsIHRoYXQgaXMgbm90IGhvdyB0aGUgZ2FtZSB3YXMgd3JpdHRlbiwgc28gaWYgeW91J3JlIHBsYXlpbmcgaXQgdGhhdCB3YXksIGl0J3MganVzdCB5b3VyIGNob2ljZS5cIiwgU2F5LlBBUkFHUkFQSF9CUkVBSywgXCJUaGVyZSBpcyBubyBzZXggd2l0aG91dCBleHBsaWNpdCBjb25zZW50IGZyb20gdGhlIE5QQ3M6IGltcGxpY2l0IGNvbnNlbnQgaXMgb25seSB1c2VkIGZvciB0aGUgcGxheWVyIGNoYXJhY3RlciwgYmVjYXVzZSB0aGF0J3MgcGFydCBvZiB0aGUgc3RvcnkuIEl0IGlzIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGUgcGxheWVyJ3MgY29uc2VudCwgdGhlcmVieSBoYXZpbmcgbm8gdW53YW50ZWQgc2V4IHNjZW5lcyBvY2N1ciwgYnkgc2V0dGluZyB1cCB0aGUgY29udGVudCBvcHRpb25zLCB3aGljaCB3aWxsIGRpc2FibGUgY29udGVudCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnQgKGkuZS4gZGlzYWJsaW5nIE0vTSBTZXggU2NlbmVzIG1lYW5zIHRoaXMga2luZCBvZiB0aGluZyB3aWxsIG9ubHkgaGFwcGVuIGlmIHlvdSBhY3RpdmVseSBhc2sgYW4gTlBDIGZvciBpdCkuXCIsIFNheS5QQVJBR1JBUEhfQlJFQUssIFwiV2hpbGUgdGhlIGNvbnRlbnQgb3B0aW9ucyBhcmUgdGhlcmUgdG8gdGFpbG9yIHlvdXIgZXhwZXJpZW5jZSwgdGhlIGdhbWUgaXMgbWFkZSB3aXRoIFxcXCJhbGwgY29udGVudCBpcyBhdmFpbGFibGVcXFwiIGluIG1pbmQsIHdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBhIHBsYXl0aHJvdWdoIHRoYXQncyBub3QgbXVjaCBmdW4gaWYgeW91IGRpc2FibGUgdG9vIG1hbnkgdGhpbmdzLiBTdGlsbCwgdGhhdCdzIHlvdXIgY2hvaWNlLiBHYW1lIG9uLlwiKTt9KTtcclxuICAgICAgICB0ZXh0LnNldE5leHQoXCJjMjc4MjliNy03MTk5LTRiMWUtOTMzNC01MzYyNTg1NDZjZmNcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKHRleHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGJyYW5jaCA9IG5ldyBEaWFsb2d1ZUJyYW5jaChcImE2YjZiM2QyLTI1ZWYtNDFiMS1hNWI1LTI1MTQzZjFiNDFmOVwiKTtcclxuICAgICAgICBicmFuY2guc2V0VmFyaWFibGUoKCkgPT4geyByZXR1cm4gU2F2ZUhhbmRsZXIuaXNWaXJnaW4oKTt9KTtcclxuICAgICAgICBicmFuY2guYWRkQnJhbmNoKFwiZDBkY2Q3YzYtMjZhZS00MWQwLTk5YTYtZTBjYWUxN2FlMzgxXCIsICgpID0+IHsgcmV0dXJuIHRydWU7fSk7XHJcbiAgICAgICAgYnJhbmNoLnNldE5leHQoXCI5MTU0OTJmMS04ZmE3LTRkZGMtOWRjMC02YjAzNDBmNzM4YzhcIik7XHJcbiAgICAgICAgdHJlZS5hZGROb2RlKGJyYW5jaCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgdGV4dCA9IG5ldyBEaWFsb2d1ZVRleHQoXCJiOGVlNjcwMi04ZDM4LTRiZDctOWIyNC1kZjhjOTAxYTUwZDRcIik7XHJcbiAgICAgICAgdGV4dC5zZXRTYXkoKCkgPT4geyByZXR1cm4gbmV3IFNheShuZXcgU2F5Qm9sZChcIkEgbm90ZSBvbiBzYXZlczogXCIpLCBcIlRoZSBzZWxlY3RlZCBzbG90IHdpbGwgYmUgc2F2ZWQgdG8gYnJvd3NlciBzdG9yYWdlLCBzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgaWYgdGhlIGJyb3dzZXIgZXZlciBkZWNpZGVzIHRvIGRlbGV0ZSBpdC4gVGhlIGdhbWUgd2lsbCB3cml0ZSB0byB0aGF0IHNhdmUgc2xvdCBldmVyeSB0dXJuLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG1hbnVhbGx5IHNhdmUgaW4tZ2FtZSwgd2hpY2ggd2lsbCBzYXZlIHRvIGEgZmlsZS5cIik7fSk7XHJcbiAgICAgICAgdGV4dC5zZXROZXh0KFwiNTA4NzZlMTMtMjNiOS00M2MwLWI2YjEtYTg5YjE2ODNkNWU3XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZSh0ZXh0KTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBzZXQgPSBuZXcgRGlhbG9ndWVTZXQoXCI1MDg3NmUxMy0yM2I5LTQzYzAtYjZiMS1hODliMTY4M2Q1ZTdcIik7XHJcbiAgICAgICAgc2V0LnNldEZ1bmN0aW9uKCgpID0+IHtyZXR1cm4gRWxlbWVudHMud2FpdEZvckFueUtleSgpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiOTE1NDkyZjEtOGZhNy00ZGRjLTlkYzAtNmIwMzQwZjczOGM4XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldCA9IG5ldyBEaWFsb2d1ZVNldChcImQwZGNkN2M2LTI2YWUtNDFkMC05OWE2LWUwY2FlMTdhZTM4MVwiKTtcclxuICAgICAgICBzZXQuc2V0RnVuY3Rpb24oKCkgPT4ge0VsZW1lbnRzLmNsZWFyTWFpblNjcmVlbigpO30pO1xyXG4gICAgICAgIHNldC5zZXROZXh0KFwiYjhlZTY3MDItOGQzOC00YmQ3LTliMjQtZGY4YzkwMWE1MGQ0XCIpO1xyXG4gICAgICAgIHRyZWUuYWRkTm9kZShzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfSkoKTtcclxufSJdfQ==