/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugins github repository
*/
'use strict';
var obsidian = require('obsidian');
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
/*
Privacy Glasses plugin for Obsidian
Copyright 2021 Jill Alberts
Licensed under the MIT License (http://opensource.org/licenses/MIT)
*/
function isMarkdownFileInfoView(x) {
const anyX = x;
return !!Object.getOwnPropertyDescriptor(anyX, "file");
}
function isHooked(view) {
const anyView = view;
const ownProps = Object.getOwnPropertyNames(anyView);
return (ownProps.contains("setState") && typeof anyView.setState === "function");
}
function hookViewStateChanged(view, onBeforeStateChange, onAfterStateChange) {
const anyView = view;
const original = anyView.__proto__.setState;
function wrapper() {
onBeforeStateChange(view);
const r = original.apply(this, arguments);
if (typeof r.then === "function") {
r.then(() => {
onAfterStateChange(view);
});
}
else {
onAfterStateChange(view);
}
return r;
}
anyView.setState = wrapper.bind(view);
return anyView;
}
/**
* Constants
*/
var Level;
(function (Level) {
Level["HideAll"] = "hide-all";
Level["HidePrivate"] = "hide-private";
Level["RevealAll"] = "reveal-all";
Level["RevealHeadlines"] = "reveal-headlines";
})(Level || (Level = {}));
var CssClass;
(function (CssClass) {
CssClass["BlurAll"] = "privacy-glasses-blur-all";
CssClass["RevealOnHover"] = "privacy-glasses-reveal-on-hover";
CssClass["RevealAll"] = "privacy-glasses-reveal-all";
CssClass["RevealUnderCaret"] = "privacy-glasses-reveal-under-caret";
CssClass["RevealHeadlines"] = "privacy-glasses-reveal-headlines";
CssClass["Reveal"] = "privacy-glasses-reveal";
CssClass["IsMdView"] = "is-md-view";
CssClass["IsNonMdView"] = "is-non-md-view";
CssClass["IsMdViewHeadlinesOnly"] = "is-md-view-headlines-only";
CssClass["PrivacyGlassesReveal"] = "privacy-glasses-reveal";
})(CssClass || (CssClass = {}));
/**
* Main
*/
class PrivacyGlassesPlugin extends obsidian.Plugin {
constructor() {
super(...arguments);
this.revealed = [];
}
onload() {
return __awaiter(this, void 0, void 0, function* () {
this.statusBar = this.addStatusBarItem();
yield this.loadSettings();
this.addSettingTab(new privacyGlassesSettingTab(this.app, this));
obsidian.addIcon("eye", eyeIcon);
obsidian.addIcon("eye-closed", eyeClosedIcon);
obsidian.addIcon("eye-slash", eyeSlashIcon);
obsidian.addIcon("eye-glasses", eyeGlasses);
this.addRibbonIcon("eye-closed", "Hide all", () => {
this.currentLevel = Level.HideAll;
this.updateLeavesAndGlobalReveals();
});
this.addRibbonIcon("eye-slash", "Reveal non-private", () => {
this.currentLevel = Level.HidePrivate;
this.updateLeavesAndGlobalReveals();
});
this.addRibbonIcon("eye-glasses", "Reveal headlines only", () => {
this.currentLevel = Level.RevealHeadlines;
this.updateLeavesAndGlobalReveals();
});
this.addRibbonIcon("eye", "Reveal all", () => {
this.currentLevel = Level.RevealAll;
this.updateLeavesAndGlobalReveals();
});
this.addCommand({
id: "privacy-glasses-hide-all",
name: "Privacy Glasses - hide all",
callback: () => {
this.currentLevel = Level.HideAll;
this.updateLeavesAndGlobalReveals();
},
});
this.addCommand({
id: "privacy-glasses-hide-private",
name: "Privacy Glasses - hide files in folders marked as private",
callback: () => {
this.currentLevel = Level.HidePrivate;
this.updateLeavesAndGlobalReveals();
},
});
this.addCommand({
id: "privacy-glasses-reveal-headlines",
name: "Privacy Glasses - reveal headlines only, keeping body content hidden",
callback: () => {
this.currentLevel = Level.RevealHeadlines;
this.updateLeavesAndGlobalReveals();
},
});
this.addCommand({
id: "privacy-glasses-reveal-all",
name: "Privacy Glasses - do not hide anything",
callback: () => {
this.currentLevel = Level.RevealAll;
this.updateLeavesAndGlobalReveals();
},
});
this.registerInterval(window.setInterval(() => {
this.checkIdleTimeout();
}, 1000));
this.app.workspace.onLayoutReady(() => {
this.registerDomActivityEvents(this.app.workspace.rootSplit.win);
this.currentLevel = this.settings.blurOnStartup;
this.updateLeavesAndGlobalReveals();
this.updatePrivateDirsEl(this.app.workspace.rootSplit.win.document);
this.ensureLeavesHooked();
});
this.registerEvent(this.app.workspace.on("window-open", (win) => {
this.registerDomActivityEvents(win.win);
}));
this.registerEvent(this.app.workspace.on("active-leaf-change", (e) => {
this.ensureLeavesHooked();
this.updateLeafViewStyle(e.view);
}));
this.lastEventTime = performance.now();
});
}
// we hook into setState function of the view, because it is synchronously called
// before the content switch. this is to prevent private content from being accidentally briefly revealed
onBeforeViewStateChange(l) {
this.revealed.forEach((r) => {
r.removeClass(CssClass.Reveal);
});
}
onAfterViewStateChange(l) {
// some panels update using the same event, so it is important to update leaves after they are ready
setTimeout(() => {
this.updateLeavesStyle();
}, 200);
this.ensureLeavesHooked();
}
ensureLeavesHooked() {
this.app.workspace.iterateAllLeaves((e) => {
if (isHooked(e.view)) {
return;
}
hookViewStateChanged(e.view, () => {
this.onBeforeViewStateChange(e);
}, () => {
this.onAfterViewStateChange(e);
});
});
}
registerDomActivityEvents(win) {
this.registerDomEvent(win, "mousedown", (e) => {
this.lastEventTime = e.timeStamp;
});
this.registerDomEvent(win, "keydown", (e) => {
this.lastEventTime = e.timeStamp;
});
this.addBlurLevelEl(win.document);
}
checkIdleTimeout() {
if (this.settings.blurOnIdleTimeoutSeconds < 0) {
return;
}
if (this.currentLevel === Level.HideAll) {
return;
}
if (!this.lastEventTime) {
return;
}
const now = performance.now();
if ((now - this.lastEventTime) / 1000 >=
this.settings.blurOnIdleTimeoutSeconds) {
this.currentLevel = Level.HideAll;
this.updateLeavesAndGlobalReveals();
}
}
onunload() {
return __awaiter(this, void 0, void 0, function* () {
this.statusBar.remove();
yield this.saveSettings();
});
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign(DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
shouldRevealLeaf(view) {
var _a;
if (this.currentLevel === Level.RevealAll) {
return true;
}
if (this.currentLevel === Level.HideAll ||
this.currentLevel === Level.RevealHeadlines) {
return false;
}
if (!isMarkdownFileInfoView(view)) {
return true;
}
if (view.editor &&
this.settings.privateNoteMarker &&
this.settings.privateNoteMarker !== "") {
let tags = [];
// Get tags in the note body, if any
if ('tags' in this.app.metadataCache.getFileCache(view.file)) {
tags.push(...this.app.metadataCache.getFileCache(view.file).tags.filter(x => !!x.tag).map(x => x.tag));
}
// Get tags in properties, if any
if ('tags' in ((_a = this.app.metadataCache.getFileCache(view.file)) === null || _a === void 0 ? void 0 : _a.frontmatter)) {
tags.push(...this.app.metadataCache.getFileCache(view.file).frontmatter.tags.filter((x) => !!x));
}
if (tags && tags.length > 0) {
return !tags.includes(this.settings.privateNoteMarker);
}
}
if (view.file &&
!this.settings.privateDirs.contains(view.file.parent.path)) {
return true;
}
return false;
}
updateLeafViewStyle(view) {
const isMd = isMarkdownFileInfoView(view) && view.editor;
view.containerEl.removeClass(CssClass.IsMdView, CssClass.IsNonMdView, CssClass.IsMdViewHeadlinesOnly);
if (isMd && this.currentLevel === Level.RevealHeadlines) {
view.containerEl.addClass(CssClass.IsMdViewHeadlinesOnly);
}
else if (isMd) {
view.containerEl.addClass(CssClass.IsMdView);
}
else {
view.containerEl.addClass(CssClass.IsNonMdView);
}
const shouldReveal = this.shouldRevealLeaf(view);
if (shouldReveal) {
view.containerEl.addClass(CssClass.PrivacyGlassesReveal);
this.revealed.push(view.containerEl);
}
else {
view.containerEl.removeClass(CssClass.PrivacyGlassesReveal);
}
}
updateLeavesAndGlobalReveals() {
this.updateLeavesStyle();
this.updateGlobalRevealStyle();
}
updateLeavesStyle() {
this.app.workspace.iterateAllLeaves((e) => {
this.updateLeafViewStyle(e.view);
});
}
updateGlobalRevealStyle() {
this.removeAllClasses();
this.setClassToDocumentBody(this.currentLevel);
if (this.settings.hoverToReveal) {
document.body.classList.add(CssClass.RevealOnHover);
}
if (this.settings.revealUnderCaret) {
document.body.classList.add(CssClass.RevealUnderCaret);
}
}
removeAllClasses() {
document.body.removeClass(CssClass.BlurAll, CssClass.RevealOnHover, CssClass.RevealAll, CssClass.RevealUnderCaret, CssClass.RevealHeadlines);
}
setClassToDocumentBody(currentLevel) {
switch (currentLevel) {
case Level.HideAll:
document.body.classList.add(CssClass.BlurAll);
break;
case Level.RevealAll:
document.body.classList.add(CssClass.RevealAll);
break;
case Level.RevealHeadlines:
document.body.classList.add(CssClass.RevealHeadlines);
break;
}
}
addBlurLevelEl(doc) {
this.blurLevelStyleEl = doc.createElement("style");
this.blurLevelStyleEl.id = "privacyGlassesBlurLevel";
doc.head.appendChild(this.blurLevelStyleEl);
this.updateBlurLevelEl();
}
updateBlurLevelEl() {
if (!this.blurLevelStyleEl) {
return;
}
this.blurLevelStyleEl.textContent = `body {--blurLevel:${this.settings.blurLevel}em};`;
}
updatePrivateDirsEl(doc) {
if (doc && !this.privateDirsStyleEl) {
this.privateDirsStyleEl = doc.createElement("style");
this.privateDirsStyleEl.id = "privacyGlassesDirBlur";
doc.head.appendChild(this.privateDirsStyleEl);
}
const dirs = this.settings.privateDirs.split(",");
this.privateDirsStyleEl.textContent = dirs
.map((d) => `
:is(.nav-folder-title, .nav-file-title)[data-path^=${d}] {filter: blur(calc(var(--blurLevel) * 1))}
:is(.nav-folder-title, .nav-file-title)[data-path^=${d}]:hover {filter: unset}
.privacy-glasses-reveal-all :is(.nav-folder-title, .nav-file-title)[data-path^=${d}] {filter: unset}
`)
.join("");
}
}
const DEFAULT_SETTINGS = {
blurOnStartup: Level.HidePrivate,
blurLevel: 0.3,
blurOnIdleTimeoutSeconds: -1,
hoverToReveal: true,
revealUnderCaret: false,
privateDirs: "",
privateNoteMarker: "#private",
};
class privacyGlassesSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl("h3", {
text: "Privacy Glasses v" + this.plugin.manifest.version,
});
containerEl.createEl("a", {
text: "https://github.com/jillalberts/privacy-glasses",
href: "https://github.com/jillalberts/privacy-glasses",
});
containerEl.createEl("span", {
text: ": documentation, report issues, contact info",
});
containerEl.createEl("p", {
text: 'To activate/deactivate Privacy Glasses, click the glasses icon on the left-hand ribbon or run "Privacy Glasses" commands in the Command Palette (Ctrl-P). The command can also be bound to a keyboard shortcut if you wish.',
});
new obsidian.Setting(containerEl)
.setName("Activate Privacy Glasses on startup")
.setDesc("Indicates whether the plugin is automatically activated when starting Obsidian.")
.addDropdown((toggle) => {
toggle.addOptions({
"hide-all": "Hide all",
"hide-private": "Hide private (default)",
"reveal-all": "Reveal all",
"reveal-headlines": "Reveal headlines only"
});
toggle.setValue(this.plugin.settings.blurOnStartup);
toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.blurOnStartup = value;
yield this.plugin.saveSettings();
}));
});
new obsidian.Setting(containerEl)
.setName("Hide all after user inactivity (seconds)")
.setDesc("Inactivity time after which Privacy Glasses will hide all. -1 to disable auto-hiding.")
.addText((textfield) => {
textfield.setPlaceholder("-1");
textfield.inputEl.type = "number";
textfield.inputEl.min = "-1";
textfield.setValue(String(this.plugin.settings.blurOnIdleTimeoutSeconds));
textfield.onChange((value) => __awaiter(this, void 0, void 0, function* () {
let parsed = parseFloat(value);
if (isNaN(parsed)) {
parsed = -1;
}
this.plugin.settings.blurOnIdleTimeoutSeconds = parsed;
yield this.plugin.saveSettings();
}));
});
new obsidian.Setting(containerEl)
.setName("Hover to reveal")
.setDesc("Indicates whether or not to reveal content when hovering the cursor over it.")
.addToggle((toggle) => {
toggle.setValue(this.plugin.settings.hoverToReveal);
toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.hoverToReveal = value;
this.plugin.updateLeavesAndGlobalReveals();
yield this.plugin.saveSettings();
}));
});
new obsidian.Setting(containerEl)
.setName("Reveal under caret")
.setDesc("Indicates whether or not to reveal content when caret is on it.")
.addToggle((toggle) => {
toggle.setValue(this.plugin.settings.revealUnderCaret);
toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.revealUnderCaret = value;
this.plugin.updateGlobalRevealStyle();
yield this.plugin.saveSettings();
}));
});
var sliderEl = new obsidian.Setting(containerEl);
let sliderElDesc = "Higher is blurrier. Default=60, current=";
sliderEl
.setName("Blur level")
.setDesc(sliderElDesc + Math.round(this.plugin.settings.blurLevel * 100))
// ^ need rounding to not show values like '55.00000000000001'
.addSlider((slider) => slider
.setLimits(0.1, 1.5, 0.05)
.setValue(this.plugin.settings.blurLevel)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.blurLevel = value;
sliderEl.setDesc(sliderElDesc + Math.round(this.plugin.settings.blurLevel * 100));
this.plugin.updateBlurLevelEl();
this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Private directories")
.setDesc("Comma-separated list of directories, in which files are considered private")
.addText((text) => text
.setPlaceholder("finance,therapy")
.setValue(this.plugin.settings.privateDirs)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.privateDirs = value;
yield this.plugin.saveSettings();
this.plugin.updateLeavesAndGlobalReveals();
this.plugin.updatePrivateDirsEl();
})));
new obsidian.Setting(containerEl)
.setName("Private note marker")
.setDesc("Start a note with this text to mark note as private")
.addText((text) => text
.setPlaceholder("#private")
.setValue(this.plugin.settings.privateNoteMarker)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.privateNoteMarker = value;
yield this.plugin.saveSettings();
this.plugin.updateLeavesStyle();
})));
}
}
// https://icon-sets.iconify.design/ph/eye-slash/
const eyeSlashIcon = ``;
// https://icon-sets.iconify.design/ph/eye-closed-bold/
const eyeClosedIcon = ``;
// https://icon-sets.iconify.design/ph/eye/
const eyeIcon = ``;
// https://icon-sets.iconify.design/ph/eyeglasses/
const eyeGlasses = ``;
module.exports = PrivacyGlassesPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZTtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIF9fZXh0ZW5kczogX19leHRlbmRzLFxyXG4gICAgX19hc3NpZ246IF9fYXNzaWduLFxyXG4gICAgX19yZXN0OiBfX3Jlc3QsXHJcbiAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlLFxyXG4gICAgX19wYXJhbTogX19wYXJhbSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxufTtcclxuIiwiLyogXHRcclxuICBQcml2YWN5IEdsYXNzZXMgcGx1Z2luIGZvciBPYnNpZGlhblxyXG4gIENvcHlyaWdodCAyMDIxIEppbGwgQWxiZXJ0c1xyXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkgXHJcbiovXHJcblxyXG5pbXBvcnQge1xyXG4gIGFkZEljb24sXHJcbiAgQXBwLFxyXG4gIE1hcmtkb3duRmlsZUluZm8sXHJcbiAgTm90aWNlLFxyXG4gIFBsdWdpbixcclxuICBQbHVnaW5TZXR0aW5nVGFiLFxyXG4gIFNldHRpbmcsXHJcbiAgVmlldyxcclxuICBXb3Jrc3BhY2VMZWFmLFxyXG59IGZyb20gXCJvYnNpZGlhblwiO1xyXG5cclxuZnVuY3Rpb24gaXNNYXJrZG93bkZpbGVJbmZvVmlldyh4OiB1bmtub3duKTogeCBpcyBNYXJrZG93bkZpbGVJbmZvIHtcclxuICBjb25zdCBhbnlYID0geCBhcyBhbnk7XHJcbiAgcmV0dXJuICEhT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhbnlYLCBcImZpbGVcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSG9va2VkKHZpZXc6IFZpZXcpIHtcclxuICBjb25zdCBhbnlWaWV3ID0gdmlldyBhcyBhbnk7XHJcbiAgY29uc3Qgb3duUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbnlWaWV3KTtcclxuICByZXR1cm4gKFxyXG4gICAgb3duUHJvcHMuY29udGFpbnMoXCJzZXRTdGF0ZVwiKSAmJiB0eXBlb2YgYW55Vmlldy5zZXRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaG9va1ZpZXdTdGF0ZUNoYW5nZWQoXHJcbiAgdmlldzogVmlldyxcclxuICBvbkJlZm9yZVN0YXRlQ2hhbmdlOiAodmlldzogVmlldykgPT4gdm9pZCxcclxuICBvbkFmdGVyU3RhdGVDaGFuZ2U6ICh2aWV3OiBWaWV3KSA9PiB2b2lkXHJcbikge1xyXG4gIGNvbnN0IGFueVZpZXcgPSB2aWV3IGFzIGFueTtcclxuXHJcbiAgY29uc3Qgb3JpZ2luYWwgPSBhbnlWaWV3Ll9fcHJvdG9fXy5zZXRTdGF0ZTtcclxuXHJcbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcclxuICAgIG9uQmVmb3JlU3RhdGVDaGFuZ2Uodmlldyk7XHJcbiAgICBjb25zdCByID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIGlmICh0eXBlb2Ygci50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgci50aGVuKCgpID0+IHtcclxuICAgICAgICBvbkFmdGVyU3RhdGVDaGFuZ2Uodmlldyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb25BZnRlclN0YXRlQ2hhbmdlKHZpZXcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBhbnlWaWV3LnNldFN0YXRlID0gd3JhcHBlci5iaW5kKHZpZXcpO1xyXG5cclxuICByZXR1cm4gYW55VmlldztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0YW50c1xyXG4gKi9cclxuXHJcbmVudW0gTGV2ZWwge1xyXG4gIEhpZGVBbGwgPSBcImhpZGUtYWxsXCIsXHJcbiAgSGlkZVByaXZhdGUgPSBcImhpZGUtcHJpdmF0ZVwiLFxyXG4gIFJldmVhbEFsbCA9IFwicmV2ZWFsLWFsbFwiLFxyXG4gIFJldmVhbEhlYWRsaW5lcyA9IFwicmV2ZWFsLWhlYWRsaW5lc1wiXHJcbn1cclxuXHJcbmVudW0gQ3NzQ2xhc3Mge1xyXG4gIEJsdXJBbGwgPSBcInByaXZhY3ktZ2xhc3Nlcy1ibHVyLWFsbFwiLFxyXG4gIFJldmVhbE9uSG92ZXIgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtb24taG92ZXJcIixcclxuICBSZXZlYWxBbGwgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtYWxsXCIsXHJcbiAgUmV2ZWFsVW5kZXJDYXJldCA9IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC11bmRlci1jYXJldFwiLFxyXG4gIFJldmVhbEhlYWRsaW5lcyA9IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1oZWFkbGluZXNcIixcclxuICBSZXZlYWwgPSBcInByaXZhY3ktZ2xhc3Nlcy1yZXZlYWxcIixcclxuICBJc01kVmlldyA9IFwiaXMtbWQtdmlld1wiLFxyXG4gIElzTm9uTWRWaWV3ID0gXCJpcy1ub24tbWQtdmlld1wiLFxyXG4gIElzTWRWaWV3SGVhZGxpbmVzT25seSA9IFwiaXMtbWQtdmlldy1oZWFkbGluZXMtb25seVwiLFxyXG4gIFByaXZhY3lHbGFzc2VzUmV2ZWFsID0gXCJwcml2YWN5LWdsYXNzZXMtcmV2ZWFsXCJcclxufVxyXG5cclxuLyoqXHJcbiAqIE1haW5cclxuICovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcml2YWN5R2xhc3Nlc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3M6IFByaXZhY3lHbGFzc2VzU2V0dGluZ3M7XHJcbiAgc3RhdHVzQmFyOiBIVE1MRWxlbWVudDtcclxuICBub3RpY2VNc2c6IE5vdGljZTtcclxuICBibHVyTGV2ZWxTdHlsZUVsOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlRGlyc1N0eWxlRWw6IEhUTUxFbGVtZW50O1xyXG4gIGxhc3RFdmVudFRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBjdXJyZW50TGV2ZWw6IExldmVsO1xyXG4gIHJldmVhbGVkOiBIVE1MRWxlbWVudFtdID0gW107XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzQmFyID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcbiAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IHByaXZhY3lHbGFzc2VzU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuICAgIGFkZEljb24oXCJleWVcIiwgZXllSWNvbik7XHJcbiAgICBhZGRJY29uKFwiZXllLWNsb3NlZFwiLCBleWVDbG9zZWRJY29uKTtcclxuICAgIGFkZEljb24oXCJleWUtc2xhc2hcIiwgZXllU2xhc2hJY29uKTtcclxuICAgIGFkZEljb24oXCJleWUtZ2xhc3Nlc1wiLCBleWVHbGFzc2VzKTtcclxuXHJcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oXCJleWUtY2xvc2VkXCIsIFwiSGlkZSBhbGxcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVBbGw7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFkZFJpYmJvbkljb24oXCJleWUtc2xhc2hcIiwgXCJSZXZlYWwgbm9uLXByaXZhdGVcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVQcml2YXRlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFwiZXllLWdsYXNzZXNcIiwgXCJSZXZlYWwgaGVhZGxpbmVzIG9ubHlcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLlJldmVhbEhlYWRsaW5lcztcclxuICAgICAgdGhpcy51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImV5ZVwiLCBcIlJldmVhbCBhbGxcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLlJldmVhbEFsbDtcclxuICAgICAgdGhpcy51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJwcml2YWN5LWdsYXNzZXMtaGlkZS1hbGxcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBoaWRlIGFsbFwiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuSGlkZUFsbDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcInByaXZhY3ktZ2xhc3Nlcy1oaWRlLXByaXZhdGVcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBoaWRlIGZpbGVzIGluIGZvbGRlcnMgbWFya2VkIGFzIHByaXZhdGVcIixcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IExldmVsLkhpZGVQcml2YXRlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1oZWFkbGluZXNcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSByZXZlYWwgaGVhZGxpbmVzIG9ubHksIGtlZXBpbmcgYm9keSBjb250ZW50IGhpZGRlblwiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuUmV2ZWFsSGVhZGxpbmVzO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwicHJpdmFjeS1nbGFzc2VzLXJldmVhbC1hbGxcIixcclxuICAgICAgbmFtZTogXCJQcml2YWN5IEdsYXNzZXMgLSBkbyBub3QgaGlkZSBhbnl0aGluZ1wiLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudExldmVsID0gTGV2ZWwuUmV2ZWFsQWxsO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhdmVzQW5kR2xvYmFsUmV2ZWFscygpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckludGVydmFsKFxyXG4gICAgICB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tJZGxlVGltZW91dCgpO1xyXG4gICAgICB9LCAxMDAwKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh0aGlzLmFwcC53b3Jrc3BhY2Uucm9vdFNwbGl0Lndpbik7XHJcbiAgICAgIHRoaXMuY3VycmVudExldmVsID0gdGhpcy5zZXR0aW5ncy5ibHVyT25TdGFydHVwO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgdGhpcy51cGRhdGVQcml2YXRlRGlyc0VsKHRoaXMuYXBwLndvcmtzcGFjZS5yb290U3BsaXQud2luLmRvY3VtZW50KTtcclxuICAgICAgdGhpcy5lbnN1cmVMZWF2ZXNIb29rZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcclxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKFwid2luZG93LW9wZW5cIiwgKHdpbikgPT4ge1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh3aW4ud2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxyXG4gICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJhY3RpdmUtbGVhZi1jaGFuZ2VcIiwgKGUpID0+IHtcclxuICAgICAgICB0aGlzLmVuc3VyZUxlYXZlc0hvb2tlZCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGVhZlZpZXdTdHlsZShlLnZpZXcpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmxhc3RFdmVudFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICB9XHJcblxyXG4gIC8vIHdlIGhvb2sgaW50byBzZXRTdGF0ZSBmdW5jdGlvbiBvZiB0aGUgdmlldywgYmVjYXVzZSBpdCBpcyBzeW5jaHJvbm91c2x5IGNhbGxlZFxyXG4gIC8vIGJlZm9yZSB0aGUgY29udGVudCBzd2l0Y2guIHRoaXMgaXMgdG8gcHJldmVudCBwcml2YXRlIGNvbnRlbnQgZnJvbSBiZWluZyBhY2NpZGVudGFsbHkgYnJpZWZseSByZXZlYWxlZFxyXG4gIG9uQmVmb3JlVmlld1N0YXRlQ2hhbmdlKGw6IFdvcmtzcGFjZUxlYWYpIHtcclxuICAgIHRoaXMucmV2ZWFsZWQuZm9yRWFjaCgocikgPT4ge1xyXG4gICAgICByLnJlbW92ZUNsYXNzKENzc0NsYXNzLlJldmVhbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWZ0ZXJWaWV3U3RhdGVDaGFuZ2UobDogV29ya3NwYWNlTGVhZikge1xyXG4gICAgLy8gc29tZSBwYW5lbHMgdXBkYXRlIHVzaW5nIHRoZSBzYW1lIGV2ZW50LCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gdXBkYXRlIGxlYXZlcyBhZnRlciB0aGV5IGFyZSByZWFkeVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhdmVzU3R5bGUoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgICB0aGlzLmVuc3VyZUxlYXZlc0hvb2tlZCgpO1xyXG4gIH1cclxuXHJcbiAgZW5zdXJlTGVhdmVzSG9va2VkKCkge1xyXG4gICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGUpID0+IHtcclxuICAgICAgaWYgKGlzSG9va2VkKGUudmlldykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGhvb2tWaWV3U3RhdGVDaGFuZ2VkKFxyXG4gICAgICAgIGUudmlldyxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlVmlld1N0YXRlQ2hhbmdlKGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vbkFmdGVyVmlld1N0YXRlQ2hhbmdlKGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJEb21BY3Rpdml0eUV2ZW50cyh3aW46IFdpbmRvdykge1xyXG4gICAgdGhpcy5yZWdpc3RlckRvbUV2ZW50KHdpbiwgXCJtb3VzZWRvd25cIiwgKGUpID0+IHtcclxuICAgICAgdGhpcy5sYXN0RXZlbnRUaW1lID0gZS50aW1lU3RhbXA7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVnaXN0ZXJEb21FdmVudCh3aW4sIFwia2V5ZG93blwiLCAoZSkgPT4ge1xyXG4gICAgICB0aGlzLmxhc3RFdmVudFRpbWUgPSBlLnRpbWVTdGFtcDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRCbHVyTGV2ZWxFbCh3aW4uZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZGxlVGltZW91dCgpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJsdXJPbklkbGVUaW1lb3V0U2Vjb25kcyA8IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA9PT0gTGV2ZWwuSGlkZUFsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmxhc3RFdmVudFRpbWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKG5vdyAtIHRoaXMubGFzdEV2ZW50VGltZSkgLyAxMDAwID49XHJcbiAgICAgIHRoaXMuc2V0dGluZ3MuYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBMZXZlbC5IaWRlQWxsO1xyXG4gICAgICB0aGlzLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9udW5sb2FkKCkge1xyXG4gICAgdGhpcy5zdGF0dXNCYXIucmVtb3ZlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZXZlYWxMZWFmKHZpZXc6IFZpZXcpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA9PT0gTGV2ZWwuUmV2ZWFsQWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLkhpZGVBbGwgfHxcclxuICAgICAgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLlJldmVhbEhlYWRsaW5lc1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzTWFya2Rvd25GaWxlSW5mb1ZpZXcodmlldykpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB2aWV3LmVkaXRvciAmJlxyXG4gICAgICB0aGlzLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyICYmXHJcbiAgICAgIHRoaXMuc2V0dGluZ3MucHJpdmF0ZU5vdGVNYXJrZXIgIT09IFwiXCJcclxuICAgICkge1xyXG4gICAgICBsZXQgdGFnczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgLy8gR2V0IHRhZ3MgaW4gdGhlIG5vdGUgYm9keSwgaWYgYW55XHJcbiAgICAgIGlmICgndGFncycgaW4gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUodmlldy5maWxlKSkge1xyXG4gICAgICAgIHRhZ3MucHVzaCguLi50aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpLnRhZ3MuZmlsdGVyKHggPT4gISF4LnRhZykubWFwKHggPT4geC50YWcpKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBHZXQgdGFncyBpbiBwcm9wZXJ0aWVzLCBpZiBhbnlcclxuICAgICAgaWYgKCd0YWdzJyBpbiB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpPy5mcm9udG1hdHRlcikge1xyXG4gICAgICAgIHRhZ3MucHVzaCguLi50aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh2aWV3LmZpbGUpLmZyb250bWF0dGVyLnRhZ3MuZmlsdGVyKCh4OiBzdHJpbmcpID0+ICEheCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YWdzICYmIHRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiAhdGFncy5pbmNsdWRlcyh0aGlzLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdmlldy5maWxlICYmXHJcbiAgICAgICF0aGlzLnNldHRpbmdzLnByaXZhdGVEaXJzLmNvbnRhaW5zKHZpZXcuZmlsZS5wYXJlbnQucGF0aClcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMZWFmVmlld1N0eWxlKHZpZXc6IFZpZXcpIHtcclxuICAgIGNvbnN0IGlzTWQgPSBpc01hcmtkb3duRmlsZUluZm9WaWV3KHZpZXcpICYmIHZpZXcuZWRpdG9yO1xyXG4gICAgdmlldy5jb250YWluZXJFbC5yZW1vdmVDbGFzcyhcclxuICAgICAgQ3NzQ2xhc3MuSXNNZFZpZXcsXHJcbiAgICAgIENzc0NsYXNzLklzTm9uTWRWaWV3LFxyXG4gICAgICBDc3NDbGFzcy5Jc01kVmlld0hlYWRsaW5lc09ubHkpO1xyXG4gICAgaWYgKGlzTWQgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IExldmVsLlJldmVhbEhlYWRsaW5lcykge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLklzTWRWaWV3SGVhZGxpbmVzT25seSk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTWQpIHtcclxuICAgICAgdmlldy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5Jc01kVmlldyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLklzTm9uTWRWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzaG91bGRSZXZlYWwgPSB0aGlzLnNob3VsZFJldmVhbExlYWYodmlldyk7XHJcbiAgICBpZiAoc2hvdWxkUmV2ZWFsKSB7XHJcbiAgICAgIHZpZXcuY29udGFpbmVyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuUHJpdmFjeUdsYXNzZXNSZXZlYWwpO1xyXG4gICAgICB0aGlzLnJldmVhbGVkLnB1c2godmlldy5jb250YWluZXJFbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2aWV3LmNvbnRhaW5lckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLlByaXZhY3lHbGFzc2VzUmV2ZWFsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUxlYXZlc1N0eWxlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUdsb2JhbFJldmVhbFN0eWxlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMZWF2ZXNTdHlsZSgpIHtcclxuICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChlKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlTGVhZlZpZXdTdHlsZShlLnZpZXcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHbG9iYWxSZXZlYWxTdHlsZSgpIHtcclxuICAgIHRoaXMucmVtb3ZlQWxsQ2xhc3NlcygpO1xyXG4gICAgdGhpcy5zZXRDbGFzc1RvRG9jdW1lbnRCb2R5KHRoaXMuY3VycmVudExldmVsKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5ob3ZlclRvUmV2ZWFsKSB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDc3NDbGFzcy5SZXZlYWxPbkhvdmVyKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnJldmVhbFVuZGVyQ2FyZXQpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLlJldmVhbFVuZGVyQ2FyZXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQWxsQ2xhc3NlcygpIHtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2xhc3MoXHJcbiAgICAgIENzc0NsYXNzLkJsdXJBbGwsXHJcbiAgICAgIENzc0NsYXNzLlJldmVhbE9uSG92ZXIsXHJcbiAgICAgIENzc0NsYXNzLlJldmVhbEFsbCxcclxuICAgICAgQ3NzQ2xhc3MuUmV2ZWFsVW5kZXJDYXJldCxcclxuICAgICAgQ3NzQ2xhc3MuUmV2ZWFsSGVhZGxpbmVzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2xhc3NUb0RvY3VtZW50Qm9keShjdXJyZW50TGV2ZWw6IExldmVsKSB7XHJcbiAgICBzd2l0Y2ggKGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICBjYXNlIExldmVsLkhpZGVBbGw6XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLkJsdXJBbGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExldmVsLlJldmVhbEFsbDpcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoQ3NzQ2xhc3MuUmV2ZWFsQWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMZXZlbC5SZXZlYWxIZWFkbGluZXM6XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENzc0NsYXNzLlJldmVhbEhlYWRsaW5lcyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRCbHVyTGV2ZWxFbChkb2M6IERvY3VtZW50KSB7XHJcbiAgICB0aGlzLmJsdXJMZXZlbFN0eWxlRWwgPSBkb2MuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgdGhpcy5ibHVyTGV2ZWxTdHlsZUVsLmlkID0gXCJwcml2YWN5R2xhc3Nlc0JsdXJMZXZlbFwiO1xyXG4gICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5ibHVyTGV2ZWxTdHlsZUVsKTtcclxuICAgIHRoaXMudXBkYXRlQmx1ckxldmVsRWwoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJsdXJMZXZlbEVsKCkge1xyXG4gICAgaWYgKCF0aGlzLmJsdXJMZXZlbFN0eWxlRWwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ibHVyTGV2ZWxTdHlsZUVsLnRleHRDb250ZW50ID0gYGJvZHkgey0tYmx1ckxldmVsOiR7dGhpcy5zZXR0aW5ncy5ibHVyTGV2ZWx9ZW19O2A7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcml2YXRlRGlyc0VsKGRvYz86IERvY3VtZW50KSB7XHJcbiAgICBpZiAoZG9jICYmICF0aGlzLnByaXZhdGVEaXJzU3R5bGVFbCkge1xyXG4gICAgICB0aGlzLnByaXZhdGVEaXJzU3R5bGVFbCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgICAgIHRoaXMucHJpdmF0ZURpcnNTdHlsZUVsLmlkID0gXCJwcml2YWN5R2xhc3Nlc0RpckJsdXJcIjtcclxuICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5wcml2YXRlRGlyc1N0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlycyA9IHRoaXMuc2V0dGluZ3MucHJpdmF0ZURpcnMuc3BsaXQoXCIsXCIpO1xyXG4gICAgdGhpcy5wcml2YXRlRGlyc1N0eWxlRWwudGV4dENvbnRlbnQgPSBkaXJzXHJcbiAgICAgIC5tYXAoXHJcbiAgICAgICAgKGQpID0+XHJcbiAgICAgICAgICBgXHJcblxyXG4gICAgICAgICAgOmlzKC5uYXYtZm9sZGVyLXRpdGxlLCAubmF2LWZpbGUtdGl0bGUpW2RhdGEtcGF0aF49JHtkfV0ge2ZpbHRlcjogYmx1cihjYWxjKHZhcigtLWJsdXJMZXZlbCkgKiAxKSl9XHJcblxyXG4gICAgICAgICAgOmlzKC5uYXYtZm9sZGVyLXRpdGxlLCAubmF2LWZpbGUtdGl0bGUpW2RhdGEtcGF0aF49JHtkfV06aG92ZXIge2ZpbHRlcjogdW5zZXR9XHJcblxyXG4gICAgICAgICAgLnByaXZhY3ktZ2xhc3Nlcy1yZXZlYWwtYWxsIDppcygubmF2LWZvbGRlci10aXRsZSwgLm5hdi1maWxlLXRpdGxlKVtkYXRhLXBhdGhePSR7ZH1dIHtmaWx0ZXI6IHVuc2V0fVxyXG5cclxuXHJcbiAgICAgICAgICBgXHJcbiAgICAgIClcclxuICAgICAgLmpvaW4oXCJcIik7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJpdmFjeUdsYXNzZXNTZXR0aW5ncyB7XHJcbiAgYmx1ck9uU3RhcnR1cDogTGV2ZWw7XHJcbiAgYmx1ckxldmVsOiBudW1iZXI7XHJcbiAgYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzOiBudW1iZXI7XHJcbiAgaG92ZXJUb1JldmVhbDogYm9vbGVhbjtcclxuICByZXZlYWxVbmRlckNhcmV0OiBib29sZWFuO1xyXG4gIHByaXZhdGVEaXJzOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZU5vdGVNYXJrZXI6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUHJpdmFjeUdsYXNzZXNTZXR0aW5ncyA9IHtcclxuICBibHVyT25TdGFydHVwOiBMZXZlbC5IaWRlUHJpdmF0ZSxcclxuICBibHVyTGV2ZWw6IDAuMyxcclxuICBibHVyT25JZGxlVGltZW91dFNlY29uZHM6IC0xLFxyXG4gIGhvdmVyVG9SZXZlYWw6IHRydWUsXHJcbiAgcmV2ZWFsVW5kZXJDYXJldDogZmFsc2UsXHJcbiAgcHJpdmF0ZURpcnM6IFwiXCIsXHJcbiAgcHJpdmF0ZU5vdGVNYXJrZXI6IFwiI3ByaXZhdGVcIixcclxufTtcclxuXHJcbmNsYXNzIHByaXZhY3lHbGFzc2VzU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG4gIHBsdWdpbjogUHJpdmFjeUdsYXNzZXNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogUHJpdmFjeUdsYXNzZXNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheSgpOiB2b2lkIHtcclxuICAgIGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cclxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHtcclxuICAgICAgdGV4dDogXCJQcml2YWN5IEdsYXNzZXMgdlwiICsgdGhpcy5wbHVnaW4ubWFuaWZlc3QudmVyc2lvbixcclxuICAgIH0pO1xyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJhXCIsIHtcclxuICAgICAgdGV4dDogXCJodHRwczovL2dpdGh1Yi5jb20vamlsbGFsYmVydHMvcHJpdmFjeS1nbGFzc2VzXCIsXHJcbiAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2ppbGxhbGJlcnRzL3ByaXZhY3ktZ2xhc3Nlc1wiLFxyXG4gICAgfSk7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcInNwYW5cIiwge1xyXG4gICAgICB0ZXh0OiBcIjogZG9jdW1lbnRhdGlvbiwgcmVwb3J0IGlzc3VlcywgY29udGFjdCBpbmZvXCIsXHJcbiAgICB9KTtcclxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7XHJcbiAgICAgIHRleHQ6ICdUbyBhY3RpdmF0ZS9kZWFjdGl2YXRlIFByaXZhY3kgR2xhc3NlcywgY2xpY2sgdGhlIGdsYXNzZXMgaWNvbiBvbiB0aGUgbGVmdC1oYW5kIHJpYmJvbiBvciBydW4gXCJQcml2YWN5IEdsYXNzZXNcIiBjb21tYW5kcyBpbiB0aGUgQ29tbWFuZCBQYWxldHRlIChDdHJsLVApLiBUaGUgY29tbWFuZCBjYW4gYWxzbyBiZSBib3VuZCB0byBhIGtleWJvYXJkIHNob3J0Y3V0IGlmIHlvdSB3aXNoLicsXHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJBY3RpdmF0ZSBQcml2YWN5IEdsYXNzZXMgb24gc3RhcnR1cFwiKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICBcIkluZGljYXRlcyB3aGV0aGVyIHRoZSBwbHVnaW4gaXMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgd2hlbiBzdGFydGluZyBPYnNpZGlhbi5cIlxyXG4gICAgICApXHJcbiAgICAgIC5hZGREcm9wZG93bigodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlLmFkZE9wdGlvbnMoe1xyXG4gICAgICAgICAgXCJoaWRlLWFsbFwiOiBcIkhpZGUgYWxsXCIsXHJcbiAgICAgICAgICBcImhpZGUtcHJpdmF0ZVwiOiBcIkhpZGUgcHJpdmF0ZSAoZGVmYXVsdClcIixcclxuICAgICAgICAgIFwicmV2ZWFsLWFsbFwiOiBcIlJldmVhbCBhbGxcIixcclxuICAgICAgICAgIFwicmV2ZWFsLWhlYWRsaW5lc1wiOiBcIlJldmVhbCBoZWFkbGluZXMgb25seVwiXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJPblN0YXJ0dXApO1xyXG4gICAgICAgIHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJPblN0YXJ0dXAgPSB2YWx1ZSBhcyBMZXZlbDtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJIaWRlIGFsbCBhZnRlciB1c2VyIGluYWN0aXZpdHkgKHNlY29uZHMpXCIpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIFwiSW5hY3Rpdml0eSB0aW1lIGFmdGVyIHdoaWNoIFByaXZhY3kgR2xhc3NlcyB3aWxsIGhpZGUgYWxsLiAtMSB0byBkaXNhYmxlIGF1dG8taGlkaW5nLlwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHRmaWVsZCkgPT4ge1xyXG4gICAgICAgIHRleHRmaWVsZC5zZXRQbGFjZWhvbGRlcihcIi0xXCIpO1xyXG4gICAgICAgIHRleHRmaWVsZC5pbnB1dEVsLnR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgIHRleHRmaWVsZC5pbnB1dEVsLm1pbiA9IFwiLTFcIjtcclxuICAgICAgICB0ZXh0ZmllbGQuc2V0VmFsdWUoXHJcbiAgICAgICAgICBTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmx1ck9uSWRsZVRpbWVvdXRTZWNvbmRzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGV4dGZpZWxkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGlzTmFOKHBhcnNlZCkpIHtcclxuICAgICAgICAgICAgcGFyc2VkID0gLTE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5ibHVyT25JZGxlVGltZW91dFNlY29uZHMgPSBwYXJzZWQ7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKFwiSG92ZXIgdG8gcmV2ZWFsXCIpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIFwiSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHJldmVhbCBjb250ZW50IHdoZW4gaG92ZXJpbmcgdGhlIGN1cnNvciBvdmVyIGl0LlwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhvdmVyVG9SZXZlYWwpO1xyXG4gICAgICAgIHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmhvdmVyVG9SZXZlYWwgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnVwZGF0ZUxlYXZlc0FuZEdsb2JhbFJldmVhbHMoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoXCJSZXZlYWwgdW5kZXIgY2FyZXRcIilcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgXCJJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gcmV2ZWFsIGNvbnRlbnQgd2hlbiBjYXJldCBpcyBvbiBpdC5cIlxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZXZlYWxVbmRlckNhcmV0KTtcclxuICAgICAgICB0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZXZlYWxVbmRlckNhcmV0ID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi51cGRhdGVHbG9iYWxSZXZlYWxTdHlsZSgpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHZhciBzbGlkZXJFbCA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcclxuICAgIGxldCBzbGlkZXJFbERlc2MgPSBcIkhpZ2hlciBpcyBibHVycmllci4gRGVmYXVsdD02MCwgY3VycmVudD1cIjtcclxuICAgIHNsaWRlckVsXHJcbiAgICAgIC5zZXROYW1lKFwiQmx1ciBsZXZlbFwiKVxyXG4gICAgICAuc2V0RGVzYyhzbGlkZXJFbERlc2MgKyBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJMZXZlbCAqIDEwMCkpXHJcbiAgICAgIC8vIF4gbmVlZCByb3VuZGluZyB0byBub3Qgc2hvdyB2YWx1ZXMgbGlrZSAnNTUuMDAwMDAwMDAwMDAwMDEnXHJcbiAgICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT5cclxuICAgICAgICBzbGlkZXJcclxuICAgICAgICAgIC5zZXRMaW1pdHMoMC4xLCAxLjUsIDAuMDUpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYmx1ckxldmVsKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5ibHVyTGV2ZWwgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2xpZGVyRWwuc2V0RGVzYyhcclxuICAgICAgICAgICAgICBzbGlkZXJFbERlc2MgKyBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLnNldHRpbmdzLmJsdXJMZXZlbCAqIDEwMClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4udXBkYXRlQmx1ckxldmVsRWwoKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZShcIlByaXZhdGUgZGlyZWN0b3JpZXNcIilcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgXCJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcywgaW4gd2hpY2ggZmlsZXMgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZVwiXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiZmluYW5jZSx0aGVyYXB5XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJpdmF0ZURpcnMpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnByaXZhdGVEaXJzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi51cGRhdGVMZWF2ZXNBbmRHbG9iYWxSZXZlYWxzKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnVwZGF0ZVByaXZhdGVEaXJzRWwoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKFwiUHJpdmF0ZSBub3RlIG1hcmtlclwiKVxyXG4gICAgICAuc2V0RGVzYyhcIlN0YXJ0IGEgbm90ZSB3aXRoIHRoaXMgdGV4dCB0byBtYXJrIG5vdGUgYXMgcHJpdmF0ZVwiKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCIjcHJpdmF0ZVwiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnByaXZhdGVOb3RlTWFya2VyKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcml2YXRlTm90ZU1hcmtlciA9IHZhbHVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4udXBkYXRlTGVhdmVzU3R5bGUoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBodHRwczovL2ljb24tc2V0cy5pY29uaWZ5LmRlc2lnbi9waC9leWUtc2xhc2gvXHJcbmNvbnN0IGV5ZVNsYXNoSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTUzLjkgMzQuNmE4IDggMCAwIDAtMTEuOCAxMC44bDE5LjIgMjEuMUMyNSA4OC44IDkuNCAxMjMuMiA4LjcgMTI0LjhhOC4yIDguMiAwIDAgMCAwIDYuNWMuMy43IDguOCAxOS41IDI3LjYgMzguNGMyNS4xIDI1IDU2LjggMzguMyA5MS43IDM4LjNhMTI4LjYgMTI4LjYgMCAwIDAgNTIuMS0xMC44bDIyIDI0LjJhOCA4IDAgMCAwIDUuOSAyLjZhOC4yIDguMiAwIDAgMCA1LjQtMi4xYTcuOSA3LjkgMCAwIDAgLjUtMTEuM1ptNDcuMyA3NS45bDQxLjcgNDUuOEEzMS42IDMxLjYgMCAwIDEgMTI4IDE2MGEzMiAzMiAwIDAgMS0yNi44LTQ5LjVaTTEyOCAxOTJjLTMwLjggMC01Ny43LTExLjItNzkuOS0zMy4zQTEyOC4zIDEyOC4zIDAgMCAxIDI1IDEyOGM0LjctOC44IDE5LjgtMzMuNSA0Ny4zLTQ5LjRsMTggMTkuOGE0OCA0OCAwIDAgMCA2My42IDcwbDE0LjcgMTYuMkExMTIuMSAxMTIuMSAwIDAgMSAxMjggMTkyWm0xMTkuMy02MC43Yy0uNC45LTEwLjUgMjMuMy0zMy40IDQzLjhhOC4xIDguMSAwIDAgMS01LjMgMmE3LjYgNy42IDAgMCAxLTUuOS0yLjdhOCA4IDAgMCAxIC42LTExLjNBMTMxIDEzMSAwIDAgMCAyMzEgMTI4YTEzMC4zIDEzMC4zIDAgMCAwLTIzLjEtMzAuOEMxODUuNyA3NS4yIDE1OC44IDY0IDEyOCA2NGExMTIuOSAxMTIuOSAwIDAgMC0xOS40IDEuNmE4LjEgOC4xIDAgMCAxLTkuMi02LjZhOCA4IDAgMCAxIDYuNi05LjJhMTMyLjQgMTMyLjQgMCAwIDEgMjItMS44YzM0LjkgMCA2Ni42IDEzLjMgOTEuNyAzOC4zYzE4LjggMTguOSAyNy4zIDM3LjcgMjcuNiAzOC41YTguMiA4LjIgMCAwIDEgMCA2LjVaTTEzNCA5Ni42YTggOCAwIDAgMSAzLTE1LjhhNDguMyA0OC4zIDAgMCAxIDM4LjggNDIuN2E4IDggMCAwIDEtNy4yIDguN2gtLjhhNy45IDcuOSAwIDAgMS03LjktNy4yQTMyLjIgMzIuMiAwIDAgMCAxMzQgOTYuNlpcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZS1jbG9zZWQtYm9sZC9cclxuY29uc3QgZXllQ2xvc2VkSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIzNC40IDE2MC44YTEyIDEyIDAgMCAxLTEwLjQgMThhMTEuOCAxMS44IDAgMCAxLTEwLjQtNmwtMTYuMy0yOC4yYTEyNiAxMjYgMCAwIDEtMjkuNCAxMy41bDUuMiAyOS40YTExLjkgMTEuOSAwIDAgMS05LjcgMTMuOWwtMi4xLjJhMTIgMTIgMCAwIDEtMTEuOC05LjlsLTUuMS0yOC43YTEyMy41IDEyMy41IDAgMCAxLTE2LjQgMWExNDYuMyAxNDYuMyAwIDAgMS0xNi41LTFsLTUuMSAyOC43YTEyIDEyIDAgMCAxLTExLjggOS45bC0yLjEtLjJhMTEuOSAxMS45IDAgMCAxLTkuNy0xMy45bDUuMi0yOS40YTEyNS4zIDEyNS4zIDAgMCAxLTI5LjMtMTMuNUw0Mi4zIDE3M2ExMi4xIDEyLjEgMCAwIDEtMTAuNCA2YTExLjcgMTEuNyAwIDAgMS02LTEuNmExMiAxMiAwIDAgMS00LjQtMTYuNGwxNy45LTMxYTE0Mi40IDE0Mi40IDAgMCAxLTE2LjctMTcuNmExMiAxMiAwIDEgMSAxOC42LTE1LjFDNTcuMSAxMTYuOCA4NC45IDE0MCAxMjggMTQwczcwLjktMjMuMiA4Ni43LTQyLjdhMTIgMTIgMCAxIDEgMTguNiAxNS4xYTE1MC4zIDE1MC4zIDAgMCAxLTE2LjcgMTcuN1pcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZS9cclxuY29uc3QgZXllSWNvbiA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiIHZpZXdCb3g9XCIwIDAgMjU2IDI1NlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTI0Ny4zIDEyNC44Yy0uMy0uOC04LjgtMTkuNi0yNy42LTM4LjVDMTk0LjYgNjEuMyAxNjIuOSA0OCAxMjggNDhTNjEuNCA2MS4zIDM2LjMgODYuM0MxNy41IDEwNS4yIDkgMTI0IDguNyAxMjQuOGE3LjkgNy45IDAgMCAwIDAgNi40Yy4zLjggOC44IDE5LjYgMjcuNiAzOC41YzI1LjEgMjUgNTYuOCAzOC4zIDkxLjcgMzguM3M2Ni42LTEzLjMgOTEuNy0zOC4zYzE4LjgtMTguOSAyNy4zLTM3LjcgMjcuNi0zOC41YTcuOSA3LjkgMCAwIDAgMC02LjRaTTEyOCAxOTJjLTMwLjggMC01Ny43LTExLjItNzkuOS0zMy4zQTEzMC4zIDEzMC4zIDAgMCAxIDI1IDEyOGExMzAuMyAxMzAuMyAwIDAgMSAyMy4xLTMwLjhDNzAuMyA3NS4yIDk3LjIgNjQgMTI4IDY0czU3LjcgMTEuMiA3OS45IDMzLjJBMTMwLjMgMTMwLjMgMCAwIDEgMjMxIDEyOGMtNy4yIDEzLjUtMzguNiA2NC0xMDMgNjRabTAtMTEyYTQ4IDQ4IDAgMSAwIDQ4IDQ4YTQ4IDQ4IDAgMCAwLTQ4LTQ4Wm0wIDgwYTMyIDMyIDAgMSAxIDMyLTMyYTMyLjEgMzIuMSAwIDAgMS0zMiAzMlpcIi8+PC9zdmc+YDtcclxuXHJcbi8vIGh0dHBzOi8vaWNvbi1zZXRzLmljb25pZnkuZGVzaWduL3BoL2V5ZWdsYXNzZXMvXHJcbmNvbnN0IGV5ZUdsYXNzZXMgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkIG1lZXRcIiB2aWV3Qm94PVwiMCAwIDI1NiAyNTZcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0yMDAgNDBhOCA4IDAgMCAwIDAgMTZhMTYgMTYgMCAwIDEgMTYgMTZ2NTguMDhBNDQgNDQgMCAwIDAgMTQ1LjY4IDE1MmgtMzUuMzZBNDQgNDQgMCAwIDAgNDAgMTMwLjA4VjcyYTE2IDE2IDAgMCAxIDE2LTE2YTggOCAwIDAgMCAwLTE2YTMyIDMyIDAgMCAwLTMyIDMydjkyYTQ0IDQ0IDAgMCAwIDg3LjgxIDRoMzIuMzhhNDQgNDQgMCAwIDAgODcuODEtNFY3MmEzMiAzMiAwIDAgMC0zMi0zMlpNNjggMTkyYTI4IDI4IDAgMSAxIDI4LTI4YTI4IDI4IDAgMCAxLTI4IDI4Wm0xMjAgMGEyOCAyOCAwIDEgMSAyOC0yOGEyOCAyOCAwIDAgMS0yOCAyOFpcIi8+PC9zdmc+YDsiXSwibmFtZXMiOlsiUGx1Z2luIiwiYWRkSWNvbiIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBb0dBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUs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