PlanTempusApp/PlanTempus.Application/wwwroot/js/app.js
Janus C. H. Knudsen 7fc1ae0650 WIP
2026-01-10 20:39:17 +01:00

604 lines
60 KiB
JavaScript

var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// wwwroot/ts/modules/sidebar.ts
var _SidebarController = class _SidebarController {
constructor() {
this.menuToggle = null;
this.appLayout = null;
this.menuTooltip = null;
this.menuToggle = document.getElementById("menuToggle");
this.appLayout = document.querySelector("swp-app-layout");
this.menuTooltip = document.getElementById("menuTooltip");
this.setupListeners();
this.setupTooltips();
this.restoreState();
}
/**
* Check if sidebar is collapsed
*/
get isCollapsed() {
return this.appLayout?.classList.contains("menu-collapsed") ?? false;
}
/**
* Toggle sidebar collapsed state
*/
toggle() {
if (!this.appLayout)
return;
this.appLayout.classList.toggle("menu-collapsed");
localStorage.setItem("sidebar-collapsed", String(this.isCollapsed));
}
/**
* Collapse the sidebar
*/
collapse() {
this.appLayout?.classList.add("menu-collapsed");
localStorage.setItem("sidebar-collapsed", "true");
}
/**
* Expand the sidebar
*/
expand() {
this.appLayout?.classList.remove("menu-collapsed");
localStorage.setItem("sidebar-collapsed", "false");
}
setupListeners() {
this.menuToggle?.addEventListener("click", () => this.toggle());
}
setupTooltips() {
if (!this.menuTooltip)
return;
const menuItems = document.querySelectorAll("swp-side-menu-item[data-tooltip]");
menuItems.forEach((item) => {
item.addEventListener("mouseenter", () => this.showTooltip(item));
item.addEventListener("mouseleave", () => this.hideTooltip());
});
}
showTooltip(item) {
if (!this.isCollapsed || !this.menuTooltip)
return;
const rect = item.getBoundingClientRect();
const tooltipText = item.dataset.tooltip;
if (!tooltipText)
return;
this.menuTooltip.textContent = tooltipText;
this.menuTooltip.style.left = `${rect.right + 8}px`;
this.menuTooltip.style.top = `${rect.top + rect.height / 2}px`;
this.menuTooltip.style.transform = "translateY(-50%)";
this.menuTooltip.showPopover();
}
hideTooltip() {
this.menuTooltip?.hidePopover();
}
restoreState() {
if (!this.appLayout)
return;
if (localStorage.getItem("sidebar-collapsed") === "true") {
this.appLayout.classList.add("menu-collapsed");
}
}
};
__name(_SidebarController, "SidebarController");
var SidebarController = _SidebarController;
// wwwroot/ts/modules/drawers.ts
var _DrawerController = class _DrawerController {
constructor() {
this.profileDrawer = null;
this.notificationDrawer = null;
this.todoDrawer = null;
this.newTodoDrawer = null;
this.overlay = null;
this.activeDrawer = null;
this.profileDrawer = document.getElementById("profileDrawer");
this.notificationDrawer = document.getElementById("notificationDrawer");
this.todoDrawer = document.getElementById("todoDrawer");
this.newTodoDrawer = document.getElementById("newTodoDrawer");
this.overlay = document.getElementById("drawerOverlay");
this.setupListeners();
}
/**
* Get currently active drawer name
*/
get active() {
return this.activeDrawer;
}
/**
* Open a drawer by name
*/
open(name) {
this.closeAll();
const drawer = this.getDrawer(name);
if (drawer && this.overlay) {
drawer.classList.add("active");
this.overlay.classList.add("active");
document.body.style.overflow = "hidden";
this.activeDrawer = name;
}
}
/**
* Close a specific drawer
*/
close(name) {
const drawer = this.getDrawer(name);
drawer?.classList.remove("active");
if (this.overlay && !document.querySelector('.active[class*="drawer"]')) {
this.overlay.classList.remove("active");
document.body.style.overflow = "";
}
if (this.activeDrawer === name) {
this.activeDrawer = null;
}
}
/**
* Close all drawers
*/
closeAll() {
[this.profileDrawer, this.notificationDrawer, this.todoDrawer, this.newTodoDrawer].forEach((drawer) => drawer?.classList.remove("active"));
this.overlay?.classList.remove("active");
document.body.style.overflow = "";
this.activeDrawer = null;
}
/**
* Open profile drawer
*/
openProfile() {
this.open("profile");
}
/**
* Open notification drawer
*/
openNotification() {
this.open("notification");
}
/**
* Open todo drawer (slides on top of profile)
*/
openTodo() {
this.todoDrawer?.classList.add("active");
}
/**
* Close todo drawer
*/
closeTodo() {
this.todoDrawer?.classList.remove("active");
this.closeNewTodo();
}
/**
* Open new todo drawer
*/
openNewTodo() {
this.newTodoDrawer?.classList.add("active");
}
/**
* Close new todo drawer
*/
closeNewTodo() {
this.newTodoDrawer?.classList.remove("active");
}
/**
* Mark all notifications as read
*/
markAllNotificationsRead() {
if (!this.notificationDrawer)
return;
const unreadItems = this.notificationDrawer.querySelectorAll(
'swp-notification-item[data-unread="true"]'
);
unreadItems.forEach((item) => item.removeAttribute("data-unread"));
const badge = document.querySelector("swp-notification-badge");
if (badge) {
badge.style.display = "none";
}
}
getDrawer(name) {
switch (name) {
case "profile":
return this.profileDrawer;
case "notification":
return this.notificationDrawer;
case "todo":
return this.todoDrawer;
case "newTodo":
return this.newTodoDrawer;
}
}
setupListeners() {
document.getElementById("profileTrigger")?.addEventListener("click", () => this.openProfile());
document.getElementById("drawerClose")?.addEventListener("click", () => this.close("profile"));
document.getElementById("notificationsBtn")?.addEventListener("click", () => this.openNotification());
document.getElementById("notificationDrawerClose")?.addEventListener("click", () => this.close("notification"));
document.getElementById("markAllRead")?.addEventListener("click", () => this.markAllNotificationsRead());
document.getElementById("openTodoDrawer")?.addEventListener("click", () => this.openTodo());
document.getElementById("todoDrawerBack")?.addEventListener("click", () => this.closeTodo());
document.getElementById("addTodoBtn")?.addEventListener("click", () => this.openNewTodo());
document.getElementById("newTodoDrawerBack")?.addEventListener("click", () => this.closeNewTodo());
document.getElementById("cancelNewTodo")?.addEventListener("click", () => this.closeNewTodo());
document.getElementById("saveNewTodo")?.addEventListener("click", () => this.closeNewTodo());
this.overlay?.addEventListener("click", () => this.closeAll());
document.addEventListener("keydown", (e) => {
if (e.key === "Escape")
this.closeAll();
});
this.todoDrawer?.addEventListener("click", (e) => this.handleTodoClick(e));
document.addEventListener("click", (e) => this.handleVisibilityClick(e));
}
handleTodoClick(e) {
const target = e.target;
const todoItem = target.closest("swp-todo-item");
const checkbox = target.closest("swp-todo-checkbox");
if (checkbox && todoItem) {
const isCompleted = todoItem.dataset.completed === "true";
if (isCompleted) {
todoItem.removeAttribute("data-completed");
} else {
todoItem.dataset.completed = "true";
}
}
const sectionHeader = target.closest("swp-todo-section-header");
if (sectionHeader) {
const section = sectionHeader.closest("swp-todo-section");
section?.classList.toggle("collapsed");
}
}
handleVisibilityClick(e) {
const target = e.target;
const option = target.closest("swp-visibility-option");
if (option) {
document.querySelectorAll("swp-visibility-option").forEach((o) => o.classList.remove("active"));
option.classList.add("active");
}
}
};
__name(_DrawerController, "DrawerController");
var DrawerController = _DrawerController;
// wwwroot/ts/modules/theme.ts
var _ThemeController = class _ThemeController {
constructor() {
this.root = document.documentElement;
this.themeOptions = document.querySelectorAll("swp-theme-option");
this.applyTheme(this.current);
this.updateUI();
this.setupListeners();
}
/**
* Get the current theme setting
*/
get current() {
const stored = localStorage.getItem(_ThemeController.STORAGE_KEY);
if (stored === "dark" || stored === "light" || stored === "system") {
return stored;
}
return "system";
}
/**
* Check if dark mode is currently active
*/
get isDark() {
return this.root.classList.contains(_ThemeController.DARK_CLASS) || this.systemPrefersDark && !this.root.classList.contains(_ThemeController.LIGHT_CLASS);
}
/**
* Check if system prefers dark mode
*/
get systemPrefersDark() {
return window.matchMedia("(prefers-color-scheme: dark)").matches;
}
/**
* Set theme and persist preference
*/
set(theme) {
localStorage.setItem(_ThemeController.STORAGE_KEY, theme);
this.applyTheme(theme);
this.updateUI();
}
/**
* Toggle between light and dark themes
*/
toggle() {
this.set(this.isDark ? "light" : "dark");
}
applyTheme(theme) {
this.root.classList.remove(_ThemeController.DARK_CLASS, _ThemeController.LIGHT_CLASS);
if (theme === "dark") {
this.root.classList.add(_ThemeController.DARK_CLASS);
} else if (theme === "light") {
this.root.classList.add(_ThemeController.LIGHT_CLASS);
}
}
updateUI() {
if (!this.themeOptions)
return;
const darkActive = this.isDark;
this.themeOptions.forEach((option) => {
const theme = option.dataset.theme;
const isActive = theme === "dark" && darkActive || theme === "light" && !darkActive;
option.classList.toggle("active", isActive);
});
}
setupListeners() {
this.themeOptions.forEach((option) => {
option.addEventListener("click", (e) => this.handleOptionClick(e));
});
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => this.handleSystemChange());
}
handleOptionClick(e) {
const target = e.target;
const option = target.closest("swp-theme-option");
if (option) {
const theme = option.dataset.theme;
if (theme) {
this.set(theme);
}
}
}
handleSystemChange() {
if (this.current === "system") {
this.updateUI();
}
}
};
__name(_ThemeController, "ThemeController");
_ThemeController.STORAGE_KEY = "theme-preference";
_ThemeController.DARK_CLASS = "dark-mode";
_ThemeController.LIGHT_CLASS = "light-mode";
var ThemeController = _ThemeController;
// wwwroot/ts/modules/search.ts
var _SearchController = class _SearchController {
constructor() {
this.input = null;
this.container = null;
this.input = document.getElementById("globalSearch");
this.container = document.querySelector("swp-topbar-search");
this.setupListeners();
}
/**
* Get current search value
*/
get value() {
return this.input?.value ?? "";
}
/**
* Set search value
*/
set value(val) {
if (this.input) {
this.input.value = val;
}
}
/**
* Focus the search input
*/
focus() {
this.input?.focus();
}
/**
* Blur the search input
*/
blur() {
this.input?.blur();
}
/**
* Clear the search input
*/
clear() {
this.value = "";
}
setupListeners() {
document.addEventListener("keydown", (e) => this.handleKeyboard(e));
if (this.input) {
this.input.addEventListener("input", (e) => this.handleInput(e));
const form = this.input.closest("form");
form?.addEventListener("submit", (e) => this.handleSubmit(e));
}
}
handleKeyboard(e) {
if ((e.metaKey || e.ctrlKey) && e.key === "k") {
e.preventDefault();
this.focus();
return;
}
if (e.key === "Escape" && document.activeElement === this.input) {
this.blur();
}
}
handleInput(e) {
const target = e.target;
const query = target.value.trim();
document.dispatchEvent(new CustomEvent("app:search", {
detail: { query },
bubbles: true
}));
}
handleSubmit(e) {
e.preventDefault();
const query = this.value.trim();
if (!query)
return;
document.dispatchEvent(new CustomEvent("app:search-submit", {
detail: { query },
bubbles: true
}));
}
};
__name(_SearchController, "SearchController");
var SearchController = _SearchController;
// wwwroot/ts/modules/lockscreen.ts
var _LockScreenController = class _LockScreenController {
constructor(drawers) {
// Demo PIN
this.lockScreen = null;
this.pinInput = null;
this.pinKeypad = null;
this.lockTimeEl = null;
this.pinDigits = null;
this.currentPin = "";
this.drawers = null;
this.drawers = drawers ?? null;
this.lockScreen = document.getElementById("lockScreen");
this.pinInput = document.getElementById("pinInput");
this.pinKeypad = document.getElementById("pinKeypad");
this.lockTimeEl = document.getElementById("lockTime");
this.pinDigits = this.pinInput?.querySelectorAll("swp-pin-digit") ?? null;
this.setupListeners();
}
/**
* Check if lock screen is active
*/
get isActive() {
return this.lockScreen?.classList.contains("active") ?? false;
}
/**
* Show the lock screen
*/
show() {
this.drawers?.closeAll();
if (this.lockScreen) {
this.lockScreen.classList.add("active");
document.body.style.overflow = "hidden";
}
this.currentPin = "";
this.updateDisplay();
if (this.lockTimeEl) {
this.lockTimeEl.textContent = `L\xE5st kl. ${this.formatTime()}`;
}
}
/**
* Hide the lock screen
*/
hide() {
if (this.lockScreen) {
this.lockScreen.classList.remove("active");
document.body.style.overflow = "";
}
this.currentPin = "";
this.updateDisplay();
}
formatTime() {
const now = /* @__PURE__ */ new Date();
const hours = now.getHours().toString().padStart(2, "0");
const minutes = now.getMinutes().toString().padStart(2, "0");
return `${hours}:${minutes}`;
}
updateDisplay() {
if (!this.pinDigits)
return;
this.pinDigits.forEach((digit, index) => {
digit.classList.remove("filled", "error");
if (index < this.currentPin.length) {
digit.textContent = "\u2022";
digit.classList.add("filled");
} else {
digit.textContent = "";
}
});
}
showError() {
if (!this.pinDigits)
return;
this.pinDigits.forEach((digit) => digit.classList.add("error"));
this.pinInput?.classList.add("shake");
setTimeout(() => {
this.currentPin = "";
this.updateDisplay();
this.pinInput?.classList.remove("shake");
}, 500);
}
verify() {
if (this.currentPin === _LockScreenController.CORRECT_PIN) {
this.hide();
} else {
this.showError();
}
}
addDigit(digit) {
if (this.currentPin.length >= 4)
return;
this.currentPin += digit;
this.updateDisplay();
if (this.currentPin.length === 4) {
setTimeout(() => this.verify(), 200);
}
}
removeDigit() {
if (this.currentPin.length === 0)
return;
this.currentPin = this.currentPin.slice(0, -1);
this.updateDisplay();
}
clearPin() {
this.currentPin = "";
this.updateDisplay();
}
setupListeners() {
this.pinKeypad?.addEventListener("click", (e) => this.handleKeypadClick(e));
document.addEventListener("keydown", (e) => this.handleKeyboard(e));
document.querySelector("swp-side-menu-action.lock")?.addEventListener("click", () => this.show());
}
handleKeypadClick(e) {
const target = e.target;
const key = target.closest("swp-pin-key");
if (!key)
return;
const digit = key.dataset.digit;
const action = key.dataset.action;
if (digit) {
this.addDigit(digit);
} else if (action === "backspace") {
this.removeDigit();
} else if (action === "clear") {
this.clearPin();
}
}
handleKeyboard(e) {
if (!this.isActive)
return;
e.preventDefault();
if (e.key >= "0" && e.key <= "9") {
this.addDigit(e.key);
} else if (e.key === "Backspace") {
this.removeDigit();
} else if (e.key === "Escape") {
this.clearPin();
}
}
};
__name(_LockScreenController, "LockScreenController");
_LockScreenController.CORRECT_PIN = "1234";
var LockScreenController = _LockScreenController;
// wwwroot/ts/app.ts
var _App = class _App {
constructor() {
this.sidebar = new SidebarController();
this.drawers = new DrawerController();
this.theme = new ThemeController();
this.search = new SearchController();
this.lockScreen = new LockScreenController(this.drawers);
}
};
__name(_App, "App");
var App = _App;
var app;
function init() {
app = new App();
if (typeof window !== "undefined") {
window.app = app;
}
}
__name(init, "init");
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
var app_default = App;
export {
App,
app,
app_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdHMvbW9kdWxlcy9zaWRlYmFyLnRzIiwgIi4uL3RzL21vZHVsZXMvZHJhd2Vycy50cyIsICIuLi90cy9tb2R1bGVzL3RoZW1lLnRzIiwgIi4uL3RzL21vZHVsZXMvc2VhcmNoLnRzIiwgIi4uL3RzL21vZHVsZXMvbG9ja3NjcmVlbi50cyIsICIuLi90cy9hcHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogU2lkZWJhciBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBzaWRlYmFyIGNvbGxhcHNlL2V4cGFuZCBhbmQgdG9vbHRpcCBmdW5jdGlvbmFsaXR5XG4gKi9cblxuZXhwb3J0IGNsYXNzIFNpZGViYXJDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBtZW51VG9nZ2xlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFwcExheW91dDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZW51VG9vbHRpcDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1lbnVUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudVRvZ2dsZScpO1xuICAgIHRoaXMuYXBwTGF5b3V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3dwLWFwcC1sYXlvdXQnKTtcbiAgICB0aGlzLm1lbnVUb29sdGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lbnVUb29sdGlwJyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zZXR1cFRvb2x0aXBzKCk7XG4gICAgdGhpcy5yZXN0b3JlU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBzaWRlYmFyIGlzIGNvbGxhcHNlZFxuICAgKi9cbiAgZ2V0IGlzQ29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwcExheW91dD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW51LWNvbGxhcHNlZCcpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzaWRlYmFyIGNvbGxhcHNlZCBzdGF0ZVxuICAgKi9cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHBMYXlvdXQpIHJldHVybjtcblxuICAgIHRoaXMuYXBwTGF5b3V0LmNsYXNzTGlzdC50b2dnbGUoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJywgU3RyaW5nKHRoaXMuaXNDb2xsYXBzZWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZSB0aGUgc2lkZWJhclxuICAgKi9cbiAgY29sbGFwc2UoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBMYXlvdXQ/LmNsYXNzTGlzdC5hZGQoJ21lbnUtY29sbGFwc2VkJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NpZGViYXItY29sbGFwc2VkJywgJ3RydWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIHNpZGViYXJcbiAgICovXG4gIGV4cGFuZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcExheW91dD8uY2xhc3NMaXN0LnJlbW92ZSgnbWVudS1jb2xsYXBzZWQnKTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnLCAnZmFsc2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW51VG9nZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMudG9nZ2xlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFRvb2x0aXBzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZW51VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWVudUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1zaWRlLW1lbnUtaXRlbVtkYXRhLXRvb2x0aXBdJyk7XG5cbiAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHRoaXMuc2hvd1Rvb2x0aXAoaXRlbSkpO1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oaWRlVG9vbHRpcCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1Rvb2x0aXAoaXRlbTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDb2xsYXBzZWQgfHwgIXRoaXMubWVudVRvb2x0aXApIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gaXRlbS5kYXRhc2V0LnRvb2x0aXA7XG5cbiAgICBpZiAoIXRvb2x0aXBUZXh0KSByZXR1cm47XG5cbiAgICB0aGlzLm1lbnVUb29sdGlwLnRleHRDb250ZW50ID0gdG9vbHRpcFRleHQ7XG4gICAgdGhpcy5tZW51VG9vbHRpcC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIDh9cHhgO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJ9cHhgO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTUwJSknO1xuICAgIHRoaXMubWVudVRvb2x0aXAuc2hvd1BvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5tZW51VG9vbHRpcD8uaGlkZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVN0YXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHBMYXlvdXQpIHJldHVybjtcblxuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2lkZWJhci1jb2xsYXBzZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLmFwcExheW91dC5jbGFzc0xpc3QuYWRkKCdtZW51LWNvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRHJhd2VyIENvbnRyb2xsZXJcbiAqXG4gKiBIYW5kbGVzIGFsbCBkcmF3ZXIgZnVuY3Rpb25hbGl0eSBpbmNsdWRpbmcgcHJvZmlsZSwgbm90aWZpY2F0aW9ucywgYW5kIHRvZG8gZHJhd2Vyc1xuICovXG5cbmV4cG9ydCB0eXBlIERyYXdlck5hbWUgPSAncHJvZmlsZScgfCAnbm90aWZpY2F0aW9uJyB8ICd0b2RvJyB8ICduZXdUb2RvJztcblxuZXhwb3J0IGNsYXNzIERyYXdlckNvbnRyb2xsZXIge1xuICBwcml2YXRlIHByb2ZpbGVEcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uRHJhd2VyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRvZG9EcmF3ZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbmV3VG9kb0RyYXdlcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFjdGl2ZURyYXdlcjogRHJhd2VyTmFtZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvZmlsZURyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlRHJhd2VyJyk7XG4gICAgdGhpcy5ub3RpZmljYXRpb25EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyJyk7XG4gICAgdGhpcy50b2RvRHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXInKTtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3VG9kb0RyYXdlcicpO1xuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmF3ZXJPdmVybGF5Jyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBhY3RpdmUgZHJhd2VyIG5hbWVcbiAgICovXG4gIGdldCBhY3RpdmUoKTogRHJhd2VyTmFtZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZURyYXdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJhd2VyIGJ5IG5hbWVcbiAgICovXG4gIG9wZW4obmFtZTogRHJhd2VyTmFtZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBbGwoKTtcblxuICAgIGNvbnN0IGRyYXdlciA9IHRoaXMuZ2V0RHJhd2VyKG5hbWUpO1xuICAgIGlmIChkcmF3ZXIgJiYgdGhpcy5vdmVybGF5KSB7XG4gICAgICBkcmF3ZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICB0aGlzLm92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLmFjdGl2ZURyYXdlciA9IG5hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGEgc3BlY2lmaWMgZHJhd2VyXG4gICAqL1xuICBjbG9zZShuYW1lOiBEcmF3ZXJOYW1lKTogdm9pZCB7XG4gICAgY29uc3QgZHJhd2VyID0gdGhpcy5nZXREcmF3ZXIobmFtZSk7XG4gICAgZHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgIC8vIE9ubHkgaGlkZSBvdmVybGF5IGlmIG5vIGRyYXdlcnMgYXJlIGFjdGl2ZVxuICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hY3RpdmVbY2xhc3MqPVwiZHJhd2VyXCJdJykpIHtcbiAgICAgIHRoaXMub3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVEcmF3ZXIgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYWxsIGRyYXdlcnNcbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIFt0aGlzLnByb2ZpbGVEcmF3ZXIsIHRoaXMubm90aWZpY2F0aW9uRHJhd2VyLCB0aGlzLnRvZG9EcmF3ZXIsIHRoaXMubmV3VG9kb0RyYXdlcl1cbiAgICAgIC5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXI/LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcblxuICAgIHRoaXMub3ZlcmxheT8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIHRoaXMuYWN0aXZlRHJhd2VyID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHByb2ZpbGUgZHJhd2VyXG4gICAqL1xuICBvcGVuUHJvZmlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4oJ3Byb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIG5vdGlmaWNhdGlvbiBkcmF3ZXJcbiAgICovXG4gIG9wZW5Ob3RpZmljYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuKCdub3RpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRvZG8gZHJhd2VyIChzbGlkZXMgb24gdG9wIG9mIHByb2ZpbGUpXG4gICAqL1xuICBvcGVuVG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRvZG8gZHJhd2VyXG4gICAqL1xuICBjbG9zZVRvZG8oKTogdm9pZCB7XG4gICAgdGhpcy50b2RvRHJhd2VyPy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0aGlzLmNsb3NlTmV3VG9kbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gbmV3IHRvZG8gZHJhd2VyXG4gICAqL1xuICBvcGVuTmV3VG9kbygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RvZG9EcmF3ZXI/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIG5ldyB0b2RvIGRyYXdlclxuICAgKi9cbiAgY2xvc2VOZXdUb2RvKCk6IHZvaWQge1xuICAgIHRoaXMubmV3VG9kb0RyYXdlcj8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBhbGwgbm90aWZpY2F0aW9ucyBhcyByZWFkXG4gICAqL1xuICBtYXJrQWxsTm90aWZpY2F0aW9uc1JlYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdW5yZWFkSXRlbXMgPSB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICdzd3Atbm90aWZpY2F0aW9uLWl0ZW1bZGF0YS11bnJlYWQ9XCJ0cnVlXCJdJ1xuICAgICk7XG4gICAgdW5yZWFkSXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXVucmVhZCcpKTtcblxuICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC1ub3RpZmljYXRpb24tYmFkZ2UnKTtcbiAgICBpZiAoYmFkZ2UpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREcmF3ZXIobmFtZTogRHJhd2VyTmFtZSk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdwcm9maWxlJzogcmV0dXJuIHRoaXMucHJvZmlsZURyYXdlcjtcbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbic6IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbkRyYXdlcjtcbiAgICAgIGNhc2UgJ3RvZG8nOiByZXR1cm4gdGhpcy50b2RvRHJhd2VyO1xuICAgICAgY2FzZSAnbmV3VG9kbyc6IHJldHVybiB0aGlzLm5ld1RvZG9EcmF3ZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBQcm9maWxlIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9maWxlVHJpZ2dlcicpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuUHJvZmlsZSgpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ3Byb2ZpbGUnKSk7XG5cbiAgICAvLyBOb3RpZmljYXRpb24gZHJhd2VyIHRyaWdnZXJzXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnNCdG4nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3Blbk5vdGlmaWNhdGlvbigpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uRHJhd2VyQ2xvc2UnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoJ25vdGlmaWNhdGlvbicpKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFya0FsbFJlYWQnKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMubWFya0FsbE5vdGlmaWNhdGlvbnNSZWFkKCkpO1xuXG4gICAgLy8gVG9kbyBkcmF3ZXIgdHJpZ2dlcnNcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BlblRvZG9EcmF3ZXInKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMub3BlblRvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvZG9EcmF3ZXJCYWNrJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlVG9kbygpKTtcblxuICAgIC8vIE5ldyB0b2RvIGRyYXdlciB0cmlnZ2Vyc1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRUb2RvQnRuJylcbiAgICAgID8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLm9wZW5OZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXdUb2RvRHJhd2VyQmFjaycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbE5ld1RvZG8nKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2VOZXdUb2RvKCkpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlTmV3VG9kbycpXG4gICAgICA/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZU5ld1RvZG8oKSk7XG5cbiAgICAvLyBPdmVybGF5IGNsaWNrIGNsb3NlcyBhbGxcbiAgICB0aGlzLm92ZXJsYXk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZUFsbCgpKTtcblxuICAgIC8vIEVzY2FwZSBrZXkgY2xvc2VzIGFsbFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgdGhpcy5jbG9zZUFsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVG9kbyBpbnRlcmFjdGlvbnNcbiAgICB0aGlzLnRvZG9EcmF3ZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVG9kb0NsaWNrKGUpKTtcblxuICAgIC8vIFZpc2liaWxpdHkgb3B0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG9kb0NsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgdG9kb0l0ZW0gPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLWl0ZW0nKTtcbiAgICBjb25zdCBjaGVja2JveCA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tY2hlY2tib3gnKTtcblxuICAgIGlmIChjaGVja2JveCAmJiB0b2RvSXRlbSkge1xuICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSB0b2RvSXRlbS5kYXRhc2V0LmNvbXBsZXRlZCA9PT0gJ3RydWUnO1xuICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgIHRvZG9JdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jb21wbGV0ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvZG9JdGVtLmRhdGFzZXQuY29tcGxldGVkID0gJ3RydWUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvZ2dsZSBzZWN0aW9uIGNvbGxhcHNlXG4gICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IHRhcmdldC5jbG9zZXN0PEhUTUxFbGVtZW50Pignc3dwLXRvZG8tc2VjdGlvbi1oZWFkZXInKTtcbiAgICBpZiAoc2VjdGlvbkhlYWRlcikge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25IZWFkZXIuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC10b2RvLXNlY3Rpb24nKTtcbiAgICAgIHNlY3Rpb24/LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVmlzaWJpbGl0eUNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKTtcblxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdzd3AtdmlzaWJpbGl0eS1vcHRpb24nKVxuICAgICAgICAuZm9yRWFjaChvID0+IG8uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgb3B0aW9uLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogVGhlbWUgQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgZGFyay9saWdodCBtb2RlIHN3aXRjaGluZyBhbmQgc3lzdGVtIHByZWZlcmVuY2UgZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0IHR5cGUgVGhlbWUgPSAnbGlnaHQnIHwgJ2RhcmsnIHwgJ3N5c3RlbSc7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZUNvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX0tFWSA9ICd0aGVtZS1wcmVmZXJlbmNlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREFSS19DTEFTUyA9ICdkYXJrLW1vZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMSUdIVF9DTEFTUyA9ICdsaWdodC1tb2RlJztcblxuICBwcml2YXRlIHJvb3Q6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHRoZW1lT3B0aW9uczogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHRoaXMudGhlbWVPcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC10aGVtZS1vcHRpb24nKTtcblxuICAgIHRoaXMuYXBwbHlUaGVtZSh0aGlzLmN1cnJlbnQpO1xuICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHRoZW1lIHNldHRpbmdcbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFRoZW1lIHtcbiAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShUaGVtZUNvbnRyb2xsZXIuU1RPUkFHRV9LRVkpIGFzIFRoZW1lIHwgbnVsbDtcbiAgICBpZiAoc3RvcmVkID09PSAnZGFyaycgfHwgc3RvcmVkID09PSAnbGlnaHQnIHx8IHN0b3JlZCA9PT0gJ3N5c3RlbScpIHtcbiAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgfVxuICAgIHJldHVybiAnc3lzdGVtJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBkYXJrIG1vZGUgaXMgY3VycmVudGx5IGFjdGl2ZVxuICAgKi9cbiAgZ2V0IGlzRGFyaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb290LmNsYXNzTGlzdC5jb250YWlucyhUaGVtZUNvbnRyb2xsZXIuREFSS19DTEFTUykgfHxcbiAgICAgICh0aGlzLnN5c3RlbVByZWZlcnNEYXJrICYmICF0aGlzLnJvb3QuY2xhc3NMaXN0LmNvbnRhaW5zKFRoZW1lQ29udHJvbGxlci5MSUdIVF9DTEFTUykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHN5c3RlbSBwcmVmZXJzIGRhcmsgbW9kZVxuICAgKi9cbiAgZ2V0IHN5c3RlbVByZWZlcnNEYXJrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZW1lIGFuZCBwZXJzaXN0IHByZWZlcmVuY2VcbiAgICovXG4gIHNldCh0aGVtZTogVGhlbWUpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShUaGVtZUNvbnRyb2xsZXIuU1RPUkFHRV9LRVksIHRoZW1lKTtcbiAgICB0aGlzLmFwcGx5VGhlbWUodGhlbWUpO1xuICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYmV0d2VlbiBsaWdodCBhbmQgZGFyayB0aGVtZXNcbiAgICovXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldCh0aGlzLmlzRGFyayA/ICdsaWdodCcgOiAnZGFyaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRoZW1lKHRoZW1lOiBUaGVtZSk6IHZvaWQge1xuICAgIHRoaXMucm9vdC5jbGFzc0xpc3QucmVtb3ZlKFRoZW1lQ29udHJvbGxlci5EQVJLX0NMQVNTLCBUaGVtZUNvbnRyb2xsZXIuTElHSFRfQ0xBU1MpO1xuXG4gICAgaWYgKHRoZW1lID09PSAnZGFyaycpIHtcbiAgICAgIHRoaXMucm9vdC5jbGFzc0xpc3QuYWRkKFRoZW1lQ29udHJvbGxlci5EQVJLX0NMQVNTKTtcbiAgICB9IGVsc2UgaWYgKHRoZW1lID09PSAnbGlnaHQnKSB7XG4gICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZChUaGVtZUNvbnRyb2xsZXIuTElHSFRfQ0xBU1MpO1xuICAgIH1cbiAgICAvLyAnc3lzdGVtJyBsZWF2ZXMgYm90aCBjbGFzc2VzIG9mZiwgbGV0dGluZyBDU1MgbWVkaWEgcXVlcnkgaGFuZGxlIGl0XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVVJKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aGVtZU9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGRhcmtBY3RpdmUgPSB0aGlzLmlzRGFyaztcblxuICAgIHRoaXMudGhlbWVPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IHRoZW1lID0gb3B0aW9uLmRhdGFzZXQudGhlbWUgYXMgVGhlbWU7XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9ICh0aGVtZSA9PT0gJ2RhcmsnICYmIGRhcmtBY3RpdmUpIHx8ICh0aGVtZSA9PT0gJ2xpZ2h0JyAmJiAhZGFya0FjdGl2ZSk7XG4gICAgICBvcHRpb24uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgaXNBY3RpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBUaGVtZSBvcHRpb24gY2xpY2tzXG4gICAgdGhpcy50aGVtZU9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgb3B0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHRoaXMuaGFuZGxlT3B0aW9uQ2xpY2soZSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU3lzdGVtIHRoZW1lIGNoYW5nZXNcbiAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpXG4gICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5oYW5kbGVTeXN0ZW1DaGFuZ2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9wdGlvbkNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgb3B0aW9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCdzd3AtdGhlbWUtb3B0aW9uJyk7XG5cbiAgICBpZiAob3B0aW9uKSB7XG4gICAgICBjb25zdCB0aGVtZSA9IG9wdGlvbi5kYXRhc2V0LnRoZW1lIGFzIFRoZW1lO1xuICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgIHRoaXMuc2V0KHRoZW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN5c3RlbUNoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHJlYWN0IHRvIHN5c3RlbSBjaGFuZ2VzIGlmIHdlJ3JlIHVzaW5nIHN5c3RlbSBwcmVmZXJlbmNlXG4gICAgaWYgKHRoaXMuY3VycmVudCA9PT0gJ3N5c3RlbScpIHtcbiAgICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFNlYXJjaCBDb250cm9sbGVyXG4gKlxuICogSGFuZGxlcyBnbG9iYWwgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgYW5kIGtleWJvYXJkIHNob3J0Y3V0c1xuICovXG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbFNlYXJjaCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC10b3BiYXItc2VhcmNoJyk7XG5cbiAgICB0aGlzLnNldHVwTGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc2VhcmNoIHZhbHVlXG4gICAqL1xuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dD8udmFsdWUgPz8gJyc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlYXJjaCB2YWx1ZVxuICAgKi9cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQudmFsdWUgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBzZWFyY2ggaW5wdXRcbiAgICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQmx1ciB0aGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBibHVyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmJsdXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0c1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlib2FyZChlKSk7XG5cbiAgICAvLyBJbnB1dCBoYW5kbGVyc1xuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHRoaXMuaGFuZGxlSW5wdXQoZSkpO1xuXG4gICAgICAvLyBQcmV2ZW50IGZvcm0gc3VibWlzc2lvbiBpZiB3cmFwcGVkIGluIGZvcm1cbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmlucHV0LmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICAgIGZvcm0/LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdChlKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlib2FyZChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ21kL0N0cmwgKyBLIHRvIGZvY3VzIHNlYXJjaFxuICAgIGlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSB0byBibHVyIHNlYXJjaCB3aGVuIGZvY3VzZWRcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGFyZ2V0LnZhbHVlLnRyaW0oKTtcblxuICAgIC8vIEVtaXQgY3VzdG9tIGV2ZW50IGZvciBzZWFyY2hcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnYXBwOnNlYXJjaCcsIHtcbiAgICAgIGRldGFpbDogeyBxdWVyeSB9LFxuICAgICAgYnViYmxlczogdHJ1ZVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KGU6IEV2ZW50KTogdm9pZCB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm47XG5cbiAgICAvLyBFbWl0IGN1c3RvbSBldmVudCBmb3Igc2VhcmNoIHN1Ym1pdFxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdhcHA6c2VhcmNoLXN1Ym1pdCcsIHtcbiAgICAgIGRldGFpbDogeyBxdWVyeSB9LFxuICAgICAgYnViYmxlczogdHJ1ZVxuICAgIH0pKTtcbiAgfVxufVxuIiwgIi8qKlxuICogTG9jayBTY3JlZW4gQ29udHJvbGxlclxuICpcbiAqIEhhbmRsZXMgUElOLWJhc2VkIGxvY2sgc2NyZWVuIGZ1bmN0aW9uYWxpdHlcbiAqL1xuXG5pbXBvcnQgeyBEcmF3ZXJDb250cm9sbGVyIH0gZnJvbSAnLi9kcmF3ZXJzJztcblxuZXhwb3J0IGNsYXNzIExvY2tTY3JlZW5Db250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09SUkVDVF9QSU4gPSAnMTIzNCc7IC8vIERlbW8gUElOXG5cbiAgcHJpdmF0ZSBsb2NrU2NyZWVuOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbklucHV0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbktleXBhZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NrVGltZUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBpbkRpZ2l0czogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50UGluID0gJyc7XG4gIHByaXZhdGUgZHJhd2VyczogRHJhd2VyQ29udHJvbGxlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRyYXdlcnM/OiBEcmF3ZXJDb250cm9sbGVyKSB7XG4gICAgdGhpcy5kcmF3ZXJzID0gZHJhd2VycyA/PyBudWxsO1xuICAgIHRoaXMubG9ja1NjcmVlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NrU2NyZWVuJyk7XG4gICAgdGhpcy5waW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaW5JbnB1dCcpO1xuICAgIHRoaXMucGluS2V5cGFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpbktleXBhZCcpO1xuICAgIHRoaXMubG9ja1RpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2NrVGltZScpO1xuICAgIHRoaXMucGluRGlnaXRzID0gdGhpcy5waW5JbnB1dD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3N3cC1waW4tZGlnaXQnKSA/PyBudWxsO1xuXG4gICAgdGhpcy5zZXR1cExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGxvY2sgc2NyZWVuIGlzIGFjdGl2ZVxuICAgKi9cbiAgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tTY3JlZW4/LmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGUgbG9jayBzY3JlZW5cbiAgICovXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3ZXJzPy5jbG9zZUFsbCgpO1xuXG4gICAgaWYgKHRoaXMubG9ja1NjcmVlbikge1xuICAgICAgdGhpcy5sb2NrU2NyZWVuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuXG4gICAgLy8gVXBkYXRlIGxvY2sgdGltZVxuICAgIGlmICh0aGlzLmxvY2tUaW1lRWwpIHtcbiAgICAgIHRoaXMubG9ja1RpbWVFbC50ZXh0Q29udGVudCA9IGBMXHUwMEU1c3Qga2wuICR7dGhpcy5mb3JtYXRUaW1lKCl9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgbG9jayBzY3JlZW5cbiAgICovXG4gIGhpZGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9ja1NjcmVlbikge1xuICAgICAgdGhpcy5sb2NrU2NyZWVuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFBpbiA9ICcnO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBob3VycyA9IG5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtaW51dGVzID0gbm93LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hvdXJzfToke21pbnV0ZXN9YDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGluRGlnaXRzKSByZXR1cm47XG5cbiAgICB0aGlzLnBpbkRpZ2l0cy5mb3JFYWNoKChkaWdpdCwgaW5kZXgpID0+IHtcbiAgICAgIGRpZ2l0LmNsYXNzTGlzdC5yZW1vdmUoJ2ZpbGxlZCcsICdlcnJvcicpO1xuICAgICAgaWYgKGluZGV4IDwgdGhpcy5jdXJyZW50UGluLmxlbmd0aCkge1xuICAgICAgICBkaWdpdC50ZXh0Q29udGVudCA9ICdcdTIwMjInO1xuICAgICAgICBkaWdpdC5jbGFzc0xpc3QuYWRkKCdmaWxsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpZ2l0LnRleHRDb250ZW50ID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGluRGlnaXRzKSByZXR1cm47XG5cbiAgICB0aGlzLnBpbkRpZ2l0cy5mb3JFYWNoKGRpZ2l0ID0+IGRpZ2l0LmNsYXNzTGlzdC5hZGQoJ2Vycm9yJykpO1xuXG4gICAgLy8gU2hha2UgYW5pbWF0aW9uXG4gICAgdGhpcy5waW5JbnB1dD8uY2xhc3NMaXN0LmFkZCgnc2hha2UnKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50UGluID0gJyc7XG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgICAgIHRoaXMucGluSW5wdXQ/LmNsYXNzTGlzdC5yZW1vdmUoJ3NoYWtlJyk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQaW4gPT09IExvY2tTY3JlZW5Db250cm9sbGVyLkNPUlJFQ1RfUElOKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERpZ2l0KGRpZ2l0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGluLmxlbmd0aCA+PSA0KSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRQaW4gKz0gZGlnaXQ7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICAvLyBBdXRvLXZlcmlmeSB3aGVuIDQgZGlnaXRzIGVudGVyZWRcbiAgICBpZiAodGhpcy5jdXJyZW50UGluLmxlbmd0aCA9PT0gNCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnZlcmlmeSgpLCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRGlnaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpbi5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQaW4gPSB0aGlzLmN1cnJlbnRQaW4uc2xpY2UoMCwgLTEpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBpbigpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQaW4gPSAnJztcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gS2V5cGFkIGNsaWNrIGhhbmRsZXJcbiAgICB0aGlzLnBpbktleXBhZD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlwYWRDbGljayhlKSk7XG5cbiAgICAvLyBLZXlib2FyZCBpbnB1dFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gdGhpcy5oYW5kbGVLZXlib2FyZChlKSk7XG5cbiAgICAvLyBMb2NrIGJ1dHRvbiBpbiBzaWRlYmFyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ3N3cC1zaWRlLW1lbnUtYWN0aW9uLmxvY2snKVxuICAgICAgPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2hvdygpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5cGFkQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBrZXkgPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oJ3N3cC1waW4ta2V5Jyk7XG5cbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlnaXQgPSBrZXkuZGF0YXNldC5kaWdpdDtcbiAgICBjb25zdCBhY3Rpb24gPSBrZXkuZGF0YXNldC5hY3Rpb247XG5cbiAgICBpZiAoZGlnaXQpIHtcbiAgICAgIHRoaXMuYWRkRGlnaXQoZGlnaXQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnYmFja3NwYWNlJykge1xuICAgICAgdGhpcy5yZW1vdmVEaWdpdCgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICB0aGlzLmNsZWFyUGluKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlib2FyZChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG5cbiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgdG8gYXZvaWQgb3RoZXIgaW50ZXJhY3Rpb25zXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGUua2V5ID49ICcwJyAmJiBlLmtleSA8PSAnOScpIHtcbiAgICAgIHRoaXMuYWRkRGlnaXQoZS5rZXkpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICB0aGlzLnJlbW92ZURpZ2l0KCk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuY2xlYXJQaW4oKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFNhbG9uIE9TIEFwcFxuICpcbiAqIE1haW4gYXBwbGljYXRpb24gY2xhc3MgdGhhdCBvcmNoZXN0cmF0ZXMgYWxsIFVJIGNvbnRyb2xsZXJzXG4gKi9cblxuaW1wb3J0IHsgU2lkZWJhckNvbnRyb2xsZXIgfSBmcm9tICcuL21vZHVsZXMvc2lkZWJhcic7XG5pbXBvcnQgeyBEcmF3ZXJDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL2RyYXdlcnMnO1xuaW1wb3J0IHsgVGhlbWVDb250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL3RoZW1lJztcbmltcG9ydCB7IFNlYXJjaENvbnRyb2xsZXIgfSBmcm9tICcuL21vZHVsZXMvc2VhcmNoJztcbmltcG9ydCB7IExvY2tTY3JlZW5Db250cm9sbGVyIH0gZnJvbSAnLi9tb2R1bGVzL2xvY2tzY3JlZW4nO1xuXG4vKipcbiAqIE1haW4gYXBwbGljYXRpb24gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEFwcCB7XG4gIHJlYWRvbmx5IHNpZGViYXI6IFNpZGViYXJDb250cm9sbGVyO1xuICByZWFkb25seSBkcmF3ZXJzOiBEcmF3ZXJDb250cm9sbGVyO1xuICByZWFkb25seSB0aGVtZTogVGhlbWVDb250cm9sbGVyO1xuICByZWFkb25seSBzZWFyY2g6IFNlYXJjaENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGxvY2tTY3JlZW46IExvY2tTY3JlZW5Db250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgY29udHJvbGxlcnNcbiAgICB0aGlzLnNpZGViYXIgPSBuZXcgU2lkZWJhckNvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmRyYXdlcnMgPSBuZXcgRHJhd2VyQ29udHJvbGxlcigpO1xuICAgIHRoaXMudGhlbWUgPSBuZXcgVGhlbWVDb250cm9sbGVyKCk7XG4gICAgdGhpcy5zZWFyY2ggPSBuZXcgU2VhcmNoQ29udHJvbGxlcigpO1xuICAgIHRoaXMubG9ja1NjcmVlbiA9IG5ldyBMb2NrU2NyZWVuQ29udHJvbGxlcih0aGlzLmRyYXdlcnMpO1xuICB9XG59XG5cbi8qKlxuICogR2xvYmFsIGFwcCBpbnN0YW5jZVxuICovXG5sZXQgYXBwOiBBcHA7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb25cbiAqL1xuZnVuY3Rpb24gaW5pdCgpOiB2b2lkIHtcbiAgYXBwID0gbmV3IEFwcCgpO1xuXG4gIC8vIEV4cG9zZSB0byB3aW5kb3cgZm9yIGRlYnVnZ2luZ1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAod2luZG93IGFzIHVua25vd24gYXMgeyBhcHA6IEFwcCB9KS5hcHAgPSBhcHA7XG4gIH1cbn1cblxuLy8gV2FpdCBmb3IgRE9NIHJlYWR5XG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbn0gZWxzZSB7XG4gIGluaXQoKTtcbn1cblxuZXhwb3J0IHsgYXBw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