/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/main.ts var main_exports = {}; __export(main_exports, { ExplorerFocusPlugin: () => ExplorerFocusPlugin, default: () => main_default }); module.exports = __toCommonJS(main_exports); var import_obsidian5 = require("obsidian"); // src/types.ts var DEFAULT_SETTINGS = { showRightClickMenu: true, showFileExplorerIcon: true, focusLevel: "parent", customFolderPath: "", hideAncestorFolders: false, autoHidePaths: [] }; // src/ui/settings-tab.ts var import_obsidian4 = require("obsidian"); // src/utils/file-explorer-patch.ts var import_obsidian = require("obsidian"); // node_modules/.pnpm/monkey-around@3.0.0/node_modules/monkey-around/dist/index.mjs function around(obj, factories) { const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key])); return removers.length === 1 ? removers[0] : function() { removers.forEach((r) => r()); }; } function around1(obj, method, createWrapper) { const inherited = obj[method], hadOwn = obj.hasOwnProperty(method), original = hadOwn ? inherited : function() { return Object.getPrototypeOf(obj)[method].apply(this, arguments); }; let current = createWrapper(original); if (inherited) Object.setPrototypeOf(current, inherited); Object.setPrototypeOf(wrapper, current); obj[method] = wrapper; return remove; function wrapper(...args) { if (current === original && obj[method] === wrapper) remove(); return current.apply(this, args); } function remove() { if (obj[method] === wrapper) { if (hadOwn) obj[method] = original; else delete obj[method]; } if (current === original) return; current = original; Object.setPrototypeOf(wrapper, inherited || Function); } } // src/utils/file-explorer-patch.ts var prototypePatched = false; var patchingFailed = false; function patchFileExplorer(plugin) { if (patchingFailed) { return; } if (import_obsidian.Platform.isMobile) { patchingFailed = true; return; } const fileExplorer = getFileExplorer(plugin); if (!fileExplorer) { return; } if (!prototypePatched) { try { const prototype = Object.getPrototypeOf(fileExplorer); if (typeof prototype.getSortedFolderItems !== "function") { throw new Error("getSortedFolderItems method not found on file explorer prototype"); } plugin.register( around(prototype, { getSortedFolderItems(old) { return function(folder) { let sortedChildren = old.call(this, folder); if (plugin.isFocus && plugin.focusedPath) { const focusedPath = plugin.focusedPath; sortedChildren = sortedChildren.filter((vEl) => { const filePath = vEl.file.path; if (filePath === focusedPath) { vEl.info.hidden = false; return true; } if (filePath.startsWith(focusedPath + "/")) { vEl.info.hidden = false; return true; } if (focusedPath.startsWith(filePath + "/")) { vEl.info.hidden = false; return true; } vEl.info.hidden = true; return false; }); } else { sortedChildren.forEach((vEl) => { vEl.info.hidden = false; }); } return sortedChildren; }; } }) ); prototypePatched = true; } catch (error) { patchingFailed = true; console.warn( "[Explorer Focus] Failed to patch file explorer. The plugin will use CSS-based hiding as a fallback, which may be less precise. This usually happens after an Obsidian update - please check for plugin updates.", error ); new import_obsidian.Notice( "Explorer Focus: File explorer patching failed. The plugin will still work but may need an update for full functionality.", 8e3 ); return; } } fileExplorer.fileExplorerPlusPatched = true; } function getFileExplorer(plugin) { var _a; const fileExplorerContainer = (_a = plugin.app.workspace.getLeavesOfType("file-explorer")) == null ? void 0 : _a.first(); return fileExplorerContainer == null ? void 0 : fileExplorerContainer.view; } function getAllFileExplorers(plugin) { const fileExplorerLeaves = plugin.app.workspace.getLeavesOfType("file-explorer"); return fileExplorerLeaves.map((leaf) => leaf.view); } // src/ui/folder-suggest.ts var import_obsidian2 = require("obsidian"); var FolderSuggest = class extends import_obsidian2.AbstractInputSuggest { constructor(app, inputEl) { super(app, inputEl); this.inputEl = inputEl; } getSuggestions(query) { const lowerQuery = query.toLowerCase(); const folders = []; this.app.vault.getAllLoadedFiles().forEach((file) => { if (file instanceof import_obsidian2.TFolder) { if (file.path.toLowerCase().includes(lowerQuery)) { folders.push(file); } } }); folders.sort((a, b) => a.path.localeCompare(b.path)); return folders.slice(0, 20); } renderSuggestion(folder, el) { el.createEl("div", { text: folder.path || "/" }); } selectSuggestion(folder) { this.inputEl.value = folder.path; this.inputEl.trigger("input"); this.close(); } }; // src/ui/auto-hide-modal.ts var import_obsidian3 = require("obsidian"); var AutoHideModal = class extends import_obsidian3.Modal { constructor(app, plugin, onSave) { var _a; super(app); this.addInput = null; this.plugin = plugin; this.paths = [...(_a = plugin.settings.autoHidePaths) != null ? _a : []]; this.onSave = onSave; } onOpen() { this.setTitle("Auto-hide folders"); this.renderContent(); } renderContent() { var _a; const { contentEl } = this; contentEl.empty(); contentEl.createEl("p", { text: "The following folders are currently hidden from the file explorer." }); const listWrapper = contentEl.createDiv(); this.paths.forEach((path, index) => { const row = listWrapper.createDiv({ cls: "mobile-option-setting-item" }); row.createSpan({ text: path || "(empty)", cls: "mobile-option-setting-item-name" }); const removeBtn = row.createDiv({ cls: "clickable-icon mobile-option-setting-item-option-icon", attr: { "aria-label": "Delete" } }); (0, import_obsidian3.setIcon)(removeBtn, "x"); removeBtn.addEventListener("click", () => { this.paths.splice(index, 1); this.renderContent(); }); }); new import_obsidian3.Setting(contentEl).setName("Folder").addText((text) => { new FolderSuggest(this.app, text.inputEl); text.setPlaceholder("Enter folder path"); this.addInput = text; }).addButton((button) => button.setButtonText("Add").onClick(() => { var _a2, _b, _c; const value = (_b = (_a2 = this.addInput) == null ? void 0 : _a2.getValue()) == null ? void 0 : _b.trim(); if (value) { this.paths.push(value); (_c = this.addInput) == null ? void 0 : _c.setValue(""); this.renderContent(); } })); (_a = this.modalEl.querySelector(".modal-button-container")) == null ? void 0 : _a.remove(); const buttonContainer = this.modalEl.createDiv({ cls: "modal-button-container" }); const saveBtn = buttonContainer.createEl("button", { text: "Save", cls: "mod-cta" }); saveBtn.addEventListener("click", () => { this.plugin.settings.autoHidePaths = this.paths; void this.plugin.saveSettings(); this.plugin.updateAutoHideStyles(); this.onSave(); this.close(); }); const cancelBtn = buttonContainer.createEl("button", { text: "Cancel", cls: "mod-cancel" }); cancelBtn.addEventListener("click", () => { this.close(); }); } }; // src/ui/settings-tab.ts var ExplorerFocusSettingTab = class extends import_obsidian4.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.icon = "lucide-focus"; this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); const generalGroup = new import_obsidian4.SettingGroup(containerEl); generalGroup.addSetting((setting) => { setting.setName("Show right-click menu option").addToggle((toggle) => toggle.setValue(this.plugin.settings.showRightClickMenu).onChange(async (value) => { this.plugin.settings.showRightClickMenu = value; await this.plugin.saveSettings(); })); }); generalGroup.addSetting((setting) => { setting.setName("Show file explorer icon").addToggle((toggle) => toggle.setValue(this.plugin.settings.showFileExplorerIcon).onChange(async (value) => { this.plugin.settings.showFileExplorerIcon = value; await this.plugin.saveSettings(); this.plugin.updateFileExplorerIcon(); })); }); generalGroup.addSetting((setting) => { setting.setName("Command focus level").setDesc("Determines what to focus when using the toggle command or file explorer icon. Right-click menu always focuses the clicked file/folder.").addDropdown((dropdown) => dropdown.addOption("file", "Current file only").addOption("parent", "Parent folder").addOption("grandparent", "Grandparent folder").addOption("greatgrandparent", "Great grandparent folder").addOption("custom", "Specific folder").setValue(this.plugin.settings.focusLevel).onChange(async (value) => { this.plugin.settings.focusLevel = value; await this.plugin.saveSettings(); if (this.plugin.isFocus) { const fileExplorers = getAllFileExplorers(this.plugin); fileExplorers.forEach((fileExplorer) => { if (fileExplorer == null ? void 0 : fileExplorer.requestSort) { fileExplorer.requestSort(); } }); } this.display(); })); }); if (this.plugin.settings.focusLevel === "custom") { generalGroup.addSetting((setting) => { setting.setName("Custom folder path").setDesc("Enter a folder path (folder/subfolder). This folder will be focused regardless of which file is open.").addText((text) => { new FolderSuggest(this.app, text.inputEl); text.setPlaceholder("Folder/subfolder").setValue(this.plugin.settings.customFolderPath).onChange(async (value) => { this.plugin.settings.customFolderPath = value; await this.plugin.saveSettings(); }); }); }); } const autoHideGroup = new import_obsidian4.SettingGroup(containerEl).setHeading("Auto-hide folders"); autoHideGroup.addSetting((setting) => { var _a; const autoHidePaths = ((_a = this.plugin.settings.autoHidePaths) != null ? _a : []).filter((p) => p.trim().length > 0); const descFragment = document.createDocumentFragment(); descFragment.appendText("These folders are always hidden from the file explorer."); if (autoHidePaths.length > 0) { const list = descFragment.createEl("ul"); autoHidePaths.forEach((p) => { list.createEl("li", { text: p }); }); } setting.setName("Hidden folders").setDesc(descFragment).addButton((button) => button.setButtonText("Manage").onClick(() => { new AutoHideModal(this.app, this.plugin, () => { this.display(); }).open(); })); }); } }; // src/utils/focus.ts function getFocusPath(path, level, settings) { if (level === "custom") { return settings.customFolderPath || path; } if (level === "file") { return path; } const parts = path.split("/"); if (level === "parent") { if (parts.length === 1) { return path; } return parts.slice(0, -1).join("/"); } if (level === "grandparent") { if (parts.length <= 2) { return parts[0] || path; } return parts.slice(0, -2).join("/"); } if (parts.length <= 3) { return parts[0] || path; } return parts.slice(0, -3).join("/"); } // src/commands/index.ts function registerCommands(plugin) { plugin.addCommand({ id: "toggle", name: "Toggle focus", callback: () => { if (plugin.isFocus) { plugin.exitFocus(); } else { if (plugin.settings.focusLevel === "custom") { if (plugin.settings.customFolderPath) { plugin.enterFocus(plugin.settings.customFolderPath); } } else { const file = plugin.app.workspace.getActiveFile(); if (file == null ? void 0 : file.path) { const focusPath = getFocusPath(file.path, plugin.settings.focusLevel, plugin.settings); plugin.enterFocus(focusPath); } } } } }); if (plugin.settings.showRightClickMenu) { plugin.registerEvent( plugin.app.workspace.on("file-menu", (menu, file) => { if (!plugin.settings.showRightClickMenu) { return; } menu.addItem((item) => { item.setTitle(plugin.isFocus ? "Exit focus" : "Focus").setIcon(plugin.isFocus ? "log-out" : "focus").onClick(() => { plugin.toggleFocus(file == null ? void 0 : file.path); }); }); }) ); } } // src/utils/file-explorer.ts function findNavButtonsContainer(fileExplorerView) { var _a; let container = fileExplorerView.querySelector(".nav-buttons-container"); if (container) { return container; } container = fileExplorerView.querySelector(".nav-header-button-container"); if (container) { return container; } const existingButtons = fileExplorerView.querySelectorAll(".nav-action-button"); if (existingButtons.length > 0) { const firstButton = existingButtons[0]; const parent = firstButton.parentElement; if (parent && (parent.classList.contains("nav-buttons-container") || parent.classList.contains("nav-header-button-container") || Array.from(parent.children).some((el) => el.classList.contains("nav-action-button")))) { return parent; } } const viewHeader = fileExplorerView.querySelector(".view-header"); if (viewHeader) { const headerContainer = viewHeader.querySelector(".nav-buttons-container") || viewHeader.querySelector(".nav-header-button-container") || viewHeader.querySelector(".view-header-title-container"); if (headerContainer) { return headerContainer; } return viewHeader; } const navFilesContainer = fileExplorerView.querySelector(".nav-files-container"); if (navFilesContainer) { let mobileButtonContainer = fileExplorerView.querySelector(".explorer-focus-mobile-buttons"); if (!mobileButtonContainer) { mobileButtonContainer = document.createElement("div"); mobileButtonContainer.className = "nav-buttons-container explorer-focus-mobile-buttons"; mobileButtonContainer.setCssProps({ display: "flex", alignItems: "center", gap: "4px", padding: "8px", borderBottom: "1px solid var(--background-modifier-border)" }); (_a = navFilesContainer.parentElement) == null ? void 0 : _a.insertBefore(mobileButtonContainer, navFilesContainer); } return mobileButtonContainer; } let topContainer = fileExplorerView.querySelector(".explorer-focus-mobile-buttons"); if (!topContainer) { topContainer = document.createElement("div"); topContainer.className = "nav-buttons-container explorer-focus-mobile-buttons"; topContainer.setCssProps({ display: "flex", alignItems: "center", gap: "4px", padding: "8px", borderBottom: "1px solid var(--background-modifier-border)" }); fileExplorerView.insertBefore(topContainer, fileExplorerView.firstChild); } return topContainer; } function createFileExplorerIcon(plugin) { const icon = document.createElement("div"); icon.className = "clickable-icon nav-action-button"; icon.setAttribute("aria-label", "Toggle focus"); const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); svg.setAttribute("width", "24"); svg.setAttribute("height", "24"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("fill", "none"); svg.setAttribute("stroke", "currentColor"); svg.setAttribute("stroke-width", "2"); svg.setAttribute("stroke-linecap", "round"); svg.setAttribute("stroke-linejoin", "round"); svg.setAttribute("class", "svg-icon lucide-focus"); const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circle.setAttribute("cx", "12"); circle.setAttribute("cy", "12"); circle.setAttribute("r", "3"); svg.appendChild(circle); const path1 = document.createElementNS("http://www.w3.org/2000/svg", "path"); path1.setAttribute("d", "M3 7V5a2 2 0 0 1 2-2h2"); svg.appendChild(path1); const path2 = document.createElementNS("http://www.w3.org/2000/svg", "path"); path2.setAttribute("d", "M17 3h2a2 2 0 0 1 2 2v2"); svg.appendChild(path2); const path3 = document.createElementNS("http://www.w3.org/2000/svg", "path"); path3.setAttribute("d", "M21 17v2a2 2 0 0 1-2 2h-2"); svg.appendChild(path3); const path4 = document.createElementNS("http://www.w3.org/2000/svg", "path"); path4.setAttribute("d", "M7 21H5a2 2 0 0 1-2-2v-2"); svg.appendChild(path4); icon.appendChild(svg); return icon; } function insertFileExplorerIcon(icon, navButtonsContainer) { if (navButtonsContainer.contains(icon)) { return; } const allIcons = Array.from(navButtonsContainer.querySelectorAll(".clickable-icon.nav-action-button")); const defaultIcons = allIcons.filter((el) => !el.classList.contains("cmdr") && el !== icon); const cmdrIcons = Array.from(navButtonsContainer.querySelectorAll(".cmdr")); if (cmdrIcons.length > 0) { navButtonsContainer.insertBefore(icon, cmdrIcons[0]); } else if (defaultIcons.length > 0) { const lastIcon = defaultIcons[defaultIcons.length - 1]; if (lastIcon.nextSibling) { navButtonsContainer.insertBefore(icon, lastIcon.nextSibling); } else { navButtonsContainer.appendChild(icon); } } else { navButtonsContainer.appendChild(icon); } } // src/main.ts var ExplorerFocusPlugin = class extends import_obsidian5.Plugin { constructor(app, manifest) { super(app, manifest); this.isFocus = false; this.focusedPath = null; this.fileExplorerIcon = null; } async onload() { await this.loadSettings(); this.addSettingTab(new ExplorerFocusSettingTab(this.app, this)); registerCommands(this); if (this.settings.showFileExplorerIcon) { this.addFileExplorerIcon(); } this.app.workspace.onLayoutReady(() => { this.patchAllFileExplorers(); this.updateFocusModeClasses(); this.updateAutoHideStyles(); }); this.app.workspace.on("layout-change", () => { this.patchAllFileExplorers(); this.updateFocusModeClasses(); this.updateAutoHideStyles(); }); } async loadSettings() { const loadedData = await this.loadData(); this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData); } async saveSettings() { await this.saveData(this.settings); } toggleFocus(path) { if (this.isFocus) { this.exitFocus(); } else if (path) { this.enterFocus(path); } } enterFocus(path) { this.isFocus = true; this.focusedPath = path; this.updateFileExplorerIcon(); this.updateFocusModeClasses(); const fileExplorers = getAllFileExplorers(this); fileExplorers.forEach((fileExplorer) => { if (fileExplorer == null ? void 0 : fileExplorer.requestSort) { fileExplorer.requestSort(); } }); setTimeout(() => { fileExplorers.forEach((fileExplorer) => { this.refreshFileExplorerVisibility(fileExplorer); }); }, 0); } patchAllFileExplorers() { patchFileExplorer(this); const fileExplorers = getAllFileExplorers(this); fileExplorers.forEach((fileExplorer) => { fileExplorer.fileExplorerPlusPatched = true; }); } exitFocus() { this.isFocus = false; this.focusedPath = null; this.updateFileExplorerIcon(); this.updateFocusModeClasses(); const fileExplorers = getAllFileExplorers(this); fileExplorers.forEach((fileExplorer) => { if (fileExplorer == null ? void 0 : fileExplorer.requestSort) { fileExplorer.requestSort(); } }); setTimeout(() => { fileExplorers.forEach((fileExplorer) => { this.refreshFileExplorerVisibility(fileExplorer); }); this.updateAutoHideStyles(); }, 0); } refreshFileExplorerVisibility(fileExplorer) { if (!(fileExplorer == null ? void 0 : fileExplorer.fileItems)) { return; } if (!this.isFocus || !this.focusedPath) { Object.values(fileExplorer.fileItems).forEach((vEl) => { if (!(vEl == null ? void 0 : vEl.el)) return; if (vEl.el.hasAttribute("data-explorer-focus-hidden")) { if (vEl.info) vEl.info.hidden = false; vEl.el.setCssProps({ display: "" }); vEl.el.removeAttribute("data-explorer-focus-hidden"); } }); return; } const focusedPath = this.focusedPath; const ancestorPaths = /* @__PURE__ */ new Set(); const pathParts = focusedPath.split("/"); for (let i = 1; i < pathParts.length; i++) { ancestorPaths.add(pathParts.slice(0, i).join("/")); } const topLevelFolders = /* @__PURE__ */ new Map(); const rootItems = []; for (const path of Object.keys(fileExplorer.fileItems)) { const firstSlash = path.indexOf("/"); if (firstSlash === -1) { rootItems.push(path); } else { const topLevel = path.substring(0, firstSlash); if (!topLevelFolders.has(topLevel)) { topLevelFolders.set(topLevel, []); } topLevelFolders.get(topLevel).push(path); } } const focusedTopLevel = focusedPath.split("/")[0]; for (const path of rootItems) { const vEl = fileExplorer.fileItems[path]; if (!(vEl == null ? void 0 : vEl.el)) continue; const shouldShow = path === focusedPath || focusedPath.startsWith(path + "/") || path.startsWith(focusedPath + "/"); this.updateItemVisibility(vEl, shouldShow); } for (const [topLevel, paths] of topLevelFolders) { const isInFocusPath = topLevel === focusedTopLevel || ancestorPaths.has(topLevel) || focusedPath === topLevel; if (!isInFocusPath) { for (const path of paths) { const vEl = fileExplorer.fileItems[path]; if (!(vEl == null ? void 0 : vEl.el)) continue; this.updateItemVisibility(vEl, false); } } else { for (const path of paths) { const vEl = fileExplorer.fileItems[path]; if (!(vEl == null ? void 0 : vEl.el)) continue; const shouldShow = path === focusedPath || path.startsWith(focusedPath + "/") || ancestorPaths.has(path); this.updateItemVisibility(vEl, shouldShow); } } } } updateItemVisibility(vEl, shouldShow) { const currentlyHidden = vEl.el.hasAttribute("data-explorer-focus-hidden"); if (shouldShow && currentlyHidden) { if (vEl.info) vEl.info.hidden = false; vEl.el.setCssProps({ display: "" }); vEl.el.removeAttribute("data-explorer-focus-hidden"); } else if (!shouldShow && !currentlyHidden) { if (vEl.info) vEl.info.hidden = true; vEl.el.setCssProps({ display: "none" }); vEl.el.setAttribute("data-explorer-focus-hidden", "true"); } } updateFocusModeClasses() { const fileExplorers = getAllFileExplorers(this); fileExplorers.forEach((fileExplorer) => { const containerEl = fileExplorer.containerEl; if (this.isFocus) { containerEl.addClass("explorer-focus-mode"); } else { containerEl.removeClass("explorer-focus-mode"); } }); } addFileExplorerIcon() { const handleIconClick = () => { if (this.isFocus) { this.exitFocus(); } else { if (this.settings.focusLevel === "custom") { if (this.settings.customFolderPath) { this.enterFocus(this.settings.customFolderPath); } } else { const file = this.app.workspace.getActiveFile(); if (file == null ? void 0 : file.path) { const focusPath = getFocusPath(file.path, this.settings.focusLevel, this.settings); this.enterFocus(focusPath); } } } }; const addIconToFileExplorer = () => { const fileExplorerLeaves = this.app.workspace.getLeavesOfType("file-explorer"); if (fileExplorerLeaves.length === 0) { return; } const fileExplorerView = fileExplorerLeaves[0].view.containerEl; const navButtonsContainer = findNavButtonsContainer(fileExplorerView); if (!navButtonsContainer) { return; } if (this.fileExplorerIcon && navButtonsContainer.contains(this.fileExplorerIcon)) { return; } if (this.fileExplorerIcon && this.fileExplorerIcon.parentElement) { this.fileExplorerIcon.remove(); } if (!this.fileExplorerIcon) { this.fileExplorerIcon = createFileExplorerIcon(this); this.fileExplorerIcon.setCssProps({ touchAction: "manipulation" }); let touchHandled = false; this.registerDomEvent(this.fileExplorerIcon, "touchstart", (evt) => { touchHandled = true; evt.preventDefault(); evt.stopPropagation(); handleIconClick(); setTimeout(() => { touchHandled = false; }, 300); }); this.registerDomEvent(this.fileExplorerIcon, "click", (evt) => { if (touchHandled) { evt.preventDefault(); evt.stopPropagation(); return; } evt.preventDefault(); evt.stopPropagation(); handleIconClick(); }); } this.updateFileExplorerIcon(); insertFileExplorerIcon(this.fileExplorerIcon, navButtonsContainer); }; addIconToFileExplorer(); this.registerEvent( this.app.workspace.on("layout-change", () => { if (this.settings.showFileExplorerIcon) { addIconToFileExplorer(); } }) ); } updateFileExplorerIcon() { if (!this.fileExplorerIcon) { return; } if (!this.settings.showFileExplorerIcon) { if (this.fileExplorerIcon.parentElement) { this.fileExplorerIcon.remove(); } return; } if (!this.fileExplorerIcon.parentElement) { const fileExplorerLeaves = this.app.workspace.getLeavesOfType("file-explorer"); if (fileExplorerLeaves.length > 0) { const fileExplorerView = fileExplorerLeaves[0].view.containerEl; const navButtonsContainer = findNavButtonsContainer(fileExplorerView); if (navButtonsContainer) { insertFileExplorerIcon(this.fileExplorerIcon, navButtonsContainer); } } } if (this.fileExplorerIcon.style.cursor) { this.fileExplorerIcon.style.removeProperty("cursor"); } if (this.isFocus) { this.fileExplorerIcon.addClass("is-active"); } else { this.fileExplorerIcon.removeClass("is-active"); } } updateAutoHideStyles() { var _a; const paths = new Set( ((_a = this.settings.autoHidePaths) != null ? _a : []).map((p) => p.trim()).filter((p) => p.length > 0) ); const fileExplorers = getAllFileExplorers(this); fileExplorers.forEach((fileExplorer) => { if (!(fileExplorer == null ? void 0 : fileExplorer.fileItems)) return; for (const [filePath, vEl] of Object.entries(fileExplorer.fileItems)) { if (!(vEl == null ? void 0 : vEl.el)) continue; const shouldHide = paths.has(filePath); const isHidden = vEl.el.hasAttribute("data-explorer-focus-auto-hidden"); if (shouldHide && !isHidden) { vEl.el.setCssProps({ display: "none" }); vEl.el.setAttribute("data-explorer-focus-auto-hidden", "true"); } else if (!shouldHide && isHidden) { vEl.el.setCssProps({ display: "" }); vEl.el.removeAttribute("data-explorer-focus-auto-hidden"); } } }); } onunload() { if (this.fileExplorerIcon) { this.fileExplorerIcon.remove(); this.fileExplorerIcon = null; } } }; var main_default = ExplorerFocusPlugin; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3R5cGVzLnRzIiwgInNyYy91aS9zZXR0aW5ncy10YWIudHMiLCAic3JjL3V0aWxzL2ZpbGUtZXhwbG9yZXItcGF0Y2gudHMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL21vbmtleS1hcm91bmRAMy4wLjAvbm9kZV9tb2R1bGVzL21vbmtleS1hcm91bmQvZGlzdC9pbmRleC5tanMiLCAic3JjL3VpL2ZvbGRlci1zdWdnZXN0LnRzIiwgInNyYy91aS9hdXRvLWhpZGUtbW9kYWwudHMiLCAic3JjL3V0aWxzL2ZvY3VzLnRzIiwgInNyYy9jb21tYW5kcy9pbmRleC50cyIsICJzcmMvdXRpbHMvZmlsZS1leHBsb3Jlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEV4cGxvcmVyRm9jdXNTZXR0aW5ncywgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBFeHBsb3JlckZvY3VzU2V0dGluZ1RhYiB9IGZyb20gJy4vdWkvc2V0dGluZ3MtdGFiJztcclxuaW1wb3J0IHsgcmVnaXN0ZXJDb21tYW5kcyB9IGZyb20gJy4vY29tbWFuZHMnO1xyXG5pbXBvcnQgeyBjcmVhdGVGaWxlRXhwbG9yZXJJY29uLCBpbnNlcnRGaWxlRXhwbG9yZXJJY29uLCBmaW5kTmF2QnV0dG9uc0NvbnRhaW5lciB9IGZyb20gJy4vdXRpbHMvZmlsZS1leHBsb3Jlcic7XHJcbmltcG9ydCB7IHBhdGNoRmlsZUV4cGxvcmVyIGFzIHBhdGNoRmlsZUV4cGxvcmVyVXRpbCwgZ2V0QWxsRmlsZUV4cGxvcmVycywgRmlsZUV4cGxvcmVyVmlldyB9IGZyb20gJy4vdXRpbHMvZmlsZS1leHBsb3Jlci1wYXRjaCc7XHJcbmltcG9ydCB7IGdldEZvY3VzUGF0aCB9IGZyb20gJy4vdXRpbHMvZm9jdXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV4cGxvcmVyRm9jdXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdGlzRm9jdXM6IGJvb2xlYW47XHJcblx0Zm9jdXNlZFBhdGg6IHN0cmluZyB8IG51bGw7XHJcblx0c2V0dGluZ3MhOiBFeHBsb3JlckZvY3VzU2V0dGluZ3M7XHJcblx0ZmlsZUV4cGxvcmVySWNvbjogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0KSB7XHJcblx0XHRzdXBlcihhcHAsIG1hbmlmZXN0KTtcclxuXHRcdHRoaXMuaXNGb2N1cyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IG51bGw7XHJcblx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24gPSBudWxsO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEV4cGxvcmVyRm9jdXNTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0cmVnaXN0ZXJDb21tYW5kcyh0aGlzKTtcclxuXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5zaG93RmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHR0aGlzLmFkZEZpbGVFeHBsb3Jlckljb24oKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcblx0XHRcdHRoaXMucGF0Y2hBbGxGaWxlRXhwbG9yZXJzKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUF1dG9IaWRlU3R5bGVzKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5wYXRjaEFsbEZpbGVFeHBsb3JlcnMoKTtcclxuXHRcdFx0dGhpcy51cGRhdGVGb2N1c01vZGVDbGFzc2VzKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlQXV0b0hpZGVTdHlsZXMoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0Y29uc3QgbG9hZGVkRGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKSBhcyBQYXJ0aWFsPEV4cGxvcmVyRm9jdXNTZXR0aW5ncz4gfCBudWxsO1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGxvYWRlZERhdGEpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdHRvZ2dsZUZvY3VzKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHR0aGlzLmV4aXRGb2N1cygpO1xyXG5cdFx0fSBlbHNlIGlmIChwYXRoKSB7XHJcblx0XHRcdHRoaXMuZW50ZXJGb2N1cyhwYXRoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGVudGVyRm9jdXMocGF0aDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmlzRm9jdXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IHBhdGg7XHJcblx0XHRcclxuXHRcdC8vIFVwZGF0ZSBpY29uIGlmIGl0IGV4aXN0c1xyXG5cdFx0dGhpcy51cGRhdGVGaWxlRXhwbG9yZXJJY29uKCk7XHJcblx0XHRcclxuXHRcdC8vIFVwZGF0ZSBDU1MgY2xhc3Nlc1xyXG5cdFx0dGhpcy51cGRhdGVGb2N1c01vZGVDbGFzc2VzKCk7XHJcblx0XHRcclxuXHRcdC8vIFRyaWdnZXIgZmlsZSBleHBsb3JlciByZWZyZXNoIG9uIGFsbCBmaWxlIGV4cGxvcmVyIGluc3RhbmNlc1xyXG5cdFx0Y29uc3QgZmlsZUV4cGxvcmVycyA9IGdldEFsbEZpbGVFeHBsb3JlcnModGhpcyk7XHJcblx0XHRmaWxlRXhwbG9yZXJzLmZvckVhY2goZmlsZUV4cGxvcmVyID0+IHtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3Jlcj8ucmVxdWVzdFNvcnQpIHtcclxuXHRcdFx0XHRmaWxlRXhwbG9yZXIucmVxdWVzdFNvcnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRcclxuXHRcdC8vIEZvcmNlIHJlZnJlc2ggYnkgbWFudWFsbHkgdXBkYXRpbmcgdmlzaWJpbGl0eSAoZXNwZWNpYWxseSBpbXBvcnRhbnQgb24gbW9iaWxlKVxyXG5cdFx0Ly8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIERPTSBpcyByZWFkeSBhZnRlciByZXF1ZXN0U29ydFxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGZpbGVFeHBsb3JlcnMuZm9yRWFjaChmaWxlRXhwbG9yZXIgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaEZpbGVFeHBsb3JlclZpc2liaWxpdHkoZmlsZUV4cGxvcmVyKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9LCAwKTtcclxuXHR9XHJcblxyXG5cdHBhdGNoQWxsRmlsZUV4cGxvcmVycygpOiB2b2lkIHtcclxuXHRcdC8vIFBhdGNoIHRoZSBwcm90b3R5cGUgKG9uY2UpIGFuZCBtYXJrIGFsbCBpbnN0YW5jZXNcclxuXHRcdHBhdGNoRmlsZUV4cGxvcmVyVXRpbCh0aGlzKTtcclxuXHRcdGNvbnN0IGZpbGVFeHBsb3JlcnMgPSBnZXRBbGxGaWxlRXhwbG9yZXJzKHRoaXMpO1xyXG5cdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdGZpbGVFeHBsb3Jlci5maWxlRXhwbG9yZXJQbHVzUGF0Y2hlZCA9IHRydWU7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGV4aXRGb2N1cygpIHtcclxuXHRcdHRoaXMuaXNGb2N1cyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IG51bGw7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIGljb24gaWYgaXQgZXhpc3RzXHJcblx0XHR0aGlzLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHJcblx0XHQvLyBVcGRhdGUgQ1NTIGNsYXNzZXNcclxuXHRcdHRoaXMudXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpO1xyXG5cclxuXHRcdC8vIFRyaWdnZXIgZmlsZSBleHBsb3JlciByZWZyZXNoIG9uIGFsbCBmaWxlIGV4cGxvcmVyIGluc3RhbmNlc1xyXG5cdFx0Y29uc3QgZmlsZUV4cGxvcmVycyA9IGdldEFsbEZpbGVFeHBsb3JlcnModGhpcyk7XHJcblx0XHRmaWxlRXhwbG9yZXJzLmZvckVhY2goZmlsZUV4cGxvcmVyID0+IHtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3Jlcj8ucmVxdWVzdFNvcnQpIHtcclxuXHRcdFx0XHRmaWxlRXhwbG9yZXIucmVxdWVzdFNvcnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRm9yY2UgcmVmcmVzaCBieSBtYW51YWxseSB1cGRhdGluZyB2aXNpYmlsaXR5IChlc3BlY2lhbGx5IGltcG9ydGFudCBvbiBtb2JpbGUpXHJcblx0XHQvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgRE9NIGlzIHJlYWR5IGFmdGVyIHJlcXVlc3RTb3J0XHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoRmlsZUV4cGxvcmVyVmlzaWJpbGl0eShmaWxlRXhwbG9yZXIpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gUmUtYXBwbHkgYXV0by1oaWRlIGFmdGVyIGZvY3VzIG1vZGUgY2xlYXJzIHZpc2liaWxpdHlcclxuXHRcdFx0dGhpcy51cGRhdGVBdXRvSGlkZVN0eWxlcygpO1xyXG5cdFx0fSwgMCk7XHJcblx0fVxyXG5cclxuXHRyZWZyZXNoRmlsZUV4cGxvcmVyVmlzaWJpbGl0eShmaWxlRXhwbG9yZXI6IEZpbGVFeHBsb3JlclZpZXcpOiB2b2lkIHtcclxuXHRcdGlmICghZmlsZUV4cGxvcmVyPy5maWxlSXRlbXMpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFdoZW4gZXhpdGluZyBmb2N1cyBtb2RlLCB0aGUgcGF0Y2ggaGFuZGxlcyB2aXNpYmlsaXR5IHJlc2V0IHZpYSByZXF1ZXN0U29ydC5cclxuXHRcdC8vIFdlIG9ubHkgbmVlZCB0byBjbGVhciBhbnkgc3RhbGUgaGlkZGVuIGF0dHJpYnV0ZXMuXHJcblx0XHRpZiAoIXRoaXMuaXNGb2N1cyB8fCAhdGhpcy5mb2N1c2VkUGF0aCkge1xyXG5cdFx0XHRPYmplY3QudmFsdWVzKGZpbGVFeHBsb3Jlci5maWxlSXRlbXMpLmZvckVhY2goKHZFbCkgPT4ge1xyXG5cdFx0XHRcdGlmICghdkVsPy5lbCkgcmV0dXJuO1xyXG5cdFx0XHRcdC8vIE9ubHkgdXBkYXRlIGlmIGN1cnJlbnRseSBtYXJrZWQgaGlkZGVuIHRvIG1pbmltaXplIERPTSBvcGVyYXRpb25zXHJcblx0XHRcdFx0aWYgKHZFbC5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJykpIHtcclxuXHRcdFx0XHRcdGlmICh2RWwuaW5mbykgdkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHR2RWwuZWwuc2V0Q3NzUHJvcHMoeyBkaXNwbGF5OiAnJyB9KTtcclxuXHRcdFx0XHRcdHZFbC5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZvY3VzZWRQYXRoID0gdGhpcy5mb2N1c2VkUGF0aDtcclxuXHJcblx0XHQvLyBQcmUtY29tcHV0ZSBhbmNlc3RvciBwYXRocyBhcyBhIFNldCBmb3IgTygxKSBsb29rdXBcclxuXHRcdGNvbnN0IGFuY2VzdG9yUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHRcdGNvbnN0IHBhdGhQYXJ0cyA9IGZvY3VzZWRQYXRoLnNwbGl0KCcvJyk7XHJcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHBhdGhQYXJ0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRhbmNlc3RvclBhdGhzLmFkZChwYXRoUGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBHcm91cCBpdGVtcyBieSB0aGVpciB0b3AtbGV2ZWwgZm9sZGVyIGZvciBlZmZpY2llbnQgc3VidHJlZSBza2lwcGluZ1xyXG5cdFx0Y29uc3QgdG9wTGV2ZWxGb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG5cdFx0Y29uc3Qgcm9vdEl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiBPYmplY3Qua2V5cyhmaWxlRXhwbG9yZXIuZmlsZUl0ZW1zKSkge1xyXG5cdFx0XHRjb25zdCBmaXJzdFNsYXNoID0gcGF0aC5pbmRleE9mKCcvJyk7XHJcblx0XHRcdGlmIChmaXJzdFNsYXNoID09PSAtMSkge1xyXG5cdFx0XHRcdHJvb3RJdGVtcy5wdXNoKHBhdGgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IHRvcExldmVsID0gcGF0aC5zdWJzdHJpbmcoMCwgZmlyc3RTbGFzaCk7XHJcblx0XHRcdFx0aWYgKCF0b3BMZXZlbEZvbGRlcnMuaGFzKHRvcExldmVsKSkge1xyXG5cdFx0XHRcdFx0dG9wTGV2ZWxGb2xkZXJzLnNldCh0b3BMZXZlbCwgW10pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0b3BMZXZlbEZvbGRlcnMuZ2V0KHRvcExldmVsKSEucHVzaChwYXRoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERldGVybWluZSB3aGljaCB0b3AtbGV2ZWwgZm9sZGVycyBuZWVkIGZ1bGwgcHJvY2Vzc2luZ1xyXG5cdFx0Y29uc3QgZm9jdXNlZFRvcExldmVsID0gZm9jdXNlZFBhdGguc3BsaXQoJy8nKVswXTtcclxuXHJcblx0XHQvLyBQcm9jZXNzIHJvb3QtbGV2ZWwgaXRlbXNcclxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiByb290SXRlbXMpIHtcclxuXHRcdFx0Y29uc3QgdkVsID0gZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1twYXRoXTtcclxuXHRcdFx0aWYgKCF2RWw/LmVsKSBjb250aW51ZTtcclxuXHJcblx0XHRcdGNvbnN0IHNob3VsZFNob3cgPSBwYXRoID09PSBmb2N1c2VkUGF0aCB8fFxyXG5cdFx0XHRcdGZvY3VzZWRQYXRoLnN0YXJ0c1dpdGgocGF0aCArICcvJykgfHxcclxuXHRcdFx0XHRwYXRoLnN0YXJ0c1dpdGgoZm9jdXNlZFBhdGggKyAnLycpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbCwgc2hvdWxkU2hvdyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBmb2xkZXJcclxuXHRcdGZvciAoY29uc3QgW3RvcExldmVsLCBwYXRoc10gb2YgdG9wTGV2ZWxGb2xkZXJzKSB7XHJcblx0XHRcdC8vIENoZWNrIGlmIHRoaXMgdG9wLWxldmVsIGZvbGRlciBuZWVkcyBkZXRhaWxlZCBwcm9jZXNzaW5nXHJcblx0XHRcdGNvbnN0IGlzSW5Gb2N1c1BhdGggPSB0b3BMZXZlbCA9PT0gZm9jdXNlZFRvcExldmVsIHx8XHJcblx0XHRcdFx0YW5jZXN0b3JQYXRocy5oYXModG9wTGV2ZWwpIHx8XHJcblx0XHRcdFx0Zm9jdXNlZFBhdGggPT09IHRvcExldmVsO1xyXG5cclxuXHRcdFx0aWYgKCFpc0luRm9jdXNQYXRoKSB7XHJcblx0XHRcdFx0Ly8gVGhpcyBlbnRpcmUgc3VidHJlZSBzaG91bGQgYmUgaGlkZGVuIC0gYmF0Y2ggaGlkZSBhbGwgaXRlbXNcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHZFbCA9IGZpbGVFeHBsb3Jlci5maWxlSXRlbXNbcGF0aF07XHJcblx0XHRcdFx0XHRpZiAoIXZFbD8uZWwpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVJdGVtVmlzaWJpbGl0eSh2RWwsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gVGhpcyBzdWJ0cmVlIG5lZWRzIGluZGl2aWR1YWwgZXZhbHVhdGlvblxyXG5cdFx0XHRcdGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdkVsID0gZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1twYXRoXTtcclxuXHRcdFx0XHRcdGlmICghdkVsPy5lbCkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2hvdWxkU2hvdyA9IHBhdGggPT09IGZvY3VzZWRQYXRoIHx8XHJcblx0XHRcdFx0XHRcdHBhdGguc3RhcnRzV2l0aChmb2N1c2VkUGF0aCArICcvJykgfHxcclxuXHRcdFx0XHRcdFx0YW5jZXN0b3JQYXRocy5oYXMocGF0aCk7XHJcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbCwgc2hvdWxkU2hvdyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbDogeyBpbmZvPzogeyBoaWRkZW46IGJvb2xlYW4gfTsgZWw6IEhUTUxFbGVtZW50IH0sIHNob3VsZFNob3c6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdGNvbnN0IGN1cnJlbnRseUhpZGRlbiA9IHZFbC5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJyk7XHJcblxyXG5cdFx0Ly8gT25seSB1cGRhdGUgRE9NIGlmIHN0YXRlIGFjdHVhbGx5IGNoYW5nZXNcclxuXHRcdGlmIChzaG91bGRTaG93ICYmIGN1cnJlbnRseUhpZGRlbikge1xyXG5cdFx0XHRpZiAodkVsLmluZm8pIHZFbC5pbmZvLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHR2RWwuZWwuc2V0Q3NzUHJvcHMoeyBkaXNwbGF5OiAnJyB9KTtcclxuXHRcdFx0dkVsLmVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1oaWRkZW4nKTtcclxuXHRcdH0gZWxzZSBpZiAoIXNob3VsZFNob3cgJiYgIWN1cnJlbnRseUhpZGRlbikge1xyXG5cdFx0XHRpZiAodkVsLmluZm8pIHZFbC5pbmZvLmhpZGRlbiA9IHRydWU7XHJcblx0XHRcdHZFbC5lbC5zZXRDc3NQcm9wcyh7IGRpc3BsYXk6ICdub25lJyB9KTtcclxuXHRcdFx0dkVsLmVsLnNldEF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1oaWRkZW4nLCAndHJ1ZScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGZpbGVFeHBsb3JlcnMgPSBnZXRBbGxGaWxlRXhwbG9yZXJzKHRoaXMpO1xyXG5cdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdGNvbnN0IGNvbnRhaW5lckVsID0gZmlsZUV4cGxvcmVyLmNvbnRhaW5lckVsO1xyXG5cdFx0XHRpZiAodGhpcy5pc0ZvY3VzKSB7XHJcblx0XHRcdFx0Y29udGFpbmVyRWwuYWRkQ2xhc3MoXCJleHBsb3Jlci1mb2N1cy1tb2RlXCIpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnRhaW5lckVsLnJlbW92ZUNsYXNzKFwiZXhwbG9yZXItZm9jdXMtbW9kZVwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHJcblx0YWRkRmlsZUV4cGxvcmVySWNvbigpIHtcclxuXHRcdGNvbnN0IGhhbmRsZUljb25DbGljayA9ICgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHRcdHRoaXMuZXhpdEZvY3VzKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZm9jdXNMZXZlbCA9PT0gJ2N1c3RvbScpIHtcclxuXHRcdFx0XHRcdC8vIEZvciBjdXN0b20gZm9sZGVyLCB1c2UgdGhlIGN1c3RvbSBwYXRoIGRpcmVjdGx5XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZW50ZXJGb2N1cyh0aGlzLnNldHRpbmdzLmN1c3RvbUZvbGRlclBhdGgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBGb3Igb3RoZXIgbGV2ZWxzLCBuZWVkIHRoZSBjdXJyZW50IGZpbGVcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG5cdFx0XHRcdFx0aWYgKGZpbGU/LnBhdGgpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9jdXNQYXRoID0gZ2V0Rm9jdXNQYXRoKGZpbGUucGF0aCwgdGhpcy5zZXR0aW5ncy5mb2N1c0xldmVsLCB0aGlzLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5lbnRlckZvY3VzKGZvY3VzUGF0aCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGFkZEljb25Ub0ZpbGVFeHBsb3JlciA9ICgpID0+IHtcclxuXHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyTGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSgnZmlsZS1leHBsb3JlcicpO1xyXG5cdFx0XHRpZiAoZmlsZUV4cGxvcmVyTGVhdmVzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyVmlldyA9IGZpbGVFeHBsb3JlckxlYXZlc1swXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0XHRjb25zdCBuYXZCdXR0b25zQ29udGFpbmVyID0gZmluZE5hdkJ1dHRvbnNDb250YWluZXIoZmlsZUV4cGxvcmVyVmlldyk7XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAoIW5hdkJ1dHRvbnNDb250YWluZXIpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIGljb24gYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjb250YWluZXJcclxuXHRcdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbiAmJiBuYXZCdXR0b25zQ29udGFpbmVyLmNvbnRhaW5zKHRoaXMuZmlsZUV4cGxvcmVySWNvbikpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJlbW92ZSBvbGQgaWNvbiBpZiBpdCBleGlzdHMgZWxzZXdoZXJlXHJcblx0XHRcdGlmICh0aGlzLmZpbGVFeHBsb3Jlckljb24gJiYgdGhpcy5maWxlRXhwbG9yZXJJY29uLnBhcmVudEVsZW1lbnQpIHtcclxuXHRcdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24ucmVtb3ZlKCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgaWNvbiBidXR0b24gaWYgaXQgZG9lc24ndCBleGlzdFxyXG5cdFx0XHRpZiAoIXRoaXMuZmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbiA9IGNyZWF0ZUZpbGVFeHBsb3Jlckljb24odGhpcyk7XHJcblxyXG5cdFx0XHRcdC8vIERvbid0IHNldCBjdXJzb3IgLSBsZXQgaXQgaW5oZXJpdCBmcm9tIC5jbGlja2FibGUtaWNvbiBjbGFzcyAoY3Vyc29yOiB2YXIoLS1jdXJzb3IpKVxyXG5cdFx0XHRcdC8vIFRoaXMgbWF0Y2hlcyBvdGhlciBmaWxlIGV4cGxvcmVyIGljb25zIHdoaWNoIHVzZSB0aGUgQ1NTIHZhcmlhYmxlXHJcblx0XHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnNldENzc1Byb3BzKHsgdG91Y2hBY3Rpb246ICdtYW5pcHVsYXRpb24nIH0pO1xyXG5cclxuXHRcdFx0XHQvLyBVc2UgYSB1bmlmaWVkIGhhbmRsZXIgdGhhdCB3b3JrcyBmb3IgYm90aCBjbGljayBhbmQgdG91Y2hcclxuXHRcdFx0XHQvLyBPbiBtb2JpbGUsIHRvdWNoIGV2ZW50cyB0eXBpY2FsbHkgdHJpZ2dlciBjbGljaywgYnV0IHdlIGhhbmRsZSBib3RoIHRvIGJlIHNhZmVcclxuXHRcdFx0XHRsZXQgdG91Y2hIYW5kbGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0dGhpcy5yZWdpc3RlckRvbUV2ZW50KHRoaXMuZmlsZUV4cGxvcmVySWNvbiwgJ3RvdWNoc3RhcnQnLCAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHR0b3VjaEhhbmRsZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRoYW5kbGVJY29uQ2xpY2soKTtcclxuXHRcdFx0XHRcdC8vIFJlc2V0IGZsYWcgYWZ0ZXIgYSBzaG9ydCBkZWxheVxyXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7IHRvdWNoSGFuZGxlZCA9IGZhbHNlOyB9LCAzMDApO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyRG9tRXZlbnQodGhpcy5maWxlRXhwbG9yZXJJY29uLCAnY2xpY2snLCAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHQvLyBJZiB0b3VjaHN0YXJ0IGFscmVhZHkgaGFuZGxlZCBpdCwgc2tpcCBjbGljayB0byBhdm9pZCBkb3VibGUtZmlyaW5nXHJcblx0XHRcdFx0XHRpZiAodG91Y2hIYW5kbGVkKSB7XHJcblx0XHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0aGFuZGxlSWNvbkNsaWNrKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdC8vIFNldC91cGRhdGUgaWNvblxyXG5cdFx0XHR0aGlzLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHJcblx0XHRcdC8vIEluc2VydCBpY29uIGluIGNvcnJlY3QgcG9zaXRpb25cclxuXHRcdFx0aW5zZXJ0RmlsZUV4cGxvcmVySWNvbih0aGlzLmZpbGVFeHBsb3Jlckljb24sIG5hdkJ1dHRvbnNDb250YWluZXIpO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBUcnkgdG8gYWRkIGltbWVkaWF0ZWx5XHJcblx0XHRhZGRJY29uVG9GaWxlRXhwbG9yZXIoKTtcclxuXHJcblx0XHQvLyBBbHNvIGxpc3RlbiBmb3Igd29ya3NwYWNlIGNoYW5nZXMgaW4gY2FzZSBmaWxlIGV4cGxvcmVyIGlzIGNyZWF0ZWQgbGF0ZXJcclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLnNob3dGaWxlRXhwbG9yZXJJY29uKSB7XHJcblx0XHRcdFx0XHRhZGRJY29uVG9GaWxlRXhwbG9yZXIoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlRmlsZUV4cGxvcmVySWNvbigpIHtcclxuXHRcdGlmICghdGhpcy5maWxlRXhwbG9yZXJJY29uKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3Muc2hvd0ZpbGVFeHBsb3Jlckljb24pIHtcclxuXHRcdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbi5wYXJlbnRFbGVtZW50KSB7XHJcblx0XHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnJlbW92ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBFbnN1cmUgaWNvbiBpcyBpbiBET00gaWYgc2V0dGluZyBpcyBlbmFibGVkXHJcblx0XHRpZiAoIXRoaXMuZmlsZUV4cGxvcmVySWNvbi5wYXJlbnRFbGVtZW50KSB7XHJcblx0XHRcdC8vIFJlLWluc2VydCB0aGUgaWNvbiBpbnRvIHRoZSBmaWxlIGV4cGxvcmVyXHJcblx0XHRcdGNvbnN0IGZpbGVFeHBsb3JlckxlYXZlcyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoJ2ZpbGUtZXhwbG9yZXInKTtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3JlckxlYXZlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyVmlldyA9IGZpbGVFeHBsb3JlckxlYXZlc1swXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0XHRcdGNvbnN0IG5hdkJ1dHRvbnNDb250YWluZXIgPSBmaW5kTmF2QnV0dG9uc0NvbnRhaW5lcihmaWxlRXhwbG9yZXJWaWV3KTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAobmF2QnV0dG9uc0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0aW5zZXJ0RmlsZUV4cGxvcmVySWNvbih0aGlzLmZpbGVFeHBsb3Jlckljb24sIG5hdkJ1dHRvbnNDb250YWluZXIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERvbid0IHNldCBjdXJzb3IgLSBsZXQgaXQgaW5oZXJpdCBmcm9tIC5jbGlja2FibGUtaWNvbiBjbGFzcyAoY3Vyc29yOiB2YXIoLS1jdXJzb3IpKVxyXG5cdFx0Ly8gVGhpcyBtYXRjaGVzIG90aGVyIGZpbGUgZXhwbG9yZXIgaWNvbnMgd2hpY2ggdXNlIHRoZSBDU1MgdmFyaWFibGVcclxuXHRcdGlmICh0aGlzLmZpbGVFeHBsb3Jlckljb24uc3R5bGUuY3Vyc29yKSB7XHJcblx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY3Vyc29yJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVG9nZ2xlIGlzLWFjdGl2ZSBjbGFzcyBiYXNlZCBvbiBmb2N1cyBzdGF0ZVxyXG5cdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24uYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUF1dG9IaWRlU3R5bGVzKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgcGF0aHMgPSBuZXcgU2V0KFxyXG5cdFx0XHQodGhpcy5zZXR0aW5ncy5hdXRvSGlkZVBhdGhzID8/IFtdKVxyXG5cdFx0XHRcdC5tYXAocCA9PiBwLnRyaW0oKSlcclxuXHRcdFx0XHQuZmlsdGVyKHAgPT4gcC5sZW5ndGggPiAwKVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBmaWxlRXhwbG9yZXJzID0gZ2V0QWxsRmlsZUV4cGxvcmVycyh0aGlzKTtcclxuXHRcdGZpbGVFeHBsb3JlcnMuZm9yRWFjaChmaWxlRXhwbG9yZXIgPT4ge1xyXG5cdFx0XHRpZiAoIWZpbGVFeHBsb3Jlcj8uZmlsZUl0ZW1zKSByZXR1cm47XHJcblxyXG5cdFx0XHRmb3IgKGNvbnN0IFtmaWxlUGF0aCwgdkVsXSBvZiBPYmplY3QuZW50cmllcyhmaWxlRXhwbG9yZXIuZmlsZUl0ZW1zKSkge1xyXG5cdFx0XHRcdGlmICghdkVsPy5lbCkgY29udGludWU7XHJcblx0XHRcdFx0Y29uc3Qgc2hvdWxkSGlkZSA9IHBhdGhzLmhhcyhmaWxlUGF0aCk7XHJcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSB2RWwuZWwuaGFzQXR0cmlidXRlKCdkYXRhLWV4cGxvcmVyLWZvY3VzLWF1dG8taGlkZGVuJyk7XHJcblxyXG5cdFx0XHRcdGlmIChzaG91bGRIaWRlICYmICFpc0hpZGRlbikge1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldENzc1Byb3BzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldEF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1hdXRvLWhpZGRlbicsICd0cnVlJyk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICghc2hvdWxkSGlkZSAmJiBpc0hpZGRlbikge1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldENzc1Byb3BzKHsgZGlzcGxheTogJycgfSk7XHJcblx0XHRcdFx0XHR2RWwuZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWV4cGxvcmVyLWZvY3VzLWF1dG8taGlkZGVuJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24ucmVtb3ZlKCk7XHJcblx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbiA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFeHBsb3JlckZvY3VzUGx1Z2luO1xyXG5cclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgRXhwbG9yZXJGb2N1c1NldHRpbmdzIHtcblx0c2hvd1JpZ2h0Q2xpY2tNZW51OiBib29sZWFuO1xuXHRzaG93RmlsZUV4cGxvcmVySWNvbjogYm9vbGVhbjtcblx0Zm9jdXNMZXZlbDogJ2ZpbGUnIHwgJ3BhcmVudCcgfCAnZ3JhbmRwYXJlbnQnIHwgJ2dyZWF0Z3JhbmRwYXJlbnQnIHwgJ2N1c3RvbSc7XG5cdGN1c3RvbUZvbGRlclBhdGg6IHN0cmluZztcblx0aGlkZUFuY2VzdG9yRm9sZGVyczogYm9vbGVhbjtcblx0YXV0b0hpZGVQYXRoczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBFeHBsb3JlckZvY3VzU2V0dGluZ3MgPSB7XG5cdHNob3dSaWdodENsaWNrTWVudTogdHJ1ZSxcblx0c2hvd0ZpbGVFeHBsb3Jlckljb246IHRydWUsXG5cdGZvY3VzTGV2ZWw6ICdwYXJlbnQnLFxuXHRjdXN0b21Gb2xkZXJQYXRoOiAnJyxcblx0aGlkZUFuY2VzdG9yRm9sZGVyczogZmFsc2UsXG5cdGF1dG9IaWRlUGF0aHM6IFtdXG59O1xuXG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nR3JvdXAgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEFsbEZpbGVFeHBsb3JlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZmlsZS1leHBsb3Jlci1wYXRjaFwiO1xyXG5pbXBvcnQgeyBGb2xkZXJTdWdnZXN0IH0gZnJvbSBcIi4vZm9sZGVyLXN1Z2dlc3RcIjtcclxuaW1wb3J0IHsgQXV0b0hpZGVNb2RhbCB9IGZyb20gXCIuL2F1dG8taGlkZS1tb2RhbFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBFeHBsb3JlckZvY3VzU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbjtcclxuXHRwdWJsaWMgaWNvbiA9ICdsdWNpZGUtZm9jdXMnO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Ly8gRmlyc3QgZ3JvdXAgKG5vIGhlYWRpbmcpXHJcblx0XHRjb25zdCBnZW5lcmFsR3JvdXAgPSBuZXcgU2V0dGluZ0dyb3VwKGNvbnRhaW5lckVsKTtcclxuXHJcblx0XHRnZW5lcmFsR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKFwiU2hvdyByaWdodC1jbGljayBtZW51IG9wdGlvblwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dSaWdodENsaWNrTWVudSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dSaWdodENsaWNrTWVudSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJTaG93IGZpbGUgZXhwbG9yZXIgaWNvblwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dGaWxlRXhwbG9yZXJJY29uKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd0ZpbGVFeHBsb3Jlckljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJDb21tYW5kIGZvY3VzIGxldmVsXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJEZXRlcm1pbmVzIHdoYXQgdG8gZm9jdXMgd2hlbiB1c2luZyB0aGUgdG9nZ2xlIGNvbW1hbmQgb3IgZmlsZSBleHBsb3JlciBpY29uLiBSaWdodC1jbGljayBtZW51IGFsd2F5cyBmb2N1c2VzIHRoZSBjbGlja2VkIGZpbGUvZm9sZGVyLlwiKVxyXG5cdFx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZmlsZScsIFwiQ3VycmVudCBmaWxlIG9ubHlcIilcclxuXHRcdFx0XHRcdC5hZGRPcHRpb24oJ3BhcmVudCcsIFwiUGFyZW50IGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZ3JhbmRwYXJlbnQnLCBcIkdyYW5kcGFyZW50IGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZ3JlYXRncmFuZHBhcmVudCcsIFwiR3JlYXQgZ3JhbmRwYXJlbnQgZm9sZGVyXCIpXHJcblx0XHRcdFx0XHQuYWRkT3B0aW9uKCdjdXN0b20nLCBcIlNwZWNpZmljIGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9jdXNMZXZlbCA9IHZhbHVlIGFzICdmaWxlJyB8ICdwYXJlbnQnIHwgJ2dyYW5kcGFyZW50JyB8ICdncmVhdGdyYW5kcGFyZW50JyB8ICdjdXN0b20nO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0Ly8gUmVmcmVzaCBmaWxlIGV4cGxvcmVyIGlmIGluIGZvY3VzIG1vZGVcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLmlzRm9jdXMpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlRXhwbG9yZXJzID0gZ2V0QWxsRmlsZUV4cGxvcmVycyh0aGlzLnBsdWdpbik7XHJcblx0XHRcdFx0XHRcdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKChmaWxlRXhwbG9yZXIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmaWxlRXhwbG9yZXI/LnJlcXVlc3RTb3J0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpbGVFeHBsb3Jlci5yZXF1ZXN0U29ydCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpOyAvLyBSZWZyZXNoIHRvIHNob3cvaGlkZSBjdXN0b20gZm9sZGVyIGlucHV0XHJcblx0XHRcdFx0XHR9KSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBBZGQgY3VzdG9tIGZvbGRlciBwYXRoIGlucHV0IHRoYXQgb25seSBzaG93cyB3aGVuIGN1c3RvbSBpcyBzZWxlY3RlZFxyXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwgPT09ICdjdXN0b20nKSB7XHJcblx0XHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdC5zZXROYW1lKFwiQ3VzdG9tIGZvbGRlciBwYXRoXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIkVudGVyIGEgZm9sZGVyIHBhdGggKGZvbGRlci9zdWJmb2xkZXIpLiBUaGlzIGZvbGRlciB3aWxsIGJlIGZvY3VzZWQgcmVnYXJkbGVzcyBvZiB3aGljaCBmaWxlIGlzIG9wZW4uXCIpXHJcblx0XHRcdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHtcclxuXHRcdFx0XHRcdFx0bmV3IEZvbGRlclN1Z2dlc3QodGhpcy5hcHAsIHRleHQuaW5wdXRFbCk7XHJcblx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0ZvbGRlci9zdWJmb2xkZXInKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBdXRvLWhpZGUgZm9sZGVycyBzZWN0aW9uXHJcblx0XHRjb25zdCBhdXRvSGlkZUdyb3VwID0gbmV3IFNldHRpbmdHcm91cChjb250YWluZXJFbClcclxuXHRcdFx0LnNldEhlYWRpbmcoXCJBdXRvLWhpZGUgZm9sZGVyc1wiKTtcclxuXHJcblx0XHRhdXRvSGlkZUdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdGNvbnN0IGF1dG9IaWRlUGF0aHMgPSAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA/PyBbXSkuZmlsdGVyKHAgPT4gcC50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG5cdFx0XHRjb25zdCBkZXNjRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblx0XHRcdGRlc2NGcmFnbWVudC5hcHBlbmRUZXh0KFwiVGhlc2UgZm9sZGVycyBhcmUgYWx3YXlzIGhpZGRlbiBmcm9tIHRoZSBmaWxlIGV4cGxvcmVyLlwiKTtcclxuXHJcblx0XHRcdGlmIChhdXRvSGlkZVBhdGhzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRjb25zdCBsaXN0ID0gZGVzY0ZyYWdtZW50LmNyZWF0ZUVsKFwidWxcIik7XHJcblx0XHRcdFx0YXV0b0hpZGVQYXRocy5mb3JFYWNoKHAgPT4ge1xyXG5cdFx0XHRcdFx0bGlzdC5jcmVhdGVFbChcImxpXCIsIHsgdGV4dDogcCB9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKFwiSGlkZGVuIGZvbGRlcnNcIilcclxuXHRcdFx0XHQuc2V0RGVzYyhkZXNjRnJhZ21lbnQpXHJcblx0XHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4gYnV0dG9uXHJcblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIk1hbmFnZVwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRuZXcgQXV0b0hpZGVNb2RhbCh0aGlzLmFwcCwgdGhpcy5wbHVnaW4sICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHRcdFx0fSkub3BlbigpO1xyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxufVxyXG5cclxuIiwgImltcG9ydCB7IE5vdGljZSwgVmlldywgVEFic3RyYWN0RmlsZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSBcIm1vbmtleS1hcm91bmRcIjtcclxuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBcIi4uL3R5cGVzLmRcIjtcclxuXHJcbi8vIFR5cGUgZGVmaW5pdGlvbnMgZnJvbSBtb2R1bGUgYXVnbWVudGF0aW9uXHJcbnR5cGUgUGF0aFZpcnR1YWxFbGVtZW50ID0ge1xyXG5cdGNoaWxkcmVuRWw6IEhUTUxFbGVtZW50O1xyXG5cdGNvbGxhcHNlRWw6IEhUTUxFbGVtZW50O1xyXG5cdGNvbGxhcHNlZDogYm9vbGVhbjtcclxuXHRjb2xsYXBzaWJsZTogYm9vbGVhbjtcclxuXHRjb3ZlckVsOiBIVE1MRWxlbWVudDtcclxuXHRlbDogSFRNTEVsZW1lbnQ7XHJcblx0ZmlsZTogVEFic3RyYWN0RmlsZTtcclxuXHRpbmZvOiB7XHJcblx0XHRjaGlsZExlZnQ6IG51bWJlcjtcclxuXHRcdGNoaWxkTGVmdFBhZGRpbmc6IG51bWJlcjtcclxuXHRcdGNoaWxkVG9wOiBudW1iZXI7XHJcblx0XHRjb21wdXRlZDogYm9vbGVhbjtcclxuXHRcdGhlaWdodDogbnVtYmVyO1xyXG5cdFx0aGlkZGVuOiBib29sZWFuO1xyXG5cdFx0cGlubmVkPzogYm9vbGVhbjtcclxuXHRcdG5leHQ6IGJvb2xlYW47XHJcblx0XHRxdWV1ZWQ6IGJvb2xlYW47XHJcblx0XHR3aWR0aDogbnVtYmVyO1xyXG5cdH07XHJcblx0aW5uZXJFbDogSFRNTEVsZW1lbnQ7XHJcblx0cGFyZW50PzogUGF0aFZpcnR1YWxFbGVtZW50O1xyXG5cdHB1c2hlckVsOiBIVE1MRWxlbWVudDtcclxuXHRzZWxmRWw6IEhUTUxFbGVtZW50O1xyXG5cdHZDaGlsZHJlbjoge1xyXG5cdFx0Y2hpbGRyZW46IFBhdGhWaXJ0dWFsRWxlbWVudDtcclxuXHR9O1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRmlsZUV4cGxvcmVyVmlldyA9IFZpZXcgJiB7XHJcblx0cmVxdWVzdFNvcnQoKTogdm9pZDtcclxuXHRmaWxlRXhwbG9yZXJQbHVzUGF0Y2hlZD86IGJvb2xlYW47XHJcblx0ZmlsZUl0ZW1zOiB7XHJcblx0XHRba2V5OiBzdHJpbmddOiBQYXRoVmlydHVhbEVsZW1lbnQ7XHJcblx0fTtcclxuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XHJcbn07XHJcblxyXG50eXBlIEdldFNvcnRlZEZvbGRlckl0ZW1zRnVuY3Rpb24gPSAoZm9sZGVyOiBUQWJzdHJhY3RGaWxlKSA9PiBQYXRoVmlydHVhbEVsZW1lbnRbXTtcclxuXHJcbi8vIEdsb2JhbCBmbGFncyB0byB0cmFjayBwYXRjaGluZyBzdGF0ZVxyXG5sZXQgcHJvdG90eXBlUGF0Y2hlZCA9IGZhbHNlO1xyXG5sZXQgcGF0Y2hpbmdGYWlsZWQgPSBmYWxzZTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGNoaW5nRmFpbGVkKCk6IGJvb2xlYW4ge1xyXG5cdHJldHVybiBwYXRjaGluZ0ZhaWxlZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoRmlsZUV4cGxvcmVyKHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbik6IHZvaWQge1xyXG5cdC8vIElmIHBhdGNoaW5nIHByZXZpb3VzbHkgZmFpbGVkLCBkb24ndCByZXRyeSAtIHJlbHkgb24gQ1NTIGZhbGxiYWNrXHJcblx0aWYgKHBhdGNoaW5nRmFpbGVkKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBGb3IgbW9iaWxlLCB3ZSBleHBsaWNpdGx5IHNraXAgcHJvdG90eXBlIHBhdGNoaW5nIGFzIGl0IG9mdGVuIGZhaWxzXHJcblx0Ly8gYW5kIHJlbHkgb24gb3VyIHJvYnVzdCBET00tYmFzZWQgZmFsbGJhY2sgaW1wbGVtZW50ZWQgaW4gbWFpbi50c1xyXG5cdGlmIChQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG5cdFx0cGF0Y2hpbmdGYWlsZWQgPSB0cnVlOyAvLyBTZXQgdG8gdHJ1ZSB0byBhdm9pZCByZXRyaWVzLCBidXQgZG9uJ3Qgc2hvdyBub3RpY2VcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IGZpbGVFeHBsb3JlciA9IGdldEZpbGVFeHBsb3JlcihwbHVnaW4pO1xyXG5cclxuXHRpZiAoIWZpbGVFeHBsb3Jlcikge1xyXG5cdFx0cmV0dXJuOyAvLyBGaWxlIGV4cGxvcmVyIG5vdCBhdmFpbGFibGUgeWV0LCB3aWxsIGJlIHBhdGNoZWQgb24gbGF5b3V0LWNoYW5nZVxyXG5cdH1cclxuXHJcblx0Ly8gUGF0Y2ggdGhlIHByb3RvdHlwZSBvbmx5IG9uY2UgKGFmZmVjdHMgYWxsIGluc3RhbmNlcylcclxuXHRpZiAoIXByb3RvdHlwZVBhdGNoZWQpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmaWxlRXhwbG9yZXIpO1xyXG5cclxuXHRcdFx0Ly8gVmVyaWZ5IHRoZSBtZXRob2Qgd2UncmUgcGF0Y2hpbmcgZXhpc3RzXHJcblx0XHRcdGlmICh0eXBlb2YgcHJvdG90eXBlLmdldFNvcnRlZEZvbGRlckl0ZW1zICE9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdnZXRTb3J0ZWRGb2xkZXJJdGVtcyBtZXRob2Qgbm90IGZvdW5kIG9uIGZpbGUgZXhwbG9yZXIgcHJvdG90eXBlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsdWdpbi5yZWdpc3RlcihcclxuXHRcdFx0XHRhcm91bmQocHJvdG90eXBlLCB7XHJcblx0XHRcdFx0XHRnZXRTb3J0ZWRGb2xkZXJJdGVtcyhvbGQ6IEdldFNvcnRlZEZvbGRlckl0ZW1zRnVuY3Rpb24pIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBGaWxlRXhwbG9yZXJWaWV3LCBmb2xkZXI6IFRBYnN0cmFjdEZpbGUpOiBQYXRoVmlydHVhbEVsZW1lbnRbXSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHNvcnRlZENoaWxkcmVuOiBQYXRoVmlydHVhbEVsZW1lbnRbXSA9IG9sZC5jYWxsKHRoaXMsIGZvbGRlcik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIEFwcGx5IGZvY3VzIGhpZGluZyBpZiBmb2N1cyBtb2RlIGlzIGFjdGl2ZVxyXG5cdFx0XHRcdFx0XHRcdGlmIChwbHVnaW4uaXNGb2N1cyAmJiBwbHVnaW4uZm9jdXNlZFBhdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZvY3VzZWRQYXRoID0gcGx1Z2luLmZvY3VzZWRQYXRoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHNvcnRlZENoaWxkcmVuID0gc29ydGVkQ2hpbGRyZW4uZmlsdGVyKCh2RWwpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZmlsZVBhdGggPSB2RWwuZmlsZS5wYXRoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBpdGVtcyB0aGF0IG1hdGNoIHRoZSBmb2N1c2VkIHBhdGggZXhhY3RseVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZmlsZVBhdGggPT09IGZvY3VzZWRQYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgaXRlbXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIGZvY3VzZWQgcGF0aFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChmb2N1c2VkUGF0aCArIFwiL1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZFbC5pbmZvLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IGl0ZW1zIHRoYXQgYXJlIGFuY2VzdG9ycyBvZiB0aGUgZm9jdXNlZCBwYXRoIChwYXJlbnQgY2hhaW4pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChmb2N1c2VkUGF0aC5zdGFydHNXaXRoKGZpbGVQYXRoICsgXCIvXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhpZGUgZXZlcnl0aGluZyBlbHNlXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZFbC5pbmZvLmhpZGRlbiA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBFbnN1cmUgYWxsIGl0ZW1zIGFyZSB2aXNpYmxlIHdoZW4gbm90IGluIGZvY3VzIG1vZGVcclxuXHRcdFx0XHRcdFx0XHRcdHNvcnRlZENoaWxkcmVuLmZvckVhY2goKHZFbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2RWwuaW5mby5oaWRkZW4gPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNvcnRlZENoaWxkcmVuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdHByb3RvdHlwZVBhdGNoZWQgPSB0cnVlO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0cGF0Y2hpbmdGYWlsZWQgPSB0cnVlO1xyXG5cdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0J1tFeHBsb3JlciBGb2N1c10gRmFpbGVkIHRvIHBhdGNoIGZpbGUgZXhwbG9yZXIuICcgK1xyXG5cdFx0XHRcdCdUaGUgcGx1Z2luIHdpbGwgdXNlIENTUy1iYXNlZCBoaWRpbmcgYXMgYSBmYWxsYmFjaywgd2hpY2ggbWF5IGJlIGxlc3MgcHJlY2lzZS4gJyArXHJcblx0XHRcdFx0J1RoaXMgdXN1YWxseSBoYXBwZW5zIGFmdGVyIGFuIE9ic2lkaWFuIHVwZGF0ZSAtIHBsZWFzZSBjaGVjayBmb3IgcGx1Z2luIHVwZGF0ZXMuJyxcclxuXHRcdFx0XHRlcnJvclxyXG5cdFx0XHQpO1xyXG5cdFx0XHRuZXcgTm90aWNlKFxyXG5cdFx0XHRcdCdFeHBsb3JlciBGb2N1czogRmlsZSBleHBsb3JlciBwYXRjaGluZyBmYWlsZWQuICcgK1xyXG5cdFx0XHRcdCdUaGUgcGx1Z2luIHdpbGwgc3RpbGwgd29yayBidXQgbWF5IG5lZWQgYW4gdXBkYXRlIGZvciBmdWxsIGZ1bmN0aW9uYWxpdHkuJyxcclxuXHRcdFx0XHQ4MDAwXHJcblx0XHRcdCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIE1hcmsgdGhpcyBpbnN0YW5jZSBhcyBwYXRjaGVkXHJcblx0ZmlsZUV4cGxvcmVyLmZpbGVFeHBsb3JlclBsdXNQYXRjaGVkID0gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVFeHBsb3JlcihwbHVnaW46IEV4cGxvcmVyRm9jdXNQbHVnaW4pOiBGaWxlRXhwbG9yZXJWaWV3IHwgdW5kZWZpbmVkIHtcclxuXHRjb25zdCBmaWxlRXhwbG9yZXJDb250YWluZXIgPSBwbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJmaWxlLWV4cGxvcmVyXCIpPy5maXJzdCgpO1xyXG5cdHJldHVybiBmaWxlRXhwbG9yZXJDb250YWluZXI/LnZpZXcgYXMgRmlsZUV4cGxvcmVyVmlldztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZpbGVFeHBsb3JlcnMocGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKTogRmlsZUV4cGxvcmVyVmlld1tdIHtcclxuXHRjb25zdCBmaWxlRXhwbG9yZXJMZWF2ZXMgPSBwbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJmaWxlLWV4cGxvcmVyXCIpO1xyXG5cdHJldHVybiBmaWxlRXhwbG9yZXJMZWF2ZXMubWFwKGxlYWYgPT4gbGVhZi52aWV3IGFzIEZpbGVFeHBsb3JlclZpZXcpO1xyXG59XHJcblxyXG4iLCAiZnVuY3Rpb24gYXJvdW5kKG9iaiwgZmFjdG9yaWVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gT2JqZWN0LmtleXMoZmFjdG9yaWVzKS5tYXAoKGtleSkgPT4gYXJvdW5kMShvYmosIGtleSwgZmFjdG9yaWVzW2tleV0pKTtcbiAgcmV0dXJuIHJlbW92ZXJzLmxlbmd0aCA9PT0gMSA/IHJlbW92ZXJzWzBdIDogZnVuY3Rpb24oKSB7XG4gICAgcmVtb3ZlcnMuZm9yRWFjaCgocikgPT4gcigpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGFyb3VuZDEob2JqLCBtZXRob2QsIGNyZWF0ZVdyYXBwZXIpIHtcbiAgY29uc3QgaW5oZXJpdGVkID0gb2JqW21ldGhvZF0sIGhhZE93biA9IG9iai5oYXNPd25Qcm9wZXJ0eShtZXRob2QpLCBvcmlnaW5hbCA9IGhhZE93biA/IGluaGVyaXRlZCA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKVttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIGxldCBjdXJyZW50ID0gY3JlYXRlV3JhcHBlcihvcmlnaW5hbCk7XG4gIGlmIChpbmhlcml0ZWQpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGN1cnJlbnQsIGluaGVyaXRlZCk7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBjdXJyZW50KTtcbiAgb2JqW21ldGhvZF0gPSB3cmFwcGVyO1xuICByZXR1cm4gcmVtb3ZlO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwgJiYgb2JqW21ldGhvZF0gPT09IHdyYXBwZXIpXG4gICAgICByZW1vdmUoKTtcbiAgICByZXR1cm4gY3VycmVudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgaWYgKG9ialttZXRob2RdID09PSB3cmFwcGVyKSB7XG4gICAgICBpZiAoaGFkT3duKVxuICAgICAgICBvYmpbbWV0aG9kXSA9IG9yaWdpbmFsO1xuICAgICAgZWxzZVxuICAgICAgICBkZWxldGUgb2JqW21ldGhvZF07XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbClcbiAgICAgIHJldHVybjtcbiAgICBjdXJyZW50ID0gb3JpZ2luYWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGluaGVyaXRlZCB8fCBGdW5jdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZHVwZShrZXksIG9sZEZuLCBuZXdGbikge1xuICBjaGVja1trZXldID0ga2V5O1xuICByZXR1cm4gY2hlY2s7XG4gIGZ1bmN0aW9uIGNoZWNrKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gKG9sZEZuW2tleV0gPT09IGtleSA/IG9sZEZuIDogbmV3Rm4pLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBhZnRlcihwcm9taXNlLCBjYikge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGNiLCBjYik7XG59XG5mdW5jdGlvbiBzZXJpYWxpemUoYXN5bmNGdW5jdGlvbikge1xuICBsZXQgbGFzdFJ1biA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgYWZ0ZXIobGFzdFJ1biwgKCkgPT4ge1xuICAgICAgICBhc3luY0Z1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ocmVzLCByZWopO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgd3JhcHBlci5hZnRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICBhZnRlcihsYXN0UnVuLCByZXMpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IHsgYWZ0ZXIsIGFyb3VuZCwgZGVkdXBlLCBzZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyBBYnN0cmFjdElucHV0U3VnZ2VzdCwgQXBwLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgY2xhc3MgRm9sZGVyU3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PFRGb2xkZXI+IHtcblx0cHJpdmF0ZSBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0c3VwZXIoYXBwLCBpbnB1dEVsKTtcblx0XHR0aGlzLmlucHV0RWwgPSBpbnB1dEVsO1xuXHR9XG5cblx0Z2V0U3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IFRGb2xkZXJbXSB7XG5cdFx0Y29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgZm9sZGVyczogVEZvbGRlcltdID0gW107XG5cblx0XHR0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpLmZvckVhY2goKGZpbGUpID0+IHtcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuXHRcdFx0XHRpZiAoZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkpIHtcblx0XHRcdFx0XHRmb2xkZXJzLnB1c2goZmlsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZvbGRlcnMuc29ydCgoYSwgYikgPT4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKSk7XG5cdFx0cmV0dXJuIGZvbGRlcnMuc2xpY2UoMCwgMjApO1xuXHR9XG5cblx0cmVuZGVyU3VnZ2VzdGlvbihmb2xkZXI6IFRGb2xkZXIsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXHRcdGVsLmNyZWF0ZUVsKCdkaXYnLCB7IHRleHQ6IGZvbGRlci5wYXRoIHx8ICcvJyB9KTtcblx0fVxuXG5cdHNlbGVjdFN1Z2dlc3Rpb24oZm9sZGVyOiBURm9sZGVyKTogdm9pZCB7XG5cdFx0dGhpcy5pbnB1dEVsLnZhbHVlID0gZm9sZGVyLnBhdGg7XG5cdFx0dGhpcy5pbnB1dEVsLnRyaWdnZXIoJ2lucHV0Jyk7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCwgc2V0SWNvbiwgU2V0dGluZywgVGV4dENvbXBvbmVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQgeyBGb2xkZXJTdWdnZXN0IH0gZnJvbSBcIi4vZm9sZGVyLXN1Z2dlc3RcIjtcblxuZXhwb3J0IGNsYXNzIEF1dG9IaWRlTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbjtcblx0cHJpdmF0ZSBwYXRoczogc3RyaW5nW107XG5cdHByaXZhdGUgb25TYXZlOiAoKSA9PiB2b2lkO1xuXHRwcml2YXRlIGFkZElucHV0OiBUZXh0Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbiwgb25TYXZlOiAoKSA9PiB2b2lkKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHR0aGlzLnBhdGhzID0gWy4uLihwbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA/PyBbXSldO1xuXHRcdHRoaXMub25TYXZlID0gb25TYXZlO1xuXHR9XG5cblx0b25PcGVuKCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0VGl0bGUoXCJBdXRvLWhpZGUgZm9sZGVyc1wiKTtcblx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyQ29udGVudCgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwge1xuXHRcdFx0dGV4dDogXCJUaGUgZm9sbG93aW5nIGZvbGRlcnMgYXJlIGN1cnJlbnRseSBoaWRkZW4gZnJvbSB0aGUgZmlsZSBleHBsb3Jlci5cIlxuXHRcdH0pO1xuXG5cdFx0Ly8gV3JhcHBlciBkaXYgZm9yIHRoZSBsaXN0IGl0ZW1zIChtYXRjaGVzIG5hdGl2ZSBzdHJ1Y3R1cmUpXG5cdFx0Y29uc3QgbGlzdFdyYXBwZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XG5cblx0XHQvLyBMaXN0IGV4aXN0aW5nIHBhdGhzIHVzaW5nIG5hdGl2ZSBPYnNpZGlhbiBjbGFzc2VzXG5cdFx0dGhpcy5wYXRocy5mb3JFYWNoKChwYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0Y29uc3Qgcm93ID0gbGlzdFdyYXBwZXIuY3JlYXRlRGl2KHsgY2xzOiBcIm1vYmlsZS1vcHRpb24tc2V0dGluZy1pdGVtXCIgfSk7XG5cblx0XHRcdHJvdy5jcmVhdGVTcGFuKHtcblx0XHRcdFx0dGV4dDogcGF0aCB8fCBcIihlbXB0eSlcIixcblx0XHRcdFx0Y2xzOiBcIm1vYmlsZS1vcHRpb24tc2V0dGluZy1pdGVtLW5hbWVcIlxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlbW92ZUJ0biA9IHJvdy5jcmVhdGVEaXYoe1xuXHRcdFx0XHRjbHM6IFwiY2xpY2thYmxlLWljb24gbW9iaWxlLW9wdGlvbi1zZXR0aW5nLWl0ZW0tb3B0aW9uLWljb25cIixcblx0XHRcdFx0YXR0cjogeyBcImFyaWEtbGFiZWxcIjogXCJEZWxldGVcIiB9XG5cdFx0XHR9KTtcblx0XHRcdHNldEljb24ocmVtb3ZlQnRuLCBcInhcIik7XG5cdFx0XHRyZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5wYXRocy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIG5ldyBmb2xkZXIgaW5wdXRcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShcIkZvbGRlclwiKVxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB7XG5cdFx0XHRcdG5ldyBGb2xkZXJTdWdnZXN0KHRoaXMuYXBwLCB0ZXh0LmlucHV0RWwpO1xuXHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKFwiRW50ZXIgZm9sZGVyIHBhdGhcIik7XG5cdFx0XHRcdHRoaXMuYWRkSW5wdXQgPSB0ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5hZGRCdXR0b24oYnV0dG9uID0+IGJ1dHRvblxuXHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIkFkZFwiKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmFkZElucHV0Py5nZXRWYWx1ZSgpPy50cmltKCk7XG5cdFx0XHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnBhdGhzLnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdFx0dGhpcy5hZGRJbnB1dD8uc2V0VmFsdWUoXCJcIik7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKTtcblxuXHRcdC8vIFNhdmUgLyBDYW5jZWwgYnV0dG9ucyB1c2luZyBuYXRpdmUgbW9kYWwtYnV0dG9uLWNvbnRhaW5lclxuXHRcdHRoaXMubW9kYWxFbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtYnV0dG9uLWNvbnRhaW5lcicpPy5yZW1vdmUoKTtcblx0XHRjb25zdCBidXR0b25Db250YWluZXIgPSB0aGlzLm1vZGFsRWwuY3JlYXRlRGl2KHsgY2xzOiBcIm1vZGFsLWJ1dHRvbi1jb250YWluZXJcIiB9KTtcblxuXHRcdGNvbnN0IHNhdmVCdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJTYXZlXCIsXG5cdFx0XHRjbHM6IFwibW9kLWN0YVwiXG5cdFx0fSk7XG5cdFx0c2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA9IHRoaXMucGF0aHM7XG5cdFx0XHR2b2lkIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlQXV0b0hpZGVTdHlsZXMoKTtcblx0XHRcdHRoaXMub25TYXZlKCk7XG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjYW5jZWxCdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJDYW5jZWxcIixcblx0XHRcdGNsczogXCJtb2QtY2FuY2VsXCJcblx0XHR9KTtcblx0XHRjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHR9KTtcblx0fVxufVxuIiwgImltcG9ydCB7IEV4cGxvcmVyRm9jdXNTZXR0aW5ncyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvY3VzUGF0aChcblx0cGF0aDogc3RyaW5nLFxuXHRsZXZlbDogJ2ZpbGUnIHwgJ3BhcmVudCcgfCAnZ3JhbmRwYXJlbnQnIHwgJ2dyZWF0Z3JhbmRwYXJlbnQnIHwgJ2N1c3RvbScsXG5cdHNldHRpbmdzOiBFeHBsb3JlckZvY3VzU2V0dGluZ3Ncbik6IHN0cmluZyB7XG5cdGlmIChsZXZlbCA9PT0gJ2N1c3RvbScpIHtcblx0XHQvLyBVc2UgdGhlIGN1c3RvbSBmb2xkZXIgcGF0aCBmcm9tIHNldHRpbmdzLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQgZmlsZVxuXHRcdHJldHVybiBzZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoIHx8IHBhdGg7XG5cdH1cblxuXHRpZiAobGV2ZWwgPT09ICdmaWxlJykge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cblx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cdFxuXHRpZiAobGV2ZWwgPT09ICdwYXJlbnQnKSB7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIHBhdGg7IC8vIEFscmVhZHkgYXQgcm9vdFxuXHRcdH1cblx0XHRyZXR1cm4gcGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKTtcblx0fVxuXG5cdGlmIChsZXZlbCA9PT0gJ2dyYW5kcGFyZW50Jykge1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPD0gMikge1xuXHRcdFx0cmV0dXJuIHBhcnRzWzBdIHx8IHBhdGg7IC8vIFJldHVybiByb290IG9yIGZpcnN0IHBhcnRcblx0XHR9XG5cdFx0cmV0dXJuIHBhcnRzLnNsaWNlKDAsIC0yKS5qb2luKCcvJyk7XG5cdH1cblxuXHQvLyBncmVhdGdyYW5kcGFyZW50XG5cdGlmIChwYXJ0cy5sZW5ndGggPD0gMykge1xuXHRcdHJldHVybiBwYXJ0c1swXSB8fCBwYXRoOyAvLyBSZXR1cm4gcm9vdCBvciBmaXJzdCBwYXJ0XG5cdH1cblx0cmV0dXJuIHBhcnRzLnNsaWNlKDAsIC0zKS5qb2luKCcvJyk7XG59XG5cbiIsICJpbXBvcnQgeyBFeHBsb3JlckZvY3VzUGx1Z2luIH0gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7IGdldEZvY3VzUGF0aCB9IGZyb20gXCIuLi91dGlscy9mb2N1c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21tYW5kcyhwbHVnaW46IEV4cGxvcmVyRm9jdXNQbHVnaW4pOiB2b2lkIHtcblx0Ly8gVG9nZ2xlIGZvY3VzIGNvbW1hbmRcblx0cGx1Z2luLmFkZENvbW1hbmQoe1xuXHRcdGlkOiBcInRvZ2dsZVwiLFxuXHRcdG5hbWU6IFwiVG9nZ2xlIGZvY3VzXCIsXG5cdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdGlmIChwbHVnaW4uaXNGb2N1cykge1xuXHRcdFx0XHRwbHVnaW4uZXhpdEZvY3VzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAocGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGN1c3RvbSBmb2xkZXIsIHVzZSB0aGUgY3VzdG9tIHBhdGggZGlyZWN0bHlcblx0XHRcdFx0XHRpZiAocGx1Z2luLnNldHRpbmdzLmN1c3RvbUZvbGRlclBhdGgpIHtcblx0XHRcdFx0XHRcdHBsdWdpbi5lbnRlckZvY3VzKHBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRm9yIG90aGVyIGxldmVscywgbmVlZCB0aGUgY3VycmVudCBmaWxlXG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IHBsdWdpbi5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdFx0XHRpZiAoZmlsZT8ucGF0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZm9jdXNQYXRoID0gZ2V0Rm9jdXNQYXRoKGZpbGUucGF0aCwgcGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwsIHBsdWdpbi5zZXR0aW5ncyk7XG5cdFx0XHRcdFx0XHRwbHVnaW4uZW50ZXJGb2N1cyhmb2N1c1BhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdH0pO1xuXG5cdC8vIEZpbGUgbWVudSBpdGVtXG5cdGlmIChwbHVnaW4uc2V0dGluZ3Muc2hvd1JpZ2h0Q2xpY2tNZW51KSB7XG5cdFx0cGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG5cdFx0XHRwbHVnaW4uYXBwLndvcmtzcGFjZS5vbihcImZpbGUtbWVudVwiLCAobWVudSwgZmlsZSkgPT4ge1xuXHRcdFx0XHRpZiAoIXBsdWdpbi5zZXR0aW5ncy5zaG93UmlnaHRDbGlja01lbnUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpdGVtXG5cdFx0XHRcdFx0XHQuc2V0VGl0bGUocGx1Z2luLmlzRm9jdXMgPyBcIkV4aXQgZm9jdXNcIiA6IFwiRm9jdXNcIilcblx0XHRcdFx0XHRcdC5zZXRJY29uKHBsdWdpbi5pc0ZvY3VzID8gXCJsb2ctb3V0XCIgOiBcImZvY3VzXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0cGx1Z2luLnRvZ2dsZUZvY3VzKGZpbGU/LnBhdGgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxufVxuXG4iLCAiaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XG5cbi8qKlxuICogRmluZCBvciBjcmVhdGUgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyBjb250YWluZXIgaW4gdGhlIGZpbGUgZXhwbG9yZXIgdmlldy5cbiAqIFRyaWVzIG11bHRpcGxlIHNlbGVjdG9ycyB0byBzdXBwb3J0IGJvdGggZGVza3RvcCBhbmQgbW9iaWxlLlxuICogT24gbW9iaWxlLCBjcmVhdGVzIGEgY29udGFpbmVyIGlmIG5vbmUgZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5hdkJ1dHRvbnNDb250YWluZXIoZmlsZUV4cGxvcmVyVmlldzogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuXHQvLyBUcnkgZGVza3RvcCBzZWxlY3RvciBmaXJzdFxuXHRsZXQgY29udGFpbmVyID0gZmlsZUV4cGxvcmVyVmlldy5xdWVyeVNlbGVjdG9yKCcubmF2LWJ1dHRvbnMtY29udGFpbmVyJyk7XG5cdGlmIChjb250YWluZXIpIHtcblx0XHRyZXR1cm4gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXHR9XG5cblx0Ly8gVHJ5IGFsdGVybmF0aXZlIHNlbGVjdG9ycyBmb3IgbW9iaWxlXG5cdC8vIE1vYmlsZSBtaWdodCBoYXZlIHRoZSBidXR0b25zIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZVxuXHRjb250YWluZXIgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5uYXYtaGVhZGVyLWJ1dHRvbi1jb250YWluZXInKTtcblx0aWYgKGNvbnRhaW5lcikge1xuXHRcdHJldHVybiBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cdH1cblxuXHQvLyBUcnkgZmluZGluZyBieSBsb29raW5nIGZvciBleGlzdGluZyBuYXYtYWN0aW9uLWJ1dHRvbiBlbGVtZW50c1xuXHRjb25zdCBleGlzdGluZ0J1dHRvbnMgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXYtYWN0aW9uLWJ1dHRvbicpO1xuXHRpZiAoZXhpc3RpbmdCdXR0b25zLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBmaXJzdEJ1dHRvbiA9IGV4aXN0aW5nQnV0dG9uc1swXTtcblx0XHRjb25zdCBwYXJlbnQgPSBmaXJzdEJ1dHRvbi5wYXJlbnRFbGVtZW50O1xuXHRcdGlmIChwYXJlbnQgJiYgKHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25hdi1idXR0b25zLWNvbnRhaW5lcicpIHx8IFxuXHRcdCAgICAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25hdi1oZWFkZXItYnV0dG9uLWNvbnRhaW5lcicpIHx8XG5cdFx0ICAgICAgICAgICAgICAgQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLnNvbWUoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCduYXYtYWN0aW9uLWJ1dHRvbicpKSkpIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVHJ5IGZpbmRpbmcgdGhlIHZpZXcgaGVhZGVyIGFuZCBhcHBlbmRpbmcgdG8gaXRcblx0Y29uc3Qgdmlld0hlYWRlciA9IGZpbGVFeHBsb3JlclZpZXcucXVlcnlTZWxlY3RvcignLnZpZXctaGVhZGVyJykgYXMgSFRNTEVsZW1lbnQ7XG5cdGlmICh2aWV3SGVhZGVyKSB7XG5cdFx0Ly8gTG9vayBmb3IgYW55IGNvbnRhaW5lciB3aXRoIG5hdiBidXR0b25zIGluc2lkZSB0aGUgaGVhZGVyXG5cdFx0Y29uc3QgaGVhZGVyQ29udGFpbmVyID0gdmlld0hlYWRlci5xdWVyeVNlbGVjdG9yKCcubmF2LWJ1dHRvbnMtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfHxcblx0XHQgICAgICAgICAgICAgICAgICAgICAgIHZpZXdIZWFkZXIucXVlcnlTZWxlY3RvcignLm5hdi1oZWFkZXItYnV0dG9uLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50IHx8XG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICB2aWV3SGVhZGVyLnF1ZXJ5U2VsZWN0b3IoJy52aWV3LWhlYWRlci10aXRsZS1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcblx0XHRpZiAoaGVhZGVyQ29udGFpbmVyKSB7XG5cdFx0XHRyZXR1cm4gaGVhZGVyQ29udGFpbmVyO1xuXHRcdH1cblx0XHQvLyBJZiBubyBjb250YWluZXIgZm91bmQsIHJldHVybiB0aGUgaGVhZGVyIGl0c2VsZiBhcyBmYWxsYmFja1xuXHRcdHJldHVybiB2aWV3SGVhZGVyO1xuXHR9XG5cblx0Ly8gTW9iaWxlIGZhbGxiYWNrOiBMb29rIGZvciBuYXYtZmlsZXMtY29udGFpbmVyIGFuZCBjcmVhdGUgYSBidXR0b24gYmFyIGFib3ZlIGl0XG5cdGNvbnN0IG5hdkZpbGVzQ29udGFpbmVyID0gZmlsZUV4cGxvcmVyVmlldy5xdWVyeVNlbGVjdG9yKCcubmF2LWZpbGVzLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50O1xuXHRpZiAobmF2RmlsZXNDb250YWluZXIpIHtcblx0XHQvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgYSBtb2JpbGUgYnV0dG9uIGNvbnRhaW5lclxuXHRcdGxldCBtb2JpbGVCdXR0b25Db250YWluZXIgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5leHBsb3Jlci1mb2N1cy1tb2JpbGUtYnV0dG9ucycpIGFzIEhUTUxFbGVtZW50O1xuXHRcdGlmICghbW9iaWxlQnV0dG9uQ29udGFpbmVyKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSBtb2JpbGUgYnV0dG9uIGNvbnRhaW5lclxuXHRcdFx0bW9iaWxlQnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRtb2JpbGVCdXR0b25Db250YWluZXIuY2xhc3NOYW1lID0gJ25hdi1idXR0b25zLWNvbnRhaW5lciBleHBsb3Jlci1mb2N1cy1tb2JpbGUtYnV0dG9ucyc7XG5cdFx0XHRtb2JpbGVCdXR0b25Db250YWluZXIuc2V0Q3NzUHJvcHMoe1xuXHRcdFx0XHRkaXNwbGF5OiAnZmxleCcsXG5cdFx0XHRcdGFsaWduSXRlbXM6ICdjZW50ZXInLFxuXHRcdFx0XHRnYXA6ICc0cHgnLFxuXHRcdFx0XHRwYWRkaW5nOiAnOHB4Jyxcblx0XHRcdFx0Ym9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKSdcblx0XHRcdH0pO1xuXHRcdFx0XG5cdFx0XHQvLyBJbnNlcnQgaXQgYmVmb3JlIHRoZSBuYXYtZmlsZXMtY29udGFpbmVyXG5cdFx0XHRuYXZGaWxlc0NvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUobW9iaWxlQnV0dG9uQ29udGFpbmVyLCBuYXZGaWxlc0NvbnRhaW5lcik7XG5cdFx0fVxuXHRcdHJldHVybiBtb2JpbGVCdXR0b25Db250YWluZXI7XG5cdH1cblxuXHQvLyBMYXN0IHJlc29ydDogY3JlYXRlIGEgY29udGFpbmVyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdcblx0bGV0IHRvcENvbnRhaW5lciA9IGZpbGVFeHBsb3JlclZpZXcucXVlcnlTZWxlY3RvcignLmV4cGxvcmVyLWZvY3VzLW1vYmlsZS1idXR0b25zJykgYXMgSFRNTEVsZW1lbnQ7XG5cdGlmICghdG9wQ29udGFpbmVyKSB7XG5cdFx0dG9wQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dG9wQ29udGFpbmVyLmNsYXNzTmFtZSA9ICduYXYtYnV0dG9ucy1jb250YWluZXIgZXhwbG9yZXItZm9jdXMtbW9iaWxlLWJ1dHRvbnMnO1xuXHRcdHRvcENvbnRhaW5lci5zZXRDc3NQcm9wcyh7XG5cdFx0XHRkaXNwbGF5OiAnZmxleCcsXG5cdFx0XHRhbGlnbkl0ZW1zOiAnY2VudGVyJyxcblx0XHRcdGdhcDogJzRweCcsXG5cdFx0XHRwYWRkaW5nOiAnOHB4Jyxcblx0XHRcdGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlciknXG5cdFx0fSk7XG5cdFx0XG5cdFx0Ly8gSW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZXdcblx0XHRmaWxlRXhwbG9yZXJWaWV3Lmluc2VydEJlZm9yZSh0b3BDb250YWluZXIsIGZpbGVFeHBsb3JlclZpZXcuZmlyc3RDaGlsZCk7XG5cdH1cblx0cmV0dXJuIHRvcENvbnRhaW5lcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVFeHBsb3Jlckljb24ocGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKTogSFRNTEVsZW1lbnQge1xuXHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdGljb24uY2xhc3NOYW1lID0gJ2NsaWNrYWJsZS1pY29uIG5hdi1hY3Rpb24tYnV0dG9uJztcblx0aWNvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBcIlRvZ2dsZSBmb2N1c1wiKTtcblxuXHQvLyBDcmVhdGUgdGhlIGZvY3VzIGljb24gU1ZHXG5cdGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzI0Jyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyNCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcblx0c3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ2N1cnJlbnRDb2xvcicpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTtcblx0c3ZnLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnc3ZnLWljb24gbHVjaWRlLWZvY3VzJyk7XG5cdFxuXHQvLyBMdWNpZGUgZm9jdXMgaWNvbiAtIGNpcmNsZSB3aXRoIGNvcm5lciBicmFja2V0c1xuXHRjb25zdCBjaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsICcxMicpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdjeScsICcxMicpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgJzMnKTtcblx0c3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7XG5cdFxuXHRjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuXHRwYXRoMS5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDEpO1xuXHRcblx0Y29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcblx0cGF0aDIuc2V0QXR0cmlidXRlKCdkJywgJ00xNyAzaDJhMiAyIDAgMCAxIDIgMnYyJyk7XG5cdHN2Zy5hcHBlbmRDaGlsZChwYXRoMik7XG5cdFxuXHRjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuXHRwYXRoMy5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDMpO1xuXHRcblx0Y29uc3QgcGF0aDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcblx0cGF0aDQuc2V0QXR0cmlidXRlKCdkJywgJ003IDIxSDVhMiAyIDAgMCAxLTItMnYtMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDQpO1xuXHRcblx0aWNvbi5hcHBlbmRDaGlsZChzdmcpO1xuXHRyZXR1cm4gaWNvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEZpbGVFeHBsb3Jlckljb24oaWNvbjogSFRNTEVsZW1lbnQsIG5hdkJ1dHRvbnNDb250YWluZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cdC8vIERvbid0IGluc2VydCBpZiBhbHJlYWR5IGluIHRoZSBjb250YWluZXJcblx0aWYgKG5hdkJ1dHRvbnNDb250YWluZXIuY29udGFpbnMoaWNvbikpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBGaW5kIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQ6IGFmdGVyIGFsbCBkZWZhdWx0IE9ic2lkaWFuIGljb25zLCBiZWZvcmUgYW55IC5jbWRyIGVsZW1lbnRzXG5cdGNvbnN0IGFsbEljb25zID0gQXJyYXkuZnJvbShuYXZCdXR0b25zQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jbGlja2FibGUtaWNvbi5uYXYtYWN0aW9uLWJ1dHRvbicpKTtcblx0Y29uc3QgZGVmYXVsdEljb25zID0gYWxsSWNvbnMuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NtZHInKSAmJiBlbCAhPT0gaWNvbik7XG5cdGNvbnN0IGNtZHJJY29ucyA9IEFycmF5LmZyb20obmF2QnV0dG9uc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuY21kcicpKTtcblx0XG5cdGlmIChjbWRySWNvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIEluc2VydCBiZWZvcmUgZmlyc3QgY21kciBpY29uXG5cdFx0bmF2QnV0dG9uc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoaWNvbiwgY21kckljb25zWzBdKTtcblx0fSBlbHNlIGlmIChkZWZhdWx0SWNvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIEluc2VydCBhZnRlciBsYXN0IGRlZmF1bHQgaWNvblxuXHRcdGNvbnN0IGxhc3RJY29uID0gZGVmYXVsdEljb25zW2RlZmF1bHRJY29ucy5sZW5ndGggLSAxXTtcblx0XHRpZiAobGFzdEljb24ubmV4dFNpYmxpbmcpIHtcblx0XHRcdG5hdkJ1dHRvbnNDb250YWluZXIuaW5zZXJ0QmVmb3JlKGljb24sIGxhc3RJY29uLm5leHRTaWJsaW5nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2QnV0dG9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSnVzdCBhcHBlbmQgaWYgbm8gb3RoZXIgaWNvbnNcblx0XHRuYXZCdXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGlj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QUFJLFFBQVE7QUFDckMsY0FBTSxXQUFXLElBQUksR0FBRyxhQUFhLGlDQUFpQztBQUV0RSxZQUFJLGNBQWMsQ0FBQyxVQUFVO0FBQzVCLGNBQUksR0FBRyxZQUFZLEVBQUUsU0FBUyxPQUFPLENBQUM7QUFDdEMsY0FBSSxHQUFHLGFBQWEsbUNBQW1DLE1BQU07QUFBQSxRQUM5RCxXQUFXLENBQUMsY0FBYyxVQUFVO0FBQ25DLGNBQUksR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFDbEMsY0FBSSxHQUFHLGdCQUFnQixpQ0FBaUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Q7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQ1YsUUFBSSxLQUFLLGtCQUFrQjtBQUMxQixXQUFLLGlCQUFpQixPQUFPO0FBQzdCLFdBQUssbUJBQW1CO0FBQUEsSUFDekI7QUFBQSxFQUNEO0FBQ0Q7QUFFQSxJQUFPLGVBQVE7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJfYSJdCn0K