From 24b17b2408f28d8672514dcec41e3a00d8fe33cb Mon Sep 17 00:00:00 2001 From: Marco Date: Sat, 1 Jun 2024 17:27:31 +0200 Subject: [PATCH] Add custom tag option in the settings --- main.js | 27 ++++++++++++++++++++++----- src/components.ts | 11 +++++++++++ src/main.ts | 15 +++++++++------ src/settings.ts | 19 +++++++++++++++++++ 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/main.js b/main.js index e6e964b..67802d5 100644 --- a/main.js +++ b/main.js @@ -4456,6 +4456,11 @@ var InputModal = class extends import_obsidian.Modal { this.configuration.flashcardsCount = Number(value); }) ); + new import_obsidian.Setting(contentEl).setName("Flashcards tag").addText( + (text) => text.setPlaceholder("#flashcards").setValue(this.plugin.settings.tag).onChange(async (value) => { + this.configuration.tag = value; + }) + ); new import_obsidian.Setting(contentEl).setName("Additional prompt").addText( (text) => text.setValue(this.configuration.additionalPrompt).onChange((value) => { this.configuration.additionalPrompt = value; @@ -4527,6 +4532,12 @@ var FlashcardsSettingsTab = class extends import_obsidian2.PluginSettingTab { await this.plugin.saveSettings(); }) ); + new import_obsidian2.Setting(containerEl).setName("Flashcards tag").setDesc("Set which tag to append upon flashcards generation. See the Spaced Repetition plugin for details").addText( + (text) => text.setPlaceholder("#flashcards").setValue(this.plugin.settings.tag).onChange(async (value) => { + this.plugin.settings.tag = value; + await this.plugin.saveSettings(); + }) + ); new import_obsidian2.Setting(containerEl).setName("Number of flashcards to generate").setDesc("Set this to the total number of flashcards the model should generate each time a new `Generate Flashcards` command is issued").addText( (text) => text.setPlaceholder("3").setValue(this.plugin.settings.flashcardsCount.toString()).onChange(async (value) => { this.plugin.settings.flashcardsCount = Number(value); @@ -4574,7 +4585,8 @@ var DEFAULT_SETTINGS = { additionalPrompt: "", maxTokens: 300, streaming: true, - hideInPreview: true + hideInPreview: true, + tag: "#flashcards" }; var FlashcardsLLMPlugin = class extends import_obsidian3.Plugin { async onload() { @@ -4607,11 +4619,12 @@ var FlashcardsLLMPlugin = class extends import_obsidian3.Plugin { return; } const blocks = element.findAll("blockquote"); + const tag = this.settings.tag; for (let block of blocks) { const anchors = Array.from(block.querySelectorAll("a")); if (anchors.some((a) => { var _a2; - return (_a2 = a.getAttribute("href")) == null ? void 0 : _a2.startsWith("#flashcards"); + return (_a2 = a.getAttribute("href")) == null ? void 0 : _a2.startsWith(`${tag}`); })) { block.style.display = "none"; } @@ -4642,12 +4655,11 @@ var FlashcardsLLMPlugin = class extends import_obsidian3.Plugin { new import_obsidian3.Notice("Please provide a correct number of maximum tokens to generate. Defaulting to 300"); maxTokens = 300; } + const tag = configuration.tag; const wholeText = editor.getValue(); const currentText = editor.somethingSelected() ? editor.getSelection() : wholeText; const headerRegex = /\n\n### Generated Flashcards\n/; const hasHeader = headerRegex.test(wholeText); - const tagRegex = /\n#flashcards.*\n/; - const hasTag = tagRegex.test(wholeText); const streaming = configuration.streaming; new import_obsidian3.Notice("Generating flashcards..."); await flashcardsCount; @@ -4664,7 +4676,11 @@ var FlashcardsLLMPlugin = class extends import_obsidian3.Plugin { streaming ); let updatedText = ""; - updatedText += "\n\n> #flashcards\n> \n> "; + updatedText += ` + +> ${tag} +> +> `; editor.setCursor(editor.lastLine()); editor.replaceRange(updatedText, editor.getCursor()); editor.setCursor(editor.lastLine()); @@ -4690,3 +4706,4 @@ var FlashcardsLLMPlugin = class extends import_obsidian3.Plugin { await this.saveData(this.settings); } }; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy92ZXJzaW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy9yZWdpc3RyeS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9fc2hpbXMvTXVsdGlwYXJ0Qm9keS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9fc2hpbXMvd2ViLXJ1bnRpbWUudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9fc2hpbXMvaW5kZXgubWpzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2Vycm9yLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3N0cmVhbWluZy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy91cGxvYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2NvcmUudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcGFnaW5hdGlvbi50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY2hhdC9jaGF0LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9hdWRpby9zcGVlY2gudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3RyYW5zY3JpcHRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2xhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL2F1ZGlvLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iYXRjaGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2Fzc2lzdGFudHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL1J1bm5hYmxlRnVuY3Rpb24udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL2NoYXRDb21wbGV0aW9uVXRpbHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0NoYXRDb21wbGV0aW9uUnVubmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvY2hhdC9jb21wbGV0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS9jaGF0L2NoYXQudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fic3RyYWN0QXNzaXN0YW50U3RyZWFtUnVubmVyLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9Bc3Npc3RhbnRTdHJlYW0udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9tZXNzYWdlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvc3RlcHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdGhyZWFkcy90aHJlYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9VdGlsLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL3ZlY3Rvci1zdG9yZXMvZmlsZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy9maWxlLWJhdGNoZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy92ZWN0b3Itc3RvcmVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2JldGEudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9lbWJlZGRpbmdzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maWxlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvZmluZS10dW5pbmcvam9icy9jaGVja3BvaW50cy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvZmluZS10dW5pbmcvam9icy9qb2JzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9maW5lLXR1bmluZy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvaW1hZ2VzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9tb2RlbHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL21vZGVyYXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2luZGV4LnRzIiwgInNyYy9mbGFzaGNhcmRzLnRzIiwgInNyYy9jb21wb25lbnRzLnRzIiwgInNyYy9zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBFZGl0b3IsIEVkaXRvclBvc2l0aW9uLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGdlbmVyYXRlRmxhc2hjYXJkcyB9IGZyb20gXCIuL2ZsYXNoY2FyZHNcIjtcbmltcG9ydCB7IGF2YWlsYWJsZUNoYXRNb2RlbHMsIGF2YWlsYWJsZUNvbXBsZXRpb25Nb2RlbHMgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IElucHV0TW9kYWwgfSBmcm9tIFwiLi9jb21wb25lbnRzXCJcbmltcG9ydCB7IEZsYXNoY2FyZHNTZXR0aW5ncywgRmxhc2hjYXJkc1NldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3NcIlxuXG4vLyBUT0RPOlxuLy8gLSBTdGF0dXMgYmFyXG4vLyAtIEVuZm9yY2UgbmV3bGluZSBzZXBhcmF0aW9uIChzdHJlYW0gcG9zdCBwcm9jZXNzaW5nKVxuLy8gLSBEaXNhYmxlIHVzZXIgaW5wdXQgd2hpbGUgZ2VuZXJhdGluZ1xuLy8gLSBDdXN0b20gdGFnIGZvciBmbGFzaGNhcmRzIGJsb2Nrc1xuLy8gLSBJbnNlcnQgYW4gb3B0aW9uYWwgaGVhZGVyIGJlZm9yZSBmbGFzaGNhcmRzXG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IEZsYXNoY2FyZHNTZXR0aW5ncyA9IHtcbiAgYXBpS2V5OiBcIlwiLFxuICBtb2RlbDogXCJncHQtNG9cIixcbiAgaW5saW5lU2VwYXJhdG9yOiBcIjo6XCIsXG4gIG11bHRpbGluZVNlcGFyYXRvcjogXCI/XCIsXG4gIGZsYXNoY2FyZHNDb3VudDogMyxcbiAgYWRkaXRpb25hbFByb21wdDogXCJcIixcbiAgbWF4VG9rZW5zOiAzMDAsXG4gIHN0cmVhbWluZzogdHJ1ZSxcbiAgaGlkZUluUHJldmlldzogdHJ1ZSxcbiAgdGFnOiBcIiNmbGFzaGNhcmRzXCJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZsYXNoY2FyZHNMTE1QbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBzZXR0aW5nczogRmxhc2hjYXJkc1NldHRpbmdzO1xuXG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiBcImdlbmVyYXRlLWlubGluZS1mbGFzaGNhcmRzXCIsXG4gICAgICBuYW1lOiBcIkdlbmVyYXRlIElubGluZSBGbGFzaGNhcmRzXCIsXG4gICAgICBlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcbiAgICAgICAgdGhpcy5vbkdlbmVyYXRlRmxhc2hjYXJkcyhlZGl0b3IsIHZpZXcsIHRoaXMuc2V0dGluZ3MsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgaWQ6IFwiZ2VuZXJhdGUtbG9uZy1mbGFzaGNhcmRzXCIsXG4gICAgICBuYW1lOiBcIkdlbmVyYXRlIE11bHRpbGluZSBGbGFzaGNhcmRzXCIsXG4gICAgICBlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcbiAgICAgICAgdGhpcy5vbkdlbmVyYXRlRmxhc2hjYXJkcyhlZGl0b3IsIHZpZXcsIHRoaXMuc2V0dGluZ3MsIHRydWUpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICBpZDogXCJnZW5lcmF0ZS1mbGFzaGNhcmRzLWludGVyYWN0aXZlXCIsXG4gICAgICBuYW1lOiBcIkdlbmVyYXRlIGZsYXNoY2FyZHMgd2l0aCBuZXcgc2V0dGluZ3NcIixcbiAgICAgIGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXG4gICAgICAgIG5ldyBJbnB1dE1vZGFsKHRoaXMuYXBwLCB0aGlzLCAoY29uZmlndXJhdGlvbjogRmxhc2hjYXJkc1NldHRpbmdzLCBtdWx0aWxpbmU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLm9uR2VuZXJhdGVGbGFzaGNhcmRzKGVkaXRvciwgdmlldywgY29uZmlndXJhdGlvbiwgbXVsdGlsaW5lKTtcbiAgICAgICAgfSkub3BlbigpO1xuXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duUG9zdFByb2Nlc3NvcigoZWxlbWVudCwgY29udGV4dCkgPT4ge1xuXG4gICAgICBpZighdGhpcy5zZXR0aW5ncy5oaWRlSW5QcmV2aWV3KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvY2tzID0gZWxlbWVudC5maW5kQWxsKFwiYmxvY2txdW90ZVwiKTtcbiAgICAgIGNvbnN0IHRhZyA9IHRoaXMuc2V0dGluZ3MudGFnO1xuXG4gICAgICBmb3IobGV0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgICBjb25zdCBhbmNob3JzID0gQXJyYXkuZnJvbShibG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKSk7XG4gICAgICAgIGlmIChhbmNob3JzLnNvbWUoKGEpID0+IGEuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKT8uc3RhcnRzV2l0aChgJHt0YWd9YCkpKSB7XG4gICAgICAgICAgYmxvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBGbGFzaGNhcmRzU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcbiAgfVxuXG4gIGFzeW5jIG9uR2VuZXJhdGVGbGFzaGNhcmRzKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcsIGNvbmZpZ3VyYXRpb246IEZsYXNoY2FyZHNTZXR0aW5ncywgbXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBhcGlLZXkgPSBjb25maWd1cmF0aW9uLmFwaUtleTtcbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgbmV3IE5vdGljZShcIkFQSSBrZXkgaXMgbm90IHNldCBpbiBwbHVnaW4gc2V0dGluZ3NcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsID0gY29uZmlndXJhdGlvbi5tb2RlbDtcbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHNlbGVjdCBhIG1vZGVsIHRvIHVzZSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcCA9IG11bHRpbGluZSA/IGNvbmZpZ3VyYXRpb24ubXVsdGlsaW5lU2VwYXJhdG9yIDogY29uZmlndXJhdGlvbi5pbmxpbmVTZXBhcmF0b3JcblxuICAgIGxldCBmbGFzaGNhcmRzQ291bnQgPSBNYXRoLnRydW5jKGNvbmZpZ3VyYXRpb24uZmxhc2hjYXJkc0NvdW50KVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGZsYXNoY2FyZHNDb3VudCkgfHwgZmxhc2hjYXJkc0NvdW50IDw9IDApIHtcbiAgICAgIG5ldyBOb3RpY2UoXCJQbGVhc2UgcHJvdmlkZSBhIGNvcnJlY3QgbnVtYmVyIG9mIGZsYXNoY2FyZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHRpbmcgdG8gM1wiKVxuICAgICAgZmxhc2hjYXJkc0NvdW50ID0gM1xuICAgIH1cblxuICAgIGxldCBhZGRpdGlvbmFsUHJvbXB0ID0gY29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUHJvbXB0XG5cbiAgICBsZXQgbWF4VG9rZW5zID0gTWF0aC50cnVuYyhjb25maWd1cmF0aW9uLm1heFRva2VucylcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtYXhUb2tlbnMpIHx8IG1heFRva2VucyA8PSAwKSB7XG4gICAgICBuZXcgTm90aWNlKFwiUGxlYXNlIHByb3ZpZGUgYSBjb3JyZWN0IG51bWJlciBvZiBtYXhpbXVtIHRva2VucyB0byBnZW5lcmF0ZS4gRGVmYXVsdGluZyB0byAzMDBcIilcbiAgICAgIG1heFRva2VucyA9IDMwMFxuICAgIH1cblxuICAgIGNvbnN0IHRhZyA9IGNvbmZpZ3VyYXRpb24udGFnO1xuXG4gICAgY29uc3Qgd2hvbGVUZXh0ID0gZWRpdG9yLmdldFZhbHVlKClcbiAgICBjb25zdCBjdXJyZW50VGV4dCA9IChlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSA/IGVkaXRvci5nZXRTZWxlY3Rpb24oKSA6IHdob2xlVGV4dClcbiAgICAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIGlzIGFscmVhZHkgcHJlc2VudFxuICAgIGNvbnN0IGhlYWRlclJlZ2V4ID0gL1xcblxcbiMjIyBHZW5lcmF0ZWQgRmxhc2hjYXJkc1xcbi87XG4gICAgY29uc3QgaGFzSGVhZGVyID0gaGVhZGVyUmVnZXgudGVzdCh3aG9sZVRleHQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlICNmbGFzaGNhcmRzIHRhZyBpcyBhbHJlYWR5IHByZXNlbnRcbiAgICAvLyBjb25zdCB0YWdSZWdleCA9IC9cXG4jZmxhc2hjYXJkcy4qXFxuLztcbiAgICAvLyBjb25zdCBoYXNUYWcgPSB0YWdSZWdleC50ZXN0KHdob2xlVGV4dCk7XG5cblxuICAgIGNvbnN0IHN0cmVhbWluZyA9IGNvbmZpZ3VyYXRpb24uc3RyZWFtaW5nXG4gICAgbmV3IE5vdGljZShcIkdlbmVyYXRpbmcgZmxhc2hjYXJkcy4uLlwiKTtcblxuICAgIGF3YWl0IGZsYXNoY2FyZHNDb3VudFxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZsYXNoY2FyZHMgPSBhd2FpdCBnZW5lcmF0ZUZsYXNoY2FyZHMoXG4gICAgICAgIGN1cnJlbnRUZXh0LFxuICAgICAgICBhcGlLZXksXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBzZXAsXG4gICAgICAgIGZsYXNoY2FyZHNDb3VudCxcbiAgICAgICAgYWRkaXRpb25hbFByb21wdCxcbiAgICAgICAgbWF4VG9rZW5zLFxuICAgICAgICBtdWx0aWxpbmUsXG4gICAgICAgIHN0cmVhbWluZ1xuICAgICAgKVxuXG4gICAgICBsZXQgdXBkYXRlZFRleHQgPSBcIlwiO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBhbmQgYWRkIHRoZSBoZWFkZXIgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgLy8gaWYgKCFoYXNIZWFkZXIpIHtcbiAgICAgIC8vICAgdXBkYXRlZFRleHQgKz0gXCJcXG5cXG4jIyMgR2VuZXJhdGVkIEZsYXNoY2FyZHNcXG5cIjtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gR2VuZXJhdGUgYW5kIGFkZCB0aGUgI2ZsYXNoY2FyZHMgdGFnIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIC8vIGlmICghaGFzVGFnKSB7XG4gICAgICAvLyAgIHVwZGF0ZWRUZXh0ICs9IFwiPiAjZmxhc2hjYXJkc1xcbj4gXFxuPiBcIjtcbiAgICAgIC8vIH1cbiAgICAgIHVwZGF0ZWRUZXh0ICs9IGBcXG5cXG4+ICR7dGFnfVxcbj4gXFxuPiBgO1xuICAgICAgXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKGVkaXRvci5sYXN0TGluZSgpKVxuICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZSh1cGRhdGVkVGV4dCwgZWRpdG9yLmdldEN1cnNvcigpKVxuXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKGVkaXRvci5sYXN0TGluZSgpKVxuICAgICAgZm9yIGF3YWl0IChsZXQgdGV4dCBvZiBnZW5lcmF0ZWRGbGFzaGNhcmRzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbi9nLCBcIlxcbj4gXCIpXG4gICAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UodGV4dCwgZWRpdG9yLmdldEN1cnNvcigpKVxuICAgICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IGVkaXRvci5wb3NUb09mZnNldChlZGl0b3IuZ2V0Q3Vyc29yKCkpXG4gICAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uOiBFZGl0b3JQb3NpdGlvbiA9IGVkaXRvci5vZmZzZXRUb1BvcyhvZmZzZXQgKyB0ZXh0Lmxlbmd0aClcbiAgICAgICAgZWRpdG9yLnNldEN1cnNvcihuZXdQb3NpdGlvbilcbiAgICAgIH1cbiAgICAgIG5ldyBOb3RpY2UoXCJGbGFzaGNhcmRzIHN1Y2Nlc2Z1bGx5IGdlbmVyYXRlZCFcIik7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGdlbmVyYXRpbmcgZmxhc2hjYXJkczpcIiwgZXJyb3IpO1xuICAgICAgbmV3IE5vdGljZShcIkVycm9yIGdlbmVyYXRpbmcgZmxhc2hjYXJkcy4gUGxlYXNlIGNoZWNrIHRoZSBwbHVnaW4gY29uc29sZSBmb3IgZGV0YWlscy5cIik7XG4gICAgfVxuICB9XG5cbiAgb251bmxvYWQoKSB7XG5cbiAgfVxuXG4gIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuICB9XG59XG5cbiIsICJleHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlQ2hhdE1vZGVscygpOiBBcnJheTxzdHJpbmc+IHtcbiAgcmV0dXJuIFtcImdwdC0zLjUtdHVyYm9cIiwgXCJncHQtNFwiLCBcImdwdC00LXR1cmJvXCIsIFwiZ3B0LTRvXCJdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmFpbGFibGVDb21wbGV0aW9uTW9kZWxzKCk6IEFycmF5PHN0cmluZz4ge1xuICByZXR1cm4gW11cbn1cbiIsICJleHBvcnQgY29uc3QgVkVSU0lPTiA9ICc0LjQ3LjEnOyAvLyB4LXJlbGVhc2UtcGxlYXNlLXZlcnNpb25cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmltcG9ydCB7IHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBTaGltcyB7XG4gIGtpbmQ6IHN0cmluZztcbiAgZmV0Y2g6IGFueTtcbiAgUmVxdWVzdDogYW55O1xuICBSZXNwb25zZTogYW55O1xuICBIZWFkZXJzOiBhbnk7XG4gIEZvcm1EYXRhOiBhbnk7XG4gIEJsb2I6IGFueTtcbiAgRmlsZTogYW55O1xuICBSZWFkYWJsZVN0cmVhbTogYW55O1xuICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9uczogPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgZm9ybTogU2hpbXNbJ0Zvcm1EYXRhJ10sXG4gICAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4gICkgPT4gUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUPj47XG4gIGdldERlZmF1bHRBZ2VudDogKHVybDogc3RyaW5nKSA9PiBhbnk7XG4gIGZpbGVGcm9tUGF0aDpcbiAgICB8ICgocGF0aDogc3RyaW5nLCBmaWxlbmFtZT86IHN0cmluZywgb3B0aW9ucz86IHt9KSA9PiBQcm9taXNlPFNoaW1zWydGaWxlJ10+KVxuICAgIHwgKChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7fSkgPT4gUHJvbWlzZTxTaGltc1snRmlsZSddPik7XG4gIGlzRnNSZWFkU3RyZWFtOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbjtcbn1cblxuZXhwb3J0IGxldCBhdXRvID0gZmFsc2U7XG5leHBvcnQgbGV0IGtpbmQ6IFNoaW1zWydraW5kJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGZldGNoOiBTaGltc1snZmV0Y2gnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgUmVxdWVzdDogU2hpbXNbJ1JlcXVlc3QnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgUmVzcG9uc2U6IFNoaW1zWydSZXNwb25zZSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBIZWFkZXJzOiBTaGltc1snSGVhZGVycyddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBGb3JtRGF0YTogU2hpbXNbJ0Zvcm1EYXRhJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEJsb2I6IFNoaW1zWydCbG9iJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEZpbGU6IFNoaW1zWydGaWxlJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IFJlYWRhYmxlU3RyZWFtOiBTaGltc1snUmVhZGFibGVTdHJlYW0nXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM6IFNoaW1zWydnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBnZXREZWZhdWx0QWdlbnQ6IFNoaW1zWydnZXREZWZhdWx0QWdlbnQnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZmlsZUZyb21QYXRoOiBTaGltc1snZmlsZUZyb21QYXRoJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGlzRnNSZWFkU3RyZWFtOiBTaGltc1snaXNGc1JlYWRTdHJlYW0nXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFNoaW1zKHNoaW1zOiBTaGltcywgb3B0aW9uczogeyBhdXRvOiBib29sZWFuIH0gPSB7IGF1dG86IGZhbHNlIH0pIHtcbiAgaWYgKGF1dG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgeW91IG11c3QgXFxgaW1wb3J0ICdvcGVuYWkvc2hpbXMvJHtzaGltcy5raW5kfSdcXGAgYmVmb3JlIGltcG9ydGluZyBhbnl0aGluZyBlbHNlIGZyb20gb3BlbmFpYCxcbiAgICApO1xuICB9XG4gIGlmIChraW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBcXGBpbXBvcnQgJ29wZW5haS9zaGltcy8ke3NoaW1zLmtpbmR9J1xcYCBhZnRlciBcXGBpbXBvcnQgJ29wZW5haS9zaGltcy8ke2tpbmR9J1xcYGApO1xuICB9XG4gIGF1dG8gPSBvcHRpb25zLmF1dG87XG4gIGtpbmQgPSBzaGltcy5raW5kO1xuICBmZXRjaCA9IHNoaW1zLmZldGNoO1xuICBSZXF1ZXN0ID0gc2hpbXMuUmVxdWVzdDtcbiAgUmVzcG9uc2UgPSBzaGltcy5SZXNwb25zZTtcbiAgSGVhZGVycyA9IHNoaW1zLkhlYWRlcnM7XG4gIEZvcm1EYXRhID0gc2hpbXMuRm9ybURhdGE7XG4gIEJsb2IgPSBzaGltcy5CbG9iO1xuICBGaWxlID0gc2hpbXMuRmlsZTtcbiAgUmVhZGFibGVTdHJlYW0gPSBzaGltcy5SZWFkYWJsZVN0cmVhbTtcbiAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMgPSBzaGltcy5nZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucztcbiAgZ2V0RGVmYXVsdEFnZW50ID0gc2hpbXMuZ2V0RGVmYXVsdEFnZW50O1xuICBmaWxlRnJvbVBhdGggPSBzaGltcy5maWxlRnJvbVBhdGg7XG4gIGlzRnNSZWFkU3RyZWFtID0gc2hpbXMuaXNGc1JlYWRTdHJlYW07XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlwYXJ0Qm9keSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBib2R5OiBhbnkpIHt9XG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnTXVsdGlwYXJ0Qm9keSc7XG4gIH1cbn1cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmltcG9ydCB7IE11bHRpcGFydEJvZHkgfSBmcm9tICcuL011bHRpcGFydEJvZHknO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgdHlwZSBTaGltcyB9IGZyb20gJy4vcmVnaXN0cnknO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVudGltZSh7IG1hbnVhbGx5SW1wb3J0ZWQgfTogeyBtYW51YWxseUltcG9ydGVkPzogYm9vbGVhbiB9ID0ge30pOiBTaGltcyB7XG4gIGNvbnN0IHJlY29tbWVuZGF0aW9uID1cbiAgICBtYW51YWxseUltcG9ydGVkID9cbiAgICAgIGBZb3UgbWF5IG5lZWQgdG8gdXNlIHBvbHlmaWxsc2BcbiAgICA6IGBBZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgXFxgaW1wb3J0IFx1MjAyNiBmcm9tICdvcGVuYWknXFxgOlxuLSBcXGBpbXBvcnQgJ29wZW5haS9zaGltcy9ub2RlJ1xcYCAoaWYgeW91J3JlIHJ1bm5pbmcgb24gTm9kZSlcbi0gXFxgaW1wb3J0ICdvcGVuYWkvc2hpbXMvd2ViJ1xcYCAob3RoZXJ3aXNlKVxuYDtcblxuICBsZXQgX2ZldGNoLCBfUmVxdWVzdCwgX1Jlc3BvbnNlLCBfSGVhZGVycztcbiAgdHJ5IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX2ZldGNoID0gZmV0Y2g7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX1Jlc3BvbnNlID0gUmVzcG9uc2U7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9IZWFkZXJzID0gSGVhZGVycztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgdGhpcyBlbnZpcm9ubWVudCBpcyBtaXNzaW5nIHRoZSBmb2xsb3dpbmcgV2ViIEZldGNoIEFQSSB0eXBlOiAke1xuICAgICAgICAoZXJyb3IgYXMgYW55KS5tZXNzYWdlXG4gICAgICB9LiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2luZDogJ3dlYicsXG4gICAgZmV0Y2g6IF9mZXRjaCxcbiAgICBSZXF1ZXN0OiBfUmVxdWVzdCxcbiAgICBSZXNwb25zZTogX1Jlc3BvbnNlLFxuICAgIEhlYWRlcnM6IF9IZWFkZXJzLFxuICAgIEZvcm1EYXRhOlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogKFxuICAgICAgICBjbGFzcyBGb3JtRGF0YSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmlsZSB1cGxvYWRzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ0Zvcm1EYXRhJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIEJsb2I6XG4gICAgICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iIDogKFxuICAgICAgICBjbGFzcyBCbG9iIHtcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGZpbGUgdXBsb2FkcyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdCbG9iJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIEZpbGU6XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgPyBGaWxlIDogKFxuICAgICAgICBjbGFzcyBGaWxlIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBmaWxlIHVwbG9hZHMgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnRmlsZScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBSZWFkYWJsZVN0cmVhbTpcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFkYWJsZVN0cmVhbSA6IChcbiAgICAgICAgY2xhc3MgUmVhZGFibGVTdHJlYW0ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHN0cmVhbWluZyBpc24ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ1JlYWRhYmxlU3RyZWFtJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvcm06IEZvcm1EYXRhLFxuICAgICAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4gICAgKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUPj4gPT4gKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBib2R5OiBuZXcgTXVsdGlwYXJ0Qm9keShmb3JtKSBhcyBhbnksXG4gICAgfSksXG4gICAgZ2V0RGVmYXVsdEFnZW50OiAodXJsOiBzdHJpbmcpID0+IHVuZGVmaW5lZCxcbiAgICBmaWxlRnJvbVBhdGg6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBgZmlsZUZyb21QYXRoYCBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL3d3dy5naXRodWIuY29tL29wZW5haS9vcGVuYWktbm9kZSNmaWxlLXVwbG9hZHMnLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGlzRnNSZWFkU3RyZWFtOiAodmFsdWU6IGFueSkgPT4gZmFsc2UsXG4gIH07XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgKiBhcyBzaGltcyBmcm9tICcuL3JlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQgKiBhcyBhdXRvIGZyb20gJ29wZW5haS9fc2hpbXMvYXV0by9ydW50aW1lJztcbmlmICghc2hpbXMua2luZCkgc2hpbXMuc2V0U2hpbXMoYXV0by5nZXRSdW50aW1lKCksIHsgYXV0bzogdHJ1ZSB9KTtcbmV4cG9ydCAqIGZyb20gJy4vcmVnaXN0cnkubWpzJztcbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBjYXN0VG9FcnJvciwgSGVhZGVycyB9IGZyb20gJy4vY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBBUElFcnJvciBleHRlbmRzIE9wZW5BSUVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGVycm9yOiBPYmplY3QgfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcGFyYW06IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICByZWFkb25seSByZXF1ZXN0X2lkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yOiBPYmplY3QgfCB1bmRlZmluZWQsXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHN1cGVyKGAke0FQSUVycm9yLm1ha2VNZXNzYWdlKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UpfWApO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgdGhpcy5yZXF1ZXN0X2lkID0gaGVhZGVycz8uWyd4LXJlcXVlc3QtaWQnXTtcblxuICAgIGNvbnN0IGRhdGEgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHRoaXMuZXJyb3IgPSBkYXRhO1xuICAgIHRoaXMuY29kZSA9IGRhdGE/LlsnY29kZSddO1xuICAgIHRoaXMucGFyYW0gPSBkYXRhPy5bJ3BhcmFtJ107XG4gICAgdGhpcy50eXBlID0gZGF0YT8uWyd0eXBlJ107XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYWtlTWVzc2FnZShzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCwgZXJyb3I6IGFueSwgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbXNnID1cbiAgICAgIGVycm9yPy5tZXNzYWdlID9cbiAgICAgICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSlcbiAgICAgIDogZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcilcbiAgICAgIDogbWVzc2FnZTtcblxuICAgIGlmIChzdGF0dXMgJiYgbXNnKSB7XG4gICAgICByZXR1cm4gYCR7c3RhdHVzfSAke21zZ31gO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICByZXR1cm4gYCR7c3RhdHVzfSBzdGF0dXMgY29kZSAobm8gYm9keSlgO1xuICAgIH1cbiAgICBpZiAobXNnKSB7XG4gICAgICByZXR1cm4gbXNnO1xuICAgIH1cbiAgICByZXR1cm4gJyhubyBzdGF0dXMgY29kZSBvciBib2R5KSc7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGUoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3JSZXNwb25zZTogT2JqZWN0IHwgdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgcmV0dXJuIG5ldyBBUElDb25uZWN0aW9uRXJyb3IoeyBjYXVzZTogY2FzdFRvRXJyb3IoZXJyb3JSZXNwb25zZSkgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSAoZXJyb3JSZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KT8uWydlcnJvciddO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25FcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbkRlbmllZEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQyMikge1xuICAgICAgcmV0dXJuIG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICByZXR1cm4gbmV3IFJhdGVMaW1pdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICByZXR1cm4gbmV3IEludGVybmFsU2VydmVyRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBUElFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJVXNlckFib3J0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIG1lc3NhZ2UgfHwgJ1JlcXVlc3Qgd2FzIGFib3J0ZWQuJywgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNhdXNlIH06IHsgbWVzc2FnZT86IHN0cmluZzsgY2F1c2U/OiBFcnJvciB8IHVuZGVmaW5lZCB9KSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIG1lc3NhZ2UgfHwgJ0Nvbm5lY3Rpb24gZXJyb3IuJywgdW5kZWZpbmVkKTtcbiAgICAvLyBpbiBzb21lIGVudmlyb25tZW50cyB0aGUgJ2NhdXNlJyBwcm9wZXJ0eSBpcyBhbHJlYWR5IGRlY2xhcmVkXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChjYXVzZSkgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yIGV4dGVuZHMgQVBJQ29ubmVjdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2U6IG1lc3NhZ2UgPz8gJ1JlcXVlc3QgdGltZWQgb3V0LicgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJhZFJlcXVlc3RFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDAgPSA0MDA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMSA9IDQwMTtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25EZW5pZWRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDMgPSA0MDM7XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwNCA9IDQwNDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDA5ID0gNDA5O1xufVxuXG5leHBvcnQgY2xhc3MgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQyMiA9IDQyMjtcbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQyOSA9IDQyOTtcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7fVxuIiwgImltcG9ydCB7IFJlYWRhYmxlU3RyZWFtLCB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuaW1wb3J0IHsgT3BlbkFJRXJyb3IgfSBmcm9tICcuL2Vycm9yJztcblxuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuXG50eXBlIEJ5dGVzID0gc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5IHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgU2VydmVyU2VudEV2ZW50ID0ge1xuICBldmVudDogc3RyaW5nIHwgbnVsbDtcbiAgZGF0YTogc3RyaW5nO1xuICByYXc6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFN0cmVhbTxJdGVtPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8SXRlbT4ge1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpdGVyYXRvcjogKCkgPT4gQXN5bmNJdGVyYXRvcjxJdGVtPixcbiAgICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gICkge1xuICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gIH1cblxuICBzdGF0aWMgZnJvbVNTRVJlc3BvbnNlPEl0ZW0+KHJlc3BvbnNlOiBSZXNwb25zZSwgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgbGV0IGNvbnN1bWVkID0gZmFsc2U7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogaXRlcmF0b3IoKTogQXN5bmNJdGVyYXRvcjxJdGVtLCBhbnksIHVuZGVmaW5lZD4ge1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGl0ZXJhdGUgb3ZlciBhIGNvbnN1bWVkIHN0cmVhbSwgdXNlIGAudGVlKClgIHRvIHNwbGl0IHRoZSBzdHJlYW0uJyk7XG4gICAgICB9XG4gICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBzc2Ugb2YgX2l0ZXJTU0VNZXNzYWdlcyhyZXNwb25zZSwgY29udHJvbGxlcikpIHtcbiAgICAgICAgICBpZiAoZG9uZSkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAoc3NlLmRhdGEuc3RhcnRzV2l0aCgnW0RPTkVdJykpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNzZS5ldmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHNzZS5kYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IHBhcnNlIG1lc3NhZ2UgaW50byBKU09OOmAsIHNzZS5kYXRhKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRnJvbSBjaHVuazpgLCBzc2UucmF3KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IodW5kZWZpbmVkLCBkYXRhLmVycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHlpZWxkIGRhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uoc3NlLmRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgcGFyc2UgbWVzc2FnZSBpbnRvIEpTT046YCwgc3NlLmRhdGEpO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGcm9tIGNodW5rOmAsIHNzZS5yYXcpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogSXMgdGhpcyB3aGVyZSB0aGUgZXJyb3Igc2hvdWxkIGJlIHRocm93bj9cbiAgICAgICAgICAgIGlmIChzc2UuZXZlbnQgPT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IodW5kZWZpbmVkLCBkYXRhLmVycm9yLCBkYXRhLm1lc3NhZ2UsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCB7IGV2ZW50OiBzc2UuZXZlbnQsIGRhdGE6IGRhdGEgfSBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBjYWxscyBgc3RyZWFtLmNvbnRyb2xsZXIuYWJvcnQoKWAsIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGBicmVha2BzLCBhYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0LlxuICAgICAgICBpZiAoIWRvbmUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbShpdGVyYXRvciwgY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU3RyZWFtIGZyb20gYSBuZXdsaW5lLXNlcGFyYXRlZCBSZWFkYWJsZVN0cmVhbVxuICAgKiB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBKU09OIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGZyb21SZWFkYWJsZVN0cmVhbTxJdGVtPihyZWFkYWJsZVN0cmVhbTogUmVhZGFibGVTdHJlYW0sIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGxldCBjb25zdW1lZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJMaW5lcygpOiBBc3luY0dlbmVyYXRvcjxzdHJpbmcsIHZvaWQsIHVua25vd24+IHtcbiAgICAgIGNvbnN0IGxpbmVEZWNvZGVyID0gbmV3IExpbmVEZWNvZGVyKCk7XG5cbiAgICAgIGNvbnN0IGl0ZXIgPSByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8Qnl0ZXM+KHJlYWRhYmxlU3RyZWFtKTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZURlY29kZXIuZGVjb2RlKGNodW5rKSkge1xuICAgICAgICAgIHlpZWxkIGxpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmZsdXNoKCkpIHtcbiAgICAgICAgeWllbGQgbGluZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiogaXRlcmF0b3IoKTogQXN5bmNJdGVyYXRvcjxJdGVtLCBhbnksIHVuZGVmaW5lZD4ge1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGl0ZXJhdGUgb3ZlciBhIGNvbnN1bWVkIHN0cmVhbSwgdXNlIGAudGVlKClgIHRvIHNwbGl0IHRoZSBzdHJlYW0uJyk7XG4gICAgICB9XG4gICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsaW5lIG9mIGl0ZXJMaW5lcygpKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChsaW5lKSB5aWVsZCBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBjYWxscyBgc3RyZWFtLmNvbnRyb2xsZXIuYWJvcnQoKWAsIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGBicmVha2BzLCBhYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0LlxuICAgICAgICBpZiAoIWRvbmUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbShpdGVyYXRvciwgY29udHJvbGxlcik7XG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8SXRlbT4ge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yKCk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBzdHJlYW0gaW50byB0d28gc3RyZWFtcyB3aGljaCBjYW4gYmVcbiAgICogaW5kZXBlbmRlbnRseSByZWFkIGZyb20gYXQgZGlmZmVyZW50IHNwZWVkcy5cbiAgICovXG4gIHRlZSgpOiBbU3RyZWFtPEl0ZW0+LCBTdHJlYW08SXRlbT5dIHtcbiAgICBjb25zdCBsZWZ0OiBBcnJheTxQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEl0ZW0+Pj4gPSBbXTtcbiAgICBjb25zdCByaWdodDogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+ID0gW107XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yKCk7XG5cbiAgICBjb25zdCB0ZWVJdGVyYXRvciA9IChxdWV1ZTogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+KTogQXN5bmNJdGVyYXRvcjxJdGVtPiA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgbGVmdC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICByaWdodC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBxdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgU3RyZWFtKCgpID0+IHRlZUl0ZXJhdG9yKGxlZnQpLCB0aGlzLmNvbnRyb2xsZXIpLFxuICAgICAgbmV3IFN0cmVhbSgoKSA9PiB0ZWVJdGVyYXRvcihyaWdodCksIHRoaXMuY29udHJvbGxlciksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGlzIHN0cmVhbSB0byBhIG5ld2xpbmUtc2VwYXJhdGVkIFJlYWRhYmxlU3RyZWFtIG9mXG4gICAqIEpTT04gc3RyaW5naWZpZWQgdmFsdWVzIGluIHRoZSBzdHJlYW1cbiAgICogd2hpY2ggY2FuIGJlIHR1cm5lZCBiYWNrIGludG8gYSBTdHJlYW0gd2l0aCBgU3RyZWFtLmZyb21SZWFkYWJsZVN0cmVhbSgpYC5cbiAgICovXG4gIHRvUmVhZGFibGVTdHJlYW0oKTogUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBpdGVyOiBBc3luY0l0ZXJhdG9yPEl0ZW0+O1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICAgIGl0ZXIgPSBzZWxmW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwoY3RybDogYW55KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICAgICAgaWYgKGRvbmUpIHJldHVybiBjdHJsLmNsb3NlKCk7XG5cbiAgICAgICAgICBjb25zdCBieXRlcyA9IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdcXG4nKTtcblxuICAgICAgICAgIGN0cmwuZW5xdWV1ZShieXRlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGN0cmwuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgYXdhaXQgaXRlci5yZXR1cm4/LigpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIF9pdGVyU1NFTWVzc2FnZXMoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuKTogQXN5bmNHZW5lcmF0b3I8U2VydmVyU2VudEV2ZW50LCB2b2lkLCB1bmtub3duPiB7XG4gIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYEF0dGVtcHRlZCB0byBpdGVyYXRlIG92ZXIgYSByZXNwb25zZSB3aXRoIG5vIGJvZHlgKTtcbiAgfVxuXG4gIGNvbnN0IHNzZURlY29kZXIgPSBuZXcgU1NFRGVjb2RlcigpO1xuICBjb25zdCBsaW5lRGVjb2RlciA9IG5ldyBMaW5lRGVjb2RlcigpO1xuXG4gIGNvbnN0IGl0ZXIgPSByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8Qnl0ZXM+KHJlc3BvbnNlLmJvZHkpO1xuICBmb3IgYXdhaXQgKGNvbnN0IHNzZUNodW5rIG9mIGl0ZXJTU0VDaHVua3MoaXRlcikpIHtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZURlY29kZXIuZGVjb2RlKHNzZUNodW5rKSkge1xuICAgICAgY29uc3Qgc3NlID0gc3NlRGVjb2Rlci5kZWNvZGUobGluZSk7XG4gICAgICBpZiAoc3NlKSB5aWVsZCBzc2U7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmZsdXNoKCkpIHtcbiAgICBjb25zdCBzc2UgPSBzc2VEZWNvZGVyLmRlY29kZShsaW5lKTtcbiAgICBpZiAoc3NlKSB5aWVsZCBzc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciwgaXRlcmF0ZXMgb3ZlciBpdCBhbmQgeWllbGRzIGZ1bGxcbiAqIFNTRSBjaHVua3MsIGkuZS4geWllbGRzIHdoZW4gYSBkb3VibGUgbmV3LWxpbmUgaXMgZW5jb3VudGVyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uKiBpdGVyU1NFQ2h1bmtzKGl0ZXJhdG9yOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8Qnl0ZXM+KTogQXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT4ge1xuICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KCk7XG5cbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYXRvcikge1xuICAgIGlmIChjaHVuayA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnlDaHVuayA9XG4gICAgICBjaHVuayBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoY2h1bmspXG4gICAgICA6IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoY2h1bmspXG4gICAgICA6IGNodW5rO1xuXG4gICAgbGV0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCArIGJpbmFyeUNodW5rLmxlbmd0aCk7XG4gICAgbmV3RGF0YS5zZXQoZGF0YSk7XG4gICAgbmV3RGF0YS5zZXQoYmluYXJ5Q2h1bmssIGRhdGEubGVuZ3RoKTtcbiAgICBkYXRhID0gbmV3RGF0YTtcblxuICAgIGxldCBwYXR0ZXJuSW5kZXg7XG4gICAgd2hpbGUgKChwYXR0ZXJuSW5kZXggPSBmaW5kRG91YmxlTmV3bGluZUluZGV4KGRhdGEpKSAhPT0gLTEpIHtcbiAgICAgIHlpZWxkIGRhdGEuc2xpY2UoMCwgcGF0dGVybkluZGV4KTtcbiAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKHBhdHRlcm5JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgIHlpZWxkIGRhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZERvdWJsZU5ld2xpbmVJbmRleChidWZmZXI6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICAvLyBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBidWZmZXIgZm9yIHRoZSBlbmQgcGF0dGVybnMgKFxcclxcciwgXFxuXFxuLCBcXHJcXG5cXHJcXG4pXG4gIC8vIGFuZCByZXR1cm5zIHRoZSBpbmRleCByaWdodCBhZnRlciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgcGF0dGVybixcbiAgLy8gb3IgLTEgaWYgbm9uZSBvZiB0aGUgcGF0dGVybnMgYXJlIGZvdW5kLlxuICBjb25zdCBuZXdsaW5lID0gMHgwYTsgLy8gXFxuXG4gIGNvbnN0IGNhcnJpYWdlID0gMHgwZDsgLy8gXFxyXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgaWYgKGJ1ZmZlcltpXSA9PT0gbmV3bGluZSAmJiBidWZmZXJbaSArIDFdID09PSBuZXdsaW5lKSB7XG4gICAgICAvLyBcXG5cXG5cbiAgICAgIHJldHVybiBpICsgMjtcbiAgICB9XG4gICAgaWYgKGJ1ZmZlcltpXSA9PT0gY2FycmlhZ2UgJiYgYnVmZmVyW2kgKyAxXSA9PT0gY2FycmlhZ2UpIHtcbiAgICAgIC8vIFxcclxcclxuICAgICAgcmV0dXJuIGkgKyAyO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBidWZmZXJbaV0gPT09IGNhcnJpYWdlICYmXG4gICAgICBidWZmZXJbaSArIDFdID09PSBuZXdsaW5lICYmXG4gICAgICBpICsgMyA8IGJ1ZmZlci5sZW5ndGggJiZcbiAgICAgIGJ1ZmZlcltpICsgMl0gPT09IGNhcnJpYWdlICYmXG4gICAgICBidWZmZXJbaSArIDNdID09PSBuZXdsaW5lXG4gICAgKSB7XG4gICAgICAvLyBcXHJcXG5cXHJcXG5cbiAgICAgIHJldHVybiBpICsgNDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmNsYXNzIFNTRURlY29kZXIge1xuICBwcml2YXRlIGRhdGE6IHN0cmluZ1tdO1xuICBwcml2YXRlIGV2ZW50OiBzdHJpbmcgfCBudWxsO1xuICBwcml2YXRlIGNodW5rczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ldmVudCA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgfVxuXG4gIGRlY29kZShsaW5lOiBzdHJpbmcpIHtcbiAgICBpZiAobGluZS5lbmRzV2l0aCgnXFxyJykpIHtcbiAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIGlmICghbGluZSkge1xuICAgICAgLy8gZW1wdHkgbGluZSBhbmQgd2UgZGlkbid0IHByZXZpb3VzbHkgZW5jb3VudGVyIGFueSBtZXNzYWdlc1xuICAgICAgaWYgKCF0aGlzLmV2ZW50ICYmICF0aGlzLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3Qgc3NlOiBTZXJ2ZXJTZW50RXZlbnQgPSB7XG4gICAgICAgIGV2ZW50OiB0aGlzLmV2ZW50LFxuICAgICAgICBkYXRhOiB0aGlzLmRhdGEuam9pbignXFxuJyksXG4gICAgICAgIHJhdzogdGhpcy5jaHVua3MsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmV2ZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgdGhpcy5jaHVua3MgPSBbXTtcblxuICAgICAgcmV0dXJuIHNzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNodW5rcy5wdXNoKGxpbmUpO1xuXG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW2ZpZWxkbmFtZSwgXywgdmFsdWVdID0gcGFydGl0aW9uKGxpbmUsICc6Jyk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRuYW1lID09PSAnZXZlbnQnKSB7XG4gICAgICB0aGlzLmV2ZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZG5hbWUgPT09ICdkYXRhJykge1xuICAgICAgdGhpcy5kYXRhLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSByZS1pbXBsZW1lbnRhdGlvbiBvZiBodHRweCdzIGBMaW5lRGVjb2RlcmAgaW4gUHl0aG9uIHRoYXQgaGFuZGxlcyBpbmNyZW1lbnRhbGx5XG4gKiByZWFkaW5nIGxpbmVzIGZyb20gdGV4dC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5jb2RlL2h0dHB4L2Jsb2IvOTIwMzMzZWE5ODExOGU5Y2Y2MTdmMjQ2OTA1ZDdiMjAyNTEwOTQxYy9odHRweC9fZGVjb2RlcnMucHkjTDI1OFxuICovXG5jbGFzcyBMaW5lRGVjb2RlciB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzdGF0aWMgTkVXTElORV9DSEFSUyA9IG5ldyBTZXQoWydcXG4nLCAnXFxyJ10pO1xuICBzdGF0aWMgTkVXTElORV9SRUdFWFAgPSAvXFxyXFxufFtcXG5cXHJdL2c7XG5cbiAgYnVmZmVyOiBzdHJpbmdbXTtcbiAgdHJhaWxpbmdDUjogYm9vbGVhbjtcbiAgdGV4dERlY29kZXI6IGFueTsgLy8gVGV4dERlY29kZXIgZm91bmQgaW4gYnJvd3NlcnM7IG5vdCB0eXBlZCB0byBhdm9pZCBwdWxsaW5nIGluIGVpdGhlciBcImRvbVwiIG9yIFwibm9kZVwiIHR5cGVzLlxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy50cmFpbGluZ0NSID0gZmFsc2U7XG4gIH1cblxuICBkZWNvZGUoY2h1bms6IEJ5dGVzKTogc3RyaW5nW10ge1xuICAgIGxldCB0ZXh0ID0gdGhpcy5kZWNvZGVUZXh0KGNodW5rKTtcblxuICAgIGlmICh0aGlzLnRyYWlsaW5nQ1IpIHtcbiAgICAgIHRleHQgPSAnXFxyJyArIHRleHQ7XG4gICAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRleHQuZW5kc1dpdGgoJ1xccicpKSB7XG4gICAgICB0aGlzLnRyYWlsaW5nQ1IgPSB0cnVlO1xuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIGlmICghdGV4dCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWlsaW5nTmV3bGluZSA9IExpbmVEZWNvZGVyLk5FV0xJTkVfQ0hBUlMuaGFzKHRleHRbdGV4dC5sZW5ndGggLSAxXSB8fCAnJyk7XG4gICAgbGV0IGxpbmVzID0gdGV4dC5zcGxpdChMaW5lRGVjb2Rlci5ORVdMSU5FX1JFR0VYUCk7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBhIHRyYWlsaW5nIG5ldyBsaW5lIHRoZW4gdGhlIGxhc3QgZW50cnkgd2lsbCBiZSBhbiBlbXB0eVxuICAgIC8vIHN0cmluZyB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0XG4gICAgaWYgKHRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgbGluZXMucG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSAmJiAhdHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKGxpbmVzWzBdISk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzID0gW3RoaXMuYnVmZmVyLmpvaW4oJycpICsgbGluZXNbMF0sIC4uLmxpbmVzLnNsaWNlKDEpXTtcbiAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgfVxuXG4gICAgaWYgKCF0cmFpbGluZ05ld2xpbmUpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gW2xpbmVzLnBvcCgpIHx8ICcnXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBkZWNvZGVUZXh0KGJ5dGVzOiBCeXRlcyk6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzID09IG51bGwpIHJldHVybiAnJztcbiAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykgcmV0dXJuIGJ5dGVzO1xuXG4gICAgLy8gTm9kZTpcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChieXRlcyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gYnl0ZXMudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmIChieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkOiByZWNlaXZlZCBub24tVWludDhBcnJheSAoJHtieXRlcy5jb25zdHJ1Y3Rvci5uYW1lfSkgc3RyZWFtIGNodW5rIGluIGFuIGVudmlyb25tZW50IHdpdGggYSBnbG9iYWwgXCJCdWZmZXJcIiBkZWZpbmVkLCB3aGljaCB0aGlzIGxpYnJhcnkgYXNzdW1lcyB0byBiZSBOb2RlLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnJvd3NlclxuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IGJ5dGVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgdGhpcy50ZXh0RGVjb2RlciA/Pz0gbmV3IFRleHREZWNvZGVyKCd1dGY4Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgYFVuZXhwZWN0ZWQ6IHJlY2VpdmVkIG5vbi1VaW50OEFycmF5L0FycmF5QnVmZmVyICgke1xuICAgICAgICAgIChieXRlcyBhcyBhbnkpLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgfSkgaW4gYSB3ZWIgcGxhdGZvcm0uIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZDogbmVpdGhlciBCdWZmZXIgbm9yIFRleHREZWNvZGVyIGFyZSBhdmFpbGFibGUgYXMgZ2xvYmFscy4gUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLmAsXG4gICAgKTtcbiAgfVxuXG4gIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyLmxlbmd0aCAmJiAhdGhpcy50cmFpbGluZ0NSKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBbdGhpcy5idWZmZXIuam9pbignJyldO1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy50cmFpbGluZ0NSID0gZmFsc2U7XG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG59XG5cbi8qKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBmdW5jdGlvbiB0aGF0J3MganVzdCB1c2VkIGZvciB0ZXN0aW5nICovXG5leHBvcnQgZnVuY3Rpb24gX2RlY29kZUNodW5rcyhjaHVua3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IExpbmVEZWNvZGVyKCk7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGxpbmVzLnB1c2goLi4uZGVjb2Rlci5kZWNvZGUoY2h1bmspKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gcGFydGl0aW9uKHN0cjogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSB7XG4gIGNvbnN0IGluZGV4ID0gc3RyLmluZGV4T2YoZGVsaW1pdGVyKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBpbmRleCksIGRlbGltaXRlciwgc3RyLnN1YnN0cmluZyhpbmRleCArIGRlbGltaXRlci5sZW5ndGgpXTtcbiAgfVxuXG4gIHJldHVybiBbc3RyLCAnJywgJyddO1xufVxuXG4vKipcbiAqIE1vc3QgYnJvd3NlcnMgZG9uJ3QgeWV0IGhhdmUgYXN5bmMgaXRlcmFibGUgc3VwcG9ydCBmb3IgUmVhZGFibGVTdHJlYW0sXG4gKiBhbmQgTm9kZSBoYXMgYSB2ZXJ5IGRpZmZlcmVudCB3YXkgb2YgcmVhZGluZyBieXRlcyBmcm9tIGl0cyBcIlJlYWRhYmxlU3RyZWFtXCIuXG4gKlxuICogVGhpcyBwb2x5ZmlsbCB3YXMgcHVsbGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01hdHRpYXNCdWVsZW5zL3dlYi1zdHJlYW1zLXBvbHlmaWxsL3B1bGwvMTIyI2lzc3VlY29tbWVudC0xNjI3MzU0NDkwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8VD4oc3RyZWFtOiBhbnkpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHN0cmVhbTtcblxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQ/LmRvbmUpIHJlYWRlci5yZWxlYXNlTG9jaygpOyAvLyByZWxlYXNlIGxvY2sgd2hlbiBzdHJlYW0gYmVjb21lcyBjbG9zZWRcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7IC8vIHJlbGVhc2UgbG9jayB3aGVuIHN0cmVhbSBiZWNvbWVzIGVycm9yZWRcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgIGNvbnN0IGNhbmNlbFByb21pc2UgPSByZWFkZXIuY2FuY2VsKCk7XG4gICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIGF3YWl0IGNhbmNlbFByb21pc2U7XG4gICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1EYXRhLFxuICBGaWxlLFxuICB0eXBlIEJsb2IsXG4gIHR5cGUgRmlsZVByb3BlcnR5QmFnLFxuICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyxcbiAgdHlwZSBGc1JlYWRTdHJlYW0sXG4gIGlzRnNSZWFkU3RyZWFtLFxufSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgeyBNdWx0aXBhcnRCb2R5IH0gZnJvbSAnLi9fc2hpbXMvTXVsdGlwYXJ0Qm9keSc7XG5leHBvcnQgeyBmaWxlRnJvbVBhdGggfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5cbnR5cGUgQmxvYkxpa2VQYXJ0ID0gc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iTGlrZSB8IFVpbnQ4QXJyYXkgfCBEYXRhVmlldztcbmV4cG9ydCB0eXBlIEJsb2JQYXJ0ID0gc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iIHwgVWludDhBcnJheSB8IERhdGFWaWV3O1xuXG4vKipcbiAqIFR5cGljYWxseSwgdGhpcyBpcyBhIG5hdGl2ZSBcIkZpbGVcIiBjbGFzcy5cbiAqXG4gKiBXZSBwcm92aWRlIHRoZSB7QGxpbmsgdG9GaWxlfSB1dGlsaXR5IHRvIGNvbnZlcnQgYSB2YXJpZXR5IG9mIG9iamVjdHNcbiAqIGludG8gdGhlIEZpbGUgY2xhc3MuXG4gKlxuICogRm9yIGNvbnZlbmllbmNlLCB5b3UgY2FuIGFsc28gcGFzcyBhIGZldGNoIFJlc3BvbnNlLCBvciBpbiBOb2RlLFxuICogdGhlIHJlc3VsdCBvZiBmcy5jcmVhdGVSZWFkU3RyZWFtKCkuXG4gKi9cbmV4cG9ydCB0eXBlIFVwbG9hZGFibGUgPSBGaWxlTGlrZSB8IFJlc3BvbnNlTGlrZSB8IEZzUmVhZFN0cmVhbTtcblxuLyoqXG4gKiBJbnRlbmRlZCB0byBtYXRjaCB3ZWIuQmxvYiwgbm9kZS5CbG9iLCBub2RlLWZldGNoLkJsb2IsIGV0Yy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCbG9iTGlrZSB7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2Ivc2l6ZSkgKi9cbiAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3R5cGUpICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi90ZXh0KSAqL1xuICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPjtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi9zbGljZSkgKi9cbiAgc2xpY2Uoc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcik6IEJsb2JMaWtlO1xuICAvLyB1bmZvcnR1bmF0ZWx5IEB0eXBlcy9ub2RlLWZldGNoQF4yLjYuNCBkb2Vzbid0IHR5cGUgdGhlIGFycmF5QnVmZmVyIG1ldGhvZFxufVxuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5GaWxlLCBub2RlLkZpbGUsIG5vZGUtZmV0Y2guRmlsZSwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaWtlIGV4dGVuZHMgQmxvYkxpa2Uge1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9GaWxlL2xhc3RNb2RpZmllZCkgKi9cbiAgcmVhZG9ubHkgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0ZpbGUvbmFtZSkgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5SZXNwb25zZSwgbm9kZS5SZXNwb25zZSwgbm9kZS1mZXRjaC5SZXNwb25zZSwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlTGlrZSB7XG4gIHVybDogc3RyaW5nO1xuICBibG9iKCk6IFByb21pc2U8QmxvYkxpa2U+O1xufVxuXG5leHBvcnQgY29uc3QgaXNSZXNwb25zZUxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFJlc3BvbnNlTGlrZSA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIHZhbHVlLnVybCA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLmJsb2IgPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc0ZpbGVMaWtlID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBGaWxlTGlrZSA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiB2YWx1ZS5sYXN0TW9kaWZpZWQgPT09ICdudW1iZXInICYmXG4gIGlzQmxvYkxpa2UodmFsdWUpO1xuXG4vKipcbiAqIFRoZSBCbG9iTGlrZSB0eXBlIG9taXRzIGFycmF5QnVmZmVyKCkgYmVjYXVzZSBAdHlwZXMvbm9kZS1mZXRjaEBeMi42LjQgbGFja3MgaXQ7IGJ1dCB0aGlzIGNoZWNrXG4gKiBhZGRzIHRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCB0eXBlIGJlY2F1c2UgaXQgaXMgYXZhaWxhYmxlIGFuZCB1c2VkIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQmxvYkxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEJsb2JMaWtlICYgeyBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB9ID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicgJiZcbiAgdHlwZW9mIHZhbHVlLnR5cGUgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiB2YWx1ZS50ZXh0ID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiB2YWx1ZS5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc1VwbG9hZGFibGUgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFVwbG9hZGFibGUgPT4ge1xuICByZXR1cm4gaXNGaWxlTGlrZSh2YWx1ZSkgfHwgaXNSZXNwb25zZUxpa2UodmFsdWUpIHx8IGlzRnNSZWFkU3RyZWFtKHZhbHVlKTtcbn07XG5cbmV4cG9ydCB0eXBlIFRvRmlsZUlucHV0ID0gVXBsb2FkYWJsZSB8IEV4Y2x1ZGU8QmxvYkxpa2VQYXJ0LCBzdHJpbmc+IHwgQXN5bmNJdGVyYWJsZTxCbG9iTGlrZVBhcnQ+O1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgRmlsZX0gdG8gcGFzcyB0byBhbiBTREsgdXBsb2FkIG1ldGhvZCBmcm9tIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgZGF0YSBmb3JtYXRzXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHJhdyBjb250ZW50IG9mIHRoZSBmaWxlLiAgQ2FuIGJlIGFuIHtAbGluayBVcGxvYWRhYmxlfSwge0BsaW5rIEJsb2JMaWtlUGFydH0sIG9yIHtAbGluayBBc3luY0l0ZXJhYmxlfSBvZiB7QGxpbmsgQmxvYkxpa2VQYXJ0fXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gSWYgb21pdHRlZCwgdG9GaWxlIHdpbGwgdHJ5IHRvIGRldGVybWluZSBhIGZpbGUgbmFtZSBmcm9tIGJpdHMgaWYgcG9zc2libGVcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0aW9ucy50eXBlIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGNvbnRlbnRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0aW9ucy5sYXN0TW9kaWZpZWQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wXG4gKiBAcmV0dXJucyBhIHtAbGluayBGaWxlfSB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ZpbGUoXG4gIHZhbHVlOiBUb0ZpbGVJbnB1dCB8IFByb21pc2VMaWtlPFRvRmlsZUlucHV0PixcbiAgbmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBGaWxlUHJvcGVydHlCYWcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEZpbGVMaWtlPiB7XG4gIC8vIElmIGl0J3MgYSBwcm9taXNlLCByZXNvbHZlIGl0LlxuICB2YWx1ZSA9IGF3YWl0IHZhbHVlO1xuXG4gIC8vIFVzZSB0aGUgZmlsZSdzIG9wdGlvbnMgaWYgdGhlcmUgaXNuJ3Qgb25lIHByb3ZpZGVkXG4gIG9wdGlvbnMgPz89IGlzRmlsZUxpa2UodmFsdWUpID8geyBsYXN0TW9kaWZpZWQ6IHZhbHVlLmxhc3RNb2RpZmllZCwgdHlwZTogdmFsdWUudHlwZSB9IDoge307XG5cbiAgaWYgKGlzUmVzcG9uc2VMaWtlKHZhbHVlKSkge1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB2YWx1ZS5ibG9iKCk7XG4gICAgbmFtZSB8fD0gbmV3IFVSTCh2YWx1ZS51cmwpLnBhdGhuYW1lLnNwbGl0KC9bXFxcXC9dLykucG9wKCkgPz8gJ3Vua25vd25fZmlsZSc7XG5cbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2IgYXMgYW55XSwgbmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBiaXRzID0gYXdhaXQgZ2V0Qnl0ZXModmFsdWUpO1xuXG4gIG5hbWUgfHw9IGdldE5hbWUodmFsdWUpID8/ICd1bmtub3duX2ZpbGUnO1xuXG4gIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgY29uc3QgdHlwZSA9IChiaXRzWzBdIGFzIGFueSk/LnR5cGU7XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgdHlwZSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgRmlsZShiaXRzLCBuYW1lLCBvcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Qnl0ZXModmFsdWU6IFRvRmlsZUlucHV0KTogUHJvbWlzZTxBcnJheTxCbG9iUGFydD4+IHtcbiAgbGV0IHBhcnRzOiBBcnJheTxCbG9iUGFydD4gPSBbXTtcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpIHx8IC8vIGluY2x1ZGVzIFVpbnQ4QXJyYXksIEJ1ZmZlciwgZXRjLlxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJcbiAgKSB7XG4gICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZSh2YWx1ZSkpIHtcbiAgICBwYXJ0cy5wdXNoKGF3YWl0IHZhbHVlLmFycmF5QnVmZmVyKCkpO1xuICB9IGVsc2UgaWYgKFxuICAgIGlzQXN5bmNJdGVyYWJsZUl0ZXJhdG9yKHZhbHVlKSAvLyBpbmNsdWRlcyBSZWFkYWJsZSwgUmVhZGFibGVTdHJlYW0sIGV0Yy5cbiAgKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB2YWx1ZSkge1xuICAgICAgcGFydHMucHVzaChjaHVuayBhcyBCbG9iUGFydCk7IC8vIFRPRE8sIGNvbnNpZGVyIHZhbGlkYXRpbmc/XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkIGRhdGEgdHlwZTogJHt0eXBlb2YgdmFsdWV9OyBjb25zdHJ1Y3RvcjogJHt2YWx1ZT8uY29uc3RydWN0b3JcbiAgICAgICAgPy5uYW1lfTsgcHJvcHM6ICR7cHJvcHNGb3JFcnJvcih2YWx1ZSl9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG5mdW5jdGlvbiBwcm9wc0ZvckVycm9yKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgcmV0dXJuIGBbJHtwcm9wcy5tYXAoKHApID0+IGBcIiR7cH1cImApLmpvaW4oJywgJyl9XWA7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWUodmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoXG4gICAgZ2V0U3RyaW5nRnJvbU1heWJlQnVmZmVyKHZhbHVlLm5hbWUpIHx8XG4gICAgZ2V0U3RyaW5nRnJvbU1heWJlQnVmZmVyKHZhbHVlLmZpbGVuYW1lKSB8fFxuICAgIC8vIEZvciBmcy5SZWFkU3RyZWFtXG4gICAgZ2V0U3RyaW5nRnJvbU1heWJlQnVmZmVyKHZhbHVlLnBhdGgpPy5zcGxpdCgvW1xcXFwvXS8pLnBvcCgpXG4gICk7XG59XG5cbmNvbnN0IGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlciA9ICh4OiBzdHJpbmcgfCBCdWZmZXIgfCB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykgcmV0dXJuIHg7XG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgQnVmZmVyKSByZXR1cm4gU3RyaW5nKHgpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgaXNBc3luY0l0ZXJhYmxlSXRlcmF0b3IgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEFzeW5jSXRlcmFibGVJdGVyYXRvcjx1bmtub3duPiA9PlxuICB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGlzTXVsdGlwYXJ0Qm9keSA9IChib2R5OiBhbnkpOiBib2R5IGlzIE11bHRpcGFydEJvZHkgPT5cbiAgYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiYgYm9keS5ib2R5ICYmIGJvZHlbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ011bHRpcGFydEJvZHknO1xuXG4vKipcbiAqIFJldHVybnMgYSBtdWx0aXBhcnQvZm9ybS1kYXRhIHJlcXVlc3QgaWYgYW55IHBhcnQgb2YgdGhlIGdpdmVuIHJlcXVlc3QgYm9keSBjb250YWlucyBhIEZpbGUgLyBCbG9iIHZhbHVlLlxuICogT3RoZXJ3aXNlIHJldHVybnMgdGhlIHJlcXVlc3QgYXMgaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXliZU11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyA9IGFzeW5jIDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbik6IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VCB8IE11bHRpcGFydEJvZHk+PiA9PiB7XG4gIGlmICghaGFzVXBsb2FkYWJsZVZhbHVlKG9wdHMuYm9keSkpIHJldHVybiBvcHRzO1xuXG4gIGNvbnN0IGZvcm0gPSBhd2FpdCBjcmVhdGVGb3JtKG9wdHMuYm9keSk7XG4gIHJldHVybiBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyhmb3JtLCBvcHRzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgPSBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4pOiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQgfCBNdWx0aXBhcnRCb2R5Pj4gPT4ge1xuICBjb25zdCBmb3JtID0gYXdhaXQgY3JlYXRlRm9ybShvcHRzLmJvZHkpO1xuICByZXR1cm4gZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMoZm9ybSwgb3B0cyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRm9ybSA9IGFzeW5jIDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGJvZHk6IFQgfCB1bmRlZmluZWQpOiBQcm9taXNlPEZvcm1EYXRhPiA9PiB7XG4gIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoYm9keSB8fCB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+IGFkZEZvcm1WYWx1ZShmb3JtLCBrZXksIHZhbHVlKSkpO1xuICByZXR1cm4gZm9ybTtcbn07XG5cbmNvbnN0IGhhc1VwbG9hZGFibGVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAoaXNVcGxvYWRhYmxlKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLnNvbWUoaGFzVXBsb2FkYWJsZVZhbHVlKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICAgIGlmIChoYXNVcGxvYWRhYmxlVmFsdWUoKHZhbHVlIGFzIGFueSlba10pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgYWRkRm9ybVZhbHVlID0gYXN5bmMgKGZvcm06IEZvcm1EYXRhLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYFJlY2VpdmVkIG51bGwgZm9yIFwiJHtrZXl9XCI7IHRvIHBhc3MgbnVsbCBpbiBGb3JtRGF0YSwgeW91IG11c3QgdXNlIHRoZSBzdHJpbmcgJ251bGwnYCxcbiAgICApO1xuICB9XG5cbiAgLy8gVE9ETzogbWFrZSBuZXN0ZWQgZm9ybWF0cyBjb25maWd1cmFibGVcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIGZvcm0uYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gIH0gZWxzZSBpZiAoaXNVcGxvYWRhYmxlKHZhbHVlKSkge1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0b0ZpbGUodmFsdWUpO1xuICAgIGZvcm0uYXBwZW5kKGtleSwgZmlsZSBhcyBGaWxlKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHZhbHVlLm1hcCgoZW50cnkpID0+IGFkZEZvcm1WYWx1ZShmb3JtLCBrZXkgKyAnW10nLCBlbnRyeSkpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkubWFwKChbbmFtZSwgcHJvcF0pID0+IGFkZEZvcm1WYWx1ZShmb3JtLCBgJHtrZXl9WyR7bmFtZX1dYCwgcHJvcCkpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBJbnZhbGlkIHZhbHVlIGdpdmVuIHRvIGZvcm0sIGV4cGVjdGVkIGEgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9iamVjdCwgQXJyYXksIEZpbGUgb3IgQmxvYiBidXQgZ290ICR7dmFsdWV9IGluc3RlYWRgLFxuICAgICk7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tICcuL3N0cmVhbWluZyc7XG5pbXBvcnQge1xuICBPcGVuQUlFcnJvcixcbiAgQVBJRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25FcnJvcixcbiAgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcixcbiAgQVBJVXNlckFib3J0RXJyb3IsXG59IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHtcbiAga2luZCBhcyBzaGltc0tpbmQsXG4gIHR5cGUgUmVhZGFibGUsXG4gIGdldERlZmF1bHRBZ2VudCxcbiAgdHlwZSBBZ2VudCxcbiAgZmV0Y2gsXG4gIHR5cGUgUmVxdWVzdEluZm8sXG4gIHR5cGUgUmVxdWVzdEluaXQsXG4gIHR5cGUgUmVzcG9uc2UsXG4gIHR5cGUgSGVhZGVyc0luaXQsXG59IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmV4cG9ydCB7IHR5cGUgUmVzcG9uc2UgfTtcbmltcG9ydCB7IGlzTXVsdGlwYXJ0Qm9keSB9IGZyb20gJy4vdXBsb2Fkcyc7XG5leHBvcnQge1xuICBtYXliZU11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyxcbiAgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zLFxuICBjcmVhdGVGb3JtLFxuICB0eXBlIFVwbG9hZGFibGUsXG59IGZyb20gJy4vdXBsb2Fkcyc7XG5cbmV4cG9ydCB0eXBlIEZldGNoID0gKHVybDogUmVxdWVzdEluZm8sIGluaXQ/OiBSZXF1ZXN0SW5pdCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbnR5cGUgUHJvbWlzZU9yVmFsdWU8VD4gPSBUIHwgUHJvbWlzZTxUPjtcblxudHlwZSBBUElSZXNwb25zZVByb3BzID0ge1xuICByZXNwb25zZTogUmVzcG9uc2U7XG4gIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRQYXJzZVJlc3BvbnNlPFQ+KHByb3BzOiBBUElSZXNwb25zZVByb3BzKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgcmVzcG9uc2UgfSA9IHByb3BzO1xuICBpZiAocHJvcHMub3B0aW9ucy5zdHJlYW0pIHtcbiAgICBkZWJ1ZygncmVzcG9uc2UnLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnVybCwgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuYm9keSk7XG5cbiAgICAvLyBOb3RlOiB0aGVyZSBpcyBhbiBpbnZhcmlhbnQgaGVyZSB0aGF0IGlzbid0IHJlcHJlc2VudGVkIGluIHRoZSB0eXBlIHN5c3RlbVxuICAgIC8vIHRoYXQgaWYgeW91IHNldCBgc3RyZWFtOiB0cnVlYCB0aGUgcmVzcG9uc2UgdHlwZSBtdXN0IGFsc28gYmUgYFN0cmVhbTxUPmBcblxuICAgIGlmIChwcm9wcy5vcHRpb25zLl9fc3RyZWFtQ2xhc3MpIHtcbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25zLl9fc3RyZWFtQ2xhc3MuZnJvbVNTRVJlc3BvbnNlKHJlc3BvbnNlLCBwcm9wcy5jb250cm9sbGVyKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmVhbS5mcm9tU1NFUmVzcG9uc2UocmVzcG9uc2UsIHByb3BzLmNvbnRyb2xsZXIpIGFzIGFueTtcbiAgfVxuXG4gIC8vIGZldGNoIHJlZnVzZXMgdG8gcmVhZCB0aGUgYm9keSB3aGVuIHRoZSBzdGF0dXMgY29kZSBpcyAyMDQuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgIHJldHVybiBudWxsIGFzIFQ7XG4gIH1cblxuICBpZiAocHJvcHMub3B0aW9ucy5fX2JpbmFyeVJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICBjb25zdCBpc0pTT04gPVxuICAgIGNvbnRlbnRUeXBlPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpIHx8IGNvbnRlbnRUeXBlPy5pbmNsdWRlcygnYXBwbGljYXRpb24vdm5kLmFwaStqc29uJyk7XG4gIGlmIChpc0pTT04pIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgZGVidWcoJ3Jlc3BvbnNlJywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS51cmwsIHJlc3BvbnNlLmhlYWRlcnMsIGpzb24pO1xuXG4gICAgcmV0dXJuIGpzb24gYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGRlYnVnKCdyZXNwb25zZScsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UudXJsLCByZXNwb25zZS5oZWFkZXJzLCB0ZXh0KTtcblxuICAvLyBUT0RPIGhhbmRsZSBibG9iLCBhcnJheWJ1ZmZlciwgb3RoZXIgY29udGVudCB0eXBlcywgZXRjLlxuICByZXR1cm4gdGV4dCBhcyB1bmtub3duIGFzIFQ7XG59XG5cbi8qKlxuICogQSBzdWJjbGFzcyBvZiBgUHJvbWlzZWAgcHJvdmlkaW5nIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHNcbiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBTREsuXG4gKi9cbmV4cG9ydCBjbGFzcyBBUElQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiB7XG4gIHByaXZhdGUgcGFyc2VkUHJvbWlzZTogUHJvbWlzZTxUPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc3BvbnNlUHJvbWlzZTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPixcbiAgICBwcml2YXRlIHBhcnNlUmVzcG9uc2U6IChwcm9wczogQVBJUmVzcG9uc2VQcm9wcykgPT4gUHJvbWlzZU9yVmFsdWU8VD4gPSBkZWZhdWx0UGFyc2VSZXNwb25zZSxcbiAgKSB7XG4gICAgc3VwZXIoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIHRoaXMgaXMgbWF5YmUgYSBiaXQgd2VpcmQgYnV0IHRoaXMgaGFzIHRvIGJlIGEgbm8tb3AgdG8gbm90IGltcGxpY2l0bHlcbiAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZSBib2R5OyBpbnN0ZWFkIC50aGVuLCAuY2F0Y2gsIC5maW5hbGx5IGFyZSBvdmVycmlkZGVuXG4gICAgICAvLyB0byBwYXJzZSB0aGUgcmVzcG9uc2VcbiAgICAgIHJlc29sdmUobnVsbCBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgX3RoZW5VbndyYXA8VT4odHJhbnNmb3JtOiAoZGF0YTogVCkgPT4gVSk6IEFQSVByb21pc2U8VT4ge1xuICAgIHJldHVybiBuZXcgQVBJUHJvbWlzZSh0aGlzLnJlc3BvbnNlUHJvbWlzZSwgYXN5bmMgKHByb3BzKSA9PiB0cmFuc2Zvcm0oYXdhaXQgdGhpcy5wYXJzZVJlc3BvbnNlKHByb3BzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlIGluc3RlYWQgb2YgcGFyc2luZyB0aGUgcmVzcG9uc2VcbiAgICogZGF0YS5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIGJvZHkgYnV0IHN0aWxsIGdldCB0aGUgYFJlc3BvbnNlYFxuICAgKiBpbnN0YW5jZSwgeW91IGNhbiB1c2Uge0BsaW5rIHdpdGhSZXNwb25zZSgpfS5cbiAgICpcbiAgICogXHVEODNEXHVEQzRCIEdldHRpbmcgdGhlIHdyb25nIFR5cGVTY3JpcHQgdHlwZSBmb3IgYFJlc3BvbnNlYD9cbiAgICogVHJ5IHNldHRpbmcgYFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIk5vZGVOZXh0XCJgIGlmIHlvdSBjYW4sXG4gICAqIG9yIGFkZCBvbmUgb2YgdGhlc2UgaW1wb3J0cyBiZWZvcmUgeW91ciBmaXJzdCBgaW1wb3J0IFx1MjAyNiBmcm9tICdvcGVuYWknYDpcbiAgICogLSBgaW1wb3J0ICdvcGVuYWkvc2hpbXMvbm9kZSdgIChpZiB5b3UncmUgcnVubmluZyBvbiBOb2RlKVxuICAgKiAtIGBpbXBvcnQgJ29wZW5haS9zaGltcy93ZWInYCAob3RoZXJ3aXNlKVxuICAgKi9cbiAgYXNSZXNwb25zZSgpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VQcm9taXNlLnRoZW4oKHApID0+IHAucmVzcG9uc2UpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgcmVzcG9uc2UgZGF0YSBhbmQgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlLlxuICAgKlxuICAgKiBJZiB5b3UganVzdCB3YW50IHRvIGdldCB0aGUgcmF3IGBSZXNwb25zZWAgaW5zdGFuY2Ugd2l0aG91dCBwYXJzaW5nIGl0LFxuICAgKiB5b3UgY2FuIHVzZSB7QGxpbmsgYXNSZXNwb25zZSgpfS5cbiAgICpcbiAgICpcbiAgICogXHVEODNEXHVEQzRCIEdldHRpbmcgdGhlIHdyb25nIFR5cGVTY3JpcHQgdHlwZSBmb3IgYFJlc3BvbnNlYD9cbiAgICogVHJ5IHNldHRpbmcgYFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIk5vZGVOZXh0XCJgIGlmIHlvdSBjYW4sXG4gICAqIG9yIGFkZCBvbmUgb2YgdGhlc2UgaW1wb3J0cyBiZWZvcmUgeW91ciBmaXJzdCBgaW1wb3J0IFx1MjAyNiBmcm9tICdvcGVuYWknYDpcbiAgICogLSBgaW1wb3J0ICdvcGVuYWkvc2hpbXMvbm9kZSdgIChpZiB5b3UncmUgcnVubmluZyBvbiBOb2RlKVxuICAgKiAtIGBpbXBvcnQgJ29wZW5haS9zaGltcy93ZWInYCAob3RoZXJ3aXNlKVxuICAgKi9cbiAgYXN5bmMgd2l0aFJlc3BvbnNlKCk6IFByb21pc2U8eyBkYXRhOiBUOyByZXNwb25zZTogUmVzcG9uc2UgfT4ge1xuICAgIGNvbnN0IFtkYXRhLCByZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wYXJzZSgpLCB0aGlzLmFzUmVzcG9uc2UoKV0pO1xuICAgIHJldHVybiB7IGRhdGEsIHJlc3BvbnNlIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlKCk6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5wYXJzZWRQcm9taXNlKSB7XG4gICAgICB0aGlzLnBhcnNlZFByb21pc2UgPSB0aGlzLnJlc3BvbnNlUHJvbWlzZS50aGVuKHRoaXMucGFyc2VSZXNwb25zZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlZFByb21pc2U7XG4gIH1cblxuICBvdmVycmlkZSB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdCB8IFByb21pc2VMaWtlPFRSZXN1bHQ+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICk6IFByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFQSUNsaWVudCB7XG4gIGJhc2VVUkw6IHN0cmluZztcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGh0dHBBZ2VudDogQWdlbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBmZXRjaDogRmV0Y2g7XG4gIHByb3RlY3RlZCBpZGVtcG90ZW5jeUhlYWRlcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVSTCxcbiAgICBtYXhSZXRyaWVzID0gMixcbiAgICB0aW1lb3V0ID0gNjAwMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgaHR0cEFnZW50LFxuICAgIGZldGNoOiBvdmVycmlkZW5GZXRjaCxcbiAgfToge1xuICAgIGJhc2VVUkw6IHN0cmluZztcbiAgICBtYXhSZXRyaWVzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIHRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBodHRwQWdlbnQ6IEFnZW50IHwgdW5kZWZpbmVkO1xuICAgIGZldGNoOiBGZXRjaCB8IHVuZGVmaW5lZDtcbiAgfSkge1xuICAgIHRoaXMuYmFzZVVSTCA9IGJhc2VVUkw7XG4gICAgdGhpcy5tYXhSZXRyaWVzID0gdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ21heFJldHJpZXMnLCBtYXhSZXRyaWVzKTtcbiAgICB0aGlzLnRpbWVvdXQgPSB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcigndGltZW91dCcsIHRpbWVvdXQpO1xuICAgIHRoaXMuaHR0cEFnZW50ID0gaHR0cEFnZW50O1xuXG4gICAgdGhpcy5mZXRjaCA9IG92ZXJyaWRlbkZldGNoID8/IGZldGNoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF1dGhIZWFkZXJzKG9wdHM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBIZWFkZXJzIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhpcyB0byBhZGQgeW91ciBvd24gZGVmYXVsdCBoZWFkZXJzLCBmb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHtcbiAgICogICAgLi4uc3VwZXIuZGVmYXVsdEhlYWRlcnMoKSxcbiAgICogICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAxMjMnLFxuICAgKiAgfVxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRIZWFkZXJzKG9wdHM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBIZWFkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ1VzZXItQWdlbnQnOiB0aGlzLmdldFVzZXJBZ2VudCgpLFxuICAgICAgLi4uZ2V0UGxhdGZvcm1IZWFkZXJzKCksXG4gICAgICAuLi50aGlzLmF1dGhIZWFkZXJzKG9wdHMpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGVmYXVsdFF1ZXJ5KCk6IERlZmF1bHRRdWVyeSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhpcyB0byBhZGQgeW91ciBvd24gaGVhZGVycyB2YWxpZGF0aW9uOlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlSGVhZGVycyhoZWFkZXJzOiBIZWFkZXJzLCBjdXN0b21IZWFkZXJzOiBIZWFkZXJzKSB7fVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0SWRlbXBvdGVuY3lLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHN0YWlubGVzcy1ub2RlLXJldHJ5LSR7dXVpZDQoKX1gO1xuICB9XG5cbiAgZ2V0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgnZ2V0JywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwb3N0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncG9zdCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcGF0Y2g8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdwYXRjaCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcHV0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncHV0JywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBkZWxldGU8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdkZWxldGUnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0aG9kUmVxdWVzdDxSZXEsIFJzcD4oXG4gICAgbWV0aG9kOiBIVFRQTWV0aG9kLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4sXG4gICk6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChQcm9taXNlLnJlc29sdmUob3B0cykudGhlbigob3B0cykgPT4gKHsgbWV0aG9kLCBwYXRoLCAuLi5vcHRzIH0pKSk7XG4gIH1cblxuICBnZXRBUElMaXN0PEl0ZW0sIFBhZ2VDbGFzcyBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPiA9IEFic3RyYWN0UGFnZTxJdGVtPj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFBhZ2VDbGFzcyxcbiAgICBvcHRzPzogUmVxdWVzdE9wdGlvbnM8YW55PixcbiAgKTogUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEFQSUxpc3QoUGFnZSwgeyBtZXRob2Q6ICdnZXQnLCBwYXRoLCAuLi5vcHRzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50TGVuZ3RoKGJvZHk6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHksICd1dGY4JykudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2Rlci5lbmNvZGUoYm9keSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkLmxlbmd0aC50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYnVpbGRSZXF1ZXN0PFJlcT4ob3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9uczxSZXE+KTogeyByZXE6IFJlcXVlc3RJbml0OyB1cmw6IHN0cmluZzsgdGltZW91dDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoLCBxdWVyeSwgaGVhZGVyczogaGVhZGVycyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYm9keSA9XG4gICAgICBpc011bHRpcGFydEJvZHkob3B0aW9ucy5ib2R5KSA/IG9wdGlvbnMuYm9keS5ib2R5XG4gICAgICA6IG9wdGlvbnMuYm9keSA/IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSwgbnVsbCwgMilcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gdGhpcy5jYWxjdWxhdGVDb250ZW50TGVuZ3RoKGJvZHkpO1xuXG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZFVSTChwYXRoISwgcXVlcnkpO1xuICAgIGlmICgndGltZW91dCcgaW4gb3B0aW9ucykgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ3RpbWVvdXQnLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy50aW1lb3V0O1xuICAgIGNvbnN0IGh0dHBBZ2VudCA9IG9wdGlvbnMuaHR0cEFnZW50ID8/IHRoaXMuaHR0cEFnZW50ID8/IGdldERlZmF1bHRBZ2VudCh1cmwpO1xuICAgIGNvbnN0IG1pbkFnZW50VGltZW91dCA9IHRpbWVvdXQgKyAxMDAwO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiAoaHR0cEFnZW50IGFzIGFueSk/Lm9wdGlvbnM/LnRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICBtaW5BZ2VudFRpbWVvdXQgPiAoKGh0dHBBZ2VudCBhcyBhbnkpLm9wdGlvbnMudGltZW91dCA/PyAwKVxuICAgICkge1xuICAgICAgLy8gQWxsb3cgYW55IGdpdmVuIHJlcXVlc3QgdG8gYnVtcCBvdXIgYWdlbnQgYWN0aXZlIHNvY2tldCB0aW1lb3V0LlxuICAgICAgLy8gVGhpcyBtYXkgc2VlbSBzdHJhbmdlLCBidXQgbGVha2luZyBhY3RpdmUgc29ja2V0cyBzaG91bGQgYmUgcmFyZSBhbmQgbm90IHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyxcbiAgICAgIC8vIGFuZCB3aXRob3V0IG11dGF0aW5nIGFnZW50IHdlIHdvdWxkIG5lZWQgdG8gY3JlYXRlIG1vcmUgb2YgdGhlbS5cbiAgICAgIC8vIFRoaXMgdHJhZGVvZmYgb3B0aW1pemVzIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgIChodHRwQWdlbnQgYXMgYW55KS5vcHRpb25zLnRpbWVvdXQgPSBtaW5BZ2VudFRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWRlbXBvdGVuY3lIZWFkZXIgJiYgbWV0aG9kICE9PSAnZ2V0Jykge1xuICAgICAgaWYgKCFvcHRpb25zLmlkZW1wb3RlbmN5S2V5KSBvcHRpb25zLmlkZW1wb3RlbmN5S2V5ID0gdGhpcy5kZWZhdWx0SWRlbXBvdGVuY3lLZXkoKTtcbiAgICAgIGhlYWRlcnNbdGhpcy5pZGVtcG90ZW5jeUhlYWRlcl0gPSBvcHRpb25zLmlkZW1wb3RlbmN5S2V5O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUhlYWRlcnMgPSB0aGlzLmJ1aWxkSGVhZGVycyh7IG9wdGlvbnMsIGhlYWRlcnMsIGNvbnRlbnRMZW5ndGggfSk7XG5cbiAgICBjb25zdCByZXE6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgLi4uKGJvZHkgJiYgeyBib2R5OiBib2R5IGFzIGFueSB9KSxcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcnMsXG4gICAgICAuLi4oaHR0cEFnZW50ICYmIHsgYWdlbnQ6IGh0dHBBZ2VudCB9KSxcbiAgICAgIC8vIEB0cy1pZ25vcmUgbm9kZS1mZXRjaCB1c2VzIGEgY3VzdG9tIEFib3J0U2lnbmFsIHR5cGUgdGhhdCBpc1xuICAgICAgLy8gbm90IGNvbXBhdGlibGUgd2l0aCBzdGFuZGFyZCB3ZWIgdHlwZXNcbiAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgPz8gbnVsbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgcmVxLCB1cmwsIHRpbWVvdXQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzKHtcbiAgICBvcHRpb25zLFxuICAgIGhlYWRlcnMsXG4gICAgY29udGVudExlbmd0aCxcbiAgfToge1xuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD47XG4gICAgY29udGVudExlbmd0aDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJlcUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoY29udGVudExlbmd0aCkge1xuICAgICAgcmVxSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGNvbnRlbnRMZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzKG9wdGlvbnMpO1xuICAgIGFwcGx5SGVhZGVyc011dChyZXFIZWFkZXJzLCBkZWZhdWx0SGVhZGVycyk7XG4gICAgYXBwbHlIZWFkZXJzTXV0KHJlcUhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gbGV0IGJ1aWx0aW4gZmV0Y2ggc2V0IHRoZSBDb250ZW50LVR5cGUgZm9yIG11bHRpcGFydCBib2RpZXNcbiAgICBpZiAoaXNNdWx0aXBhcnRCb2R5KG9wdGlvbnMuYm9keSkgJiYgc2hpbXNLaW5kICE9PSAnbm9kZScpIHtcbiAgICAgIGRlbGV0ZSByZXFIZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlSGVhZGVycyhyZXFIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIHJldHVybiByZXFIZWFkZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYXMgYSBjYWxsYmFjayBmb3IgbXV0YXRpbmcgdGhlIGdpdmVuIGBGaW5hbFJlcXVlc3RPcHRpb25zYCBvYmplY3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZU9wdGlvbnMob3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKipcbiAgICogVXNlZCBhcyBhIGNhbGxiYWNrIGZvciBtdXRhdGluZyB0aGUgZ2l2ZW4gYFJlcXVlc3RJbml0YCBvYmplY3QuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBhZGQgY2VydGFpbiBoZWFkZXJzIGJhc2VkIG9mZiBvZlxuICAgKiB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLCBlLmcuIGBtZXRob2RgIG9yIGB1cmxgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbml0LFxuICAgIHsgdXJsLCBvcHRpb25zIH06IHsgdXJsOiBzdHJpbmc7IG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIHByb3RlY3RlZCBwYXJzZUhlYWRlcnMoaGVhZGVyczogSGVhZGVyc0luaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIChcbiAgICAgICFoZWFkZXJzID8ge31cbiAgICAgIDogU3ltYm9sLml0ZXJhdG9yIGluIGhlYWRlcnMgP1xuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShoZWFkZXJzIGFzIEl0ZXJhYmxlPHN0cmluZ1tdPikubWFwKChoZWFkZXIpID0+IFsuLi5oZWFkZXJdKSlcbiAgICAgIDogeyAuLi5oZWFkZXJzIH1cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1ha2VTdGF0dXNFcnJvcihcbiAgICBzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogT2JqZWN0IHwgdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gQVBJRXJyb3IuZ2VuZXJhdGUoc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gIH1cblxuICByZXF1ZXN0PFJlcSwgUnNwPihcbiAgICBvcHRpb25zOiBQcm9taXNlT3JWYWx1ZTxGaW5hbFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICAgIHJlbWFpbmluZ1JldHJpZXM6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICApOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiBuZXcgQVBJUHJvbWlzZSh0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIHJlbWFpbmluZ1JldHJpZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJlcXVlc3Q8UmVxPihcbiAgICBvcHRpb25zSW5wdXQ6IFByb21pc2VPclZhbHVlPEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxPj4sXG4gICAgcmV0cmllc1JlbWFpbmluZzogbnVtYmVyIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IG9wdGlvbnNJbnB1dDtcbiAgICBpZiAocmV0cmllc1JlbWFpbmluZyA9PSBudWxsKSB7XG4gICAgICByZXRyaWVzUmVtYWluaW5nID0gb3B0aW9ucy5tYXhSZXRyaWVzID8/IHRoaXMubWF4UmV0cmllcztcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyByZXEsIHVybCwgdGltZW91dCB9ID0gdGhpcy5idWlsZFJlcXVlc3Qob3B0aW9ucyk7XG5cbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZXF1ZXN0KHJlcSwgeyB1cmwsIG9wdGlvbnMgfSk7XG5cbiAgICBkZWJ1ZygncmVxdWVzdCcsIHVybCwgb3B0aW9ucywgcmVxLmhlYWRlcnMpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaFdpdGhUaW1lb3V0KHVybCwgcmVxLCB0aW1lb3V0LCBjb250cm9sbGVyKS5jYXRjaChjYXN0VG9FcnJvcik7XG5cbiAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKHJldHJpZXNSZW1haW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFQSUNvbm5lY3Rpb25FcnJvcih7IGNhdXNlOiByZXNwb25zZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBjcmVhdGVSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmV0cmllc1JlbWFpbmluZyAmJiB0aGlzLnNob3VsZFJldHJ5KHJlc3BvbnNlKSkge1xuICAgICAgICBjb25zdCByZXRyeU1lc3NhZ2UgPSBgcmV0cnlpbmcsICR7cmV0cmllc1JlbWFpbmluZ30gYXR0ZW1wdHMgcmVtYWluaW5nYDtcbiAgICAgICAgZGVidWcoYHJlc3BvbnNlIChlcnJvcjsgJHtyZXRyeU1lc3NhZ2V9KWAsIHJlc3BvbnNlLnN0YXR1cywgdXJsLCByZXNwb25zZUhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXRyeVJlcXVlc3Qob3B0aW9ucywgcmV0cmllc1JlbWFpbmluZywgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoZSkgPT4gY2FzdFRvRXJyb3IoZSkubWVzc2FnZSk7XG4gICAgICBjb25zdCBlcnJKU09OID0gc2FmZUpTT04oZXJyVGV4dCk7XG4gICAgICBjb25zdCBlcnJNZXNzYWdlID0gZXJySlNPTiA/IHVuZGVmaW5lZCA6IGVyclRleHQ7XG4gICAgICBjb25zdCByZXRyeU1lc3NhZ2UgPSByZXRyaWVzUmVtYWluaW5nID8gYChlcnJvcjsgbm8gbW9yZSByZXRyaWVzIGxlZnQpYCA6IGAoZXJyb3I7IG5vdCByZXRyeWFibGUpYDtcblxuICAgICAgZGVidWcoYHJlc3BvbnNlIChlcnJvcjsgJHtyZXRyeU1lc3NhZ2V9KWAsIHJlc3BvbnNlLnN0YXR1cywgdXJsLCByZXNwb25zZUhlYWRlcnMsIGVyck1lc3NhZ2UpO1xuXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLm1ha2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIGVyckpTT04sIGVyck1lc3NhZ2UsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2UsIG9wdGlvbnMsIGNvbnRyb2xsZXIgfTtcbiAgfVxuXG4gIHJlcXVlc3RBUElMaXN0PEl0ZW0gPSB1bmtub3duLCBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4gPSBBYnN0cmFjdFBhZ2U8SXRlbT4+KFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBBYnN0cmFjdFBhZ2U+KSA9PiBQYWdlQ2xhc3MsXG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubWFrZVJlcXVlc3Qob3B0aW9ucywgbnVsbCk7XG4gICAgcmV0dXJuIG5ldyBQYWdlUHJvbWlzZTxQYWdlQ2xhc3MsIEl0ZW0+KHRoaXMsIHJlcXVlc3QsIFBhZ2UpO1xuICB9XG5cbiAgYnVpbGRVUkw8UmVxPihwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBSZXEgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgaXNBYnNvbHV0ZVVSTChwYXRoKSA/XG4gICAgICAgIG5ldyBVUkwocGF0aClcbiAgICAgIDogbmV3IFVSTCh0aGlzLmJhc2VVUkwgKyAodGhpcy5iYXNlVVJMLmVuZHNXaXRoKCcvJykgJiYgcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aCkpO1xuXG4gICAgY29uc3QgZGVmYXVsdFF1ZXJ5ID0gdGhpcy5kZWZhdWx0UXVlcnkoKTtcbiAgICBpZiAoIWlzRW1wdHlPYmooZGVmYXVsdFF1ZXJ5KSkge1xuICAgICAgcXVlcnkgPSB7IC4uLmRlZmF1bHRRdWVyeSwgLi4ucXVlcnkgfSBhcyBSZXE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcgJiYgcXVlcnkgJiYgIUFycmF5LmlzQXJyYXkocXVlcnkpKSB7XG4gICAgICB1cmwuc2VhcmNoID0gdGhpcy5zdHJpbmdpZnlRdWVyeShxdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0cmluZ2lmeVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgICAgLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAgIGBDYW5ub3Qgc3RyaW5naWZ5IHR5cGUgJHt0eXBlb2YgdmFsdWV9OyBFeHBlY3RlZCBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgb3IgbnVsbC4gSWYgeW91IG5lZWQgdG8gcGFzcyBuZXN0ZWQgcXVlcnkgcGFyYW1ldGVycywgeW91IGNhbiBtYW51YWxseSBlbmNvZGUgdGhlbSwgZS5nLiB7IHF1ZXJ5OiB7ICdmb29ba2V5MV0nOiB2YWx1ZTEsICdmb29ba2V5Ml0nOiB2YWx1ZTIgfSB9LCBhbmQgcGxlYXNlIG9wZW4gYSBHaXRIdWIgaXNzdWUgcmVxdWVzdGluZyBiZXR0ZXIgc3VwcG9ydCBmb3IgeW91ciB1c2UgY2FzZS5gLFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcmJyk7XG4gIH1cblxuICBhc3luYyBmZXRjaFdpdGhUaW1lb3V0KFxuICAgIHVybDogUmVxdWVzdEluZm8sXG4gICAgaW5pdDogUmVxdWVzdEluaXQgfCB1bmRlZmluZWQsXG4gICAgbXM6IG51bWJlcixcbiAgICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHNpZ25hbCwgLi4ub3B0aW9ucyB9ID0gaW5pdCB8fCB7fTtcbiAgICBpZiAoc2lnbmFsKSBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBtcyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nZXRSZXF1ZXN0Q2xpZW50KClcbiAgICAgICAgLy8gdXNlIHVuZGVmaW5lZCB0aGlzIGJpbmRpbmc7IGZldGNoIGVycm9ycyBpZiBib3VuZCB0byBzb21ldGhpbmcgZWxzZSBpbiBicm93c2VyL2Nsb3VkZmxhcmVcbiAgICAgICAgLmZldGNoLmNhbGwodW5kZWZpbmVkLCB1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCBhcyBhbnksIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlcXVlc3RDbGllbnQoKTogUmVxdWVzdENsaWVudCB7XG4gICAgcmV0dXJuIHsgZmV0Y2g6IHRoaXMuZmV0Y2ggfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkocmVzcG9uc2U6IFJlc3BvbnNlKTogYm9vbGVhbiB7XG4gICAgLy8gTm90ZSB0aGlzIGlzIG5vdCBhIHN0YW5kYXJkIGhlYWRlci5cbiAgICBjb25zdCBzaG91bGRSZXRyeUhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXNob3VsZC1yZXRyeScpO1xuXG4gICAgLy8gSWYgdGhlIHNlcnZlciBleHBsaWNpdGx5IHNheXMgd2hldGhlciBvciBub3QgdG8gcmV0cnksIG9iZXkuXG4gICAgaWYgKHNob3VsZFJldHJ5SGVhZGVyID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgIGlmIChzaG91bGRSZXRyeUhlYWRlciA9PT0gJ2ZhbHNlJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmV0cnkgb24gcmVxdWVzdCB0aW1lb3V0cy5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDgpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gUmV0cnkgb24gbG9jayB0aW1lb3V0cy5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gUmV0cnkgb24gcmF0ZSBsaW1pdHMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJldHJ5IGludGVybmFsIGVycm9ycy5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDUwMCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJldHJ5UmVxdWVzdChcbiAgICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zLFxuICAgIHJldHJpZXNSZW1haW5pbmc6IG51bWJlcixcbiAgICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFQSVJlc3BvbnNlUHJvcHM+IHtcbiAgICBsZXQgdGltZW91dE1pbGxpczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gTm90ZSB0aGUgYHJldHJ5LWFmdGVyLW1zYCBoZWFkZXIgbWF5IG5vdCBiZSBzdGFuZGFyZCwgYnV0IGlzIGEgZ29vZCBpZGVhIGFuZCB3ZSdkIGxpa2UgcHJvYWN0aXZlIHN1cHBvcnQgZm9yIGl0LlxuICAgIGNvbnN0IHJldHJ5QWZ0ZXJNaWxsaXNIZWFkZXIgPSByZXNwb25zZUhlYWRlcnM/LlsncmV0cnktYWZ0ZXItbXMnXTtcbiAgICBpZiAocmV0cnlBZnRlck1pbGxpc0hlYWRlcikge1xuICAgICAgY29uc3QgdGltZW91dE1zID0gcGFyc2VGbG9hdChyZXRyeUFmdGVyTWlsbGlzSGVhZGVyKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRpbWVvdXRNcykpIHtcbiAgICAgICAgdGltZW91dE1pbGxpcyA9IHRpbWVvdXRNcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBYm91dCB0aGUgUmV0cnktQWZ0ZXIgaGVhZGVyOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvUmV0cnktQWZ0ZXJcbiAgICBjb25zdCByZXRyeUFmdGVySGVhZGVyID0gcmVzcG9uc2VIZWFkZXJzPy5bJ3JldHJ5LWFmdGVyJ107XG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIgJiYgIXRpbWVvdXRNaWxsaXMpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gcGFyc2VGbG9hdChyZXRyeUFmdGVySGVhZGVyKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKHRpbWVvdXRTZWNvbmRzKSkge1xuICAgICAgICB0aW1lb3V0TWlsbGlzID0gdGltZW91dFNlY29uZHMgKiAxMDAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZW91dE1pbGxpcyA9IERhdGUucGFyc2UocmV0cnlBZnRlckhlYWRlcikgLSBEYXRlLm5vdygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBBUEkgYXNrcyB1cyB0byB3YWl0IGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSAoYW5kIGl0J3MgYSByZWFzb25hYmxlIGFtb3VudCksXG4gICAgLy8ganVzdCBkbyB3aGF0IGl0IHNheXMsIGJ1dCBvdGhlcndpc2UgY2FsY3VsYXRlIGEgZGVmYXVsdFxuICAgIGlmICghKHRpbWVvdXRNaWxsaXMgJiYgMCA8PSB0aW1lb3V0TWlsbGlzICYmIHRpbWVvdXRNaWxsaXMgPCA2MCAqIDEwMDApKSB7XG4gICAgICBjb25zdCBtYXhSZXRyaWVzID0gb3B0aW9ucy5tYXhSZXRyaWVzID8/IHRoaXMubWF4UmV0cmllcztcbiAgICAgIHRpbWVvdXRNaWxsaXMgPSB0aGlzLmNhbGN1bGF0ZURlZmF1bHRSZXRyeVRpbWVvdXRNaWxsaXMocmV0cmllc1JlbWFpbmluZywgbWF4UmV0cmllcyk7XG4gICAgfVxuICAgIGF3YWl0IHNsZWVwKHRpbWVvdXRNaWxsaXMpO1xuXG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3Qob3B0aW9ucywgcmV0cmllc1JlbWFpbmluZyAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEZWZhdWx0UmV0cnlUaW1lb3V0TWlsbGlzKHJldHJpZXNSZW1haW5pbmc6IG51bWJlciwgbWF4UmV0cmllczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBpbml0aWFsUmV0cnlEZWxheSA9IDAuNTtcbiAgICBjb25zdCBtYXhSZXRyeURlbGF5ID0gOC4wO1xuXG4gICAgY29uc3QgbnVtUmV0cmllcyA9IG1heFJldHJpZXMgLSByZXRyaWVzUmVtYWluaW5nO1xuXG4gICAgLy8gQXBwbHkgZXhwb25lbnRpYWwgYmFja29mZiwgYnV0IG5vdCBtb3JlIHRoYW4gdGhlIG1heC5cbiAgICBjb25zdCBzbGVlcFNlY29uZHMgPSBNYXRoLm1pbihpbml0aWFsUmV0cnlEZWxheSAqIE1hdGgucG93KDIsIG51bVJldHJpZXMpLCBtYXhSZXRyeURlbGF5KTtcblxuICAgIC8vIEFwcGx5IHNvbWUgaml0dGVyLCB0YWtlIHVwIHRvIGF0IG1vc3QgMjUgcGVyY2VudCBvZiB0aGUgcmV0cnkgdGltZS5cbiAgICBjb25zdCBqaXR0ZXIgPSAxIC0gTWF0aC5yYW5kb20oKSAqIDAuMjU7XG5cbiAgICByZXR1cm4gc2xlZXBTZWNvbmRzICogaml0dGVyICogMTAwMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckFnZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0vSlMgJHtWRVJTSU9OfWA7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUGFnZUluZm8gPSB7IHVybDogVVJMIH0gfCB7IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIH07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhZ2U8SXRlbT4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEl0ZW0+IHtcbiAgI2NsaWVudDogQVBJQ2xpZW50O1xuICBwcm90ZWN0ZWQgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucztcblxuICBwcm90ZWN0ZWQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBwcm90ZWN0ZWQgYm9keTogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEFQSUNsaWVudCwgcmVzcG9uc2U6IFJlc3BvbnNlLCBib2R5OiB1bmtub3duLCBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zKSB7XG4gICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG5leHRQYWdlSW5mbyBpbnN0ZWFkXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0UGFnZVBhcmFtcygpOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IG51bGw7XG4gIGFic3RyYWN0IG5leHRQYWdlSW5mbygpOiBQYWdlSW5mbyB8IG51bGw7XG5cbiAgYWJzdHJhY3QgZ2V0UGFnaW5hdGVkSXRlbXMoKTogSXRlbVtdO1xuXG4gIGhhc05leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRQYWdpbmF0ZWRJdGVtcygpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMubmV4dFBhZ2VJbmZvKCkgIT0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGdldE5leHRQYWdlKCk6IFByb21pc2U8dGhpcz4ge1xuICAgIGNvbnN0IG5leHRJbmZvID0gdGhpcy5uZXh0UGFnZUluZm8oKTtcbiAgICBpZiAoIW5leHRJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICdObyBuZXh0IHBhZ2UgZXhwZWN0ZWQ7IHBsZWFzZSBjaGVjayBgLmhhc05leHRQYWdlKClgIGJlZm9yZSBjYWxsaW5nIGAuZ2V0TmV4dFBhZ2UoKWAuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5leHRPcHRpb25zID0geyAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICBpZiAoJ3BhcmFtcycgaW4gbmV4dEluZm8gJiYgdHlwZW9mIG5leHRPcHRpb25zLnF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgbmV4dE9wdGlvbnMucXVlcnkgPSB7IC4uLm5leHRPcHRpb25zLnF1ZXJ5LCAuLi5uZXh0SW5mby5wYXJhbXMgfTtcbiAgICB9IGVsc2UgaWYgKCd1cmwnIGluIG5leHRJbmZvKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBbLi4uT2JqZWN0LmVudHJpZXMobmV4dE9wdGlvbnMucXVlcnkgfHwge30pLCAuLi5uZXh0SW5mby51cmwuc2VhcmNoUGFyYW1zLmVudHJpZXMoKV07XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMpIHtcbiAgICAgICAgbmV4dEluZm8udXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgbmV4dE9wdGlvbnMucXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICBuZXh0T3B0aW9ucy5wYXRoID0gbmV4dEluZm8udXJsLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQucmVxdWVzdEFQSUxpc3QodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnksIG5leHRPcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jICppdGVyUGFnZXMoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgbGV0IHBhZ2U6IEFic3RyYWN0UGFnZTxJdGVtPiA9IHRoaXM7XG4gICAgeWllbGQgcGFnZTtcbiAgICB3aGlsZSAocGFnZS5oYXNOZXh0UGFnZSgpKSB7XG4gICAgICBwYWdlID0gYXdhaXQgcGFnZS5nZXROZXh0UGFnZSgpO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5pdGVyUGFnZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhZ2UuZ2V0UGFnaW5hdGVkSXRlbXMoKSkge1xuICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgc3ViY2xhc3Mgb2YgUHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gYW4gaW5zdGFudGlhdGVkIFBhZ2Ugb25jZSB0aGUgcmVxdWVzdCBjb21wbGV0ZXMuXG4gKlxuICogSXQgYWxzbyBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGUgdG8gYWxsb3cgYXV0by1wYWdpbmF0aW5nIGl0ZXJhdGlvbiBvbiBhbiB1bmF3YWl0ZWQgbGlzdCBjYWxsLCBlZzpcbiAqXG4gKiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY2xpZW50Lml0ZW1zLmxpc3QoKSkge1xuICogICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICogICAgfVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVByb21pc2U8XG4gICAgUGFnZUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+LFxuICAgIEl0ZW0gPSBSZXR1cm5UeXBlPFBhZ2VDbGFzc1snZ2V0UGFnaW5hdGVkSXRlbXMnXT5bbnVtYmVyXSxcbiAgPlxuICBleHRlbmRzIEFQSVByb21pc2U8UGFnZUNsYXNzPlxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8SXRlbT5cbntcbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50OiBBUElDbGllbnQsXG4gICAgcmVxdWVzdDogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPixcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQWJzdHJhY3RQYWdlPikgPT4gUGFnZUNsYXNzLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhc3luYyAocHJvcHMpID0+IG5ldyBQYWdlKGNsaWVudCwgcHJvcHMucmVzcG9uc2UsIGF3YWl0IGRlZmF1bHRQYXJzZVJlc3BvbnNlKHByb3BzKSwgcHJvcHMub3B0aW9ucyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBhdXRvLXBhZ2luYXRpbmcgaXRlcmF0aW9uIG9uIGFuIHVuYXdhaXRlZCBsaXN0IGNhbGwsIGVnOlxuICAgKlxuICAgKiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY2xpZW50Lml0ZW1zLmxpc3QoKSkge1xuICAgKiAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gICAqICAgIH1cbiAgICovXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzO1xuICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBwYWdlKSB7XG4gICAgICB5aWVsZCBpdGVtO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVzcG9uc2VIZWFkZXJzID0gKFxuICBoZWFkZXJzOiBBd2FpdGVkPFJldHVyblR5cGU8RmV0Y2g+PlsnaGVhZGVycyddLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaGVhZGVycy5lbnRyaWVzKCksXG4gICAgKSxcbiAgICB7XG4gICAgICBnZXQodGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5hbWUudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtrZXkudG9Mb3dlckNhc2UoKV0gfHwgdGFyZ2V0W2tleV07XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG59O1xuXG50eXBlIEhUVFBNZXRob2QgPSAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ3BhdGNoJyB8ICdkZWxldGUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Q2xpZW50ID0geyBmZXRjaDogRmV0Y2ggfTtcbmV4cG9ydCB0eXBlIEhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPjtcbmV4cG9ydCB0eXBlIERlZmF1bHRRdWVyeSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5leHBvcnQgdHlwZSBLZXlzRW51bTxUPiA9IHsgW1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD5dOiB0cnVlIH07XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb25zPFJlcSA9IHVua25vd24gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlYWRhYmxlPiA9IHtcbiAgbWV0aG9kPzogSFRUUE1ldGhvZDtcbiAgcGF0aD86IHN0cmluZztcbiAgcXVlcnk/OiBSZXEgfCB1bmRlZmluZWQ7XG4gIGJvZHk/OiBSZXEgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBoZWFkZXJzPzogSGVhZGVycyB8IHVuZGVmaW5lZDtcblxuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdHJlYW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBodHRwQWdlbnQ/OiBBZ2VudDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQgfCBudWxsO1xuICBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcblxuICBfX2JpbmFyeVJlc3BvbnNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgX19zdHJlYW1DbGFzcz86IHR5cGVvZiBTdHJlYW07XG59O1xuXG4vLyBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiBhIGdpdmVuIG9iamVjdCBtYXRjaGVzIHRoZSBSZXF1ZXN0T3B0aW9uc1xuLy8gdHlwZSBhdCBydW50aW1lLiBXaGlsZSB0aGlzIHJlcXVpcmVzIGR1cGxpY2F0aW9uLCBpdCBpcyBlbmZvcmNlZCBieSB0aGUgVHlwZVNjcmlwdFxuLy8gY29tcGlsZXIgc3VjaCB0aGF0IGFueSBtaXNzaW5nIC8gZXh0cmFuZW91cyBrZXlzIHdpbGwgY2F1c2UgYW4gZXJyb3IuXG5jb25zdCByZXF1ZXN0T3B0aW9uc0tleXM6IEtleXNFbnVtPFJlcXVlc3RPcHRpb25zPiA9IHtcbiAgbWV0aG9kOiB0cnVlLFxuICBwYXRoOiB0cnVlLFxuICBxdWVyeTogdHJ1ZSxcbiAgYm9keTogdHJ1ZSxcbiAgaGVhZGVyczogdHJ1ZSxcblxuICBtYXhSZXRyaWVzOiB0cnVlLFxuICBzdHJlYW06IHRydWUsXG4gIHRpbWVvdXQ6IHRydWUsXG4gIGh0dHBBZ2VudDogdHJ1ZSxcbiAgc2lnbmFsOiB0cnVlLFxuICBpZGVtcG90ZW5jeUtleTogdHJ1ZSxcblxuICBfX2JpbmFyeVJlc3BvbnNlOiB0cnVlLFxuICBfX3N0cmVhbUNsYXNzOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVxdWVzdE9wdGlvbnMgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlcXVlc3RPcHRpb25zID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgIG9iaiAhPT0gbnVsbCAmJlxuICAgICFpc0VtcHR5T2JqKG9iaikgJiZcbiAgICBPYmplY3Qua2V5cyhvYmopLmV2ZXJ5KChrKSA9PiBoYXNPd24ocmVxdWVzdE9wdGlvbnNLZXlzLCBrKSlcbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxID0gdW5rbm93biB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVhZGFibGU+ID0gUmVxdWVzdE9wdGlvbnM8UmVxPiAmIHtcbiAgbWV0aG9kOiBIVFRQTWV0aG9kO1xuICBwYXRoOiBzdHJpbmc7XG59O1xuXG5kZWNsYXJlIGNvbnN0IERlbm86IGFueTtcbmRlY2xhcmUgY29uc3QgRWRnZVJ1bnRpbWU6IGFueTtcbnR5cGUgQXJjaCA9ICd4MzInIHwgJ3g2NCcgfCAnYXJtJyB8ICdhcm02NCcgfCBgb3RoZXI6JHtzdHJpbmd9YCB8ICd1bmtub3duJztcbnR5cGUgUGxhdGZvcm1OYW1lID1cbiAgfCAnTWFjT1MnXG4gIHwgJ0xpbnV4J1xuICB8ICdXaW5kb3dzJ1xuICB8ICdGcmVlQlNEJ1xuICB8ICdPcGVuQlNEJ1xuICB8ICdpT1MnXG4gIHwgJ0FuZHJvaWQnXG4gIHwgYE90aGVyOiR7c3RyaW5nfWBcbiAgfCAnVW5rbm93bic7XG50eXBlIEJyb3dzZXIgPSAnaWUnIHwgJ2VkZ2UnIHwgJ2Nocm9tZScgfCAnZmlyZWZveCcgfCAnc2FmYXJpJztcbnR5cGUgUGxhdGZvcm1Qcm9wZXJ0aWVzID0ge1xuICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcyc7XG4gICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBzdHJpbmc7XG4gICdYLVN0YWlubGVzcy1PUyc6IFBsYXRmb3JtTmFtZTtcbiAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBBcmNoO1xuICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdub2RlJyB8ICdkZW5vJyB8ICdlZGdlJyB8IGBicm93c2VyOiR7QnJvd3Nlcn1gIHwgJ3Vua25vd24nO1xuICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogc3RyaW5nO1xufTtcbmNvbnN0IGdldFBsYXRmb3JtUHJvcGVydGllcyA9ICgpOiBQbGF0Zm9ybVByb3BlcnRpZXMgPT4ge1xuICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8uYnVpbGQgIT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6IG5vcm1hbGl6ZVBsYXRmb3JtKERlbm8uYnVpbGQub3MpLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBub3JtYWxpemVBcmNoKERlbm8uYnVpbGQuYXJjaCksXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdkZW5vJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOlxuICAgICAgICB0eXBlb2YgRGVuby52ZXJzaW9uID09PSAnc3RyaW5nJyA/IERlbm8udmVyc2lvbiA6IERlbm8udmVyc2lvbj8uZGVubyA/PyAndW5rbm93bicsXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIEVkZ2VSdW50aW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6ICdVbmtub3duJyxcbiAgICAgICdYLVN0YWlubGVzcy1BcmNoJzogYG90aGVyOiR7RWRnZVJ1bnRpbWV9YCxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ2VkZ2UnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9XG4gIC8vIENoZWNrIGlmIE5vZGUuanNcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6IG5vcm1hbGl6ZVBsYXRmb3JtKHByb2Nlc3MucGxhdGZvcm0pLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBub3JtYWxpemVBcmNoKHByb2Nlc3MuYXJjaCksXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdub2RlJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJJbmZvID0gZ2V0QnJvd3NlckluZm8oKTtcbiAgaWYgKGJyb3dzZXJJbmZvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogJ1Vua25vd24nLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiAndW5rbm93bicsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6IGBicm93c2VyOiR7YnJvd3NlckluZm8uYnJvd3Nlcn1gLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IGJyb3dzZXJJbmZvLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIENsb3VkZmxhcmUgd29ya2VycywgZXRjLlxuICByZXR1cm4ge1xuICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAnWC1TdGFpbmxlc3MtT1MnOiAnVW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiAndW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAndW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6ICd1bmtub3duJyxcbiAgfTtcbn07XG5cbnR5cGUgQnJvd3NlckluZm8gPSB7XG4gIGJyb3dzZXI6IEJyb3dzZXI7XG4gIHZlcnNpb246IHN0cmluZztcbn07XG5cbmRlY2xhcmUgY29uc3QgbmF2aWdhdG9yOiB7IHVzZXJBZ2VudDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8vIE5vdGU6IG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0pTLURldlRvb2xzL2hvc3QtZW52aXJvbm1lbnQvYmxvYi9iMWFiNzllY2RlMzdkYjVkNmUxNjNjMDUwZTU0ZmU3ZDI4N2Q3YzkyL3NyYy9pc29tb3JwaGljLmJyb3dzZXIudHNcbmZ1bmN0aW9uIGdldEJyb3dzZXJJbmZvKCk6IEJyb3dzZXJJbmZvIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOT1RFOiBUaGUgb3JkZXIgbWF0dGVycyBoZXJlIVxuICBjb25zdCBicm93c2VyUGF0dGVybnMgPSBbXG4gICAgeyBrZXk6ICdlZGdlJyBhcyBjb25zdCwgcGF0dGVybjogL0VkZ2UoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2llJyBhcyBjb25zdCwgcGF0dGVybjogL01TSUUoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2llJyBhcyBjb25zdCwgcGF0dGVybjogL1RyaWRlbnQoPzouKnJ2XFw6KFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2Nocm9tZScgYXMgY29uc3QsIHBhdHRlcm46IC9DaHJvbWUoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2ZpcmVmb3gnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvRmlyZWZveCg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnc2FmYXJpJyBhcyBjb25zdCwgcGF0dGVybjogLyg/OlZlcnNpb25cXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPyg/OlxcVytNb2JpbGVcXFMqKT9cXFcrU2FmYXJpLyB9LFxuICBdO1xuXG4gIC8vIEZpbmQgdGhlIEZJUlNUIG1hdGNoaW5nIGJyb3dzZXJcbiAgZm9yIChjb25zdCB7IGtleSwgcGF0dGVybiB9IG9mIGJyb3dzZXJQYXR0ZXJucykge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgbWFqb3IgPSBtYXRjaFsxXSB8fCAwO1xuICAgICAgY29uc3QgbWlub3IgPSBtYXRjaFsyXSB8fCAwO1xuICAgICAgY29uc3QgcGF0Y2ggPSBtYXRjaFszXSB8fCAwO1xuXG4gICAgICByZXR1cm4geyBicm93c2VyOiBrZXksIHZlcnNpb246IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3Qgbm9ybWFsaXplQXJjaCA9IChhcmNoOiBzdHJpbmcpOiBBcmNoID0+IHtcbiAgLy8gTm9kZSBkb2NzOlxuICAvLyAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NhcmNoXG4gIC8vIERlbm8gZG9jczpcbiAgLy8gLSBodHRwczovL2RvYy5kZW5vLmxhbmQvZGVuby9zdGFibGUvfi9EZW5vLmJ1aWxkXG4gIGlmIChhcmNoID09PSAneDMyJykgcmV0dXJuICd4MzInO1xuICBpZiAoYXJjaCA9PT0gJ3g4Nl82NCcgfHwgYXJjaCA9PT0gJ3g2NCcpIHJldHVybiAneDY0JztcbiAgaWYgKGFyY2ggPT09ICdhcm0nKSByZXR1cm4gJ2FybSc7XG4gIGlmIChhcmNoID09PSAnYWFyY2g2NCcgfHwgYXJjaCA9PT0gJ2FybTY0JykgcmV0dXJuICdhcm02NCc7XG4gIGlmIChhcmNoKSByZXR1cm4gYG90aGVyOiR7YXJjaH1gO1xuICByZXR1cm4gJ3Vua25vd24nO1xufTtcblxuY29uc3Qgbm9ybWFsaXplUGxhdGZvcm0gPSAocGxhdGZvcm06IHN0cmluZyk6IFBsYXRmb3JtTmFtZSA9PiB7XG4gIC8vIE5vZGUgcGxhdGZvcm1zOlxuICAvLyAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NwbGF0Zm9ybVxuICAvLyBEZW5vIHBsYXRmb3JtczpcbiAgLy8gLSBodHRwczovL2RvYy5kZW5vLmxhbmQvZGVuby9zdGFibGUvfi9EZW5vLmJ1aWxkXG4gIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rlbm9sYW5kL2Rlbm8vaXNzdWVzLzE0Nzk5XG5cbiAgcGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE5PVEU6IHRoaXMgaU9TIGNoZWNrIGlzIHVudGVzdGVkIGFuZCBtYXkgbm90IHdvcmtcbiAgLy8gTm9kZSBkb2VzIG5vdCB3b3JrIG5hdGl2ZWx5IG9uIElPUywgdGhlcmUgaXMgYSBmb3JrIGF0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMtbW9iaWxlL25vZGVqcy1tb2JpbGVcbiAgLy8gaG93ZXZlciBpdCBpcyB1bmtub3duIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgaG93IHRvIGRldGVjdCBpZiBpdCBpcyBydW5uaW5nXG4gIGlmIChwbGF0Zm9ybS5pbmNsdWRlcygnaW9zJykpIHJldHVybiAnaU9TJztcbiAgaWYgKHBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHJldHVybiAnQW5kcm9pZCc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHJldHVybiAnTWFjT1MnO1xuICBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHJldHVybiAnV2luZG93cyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnKSByZXR1cm4gJ0ZyZWVCU0QnO1xuICBpZiAocGxhdGZvcm0gPT09ICdvcGVuYnNkJykgcmV0dXJuICdPcGVuQlNEJztcbiAgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSByZXR1cm4gJ0xpbnV4JztcbiAgaWYgKHBsYXRmb3JtKSByZXR1cm4gYE90aGVyOiR7cGxhdGZvcm19YDtcbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmxldCBfcGxhdGZvcm1IZWFkZXJzOiBQbGF0Zm9ybVByb3BlcnRpZXM7XG5jb25zdCBnZXRQbGF0Zm9ybUhlYWRlcnMgPSAoKSA9PiB7XG4gIHJldHVybiAoX3BsYXRmb3JtSGVhZGVycyA/Pz0gZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhZmVKU09OID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTk3MDk4NDZcbmNvbnN0IHN0YXJ0c1dpdGhTY2hlbWVSZWdleHAgPSBuZXcgUmVnRXhwKCdeKD86W2Etel0rOik/Ly8nLCAnaScpO1xuY29uc3QgaXNBYnNvbHV0ZVVSTCA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gc3RhcnRzV2l0aFNjaGVtZVJlZ2V4cC50ZXN0KHVybCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuY29uc3QgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIgPSAobmFtZTogc3RyaW5nLCBuOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGFuIGludGVnZXJgKTtcbiAgfVxuICBpZiAobiA8IDApIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gbjtcbn07XG5cbmV4cG9ydCBjb25zdCBjYXN0VG9FcnJvciA9IChlcnI6IGFueSk6IEVycm9yID0+IHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyO1xuICByZXR1cm4gbmV3IEVycm9yKGVycik7XG59O1xuXG5leHBvcnQgY29uc3QgZW5zdXJlUHJlc2VudCA9IDxUPih2YWx1ZTogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUID0+IHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBPcGVuQUlFcnJvcihgRXhwZWN0ZWQgYSB2YWx1ZSB0byBiZSBnaXZlbiBidXQgcmVjZWl2ZWQgJHt2YWx1ZX0gaW5zdGVhZC5gKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZWFkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIFRyaW1zIGJlZ2lubmluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqXG4gKiBXaWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2Fubm90IGJlIGFjY2Vzc2VkLlxuICovXG5leHBvcnQgY29uc3QgcmVhZEVudiA9IChlbnY6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnY/LltlbnZdPy50cmltKCkgPz8gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gRGVuby5lbnY/LmdldD8uKGVudik/LnRyaW0oKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvZXJjZUludGVnZXIgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBDb3VsZCBub3QgY29lcmNlICR7dmFsdWV9ICh0eXBlOiAke3R5cGVvZiB2YWx1ZX0pIGludG8gYSBudW1iZXJgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb2VyY2VGbG9hdCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBDb3VsZCBub3QgY29lcmNlICR7dmFsdWV9ICh0eXBlOiAke3R5cGVvZiB2YWx1ZX0pIGludG8gYSBudW1iZXJgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb2VyY2VCb29sZWFuID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBtYXliZUNvZXJjZUludGVnZXIgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvZXJjZUludGVnZXIodmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlQ29lcmNlRmxvYXQgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvZXJjZUZsb2F0KHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBtYXliZUNvZXJjZUJvb2xlYW4gPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2VyY2VCb29sZWFuKHZhbHVlKTtcbn07XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDQ5MTI4N1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmoob2JqOiBPYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghb2JqKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBfayBpbiBvYmopIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC9ydWxlcy9uby1wcm90b3R5cGUtYnVpbHRpbnNcbmV4cG9ydCBmdW5jdGlvbiBoYXNPd24ob2JqOiBPYmplY3QsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuXG4vKipcbiAqIENvcGllcyBoZWFkZXJzIGZyb20gXCJuZXdIZWFkZXJzXCIgb250byBcInRhcmdldEhlYWRlcnNcIixcbiAqIHVzaW5nIGxvd2VyLWNhc2UgZm9yIGFsbCBwcm9wZXJ0aWVzLFxuICogaWdub3JpbmcgYW55IGtleXMgd2l0aCB1bmRlZmluZWQgdmFsdWVzLFxuICogYW5kIGRlbGV0aW5nIGFueSBrZXlzIHdpdGggbnVsbCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5SGVhZGVyc011dCh0YXJnZXRIZWFkZXJzOiBIZWFkZXJzLCBuZXdIZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgayBpbiBuZXdIZWFkZXJzKSB7XG4gICAgaWYgKCFoYXNPd24obmV3SGVhZGVycywgaykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxvd2VyS2V5ID0gay50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghbG93ZXJLZXkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsID0gbmV3SGVhZGVyc1trXTtcblxuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0YXJnZXRIZWFkZXJzW2xvd2VyS2V5XTtcbiAgICB9IGVsc2UgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXRIZWFkZXJzW2xvd2VyS2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKGFjdGlvbjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3M/LmVudj8uWydERUJVRyddID09PSAndHJ1ZScpIHtcbiAgICBjb25zb2xlLmxvZyhgT3BlbkFJOkRFQlVHOiR7YWN0aW9ufWAsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxMTc1MjNcbiAqL1xuY29uc3QgdXVpZDQgPSAoKSA9PiB7XG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUnVubmluZ0luQnJvd3NlciA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyc1Byb3RvY29sIHtcbiAgZ2V0OiAoaGVhZGVyOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBIZWFkZXJzTGlrZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IEhlYWRlcnNQcm90b2NvbDtcblxuZXhwb3J0IGNvbnN0IGlzSGVhZGVyc1Byb3RvY29sID0gKGhlYWRlcnM6IGFueSk6IGhlYWRlcnMgaXMgSGVhZGVyc1Byb3RvY29sID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBoZWFkZXJzPy5nZXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRIZWFkZXIgPSAoaGVhZGVyczogSGVhZGVyc0xpa2UsIGhlYWRlcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbG93ZXJDYXNlZEhlYWRlciA9IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICBpZiAoaXNIZWFkZXJzUHJvdG9jb2woaGVhZGVycykpIHtcbiAgICAvLyB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlIGhlYWRlciBsb29rcyBsaWtlIFN0YWlubGVzcy1FdmVudC1JZFxuICAgIGNvbnN0IGludGVyY2Fwc0hlYWRlciA9XG4gICAgICBoZWFkZXJbMF0/LnRvVXBwZXJDYXNlKCkgK1xuICAgICAgaGVhZGVyLnN1YnN0cmluZygxKS5yZXBsYWNlKC8oW15cXHddKShcXHcpL2csIChfbSwgZzEsIGcyKSA9PiBnMSArIGcyLnRvVXBwZXJDYXNlKCkpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFtoZWFkZXIsIGxvd2VyQ2FzZWRIZWFkZXIsIGhlYWRlci50b1VwcGVyQ2FzZSgpLCBpbnRlcmNhcHNIZWFkZXJdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlcnMuZ2V0KGtleSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBsb3dlckNhc2VkSGVhZGVyKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8PSAxKSByZXR1cm4gdmFsdWVbMF07XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVjZWl2ZWQgJHt2YWx1ZS5sZW5ndGh9IGVudHJpZXMgZm9yIHRoZSAke2hlYWRlcn0gaGVhZGVyLCB1c2luZyB0aGUgZmlyc3QgZW50cnkuYCk7XG4gICAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICR7aGVhZGVyfSBoZWFkZXJgKTtcbn07XG5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBCYXNlNjQgZm9ybWF0LlxuICovXG5leHBvcnQgY29uc3QgdG9CYXNlNjQgPSAoc3RyOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBidG9hKHN0cik7XG4gIH1cblxuICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoJ0Nhbm5vdCBnZW5lcmF0ZSBiNjQgc3RyaW5nOyBFeHBlY3RlZCBgQnVmZmVyYCBvciBgYnRvYWAgdG8gYmUgZGVmaW5lZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFic3RyYWN0UGFnZSwgUmVzcG9uc2UsIEFQSUNsaWVudCwgRmluYWxSZXF1ZXN0T3B0aW9ucywgUGFnZUluZm8gfSBmcm9tICcuL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXNwb25zZTxJdGVtPiB7XG4gIGRhdGE6IEFycmF5PEl0ZW0+O1xuXG4gIG9iamVjdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5vdGU6IG5vIHBhZ2luYXRpb24gYWN0dWFsbHkgb2NjdXJzIHlldCwgdGhpcyBpcyBmb3IgZm9yd2FyZHMtY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2U8SXRlbT4gZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4gaW1wbGVtZW50cyBQYWdlUmVzcG9uc2U8SXRlbT4ge1xuICBkYXRhOiBBcnJheTxJdGVtPjtcblxuICBvYmplY3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEFQSUNsaWVudCwgcmVzcG9uc2U6IFJlc3BvbnNlLCBib2R5OiBQYWdlUmVzcG9uc2U8SXRlbT4sIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpIHtcbiAgICBzdXBlcihjbGllbnQsIHJlc3BvbnNlLCBib2R5LCBvcHRpb25zKTtcblxuICAgIHRoaXMuZGF0YSA9IGJvZHkuZGF0YSB8fCBbXTtcbiAgICB0aGlzLm9iamVjdCA9IGJvZHkub2JqZWN0O1xuICB9XG5cbiAgZ2V0UGFnaW5hdGVkSXRlbXMoKTogSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8/IFtdO1xuICB9XG5cbiAgLy8gQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBgbmV4dFBhZ2VJbmZvKClgIGluc3RlYWRcbiAgLyoqXG4gICAqIFRoaXMgcGFnZSByZXByZXNlbnRzIGEgcmVzcG9uc2UgdGhhdCBpc24ndCBhY3R1YWxseSBwYWdpbmF0ZWQgYXQgdGhlIEFQSSBsZXZlbFxuICAgKiBzbyB0aGVyZSB3aWxsIG5ldmVyIGJlIGFueSBuZXh0IHBhZ2UgcGFyYW1zLlxuICAgKi9cbiAgbmV4dFBhZ2VQYXJhbXMoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZXh0UGFnZUluZm8oKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXJzb3JQYWdlUmVzcG9uc2U8SXRlbT4ge1xuICBkYXRhOiBBcnJheTxJdGVtPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgYWZ0ZXI/OiBzdHJpbmc7XG5cbiAgbGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDdXJzb3JQYWdlPEl0ZW0gZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfT5cbiAgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT5cbiAgaW1wbGVtZW50cyBDdXJzb3JQYWdlUmVzcG9uc2U8SXRlbT5cbntcbiAgZGF0YTogQXJyYXk8SXRlbT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50OiBBUElDbGllbnQsXG4gICAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICAgIGJvZHk6IEN1cnNvclBhZ2VSZXNwb25zZTxJdGVtPixcbiAgICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihjbGllbnQsIHJlc3BvbnNlLCBib2R5LCBvcHRpb25zKTtcblxuICAgIHRoaXMuZGF0YSA9IGJvZHkuZGF0YSB8fCBbXTtcbiAgfVxuXG4gIGdldFBhZ2luYXRlZEl0ZW1zKCk6IEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/PyBbXTtcbiAgfVxuXG4gIC8vIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgYG5leHRQYWdlSW5mbygpYCBpbnN0ZWFkXG4gIG5leHRQYWdlUGFyYW1zKCk6IFBhcnRpYWw8Q3Vyc29yUGFnZVBhcmFtcz4gfCBudWxsIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5uZXh0UGFnZUluZm8oKTtcbiAgICBpZiAoIWluZm8pIHJldHVybiBudWxsO1xuICAgIGlmICgncGFyYW1zJyBpbiBpbmZvKSByZXR1cm4gaW5mby5wYXJhbXM7XG4gICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKGluZm8udXJsLnNlYXJjaFBhcmFtcyk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIG5leHRQYWdlSW5mbygpOiBQYWdlSW5mbyB8IG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBhZ2luYXRlZEl0ZW1zKCk7XG4gICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0/LmlkO1xuICAgIGlmICghaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcmFtczogeyBhZnRlcjogaWQgfSB9O1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHR5cGUgeyBPcGVuQUkgfSBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGNsYXNzIEFQSVJlc291cmNlIHtcbiAgcHJvdGVjdGVkIF9jbGllbnQ6IE9wZW5BSTtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IE9wZW5BSSkge1xuICAgIHRoaXMuX2NsaWVudCA9IGNsaWVudDtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElQcm9taXNlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIENoYXRDb21wbGV0aW9uc0FQSSBmcm9tICcuL2NvbXBsZXRpb25zJztcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gJy4uL2NvbXBsZXRpb25zJztcbmltcG9ydCAqIGFzIFNoYXJlZCBmcm9tICcuLi9zaGFyZWQnO1xuaW1wb3J0ICogYXMgQ2hhdEFQSSBmcm9tICcuL2NoYXQnO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSAnLi4vLi4vc3RyZWFtaW5nJztcblxuZXhwb3J0IGNsYXNzIENvbXBsZXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG1vZGVsIHJlc3BvbnNlIGZvciB0aGUgZ2l2ZW4gY2hhdCBjb252ZXJzYXRpb24uXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8Q2hhdENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4gfCBDaGF0Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4gfCBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2NoYXQvY29tcGxldGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMsIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UgfSkgYXNcbiAgICAgIHwgQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj5cbiAgICAgIHwgQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4+O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNoYXQgY29tcGxldGlvbiByZXNwb25zZSByZXR1cm5lZCBieSBtb2RlbCwgYmFzZWQgb24gdGhlIHByb3ZpZGVkXG4gKiBpbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2hhdCBjb21wbGV0aW9uLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGNoYXQgY29tcGxldGlvbiBjaG9pY2VzLiBDYW4gYmUgbW9yZSB0aGFuIG9uZSBpZiBgbmAgaXMgZ3JlYXRlclxuICAgKiB0aGFuIDEuXG4gICAqL1xuICBjaG9pY2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbi5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgZm9yIHRoZSBjaGF0IGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgY2hhdC5jb21wbGV0aW9uYC5cbiAgICovXG4gIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbic7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmluZ2VycHJpbnQgcmVwcmVzZW50cyB0aGUgYmFja2VuZCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG1vZGVsIHJ1bnMgd2l0aC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNlZWRgIHJlcXVlc3QgcGFyYW1ldGVyIHRvIHVuZGVyc3RhbmQgd2hlblxuICAgKiBiYWNrZW5kIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBtaWdodCBpbXBhY3QgZGV0ZXJtaW5pc20uXG4gICAqL1xuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZT86IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25Vc2FnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgICAqIGhpdCBhIG5hdHVyYWwgc3RvcCBwb2ludCBvciBhIHByb3ZpZGVkIHN0b3Agc2VxdWVuY2UsIGBsZW5ndGhgIGlmIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLCBgdG9vbF9jYWxsc2AgaWYgdGhlXG4gICAgICogbW9kZWwgY2FsbGVkIGEgdG9vbCwgb3IgYGZ1bmN0aW9uX2NhbGxgIChkZXByZWNhdGVkKSBpZiB0aGUgbW9kZWwgY2FsbGVkIGFcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmaW5pc2hfcmVhc29uOiAnc3RvcCcgfCAnbGVuZ3RoJyB8ICd0b29sX2NhbGxzJyB8ICdjb250ZW50X2ZpbHRlcicgfCAnZnVuY3Rpb25fY2FsbCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzLlxuICAgICAqL1xuICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgbG9ncHJvYnM6IENob2ljZS5Mb2dwcm9icyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIGNoYXQgY29tcGxldGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAgICovXG4gICAgbWVzc2FnZTogQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2dwcm9icyB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBtZXNzYWdlIGNvbnRlbnQgdG9rZW5zIHdpdGggbG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBBcnJheTxDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I+IHwgbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYGFzc2lzdGFudGAuXG4gICAqL1xuICByb2xlOiAnYXNzaXN0YW50JztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBhc3Npc3RhbnQgbWVzc2FnZS4gUmVxdWlyZWQgdW5sZXNzIGB0b29sX2NhbGxzYCBvclxuICAgKiBgZnVuY3Rpb25fY2FsbGAgaXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgY29udGVudD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0uRnVuY3Rpb25DYWxsO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCBjYWxscyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLCBzdWNoIGFzIGZ1bmN0aW9uIGNhbGxzLlxuICAgKi9cbiAgdG9vbF9jYWxscz86IEFycmF5PENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbWVkIGNodW5rIG9mIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ2h1bmsge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi4gRWFjaCBjaHVuayBoYXMgdGhlIHNhbWUgSUQuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY2hhdCBjb21wbGV0aW9uIGNob2ljZXMuIENhbiBjb250YWluIG1vcmUgdGhhbiBvbmUgZWxlbWVudHMgaWYgYG5gIGlzXG4gICAqIGdyZWF0ZXIgdGhhbiAxLiBDYW4gYWxzbyBiZSBlbXB0eSBmb3IgdGhlIGxhc3QgY2h1bmsgaWYgeW91IHNldFxuICAgKiBgc3RyZWFtX29wdGlvbnM6IHtcImluY2x1ZGVfdXNhZ2VcIjogdHJ1ZX1gLlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q2hhdENvbXBsZXRpb25DaHVuay5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC4gRWFjaFxuICAgKiBjaHVuayBoYXMgdGhlIHNhbWUgdGltZXN0YW1wLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gZ2VuZXJhdGUgdGhlIGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgY2hhdC5jb21wbGV0aW9uLmNodW5rYC5cbiAgICovXG4gIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbi5jaHVuayc7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmluZ2VycHJpbnQgcmVwcmVzZW50cyB0aGUgYmFja2VuZCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG1vZGVsIHJ1bnMgd2l0aC5cbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNlZWRgIHJlcXVlc3QgcGFyYW1ldGVyIHRvIHVuZGVyc3RhbmQgd2hlblxuICAgKiBiYWNrZW5kIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBtaWdodCBpbXBhY3QgZGV0ZXJtaW5pc20uXG4gICAqL1xuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZpZWxkIHRoYXQgd2lsbCBvbmx5IGJlIHByZXNlbnQgd2hlbiB5b3Ugc2V0XG4gICAqIGBzdHJlYW1fb3B0aW9uczoge1wiaW5jbHVkZV91c2FnZVwiOiB0cnVlfWAgaW4geW91ciByZXF1ZXN0LiBXaGVuIHByZXNlbnQsIGl0XG4gICAqIGNvbnRhaW5zIGEgbnVsbCB2YWx1ZSBleGNlcHQgZm9yIHRoZSBsYXN0IGNodW5rIHdoaWNoIGNvbnRhaW5zIHRoZSB0b2tlbiB1c2FnZVxuICAgKiBzdGF0aXN0aWNzIGZvciB0aGUgZW50aXJlIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZT86IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25Vc2FnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNodW5rIHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZGVsdGE6IENob2ljZS5EZWx0YTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1vZGVsIHN0b3BwZWQgZ2VuZXJhdGluZyB0b2tlbnMuIFRoaXMgd2lsbCBiZSBgc3RvcGAgaWYgdGhlIG1vZGVsXG4gICAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgICAqIGNvbnRlbnQgd2FzIG9taXR0ZWQgZHVlIHRvIGEgZmxhZyBmcm9tIG91ciBjb250ZW50IGZpbHRlcnMsIGB0b29sX2NhbGxzYCBpZiB0aGVcbiAgICAgKiBtb2RlbCBjYWxsZWQgYSB0b29sLCBvciBgZnVuY3Rpb25fY2FsbGAgKGRlcHJlY2F0ZWQpIGlmIHRoZSBtb2RlbCBjYWxsZWQgYVxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ3Rvb2xfY2FsbHMnIHwgJ2NvbnRlbnRfZmlsdGVyJyB8ICdmdW5jdGlvbl9jYWxsJyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzLlxuICAgICAqL1xuICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgbG9ncHJvYnM/OiBDaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBEZWx0YSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjb250ZW50cyBvZiB0aGUgY2h1bmsgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudD86IHN0cmluZyB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGB0b29sX2NhbGxzYC4gVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZlxuICAgICAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uX2NhbGw/OiBEZWx0YS5GdW5jdGlvbkNhbGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGF1dGhvciBvZiB0aGlzIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIHJvbGU/OiAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3Rvb2wnO1xuXG4gICAgICB0b29sX2NhbGxzPzogQXJyYXk8RGVsdGEuVG9vbENhbGw+O1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGVsdGEge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAgICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgZnVuY3Rpb24/OiBUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHR5cGU/OiAnZnVuY3Rpb24nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAgICovXG4gICAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIExvZ3Byb2JzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIG1lc3NhZ2UgY29udGVudCB0b2tlbnMgd2l0aCBsb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IEFycmF5PENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYj4gfCBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgfCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlIHtcbiAgaW1hZ2VfdXJsOiBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2UuSW1hZ2VVUkw7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50IHBhcnQuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2VfdXJsJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEltYWdlVVJMIHtcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBVUkwgb2YgdGhlIGltYWdlIG9yIHRoZSBiYXNlNjQgZW5jb2RlZCBpbWFnZSBkYXRhLlxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBkZXRhaWwgbGV2ZWwgb2YgdGhlIGltYWdlLiBMZWFybiBtb3JlIGluIHRoZVxuICAgICAqIFtWaXNpb24gZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy92aXNpb24vbG93LW9yLWhpZ2gtZmlkZWxpdHktaW1hZ2UtdW5kZXJzdGFuZGluZykuXG4gICAgICovXG4gICAgZGV0YWlsPzogJ2F1dG8nIHwgJ2xvdycgfCAnaGlnaCc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb250ZW50LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xufVxuXG4vKipcbiAqIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHZpYSBge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9YCBmb3JjZXMgdGhlIG1vZGVsXG4gKiB0byBjYWxsIHRoYXQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgZnVuY3Rpb24gbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYGZ1bmN0aW9uYC5cbiAgICovXG4gIHJvbGU6ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQSBjaGF0IGNvbXBsZXRpb24gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIHRoaXMgbWVzc2FnZS5cbiAgICovXG4gIHJvbGU6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZnVuY3Rpb25fY2FsbD86IENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGw7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIGNhbGxzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwsIHN1Y2ggYXMgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtID1cbiAgfCBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbVxuICB8IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbVxuICB8IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IHRoZSBtb2RlbCBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbjogQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSB0b29sLiBDdXJyZW50bHksIG9ubHkgYGZ1bmN0aW9uYCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IHRoZSBtb2RlbCBjYWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZmllcyBhIHRvb2wgdGhlIG1vZGVsIHNob3VsZCB1c2UuIFVzZSB0byBmb3JjZSB0aGUgbW9kZWwgdG8gY2FsbCBhIHNwZWNpZmljXG4gKiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSB7XG4gIGZ1bmN0aW9uOiBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZS5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIGEgbWVzc2FnZVxuICovXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblJvbGUgPSAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3Rvb2wnIHwgJ2Z1bmN0aW9uJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBzZXQsIGFuIGFkZGl0aW9uYWwgY2h1bmsgd2lsbCBiZSBzdHJlYW1lZCBiZWZvcmUgdGhlIGBkYXRhOiBbRE9ORV1gIG1lc3NhZ2UuXG4gICAqIFRoZSBgdXNhZ2VgIGZpZWxkIG9uIHRoaXMgY2h1bmsgc2hvd3MgdGhlIHRva2VuIHVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBlbnRpcmVcbiAgICogcmVxdWVzdCwgYW5kIHRoZSBgY2hvaWNlc2AgZmllbGQgd2lsbCBhbHdheXMgYmUgYW4gZW1wdHkgYXJyYXkuIEFsbCBvdGhlciBjaHVua3NcbiAgICogd2lsbCBhbHNvIGluY2x1ZGUgYSBgdXNhZ2VgIGZpZWxkLCBidXQgd2l0aCBhIG51bGwgdmFsdWUuXG4gICAqL1xuICBpbmNsdWRlX3VzYWdlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHN5c3RlbSBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHN5c3RlbWAuXG4gICAqL1xuICByb2xlOiAnc3lzdGVtJztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHBhcnRpY2lwYW50LiBQcm92aWRlcyB0aGUgbW9kZWwgaW5mb3JtYXRpb24gdG9cbiAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBhcnRpY2lwYW50cyBvZiB0aGUgc2FtZSByb2xlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYiB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4uXG4gICAqL1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBieXRlcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uXG4gICAqIFVzZWZ1bCBpbiBpbnN0YW5jZXMgd2hlcmUgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgbXVsdGlwbGUgdG9rZW5zIGFuZFxuICAgKiB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9ucyBtdXN0IGJlIGNvbWJpbmVkIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IHRleHRcbiAgICogcmVwcmVzZW50YXRpb24uIENhbiBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYnl0ZXMgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB0b2tlbi5cbiAgICovXG4gIGJ5dGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGxvZyBwcm9iYWJpbGl0eSBvZiB0aGlzIHRva2VuLCBpZiBpdCBpcyB3aXRoaW4gdGhlIHRvcCAyMCBtb3N0IGxpa2VseVxuICAgKiB0b2tlbnMuIE90aGVyd2lzZSwgdGhlIHZhbHVlIGAtOTk5OS4wYCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhhdCB0aGUgdG9rZW4gaXMgdmVyeVxuICAgKiB1bmxpa2VseS5cbiAgICovXG4gIGxvZ3Byb2I6IG51bWJlcjtcblxuICAvKipcbiAgICogTGlzdCBvZiB0aGUgbW9zdCBsaWtlbHkgdG9rZW5zIGFuZCB0aGVpciBsb2cgcHJvYmFiaWxpdHksIGF0IHRoaXMgdG9rZW5cbiAgICogcG9zaXRpb24uIEluIHJhcmUgY2FzZXMsIHRoZXJlIG1heSBiZSBmZXdlciB0aGFuIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkXG4gICAqIGB0b3BfbG9ncHJvYnNgIHJldHVybmVkLlxuICAgKi9cbiAgdG9wX2xvZ3Byb2JzOiBBcnJheTxDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYi5Ub3BMb2dwcm9iPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9wTG9ncHJvYiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRva2VuLlxuICAgICAqL1xuICAgIHRva2VuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBieXRlcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uXG4gICAgICogVXNlZnVsIGluIGluc3RhbmNlcyB3aGVyZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB0b2tlbnMgYW5kXG4gICAgICogdGhlaXIgYnl0ZSByZXByZXNlbnRhdGlvbnMgbXVzdCBiZSBjb21iaW5lZCB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCB0ZXh0XG4gICAgICogcmVwcmVzZW50YXRpb24uIENhbiBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYnl0ZXMgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB0b2tlbi5cbiAgICAgKi9cbiAgICBieXRlczogQXJyYXk8bnVtYmVyPiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nIHByb2JhYmlsaXR5IG9mIHRoaXMgdG9rZW4sIGlmIGl0IGlzIHdpdGhpbiB0aGUgdG9wIDIwIG1vc3QgbGlrZWx5XG4gICAgICogdG9rZW5zLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBgLTk5OTkuMGAgaXMgdXNlZCB0byBzaWduaWZ5IHRoYXQgdGhlIHRva2VuIGlzIHZlcnlcbiAgICAgKiB1bmxpa2VseS5cbiAgICAgKi9cbiAgICBsb2dwcm9iOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblRvb2wge1xuICBmdW5jdGlvbjogU2hhcmVkLkZ1bmN0aW9uRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAqIG5vdCBjYWxsIGFueSB0b29sIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBtZWFucyB0aGUgbW9kZWwgY2FuXG4gKiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZSB0b29scy4gYHJlcXVpcmVkYCBtZWFuc1xuICogdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scy4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCB2aWFcbiAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gKiBjYWxsIHRoYXQgdG9vbC5cbiAqXG4gKiBgbm9uZWAgaXMgdGhlIGRlZmF1bHQgd2hlbiBubyB0b29scyBhcmUgcHJlc2VudC4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IGlmIHRvb2xzXG4gKiBhcmUgcHJlc2VudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgJ3JlcXVpcmVkJyB8IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHRvb2wgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIG1lc3NhZ2VzIGF1dGhvciwgaW4gdGhpcyBjYXNlIGB0b29sYC5cbiAgICovXG4gIHJvbGU6ICd0b29sJztcblxuICAvKipcbiAgICogVG9vbCBjYWxsIHRoYXQgdGhpcyBtZXNzYWdlIGlzIHJlc3BvbmRpbmcgdG8uXG4gICAqL1xuICB0b29sX2NhbGxfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW0ge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB1c2VyIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0PjtcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIG1lc3NhZ2VzIGF1dGhvciwgaW4gdGhpcyBjYXNlIGB1c2VyYC5cbiAgICovXG4gIHJvbGU6ICd1c2VyJztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHBhcnRpY2lwYW50LiBQcm92aWRlcyB0aGUgbW9kZWwgaW5mb3JtYXRpb24gdG9cbiAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBhcnRpY2lwYW50cyBvZiB0aGUgc2FtZSByb2xlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPVxuICB8IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtZXNzYWdlcyBjb21wcmlzaW5nIHRoZSBjb252ZXJzYXRpb24gc28gZmFyLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19mb3JtYXRfaW5wdXRzX3RvX2NoYXRncHRfbW9kZWxzKS5cbiAgICovXG4gIG1lc3NhZ2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbT47XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFNlZSB0aGVcbiAgICogW21vZGVsIGVuZHBvaW50IGNvbXBhdGliaWxpdHldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9tb2RlbC1lbmRwb2ludC1jb21wYXRpYmlsaXR5KVxuICAgKiB0YWJsZSBmb3IgZGV0YWlscyBvbiB3aGljaCBtb2RlbHMgd29yayB3aXRoIHRoZSBDaGF0IEFQSS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgQ2hhdEFQSS5DaGF0TW9kZWw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb24gdGhlaXJcbiAgICogZXhpc3RpbmcgZnJlcXVlbmN5IGluIHRoZSB0ZXh0IHNvIGZhciwgZGVjcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHJlcGVhdCB0aGUgc2FtZSBsaW5lIHZlcmJhdGltLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGB0b29sX2Nob2ljZWAuXG4gICAqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWxcbiAgICogd2lsbCBub3QgY2FsbCBhIGZ1bmN0aW9uIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBtZWFucyB0aGUgbW9kZWxcbiAgICogY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIGEgZnVuY3Rpb24uIFNwZWNpZnlpbmcgYVxuICAgKiBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHZpYSBge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9YCBmb3JjZXMgdGhlIG1vZGVsIHRvIGNhbGwgdGhhdFxuICAgKiBmdW5jdGlvbi5cbiAgICpcbiAgICogYG5vbmVgIGlzIHRoZSBkZWZhdWx0IHdoZW4gbm8gZnVuY3Rpb25zIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWZcbiAgICogZnVuY3Rpb25zIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgZnVuY3Rpb25fY2FsbD86ICdub25lJyB8ICdhdXRvJyB8IENoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGB0b29sc2AuXG4gICAqXG4gICAqIEEgbGlzdCBvZiBmdW5jdGlvbnMgdGhlIG1vZGVsIG1heSBnZW5lcmF0ZSBKU09OIGlucHV0cyBmb3IuXG4gICAqL1xuICBmdW5jdGlvbnM/OiBBcnJheTxDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5GdW5jdGlvbj47XG5cbiAgLyoqXG4gICAqIE1vZGlmeSB0aGUgbGlrZWxpaG9vZCBvZiBzcGVjaWZpZWQgdG9rZW5zIGFwcGVhcmluZyBpbiB0aGUgY29tcGxldGlvbi5cbiAgICpcbiAgICogQWNjZXB0cyBhIEpTT04gb2JqZWN0IHRoYXQgbWFwcyB0b2tlbnMgKHNwZWNpZmllZCBieSB0aGVpciB0b2tlbiBJRCBpbiB0aGVcbiAgICogdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC4gTWF0aGVtYXRpY2FsbHksIHRoZVxuICAgKiBiaWFzIGlzIGFkZGVkIHRvIHRoZSBsb2dpdHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBwcmlvciB0byBzYW1wbGluZy4gVGhlIGV4YWN0XG4gICAqIGVmZmVjdCB3aWxsIHZhcnkgcGVyIG1vZGVsLCBidXQgdmFsdWVzIGJldHdlZW4gLTEgYW5kIDEgc2hvdWxkIGRlY3JlYXNlIG9yXG4gICAqIGluY3JlYXNlIGxpa2VsaWhvb2Qgb2Ygc2VsZWN0aW9uOyB2YWx1ZXMgbGlrZSAtMTAwIG9yIDEwMCBzaG91bGQgcmVzdWx0IGluIGEgYmFuXG4gICAqIG9yIGV4Y2x1c2l2ZSBzZWxlY3Rpb24gb2YgdGhlIHJlbGV2YW50IHRva2VuLlxuICAgKi9cbiAgbG9naXRfYmlhcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHVybiBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgb3V0cHV0IHRva2VucyBvciBub3QuIElmIHRydWUsXG4gICAqIHJldHVybnMgdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIGVhY2ggb3V0cHV0IHRva2VuIHJldHVybmVkIGluIHRoZSBgY29udGVudGAgb2ZcbiAgICogYG1lc3NhZ2VgLlxuICAgKi9cbiAgbG9ncHJvYnM/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFt0b2tlbnNdKC90b2tlbml6ZXIpIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBpbiB0aGUgY2hhdFxuICAgKiBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBUaGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IHRva2VucyBhbmQgZ2VuZXJhdGVkIHRva2VucyBpcyBsaW1pdGVkIGJ5IHRoZSBtb2RlbCdzXG4gICAqIGNvbnRleHQgbGVuZ3RoLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19jb3VudF90b2tlbnNfd2l0aF90aWt0b2tlbilcbiAgICogZm9yIGNvdW50aW5nIHRva2Vucy5cbiAgICovXG4gIG1heF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcyB0byBnZW5lcmF0ZSBmb3IgZWFjaCBpbnB1dCBtZXNzYWdlLiBOb3RlIHRoYXRcbiAgICogeW91IHdpbGwgYmUgY2hhcmdlZCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGdlbmVyYXRlZCB0b2tlbnMgYWNyb3NzIGFsbCBvZiB0aGVcbiAgICogY2hvaWNlcy4gS2VlcCBgbmAgYXMgYDFgIHRvIG1pbmltaXplIGNvc3RzLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb25cbiAgICogd2hldGhlciB0aGV5IGFwcGVhciBpbiB0aGUgdGV4dCBzbyBmYXIsIGluY3JlYXNpbmcgdGhlIG1vZGVsJ3MgbGlrZWxpaG9vZCB0b1xuICAgKiB0YWxrIGFib3V0IG5ldyB0b3BpY3MuXG4gICAqXG4gICAqIFtTZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmcmVxdWVuY3kgYW5kIHByZXNlbmNlIHBlbmFsdGllcy5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vcGFyYW1ldGVyLWRldGFpbHMpXG4gICAqL1xuICBwcmVzZW5jZV9wZW5hbHR5PzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBuZXdlciB0aGFuIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5SZXNwb25zZUZvcm1hdDtcblxuICAvKipcbiAgICogVGhpcyBmZWF0dXJlIGlzIGluIEJldGEuIElmIHNwZWNpZmllZCwgb3VyIHN5c3RlbSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0b1xuICAgKiBzYW1wbGUgZGV0ZXJtaW5pc3RpY2FsbHksIHN1Y2ggdGhhdCByZXBlYXRlZCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGBzZWVkYCBhbmRcbiAgICogcGFyYW1ldGVycyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4gRGV0ZXJtaW5pc20gaXMgbm90IGd1YXJhbnRlZWQsIGFuZCB5b3VcbiAgICogc2hvdWxkIHJlZmVyIHRvIHRoZSBgc3lzdGVtX2ZpbmdlcnByaW50YCByZXNwb25zZSBwYXJhbWV0ZXIgdG8gbW9uaXRvciBjaGFuZ2VzXG4gICAqIGluIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFVwIHRvIDQgc2VxdWVuY2VzIHdoZXJlIHRoZSBBUEkgd2lsbCBzdG9wIGdlbmVyYXRpbmcgZnVydGhlciB0b2tlbnMuXG4gICAqL1xuICBzdG9wPzogc3RyaW5nIHwgbnVsbCB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlLiBPbmx5IHNldCB0aGlzIHdoZW4geW91IHNldCBgc3RyZWFtOiB0cnVlYC5cbiAgICovXG4gIHN0cmVhbV9vcHRpb25zPzogQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdG9wX3BgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2wgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbCBjYW5cbiAgICogcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmUgdG9vbHMuIGByZXF1aXJlZGAgbWVhbnNcbiAgICogdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scy4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCB2aWFcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqXG4gICAqIGBub25lYCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRvb2xzIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWYgdG9vbHNcbiAgICogYXJlIHByZXNlbnQuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IENoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIHRoZSBtb2RlbCBtYXkgY2FsbC4gQ3VycmVudGx5LCBvbmx5IGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkIGFzIGFcbiAgICogdG9vbC4gVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoZSBtb2RlbCBtYXkgZ2VuZXJhdGUgSlNPTiBpbnB1dHNcbiAgICogZm9yLiBBIG1heCBvZiAxMjggZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAqL1xuICB0b29scz86IEFycmF5PENoYXRDb21wbGV0aW9uVG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyMCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgbW9zdCBsaWtlbHkgdG9rZW5zIHRvXG4gICAqIHJldHVybiBhdCBlYWNoIHRva2VuIHBvc2l0aW9uLCBlYWNoIHdpdGggYW4gYXNzb2NpYXRlZCBsb2cgcHJvYmFiaWxpdHkuXG4gICAqIGBsb2dwcm9ic2AgbXVzdCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQuXG4gICAqL1xuICB0b3BfbG9ncHJvYnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdGVtcGVyYXR1cmVgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIE11c3QgYmUgYS16LCBBLVosIDAtOSwgb3IgY29udGFpblxuICAgICAqIHVuZGVyc2NvcmVzIGFuZCBkYXNoZXMsIHdpdGggYSBtYXhpbXVtIGxlbmd0aCBvZiA2NC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGNob29zZSB3aGVuIGFuZFxuICAgICAqIGhvdyB0byBjYWxsIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbnMgYWNjZXB0cywgZGVzY3JpYmVkIGFzIGEgSlNPTiBTY2hlbWEgb2JqZWN0LiBTZWUgdGhlXG4gICAgICogW2d1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL2Z1bmN0aW9uLWNhbGxpbmcpXG4gICAgICogZm9yIGV4YW1wbGVzLCBhbmQgdGhlXG4gICAgICogW0pTT04gU2NoZW1hIHJlZmVyZW5jZV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvdW5kZXJzdGFuZGluZy1qc29uLXNjaGVtYS8pIGZvclxuICAgICAqIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIE9taXR0aW5nIGBwYXJhbWV0ZXJzYCBkZWZpbmVzIGEgZnVuY3Rpb24gd2l0aCBhbiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC5cbiAgICAgKi9cbiAgICBwYXJhbWV0ZXJzPzogU2hhcmVkLkZ1bmN0aW9uUGFyYW1ldGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIG5ld2VyIHRoYW4gYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VGb3JtYXQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgb25lIG9mIGB0ZXh0YCBvciBganNvbl9vYmplY3RgLlxuICAgICAqL1xuICAgIHR5cGU/OiAndGV4dCcgfCAnanNvbl9vYmplY3QnO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPVxuICAgIENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0O1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uUm9sZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIENoYXRBUEkgZnJvbSAnLi9jaGF0JztcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gJy4vY29tcGxldGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgQ2hhdCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zID0gbmV3IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCB0eXBlIENoYXRNb2RlbCA9XG4gIHwgJ2dwdC00bydcbiAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gIHwgJ2dwdC00LXR1cmJvJ1xuICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gIHwgJ2dwdC00J1xuICB8ICdncHQtNC0wMzE0J1xuICB8ICdncHQtNC0wNjEzJ1xuICB8ICdncHQtNC0zMmsnXG4gIHwgJ2dwdC00LTMyay0wMzE0J1xuICB8ICdncHQtNC0zMmstMDYxMydcbiAgfCAnZ3B0LTMuNS10dXJibydcbiAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMDMwMSdcbiAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMyc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdCB7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdE1vZGVsID0gQ2hhdEFQSS5DaGF0TW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbnMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DaHVuayA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0ID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Sb2xlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZFxuICAgKi9cbiAgZXhwb3J0IGltcG9ydCBDcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlID0gQ29tcGxldGlvbnNBUEkuQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyB0eXBlIFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vX3NoaW1zL2luZGV4JztcbmltcG9ydCAqIGFzIFNwZWVjaEFQSSBmcm9tICcuL3NwZWVjaCc7XG5cbmV4cG9ydCBjbGFzcyBTcGVlY2ggZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYXVkaW8gZnJvbSB0aGUgaW5wdXQgdGV4dC5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBTcGVlY2hDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXVkaW8vc3BlZWNoJywgeyBib2R5LCAuLi5vcHRpb25zLCBfX2JpbmFyeVJlc3BvbnNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BlZWNoQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGdlbmVyYXRlIGF1ZGlvIGZvci4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDQwOTYgY2hhcmFjdGVycy5cbiAgICovXG4gIGlucHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9uZSBvZiB0aGUgYXZhaWxhYmxlIFtUVFMgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvdHRzKTpcbiAgICogYHR0cy0xYCBvciBgdHRzLTEtaGRgXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd0dHMtMScgfCAndHRzLTEtaGQnO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgYXVkaW8uIFN1cHBvcnRlZCB2b2ljZXMgYXJlIGBhbGxveWAsXG4gICAqIGBlY2hvYCwgYGZhYmxlYCwgYG9ueXhgLCBgbm92YWAsIGFuZCBgc2hpbW1lcmAuIFByZXZpZXdzIG9mIHRoZSB2b2ljZXMgYXJlXG4gICAqIGF2YWlsYWJsZSBpbiB0aGVcbiAgICogW1RleHQgdG8gc3BlZWNoIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC10by1zcGVlY2gvdm9pY2Utb3B0aW9ucykuXG4gICAqL1xuICB2b2ljZTogJ2FsbG95JyB8ICdlY2hvJyB8ICdmYWJsZScgfCAnb255eCcgfCAnbm92YScgfCAnc2hpbW1lcic7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgdG8gYXVkaW8gaW4uIFN1cHBvcnRlZCBmb3JtYXRzIGFyZSBgbXAzYCwgYG9wdXNgLCBgYWFjYCwgYGZsYWNgLFxuICAgKiBgd2F2YCwgYW5kIGBwY21gLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ21wMycgfCAnb3B1cycgfCAnYWFjJyB8ICdmbGFjJyB8ICd3YXYnIHwgJ3BjbSc7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVlZCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLiBTZWxlY3QgYSB2YWx1ZSBmcm9tIGAwLjI1YCB0byBgNC4wYC4gYDEuMGAgaXNcbiAgICogdGhlIGRlZmF1bHQuXG4gICAqL1xuICBzcGVlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTcGVlY2gge1xuICBleHBvcnQgaW1wb3J0IFNwZWVjaENyZWF0ZVBhcmFtcyA9IFNwZWVjaEFQSS5TcGVlY2hDcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSAnLi90cmFuc2NyaXB0aW9ucyc7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNjcmlwdGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUcmFuc2NyaWJlcyBhdWRpbyBpbnRvIHRoZSBpbnB1dCBsYW5ndWFnZS5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUcmFuc2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXVkaW8vdHJhbnNjcmlwdGlvbnMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2NyaXB0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRpb24ge1xuICAvKipcbiAgICogVGhlIHRyYW5zY3JpYmVkIHRleHQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZmlsZSBvYmplY3QgKG5vdCBmaWxlIG5hbWUpIHRvIHRyYW5zY3JpYmUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOlxuICAgKiBmbGFjLCBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItMWAgKHdoaWNoIGlzIHBvd2VyZWQgYnkgb3VyIG9wZW4gc291cmNlXG4gICAqIFdoaXNwZXIgVjIgbW9kZWwpIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLTEnO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGlucHV0IGF1ZGlvLiBTdXBwbHlpbmcgdGhlIGlucHV0IGxhbmd1YWdlIGluXG4gICAqIFtJU08tNjM5LTFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfSVNPXzYzOS0xX2NvZGVzKSBmb3JtYXQgd2lsbFxuICAgKiBpbXByb3ZlIGFjY3VyYWN5IGFuZCBsYXRlbmN5LlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGVcbiAgICogW3Byb21wdF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZylcbiAgICogc2hvdWxkIG1hdGNoIHRoZSBhdWRpbyBsYW5ndWFnZS5cbiAgICovXG4gIHByb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBvZiB0aGUgdHJhbnNjcmlwdCBvdXRwdXQsIGluIG9uZSBvZiB0aGVzZSBvcHRpb25zOiBganNvbmAsIGB0ZXh0YCxcbiAgICogYHNydGAsIGB2ZXJib3NlX2pzb25gLCBvciBgdnR0YC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICdqc29uJyB8ICd0ZXh0JyB8ICdzcnQnIHwgJ3ZlcmJvc2VfanNvbicgfCAndnR0JztcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlLCBiZXR3ZWVuIDAgYW5kIDEuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbCBtYWtlIHRoZVxuICAgKiBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZSBmb2N1c2VkIGFuZFxuICAgKiBkZXRlcm1pbmlzdGljLiBJZiBzZXQgdG8gMCwgdGhlIG1vZGVsIHdpbGwgdXNlXG4gICAqIFtsb2cgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvZ19wcm9iYWJpbGl0eSkgdG9cbiAgICogYXV0b21hdGljYWxseSBpbmNyZWFzZSB0aGUgdGVtcGVyYXR1cmUgdW50aWwgY2VydGFpbiB0aHJlc2hvbGRzIGFyZSBoaXQuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBncmFudWxhcml0aWVzIHRvIHBvcHVsYXRlIGZvciB0aGlzIHRyYW5zY3JpcHRpb24uXG4gICAqIGByZXNwb25zZV9mb3JtYXRgIG11c3QgYmUgc2V0IGB2ZXJib3NlX2pzb25gIHRvIHVzZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdGllcy5cbiAgICogRWl0aGVyIG9yIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgc3VwcG9ydGVkOiBgd29yZGAsIG9yIGBzZWdtZW50YC4gTm90ZTogVGhlcmVcbiAgICogaXMgbm8gYWRkaXRpb25hbCBsYXRlbmN5IGZvciBzZWdtZW50IHRpbWVzdGFtcHMsIGJ1dCBnZW5lcmF0aW5nIHdvcmQgdGltZXN0YW1wc1xuICAgKiBpbmN1cnMgYWRkaXRpb25hbCBsYXRlbmN5LlxuICAgKi9cbiAgdGltZXN0YW1wX2dyYW51bGFyaXRpZXM/OiBBcnJheTwnd29yZCcgfCAnc2VnbWVudCc+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRyYW5zY3JpcHRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNBUEkgZnJvbSAnLi90cmFuc2xhdGlvbnMnO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYXVkaW8gaW50byBFbmdsaXNoLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUcmFuc2xhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2F1ZGlvL3RyYW5zbGF0aW9ucycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0cmFuc2xhdGUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOiBmbGFjLFxuICAgKiBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItMWAgKHdoaWNoIGlzIHBvd2VyZWQgYnkgb3VyIG9wZW4gc291cmNlXG4gICAqIFdoaXNwZXIgVjIgbW9kZWwpIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLTEnO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZXh0IHRvIGd1aWRlIHRoZSBtb2RlbCdzIHN0eWxlIG9yIGNvbnRpbnVlIGEgcHJldmlvdXMgYXVkaW9cbiAgICogc2VnbWVudC4gVGhlXG4gICAqIFtwcm9tcHRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zcGVlY2gtdG8tdGV4dC9wcm9tcHRpbmcpXG4gICAqIHNob3VsZCBiZSBpbiBFbmdsaXNoLlxuICAgKi9cbiAgcHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSB0cmFuc2NyaXB0IG91dHB1dCwgaW4gb25lIG9mIHRoZXNlIG9wdGlvbnM6IGBqc29uYCwgYHRleHRgLFxuICAgKiBgc3J0YCwgYHZlcmJvc2VfanNvbmAsIG9yIGB2dHRgLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUsIGJldHdlZW4gMCBhbmQgMS4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsIG1ha2UgdGhlXG4gICAqIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlIGZvY3VzZWQgYW5kXG4gICAqIGRldGVybWluaXN0aWMuIElmIHNldCB0byAwLCB0aGUgbW9kZWwgd2lsbCB1c2VcbiAgICogW2xvZyBwcm9iYWJpbGl0eV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9nX3Byb2JhYmlsaXR5KSB0b1xuICAgKiBhdXRvbWF0aWNhbGx5IGluY3JlYXNlIHRoZSB0ZW1wZXJhdHVyZSB1bnRpbCBjZXJ0YWluIHRocmVzaG9sZHMgYXJlIGhpdC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRyYW5zbGF0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb24gPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBTcGVlY2hBUEkgZnJvbSAnLi9zcGVlY2gnO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSAnLi90cmFuc2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNBUEkgZnJvbSAnLi90cmFuc2xhdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgQXVkaW8gZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHRyYW5zY3JpcHRpb25zOiBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9ucyA9IG5ldyBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9ucyh0aGlzLl9jbGllbnQpO1xuICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbnMgPSBuZXcgVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucyh0aGlzLl9jbGllbnQpO1xuICBzcGVlY2g6IFNwZWVjaEFQSS5TcGVlY2ggPSBuZXcgU3BlZWNoQVBJLlNwZWVjaCh0aGlzLl9jbGllbnQpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEF1ZGlvIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9ucyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb24gPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9ucyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb24gPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgU3BlZWNoID0gU3BlZWNoQVBJLlNwZWVjaDtcbiAgZXhwb3J0IGltcG9ydCBTcGVlY2hDcmVhdGVQYXJhbXMgPSBTcGVlY2hBUEkuU3BlZWNoQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCAqIGFzIEJhdGNoZXNBUEkgZnJvbSAnLi9iYXRjaGVzJztcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gJy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGV4ZWN1dGVzIGEgYmF0Y2ggZnJvbSBhbiB1cGxvYWRlZCBmaWxlIG9mIHJlcXVlc3RzXG4gICAqL1xuICBjcmVhdGUoYm9keTogQmF0Y2hDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYmF0Y2hlcycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBiYXRjaC5cbiAgICovXG4gIHJldHJpZXZlKGJhdGNoSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2JhdGNoZXMvJHtiYXRjaElkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgeW91ciBvcmdhbml6YXRpb24ncyBiYXRjaGVzLlxuICAgKi9cbiAgbGlzdChxdWVyeT86IEJhdGNoTGlzdFBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD47XG4gIGxpc3QoXG4gICAgcXVlcnk6IEJhdGNoTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxCYXRjaGVzUGFnZSwgQmF0Y2g+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvYmF0Y2hlcycsIEJhdGNoZXNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYW4gaW4tcHJvZ3Jlc3MgYmF0Y2guXG4gICAqL1xuICBjYW5jZWwoYmF0Y2hJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL2JhdGNoZXMvJHtiYXRjaElkfS9jYW5jZWxgLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmF0Y2hlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEJhdGNoPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoIHtcbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWUgZnJhbWUgd2l0aGluIHdoaWNoIHRoZSBiYXRjaCBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgY29tcGxldGlvbl93aW5kb3c6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBPcGVuQUkgQVBJIGVuZHBvaW50IHVzZWQgYnkgdGhlIGJhdGNoLlxuICAgKi9cbiAgZW5kcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBpbnB1dCBmaWxlIGZvciB0aGUgYmF0Y2guXG4gICAqL1xuICBpbnB1dF9maWxlX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBiYXRjaGAuXG4gICAqL1xuICBvYmplY3Q6ICdiYXRjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYmF0Y2guXG4gICAqL1xuICBzdGF0dXM6XG4gICAgfCAndmFsaWRhdGluZydcbiAgICB8ICdmYWlsZWQnXG4gICAgfCAnaW5fcHJvZ3Jlc3MnXG4gICAgfCAnZmluYWxpemluZydcbiAgICB8ICdjb21wbGV0ZWQnXG4gICAgfCAnZXhwaXJlZCdcbiAgICB8ICdjYW5jZWxsaW5nJ1xuICAgIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICBjYW5jZWxsZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHN0YXJ0ZWQgY2FuY2VsbGluZy5cbiAgICovXG4gIGNhbmNlbGxpbmdfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdXRwdXRzIG9mIHJlcXVlc3RzIHdpdGggZXJyb3JzLlxuICAgKi9cbiAgZXJyb3JfZmlsZV9pZD86IHN0cmluZztcblxuICBlcnJvcnM/OiBCYXRjaC5FcnJvcnM7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIGV4cGlyZWQuXG4gICAqL1xuICBleHBpcmVkX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCB3aWxsIGV4cGlyZS5cbiAgICovXG4gIGV4cGlyZXNfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBmaW5hbGl6aW5nLlxuICAgKi9cbiAgZmluYWxpemluZ19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBwcm9jZXNzaW5nLlxuICAgKi9cbiAgaW5fcHJvZ3Jlc3NfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdXRwdXRzIG9mIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCByZXF1ZXN0cy5cbiAgICovXG4gIG91dHB1dF9maWxlX2lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBjb3VudHMgZm9yIGRpZmZlcmVudCBzdGF0dXNlcyB3aXRoaW4gdGhlIGJhdGNoLlxuICAgKi9cbiAgcmVxdWVzdF9jb3VudHM/OiBCYXRjaFJlcXVlc3RDb3VudHM7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQmF0Y2gge1xuICBleHBvcnQgaW50ZXJmYWNlIEVycm9ycyB7XG4gICAgZGF0YT86IEFycmF5PEJhdGNoZXNBUEkuQmF0Y2hFcnJvcj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgbGlzdGAuXG4gICAgICovXG4gICAgb2JqZWN0Pzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hFcnJvciB7XG4gIC8qKlxuICAgKiBBbiBlcnJvciBjb2RlIGlkZW50aWZ5aW5nIHRoZSBlcnJvciB0eXBlLlxuICAgKi9cbiAgY29kZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBpbnB1dCBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIGxpbmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgcHJvdmlkaW5nIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZXJyb3IuXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY2F1c2VkIHRoZSBlcnJvciwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHBhcmFtPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBjb3VudHMgZm9yIGRpZmZlcmVudCBzdGF0dXNlcyB3aXRoaW4gdGhlIGJhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoUmVxdWVzdENvdW50cyB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIGNvbXBsZXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcmVxdWVzdHMgaW4gdGhlIGJhdGNoLlxuICAgKi9cbiAgdG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaENyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBmcmFtZSB3aXRoaW4gd2hpY2ggdGhlIGJhdGNoIHNob3VsZCBiZSBwcm9jZXNzZWQuIEN1cnJlbnRseSBvbmx5IGAyNGhgXG4gICAqIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIGNvbXBsZXRpb25fd2luZG93OiAnMjRoJztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHRvIGJlIHVzZWQgZm9yIGFsbCByZXF1ZXN0cyBpbiB0aGUgYmF0Y2guIEN1cnJlbnRseVxuICAgKiBgL3YxL2NoYXQvY29tcGxldGlvbnNgLCBgL3YxL2VtYmVkZGluZ3NgLCBhbmQgYC92MS9jb21wbGV0aW9uc2AgYXJlIHN1cHBvcnRlZC5cbiAgICogTm90ZSB0aGF0IGAvdjEvZW1iZWRkaW5nc2AgYmF0Y2hlcyBhcmUgYWxzbyByZXN0cmljdGVkIHRvIGEgbWF4aW11bSBvZiA1MCwwMDBcbiAgICogZW1iZWRkaW5nIGlucHV0cyBhY3Jvc3MgYWxsIHJlcXVlc3RzIGluIHRoZSBiYXRjaC5cbiAgICovXG4gIGVuZHBvaW50OiAnL3YxL2NoYXQvY29tcGxldGlvbnMnIHwgJy92MS9lbWJlZGRpbmdzJyB8ICcvdjEvY29tcGxldGlvbnMnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gdXBsb2FkZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHJlcXVlc3RzIGZvciB0aGUgbmV3IGJhdGNoLlxuICAgKlxuICAgKiBTZWUgW3VwbG9hZCBmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL2NyZWF0ZSlcbiAgICogZm9yIGhvdyB0byB1cGxvYWQgYSBmaWxlLlxuICAgKlxuICAgKiBZb3VyIGlucHV0IGZpbGUgbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYVxuICAgKiBbSlNPTkwgZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9iYXRjaC9yZXF1ZXN0SW5wdXQpLFxuICAgKiBhbmQgbXVzdCBiZSB1cGxvYWRlZCB3aXRoIHRoZSBwdXJwb3NlIGBiYXRjaGAuIFRoZSBmaWxlIGNhbiBjb250YWluIHVwIHRvIDUwLDAwMFxuICAgKiByZXF1ZXN0cywgYW5kIGNhbiBiZSB1cCB0byAxMDAgTUIgaW4gc2l6ZS5cbiAgICovXG4gIGlucHV0X2ZpbGVfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGZvciB0aGUgYmF0Y2guXG4gICAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IG5hbWVzcGFjZSBCYXRjaGVzIHtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaCA9IEJhdGNoZXNBUEkuQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hFcnJvciA9IEJhdGNoZXNBUEkuQmF0Y2hFcnJvcjtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaFJlcXVlc3RDb3VudHMgPSBCYXRjaGVzQVBJLkJhdGNoUmVxdWVzdENvdW50cztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaGVzUGFnZSA9IEJhdGNoZXNBUEkuQmF0Y2hlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hDcmVhdGVQYXJhbXMgPSBCYXRjaGVzQVBJLkJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoTGlzdFBhcmFtcyA9IEJhdGNoZXNBUEkuQmF0Y2hMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSAnLi9hc3Npc3RhbnRzJztcbmltcG9ydCAqIGFzIFNoYXJlZCBmcm9tICcuLi9zaGFyZWQnO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSAnLi90aHJlYWRzL21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSAnLi90aHJlYWRzL3RocmVhZHMnO1xuaW1wb3J0ICogYXMgUnVuc0FQSSBmcm9tICcuL3RocmVhZHMvcnVucy9ydW5zJztcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gJy4vdGhyZWFkcy9ydW5zL3N0ZXBzJztcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gJy4uLy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgQXNzaXN0YW50cyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBhc3Npc3RhbnQgd2l0aCBhIG1vZGVsIGFuZCBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBjcmVhdGUoYm9keTogQXNzaXN0YW50Q3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxBc3Npc3RhbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9hc3Npc3RhbnRzJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhbiBhc3Npc3RhbnQuXG4gICAqL1xuICByZXRyaWV2ZShhc3Npc3RhbnRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxBc3Npc3RhbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2Fzc2lzdGFudHMvJHthc3Npc3RhbnRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhbiBhc3Npc3RhbnQuXG4gICAqL1xuICB1cGRhdGUoXG4gICAgYXNzaXN0YW50SWQ6IHN0cmluZyxcbiAgICBib2R5OiBBc3Npc3RhbnRVcGRhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxBc3Npc3RhbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC9hc3Npc3RhbnRzLyR7YXNzaXN0YW50SWR9YCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFzc2lzdGFudHMuXG4gICAqL1xuICBsaXN0KFxuICAgIHF1ZXJ5PzogQXNzaXN0YW50TGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxBc3Npc3RhbnRzUGFnZSwgQXNzaXN0YW50PjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8QXNzaXN0YW50c1BhZ2UsIEFzc2lzdGFudD47XG4gIGxpc3QoXG4gICAgcXVlcnk6IEFzc2lzdGFudExpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8QXNzaXN0YW50c1BhZ2UsIEFzc2lzdGFudD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9hc3Npc3RhbnRzJywgQXNzaXN0YW50c1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGFzc2lzdGFudC5cbiAgICovXG4gIGRlbChhc3Npc3RhbnRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxBc3Npc3RhbnREZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC9hc3Npc3RhbnRzLyR7YXNzaXN0YW50SWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2lzdGFudHNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxBc3Npc3RhbnQ+IHt9XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBgYXNzaXN0YW50YCB0aGF0IGNhbiBjYWxsIHRoZSBtb2RlbCBhbmQgdXNlIHRvb2xzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGFzc2lzdGFudCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgY2hhcmFjdGVycy5cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGluc3RydWN0aW9ucyB0aGF0IHRoZSBhc3Npc3RhbnQgdXNlcy4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiwwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIGluc3RydWN0aW9uczogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYgY2hhcmFjdGVycy5cbiAgICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBhc3Npc3RhbnRgLlxuICAgKi9cbiAgb2JqZWN0OiAnYXNzaXN0YW50JztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2wgZW5hYmxlZCBvbiB0aGUgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEyOCB0b29scyBwZXJcbiAgICogYXNzaXN0YW50LiBUb29scyBjYW4gYmUgb2YgdHlwZXMgYGNvZGVfaW50ZXJwcmV0ZXJgLCBgZmlsZV9zZWFyY2hgLCBvclxuICAgKiBgZnVuY3Rpb25gLlxuICAgKi9cbiAgdG9vbHM6IEFycmF5PEFzc2lzdGFudFRvb2w+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICB0b29sX3Jlc291cmNlcz86IEFzc2lzdGFudC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFzc2lzdGFudCB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYGAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnREZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ2Fzc2lzdGFudC5kZWxldGVkJztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGVtaXR0ZWQgd2hlbiBzdHJlYW1pbmcgYSBSdW4uXG4gKlxuICogRWFjaCBldmVudCBpbiBhIHNlcnZlci1zZW50IGV2ZW50cyBzdHJlYW0gaGFzIGFuIGBldmVudGAgYW5kIGBkYXRhYCBwcm9wZXJ0eTpcbiAqXG4gKiBgYGBcbiAqIGV2ZW50OiB0aHJlYWQuY3JlYXRlZFxuICogZGF0YToge1wiaWRcIjogXCJ0aHJlYWRfMTIzXCIsIFwib2JqZWN0XCI6IFwidGhyZWFkXCIsIC4uLn1cbiAqIGBgYFxuICpcbiAqIFdlIGVtaXQgZXZlbnRzIHdoZW5ldmVyIGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkLCB0cmFuc2l0aW9ucyB0byBhIG5ldyBzdGF0ZSwgb3JcbiAqIGlzIGJlaW5nIHN0cmVhbWVkIGluIHBhcnRzIChkZWx0YXMpLiBGb3IgZXhhbXBsZSwgd2UgZW1pdCBgdGhyZWFkLnJ1bi5jcmVhdGVkYFxuICogd2hlbiBhIG5ldyBydW4gaXMgY3JlYXRlZCwgYHRocmVhZC5ydW4uY29tcGxldGVkYCB3aGVuIGEgcnVuIGNvbXBsZXRlcywgYW5kIHNvXG4gKiBvbi4gV2hlbiBhbiBBc3Npc3RhbnQgY2hvb3NlcyB0byBjcmVhdGUgYSBtZXNzYWdlIGR1cmluZyBhIHJ1biwgd2UgZW1pdCBhXG4gKiBgdGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCBldmVudGAsIGEgYHRocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzYCBldmVudCwgbWFueVxuICogYHRocmVhZC5tZXNzYWdlLmRlbHRhYCBldmVudHMsIGFuZCBmaW5hbGx5IGEgYHRocmVhZC5tZXNzYWdlLmNvbXBsZXRlZGAgZXZlbnQuXG4gKlxuICogV2UgbWF5IGFkZCBhZGRpdGlvbmFsIGV2ZW50cyBvdmVyIHRpbWUsIHNvIHdlIHJlY29tbWVuZCBoYW5kbGluZyB1bmtub3duIGV2ZW50c1xuICogZ3JhY2VmdWxseSBpbiB5b3VyIGNvZGUuIFNlZSB0aGVcbiAqIFtBc3Npc3RhbnRzIEFQSSBxdWlja3N0YXJ0XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL292ZXJ2aWV3KVxuICogdG8gbGVhcm4gaG93IHRvIGludGVncmF0ZSB0aGUgQXNzaXN0YW50cyBBUEkgd2l0aCBzdHJlYW1pbmcuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFN0cmVhbUV2ZW50ID1cbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRDcmVhdGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blF1ZXVlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkluUHJvZ3Jlc3NcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5SZXF1aXJlc0FjdGlvblxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkZhaWxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxpbmdcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5DYW5jZWxsZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5FeHBpcmVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBEZWx0YVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDb21wbGV0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwRmFpbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENhbmNlbGxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBFeHBpcmVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VEZWx0YVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VDb21wbGV0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5jb21wbGV0ZVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LkVycm9yRXZlbnQ7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50U3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzL29iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zXG4gICAgICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBUaHJlYWRzQVBJLlRocmVhZDtcblxuICAgIGV2ZW50OiAndGhyZWFkLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgbmV3XG4gICAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHF1ZXVlZGAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5RdWV1ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5xdWV1ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGByZXF1aXJlc19hY3Rpb25gIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuUmVxdWlyZXNBY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5Db21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGBjYW5jZWxsaW5nYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNhbmNlbGxpbmcge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGlzIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5leHBpcmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENhbmNlbGxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBFeHBpcmVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBtb3Zlc1xuICAgKiB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBwYXJ0cyBvZiBhXG4gICAqIFtNZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgbWVzc2FnZSBkdXJpbmdcbiAgICAgKiBzdHJlYW1pbmcuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhRXZlbnQ7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAgICogY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlQ29tcGxldGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgZW5kc1xuICAgKiBiZWZvcmUgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlSW5jb21wbGV0ZSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFuXG4gICAqIFtlcnJvcl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2Vycm9yLWNvZGVzL2FwaS1lcnJvcnMpIG9jY3Vycy5cbiAgICogVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBhbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3Igb3IgYSB0aW1lb3V0LlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IHtcbiAgICBkYXRhOiBTaGFyZWQuRXJyb3JPYmplY3Q7XG5cbiAgICBldmVudDogJ2Vycm9yJztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRUb29sID0gQ29kZUludGVycHJldGVyVG9vbCB8IEZpbGVTZWFyY2hUb29sIHwgRnVuY3Rpb25Ub29sO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2wge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBiZWluZyBkZWZpbmVkOiBgY29kZV9pbnRlcnByZXRlcmBcbiAgICovXG4gIHR5cGU6ICdjb2RlX2ludGVycHJldGVyJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoVG9vbCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGJlaW5nIGRlZmluZWQ6IGBmaWxlX3NlYXJjaGBcbiAgICovXG4gIHR5cGU6ICdmaWxlX3NlYXJjaCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25Ub29sIHtcbiAgZnVuY3Rpb246IFNoYXJlZC5GdW5jdGlvbkRlZmluaXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgYmVpbmcgZGVmaW5lZDogYGZ1bmN0aW9uYFxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBPY2N1cnMgd2hlbiBhXG4gKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gKiBjcmVhdGVkLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU3RyZWFtRXZlbnQgPVxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ3JlYXRlZFxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5Qcm9ncmVzc1xuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlRGVsdGFcbiAgfCBNZXNzYWdlU3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNvbXBsZXRlZFxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5jb21wbGV0ZTtcblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIG1vdmVzXG4gICAqIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW01lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBlbmRzXG4gICAqIGJlZm9yZSBpdCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBPY2N1cnMgd2hlbiBhXG4gKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAqIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1blN0ZXBTdHJlYW1FdmVudCA9XG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDcmVhdGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBJblByb2dyZXNzXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBEZWx0YVxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ29tcGxldGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBGYWlsZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENhbmNlbGxlZFxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwRXhwaXJlZDtcblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdGVwU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGFyZVxuICAgKiBiZWluZyBzdHJlYW1lZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcERlbHRhIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgcnVuIHN0ZXAgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBydW4gc3RlcCBkdXJpbmdcbiAgICAgKiBzdHJlYW1pbmcuXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcERlbHRhRXZlbnQ7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5kZWx0YSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ29tcGxldGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBGYWlsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjYW5jZWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBleHBpcmVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5leHBpcmVkJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGEgbmV3XG4gKiBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KSBpcyBjcmVhdGVkLlxuICovXG5leHBvcnQgdHlwZSBSdW5TdHJlYW1FdmVudCA9XG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ3JlYXRlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1blF1ZXVlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkluUHJvZ3Jlc3NcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5SZXF1aXJlc0FjdGlvblxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNvbXBsZXRlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkZhaWxlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxpbmdcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5DYW5jZWxsZWRcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5FeHBpcmVkO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0cmVhbUV2ZW50IHtcbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgbmV3XG4gICAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHF1ZXVlZGAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5RdWV1ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5xdWV1ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGByZXF1aXJlc19hY3Rpb25gIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuUmVxdWlyZXNBY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5Db21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGBjYW5jZWxsaW5nYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNhbmNlbGxpbmcge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGlzIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5leHBpcmVkJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGEgbmV3XG4gKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMvb2JqZWN0KSBpc1xuICogY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgdGhyZWFkIHRoYXQgY29udGFpbnNcbiAgICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAgICovXG4gIGRhdGE6IFRocmVhZHNBUEkuVGhyZWFkO1xuXG4gIGV2ZW50OiAndGhyZWFkLmNyZWF0ZWQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudENyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMyc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgNTEyIGNoYXJhY3RlcnMuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlIGFzc2lzdGFudCB1c2VzLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2LDAwMFxuICAgKiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogQXNzaXN0YW50Q3JlYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbCBlbmFibGVkIG9uIHRoZSBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IHRvb2xzIHBlclxuICAgKiBhc3Npc3RhbnQuIFRvb2xzIGNhbiBiZSBvZiB0eXBlcyBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudFRvb2w+O1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50Q3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxXG4gICAgICAgKiB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG8gdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRmlsZVNlYXJjaCB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRvXG4gICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdmVjdG9yIHN0b3JlLiBUaGlzIGNhbiBiZVxuICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICogb2YgNTEyIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAgICovXG4gICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgY2hhcmFjdGVycy5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYXNzaXN0YW50IHVzZXMuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYsMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBBc3Npc3RhbnRVcGRhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29sIGVuYWJsZWQgb24gdGhlIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMjggdG9vbHMgcGVyXG4gICAqIGFzc2lzdGFudC4gVG9vbHMgY2FuIGJlIG9mIHR5cGVzIGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnJpZGVzIHRoZSBsaXN0IG9mXG4gICAgICAgKiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGUgYXZhaWxhYmxlXG4gICAgICAgKiB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXMgYXNzb2NpYXRlZFxuICAgICAgICogd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFzc2lzdGFudHMge1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudERlbGV0ZWQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudERlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50U3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2wgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbCA9IEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbCA9IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sID0gQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZVN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5NZXNzYWdlU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5SdW5TdGVwU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlJ1blN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRocmVhZFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5UaHJlYWRTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRzUGFnZSA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50Q3JlYXRlUGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VXBkYXRlUGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50TGlzdFBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50TGlzdFBhcmFtcztcbn1cbiIsICJpbXBvcnQgeyB0eXBlIENoYXRDb21wbGV0aW9uUnVubmVyIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5pbXBvcnQgeyBKU09OU2NoZW1hIH0gZnJvbSAnLi9qc29uc2NoZW1hJztcblxudHlwZSBQcm9taXNlT3JWYWx1ZTxUPiA9IFQgfCBQcm9taXNlPFQ+O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICAvKipcbiAgICogQHBhcmFtIGFyZ3MgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGBwYXJzZWAuXG4gICAqIEBwYXJhbSBydW5uZXIgdGhlIHJ1bm5lciBldmFsdWF0aW5nIHRoaXMgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIGEgc3RyaW5nIHRvIHNlbmQgYmFjayB0byBPcGVuQUkuXG4gICAqL1xuICBmdW5jdGlvbjogKFxuICAgIGFyZ3M6IEFyZ3MsXG4gICAgcnVubmVyOiBDaGF0Q29tcGxldGlvblJ1bm5lciB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICApID0+IFByb21pc2VPclZhbHVlPHVua25vd24+O1xuICAvKipcbiAgICogQHBhcmFtIGlucHV0IHRoZSByYXcgYXJncyBmcm9tIHRoZSBPcGVuQUkgZnVuY3Rpb24gY2FsbC5cbiAgICogQHJldHVybnMgdGhlIHBhcnNlZCBhcmd1bWVudHMgdG8gcGFzcyB0byBgZnVuY3Rpb25gXG4gICAqL1xuICBwYXJzZTogKGlucHV0OiBzdHJpbmcpID0+IFByb21pc2VPclZhbHVlPEFyZ3M+O1xuICAvKipcbiAgICogVGhlIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMsIGRlc2NyaWJlcyBhcyBhIEpTT04gU2NoZW1hIG9iamVjdC5cbiAgICovXG4gIHBhcmFtZXRlcnM6IEpTT05TY2hlbWE7XG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGNob29zZSB3aGVuIGFuZCBob3cgdG8gY2FsbCB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gV2lsbCBkZWZhdWx0IHRvIGZ1bmN0aW9uLm5hbWUgaWYgb21pdHRlZC5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlID0ge1xuICAvKipcbiAgICogQHBhcmFtIGFyZ3MgdGhlIHJhdyBhcmdzIGZyb20gdGhlIE9wZW5BSSBmdW5jdGlvbiBjYWxsLlxuICAgKiBAcmV0dXJucyBhIHN0cmluZyB0byBzZW5kIGJhY2sgdG8gT3BlbkFJXG4gICAqL1xuICBmdW5jdGlvbjogKFxuICAgIGFyZ3M6IHN0cmluZyxcbiAgICBydW5uZXI6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gICkgPT4gUHJvbWlzZU9yVmFsdWU8dW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gYWNjZXB0cywgZGVzY3JpYmVzIGFzIGEgSlNPTiBTY2hlbWEgb2JqZWN0LlxuICAgKi9cbiAgcGFyYW1ldGVyczogSlNPTlNjaGVtYTtcbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywgdXNlZCBieSB0aGUgbW9kZWwgdG8gY2hvb3NlIHdoZW4gYW5kIGhvdyB0byBjYWxsIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBXaWxsIGRlZmF1bHQgdG8gZnVuY3Rpb24ubmFtZSBpZiBvbWl0dGVkLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdCB8IHN0cmluZz4gPVxuICBBcmdzIGV4dGVuZHMgc3RyaW5nID8gUnVubmFibGVGdW5jdGlvbldpdGhvdXRQYXJzZVxuICA6IEFyZ3MgZXh0ZW5kcyBvYmplY3QgPyBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbEZ1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBvYmplY3QgfCBzdHJpbmc+ID1cbiAgQXJncyBleHRlbmRzIHN0cmluZyA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aG91dFBhcnNlXG4gIDogQXJncyBleHRlbmRzIG9iamVjdCA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aG91dFBhcnNlID0ge1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhvdXRQYXJzZTtcbn07XG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xGdW5jdGlvbldpdGhQYXJzZTxBcmdzIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgdHlwZTogJ2Z1bmN0aW9uJztcbiAgZnVuY3Rpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+KFxuICBmbjogYW55LFxuKTogZm4gaXMgUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPiB7XG4gIHJldHVybiB0eXBlb2YgKGZuIGFzIGFueSkucGFyc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzID0gcmVhZG9ubHkgKG9iamVjdCB8IHN0cmluZylbXTtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVGdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9XG4gIFthbnlbXV0gZXh0ZW5kcyBbRnVuY3Rpb25zQXJnc10gPyByZWFkb25seSBSdW5uYWJsZUZ1bmN0aW9uPGFueT5bXVxuICA6IHtcbiAgICAgIFtJbmRleCBpbiBrZXlvZiBGdW5jdGlvbnNBcmdzXTogSW5kZXggZXh0ZW5kcyBudW1iZXIgPyBSdW5uYWJsZUZ1bmN0aW9uPEZ1bmN0aW9uc0FyZ3NbSW5kZXhdPlxuICAgICAgOiBGdW5jdGlvbnNBcmdzW0luZGV4XTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPVxuICBbYW55W11dIGV4dGVuZHMgW0Z1bmN0aW9uc0FyZ3NdID8gcmVhZG9ubHkgUnVubmFibGVUb29sRnVuY3Rpb248YW55PltdXG4gIDoge1xuICAgICAgW0luZGV4IGluIGtleW9mIEZ1bmN0aW9uc0FyZ3NdOiBJbmRleCBleHRlbmRzIG51bWJlciA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uPEZ1bmN0aW9uc0FyZ3NbSW5kZXhdPlxuICAgICAgOiBGdW5jdGlvbnNBcmdzW0luZGV4XTtcbiAgICB9O1xuXG4vKipcbiAqIFRoaXMgaXMgaGVscGVyIGNsYXNzIGZvciBwYXNzaW5nIGEgYGZ1bmN0aW9uYCBhbmQgYHBhcnNlYCB3aGVyZSB0aGUgYGZ1bmN0aW9uYFxuICogYXJndW1lbnQgdHlwZSBtYXRjaGVzIHRoZSBgcGFyc2VgIHJldHVybiB0eXBlLlxuICpcbiAqIEBkZXByZWNhdGVkIC0gcGxlYXNlIHVzZSBQYXJzaW5nVG9vbEZ1bmN0aW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzaW5nRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdD4ge1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsnZnVuY3Rpb24nXTtcbiAgcGFyc2U6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ3BhcnNlJ107XG4gIHBhcmFtZXRlcnM6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ3BhcmFtZXRlcnMnXTtcbiAgZGVzY3JpcHRpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ2Rlc2NyaXB0aW9uJ107XG4gIG5hbWU/OiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WyduYW1lJ107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz4pIHtcbiAgICB0aGlzLmZ1bmN0aW9uID0gaW5wdXQuZnVuY3Rpb247XG4gICAgdGhpcy5wYXJzZSA9IGlucHV0LnBhcnNlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IGlucHV0LnBhcmFtZXRlcnM7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGlucHV0LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMubmFtZSA9IGlucHV0Lm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGhlbHBlciBjbGFzcyBmb3IgcGFzc2luZyBhIGBmdW5jdGlvbmAgYW5kIGBwYXJzZWAgd2hlcmUgdGhlIGBmdW5jdGlvbmBcbiAqIGFyZ3VtZW50IHR5cGUgbWF0Y2hlcyB0aGUgYHBhcnNlYCByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNpbmdUb29sRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdD4ge1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPjtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPikge1xuICAgIHRoaXMudHlwZSA9ICdmdW5jdGlvbic7XG4gICAgdGhpcy5mdW5jdGlvbiA9IGlucHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSxcbn0gZnJvbSBcIi4uL3Jlc291cmNlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNBc3Npc3RhbnRNZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0+IHtcbiAgcmV0dXJuIG1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25NZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0gPT4ge1xuICByZXR1cm4gbWVzc2FnZT8ucm9sZSA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rvb2xNZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9PiB7XG4gIHJldHVybiBtZXNzYWdlPy5yb2xlID09PSAndG9vbCc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZW50PFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgVCB7XG4gIHJldHVybiBvYmogIT0gbnVsbDtcbn1cbiIsICJpbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBsZXRpb25Vc2FnZSB9IGZyb20gXCIuLi9yZXNvdXJjZXMvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb24sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uVG9vbCxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBBUElVc2VyQWJvcnRFcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7XG4gIHR5cGUgUnVubmFibGVGdW5jdGlvbixcbiAgaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlLFxuICB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzLFxufSBmcm9tICcuL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtcywgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQge1xuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zLFxuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXMsXG59IGZyb20gJy4vQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXInO1xuaW1wb3J0IHsgaXNBc3Npc3RhbnRNZXNzYWdlLCBpc0Z1bmN0aW9uTWVzc2FnZSwgaXNUb29sTWVzc2FnZSB9IGZyb20gJy4vY2hhdENvbXBsZXRpb25VdGlscyc7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0NIQVRfQ09NUExFVElPTlMgPSAxMDtcbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyT3B0aW9ucyBleHRlbmRzIENvcmUuUmVxdWVzdE9wdGlvbnMge1xuICAvKiogSG93IG1hbnkgcmVxdWVzdHMgdG8gbWFrZSBiZWZvcmUgY2FuY2VsaW5nLiBEZWZhdWx0IDEwLiAqL1xuICBtYXhDaGF0Q29tcGxldGlvbnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyPFxuICBFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiA9IEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMsXG4+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICNjb25uZWN0ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUNvbm5lY3RlZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdENvbm5lY3RlZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjZW5kUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgI3Jlc29sdmVFbmRQcm9taXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICNyZWplY3RFbmRQcm9taXNlOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgI2xpc3RlbmVyczogeyBbRXZlbnQgaW4ga2V5b2YgRXZlbnRzXT86IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IH0gPSB7fTtcblxuICBwcm90ZWN0ZWQgX2NoYXRDb21wbGV0aW9uczogQ2hhdENvbXBsZXRpb25bXSA9IFtdO1xuICBtZXNzYWdlczogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW1bXSA9IFtdO1xuXG4gICNlbmRlZCA9IGZhbHNlO1xuICAjZXJyb3JlZCA9IGZhbHNlO1xuICAjYWJvcnRlZCA9IGZhbHNlO1xuICAjY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgdGhpcy4jZW5kUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICAvLyBEb24ndCBsZXQgdGhlc2UgcHJvbWlzZXMgY2F1c2UgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvcnMuXG4gICAgLy8gd2Ugd2lsbCBtYW51YWxseSBjYXVzZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yIGxhdGVyXG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IHJlZ2lzdGVyZWQgYW55IGVycm9yIGxpc3RlbmVyIG9yIGNhbGxlZFxuICAgIC8vIGFueSBwcm9taXNlLXJldHVybmluZyBtZXRob2QuXG4gICAgdGhpcy4jY29ubmVjdGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgdGhpcy4jZW5kUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3J1bihleGVjdXRvcjogKCkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgLy8gVW5mb3J0dW5hdGVseSBpZiB3ZSBjYWxsIGBleGVjdXRvcigpYCBpbW1lZGlhdGVseSB3ZSBnZXQgcnVudGltZSBlcnJvcnMgYWJvdXRcbiAgICAvLyByZWZlcmVuY2VzIHRvIGB0aGlzYCBiZWZvcmUgdGhlIGBzdXBlcigpYCBjb25zdHJ1Y3RvciBjYWxsIHJldHVybnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBleGVjdXRvcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbWl0RmluYWwoKTtcbiAgICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICB9LCB0aGlzLiNoYW5kbGVFcnJvcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZENoYXRDb21wbGV0aW9uKGNoYXRDb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbik6IENoYXRDb21wbGV0aW9uIHtcbiAgICB0aGlzLl9jaGF0Q29tcGxldGlvbnMucHVzaChjaGF0Q29tcGxldGlvbik7XG4gICAgdGhpcy5fZW1pdCgnY2hhdENvbXBsZXRpb24nLCBjaGF0Q29tcGxldGlvbik7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNoYXRDb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2UpIHRoaXMuX2FkZE1lc3NhZ2UobWVzc2FnZSBhcyBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSk7XG4gICAgcmV0dXJuIGNoYXRDb21wbGV0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZGRNZXNzYWdlKG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLCBlbWl0ID0gdHJ1ZSkge1xuICAgIGlmICghKCdjb250ZW50JyBpbiBtZXNzYWdlKSkgbWVzc2FnZS5jb250ZW50ID0gbnVsbDtcblxuICAgIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcblxuICAgIGlmIChlbWl0KSB7XG4gICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICBpZiAoKGlzRnVuY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHx8IGlzVG9vbE1lc3NhZ2UobWVzc2FnZSkpICYmIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICAvLyBOb3RlLCB0aGlzIGFzc3VtZXMgdGhhdCB7cm9sZTogJ3Rvb2wnLCBjb250ZW50OiBcdTIwMjZ9IGlzIGFsd2F5cyB0aGUgcmVzdWx0IG9mIGEgY2FsbCBvZiB0b29sIG9mIHR5cGU9ZnVuY3Rpb24uXG4gICAgICAgIHRoaXMuX2VtaXQoJ2Z1bmN0aW9uQ2FsbFJlc3VsdCcsIG1lc3NhZ2UuY29udGVudCBhcyBzdHJpbmcpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS5mdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoJ2Z1bmN0aW9uQ2FsbCcsIG1lc3NhZ2UuZnVuY3Rpb25fY2FsbCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b29sX2NhbGwgb2YgbWVzc2FnZS50b29sX2NhbGxzKSB7XG4gICAgICAgICAgaWYgKHRvb2xfY2FsbC50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0KCdmdW5jdGlvbkNhbGwnLCB0b29sX2NhbGwuZnVuY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfY29ubmVjdGVkKCkge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG4gICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UoKTtcbiAgICB0aGlzLl9lbWl0KCdjb25uZWN0Jyk7XG4gIH1cblxuICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2VuZGVkO1xuICB9XG5cbiAgZ2V0IGVycm9yZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yZWQ7XG4gIH1cblxuICBnZXQgYWJvcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jYWJvcnRlZDtcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RlbmVycyBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBObyBjaGVja3MgYXJlIG1hZGUgdG8gc2VlIGlmIHRoZSBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLiBNdWx0aXBsZSBjYWxscyBwYXNzaW5nXG4gICAqIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGV2ZW50IGFuZCBsaXN0ZW5lciB3aWxsIHJlc3VsdCBpbiB0aGUgbGlzdGVuZXIgYmVpbmcgYWRkZWQsIGFuZFxuICAgKiBjYWxsZWQsIG11bHRpcGxlIHRpbWVzLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbjxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50Pik6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gPVxuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSB8fCAodGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaCh7IGxpc3RlbmVyIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBvZmYoKSB3aWxsIHJlbW92ZSwgYXQgbW9zdCwgb25lIGluc3RhbmNlIG9mIGEgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkuIElmIGFueSBzaW5nbGVcbiAgICogbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgbXVsdGlwbGUgdGltZXMgdG8gdGhlIGxpc3RlbmVyIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LCB0aGVuXG4gICAqIG9mZigpIG11c3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHJlbW92ZSBlYWNoIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvZmY8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG9uZS10aW1lIGxpc3RlbmVyIGZ1bmN0aW9uIGZvciB0aGUgZXZlbnQuIFRoZSBuZXh0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogdGhpcyBsaXN0ZW5lciBpcyByZW1vdmVkIGFuZCB0aGVuIGludm9rZWQuXG4gICAqIEByZXR1cm5zIHRoaXMgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWRcbiAgICovXG4gIG9uY2U8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciwgb25jZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYC5vbmNlKClgLCBidXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lXG4gICAqIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsIGluc3RlYWQgb2YgY2FsbGluZyBhIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lIGdpdmVuIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBpcyBlbWl0dGVkLiAgKElmIHlvdSByZXF1ZXN0IHRoZSAnZXJyb3InIGV2ZW50LFxuICAgKiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGVycm9yKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogICBjb25zdCBtZXNzYWdlID0gYXdhaXQgc3RyZWFtLmVtaXR0ZWQoJ21lc3NhZ2UnKSAvLyByZWplY3RzIGlmIHRoZSBzdHJlYW0gZXJyb3JzXG4gICAqL1xuICBlbWl0dGVkPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudDogRXZlbnQsXG4gICk6IFByb21pc2U8XG4gICAgRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW2luZmVyIFBhcmFtXSA/IFBhcmFtXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4gZXh0ZW5kcyBbXSA/IHZvaWRcbiAgICA6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PlxuICA+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IHRydWU7XG4gICAgICBpZiAoZXZlbnQgIT09ICdlcnJvcicpIHRoaXMub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgdGhpcy5vbmNlKGV2ZW50LCByZXNvbHZlIGFzIGFueSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkb25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMuI2VuZFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZmluYWwgQ2hhdENvbXBsZXRpb24sIG9yIHJlamVjdHNcbiAgICogaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uLlxuICAgKi9cbiAgYXN5bmMgZmluYWxDaGF0Q29tcGxldGlvbigpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuX2NoYXRDb21wbGV0aW9uc1t0aGlzLl9jaGF0Q29tcGxldGlvbnMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFjb21wbGV0aW9uKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoJ3N0cmVhbSBlbmRlZCB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uJyk7XG4gICAgcmV0dXJuIGNvbXBsZXRpb247XG4gIH1cblxuICAjZ2V0RmluYWxDb250ZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbE1lc3NhZ2UoKS5jb250ZW50ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgZmluYWwgQ2hhdENvbXBsZXRpb25NZXNzYWdlLCBvciByZWplY3RzXG4gICAqIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuXG4gICAqL1xuICBhc3luYyBmaW5hbENvbnRlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsQ29udGVudCgpO1xuICB9XG5cbiAgI2dldEZpbmFsTWVzc2FnZSgpOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2Uge1xuICAgIGxldCBpID0gdGhpcy5tZXNzYWdlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQgPz8gbnVsbCB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoJ3N0cmVhbSBlbmRlZCB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZSB3aXRoIHJvbGU9YXNzaXN0YW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGhlIGZpbmFsIGFzc2lzdGFudCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UgcmVzcG9uc2UsXG4gICAqIG9yIHJlamVjdHMgaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZS5cbiAgICovXG4gIGFzeW5jIGZpbmFsTWVzc2FnZSgpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uTWVzc2FnZT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbE1lc3NhZ2UoKTtcbiAgfVxuXG4gICNnZXRGaW5hbEZ1bmN0aW9uQ2FsbCgpOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubWVzc2FnZXNbaV07XG4gICAgICBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2U/LmZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZnVuY3Rpb25fY2FsbDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZT8udG9vbF9jYWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLnRvb2xfY2FsbHMuYXQoLTEpPy5mdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgZmluYWwgRnVuY3Rpb25DYWxsLCBvciByZWplY3RzXG4gICAqIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuXG4gICAqL1xuICBhc3luYyBmaW5hbEZ1bmN0aW9uQ2FsbCgpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGwgfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGwoKTtcbiAgfVxuXG4gICNnZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tpXTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uTWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLmNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBpc1Rvb2xNZXNzYWdlKG1lc3NhZ2UpICYmXG4gICAgICAgIG1lc3NhZ2UuY29udGVudCAhPSBudWxsICYmXG4gICAgICAgIHRoaXMubWVzc2FnZXMuc29tZShcbiAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgIHgucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiZcbiAgICAgICAgICAgIHgudG9vbF9jYWxscz8uc29tZSgoeSkgPT4geS50eXBlID09PSAnZnVuY3Rpb24nICYmIHkuaWQgPT09IG1lc3NhZ2UudG9vbF9jYWxsX2lkKSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTtcbiAgfVxuXG4gICNjYWxjdWxhdGVUb3RhbFVzYWdlKCk6IENvbXBsZXRpb25Vc2FnZSB7XG4gICAgY29uc3QgdG90YWw6IENvbXBsZXRpb25Vc2FnZSA9IHtcbiAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiAwLFxuICAgICAgcHJvbXB0X3Rva2VuczogMCxcbiAgICAgIHRvdGFsX3Rva2VuczogMCxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgeyB1c2FnZSB9IG9mIHRoaXMuX2NoYXRDb21wbGV0aW9ucykge1xuICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgIHRvdGFsLmNvbXBsZXRpb25fdG9rZW5zICs9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zO1xuICAgICAgICB0b3RhbC5wcm9tcHRfdG9rZW5zICs9IHVzYWdlLnByb21wdF90b2tlbnM7XG4gICAgICAgIHRvdGFsLnRvdGFsX3Rva2VucyArPSB1c2FnZS50b3RhbF90b2tlbnM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGFzeW5jIHRvdGFsVXNhZ2UoKTogUHJvbWlzZTxDb21wbGV0aW9uVXNhZ2U+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jY2FsY3VsYXRlVG90YWxVc2FnZSgpO1xuICB9XG5cbiAgYWxsQ2hhdENvbXBsZXRpb25zKCk6IENoYXRDb21wbGV0aW9uW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fY2hhdENvbXBsZXRpb25zXTtcbiAgfVxuXG4gICNoYW5kbGVFcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIHRoaXMuI2Vycm9yZWQgPSB0cnVlO1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgZXJyb3IgPSBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQVBJVXNlckFib3J0RXJyb3IpIHtcbiAgICAgIHRoaXMuI2Fib3J0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Fib3J0JywgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBPcGVuQUlFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3Qgb3BlbkFJRXJyb3I6IE9wZW5BSUVycm9yID0gbmV3IE9wZW5BSUVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3BlbkFJRXJyb3IuY2F1c2UgPSBlcnJvcjtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIG9wZW5BSUVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgbmV3IE9wZW5BSUVycm9yKFN0cmluZyhlcnJvcikpKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgX2VtaXQ8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgLi4uYXJnczogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+KSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGVtaXQgYW55IGV2ZW50cyBhZnRlciBlbmRcbiAgICBpZiAodGhpcy4jZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdlbmQnKSB7XG4gICAgICB0aGlzLiNlbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLiNyZXNvbHZlRW5kUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gfCB1bmRlZmluZWQgPSB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdO1xuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiAhbC5vbmNlKSBhcyBhbnk7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoeyBsaXN0ZW5lciB9OiBhbnkpID0+IGxpc3RlbmVyKC4uLmFyZ3MpKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdhYm9ydCcpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXJnc1swXSBhcyBBUElVc2VyQWJvcnRFcnJvcjtcbiAgICAgIGlmICghdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCAmJiAhbGlzdGVuZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gTk9URTogX2VtaXQoJ2Vycm9yJywgZXJyb3IpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tICNoYW5kbGVFcnJvcigpLlxuXG4gICAgICBjb25zdCBlcnJvciA9IGFyZ3NbMF0gYXMgT3BlbkFJRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgJiYgIWxpc3RlbmVycz8ubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBpZiB0aGUgdXNlciBoYXNuJ3QgcmVnaXN0ZXJlZCBhbnkgZXJyb3IgaGFuZGxlcnMuXG4gICAgICAgIC8vIElmIHlvdSBhcmUgc2VlaW5nIHN0YWNrIHRyYWNlcyBoZXJlLCBtYWtlIHN1cmUgdG8gaGFuZGxlIGVycm9ycyB2aWEgZWl0aGVyOlxuICAgICAgICAvLyAtIHJ1bm5lci5vbignZXJyb3InLCAoKSA9PiAuLi4pXG4gICAgICAgIC8vIC0gYXdhaXQgcnVubmVyLmRvbmUoKVxuICAgICAgICAvLyAtIGF3YWl0IHJ1bm5lci5maW5hbENoYXRDb21wbGV0aW9uKClcbiAgICAgICAgLy8gLSBldGMuXG4gICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3JlamVjdENvbm5lY3RlZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy4jcmVqZWN0RW5kUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLl9lbWl0KCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VtaXRGaW5hbCgpIHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5fY2hhdENvbXBsZXRpb25zW3RoaXMuX2NoYXRDb21wbGV0aW9ucy5sZW5ndGggLSAxXTtcbiAgICBpZiAoY29tcGxldGlvbikgdGhpcy5fZW1pdCgnZmluYWxDaGF0Q29tcGxldGlvbicsIGNvbXBsZXRpb24pO1xuICAgIGNvbnN0IGZpbmFsTWVzc2FnZSA9IHRoaXMuI2dldEZpbmFsTWVzc2FnZSgpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHRoaXMuX2VtaXQoJ2ZpbmFsTWVzc2FnZScsIGZpbmFsTWVzc2FnZSk7XG4gICAgY29uc3QgZmluYWxDb250ZW50ID0gdGhpcy4jZ2V0RmluYWxDb250ZW50KCk7XG4gICAgaWYgKGZpbmFsQ29udGVudCkgdGhpcy5fZW1pdCgnZmluYWxDb250ZW50JywgZmluYWxDb250ZW50KTtcblxuICAgIGNvbnN0IGZpbmFsRnVuY3Rpb25DYWxsID0gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGwoKTtcbiAgICBpZiAoZmluYWxGdW5jdGlvbkNhbGwpIHRoaXMuX2VtaXQoJ2ZpbmFsRnVuY3Rpb25DYWxsJywgZmluYWxGdW5jdGlvbkNhbGwpO1xuXG4gICAgY29uc3QgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQgPSB0aGlzLiNnZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpO1xuICAgIGlmIChmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCAhPSBudWxsKSB0aGlzLl9lbWl0KCdmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCcsIGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KTtcblxuICAgIGlmICh0aGlzLl9jaGF0Q29tcGxldGlvbnMuc29tZSgoYykgPT4gYy51c2FnZSkpIHtcbiAgICAgIHRoaXMuX2VtaXQoJ3RvdGFsVXNhZ2UnLCB0aGlzLiNjYWxjdWxhdGVUb3RhbFVzYWdlKCkpO1xuICAgIH1cbiAgfVxuXG4gICN2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5uICE9IG51bGwgJiYgcGFyYW1zLm4gPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICdDaGF0Q29tcGxldGlvbiBjb252ZW5pZW5jZSBoZWxwZXJzIG9ubHkgc3VwcG9ydCBuPTEgYXQgdGhpcyB0aW1lLiBUbyB1c2Ugbj4xLCBwbGVhc2UgdXNlIGNoYXQuY29tcGxldGlvbnMuY3JlYXRlKCkgZGlyZWN0bHkuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9jcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLiN2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuXG4gICAgY29uc3QgY2hhdENvbXBsZXRpb24gPSBhd2FpdCBjb21wbGV0aW9ucy5jcmVhdGUoXG4gICAgICB7IC4uLnBhcmFtcywgc3RyZWFtOiBmYWxzZSB9LFxuICAgICAgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGF0Q29tcGxldGlvbihjaGF0Q29tcGxldGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3J1bkNoYXRDb21wbGV0aW9uKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jcmVhdGVDaGF0Q29tcGxldGlvbihjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPlxuICAgICAgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCByb2xlID0gJ2Z1bmN0aW9uJyBhcyBjb25zdDtcbiAgICBjb25zdCB7IGZ1bmN0aW9uX2NhbGwgPSAnYXV0bycsIHN0cmVhbSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHNpbmdsZUZ1bmN0aW9uVG9DYWxsID0gdHlwZW9mIGZ1bmN0aW9uX2NhbGwgIT09ICdzdHJpbmcnICYmIGZ1bmN0aW9uX2NhbGw/Lm5hbWU7XG4gICAgY29uc3QgeyBtYXhDaGF0Q29tcGxldGlvbnMgPSBERUZBVUxUX01BWF9DSEFUX0NPTVBMRVRJT05TIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZnVuY3Rpb25zQnlOYW1lOiBSZWNvcmQ8c3RyaW5nLCBSdW5uYWJsZUZ1bmN0aW9uPGFueT4+ID0ge307XG4gICAgZm9yIChjb25zdCBmIG9mIHBhcmFtcy5mdW5jdGlvbnMpIHtcbiAgICAgIGZ1bmN0aW9uc0J5TmFtZVtmLm5hbWUgfHwgZi5mdW5jdGlvbi5uYW1lXSA9IGY7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5GdW5jdGlvbltdID0gcGFyYW1zLmZ1bmN0aW9ucy5tYXAoXG4gICAgICAoZik6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLkZ1bmN0aW9uID0+ICh7XG4gICAgICAgIG5hbWU6IGYubmFtZSB8fCBmLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnM6IGYucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgZGVzY3JpcHRpb246IGYuZGVzY3JpcHRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhDaGF0Q29tcGxldGlvbnM7ICsraSkge1xuICAgICAgY29uc3QgY2hhdENvbXBsZXRpb246IENoYXRDb21wbGV0aW9uID0gYXdhaXQgdGhpcy5fY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgICAgIGNvbXBsZXRpb25zLFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzdFBhcmFtcyxcbiAgICAgICAgICBmdW5jdGlvbl9jYWxsLFxuICAgICAgICAgIGZ1bmN0aW9ucyxcbiAgICAgICAgICBtZXNzYWdlczogWy4uLnRoaXMubWVzc2FnZXNdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGF0Q29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBtZXNzYWdlIGluIENoYXRDb21wbGV0aW9uIHJlc3BvbnNlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2UuZnVuY3Rpb25fY2FsbCkgcmV0dXJuO1xuICAgICAgY29uc3QgeyBuYW1lLCBhcmd1bWVudHM6IGFyZ3MgfSA9IG1lc3NhZ2UuZnVuY3Rpb25fY2FsbDtcbiAgICAgIGNvbnN0IGZuID0gZnVuY3Rpb25zQnlOYW1lW25hbWVdO1xuICAgICAgaWYgKCFmbikge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgZnVuY3Rpb25fY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uIEF2YWlsYWJsZSBvcHRpb25zIGFyZTogJHtmdW5jdGlvbnNcbiAgICAgICAgICAubWFwKChmKSA9PiBKU09OLnN0cmluZ2lmeShmLm5hbWUpKVxuICAgICAgICAgIC5qb2luKCcsICcpfS4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIG5hbWUsIGNvbnRlbnQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChzaW5nbGVGdW5jdGlvblRvQ2FsbCAmJiBzaW5nbGVGdW5jdGlvblRvQ2FsbCAhPT0gbmFtZSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgZnVuY3Rpb25fY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2luZ2xlRnVuY3Rpb25Ub0NhbGwsXG4gICAgICAgICl9IHJlcXVlc3RlZC4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIG5hbWUsIGNvbnRlbnQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGFyc2VkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlKGZuKSA/IGF3YWl0IGZuLnBhcnNlKGFyZ3MpIDogYXJncztcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2FkZE1lc3NhZ2Uoe1xuICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBjb250ZW50OiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpdCBjYW4ndCBydWxlIG91dCBgbmV2ZXJgIHR5cGUuXG4gICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgZm4uZnVuY3Rpb24ocGFyc2VkLCB0aGlzKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLiNzdHJpbmdpZnlGdW5jdGlvbkNhbGxSZXN1bHQocmF3Q29udGVudCk7XG5cbiAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCBuYW1lLCBjb250ZW50IH0pO1xuXG4gICAgICBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3J1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgcm9sZSA9ICd0b29sJyBhcyBjb25zdDtcbiAgICBjb25zdCB7IHRvb2xfY2hvaWNlID0gJ2F1dG8nLCBzdHJlYW0sIC4uLnJlc3RQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzaW5nbGVGdW5jdGlvblRvQ2FsbCA9IHR5cGVvZiB0b29sX2Nob2ljZSAhPT0gJ3N0cmluZycgJiYgdG9vbF9jaG9pY2U/LmZ1bmN0aW9uPy5uYW1lO1xuICAgIGNvbnN0IHsgbWF4Q2hhdENvbXBsZXRpb25zID0gREVGQVVMVF9NQVhfQ0hBVF9DT01QTEVUSU9OUyB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uc0J5TmFtZTogUmVjb3JkPHN0cmluZywgUnVubmFibGVGdW5jdGlvbjxhbnk+PiA9IHt9O1xuICAgIGZvciAoY29uc3QgZiBvZiBwYXJhbXMudG9vbHMpIHtcbiAgICAgIGlmIChmLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZnVuY3Rpb25zQnlOYW1lW2YuZnVuY3Rpb24ubmFtZSB8fCBmLmZ1bmN0aW9uLmZ1bmN0aW9uLm5hbWVdID0gZi5mdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0b29sczogQ2hhdENvbXBsZXRpb25Ub29sW10gPVxuICAgICAgJ3Rvb2xzJyBpbiBwYXJhbXMgP1xuICAgICAgICBwYXJhbXMudG9vbHMubWFwKCh0KSA9PlxuICAgICAgICAgIHQudHlwZSA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5mdW5jdGlvbi5uYW1lIHx8IHQuZnVuY3Rpb24uZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB0LmZ1bmN0aW9uLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZnVuY3Rpb24uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAodCBhcyB1bmtub3duIGFzIENoYXRDb21wbGV0aW9uVG9vbCksXG4gICAgICAgIClcbiAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhDaGF0Q29tcGxldGlvbnM7ICsraSkge1xuICAgICAgY29uc3QgY2hhdENvbXBsZXRpb246IENoYXRDb21wbGV0aW9uID0gYXdhaXQgdGhpcy5fY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgICAgIGNvbXBsZXRpb25zLFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzdFBhcmFtcyxcbiAgICAgICAgICB0b29sX2Nob2ljZSxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBtZXNzYWdlczogWy4uLnRoaXMubWVzc2FnZXNdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGF0Q29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBtZXNzYWdlIGluIENoYXRDb21wbGV0aW9uIHJlc3BvbnNlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdG9vbF9jYWxsIG9mIG1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICBpZiAodG9vbF9jYWxsLnR5cGUgIT09ICdmdW5jdGlvbicpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB0b29sX2NhbGxfaWQgPSB0b29sX2NhbGwuaWQ7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgYXJndW1lbnRzOiBhcmdzIH0gPSB0b29sX2NhbGwuZnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGZuID0gZnVuY3Rpb25zQnlOYW1lW25hbWVdO1xuXG4gICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgdG9vbF9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlOiAke3Rvb2xzXG4gICAgICAgICAgICAubWFwKChmKSA9PiBKU09OLnN0cmluZ2lmeShmLmZ1bmN0aW9uLm5hbWUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBQbGVhc2UgdHJ5IGFnYWluYDtcblxuICAgICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCB0b29sX2NhbGxfaWQsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwgJiYgc2luZ2xlRnVuY3Rpb25Ub0NhbGwgIT09IG5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgdG9vbF9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHNpbmdsZUZ1bmN0aW9uVG9DYWxsLFxuICAgICAgICAgICl9IHJlcXVlc3RlZC4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgdG9vbF9jYWxsX2lkLCBjb250ZW50IH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWQgPSBpc1J1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UoZm4pID8gYXdhaXQgZm4ucGFyc2UoYXJncykgOiBhcmdzO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaXQgY2FuJ3QgcnVsZSBvdXQgYG5ldmVyYCB0eXBlLlxuICAgICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgZm4uZnVuY3Rpb24ocGFyc2VkLCB0aGlzKTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuI3N0cmluZ2lmeUZ1bmN0aW9uQ2FsbFJlc3VsdChyYXdDb250ZW50KTtcbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcblxuICAgICAgICBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAjc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0KHJhd0NvbnRlbnQ6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgcmF3Q29udGVudCA9PT0gJ3N0cmluZycgPyByYXdDb250ZW50XG4gICAgICA6IHJhd0NvbnRlbnQgPT09IHVuZGVmaW5lZCA/ICd1bmRlZmluZWQnXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KHJhd0NvbnRlbnQpXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIEN1c3RvbUV2ZW50czxFdmVudCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEV2ZW50XTogayBleHRlbmRzIGtleW9mIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMgPyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzW2tdXG4gIDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufTtcblxudHlwZSBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBFdmVudCBleHRlbmRzIChcbiAga2V5b2YgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50c1xuKSA/XG4gIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHNbRXZlbnRdXG46IEV2ZW50c1tFdmVudF07XG5cbnR5cGUgTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEFycmF5PHtcbiAgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD47XG4gIG9uY2U/OiBib29sZWFuO1xufT47XG50eXBlIEV2ZW50UGFyYW1ldGVyczxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gUGFyYW1ldGVyczxcbiAgTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50PlxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIHtcbiAgY29ubmVjdDogKCkgPT4gdm9pZDtcbiAgZnVuY3Rpb25DYWxsOiAoZnVuY3Rpb25DYWxsOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsKSA9PiB2b2lkO1xuICBtZXNzYWdlOiAobWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0pID0+IHZvaWQ7XG4gIGNoYXRDb21wbGV0aW9uOiAoY29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24pID0+IHZvaWQ7XG4gIGZpbmFsQ29udGVudDogKGNvbnRlbnRTbmFwc2hvdDogc3RyaW5nKSA9PiB2b2lkO1xuICBmaW5hbE1lc3NhZ2U6IChtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSkgPT4gdm9pZDtcbiAgZmluYWxDaGF0Q29tcGxldGlvbjogKGNvbXBsZXRpb246IENoYXRDb21wbGV0aW9uKSA9PiB2b2lkO1xuICBmaW5hbEZ1bmN0aW9uQ2FsbDogKGZ1bmN0aW9uQ2FsbDogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbCkgPT4gdm9pZDtcbiAgZnVuY3Rpb25DYWxsUmVzdWx0OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xuICBmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdDogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbiAgZXJyb3I6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQ7XG4gIGFib3J0OiAoZXJyb3I6IEFQSVVzZXJBYm9ydEVycm9yKSA9PiB2b2lkO1xuICBlbmQ6ICgpID0+IHZvaWQ7XG4gIHRvdGFsVXNhZ2U6ICh1c2FnZTogQ29tcGxldGlvblVzYWdlKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZ1bmN0aW9ucywgdHlwZSBCYXNlRnVuY3Rpb25zQXJncywgUnVubmFibGVUb29scyB9IGZyb20gJy4vUnVubmFibGVGdW5jdGlvbic7XG5pbXBvcnQge1xuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyLFxuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzLFxuICBSdW5uZXJPcHRpb25zLFxufSBmcm9tICcuL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgaXNBc3Npc3RhbnRNZXNzYWdlIH0gZnJvbSAnLi9jaGF0Q29tcGxldGlvblV0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb250ZW50OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgJ2Z1bmN0aW9ucydcbj4gJiB7XG4gIGZ1bmN0aW9uczogUnVubmFibGVGdW5jdGlvbnM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9IE9taXQ8XG4gIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAndG9vbHMnXG4+ICYge1xuICB0b29sczogUnVubmFibGVUb29sczxGdW5jdGlvbnNBcmdzPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBDaGF0Q29tcGxldGlvblJ1bm5lciBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXI8Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHM+IHtcbiAgLyoqIEBkZXByZWNhdGVkIC0gcGxlYXNlIHVzZSBgcnVuVG9vbHNgIGluc3RlYWQuICovXG4gIHN0YXRpYyBydW5GdW5jdGlvbnMoXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxhbnlbXT4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25SdW5uZXIoKTtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAncnVuRnVuY3Rpb25zJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5GdW5jdGlvbnMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBzdGF0aWMgcnVuVG9vbHMoXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPGFueVtdPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblJ1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5Ub29scycgfSxcbiAgICB9O1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fcnVuVG9vbHMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBvdmVycmlkZSBfYWRkTWVzc2FnZShtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSkge1xuICAgIHN1cGVyLl9hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICB0aGlzLl9lbWl0KCdjb250ZW50JywgbWVzc2FnZS5jb250ZW50IGFzIHN0cmluZyk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgT3BlbkFJRXJyb3IsIEFQSVVzZXJBYm9ydEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5pbXBvcnQge1xuICBDb21wbGV0aW9ucyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbixcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNodW5rLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyLFxuICB0eXBlIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMsXG59IGZyb20gJy4vQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIFJlYWRhYmxlU3RyZWFtIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbWluZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3RyZWFtRXZlbnRzIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB7XG4gIGNvbnRlbnQ6IChjb250ZW50RGVsdGE6IHN0cmluZywgY29udGVudFNuYXBzaG90OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNodW5rOiAoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmssIHNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyA9IE9taXQ8Q2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLCAnc3RyZWFtJz4gJiB7XG4gIHN0cmVhbT86IHRydWU7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBsZXRpb25TdHJlYW1cbiAgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyPENoYXRDb21wbGV0aW9uU3RyZWFtRXZlbnRzPlxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8Q2hhdENvbXBsZXRpb25DaHVuaz5cbntcbiAgI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90IHwgdW5kZWZpbmVkO1xuXG4gIGdldCBjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCgpOiBDaGF0Q29tcGxldGlvblNuYXBzaG90IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gIH1cblxuICAvKipcbiAgICogSW50ZW5kZWQgZm9yIHVzZSBvbiB0aGUgZnJvbnRlbmQsIGNvbnN1bWluZyBhIHN0cmVhbSBwcm9kdWNlZCB3aXRoXG4gICAqIGAudG9SZWFkYWJsZVN0cmVhbSgpYCBvbiB0aGUgYmFja2VuZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IG1lc3NhZ2VzIHNlbnQgdG8gdGhlIG1vZGVsIGRvIG5vdCBhcHBlYXIgaW4gYC5vbignbWVzc2FnZScpYFxuICAgKiBpbiB0aGlzIGNvbnRleHQuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiBDaGF0Q29tcGxldGlvblN0cmVhbSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9mcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW0ge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3J1bkNoYXRDb21wbGV0aW9uKFxuICAgICAgICBjb21wbGV0aW9ucyxcbiAgICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgICB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9IH0sXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gICNiZWdpblJlcXVlc3QoKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcbiAgICB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAjYWRkQ2h1bmsoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmspIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLiNhY2N1bXVsYXRlQ2hhdENvbXBsZXRpb24oY2h1bmspO1xuICAgIHRoaXMuX2VtaXQoJ2NodW5rJywgY2h1bmssIGNvbXBsZXRpb24pO1xuICAgIGNvbnN0IGRlbHRhID0gY2h1bmsuY2hvaWNlc1swXT8uZGVsdGE/LmNvbnRlbnQ7XG4gICAgY29uc3Qgc25hcHNob3QgPSBjb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgaWYgKGRlbHRhICE9IG51bGwgJiYgc25hcHNob3Q/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIHNuYXBzaG90Py5jb250ZW50KSB7XG4gICAgICB0aGlzLl9lbWl0KCdjb250ZW50JywgZGVsdGEsIHNuYXBzaG90LmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICAjZW5kUmVxdWVzdCgpOiBDaGF0Q29tcGxldGlvbiB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgc3RyZWFtIGhhcyBlbmRlZCwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuYCk7XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGByZXF1ZXN0IGVuZGVkIHdpdGhvdXQgc2VuZGluZyBhbnkgY2h1bmtzYCk7XG4gICAgfVxuICAgIHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBmaW5hbGl6ZUNoYXRDb21wbGV0aW9uKHNuYXBzaG90KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgdGhpcy4jYmVnaW5SZXF1ZXN0KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgY29tcGxldGlvbnMuY3JlYXRlKFxuICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRDaHVuayhjaHVuayk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hhdENvbXBsZXRpb24odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfZnJvbVJlYWRhYmxlU3RyZWFtKFxuICAgIHJlYWRhYmxlU3RyZWFtOiBSZWFkYWJsZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLiNiZWdpblJlcXVlc3QoKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBTdHJlYW0uZnJvbVJlYWRhYmxlU3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+KHJlYWRhYmxlU3RyZWFtLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIGxldCBjaGF0SWQ7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW0pIHtcbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkICE9PSBjaHVuay5pZCkge1xuICAgICAgICAvLyBBIG5ldyByZXF1ZXN0IGhhcyBiZWVuIG1hZGUuXG4gICAgICAgIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2FkZENodW5rKGNodW5rKTtcbiAgICAgIGNoYXRJZCA9IGNodW5rLmlkO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICAjYWNjdW11bGF0ZUNoYXRDb21wbGV0aW9uKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rKTogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB7XG4gICAgbGV0IHNuYXBzaG90ID0gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gICAgY29uc3QgeyBjaG9pY2VzLCAuLi5yZXN0IH0gPSBjaHVuaztcbiAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICBzbmFwc2hvdCA9IHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90ID0ge1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICBjaG9pY2VzOiBbXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc25hcHNob3QsIHJlc3QpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyBkZWx0YSwgZmluaXNoX3JlYXNvbiwgaW5kZXgsIGxvZ3Byb2JzID0gbnVsbCwgLi4ub3RoZXIgfSBvZiBjaHVuay5jaG9pY2VzKSB7XG4gICAgICBsZXQgY2hvaWNlID0gc25hcHNob3QuY2hvaWNlc1tpbmRleF07XG4gICAgICBpZiAoIWNob2ljZSkge1xuICAgICAgICBjaG9pY2UgPSBzbmFwc2hvdC5jaG9pY2VzW2luZGV4XSA9IHsgZmluaXNoX3JlYXNvbiwgaW5kZXgsIG1lc3NhZ2U6IHt9LCBsb2dwcm9icywgLi4ub3RoZXIgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ3Byb2JzKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmxvZ3Byb2JzKSB7XG4gICAgICAgICAgY2hvaWNlLmxvZ3Byb2JzID0gT2JqZWN0LmFzc2lnbih7fSwgbG9ncHJvYnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY29udGVudCwgLi4ucmVzdCB9ID0gbG9ncHJvYnM7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihjaG9pY2UubG9ncHJvYnMsIHJlc3QpO1xuICAgICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjaG9pY2UubG9ncHJvYnMuY29udGVudCA/Pz0gW107XG4gICAgICAgICAgICBjaG9pY2UubG9ncHJvYnMuY29udGVudC5wdXNoKC4uLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluaXNoX3JlYXNvbikgY2hvaWNlLmZpbmlzaF9yZWFzb24gPSBmaW5pc2hfcmVhc29uO1xuICAgICAgT2JqZWN0LmFzc2lnbihjaG9pY2UsIG90aGVyKTtcblxuICAgICAgaWYgKCFkZWx0YSkgY29udGludWU7IC8vIFNob3VsZG4ndCBoYXBwZW47IGp1c3QgaW4gY2FzZS5cbiAgICAgIGNvbnN0IHsgY29udGVudCwgZnVuY3Rpb25fY2FsbCwgcm9sZSwgdG9vbF9jYWxscywgLi4ucmVzdCB9ID0gZGVsdGE7XG4gICAgICBPYmplY3QuYXNzaWduKGNob2ljZS5tZXNzYWdlLCByZXN0KTtcblxuICAgICAgaWYgKGNvbnRlbnQpIGNob2ljZS5tZXNzYWdlLmNvbnRlbnQgPSAoY2hvaWNlLm1lc3NhZ2UuY29udGVudCB8fCAnJykgKyBjb250ZW50O1xuICAgICAgaWYgKHJvbGUpIGNob2ljZS5tZXNzYWdlLnJvbGUgPSByb2xlO1xuICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbCA9IGZ1bmN0aW9uX2NhbGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwubmFtZSkgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5uYW1lID0gZnVuY3Rpb25fY2FsbC5uYW1lO1xuICAgICAgICAgIGlmIChmdW5jdGlvbl9jYWxsLmFyZ3VtZW50cykge1xuICAgICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgPz89ICcnO1xuICAgICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgKz0gZnVuY3Rpb25fY2FsbC5hcmd1bWVudHM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9vbF9jYWxscykge1xuICAgICAgICBpZiAoIWNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMpIGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IGluZGV4LCBpZCwgdHlwZSwgZnVuY3Rpb246IGZuLCAuLi5yZXN0IH0gb2YgdG9vbF9jYWxscykge1xuICAgICAgICAgIGNvbnN0IHRvb2xfY2FsbCA9IChjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzW2luZGV4XSA/Pz0ge30pO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9vbF9jYWxsLCByZXN0KTtcbiAgICAgICAgICBpZiAoaWQpIHRvb2xfY2FsbC5pZCA9IGlkO1xuICAgICAgICAgIGlmICh0eXBlKSB0b29sX2NhbGwudHlwZSA9IHR5cGU7XG4gICAgICAgICAgaWYgKGZuKSB0b29sX2NhbGwuZnVuY3Rpb24gPz89IHsgYXJndW1lbnRzOiAnJyB9O1xuICAgICAgICAgIGlmIChmbj8ubmFtZSkgdG9vbF9jYWxsLmZ1bmN0aW9uIS5uYW1lID0gZm4ubmFtZTtcbiAgICAgICAgICBpZiAoZm4/LmFyZ3VtZW50cykgdG9vbF9jYWxsLmZ1bmN0aW9uIS5hcmd1bWVudHMgKz0gZm4uYXJndW1lbnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYXRvcjxDaGF0Q29tcGxldGlvbkNodW5rPiB7XG4gICAgY29uc3QgcHVzaFF1ZXVlOiBDaGF0Q29tcGxldGlvbkNodW5rW10gPSBbXTtcbiAgICBjb25zdCByZWFkUXVldWU6IHtcbiAgICAgIHJlc29sdmU6IChjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuayB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9W10gPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5vbignY2h1bmsnLCAoY2h1bmspID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRRdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKHJlYWRlcikge1xuICAgICAgICByZWFkZXIucmVzb2x2ZShjaHVuayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoUXVldWUucHVzaChjaHVuayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdhYm9ydCcsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBhc3luYyAoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxDaGF0Q29tcGxldGlvbkNodW5rPj4gPT4ge1xuICAgICAgICBpZiAoIXB1c2hRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q2hhdENvbXBsZXRpb25DaHVuayB8IHVuZGVmaW5lZD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgIHJlYWRRdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pLFxuICAgICAgICAgICkudGhlbigoY2h1bmspID0+IChjaHVuayA/IHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9IDogeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaHVuayA9IHB1c2hRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9O1xuICAgICAgfSxcbiAgICAgIHJldHVybjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRvUmVhZGFibGVTdHJlYW0oKTogUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0uYmluZCh0aGlzKSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICByZXR1cm4gc3RyZWFtLnRvUmVhZGFibGVTdHJlYW0oKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5hbGl6ZUNoYXRDb21wbGV0aW9uKHNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90KTogQ2hhdENvbXBsZXRpb24ge1xuICBjb25zdCB7IGlkLCBjaG9pY2VzLCBjcmVhdGVkLCBtb2RlbCwgc3lzdGVtX2ZpbmdlcnByaW50LCAuLi5yZXN0IH0gPSBzbmFwc2hvdDtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN0LFxuICAgIGlkLFxuICAgIGNob2ljZXM6IGNob2ljZXMubWFwKFxuICAgICAgKHsgbWVzc2FnZSwgZmluaXNoX3JlYXNvbiwgaW5kZXgsIGxvZ3Byb2JzLCAuLi5jaG9pY2VSZXN0IH0pOiBDaGF0Q29tcGxldGlvbi5DaG9pY2UgPT4ge1xuICAgICAgICBpZiAoIWZpbmlzaF9yZWFzb24pIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBmaW5pc2hfcmVhc29uIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgY29uc3QgeyBjb250ZW50ID0gbnVsbCwgZnVuY3Rpb25fY2FsbCwgdG9vbF9jYWxscywgLi4ubWVzc2FnZVJlc3QgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBtZXNzYWdlLnJvbGUgYXMgJ2Fzc2lzdGFudCc7IC8vIHRoaXMgaXMgd2hhdCB3ZSBleHBlY3Q7IGluIHRoZW9yeSBpdCBjb3VsZCBiZSBkaWZmZXJlbnQgd2hpY2ggd291bGQgbWFrZSBvdXIgdHlwZXMgYSBzbGlnaHQgbGllIGJ1dCB3b3VsZCBiZSBmaW5lLlxuICAgICAgICBpZiAoIXJvbGUpIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyByb2xlIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgICBjb25zdCB7IGFyZ3VtZW50czogYXJncywgbmFtZSB9ID0gZnVuY3Rpb25fY2FsbDtcbiAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgZm9yIGNob2ljZSAke2luZGV4fWApO1xuICAgICAgICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGZ1bmN0aW9uX2NhbGwubmFtZSBmb3IgY2hvaWNlICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNob2ljZVJlc3QsXG4gICAgICAgICAgICBtZXNzYWdlOiB7IGNvbnRlbnQsIGZ1bmN0aW9uX2NhbGw6IHsgYXJndW1lbnRzOiBhcmdzLCBuYW1lIH0sIHJvbGUgfSxcbiAgICAgICAgICAgIGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGxvZ3Byb2JzLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvb2xfY2FsbHMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2hvaWNlUmVzdCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZmluaXNoX3JlYXNvbixcbiAgICAgICAgICAgIGxvZ3Byb2JzLFxuICAgICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgICAuLi5tZXNzYWdlUmVzdCxcbiAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgdG9vbF9jYWxsczogdG9vbF9jYWxscy5tYXAoKHRvb2xfY2FsbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZnVuY3Rpb246IGZuLCB0eXBlLCBpZCwgLi4udG9vbFJlc3QgfSA9IHRvb2xfY2FsbDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFyZ3VtZW50czogYXJncywgbmFtZSwgLi4uZm5SZXN0IH0gPSBmbiB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLmlkXFxuJHtzdHIoc25hcHNob3QpfWApO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgY2hvaWNlc1ske2luZGV4fV0udG9vbF9jYWxsc1ske2l9XS50eXBlXFxuJHtzdHIoc25hcHNob3QpfWApO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBtaXNzaW5nIGNob2ljZXNbJHtpbmRleH1dLnRvb2xfY2FsbHNbJHtpfV0uZnVuY3Rpb24ubmFtZVxcbiR7c3RyKHNuYXBzaG90KX1gLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLmZ1bmN0aW9uLmFyZ3VtZW50c1xcbiR7c3RyKHNuYXBzaG90KX1gLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnRvb2xSZXN0LCBpZCwgdHlwZSwgZnVuY3Rpb246IHsgLi4uZm5SZXN0LCBuYW1lLCBhcmd1bWVudHM6IGFyZ3MgfSB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNob2ljZVJlc3QsXG4gICAgICAgICAgbWVzc2FnZTogeyAuLi5tZXNzYWdlUmVzdCwgY29udGVudCwgcm9sZSB9LFxuICAgICAgICAgIGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgbG9ncHJvYnMsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICksXG4gICAgY3JlYXRlZCxcbiAgICBtb2RlbCxcbiAgICBvYmplY3Q6ICdjaGF0LmNvbXBsZXRpb24nLFxuICAgIC4uLihzeXN0ZW1fZmluZ2VycHJpbnQgPyB7IHN5c3RlbV9maW5nZXJwcmludCB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHIoeDogdW5rbm93bikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeCk7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbWVkIGNodW5rIG9mIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU25hcHNob3Qge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcy4gQ2FuIGJlIG1vcmUgdGhhbiBvbmUgaWYgYG5gIGlzIGdyZWF0ZXJcbiAgICogdGhhbiAxLlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q2hhdENvbXBsZXRpb25TbmFwc2hvdC5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIGdlbmVyYXRlIHRoZSBjb21wbGV0aW9uLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvLyBOb3RlIHdlIGRvIG5vdCBpbmNsdWRlIGFuIFwib2JqZWN0XCIgdHlwZSBvbiB0aGUgc25hcHNob3QsXG4gIC8vIGJlY2F1c2UgdGhlIG9iamVjdCBpcyBub3QgYSB2YWxpZCBcImNoYXQuY29tcGxldGlvblwiIHVudGlsIGZpbmFsaXplZC5cbiAgLy8gb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvblNuYXBzaG90IHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgbWVzc2FnZTogQ2hvaWNlLk1lc3NhZ2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgICAqIGhpdCBhIG5hdHVyYWwgc3RvcCBwb2ludCBvciBhIHByb3ZpZGVkIHN0b3Agc2VxdWVuY2UsIGBsZW5ndGhgIGlmIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLCBvciBgZnVuY3Rpb25fY2FsbGBcbiAgICAgKiBpZiB0aGUgbW9kZWwgY2FsbGVkIGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZmluaXNoX3JlYXNvbjogQ2hhdENvbXBsZXRpb24uQ2hvaWNlWydmaW5pc2hfcmVhc29uJ10gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY2hvaWNlLlxuICAgICAqL1xuICAgIGxvZ3Byb2JzOiBDaGF0Q29tcGxldGlvbi5DaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBjaG9pY2UgaW4gdGhlIGxpc3Qgb2YgY2hvaWNlcy5cbiAgICAgKi9cbiAgICBpbmRleDogbnVtYmVyO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBjaHVuayBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlXG4gICAgICAgKiBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb25fY2FsbD86IE1lc3NhZ2UuRnVuY3Rpb25DYWxsO1xuXG4gICAgICB0b29sX2NhbGxzPzogQXJyYXk8TWVzc2FnZS5Ub29sQ2FsbD47XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGF1dGhvciBvZiB0aGlzIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIHJvbGU/OiAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ2Z1bmN0aW9uJyB8ICd0b29sJztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICAgICAgICovXG4gICAgICAgIGlkPzogc3RyaW5nO1xuXG4gICAgICAgIGZ1bmN0aW9uPzogVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0b29sLlxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZT86ICdmdW5jdGlvbic7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENhbGwge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZVxuICAgICAgICogbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25DYWxsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DaHVuayxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBSdW5uZXJPcHRpb25zLCB0eXBlIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMgfSBmcm9tICcuL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IFJ1bm5hYmxlVG9vbHMsIHR5cGUgQmFzZUZ1bmN0aW9uc0FyZ3MsIHR5cGUgUnVubmFibGVGdW5jdGlvbnMgfSBmcm9tICcuL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25TbmFwc2hvdCwgQ2hhdENvbXBsZXRpb25TdHJlYW0gfSBmcm9tICcuL0NoYXRDb21wbGV0aW9uU3RyZWFtJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblN0cmVhbUV2ZW50cyBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb250ZW50OiAoY29udGVudERlbHRhOiBzdHJpbmcsIGNvbnRlbnRTbmFwc2hvdDogc3RyaW5nKSA9PiB2b2lkO1xuICBjaHVuazogKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rLCBzbmFwc2hvdDogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID0gT21pdDxcbiAgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICdmdW5jdGlvbnMnXG4+ICYge1xuICBmdW5jdGlvbnM6IFJ1bm5hYmxlRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3M+O1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgJ3Rvb2xzJ1xuPiAmIHtcbiAgdG9vbHM6IFJ1bm5hYmxlVG9vbHM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXJcbiAgZXh0ZW5kcyBDaGF0Q29tcGxldGlvblN0cmVhbVxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8Q2hhdENvbXBsZXRpb25DaHVuaz5cbntcbiAgc3RhdGljIG92ZXJyaWRlIGZyb21SZWFkYWJsZVN0cmVhbShzdHJlYW06IFJlYWRhYmxlU3RyZWFtKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcigpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgLSBwbGVhc2UgdXNlIGBydW5Ub29sc2AgaW5zdGVhZC4gKi9cbiAgc3RhdGljIHJ1bkZ1bmN0aW9uczxUIGV4dGVuZHMgKHN0cmluZyB8IG9iamVjdClbXT4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxUPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5GdW5jdGlvbnMnIH0sXG4gICAgfTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX3J1bkZ1bmN0aW9ucyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBydW5Ub29sczxUIGV4dGVuZHMgKHN0cmluZyB8IG9iamVjdClbXT4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPFQ+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyKCk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3J1blRvb2xzJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5Ub29scyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IENoYXRDb21wbGV0aW9uUnVubmVyLCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyJztcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uUnVubmVyLCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7XG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zLFxufSBmcm9tICcuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXInO1xuZXhwb3J0IHtcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXMsXG59IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5pbXBvcnQgeyBCYXNlRnVuY3Rpb25zQXJncyB9IGZyb20gJy4uLy4uLy4uL2xpYi9SdW5uYWJsZUZ1bmN0aW9uJztcbmV4cG9ydCB7XG4gIFJ1bm5hYmxlRnVuY3Rpb24sXG4gIFJ1bm5hYmxlRnVuY3Rpb25zLFxuICBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlLFxuICBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlLFxuICBQYXJzaW5nRnVuY3Rpb24sXG4gIFBhcnNpbmdUb29sRnVuY3Rpb24sXG59IGZyb20gJy4uLy4uLy4uL2xpYi9SdW5uYWJsZUZ1bmN0aW9uJztcbmltcG9ydCB7IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyJztcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbSwgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbSc7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbSwgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGBydW5Ub29sc2AgaW5zdGVhZC5cbiAgICovXG4gIHJ1bkZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyO1xuICBydW5GdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcjtcbiAgcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPlxuICAgICAgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lciB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIHtcbiAgICBpZiAoYm9keS5zdHJlYW0pIHtcbiAgICAgIHJldHVybiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lci5ydW5GdW5jdGlvbnMoXG4gICAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgICBib2R5IGFzIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25SdW5uZXIucnVuRnVuY3Rpb25zKFxuICAgICAgdGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsXG4gICAgICBib2R5IGFzIENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQSBjb252ZW5pZW5jZSBoZWxwZXIgZm9yIHVzaW5nIHRvb2wgY2FsbHMgd2l0aCB0aGUgL2NoYXQvY29tcGxldGlvbnMgZW5kcG9pbnRcbiAgICogd2hpY2ggYXV0b21hdGljYWxseSBjYWxscyB0aGUgSmF2YVNjcmlwdCBmdW5jdGlvbnMgeW91IHByb3ZpZGUgYW5kIHNlbmRzIHRoZWlyXG4gICAqIHJlc3VsdHMgYmFjayB0byB0aGUgL2NoYXQvY29tcGxldGlvbnMgZW5kcG9pbnQsIGxvb3BpbmcgYXMgbG9uZyBhcyB0aGUgbW9kZWxcbiAgICogcmVxdWVzdHMgZnVuY3Rpb24gY2FsbHMuXG4gICAqXG4gICAqIEZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzLCBzZWVcbiAgICogW3RoZSBkb2NzXShodHRwczovL2dpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1ub2RlI2F1dG9tYXRlZC1mdW5jdGlvbi1jYWxscylcbiAgICovXG4gIHJ1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lcjtcbiAgcnVuVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyO1xuICBydW5Ub29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6XG4gICAgICB8IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPlxuICAgICAgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGlmIChib2R5LnN0cmVhbSkge1xuICAgICAgcmV0dXJuIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLnJ1blRvb2xzKFxuICAgICAgICB0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucyxcbiAgICAgICAgYm9keSBhcyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25SdW5uZXIucnVuVG9vbHMoXG4gICAgICB0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucyxcbiAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjaGF0IGNvbXBsZXRpb24gc3RyZWFtXG4gICAqL1xuICBzdHJlYW0oYm9keTogQ2hhdENvbXBsZXRpb25TdHJlYW1QYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ2hhdENvbXBsZXRpb25TdHJlYW0ge1xuICAgIHJldHVybiBDaGF0Q29tcGxldGlvblN0cmVhbS5jcmVhdGVDaGF0Q29tcGxldGlvbih0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucywgYm9keSwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gJy4vY29tcGxldGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgQ2hhdCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zID0gbmV3IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdCB7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbnMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucztcbn1cbiIsICJpbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElVc2VyQWJvcnRFcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7IFJ1biwgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQgeyBSdW5DcmVhdGVQYXJhbXNCYXNlLCBSdW5zIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQgeyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLCBUaHJlYWRzIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvdGhyZWFkc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXI8XG4gIEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+ID0gQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMsXG4+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICNjb25uZWN0ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUNvbm5lY3RlZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdENvbm5lY3RlZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjZW5kUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgI3Jlc29sdmVFbmRQcm9taXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICNyZWplY3RFbmRQcm9taXNlOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgI2xpc3RlbmVyczogeyBbRXZlbnQgaW4ga2V5b2YgRXZlbnRzXT86IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IH0gPSB7fTtcblxuICAjZW5kZWQgPSBmYWxzZTtcbiAgI2Vycm9yZWQgPSBmYWxzZTtcbiAgI2Fib3J0ZWQgPSBmYWxzZTtcbiAgI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNjb25uZWN0ZWRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHRoaXMuI2VuZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlRW5kUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZXNlIHByb21pc2VzIGNhdXNlIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3JzLlxuICAgIC8vIHdlIHdpbGwgbWFudWFsbHkgY2F1c2UgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciBsYXRlclxuICAgIC8vIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBsaXN0ZW5lciBvciBjYWxsZWRcbiAgICAvLyBhbnkgcHJvbWlzZS1yZXR1cm5pbmcgbWV0aG9kLlxuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMuI2VuZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ydW4oZXhlY3V0b3I6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgaWYgd2UgY2FsbCBgZXhlY3V0b3IoKWAgaW1tZWRpYXRlbHkgd2UgZ2V0IHJ1bnRpbWUgZXJyb3JzIGFib3V0XG4gICAgLy8gcmVmZXJlbmNlcyB0byBgdGhpc2AgYmVmb3JlIHRoZSBgc3VwZXIoKWAgY29uc3RydWN0b3IgY2FsbCByZXR1cm5zLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZXhlY3V0b3IoKS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fZW1pdEZpbmFsKCk7XG4gICAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgICAgfSwgdGhpcy4jaGFuZGxlRXJyb3IpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZGRSdW4ocnVuOiBSdW4pOiBSdW4ge1xuICAgIHJldHVybiBydW47XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Nvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIHRoaXMuI3Jlc29sdmVDb25uZWN0ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fZW1pdCgnY29ubmVjdCcpO1xuICB9XG5cbiAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlbmRlZDtcbiAgfVxuXG4gIGdldCBlcnJvcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlcnJvcmVkO1xuICB9XG5cbiAgZ2V0IGFib3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Fib3J0ZWQ7XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogTm8gY2hlY2tzIGFyZSBtYWRlIHRvIHNlZSBpZiB0aGUgbGlzdGVuZXIgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4gTXVsdGlwbGUgY2FsbHMgcGFzc2luZ1xuICAgKiB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBldmVudCBhbmQgbGlzdGVuZXIgd2lsbCByZXN1bHQgaW4gdGhlIGxpc3RlbmVyIGJlaW5nIGFkZGVkLCBhbmRcbiAgICogY2FsbGVkLCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb248RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogb2ZmKCkgd2lsbCByZW1vdmUsIGF0IG1vc3QsIG9uZSBpbnN0YW5jZSBvZiBhIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGFycmF5LiBJZiBhbnkgc2luZ2xlXG4gICAqIGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBldmVudCwgdGhlblxuICAgKiBvZmYoKSBtdXN0IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byByZW1vdmUgZWFjaCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb2ZmPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy4jbGlzdGVuZXJzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ID49IDApIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBvbmUtdGltZSBsaXN0ZW5lciBmdW5jdGlvbiBmb3IgdGhlIGV2ZW50LiBUaGUgbmV4dCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIHRoaXMgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhbmQgdGhlbiBpbnZva2VkLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbmNlPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiA9XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdIHx8ICh0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gW10pO1xuICAgIGxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIsIG9uY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGAub25jZSgpYCwgYnV0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZVxuICAgKiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLCBpbnN0ZWFkIG9mIGNhbGxpbmcgYSBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZSBnaXZlbiBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIG9yIHJlamVjdHMgaWYgYW4gZXJyb3IgaXMgZW1pdHRlZC4gIChJZiB5b3UgcmVxdWVzdCB0aGUgJ2Vycm9yJyBldmVudCxcbiAgICogcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBlcnJvcikuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0cmVhbS5lbWl0dGVkKCdtZXNzYWdlJykgLy8gcmVqZWN0cyBpZiB0aGUgc3RyZWFtIGVycm9yc1xuICAgKi9cbiAgZW1pdHRlZDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnQ6IEV2ZW50LFxuICApOiBQcm9taXNlPFxuICAgIEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PiBleHRlbmRzIFtpbmZlciBQYXJhbV0gPyBQYXJhbVxuICAgIDogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW10gPyB2b2lkXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD5cbiAgPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGV2ZW50ICE9PSAnZXJyb3InKSB0aGlzLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIHRoaXMub25jZShldmVudCwgcmVzb2x2ZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLiNlbmRQcm9taXNlO1xuICB9XG5cbiAgI2hhbmRsZUVycm9yID0gKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgdGhpcy4jZXJyb3JlZCA9IHRydWU7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBlcnJvciA9IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBUElVc2VyQWJvcnRFcnJvcikge1xuICAgICAgdGhpcy4jYWJvcnRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnYWJvcnQnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9wZW5BSUVycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBvcGVuQUlFcnJvcjogT3BlbkFJRXJyb3IgPSBuZXcgT3BlbkFJRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcGVuQUlFcnJvci5jYXVzZSA9IGVycm9yO1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgb3BlbkFJRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBuZXcgT3BlbkFJRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBfZW1pdDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCAuLi5hcmdzOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4pIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgZW1pdCBhbnkgZXZlbnRzIGFmdGVyIGVuZFxuICAgIGlmICh0aGlzLiNlbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuI2VuZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiB8IHVuZGVmaW5lZCA9IHRoaXMuI2xpc3RlbmVyc1tldmVudF07XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IGxpc3RlbmVycy5maWx0ZXIoKGwpID0+ICFsLm9uY2UpIGFzIGFueTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCh7IGxpc3RlbmVyIH06IGFueSkgPT4gbGlzdGVuZXIoLi4uYXJncykpO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2Fib3J0Jykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhcmdzWzBdIGFzIEFQSVVzZXJBYm9ydEVycm9yO1xuICAgICAgaWYgKCF0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkICYmICFsaXN0ZW5lcnM/Lmxlbmd0aCkge1xuICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBOT1RFOiBfZW1pdCgnZXJyb3InLCBlcnJvcikgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gI2hhbmRsZUVycm9yKCkuXG5cbiAgICAgIGNvbnN0IGVycm9yID0gYXJnc1swXSBhcyBPcGVuQUlFcnJvcjtcbiAgICAgIGlmICghdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCAmJiAhbGlzdGVuZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBoYW5kbGVycy5cbiAgICAgICAgLy8gSWYgeW91IGFyZSBzZWVpbmcgc3RhY2sgdHJhY2VzIGhlcmUsIG1ha2Ugc3VyZSB0byBoYW5kbGUgZXJyb3JzIHZpYSBlaXRoZXI6XG4gICAgICAgIC8vIC0gcnVubmVyLm9uKCdlcnJvcicsICgpID0+IC4uLilcbiAgICAgICAgLy8gLSBhd2FpdCBydW5uZXIuZG9uZSgpXG4gICAgICAgIC8vIC0gYXdhaXQgcnVubmVyLmZpbmFsQ2hhdENvbXBsZXRpb24oKVxuICAgICAgICAvLyAtIGV0Yy5cbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfdGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgdGhyZWFkOiBUaHJlYWRzLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jcmVhdGVUaHJlYWRBc3Npc3RhbnRTdHJlYW0odGhyZWFkLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBwYXJhbXM6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZUFzc2lzdGFudFN0cmVhbShydW5zLCB0aHJlYWRJZCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBwYXJhbXM6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShydW5zLCB0aHJlYWRJZCwgcnVuSWQsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2NyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWQ6IFRocmVhZHMsXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy4jdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IHJ1blJlc3VsdCA9IGF3YWl0IHRocmVhZC5jcmVhdGVBbmRSdW4oXG4gICAgICB7IC4uLmJvZHksIHN0cmVhbTogZmFsc2UgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHJ1blJlc3VsdCBhcyBSdW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9jcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVuUmVzdWx0ID0gYXdhaXQgcnVuLnN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgICAgdGhyZWFkSWQsXG4gICAgICBydW5JZCxcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IGZhbHNlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bihydW5SZXN1bHQgYXMgUnVuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfY3JlYXRlQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy4jdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IHJ1blJlc3VsdCA9IGF3YWl0IHJ1bi5jcmVhdGUoXG4gICAgICB0aHJlYWRJZCxcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IGZhbHNlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bihydW5SZXN1bHQgYXMgUnVuKTtcbiAgfVxufVxuXG50eXBlIEN1c3RvbUV2ZW50czxFdmVudCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEV2ZW50XTogayBleHRlbmRzIGtleW9mIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzID8gQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHNba11cbiAgOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG50eXBlIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEV2ZW50IGV4dGVuZHMgKFxuICBrZXlvZiBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50c1xuKSA/XG4gIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzW0V2ZW50XVxuOiBFdmVudHNbRXZlbnRdO1xuXG50eXBlIExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBBcnJheTx7XG4gIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+O1xuICBvbmNlPzogYm9vbGVhbjtcbn0+O1xudHlwZSBFdmVudFBhcmFtZXRlcnM8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IFBhcmFtZXRlcnM8XG4gIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD5cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMge1xuICBjb25uZWN0OiAoKSA9PiB2b2lkO1xuICBydW46IChydW46IFJ1bikgPT4gdm9pZDtcbiAgZXJyb3I6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQ7XG4gIGFib3J0OiAoZXJyb3I6IEFQSVVzZXJBYm9ydEVycm9yKSA9PiB2b2lkO1xuICBlbmQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtcbiAgVGV4dENvbnRlbnRCbG9jayxcbiAgSW1hZ2VGaWxlQ29udGVudEJsb2NrLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlQ29udGVudERlbHRhLFxuICBUZXh0LFxuICBJbWFnZUZpbGUsXG4gIFRleHREZWx0YSxcbiAgTWVzc2FnZXMsXG4gIE1lc3NhZ2VDb250ZW50LFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHtcbiAgUnVuLFxuICBSdW5DcmVhdGVQYXJhbXNCYXNlLFxuICBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gIFJ1bnMsXG4gIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSxcbiAgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvcnVuc1wiO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMsXG4gIEFic3RyYWN0QXNzaXN0YW50U3RyZWFtUnVubmVyLFxufSBmcm9tICcuL0Fic3RyYWN0QXNzaXN0YW50U3RyZWFtUnVubmVyJztcbmltcG9ydCB7IHR5cGUgUmVhZGFibGVTdHJlYW0gfSBmcm9tIFwiLi4vX3NoaW1zL2luZGV4XCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBBUElVc2VyQWJvcnRFcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7XG4gIEFzc2lzdGFudFN0cmVhbUV2ZW50LFxuICBNZXNzYWdlU3RyZWFtRXZlbnQsXG4gIFJ1blN0ZXBTdHJlYW1FdmVudCxcbiAgUnVuU3RyZWFtRXZlbnQsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS9hc3Npc3RhbnRzXCI7XG5pbXBvcnQgeyBSdW5TdGVwLCBSdW5TdGVwRGVsdGEsIFRvb2xDYWxsLCBUb29sQ2FsbERlbHRhIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9zdGVwc1wiO1xuaW1wb3J0IHsgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSwgVGhyZWFkcyB9IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3RocmVhZHNcIjtcbmltcG9ydCBNZXNzYWdlRGVsdGEgPSBNZXNzYWdlcy5NZXNzYWdlRGVsdGE7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50U3RyZWFtRXZlbnRzIGV4dGVuZHMgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMge1xuICAvL05ldyBldmVudCBzdHJ1Y3R1cmVcbiAgbWVzc2FnZUNyZWF0ZWQ6IChtZXNzYWdlOiBNZXNzYWdlKSA9PiB2b2lkO1xuICBtZXNzYWdlRGVsdGE6IChtZXNzYWdlOiBNZXNzYWdlRGVsdGEsIHNuYXBzaG90OiBNZXNzYWdlKSA9PiB2b2lkO1xuICBtZXNzYWdlRG9uZTogKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgcnVuU3RlcENyZWF0ZWQ6IChydW5TdGVwOiBSdW5TdGVwKSA9PiB2b2lkO1xuICBydW5TdGVwRGVsdGE6IChkZWx0YTogUnVuU3RlcERlbHRhLCBzbmFwc2hvdDogUnVucy5SdW5TdGVwKSA9PiB2b2lkO1xuICBydW5TdGVwRG9uZTogKHJ1blN0ZXA6IFJ1bnMuUnVuU3RlcCwgc25hcHNob3Q6IFJ1bnMuUnVuU3RlcCkgPT4gdm9pZDtcblxuICB0b29sQ2FsbENyZWF0ZWQ6ICh0b29sQ2FsbDogVG9vbENhbGwpID0+IHZvaWQ7XG4gIHRvb2xDYWxsRGVsdGE6IChkZWx0YTogVG9vbENhbGxEZWx0YSwgc25hcHNob3Q6IFRvb2xDYWxsKSA9PiB2b2lkO1xuICB0b29sQ2FsbERvbmU6ICh0b29sQ2FsbDogVG9vbENhbGwpID0+IHZvaWQ7XG5cbiAgdGV4dENyZWF0ZWQ6IChjb250ZW50OiBUZXh0KSA9PiB2b2lkO1xuICB0ZXh0RGVsdGE6IChkZWx0YTogVGV4dERlbHRhLCBzbmFwc2hvdDogVGV4dCkgPT4gdm9pZDtcbiAgdGV4dERvbmU6IChjb250ZW50OiBUZXh0LCBzbmFwc2hvdDogTWVzc2FnZSkgPT4gdm9pZDtcblxuICAvL05vIGNyZWF0ZWQgb3IgZGVsdGEgYXMgdGhpcyBpcyBub3Qgc3RyZWFtZWRcbiAgaW1hZ2VGaWxlRG9uZTogKGNvbnRlbnQ6IEltYWdlRmlsZSwgc25hcHNob3Q6IE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgZW5kOiAoKSA9PiB2b2lkO1xuXG4gIGV2ZW50OiAoZXZlbnQ6IEFzc2lzdGFudFN0cmVhbUV2ZW50KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtID0gT21pdDxUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLCAnc3RyZWFtJz4gJiB7XG4gIHN0cmVhbT86IHRydWU7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtID0gT21pdDxSdW5DcmVhdGVQYXJhbXNCYXNlLCAnc3RyZWFtJz4gJiB7XG4gIHN0cmVhbT86IHRydWU7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSA9IE9taXQ8UnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLCAnc3RyZWFtJz4gJiB7XG4gIHN0cmVhbT86IHRydWU7XG59O1xuXG5leHBvcnQgY2xhc3MgQXNzaXN0YW50U3RyZWFtXG4gIGV4dGVuZHMgQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXI8QXNzaXN0YW50U3RyZWFtRXZlbnRzPlxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8QXNzaXN0YW50U3RyZWFtRXZlbnQ+XG57XG4gIC8vVHJhY2sgYWxsIGV2ZW50cyBpbiBhIHNpbmdsZSBsaXN0IGZvciByZWZlcmVuY2VcbiAgI2V2ZW50czogQXNzaXN0YW50U3RyZWFtRXZlbnRbXSA9IFtdO1xuXG4gIC8vVXNlZCB0byBhY2N1bXVsYXRlIGRlbHRhc1xuICAvL1dlIGFyZSBhY2N1bXVsYXRpbmcgbWFueSB0eXBlcyBzbyB0aGUgdmFsdWUgaGVyZSBpcyBub3Qgc3RyaWN0XG4gICNydW5TdGVwU25hcHNob3RzOiB7IFtpZDogc3RyaW5nXTogUnVucy5SdW5TdGVwIH0gPSB7fTtcbiAgI21lc3NhZ2VTbmFwc2hvdHM6IHsgW2lkOiBzdHJpbmddOiBNZXNzYWdlIH0gPSB7fTtcbiAgI21lc3NhZ2VTbmFwc2hvdDogTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgI2ZpbmFsUnVuOiBSdW4gfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50Q29udGVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50Q29udGVudDogTWVzc2FnZUNvbnRlbnQgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50VG9vbENhbGxJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudFRvb2xDYWxsOiBUb29sQ2FsbCB8IHVuZGVmaW5lZDtcblxuICAvL0ZvciBjdXJyZW50IHNuYXBzaG90IG1ldGhvZHNcbiAgI2N1cnJlbnRFdmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50UnVuU25hcHNob3Q6IFJ1biB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRSdW5TdGVwU25hcHNob3Q6IFJ1bnMuUnVuU3RlcCB8IHVuZGVmaW5lZDtcblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8QXNzaXN0YW50U3RyZWFtRXZlbnQ+IHtcbiAgICBjb25zdCBwdXNoUXVldWU6IEFzc2lzdGFudFN0cmVhbUV2ZW50W10gPSBbXTtcbiAgICBjb25zdCByZWFkUXVldWU6IHtcbiAgICAgIHJlc29sdmU6IChjaHVuazogQXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgfVtdID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcblxuICAgIC8vQ2F0Y2ggYWxsIGZvciBwYXNzaW5nIGFsb25nIGFsbCBldmVudHNcbiAgICB0aGlzLm9uKCdldmVudCcsIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hRdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2Fib3J0JywgKGVycikgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGFzeW5jICgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEFzc2lzdGFudFN0cmVhbUV2ZW50Pj4gPT4ge1xuICAgICAgICBpZiAoIXB1c2hRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8QXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICByZWFkUXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KSxcbiAgICAgICAgICApLnRoZW4oKGNodW5rKSA9PiAoY2h1bmsgPyB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmsgPSBwdXNoUXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0sXG4gICAgICByZXR1cm46IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX2Zyb21SZWFkYWJsZVN0cmVhbShzdHJlYW0pKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9mcm9tUmVhZGFibGVTdHJlYW0oXG4gICAgcmVhZGFibGVTdHJlYW06IFJlYWRhYmxlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBTdHJlYW0uZnJvbVJlYWRhYmxlU3RyZWFtPEFzc2lzdGFudFN0cmVhbUV2ZW50PihyZWFkYWJsZVN0cmVhbSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgdG9SZWFkYWJsZVN0cmVhbSgpOiBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbSh0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXS5iaW5kKHRoaXMpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBzdHJlYW0udG9SZWFkYWJsZVN0cmVhbSgpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRvb2xBc3Npc3RhbnRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHJ1bnM6IFJ1bnMsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0sXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl9ydW5Ub29sQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCBydW5JZCwgcnVucywgYm9keSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3N0cmVhbScgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICBydW46IFJ1bnMsXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgPSB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH07XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgcnVuLnN1Ym1pdFRvb2xPdXRwdXRzKHRocmVhZElkLCBydW5JZCwgYm9keSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtLFxuICAgIHRocmVhZDogVGhyZWFkcyxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl90aHJlYWRBc3Npc3RhbnRTdHJlYW0oYm9keSwgdGhyZWFkLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bnM6IFJ1bnMsXG4gICAgcGFyYW1zOiBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEFzc2lzdGFudFN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3J1bkFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgcnVucywgcGFyYW1zLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgY3VycmVudEV2ZW50KCk6IEFzc2lzdGFudFN0cmVhbUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudEV2ZW50O1xuICB9XG5cbiAgY3VycmVudFJ1bigpOiBSdW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50UnVuU25hcHNob3Q7XG4gIH1cblxuICBjdXJyZW50TWVzc2FnZVNuYXBzaG90KCk6IE1lc3NhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtZXNzYWdlU25hcHNob3Q7XG4gIH1cblxuICBjdXJyZW50UnVuU3RlcFNuYXBzaG90KCk6IFJ1bnMuUnVuU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSdW5TdGVwU25hcHNob3Q7XG4gIH1cblxuICBhc3luYyBmaW5hbFJ1blN0ZXBzKCk6IFByb21pc2U8UnVucy5SdW5TdGVwW10+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuI3J1blN0ZXBTbmFwc2hvdHMpO1xuICB9XG5cbiAgYXN5bmMgZmluYWxNZXNzYWdlcygpOiBQcm9taXNlPE1lc3NhZ2VbXT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jbWVzc2FnZVNuYXBzaG90cyk7XG4gIH1cblxuICBhc3luYyBmaW5hbFJ1bigpOiBQcm9taXNlPFJ1bj4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIGlmICghdGhpcy4jZmluYWxSdW4pIHRocm93IEVycm9yKCdGaW5hbCBydW4gd2FzIG5vdCByZWNlaXZlZC4nKTtcblxuICAgIHJldHVybiB0aGlzLiNmaW5hbFJ1bjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZDogVGhyZWFkcyxcbiAgICBwYXJhbXM6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0geyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9O1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHRocmVhZC5jcmVhdGVBbmRSdW4oYm9keSwgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH07XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgcnVuLmNyZWF0ZSh0aHJlYWRJZCwgYm9keSwgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gICNhZGRFdmVudChldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy4jY3VycmVudEV2ZW50ID0gZXZlbnQ7XG5cbiAgICB0aGlzLiNoYW5kbGVFdmVudChldmVudCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQuY3JlYXRlZCc6XG4gICAgICAgIC8vTm8gYWN0aW9uIG9uIHRoaXMgZXZlbnQuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNyZWF0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5xdWV1ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5leHBpcmVkJzpcbiAgICAgICAgdGhpcy4jaGFuZGxlUnVuKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnOlxuICAgICAgICB0aGlzLiNoYW5kbGVSdW5TdGVwKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnOlxuICAgICAgICB0aGlzLiNoYW5kbGVNZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgLy9UaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MsIGJ1dCBlcnJvcnMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgU1NFIGV2ZW50IHByb2Nlc3Npbmcgc28gdGhpcyBzaG91bGQgbm90IG9jY3VyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgYW4gZXJyb3IgZXZlbnQgaW4gZXZlbnQgcHJvY2Vzc2luZyAtIGVycm9ycyBzaG91bGQgYmUgcHJvY2Vzc2VkIGVhcmxpZXInLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gICNlbmRSZXF1ZXN0KCk6IFJ1biB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgc3RyZWFtIGhhcyBlbmRlZCwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuYCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLiNmaW5hbFJ1bikgdGhyb3cgRXJyb3IoJ0ZpbmFsIHJ1biBoYXMgbm90IGJlZW4gcmVjZWl2ZWQnKTtcblxuICAgIHJldHVybiB0aGlzLiNmaW5hbFJ1bjtcbiAgfVxuXG4gICNoYW5kbGVNZXNzYWdlKGV2ZW50OiBNZXNzYWdlU3RyZWFtRXZlbnQpIHtcbiAgICBjb25zdCBbYWNjdW11bGF0ZWRNZXNzYWdlLCBuZXdDb250ZW50XSA9IHRoaXMuI2FjY3VtdWxhdGVNZXNzYWdlKGV2ZW50LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCA9IGFjY3VtdWxhdGVkTWVzc2FnZTtcbiAgICB0aGlzLiNtZXNzYWdlU25hcHNob3RzW2FjY3VtdWxhdGVkTWVzc2FnZS5pZF0gPSBhY2N1bXVsYXRlZE1lc3NhZ2U7XG5cbiAgICBmb3IgKGNvbnN0IGNvbnRlbnQgb2YgbmV3Q29udGVudCkge1xuICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gYWNjdW11bGF0ZWRNZXNzYWdlLmNvbnRlbnRbY29udGVudC5pbmRleF07XG4gICAgICBpZiAoc25hcHNob3RDb250ZW50Py50eXBlID09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0Q3JlYXRlZCcsIHNuYXBzaG90Q29udGVudC50ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJzpcbiAgICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZUNyZWF0ZWQnLCBldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJzpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmRlbHRhJzpcbiAgICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZURlbHRhJywgZXZlbnQuZGF0YS5kZWx0YSwgYWNjdW11bGF0ZWRNZXNzYWdlKTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIGV2ZW50LmRhdGEuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgICAgLy9JZiBpdCBpcyB0ZXh0IGRlbHRhLCBlbWl0IGEgdGV4dCBkZWx0YSBldmVudFxuICAgICAgICAgICAgaWYgKGNvbnRlbnQudHlwZSA9PSAndGV4dCcgJiYgY29udGVudC50ZXh0KSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0RGVsdGEgPSBjb250ZW50LnRleHQ7XG4gICAgICAgICAgICAgIGxldCBzbmFwc2hvdCA9IGFjY3VtdWxhdGVkTWVzc2FnZS5jb250ZW50W2NvbnRlbnQuaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgJiYgc25hcHNob3QudHlwZSA9PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0RGVsdGEnLCB0ZXh0RGVsdGEsIHNuYXBzaG90LnRleHQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGV4dCBkZWx0YSBpcyBub3QgdGV4dCBvciBtaXNzaW5nJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXggIT0gdGhpcy4jY3VycmVudENvbnRlbnRJbmRleCkge1xuICAgICAgICAgICAgICAvL1NlZSBpZiB3ZSBoYXZlIGluIHByb2dyZXNzIGNvbnRlbnRcbiAgICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLiNjdXJyZW50Q29udGVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndGV4dERvbmUnLCB0aGlzLiNjdXJyZW50Q29udGVudC50ZXh0LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2ltYWdlX2ZpbGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCdpbWFnZUZpbGVEb25lJywgdGhpcy4jY3VycmVudENvbnRlbnQuaW1hZ2VfZmlsZSwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy4jY3VycmVudENvbnRlbnRJbmRleCA9IGNvbnRlbnQuaW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRDb250ZW50ID0gYWNjdW11bGF0ZWRNZXNzYWdlLmNvbnRlbnRbY29udGVudC5pbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJzpcbiAgICAgICAgLy9XZSBlbWl0IHRoZSBsYXRlc3QgY29udGVudCB3ZSB3ZXJlIHdvcmtpbmcgb24gb24gY29tcGxldGlvbiAoaW5jbHVkaW5nIGluY29tcGxldGUpXG4gICAgICAgIGlmICh0aGlzLiNjdXJyZW50Q29udGVudEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGV2ZW50LmRhdGEuY29udGVudFt0aGlzLiNjdXJyZW50Q29udGVudEluZGV4XTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRlbnQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENvbnRlbnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdpbWFnZV9maWxlJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCdpbWFnZUZpbGVEb25lJywgY3VycmVudENvbnRlbnQuaW1hZ2VfZmlsZSwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndGV4dERvbmUnLCBjdXJyZW50Q29udGVudC50ZXh0LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLiNtZXNzYWdlU25hcHNob3QpIHtcbiAgICAgICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlRG9uZScsIGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jbWVzc2FnZVNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gICNoYW5kbGVSdW5TdGVwKGV2ZW50OiBSdW5TdGVwU3RyZWFtRXZlbnQpIHtcbiAgICBjb25zdCBhY2N1bXVsYXRlZFJ1blN0ZXAgPSB0aGlzLiNhY2N1bXVsYXRlUnVuU3RlcChldmVudCk7XG4gICAgdGhpcy4jY3VycmVudFJ1blN0ZXBTbmFwc2hvdCA9IGFjY3VtdWxhdGVkUnVuU3RlcDtcblxuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJzpcbiAgICAgICAgdGhpcy5fZW1pdCgncnVuU3RlcENyZWF0ZWQnLCBldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnOlxuICAgICAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmRhdGEuZGVsdGE7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMgJiZcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscycgJiZcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMudG9vbF9jYWxscyAmJlxuICAgICAgICAgIGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscydcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChjb25zdCB0b29sQ2FsbCBvZiBkZWx0YS5zdGVwX2RldGFpbHMudG9vbF9jYWxscykge1xuICAgICAgICAgICAgaWYgKHRvb2xDYWxsLmluZGV4ID09IHRoaXMuI2N1cnJlbnRUb29sQ2FsbEluZGV4KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2VtaXQoXG4gICAgICAgICAgICAgICAgJ3Rvb2xDYWxsRGVsdGEnLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsLFxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudG9vbF9jYWxsc1t0b29sQ2FsbC5pbmRleF0gYXMgVG9vbENhbGwsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndG9vbENhbGxEb25lJywgdGhpcy4jY3VycmVudFRvb2xDYWxsKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbEluZGV4ID0gdG9vbENhbGwuaW5kZXg7XG4gICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCA9IGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudG9vbF9jYWxsc1t0b29sQ2FsbC5pbmRleF07XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNjdXJyZW50VG9vbENhbGwpIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsQ3JlYXRlZCcsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZW1pdCgncnVuU3RlcERlbHRhJywgZXZlbnQuZGF0YS5kZWx0YSwgYWNjdW11bGF0ZWRSdW5TdGVwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2N1cnJlbnRSdW5TdGVwU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBldmVudC5kYXRhLnN0ZXBfZGV0YWlscztcbiAgICAgICAgaWYgKGRldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscycpIHtcbiAgICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0KCd0b29sQ2FsbERvbmUnLCB0aGlzLiNjdXJyZW50VG9vbENhbGwgYXMgVG9vbENhbGwpO1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0KCdydW5TdGVwRG9uZScsIGV2ZW50LmRhdGEsIGFjY3VtdWxhdGVkUnVuU3RlcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgI2hhbmRsZUV2ZW50KGV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCkge1xuICAgIHRoaXMuI2V2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICB0aGlzLl9lbWl0KCdldmVudCcsIGV2ZW50KTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlUnVuU3RlcChldmVudDogUnVuU3RlcFN0cmVhbUV2ZW50KTogUnVucy5SdW5TdGVwIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc6XG4gICAgICAgIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gPSBldmVudC5kYXRhO1xuICAgICAgICByZXR1cm4gZXZlbnQuZGF0YTtcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJzpcbiAgICAgICAgbGV0IHNuYXBzaG90ID0gdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSBhcyBSdW5zLlJ1blN0ZXA7XG4gICAgICAgIGlmICghc25hcHNob3QpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignUmVjZWl2ZWQgYSBSdW5TdGVwRGVsdGEgYmVmb3JlIGNyZWF0aW9uIG9mIGEgc25hcHNob3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcblxuICAgICAgICBpZiAoZGF0YS5kZWx0YSkge1xuICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gQXNzaXN0YW50U3RyZWFtLmFjY3VtdWxhdGVEZWx0YShzbmFwc2hvdCwgZGF0YS5kZWx0YSkgYXMgUnVucy5SdW5TdGVwO1xuICAgICAgICAgIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gPSBhY2N1bXVsYXRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdIGFzIFJ1bnMuUnVuU3RlcDtcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJzpcbiAgICAgICAgdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdKSByZXR1cm4gdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSBhcyBSdW5zLlJ1blN0ZXA7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBzbmFwc2hvdCBhdmFpbGFibGUnKTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlTWVzc2FnZShcbiAgICBldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQsXG4gICAgc25hcHNob3Q6IE1lc3NhZ2UgfCB1bmRlZmluZWQsXG4gICk6IFtNZXNzYWdlLCBNZXNzYWdlQ29udGVudERlbHRhW11dIHtcbiAgICBsZXQgbmV3Q29udGVudDogTWVzc2FnZUNvbnRlbnREZWx0YVtdID0gW107XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJzpcbiAgICAgICAgLy9PbiBjcmVhdGlvbiB0aGUgc25hcHNob3QgaXMganVzdCB0aGUgaW5pdGlhbCBtZXNzYWdlXG4gICAgICAgIHJldHVybiBbZXZlbnQuZGF0YSwgbmV3Q29udGVudF07XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmRlbHRhJzpcbiAgICAgICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgJ1JlY2VpdmVkIGEgZGVsdGEgd2l0aCBubyBleGlzdGluZyBzbmFwc2hvdCAodGhlcmUgc2hvdWxkIGJlIG9uZSBmcm9tIG1lc3NhZ2UgY3JlYXRpb24pJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuXG4gICAgICAgIC8vSWYgdGhpcyBkZWx0YSBkb2VzIG5vdCBoYXZlIGNvbnRlbnQsIG5vdGhpbmcgdG8gcHJvY2Vzc1xuICAgICAgICBpZiAoZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250ZW50RWxlbWVudCBvZiBkYXRhLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZW50RWxlbWVudC5pbmRleCBpbiBzbmFwc2hvdC5jb250ZW50KSB7XG4gICAgICAgICAgICAgIGxldCBjdXJyZW50Q29udGVudCA9IHNuYXBzaG90LmNvbnRlbnRbY29udGVudEVsZW1lbnQuaW5kZXhdO1xuICAgICAgICAgICAgICBzbmFwc2hvdC5jb250ZW50W2NvbnRlbnRFbGVtZW50LmluZGV4XSA9IHRoaXMuI2FjY3VtdWxhdGVDb250ZW50KFxuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc25hcHNob3QuY29udGVudFtjb250ZW50RWxlbWVudC5pbmRleF0gPSBjb250ZW50RWxlbWVudCBhcyBNZXNzYWdlQ29udGVudDtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBlbGVtZW50XG4gICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChjb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzbmFwc2hvdCwgbmV3Q29udGVudF07XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJzpcbiAgICAgICAgLy9ObyBjaGFuZ2VzIG9uIG90aGVyIHRocmVhZCBldmVudHNcbiAgICAgICAgaWYgKHNuYXBzaG90KSB7XG4gICAgICAgICAgcmV0dXJuIFtzbmFwc2hvdCwgbmV3Q29udGVudF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1JlY2VpdmVkIHRocmVhZCBtZXNzYWdlIGV2ZW50IHdpdGggbm8gZXhpc3Rpbmcgc25hcHNob3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gYWNjdW11bGF0ZSBhIG5vbi1tZXNzYWdlIGV2ZW50Jyk7XG4gIH1cblxuICAjYWNjdW11bGF0ZUNvbnRlbnQoXG4gICAgY29udGVudEVsZW1lbnQ6IE1lc3NhZ2VDb250ZW50RGVsdGEsXG4gICAgY3VycmVudENvbnRlbnQ6IE1lc3NhZ2VDb250ZW50IHwgdW5kZWZpbmVkLFxuICApOiBUZXh0Q29udGVudEJsb2NrIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmFjY3VtdWxhdGVEZWx0YShjdXJyZW50Q29udGVudCBhcyB1bmtub3duIGFzIFJlY29yZDxhbnksIGFueT4sIGNvbnRlbnRFbGVtZW50KSBhc1xuICAgICAgfCBUZXh0Q29udGVudEJsb2NrXG4gICAgICB8IEltYWdlRmlsZUNvbnRlbnRCbG9jaztcbiAgfVxuXG4gIHN0YXRpYyBhY2N1bXVsYXRlRGVsdGEoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkZWx0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVsdGFWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEpKSB7XG4gICAgICBpZiAoIWFjYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGFjY1trZXldID0gZGVsdGFWYWx1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBhY2NWYWx1ZSA9IGFjY1trZXldO1xuICAgICAgaWYgKGFjY1ZhbHVlID09PSBudWxsIHx8IGFjY1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjW2tleV0gPSBkZWx0YVZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgZG9uJ3QgYWNjdW11bGF0ZSB0aGVzZSBzcGVjaWFsIHByb3BlcnRpZXNcbiAgICAgIGlmIChrZXkgPT09ICdpbmRleCcgfHwga2V5ID09PSAndHlwZScpIHtcbiAgICAgICAgYWNjW2tleV0gPSBkZWx0YVZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZS1zcGVjaWZpYyBhY2N1bXVsYXRpb24gbG9naWNcbiAgICAgIGlmICh0eXBlb2YgYWNjVmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBkZWx0YVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBhY2NWYWx1ZSArPSBkZWx0YVZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWNjVmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBkZWx0YVZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBhY2NWYWx1ZSArPSBkZWx0YVZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChDb3JlLmlzT2JqKGFjY1ZhbHVlKSAmJiBDb3JlLmlzT2JqKGRlbHRhVmFsdWUpKSB7XG4gICAgICAgIGFjY1ZhbHVlID0gdGhpcy5hY2N1bXVsYXRlRGVsdGEoYWNjVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PiwgZGVsdGFWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhY2NWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShkZWx0YVZhbHVlKSkge1xuICAgICAgICBpZiAoYWNjVmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgeCA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgYWNjVmFsdWUucHVzaCguLi5kZWx0YVZhbHVlKTsgLy8gVXNlIHNwcmVhZCBzeW50YXggZm9yIGVmZmljaWVudCBhZGRpdGlvblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5oYW5kbGVkIHJlY29yZCB0eXBlOiAke2tleX0sIGRlbHRhVmFsdWU6ICR7ZGVsdGFWYWx1ZX0sIGFjY1ZhbHVlOiAke2FjY1ZhbHVlfWApO1xuICAgICAgfVxuICAgICAgYWNjW2tleV0gPSBhY2NWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgI2hhbmRsZVJ1bihldmVudDogUnVuU3RyZWFtRXZlbnQpIHtcbiAgICB0aGlzLiNjdXJyZW50UnVuU25hcHNob3QgPSBldmVudC5kYXRhO1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY3JlYXRlZCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5xdWV1ZWQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4ucmVxdWlyZXNfYWN0aW9uJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2ZpbmFsUnVuID0gZXZlbnQuZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUb29sQ2FsbCkge1xuICAgICAgICAgIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsRG9uZScsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCk7XG4gICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJzpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSAnLi9tZXNzYWdlcyc7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gJy4uL2Fzc2lzdGFudHMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lc3NhZ2UuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBNZXNzYWdlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBtZXNzYWdlLlxuICAgKi9cbiAgcmV0cmlldmUodGhyZWFkSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgYSBtZXNzYWdlLlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgYm9keTogTWVzc2FnZVVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXNzYWdlcyBmb3IgYSBnaXZlbiB0aHJlYWQuXG4gICAqL1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBNZXNzYWdlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxNZXNzYWdlc1BhZ2UsIE1lc3NhZ2U+O1xuICBsaXN0KHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxNZXNzYWdlc1BhZ2UsIE1lc3NhZ2U+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk6IE1lc3NhZ2VMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPE1lc3NhZ2VzUGFnZSwgTWVzc2FnZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh0aHJlYWRJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlc2AsIE1lc3NhZ2VzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgbWVzc2FnZS5cbiAgICovXG4gIGRlbCh0aHJlYWRJZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZURlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8TWVzc2FnZT4ge31cblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uID0gRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiB8IEZpbGVQYXRoQW5ub3RhdGlvbjtcblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uRGVsdGEgPSBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24gfCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbjtcblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbkFubm90YXRpb24ge1xuICBlbmRfaW5kZXg6IG51bWJlcjtcblxuICBmaWxlX2NpdGF0aW9uOiBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uLkZpbGVDaXRhdGlvbjtcblxuICBzdGFydF9pbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbiB0aGUgbWVzc2FnZSBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgZmlsZV9jaXRhdGlvbmAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9jaXRhdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZUNpdGF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHNwZWNpZmljIEZpbGUgdGhlIGNpdGF0aW9uIGlzIGZyb20uXG4gICAgICovXG4gICAgZmlsZV9pZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHF1b3RlIGluIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIHF1b3RlOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGFubm90YXRpb24gaW4gdGhlIHRleHQgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBmaWxlX2NpdGF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX2NpdGF0aW9uJztcblxuICBlbmRfaW5kZXg/OiBudW1iZXI7XG5cbiAgZmlsZV9jaXRhdGlvbj86IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbi5GaWxlQ2l0YXRpb247XG5cbiAgc3RhcnRfaW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ2l0YXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc3BlY2lmaWMgRmlsZSB0aGUgY2l0YXRpb24gaXMgZnJvbS5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHF1b3RlIGluIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIHF1b3RlPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogQSBVUkwgZm9yIHRoZSBmaWxlIHRoYXQncyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50IHVzZWQgdGhlXG4gKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCB0byBnZW5lcmF0ZSBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhdGhBbm5vdGF0aW9uIHtcbiAgZW5kX2luZGV4OiBudW1iZXI7XG5cbiAgZmlsZV9wYXRoOiBGaWxlUGF0aEFubm90YXRpb24uRmlsZVBhdGg7XG5cbiAgc3RhcnRfaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgaW4gdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfcGF0aGAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9wYXRoJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlUGF0aEFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdGhhdCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIGZpbGVfaWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIEEgVVJMIGZvciB0aGUgZmlsZSB0aGF0J3MgZ2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudCB1c2VkIHRoZVxuICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgdG8gZ2VuZXJhdGUgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgdGV4dCBjb250ZW50IHBhcnQuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfcGF0aGAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9wYXRoJztcblxuICBlbmRfaW5kZXg/OiBudW1iZXI7XG5cbiAgZmlsZV9wYXRoPzogRmlsZVBhdGhEZWx0YUFubm90YXRpb24uRmlsZVBhdGg7XG5cbiAgc3RhcnRfaW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZVBhdGhEZWx0YUFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdGhhdCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGUge1xuICAvKipcbiAgICogVGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCBvZiB0aGUgaW1hZ2VcbiAgICogaW4gdGhlIG1lc3NhZ2UgY29udGVudC4gU2V0IGBwdXJwb3NlPVwidmlzaW9uXCJgIHdoZW4gdXBsb2FkaW5nIHRoZSBGaWxlIGlmIHlvdVxuICAgKiBuZWVkIHRvIGxhdGVyIGRpc3BsYXkgdGhlIGZpbGUgY29udGVudC5cbiAgICovXG4gIGZpbGVfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXRhaWwgbGV2ZWwgb2YgdGhlIGltYWdlIGlmIHNwZWNpZmllZCBieSB0aGUgdXNlci4gYGxvd2AgdXNlc1xuICAgKiBmZXdlciB0b2tlbnMsIHlvdSBjYW4gb3B0IGluIHRvIGhpZ2ggcmVzb2x1dGlvbiB1c2luZyBgaGlnaGAuXG4gICAqL1xuICBkZXRhaWw/OiAnYXV0bycgfCAnbG93JyB8ICdoaWdoJztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZUNvbnRlbnRCbG9jayB7XG4gIGltYWdlX2ZpbGU6IEltYWdlRmlsZTtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZV9maWxlYC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV9maWxlJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGVEZWx0YSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UgaWYgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLiBgbG93YCB1c2VzXG4gICAqIGZld2VyIHRva2VucywgeW91IGNhbiBvcHQgaW4gdG8gaGlnaCByZXNvbHV0aW9uIHVzaW5nIGBoaWdoYC5cbiAgICovXG4gIGRldGFpbD86ICdhdXRvJyB8ICdsb3cnIHwgJ2hpZ2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZSBpbWFnZVxuICAgKiBpbiB0aGUgbWVzc2FnZSBjb250ZW50LiBTZXQgYHB1cnBvc2U9XCJ2aXNpb25cImAgd2hlbiB1cGxvYWRpbmcgdGhlIEZpbGUgaWYgeW91XG4gICAqIG5lZWQgdG8gbGF0ZXIgZGlzcGxheSB0aGUgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgZmlsZV9pZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZURlbHRhQmxvY2sge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjb250ZW50IHBhcnQgaW4gdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlX2ZpbGVgLlxuICAgKi9cbiAgdHlwZTogJ2ltYWdlX2ZpbGUnO1xuXG4gIGltYWdlX2ZpbGU/OiBJbWFnZUZpbGVEZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZVVSTCB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgVVJMIG9mIHRoZSBpbWFnZSwgbXVzdCBiZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlczoganBlZywganBnLCBwbmcsXG4gICAqIGdpZiwgd2VicC5cbiAgICovXG4gIHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UuIGBsb3dgIHVzZXMgZmV3ZXIgdG9rZW5zLCB5b3UgY2FuIG9wdCBpblxuICAgKiB0byBoaWdoIHJlc29sdXRpb24gdXNpbmcgYGhpZ2hgLiBEZWZhdWx0IHZhbHVlIGlzIGBhdXRvYFxuICAgKi9cbiAgZGV0YWlsPzogJ2F1dG8nIHwgJ2xvdycgfCAnaGlnaCc7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBVUkwgaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlVVJMQ29udGVudEJsb2NrIHtcbiAgaW1hZ2VfdXJsOiBJbWFnZVVSTDtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgcGFydC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV91cmwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlVVJMRGVsdGEge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZXRhaWwgbGV2ZWwgb2YgdGhlIGltYWdlLiBgbG93YCB1c2VzIGZld2VyIHRva2VucywgeW91IGNhbiBvcHQgaW5cbiAgICogdG8gaGlnaCByZXNvbHV0aW9uIHVzaW5nIGBoaWdoYC5cbiAgICovXG4gIGRldGFpbD86ICdhdXRvJyB8ICdsb3cnIHwgJ2hpZ2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBpbWFnZSwgbXVzdCBiZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlczoganBlZywganBnLCBwbmcsIGdpZixcbiAgICogd2VicC5cbiAgICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFVSTCBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VVUkxEZWx0YUJsb2NrIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgY29udGVudCBwYXJ0IGluIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZV91cmxgLlxuICAgKi9cbiAgdHlwZTogJ2ltYWdlX3VybCc7XG5cbiAgaW1hZ2VfdXJsPzogSW1hZ2VVUkxEZWx0YTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgYXBwbGljYWJsZSwgdGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRoYXRcbiAgICogYXV0aG9yZWQgdGhpcyBtZXNzYWdlLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSB3ZXJlIGFkZGVkIHRvLlxuICAgKi9cbiAgYXR0YWNobWVudHM6IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBtZXNzYWdlIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGluIGFycmF5IG9mIHRleHQgYW5kL29yIGltYWdlcy5cbiAgICovXG4gIGNvbnRlbnQ6IEFycmF5PE1lc3NhZ2VDb250ZW50PjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgbWVzc2FnZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgbWVzc2FnZSB3YXMgbWFya2VkIGFzIGluY29tcGxldGUuXG4gICAqL1xuICBpbmNvbXBsZXRlX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPbiBhbiBpbmNvbXBsZXRlIG1lc3NhZ2UsIGRldGFpbHMgYWJvdXQgd2h5IHRoZSBtZXNzYWdlIGlzIGluY29tcGxldGUuXG4gICAqL1xuICBpbmNvbXBsZXRlX2RldGFpbHM6IE1lc3NhZ2UuSW5jb21wbGV0ZURldGFpbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQubWVzc2FnZWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQubWVzc2FnZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBwcm9kdWNlZCB0aGUgbWVzc2FnZS4gT25lIG9mIGB1c2VyYCBvciBgYXNzaXN0YW50YC5cbiAgICovXG4gIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucylcbiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGlzIG1lc3NhZ2UuIFZhbHVlIGlzIGBudWxsYCB3aGVuIG1lc3NhZ2VzIGFyZVxuICAgKiBjcmVhdGVkIG1hbnVhbGx5IHVzaW5nIHRoZSBjcmVhdGUgbWVzc2FnZSBvciBjcmVhdGUgdGhyZWFkIGVuZHBvaW50cy5cbiAgICovXG4gIHJ1bl9pZDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLCBgaW5jb21wbGV0ZWAsIG9yXG4gICAqIGBjb21wbGV0ZWRgLlxuICAgKi9cbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIHwgJ2luY29tcGxldGUnIHwgJ2NvbXBsZXRlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpIElEIHRoYXRcbiAgICogdGhpcyBtZXNzYWdlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICB0aHJlYWRfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgKi9cbiAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGFuIGluY29tcGxldGUgbWVzc2FnZSwgZGV0YWlscyBhYm91dCB3aHkgdGhlIG1lc3NhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSW5jb21wbGV0ZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1lc3NhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICAgKi9cbiAgICByZWFzb246ICdjb250ZW50X2ZpbHRlcicgfCAnbWF4X3Rva2VucycgfCAncnVuX2NhbmNlbGxlZCcgfCAncnVuX2V4cGlyZWQnIHwgJ3J1bl9mYWlsZWQnO1xuICB9XG59XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcylcbiAqIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUNvbnRlbnQgPSBJbWFnZUZpbGVDb250ZW50QmxvY2sgfCBJbWFnZVVSTENvbnRlbnRCbG9jayB8IFRleHRDb250ZW50QmxvY2s7XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcylcbiAqIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUNvbnRlbnREZWx0YSA9IEltYWdlRmlsZURlbHRhQmxvY2sgfCBUZXh0RGVsdGFCbG9jayB8IEltYWdlVVJMRGVsdGFCbG9jaztcblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlQ29udGVudFBhcnRQYXJhbSA9IEltYWdlRmlsZUNvbnRlbnRCbG9jayB8IEltYWdlVVJMQ29udGVudEJsb2NrIHwgVGV4dENvbnRlbnRCbG9ja1BhcmFtO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3RocmVhZC5tZXNzYWdlLmRlbGV0ZWQnO1xufVxuXG4vKipcbiAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGluIGFycmF5IG9mIHRleHQgYW5kL29yIGltYWdlcy5cbiAgICovXG4gIGNvbnRlbnQ/OiBBcnJheTxNZXNzYWdlQ29udGVudERlbHRhPjtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHByb2R1Y2VkIHRoZSBtZXNzYWdlLiBPbmUgb2YgYHVzZXJgIG9yIGBhc3Npc3RhbnRgLlxuICAgKi9cbiAgcm9sZT86ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgbWVzc2FnZSBkdXJpbmdcbiAqIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGVsdGFFdmVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIE1lc3NhZ2UuXG4gICAqL1xuICBkZWx0YTogTWVzc2FnZURlbHRhO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLm1lc3NhZ2UuZGVsdGFgLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHQge1xuICBhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj47XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgbWFrZXMgdXAgdGhlIHRleHQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0ZXh0IGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0Q29udGVudEJsb2NrIHtcbiAgdGV4dDogVGV4dDtcblxuICAvKipcbiAgICogQWx3YXlzIGB0ZXh0YC5cbiAgICovXG4gIHR5cGU6ICd0ZXh0Jztcbn1cblxuLyoqXG4gKiBUaGUgdGV4dCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dENvbnRlbnRCbG9ja1BhcmFtIHtcbiAgLyoqXG4gICAqIFRleHQgY29udGVudCB0byBiZSBzZW50IHRvIHRoZSBtb2RlbFxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRleHRgLlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHREZWx0YSB7XG4gIGFubm90YXRpb25zPzogQXJyYXk8QW5ub3RhdGlvbkRlbHRhPjtcblxuICAvKipcbiAgICogVGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgdGV4dC5cbiAgICovXG4gIHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0ZXh0IGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RGVsdGFCbG9jayB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnRlbnQgcGFydCBpbiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgdGV4dGAuXG4gICAqL1xuICB0eXBlOiAndGV4dCc7XG5cbiAgdGV4dD86IFRleHREZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAqXG4gICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgKi9cbiAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICovXG4gIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZUNyZWF0ZVBhcmFtcy5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZUNyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICovXG4gICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgbWVzc2FnZXMgYnkgdGhlIHJ1biBJRCB0aGF0IGdlbmVyYXRlZCB0aGVtLlxuICAgKi9cbiAgcnVuX2lkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VzIHtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uRGVsdGEgPSBNZXNzYWdlc0FQSS5Bbm5vdGF0aW9uRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVQYXRoQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZSA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGEgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZVVSTCA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMO1xuICBleHBvcnQgaW1wb3J0IEltYWdlVVJMQ29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkxDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkxEZWx0YSA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkxEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VVUkxEZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2UgPSBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50ID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnREZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50RGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0gPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsZXRlZCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsdGFFdmVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRleHQgPSBNZXNzYWdlc0FQSS5UZXh0O1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0Q29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2tQYXJhbSA9IE1lc3NhZ2VzQVBJLlRleHRDb250ZW50QmxvY2tQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBUZXh0RGVsdGEgPSBNZXNzYWdlc0FQSS5UZXh0RGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dERlbHRhQmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0RGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlc1BhZ2UgPSBNZXNzYWdlc0FQSS5NZXNzYWdlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNyZWF0ZVBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZVVwZGF0ZVBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUxpc3RQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgKiBhcyBTdGVwc0FQSSBmcm9tICcuL3N0ZXBzJztcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uLy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgU3RlcHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBydW4gc3RlcC5cbiAgICovXG4gIHJldHJpZXZlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBzdGVwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFJ1blN0ZXA+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfS9zdGVwcy8ke3N0ZXBJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBydW4gc3RlcHMgYmVsb25naW5nIHRvIGEgcnVuLlxuICAgKi9cbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBTdGVwTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogU3RlcExpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8UnVuU3RlcHNQYWdlLCBSdW5TdGVwPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHRocmVhZElkLCBydW5JZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L3N0ZXBzYCwgUnVuU3RlcHNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5TdGVwc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFJ1blN0ZXA+IHt9XG5cbi8qKlxuICogVGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgYXMgcGFydCBvZiBhIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlckxvZ3Mge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGxvZ3NgLlxuICAgKi9cbiAgdHlwZTogJ2xvZ3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuXG4gICAqL1xuICBsb2dzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlck91dHB1dEltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXRzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZWAuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2UnO1xuXG4gIGltYWdlPzogQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2UuSW1hZ2U7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZVxuICAgICAqIGltYWdlLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBjb2RlX2ludGVycHJldGVyOiBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbC5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgY2FsbC4gVGhpcyBpcyBhbHdheXMgZ29pbmcgdG8gYmUgYGNvZGVfaW50ZXJwcmV0ZXJgIGZvciB0aGlzXG4gICAqIHR5cGUgb2YgdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2NvZGVfaW50ZXJwcmV0ZXInO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBkZWZpbml0aW9uLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnB1dCB0byB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuXG4gICAgICovXG4gICAgaW5wdXQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXRzIGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLiBDb2RlIEludGVycHJldGVyIGNhbiBvdXRwdXQgb25lXG4gICAgICogb3IgbW9yZSBpdGVtcywgaW5jbHVkaW5nIHRleHQgKGBsb2dzYCkgb3IgaW1hZ2VzIChgaW1hZ2VgKS4gRWFjaCBvZiB0aGVzZSBhcmVcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBvdXRwdXRzOiBBcnJheTxDb2RlSW50ZXJwcmV0ZXIuTG9ncyB8IENvZGVJbnRlcnByZXRlci5JbWFnZT47XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgYXMgcGFydCBvZiBhIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9ncyB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0ZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgICAqL1xuICAgICAgbG9nczogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIEFsd2F5cyBgbG9nc2AuXG4gICAgICAgKi9cbiAgICAgIHR5cGU6ICdsb2dzJztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgICAgIGltYWdlOiBJbWFnZS5JbWFnZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBBbHdheXMgYGltYWdlYC5cbiAgICAgICAqL1xuICAgICAgdHlwZTogJ2ltYWdlJztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIEltYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCBvZiB0aGVcbiAgICAgICAgICogaW1hZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkOiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSB0b29sIGNhbGxzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgY29kZV9pbnRlcnByZXRlcmAgZm9yIHRoaXNcbiAgICogdHlwZSBvZiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnY29kZV9pbnRlcnByZXRlcic7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBkZWZpbml0aW9uLlxuICAgKi9cbiAgY29kZV9pbnRlcnByZXRlcj86IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEuQ29kZUludGVycHJldGVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGlucHV0IHRvIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBpbnB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXRzIGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLiBDb2RlIEludGVycHJldGVyIGNhbiBvdXRwdXQgb25lXG4gICAgICogb3IgbW9yZSBpdGVtcywgaW5jbHVkaW5nIHRleHQgKGBsb2dzYCkgb3IgaW1hZ2VzIChgaW1hZ2VgKS4gRWFjaCBvZiB0aGVzZSBhcmVcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBvdXRwdXRzPzogQXJyYXk8U3RlcHNBUEkuQ29kZUludGVycHJldGVyTG9ncyB8IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlck91dHB1dEltYWdlPjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBhbiBlbXB0eSBvYmplY3QuXG4gICAqL1xuICBmaWxlX3NlYXJjaDogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZmlsZV9zZWFyY2hgIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfc2VhcmNoJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBhbiBlbXB0eSBvYmplY3QuXG4gICAqL1xuICBmaWxlX3NlYXJjaDogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmaWxlX3NlYXJjaGAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9zZWFyY2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbjogRnVuY3Rpb25Ub29sQ2FsbC5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZnVuY3Rpb25gIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIG91dHB1dHMgaGF2ZSBub3QgYmVlblxuICAgICAqIFtzdWJtaXR0ZWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdWJtaXRUb29sT3V0cHV0cylcbiAgICAgKiB5ZXQuXG4gICAgICovXG4gICAgb3V0cHV0OiBzdHJpbmcgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25Ub29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSB0b29sIGNhbGxzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZnVuY3Rpb25gIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgb2JqZWN0LlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbj86IEZ1bmN0aW9uVG9vbENhbGxEZWx0YS5GdW5jdGlvbjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGdW5jdGlvblRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYG51bGxgIGlmIHRoZSBvdXRwdXRzIGhhdmUgbm90IGJlZW5cbiAgICAgKiBbc3VibWl0dGVkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3VibWl0VG9vbE91dHB1dHMpXG4gICAgICogeWV0LlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZyB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBtZXNzYWdlIGNyZWF0aW9uIGJ5IHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB7XG4gIG1lc3NhZ2VfY3JlYXRpb246IE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzLk1lc3NhZ2VDcmVhdGlvbjtcblxuICAvKipcbiAgICogQWx3YXlzIGBtZXNzYWdlX2NyZWF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdtZXNzYWdlX2NyZWF0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNyZWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIG1lc3NhZ2VfaWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKVxuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICBjYW5jZWxsZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGV4cGlyZWQuIEEgc3RlcCBpc1xuICAgKiBjb25zaWRlcmVkIGV4cGlyZWQgaWYgdGhlIHBhcmVudCBydW4gaXMgZXhwaXJlZC5cbiAgICovXG4gIGV4cGlyZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuIHN0ZXAuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgKiBlcnJvcnMuXG4gICAqL1xuICBsYXN0X2Vycm9yOiBSdW5TdGVwLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW4uc3RlcGAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQucnVuLnN0ZXAnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucykgdGhhdFxuICAgKiB0aGlzIHJ1biBzdGVwIGlzIGEgcGFydCBvZi5cbiAgICovXG4gIHJ1bl9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLCBgY2FuY2VsbGVkYCxcbiAgICogYGZhaWxlZGAsIGBjb21wbGV0ZWRgLCBvciBgZXhwaXJlZGAuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY2FuY2VsbGVkJyB8ICdmYWlsZWQnIHwgJ2NvbXBsZXRlZCcgfCAnZXhwaXJlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXRhaWxzIG9mIHRoZSBydW4gc3RlcC5cbiAgICovXG4gIHN0ZXBfZGV0YWlsczogTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMgfCBUb29sQ2FsbHNTdGVwRGV0YWlscztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpXG4gICAqIHRoYXQgd2FzIHJ1bi5cbiAgICovXG4gIHRocmVhZF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgbWVzc2FnZV9jcmVhdGlvbmAgb3IgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nIHwgJ3Rvb2xfY2FsbHMnO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1biBzdGVwLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIHdoaWxlIHRoZVxuICAgKiBydW4gc3RlcCdzIHN0YXR1cyBpcyBgaW5fcHJvZ3Jlc3NgLlxuICAgKi9cbiAgdXNhZ2U6IFJ1blN0ZXAuVXNhZ2UgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXAge1xuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuIHN0ZXAuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgKiBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgIG9yIGByYXRlX2xpbWl0X2V4Y2VlZGVkYC5cbiAgICAgKi9cbiAgICBjb2RlOiAnc2VydmVyX2Vycm9yJyB8ICdyYXRlX2xpbWl0X2V4Y2VlZGVkJztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1biBzdGVwLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIHdoaWxlIHRoZVxuICAgKiBydW4gc3RlcCdzIHN0YXR1cyBpcyBgaW5fcHJvZ3Jlc3NgLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBVc2FnZSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4gc3RlcC5cbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIHByb21wdF90b2tlbnM6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCAocHJvbXB0ICsgY29tcGxldGlvbikuXG4gICAgICovXG4gICAgdG90YWxfdG9rZW5zOiBudW1iZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVsdGEgY29udGFpbmluZyB0aGUgZmllbGRzIHRoYXQgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGEge1xuICAvKipcbiAgICogVGhlIGRldGFpbHMgb2YgdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgc3RlcF9kZXRhaWxzPzogUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhIHwgVG9vbENhbGxEZWx0YU9iamVjdDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcnVuIHN0ZXAgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBydW4gc3RlcCBkdXJpbmdcbiAqIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGFFdmVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcnVuIHN0ZXAsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsdGEgY29udGFpbmluZyB0aGUgZmllbGRzIHRoYXQgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBydW4gc3RlcC5cbiAgICovXG4gIGRlbHRhOiBSdW5TdGVwRGVsdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQucnVuLnN0ZXAuZGVsdGFgLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBtZXNzYWdlIGNyZWF0aW9uIGJ5IHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEge1xuICAvKipcbiAgICogQWx3YXlzIGBtZXNzYWdlX2NyZWF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdtZXNzYWdlX2NyZWF0aW9uJztcblxuICBtZXNzYWdlX2NyZWF0aW9uPzogUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhLk1lc3NhZ2VDcmVhdGlvbjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEge1xuICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDcmVhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhpcyBydW4gc3RlcC5cbiAgICAgKi9cbiAgICBtZXNzYWdlX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbENhbGwgPSBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbCB8IEZpbGVTZWFyY2hUb29sQ2FsbCB8IEZ1bmN0aW9uVG9vbENhbGw7XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbENhbGxEZWx0YSA9IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEgfCBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSB8IEZ1bmN0aW9uVG9vbENhbGxEZWx0YTtcblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSB0b29sIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGxEZWx0YU9iamVjdCB7XG4gIC8qKlxuICAgKiBBbHdheXMgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ3Rvb2xfY2FsbHMnO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB0b29sIGNhbGxzIHRoZSBydW4gc3RlcCB3YXMgaW52b2x2ZWQgaW4uIFRoZXNlIGNhbiBiZSBhc3NvY2lhdGVkXG4gICAqIHdpdGggb25lIG9mIHRocmVlIHR5cGVzIG9mIHRvb2xzOiBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8VG9vbENhbGxEZWx0YT47XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgdG9vbCBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xDYWxsc1N0ZXBEZXRhaWxzIHtcbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRvb2wgY2FsbHMgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi4gVGhlc2UgY2FuIGJlIGFzc29jaWF0ZWRcbiAgICogd2l0aCBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdG9vbHM6IGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xfY2FsbHM6IEFycmF5PFRvb2xDYWxsPjtcblxuICAvKipcbiAgICogQWx3YXlzIGB0b29sX2NhbGxzYC5cbiAgICovXG4gIHR5cGU6ICd0b29sX2NhbGxzJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFN0ZXBzIHtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJMb2dzID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyTG9ncztcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlck91dHB1dEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2xDYWxsID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbCA9IFN0ZXBzQVBJLkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzID0gU3RlcHNBUEkuTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcCA9IFN0ZXBzQVBJLlJ1blN0ZXA7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YUV2ZW50ID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsID0gU3RlcHNBUEkuVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YU9iamVjdCA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGFPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxzU3RlcERldGFpbHMgPSBTdGVwc0FQSS5Ub29sQ2FsbHNTdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwc1BhZ2UgPSBTdGVwc0FQSS5SdW5TdGVwc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgU3RlcExpc3RQYXJhbXMgPSBTdGVwc0FQSS5TdGVwTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUHJvbWlzZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBc3Npc3RhbnRTdHJlYW0sIFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0gfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvQXNzaXN0YW50U3RyZWFtJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSB9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9Bc3Npc3RhbnRTdHJlYW0nO1xuaW1wb3J0ICogYXMgUnVuc0FQSSBmcm9tICcuL3J1bnMnO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tICcuLi8uLi9hc3Npc3RhbnRzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VzQVBJIGZyb20gJy4uL21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSAnLi4vdGhyZWFkcyc7XG5pbXBvcnQgKiBhcyBTdGVwc0FQSSBmcm9tICcuL3N0ZXBzJztcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gJy4uLy4uLy4uLy4uL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3RyZWFtaW5nJztcblxuZXhwb3J0IGNsYXNzIFJ1bnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHN0ZXBzOiBTdGVwc0FQSS5TdGVwcyA9IG5ldyBTdGVwc0FQSS5TdGVwcyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBydW4uXG4gICAqL1xuICBjcmVhdGUodGhyZWFkSWQ6IHN0cmluZywgYm9keTogUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IEFQSVByb21pc2U8UnVuPjtcbiAgY3JlYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIGNyZWF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+IHwgUnVuPjtcbiAgY3JlYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVuc2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UsXG4gICAgfSkgYXMgQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHJ1bi5cbiAgICovXG4gIHJldHJpZXZlKHRocmVhZElkOiBzdHJpbmcsIHJ1bklkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgYSBydW4uXG4gICAqL1xuICB1cGRhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBydW5zIGJlbG9uZ2luZyB0byBhIHRocmVhZC5cbiAgICovXG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IFJ1bkxpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8UnVuc1BhZ2UsIFJ1bj47XG4gIGxpc3QodGhyZWFkSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPFJ1bnNQYWdlLCBSdW4+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk6IFJ1bkxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8UnVuc1BhZ2UsIFJ1bj4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh0aHJlYWRJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zYCwgUnVuc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhIHJ1biB0aGF0IGlzIGBpbl9wcm9ncmVzc2AuXG4gICAqL1xuICBjYW5jZWwodGhyZWFkSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L2NhbmNlbGAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhIHJ1biBhbiBwb2xsIGZvciBhIHRlcm1pbmFsIHN0YXRlLiBNb3JlIGluZm9ybWF0aW9uIG9uIFJ1blxuICAgKiBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFBvbGwoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5jcmVhdGUodGhyZWFkSWQsIGJvZHksIG9wdGlvbnMpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBvbGwodGhyZWFkSWQsIHJ1bi5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUnVuIHN0cmVhbVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYHN0cmVhbWAgaW5zdGVhZFxuICAgKi9cbiAgY3JlYXRlQW5kU3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZUFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgdGhpcy5fY2xpZW50LmJldGEudGhyZWFkcy5ydW5zLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhlbHBlciB0byBwb2xsIGEgcnVuIHN0YXR1cyB1bnRpbCBpdCByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuIE1vcmVcbiAgICogaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgcG9sbChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3QgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLVBvbGwtSGVscGVyJzogJ3RydWUnIH07XG5cbiAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgIGhlYWRlcnNbJ1gtU3RhaW5sZXNzLUN1c3RvbS1Qb2xsLUludGVydmFsJ10gPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZGF0YTogcnVuLCByZXNwb25zZSB9ID0gYXdhaXQgdGhpcy5yZXRyaWV2ZSh0aHJlYWRJZCwgcnVuSWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAuLi5oZWFkZXJzIH0sXG4gICAgICB9KS53aXRoUmVzcG9uc2UoKTtcblxuICAgICAgc3dpdGNoIChydW4uc3RhdHVzKSB7XG4gICAgICAgIC8vSWYgd2UgYXJlIGluIGFueSBzb3J0IG9mIGludGVybWVkaWF0ZSBzdGF0ZSB3ZSBwb2xsXG4gICAgICAgIGNhc2UgJ3F1ZXVlZCc6XG4gICAgICAgIGNhc2UgJ2luX3Byb2dyZXNzJzpcbiAgICAgICAgY2FzZSAnY2FuY2VsbGluZyc6XG4gICAgICAgICAgbGV0IHNsZWVwSW50ZXJ2YWwgPSA1MDAwO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICAgICAgICBzbGVlcEludGVydmFsID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWwgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnb3BlbmFpLXBvbGwtYWZ0ZXItbXMnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJJbnRlcnZhbCkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbE1zID0gcGFyc2VJbnQoaGVhZGVySW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlckludGVydmFsTXMpKSB7XG4gICAgICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IGhlYWRlckludGVydmFsTXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBJbnRlcnZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vV2UgcmV0dXJuIHRoZSBydW4gaW4gYW55IHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICBjYXNlICdyZXF1aXJlc19hY3Rpb24nOlxuICAgICAgICBjYXNlICdpbmNvbXBsZXRlJzpcbiAgICAgICAgY2FzZSAnY2FuY2VsbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnZXhwaXJlZCc6XG4gICAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUnVuIHN0cmVhbVxuICAgKi9cbiAgc3RyZWFtKHRocmVhZElkOiBzdHJpbmcsIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0sIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZUFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgdGhpcy5fY2xpZW50LmJldGEudGhyZWFkcy5ydW5zLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgcnVuIGhhcyB0aGUgYHN0YXR1czogXCJyZXF1aXJlc19hY3Rpb25cImAgYW5kIGByZXF1aXJlZF9hY3Rpb24udHlwZWAgaXNcbiAgICogYHN1Ym1pdF90b29sX291dHB1dHNgLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHN1Ym1pdCB0aGUgb3V0cHV0cyBmcm9tIHRoZVxuICAgKiB0b29sIGNhbGxzIG9uY2UgdGhleSdyZSBhbGwgY29tcGxldGVkLiBBbGwgb3V0cHV0cyBtdXN0IGJlIHN1Ym1pdHRlZCBpbiBhIHNpbmdsZVxuICAgKiByZXF1ZXN0LlxuICAgKi9cbiAgc3VibWl0VG9vbE91dHB1dHMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bj47XG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICBzdWJtaXRUb29sT3V0cHV0cyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50PiB8IFJ1bj47XG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vc3VibWl0X3Rvb2xfb3V0cHV0c2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UsXG4gICAgfSkgYXMgQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIHRvIHN1Ym1pdCBhIHRvb2wgb3V0cHV0IHRvIGEgcnVuIGFuZCBwb2xsIGZvciBhIHRlcm1pbmFsIHJ1biBzdGF0ZS5cbiAgICogTW9yZSBpbmZvcm1hdGlvbiBvbiBSdW4gbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBhc3luYyBzdWJtaXRUb29sT3V0cHV0c0FuZFBvbGwoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHRoaXMuc3VibWl0VG9vbE91dHB1dHModGhyZWFkSWQsIHJ1bklkLCBib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHRocmVhZElkLCBydW4uaWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCB0aGUgdG9vbCBvdXRwdXRzIGZyb20gYSBwcmV2aW91cyBydW4gYW5kIHN0cmVhbSB0aGUgcnVuIHRvIGEgdGVybWluYWxcbiAgICogc3RhdGUuIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgc3VibWl0VG9vbE91dHB1dHNTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICAgIHRocmVhZElkLFxuICAgICAgcnVuSWQsXG4gICAgICB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLnJ1bnMsXG4gICAgICBib2R5LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5zUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8UnVuPiB7fVxuXG4vKipcbiAqIFRvb2wgY2FsbCBvYmplY3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLiBUaGlzIElEIG11c3QgYmUgcmVmZXJlbmNlZCB3aGVuIHlvdSBzdWJtaXQgdGhlIHRvb2xcbiAgICogb3V0cHV0cyBpbiB1c2luZyB0aGVcbiAgICogW1N1Ym1pdCB0b29sIG91dHB1dHMgdG8gcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3VibWl0VG9vbE91dHB1dHMpXG4gICAqIGVuZHBvaW50LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uXG4gICAqL1xuICBmdW5jdGlvbjogUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwgdGhlIG91dHB1dCBpcyByZXF1aXJlZCBmb3IuIEZvciBub3csIHRoaXMgaXMgYWx3YXlzXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdGhhdCB0aGUgbW9kZWwgZXhwZWN0cyB5b3UgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdpbGwgZXhwaXJlLlxuICAgKi9cbiAgZXhwaXJlc19hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogRGV0YWlscyBvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbmNvbXBsZXRlLlxuICAgKi9cbiAgaW5jb21wbGV0ZV9kZXRhaWxzOiBSdW4uSW5jb21wbGV0ZURldGFpbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogdGhpcyBydW4uXG4gICAqL1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgbGFzdF9lcnJvcjogUnVuLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQgdG8gaGF2ZSBiZWVuIHVzZWQgb3ZlciB0aGVcbiAgICogY291cnNlIG9mIHRoZSBydW4uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCB0byBoYXZlIGJlZW4gdXNlZCBvdmVyIHRoZSBjb3Vyc2VcbiAgICogb2YgdGhlIHJ1bi5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0aGF0IHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIHRoaXMgcnVuLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW5gLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLnJ1bic7XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb24gdGhlIGFjdGlvbiByZXF1aXJlZCB0byBjb250aW51ZSB0aGUgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiBubyBhY3Rpb25cbiAgICogaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZF9hY3Rpb246IFJ1bi5SZXF1aXJlZEFjdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdDogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3YXMgc3RhcnRlZC5cbiAgICovXG4gIHN0YXJ0ZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHJ1biwgd2hpY2ggY2FuIGJlIGVpdGhlciBgcXVldWVkYCwgYGluX3Byb2dyZXNzYCxcbiAgICogYHJlcXVpcmVzX2FjdGlvbmAsIGBjYW5jZWxsaW5nYCwgYGNhbmNlbGxlZGAsIGBmYWlsZWRgLCBgY29tcGxldGVkYCxcbiAgICogYGluY29tcGxldGVgLCBvciBgZXhwaXJlZGAuXG4gICAqL1xuICBzdGF0dXM6IFJ1blN0YXR1cztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpXG4gICAqIHRoYXQgd2FzIGV4ZWN1dGVkIG9uIGFzIGEgcGFydCBvZiB0aGlzIHJ1bi5cbiAgICovXG4gIHRocmVhZF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlOiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiB0b29scyB0aGF0IHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIHRoaXMgcnVuLlxuICAgKi9cbiAgdG9vbHM6IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5OiBSdW4uVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBydW4uIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIHJ1biBpcyBub3RcbiAgICogaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoaS5lLiBgaW5fcHJvZ3Jlc3NgLCBgcXVldWVkYCwgZXRjLikuXG4gICAqL1xuICB1c2FnZTogUnVuLlVzYWdlIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlIHVzZWQgZm9yIHRoaXMgcnVuLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byAxLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVjbGV1cyBzYW1wbGluZyB2YWx1ZSB1c2VkIGZvciB0aGlzIHJ1bi4gSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gMS5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW4ge1xuICAvKipcbiAgICogRGV0YWlscyBvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbmNvbXBsZXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBJbmNvbXBsZXRlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBUaGlzIHdpbGwgcG9pbnQgdG8gd2hpY2ggc3BlY2lmaWMgdG9rZW5cbiAgICAgKiBsaW1pdCB3YXMgcmVhY2hlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICByZWFzb24/OiAnbWF4X2NvbXBsZXRpb25fdG9rZW5zJyB8ICdtYXhfcHJvbXB0X3Rva2Vucyc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBMYXN0RXJyb3Ige1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiBgc2VydmVyX2Vycm9yYCwgYHJhdGVfbGltaXRfZXhjZWVkZWRgLCBvciBgaW52YWxpZF9wcm9tcHRgLlxuICAgICAqL1xuICAgIGNvZGU6ICdzZXJ2ZXJfZXJyb3InIHwgJ3JhdGVfbGltaXRfZXhjZWVkZWQnIHwgJ2ludmFsaWRfcHJvbXB0JztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHRoZSBhY3Rpb24gcmVxdWlyZWQgdG8gY29udGludWUgdGhlIHJ1bi4gV2lsbCBiZSBgbnVsbGAgaWYgbm8gYWN0aW9uXG4gICAqIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB0aGUgdG9vbCBvdXRwdXRzIG5lZWRlZCBmb3IgdGhpcyBydW4gdG8gY29udGludWUuXG4gICAgICovXG4gICAgc3VibWl0X3Rvb2xfb3V0cHV0czogUmVxdWlyZWRBY3Rpb24uU3VibWl0VG9vbE91dHB1dHM7XG5cbiAgICAvKipcbiAgICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBgc3VibWl0X3Rvb2xfb3V0cHV0c2AuXG4gICAgICovXG4gICAgdHlwZTogJ3N1Ym1pdF90b29sX291dHB1dHMnO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBSZXF1aXJlZEFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB0aGUgdG9vbCBvdXRwdXRzIG5lZWRlZCBmb3IgdGhpcyBydW4gdG8gY29udGludWUuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb29sT3V0cHV0cyB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiB0aGUgcmVsZXZhbnQgdG9vbCBjYWxscy5cbiAgICAgICAqL1xuICAgICAgdG9vbF9jYWxsczogQXJyYXk8UnVuc0FQSS5SZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGw+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIGlmIHRoZSBydW4gaXMgbm90XG4gICAqIGluIGEgdGVybWluYWwgc3RhdGUgKGkuZS4gYGluX3Byb2dyZXNzYCwgYHF1ZXVlZGAsIGV0Yy4pLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBVc2FnZSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAgICovXG4gICAgY29tcGxldGlvbl90b2tlbnM6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIChwcm9tcHQgKyBjb21wbGV0aW9uKS5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHJ1biwgd2hpY2ggY2FuIGJlIGVpdGhlciBgcXVldWVkYCwgYGluX3Byb2dyZXNzYCxcbiAqIGByZXF1aXJlc19hY3Rpb25gLCBgY2FuY2VsbGluZ2AsIGBjYW5jZWxsZWRgLCBgZmFpbGVkYCwgYGNvbXBsZXRlZGAsXG4gKiBgaW5jb21wbGV0ZWAsIG9yIGBleHBpcmVkYC5cbiAqL1xuZXhwb3J0IHR5cGUgUnVuU3RhdHVzID1cbiAgfCAncXVldWVkJ1xuICB8ICdpbl9wcm9ncmVzcydcbiAgfCAncmVxdWlyZXNfYWN0aW9uJ1xuICB8ICdjYW5jZWxsaW5nJ1xuICB8ICdjYW5jZWxsZWQnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAnY29tcGxldGVkJ1xuICB8ICdpbmNvbXBsZXRlJ1xuICB8ICdleHBpcmVkJztcblxuZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zID0gUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIHwgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuQ3JlYXRlUGFyYW1zLkFkZGl0aW9uYWxNZXNzYWdlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGVcbiAgICogW2luc3RydWN0aW9uc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzL2NyZWF0ZUFzc2lzdGFudClcbiAgICogb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTRvJ1xuICAgIHwgJ2dwdC00by0yMDI0LTA1LTEzJ1xuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1bkNyZWF0ZVBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50UGFydFBhcmFtPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIFJ1bkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBSdW5DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuQ3JlYXRlQW5kUG9sbFBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudFBhcnRQYXJhbT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PEFkZGl0aW9uYWxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAqL1xuICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwZW5kcyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBydW4uIFRoaXNcbiAgICogaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcyB3aXRob3V0IG92ZXJyaWRpbmcgb3RoZXJcbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgYWRkaXRpb25hbF9pbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHJ1bi5cbiAgICovXG4gIGFkZGl0aW9uYWxfbWVzc2FnZXM/OiBBcnJheTxSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMuQWRkaXRpb25hbE1lc3NhZ2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZVxuICAgKiBbaW5zdHJ1Y3Rpb25zXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMvY3JlYXRlQXNzaXN0YW50KVxuICAgKiBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNG8nXG4gICAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50UGFydFBhcmFtPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHJ1bi4gVGhpc1xuICAgKiBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzIHdpdGhvdXQgb3ZlcnJpZGluZyBvdGhlclxuICAgKiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBhZGRpdGlvbmFsX2luc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdGhyZWFkIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVuLlxuICAgKi9cbiAgYWRkaXRpb25hbF9tZXNzYWdlcz86IEFycmF5PFJ1blN0cmVhbVBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00bydcbiAgICB8ICdncHQtNG8tMjAyNC0wNS0xMydcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00b10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00byksXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LXR1cmJvLWFuZC1ncHQtNCksXG4gICAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuU3RyZWFtUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RyZWFtUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxBZGRpdGlvbmFsTWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPVxuICB8IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29scyBmb3Igd2hpY2ggdGhlIG91dHB1dHMgYXJlIGJlaW5nIHN1Ym1pdHRlZC5cbiAgICovXG4gIHRvb2xfb3V0cHV0czogQXJyYXk8UnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMuVG9vbE91dHB1dD47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbE91dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsIHRvIGJlIHN1Ym1pdHRlZCB0byBjb250aW51ZSB0aGUgcnVuLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSBgcmVxdWlyZWRfYWN0aW9uYCBvYmplY3Qgd2l0aGluIHRoZSBydW4gb2JqZWN0XG4gICAgICogdGhlIG91dHB1dCBpcyBiZWluZyBzdWJtaXR0ZWQgZm9yLlxuICAgICAqL1xuICAgIHRvb2xfY2FsbF9pZD86IHN0cmluZztcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIGZvciB3aGljaCB0aGUgb3V0cHV0cyBhcmUgYmVpbmcgc3VibWl0dGVkLlxuICAgKi9cbiAgdG9vbF9vdXRwdXRzOiBBcnJheTxSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMuVG9vbE91dHB1dD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb29sT3V0cHV0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSB0b29sIGNhbGwgdG8gYmUgc3VibWl0dGVkIHRvIGNvbnRpbnVlIHRoZSBydW4uXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIGByZXF1aXJlZF9hY3Rpb25gIG9iamVjdCB3aXRoaW4gdGhlIHJ1biBvYmplY3RcbiAgICAgKiB0aGUgb3V0cHV0IGlzIGJlaW5nIHN1Ym1pdHRlZCBmb3IuXG4gICAgICovXG4gICAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIGZvciB3aGljaCB0aGUgb3V0cHV0cyBhcmUgYmVpbmcgc3VibWl0dGVkLlxuICAgKi9cbiAgdG9vbF9vdXRwdXRzOiBBcnJheTxSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcy5Ub29sT3V0cHV0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbE91dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsIHRvIGJlIHN1Ym1pdHRlZCB0byBjb250aW51ZSB0aGUgcnVuLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSBgcmVxdWlyZWRfYWN0aW9uYCBvYmplY3Qgd2l0aGluIHRoZSBydW4gb2JqZWN0XG4gICAgICogdGhlIG91dHB1dCBpcyBiZWluZyBzdWJtaXR0ZWQgZm9yLlxuICAgICAqL1xuICAgIHRvb2xfY2FsbF9pZD86IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bnMge1xuICBleHBvcnQgaW1wb3J0IFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCA9IFJ1bnNBUEkuUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFJ1biA9IFJ1bnNBUEkuUnVuO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0YXR1cyA9IFJ1bnNBUEkuUnVuU3RhdHVzO1xuICBleHBvcnQgaW1wb3J0IFJ1bnNQYWdlID0gUnVuc0FQSS5SdW5zUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5VcGRhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1blVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5MaXN0UGFyYW1zID0gUnVuc0FQSS5SdW5MaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5TdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFN0ZXBzID0gU3RlcHNBUEkuU3RlcHM7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyTG9ncyA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlckxvZ3M7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2UgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbCA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlclRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sQ2FsbCA9IFN0ZXBzQVBJLkZpbGVTZWFyY2hUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkZpbGVTZWFyY2hUb29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbENhbGwgPSBTdGVwc0FQSS5GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkZ1bmN0aW9uVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyA9IFN0ZXBzQVBJLk1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXAgPSBTdGVwc0FQSS5SdW5TdGVwO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YSA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGFFdmVudCA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbCA9IFN0ZXBzQVBJLlRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5Ub29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsRGVsdGFPYmplY3QgPSBTdGVwc0FQSS5Ub29sQ2FsbERlbHRhT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsc1N0ZXBEZXRhaWxzID0gU3RlcHNBUEkuVG9vbENhbGxzU3RlcERldGFpbHM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcHNQYWdlID0gU3RlcHNBUEkuUnVuU3RlcHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFN0ZXBMaXN0UGFyYW1zID0gU3RlcHNBUEkuU3RlcExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQXNzaXN0YW50U3RyZWFtLCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtIH0gZnJvbSAnLi4vLi4vLi4vbGliL0Fzc2lzdGFudFN0cmVhbSc7XG5pbXBvcnQgKiBhcyBUaHJlYWRzQVBJIGZyb20gJy4vdGhyZWFkcyc7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gJy4uL2Fzc2lzdGFudHMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSAnLi9tZXNzYWdlcyc7XG5pbXBvcnQgKiBhcyBSdW5zQVBJIGZyb20gJy4vcnVucy9ydW5zJztcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gJy4uLy4uLy4uL3N0cmVhbWluZyc7XG5cbmV4cG9ydCBjbGFzcyBUaHJlYWRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBydW5zOiBSdW5zQVBJLlJ1bnMgPSBuZXcgUnVuc0FQSS5SdW5zKHRoaXMuX2NsaWVudCk7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlc0FQSS5NZXNzYWdlcyA9IG5ldyBNZXNzYWdlc0FQSS5NZXNzYWdlcyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQuXG4gICAqL1xuICBjcmVhdGUoYm9keT86IFRocmVhZENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPjtcbiAgY3JlYXRlKG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhib2R5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHt9LCBib2R5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdGhyZWFkcycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB0aHJlYWQuXG4gICAqL1xuICByZXRyaWV2ZSh0aHJlYWRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHRocmVhZC5cbiAgICovXG4gIHVwZGF0ZSh0aHJlYWRJZDogc3RyaW5nLCBib2R5OiBUaHJlYWRVcGRhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgdGhyZWFkLlxuICAgKi9cbiAgZGVsKHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQgYW5kIHJ1biBpdCBpbiBvbmUgcmVxdWVzdC5cbiAgICovXG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuc0FQSS5SdW4+O1xuICBjcmVhdGVBbmRSdW4oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50PiB8IFJ1bnNBUEkuUnVuPjtcbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL3RocmVhZHMvcnVucycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UsXG4gICAgfSkgYXMgQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGEgdGhyZWFkLCBzdGFydCBhIHJ1biBhbmQgdGhlbiBwb2xsIGZvciBhIHRlcm1pbmFsIHN0YXRlLlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIFJ1biBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFJ1blBvbGwoXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFRocmVhZHMuUnVuPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5jcmVhdGVBbmRSdW4oYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVucy5wb2xsKHJ1bi50aHJlYWRfaWQsIHJ1bi5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdGhyZWFkIGFuZCBzdHJlYW0gdGhlIHJ1biBiYWNrXG4gICAqL1xuICBjcmVhdGVBbmRSdW5TdHJlYW0oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShib2R5LCB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBleHBlY3RlZCBvdXRwdXQgb2YgdGhlIG1vZGVsLiBJZiBganNvbl9vYmplY3RgIG9ubHlcbiAqIGBmdW5jdGlvbmAgdHlwZSBgdG9vbHNgIGFyZSBhbGxvd2VkIHRvIGJlIHBhc3NlZCB0byB0aGUgUnVuLiBJZiBgdGV4dGAgdGhlIG1vZGVsXG4gKiBjYW4gcmV0dXJuIHRleHQgb3IgYW55IHZhbHVlIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdCB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIG9uZSBvZiBgdGV4dGAgb3IgYGpzb25fb2JqZWN0YC5cbiAgICovXG4gIHR5cGU/OiAndGV4dCcgfCAnanNvbl9vYmplY3QnO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAqIGFuZCBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gKlxuICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gKlxuICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICovXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiA9ICdub25lJyB8ICdhdXRvJyB8IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuXG4vKipcbiAqIFNwZWNpZmllcyBhIHRvb2wgdGhlIG1vZGVsIHNob3VsZCB1c2UuIFVzZSB0byBmb3JjZSB0aGUgbW9kZWwgdG8gY2FsbCBhIHNwZWNpZmljXG4gKiB0b29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFRvb2xDaG9pY2Uge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIElmIHR5cGUgaXMgYGZ1bmN0aW9uYCwgdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzZXRcbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbicgfCAnY29kZV9pbnRlcnByZXRlcicgfCAnZmlsZV9zZWFyY2gnO1xuXG4gIGZ1bmN0aW9uPzogQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gKiBjYWxsIHRoYXQgdG9vbC5cbiAqL1xuZXhwb3J0IHR5cGUgQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiA9ICdub25lJyB8ICdhdXRvJyB8ICdyZXF1aXJlZCcgfCBBc3Npc3RhbnRUb29sQ2hvaWNlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0aHJlYWQgdGhhdCBjb250YWluc1xuICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB0aHJlYWQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZGAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQnO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzOiBUaHJlYWQuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkRGVsZXRlZCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgZGVsZXRlZDogYm9vbGVhbjtcblxuICBvYmplY3Q6ICd0aHJlYWQuZGVsZXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAqIHN0YXJ0IHRoZSB0aHJlYWQgd2l0aC5cbiAgICovXG4gIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkQ3JlYXRlUGFyYW1zLk1lc3NhZ2U+O1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yXG4gICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkVXBkYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPVxuICB8IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZ1xuICB8IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNG8nXG4gICAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHRocmVhZD86IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc3lzdGVtIG1lc3NhZ2Ugb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTRvJ1xuICAgIHwgJ2dwdC00by0yMDI0LTA1LTEzJ1xuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTRvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTRvKSxcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtdHVyYm8tYW5kLWdwdC00KSxcbiAgICogYW5kIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgdGhyZWFkPzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8XG4gICAgQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbCB8IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sXG4gID4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGV4dCBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nIHwgQXJyYXk8TWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW0+O1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNG8nXG4gICAgfCAnZ3B0LTRvLTIwMjQtMDUtMTMnXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNG9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNG8pLFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC10dXJiby1hbmQtZ3B0LTQpLFxuICAgKiBhbmQgYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICB0aHJlYWQ/OiBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMuVGhyZWFkO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICB0b29sX3Jlc291cmNlcz86IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcy5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8XG4gICAgQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbCB8IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sXG4gID4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKSB0b1xuICAgICAqIHN0YXJ0IHRoZSB0aHJlYWQgd2l0aC5cbiAgICAgKi9cbiAgICBtZXNzYWdlcz86IEFycmF5PFRocmVhZC5NZXNzYWdlPjtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWQuVG9vbFJlc291cmNlcyB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRocmVhZCB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRleHQgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50UGFydFBhcmFtPjtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICAgKlxuICAgICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICAgKi9cbiAgICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgICAqL1xuICAgICAgYXR0YWNobWVudHM/OiBBcnJheTxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgKi9cbiAgICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgICAqL1xuICAgICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGFcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yXG4gICAgICAgICAqIHN0b3JlIGF0dGFjaGVkIHRvIHRoZSB0aHJlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRvXG4gICAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICAgKiBzdG9yZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdmVjdG9yIHN0b3JlLiBUaGlzIGNhbiBiZVxuICAgICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAgICogZm9ybWF0LiBLZXlzIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtXG4gICAgICAgICAgICogb2YgNTEyIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBtZXRhZGF0YT86IHVua25vd247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZHMge1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0ID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZSA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZCA9IFRocmVhZHNBUEkuVGhyZWFkO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZERlbGV0ZWQgPSBUaHJlYWRzQVBJLlRocmVhZERlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkVXBkYXRlUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5zID0gUnVuc0FQSS5SdW5zO1xuICBleHBvcnQgaW1wb3J0IFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCA9IFJ1bnNBUEkuUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFJ1biA9IFJ1bnNBUEkuUnVuO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0YXR1cyA9IFJ1bnNBUEkuUnVuU3RhdHVzO1xuICBleHBvcnQgaW1wb3J0IFJ1bnNQYWdlID0gUnVuc0FQSS5SdW5zUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5VcGRhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1blVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5MaXN0UGFyYW1zID0gUnVuc0FQSS5SdW5MaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5TdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VzID0gTWVzc2FnZXNBUEkuTWVzc2FnZXM7XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbkRlbHRhID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbkRlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlQ2l0YXRpb25Bbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aEFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aEFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVBhdGhEZWx0YUFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aERlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGUgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlQ29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlQ29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZURlbHRhID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZURlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VVUkwgPSBNZXNzYWdlc0FQSS5JbWFnZVVSTDtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZVVSTENvbnRlbnRCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMQ29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IEltYWdlVVJMRGVsdGEgPSBNZXNzYWdlc0FQSS5JbWFnZVVSTERlbHRhO1xuICBleHBvcnQgaW1wb3J0IEltYWdlVVJMRGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlVVJMRGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50RGVsdGEgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50UGFydFBhcmFtID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnRQYXJ0UGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZURlbGV0ZWQgPSBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsdGEgPSBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZURlbHRhRXZlbnQgPSBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGFFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBUZXh0ID0gTWVzc2FnZXNBUEkuVGV4dDtcbiAgZXhwb3J0IGltcG9ydCBUZXh0Q29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuVGV4dENvbnRlbnRCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBUZXh0Q29udGVudEJsb2NrUGFyYW0gPSBNZXNzYWdlc0FQSS5UZXh0Q29udGVudEJsb2NrUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgVGV4dERlbHRhID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZXNQYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VVcGRhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VMaXN0UGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUxpc3RQYXJhbXM7XG59XG4iLCAiLyoqXG4gKiBMaWtlIGBQcm9taXNlLmFsbFNldHRsZWQoKWAgYnV0IHRocm93cyBhbiBlcnJvciBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICovXG5leHBvcnQgY29uc3QgYWxsU2V0dGxlZFdpdGhUaHJvdyA9IGFzeW5jIDxSPihwcm9taXNlczogUHJvbWlzZTxSPltdKTogUHJvbWlzZTxSW10+ID0+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gIGNvbnN0IHJlamVjdGVkID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCk6IHJlc3VsdCBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJyk7XG4gIGlmIChyZWplY3RlZC5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZWplY3RlZCkge1xuICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQucmVhc29uKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVqZWN0ZWQubGVuZ3RofSBwcm9taXNlKHMpIGZhaWxlZCAtIHNlZSB0aGUgYWJvdmUgZXJyb3JzYCk7XG4gIH1cblxuICAvLyBOb3RlOiBUUyB3YXMgY29tcGxhaW5pbmcgYWJvdXQgdXNpbmcgYC5maWx0ZXIoKS5tYXAoKWAgaGVyZSBmb3Igc29tZSByZWFzb25cbiAgY29uc3QgdmFsdWVzOiBSW10gPSBbXTtcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgdmFsdWVzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn07XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgc2xlZXAsIFVwbG9hZGFibGUgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGaWxlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBmaWxlIGJ5IGF0dGFjaGluZyBhXG4gICAqIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSB0byBhXG4gICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVzYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHZlY3RvciBzdG9yZSBmaWxlLlxuICAgKi9cbiAgcmV0cmlldmUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXMvJHtmaWxlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIGZpbGVzLlxuICAgKi9cbiAgbGlzdChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBGaWxlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIFZlY3RvclN0b3JlRmlsZT47XG4gIGxpc3QoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBGaWxlTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgVmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHZlY3RvclN0b3JlSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlc2AsIFZlY3RvclN0b3JlRmlsZXNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHZlY3RvciBzdG9yZSBmaWxlLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHZlY3RvciBzdG9yZSBidXRcbiAgICogdGhlIGZpbGUgaXRzZWxmIHdpbGwgbm90IGJlIGRlbGV0ZWQuIFRvIGRlbGV0ZSB0aGUgZmlsZSwgdXNlIHRoZVxuICAgKiBbZGVsZXRlIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvZGVsZXRlKVxuICAgKiBlbmRwb2ludC5cbiAgICovXG4gIGRlbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXMvJHtmaWxlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgZmlsZSB0byB0aGUgZ2l2ZW4gdmVjdG9yIHN0b3JlIGFuZCB3YWl0IGZvciBpdCB0byBiZSBwcm9jZXNzZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbmRQb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCBib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGZpbGUuaWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZSB0byBmaW5pc2ggcHJvY2Vzc2luZy5cbiAgICpcbiAgICogTm90ZTogdGhpcyB3aWxsIHJldHVybiBldmVuIGlmIHRoZSBmaWxlIGZhaWxlZCB0byBwcm9jZXNzLCB5b3UgbmVlZCB0byBjaGVja1xuICAgKiBmaWxlLmxhc3RfZXJyb3IgYW5kIGZpbGUuc3RhdHVzIHRvIGhhbmRsZSB0aGVzZSBjYXNlc1xuICAgKi9cbiAgYXN5bmMgcG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLVBvbGwtSGVscGVyJzogJ3RydWUnIH07XG4gICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICBoZWFkZXJzWydYLVN0YWlubGVzcy1DdXN0b20tUG9sbC1JbnRlcnZhbCddID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcy50b1N0cmluZygpO1xuICAgIH1cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZmlsZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXRyaWV2ZSh2ZWN0b3JTdG9yZUlkLCBmaWxlSWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBjb25zdCBmaWxlID0gZmlsZVJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIHN3aXRjaCAoZmlsZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSAnaW5fcHJvZ3Jlc3MnOlxuICAgICAgICAgIGxldCBzbGVlcEludGVydmFsID0gNTAwMDtcblxuICAgICAgICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IG9wdGlvbnMucG9sbEludGVydmFsTXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsID0gZmlsZVJlc3BvbnNlLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZSB0byB0aGUgYGZpbGVzYCBBUEkgYW5kIHRoZW4gYXR0YWNoIGl0IHRvIHRoZSBnaXZlbiB2ZWN0b3Igc3RvcmUuXG4gICAqXG4gICAqIE5vdGUgdGhlIGZpbGUgd2lsbCBiZSBhc3luY2hyb25vdXNseSBwcm9jZXNzZWQgKHlvdSBjYW4gdXNlIHRoZSBhbHRlcm5hdGl2ZVxuICAgKiBwb2xsaW5nIGhlbHBlciBtZXRob2QgdG8gd2FpdCBmb3IgcHJvY2Vzc2luZyB0byBjb21wbGV0ZSkuXG4gICAqL1xuICBhc3luYyB1cGxvYWQoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGU6IFVwbG9hZGFibGUsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLl9jbGllbnQuZmlsZXMuY3JlYXRlKHsgZmlsZTogZmlsZSwgcHVycG9zZTogJ2Fzc2lzdGFudHMnIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCB7IGZpbGVfaWQ6IGZpbGVJbmZvLmlkIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZpbGUgdG8gYSB2ZWN0b3Igc3RvcmUgYW5kIHBvbGwgdW50aWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHVwbG9hZEFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGU6IFVwbG9hZGFibGUsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLnVwbG9hZCh2ZWN0b3JTdG9yZUlkLCBmaWxlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGZpbGVJbmZvLmlkLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFZlY3RvclN0b3JlRmlsZT4ge31cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgdmVjdG9yIHN0b3JlIGZpbGUgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZlY3RvciBzdG9yZSBmaWxlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZVxuICAgKiBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgbGFzdF9lcnJvcjogVmVjdG9yU3RvcmVGaWxlLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB2ZWN0b3Jfc3RvcmUuZmlsZWAuXG4gICAqL1xuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZmlsZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSBmaWxlLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBpbl9wcm9ncmVzc2AsXG4gICAqIGBjb21wbGV0ZWRgLCBgY2FuY2VsbGVkYCwgb3IgYGZhaWxlZGAuIFRoZSBzdGF0dXMgYGNvbXBsZXRlZGAgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIHZlY3RvciBzdG9yZSBmaWxlIGlzIHJlYWR5IGZvciB1c2UuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCB2ZWN0b3Igc3RvcmUgdXNhZ2UgaW4gYnl0ZXMuIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICogb3JpZ2luYWwgZmlsZSBzaXplLlxuICAgKi9cbiAgdXNhZ2VfYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgKiB0aGF0IHRoZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgaXNcbiAgICogYXR0YWNoZWQgdG8uXG4gICAqL1xuICB2ZWN0b3Jfc3RvcmVfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZUZpbGUge1xuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmVjdG9yIHN0b3JlIGZpbGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlXG4gICAqIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgIG9yIGByYXRlX2xpbWl0X2V4Y2VlZGVkYC5cbiAgICAgKi9cbiAgICBjb2RlOiAnaW50ZXJuYWxfZXJyb3InIHwgJ2ZpbGVfbm90X2ZvdW5kJyB8ICdwYXJzaW5nX2Vycm9yJyB8ICd1bmhhbmRsZWRfbWltZV90eXBlJztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlRmlsZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlLmZpbGUuZGVsZXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCB0aGF0IHRoZVxuICAgKiB2ZWN0b3Igc3RvcmUgc2hvdWxkIHVzZS4gVXNlZnVsIGZvciB0b29scyBsaWtlIGBmaWxlX3NlYXJjaGAgdGhhdCBjYW4gYWNjZXNzXG4gICAqIGZpbGVzLlxuICAgKi9cbiAgZmlsZV9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBmaWxlIHN0YXR1cy4gT25lIG9mIGBpbl9wcm9ncmVzc2AsIGBjb21wbGV0ZWRgLCBgZmFpbGVkYCwgYGNhbmNlbGxlZGAuXG4gICAqL1xuICBmaWx0ZXI/OiAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVzIHtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGUgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlRGVsZXRlZCA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ3JlYXRlUGFyYW1zID0gRmlsZXNBUEkuRmlsZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlTGlzdFBhcmFtcyA9IEZpbGVzQVBJLkZpbGVMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBVcGxvYWRhYmxlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBhbGxTZXR0bGVkV2l0aFRocm93IH0gZnJvbSAnLi4vLi4vLi4vbGliL1V0aWwnO1xuaW1wb3J0ICogYXMgRmlsZUJhdGNoZXNBUEkgZnJvbSAnLi9maWxlLWJhdGNoZXMnO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQgeyBWZWN0b3JTdG9yZUZpbGVzUGFnZSB9IGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHsgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGaWxlQmF0Y2hlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlX2JhdGNoZXNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqL1xuICByZXRyaWV2ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlX2JhdGNoZXMvJHtiYXRjaElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLiBUaGlzIGF0dGVtcHRzIHRvIGNhbmNlbCB0aGUgcHJvY2Vzc2luZyBvZlxuICAgKiBmaWxlcyBpbiB0aGlzIGJhdGNoIGFzIHNvb24gYXMgcG9zc2libGUuXG4gICAqL1xuICBjYW5jZWwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9L2NhbmNlbGAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBiYXRjaCBhbmQgcG9sbCB1bnRpbCBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGNvbnN0IGJhdGNoID0gYXdhaXQgdGhpcy5jcmVhdGUodmVjdG9yU3RvcmVJZCwgYm9keSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh2ZWN0b3JTdG9yZUlkLCBiYXRjaC5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIGZpbGVzIGluIGEgYmF0Y2guXG4gICAqL1xuICBsaXN0RmlsZXMoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdEZpbGVzKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZT47XG4gIGxpc3RGaWxlcyhcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdEZpbGVzKHZlY3RvclN0b3JlSWQsIGJhdGNoSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChcbiAgICAgIGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9L2ZpbGVzYCxcbiAgICAgIFZlY3RvclN0b3JlRmlsZXNQYWdlLFxuICAgICAgeyBxdWVyeSwgLi4ub3B0aW9ucywgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGdpdmVuIGZpbGUgYmF0Y2ggdG8gYmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHdpbGwgcmV0dXJuIGV2ZW4gaWYgb25lIG9mIHRoZSBmaWxlcyBmYWlsZWQgdG8gcHJvY2VzcywgeW91IG5lZWQgdG9cbiAgICogY2hlY2sgYmF0Y2guZmlsZV9jb3VudHMuZmFpbGVkX2NvdW50IHRvIGhhbmRsZSB0aGlzIGNhc2UuXG4gICAqL1xuICBhc3luYyBwb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtUG9sbC1IZWxwZXInOiAndHJ1ZScgfTtcbiAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgIGhlYWRlcnNbJ1gtU3RhaW5sZXNzLUN1c3RvbS1Qb2xsLUludGVydmFsJ10gPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZGF0YTogYmF0Y2gsIHJlc3BvbnNlIH0gPSBhd2FpdCB0aGlzLnJldHJpZXZlKHZlY3RvclN0b3JlSWQsIGJhdGNoSWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBzd2l0Y2ggKGJhdGNoLnN0YXR1cykge1xuICAgICAgICBjYXNlICdpbl9wcm9ncmVzcyc6XG4gICAgICAgICAgbGV0IHNsZWVwSW50ZXJ2YWwgPSA1MDAwO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICAgICAgICBzbGVlcEludGVydmFsID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWwgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnb3BlbmFpLXBvbGwtYWZ0ZXItbXMnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJJbnRlcnZhbCkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbE1zID0gcGFyc2VJbnQoaGVhZGVySW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlckludGVydmFsTXMpKSB7XG4gICAgICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IGhlYWRlckludGVydmFsTXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBJbnRlcnZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIGNhc2UgJ2NhbmNlbGxlZCc6XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgICAgcmV0dXJuIGJhdGNoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIHRoZSBnaXZlbiBmaWxlcyBjb25jdXJyZW50bHkgYW5kIHRoZW4gY3JlYXRlcyBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLlxuICAgKlxuICAgKiBUaGUgY29uY3VycmVuY3kgbGltaXQgaXMgY29uZmlndXJhYmxlIHVzaW5nIHRoZSBgbWF4Q29uY3VycmVuY3lgIHBhcmFtZXRlci5cbiAgICovXG4gIGFzeW5jIHVwbG9hZEFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIHsgZmlsZXMsIGZpbGVJZHMgPSBbXSB9OiB7IGZpbGVzOiBVcGxvYWRhYmxlW107IGZpbGVJZHM/OiBzdHJpbmdbXSB9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjsgbWF4Q29uY3VycmVuY3k/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGlmIChmaWxlcyA9PT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmaWxlcyBwcm92aWRlZCB0byBwcm9jZXNzLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ3VyZWRDb25jdXJyZW5jeSA9IG9wdGlvbnM/Lm1heENvbmN1cnJlbmN5ID8/IDU7XG4gICAgLy9XZSBjYXAgdGhlIG51bWJlciBvZiB3b3JrZXJzIGF0IHRoZSBudW1iZXIgb2YgZmlsZXMgKHNvIHdlIGRvbid0IHN0YXJ0IGFueSB1bm5lY2Vzc2FyeSB3b3JrZXJzKVxuICAgIGNvbnN0IGNvbmN1cnJlbmN5TGltaXQgPSBNYXRoLm1pbihjb25maWd1cmVkQ29uY3VycmVuY3ksIGZpbGVzLmxlbmd0aCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgZmlsZUl0ZXJhdG9yID0gZmlsZXMudmFsdWVzKCk7XG4gICAgY29uc3QgYWxsRmlsZUlkczogc3RyaW5nW10gPSBbLi4uZmlsZUlkc107XG5cbiAgICAvL1RoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGlzIGRlc2lnbi4gVGhlIGxpYnJhcmllcyBkb24ndCBhY2NvbW1vZGF0ZSBvdXIgZW52aXJvbm1lbnQgbGltaXRzLlxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNjM5NDMyL3doYXQtaXMtdGhlLWJlc3Qtd2F5LXRvLWxpbWl0LWNvbmN1cnJlbmN5LXdoZW4tdXNpbmctZXM2cy1wcm9taXNlLWFsbFxuICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGaWxlcyhpdGVyYXRvcjogSXRlcmFibGVJdGVyYXRvcjxVcGxvYWRhYmxlPikge1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiBpdGVyYXRvcikge1xuICAgICAgICBjb25zdCBmaWxlT2JqID0gYXdhaXQgY2xpZW50LmZpbGVzLmNyZWF0ZSh7IGZpbGU6IGl0ZW0sIHB1cnBvc2U6ICdhc3Npc3RhbnRzJyB9LCBvcHRpb25zKTtcbiAgICAgICAgYWxsRmlsZUlkcy5wdXNoKGZpbGVPYmouaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vU3RhcnQgd29ya2VycyB0byBwcm9jZXNzIHJlc3VsdHNcbiAgICBjb25zdCB3b3JrZXJzID0gQXJyYXkoY29uY3VycmVuY3lMaW1pdCkuZmlsbChmaWxlSXRlcmF0b3IpLm1hcChwcm9jZXNzRmlsZXMpO1xuXG4gICAgLy9XYWl0IGZvciBhbGwgcHJvY2Vzc2luZyB0byBjb21wbGV0ZS5cbiAgICBhd2FpdCBhbGxTZXR0bGVkV2l0aFRocm93KHdvcmtlcnMpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQW5kUG9sbCh2ZWN0b3JTdG9yZUlkLCB7XG4gICAgICBmaWxlX2lkczogYWxsRmlsZUlkcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmF0Y2ggb2YgZmlsZXMgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVGaWxlQmF0Y2gge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZXMgYmF0Y2ggd2FzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgZmlsZV9jb3VudHM6IFZlY3RvclN0b3JlRmlsZUJhdGNoLkZpbGVDb3VudHM7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB2ZWN0b3Jfc3RvcmUuZmlsZV9iYXRjaGAuXG4gICAqL1xuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZmlsZXNfYmF0Y2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZXMgYmF0Y2gsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYGluX3Byb2dyZXNzYCxcbiAgICogYGNvbXBsZXRlZGAsIGBjYW5jZWxsZWRgIG9yIGBmYWlsZWRgLlxuICAgKi9cbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnY2FuY2VsbGVkJyB8ICdmYWlsZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAqIHRoYXQgdGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBpc1xuICAgKiBhdHRhY2hlZCB0by5cbiAgICovXG4gIHZlY3Rvcl9zdG9yZV9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlRmlsZUJhdGNoIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2hlcmUgY2FuY2VsbGVkLlxuICAgICAqL1xuICAgIGNhbmNlbGxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBmYWlsZWQgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBmYWlsZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBpbl9wcm9ncmVzczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcy5cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUJhdGNoQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRoYXRcbiAgICogdGhlIHZlY3RvciBzdG9yZSBzaG91bGQgdXNlLiBVc2VmdWwgZm9yIHRvb2xzIGxpa2UgYGZpbGVfc2VhcmNoYCB0aGF0IGNhbiBhY2Nlc3NcbiAgICogZmlsZXMuXG4gICAqL1xuICBmaWxlX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGZpbGUgc3RhdHVzLiBPbmUgb2YgYGluX3Byb2dyZXNzYCwgYGNvbXBsZXRlZGAsIGBmYWlsZWRgLCBgY2FuY2VsbGVkYC5cbiAgICovXG4gIGZpbHRlcj86ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUJhdGNoZXMge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZUJhdGNoID0gRmlsZUJhdGNoZXNBUEkuVmVjdG9yU3RvcmVGaWxlQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoQ3JlYXRlUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcztcbn1cblxuZXhwb3J0IHsgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgfTtcbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgKiBhcyBWZWN0b3JTdG9yZXNBUEkgZnJvbSAnLi92ZWN0b3Itc3RvcmVzJztcbmltcG9ydCAqIGFzIEZpbGVCYXRjaGVzQVBJIGZyb20gJy4vZmlsZS1iYXRjaGVzJztcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBWZWN0b3JTdG9yZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIGZpbGVzOiBGaWxlc0FQSS5GaWxlcyA9IG5ldyBGaWxlc0FQSS5GaWxlcyh0aGlzLl9jbGllbnQpO1xuICBmaWxlQmF0Y2hlczogRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoZXMgPSBuZXcgRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoZXModGhpcy5fY2xpZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL3ZlY3Rvcl9zdG9yZXMnLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgcmV0cmlldmUodmVjdG9yU3RvcmVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICB1cGRhdGUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IFZlY3RvclN0b3JlVXBkYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3Jlcy5cbiAgICovXG4gIGxpc3QoXG4gICAgcXVlcnk/OiBWZWN0b3JTdG9yZUxpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVzUGFnZSwgVmVjdG9yU3RvcmU+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZXNQYWdlLCBWZWN0b3JTdG9yZT47XG4gIGxpc3QoXG4gICAgcXVlcnk6IFZlY3RvclN0b3JlTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZXNQYWdlLCBWZWN0b3JTdG9yZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy92ZWN0b3Jfc3RvcmVzJywgVmVjdG9yU3RvcmVzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBkZWwodmVjdG9yU3RvcmVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZURlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWZWN0b3JTdG9yZXNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxWZWN0b3JTdG9yZT4ge31cblxuLyoqXG4gKiBBIHZlY3RvciBzdG9yZSBpcyBhIGNvbGxlY3Rpb24gb2YgcHJvY2Vzc2VkIGZpbGVzIGNhbiBiZSB1c2VkIGJ5IHRoZVxuICogYGZpbGVfc2VhcmNoYCB0b29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgdmVjdG9yIHN0b3JlIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIGZpbGVfY291bnRzOiBWZWN0b3JTdG9yZS5GaWxlQ291bnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgd2FzIGxhc3QgYWN0aXZlLlxuICAgKi9cbiAgbGFzdF9hY3RpdmVfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHZlY3Rvcl9zdG9yZWAuXG4gICAqL1xuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUnO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB2ZWN0b3Igc3RvcmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYGV4cGlyZWRgLCBgaW5fcHJvZ3Jlc3NgLCBvclxuICAgKiBgY29tcGxldGVkYC4gQSBzdGF0dXMgb2YgYGNvbXBsZXRlZGAgaW5kaWNhdGVzIHRoYXQgdGhlIHZlY3RvciBzdG9yZSBpcyByZWFkeVxuICAgKiBmb3IgdXNlLlxuICAgKi9cbiAgc3RhdHVzOiAnZXhwaXJlZCcgfCAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgZmlsZXMgaW4gdGhlIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIHVzYWdlX2J5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBpcmVzX2FmdGVyPzogVmVjdG9yU3RvcmUuRXhwaXJlc0FmdGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgd2lsbCBleHBpcmUuXG4gICAqL1xuICBleHBpcmVzX2F0PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZUNvdW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IHdlcmUgY2FuY2VsbGVkLlxuICAgICAqL1xuICAgIGNhbmNlbGxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGNvbXBsZXRlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGhhdmUgZmFpbGVkIHRvIHByb2Nlc3MuXG4gICAgICovXG4gICAgZmFpbGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgaW5fcHJvZ3Jlc3M6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMuXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFeHBpcmVzQWZ0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuY2hvciB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGV4cGlyYXRpb24gcG9saWN5IGFwcGxpZXMuIFN1cHBvcnRlZCBhbmNob3JzOlxuICAgICAqIGBsYXN0X2FjdGl2ZV9hdGAuXG4gICAgICovXG4gICAgYW5jaG9yOiAnbGFzdF9hY3RpdmVfYXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIGFmdGVyIHRoZSBhbmNob3IgdGltZSB0aGF0IHRoZSB2ZWN0b3Igc3RvcmUgd2lsbCBleHBpcmUuXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZS5kZWxldGVkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwaXJlc19hZnRlcj86IFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zLkV4cGlyZXNBZnRlcjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdGhhdFxuICAgKiB0aGUgdmVjdG9yIHN0b3JlIHNob3VsZCB1c2UuIFVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBgZmlsZV9zZWFyY2hgIHRoYXQgY2FuIGFjY2Vzc1xuICAgKiBmaWxlcy5cbiAgICovXG4gIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXhwaXJlc0FmdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbmNob3IgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBleHBpcmF0aW9uIHBvbGljeSBhcHBsaWVzLiBTdXBwb3J0ZWQgYW5jaG9yczpcbiAgICAgKiBgbGFzdF9hY3RpdmVfYXRgLlxuICAgICAqL1xuICAgIGFuY2hvcjogJ2xhc3RfYWN0aXZlX2F0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBhZnRlciB0aGUgYW5jaG9yIHRpbWUgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGRheXM6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBpcmVzX2FmdGVyPzogVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMuRXhwaXJlc0FmdGVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEV4cGlyZXNBZnRlciB7XG4gICAgLyoqXG4gICAgICogQW5jaG9yIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgYXBwbGllcy4gU3VwcG9ydGVkIGFuY2hvcnM6XG4gICAgICogYGxhc3RfYWN0aXZlX2F0YC5cbiAgICAgKi9cbiAgICBhbmNob3I6ICdsYXN0X2FjdGl2ZV9hdCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgdGhlIGFuY2hvciB0aW1lIHRoYXQgdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICAgKi9cbiAgICBkYXlzOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUxpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZXMge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRGVsZXRlZCA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVzUGFnZSA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlVXBkYXRlUGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlTGlzdFBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZUxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZXMgPSBGaWxlc0FQSS5GaWxlcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGUgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlRGVsZXRlZCA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ3JlYXRlUGFyYW1zID0gRmlsZXNBUEkuRmlsZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlTGlzdFBhcmFtcyA9IEZpbGVzQVBJLkZpbGVMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaGVzID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoZXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlQmF0Y2ggPSBGaWxlQmF0Y2hlc0FQSS5WZWN0b3JTdG9yZUZpbGVCYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tICcuL2Fzc2lzdGFudHMnO1xuaW1wb3J0ICogYXMgQ2hhdEFQSSBmcm9tICcuL2NoYXQvY2hhdCc7XG5pbXBvcnQgKiBhcyBUaHJlYWRzQVBJIGZyb20gJy4vdGhyZWFkcy90aHJlYWRzJztcbmltcG9ydCAqIGFzIFZlY3RvclN0b3Jlc0FQSSBmcm9tICcuL3ZlY3Rvci1zdG9yZXMvdmVjdG9yLXN0b3Jlcyc7XG5cbmV4cG9ydCBjbGFzcyBCZXRhIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICB2ZWN0b3JTdG9yZXM6IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZXMgPSBuZXcgVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlcyh0aGlzLl9jbGllbnQpO1xuICBjaGF0OiBDaGF0QVBJLkNoYXQgPSBuZXcgQ2hhdEFQSS5DaGF0KHRoaXMuX2NsaWVudCk7XG4gIGFzc2lzdGFudHM6IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cyA9IG5ldyBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHModGhpcy5fY2xpZW50KTtcbiAgdGhyZWFkczogVGhyZWFkc0FQSS5UaHJlYWRzID0gbmV3IFRocmVhZHNBUEkuVGhyZWFkcyh0aGlzLl9jbGllbnQpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEJldGEge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmUgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVEZWxldGVkID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZXNQYWdlID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVMaXN0UGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGF0ID0gQ2hhdEFQSS5DaGF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudHMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50RGVsZXRlZCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50RGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sID0gQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sID0gQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2wgPSBBc3Npc3RhbnRzQVBJLkZ1bmN0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLk1lc3NhZ2VTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlJ1blN0ZXBTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlRocmVhZFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudHNQYWdlID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRDcmVhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRVcGRhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRMaXN0UGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZHMgPSBUaHJlYWRzQVBJLlRocmVhZHM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkID0gVGhyZWFkc0FQSS5UaHJlYWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkRGVsZXRlZCA9IFRocmVhZHNBUEkuVGhyZWFkRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRVcGRhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElQcm9taXNlIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gJy4vY29tcGxldGlvbnMnO1xuaW1wb3J0ICogYXMgQ2hhdENvbXBsZXRpb25zQVBJIGZyb20gJy4vY2hhdC9jb21wbGV0aW9ucyc7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tICcuLi9zdHJlYW1pbmcnO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcGxldGlvbiBmb3IgdGhlIHByb3ZpZGVkIHByb21wdCBhbmQgcGFyYW1ldGVycy5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IEFQSVByb21pc2U8Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q29tcGxldGlvbj4gfCBDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8Q29tcGxldGlvbj4gfCBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2NvbXBsZXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zLCBzdHJlYW06IGJvZHkuc3RyZWFtID8/IGZhbHNlIH0pIGFzXG4gICAgICB8IEFQSVByb21pc2U8Q29tcGxldGlvbj5cbiAgICAgIHwgQVBJUHJvbWlzZTxTdHJlYW08Q29tcGxldGlvbj4+O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbXBsZXRpb24gcmVzcG9uc2UgZnJvbSB0aGUgQVBJLiBOb3RlOiBib3RoIHRoZSBzdHJlYW1lZCBhbmRcbiAqIG5vbi1zdHJlYW1lZCByZXNwb25zZSBvYmplY3RzIHNoYXJlIHRoZSBzYW1lIHNoYXBlICh1bmxpa2UgdGhlIGNoYXQgZW5kcG9pbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb24ge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBsZXRpb24uXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBjb21wbGV0aW9uIGNob2ljZXMgdGhlIG1vZGVsIGdlbmVyYXRlZCBmb3IgdGhlIGlucHV0IHByb21wdC5cbiAgICovXG4gIGNob2ljZXM6IEFycmF5PENvbXBsZXRpb25DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNvbXBsZXRpb24gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB1c2VkIGZvciBjb21wbGV0aW9uLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJ0ZXh0X2NvbXBsZXRpb25cIlxuICAgKi9cbiAgb2JqZWN0OiAndGV4dF9jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DaG9pY2Uge1xuICAvKipcbiAgICogVGhlIHJlYXNvbiB0aGUgbW9kZWwgc3RvcHBlZCBnZW5lcmF0aW5nIHRva2Vucy4gVGhpcyB3aWxsIGJlIGBzdG9wYCBpZiB0aGUgbW9kZWxcbiAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIG9yIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICogY29udGVudCB3YXMgb21pdHRlZCBkdWUgdG8gYSBmbGFnIGZyb20gb3VyIGNvbnRlbnQgZmlsdGVycy5cbiAgICovXG4gIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ2NvbnRlbnRfZmlsdGVyJztcblxuICBpbmRleDogbnVtYmVyO1xuXG4gIGxvZ3Byb2JzOiBDb21wbGV0aW9uQ2hvaWNlLkxvZ3Byb2JzIHwgbnVsbDtcblxuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29tcGxldGlvbkNob2ljZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTG9ncHJvYnMge1xuICAgIHRleHRfb2Zmc2V0PzogQXJyYXk8bnVtYmVyPjtcblxuICAgIHRva2VuX2xvZ3Byb2JzPzogQXJyYXk8bnVtYmVyPjtcblxuICAgIHRva2Vucz86IEFycmF5PHN0cmluZz47XG5cbiAgICB0b3BfbG9ncHJvYnM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgfVxufVxuXG4vKipcbiAqIFVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvblVzYWdlIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiB0b2tlbnMgaW4gdGhlIGdlbmVyYXRlZCBjb21wbGV0aW9uLlxuICAgKi9cbiAgY29tcGxldGlvbl90b2tlbnM6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRva2VucyBpbiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgdG9rZW5zIHVzZWQgaW4gdGhlIHJlcXVlc3QgKHByb21wdCArIGNvbXBsZXRpb24pLlxuICAgKi9cbiAgdG90YWxfdG9rZW5zOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIHwgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ2dwdC0zLjUtdHVyYm8taW5zdHJ1Y3QnIHwgJ2RhdmluY2ktMDAyJyB8ICdiYWJiYWdlLTAwMic7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9tcHQocykgdG8gZ2VuZXJhdGUgY29tcGxldGlvbnMgZm9yLCBlbmNvZGVkIGFzIGEgc3RyaW5nLCBhcnJheSBvZlxuICAgKiBzdHJpbmdzLCBhcnJheSBvZiB0b2tlbnMsIG9yIGFycmF5IG9mIHRva2VuIGFycmF5cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IDx8ZW5kb2Z0ZXh0fD4gaXMgdGhlIGRvY3VtZW50IHNlcGFyYXRvciB0aGF0IHRoZSBtb2RlbCBzZWVzIGR1cmluZ1xuICAgKiB0cmFpbmluZywgc28gaWYgYSBwcm9tcHQgaXMgbm90IHNwZWNpZmllZCB0aGUgbW9kZWwgd2lsbCBnZW5lcmF0ZSBhcyBpZiBmcm9tIHRoZVxuICAgKiBiZWdpbm5pbmcgb2YgYSBuZXcgZG9jdW1lbnQuXG4gICAqL1xuICBwcm9tcHQ6IHN0cmluZyB8IEFycmF5PHN0cmluZz4gfCBBcnJheTxudW1iZXI+IHwgQXJyYXk8QXJyYXk8bnVtYmVyPj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYGJlc3Rfb2ZgIGNvbXBsZXRpb25zIHNlcnZlci1zaWRlIGFuZCByZXR1cm5zIHRoZSBcImJlc3RcIiAodGhlIG9uZSB3aXRoXG4gICAqIHRoZSBoaWdoZXN0IGxvZyBwcm9iYWJpbGl0eSBwZXIgdG9rZW4pLiBSZXN1bHRzIGNhbm5vdCBiZSBzdHJlYW1lZC5cbiAgICpcbiAgICogV2hlbiB1c2VkIHdpdGggYG5gLCBgYmVzdF9vZmAgY29udHJvbHMgdGhlIG51bWJlciBvZiBjYW5kaWRhdGUgY29tcGxldGlvbnMgYW5kXG4gICAqIGBuYCBzcGVjaWZpZXMgaG93IG1hbnkgdG8gcmV0dXJuIFx1MjAxMyBgYmVzdF9vZmAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYG5gLlxuICAgKlxuICAgKiAqKk5vdGU6KiogQmVjYXVzZSB0aGlzIHBhcmFtZXRlciBnZW5lcmF0ZXMgbWFueSBjb21wbGV0aW9ucywgaXQgY2FuIHF1aWNrbHlcbiAgICogY29uc3VtZSB5b3VyIHRva2VuIHF1b3RhLiBVc2UgY2FyZWZ1bGx5IGFuZCBlbnN1cmUgdGhhdCB5b3UgaGF2ZSByZWFzb25hYmxlXG4gICAqIHNldHRpbmdzIGZvciBgbWF4X3Rva2Vuc2AgYW5kIGBzdG9wYC5cbiAgICovXG4gIGJlc3Rfb2Y/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBFY2hvIGJhY2sgdGhlIHByb21wdCBpbiBhZGRpdGlvbiB0byB0aGUgY29tcGxldGlvblxuICAgKi9cbiAgZWNobz86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAtMi4wIGFuZCAyLjAuIFBvc2l0aXZlIHZhbHVlcyBwZW5hbGl6ZSBuZXcgdG9rZW5zIGJhc2VkIG9uIHRoZWlyXG4gICAqIGV4aXN0aW5nIGZyZXF1ZW5jeSBpbiB0aGUgdGV4dCBzbyBmYXIsIGRlY3JlYXNpbmcgdGhlIG1vZGVsJ3MgbGlrZWxpaG9vZCB0b1xuICAgKiByZXBlYXQgdGhlIHNhbWUgbGluZSB2ZXJiYXRpbS5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIGZyZXF1ZW5jeV9wZW5hbHR5PzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgdGhhdCBtYXBzIHRva2VucyAoc3BlY2lmaWVkIGJ5IHRoZWlyIHRva2VuIElEIGluIHRoZSBHUFRcbiAgICogdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC4gWW91IGNhbiB1c2UgdGhpc1xuICAgKiBbdG9rZW5pemVyIHRvb2xdKC90b2tlbml6ZXI/dmlldz1icGUpIHRvIGNvbnZlcnQgdGV4dCB0byB0b2tlbiBJRHMuXG4gICAqIE1hdGhlbWF0aWNhbGx5LCB0aGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgbG9naXRzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgcHJpb3IgdG9cbiAgICogc2FtcGxpbmcuIFRoZSBleGFjdCBlZmZlY3Qgd2lsbCB2YXJ5IHBlciBtb2RlbCwgYnV0IHZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAxXG4gICAqIHNob3VsZCBkZWNyZWFzZSBvciBpbmNyZWFzZSBsaWtlbGlob29kIG9mIHNlbGVjdGlvbjsgdmFsdWVzIGxpa2UgLTEwMCBvciAxMDBcbiAgICogc2hvdWxkIHJlc3VsdCBpbiBhIGJhbiBvciBleGNsdXNpdmUgc2VsZWN0aW9uIG9mIHRoZSByZWxldmFudCB0b2tlbi5cbiAgICpcbiAgICogQXMgYW4gZXhhbXBsZSwgeW91IGNhbiBwYXNzIGB7XCI1MDI1NlwiOiAtMTAwfWAgdG8gcHJldmVudCB0aGUgPHxlbmRvZnRleHR8PiB0b2tlblxuICAgKiBmcm9tIGJlaW5nIGdlbmVyYXRlZC5cbiAgICovXG4gIGxvZ2l0X2JpYXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbDtcblxuICAvKipcbiAgICogSW5jbHVkZSB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb24gdGhlIGBsb2dwcm9ic2AgbW9zdCBsaWtlbHkgb3V0cHV0IHRva2VucywgYXNcbiAgICogd2VsbCB0aGUgY2hvc2VuIHRva2Vucy4gRm9yIGV4YW1wbGUsIGlmIGBsb2dwcm9ic2AgaXMgNSwgdGhlIEFQSSB3aWxsIHJldHVybiBhXG4gICAqIGxpc3Qgb2YgdGhlIDUgbW9zdCBsaWtlbHkgdG9rZW5zLiBUaGUgQVBJIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgYGxvZ3Byb2JgIG9mXG4gICAqIHRoZSBzYW1wbGVkIHRva2VuLCBzbyB0aGVyZSBtYXkgYmUgdXAgdG8gYGxvZ3Byb2JzKzFgIGVsZW1lbnRzIGluIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogVGhlIG1heGltdW0gdmFsdWUgZm9yIGBsb2dwcm9ic2AgaXMgNS5cbiAgICovXG4gIGxvZ3Byb2JzPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFt0b2tlbnNdKC90b2tlbml6ZXIpIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBpbiB0aGVcbiAgICogY29tcGxldGlvbi5cbiAgICpcbiAgICogVGhlIHRva2VuIGNvdW50IG9mIHlvdXIgcHJvbXB0IHBsdXMgYG1heF90b2tlbnNgIGNhbm5vdCBleGNlZWQgdGhlIG1vZGVsJ3NcbiAgICogY29udGV4dCBsZW5ndGguXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2NvdW50X3Rva2Vuc193aXRoX3Rpa3Rva2VuKVxuICAgKiBmb3IgY291bnRpbmcgdG9rZW5zLlxuICAgKi9cbiAgbWF4X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGNvbXBsZXRpb25zIHRvIGdlbmVyYXRlIGZvciBlYWNoIHByb21wdC5cbiAgICpcbiAgICogKipOb3RlOioqIEJlY2F1c2UgdGhpcyBwYXJhbWV0ZXIgZ2VuZXJhdGVzIG1hbnkgY29tcGxldGlvbnMsIGl0IGNhbiBxdWlja2x5XG4gICAqIGNvbnN1bWUgeW91ciB0b2tlbiBxdW90YS4gVXNlIGNhcmVmdWxseSBhbmQgZW5zdXJlIHRoYXQgeW91IGhhdmUgcmVhc29uYWJsZVxuICAgKiBzZXR0aW5ncyBmb3IgYG1heF90b2tlbnNgIGFuZCBgc3RvcGAuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvblxuICAgKiB3aGV0aGVyIHRoZXkgYXBwZWFyIGluIHRoZSB0ZXh0IHNvIGZhciwgaW5jcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHRhbGsgYWJvdXQgbmV3IHRvcGljcy5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIG91ciBzeXN0ZW0gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gc2FtcGxlIGRldGVybWluaXN0aWNhbGx5LFxuICAgKiBzdWNoIHRoYXQgcmVwZWF0ZWQgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBgc2VlZGAgYW5kIHBhcmFtZXRlcnMgc2hvdWxkIHJldHVyblxuICAgKiB0aGUgc2FtZSByZXN1bHQuXG4gICAqXG4gICAqIERldGVybWluaXNtIGlzIG5vdCBndWFyYW50ZWVkLCBhbmQgeW91IHNob3VsZCByZWZlciB0byB0aGUgYHN5c3RlbV9maW5nZXJwcmludGBcbiAgICogcmVzcG9uc2UgcGFyYW1ldGVyIHRvIG1vbml0b3IgY2hhbmdlcyBpbiB0aGUgYmFja2VuZC5cbiAgICovXG4gIHNlZWQ/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBVcCB0byA0IHNlcXVlbmNlcyB3aGVyZSB0aGUgQVBJIHdpbGwgc3RvcCBnZW5lcmF0aW5nIGZ1cnRoZXIgdG9rZW5zLiBUaGVcbiAgICogcmV0dXJuZWQgdGV4dCB3aWxsIG5vdCBjb250YWluIHRoZSBzdG9wIHNlcXVlbmNlLlxuICAgKi9cbiAgc3RvcD86IHN0cmluZyB8IG51bGwgfCBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0cmVhbSBiYWNrIHBhcnRpYWwgcHJvZ3Jlc3MuIElmIHNldCwgdG9rZW5zIHdpbGwgYmUgc2VudCBhc1xuICAgKiBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlLiBPbmx5IHNldCB0aGlzIHdoZW4geW91IHNldCBgc3RyZWFtOiB0cnVlYC5cbiAgICovXG4gIHN0cmVhbV9vcHRpb25zPzogQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWZmaXggdGhhdCBjb21lcyBhZnRlciBhIGNvbXBsZXRpb24gb2YgaW5zZXJ0ZWQgdGV4dC5cbiAgICpcbiAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGBncHQtMy41LXR1cmJvLWluc3RydWN0YC5cbiAgICovXG4gIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgYHRvcF9wYCBidXQgbm90IGJvdGguXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0ZW1wZXJhdHVyZWAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0cmVhbSBiYWNrIHBhcnRpYWwgcHJvZ3Jlc3MuIElmIHNldCwgdG9rZW5zIHdpbGwgYmUgc2VudCBhc1xuICAgKiBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyBleHRlbmRzIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbiA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNob2ljZSA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvblVzYWdlID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCAqIGFzIEVtYmVkZGluZ3NBUEkgZnJvbSAnLi9lbWJlZGRpbmdzJztcblxuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ3MgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtYmVkZGluZyB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBpbnB1dCB0ZXh0LlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IEVtYmVkZGluZ0NyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvZW1iZWRkaW5ncycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVtYmVkZGluZ3MgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICovXG4gIGRhdGE6IEFycmF5PEVtYmVkZGluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbWJlZGRpbmcuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcImxpc3RcIi5cbiAgICovXG4gIG9iamVjdDogJ2xpc3QnO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgdXNhZ2U6IENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlLlVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRva2VucyB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCBieSB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZW1iZWRkaW5nIHZlY3RvciByZXR1cm5lZCBieSBlbWJlZGRpbmcgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBlbWJlZGRpbmcgdmVjdG9yLCB3aGljaCBpcyBhIGxpc3Qgb2YgZmxvYXRzLiBUaGUgbGVuZ3RoIG9mIHZlY3RvciBkZXBlbmRzIG9uXG4gICAqIHRoZSBtb2RlbCBhcyBsaXN0ZWQgaW4gdGhlXG4gICAqIFtlbWJlZGRpbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9lbWJlZGRpbmdzKS5cbiAgICovXG4gIGVtYmVkZGluZzogQXJyYXk8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBlbWJlZGRpbmcgaW4gdGhlIGxpc3Qgb2YgZW1iZWRkaW5ncy5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwiZW1iZWRkaW5nXCIuXG4gICAqL1xuICBvYmplY3Q6ICdlbWJlZGRpbmcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0NyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbnB1dCB0ZXh0IHRvIGVtYmVkLCBlbmNvZGVkIGFzIGEgc3RyaW5nIG9yIGFycmF5IG9mIHRva2Vucy4gVG8gZW1iZWQgbXVsdGlwbGVcbiAgICogaW5wdXRzIGluIGEgc2luZ2xlIHJlcXVlc3QsIHBhc3MgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciBhcnJheSBvZiB0b2tlbiBhcnJheXMuXG4gICAqIFRoZSBpbnB1dCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heCBpbnB1dCB0b2tlbnMgZm9yIHRoZSBtb2RlbCAoODE5MiB0b2tlbnMgZm9yXG4gICAqIGB0ZXh0LWVtYmVkZGluZy1hZGEtMDAyYCksIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcsIGFuZCBhbnkgYXJyYXkgbXVzdCBiZSAyMDQ4XG4gICAqIGRpbWVuc2lvbnMgb3IgbGVzcy5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fY291bnRfdG9rZW5zX3dpdGhfdGlrdG9rZW4pXG4gICAqIGZvciBjb3VudGluZyB0b2tlbnMuXG4gICAqL1xuICBpbnB1dDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB8IEFycmF5PG51bWJlcj4gfCBBcnJheTxBcnJheTxudW1iZXI+PjtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gWW91IGNhbiB1c2UgdGhlXG4gICAqIFtMaXN0IG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMvbGlzdCkgQVBJIHRvXG4gICAqIHNlZSBhbGwgb2YgeW91ciBhdmFpbGFibGUgbW9kZWxzLCBvciBzZWUgb3VyXG4gICAqIFtNb2RlbCBvdmVydmlld10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL292ZXJ2aWV3KSBmb3JcbiAgICogZGVzY3JpcHRpb25zIG9mIHRoZW0uXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd0ZXh0LWVtYmVkZGluZy1hZGEtMDAyJyB8ICd0ZXh0LWVtYmVkZGluZy0zLXNtYWxsJyB8ICd0ZXh0LWVtYmVkZGluZy0zLWxhcmdlJztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHRoZSByZXN1bHRpbmcgb3V0cHV0IGVtYmVkZGluZ3Mgc2hvdWxkIGhhdmUuIE9ubHlcbiAgICogc3VwcG9ydGVkIGluIGB0ZXh0LWVtYmVkZGluZy0zYCBhbmQgbGF0ZXIgbW9kZWxzLlxuICAgKi9cbiAgZGltZW5zaW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byByZXR1cm4gdGhlIGVtYmVkZGluZ3MgaW4uIENhbiBiZSBlaXRoZXIgYGZsb2F0YCBvclxuICAgKiBbYGJhc2U2NGBdKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9weWJhc2U2NC8pLlxuICAgKi9cbiAgZW5jb2RpbmdfZm9ybWF0PzogJ2Zsb2F0JyB8ICdiYXNlNjQnO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBFbWJlZGRpbmdzIHtcbiAgZXhwb3J0IGltcG9ydCBDcmVhdGVFbWJlZGRpbmdSZXNwb25zZSA9IEVtYmVkZGluZ3NBUEkuQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nID0gRW1iZWRkaW5nc0FQSS5FbWJlZGRpbmc7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nQ3JlYXRlUGFyYW1zID0gRW1iZWRkaW5nc0FQSS5FbWJlZGRpbmdDcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgdHlwZSBSZXNwb25zZSB9IGZyb20gJy4uL19zaGltcy9pbmRleCc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciB9IGZyb20gJy4uL2Vycm9yJztcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IFBhZ2UgfSBmcm9tICcuLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEZpbGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFjcm9zcyB2YXJpb3VzIGVuZHBvaW50cy4gSW5kaXZpZHVhbCBmaWxlcyBjYW4gYmVcbiAgICogdXAgdG8gNTEyIE1CLCBhbmQgdGhlIHNpemUgb2YgYWxsIGZpbGVzIHVwbG9hZGVkIGJ5IG9uZSBvcmdhbml6YXRpb24gY2FuIGJlIHVwXG4gICAqIHRvIDEwMCBHQi5cbiAgICpcbiAgICogVGhlIEFzc2lzdGFudHMgQVBJIHN1cHBvcnRzIGZpbGVzIHVwIHRvIDIgbWlsbGlvbiB0b2tlbnMgYW5kIG9mIHNwZWNpZmljIGZpbGVcbiAgICogdHlwZXMuIFNlZSB0aGVcbiAgICogW0Fzc2lzdGFudHMgVG9vbHMgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvdG9vbHMpIGZvclxuICAgKiBkZXRhaWxzLlxuICAgKlxuICAgKiBUaGUgRmluZS10dW5pbmcgQVBJIG9ubHkgc3VwcG9ydHMgYC5qc29ubGAgZmlsZXMuXG4gICAqXG4gICAqIFRoZSBCYXRjaCBBUEkgb25seSBzdXBwb3J0cyBgLmpzb25sYCBmaWxlcyB1cCB0byAxMDAgTUIgaW4gc2l6ZS5cbiAgICpcbiAgICogUGxlYXNlIFtjb250YWN0IHVzXShodHRwczovL2hlbHAub3BlbmFpLmNvbS8pIGlmIHlvdSBuZWVkIHRvIGluY3JlYXNlIHRoZXNlXG4gICAqIHN0b3JhZ2UgbGltaXRzLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IEZpbGVDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9maWxlcycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBmaWxlLlxuICAgKi9cbiAgcmV0cmlldmUoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2ZpbGVzLyR7ZmlsZUlkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGZpbGVzIHRoYXQgYmVsb25nIHRvIHRoZSB1c2VyJ3Mgb3JnYW5pemF0aW9uLlxuICAgKi9cbiAgbGlzdChxdWVyeT86IEZpbGVMaXN0UGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PjtcbiAgbGlzdChcbiAgICBxdWVyeTogRmlsZUxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL2ZpbGVzJywgRmlsZU9iamVjdHNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGZpbGUuXG4gICAqL1xuICBkZWwoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC9maWxlcy8ke2ZpbGVJZH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuXG4gICAqL1xuICBjb250ZW50KGZpbGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmlsZXMvJHtmaWxlSWR9L2NvbnRlbnRgLCB7IC4uLm9wdGlvbnMsIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgYC5jb250ZW50KClgIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICByZXRyaWV2ZUNvbnRlbnQoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmlsZXMvJHtmaWxlSWR9L2NvbnRlbnRgLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZ2l2ZW4gZmlsZSB0byBiZSBwcm9jZXNzZWQsIGRlZmF1bHQgdGltZW91dCBpcyAzMCBtaW5zLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclByb2Nlc3NpbmcoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB7IHBvbGxJbnRlcnZhbCA9IDUwMDAsIG1heFdhaXQgPSAzMCAqIDYwICogMTAwMCB9OiB7IHBvbGxJbnRlcnZhbD86IG51bWJlcjsgbWF4V2FpdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8RmlsZU9iamVjdD4ge1xuICAgIGNvbnN0IFRFUk1JTkFMX1NUQVRFUyA9IG5ldyBTZXQoWydwcm9jZXNzZWQnLCAnZXJyb3InLCAnZGVsZXRlZCddKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZmlsZSA9IGF3YWl0IHRoaXMucmV0cmlldmUoaWQpO1xuXG4gICAgd2hpbGUgKCFmaWxlLnN0YXR1cyB8fCAhVEVSTUlOQUxfU1RBVEVTLmhhcyhmaWxlLnN0YXR1cykpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHBvbGxJbnRlcnZhbCk7XG5cbiAgICAgIGZpbGUgPSBhd2FpdCB0aGlzLnJldHJpZXZlKGlkKTtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiBtYXhXYWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yKHtcbiAgICAgICAgICBtZXNzYWdlOiBgR2l2aW5nIHVwIG9uIHdhaXRpbmcgZm9yIGZpbGUgJHtpZH0gdG8gZmluaXNoIHByb2Nlc3NpbmcgYWZ0ZXIgJHttYXhXYWl0fSBtaWxsaXNlY29uZHMuYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3RlOiBubyBwYWdpbmF0aW9uIGFjdHVhbGx5IG9jY3VycyB5ZXQsIHRoaXMgaXMgZm9yIGZvcndhcmRzLWNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlT2JqZWN0c1BhZ2UgZXh0ZW5kcyBQYWdlPEZpbGVPYmplY3Q+IHt9XG5cbmV4cG9ydCB0eXBlIEZpbGVDb250ZW50ID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ2ZpbGUnO1xufVxuXG4vKipcbiAqIFRoZSBgRmlsZWAgb2JqZWN0IHJlcHJlc2VudHMgYSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIHVwbG9hZGVkIHRvIE9wZW5BSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlT2JqZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGZpbGUsIGluIGJ5dGVzLlxuICAgKi9cbiAgYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmlsZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG4gICAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgZmlsZWAuXG4gICAqL1xuICBvYmplY3Q6ICdmaWxlJztcblxuICAvKipcbiAgICogVGhlIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIGZpbGUuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGBhc3Npc3RhbnRzYCxcbiAgICogYGFzc2lzdGFudHNfb3V0cHV0YCwgYGJhdGNoYCwgYGJhdGNoX291dHB1dGAsIGBmaW5lLXR1bmVgLCBgZmluZS10dW5lLXJlc3VsdHNgXG4gICAqIGFuZCBgdmlzaW9uYC5cbiAgICovXG4gIHB1cnBvc2U6XG4gICAgfCAnYXNzaXN0YW50cydcbiAgICB8ICdhc3Npc3RhbnRzX291dHB1dCdcbiAgICB8ICdiYXRjaCdcbiAgICB8ICdiYXRjaF9vdXRwdXQnXG4gICAgfCAnZmluZS10dW5lJ1xuICAgIHwgJ2ZpbmUtdHVuZS1yZXN1bHRzJ1xuICAgIHwgJ3Zpc2lvbic7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkLiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGZpbGUsIHdoaWNoIGNhbiBiZSBlaXRoZXJcbiAgICogYHVwbG9hZGVkYCwgYHByb2Nlc3NlZGAsIG9yIGBlcnJvcmAuXG4gICAqL1xuICBzdGF0dXM6ICd1cGxvYWRlZCcgfCAncHJvY2Vzc2VkJyB8ICdlcnJvcic7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkLiBGb3IgZGV0YWlscyBvbiB3aHkgYSBmaW5lLXR1bmluZyB0cmFpbmluZyBmaWxlIGZhaWxlZFxuICAgKiB2YWxpZGF0aW9uLCBzZWUgdGhlIGBlcnJvcmAgZmllbGQgb24gYGZpbmVfdHVuaW5nLmpvYmAuXG4gICAqL1xuICBzdGF0dXNfZGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBGaWxlIG9iamVjdCAobm90IGZpbGUgbmFtZSkgdG8gYmUgdXBsb2FkZWQuXG4gICAqL1xuICBmaWxlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS5cbiAgICpcbiAgICogVXNlIFwiYXNzaXN0YW50c1wiIGZvclxuICAgKiBbQXNzaXN0YW50c10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSBhbmRcbiAgICogW01lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIGZpbGVzLFxuICAgKiBcInZpc2lvblwiIGZvciBBc3Npc3RhbnRzIGltYWdlIGZpbGUgaW5wdXRzLCBcImJhdGNoXCIgZm9yXG4gICAqIFtCYXRjaCBBUEldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9iYXRjaCksIGFuZCBcImZpbmUtdHVuZVwiIGZvclxuICAgKiBbRmluZS10dW5pbmddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmluZS10dW5pbmcpLlxuICAgKi9cbiAgcHVycG9zZTogJ2Fzc2lzdGFudHMnIHwgJ2JhdGNoJyB8ICdmaW5lLXR1bmUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaXN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIE9ubHkgcmV0dXJuIGZpbGVzIHdpdGggdGhlIGdpdmVuIHB1cnBvc2UuXG4gICAqL1xuICBwdXJwb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVzIHtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ29udGVudCA9IEZpbGVzQVBJLkZpbGVDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IEZpbGVEZWxldGVkID0gRmlsZXNBUEkuRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdCA9IEZpbGVzQVBJLkZpbGVPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdHNQYWdlID0gRmlsZXNBUEkuRmlsZU9iamVjdHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBGaWxlc0FQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gRmlsZXNBUEkuRmlsZUxpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0ICogYXMgQ2hlY2twb2ludHNBUEkgZnJvbSAnLi9jaGVja3BvaW50cyc7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tICcuLi8uLi8uLi9wYWdpbmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIENoZWNrcG9pbnRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogTGlzdCBjaGVja3BvaW50cyBmb3IgYSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBsaXN0KFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogQ2hlY2twb2ludExpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSwgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+O1xuICBsaXN0KFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50PjtcbiAgbGlzdChcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogQ2hlY2twb2ludExpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSwgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QoZmluZVR1bmluZ0pvYklkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoXG4gICAgICBgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9L2NoZWNrcG9pbnRzYCxcbiAgICAgIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsXG4gICAgICB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0sXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+IHt9XG5cbi8qKlxuICogVGhlIGBmaW5lX3R1bmluZy5qb2IuY2hlY2twb2ludGAgb2JqZWN0IHJlcHJlc2VudHMgYSBtb2RlbCBjaGVja3BvaW50IGZvciBhXG4gKiBmaW5lLXR1bmluZyBqb2IgdGhhdCBpcyByZWFkeSB0byB1c2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQge1xuICAvKipcbiAgICogVGhlIGNoZWNrcG9pbnQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluZS10dW5lZCBjaGVja3BvaW50IG1vZGVsIHRoYXQgaXMgY3JlYXRlZC5cbiAgICovXG4gIGZpbmVfdHVuZWRfbW9kZWxfY2hlY2twb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluZS10dW5pbmcgam9iIHRoYXQgdGhpcyBjaGVja3BvaW50IHdhcyBjcmVhdGVkIGZyb20uXG4gICAqL1xuICBmaW5lX3R1bmluZ19qb2JfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTWV0cmljcyBhdCB0aGUgc3RlcCBudW1iZXIgZHVyaW5nIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBtZXRyaWNzOiBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludC5NZXRyaWNzO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcImZpbmVfdHVuaW5nLmpvYi5jaGVja3BvaW50XCIuXG4gICAqL1xuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2IuY2hlY2twb2ludCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIG51bWJlciB0aGF0IHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkIGF0LlxuICAgKi9cbiAgc3RlcF9udW1iZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBNZXRyaWNzIGF0IHRoZSBzdGVwIG51bWJlciBkdXJpbmcgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWV0cmljcyB7XG4gICAgZnVsbF92YWxpZF9sb3NzPzogbnVtYmVyO1xuXG4gICAgZnVsbF92YWxpZF9tZWFuX3Rva2VuX2FjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgc3RlcD86IG51bWJlcjtcblxuICAgIHRyYWluX2xvc3M/OiBudW1iZXI7XG5cbiAgICB0cmFpbl9tZWFuX3Rva2VuX2FjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgdmFsaWRfbG9zcz86IG51bWJlcjtcblxuICAgIHZhbGlkX21lYW5fdG9rZW5fYWNjdXJhY3k/OiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVja3BvaW50TGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGVja3BvaW50cyB7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGVja3BvaW50TGlzdFBhcmFtcyA9IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlJztcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCAqIGFzIEpvYnNBUEkgZnJvbSAnLi9qb2JzJztcbmltcG9ydCAqIGFzIENoZWNrcG9pbnRzQVBJIGZyb20gJy4vY2hlY2twb2ludHMnO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSAnLi4vLi4vLi4vcGFnaW5hdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBKb2JzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjaGVja3BvaW50czogQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHMgPSBuZXcgQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHModGhpcy5fY2xpZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZpbmUtdHVuaW5nIGpvYiB3aGljaCBiZWdpbnMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYSBuZXcgbW9kZWwgZnJvbVxuICAgKiBhIGdpdmVuIGRhdGFzZXQuXG4gICAqXG4gICAqIFJlc3BvbnNlIGluY2x1ZGVzIGRldGFpbHMgb2YgdGhlIGVucXVldWVkIGpvYiBpbmNsdWRpbmcgam9iIHN0YXR1cyBhbmQgdGhlIG5hbWVcbiAgICogb2YgdGhlIGZpbmUtdHVuZWQgbW9kZWxzIG9uY2UgY29tcGxldGUuXG4gICAqXG4gICAqIFtMZWFybiBtb3JlIGFib3V0IGZpbmUtdHVuaW5nXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqL1xuICBjcmVhdGUoYm9keTogSm9iQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaW5lVHVuaW5nSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvZmluZV90dW5pbmcvam9icycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5mbyBhYm91dCBhIGZpbmUtdHVuaW5nIGpvYi5cbiAgICpcbiAgICogW0xlYXJuIG1vcmUgYWJvdXQgZmluZS10dW5pbmddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICovXG4gIHJldHJpZXZlKGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaW5lVHVuaW5nSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgeW91ciBvcmdhbml6YXRpb24ncyBmaW5lLXR1bmluZyBqb2JzXG4gICAqL1xuICBsaXN0KFxuICAgIHF1ZXJ5PzogSm9iTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9ic1BhZ2UsIEZpbmVUdW5pbmdKb2I+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9ic1BhZ2UsIEZpbmVUdW5pbmdKb2I+O1xuICBsaXN0KFxuICAgIHF1ZXJ5OiBKb2JMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JzUGFnZSwgRmluZVR1bmluZ0pvYj4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9maW5lX3R1bmluZy9qb2JzJywgRmluZVR1bmluZ0pvYnNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltbWVkaWF0ZWx5IGNhbmNlbCBhIGZpbmUtdHVuZSBqb2IuXG4gICAqL1xuICBjYW5jZWwoZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbmVUdW5pbmdKb2I+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfS9jYW5jZWxgLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RhdHVzIHVwZGF0ZXMgZm9yIGEgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgbGlzdEV2ZW50cyhcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IEpvYkxpc3RFdmVudHNQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD47XG4gIGxpc3RFdmVudHMoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD47XG4gIGxpc3RFdmVudHMoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgcXVlcnk6IEpvYkxpc3RFdmVudHNQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdEV2ZW50cyhmaW5lVHVuaW5nSm9iSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9L2V2ZW50c2AsIEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmdKb2JzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8RmluZVR1bmluZ0pvYj4ge31cblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxGaW5lVHVuaW5nSm9iRXZlbnQ+IHt9XG5cbi8qKlxuICogVGhlIGBmaW5lX3R1bmluZy5qb2JgIG9iamVjdCByZXByZXNlbnRzIGEgZmluZS10dW5pbmcgam9iIHRoYXQgaGFzIGJlZW4gY3JlYXRlZFxuICogdGhyb3VnaCB0aGUgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2Ige1xuICAvKipcbiAgICogVGhlIG9iamVjdCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbmUtdHVuaW5nIGpvYiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yIGZpbmUtdHVuaW5nIGpvYnMgdGhhdCBoYXZlIGBmYWlsZWRgLCB0aGlzIHdpbGwgY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIG9uXG4gICAqIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGVycm9yOiBGaW5lVHVuaW5nSm9iLkVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmUtdHVuZWQgbW9kZWwgdGhhdCBpcyBiZWluZyBjcmVhdGVkLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsXG4gICAqIGlmIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgc3RpbGwgcnVubmluZy5cbiAgICovXG4gIGZpbmVfdHVuZWRfbW9kZWw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbmUtdHVuaW5nIGpvYiB3YXMgZmluaXNoZWQuIFRoZVxuICAgKiB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgZmluaXNoZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi4gU2VlIHRoZVxuICAgKiBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZykgZm9yXG4gICAqIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGh5cGVycGFyYW1ldGVyczogRmluZVR1bmluZ0pvYi5IeXBlcnBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIG1vZGVsIHRoYXQgaXMgYmVpbmcgZmluZS10dW5lZC5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwiZmluZV90dW5pbmcuam9iXCIuXG4gICAqL1xuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2InO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JnYW5pemF0aW9uIHRoYXQgb3ducyB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgb3JnYW5pemF0aW9uX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21waWxlZCByZXN1bHRzIGZpbGUgSUQocykgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuIFlvdSBjYW4gcmV0cmlldmUgdGhlXG4gICAqIHJlc3VsdHMgd2l0aCB0aGVcbiAgICogW0ZpbGVzIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9yZXRyaWV2ZS1jb250ZW50cykuXG4gICAqL1xuICByZXN1bHRfZmlsZXM6IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWVkIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBzZWVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZmluZS10dW5pbmcgam9iLCB3aGljaCBjYW4gYmUgZWl0aGVyXG4gICAqIGB2YWxpZGF0aW5nX2ZpbGVzYCwgYHF1ZXVlZGAsIGBydW5uaW5nYCwgYHN1Y2NlZWRlZGAsIGBmYWlsZWRgLCBvciBgY2FuY2VsbGVkYC5cbiAgICovXG4gIHN0YXR1czogJ3ZhbGlkYXRpbmdfZmlsZXMnIHwgJ3F1ZXVlZCcgfCAncnVubmluZycgfCAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYmlsbGFibGUgdG9rZW5zIHByb2Nlc3NlZCBieSB0aGlzIGZpbmUtdHVuaW5nIGpvYi4gVGhlIHZhbHVlXG4gICAqIHdpbGwgYmUgbnVsbCBpZiB0aGUgZmluZS10dW5pbmcgam9iIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICB0cmFpbmVkX3Rva2VuczogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgSUQgdXNlZCBmb3IgdHJhaW5pbmcuIFlvdSBjYW4gcmV0cmlldmUgdGhlIHRyYWluaW5nIGRhdGEgd2l0aCB0aGVcbiAgICogW0ZpbGVzIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9yZXRyaWV2ZS1jb250ZW50cykuXG4gICAqL1xuICB0cmFpbmluZ19maWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIElEIHVzZWQgZm9yIHZhbGlkYXRpb24uIFlvdSBjYW4gcmV0cmlldmUgdGhlIHZhbGlkYXRpb24gcmVzdWx0cyB3aXRoXG4gICAqIHRoZVxuICAgKiBbRmlsZXMgQVBJXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL3JldHJpZXZlLWNvbnRlbnRzKS5cbiAgICovXG4gIHZhbGlkYXRpb25fZmlsZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmluZS10dW5pbmcgam9iIGlzIGVzdGltYXRlZCB0b1xuICAgKiBmaW5pc2guIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBub3QgcnVubmluZy5cbiAgICovXG4gIGVzdGltYXRlZF9maW5pc2g/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdyYXRpb25zIHRvIGVuYWJsZSBmb3IgdGhpcyBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBpbnRlZ3JhdGlvbnM/OiBBcnJheTxGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdD4gfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbmVUdW5pbmdKb2Ige1xuICAvKipcbiAgICogRm9yIGZpbmUtdHVuaW5nIGpvYnMgdGhhdCBoYXZlIGBmYWlsZWRgLCB0aGlzIHdpbGwgY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIG9uXG4gICAqIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEEgbWFjaGluZS1yZWFkYWJsZSBlcnJvciBjb2RlLlxuICAgICAqL1xuICAgIGNvZGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGFyYW1ldGVyIHRoYXQgd2FzIGludmFsaWQsIHVzdWFsbHkgYHRyYWluaW5nX2ZpbGVgIG9yIGB2YWxpZGF0aW9uX2ZpbGVgLlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGlmIHRoZSBmYWlsdXJlIHdhcyBub3QgcGFyYW1ldGVyLXNwZWNpZmljLlxuICAgICAqL1xuICAgIHBhcmFtOiBzdHJpbmcgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi4gU2VlIHRoZVxuICAgKiBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZykgZm9yXG4gICAqIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSHlwZXJwYXJhbWV0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVwb2NocyB0byB0cmFpbiB0aGUgbW9kZWwgZm9yLiBBbiBlcG9jaCByZWZlcnMgdG8gb25lIGZ1bGwgY3ljbGVcbiAgICAgKiB0aHJvdWdoIHRoZSB0cmFpbmluZyBkYXRhc2V0LiBcImF1dG9cIiBkZWNpZGVzIHRoZSBvcHRpbWFsIG51bWJlciBvZiBlcG9jaHMgYmFzZWRcbiAgICAgKiBvbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YXNldC4gSWYgc2V0dGluZyB0aGUgbnVtYmVyIG1hbnVhbGx5LCB3ZSBzdXBwb3J0IGFueVxuICAgICAqIG51bWJlciBiZXR3ZWVuIDEgYW5kIDUwIGVwb2Nocy5cbiAgICAgKi9cbiAgICBuX2Vwb2NoczogJ2F1dG8nIHwgbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogRmluZS10dW5pbmcgam9iIGV2ZW50IG9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JFdmVudCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIGxldmVsOiAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4gIG1lc3NhZ2U6IHN0cmluZztcblxuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2IuZXZlbnQnO1xufVxuXG5leHBvcnQgdHlwZSBGaW5lVHVuaW5nSm9iSW50ZWdyYXRpb24gPSBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcblxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gKiBleHBsaWNpdCBkaXNwbGF5IG5hbWUgZm9yIHlvdXIgcnVuLCBhZGQgdGFncyB0byB5b3VyIHJ1biwgYW5kIHNldCBhIGRlZmF1bHRcbiAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG5ldyBydW4gd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxuICAgKi9cbiAgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRvIHVzZSBmb3IgdGhlIHJ1bi4gVGhpcyBhbGxvd3MgeW91IHRvIHNldCB0aGUgdGVhbSBvciB1c2VybmFtZSBvZlxuICAgKiB0aGUgV2FuZEIgdXNlciB0aGF0IHlvdSB3b3VsZCBsaWtlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVuLiBJZiBub3Qgc2V0LCB0aGVcbiAgICogZGVmYXVsdCBlbnRpdHkgZm9yIHRoZSByZWdpc3RlcmVkIFdhbmRCIEFQSSBrZXkgaXMgdXNlZC5cbiAgICovXG4gIGVudGl0eT86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSBuYW1lIHRvIHNldCBmb3IgdGhlIHJ1bi4gSWYgbm90IHNldCwgd2Ugd2lsbCB1c2UgdGhlIEpvYiBJRCBhcyB0aGVcbiAgICogbmFtZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGFncyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBydW4uIFRoZXNlIHRhZ3MgYXJlIHBhc3NlZFxuICAgKiB0aHJvdWdoIGRpcmVjdGx5IHRvIFdhbmRCLiBTb21lIGRlZmF1bHQgdGFncyBhcmUgZ2VuZXJhdGVkIGJ5IE9wZW5BSTpcbiAgICogXCJvcGVuYWkvZmluZXR1bmVcIiwgXCJvcGVuYWkve2Jhc2UtbW9kZWx9XCIsIFwib3BlbmFpL3tmdGpvYi1hYmNkZWZ9XCIuXG4gICAqL1xuICB0YWdzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgaW50ZWdyYXRpb24gYmVpbmcgZW5hYmxlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYlxuICAgKi9cbiAgdHlwZTogJ3dhbmRiJztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGZvciB5b3VyIGludGVncmF0aW9uIHdpdGggV2VpZ2h0cyBhbmQgQmlhc2VzLiBUaGlzIHBheWxvYWRcbiAgICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gICAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICAgKiBlbnRpdHkgKHRlYW0sIHVzZXJuYW1lLCBldGMpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHJ1bi5cbiAgICovXG4gIHdhbmRiOiBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKb2JDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIGZpbmUtdHVuZS4gWW91IGNhbiBzZWxlY3Qgb25lIG9mIHRoZVxuICAgKiBbc3VwcG9ydGVkIG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nL3doYXQtbW9kZWxzLWNhbi1iZS1maW5lLXR1bmVkKS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ2JhYmJhZ2UtMDAyJyB8ICdkYXZpbmNpLTAwMicgfCAnZ3B0LTMuNS10dXJibyc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiB1cGxvYWRlZCBmaWxlIHRoYXQgY29udGFpbnMgdHJhaW5pbmcgZGF0YS5cbiAgICpcbiAgICogU2VlIFt1cGxvYWQgZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9jcmVhdGUpXG4gICAqIGZvciBob3cgdG8gdXBsb2FkIGEgZmlsZS5cbiAgICpcbiAgICogWW91ciBkYXRhc2V0IG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgSlNPTkwgZmlsZS4gQWRkaXRpb25hbGx5LCB5b3UgbXVzdCB1cGxvYWRcbiAgICogeW91ciBmaWxlIHdpdGggdGhlIHB1cnBvc2UgYGZpbmUtdHVuZWAuXG4gICAqXG4gICAqIFNlZSB0aGUgW2ZpbmUtdHVuaW5nIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICB0cmFpbmluZ19maWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGh5cGVycGFyYW1ldGVycz86IEpvYkNyZWF0ZVBhcmFtcy5IeXBlcnBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgdG8gZW5hYmxlIGZvciB5b3VyIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGludGVncmF0aW9ucz86IEFycmF5PEpvYkNyZWF0ZVBhcmFtcy5JbnRlZ3JhdGlvbj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VlZCBjb250cm9scyB0aGUgcmVwcm9kdWNpYmlsaXR5IG9mIHRoZSBqb2IuIFBhc3NpbmcgaW4gdGhlIHNhbWUgc2VlZCBhbmRcbiAgICogam9iIHBhcmFtZXRlcnMgc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0cywgYnV0IG1heSBkaWZmZXIgaW4gcmFyZSBjYXNlcy4gSWZcbiAgICogYSBzZWVkIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgeW91LlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIG9mIHVwIHRvIDE4IGNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHlvdXIgZmluZS10dW5lZCBtb2RlbFxuICAgKiBuYW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYSBgc3VmZml4YCBvZiBcImN1c3RvbS1tb2RlbC1uYW1lXCIgd291bGQgcHJvZHVjZSBhIG1vZGVsIG5hbWUgbGlrZVxuICAgKiBgZnQ6Z3B0LTMuNS10dXJibzpvcGVuYWk6Y3VzdG9tLW1vZGVsLW5hbWU6N3A0bFVSZWxgLlxuICAgKi9cbiAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIHVwbG9hZGVkIGZpbGUgdGhhdCBjb250YWlucyB2YWxpZGF0aW9uIGRhdGEuXG4gICAqXG4gICAqIElmIHlvdSBwcm92aWRlIHRoaXMgZmlsZSwgdGhlIGRhdGEgaXMgdXNlZCB0byBnZW5lcmF0ZSB2YWxpZGF0aW9uIG1ldHJpY3NcbiAgICogcGVyaW9kaWNhbGx5IGR1cmluZyBmaW5lLXR1bmluZy4gVGhlc2UgbWV0cmljcyBjYW4gYmUgdmlld2VkIGluIHRoZSBmaW5lLXR1bmluZ1xuICAgKiByZXN1bHRzIGZpbGUuIFRoZSBzYW1lIGRhdGEgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGluIGJvdGggdHJhaW4gYW5kIHZhbGlkYXRpb25cbiAgICogZmlsZXMuXG4gICAqXG4gICAqIFlvdXIgZGF0YXNldCBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIEpTT05MIGZpbGUuIFlvdSBtdXN0IHVwbG9hZCB5b3VyIGZpbGUgd2l0aFxuICAgKiB0aGUgcHVycG9zZSBgZmluZS10dW5lYC5cbiAgICpcbiAgICogU2VlIHRoZSBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHZhbGlkYXRpb25fZmlsZT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSm9iQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSHlwZXJwYXJhbWV0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZXhhbXBsZXMgaW4gZWFjaCBiYXRjaC4gQSBsYXJnZXIgYmF0Y2ggc2l6ZSBtZWFucyB0aGF0IG1vZGVsXG4gICAgICogcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBsZXNzIGZyZXF1ZW50bHksIGJ1dCB3aXRoIGxvd2VyIHZhcmlhbmNlLlxuICAgICAqL1xuICAgIGJhdGNoX3NpemU/OiAnYXV0bycgfCBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTY2FsaW5nIGZhY3RvciBmb3IgdGhlIGxlYXJuaW5nIHJhdGUuIEEgc21hbGxlciBsZWFybmluZyByYXRlIG1heSBiZSB1c2VmdWwgdG9cbiAgICAgKiBhdm9pZCBvdmVyZml0dGluZy5cbiAgICAgKi9cbiAgICBsZWFybmluZ19yYXRlX211bHRpcGxpZXI/OiAnYXV0bycgfCBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVwb2NocyB0byB0cmFpbiB0aGUgbW9kZWwgZm9yLiBBbiBlcG9jaCByZWZlcnMgdG8gb25lIGZ1bGwgY3ljbGVcbiAgICAgKiB0aHJvdWdoIHRoZSB0cmFpbmluZyBkYXRhc2V0LlxuICAgICAqL1xuICAgIG5fZXBvY2hzPzogJ2F1dG8nIHwgbnVtYmVyO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBJbnRlZ3JhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgaW50ZWdyYXRpb24gdG8gZW5hYmxlLiBDdXJyZW50bHksIG9ubHkgXCJ3YW5kYlwiIChXZWlnaHRzIGFuZCBCaWFzZXMpXG4gICAgICogaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHR5cGU6ICd3YW5kYic7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICAgICAqIHNwZWNpZmllcyB0aGUgcHJvamVjdCB0aGF0IG1ldHJpY3Mgd2lsbCBiZSBzZW50IHRvLiBPcHRpb25hbGx5LCB5b3UgY2FuIHNldCBhblxuICAgICAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICAgICAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICAgICAqL1xuICAgIHdhbmRiOiBJbnRlZ3JhdGlvbi5XYW5kYjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgSW50ZWdyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0aW5ncyBmb3IgeW91ciBpbnRlZ3JhdGlvbiB3aXRoIFdlaWdodHMgYW5kIEJpYXNlcy4gVGhpcyBwYXlsb2FkXG4gICAgICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gICAgICogZXhwbGljaXQgZGlzcGxheSBuYW1lIGZvciB5b3VyIHJ1biwgYWRkIHRhZ3MgdG8geW91ciBydW4sIGFuZCBzZXQgYSBkZWZhdWx0XG4gICAgICogZW50aXR5ICh0ZWFtLCB1c2VybmFtZSwgZXRjKSB0byBiZSBhc3NvY2lhdGVkIHdpdGggeW91ciBydW4uXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBXYW5kYiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG5ldyBydW4gd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxuICAgICAgICovXG4gICAgICBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGVudGl0eSB0byB1c2UgZm9yIHRoZSBydW4uIFRoaXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHRlYW0gb3IgdXNlcm5hbWUgb2ZcbiAgICAgICAqIHRoZSBXYW5kQiB1c2VyIHRoYXQgeW91IHdvdWxkIGxpa2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBydW4uIElmIG5vdCBzZXQsIHRoZVxuICAgICAgICogZGVmYXVsdCBlbnRpdHkgZm9yIHRoZSByZWdpc3RlcmVkIFdhbmRCIEFQSSBrZXkgaXMgdXNlZC5cbiAgICAgICAqL1xuICAgICAgZW50aXR5Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGRpc3BsYXkgbmFtZSB0byBzZXQgZm9yIHRoZSBydW4uIElmIG5vdCBzZXQsIHdlIHdpbGwgdXNlIHRoZSBKb2IgSUQgYXMgdGhlXG4gICAgICAgKiBuYW1lLlxuICAgICAgICovXG4gICAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgdGFncyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBydW4uIFRoZXNlIHRhZ3MgYXJlIHBhc3NlZFxuICAgICAgICogdGhyb3VnaCBkaXJlY3RseSB0byBXYW5kQi4gU29tZSBkZWZhdWx0IHRhZ3MgYXJlIGdlbmVyYXRlZCBieSBPcGVuQUk6XG4gICAgICAgKiBcIm9wZW5haS9maW5ldHVuZVwiLCBcIm9wZW5haS97YmFzZS1tb2RlbH1cIiwgXCJvcGVuYWkve2Z0am9iLWFiY2RlZn1cIi5cbiAgICAgICAqL1xuICAgICAgdGFncz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9iTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IGludGVyZmFjZSBKb2JMaXN0RXZlbnRzUGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgbmFtZXNwYWNlIEpvYnMge1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2IgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2I7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9ic1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSm9iQ3JlYXRlUGFyYW1zID0gSm9ic0FQSS5Kb2JDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdFBhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0RXZlbnRzUGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0RXZlbnRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoZWNrcG9pbnRzID0gQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHM7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGVja3BvaW50TGlzdFBhcmFtcyA9IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgSm9ic0FQSSBmcm9tICcuL2pvYnMvam9icyc7XG5cbmV4cG9ydCBjbGFzcyBGaW5lVHVuaW5nIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBqb2JzOiBKb2JzQVBJLkpvYnMgPSBuZXcgSm9ic0FQSS5Kb2JzKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmluZVR1bmluZyB7XG4gIGV4cG9ydCBpbXBvcnQgSm9icyA9IEpvYnNBUEkuSm9icztcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JFdmVudCA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JJbnRlZ3JhdGlvbiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdCA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYnNQYWdlID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9ic1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JFdmVudHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEpvYkNyZWF0ZVBhcmFtcyA9IEpvYnNBUEkuSm9iQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEpvYkxpc3RQYXJhbXMgPSBKb2JzQVBJLkpvYkxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdEV2ZW50c1BhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdEV2ZW50c1BhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBJbWFnZXNBUEkgZnJvbSAnLi9pbWFnZXMnO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEltYWdlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB2YXJpYXRpb24gb2YgYSBnaXZlbiBpbWFnZS5cbiAgICovXG4gIGNyZWF0ZVZhcmlhdGlvbihcbiAgICBib2R5OiBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPEltYWdlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvaW1hZ2VzL3ZhcmlhdGlvbnMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVkaXRlZCBvciBleHRlbmRlZCBpbWFnZSBnaXZlbiBhbiBvcmlnaW5hbCBpbWFnZSBhbmQgYSBwcm9tcHQuXG4gICAqL1xuICBlZGl0KGJvZHk6IEltYWdlRWRpdFBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8SW1hZ2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9pbWFnZXMvZWRpdHMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGltYWdlIGdpdmVuIGEgcHJvbXB0LlxuICAgKi9cbiAgZ2VuZXJhdGUoYm9keTogSW1hZ2VHZW5lcmF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8SW1hZ2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9pbWFnZXMvZ2VuZXJhdGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB1cmwgb3IgdGhlIGNvbnRlbnQgb2YgYW4gaW1hZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBPcGVuQUkgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBKU09OIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIGlmIGByZXNwb25zZV9mb3JtYXRgIGlzXG4gICAqIGBiNjRfanNvbmAuXG4gICAqL1xuICBiNjRfanNvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb21wdCB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpbWFnZSwgaWYgdGhlcmUgd2FzIGFueSByZXZpc2lvbiB0byB0aGVcbiAgICogcHJvbXB0LlxuICAgKi9cbiAgcmV2aXNlZF9wcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZSwgaWYgYHJlc3BvbnNlX2Zvcm1hdGAgaXMgYHVybGAgKGRlZmF1bHQpLlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlc1Jlc3BvbnNlIHtcbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIGRhdGE6IEFycmF5PEltYWdlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgdGhlIHZhcmlhdGlvbihzKS4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLFxuICAgKiBsZXNzIHRoYW4gNE1CLCBhbmQgc3F1YXJlLlxuICAgKi9cbiAgaW1hZ2U6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byB1c2UgZm9yIGltYWdlIGdlbmVyYXRpb24uIE9ubHkgYGRhbGwtZS0yYCBpcyBzdXBwb3J0ZWQgYXQgdGhpc1xuICAgKiB0aW1lLlxuICAgKi9cbiAgbW9kZWw/OiAoc3RyaW5nICYge30pIHwgJ2RhbGwtZS0yJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlLiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAuIEZvciBgZGFsbC1lLTNgLCBvbmx5XG4gICAqIGBuPTFgIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YC5cbiAgICovXG4gIHNpemU/OiAnMjU2eDI1NicgfCAnNTEyeDUxMicgfCAnMTAyNHgxMDI0JyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRWRpdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdG8gZWRpdC4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLCBsZXNzIHRoYW4gNE1CLCBhbmQgc3F1YXJlLiBJZiBtYXNrXG4gICAqIGlzIG5vdCBwcm92aWRlZCwgaW1hZ2UgbXVzdCBoYXZlIHRyYW5zcGFyZW5jeSwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBtYXNrLlxuICAgKi9cbiAgaW1hZ2U6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzaXJlZCBpbWFnZShzKS4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDEwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIHByb21wdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhZGRpdGlvbmFsIGltYWdlIHdob3NlIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWFzIChlLmcuIHdoZXJlIGFscGhhIGlzIHplcm8pXG4gICAqIGluZGljYXRlIHdoZXJlIGBpbWFnZWAgc2hvdWxkIGJlIGVkaXRlZC4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLCBsZXNzIHRoYW5cbiAgICogNE1CLCBhbmQgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIGBpbWFnZWAuXG4gICAqL1xuICBtYXNrPzogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIHVzZSBmb3IgaW1hZ2UgZ2VuZXJhdGlvbi4gT25seSBgZGFsbC1lLTJgIGlzIHN1cHBvcnRlZCBhdCB0aGlzXG4gICAqIHRpbWUuXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAnZGFsbC1lLTInIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGUuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YC5cbiAgICovXG4gIHNpemU/OiAnMjU2eDI1NicgfCAnNTEyeDUxMicgfCAnMTAyNHgxMDI0JyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlR2VuZXJhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBkZXNpcmVkIGltYWdlKHMpLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMTAwMFxuICAgKiBjaGFyYWN0ZXJzIGZvciBgZGFsbC1lLTJgIGFuZCA0MDAwIGNoYXJhY3RlcnMgZm9yIGBkYWxsLWUtM2AuXG4gICAqL1xuICBwcm9tcHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIHVzZSBmb3IgaW1hZ2UgZ2VuZXJhdGlvbi5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICdkYWxsLWUtMicgfCAnZGFsbC1lLTMnIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGUuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC4gRm9yIGBkYWxsLWUtM2AsIG9ubHlcbiAgICogYG49MWAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkLiBgaGRgIGNyZWF0ZXMgaW1hZ2VzIHdpdGggZmluZXJcbiAgICogZGV0YWlscyBhbmQgZ3JlYXRlciBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhlIGltYWdlLiBUaGlzIHBhcmFtIGlzIG9ubHkgc3VwcG9ydGVkXG4gICAqIGZvciBgZGFsbC1lLTNgLlxuICAgKi9cbiAgcXVhbGl0eT86ICdzdGFuZGFyZCcgfCAnaGQnO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YCBmb3IgYGRhbGwtZS0yYC4gTXVzdCBiZSBvbmUgb2YgYDEwMjR4MTAyNGAsIGAxNzkyeDEwMjRgLCBvclxuICAgKiBgMTAyNHgxNzkyYCBmb3IgYGRhbGwtZS0zYCBtb2RlbHMuXG4gICAqL1xuICBzaXplPzogJzI1NngyNTYnIHwgJzUxMng1MTInIHwgJzEwMjR4MTAyNCcgfCAnMTc5MngxMDI0JyB8ICcxMDI0eDE3OTInIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0eWxlIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzLiBNdXN0IGJlIG9uZSBvZiBgdml2aWRgIG9yIGBuYXR1cmFsYC4gVml2aWRcbiAgICogY2F1c2VzIHRoZSBtb2RlbCB0byBsZWFuIHRvd2FyZHMgZ2VuZXJhdGluZyBoeXBlci1yZWFsIGFuZCBkcmFtYXRpYyBpbWFnZXMuXG4gICAqIE5hdHVyYWwgY2F1c2VzIHRoZSBtb2RlbCB0byBwcm9kdWNlIG1vcmUgbmF0dXJhbCwgbGVzcyBoeXBlci1yZWFsIGxvb2tpbmdcbiAgICogaW1hZ2VzLiBUaGlzIHBhcmFtIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBgZGFsbC1lLTNgLlxuICAgKi9cbiAgc3R5bGU/OiAndml2aWQnIHwgJ25hdHVyYWwnIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSW1hZ2VzIHtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZSA9IEltYWdlc0FQSS5JbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZXNSZXNwb25zZSA9IEltYWdlc0FQSS5JbWFnZXNSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyA9IEltYWdlc0FQSS5JbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUVkaXRQYXJhbXMgPSBJbWFnZXNBUEkuSW1hZ2VFZGl0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlR2VuZXJhdGVQYXJhbXMgPSBJbWFnZXNBUEkuSW1hZ2VHZW5lcmF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgKiBhcyBNb2RlbHNBUEkgZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gJy4uL3BhZ2luYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UsIHByb3ZpZGluZyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwgc3VjaCBhc1xuICAgKiB0aGUgb3duZXIgYW5kIHBlcm1pc3Npb25pbmcuXG4gICAqL1xuICByZXRyaWV2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvbW9kZWxzLyR7bW9kZWx9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgbW9kZWxzLCBhbmQgcHJvdmlkZXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaFxuICAgKiBvbmUgc3VjaCBhcyB0aGUgb3duZXIgYW5kIGF2YWlsYWJpbGl0eS5cbiAgICovXG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPE1vZGVsc1BhZ2UsIE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvbW9kZWxzJywgTW9kZWxzUGFnZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZmluZS10dW5lZCBtb2RlbC4gWW91IG11c3QgaGF2ZSB0aGUgT3duZXIgcm9sZSBpbiB5b3VyIG9yZ2FuaXphdGlvbiB0b1xuICAgKiBkZWxldGUgYSBtb2RlbC5cbiAgICovXG4gIGRlbChtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL21vZGVscy8ke21vZGVsfWAsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogTm90ZTogbm8gcGFnaW5hdGlvbiBhY3R1YWxseSBvY2N1cnMgeWV0LCB0aGlzIGlzIGZvciBmb3J3YXJkcy1jb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxzUGFnZSBleHRlbmRzIFBhZ2U8TW9kZWw+IHt9XG5cbi8qKlxuICogRGVzY3JpYmVzIGFuIE9wZW5BSSBtb2RlbCBvZmZlcmluZyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIHdoZW4gdGhlIG1vZGVsIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcIm1vZGVsXCIuXG4gICAqL1xuICBvYmplY3Q6ICdtb2RlbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmdhbml6YXRpb24gdGhhdCBvd25zIHRoZSBtb2RlbC5cbiAgICovXG4gIG93bmVkX2J5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1vZGVscyB7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWwgPSBNb2RlbHNBUEkuTW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxEZWxldGVkID0gTW9kZWxzQVBJLk1vZGVsRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbHNQYWdlID0gTW9kZWxzQVBJLk1vZGVsc1BhZ2U7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0ICogYXMgTW9kZXJhdGlvbnNBUEkgZnJvbSAnLi9tb2RlcmF0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBNb2RlcmF0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENsYXNzaWZpZXMgaWYgdGV4dCBpcyBwb3RlbnRpYWxseSBoYXJtZnVsLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IE1vZGVyYXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxNb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9tb2RlcmF0aW9ucycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVyYXRpb24ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzLCBhbmQgd2hldGhlciB0aGV5IGFyZSBmbGFnZ2VkIG9yIG5vdC5cbiAgICovXG4gIGNhdGVnb3JpZXM6IE1vZGVyYXRpb24uQ2F0ZWdvcmllcztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzIGFsb25nIHdpdGggdGhlaXIgc2NvcmVzIGFzIHByZWRpY3RlZCBieSBtb2RlbC5cbiAgICovXG4gIGNhdGVnb3J5X3Njb3JlczogTW9kZXJhdGlvbi5DYXRlZ29yeVNjb3JlcztcblxuICAvKipcbiAgICogV2hldGhlciBhbnkgb2YgdGhlIGJlbG93IGNhdGVnb3JpZXMgYXJlIGZsYWdnZWQuXG4gICAqL1xuICBmbGFnZ2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1vZGVyYXRpb24ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzLCBhbmQgd2hldGhlciB0aGV5IGFyZSBmbGFnZ2VkIG9yIG5vdC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmllcyB7XG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGV4cHJlc3NlcywgaW5jaXRlcywgb3IgcHJvbW90ZXMgaGFyYXNzaW5nIGxhbmd1YWdlIHRvd2FyZHMgYW55XG4gICAgICogdGFyZ2V0LlxuICAgICAqL1xuICAgIGhhcmFzc21lbnQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBIYXJhc3NtZW50IGNvbnRlbnQgdGhhdCBhbHNvIGluY2x1ZGVzIHZpb2xlbmNlIG9yIHNlcmlvdXMgaGFybSB0b3dhcmRzIGFueVxuICAgICAqIHRhcmdldC5cbiAgICAgKi9cbiAgICAnaGFyYXNzbWVudC90aHJlYXRlbmluZyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZXhwcmVzc2VzLCBpbmNpdGVzLCBvciBwcm9tb3RlcyBoYXRlIGJhc2VkIG9uIHJhY2UsIGdlbmRlcixcbiAgICAgKiBldGhuaWNpdHksIHJlbGlnaW9uLCBuYXRpb25hbGl0eSwgc2V4dWFsIG9yaWVudGF0aW9uLCBkaXNhYmlsaXR5IHN0YXR1cywgb3JcbiAgICAgKiBjYXN0ZS4gSGF0ZWZ1bCBjb250ZW50IGFpbWVkIGF0IG5vbi1wcm90ZWN0ZWQgZ3JvdXBzIChlLmcuLCBjaGVzcyBwbGF5ZXJzKSBpc1xuICAgICAqIGhhcmFzc21lbnQuXG4gICAgICovXG4gICAgaGF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEhhdGVmdWwgY29udGVudCB0aGF0IGFsc28gaW5jbHVkZXMgdmlvbGVuY2Ugb3Igc2VyaW91cyBoYXJtIHRvd2FyZHMgdGhlIHRhcmdldGVkXG4gICAgICogZ3JvdXAgYmFzZWQgb24gcmFjZSwgZ2VuZGVyLCBldGhuaWNpdHksIHJlbGlnaW9uLCBuYXRpb25hbGl0eSwgc2V4dWFsXG4gICAgICogb3JpZW50YXRpb24sIGRpc2FiaWxpdHkgc3RhdHVzLCBvciBjYXN0ZS5cbiAgICAgKi9cbiAgICAnaGF0ZS90aHJlYXRlbmluZyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgcHJvbW90ZXMsIGVuY291cmFnZXMsIG9yIGRlcGljdHMgYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXNcbiAgICAgKiBzdWljaWRlLCBjdXR0aW5nLCBhbmQgZWF0aW5nIGRpc29yZGVycy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBlbmNvdXJhZ2VzIHBlcmZvcm1pbmcgYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXMgc3VpY2lkZSwgY3V0dGluZyxcbiAgICAgKiBhbmQgZWF0aW5nIGRpc29yZGVycywgb3IgdGhhdCBnaXZlcyBpbnN0cnVjdGlvbnMgb3IgYWR2aWNlIG9uIGhvdyB0byBjb21taXQgc3VjaFxuICAgICAqIGFjdHMuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnN0cnVjdGlvbnMnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB3aGVyZSB0aGUgc3BlYWtlciBleHByZXNzZXMgdGhhdCB0aGV5IGFyZSBlbmdhZ2luZyBvciBpbnRlbmQgdG8gZW5nYWdlXG4gICAgICogaW4gYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXMgc3VpY2lkZSwgY3V0dGluZywgYW5kIGVhdGluZyBkaXNvcmRlcnMuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnRlbnQnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCBtZWFudCB0byBhcm91c2Ugc2V4dWFsIGV4Y2l0ZW1lbnQsIHN1Y2ggYXMgdGhlIGRlc2NyaXB0aW9uIG9mIHNleHVhbFxuICAgICAqIGFjdGl2aXR5LCBvciB0aGF0IHByb21vdGVzIHNleHVhbCBzZXJ2aWNlcyAoZXhjbHVkaW5nIHNleCBlZHVjYXRpb24gYW5kXG4gICAgICogd2VsbG5lc3MpLlxuICAgICAqL1xuICAgIHNleHVhbDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNleHVhbCBjb250ZW50IHRoYXQgaW5jbHVkZXMgYW4gaW5kaXZpZHVhbCB3aG8gaXMgdW5kZXIgMTggeWVhcnMgb2xkLlxuICAgICAqL1xuICAgICdzZXh1YWwvbWlub3JzJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBkZXBpY3RzIGRlYXRoLCB2aW9sZW5jZSwgb3IgcGh5c2ljYWwgaW5qdXJ5LlxuICAgICAqL1xuICAgIHZpb2xlbmNlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGRlcGljdHMgZGVhdGgsIHZpb2xlbmNlLCBvciBwaHlzaWNhbCBpbmp1cnkgaW4gZ3JhcGhpYyBkZXRhaWwuXG4gICAgICovXG4gICAgJ3Zpb2xlbmNlL2dyYXBoaWMnOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0aGUgY2F0ZWdvcmllcyBhbG9uZyB3aXRoIHRoZWlyIHNjb3JlcyBhcyBwcmVkaWN0ZWQgYnkgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5U2NvcmVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGFyYXNzbWVudCcuXG4gICAgICovXG4gICAgaGFyYXNzbWVudDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhcmFzc21lbnQvdGhyZWF0ZW5pbmcnLlxuICAgICAqL1xuICAgICdoYXJhc3NtZW50L3RocmVhdGVuaW5nJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhdGUnLlxuICAgICAqL1xuICAgIGhhdGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdoYXRlL3RocmVhdGVuaW5nJy5cbiAgICAgKi9cbiAgICAnaGF0ZS90aHJlYXRlbmluZyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0nLlxuICAgICAqL1xuICAgICdzZWxmLWhhcm0nOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2VsZi1oYXJtL2luc3RydWN0aW9ucycuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnN0cnVjdGlvbnMnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2VsZi1oYXJtL2ludGVudCcuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnRlbnQnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2V4dWFsJy5cbiAgICAgKi9cbiAgICBzZXh1YWw6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZXh1YWwvbWlub3JzJy5cbiAgICAgKi9cbiAgICAnc2V4dWFsL21pbm9ycyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICd2aW9sZW5jZScuXG4gICAgICovXG4gICAgdmlvbGVuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICd2aW9sZW5jZS9ncmFwaGljJy5cbiAgICAgKi9cbiAgICAndmlvbGVuY2UvZ3JhcGhpYyc6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgaWYgYSBnaXZlbiB0ZXh0IGlucHV0IGlzIHBvdGVudGlhbGx5IGhhcm1mdWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVyYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtb2RlcmF0aW9uIHJlc3VsdHMuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbW9kZXJhdGlvbiBvYmplY3RzLlxuICAgKi9cbiAgcmVzdWx0czogQXJyYXk8TW9kZXJhdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGV4dCB0byBjbGFzc2lmeVxuICAgKi9cbiAgaW5wdXQ6IHN0cmluZyB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFR3byBjb250ZW50IG1vZGVyYXRpb25zIG1vZGVscyBhcmUgYXZhaWxhYmxlOiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAgYW5kXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0YC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgYHRleHQtbW9kZXJhdGlvbi1sYXRlc3RgIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGdyYWRlZFxuICAgKiBvdmVyIHRpbWUuIFRoaXMgZW5zdXJlcyB5b3UgYXJlIGFsd2F5cyB1c2luZyBvdXIgbW9zdCBhY2N1cmF0ZSBtb2RlbC4gSWYgeW91IHVzZVxuICAgKiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAsIHdlIHdpbGwgcHJvdmlkZSBhZHZhbmNlZCBub3RpY2UgYmVmb3JlIHVwZGF0aW5nIHRoZVxuICAgKiBtb2RlbC4gQWNjdXJhY3kgb2YgYHRleHQtbW9kZXJhdGlvbi1zdGFibGVgIG1heSBiZSBzbGlnaHRseSBsb3dlciB0aGFuIGZvclxuICAgKiBgdGV4dC1tb2RlcmF0aW9uLWxhdGVzdGAuXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAndGV4dC1tb2RlcmF0aW9uLWxhdGVzdCcgfCAndGV4dC1tb2RlcmF0aW9uLXN0YWJsZSc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZXJhdGlvbnMge1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb24gPSBNb2RlcmF0aW9uc0FQSS5Nb2RlcmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZSA9IE1vZGVyYXRpb25zQVBJLk1vZGVyYXRpb25DcmVhdGVSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9uQ3JlYXRlUGFyYW1zID0gTW9kZXJhdGlvbnNBUEkuTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4vY29yZSc7XG5pbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyB0eXBlIEFnZW50LCB0eXBlIFJlcXVlc3RJbml0IH0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuaW1wb3J0ICogYXMgVXBsb2FkcyBmcm9tICcuL3VwbG9hZHMnO1xuaW1wb3J0ICogYXMgUGFnaW5hdGlvbiBmcm9tICcuL3BhZ2luYXRpb24nO1xuaW1wb3J0ICogYXMgQVBJIGZyb20gJy4vcmVzb3VyY2VzL2luZGV4JztcblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfQVBJX0tFWSddLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX09SR19JRCddLlxuICAgKi9cbiAgb3JnYW5pemF0aW9uPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9QUk9KRUNUX0lEJ10uXG4gICAqL1xuICBwcm9qZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEksIGUuZy4sIFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdjIvXCJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9CQVNFX1VSTCddLlxuICAgKi9cbiAgYmFzZVVSTD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoYXQgdGhlIGNsaWVudCBzaG91bGQgd2FpdCBmb3IgYSByZXNwb25zZVxuICAgKiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIHRpbWluZyBvdXQgYSBzaW5nbGUgcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHJlcXVlc3QgdGltZW91dHMgYXJlIHJldHJpZWQgYnkgZGVmYXVsdCwgc28gaW4gYSB3b3JzdC1jYXNlIHNjZW5hcmlvIHlvdSBtYXkgd2FpdFxuICAgKiBtdWNoIGxvbmdlciB0aGFuIHRoaXMgdGltZW91dCBiZWZvcmUgdGhlIHByb21pc2Ugc3VjY2VlZHMgb3IgZmFpbHMuXG4gICAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBIVFRQIGFnZW50IHVzZWQgdG8gbWFuYWdlIEhUVFAoUykgY29ubmVjdGlvbnMuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYW4gYWdlbnQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBieSBkZWZhdWx0IGluIHRoZSBOb2RlLmpzIGVudmlyb25tZW50LFxuICAgKiBvdGhlcndpc2Ugbm8gYWdlbnQgaXMgdXNlZC5cbiAgICovXG4gIGh0dHBBZ2VudD86IEFnZW50O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgd2UgdXNlIGBub2RlLWZldGNoYCBvbiBOb2RlLmpzIGFuZCBvdGhlcndpc2UgZXhwZWN0IHRoYXQgYGZldGNoYCBpc1xuICAgKiBkZWZpbmVkIGdsb2JhbGx5LlxuICAgKi9cbiAgZmV0Y2g/OiBDb3JlLkZldGNoIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmV0cnkgYSByZXF1ZXN0IGluIGNhc2Ugb2YgYVxuICAgKiB0ZW1wb3JhcnkgZmFpbHVyZSwgbGlrZSBhIG5ldHdvcmsgZXJyb3Igb3IgYSA1WFggZXJyb3IgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICpcbiAgICogVGhlc2UgY2FuIGJlIHJlbW92ZWQgaW4gaW5kaXZpZHVhbCByZXF1ZXN0cyBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhlXG4gICAqIGhlYWRlciB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW4gcmVxdWVzdCBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEhlYWRlcnM/OiBDb3JlLkhlYWRlcnM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcXVlcnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKlxuICAgKiBUaGVzZSBjYW4gYmUgcmVtb3ZlZCBpbiBpbmRpdmlkdWFsIHJlcXVlc3RzIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGVcbiAgICogcGFyYW0gdG8gYHVuZGVmaW5lZGAgaW4gcmVxdWVzdCBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdFF1ZXJ5PzogQ29yZS5EZWZhdWx0UXVlcnk7XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlIHVzZSBvZiB0aGlzIGxpYnJhcnkgaXMgbm90IGFsbG93ZWQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXG4gICAqIE9ubHkgc2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcmlza3MgYW5kIGhhdmUgYXBwcm9wcmlhdGUgbWl0aWdhdGlvbnMgaW4gcGxhY2UuXG4gICAqL1xuICBkYW5nZXJvdXNseUFsbG93QnJvd3Nlcj86IGJvb2xlYW47XG59XG5cbi8qKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBPcGVuQUkgQVBJLiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5BSSBleHRlbmRzIENvcmUuQVBJQ2xpZW50IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgcHJvamVjdDogc3RyaW5nIHwgbnVsbDtcblxuICBwcml2YXRlIF9vcHRpb25zOiBDbGllbnRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBPcGVuQUkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpS2V5PXByb2Nlc3MuZW52WydPUEVOQUlfQVBJX0tFWSddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0cy5vcmdhbml6YXRpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9PUkdfSUQnXSA/PyBudWxsXVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRzLnByb2plY3Q9cHJvY2Vzcy5lbnZbJ09QRU5BSV9QUk9KRUNUX0lEJ10gPz8gbnVsbF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJhc2VVUkw9cHJvY2Vzcy5lbnZbJ09QRU5BSV9CQVNFX1VSTCddID8/IGh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjFdIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0PTEwIG1pbnV0ZXNdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGNsaWVudCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5odHRwQWdlbnRdIC0gQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKHMpIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge0NvcmUuRmV0Y2h9IFtvcHRzLmZldGNoXSAtIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1heFJldHJpZXM9Ml0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtDb3JlLkhlYWRlcnN9IG9wdHMuZGVmYXVsdEhlYWRlcnMgLSBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtDb3JlLkRlZmF1bHRRdWVyeX0gb3B0cy5kZWZhdWx0UXVlcnkgLSBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kYW5nZXJvdXNseUFsbG93QnJvd3Nlcj1mYWxzZV0gLSBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9CQVNFX1VSTCcpLFxuICAgIGFwaUtleSA9IENvcmUucmVhZEVudignT1BFTkFJX0FQSV9LRVknKSxcbiAgICBvcmdhbml6YXRpb24gPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9PUkdfSUQnKSA/PyBudWxsLFxuICAgIHByb2plY3QgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9QUk9KRUNUX0lEJykgPz8gbnVsbCxcbiAgICAuLi5vcHRzXG4gIH06IENsaWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChhcGlLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgXCJUaGUgT1BFTkFJX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZyBvciBlbXB0eTsgZWl0aGVyIHByb3ZpZGUgaXQsIG9yIGluc3RhbnRpYXRlIHRoZSBPcGVuQUkgY2xpZW50IHdpdGggYW4gYXBpS2V5IG9wdGlvbiwgbGlrZSBuZXcgT3BlbkFJKHsgYXBpS2V5OiAnTXkgQVBJIEtleScgfSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENsaWVudE9wdGlvbnMgPSB7XG4gICAgICBhcGlLZXksXG4gICAgICBvcmdhbml6YXRpb24sXG4gICAgICBwcm9qZWN0LFxuICAgICAgLi4ub3B0cyxcbiAgICAgIGJhc2VVUkw6IGJhc2VVUkwgfHwgYGh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjFgLFxuICAgIH07XG5cbiAgICBpZiAoIW9wdGlvbnMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgJiYgQ29yZS5pc1J1bm5pbmdJbkJyb3dzZXIoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgXCJJdCBsb29rcyBsaWtlIHlvdSdyZSBydW5uaW5nIGluIGEgYnJvd3Nlci1saWtlIGVudmlyb25tZW50LlxcblxcblRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cXG5JZiB5b3UgdW5kZXJzdGFuZCB0aGUgcmlza3MgYW5kIGhhdmUgYXBwcm9wcmlhdGUgbWl0aWdhdGlvbnMgaW4gcGxhY2UsXFxueW91IGNhbiBzZXQgdGhlIGBkYW5nZXJvdXNseUFsbG93QnJvd3NlcmAgb3B0aW9uIHRvIGB0cnVlYCwgZS5nLixcXG5cXG5uZXcgT3BlbkFJKHsgYXBpS2V5LCBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZSB9KTtcXG5cXG5odHRwczovL2hlbHAub3BlbmFpLmNvbS9lbi9hcnRpY2xlcy81MTEyNTk1LWJlc3QtcHJhY3RpY2VzLWZvci1hcGkta2V5LXNhZmV0eVxcblwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBiYXNlVVJMOiBvcHRpb25zLmJhc2VVUkwhLFxuICAgICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0ID8/IDYwMDAwMCAvKiAxMCBtaW51dGVzICovLFxuICAgICAgaHR0cEFnZW50OiBvcHRpb25zLmh0dHBBZ2VudCxcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgIH0pO1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gICAgdGhpcy5vcmdhbml6YXRpb24gPSBvcmdhbml6YXRpb247XG4gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgfVxuXG4gIGNvbXBsZXRpb25zOiBBUEkuQ29tcGxldGlvbnMgPSBuZXcgQVBJLkNvbXBsZXRpb25zKHRoaXMpO1xuICBjaGF0OiBBUEkuQ2hhdCA9IG5ldyBBUEkuQ2hhdCh0aGlzKTtcbiAgZW1iZWRkaW5nczogQVBJLkVtYmVkZGluZ3MgPSBuZXcgQVBJLkVtYmVkZGluZ3ModGhpcyk7XG4gIGZpbGVzOiBBUEkuRmlsZXMgPSBuZXcgQVBJLkZpbGVzKHRoaXMpO1xuICBpbWFnZXM6IEFQSS5JbWFnZXMgPSBuZXcgQVBJLkltYWdlcyh0aGlzKTtcbiAgYXVkaW86IEFQSS5BdWRpbyA9IG5ldyBBUEkuQXVkaW8odGhpcyk7XG4gIG1vZGVyYXRpb25zOiBBUEkuTW9kZXJhdGlvbnMgPSBuZXcgQVBJLk1vZGVyYXRpb25zKHRoaXMpO1xuICBtb2RlbHM6IEFQSS5Nb2RlbHMgPSBuZXcgQVBJLk1vZGVscyh0aGlzKTtcbiAgZmluZVR1bmluZzogQVBJLkZpbmVUdW5pbmcgPSBuZXcgQVBJLkZpbmVUdW5pbmcodGhpcyk7XG4gIGJldGE6IEFQSS5CZXRhID0gbmV3IEFQSS5CZXRhKHRoaXMpO1xuICBiYXRjaGVzOiBBUEkuQmF0Y2hlcyA9IG5ldyBBUEkuQmF0Y2hlcyh0aGlzKTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGVmYXVsdFF1ZXJ5KCk6IENvcmUuRGVmYXVsdFF1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5kZWZhdWx0UXVlcnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGVmYXVsdEhlYWRlcnMob3B0czogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zKTogQ29yZS5IZWFkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZGVmYXVsdEhlYWRlcnMob3B0cyksXG4gICAgICAnT3BlbkFJLU9yZ2FuaXphdGlvbic6IHRoaXMub3JnYW5pemF0aW9uLFxuICAgICAgJ09wZW5BSS1Qcm9qZWN0JzogdGhpcy5wcm9qZWN0LFxuICAgICAgLi4udGhpcy5fb3B0aW9ucy5kZWZhdWx0SGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGF1dGhIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYXBpS2V5fWAgfTtcbiAgfVxuXG4gIHN0YXRpYyBPcGVuQUkgPSB0aGlzO1xuXG4gIHN0YXRpYyBPcGVuQUlFcnJvciA9IEVycm9ycy5PcGVuQUlFcnJvcjtcbiAgc3RhdGljIEFQSUVycm9yID0gRXJyb3JzLkFQSUVycm9yO1xuICBzdGF0aWMgQVBJQ29ubmVjdGlvbkVycm9yID0gRXJyb3JzLkFQSUNvbm5lY3Rpb25FcnJvcjtcbiAgc3RhdGljIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgPSBFcnJvcnMuQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcjtcbiAgc3RhdGljIEFQSVVzZXJBYm9ydEVycm9yID0gRXJyb3JzLkFQSVVzZXJBYm9ydEVycm9yO1xuICBzdGF0aWMgTm90Rm91bmRFcnJvciA9IEVycm9ycy5Ob3RGb3VuZEVycm9yO1xuICBzdGF0aWMgQ29uZmxpY3RFcnJvciA9IEVycm9ycy5Db25mbGljdEVycm9yO1xuICBzdGF0aWMgUmF0ZUxpbWl0RXJyb3IgPSBFcnJvcnMuUmF0ZUxpbWl0RXJyb3I7XG4gIHN0YXRpYyBCYWRSZXF1ZXN0RXJyb3IgPSBFcnJvcnMuQmFkUmVxdWVzdEVycm9yO1xuICBzdGF0aWMgQXV0aGVudGljYXRpb25FcnJvciA9IEVycm9ycy5BdXRoZW50aWNhdGlvbkVycm9yO1xuICBzdGF0aWMgSW50ZXJuYWxTZXJ2ZXJFcnJvciA9IEVycm9ycy5JbnRlcm5hbFNlcnZlckVycm9yO1xuICBzdGF0aWMgUGVybWlzc2lvbkRlbmllZEVycm9yID0gRXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFcnJvcjtcbiAgc3RhdGljIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciA9IEVycm9ycy5VbnByb2Nlc3NhYmxlRW50aXR5RXJyb3I7XG5cbiAgc3RhdGljIHRvRmlsZSA9IFVwbG9hZHMudG9GaWxlO1xuICBzdGF0aWMgZmlsZUZyb21QYXRoID0gVXBsb2Fkcy5maWxlRnJvbVBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCB7XG4gIE9wZW5BSUVycm9yLFxuICBBUElFcnJvcixcbiAgQVBJQ29ubmVjdGlvbkVycm9yLFxuICBBUElDb25uZWN0aW9uVGltZW91dEVycm9yLFxuICBBUElVc2VyQWJvcnRFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgUmF0ZUxpbWl0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgUGVybWlzc2lvbkRlbmllZEVycm9yLFxuICBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IsXG59ID0gRXJyb3JzO1xuXG5leHBvcnQgaW1wb3J0IHRvRmlsZSA9IFVwbG9hZHMudG9GaWxlO1xuZXhwb3J0IGltcG9ydCBmaWxlRnJvbVBhdGggPSBVcGxvYWRzLmZpbGVGcm9tUGF0aDtcblxuZXhwb3J0IG5hbWVzcGFjZSBPcGVuQUkge1xuICBleHBvcnQgaW1wb3J0IFJlcXVlc3RPcHRpb25zID0gQ29yZS5SZXF1ZXN0T3B0aW9ucztcblxuICBleHBvcnQgaW1wb3J0IFBhZ2UgPSBQYWdpbmF0aW9uLlBhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgUGFnZVJlc3BvbnNlID0gUGFnaW5hdGlvbi5QYWdlUmVzcG9uc2U7XG5cbiAgZXhwb3J0IGltcG9ydCBDdXJzb3JQYWdlID0gUGFnaW5hdGlvbi5DdXJzb3JQYWdlO1xuICBleHBvcnQgaW1wb3J0IEN1cnNvclBhZ2VQYXJhbXMgPSBQYWdpbmF0aW9uLkN1cnNvclBhZ2VQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ3Vyc29yUGFnZVJlc3BvbnNlID0gUGFnaW5hdGlvbi5DdXJzb3JQYWdlUmVzcG9uc2U7XG5cbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IEFQSS5Db21wbGV0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uID0gQVBJLkNvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNob2ljZSA9IEFQSS5Db21wbGV0aW9uQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25Vc2FnZSA9IEFQSS5Db21wbGV0aW9uVXNhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IEFQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbiAgZXhwb3J0IGltcG9ydCBDaGF0ID0gQVBJLkNoYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdE1vZGVsID0gQVBJLkNoYXRNb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IEFQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IEFQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0O1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSA9IEFQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IEFQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwgPSBBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQVBJLkNoYXRDb21wbGV0aW9uUm9sZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgPSBBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbCA9IEFQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdzID0gQVBJLkVtYmVkZGluZ3M7XG4gIGV4cG9ydCBpbXBvcnQgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2UgPSBBUEkuQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nID0gQVBJLkVtYmVkZGluZztcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdDcmVhdGVQYXJhbXMgPSBBUEkuRW1iZWRkaW5nQ3JlYXRlUGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgRmlsZXMgPSBBUEkuRmlsZXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNvbnRlbnQgPSBBUEkuRmlsZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZURlbGV0ZWQgPSBBUEkuRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdCA9IEFQSS5GaWxlT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IEZpbGVPYmplY3RzUGFnZSA9IEFQSS5GaWxlT2JqZWN0c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEFQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gQVBJLkZpbGVMaXN0UGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VzID0gQVBJLkltYWdlcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZSA9IEFQSS5JbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZXNSZXNwb25zZSA9IEFQSS5JbWFnZXNSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyA9IEFQSS5JbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUVkaXRQYXJhbXMgPSBBUEkuSW1hZ2VFZGl0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlR2VuZXJhdGVQYXJhbXMgPSBBUEkuSW1hZ2VHZW5lcmF0ZVBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IEF1ZGlvID0gQVBJLkF1ZGlvO1xuXG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbnMgPSBBUEkuTW9kZXJhdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbiA9IEFQSS5Nb2RlcmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZSA9IEFQSS5Nb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyA9IEFQSS5Nb2RlcmF0aW9uQ3JlYXRlUGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxzID0gQVBJLk1vZGVscztcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IEFQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbERlbGV0ZWQgPSBBUEkuTW9kZWxEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsc1BhZ2UgPSBBUEkuTW9kZWxzUGFnZTtcblxuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmcgPSBBUEkuRmluZVR1bmluZztcblxuICBleHBvcnQgaW1wb3J0IEJldGEgPSBBUEkuQmV0YTtcblxuICBleHBvcnQgaW1wb3J0IEJhdGNoZXMgPSBBUEkuQmF0Y2hlcztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaCA9IEFQSS5CYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaEVycm9yID0gQVBJLkJhdGNoRXJyb3I7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hSZXF1ZXN0Q291bnRzID0gQVBJLkJhdGNoUmVxdWVzdENvdW50cztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaGVzUGFnZSA9IEFQSS5CYXRjaGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaENyZWF0ZVBhcmFtcyA9IEFQSS5CYXRjaENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaExpc3RQYXJhbXMgPSBBUEkuQmF0Y2hMaXN0UGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgRXJyb3JPYmplY3QgPSBBUEkuRXJyb3JPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25EZWZpbml0aW9uID0gQVBJLkZ1bmN0aW9uRGVmaW5pdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblBhcmFtZXRlcnMgPSBBUEkuRnVuY3Rpb25QYXJhbWV0ZXJzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF6dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEF6dXJlIE9wZW5BSSBBUEkuICovXG5leHBvcnQgaW50ZXJmYWNlIEF6dXJlQ2xpZW50T3B0aW9ucyBleHRlbmRzIENsaWVudE9wdGlvbnMge1xuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfVkVSU0lPTiddLlxuICAgKi9cbiAgYXBpVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogWW91ciBBenVyZSBlbmRwb2ludCwgaW5jbHVkaW5nIHRoZSByZXNvdXJjZSwgZS5nLiBgaHR0cHM6Ly9leGFtcGxlLXJlc291cmNlLmF6dXJlLm9wZW5haS5jb20vYFxuICAgKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbW9kZWwgZGVwbG95bWVudCwgaWYgZ2l2ZW4sIHNldHMgdGhlIGJhc2UgY2xpZW50IFVSTCB0byBpbmNsdWRlIGAvZGVwbG95bWVudHMve2RlcGxveW1lbnR9YC5cbiAgICogTm90ZTogdGhpcyBtZWFucyB5b3Ugd29uJ3QgYmUgYWJsZSB0byB1c2Ugbm9uLWRlcGxveW1lbnQgZW5kcG9pbnRzLiBOb3Qgc3VwcG9ydGVkIHdpdGggQXNzaXN0YW50cyBBUElzLlxuICAgKi9cbiAgZGVwbG95bWVudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9BUElfS0VZJ10uXG4gICAqL1xuICBhcGlLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFjY2VzcyB0b2tlbiBmb3IgTWljcm9zb2Z0IEVudHJhIChmb3JtZXJseSBrbm93biBhcyBBenVyZSBBY3RpdmUgRGlyZWN0b3J5KSxcbiAgICogd2hpY2ggd2lsbCBiZSBpbnZva2VkIG9uIGV2ZXJ5IHJlcXVlc3QuXG4gICAqL1xuICBhenVyZUFEVG9rZW5Qcm92aWRlcj86ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgQXp1cmUgT3BlbkFJIEFQSS4gKi9cbmV4cG9ydCBjbGFzcyBBenVyZU9wZW5BSSBleHRlbmRzIE9wZW5BSSB7XG4gIHByaXZhdGUgX2F6dXJlQURUb2tlblByb3ZpZGVyOiAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZGVwbG95bWVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcGlWZXJzaW9uOiBzdHJpbmcgPSAnJztcbiAgLyoqXG4gICAqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEF6dXJlIE9wZW5BSSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbb3B0cy5hcGlWZXJzaW9uPXByb2Nlc3MuZW52WydPUEVOQUlfQVBJX1ZFUlNJT04nXSA/PyB1bmRlZmluZWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbb3B0cy5lbmRwb2ludD1wcm9jZXNzLmVudlsnQVpVUkVfT1BFTkFJX0VORFBPSU5UJ10gPz8gdW5kZWZpbmVkXSAtIFlvdXIgQXp1cmUgZW5kcG9pbnQsIGluY2x1ZGluZyB0aGUgcmVzb3VyY2UsIGUuZy4gYGh0dHBzOi8vZXhhbXBsZS1yZXNvdXJjZS5henVyZS5vcGVuYWkuY29tL2BcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmFwaUtleT1wcm9jZXNzLmVudlsnQVpVUkVfT1BFTkFJX0FQSV9LRVknXSA/PyB1bmRlZmluZWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBvcHRzLmRlcGxveW1lbnQgLSBBIG1vZGVsIGRlcGxveW1lbnQsIGlmIGdpdmVuLCBzZXRzIHRoZSBiYXNlIGNsaWVudCBVUkwgdG8gaW5jbHVkZSBgL2RlcGxveW1lbnRzL3tkZXBsb3ltZW50fWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdHMub3JnYW5pemF0aW9uPXByb2Nlc3MuZW52WydPUEVOQUlfT1JHX0lEJ10gPz8gbnVsbF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJhc2VVUkw9cHJvY2Vzcy5lbnZbJ09QRU5BSV9CQVNFX1VSTCddXSAtIFNldHMgdGhlIGJhc2UgVVJMIGZvciB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZW91dD0xMCBtaW51dGVzXSAtIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoZSBjbGllbnQgd2lsbCB3YWl0IGZvciBhIHJlc3BvbnNlIGJlZm9yZSB0aW1pbmcgb3V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaHR0cEFnZW50XSAtIEFuIEhUVFAgYWdlbnQgdXNlZCB0byBtYW5hZ2UgSFRUUChzKSBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtDb3JlLkZldGNofSBbb3B0cy5mZXRjaF0gLSBTcGVjaWZ5IGEgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYXhSZXRyaWVzPTJdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBjbGllbnQgd2lsbCByZXRyeSBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7Q29yZS5IZWFkZXJzfSBvcHRzLmRlZmF1bHRIZWFkZXJzIC0gRGVmYXVsdCBoZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Q29yZS5EZWZhdWx0UXVlcnl9IG9wdHMuZGVmYXVsdFF1ZXJ5IC0gRGVmYXVsdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI9ZmFsc2VdIC0gQnkgZGVmYXVsdCwgY2xpZW50LXNpZGUgdXNlIG9mIHRoaXMgbGlicmFyeSBpcyBub3QgYWxsb3dlZCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVVJMID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfQkFTRV9VUkwnKSxcbiAgICBhcGlLZXkgPSBDb3JlLnJlYWRFbnYoJ0FaVVJFX09QRU5BSV9BUElfS0VZJyksXG4gICAgYXBpVmVyc2lvbiA9IENvcmUucmVhZEVudignT1BFTkFJX0FQSV9WRVJTSU9OJyksXG4gICAgZW5kcG9pbnQsXG4gICAgZGVwbG95bWVudCxcbiAgICBhenVyZUFEVG9rZW5Qcm92aWRlcixcbiAgICBkYW5nZXJvdXNseUFsbG93QnJvd3NlcixcbiAgICAuLi5vcHRzXG4gIH06IEF6dXJlQ2xpZW50T3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFhcGlWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICBcIlRoZSBPUEVOQUlfQVBJX1ZFUlNJT04gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZyBvciBlbXB0eTsgZWl0aGVyIHByb3ZpZGUgaXQsIG9yIGluc3RhbnRpYXRlIHRoZSBBenVyZU9wZW5BSSBjbGllbnQgd2l0aCBhbiBhcGlWZXJzaW9uIG9wdGlvbiwgbGlrZSBuZXcgQXp1cmVPcGVuQUkoeyBhcGlWZXJzaW9uOiAnTXkgQVBJIFZlcnNpb24nIH0pLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF6dXJlQURUb2tlblByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkYW5nZXJvdXNseUFsbG93QnJvd3NlciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFhenVyZUFEVG9rZW5Qcm92aWRlciAmJiAhYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICAnTWlzc2luZyBjcmVkZW50aWFscy4gUGxlYXNlIHBhc3Mgb25lIG9mIGBhcGlLZXlgIGFuZCBgYXp1cmVBRFRva2VuUHJvdmlkZXJgLCBvciBzZXQgdGhlIGBBWlVSRV9PUEVOQUlfQVBJX0tFWWAgZW52aXJvbm1lbnQgdmFyaWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGF6dXJlQURUb2tlblByb3ZpZGVyICYmIGFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgJ1RoZSBgYXBpS2V5YCBhbmQgYGF6dXJlQURUb2tlblByb3ZpZGVyYCBhcmd1bWVudHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTsgb25seSBvbmUgY2FuIGJlIHBhc3NlZCBhdCBhIHRpbWUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZGVmaW5lIGEgc2VudGluZWwgdmFsdWUgdG8gYXZvaWQgYW55IHR5cGluZyBpc3N1ZXNcbiAgICBhcGlLZXkgPz89IEFQSV9LRVlfU0VOVElORUw7XG5cbiAgICBvcHRzLmRlZmF1bHRRdWVyeSA9IHsgLi4ub3B0cy5kZWZhdWx0UXVlcnksICdhcGktdmVyc2lvbic6IGFwaVZlcnNpb24gfTtcblxuICAgIGlmICghYmFzZVVSTCkge1xuICAgICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgICBlbmRwb2ludCA9IHByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfRU5EUE9JTlQnXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICAgICdNdXN0IHByb3ZpZGUgb25lIG9mIHRoZSBgYmFzZVVSTGAgb3IgYGVuZHBvaW50YCBhcmd1bWVudHMsIG9yIHRoZSBgQVpVUkVfT1BFTkFJX0VORFBPSU5UYCBlbnZpcm9ubWVudCB2YXJpYWJsZScsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJhc2VVUkwgPSBgJHtlbmRwb2ludH0vb3BlbmFpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoJ2Jhc2VVUkwgYW5kIGVuZHBvaW50IGFyZSBtdXR1YWxseSBleGNsdXNpdmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBhcGlLZXksXG4gICAgICBiYXNlVVJMLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIC4uLihkYW5nZXJvdXNseUFsbG93QnJvd3NlciAhPT0gdW5kZWZpbmVkID8geyBkYW5nZXJvdXNseUFsbG93QnJvd3NlciB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYXp1cmVBRFRva2VuUHJvdmlkZXIgPSBhenVyZUFEVG9rZW5Qcm92aWRlcjtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSBhcGlWZXJzaW9uO1xuICAgIHRoaXMuX2RlcGxveW1lbnQgPSBkZXBsb3ltZW50O1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGRSZXF1ZXN0KG9wdGlvbnM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9uczx1bmtub3duPik6IHtcbiAgICByZXE6IFJlcXVlc3RJbml0O1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKF9kZXBsb3ltZW50c19lbmRwb2ludHMuaGFzKG9wdGlvbnMucGF0aCkgJiYgb3B0aW9ucy5tZXRob2QgPT09ICdwb3N0JyAmJiBvcHRpb25zLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFDb3JlLmlzT2JqKG9wdGlvbnMuYm9keSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXF1ZXN0IGJvZHkgdG8gYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2RlcGxveW1lbnQgfHwgb3B0aW9ucy5ib2R5Wydtb2RlbCddO1xuICAgICAgZGVsZXRlIG9wdGlvbnMuYm9keVsnbW9kZWwnXTtcbiAgICAgIGlmIChtb2RlbCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmJhc2VVUkwuaW5jbHVkZXMoJy9kZXBsb3ltZW50cycpKSB7XG4gICAgICAgIG9wdGlvbnMucGF0aCA9IGAvZGVwbG95bWVudHMvJHttb2RlbH0ke29wdGlvbnMucGF0aH1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuYnVpbGRSZXF1ZXN0KG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0QXp1cmVBRFRva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9henVyZUFEVG9rZW5Qcm92aWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLl9henVyZUFEVG9rZW5Qcm92aWRlcigpO1xuICAgICAgaWYgKCF0b2tlbiB8fCB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkICdhenVyZUFEVG9rZW5Qcm92aWRlcicgYXJndW1lbnQgdG8gcmV0dXJuIGEgc3RyaW5nIGJ1dCBpdCByZXR1cm5lZCAke3Rva2VufWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXV0aEhlYWRlcnMob3B0czogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zKTogQ29yZS5IZWFkZXJzIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcHJlcGFyZU9wdGlvbnMob3B0czogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdHMuaGVhZGVycz8uWydBdXRob3JpemF0aW9uJ10gfHwgb3B0cy5oZWFkZXJzPy5bJ2FwaS1rZXknXSkge1xuICAgICAgcmV0dXJuIHN1cGVyLnByZXBhcmVPcHRpb25zKG9wdHMpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuX2dldEF6dXJlQURUb2tlbigpO1xuICAgIG9wdHMuaGVhZGVycyA/Pz0ge307XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hcGlLZXkgIT09IEFQSV9LRVlfU0VOVElORUwpIHtcbiAgICAgIG9wdHMuaGVhZGVyc1snYXBpLWtleSddID0gdGhpcy5hcGlLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoJ1VuYWJsZSB0byBoYW5kbGUgYXV0aCcpO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucHJlcGFyZU9wdGlvbnMob3B0cyk7XG4gIH1cbn1cblxuY29uc3QgX2RlcGxveW1lbnRzX2VuZHBvaW50cyA9IG5ldyBTZXQoW1xuICAnL2NvbXBsZXRpb25zJyxcbiAgJy9jaGF0L2NvbXBsZXRpb25zJyxcbiAgJy9lbWJlZGRpbmdzJyxcbiAgJy9hdWRpby90cmFuc2NyaXB0aW9ucycsXG4gICcvYXVkaW8vdHJhbnNsYXRpb25zJyxcbiAgJy9hdWRpby9zcGVlY2gnLFxuICAnL2ltYWdlcy9nZW5lcmF0aW9ucycsXG4gICcvYmF0Y2hlcycsXG5dKTtcblxuY29uc3QgQVBJX0tFWV9TRU5USU5FTCA9ICc8TWlzc2luZyBLZXk+JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgQXp1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZGVmYXVsdCBPcGVuQUk7XG4iLCAiaW1wb3J0IHsgYXZhaWxhYmxlQ2hhdE1vZGVscywgYXZhaWxhYmxlQ29tcGxldGlvbk1vZGVscyB9IGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IHsgT3BlbkFJIH0gZnJvbSAnb3BlbmFpJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuXG5cblxuLy8gVE9ETzpcbi8vIC0gY3VzdG9tIHRlbXBlcmF0dXJlXG4vLyAtIGN1c3RvbSBzeXN0ZW0gcHJvbXB0ICg/KVxuLy8gLSBhdXRvbWF0aWMgZGVjayBhbGxvY2F0aW9uXG4vLyAtIGNsb3plIGNhcmRzIGNyZWF0aW9uXG5cbmNsYXNzIE9wZW5BSUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk9wZW5BSUVycm9yXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRleHRBZnRlckZsYXNoY2FyZHModGV4dDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm4gPSAvI2ZsYXNoY2FyZHMuKlxcbi87XG4gIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaChwYXR0ZXJuKTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBzdGFydElkeCA9IG1hdGNoLmluZGV4ISArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoc3RhcnRJZHgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlubGluZUNhcmRzUHJvbXB0KHNlcDogc3RyaW5nLCBmbGFzaGNhcmRzQ291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgWW91IHdpbGwgYmUgcHJvdmlkZWQgd2l0aCBhIG5vdGUuIEF0IHRoZSBlbmQgb2YgdGhlIG5vdGUgYXJlIHNvbWUgZmxhc2hjYXJkcy4gSWRlbnRpZnkgd2hpY2ggYXJlIHRoZSBtb3N0IGltcG9ydGFudCBjb25jZXB0cyB3aXRoaW4gdGhlIG5vdGUgYW5kIGdlbmVyYXRlIGV4YWN0bHkgJHtmbGFzaGNhcmRzQ291bnR9IG5ldyBvcmlnaW5hbCBmbGFzaGNhcmQgaW4gdGhlIGZvcm1hdCBcXFwicXVlc3Rpb24gJHtzZXB9IGFuc3dlclxcXCIuIFN0cmljdGx5IHVzZSAke3NlcH0gdG8gc2VwYXJhdGUgYSBxdWVzdGlvbiBmcm9tIGl0cyBhbnN3ZXIuIFNlcGFyYXRlIGZsYXNoY2FyZHMgd2l0aCBhIHNpbmdsZSBlbXB0eSBsaW5lLiBBbiBleGFtcGxlIGlzIFxcXCJXaGF0IGlzIGNoZW1pY2FsIGZvcm11bGEgb2Ygd2F0ZXIgJHtzZXB9IEgyT1xcXCIuIERvIG5vdCB1c2UgYW55IHByZWZpeCB0ZXh0LCBzdGFydCBnZW5lcmF0aW5nIHJpZ2h0IGF3YXkuIFRyeSB0byBtYWtlIHRoZW0gYXMgYXRvbWljIGFzIHBvc3NpYmxlLCBidXQgc3RpbGwgY2hhbGxlbmdpbmcgYW5kIHJpY2ggb2YgaW5mb3JtYXRpb24uIERvIG5vdCByZXBlYXQgb3IgcmVwaHJhc2UgZmxhc2hjYXJkcy4gRm9jdXMgb24gaW1wb3J0YW50IGxhdGV4IGZvcm11bGFzIGFuZCBlcXVhdGlvbnMuIFR5cGVzZXQgZXF1YXRpb25zIGFuZCBtYXRoIGZvcm11bGFzIGNvcnJlY3RseSAodGhhdCBpcyB1c2luZyB0aGUgXFwkIHN5bWJvbCB3aXRob3V0IHRyYWlsaW5nIHNwYWNlcylgO1xufVxuXG5mdW5jdGlvbiBtdWx0aWxpbmVDYXJkc1Byb21wdChzZXA6IHN0cmluZywgZmxhc2hjYXJkc0NvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFlvdSB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBub3RlLiBBdCB0aGUgZW5kIG9mIHRoZSBub3RlIGFyZSBzb21lIGZsYXNoY2FyZHMuIElkZW50aWZ5IHdoaWNoIGFyZSB0aGUgbW9zdCBpbXBvcnRhbnQgY29uY2VwdHMgd2l0aGluIHRoZSBub3RlIGFuZCBnZW5lcmF0ZSBleGFjdGx5ICR7Zmxhc2hjYXJkc0NvdW50fSBuZXcgb3JpZ2luYWwgZmxhc2hjYXJkIGluIHRoZSBmb3JtYXQgXFxcInF1ZXN0aW9uPG5ld2xpbmU+JHtzZXB9PG5ld2xpbmU+YW5zd2VyXFxcIiwgd2hlcmUgPG5ld2xpbmU+IGlzIGEgbmV3bGluZS4gVGhlIHF1ZXN0aW9uIGNhbm5vdCBzdGFydCB3aXRoIHNwZWNpYWwgc3ltYm9scyBvciBudW1iZXJzLiBEbyBub3QgYWRkIHRyYWlsaW5nIHNwYWNlcy4gU2VwYXJhdGUgaW52aWRpdnVhbCBmbGFzaGNhcmRzIHdpdGggYSBzaW5nbGUgZW1wdHkgbGluZS4gQW4gZXhhbXBsZSBpcyBcXFwiV2hhdCBpcyBjaGVtaWNhbCBmb3JtdWxhIG9mIHdhdGVyXFxcXG4ke3NlcH1cXFxcbkgyT1xcXCIuIERvIG5vdCB1c2UgYW55IHByZWZpeCB0ZXh0LCBzdGFydCBnZW5lcmF0aW5nIHJpZ2h0IGF3YXkuIFRoZSBmbGFzaGNhcmRzIGNhbiBiZSBhcyBjb21wbGV4IGFzIG5lZWRlZCwgYnV0IGhhdmUgdG8gYmUgcmljaCBvZiBpbmZvcm1hdGlvbiBhbmQgY2hhbGxlbmdpbmcuIERvIG5vdCByZXBlYXQgb3IgcmVwaHJhc2UgZmxhc2hjYXJkcy4gVHlwZXNldCBlcXVhdGlvbnMgYW5kIG1hdGggZm9ybXVsYXMgY29ycmVjdGx5ICh0aGF0IGlzIHVzaW5nIHRoZSBcXCQgc3ltYm9sIHdpdGhvdXQgdHJhaWxpbmcgc3BhY2VzKWA7XG59XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBnZW5lcmF0ZUZsYXNoY2FyZHMoXG4gIHRleHQ6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmcsXG4gIG1vZGVsOiBzdHJpbmcgPSBcImdwdC00b1wiLFxuICBzZXA6IHN0cmluZyA9IFwiOjpcIixcbiAgZmxhc2hjYXJkc0NvdW50OiBudW1iZXIgPSAzLFxuICBhZGRpdGlvbmFsSW5mbzogc3RyaW5nID0gXCJcIixcbiAgbWF4VG9rZW5zOiBudW1iZXIgPSAzMDAsXG4gIG11bHRpbGluZTogYm9vbGVhbiA9IGZhbHNlLFxuICBzdHJlYW06IGJvb2xlYW4gPSB0cnVlXG4pIHtcblxuICBjb25zdCBvcGVuYWkgPSBuZXcgT3BlbkFJKHtcbiAgICBhcGlLZXk6IGFwaUtleSxcbiAgICBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBjbGVhbmVkVGV4dCA9IHRleHQucmVwbGFjZSgvPCEtLS4qLS0+W1xcbl0/L2csIFwiXCIpO1xuICBjb25zdCBmbGFzaGNhcmRUZXh0ID0gY2xlYW5lZFRleHRcblxuICBsZXQgYmFzZVByb21wdCA9IG11bHRpbGluZSA/IG11bHRpbGluZUNhcmRzUHJvbXB0KHNlcCwgZmxhc2hjYXJkc0NvdW50KSA6IGlubGluZUNhcmRzUHJvbXB0KHNlcCwgZmxhc2hjYXJkc0NvdW50KSBcblxuICBpZiAoYWRkaXRpb25hbEluZm8pIHtcbiAgICBiYXNlUHJvbXB0ID0gYmFzZVByb21wdCArXG4gICAgICBgXFxuQWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0YXNrIChpZ25vcmUgYW55dGhpbmcgdW5yZWxhdGVkIHRvIFxcXG4gICAgdGhlIG9yaWdpbmFsIHRhc2spOiAke2FkZGl0aW9uYWxJbmZvfWBcbiAgfVxuXG4gIGxldCBjaGF0TW9kZWxzID0gYXZhaWxhYmxlQ2hhdE1vZGVscygpXG4gIGxldCBjb21wbGV0aW9uTW9kZWxzID0gYXZhaWxhYmxlQ29tcGxldGlvbk1vZGVscygpXG4gIGxldCByZXNwb25zZSA9IG51bGw7XG5cbiAgaWYgKGNoYXRNb2RlbHMuaW5jbHVkZXMobW9kZWwpKSB7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBvcGVuYWkuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUoe1xuICAgICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgICAgICB0ZW1wZXJhdHVyZTogMC43LFxuICAgICAgICAgIG1heF90b2tlbnM6IG1heFRva2VucyxcbiAgICAgICAgICBmcmVxdWVuY3lfcGVuYWx0eTogMCxcbiAgICAgICAgICBwcmVzZW5jZV9wZW5hbHR5OiAwLFxuICAgICAgICAgIHRvcF9wOiAxLjAsXG4gICAgICAgICAgbWVzc2FnZXM6IFt7cm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogYmFzZVByb21wdH0sIHtyb2xlOiBcInVzZXJcIiwgY29udGVudDogZmxhc2hjYXJkVGV4dH1dLFxuICAgICAgICAgIHN0cmVhbTogc3RyZWFtXG4gICAgICB9LCB7IHRpbWVvdXQ6IDYwMDAwIH0pO1xuXG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgYXMgT3BlbkFJLkNoYXRDb21wbGV0aW9uXG4gICAgICByZXNwb25zZSA9IHJlc3BvbnNlPy5jaG9pY2VzWzBdPy5tZXNzYWdlPy5jb250ZW50Py50cmltKCkgPz8gbnVsbDtcbiAgICAgIHlpZWxkIHJlc3BvbnNlIHx8ICcnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgYXMgQXN5bmNJdGVyYWJsZTxPcGVuQUkuQ2hhdENvbXBsZXRpb25DaHVuaz5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgeWllbGQgY2h1bmsuY2hvaWNlc1swXT8uZGVsdGE/LmNvbnRlbnQgfHwgJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlbCBuYW1lICR7bW9kZWx9YClcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXCJObyByZXNwb25zZSByZWNlaXZlZCBmcm9tIE9wZW5BSSBBUElcIik7XG4gICAgY29uc29sZS5sb2cocmVzcG9uc2UpXG4gIH1cblxuICByZXR1cm5cbn1cbiIsICJpbXBvcnQgeyBBcHAsIE1vZGFsLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCJcbmltcG9ydCB7IEZsYXNoY2FyZHNTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCJcbmltcG9ydCBGbGFzaGNhcmRzTExNUGx1Z2luIGZyb20gXCIuL21haW5cIlxuXG5cbmV4cG9ydCBjbGFzcyBJbnB1dE1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICBwbHVnaW46IEZsYXNoY2FyZHNMTE1QbHVnaW5cbiAgY29uZmlndXJhdGlvbjogRmxhc2hjYXJkc1NldHRpbmdzO1xuICBtdWx0aWxpbmU6IGJvb2xlYW47XG4gIGtleXByZXNzZWQ6IGJvb2xlYW47XG4gIG9uU3VibWl0OiAoY29uZmlndXJhdGlvbjogRmxhc2hjYXJkc1NldHRpbmdzLCBtdWx0aWxpbmU6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRmxhc2hjYXJkc0xMTVBsdWdpbiwgb25TdWJtaXQ6IChjb25maWd1cmF0aW9uOiBGbGFzaGNhcmRzU2V0dGluZ3MsIG11bHRpbGluZTogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIHN1cGVyKGFwcCk7XG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgdGhpcy5vblN1Ym1pdCA9IG9uU3VibWl0O1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IHsgLi4udGhpcy5wbHVnaW4uc2V0dGluZ3MgfTtcbiAgICB0aGlzLmtleXByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uT3BlbigpIHtcbiAgICBsZXQgeyAgY29udGVudEVsLCBjb250YWluZXJFbCwgbW9kYWxFbCB9ID0gdGhpcztcbiAgICBjb250ZW50RWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiUHJvbXB0IGNvbmZpZ3VyYXRpb25cIiB9KTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcbiAgICAuc2V0TmFtZShcIk51bWJlciBvZiBmbGFzaGNhcmRzIHRvIGdlbmVyYXRlXCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0VmFsdWUodGhpcy5jb25maWd1cmF0aW9uLmZsYXNoY2FyZHNDb3VudC50b1N0cmluZygpKVxuICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZmxhc2hjYXJkc0NvdW50ID0gTnVtYmVyKHZhbHVlKVxuICAgICAgICAvLyBUT0RPOiBjaGVjayBpbnB1dFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGVudEVsKVxuICAgIC5zZXROYW1lKFwiRmxhc2hjYXJkcyB0YWdcIilcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgIHRleHRcbiAgICAgIC5zZXRQbGFjZWhvbGRlcihcIiNmbGFzaGNhcmRzXCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGFnKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24udGFnID0gdmFsdWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcbiAgICAuc2V0TmFtZShcIkFkZGl0aW9uYWwgcHJvbXB0XCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0VmFsdWUodGhpcy5jb25maWd1cmF0aW9uLmFkZGl0aW9uYWxQcm9tcHQpXG4gICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRpdGlvbmFsUHJvbXB0ID0gdmFsdWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcbiAgICAgIC5zZXROYW1lKFwiTXVsdGlsaW5lXCIpXG4gICAgICAuYWRkVG9nZ2xlKChvbikgPT4gXG4gICAgICAgIG9uXG4gICAgICAgIC5zZXRWYWx1ZShmYWxzZSlcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChvbikgPT4ge1xuICAgICAgICAgIHRoaXMubXVsdGlsaW5lID0gb25cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250ZW50RWwpXG4gICAgICAuYWRkQnV0dG9uKChidG4pID0+IFxuICAgICAgICBidG5cbiAgICAgICAgLnNldEJ1dHRvblRleHQoXCJTdWJtaXRcIilcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKHtrZXl9KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgLy8gSGFjayB0byBtYWtlIHRoZSBrZXlwcmVzcyB3b3JrIHJlbGlhYmx5OlxuICAgICAgICAvLyB3aXRob3V0IHRoaXMgKGZvciBleGFtcGxlKSBpdCByZWdpc3RlcnMgdGhlIEtFWVVQIGV2ZW50IGZyb21cbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBpc3N1ZWQgdGhlIGNvbW1hbmQgZnJvbSB0aGUgY29tbWFuZCBwYWxldHRlXG4gICAgICAgIGlmICh0aGlzLmtleXByZXNzZWQpIHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMua2V5cHJlc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG4gIFxuICBzdWJtaXQoKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIHRoaXMub25TdWJtaXQodGhpcy5jb25maWd1cmF0aW9uLCB0aGlzLm11bHRpbGluZSk7XG4gIH1cblxuICBvbkNsb3NlKCkge1xuICAgIGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgYXZhaWxhYmxlQ2hhdE1vZGVscywgYXZhaWxhYmxlQ29tcGxldGlvbk1vZGVscyB9IGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IEZsYXNoY2FyZHNMTE1QbHVnaW4gZnJvbSBcIi4vbWFpblwiXG5cbi8vIFRPRE86XG4vLyAtIG1ha2UgYWRkaXRpb25hbCBwcm9tcHQgYSByZXNpemFibGUgdGV4dGFyZWFcblxuZXhwb3J0IGludGVyZmFjZSBGbGFzaGNhcmRzU2V0dGluZ3Mge1xuICBhcGlLZXk6IHN0cmluZztcbiAgbW9kZWw6IHN0cmluZztcbiAgaW5saW5lU2VwYXJhdG9yOiBzdHJpbmc7XG4gIG11bHRpbGluZVNlcGFyYXRvcjogc3RyaW5nO1xuICBmbGFzaGNhcmRzQ291bnQ6IG51bWJlcjtcbiAgYWRkaXRpb25hbFByb21wdDogc3RyaW5nO1xuICBtYXhUb2tlbnM6IG51bWJlcjtcbiAgc3RyZWFtaW5nOiBib29sZWFuO1xuICBoaWRlSW5QcmV2aWV3OiBib29sZWFuO1xuICB0YWc6IHN0cmluZztcbn1cblxuXG5leHBvcnQgY2xhc3MgRmxhc2hjYXJkc1NldHRpbmdzVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHBsdWdpbjogRmxhc2hjYXJkc0xMTVBsdWdpbjtcblxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBGbGFzaGNhcmRzTExNUGx1Z2luKSB7XG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICB9XG5cbiAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgY29udGFpbmVyRWwuZW1wdHkoKTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiTW9kZWwgc2V0dGluZ3NcIn0pXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIk9wZW5BSSBBUEkga2V5XCIpXG4gICAgLnNldERlc2MoXCJFbnRlciB5b3VyIE9wZW5BSSBBUEkga2V5XCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCJBUEkga2V5XCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpS2V5KVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlLZXkgPSB2YWx1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIk1vZGVsXCIpXG4gICAgLnNldERlc2MoXCJXaGljaCBsYW5ndWFnZSBtb2RlbCB0byB1c2VcIilcbiAgICAuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PlxuICAgICAgZHJvcGRvd25cbiAgICAgIC5hZGRPcHRpb25zKE9iamVjdC5mcm9tRW50cmllcyhhdmFpbGFibGVDb21wbGV0aW9uTW9kZWxzKCkubWFwKGsgPT4gW2ssIGtdKSkpXG4gICAgICAuYWRkT3B0aW9ucyhPYmplY3QuZnJvbUVudHJpZXMoYXZhaWxhYmxlQ2hhdE1vZGVscygpLm1hcChrID0+IFtrLCBrXSkpKVxuICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm1vZGVsKVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb2RlbCA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwge3RleHQ6IFwiUHJlZmVyZW5jZXNcIn0pXG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIlNlcGFyYXRvciBmb3IgaW5saW5lIGZsYXNoY2FyZHNcIilcbiAgICAuc2V0RGVzYyhcIk5vdGUgdGhhdCBhZnRlciBjaGFuZ2luZyB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGVkaXQgYW55IGZsYXNoY2FyZHMgeW91IGFscmVhZHkgaGF2ZVwiKVxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgdGV4dFxuICAgICAgLnNldFBsYWNlaG9sZGVyKFwiOjpcIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5pbmxpbmVTZXBhcmF0b3IpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmlubGluZVNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIlNlcGFyYXRvciBmb3IgbXVsdGktbGluZSBmbGFzaGNhcmRzXCIpXG4gICAgLnNldERlc2MoXCJOb3RlIHRoYXQgYWZ0ZXIgY2hhbmdpbmcgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBlZGl0IGFueSBmbGFzaGNhcmRzIHlvdSBhbHJlYWR5IGhhdmVcIilcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgIHRleHRcbiAgICAgIC5zZXRQbGFjZWhvbGRlcihcIj9cIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5tdWx0aWxpbmVTZXBhcmF0b3IpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm11bHRpbGluZVNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgIC5zZXROYW1lKFwiRmxhc2hjYXJkcyB0YWdcIilcbiAgICAuc2V0RGVzYyhcIlNldCB3aGljaCB0YWcgdG8gYXBwZW5kIHVwb24gZmxhc2hjYXJkcyBnZW5lcmF0aW9uLiBcIiArXG4gICAgICBcIlNlZSB0aGUgU3BhY2VkIFJlcGV0aXRpb24gcGx1Z2luIGZvciBkZXRhaWxzXCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCIjZmxhc2hjYXJkc1wiKVxuICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhZylcbiAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MudGFnID0gdmFsdWU7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgLnNldE5hbWUoXCJOdW1iZXIgb2YgZmxhc2hjYXJkcyB0byBnZW5lcmF0ZVwiKVxuICAgIC5zZXREZXNjKFwiU2V0IHRoaXMgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBmbGFzaGNhcmRzIHRoZSBtb2RlbCBzaG91bGQgXCIrXG4gICAgICBcImdlbmVyYXRlIGVhY2ggdGltZSBhIG5ldyBgR2VuZXJhdGUgRmxhc2hjYXJkc2AgY29tbWFuZCBpcyBpc3N1ZWRcIilcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgIHRleHRcbiAgICAgIC5zZXRQbGFjZWhvbGRlcihcIjNcIilcbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5mbGFzaGNhcmRzQ291bnQudG9TdHJpbmcoKSlcbiAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZmxhc2hjYXJkc0NvdW50ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cblxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgIC5zZXROYW1lKFwiQWRkaXRpb25hbCBwcm9tcHRcIilcbiAgICAuc2V0RGVzYyhcIlByb3ZpZGUgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgdG8gdGhlIGxhbmd1YWdlIG1vZGVsXCIpXG4gICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICB0ZXh0XG4gICAgICAuc2V0UGxhY2Vob2xkZXIoXCJBZGRpdGlvbmFsIGluc3RydWN0aW9uc1wiKVxuICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZGl0aW9uYWxQcm9tcHQpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZGl0aW9uYWxQcm9tcHQgPSB2YWx1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAuc2V0TmFtZShcIk1heGltdW0gb3V0cHV0IHRva2Vuc1wiKVxuICAgIC5zZXREZXNjKFwiU2V0IHRoaXMgdG8gdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgdGhlIG1vZGVsIGNhbiBnZW5lcmF0ZVwiKVxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgdGV4dFxuICAgICAgLnNldFBsYWNlaG9sZGVyKFwiMzAwXCIpXG4gICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubWF4VG9rZW5zLnRvU3RyaW5nKCkpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLm1heFRva2VucyA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgLnNldE5hbWUoXCJTdHJlYW1pbmdcIilcbiAgICAuc2V0RGVzYyhcIkVuYWJsZS9EaXNhYmxlIHN0cmVhbWluZyB0ZXh0IGNvbXBsZXRpb25cIilcbiAgICAuYWRkVG9nZ2xlKChvbikgPT4gXG4gICAgICBvblxuICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnN0cmVhbWluZylcbiAgICAgIC5vbkNoYW5nZShhc3luYyAob24pID0+IHtcbiAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RyZWFtaW5nID0gb247XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgLnNldE5hbWUoXCJIaWRlIGZsYXNoY2FyZHMgaW4gcHJldmlldyBtb2RlXCIpXG4gICAgLnNldERlc2MoXCJJZiBlbmFibGVkLCB5b3Ugd29uJ3Qgc2VlIGZsYXNoY2FyZHMgd2hlbiBpbiBwcmV2aWV3IG1vZGUsIFwiXG4gICAgICArIFwiYnV0IHlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZWRpdCB0aGVtXCIpXG4gICAgLmFkZFRvZ2dsZSgob24pID0+IFxuICAgICAgb25cbiAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlSW5QcmV2aWV3KVxuICAgICAgLm9uQ2hhbmdlKGFzeW5jIChvbikgPT4ge1xuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWRlSW5QcmV2aWV3ID0gb247XG5cbiAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgICAgdmlldy5wcmV2aWV3TW9kZS5yZXJlbmRlcih0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7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Q0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUVBLFVBQUksY0FBYztBQVdsQixxQkFBZTtBQUFBO0FBQUEsSUFBUztBQUFBO0FBQUE7QUFFeEIsYUFBTyxVQUFVLE9BQU8sU0FBUyxDQUFDO0FBQ2xDLGFBQU8sYUFBYSxhQUFhLE9BQU8sVUFBVSxDQUFDO0FBRW5ELGFBQU8sVUFBVSxPQUFPLFNBQVMsQ0FBQztBQUNsQyxxQkFBZSxRQUFRLHFCQUFxQjtBQUMxQyxlQUFPLEtBQUssUUFBUSxPQUFPLE1BQU07QUFDakMsZUFBTyxhQUFhLE1BQU0sT0FBTyxVQUFVLENBQUM7QUFDNUMsY0FBTSxTQUFpQixPQUFPLFlBQVksT0FBTyxVQUFVLENBQUM7QUFDNUQsY0FBTSxjQUE4QixPQUFPLFlBQVksU0FBUyxLQUFLLE1BQU07QUFDM0UsZUFBTyxVQUFVLFdBQVc7QUFBQSxNQUM5QjtBQUNBLFVBQUksd0JBQU8sbUNBQW1DO0FBQUEsSUFFaEQsU0FBUyxPQUFQO0FBQ0EsY0FBUSxNQUFNLGdDQUFnQyxLQUFLO0FBQ25ELFVBQUksd0JBQU8sMkVBQTJFO0FBQUEsSUFDeEY7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFFWDtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ25CLFNBQUssV0FBVyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDM0U7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNuQixVQUFNLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFBQSxFQUNuQztBQUNGOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfb2JzaWRpYW4iLCAiZmV0Y2giLCAiUmVxdWVzdCIsICJSZXNwb25zZSIsICJIZWFkZXJzIiwgIkZvcm1EYXRhIiwgIkJsb2IiLCAiRmlsZSIsICJSZWFkYWJsZVN0cmVhbSIsICJSZWFkYWJsZVN0cmVhbSIsICJfYSIsICJzdHIiLCAiX2EiLCAiRmlsZSIsICJGb3JtRGF0YSIsICJmZXRjaCIsICJvcHRzIiwgIlBhZ2UiLCAiX2EiLCAicmV0cnlNZXNzYWdlIiwgIl9hIiwgIl9hIiwgIl9hIiwgIl9hIiwgIkNvbXBsZXRpb25zIiwgIkNoYXQiLCAiU3BlZWNoIiwgIlRyYW5zY3JpcHRpb25zIiwgIlRyYW5zbGF0aW9ucyIsICJBdWRpbyIsICJCYXRjaGVzIiwgIkFzc2lzdGFudHMiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9hIiwgImNvbnRlbnQiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfZ2V0RmluYWxNZXNzYWdlIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2dldEZpbmFsRnVuY3Rpb25DYWxsIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2dldEZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0IiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2NhbGN1bGF0ZVRvdGFsVXNhZ2UiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfdmFsaWRhdGVQYXJhbXMiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiX2EiLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2JlZ2luUmVxdWVzdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9DaGF0Q29tcGxldGlvblN0cmVhbV9hZGRDaHVuayIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fZW5kUmVxdWVzdCIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fYWNjdW11bGF0ZUNoYXRDb21wbGV0aW9uIiwgImNvbnRlbnQiLCAicmVzdCIsICJfYiIsICJpbmRleCIsICJfYyIsICJjaHVuayIsICJpZCIsICJDb21wbGV0aW9ucyIsICJDaGF0IiwgIkNvbXBsZXRpb25zIiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJjaHVuayIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9hIiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX0Fzc2lzdGFudFN0cmVhbV9lbmRSZXF1ZXN0IiwgIl9Bc3Npc3RhbnRTdHJlYW1faGFuZGxlTWVzc2FnZSIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZVJ1blN0ZXAiLCAiX0Fzc2lzdGFudFN0cmVhbV9oYW5kbGVFdmVudCIsICJfQXNzaXN0YW50U3RyZWFtX2FjY3VtdWxhdGVSdW5TdGVwIiwgIl9Bc3Npc3RhbnRTdHJlYW1fYWNjdW11bGF0ZU1lc3NhZ2UiLCAiX0Fzc2lzdGFudFN0cmVhbV9hY2N1bXVsYXRlQ29udGVudCIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZVJ1biIsICJNZXNzYWdlcyIsICJTdGVwcyIsICJfYSIsICJSdW5zIiwgIl9hIiwgIlRocmVhZHMiLCAiRmlsZXMiLCAiX2EiLCAiRmlsZUJhdGNoZXMiLCAiVmVjdG9yU3RvcmVzIiwgIkNoYXQiLCAiQmV0YSIsICJDb21wbGV0aW9ucyIsICJfYSIsICJFbWJlZGRpbmdzIiwgIkZpbGVzIiwgIkNoZWNrcG9pbnRzIiwgIkpvYnMiLCAiRmluZVR1bmluZyIsICJJbWFnZXMiLCAiTW9kZWxzIiwgIk1vZGVyYXRpb25zIiwgIl9hIiwgIkNvbXBsZXRpb25zIiwgIkZpbGVzIiwgIk9wZW5BSUVycm9yIiwgIkFQSUVycm9yIiwgIkFQSUNvbm5lY3Rpb25FcnJvciIsICJBUElDb25uZWN0aW9uVGltZW91dEVycm9yIiwgIkFQSVVzZXJBYm9ydEVycm9yIiwgIk5vdEZvdW5kRXJyb3IiLCAiQ29uZmxpY3RFcnJvciIsICJSYXRlTGltaXRFcnJvciIsICJCYWRSZXF1ZXN0RXJyb3IiLCAiQXV0aGVudGljYXRpb25FcnJvciIsICJJbnRlcm5hbFNlcnZlckVycm9yIiwgIlBlcm1pc3Npb25EZW5pZWRFcnJvciIsICJVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IiLCAiT3BlbkFJIiwgIkNvbXBsZXRpb25zIiwgIkZpbGVzIiwgIk9wZW5BSUVycm9yIiwgIl9hIiwgIk9wZW5BSUVycm9yIiwgIm9uIiwgImltcG9ydF9vYnNpZGlhbiIsICJvbiIsICJfYSJdCn0K diff --git a/src/components.ts b/src/components.ts index 54f8686..2c3d75a 100644 --- a/src/components.ts +++ b/src/components.ts @@ -33,6 +33,17 @@ export class InputModal extends Modal { }) ); + new Setting(contentEl) + .setName("Flashcards tag") + .addText((text) => + text + .setPlaceholder("#flashcards") + .setValue(this.plugin.settings.tag) + .onChange(async (value) => { + this.configuration.tag = value + }) + ); + new Setting(contentEl) .setName("Additional prompt") .addText((text) => diff --git a/src/main.ts b/src/main.ts index d347b1c..fa908dc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,7 +7,6 @@ import { FlashcardsSettings, FlashcardsSettingsTab } from "./settings" // TODO: // - Status bar // - Enforce newline separation (stream post processing) -// - Always append flashcards at the end of the file (ch:0, line: last) // - Disable user input while generating // - Custom tag for flashcards blocks // - Insert an optional header before flashcards @@ -21,7 +20,8 @@ const DEFAULT_SETTINGS: FlashcardsSettings = { additionalPrompt: "", maxTokens: 300, streaming: true, - hideInPreview: true + hideInPreview: true, + tag: "#flashcards" }; export default class FlashcardsLLMPlugin extends Plugin { @@ -65,10 +65,11 @@ export default class FlashcardsLLMPlugin extends Plugin { } const blocks = element.findAll("blockquote"); + const tag = this.settings.tag; for(let block of blocks) { const anchors = Array.from(block.querySelectorAll("a")); - if (anchors.some((a) => a.getAttribute("href")?.startsWith("#flashcards"))) { + if (anchors.some((a) => a.getAttribute("href")?.startsWith(`${tag}`))) { block.style.display = 'none' } } @@ -107,6 +108,8 @@ export default class FlashcardsLLMPlugin extends Plugin { maxTokens = 300 } + const tag = configuration.tag; + const wholeText = editor.getValue() const currentText = (editor.somethingSelected() ? editor.getSelection() : wholeText) // Check if the header is already present @@ -114,8 +117,8 @@ export default class FlashcardsLLMPlugin extends Plugin { const hasHeader = headerRegex.test(wholeText); // Check if the #flashcards tag is already present - const tagRegex = /\n#flashcards.*\n/; - const hasTag = tagRegex.test(wholeText); + // const tagRegex = /\n#flashcards.*\n/; + // const hasTag = tagRegex.test(wholeText); const streaming = configuration.streaming @@ -147,7 +150,7 @@ export default class FlashcardsLLMPlugin extends Plugin { // if (!hasTag) { // updatedText += "> #flashcards\n> \n> "; // } - updatedText += "\n\n> #flashcards\n> \n> "; + updatedText += `\n\n> ${tag}\n> \n> `; editor.setCursor(editor.lastLine()) editor.replaceRange(updatedText, editor.getCursor()) diff --git a/src/settings.ts b/src/settings.ts index 7df48a0..c9610c6 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -2,6 +2,9 @@ import { App, MarkdownView, PluginSettingTab, Setting } from 'obsidian'; import { availableChatModels, availableCompletionModels } from "./models"; import FlashcardsLLMPlugin from "./main" +// TODO: +// - make additional prompt a resizable textarea + export interface FlashcardsSettings { apiKey: string; model: string; @@ -12,6 +15,7 @@ export interface FlashcardsSettings { maxTokens: number; streaming: boolean; hideInPreview: boolean; + tag: string; } @@ -84,6 +88,20 @@ export class FlashcardsSettingsTab extends PluginSettingTab { }) ); + new Setting(containerEl) + .setName("Flashcards tag") + .setDesc("Set which tag to append upon flashcards generation. " + + "See the Spaced Repetition plugin for details") + .addText((text) => + text + .setPlaceholder("#flashcards") + .setValue(this.plugin.settings.tag) + .onChange(async (value) => { + this.plugin.settings.tag = value; + await this.plugin.saveSettings(); + }) + ); + new Setting(containerEl) .setName("Number of flashcards to generate") .setDesc("Set this to the total number of flashcards the model should "+ @@ -98,6 +116,7 @@ export class FlashcardsSettingsTab extends PluginSettingTab { }) ); + new Setting(containerEl) .setName("Additional prompt") .setDesc("Provide additional instructions to the language model")