Lightcord/BetterDiscordApp/dist/index.js

12778 lines
1.5 MiB

module.exports =
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./src/0globals.js":
/*!*************************!*\
!*** ./src/0globals.js ***!
\*************************/
/*! exports provided: minimumDiscordVersion, currentDiscordVersion, minSupportedVersion, bbdVersion, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, bdpluginErrors, bdthemeErrors, bdConfig, bdthemes, bdplugins, pluginCookie, themeCookie */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumDiscordVersion", function() { return minimumDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currentDiscordVersion", function() { return currentDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minSupportedVersion", function() { return minSupportedVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdVersion", function() { return bbdVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdChangelog", function() { return bbdChangelog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultCookie", function() { return defaultCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsCookie", function() { return settingsCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsRPC", function() { return settingsRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRPC", function() { return defaultRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdpluginErrors", function() { return bdpluginErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemeErrors", function() { return bdthemeErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdConfig", function() { return bdConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemes", function() { return bdthemes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdplugins", function() { return bdplugins; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluginCookie", function() { return pluginCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "themeCookie", function() { return themeCookie; });
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/webpackModules */ "./src/modules/webpackModules.js");
const minimumDiscordVersion = "0.0.306";
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306";
const minSupportedVersion = "0.3.0";
const bbdVersion = "0.3.5";
/*
export const LCChanelog = {
description: "Lightcord's changelog",
changes: [
{
title: "What's New?",
items: [
"Lightcord is now available !",
"We removed emotes. That's sad for people who were actually using it, but it was leading to more loading time and some basic words were emote."
]
}
],
image: "https://i.imgur.com/sfNhqwP.png",
title: "Lightcord",
subtitle: "v"+remote.getGlobal("BuildInfo").version,
footer: (function(){
const TextElement = WebpackModules.findByDisplayName("Text");
const ModalStack = WebpackModules.findByProps("push", "update", "pop", "popWithKey");
if(!TextElement || !ModalStack)return null
const Anchor = WebpackModules.find(m => m.displayName == "Anchor");
const AnchorClasses = WebpackModules.findByProps("anchorUnderlineOnHover") || {anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"};
const joinSupportServer = (click) => {
click.preventDefault();
click.stopPropagation();
ModalStack.pop();
BDV2.joinLC();
};
const supportLink = Anchor ? BDV2.React.createElement(Anchor, {onClick: joinSupportServer}, "Join our Discord Server.") : BDV2.React.createElement("a", {className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer}, "Join our Discord Server.");
return BDV2.React.createElement(TextElement, {size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD}, "Need support? ", supportLink);
})()
}*/
const bbdChangelog = {
description: "BBD's changelog.",
changes: [{
title: "Bug Fixes",
type: "fixed",
items: ["Some fixes related to showing modals in the `BdApi`.", "Fixed the open folder buttons for plugins and themes"]
}]
};
const settings = {
"Custom css live update": {
id: "bda-css-0",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"Custom css auto udpate": {
id: "bda-css-1",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"BetterDiscord Blue": {
id: "bda-gs-b",
info: "Replace Discord blue with BD Blue",
implemented: false,
hidden: false,
cat: "core"
},
/* Core */
/* ====== */
"Public Servers": {
id: "bda-gs-1",
info: "Display public servers button",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Minimal Mode": {
id: "bda-gs-2",
info: "Hide elements and reduce the size of elements.",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Mode": {
id: "bda-gs-4",
info: "Only show voice chat",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Hide Channels": {
id: "bda-gs-3",
info: "Hide channels in minimal mode",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Dark Mode": {
id: "bda-gs-5",
info: "Make certain elements dark by default(wip)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Disconnect": {
id: "bda-dc-0",
info: "Disconnect from voice server when closing Discord",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"24 Hour Timestamps": {
id: "bda-gs-6",
info: "Replace 12hr timestamps with proper ones",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Colored Text": {
id: "bda-gs-7",
info: "Make text color the same as role color",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Normalize Classes": {
id: "fork-ps-4",
info: "Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
/* Content */
"Content Error Modal": {
id: "fork-ps-1",
info: "Shows a modal with plugin/theme errors",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Scan Plugins": {
id: "fork-ps-6",
info: "Scan plugins for any threat that can be hidden inside.",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Show Toasts": {
id: "fork-ps-2",
info: "Shows a small notification for important information",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Scroll To Settings": {
id: "fork-ps-3",
info: "Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Automatic Loading": {
id: "fork-ps-5",
info: "Automatically loads, reloads, and unloads plugins and themes",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Enable Edit Button": {
id: "fork-ps-7",
info: "Enable an Edit Button on the plugin and theme panel.",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Themes in Popout Window": {
id: "lightcord-9",
info: "Enable themes in Popout Window. (For example, when detaching screenshare.)",
implemented: true,
hidden: false,
cat: "core",
category: "content manager",
experimental: true
},
/* Developer */
"Developer Mode": {
id: "bda-gs-8",
info: "Developer Mode Toggle",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"Copy Selector": {
id: "fork-dm-1",
info: "Adds a \"Copy Selector\" option to context menus when developer mode is active",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"React DevTools": {
id: "reactDevTools",
info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.",
implemented: true,
hidden: true,
cat: "core",
category: "developer settings"
},
/** Lightcord */
"Disable BetterDiscord": {
id: "bd-disable",
info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).",
implemented: false,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Blur Personal Information": {
id: "lightcord-6",
info: "Blur sensitive informations like email, payment infos and more.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Calling Ring Beat": {
id: "lightcord-2",
info: "Enable Discord's special calling beat.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Developer Options": {
id: "lightcord-1",
info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Lightcord Api\" section.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Ad Block": {
id: "lightcord-4",
info: "Block any BOT that dms you with an invite link. Even in an embed.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Enable Lightcord Servers": {
id: "lightcord-5",
info: "Enable Lightcord's servers. Disabling this will disable custom badges.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Disable typing": {
id: "lightcord-7",
info: "Don't let other see you're typing.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Lightcord Tabs": {
id: "lightcord-8",
info: "Allows you to launch multiple instances of Lightcord in the same window.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord",
experimental: true
},
"Use Notification Shim": {
id: "lightcord-10",
info: "Basically don't use Windows's Notifications.",
implemented: true,
hidden: process.platform !== "win32",
cat: "lightcord",
category: "Lightcord",
experimental: false
},
/** Lightcord Window */
"Always-on-Top": {
id: "lightcord-3",
info: "Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Window"
},
"No Window Bounds": {
id: "no_window_bound",
info: "Disable Window Bounds. Can be useful if you use a window manager.",
implemented: true,
hidden: process.platform !== "linux",
cat: "lightcord",
category: "Window"
},
"Enable Glasstron": {
id: "enable_glasstron",
info: "Enable Glasstron. If you're not using transparent themes, this can reduce lag.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Window"
},
/** RichPresence */
"Enable": {
id: "lightcord-presence-1",
info: "Enable RichPresence below.",
implemented: true,
hidden: false,
cat: "status"
}
};
const defaultCookie = {
"bda-gs-1": true,
"bda-gs-2": false,
"bda-gs-3": false,
"bda-gs-4": false,
"bda-gs-5": true,
"bda-gs-6": false,
"bda-gs-7": false,
"bda-gs-8": true,
"bda-es-0": true,
"bda-es-1": true,
"bda-es-2": true,
"bda-es-4": false,
"bda-es-6": true,
"bda-es-7": true,
"bda-gs-b": false,
"bda-es-8": true,
"bda-dc-0": false,
"bda-css-0": false,
"bda-css-1": false,
"bda-es-9": true,
"fork-dm-1": false,
"fork-ps-1": true,
"fork-ps-2": true,
"fork-ps-3": true,
"fork-ps-4": true,
"fork-ps-5": true,
"fork-ps-6": true,
"fork-ps-7": false,
"fork-es-2": false,
"fork-es-3": true,
"fork-wp-1": false,
"fork-wp-2": false,
"fork-beta": true,
"reactDevTools": false,
"lightcord-1": false,
"lightcord-2": true,
"lightcord-presence-1": false,
"lightcord-3": false,
"lightcord-4": false,
"lightcord-5": true,
"lightcord-6": true,
"lightcord-7": false,
"lightcord-8": false,
"lightcord-9": false,
"lightcord-10": false,
"no_window_bound": false
};
const settingsCookie = {};
const settingsRPC = {};
const defaultRPC = {
"name": "Lightcord",
"application_id": "711416957718757418",
"state": "Lightcord Client",
"details": "Browsing Discord",
"timestamps.start": Date.now(),
"assets.small": null,
"assets.large": "712323821037682791"
};
const bdpluginErrors = [];
const bdthemeErrors = []; // define for backwards compatibility
const bdConfig = Object.create(BetterDiscordConfig);
const bdthemes = {};
const bdplugins = {};
const pluginCookie = {};
const themeCookie = {};
/***/ }),
/***/ "./src/index.js":
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; });
/* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js");
/* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js");
Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])();
Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])();
const deprecateGlobal = (key, value) => {
Object.defineProperty(window, key, {
get() {
_modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`);
return value;
}
});
};
const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__);
for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]);
deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]);
deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]);
deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]);
deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]);
deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]);
deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]);
deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]);
window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"];
deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]); // TODO: Change Init mode and stop using CoreWrapper.
class CoreWrapper {
constructor(bdConfig, methods) {
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setMethods(methods);
}
init() {
// deprecateGlobal("mainCore", this.mainCore);
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
}
}
/***/ }),
/***/ "./src/loadingIcon.js":
/*!****************************!*\
!*** ./src/loadingIcon.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (() => {
const v2Loader = document.createElement("div");
v2Loader.className = "bd-loaderv2";
v2Loader.title = "BandagedBD is loading...";
document.body.appendChild(v2Loader);
});
/***/ }),
/***/ "./src/localStorageFix.js":
/*!********************************!*\
!*** ./src/localStorageFix.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function () {
const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get;
Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", {
get: function () {
const contentWindow = Reflect.apply(contentWindowGetter, this, arguments);
return new Proxy(contentWindow, {
getOwnPropertyDescriptor: function (obj, prop) {
if (prop === "localStorage") return undefined;
return Object.getOwnPropertyDescriptor(obj, prop);
},
get: function (obj, prop) {
if (prop === "localStorage") return null;
const val = obj[prop];
if (typeof val === "function") return val.bind(obj);
return val;
}
});
}
}); // Prevent interception by patching Reflect.apply and Function.prototype.bind
Object.defineProperty(Reflect, "apply", {
value: Reflect.apply,
writable: false,
configurable: false
});
Object.defineProperty(Function.prototype, "bind", {
value: Function.prototype.bind,
writable: false,
configurable: false
});
const oOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
const url = arguments[1];
if (url.toLowerCase().includes("api/webhooks")) return null;
return Reflect.apply(oOpen, this, arguments);
};
});
/***/ }),
/***/ "./src/modules/24hour.js":
/*!*******************************!*\
!*** ./src/modules/24hour.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class TFHour {
inject24Hour() {
if (this.cancel24Hour) return;
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
const convert = data => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return;
const matched = data.returnValue.match(twelveHour);
if (!matched || matched.length !== 4) return;
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
};
const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", {
after: convert
}); // Called in Cozy mode
const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", {
after: convert
}); // Called in Compact mode
this.cancel24Hour = () => {
cancelCozy();
cancelCompact();
}; // Cancel both
}
remove24Hour() {
if (this.cancel24Hour) this.cancel24Hour();
}
}());
/***/ }),
/***/ "./src/modules/AntiAdDM.js":
/*!*********************************!*\
!*** ./src/modules/AntiAdDM.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
const dispatcher = window.Lightcord.DiscordModules.dispatcher;
const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default;
let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
const blocked = {};
let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0];
function getCurrentUser() {
if (userModule) return userModule.default.getCurrentUser();
return null;
}
/* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM {
constructor() {
this.antiDM = this.antiDM.bind(this);
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
dispatcher.subscribe("MESSAGE_CREATE", this.antiDM);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM);
}
antiDM(ev) {
if (!ev.message.author.bot) return;
if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return;
const channel = ChannelModule.getChannel(ev.message.channel_id);
if (!channel) return; // might be broken
if (channel.type !== 1) return;
if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again.
if (scanMessage(ev.message)) {
blocked[ev.message.author.id] = true;
_utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, {
"type": "warning"
});
if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
relationShipModule.default.addRelationship(ev.message.author.id, {
location: "ContextMenu"
}, 2);
if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
DMModule.default.closePrivateChannel(channel.id, false);
}
}
}());
function scanMessage(message) {
if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true;
if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true;
return false;
}
function EmbedsContains(message, search) {
let embeds = message.embeds || [];
if (embeds.length === 0) return false;
return embeds.map(embed => {
if (embed.type !== "rich") return false;
if ((embed.title || "").includes(search)) return true;
if ((embed.description || "").includes(search)) return true;
if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true;
if ((embed.fields || []).map(e => {
return e.value.includes(search) || e.name.includes(search);
}).includes(true)) return true;
return false;
}).includes(true);
}
/***/ }),
/***/ "./src/modules/CustomRichPresence.js":
/*!*******************************************!*\
!*** ./src/modules/CustomRichPresence.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default;
const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes;
const socketId = "lightcord-spoof-socket";
const pid = process.pid;
/* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence {
constructor() {
this.enabled = false;
this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"];
}
get formatedGame() {
if (!this.game) return null;
if (this.enabled === false) return null;
let game = {
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name,
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id,
details: this.game.details || undefined,
state: this.game.state || undefined,
timestamps: this.game["timestamps.start"] ? {
start: this.game["timestamps.start"]
} : undefined,
assets: this.game["assets.large"] ? {
large_image: this.game["assets.large"],
small_image: this.game["assets.small"] || undefined
} : undefined
};
return game;
}
sendGame() {
dispatcher.dispatch({
type: ActionTypes.LOCAL_ACTIVITY_UPDATE,
socketId,
pid,
activity: this.formatedGame
});
}
enable() {
if (this.enabled) return;
this.enabled = true;
console.log("Enabling custom RichPresence");
this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]));
this.sendGame();
}
disable() {
if (!this.enabled) return;
this.enabled = false;
console.log("Disabling custom RichPresence");
this.sendGame();
}
async fetchAssets(applicationId) {
let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId);
if (assets.undefined && typeof assets.undefined === "number") {
throw new Error("Unknown Application");
}
return assets;
}
set(activity) {
this.game = activity;
this.sendGame();
}
}());
/***/ }),
/***/ "./src/modules/bdApi.js":
/*!******************************!*\
!*** ./src/modules/bdApi.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
const BdApi = {
get React() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React;
},
get ReactDOM() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom;
},
get ReactComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent;
},
get WindowConfigFile() {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile;
},
get settings() {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"];
},
get emotes() {
return {};
},
// deprecated, deleted all emotes from betterdiscord.
get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
},
get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
};
BdApi.getAllWindowPreferences = function () {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences();
};
BdApi.getWindowPreference = function (key) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key);
};
BdApi.setWindowPreference = function (key, value) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value);
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.injectCSS = function (id, css) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css);
}; //Clear css/remove any element
//id = id of element
BdApi.clearCSS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.linkJS = function (id, url) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url);
}; //Clear css/remove any element
//id = id of element
BdApi.unlinkJS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Get another plugin
//name = name of plugin
BdApi.getPlugin = function (name) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin;
}
return null;
}; //Get BetterDiscord Core
BdApi.getCore = function () {
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`);
return _core__WEBPACK_IMPORTED_MODULE_1__["default"];
};
/**
* Shows a generic but very customizable modal.
* @param {string} title - title of the modal
* @param {string} content - a string of text to display in the modal
*/
BdApi.alert = function (title, content) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, {
cancelText: null
});
};
/**
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
* @param {string} title - title of the modal
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
* @param {object} [options] - options to modify the modal
* @param {boolean} [options.danger=false] - whether the main button should be red or not
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
* @param {string} [options.cancelText=Cancel] - text for the cancel button
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
* @returns {string} - the key used for this modal
*/
BdApi.showConfirmationModal = function (title, content, options = {}) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options);
}; //Show toast alert
BdApi.showToast = function (content, options = {}) {
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options);
}; // Finds module
BdApi.findModule = function (filter) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter);
}; // Finds module
BdApi.findAllModules = function (filter) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter);
}; // Finds module
BdApi.findModuleByProps = function (...props) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props);
};
BdApi.findModuleByPrototypes = function (...protos) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos);
};
BdApi.findModuleByDisplayName = function (name) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name);
}; // Gets react instance
BdApi.getInternalInstance = function (node) {
if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined;
if (node instanceof jQuery) node = node[0];
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node);
}; // Gets data
BdApi.loadData = function (pluginName, key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key);
};
BdApi.getData = BdApi.loadData; // Sets data
BdApi.saveData = function (pluginName, key, data) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data);
};
BdApi.setData = BdApi.saveData; // Deletes data
BdApi.deleteData = function (pluginName, key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key);
}; // Patches other functions
BdApi.monkeyPatch = function (what, methodName, options) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options);
}; // Event when element is removed
BdApi.onRemoved = function (node, callback) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback);
}; // Wraps function in try..catch
BdApi.suppressErrors = function (method, message) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message);
}; // Tests for valid JSON
BdApi.testJSON = function (data) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data);
};
BdApi.isPluginEnabled = function (name) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name];
};
BdApi.isThemeEnabled = function (name) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name];
};
BdApi.isSettingEnabled = function (id) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id];
};
BdApi.enableSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true);
};
BdApi.disableSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false);
};
BdApi.toggleSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]);
}; // Gets data
BdApi.getBDData = function (key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key);
}; // Sets data
BdApi.setBDData = function (key, data) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data);
};
const makeAddonAPI = (cookie, list, manager) => new class AddonAPI {
get folder() {
return manager.folder;
}
isEnabled(name) {
return !!cookie[name];
}
enable(name) {
return manager.enable(name);
}
disable(name) {
return manager.disable(name);
}
toggle(name) {
if (cookie[name]) this.disable(name);else this.enable(name);
}
reload(name) {
return manager.reload(name);
}
get(name) {
if (list.hasOwnProperty(name)) {
if (list[name].plugin) return list[name].plugin;
return list[name];
}
return null;
}
getAll() {
return Object.keys(list).map(k => this.get(k)).filter(a => a);
}
}();
BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
/* harmony default export */ __webpack_exports__["default"] = (BdApi);
window.Lightcord.BetterDiscord.BdApi = BdApi;
/***/ }),
/***/ "./src/modules/bdEvents.js":
/*!*********************************!*\
!*** ./src/modules/bdEvents.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* BDEvents */
const EventEmitter = __webpack_require__(/*! events */ "events");
/* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter {
constructor() {
super();
window.Lightcord.BetterDiscord.BDEvents = this;
}
dispatch(eventName, ...args) {
this.emit(eventName, ...args);
}
off(eventName, eventAction) {
this.removeListener(eventName, eventAction);
}
}());
/***/ }),
/***/ "./src/modules/blurPrivate.js":
/*!************************************!*\
!*** ./src/modules/blurPrivate.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/**
* Credits to @hellbound1337 on github for the css
*/
let selectors;
const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa;
function getSelectors() {
let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0];
if (!standardSidebarView) return null;
let defaultClassName = removeDa(standardSidebarView.standardSidebarView);
let selects = [];
let userSettingsAccount = BDModules.get(e => e.userSettingsAccount)[0];
const children = BDModules.get(e => typeof e.children === "string")[0];
selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`);
if (userSettingsAccount) {
selects.push(`#app-mount .${defaultClassName} .${removeDa(userSettingsAccount.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
selects.push(`.${removeDa(userSettingsAccount.userSettingsSecurity)} .${removeDa(children.children)} > div:nth-child(2)`);
}
console.log(selects);
return selects;
}
/* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate {
constructor() {
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
selectors = selectors || getSelectors();
if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations."));
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", `
${selectors.join(", ")} {
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
filter: blur(4px);
opacity: .8;
}
${selectors.map(e => e + ":hover").join(", ")} {
transition: all 150ms cubic-bezier(.55,.09,.68,.53);
filter: none;
opacity: 1;
}`);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate");
}
}());
/***/ }),
/***/ "./src/modules/classNormalizer.js":
/*!****************************************!*\
!*** ./src/modules/classNormalizer.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
const normalizedPrefix = "da";
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
/* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer {
constructor() {
window.Lightcord.BetterDiscord.ClassNormalizer = this;
}
stop() {
if (!this.hasPatched) return;
this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
this.revertElement(document.querySelector("#app-mount"));
this.hasPatched = false;
}
start() {
if (this.hasPatched) return;
this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
this.normalizeElement(document.querySelector("#app-mount"));
this.hasPatched = true;
this.patchDOMMethods();
}
patchClassModules(modules) {
for (const module of modules) {
this.patchClassModule(normalizedPrefix, module);
}
}
unpatchClassModules(modules) {
for (const module of modules) {
this.unpatchClassModule(normalizedPrefix, module);
}
}
shouldIgnore(value) {
if (!isNaN(value)) return true;
if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true;
if (value.startsWith("layerContainer-")) return true;
if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true;
if (value.includes("calc(") || value.includes("rgba")) return true;
return false;
}
moduleFilter(module) {
if (typeof module !== "object" || Array.isArray(module)) return false;
if (module.__esModule) return false;
if (!Object.keys(module).length) return false;
for (const baseClassName in module) {
const value = module[baseClassName];
if (typeof value !== "string") return false;
if (this.shouldIgnore(value)) continue;
if (value.split("-").length === 1) return false;
if (!randClass.test(value.split(" ")[0])) return false;
}
return true;
}
patchClassModule(componentName, classNames) {
for (const baseClassName in classNames) {
const value = classNames[baseClassName];
if (this.shouldIgnore(value)) continue;
const classList = value.split(" ");
for (const normalClass of classList) {
const match = normalClass.match(randClass);
if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know
const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
classNames[baseClassName] += ` ${componentName}-${camelCase}`;
}
}
}
unpatchClassModule(componentName, classNames) {
for (const baseClassName in classNames) {
const value = classNames[baseClassName];
if (this.shouldIgnore(value)) continue;
let newString = "";
const classList = value.split(" ");
for (const normalClass of classList) {
if (normalClass.startsWith(`${componentName}-`)) continue;
newString += ` ${normalClass}`;
}
classNames[baseClassName] = newString.trim();
}
}
normalizeElement(element) {
if (!(element instanceof Element)) return;
const classes = element.classList;
for (let c = 0, clen = classes.length; c < clen; c++) {
if (!randClass.test(classes[c])) continue;
const match = classes[c].match(randClass)[1];
const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
element.classList.add(`${normalizedPrefix}-${newClass}`);
}
for (const child of element.children) this.normalizeElement(child);
}
revertElement(element) {
if (!(element instanceof Element)) return;
if (element.children && element.children.length) this.revertElement(element.children[0]);
if (element.nextElementSibling) this.revertElement(element.nextElementSibling);
const classes = element.classList;
const toRemove = [];
for (let c = 0; c < classes.length; c++) {
if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);
}
element.classList.remove(...toRemove);
}
patchDOMMethods() {
const contains = DOMTokenList.prototype.contains;
DOMTokenList.prototype.contains = function (token) {
// const tokens = token.split(" ");
return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t));
};
const add = DOMTokenList.prototype.add;
DOMTokenList.prototype.add = function (...tokens) {
for (let t = 0; t < tokens.length; t++) {
tokens[t] = tokens[t].split(" ")[0];
}
return Reflect.apply(add, this, tokens);
};
const remove = DOMTokenList.prototype.remove;
DOMTokenList.prototype.remove = function (...tokens) {
for (let t = 0; t < tokens.length; t++) {
tokens[t] = tokens[t].split(" ")[0];
}
return Reflect.apply(remove, this, tokens);
};
}
}());
/***/ }),
/***/ "./src/modules/coloredText.js":
/*!************************************!*\
!*** ./src/modules/coloredText.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class ColoredText {
injectColoredText() {
if (this.cancelColoredText) return;
if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return;
this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", {
before: data => {
const props = data.methodArguments[0];
if (!props || !props.childrenMessageContent) return;
const messageContent = props.childrenMessageContent;
if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return;
const originalType = messageContent.type.type;
if (originalType.__originalMethod) return; // Don't patch again
messageContent.type.type = function (props) {
const returnValue = originalType(props);
const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : "";
returnValue.props.style = {
color: roleColor
};
return returnValue;
};
messageContent.type.type.__originalMethod = originalType;
Object.assign(messageContent.type.type, originalType);
}
});
}
removeColoredText() {
let classNameMarkup = BDModules.get(e => e.markup)[0].markup;
document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => {
elem.style.setProperty("color", "");
});
}
}());
/***/ }),
/***/ "./src/modules/contentManager.js":
/*!***************************************!*\
!*** ./src/modules/contentManager.js ***!
\***************************************/
/*! exports provided: addonCache, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addonCache", function() { return addonCache; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! crypto */ "crypto");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! events */ "events");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_7__);
const path = __webpack_require__(/*! path */ "path");
const fs = __webpack_require__(/*! fs */ "fs");
const Module = __webpack_require__(/*! module */ "module").Module;
Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules"));
class MetaError extends Error {
constructor(message) {
super(message);
this.name = "MetaError";
}
}
const originalJSRequire = Module._extensions[".js"];
const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => {
return null;
};
const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
const escapedAtRegex = /^\\@/;
let addonCache = {};
let hasPatched = false;
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
constructor() {
this.timeCache = {};
this.watchers = {};
}
patchExtensions() {
if (hasPatched) return;
hasPatched = true;
Module._extensions[".js"] = this.getContentRequire("plugin");
Module._extensions[".css"] = this.getContentRequire("theme");
}
get pluginsFolder() {
return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/")));
}
get themesFolder() {
return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/")));
}
loadAddonCertifierCache() {
if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes") !== "string") {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}"));
} else {
try {
addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes")));
} catch (e) {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}"));
addonCache = {};
}
}
Object.keys(addonCache).forEach(key => {
let value = addonCache[key];
if (!value || typeof value !== "object" || Array.isArray(value)) return delete addonCache[key];
let props = [{
key: "timestamp",
type: "number"
}, {
key: "result",
type: "object"
}, {
key: "hash",
type: "string"
}];
for (let prop of props) {
if (!(prop.key in value) || typeof value[prop.key] !== prop.type) {
delete addonCache[key];
return;
}
}
if (value.hash !== key) {
delete addonCache[key];
return;
}
if (value.result.suspect) {
// refetch from remote to be sure you're up to date.
delete addonCache[key];
return;
}
});
this.saveAddonCache();
}
saveAddonCache() {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])(JSON.stringify(addonCache)));
}
watchContent(contentType) {
if (this.watchers[contentType]) return;
const isPlugin = contentType === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
this.watchers[contentType] = fs.watch(baseFolder, {
persistent: false
}, async (eventType, filename) => {
if (!eventType || !filename || !filename.endsWith(fileEnding)) return;
await new Promise(r => setTimeout(r, 50));
try {
fs.statSync(path.resolve(baseFolder, filename));
} catch (err) {
if (err.code !== "ENOENT") return;
delete this.timeCache[filename];
if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename);
return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename);
}
if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;
const stats = fs.statSync(path.resolve(baseFolder, filename));
if (!stats || !stats.mtime || !stats.mtime.getTime()) return;
if (typeof stats.mtime.getTime() !== "number") return;
if (this.timeCache[filename] == stats.mtime.getTime()) return;
this.timeCache[filename] = stats.mtime.getTime();
if (eventType == "rename") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename);
}
if (eventType == "change") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename);
}
});
}
unwatchContent(contentType) {
if (!this.watchers[contentType]) return;
this.watchers[contentType].close();
delete this.watchers[contentType];
}
extractMeta(content) {
const firstLine = content.split("\n")[0];
const hasOldMeta = firstLine.includes("//META");
if (hasOldMeta) return this.parseOldMeta(content);
const hasNewMeta = firstLine.includes("/**");
if (hasNewMeta) return this.parseNewMeta(content);
throw new MetaError("META was not found.");
}
parseOldMeta(content) {
const meta = content.split("\n")[0];
const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//"));
if (meta.indexOf("META") < 0) throw new MetaError("META was not found.");
const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta);
if (!parsed) throw new MetaError("META could not be parsed.");
if (!parsed.name) throw new MetaError("META missing name data.");
parsed.format = "json";
return parsed;
}
parseNewMeta(content) {
const block = content.split("/**", 2)[1].split("*/", 1)[0];
const out = {};
let field = "";
let accum = "";
for (const line of block.split(splitRegex)) {
if (line.length === 0) continue;
if (line.charAt(0) === "@" && line.charAt(1) !== " ") {
out[field] = accum;
const l = line.indexOf(" ");
field = line.substr(1, l - 1);
accum = line.substr(l + 1);
} else {
accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@");
}
}
out[field] = accum.trim();
delete out[""];
out.format = "jsdoc";
return out;
}
getContentRequire(type) {
const isPlugin = type === "plugin";
const self = this;
const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;
return function (module, filename) {
const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;
const possiblePath = path.resolve(baseFolder, path.basename(filename));
if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);
let content = fs.readFileSync(filename, "utf8");
content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content);
const stats = fs.statSync(filename);
const meta = self.extractMeta(content);
meta.filename = path.basename(filename);
meta.added = stats.atimeMs;
meta.modified = stats.mtimeMs;
meta.size = stats.size;
if (!isPlugin) {
meta.css = content;
if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n");
content = `module.exports = ${JSON.stringify(meta)};`;
}
if (isPlugin) {
module._compile(content, module.filename);
const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports);
if (didExport) {
meta.type = module.exports;
module.exports = meta;
content = "";
} else {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("Module Not Exported", `${meta.name}, please start setting module.exports`);
content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`;
}
}
module._compile(content, filename);
};
}
makePlaceholderPlugin(data) {
return {
plugin: {
start: () => {},
getName: () => {
return data.name || data.filename;
},
getAuthor: () => {
return "???";
},
getDescription: () => {
return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates.";
},
getVersion: () => {
return "???";
}
},
name: data.name || data.filename,
filename: data.filename,
source: data.source ? data.source : "",
website: data.website ? data.website : ""
};
}
async loadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
let result = await new Promise(resolve => {
Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["processFile"])(path.resolve(baseFolder, filename), result => {
console.log(result);
resolve(result);
}, hash => {
resolve({
suspect: false,
hash: hash,
filename: filename,
name: filename
});
}, true);
});
if (result) {
addonCache[result.hash] = {
timestamp: Date.now(),
hash: result.hash,
result: result
};
this.saveAddonCache();
if (result.suspect) {
return {
name: filename,
file: filename,
message: "This plugin might be dangerous (" + result.harm + ").",
error: new Error("This plugin might be dangerous (" + result.harm + ").")
};
}
}
}
try {
window.require(path.resolve(baseFolder, filename));
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be compiled.",
error: {
message: error.message,
stack: error.stack
}
};
}
const content = window.require(path.resolve(baseFolder, filename));
if (!content.name) return {
name: filename,
file: filename,
message: "Cannot escape the ID.",
error: {
message: "Cannot read property 'replace' of undefined",
stack: "Cannot read property 'replace' of undefined"
}
};
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name);
if (isPlugin) {
if (!content.type) return;
try {
content.plugin = new content.type();
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content;
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be constructed.",
error: {
message: error.message,
stack: error.stack
}
};
}
} else {
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content;
}
}
unloadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return {
name: filename,
file: filename,
message: "Could not be unloaded.",
error: {
message: err.message,
stack: err.stack
}
};
}
}
isLoaded(filename, type) {
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return false;
}
return true;
}
async reloadContent(filename, type) {
const cantUnload = this.unloadContent(filename, type);
if (cantUnload) return cantUnload;
return await this.loadContent(filename, type);
}
loadNewContent(type) {
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const files = fs.readdirSync(basedir);
const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);
const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());
return {
added,
removed
};
}
async loadAllContent(type) {
this.patchExtensions();
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const errors = [];
const files = fs.readdirSync(basedir);
for (const filename of files) {
if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;
const error = await this.loadContent(filename, type);
if (error) errors.push(error);
}
return errors;
}
loadPlugins() {
return this.loadAllContent("plugin");
}
loadThemes() {
return this.loadAllContent("theme");
}
}());
/**
* Don't expose contentManager - could be dangerous for now
*/
/***/ }),
/***/ "./src/modules/core.js":
/*!*****************************!*\
!*** ./src/modules/core.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx");
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
/* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__);
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const {
ipcRenderer
} = __webpack_require__(/*! electron */ "electron");
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
// this.init();
}
let methods;
Core.prototype.setConfig = function (config) {
if (this.hasStarted) return;
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
};
Object.defineProperty(Core.prototype, "methods", {
get() {
return methods;
}
});
Core.prototype.setMethods = function (m) {
if (this.hasStarted) return;
methods = m;
};
Core.prototype.init = async function () {
if (this.hasStarted) return;
this.hasStarted = true;
if (!Array.prototype.flat) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding.");
return;
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
return;
}
if (window.ED) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");
return;
}
if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them.");
return;
}
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttributes.bind(this), "LC Plugin Certifier Patch")();
/*
const latestLocalVersion = bdConfig.updater ? bdConfig.updater.LatestVersion : bdConfig.latestVersion;
if (latestLocalVersion > bdConfig.version) {
Utils.showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], {
confirmText: "Update Now",
cancelText: "Maybe Later",
onConfirm: async () => {
const onUpdateFailed = () => {Utils.alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.<br /><br /><a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>Download Installer</a>`);};
try {
const didUpdate = await this.updateInjector();
if (!didUpdate) return onUpdateFailed();
const app = require("electron").remote.app;
app.relaunch();
app.exit();
}
catch (err) {
onUpdateFailed();
}
}
});
}*/
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings");
this.initSettings();
await this.checkForGuilds();
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings");
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Addons Cache");
await _contentManager__WEBPACK_IMPORTED_MODULE_16__["default"].loadAddonCertifierCache();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins");
await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes");
await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes();
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss")));
window.addEventListener("beforeunload", function () {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
});
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon");
if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer");
this.initObserver(); // Show loading errors
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors");
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({
plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"],
themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"]
});
}
const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]);
}
_emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchPopoutWindow.bind(this), "BD Popout Window Patch")();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) {
let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");
await new Promise(resolve => {
alert.onClose(resolve);
});
}
const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");
if (logo) {
logo.style.top = "3px";
logo.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
</svg>`;
}
};
Core.prototype.patchPopoutWindow = async function () {
let canceled = false;
this.cancelPatchPopoutWindow = () => {
canceled = true;
};
window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow).then(popoutModule => {
if (canceled) return; // Not a good idea to do it like that.
const interceptor = window.Lightcord.DiscordModules.dispatcher._interceptor;
window.Lightcord.DiscordModules.dispatcher.setInterceptor(function (action) {
if (action && action.type === "POPOUT_WINDOW_OPEN") {
const render = action.render;
action.render = function () {
const render1 = render.call(this, ...arguments);
const type1 = render1.type;
render1.type = function (props) {
const render2 = type1(props);
console.log(props, render2);
return render2;
};
console.log(render1);
return render1;
};
}
return interceptor.call(this, action);
});
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", ev => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-9"]) return;
if (canceled) return;
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("POPOUT THEME", "Popout opened, Adding theme");
setImmediate(() => {
console.log(ev);
const window = popoutModule.default.getWindow(ev.key);
console.log(window);
});
});
});
};
Core.prototype.patchAttributes = async function () {
let attribsPatchs = [];
this.cancelPatchAttributes = function () {
attribsPatchs.forEach(e => e());
};
while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); // TODO: try to patch correctly the user popout on a next update
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "DiscordTag").then(DiscordTag => {
let DiscordTagComp = DiscordTag.default;
DiscordTag.default = function (props) {
let returnValue = DiscordTagComp(props);
let id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
let badgeDiv = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
style: {
display: "inline",
marginTop: "5px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("span", {
id: "badges-" + id,
key: "badges-" + id,
style: {
display: "inherit"
}
}));
let children = [returnValue];
if (props.user.id === "249746236008169473") {
// Rauenzi: BandagedBD Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (props.user.id === "696481194443014174" || props.user.id === "696003456611385396") {
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
children.push(badgeDiv);
let div = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
style: {
display: "block"
}
}, children);
applyBadges(id, props.user, false);
return div;
};
});
attribsPatchs.push(_utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
after: data => {
if (data.methodArguments[0].childrenMessageContent.props.message) {
// this can be a blocked message (not opened)
data.returnValue.props["data-message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id;
}
}
}));
/*
attribsPatchs.push(Utils.monkeyPatch(v2.MessageComponent, "default", {after: (data) => {
data.returnValue.props["message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id
}}))*/
};
Core.prototype.checkForGuilds = function () {
let timesChecked = 0;
return new Promise(resolve => {
const checkForGuilds = function () {
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0];
if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;
const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0];
const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0];
if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);
setTimeout(checkForGuilds, 100);
};
if (document.readyState != "loading") setTimeout(checkForGuilds, 100);
document.addEventListener("DOMContentLoaded", () => {
setTimeout(checkForGuilds, 100);
});
});
};
Core.prototype.injectExternals = async function () {// No externals
};
Core.prototype.initSettings = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize();
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]);
}
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]);
}
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
} else {
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings();
for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting];
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
}
}
}
window.Lightcord.Api.ensureExported(e => e.default && e.default.prototype && e.default.prototype.getPredicateSections).then(settingModule => {
let getPredicateSections = settingModule.default.prototype.getPredicateSections;
settingModule.default.prototype.getPredicateSections = function () {
let result = getPredicateSections.call(this, ...arguments);
if (!result[1]) return result;
if (result[1].section === "My Account") {
// user settings, not guild settings
let poped = [];
poped.push(result.pop());
poped.push(result.pop());
poped.push(result.pop());
poped.push(result.pop());
result.push(..._settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar(this));
while (poped[0]) {
result.push(poped.pop());
}
}
return result;
};
});
};
let classNameLayer;
let classNameSocialLinks;
let classNameModal;
Core.prototype.initObserver = function () {
const mainObserver = new MutationObserver(mutations => {
for (let i = 0, mlen = mutations.length; i < mlen; i++) {
const mutation = mutations[i];
if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"] !== "undefined") _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].rawObserver(mutation); // if there was nothing added, skip
if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue;
const node = mutation.addedNodes[0];
if (!classNameLayer) classNameLayer = BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer;
if (!classNameSocialLinks) classNameSocialLinks = BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks;
if (!classNameModal) classNameModal = BDModules.get(e => e.modal && typeof e.modal === "string" && e.inner && typeof e.inner === "string" && !e.responsiveWidthMobile)[0].modal;
if (node.classList.contains(classNameLayer)) {
if (node.getAttribute("aria-label") === "GUILD_SETTINGS") {
node.setAttribute("layer-id", "server-settings");
node.setAttribute("id", "server-settings");
}
if (node.getElementsByClassName(classNameSocialLinks).length) {
node.setAttribute("layer-id", "user-settings");
node.setAttribute("id", "user-settings");
}
}
if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container"; // Emoji Picker
//node.getElementsByClassName("emojiPicker-3m1S-j").length && !node.querySelector(".emojiPicker-3m1S-j").parentElement.classList.contains("animatorLeft-1EQxU0")
//if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector("."+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node);
}
});
mainObserver.observe(document, {
childList: true,
subtree: true
});
};
Core.prototype.showChangelogModal = function (options = {}) {
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(options);
};
Core.prototype.alert = function (title, content) {
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert(title, content);
};
Core.prototype.patchSocial = function () {
if (this.socialPatch) return;
const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "TabBar");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!TabBar) return;
this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(TabBar.prototype, "render", {
after: data => {
const children = data.returnValue.props.children;
if (!children || !children.length || children.length < 3) return;
if (children[children.length - 3].type.displayName !== "Separator") return;
if (!children[children.length - 2].type.toString().includes("socialLinks")) return;
if (Anchor) {
let socialModule1 = BDModules.get(e => e.socialLinks)[0];
const original = children[children.length - 2].type;
const newOne = function () {
const returnVal = original(...arguments);
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-social-link " + socialModule1.link,
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-social-logo"
}))));
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-social-link " + socialModule1.link,
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-social-logo"
}))));
return returnVal;
};
children[children.length - 2].type = newOne;
}
let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash];
const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].branch})`;
const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, versionHash))];
const originalVersions = children[children.length - 1].type;
children[children.length - 1].type = function () {
const returnVal = originalVersions(...arguments);
returnVal.props.children.splice(1, 0, additional);
return returnVal;
};
}
});
};
const getGuildClasses = function () {
const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar");
const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected");
const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer");
return Object.assign({}, guildsWrapper, guilds, pill);
};
Core.prototype.patchGuildListItems = function () {
if (this.guildListItemsPatch) return;
const GuildClasses = getGuildClasses();
const listItemClass = GuildClasses.listItem.split(" ")[0];
const blobClass = GuildClasses.blobContainer.split(" ")[0];
const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);
const GuildComponent = reactInstance.return.type;
if (!GuildComponent) return;
this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", {
after: data => {
if (data.returnValue && data.thisObject) {
const returnValue = data.returnValue;
const guildData = data.thisObject.props;
let className = returnValue.props.className;
className += " bd-guild";
if (guildData.unread) className += " bd-unread";
if (guildData.selected) className += " bd-selected";
if (guildData.audio) className += " bd-audio";
if (guildData.video) className += " bd-video";
if (guildData.badge) className += " bd-badge";
if (guildData.animatable) className += " bd-animatable";
returnValue.props.className = className;
return returnValue;
}
}
});
};
Core.prototype.patchGuildPills = function () {
if (this.guildPillPatch) return;
const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d"));
if (!guildPill) return;
this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", {
after: data => {
const props = data.methodArguments[0];
if (props.unread) data.returnValue.props.className += " bd-unread";
if (props.selected) data.returnValue.props.className += " bd-selected";
if (props.hovered) data.returnValue.props.className += " bd-hovered";
return data.returnValue;
}
});
};
Core.prototype.patchGuildSeparator = function () {
if (this.guildSeparatorPatch) return;
const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds");
const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem");
if (!guildComponents || !Guilds) return;
const GuildSeparator = function () {
const returnValue = guildComponents.Separator(...arguments);
returnValue.props.className += " bd-guild-separator";
return returnValue;
};
this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", {
after: data => {
data.returnValue.props.children[1].props.children[3].type = GuildSeparator;
}
});
};
Core.prototype.patchAttachment = function () {
if (this.AttachmentPatch) return;
const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !Attachment || !Attachment.default) return;
this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", {
after: data => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return;
const attachment = data.methodArguments[0] || null;
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !attachment || !attachment.url) return;
if (!Array.isArray(children)) return;
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
id: "certified-" + id
}));
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id);
}
});
};
Core.prototype.patchMessageHeader = function () {
if (this.messageHeaderPatch) return;
const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MessageHeader || !MessageHeader.default) return;
this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", {
after: data => {
const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children");
if (!children || !author || !author.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (author.id === "249746236008169473") {
// Rauenzi: BandagedBD Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (author.id === "696481194443014174" || author.id === "696003456611385396") {
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id,
style: {
display: "inline"
}
}));
applyBadges(id, author, true);
}
});
};
function applyBadges(id, user, chat) {
process.nextTick(() => {
const div = document.getElementById("badges-" + id);
if (!div || div.childNodes.length > 0) return;
if (div.childNodes.length) return;
let blockDiv = document.createElement("div");
blockDiv.style.display = "none";
div.appendChild(blockDiv);
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
_distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => {
badges.forEach(badge => {
const props = {
svg: {
size: "16px",
className: "bd-logo",
width: "16px"
}
};
badge.scopes.forEach(scope => {
if (scope === "user") {
// require user
props.user = user;
}
});
if (!badge.href) {
props.Anchor = Anchor;
props.href = {
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
};
}
const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: badge.name
}, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, {
href: badge.href,
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props));
const div2 = document.createElement("div");
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2);
div2.childNodes.forEach(node => {
div.appendChild(node);
});
});
});
});
}
Core.prototype.patchMemberList = function () {
if (this.memberListPatch) return;
const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;
this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", {
after: data => {
const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !user || !user.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (user.id === "249746236008169473") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (user.id === "696481194443014174" || user.id === "696003456611385396") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id
}));
applyBadges(id, user, false);
}
});
};
Core.prototype.updateInjector = async function () {
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
if (!injectionPath) return false;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const rmrf = __webpack_require__(/*! rimraf */ "rimraf");
const yauzl = __webpack_require__(/*! yauzl */ "yauzl");
const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp");
const request =
/*require("request");*/
null;
const parentPath = path.resolve(injectionPath, "..");
const folderName = path.basename(injectionPath);
const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip";
const savedZip = path.resolve(parentPath, "injector.zip");
const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Downloading " + zipLink);
let success = await new Promise(resolve => {
request.get({
url: zipLink,
encoding: null
}, async (error, response, body) => {
if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy
const alreadyExists = await new Promise(res => fs.exists(savedZip, res));
if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Writing " + savedZip);
fs.writeFile(savedZip, body, err => resolve(!err));
});
});
if (!success) return success; // Check and delete rename extraction
const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));
if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file
const zipfile = await new Promise(r => yauzl.open(savedZip, {
lazyEntries: true
}, (err, zip) => r(zip)));
zipfile.on("entry", function (entry) {
// Skip directories, they are handled with mkdirp
if (entry.fileName.endsWith("/")) return zipfile.readEntry();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories
const fullPath = path.resolve(parentPath, entry.fileName);
mkdirp.sync(path.dirname(fullPath));
zipfile.openReadStream(entry, function (err, readStream) {
if (err) return success = false;
readStream.on("end", function () {
zipfile.readEntry();
}); // Go to next file after this
readStream.pipe(fs.createWriteStream(fullPath));
});
});
zipfile.readEntry(); // Start reading
// Wait for the final file to finish
await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step
const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);
await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Failed to rename the final directory");
return success;
} // If rename had issues, delete what we tried to rename and restore backup
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Something went wrong... restoring backups.");
await new Promise(resolve => rmrf(extractedFolder, resolve));
await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));
return success;
} // If we've gotten to this point, everything should have gone smoothly.
// Cleanup the backup folder then remove the zip
await new Promise(resolve => rmrf(backupFolder, resolve));
await new Promise(resolve => fs.unlink(savedZip, resolve));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Injector Updated!");
return success;
};
/* harmony default export */ __webpack_exports__["default"] = (new Core());
/**
* Don't expose core - could be dangerous for now
*/
/***/ }),
/***/ "./src/modules/dataStore.js":
/*!**********************************!*\
!*** ./src/modules/dataStore.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const __non_webpack_require__ = window.require;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable";
let dataPath = "";
if (process.platform === "win32") dataPath = process.env.APPDATA;else if (process.platform === "darwin") dataPath = path.join(process.env.HOME, "Library", "Preferences");else dataPath = path.join(process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : process.env.HOME, ".config");
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
constructor() {
this.data = {
settings: {
stable: {},
canary: {},
ptb: {}
}
};
this.pluginData = {};
window.Lightcord.BetterDiscord.DataStore = this;
}
initialize() {
try {
if (!fs.existsSync(dataPath)) fs.mkdirSync(dataPath);
if (!fs.existsSync(path.join(dataPath, "plugins"))) fs.mkdirSync(path.join(dataPath, "plugins"));
if (!fs.existsSync(path.join(dataPath, "themes"))) fs.mkdirSync(path.join(dataPath, "themes"));
if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
const data = JSON.parse(fs.readFileSync(this.BDFile, "binary"));
if (data.hasOwnProperty("settings")) this.data = data;
if (!fs.existsSync(this.settingsFile)) return;
let settings = __non_webpack_require__(this.settingsFile);
fs.unlinkSync(this.settingsFile);
if (settings.hasOwnProperty("settings")) settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, {
[releaseChannel]: settings
});else settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, settings);
this.setBDData("settings", settings);
} catch (err) {
console.error(err);
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.");
}
}
get injectionPath() {
return this._injectionPath = null;
if (this._injectionPath) return this._injectionPath;
const electron = __webpack_require__(/*! electron */ "electron").remote.app;
const base = electron.getAppPath();
const roamingBase = electron.getPath("userData");
const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector");
const location = path.resolve(base, "..", "app");
const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;
if (!realLocation) return this._injectionPath = null;
return this._injectionPath = realLocation;
}
get configFile() {
return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json"));
}
get BDFile() {
return this._BDFile || (this._BDFile = path.resolve(dataPath, "bdstorage.json"));
}
get settingsFile() {
return this._settingsFile || (this._settingsFile = path.resolve(dataPath, "bdsettings.json"));
}
getPluginFile(pluginName) {
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["default"].pluginsFolder, pluginName + ".config.json");
}
getSettingGroup(key) {
return this.data.settings[releaseChannel][key] || null;
}
setSettingGroup(key, data) {
this.data.settings[releaseChannel][key] = data;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getBDData(key) {
return this.data[key] || "";
}
setBDData(key, value) {
this.data[key] = value;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getPluginData(pluginName, key) {
if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];
if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;
this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));
return this.pluginData[pluginName][key];
}
setPluginData(pluginName, key, value) {
if (value === undefined) return;
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
this.pluginData[pluginName][key] = value;
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
deletePluginData(pluginName, key) {
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
delete this.pluginData[pluginName][key];
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
}());
/***/ }),
/***/ "./src/modules/devMode.js":
/*!********************************!*\
!*** ./src/modules/devMode.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class DevMode {
constructor() {
this.debugListener = this.debugListener.bind(this);
this.copySelectorListener = this.copySelectorListener.bind(this);
}
start() {
this.startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector();
}
stop() {
this.stopDebugListener();
this.stopCopySelector();
}
startDebugListener() {
this.stopDebugListener();
document.addEventListener("keydown", this.debugListener);
}
stopDebugListener() {
document.removeEventListener("keydown", this.debugListener);
}
startCopySelector() {
this.stopCopySelector();
document.addEventListener("contextmenu", this.copySelectorListener);
}
stopCopySelector() {
document.removeEventListener("contextmenu", this.copySelectorListener);
}
debugListener(e) {
if (e.which === 119 || e.which == 118) {
//F8
console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", "");
debugger; // eslint-disable-line no-debugger
e.preventDefault();
e.stopImmediatePropagation();
}
}
copySelectorListener(e) {
try {
e.stopPropagation();
const selector = this.getSelector(e.target);
let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]];
function attach() {
if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer);
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu));
if (!cm) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer));
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classLayer.layer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
cmWrap.append(cm);
container.append(cmWrap);
cmWrap.style.top = e.clientY + "px";
cmWrap.style.left = e.clientX + "px";
cmWrap.setAttribute("role", "menu");
cmWrap.setAttribute("tabindex", "-1");
cmWrap.id = "bd-copy-selector-context";
cmWrap.setAttribute("aria-label", "Copy Selector Actions");
const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0];
const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
scrollerWrap.append(scroller);
cm.append(scrollerWrap);
const removeCM = function (e) {
if (e.keyCode && e.keyCode !== 27) return;
cmWrap.remove();
document.removeEventListener("click", removeCM);
document.removeEventListener("contextmenu", removeCM);
document.removeEventListener("keyup", removeCM);
};
document.addEventListener("click", removeCM);
document.addEventListener("contextmenu", removeCM);
document.addEventListener("keyup", removeCM);
}
const cmWrap = cm.parentElement;
const scroller = cm.childNodes[0].childNodes[0];
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="group"></div>`);
/**
* @type {HTMLElement}
*/
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
cmi.addEventListener("click", () => {
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector);
cmWrap.style.display = "none";
});
cmi.addEventListener("mouseover", e => {
let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused));
elements && elements.forEach(elem => elem.classList.remove(classItems.focused));
cmi.classList.add(classItems.focused);
});
cmi.addEventListener("mouseout", e => {
cmi.classList.remove(classItems.focused);
});
cmg.append(cmi);
if (scroller.childNodes.length) {
// apend a separator
const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="separator" class="${classItems.separator}"></div>`);
scroller.append(separator);
}
scroller.append(cmg);
if (cmWrap.clientHeight < cmWrap.scrollHeight) {
console.log("overflowing " + cmWrap.style.top);
cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px";
console.log("overflowing" + cmWrap.style.top);
}
}
setTimeout(attach, 1);
} catch (e) {
console.error(e);
}
}
getSelector(element) {
if (element.id) return `#${element.id}`;
/**
*
* @param {HTMLElement} el
*/
function fullPath(el) {
var names = [];
while (el.parentNode) {
if (el.id) {
names.unshift('#' + el.id);
break;
} else {
if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else {
for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++);
names.unshift(el.tagName.toLowerCase() + (typeof el.className === "string" && el.className || "").split(" ").filter(e => !!e).map(e => "." + e).join("") + ":nth-child(" + c + ")");
}
el = el.parentNode;
}
}
return names.join(" > ");
}
return fullPath(element);
/*
const rules = this.getRules(element);
const latestRule = rules[rules.length - 1];
if (latestRule) return latestRule.selectorText;
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
return `.${Array.from(element.parentElement.classList).join(".")}`;*/
}
getRules(element, css = element.ownerDocument.styleSheets) {
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
return elementRules;
}
}());
/***/ }),
/***/ "./src/modules/disableTyping.js":
/*!**************************************!*\
!*** ./src/modules/disableTyping.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping {
constructor() {
window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => {
let self = this;
const startTyping = typingModule.default.startTyping;
typingModule.default.startTyping = function () {
if (self.disabled) return startTyping.call(this, ...arguments);
};
const stopTyping = typingModule.default.stopTyping;
typingModule.default.stopTyping = function () {
if (self.disabled) return stopTyping.call(this, ...arguments);
};
this.disabled = true;
});
window.Lightcord.BetterDiscord.DisableTyping = this;
}
disable() {
this.disabled = true;
}
enable() {
this.disabled = false;
}
}());
/***/ }),
/***/ "./src/modules/distant.js":
/*!********************************!*\
!*** ./src/modules/distant.js ***!
\********************************/
/*! exports provided: uuidv4, default, Constants, Routes */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; });
/* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx");
/* harmony import */ var _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../svg/circus */ "./src/svg/circus.jsx");
function uuidv4() {
// Generate UUID (No crypto rng)
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
}
const awaitingBadgesPromises = {};
let badgesToFetch = [];
/* harmony default export */ __webpack_exports__["default"] = (new class DistantServer {
constructor() {
this._cache = {
badges: {}
};
window.Lightcord.BetterDiscord.DistantServer = this;
}
get cache() {
return this._cache;
}
set cache(data) {
if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data;
return this._cache = Object.assign(this._cache, data);
}
/*
async delete(){
BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {type: "warn"})
return handleRequest(Routes.delete, "delete")
.then(async res => {
if(res.status !== 200){
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
throw new Error(`Couldn't delete all informations: ${(res.status+" "+res.statusText+" "+await res.text())}`)
}
console.info(`Succesfully deleted informations.`)
BdApi.showToast("Succesfully deleted informations", {type: "success"})
window.Lightcord.Api.Authorization = null
return res.json()
}).catch((err) => {
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
throw new Error(`Couldn't delete all informations: ${err.stack}`)
})
}*/
/**
* Get custom badges from the user ID.
* @param {string} user The user ID
* @returns {Promise<Constants["badges"]>}
*/
async getBadges(user) {
if (this.cache.badges[user]) return this.cache.badges[user];
if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user];
let resolve;
const newPromise = new Promise(res => resolve = res);
awaitingBadgesPromises[user] = newPromise;
const badges = [];
for (let badge of Constants.badges) {
if (badge.defaultUsers.includes(user)) badges.push(badge);
}
const fetchedBadges = await new Promise(resolve => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) return resolve([]);
badgesToFetch.push([user, resolve]);
setTimeout(() => {
let users = badgesToFetch;
if (users.length === 0) return;
badgesToFetch = [];
handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => {
if (res.status !== 200) {
// Couldn't fetch badges: server error
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
}
const responseBody = await res.json();
for (let user of responseBody) {
let promise = users.find(promise => promise[0] === user.user_id);
promise[1](user.badges);
}
}).catch(err => {
// Couldn't fetch badges: error
if (!(err instanceof LightcordError)) console.error(err);
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
});
}, 0);
});
for (let badge of fetchedBadges) {
if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it.
if (badges.find(e => e.id === badge)) continue; // Already inserted.
badges.push(Constants.badges.find(e => e.id === badge));
}
this.cache = {
badges: Object.assign(this.cache.badges, {
[user]: badges
})
};
setTimeout(() => {
delete this.cache.badges[user];
}, 600000);
resolve(badges);
delete awaitingBadgesPromises[user];
return badges;
}
}());
const handleRequest = function (route, method, data) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) {
return Promise.reject(new LightcordError("The current settings blocked the request."));
}
return node_fetch__WEBPACK_IMPORTED_MODULE_2___default()(`${Constants.SERVER_URL}/api/v1${route}`, {
method,
headers: {
"CLIENT": "Lightcord",
"Authorization": window.Lightcord.Api.Authorization || "None::Anonymous"
},
...(data ? {
body: data
} : {})
});
};
class LightcordError extends Error {
constructor() {
super(...arguments);
this.name = "LightcordError";
}
}
const Constants = {
SERVER_URL: "https://lightcord.deroku.xyz",
badges: [// TODO: Add more badges + server side svg
{
name: "Lightcord Bug Hunter",
id: "f04698f5-816b-41e3-bd01-92291193d7a5",
defaultUsers: ["696481194443014174", "696003456611385396"],
scopes: [],
component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"],
href: "https://github.com/lightcord/lightcord/wiki/badges#bug_hunter"
}, {
name: "Buffoon",
id: "06904d31-65b4-41ec-a50c-8658bbd1af96",
defaultUsers: ["389016895543705602", "664600134528663565", "625350657829896224"],
scopes: [],
component: _svg_circus__WEBPACK_IMPORTED_MODULE_4__["default"],
href: "https://youtu.be/EJtb6z-dlT8?t=145"
}]
};
const Routes = {
badges: `/users/badges`
};
/***/ }),
/***/ "./src/modules/domtools.js":
/*!*********************************!*\
!*** ./src/modules/domtools.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; });
/**
* Copyright 2018 Zachary Rauen
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* From: https://github.com/rauenzi/BDPluginLibrary
*/
/**
* @interface
* @name Offset
* @property {number} top - Top offset of the target element.
* @property {number} right - Right offset of the target element.
* @property {number} bottom - Bottom offset of the target element.
* @property {number} left - Left offset of the target element.
* @property {number} height - Outer height of the target element.
* @property {number} width - Outer width of the target element.
*/
/**
* Function that automatically removes added listener.
* @callback module:DOMTools~CancelListener
*/
class DOMTools {
static escapeID(id) {
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
}
/**
* Adds a style to the document.
* @param {string} id - identifier to use as the element id
* @param {string} css - css to add to the document
*/
static addStyle(id, css) {
document.head.append(DOMTools.createElement(`<style id="${id}">${css}</style>`));
}
/**
* Removes a style from the document.
* @param {string} id - original identifier used
*/
static removeStyle(id) {
const element = document.getElementById(id);
if (element) element.remove();
}
/**
* Adds/requires a remote script to be loaded
* @param {string} id - identifier to use for this script
* @param {string} url - url from which to load the script
* @returns {Promise} promise that resolves when the script is loaded
*/
static addScript(id, url) {
return new Promise(resolve => {
const script = document.createElement("script");
script.id = id;
script.src = url;
script.type = "text/javascript";
script.onload = resolve;
document.head.append(script);
});
}
/**
* Removes a remote script from the document.
* @param {string} id - original identifier used
*/
static removeScript(id) {
id = this.escapeID(id);
const element = document.getElementById(id);
if (element) element.remove();
} // https://javascript.info/js-animation
static animate({
timing = _ => _,
update,
duration
}) {
const start = performance.now();
requestAnimationFrame(function animate(time) {
// timeFraction goes from 0 to 1
let timeFraction = (time - start) / duration;
if (timeFraction > 1) timeFraction = 1; // calculate the current animation state
const progress = timing(timeFraction);
update(progress); // draw it
if (timeFraction < 1) {
requestAnimationFrame(animate);
}
});
}
/**
* This is my shit version of not having to use `$` from jQuery. Meaning
* that you can pass a selector and it will automatically run {@link module:DOMTools.query}.
* It also means that you can pass a string of html and it will perform and return `parseHTML`.
* @see module:DOMTools.parseHTML
* @see module:DOMTools.query
* @param {string} selector - Selector to query or HTML to parse
* @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`
*/
static Q(selector) {
const element = this.parseHTML(selector);
const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;
if (isHTML) return element;
return this.query(selector);
}
/**
* Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided
* `document` is used by default.
* @param {string} selector - Selector to query
* @param {Element} [baseElement] - Element to base the query from
* @returns {(Element|null)} - The found element or null if not found
*/
static query(selector, baseElement) {
if (!baseElement) baseElement = document;
return baseElement.querySelector(selector);
}
/**
* Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided
* `document` is used by default.
* @param {string} selector - Selector to query
* @param {Element} [baseElement] - Element to base the query from
* @returns {Array<Element>} - Array of all found elements
*/
static queryAll(selector, baseElement) {
if (!baseElement) baseElement = document;
return baseElement.querySelectorAll(selector);
}
/**
* Parses a string of HTML and returns the results. If the second parameter is true,
* the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.
* This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.
*
* If the second parameter is false, then the return value will be the list of parsed
* nodes and there were multiple top level nodes, otherwise the single node is returned.
* @param {string} html - HTML to be parsed
* @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`
* @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing
*/
static parseHTML(html, fragment = false) {
const template = document.createElement("template");
template.innerHTML = html;
const node = template.content.cloneNode(true);
if (fragment) return node;
return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];
}
/** Alternate name for {@link module:DOMTools.parseHTML} */
static createElement(html, fragment = false) {
return this.parseHTML(html, fragment);
}
/**
* Takes a string of html and escapes it using the brower's own escaping mechanism.
* @param {String} html - html to be escaped
*/
static escapeHTML(html) {
const textNode = document.createTextNode("");
const spanElement = document.createElement("span");
spanElement.append(textNode);
textNode.nodeValue = html;
return spanElement.innerHTML;
}
/**
* Adds a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to add
* @returns {Element} - `element` to allow for chaining
*/
static addClass(element, ...classes) {
classes = classes.flat().filter(c => c);
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.add(...classes);
return element;
}
/**
* Removes a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to remove
* @returns {Element} - `element` to allow for chaining
*/
static removeClass(element, ...classes) {
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.remove(...classes);
return element;
}
/**
* When only one argument is present: Toggle class value;
* i.e., if class exists then remove it and return false, if not, then add it and return true.
* When a second argument is present:
* If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to toggle
* @param {boolean} [indicator] - Optional indicator for if the class should be toggled
* @returns {Element} - `element` to allow for chaining
*/
static toggleClass(element, classname, indicator) {
classname = classname.toString().split(" ").filter(c => c);
if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c));
return element;
}
/**
* Checks if an element has a specific class
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to check
* @returns {boolean} - `true` if the element has the class, `false` otherwise.
*/
static hasClass(element, classname) {
return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c));
}
/**
* Replaces one class with another
* @param {Element} element - Element to edit classes of
* @param {string} oldName - Name of class to replace
* @param {string} newName - New name for the class
* @returns {Element} - `element` to allow for chaining
*/
static replaceClass(element, oldName, newName) {
element.classList.replace(oldName, newName);
return element;
}
/**
* Appends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be appended to another node
* @param {Node} thatNode - Node for `thisNode` to be appended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static appendTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.append(thisNode);
return thisNode;
}
/**
* Prepends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be prepended to another node
* @param {Node} thatNode - Node for `thisNode` to be prepended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static prependTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.prepend(thisNode);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} targetNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static insertAfter(thisNode, targetNode) {
targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} newNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static after(thisNode, newNode) {
thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);
return thisNode;
}
/**
* Gets the next sibling element that matches the selector.
* @param {Element} element - Element to get the next sibling of
* @param {string} [selector=""] - Optional selector
* @returns {Element} - The sibling element
*/
static next(element, selector = "") {
return selector ? element.querySelector("+ " + selector) : element.nextElementSibling;
}
/**
* Gets all subsequent siblings.
* @param {Element} element - Element to get next siblings of
* @returns {NodeList} - The list of siblings
*/
static nextAll(element) {
return element.querySelectorAll("~ *");
}
/**
* Gets the subsequent siblings until an element matches the selector.
* @param {Element} element - Element to get the following siblings of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of siblings
*/
static nextUntil(element, selector) {
const next = [];
while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);
return next;
}
/**
* Gets the previous sibling element that matches the selector.
* @param {Element} element - Element to get the previous sibling of
* @param {string} [selector=""] - Optional selector
* @returns {Element} - The sibling element
*/
static previous(element, selector = "") {
const previous = element.previousElementSibling;
if (selector) return previous && previous.matches(selector) ? previous : null;
return previous;
}
/**
* Gets all preceeding siblings.
* @param {Element} element - Element to get preceeding siblings of
* @returns {NodeList} - The list of siblings
*/
static previousAll(element) {
const previous = [];
while (element.previousElementSibling) previous.push(element = element.previousElementSibling);
return previous;
}
/**
* Gets the preceeding siblings until an element matches the selector.
* @param {Element} element - Element to get the preceeding siblings of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of siblings
*/
static previousUntil(element, selector) {
const previous = [];
while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);
return previous;
}
/**
* Find which index in children a certain node is. Similar to jQuery's `$.index()`
* @param {HTMLElement} node - The node to find its index in parent
* @returns {number} Index of the node
*/
static indexInParent(node) {
const children = node.parentNode.childNodes;
let num = 0;
for (let i = 0; i < children.length; i++) {
if (children[i] == node) return num;
if (children[i].nodeType == 1) num++;
}
return -1;
}
/** Shorthand for {@link module:DOMTools.indexInParent} */
static index(node) {
return this.indexInParent(node);
}
/**
* Gets the parent of the element if it matches the selector,
* otherwise returns null.
* @param {Element} element - Element to get parent of
* @param {string} [selector=""] - Selector to match parent
* @returns {(Element|null)} - The sibling element or null
*/
static parent(element, selector = "") {
return !selector || element.parentElement.matches(selector) ? element.parentElement : null;
}
/**
* Gets all children of Element that match the selector if provided.
* @param {Element} element - Element to get all children of
* @param {string} selector - Selector to match the children to
* @returns {Array<Element>} - The list of children
*/
static findChild(element, selector) {
return element.querySelector(":scope > " + selector);
}
/**
* Gets all children of Element that match the selector if provided.
* @param {Element} element - Element to get all children of
* @param {string} selector - Selector to match the children to
* @returns {Array<Element>} - The list of children
*/
static findChildren(element, selector) {
return element.querySelectorAll(":scope > " + selector);
}
/**
* Gets all ancestors of Element that match the selector if provided.
* @param {Element} element - Element to get all parents of
* @param {string} [selector=""] - Selector to match the parents to
* @returns {Array<Element>} - The list of parents
*/
static parents(element, selector = "") {
const parents = [];
if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement);
return parents;
}
/**
* Gets the ancestors until an element matches the selector.
* @param {Element} element - Element to get the ancestors of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of parents
*/
static parentsUntil(element, selector) {
const parents = [];
while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);
return parents;
}
/**
* Gets all siblings of the element that match the selector.
* @param {Element} element - Element to get all siblings of
* @param {string} [selector="*"] - Selector to match the siblings to
* @returns {Array<Element>} - The list of siblings
*/
static siblings(element, selector = "*") {
return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));
}
/**
* Sets or gets css styles for a specific element. If `value` is provided
* then it sets the style and returns the element to allow for chaining,
* otherwise returns the style.
* @param {Element} element - Element to set the CSS of
* @param {string} attribute - Attribute to get or set
* @param {string} [value] - Value to set for attribute
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static css(element, attribute, value) {
if (typeof value == "undefined") return global.getComputedStyle(element)[attribute];
element.style[attribute] = value;
return element;
}
/**
* Sets or gets the width for a specific element. If `value` is provided
* then it sets the width and returns the element to allow for chaining,
* otherwise returns the width.
* @param {Element} element - Element to set the CSS of
* @param {string} [value] - Width to set
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static width(element, value) {
if (typeof value == "undefined") return parseInt(getComputedStyle(element).width);
element.style.width = value;
return element;
}
/**
* Sets or gets the height for a specific element. If `value` is provided
* then it sets the height and returns the element to allow for chaining,
* otherwise returns the height.
* @param {Element} element - Element to set the CSS of
* @param {string} [value] - Height to set
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static height(element, value) {
if (typeof value == "undefined") return parseInt(getComputedStyle(element).height);
element.style.height = value;
return element;
}
/**
* Sets the inner text of an element if given a value, otherwise returns it.
* @param {Element} element - Element to set the text of
* @param {string} [text] - Content to set
* @returns {string} - Either the string set by this call or the current text content of the node.
*/
static text(element, text) {
if (typeof text == "undefined") return element.textContent;
return element.textContent = text;
}
/**
* Returns the innerWidth of the element.
* @param {Element} element - Element to retrieve inner width of
* @return {number} - The inner width of the element.
*/
static innerWidth(element) {
return element.clientWidth;
}
/**
* Returns the innerHeight of the element.
* @param {Element} element - Element to retrieve inner height of
* @return {number} - The inner height of the element.
*/
static innerHeight(element) {
return element.clientHeight;
}
/**
* Returns the outerWidth of the element.
* @param {Element} element - Element to retrieve outer width of
* @return {number} - The outer width of the element.
*/
static outerWidth(element) {
return element.offsetWidth;
}
/**
* Returns the outerHeight of the element.
* @param {Element} element - Element to retrieve outer height of
* @return {number} - The outer height of the element.
*/
static outerHeight(element) {
return element.offsetHeight;
}
/**
* Gets the offset of the element in the page.
* @param {Element} element - Element to get offset of
* @return {Offset} - The offset of the element
*/
static offset(element) {
return element.getBoundingClientRect();
}
static get listeners() {
return this._listeners || (this._listeners = {});
}
/**
* This is similar to jQuery's `on` function and can *hopefully* be used in the same way.
*
* Rather than attempt to explain, I'll show some example usages.
*
* The following will add a click listener (in the `myPlugin` namespace) to `element`.
* `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});`
*
* The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.
* `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});`
*
* The following will add a click listener (without namespace) to `element`.
* `DOMTools.on(element, "click", () => {console.log("clicked!");});`
*
* The following will add a click listener (without namespace) to `element` that only fires once.
* `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});`
*
* @param {Element} element - Element to add listener to
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} delegate - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
*/
static on(element, event, delegate, callback) {
const [type, namespace] = event.split(".");
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? callback : function (event) {
if (event.target.matches(delegate)) {
callback(event);
}
};
element.addEventListener(type, eventFunc);
const cancel = () => {
element.removeEventListener(type, eventFunc);
};
if (namespace) {
if (!this.listeners[namespace]) this.listeners[namespace] = [];
const newCancel = () => {
cancel();
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
};
this.listeners[namespace].push({
event: type,
element: element,
cancel: newCancel
});
return newCancel;
}
return cancel;
}
/**
* Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself
* and removes the listener upon the first firing of the desired event.
*
* @param {Element} element - Element to add listener to
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} delegate - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
*/
static once(element, event, delegate, callback) {
const [type, namespace] = event.split(".");
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? function (event) {
callback(event);
element.removeEventListener(type, eventFunc);
} : function (event) {
if (!event.target.matches(delegate)) return;
callback(event);
element.removeEventListener(type, eventFunc);
};
element.addEventListener(type, eventFunc);
const cancel = () => {
element.removeEventListener(type, eventFunc);
};
if (namespace) {
if (!this.listeners[namespace]) this.listeners[namespace] = [];
const newCancel = () => {
cancel();
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
};
this.listeners[namespace].push({
event: type,
element: element,
cancel: newCancel
});
return newCancel;
}
return cancel;
}
static __offAll(event, element) {
const [type, namespace] = event.split(".");
let matchFilter = listener => listener.event == type,
defaultFilter = _ => _;
if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;
const listeners = this.listeners[namespace] || [];
const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);
for (let c = 0; c < list.length; c++) list[c].cancel();
}
/**
* This is similar to jQuery's `off` function and can *hopefully* be used in the same way.
*
* Rather than attempt to explain, I'll show some example usages.
*
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.
* `DOMTools.off(element, "click.myPlugin", onClick);`
*
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element.
* `DOMTools.off(element, "click.myPlugin", ".block", onClick);`
*
* The following will remove a click listener (without namespace) from `element`.
* `DOMTools.off(element, "click", onClick);`
*
* The following will remove all listeners in namespace `myPlugin` from `element`.
* `DOMTools.off(element, ".myPlugin");`
*
* The following will remove all click listeners in namespace `myPlugin` from *all elements*.
* `DOMTools.off("click.myPlugin");`
*
* The following will remove all listeners in namespace `myPlugin` from *all elements*.
* `DOMTools.off(".myPlugin");`
*
* @param {(Element|string)} element - Element to remove listener from
* @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} [delegate] - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {Element} - The original element to allow for chaining
*/
static off(element, event, delegate, callback) {
if (typeof element == "string") return this.__offAll(element);
const [type, namespace] = event.split(".");
if (namespace) return this.__offAll(event, element);
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? callback : function (event) {
if (event.target.matches(delegate)) {
callback(event);
}
};
element.removeEventListener(type, eventFunc);
return element;
}
/**
* Adds a listener for when the node is added/removed from the document body.
* The listener is automatically removed upon firing.
* @param {HTMLElement} node - node to wait for
* @param {callable} callback - function to be performed on event
* @param {boolean} onMount - determines if it should fire on Mount or on Unmount
*/
static onMountChange(node, callback, onMount = true) {
const wrappedCallback = () => {
this.observer.unsubscribe(wrappedCallback);
callback();
};
this.observer.subscribe(wrappedCallback, mutation => {
const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);
const directMatch = nodes.indexOf(node) > -1;
const parentMatch = nodes.some(parent => parent.contains(node));
return directMatch || parentMatch;
});
return node;
}
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */
static onMount(node, callback) {
return this.onMountChange(node, callback);
}
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */
static onUnmount(node, callback) {
return this.onMountChange(node, callback, false);
}
/** Alias for {@link module:DOMTools.onMount} */
static onAdded(node, callback) {
return this.onMount(node, callback);
}
/** Alias for {@link module:DOMTools.onUnmount} */
static onRemoved(node, callback) {
return this.onUnmount(node, callback, false);
}
/**
* Helper function which combines multiple elements into one parent element
* @param {Array<HTMLElement>} elements - array of elements to put into a single parent
*/
static wrap(elements) {
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);
return domWrapper;
}
/**
* Resolves the node to an HTMLElement. This is mainly used by library modules.
* @param {(jQuery|Element)} node - node to resolve
*/
static resolveElement(node) {
if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;
return node instanceof jQuery ? node[0] : node;
}
}
window.Lightcord.BetterDiscord.DOM = DOMTools;
/***/ }),
/***/ "./src/modules/emojiModule.js":
/*!************************************!*\
!*** ./src/modules/emojiModule.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
const Constants = {
EmojiRegex: /<a?\.(\w+)\.(\d+)>/g
};
let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0];
let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0];
let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0];
let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0];
let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0];
let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext);
/* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule {
constructor() {
this.init().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging
}
async init() {
/** Emoji AutoComplete */
if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete");
if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions);
if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults);
if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING);
if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching);
if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext);
if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) {
console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates);
const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions;
AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) {
const value = getAutocompleteOptions.call(this, ...arguments);
value.LIGHTCORD_EMOJIS = {
matches(arg1, arg2) {
let condition = arg2.length > 1 && "." === arg1;
setEmojiUsable(condition);
return condition;
},
queryResults(t) {
let results = EmojiModuleQuery.default.queryEmojiResults(t, e);
return results;
},
renderResults(e, t, n, r, a) {
return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) {
return {
emoji: e,
key: e.id || e.uniqueName || e.name,
sentinel: ".",
guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null
};
}, function (e) {
return "." + e + ".";
});
},
getPlainText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
},
getRawText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
}
};
return value;
};
} else {
console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));
}
/** Emoji display */
while (!_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
// TODO: Proper emoji formatting / rendering
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return;
/**
* @type {{
* raw: string,
* name: string,
* id: string,
* animated: boolean
* }[]}
*/
let emojis = [];
const newContent = [];
for (let node of content) {
if (typeof node !== "string") {
newContent.push(node);
continue;
}
;
let parsed;
let hasParsed = false;
do {
parsed = Constants.EmojiRegex.exec(node);
if (parsed) {
hasParsed = true;
if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]);
if (emoji) {
emojis.push({
animated: emoji.animated,
name: emoji.name,
id: emoji.id,
raw: parsed[0]
});
} else {
emojis.push({
animated: parsed[0].startsWith("<a"),
name: parsed[1],
id: parsed[2],
raw: parsed[0]
});
}
}
} while (parsed);
if (hasParsed) {
const words = node.split(" ").map((word, index, arr) => {
if (!word) return "";
const emoji = emojis.find(e => e.raw == word);
if (!emoji) return word;
if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
return React.createElement(CustomEmojiModule.CustomEmoji, {
emoji: {
name: `.${emoji.name}.`,
emojiId: emoji.id,
animated: emoji.animated,
jumboable: arr.length === 1 && content.length === 1
}
});
}).reduce((previous, current) => {
if (previous.length === 0) return [current];
if (typeof current === "string") {
if (typeof previous[previous.length - 1] === "string") {
previous[previous.length - 1] += ` ${current}`;
return previous;
}
previous.push(" " + current);
return previous;
}
previous.push(" ", current);
return previous;
}, []);
newContent.push(...words);
} else {
newContent.push(node);
}
}
while (data.methodArguments[0].childrenMessageContent.props.content[0]) {
data.methodArguments[0].childrenMessageContent.props.content.shift();
}
while (newContent[0]) {
data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift());
}
}
});
}
/*
let userModule
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "EmojiPickerListRow")
.then(EmojiPickerListRow => {
let classs = EmojiPickerListRow.default
EmojiPickerListRow.default = class EmojiPickerListRow extends React.Component {
constructor(props){
super(props)
}
render(){
if(!userModule)userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0]
if(!userModule)return React.createElement(classs, this.props)
let user = userModule.default.getCurrentUser()
if(!user.hasPremiumSubscription)return React.createElement(classs, this.props)
return React.createElement(classs, Object.assign({}, this.props, {
emojiDescriptors: this.props.emojiDescriptors.map(e => {
e.isDisabled = false
})
}))
}
}
EmojiPickerListRow.default.displayName = "EmojiPickerListRow"
})*/
}
disable() {
if (!this.cancelEmoteRender) return;
this.cancelEmoteRender();
this.cancelEmoteRender = null;
}
start() {}
}());
function D(e, t, n, r, o, i, s, u, l, c) {
if (null == n || 0 === n.length) return null;
var d = n.map(function (e, n) {
return React.createElement(u, Object.assign({
onClick: o,
onHover: r,
selected: t === n,
index: n
}, l(e, n)));
});
return [R(i, s, e, c), d];
}
function R(e, t, n, r) {
var a = n.length > 0 ? e.format({
prefix: r(n)
}) : t;
if (Array.isArray(a)) {
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
} else {
a = "[LIGHTCORD] " + a;
}
return React.createElement(AutocompleteModule.default.Title, {
title: a
}, a);
}
R.displayName = "renderHeader";
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
let isUsable = false;
let hasPatched = false;
function setEmojiUsable(usable) {
isUsable = usable;
if (hasPatched) return;
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
if (!EmojiFilterModule) return;
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
hasPatched = true;
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
if (isUsable) {
if (emoji.surrogates || emoji.diversity) return true;
return false;
}
return isEmojiDisabled.call(this, ...arguments);
};
}
/***/ }),
/***/ "./src/modules/pluginCertifier.js":
/*!****************************************!*\
!*** ./src/modules/pluginCertifier.js ***!
\****************************************/
/*! exports provided: default, checkViruses, checkHash, processFile, processAttachment, decryptSettingsCache, encryptSettingsCache */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSettingsCache", function() { return decryptSettingsCache; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encryptSettingsCache", function() { return encryptSettingsCache; });
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const cache = {};
const cache2 = {};
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
constructor() {
window.Lightcord.BetterDiscord.PluginCertifier = this;
}
patch(attachment, id) {
process.nextTick(() => {
processAttachment(attachment, id);
});
}
start() {}
isTrusted(hash) {
return cache[hash] && !cache[hash].suspect;
}
}());
function checkViruses(hash, data, resultCallback, removeCallback, filename) {
data = data.toString("utf8");
let isHarmful = false;
for (let keyword of data.split(/[^\w\d]+/g)) {
for (let oof of ["token", "email", "phone", "MFA", "2fa", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
if (keyword.toLowerCase().includes(oof.toLowerCase()) && !keyword.toLowerCase() === "domtokenlist") {
console.log(oof, keyword);
isHarmful = "token stealer/virus";
break;
}
}
if (isHarmful) break;
}
if (!isHarmful) {
/**
* @type {string}
*/
const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins
if (/var [\w\d_$]+=\["/gi.test(no_comments)) {
isHarmful = "obfuscation/hidden code";
}
if (!isHarmful) {
const regexps = [
/** hexadecimal */
/_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f')
/** mangled */
/\w+\('0x[\dabcdef]+'\)/g, // b('0x0')
/\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // b('0x0', 'x1]f')
];
for (let regex of regexps) {
if (isHarmful) break;
if (regex.test(no_comments)) isHarmful = "obfuscation/hidden code";
}
}
}
if (!isHarmful) return removeCallback(hash);
cache[hash] = {
suspect: true,
name: hashToUrl[hash].split("/").pop(),
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
harm: isHarmful,
hash: hash,
filename
};
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
resultCallback(cache[hash]);
}
const hashToUrl = {};
function checkHash(hash, data, filename, resultCallback, removeCallback) {
console.log(`File: ${filename} hash: ${hash}`);
if (!cache[hash]) {
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, {
// Using node-fetch to bypass cors
headers: {
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent
}
}).then(async res => {
if (res.status !== 200) {
if (filename.endsWith(".theme.css")) return removeCallback(hash);
checkViruses(hash, data, resultCallback, removeCallback, filename);
return;
}
const result = await res.json();
result.hash = hash;
result.filename = filename;
cache[hash] = result;
resultCallback(result);
}).catch(console.error);
} else {
const result = cache[hash];
resultCallback(result);
}
}
function processFile(__path, resultCallback, removeCallback = hash => {}, isFromLoader = false) {
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
let data = Buffer.alloc(0);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => {
data = Buffer.concat([data, chunk]);
hash.update(chunk);
}).on("end", () => {
const hashResult = hash.digest("hex");
hashToUrl[hashResult] = __path;
if (isFromLoader && _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]) {
let value = _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
if (value.timestamp < Date.now() - 6.048e+8) {
delete _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
_contentManager__WEBPACK_IMPORTED_MODULE_8__["default"].saveAddonCache();
} else {
resultCallback(value.result);
return;
}
}
checkHash(hashResult, data, Object(path__WEBPACK_IMPORTED_MODULE_7__["basename"])(__path), resultCallback, removeCallback);
});
}
function processAttachment(attachment, id) {
if (!document.getElementById(id)) return;
if (!attachment.url.startsWith("https://cdn.discordapp.com/")) return document.getElementById(id).remove();
if (!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css")) return document.getElementById(id).remove();
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, {
headers: {
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent
}
}).then(res => {
if (res.status !== 200) throw new Error("File doesn't exist.");
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
let data = Buffer.alloc(0);
res.body.on("data", chunk => {
data = Buffer.concat([data, chunk]);
hash.update(chunk);
});
res.body.on("end", () => {
const hashResult = hash.digest("hex");
cache2[attachment.url] = hashResult;
hashToUrl[hashResult] = attachment.url;
checkHash(hashResult, data, attachment.filename, result => {
renderToElements(id, result, attachment.filename);
}, () => {
let elem = document.getElementById(id);
if (elem) elem.remove();
});
});
}).catch(() => {});
}
let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
let childModule = BDModules.get(e => e.childContainer)[0];
/**
*
* @param {HTMLDivElement[]} elements
* @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result
*/
function renderToElements(id, result, filename) {
const div = document.getElementById(id);
if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore.
if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
if (!childModule) childModule = BDModules.get(e => e.childContainer)[0];
if (result.suspect) {
try {
div.parentNode.style.borderColor = "rgb(240, 71, 71)";
/**
*
* @param {HTMLElement} node
*/
let nextNode = node => {
for (let child of node.children) {
if (child.tagName === "A") {
child.addEventListener("click", e => {
e.preventDefault();
e.stopImmediatePropagation();
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", {
confirmText: "Download Anyway",
cancelText: "Don't !",
danger: true,
onCancel: () => {},
onConfirm: () => {
electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href);
}
});
});
} else if (["div"].includes(child.tagName.toLowerCase())) {
nextNode(child);
}
}
};
nextNode(div.parentNode);
} catch (e) {
console.error(e);
}
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is potentially dangerous."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 40 32"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", {
x: "0",
y: "0",
width: "32",
height: "32",
mask: "url(#svg-mask-avatar-status-round-32)",
fill: "#f04747",
mask: "url(#svg-mask-status-dnd)",
className: BDModules.get(e => e.pointerEvents)[0].pointerEvents
})))), div);
} else if (!result.official) {
div.parentNode.style.borderColor = "#4087ed";
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
style: {
display: "inherit"
}
}, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is certified by Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px",
float: "left"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#4f545c",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: childModule.childContainer
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#ffffff",
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
},
onClick() {
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", {
confirmText: "Download and Install",
cancelText: "I've changed my mind",
danger: false,
onCancel: () => {},
onConfirm: () => {
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
console.log(link);
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
if (res.status !== 200) throw new Error("Status was not 200");
let content = await res.buffer();
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
console.log(installPath);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
}).catch(err => {
err = err instanceof Error ? err : new Error(err);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
type: "error"
});
});
}
});
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 24 24",
style: {
color: "rgb(67, 181, 129)",
cursor: "pointer"
}
}, /*#__PURE__*/React.createElement("g", {
fill: "none",
"fill-rule": "evenodd"
}, /*#__PURE__*/React.createElement("path", {
d: "M0 0h24v24H0z"
}), /*#__PURE__*/React.createElement("path", {
class: "fill",
fill: "currentColor",
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
})))))]);
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
} else {
div.parentNode.style.borderColor = "#4087ed";
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
style: {
display: "inherit"
}
}, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " was made by the developers of Lightcord.",
style: "brand"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px",
float: "left"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2",
stroke: "#36393f",
style: {
color: "#4087ed"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "currentColor",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: childModule.childContainer
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#ffffff",
d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
},
onClick() {
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically download and load this " + result.type.toLowerCase() + ". You must enable it in the settings.", {
confirmText: "Download and Install",
cancelText: "I've changed my mind",
danger: false,
onCancel: () => {},
onConfirm: () => {
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
if (res.status !== 200) throw new Error("Status was not 200");
let content = await res.buffer();
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
}).catch(err => {
err = err instanceof Error ? err : new Error(err);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
type: "error"
});
});
}
});
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 24 24",
style: {
color: "rgb(67, 181, 129)",
cursor: "pointer"
}
}, /*#__PURE__*/React.createElement("g", {
fill: "none",
"fill-rule": "evenodd"
}, /*#__PURE__*/React.createElement("path", {
d: "M0 0h24v24H0z"
}), /*#__PURE__*/React.createElement("path", {
class: "fill",
fill: "currentColor",
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
})))))]);
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
}
}
function getKeyedArray(obj) {
let arr = [];
Object.keys(obj).forEach(k => {
arr.push([k, obj[k]]);
});
return arr;
}
let key = null;
let save = null;
window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => {
let localStorage = localStorageModule.impl;
save = function () {
localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key)));
};
setInterval(() => {
save();
}, 100000);
try {
let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__")));
if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) {
generateKey();
save();
return;
}
key = val;
} catch (e) {
generateKey();
save();
}
});
function generateKey() {
key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")];
}
function safeJSONParse(json) {
try {
return JSON.parse(json);
} catch (e) {
return e instanceof Error ? new Error(e) : e;
}
}
function decryptSettingsCache(data) {
try {
let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64"));
let decrypted = decipher.update(Buffer.from(data, "base64"));
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString("utf8");
} catch (e) {
return "{}";
}
}
function encryptSettingsCache(data) {
let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")];
let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args);
let encrypted = cipher.update(Buffer.from(data, "utf8"));
encrypted = Buffer.concat([encrypted, cipher.final()]);
return encrypted.toString("base64");
}
/***/ }),
/***/ "./src/modules/pluginModule.js":
/*!*************************************!*\
!*** ./src/modules/pluginModule.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
class PluginModule {
constructor() {
window.Lightcord.BetterDiscord.PluginModule = this;
}
get folder() {
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder;
}
}
PluginModule.prototype.loadPlugins = async function () {
this.loadPluginData();
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins()));
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
let plugin, name;
try {
plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
name = plugin.getName();
if (plugin.load && typeof plugin.load == "function") plugin.load();
} catch (err) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err);
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
name: name,
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
message: "load() could not be fired.",
error: {
message: err.message,
stack: err.stack
}
});
continue;
}
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) {
try {
plugin.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);
} catch (err) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err);
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
name: name,
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
message: "start() could not be fired.",
error: {
message: err.message,
stack: err.stack
}
});
}
}
await new Promise(resolve => setTimeout(resolve, 10));
}
this.savePluginData();
__webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin");
};
PluginModule.prototype.startPlugin = function (plugin, reload = false) {
try {
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`);
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, {
type: "error"
});
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
this.savePluginData();
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err);
}
};
PluginModule.prototype.stopPlugin = function (plugin, reload = false) {
try {
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`);
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, {
type: "error"
});
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err);
}
};
PluginModule.prototype.enablePlugin = function (plugin, reload = false) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true;
this.savePluginData();
this.startPlugin(plugin, reload);
};
PluginModule.prototype.enable = function (plugin, reload = false) {
return this.enablePlugin(plugin, reload);
};
PluginModule.prototype.disablePlugin = function (plugin, reload = false) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
this.savePluginData();
this.stopPlugin(plugin, reload);
};
PluginModule.prototype.disable = function (plugin, reload = false) {
return this.disablePlugin(plugin, reload);
};
PluginModule.prototype.togglePlugin = function (plugin) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin);
};
PluginModule.prototype.toggle = function (plugin, reload = false) {
return this.togglePlugin(plugin, reload);
};
PluginModule.prototype.loadPlugin = async function (filename) {
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
}
const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin;
try {
if (plugin.load && typeof plugin.load == "function") plugin.load();
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [err]
});
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
};
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const plugin = bdplugin.plugin.getName();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
};
PluginModule.prototype.delete = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
this.unloadPlugin(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return this.loadPlugin(filenameOrName);
const plugin = bdplugin.plugin.getName();
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
if (enabled) this.stopPlugin(plugin, true);
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
if (enabled) this.startPlugin(plugin, true);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
};
PluginModule.prototype.reload = function (name) {
return this.reloadPlugin(name);
};
PluginModule.prototype.edit = function (filenameOrName) {
console.log("Edit " + filenameOrName);
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
console.log("Edit " + fullPath);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
PluginModule.prototype.updatePluginList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
for (const filename of results.added) this.loadPlugin(filename);
for (const name of results.removed) this.unloadPlugin(name);
};
PluginModule.prototype.loadPluginData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
}
};
PluginModule.prototype.savePluginData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
};
PluginModule.prototype.newMessage = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onMessage === "function") {
try {
plugin.onMessage();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.channelSwitch = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onSwitch === "function") {
try {
plugin.onSwitch();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.rawObserver = function (e) {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.observer === "function") {
try {
plugin.observer(e);
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
}
}
}
};
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
/***/ }),
/***/ "./src/modules/publicServers.js":
/*!**************************************!*\
!*** ./src/modules/publicServers.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
constructor() {
this._appendButton = this._appendButton.bind(this);
window.Lightcord.BetterDiscord.V2_PublicServers = this;
}
get component() {
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
rootId: "pubslayerroot",
id: "pubslayer"
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
rootId: "pubslayerroot"
}));
}
get root() {
const _root = document.getElementById("pubslayerroot");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]];
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
if (!layers) return false;
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
return true;
}
render() {
const root = this.root;
if (!root) {
console.log("FAILED TO LOCATE ROOT: .layers");
return;
}
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
}
get button() {
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
label.addEventListener("click", () => {
this.render();
});
btn.append(label);
return btn;
}
_appendButton() {
let [classNametutorialContainer] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)];
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`div.${classNametutorialContainer} > div`);
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button);
}
addButton() {
if (this.guildPatch) return;
const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds");
const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds");
if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component");
this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", {
after: this._appendButton
});
this._appendButton();
}
removeButton() {
this.guildPatch();
delete this.guildPatch;
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").remove();
}
}());
/***/ }),
/***/ "./src/modules/settingsPanel.js":
/*!**************************************!*\
!*** ./src/modules/settingsPanel.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_19__);
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
/* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js");
/* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx");
/* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js");
/* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
class BDSidebarHeader extends React.PureComponent {
render() {
let sidebarComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_26__["default"].find(e => e.Separator && e.Header && e.Item);
const changelogButton = React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__["default"], {
color: "black",
side: "top",
text: "Changelog"
}, React.createElement("span", {
style: {
float: "right",
cursor: "pointer"
},
className: "bd-changelog-button",
onClick: () => {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showChangelogModal(bbdChangelog);
}
}, React.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_28__["default"], {
className: "bd-icon",
size: "16px"
})));
let rendered = new sidebarComponents.Header({
children: React.createElement("span", null, "Bandaged BD", changelogButton),
className: "ui-tab-bar-header"
});
return rendered;
}
}
let isClearingCache = false;
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
constructor() {
this.onChange = this.onChange.bind(this);
this.updateSettings = this.updateSettings.bind(this);
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"]();
this.registerComponents();
}
registerComponents() {
/** Lightcord */
this.sidebar.register("lightcord", makeComponent(this.lightcordComponent.bind(this)));
this.sidebar.register("status", makeComponent(this.PresenceComponent.bind(this)));
this.sidebar.register("accountinfo", makeComponent(this.AccountInfosComponent.bind(this)));
this.sidebar.register("lcapipreview", makeComponent(this.ApiPreviewComponent.bind(this)));
/* Bandaged BD */
this.sidebar.register("BDChangelogTitle", makeComponent(() => {
return new BDSidebarHeader().render();
}));
this.sidebar.register("core", makeComponent(this.coreComponent.bind(this)));
this.sidebar.register("customcss", makeComponent(this.customCssComponent.bind(this)));
this.sidebar.register("plugins", makeComponent(this.renderAddonPane("plugins")));
this.sidebar.register("themes", makeComponent(this.renderAddonPane("themes")));
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#bd-settingspane-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]];
const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
if (!sidebar) return false;
const root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].createElement(`<div id="bd-settingspane-container" class="${classSidebar.contentRegion} content-region">`);
sidebar.append(root);
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => {
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root);
});
return true;
}
get coreSettings() {
const settings = this.getSettings("core");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get lightcordSettings() {
const settings = this.getSettings("lightcord");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get PresenceSettings() {
return this.getSettings("status");
}
get MsgLogSettings() {
return this.getSettings("msglog");
}
getSettings(category) {
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
if (setting.cat === category && setting.implemented && !setting.hidden) {
setting.text = key;
arr.push(setting);
}
return arr;
}, []);
}
onClick() {}
onChange(id, checked, sidebar) {
this.updateSettings(id, checked, sidebar);
}
updateSettings(id, enabled, sidebar) {
if (!["lightcord-8", "no_window_bound", "enable_glasstron", "lightcord-10"].includes(id)) _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
if (id == "bda-gs-2") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton();
}
if (id == "bda-gs-4") {
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop();
}
if (id == "bda-gs-5") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
}
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
if (id == "bda-gs-7") {
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText();
}
if (id == "fork-ps-4") {
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].stop();
}
if (id == "fork-ps-5") {
if (enabled) {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
} else {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme");
}
}
if (id == "fork-wp-1") {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled);
if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136");
}
if (id == "bda-gs-8") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener();
}
if (id == "fork-dm-1") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector();
}
/*if (id === "reactDevTools") {
if (enabled) reactDevTools.start();
else reactDevTools.stop();
}*/
if (id === "lightcord-1") {
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
sidebar.forceUpdate();
}
if (id === "lightcord-2") {
if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false;
}
if (id === "lightcord-presence-1") {
if (enabled) {
_CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0];
if (settingsStore && !settingsStore.default.showCurrentGame) {
BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({
showCurrentGame: true
});
}
} else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].disable();
}
if (id === "lightcord-3") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable();
}
}
if (id === "lightcord-7") {
if (enabled) {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
} else {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
}
}
if (id === "lightcord-8") {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("isTabs", enabled);
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
if (id === "lightcord-10") {
_core__WEBPACK_IMPORTED_MODULE_29__["default"].methods.NotificationsUseShim(enabled);
return;
}
if (id === "no_window_bound") {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("NO_WINDOWS_BOUND", enabled);
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
if (id === "enable_glasstron") {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("GLASSTRON", enabled);
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
this.saveSettings();
}
async initializeSettings() {
//if (settingsCookie.reactDevTools) reactDevTools.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();
this.saveSettings();
}
saveSettings() {
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
}
loadSettings() {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
}
renderSidebar(sidebar) {
return this.sidebar.render(sidebar);
}
coreComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__["default"], {
key: "cspanel",
onChange: this.onChange,
sections: this.coreSettings
});
}
lightcordComponent(sidebar, forceUpdate) {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
return [this.lightcordSettings.map((section, i) => {
return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_25__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, section.title), section.settings.map(setting => {
let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id];
if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false);
if (setting.id === "no_window_bound") isChecked = appSettings.get("NO_WINDOWS_BOUND", false);
if (setting.id === "enable_glasstron") isChecked = appSettings.get("GLASSTRON", true);
if (setting.id === "lightcord-10") isChecked = !appSettings.get("DEFAULT_NOTIFICATIONS", true);
let returnValue = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_24__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: isChecked,
onChange: (id, checked) => {
this.onChange(id, checked, sidebar);
}
});
if (setting.id == "lightcord-8" && isChecked) {
return [returnValue, React.createElement(Lightcord.Api.Components.inputs.Button, {
color: "green",
look: "outlined",
size: "small",
hoverColor: "brand",
onClick: () => {
DiscordNative.ipc.send("NEW_TAB");
},
wrapper: false,
disabled: false
}, "Open a new Tab")];
}
return returnValue;
})];
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, {
color: "yellow",
look: "ghost",
size: "medium",
hoverColor: "red",
onClick() {
console.log("Should relaunch");
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({
args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"])
});
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit();
},
wrapper: true
}, "Relaunch without BetterDiscord"), React.createElement(Lightcord.Api.Components.inputs.Button, {
color: "yellow",
look: "ghost",
size: "medium",
hoverColor: "red",
onClick: () => {
if (isClearingCache) return;
isClearingCache = true;
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Clearing cache...", {
type: "info"
});
forceUpdate();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWebContents().session.clearCache().then(() => {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Cache is cleared !", {
type: "success"
});
isClearingCache = false;
forceUpdate();
}).catch(err => {
console.error(err);
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("An error occured. Check console for more informations.", {
type: "error"
});
isClearingCache = false;
forceUpdate();
});
},
wrapper: true,
disabled: isClearingCache
}, "Clear cache")];
}
PresenceComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__["default"], {
key: "lppannel",
onChange: this.onChange,
settings: this.PresenceSettings
});
}
AccountInfosComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__["default"], {
key: "lapannel"
});
}
ApiPreviewComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__["default"], {
key: "lapipannel"
});
}
customCssComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__["default"], {
key: "csseditor"
});
}
renderAddonPane(type) {
// I know this shouldn't be here, but when it isn't,
// React refuses to change the button when going
// between plugins and themes page... something
// to debug later.
class ContentList extends _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.Component {
constructor(props) {
super(props);
this.prefix = this.props.type.replace("s", "");
}
onChange() {
this.props.onChange(this.props.type);
}
render() {
return this.props.children;
}
}
const originalRender = ContentList.prototype.render;
Object.defineProperty(ContentList.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
return function () {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
type
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_15__["default"], {
type
}));
};
}
}());
/**
* No need to export settingsPanel on window
*/
function makeComponent(children) {
class SettingComponent extends React.Component {
render() {
return children(sidebar, () => this.forceUpdate());
}
}
let sidebar;
return s => {
sidebar = s;
return SettingComponent;
};
}
/***/ }),
/***/ "./src/modules/settingsPanelSidebar.js":
/*!*********************************************!*\
!*** ./src/modules/settingsPanelSidebar.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; });
class V2_SettingsPanel_Sidebar {
constructor() {
this.panels = {};
}
register(panel, component) {
this.panels[panel] = component;
}
getComponent(panel, sidebar) {
return this.panels[panel](sidebar);
}
get items() {
return [{
text: "BetterDiscord Settings",
id: "core"
}, {
text: "Plugins",
id: "plugins"
}, {
text: "Themes",
id: "themes"
}, {
text: "Custom CSS",
id: "customcss"
}];
}
get LCitems() {
let items = [{
text: "Lightcord Settings",
id: "lightcord"
}, {
text: "RichPresence",
id: "status"
}, {
text: "Account Info",
id: "accountinfo"
}];
return items;
}
get LCDevItems() {
let items = [];
if (!window.Lightcord.Settings.devMode) return items;
items.push(...[{
section: "DIVIDER"
}, {
section: "HEADER",
label: "Lightcord Api"
}, {
text: "Components Preview",
id: "lcapipreview"
}]);
return items;
}
render(sidebar) {
return [{
section: "HEADER",
label: "Lightcord"
}, ...this.LCitems.map(e => {
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id, sidebar)
};
}), ...this.LCDevItems.map(e => {
if (e.section) return e;
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id, sidebar)
};
}), {
section: "DIVIDER"
}, {
section: "CUSTOM",
element: this.getComponent("BDChangelogTitle")
}, ...this.items.map(e => {
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id, sidebar)
};
}), {
section: "DIVIDER"
}];
}
}
/**
* No need to export settingsPanelSidebar on window
*/
/***/ }),
/***/ "./src/modules/themeModule.js":
/*!************************************!*\
!*** ./src/modules/themeModule.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class ThemeModule {
constructor() {
window.Lightcord.BetterDiscord.ThemeModule = this;
}
get folder() {
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder;
}
}
ThemeModule.prototype.loadThemes = async function () {
this.loadThemeData();
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes()));
const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
for (let i = 0; i < themes.length; i++) {
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]];
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
await new Promise(resolve => setTimeout(resolve, 10));
}
for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme];
}
this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme");
};
ThemeModule.prototype.enableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`);
};
ThemeModule.prototype.enable = function (name, reload = false) {
return this.enableTheme(name, reload);
};
ThemeModule.prototype.disableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`);
};
ThemeModule.prototype.disable = function (name, reload = false) {
return this.disableTheme(name, reload);
};
ThemeModule.prototype.toggleTheme = function (theme) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme);
};
ThemeModule.prototype.toggle = function (name, reload = false) {
return this.toggleTheme(name, reload);
};
ThemeModule.prototype.loadTheme = async function (filename) {
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
}
const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name);
};
ThemeModule.prototype.unloadTheme = function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return;
const theme = bdtheme.name;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme);
};
ThemeModule.prototype.delete = function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return;
this.unloadTheme(bdtheme.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdtheme.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
ThemeModule.prototype.reloadTheme = async function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return this.loadTheme(filenameOrName);
const theme = bdtheme.name;
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true), this.enableTheme(theme, true);
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be reloaded.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-reloaded", theme);
};
ThemeModule.prototype.reload = function (name) {
return this.reloadTheme(name);
};
ThemeModule.prototype.edit = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdplugin.filename);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
ThemeModule.prototype.updateThemeList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme");
for (const filename of results.added) this.loadTheme(filename);
for (const name of results.removed) this.unloadTheme(name);
};
ThemeModule.prototype.loadThemeData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved);
}
};
ThemeModule.prototype.saveThemeData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]);
};
/* harmony default export */ __webpack_exports__["default"] = (new ThemeModule());
/***/ }),
/***/ "./src/modules/utils.js":
/*!******************************!*\
!*** ./src/modules/utils.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class Utils {
/** Document/window width */
static get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
}
/** Document/window height */
static get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
static get WindowConfigFile() {
return this._windowConfigFile = null;
}
static getAllWindowPreferences() {
return {
transparent: true,
frame: false
};
}
static getWindowPreference(key) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static setWindowPreference(key, value) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
static getTextArea() {
return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(" ")[0] + " textarea");
}
static insertText(textarea, text) {
textarea.focus();
textarea.selectionStart = 0;
textarea.selectionEnd = textarea.value.length;
document.execCommand("insertText", false, text);
}
static escapeID(id) {
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
}
static log(moduleName, message) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #3a71c1; font-weight: 700;", "color: #3a71c1;", "");
}
static warn(moduleName, message) {
console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #E8A400; font-weight: 700;", "color: #E8A400;", "");
}
static err(moduleName, message, error) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: red; font-weight: 700;", "color: red;", "");
if (error) {
console.groupCollapsed("%cError: " + error.message, "color: red;");
console.error(error.stack);
console.groupEnd();
}
}
/**
* Format strings with placeholders (`{{placeholder}}`) into full strings.
* Quick example: `PluginUtilities.formatString("Hello, {{user}}", {user: "Zerebos"})`
* would return "Hello, Zerebos".
* @param {string} string - string to format
* @param {object} values - object literal of placeholders to replacements
* @returns {string} the properly formatted string
*/
static formatString(string, values) {
for (const val in values) {
let replacement = values[val];
if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);
if (typeof replacement === "object" && replacement !== null) replacement = replacement.toString();
string = string.replace(new RegExp(`{{${val}}}`, "g"), replacement);
}
return string;
}
static escape(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
}
static testJSON(data) {
try {
return JSON.parse(data);
} catch (err) {
return false;
}
}
static isEmpty(obj) {
if (obj == null || obj == undefined || obj == "") return true;
if (typeof obj !== "object") return false;
if (Array.isArray(obj)) return obj.length == 0;
for (const key in obj) {
if (obj.hasOwnProperty(key)) return false;
}
return true;
}
static suppressErrors(method, message) {
return (...params) => {
try {
return method(...params);
} catch (e) {
this.err("SuppressedError", "Error occurred in " + message, e);
}
};
}
static monkeyPatch(what, methodName, options) {
const {
before,
after,
instead,
once = false,
silent = false,
force = false
} = options;
const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;
if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console
if (!what[methodName]) {
if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console
}
const origMethod = what[methodName];
let canceled = false;
const cancel = () => {
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
//what[methodName] = origMethod;
canceled = true; // this allow to monkeypatch more than one time.
};
what[methodName] = function () {
if (canceled) {
return origMethod.call(this, ...arguments);
}
const data = {
thisObject: this,
methodArguments: arguments,
cancelPatch: cancel,
originalMethod: origMethod,
callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)
};
if (instead) {
const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data);
if (tempRet !== undefined) data.returnValue = tempRet;
} else {
if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data);
data.callOriginalMethod();
if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data);
}
if (once) cancel();
return data.returnValue;
};
Object.assign(what[methodName], origMethod);
what[methodName].__monkeyPatched = true;
what[methodName].displayName = displayName;
if (!what[methodName].__originalMethod) {
what[methodName].__originalMethod = origMethod;
what[methodName].toString = function () {
return origMethod.toString();
};
}
return cancel;
}
static onRemoved(node, callback) {
const observer = new MutationObserver(mutations => {
for (let m = 0; m < mutations.length; m++) {
const mutation = mutations[m];
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(node) > -1;
const parentMatch = nodes.some(parent => parent.contains(node));
if (directMatch || parentMatch) {
observer.disconnect();
callback();
}
}
});
observer.observe(document.body, {
subtree: true,
childList: true
});
}
static getNestedProp(obj, path) {
return path.split(/\s?\.\s?/).reduce(function (obj, prop) {
return obj && obj[prop];
}, obj);
}
/**
* This shows a toast similar to android towards the bottom of the screen.
*
* @param {string} content The string to show in the toast.
* @param {object} options Options object. Optional parameter.
* @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: ""
* @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true
* @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000
*/
static showToast(content, options = {}) {
if (!document.querySelector(".bd-toasts")) {
const container = document.querySelector("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null;
const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;
const form = container ? container.querySelector("form") : null;
const left = container ? container.getBoundingClientRect().left : 310;
const right = memberlist ? memberlist.getBoundingClientRect().left : 0;
const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;
const bottom = form ? form.offsetHeight : 80;
const toastWrapper = document.createElement("div");
toastWrapper.classList.add("bd-toasts");
toastWrapper.style.setProperty("left", left + "px");
toastWrapper.style.setProperty("width", width + "px");
toastWrapper.style.setProperty("bottom", bottom + "px");
document.querySelector("#app-mount").appendChild(toastWrapper);
}
const {
type = "",
icon = true,
timeout = 3000
} = options;
const toastElem = document.createElement("div");
toastElem.classList.add("bd-toast");
if (type) toastElem.classList.add("toast-" + type);
if (type && icon) toastElem.classList.add("icon");
toastElem.innerText = content;
document.querySelector(".bd-toasts").appendChild(toastElem);
setTimeout(() => {
toastElem.classList.add("closing");
setTimeout(() => {
toastElem.remove();
if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove();
}, 300);
}, timeout);
}
static alert(title, content) {
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}">
<div class="title">${title}</div>
</div>
<div class="bd-modal-body">
<div class="scroller-wrap fade">
<div class="scroller">
${content}
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
modal.querySelector(".footer button").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
});
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
});
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
const closingListeners = [];
return {
close: () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
},
onClose: listener => {
closingListeners.push(listener);
}
};
}
static showContentErrors({
plugins: pluginErrors = [],
themes: themeErrors = []
}) {
if (!pluginErrors || !themeErrors) return;
if (!pluginErrors.length && !themeErrors.length) return;
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal bd-content-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}"><div class="title">Content Errors</div></div>
<div class="bd-modal-body">
<div class="tab-bar-container">
<div class="tab-bar TOP">
<div class="tab-bar-item">Plugins</div>
<div class="tab-bar-item">Themes</div>
</div>
</div>
<div class="table-header">
<div class="table-column column-name">Name</div>
<div class="table-column column-message">Message</div>
<div class="table-column column-error">Error</div>
</div>
<div class="scroller-wrap fade">
<div class="scroller">
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
function generateTab(errors) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="errors">`);
for (const err of errors) {
const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="error">
<div class="table-column column-name">${err.name ? err.name : err.file}</div>
<div class="table-column column-message">${err.message}</div>
<div class="table-column column-error"><a class="error-link" href="">${err.error ? err.error.message : ""}</a></div>
</div>`);
container.append(error);
if (err.error) {
error.querySelectorAll("a").forEach(el => el.addEventListener("click", e => {
e.preventDefault();
Utils.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error);
}));
}
}
return container;
}
const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];
modal.querySelectorAll(".tab-bar-item").forEach(el => el.addEventListener("click", e => {
e.preventDefault();
const selected = modal.querySelector(".tab-bar-item.selected");
if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].removeClass(selected, "selected");
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(e.target, "selected");
const scroller = modal.querySelector(".scroller");
scroller.innerHTML = "";
scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].index(e.target)]);
}));
modal.querySelector(".footer button").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
}, 300);
});
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
}, 300);
});
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
if (pluginErrors.length) modal.querySelector(".tab-bar-item").click();else modal.querySelectorAll(".tab-bar-item")[1].click();
}
static showChangelogModal(options = {}) {
const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("fixed", "improved");
const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Text");
const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Child");
const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Tags", "default");
const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.defaultProps.selectable == false);
const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("defaultRules", "parse");
if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;
const {
image = "https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",
description = "",
changes = [],
title = "BandagedBD",
subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]}`,
footer
} = options;
const ce = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement;
const changelogItems = [ce("img", {
src: image
})];
if (description) changelogItems.push(ce("p", null, MarkdownParser.parse(description)));
for (let c = 0; c < changes.length; c++) {
const entry = changes[c];
const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;
const margin = c == 0 ? ChangelogClasses.marginTop : "";
changelogItems.push(ce("h1", {
className: `${type} ${margin}`
}, entry.title));
const list = ce("ul", null, entry.items.map(i => ce("li", null, MarkdownParser.parse(i))));
changelogItems.push(list);
}
const renderHeader = function () {
return ce(FlexChild.Child, {
grow: 1,
shrink: 1
}, ce(Titles.default, {
tag: Titles.Tags.H4
}, title), ce(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD,
className: ChangelogClasses.date
}, subtitle));
};
const renderFooter = () => {
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.displayName == "Anchor");
const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("anchorUnderlineOnHover") || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
const joinSupportServer = click => {
click.preventDefault();
click.stopPropagation();
ModalStack.pop();
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].joinBD2();
};
const supportLink = Anchor ? ce(Anchor, {
onClick: joinSupportServer
}, "Join our Discord Server.") : ce("a", {
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
onClick: joinSupportServer
}, "Join our Discord Server.");
const defaultFooter = ce(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD
}, "Need support? ", supportLink);
return ce(FlexChild.Child, {
grow: 1,
shrink: 1
}, footer ? footer : defaultFooter);
};
return ModalStack.push(function (props) {
return ce(Changelog, Object.assign({
className: ChangelogClasses.container,
selectable: true,
onScroll: _ => _,
onClose: _ => _,
renderHeader: renderHeader,
renderFooter: renderFooter,
children: changelogItems
}, props));
});
}
/**
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
* @param {string} title - title of the modal
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
* @param {object} [options] - options to modify the modal
* @param {boolean} [options.danger=false] - whether the main button should be red or not
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
* @param {string} [options.cancelText=Cancel] - text for the cancel button
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
* @returns {string} - the key used for this modal
*/
static showConfirmationModal(title, content, options = {}) {
const ModalActions = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("openModal", "updateModal");
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("ConfirmModal");
if (!ModalActions || !ConfirmationModal || !Markdown) return Utils.alert(title, content);
const emptyFunction = () => {};
const {
onConfirm = emptyFunction,
onCancel = emptyFunction,
confirmText = "Okay",
cancelText = "Cancel",
danger = false,
key = undefined
} = options;
if (!Array.isArray(content)) content = [content];
content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c);
return ModalActions.openModal(props => {
return _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(ConfirmationModal, Object.assign({
header: title,
red: danger,
confirmText: confirmText,
cancelText: cancelText,
onConfirm: onConfirm,
onCancel: onCancel
}, props), content);
}, {
modalKey: key
});
}
static removeDa(className) {
if (!className) return className;
return className.split(" ").filter(e => !e.startsWith("da-")).join(" ");
}
}
Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast.");
window.Lightcord.BetterDiscord.Utils = Utils;
/***/ }),
/***/ "./src/modules/v2.js":
/*!***************************!*\
!*** ./src/modules/v2.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2 {
constructor() {
this.editorDetached = false;
this.WebpackModules = (() => {
const req = webpackJsonp.push([[], {
__extra_id__: (module, exports, req) => module.exports = req
}, [["__extra_id__"]]]);
delete req.m.__extra_id__;
delete req.c.__extra_id__;
const shouldProtect = theModule => {
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true;
if (theModule.getToken || theModule.getEmail || theModule.showToken) return true;
return false;
};
const protect = (theModule, isDefault) => {
let mod = !isDefault ? theModule.default : theModule;
if (!mod) return theModule;
if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null;
if (!mod.getToken && !mod.getEmail && !mod.showToken) return theModule;
const proxy = new Proxy(mod, {
getOwnPropertyDescriptor: function (obj, prop) {
if (prop === "getToken" || prop === "getEmail" || prop === "showToken") return undefined;
return Object.getOwnPropertyDescriptor(obj, prop);
},
get: function (obj, func) {
if (func == "getToken" && obj.getToken) return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
if (func == "getEmail" && obj.getEmail) return () => "puppet11112@gmail.com";
if (func == "showToken" && obj.showToken) return () => true;
if (func == "__proto__" && obj.__proto__) return proxy;
return obj[func];
}
});
if (!isDefault) {
return Object.assign({}, theModule, {
default: proxy
});
}
return proxy;
};
const find = filter => {
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default, true);
if (m && filter(m)) return protect(m, false);
}
} // console.warn("Cannot find loaded module in cache");
return null;
};
const findAll = filter => {
const modules = [];
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default, true));else if (m && filter(m)) modules.push(protect(m, false));
}
}
return modules;
};
const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined));
const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
const findByDisplayName = displayName => find(module => module.displayName === displayName);
return {
find,
findAll,
findByUniqueProperties,
findByPrototypes,
findByDisplayName
};
})();
this.internal = {
react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]),
reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"])
};
this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))];
window.Lightcord.BetterDiscord.V2 = this;
}
initialize() {}
joinBD1() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd");
}
leaveBD1() {
this.GuildActions.leaveGuild("86004744966914048");
}
joinBD2() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j");
}
leaveBD2() {
this.GuildActions.leaveGuild("280806472928198656");
}
joinLC() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A");
}
leaveLC() {
this.GuildActions.leaveGuild("705908350218666117");
}
/**
* @type {typeof React}
*/
get react() {
return this.internal.react;
}
/**
* @type {typeof React}
*/
get React() {
return this.internal.react;
}
/**
* @type {typeof import("react-dom")}
*/
get reactDom() {
return this.internal.reactDom;
}
/**
* @type {typeof import("react-dom")}
*/
get ReactDom() {
return this.internal.reactDom;
}
/**
* @type {typeof React.Component}
*/
get reactComponent() {
return this.internal.react.Component;
}
/**
* @type {typeof React.Component}
*/
get ReactComponent() {
return this.internal.react.Component;
}
get anchorClasses() {
return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
}
get slateEditorClasses() {
return this.WebpackModules.findByUniqueProperties(["slateTextArea"]);
}
get messageClasses() {
return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]);
}
get guildClasses() {
const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];
const guilds = BDModules.get(e => e.guildsError && e.selected)[0];
const pill = BDModules.get(e => e.blobContainer)[0];
return Object.assign({}, guildsWrapper, guilds, pill);
}
get MessageContentComponent() {
return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons"));
}
get MessageComponent() {
return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message");
}
get TimeFormatter() {
return this.WebpackModules.findByUniqueProperties(["dateFormat"]);
}
get TooltipWrapper() {
return this.WebpackModules.findByDisplayName("Tooltip");
}
get NativeModule() {
return this.WebpackModules.findByUniqueProperties(["setBadge"]);
}
get InviteActions() {
return this.WebpackModules.findByUniqueProperties(["acceptInvite"]);
}
get GuildActions() {
return this.WebpackModules.findByUniqueProperties(["leaveGuild"]);
}
get Tooltips() {
return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);
}
get KeyGenerator() {
return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString()));
}
get LayerStack() {
return this.WebpackModules.findByUniqueProperties(["popLayer"]);
}
get UserStore() {
return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]);
}
get ChannelStore() {
return this.WebpackModules.findByUniqueProperties(["getChannel"]);
}
get ChannelActions() {
return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]);
}
get PrivateChannelActions() {
return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]);
}
openDM(userId) {
const selfId = this.UserStore.getCurrentUser().id;
if (selfId == userId) return;
const privateChannelId = this.ChannelStore.getDMFromUserId(userId);
if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);
this.ChannelActions.openPrivateChannel(selfId, userId);
}
parseSettings(cat) {
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
if (setting.cat === cat && setting.implemented && !setting.hidden) {
setting.text = key;
arr.push(setting);
}
return arr;
}, []);
}
}());
/***/ }),
/***/ "./src/modules/voiceMode.js":
/*!**********************************!*\
!*** ./src/modules/voiceMode.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
const style = `
.container-2Rl01u {
display: none!important;
}
.chat-3bRxxu {
display: none!important;
}
.sidebar-2K8pFh {
flex-grow: 1!important;
}
`;
/* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode {
start() {
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style);
}
stop() {
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode");
}
}());
/***/ }),
/***/ "./src/modules/webpackModules.js":
/*!***************************************!*\
!*** ./src/modules/webpackModules.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
const req = webpackJsonp.push([[], {
__extra_id__: (module, exports, req) => module.exports = req
}, [["__extra_id__"]]]);
delete req.m.__extra_id__;
delete req.c.__extra_id__;
const find = filter => {
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) return m.default;
if (m && filter(m)) return m;
}
} // console.warn("Cannot find loaded module in cache");
return null;
};
const findAll = filter => {
const modules = [];
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m);
}
}
return modules;
};
const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));
const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
const findByDisplayName = displayName => find(module => module.displayName === displayName);
let mod = {
find,
findAll,
findByProps,
findByPrototypes,
findByDisplayName
};
/* harmony default export */ __webpack_exports__["default"] = (mod);
window.Lightcord.BetterDiscord.WebpackModules = mod;
/***/ }),
/***/ "./src/svg/LightcordUser.jsx":
/*!***********************************!*\
!*** ./src/svg/LightcordUser.jsx ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordUserBadge; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
class LightcordUserBadge extends React.Component {
render() {
const props = this.props;
delete props.href.target;
console.log(props);
return /*#__PURE__*/React.createElement(props.Anchor, _extends({
href: "/users/" + props.user.id
}, props.href, {
onClick: ev => {
ev.preventDefault();
if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
profilModule.default.open(props.user.id);
}
}), /*#__PURE__*/React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), /*#__PURE__*/React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), /*#__PURE__*/React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
})));
}
}
/***/ }),
/***/ "./src/svg/bug_hunter.jsx":
/*!********************************!*\
!*** ./src/svg/bug_hunter.jsx ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class BugHunterBadge extends React.Component {
render() {
const props = this.props;
return /*#__PURE__*/React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), /*#__PURE__*/React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), /*#__PURE__*/React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
}));
}
}
/***/ }),
/***/ "./src/svg/circus.jsx":
/*!****************************!*\
!*** ./src/svg/circus.jsx ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Circus; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class Circus extends React.Component {
render() {
return /*#__PURE__*/React.createElement("svg", _extends({
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 36 36"
}, this.props.svg, {
height: "100%"
}), /*#__PURE__*/React.createElement("path", {
fill: "#DD2E44",
d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z"
}), /*#__PURE__*/React.createElement("path", {
fill: "#EA596E",
d: "M13 35c-.792-1.875-1.75-3.291-3.417-4.666 1.75-1.459 4.542-5.5 5.25-8.292s2.75 8.125 2.042 10.625S13 35 13 35zm10.303 0c.791-1.875 1.75-3.291 3.416-4.666-1.75-1.459-4.541-5.5-5.25-8.292-.707-2.792-2.75 8.125-2.04 10.625.708 2.5 3.874 2.333 3.874 2.333z"
}), /*#__PURE__*/React.createElement("path", {
fill: "#BE1931",
d: "M3.728 24.263A2.5 2.5 0 008 22.5c0-.565-.195-1.081-.511-1.5H4l-.272 3.263zm28.544 0L32 21h-3.489A2.482 2.482 0 0028 22.5a2.5 2.5 0 004.272 1.763z"
}), /*#__PURE__*/React.createElement("circle", {
cx: "14",
cy: "23",
r: "2",
fill: "#BE1931"
}), /*#__PURE__*/React.createElement("circle", {
cx: "22",
cy: "23",
r: "2",
fill: "#BE1931"
}), /*#__PURE__*/React.createElement("circle", {
cx: "10",
cy: "23",
r: "2",
fill: "#BE1931"
}), /*#__PURE__*/React.createElement("circle", {
cx: "26",
cy: "23",
r: "2",
fill: "#BE1931"
}), /*#__PURE__*/React.createElement("path", {
d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z"
}), /*#__PURE__*/React.createElement("path", {
fill: "#55ACEE",
d: "M18.838.206C17.667.042 17 .318 17 1.418v1c0 1.1.865 1.753 1.923 1.451l5.154-.901c1.715-.343 1.548-1.593.085-1.884L18.838.206z"
}), /*#__PURE__*/React.createElement("path", {
fill: "#CCD6DD",
d: "M18 6l-.081.123C10.938 16.981 3 15.015 3 19v2.5a2.5 2.5 0 004.95.5H12a2 2 0 004 0h4a2 2 0 004 0h4.05a2.5 2.5 0 004.95-.5V19c0-4-8-2-15-13z"
}), /*#__PURE__*/React.createElement("g", {
fill: "#F5F8FA"
}, /*#__PURE__*/React.createElement("path", {
d: "M17.948 6.078l-.03.045C17.132 11.619 10.811 16.126 8 18v4a2 2 0 004 0v-4c.982-.982 5.813-6.787 5.984-11.732-.01-.064-.027-.126-.036-.19zm.08.398C18.324 11.374 23.031 17.031 24 18v4a2 2 0 004 0v-4c-2.75-1.833-8.953-6.19-9.972-11.524z"
}), /*#__PURE__*/React.createElement("path", {
d: "M17.984 6.27C17.922 8.346 17.606 16.394 16 18v4a2 2 0 004 0v-4c-1.564-1.564-1.905-9.241-1.979-11.559-.011-.057-.027-.113-.037-.171z"
})));
}
}
/***/ }),
/***/ "./src/svg/lightcord.jsx":
/*!*******************************!*\
!*** ./src/svg/lightcord.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class LightcordLogo extends React.Component {
render() {
const props = this.props;
return /*#__PURE__*/React.createElement("svg", _extends({
viewBox: "0 0 168 168.69"
}, props, {
height: "100%",
width: props.size
}), /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("linearGradient", {
id: "prefix__a",
x1: 66.7,
y1: -487.7,
x2: 66.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, /*#__PURE__*/React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), /*#__PURE__*/React.createElement("stop", {
offset: 1,
stopColor: "#731a14"
})), /*#__PURE__*/React.createElement("linearGradient", {
id: "prefix__b",
x1: 101.7,
y1: -487.7,
x2: 101.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, /*#__PURE__*/React.createElement("stop", {
offset: 0,
stopColor: "#e20613"
}), /*#__PURE__*/React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
})), /*#__PURE__*/React.createElement("linearGradient", {
id: "prefix__c",
x1: 84,
y1: -408,
x2: 84,
y2: -576.69,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, /*#__PURE__*/React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), /*#__PURE__*/React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
}))), /*#__PURE__*/React.createElement("path", {
fill: "#fff",
d: "M14.9 35.3h139.2V133H14.9z"
}), /*#__PURE__*/React.createElement("path", {
d: "M66.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__a)"
}), /*#__PURE__*/React.createElement("path", {
d: "M101.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__b)"
}), /*#__PURE__*/React.createElement("path", {
d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z",
fill: "url(#prefix__c)"
}));
}
}
/***/ }),
/***/ "./src/ui/AccountInfos.jsx":
/*!*********************************!*\
!*** ./src/ui/AccountInfos.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
let colorModule = BDModules.get(e => e.colorStandard)[0];
let sizeModule = BDModules.get(e => e.size32)[0];
let scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
const GuildModule = BDModules.get(e => e.default && e.default.getGuilds)[0].default;
const relationShipModule = BDModules.get(e => e.default && e.default.getRelationships)[0].default;
const sessionModule = BDModules.get(e => e.default && e.default.getSessions)[0].default;
const userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default;
class V2C_AccountInfos extends React.Component {
constructor(props) {
super(props);
}
render() {
if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0];
if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0];
return [/*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Account Infos"
}), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Profile"), /*#__PURE__*/React.createElement(CodeContent, {
content: this.getProfileValue(),
language: "diff"
}), /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Statistics"), /*#__PURE__*/React.createElement(CodeContent, {
content: this.getStatistics(),
language: "diff"
}), /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Connected Sessions"), /*#__PURE__*/React.createElement(CodeContent, {
content: this.getSessionValue(),
language: "diff"
})), /*#__PURE__*/React.createElement("div", {
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
})];
}
getSessionValue() {
const sessionsRaw = sessionModule.getSessions();
const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]);
if (sessions.length === 0) return "- No session detected. Please try in a few seconds";
return sessions.map(e => {
return `+ id: ${e.sessionId}
+ os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)}
+ client: ${e.clientInfo.client}
+ status: ${e.status}
+ Activities: ${e.activities.length}`;
}).join("\n" + "-".repeat(38) + "\n");
}
getProfileValue() {
const user = userModule.getCurrentUser();
/**
* @type {Date}
*/
const createdAt = user.createdAt;
let avatarURL = user.avatarURL;
if (user.avatar && user.avatar.startsWith("a_")) {
avatarURL = user.getAvatarURL("gif");
}
if (avatarURL.startsWith("/")) {
avatarURL = "https://discord.com" + avatarURL;
}
if (avatarURL.endsWith("?size=128")) {
avatarURL = avatarURL.replace("?size=128", "?size=4096");
}
return `+ Username: ${user.username}
+ Discriminator: ${user.discriminator}
+ Tag: ${user.tag}
+ ID: ${user.id}
+ Avatar: ${user.avatar}
+ Avatar URL: ${avatarURL}
+ Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s
+ Flags: ${user.flags}
+ Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"}
- Email: ${user.email}
- 2FA: ${user.mfaEnabled ? "Yes" : "No"}
- Has Been On Mobile: ${user.mobile ? "Yes" : "No"}
- Phone: ${user.phone || "None"}
- Verified: ${user.verified}`;
}
getStatistics() {
const guilds = Object.values(GuildModule.getGuilds());
const relations = Object.keys(relationShipModule.getRelationships());
const friends = relations.filter(e => relationShipModule.isFriend(e));
const blocked = relations.filter(e => relationShipModule.isBlocked(e));
return `+ Server Count: ${guilds.length} servers
+ Relations: ${relations.length} relations
+ Friends Count: ${friends.length} friends
- Blocked Users Count: ${blocked.length} blocked users`;
}
}
let hightlightJS = BDModules.get(e => e.highlight)[0];
let messageModule1 = BDModules.get(e => e.markup)[0];
let messageModule2 = BDModules.get(e => e.messageContent)[0];
class CodeContent extends React.Component {
render() {
if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0];
if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0];
if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0];
return /*#__PURE__*/React.createElement("div", {
class: `${messageModule1.markup} ${messageModule2.messageContent}`
}, /*#__PURE__*/React.createElement("pre", null, /*#__PURE__*/React.createElement("code", {
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
dangerouslySetInnerHTML: {
__html: hightlightJS.highlight(this.props.language, this.props.content).value
}
})), /*#__PURE__*/React.createElement("div", {
className: BDModules.get(e => e.marginBottom8)[0].marginBottom8
}));
}
}
/***/ }),
/***/ "./src/ui/ApiPreview.jsx":
/*!*******************************!*\
!*** ./src/ui/ApiPreview.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ApiPreview; });
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ "fs");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
// Good luck to read my code, Even me can't read it properly.
const keys = {
settingTitle: Object(_modules_distant__WEBPACK_IMPORTED_MODULE_1__["uuidv4"])()
};
let formModule;
class ApiPreview extends React.PureComponent {
constructor() {
super(...arguments);
this.state = {
states: []
};
}
render() {
if (!formModule) formModule = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(e => e.FormSection);
/**
* @type {Function[]}
*/
const allComponents = [...new Set(Object.keys(window.Lightcord.Api.Components).map(e => {
return Object.keys(window.Lightcord.Api.Components[e]).map(k => window.Lightcord.Api.Components[e][k]);
}).flat())];
return [/*#__PURE__*/React.createElement(formModule.FormSection, {
tag: "h2",
title: "Lightcord's Api Availlable components"
}, /*#__PURE__*/React.createElement(formModule.FormText, {
type: "description",
className: "",
selectable: false
}, "These components are here for the plugin devs. They can quickly embed any component below with this panel.", /*#__PURE__*/React.createElement("div", {
style: {
marginTop: "20px"
}
}), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, {
type: "info"
}, "All these components have error handling. If you want none, add `.original` after the component path."), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, {
type: "warn"
}, "We do not recommend modifying these component by a plugin. Only do this if you know what you are doing.")), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
color: "brand",
look: "outlined",
size: "medium",
hoverColor: "green",
onClick: () => {
electron__WEBPACK_IMPORTED_MODULE_3__["remote"].shell.openExternal("https://lightcord.deroku.xyz/LightcordApi/docs");
},
wrapper: false
}, "Documentation")), allComponents.map(comp => {
let AllPreviews = [];
if (comp.AllPreviews) AllPreviews = comp.AllPreviews;
let onChange = tab => {
setState({
tab
});
};
let setState = newState => {
this.setState({
states: [Object.assign(state, newState)].concat(this.state.states.filter(e => e.elem !== comp))
});
};
let state = this.state.states.find(e => e.elem === comp);
if (!state) {
state = {
tab: "preview",
elem: comp,
options: {}
};
this.state.states.push(state);
}
let getProps = () => {
let final = {};
AllPreviews.forEach(category => {
final[Object.keys(category[0])[0]] = category[0][Object.keys(category[0])[0]];
});
Object.keys(state.options).forEach(key => {
final[key] = AllPreviews.find(e => e.find(e => e[key]))[state.options[key]][key];
});
return final;
};
let renderPreview = () => {
return /*#__PURE__*/React.createElement("div", {
style: {
margin: "20px"
}
}, /*#__PURE__*/React.createElement("div", {
style: {
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
},
className: "lc-tab-box-shadow"
}, React.createElement(comp, getProps())));
};
let renderCode = () => {
return /*#__PURE__*/React.createElement("div", {
style: {
margin: "20px"
}
}, /*#__PURE__*/React.createElement("div", {
style: {
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
},
className: "lc-tab-box-shadow"
}, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
language: "jsx",
content: generateCode("jsx")
}), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
language: "js",
content: generateCode("react")
})));
};
let getStrForProp = (value, compPath, lang) => {
if (typeof value === "string") {
return value;
} else if (typeof value === "boolean") {
return String(value);
} else if (typeof value === "function") {
return value.toString();
} else if (typeof value === "object") {
if (value && value.$$typeof && (value.$$typeof === Symbol.for("react.element") || value.$$typeof === 0xeac7)) {
if (compPath === "Lightcord.Api.Components.general.Tabs") {
if (lang === "react") {
return `React.createElement("div", {style: {
marginTop: "20px", marginBottom: "20px"
}},
React.createElement("div", {style: {
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
}, className: "lc-tab-box-shadow" },
React.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs")
)
)`;
} else if (lang === "jsx") {
return `<div style={{
marginTop: "20px", marginBottom: "20px"
}}>
<div style={{
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
}} className="lc-tab-box-shadow">
<Lightcord.Api.Components.general.Title>Preview tabs</Lightcord.Api.Components.general.Title>
</div>
</div>`;
}
}
return "Your components here.";
}
return JSON.stringify(value, null, " ");
} else if (typeof value === "number") {
return String(value);
}
return String(value);
};
let generateCode = function (lang) {
// code formatting is hard
const compName = comp.displayName || comp.name;
let categories = Object.keys(window.Lightcord.Api.Components);
const compCategory = categories.find(e => window.Lightcord.Api.Components[e][compName]);
const compPath = `Lightcord.Api.Components.${compCategory}.${compName}`;
const props = getProps();
if (lang === "jsx") {
let propStrings = [];
let childrenProp = null;
Object.keys(props).forEach(key => {
if (key == "children") {
childrenProp = getStrForProp(props[key], compPath, lang);
} else {
let str = key + "=";
if (typeof props[key] === "string") {
str += JSON.stringify(props[key]);
} else {
str += `{${getStrForProp(props[key], compPath, lang)}}`;
}
propStrings.push(str);
}
});
let openTag;
if (childrenProp) {
openTag = `<${compPath} ${propStrings.join(" ")}>`;
let closeTag = `</${compPath}>`;
return `${openTag}\n ${childrenProp}\n${closeTag}`;
} else {
openTag = `<${compPath} ${propStrings.join(" ")}/>`;
return openTag;
}
} else if (lang === "react") {
let children = props.children || null;
delete props.children;
if (children && children.$$typeof && (children.$$typeof === Symbol.for("react.element") || children.$$typeof === 0xeac7)) {
children = getStrForProp(children, compPath, lang);
}
let propStrings = [];
Object.keys(props).forEach(key => {
let visibleKey = /[^\w\d_]/g.test(key) ? JSON.stringify(key) : key;
let str = visibleKey + ": ";
if (typeof props[key] === "string") {
str += JSON.stringify(props[key]);
} else {
str += getStrForProp(props[key], compPath, lang).split("\n").map((str, i) => {
if (i === 0) return str;
return " " + str;
}).join("\n");
}
propStrings.push(str);
});
let propObject = "{";
if (propStrings.length) {
propStrings.forEach((str, i) => {
let isLast = i === propStrings.length - 1;
let isFirst = i === 0;
if (!isFirst) {
propObject += ",";
}
propObject += "\n ";
propObject += str;
if (isLast) {
propObject += "\n}";
}
});
} else {
propObject += "}";
}
let childrenData = typeof children === "string" && children.startsWith("React.createElement") ? children : JSON.stringify(children);
return `React.createElement(${compPath}, ${propObject}, ${childrenData})`;
}
};
let help = comp.help || {};
let info = help.info ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
type: "info"
}, help.info) : null;
let warn = help.warn ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
type: "warn"
}, help.warn) : null;
let danger = help.danger ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
type: "danger"
}, help.danger) : null;
let error = help.error ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
type: "error"
}, help.error) : null;
let success = help.success ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
type: "success"
}, help.success) : null;
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), info, success, warn, error, danger, AllPreviews.map(category => {
if (category[0].onClick) return null;
if (category[0].text) return null;
if (category[0].children) return null;
if (category.length === 1) return null;
let key = Object.keys(category[0])[0];
return [/*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
options: category.map((e, index) => {
return {
value: "opt-" + index,
label: JSON.stringify(e[Object.keys(e)[0]])
};
}),
value: "opt-" + (state.options[key] || "0"),
onChange: value => {
setState({
options: Object.assign({}, state.options, {
[key]: (value.value || "0").replace("opt-", "")
})
});
},
searchable: true
}), /*#__PURE__*/React.createElement("div", {
style: {
marginBottom: "8px"
}
})];
}), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.Tabs, {
tabs: [{
label: "Preview",
id: "preview"
}, {
label: "Code",
id: "code"
}],
active: state.tab,
children: state.tab === "preview" ? renderPreview() : renderCode(),
onChange: onChange
}));
})];
}
get renders() {}
}
/***/ }),
/***/ "./src/ui/addoncard.jsx":
/*!******************************!*\
!*** ./src/ui/addoncard.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PluginCard; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _icons_edit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/edit */ "./src/ui/icons/edit.jsx");
/* harmony import */ var _icons_delete__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/delete */ "./src/ui/icons/delete.jsx");
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! path */ "path");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_12__);
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React;
const anchorClasses = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].anchorClasses;
class V2C_PluginCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
this.showSettings = this.showSettings.bind(this);
this.setInitialState();
this.hasSettings = this.props.addon.plugin && typeof this.props.addon.plugin.getSettingsPanel === "function";
this.settingsPanel = "";
this.edit = this.edit.bind(this);
this.delete = this.delete.bind(this);
this.reload = this.reload.bind(this);
}
setInitialState() {
this.state = {
checked: this.props.enabled,
settings: false,
reloads: 0,
trusted: false
};
}
showSettings() {
if (!this.hasSettings) return;
this.setState({
settings: true
});
}
closeSettings() {
this.panelRef.current.innerHTML = "";
this.setState({
settingsOpen: false
});
}
componentDidUpdate() {
if (!this.state.settings) return;
if (typeof this.settingsPanel === "object") {
this.refs.settingspanel.appendChild(this.settingsPanel);
}
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-3"]) return;
setImmediate(() => {
const isHidden = (container, element) => {
if (!container) {
console.error(new Error(`Container is undefined.`));
return false;
}
const cTop = container.scrollTop;
const cBottom = cTop + container.clientHeight;
const eTop = element.offsetTop;
const eBottom = eTop + element.clientHeight;
return eTop < cTop || eBottom > cBottom;
};
const thisNode = this.refs.cardNode;
const container = thisNode.closest("div[class*=\"contentRegionScroller-\"]");
if (!isHidden(container, thisNode)) return;
const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode);
const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container);
const original = container.scrollTop;
const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;
_modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({
duration: 300,
update: function (progress) {
if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint);
}
});
});
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
get settingsComponent() {
try {
this.settingsPanel = this.props.addon.plugin.getSettingsPanel();
} catch (err) {
_modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err);
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-open ui-switch-item",
ref: "cardNode"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
style: {
"float": "right",
"cursor": "pointer"
},
onClick: () => {
this.refs.settingspanel.innerHTML = "";
this.setState({
settings: false
});
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel"
}), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel",
dangerouslySetInnerHTML: {
__html: this.settingsPanel
}
}));
}
buildTitle(name, version, author) {
const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/);
const nameIndex = title.findIndex(s => s == "{{name}}");
if (nameIndex) title[nameIndex] = React.createElement("span", {
className: "name bda-name"
}, name);
const versionIndex = title.findIndex(s => s == "{{version}}");
if (nameIndex) title[versionIndex] = React.createElement("span", {
className: "version bda-version"
}, version);
const authorIndex = title.findIndex(s => s == "{{author}}");
if (nameIndex) {
const props = {
className: "author bda-author"
};
if (author.link || author.id) {
props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;
props.target = "_blank";
if (author.link) props.href = author.link;
if (author.id) props.onClick = () => {
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id);
};
}
title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name);
}
return title.flat();
}
makeLink(title, url) {
const props = {
className: "bda-link bda-link-website",
target: "_blank"
};
if (typeof url == "string") props.href = url;
if (typeof url == "function") props.onClick = event => {
event.preventDefault();
event.stopPropagation();
url();
};
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title);
}
makeButton(title, children, action) {
return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
color: "black",
side: "top",
text: title
}, /*#__PURE__*/React.createElement("div", {
className: "bd-addon-button",
onClick: action
}, children));
}
componentWillUnmount() {
this.unmounted = true;
}
get links() {
const links = [];
const addon = this.props.addon;
if (addon.website) links.push(this.makeLink("Website", addon.website));
if (addon.source) links.push(this.makeLink("Source", addon.source));
if (addon.invite) {
links.push(this.makeLink("Support Server", () => {
const tester = /\.gg\/(.*)$/;
let code = addon.invite;
if (tester.test(code)) code = code.match(tester)[1];
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code);
}));
}
if (addon.donate) links.push(this.makeLink("Donate", addon.donate));
if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon));
return links;
}
get footer() {
const links = this.links;
return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card-footer bda-footer"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", {
className: "bd-addon-links bda-links"
}, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
onClick: this.showSettings,
className: "bd-button bda-settings-button",
disabled: !this.state.checked
}, "Settings"));
}
onChange() {
this.props.toggle && this.props.toggle(this.name);
this.setState({
checked: !this.state.checked
});
}
edit() {
this.props.edit(this.name);
}
delete() {
this.props.remove(this.name);
}
reload() {
this.props.reload(this.name);
}
get name() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);
}
get author() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);
}
get description() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);
}
get version() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);
}
render() {
if (this.state.settings) return this.settingsComponent;
const {
authorId,
authorLink
} = this.props.addon;
const style = {};
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
if (!this.isScanning) {
this.isScanning = true;
Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => {
if (this.unmounted) return;
this.setState({
isTrusted: result.suspect ? "suspect" : true
});
}, () => {});
} else {
if (this.state.isTrusted === true) {
style.borderColor = "#4087ed";
}
if (this.state.isTrusted === "suspect") {
style.borderColor = "rgb(240, 71, 71)";
}
}
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-closed ui-switch-item",
style
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-header bda-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card-title bda-header-title"
}, this.buildTitle(this.name, this.version, {
name: this.author,
id: authorId,
link: authorLink
})), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-controls bda-controls"
}, this.props.edit && this.makeButton("Edit", /*#__PURE__*/React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
className: "bd-icon"
}), this.edit), this.props.remove && this.makeButton("Delete", /*#__PURE__*/React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
className: "bd-icon"
}), this.delete), this.props.reload && this.makeButton("Reload", /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon"
}), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], {
onChange: this.onChange,
checked: this.state.checked
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller bd-addon-description bda-description scroller"
}, this.description)), this.footer);
}
}
const originalRender = V2C_PluginCard.prototype.render;
Object.defineProperty(V2C_PluginCard.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/addonlist.jsx":
/*!******************************!*\
!*** ./src/ui/addonlist.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; });
/* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js");
/* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/bdEvents */ "./src/modules/bdEvents.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__["default"].findByDisplayName("Tooltip");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].react;
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
sort: "name",
ascending: true,
query: ""
};
this.isPlugins = this.props.type == "plugins";
this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_6__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_6__["themeCookie"];
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"];
this.sort = this.sort.bind(this);
this.reverse = this.reverse.bind(this);
this.search = this.search.bind(this);
this.onAddonChanges = function () {
this.forceUpdate();
};
this.onAddonChanges = this.onAddonChanges.bind(this);
}
componentDidMount() {
const type = (this.isPlugins ? "plugin" : "theme") + "-";
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}loaded`, this.onAddonChanges);
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}unloaded`, this.onAddonChanges);
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}reloaded`, this.onAddonChanges);
}
componentWillUnmount() {
const type = (this.isPlugins ? "plugin" : "theme") + "-";
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}loaded`, this.onAddonChanges);
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}unloaded`, this.onAddonChanges);
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}reloaded`, this.onAddonChanges);
}
openFolder() {
const shell = __webpack_require__(/*! electron */ "electron").shell;
const open = shell.openPath || shell.openItem;
open(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].themesFolder);
}
edit(name) {
console.log(name);
this.manager.edit(name);
}
async delete(name) {
const shouldDelete = await this.confirmDelete(name);
if (!shouldDelete) return;
this.manager.delete(name);
}
confirmDelete(name) {
return new Promise(resolve => {
_modules_bdApi__WEBPACK_IMPORTED_MODULE_12__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, {
danger: true,
confirmText: "Delete",
onConfirm: () => {
resolve(true);
},
onCancel: () => {
resolve(false);
}
});
});
}
get sortOptions() {
return [{
label: "Name",
value: "name"
}, {
label: "Author",
value: "author"
}, {
label: "Version",
value: "version"
}, {
label: "Recently Added",
value: "added"
}, {
label: "Last Modified",
value: "modified"
}, {
label: "File Size",
value: "size"
}];
}
get directions() {
return [{
label: "Ascending",
value: true
}, {
label: "Descending",
value: false
}];
}
reverse(value) {
this.setState({
ascending: value
});
}
sort(value) {
this.setState({
sort: value
});
}
search(event) {
this.setState({
query: event.target.value.toLocaleLowerCase()
});
}
getProps(addon) {
return {
key: this.getName(addon),
enabled: this.cookie[this.getName(addon)],
toggle: this.manager.toggle.bind(this.manager),
edit: _0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-7"] ? this.edit.bind(this) : null,
remove: this.delete.bind(this),
addon: addon,
hash: addon.hash
};
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
get list() {
return this.props.type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdthemes"]);
}
getAddons() {
const sortedAddons = this.list.sort((a, b) => {
const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);
const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : a[this.state.sort];
const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : b[this.state.sort];
if (typeof first == "string") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());
if (first > second) return 1;
if (second > first) return -1;
return 0;
});
if (!this.state.ascending) sortedAddons.reverse();
const rendered = [];
for (let a = 0; a < sortedAddons.length; a++) {
const addon = sortedAddons[a];
if (this.state.query) {
let matches = null;
const name = this.getName(addon);
const author = this.getAuthor(addon);
const description = this.getDescription(addon);
const version = this.getVersion(addon);
if (name) matches = name.toLocaleLowerCase().includes(this.state.query);
if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);
if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);
if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);
if (!matches) continue;
}
const props = this.getProps(addon);
rendered.push( /*#__PURE__*/React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, /*#__PURE__*/React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
reload: !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && this.manager.reload.bind(this.manager)
}))));
}
return rendered;
}
getName(addon) {
return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);
}
getAuthor(addon) {
return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);
}
getDescription(addon) {
return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);
}
getVersion(addon) {
return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);
}
renderCheckUpdates() {
if (!window.ZeresPluginLibrary) return null;
if (!window.PluginUpdates) return null;
if (typeof window.PluginUpdates.checkAll !== "function") return null;
if (!this.isPlugins) return null;
return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_14__["default"], {
text: "Checks for updates of plugins that support this feature. Right-click for a list."
}, /*#__PURE__*/React.createElement("span", {
style: {
marginLeft: "10px"
}
}, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
color: "brand",
look: "filled",
size: "min",
hoverColor: "default",
onClick: () => {
try {
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check in progress.", {
type: "info"
});
window.PluginUpdates.checkAll().then(() => {
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check complete.", {
type: "success"
});
}).catch(err => {
console.error(err);
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", {
type: "error"
});
});
} catch (e) {
console.error(e);
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", {
type: "error"
});
}
},
wrapper: false,
disabled: false
}, "Check for Updates")));
}
render() {
const refreshIcon = /*#__PURE__*/React.createElement(Tooltip, {
color: "black",
position: "top",
text: "Reload List"
}, props => /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_2__["default"], _extends({}, props, {
className: "bd-icon bd-reload bd-reload-header",
size: "18px",
onClick: async () => {
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"].updateThemeList();
this.forceUpdate();
}
})));
const addonCards = this.getAddons();
return /*#__PURE__*/React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
}, /*#__PURE__*/React.createElement("button", {
key: "folder-button",
className: "bd-button bd-pfbtn",
onClick: this.openFolder.bind(this)
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && refreshIcon, /*#__PURE__*/React.createElement("div", {
className: "bd-controls bd-addon-controls"
}, /*#__PURE__*/React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_5__["default"], {
onChange: this.search,
placeholder: `Search ${this.props.type}...`
}), /*#__PURE__*/React.createElement("div", {
className: "bd-addon-dropdowns"
}, /*#__PURE__*/React.createElement("div", {
className: "bd-select-wrapper"
}, /*#__PURE__*/React.createElement("label", {
className: "bd-label"
}, "Sort by:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], {
options: this.sortOptions,
onChange: this.sort,
style: "transparent"
})), /*#__PURE__*/React.createElement("div", {
className: "bd-select-wrapper"
}, /*#__PURE__*/React.createElement("label", {
className: "bd-label"
}, "Order:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], {
options: this.directions,
onChange: this.reverse,
style: "transparent"
})))), /*#__PURE__*/React.createElement("div", {
className: "bda-slist bd-addon-list"
}, addonCards));
}
}
const originalRender = CardList.prototype.render;
Object.defineProperty(CardList.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/bdLogo.js":
/*!**************************!*\
!*** ./src/ui/bdLogo.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
height: "100%",
width: this.props.size || "16px",
className: "bd-logo " + this.props.className,
style: {
fillRule: "evenodd",
clipRule: "evenodd",
strokeLinecap: "round",
strokeLinejoin: "round"
},
viewBox: "0 0 2000 2000"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow1"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "20",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow2"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "15",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(255,255,255,0.15)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow3"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "10",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow3)"
},
d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",
fill: "#171717",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow2)"
},
d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",
fill: "#3E82E5",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow1)"
},
d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",
fill: "#FFFFFF",
opacity: "1"
})));
}
}
/***/ }),
/***/ "./src/ui/checkbox.js":
/*!****************************!*\
!*** ./src/ui/checkbox.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.setInitialState();
}
setInitialState() {
this.state = {
checked: this.props.checked || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
className: BDModules.get(e => e.checkboxElement)[0].checkboxElement,
checked: this.state.checked,
onChange: () => {},
type: "checkbox"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text)));
}
onClick() {
this.props.onChange(this.props.id, !this.state.checked);
this.setState({
checked: !this.state.checked
});
}
}
/***/ }),
/***/ "./src/ui/components/dropdown.jsx":
/*!****************************************!*\
!*** ./src/ui/components/dropdown.jsx ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Select extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
value: this.props.value || this.props.options[0].value
};
this.dropdown = React.createRef();
this.onChange = this.onChange.bind(this);
this.showMenu = this.showMenu.bind(this);
this.hideMenu = this.hideMenu.bind(this);
}
showMenu(event) {
event.preventDefault();
this.setState({
open: true
}, () => {
document.addEventListener("click", this.hideMenu);
});
}
hideMenu() {
this.setState({
open: false
}, () => {
document.removeEventListener("click", this.hideMenu);
});
}
onChange(value) {
this.setState({
value
});
if (this.props.onChange) this.props.onChange(value);
}
get selected() {
return this.props.options.find(o => o.value == this.state.value);
}
get options() {
const selected = this.selected;
return /*#__PURE__*/React.createElement("div", {
className: "bd-select-options"
}, this.props.options.map(opt => /*#__PURE__*/React.createElement("div", {
className: `bd-select-option${selected.value == opt.value ? " selected" : ""}`,
onClick: this.onChange.bind(this, opt.value)
}, opt.label)));
}
render() {
const style = this.props.style == "transparent" ? " bd-select-transparent" : "";
const isOpen = this.state.open ? " menu-open" : "";
return /*#__PURE__*/React.createElement("div", {
className: `bd-select${style}${isOpen}`,
onClick: this.showMenu,
ref: this.dropdown
}, /*#__PURE__*/React.createElement("div", {
className: "bd-select-value"
}, this.selected.label), /*#__PURE__*/React.createElement(_icons_downarrow__WEBPACK_IMPORTED_MODULE_1__["default"], {
className: "bd-select-arrow"
}), this.state.open && this.options);
}
} // return <div className="bd-select-wrap">
// <label className="bd-label">{this.props.label}</label>
// <div className={`bd-select${style}${isOpen}`} onClick={this.showMenu} ref={this.dropdown}>
// <div className="bd-select-controls">
// <div className="bd-select-value">{this.selected.label}</div>
// <Arrow className="bd-select-arrow" />
// </div>
// </div>
// {this.state.open && this.options}
// </div>;
/***/ }),
/***/ "./src/ui/components/search.jsx":
/*!**************************************!*\
!*** ./src/ui/components/search.jsx ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _icons_search__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/search */ "./src/ui/icons/search.jsx");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Search extends React.Component {
render() {
return /*#__PURE__*/React.createElement("div", {
className: "bd-search-wrapper"
}, /*#__PURE__*/React.createElement("input", {
onChange: this.props.onChange,
onKeyDown: this.props.onKeyDown,
type: "text",
className: "bd-search",
placeholder: this.props.placeholder,
maxLength: "50"
}), /*#__PURE__*/React.createElement(_icons_search__WEBPACK_IMPORTED_MODULE_1__["default"], null));
}
}
/***/ }),
/***/ "./src/ui/components/switch.jsx":
/*!**************************************!*\
!*** ./src/ui/components/switch.jsx ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Switch; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Switch extends React.Component {
constructor(props) {
super(props);
this.state = {
checked: this.props.checked
};
this.onChange = this.onChange.bind(this);
}
onChange(value) {
if (this.props.disabled) return;
this.props.onChange(value);
this.setState({
checked: value
});
}
render() {
return /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Switch, {
onChange: this.onChange,
value: this.state.checked
});
}
}
/***/ }),
/***/ "./src/ui/contentColumn.js":
/*!*********************************!*\
!*** ./src/ui/contentColumn.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ContentColumn; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_ContentColumn extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
static get displayName() {
return "ContentColumn";
}
render() {
//let contentModule = BDModules.get(e => e.contentColumn)[0]
let title = this.props.title ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.title) : null;
return [title, this.props.children];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, title, this.props.children);
}
}
/***/ }),
/***/ "./src/ui/cssEditor.js":
/*!*****************************!*\
!*** ./src/ui/cssEditor.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cssEditorDetached */ "./src/ui/cssEditorDetached.js");
class V2C_CssEditor extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.props.lines = 0;
self.setInitialState();
self.attach = self.attach.bind(self);
self.detachedEditor = _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__["default"], {
attach: self.attach
});
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.detach = self.detach.bind(self);
}
setInitialState() {
this.state = {
detached: this.props.detached || _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached
};
}
componentDidMount() {
// this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
this.editor.destroy();
}
componentDidUpdate(prevProps, prevState) {
const self = this;
if (prevState.detached && !self.state.detached) {
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.detachedRoot);
}
}
codeMirror() {}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
render() {
const self = this;
const {
detached
} = self.state;
return [detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "editor-detached"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("h3", null, "Editor Detached"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
className: "btn btn-primary",
onClick: () => {
self.attach();
}
}, "Attach")), !detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "editor-wrapper"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-editor",
className: "editor",
ref: "editor"
}, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-attach-controls"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", {
className: "checkbox-group"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_6__["default"], {
id: "live-update",
text: "Live Update",
onChange: this.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("detach");
}
}, "Detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "help-text"
}, "Press ", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("code", {
className: "inline"
}, "ctrl"), "+", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: "inline"
}, ","), " with the editor focused to access the editor's settings."))))];
}
onClick(arg) {
const self = this;
switch (arg) {
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
case "detach":
self.detach();
break;
}
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
detach() {
const self = this;
self.setState({
detached: true
});
const droot = self.detachedRoot;
if (!droot) {
console.log("FAILED TO INJECT ROOT: .app");
return;
}
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(self.detachedEditor, droot);
}
get detachedRoot() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectDetachedRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectDetachedRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-customcss-detach-container">`), app);
return true;
}
attach() {
const self = this;
self.setState({
detached: false
});
}
}
/***/ }),
/***/ "./src/ui/cssEditorDetached.js":
/*!*************************************!*\
!*** ./src/ui/cssEditorDetached.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditorDetached; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
class V2C_CssEditorDetached extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.onChange = self.onChange.bind(self);
}
componentDidMount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = true; // this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor-detached");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = false;
this.editor.destroy();
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
get root() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-customcss-detach-container">`), app);
return true;
}
render() {
const self = this;
return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "bd-detached-css-editor",
id: "bd-customcss-detach-editor"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-innerpane"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "editor-wrapper"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-editor-detached",
className: "editor",
ref: "editor"
}, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-attach-controls"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", {
className: "checkbox-group"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_5__["default"], {
id: "live-update",
text: "Live Update",
onChange: self.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("attach");
}
}, "Attach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on attach")))));
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
onClick(id) {
const self = this;
switch (id) {
case "attach":
if (_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#editor-detached")) self.props.attach();
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.root);
self.root.remove();
break;
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
}
/***/ }),
/***/ "./src/ui/errorBoundary.js":
/*!*********************************!*\
!*** ./src/ui/errorBoundary.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDErrorBoundary; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDErrorBoundary extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
componentDidCatch() {
this.setState({
hasError: true
});
}
render() {
if (this.state.hasError) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "react-error"
}, "Component Error");
return this.props.children;
}
}
const originalRender = BDErrorBoundary.prototype.render;
Object.defineProperty(BDErrorBoundary.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/icons/delete.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/delete.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Delete; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Delete extends React.Component {
render() {
const size = this.props.size || "24px";
return /*#__PURE__*/React.createElement("svg", {
className: this.props.className || "",
fill: "var(--text-normal)",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, /*#__PURE__*/React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), /*#__PURE__*/React.createElement("path", {
d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"
}), /*#__PURE__*/React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/downarrow.jsx":
/*!************************************!*\
!*** ./src/ui/icons/downarrow.jsx ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DownArrow; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class DownArrow extends React.Component {
render() {
const size = this.props.size || "16px";
return /*#__PURE__*/React.createElement("svg", {
className: this.props.className || "",
fill: "var(--text-normal)",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, /*#__PURE__*/React.createElement("path", {
d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/edit.jsx":
/*!*******************************!*\
!*** ./src/ui/icons/edit.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Edit; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Edit extends React.Component {
render() {
const size = this.props.size || "24px";
return /*#__PURE__*/React.createElement("svg", {
className: this.props.className || "",
viewBox: "0 0 24 24",
fill: "var(--text-normal)",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, /*#__PURE__*/React.createElement("path", {
d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"
}), /*#__PURE__*/React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/history.jsx":
/*!**********************************!*\
!*** ./src/ui/icons/history.jsx ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return History; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
{
/* <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="18px" height="18px">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/>
</svg> */
}
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class History extends React.Component {
render() {
const size = this.props.size || "18px";
return /*#__PURE__*/React.createElement("svg", {
viewBox: "0 0 24 24",
fill: "var(--text-normal)",
className: this.props.className || "",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, /*#__PURE__*/React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}), /*#__PURE__*/React.createElement("path", {
d: "M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/search.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/search.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Search extends React.Component {
render() {
const size = this.props.size || "16px";
return /*#__PURE__*/React.createElement("svg", {
className: this.props.className || "",
fill: "var(--text-normal)",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, /*#__PURE__*/React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), /*#__PURE__*/React.createElement("path", {
d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"
}));
}
}
/***/ }),
/***/ "./src/ui/margintop.jsx":
/*!******************************!*\
!*** ./src/ui/margintop.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MarginTop; });
let marginModule = BDModules.get(e => e.marginTop60)[0];
class MarginTop extends React.Component {
render() {
if (!marginModule) marginModule = BDModules.get(e => e.marginTop60)[0];
return /*#__PURE__*/React.createElement("div", {
className: marginModule.marginTop60
});
}
}
/***/ }),
/***/ "./src/ui/presenceSettings.jsx":
/*!*************************************!*\
!*** ./src/ui/presenceSettings.jsx ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let V2C_PresenceSettingsModules;
class V2C_PresenceSettings extends React.Component {
constructor(props) {
super(props);
this.state = {
data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"],
assets: []
};
this.preview = null;
this.isfetching = false;
if (this.state.data.application_id) {
this.fetchAssets();
}
this.assetComponents = new Set();
}
updateWhenFetched(comp) {
this.assetComponents.add(comp);
}
/**
*
* @param {InputText} setting
*/
onChange(setting, value) {
let defaultSetting = RPCProps.find(e => e.id === setting.props.id);
this.setState({
data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, {
[defaultSetting.id]: !!value ? value : null
}),
assets: this.state.assets
});
if (setting.props.id === "application_id") {
this.fetchAssets();
}
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
this.preview.forceUpdate();
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
}
fetchAssets() {
if (this.isfetching === true) {
let app = this.state.data.application_id;
setTimeout(() => {
if (this.state.data.application_id !== app) {
return;
}
this.fetchAssets();
}, 5000);
}
if (!this.state.data.application_id) {
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
return;
}
this.isfetching = true;
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: Object.keys(assets).map(k => {
let asset = assets[k];
return {
id: asset.id,
name: asset.name,
type: asset.type
};
})
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
}).catch(() => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
});
}
updatePreview(data) {
this.setState({
data
});
}
get modules() {
return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.marginBottom20)[0]]);
}
render() {
let [marginModule] = this.modules;
return [/*#__PURE__*/React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
title: "RichPresence Settings",
settings: this.props.settings,
onChange: this.props.onChange
}), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "RichPresence"
}), /*#__PURE__*/React.createElement("div", null, this.optionsComponents), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Preview"
}), /*#__PURE__*/React.createElement(RpcPreview, {
settings: this
})), /*#__PURE__*/React.createElement("div", {
className: marginModule.marginBottom20
}), /*#__PURE__*/React.createElement("button", {
style: {
opacity: 0.01
},
onClick: window.ohgodohfuck
}, "Oh god Oh fuck"), /*#__PURE__*/React.createElement("button", {
style: {
opacity: 0.01
},
onClick: () => {
electron__WEBPACK_IMPORTED_MODULE_7__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4");
}
}, "See ? I pulled a litle sneaky on ya")];
}
get optionsComponents() {
return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {
if (e.type === "text") {
return /*#__PURE__*/React.createElement(InputText, {
setting: e,
manager: this,
id: e.id
});
} else if (e.type === "number") {
let array = [/*#__PURE__*/React.createElement(InputNumber, {
setting: e,
manager: this,
id: e.id
})];
/*
if(e.id === "timestamps.start"){
array.unshift(<DiscordButton title="Copy Current Timestamp" onClick={() => {
DiscordNative.clipboard.copy(Date.now()+"")
}} />)
}*/
return array;
} else if (e.type === "choice") {
if (["assets.small", "assets.large"].includes(e.id)) {
return /*#__PURE__*/React.createElement(InputChoice, {
setting: e,
manager: this,
id: e.id,
choices: [{
value: "none",
label: "No assets"
}].concat(this.state.assets.map(e => {
return {
value: "asset-" + e.id,
label: e.name
};
}))
});
} else {
return "Unknown choice.";
}
}
}));
}
}
const RPCProps = [{
title: "Application ID",
id: "application_id",
type: "number",
placeholder: "711416957718757418"
}, {
title: "Name",
id: "name",
type: "text",
placeholder: "Lightcord"
}, {
title: "Details",
id: "details",
type: "text",
placeholder: "Browsing Discord"
}, {
title: "State",
id: "state",
type: "text",
placeholder: "Lightcord Client"
}, {
title: "Timestamp Start",
id: "timestamps.start",
type: "number",
get placeholder() {
return Date.now();
}
}, {
title: "LargeAsset",
id: "assets.large",
type: "choice"
}, {
title: "SmallAsset",
id: "assets.small",
type: "choice"
}];
let inputTextModules;
class InputText extends React.PureComponent {
get modules() {
if (inputTextModules && inputTextModules[0]) return inputTextModules;
return inputTextModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0]];
}
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id]
};
this.input = /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.TextInput, {
placeholder: setting.placeholder,
name: setting.id,
value: this.state.data,
onChange: value => {
this.setState({
data: value
});
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value);
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data);
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
},
type: "text"
});
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, inputModule, sizeModule2] = this.modules;
return /*#__PURE__*/React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, /*#__PURE__*/React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), this.input), /*#__PURE__*/React.createElement(Divider, null));
}
}
let InputNumberModules;
class InputNumber extends React.PureComponent {
get modules() {
return InputNumberModules || (InputNumberModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], BDModules.get(e => e.colorTransparent)[0]]);
}
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id]
};
this.input = /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.TextInput, {
placeholder: setting.placeholder,
name: setting.id,
value: this.state.data,
type: "number",
onChange: (value, name, input) => {
value = value.replace(/[^\d]+/g, "");
if (value == this.state.data) {
input.setValue(value);
return;
}
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value);
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data);
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
this.setState({
data: value
});
},
type: "text"
});
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules;
return /*#__PURE__*/React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, /*#__PURE__*/React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), this.input, setting.id === "timestamps.start" ? /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
onClick: () => {
DiscordNative.clipboard.copy(Date.now() + "");
},
color: "brand"
}, "Copy current timestamp") : null), /*#__PURE__*/React.createElement(Divider, null));
}
}
let InputChoiceModules;
class InputChoice extends React.PureComponent {
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id] ? "asset-" + this.props.manager.state.data[setting.id] : "none"
};
this.props.manager.updateWhenFetched(this);
}
onChange(data) {
let value = data.value;
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", ""));
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", ""));
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
this.setState({
data: value
});
this.forceUpdate();
}
get modules() {
return InputChoiceModules || (InputChoiceModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0]]);
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules;
let options = this.props.manager.state.assets.map(e => {
return {
value: "asset-" + e.id,
label: e.name
};
});
options.unshift({
value: "none",
label: "No assets"
});
return /*#__PURE__*/React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, /*#__PURE__*/React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, /*#__PURE__*/React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
value: this.state.data,
options: options,
onChange: this.onChange.bind(this)
})), /*#__PURE__*/React.createElement(Divider, null));
}
}
let DividerModules = [];
class Divider extends React.PureComponent {
get modules() {
return DividerModules && DividerModules[0] ? DividerModules : DividerModules = [BDModules.get(e => e.divider && Object.keys(e).length === 1)[0], BDModules.get(e => e.dividerDefault)[0]];
}
render() {
let [divider, dividerDefault] = this.modules;
return /*#__PURE__*/React.createElement("div", {
class: `${divider.divider} ${dividerDefault.dividerDefault}`
});
}
}
class DiscordButton extends React.Component {
render() {
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
let flexModule = BDModules.get(e => e._horizontal)[0];
return /*#__PURE__*/React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, /*#__PURE__*/React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
onClick: this.props.onClick,
color: "brand"
}, this.props.title)));
}
}
class RpcPreview extends React.Component {
constructor(props = {}) {
super(props);
this.state = {
active: "profile"
};
this.tabs = [];
this.props.settings.preview = this;
}
changeTab(tab) {
let ancientTab = this.state.active;
if (ancientTab === tab.props.id) return;
this.tabs.forEach(e => {
e.setActive(false);
});
tab.setActive(true);
this.setState({
active: tab.props.id
});
}
render() {
return /*#__PURE__*/React.createElement("div", {
className: "lc-tabWrapper"
}, /*#__PURE__*/React.createElement("div", {
className: "lc-tabnav",
style: {
flex: "0 1 auto"
}
}, /*#__PURE__*/React.createElement(Tab, {
preview: this,
title: "Full Profile",
id: "profile"
}), /*#__PURE__*/React.createElement(Tab, {
preview: this,
title: "User Popout",
id: "popout"
})), /*#__PURE__*/React.createElement(PresenceErrorCatcher, {
preview: this.preview,
state: this.state.rpc,
props: {
preview: this
},
key: this.state.active
}));
}
isActive(tab) {
return this.state.active === tab;
}
get preview() {
if (this.state.active === "profile") return Profile;
return Popout;
}
}
class Tab extends React.Component {
constructor(props) {
super(props);
this.state = {
active: props.preview.isActive(props.id)
};
props.preview.tabs.push(this);
}
setActive(isActive) {
this.setState({
active: !!isActive
});
}
render() {
let className = `lc-navItem`;
if (this.state.active) {
className += ` lc-navItemActive`;
} else {
className += ` lc-navItemInactive`;
}
return /*#__PURE__*/React.createElement("div", {
className: className,
onClick: () => {
this.props.preview.changeTab(this);
}
}, this.props.title);
}
}
let emptyClasses;
class PresenceErrorCatcher extends React.Component {
componentDidCatch(err, errInfo) {
console.error(err, errInfo);
this.setState({
error: true
});
}
render() {
if (!this.state) {
this.state = {
error: false
};
}
if (!this.state.error) {
try {
const preview = new this.props.preview(this.props.props);
preview.setState(this.props.state);
return preview.render();
} catch (err) {
console.error(err);
this.state.error = true;
return this.render();
}
} else {
emptyClasses = emptyClasses || _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.emptyStateImage && e.emptyState);
if (!emptyClasses) {
_modules_utils__WEBPACK_IMPORTED_MODULE_9__["default"].showToast("An error occured. Please check the console for more informations.");
return null;
}
return /*#__PURE__*/React.createElement("div", {
style: {
margin: "20px"
}
}, /*#__PURE__*/React.createElement("div", {
style: {
backgroundColor: "var(--background-primary)",
padding: "30px 30px",
borderRadius: "8px"
},
className: `lc-tab-box-shadow ${emptyClasses.emptyState}`
}, /*#__PURE__*/React.createElement("div", {
className: emptyClasses.emptyStateImage,
style: {
marginTop: "20px"
}
}), /*#__PURE__*/React.createElement("div", {
className: emptyClasses.emptyStateHeader
}, "An error occured"), /*#__PURE__*/React.createElement("p", {
className: emptyClasses.emptyStateSubtext
}, "Please check the console for more informations. Join our \xAD", /*#__PURE__*/React.createElement("a", {
className: `${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchor} ${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchorUnderlineOnHover}`,
role: "button",
tabindex: 0,
onClick: () => {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].joinLC();
}
}, "support server"), "\xAD for help.")));
}
}
}
let popoutModules;
let UserPopoutComponent;
let PopoutProps;
class Popout extends React.Component {
get modules() {
return popoutModules || (popoutModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "FluxContainer(ForwardRef(SubscribeGuildMembersContainer(UserPopout)))"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]);
}
render() {
let [UserPopout, userModule] = this.modules;
const user = userModule.default.getCurrentUser();
if (!UserPopoutComponent) {
if (!UserPopout) throw new Error(`Couldn't find the UserPopout component.`);
const render1 = new UserPopout.default({
userId: user.id,
guildId: null,
channelId: null,
disableUserProfileLink: true
}).render();
PopoutProps = render1.props;
const render2 = render1.type.render(PopoutProps, null);
const render3 = new render2.type(render2.props).render();
UserPopoutComponent = render3.type;
}
if (!UserPopoutComponent) throw new Error(`Couldn't find the UserPopoutComponent component.`);
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
const activity = function () {
if (!this.game) return null;
let game = {
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name,
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].application_id,
details: this.game.details || undefined,
state: this.game.state || undefined,
timestamps: this.game["timestamps.start"] ? {
start: this.game["timestamps.start"]
} : undefined,
assets: this.game["assets.large"] ? {
large_image: this.game["assets.large"],
small_image: this.game["assets.small"] || undefined
} : undefined,
type: 0
};
return game;
}.call({
game: data
});
PopoutProps = new UserPopout.default({
userId: user.id,
guildId: null,
channelId: null,
disableUserProfileLink: true
}).render().props;
const popout = new UserPopoutComponent(Object.assign({}, PopoutProps, {
activity: activity
})).render().props.children; // bypass tracking
// remove the stop propagation shit.
const container = /*#__PURE__*/React.createElement("div", window.Lightcord.Api._.excludeProperties(popout.props, ["onClick", "onContextMenu"]));
return /*#__PURE__*/React.createElement("div", {
className: "lc-userPopout lc-tab-box-shadow"
}, container);
}
}
let profileModules;
let UserProfileComponent;
let ProfileProps;
let connectedProfileStore;
class Profile extends React.Component {
get modules() {
return profileModules || (profileModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserProfile"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]);
}
render() {
let [UserProfile, userModule] = this.modules;
const user = userModule.default.getCurrentUser();
if (!UserProfileComponent) {
const render1 = new UserProfile.default({
user: user
}).render();
connectedProfileStore = render1.type;
const render2 = new render1.type(render1.props).render();
const render3 = render2.type.render(render2.props, null);
const render4 = new render3.type(render3.props).render();
UserProfileComponent = render4.type;
}
if (!UserProfileComponent) throw new Error(`Couldn't find the UserProfileComponent component.`);
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
const activity = function () {
if (!this.game) return null;
let game = {
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name,
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].application_id,
details: this.game.details || undefined,
state: this.game.state || undefined,
timestamps: this.game["timestamps.start"] ? {
start: this.game["timestamps.start"]
} : undefined,
assets: this.game["assets.large"] ? {
large_image: this.game["assets.large"],
small_image: this.game["assets.small"] || undefined
} : undefined,
type: 0
};
return game;
}.call({
game: data
});
ProfileProps = new connectedProfileStore({
user: user,
close: () => {}
}).render().props;
const profile = new UserProfileComponent(Object.assign({}, ProfileProps, {
activity: activity
})).render().props.children; // bypass tracking
profile.props.style = {
width: "auto"
};
return /*#__PURE__*/React.createElement("div", {
className: "lc-tab lc-tab-box-shadow"
}, profile);
}
}
/*
let popoutModule
class Popout extends React.Component { // TODO: Probably use internal Components instead of making it from scratch.
get modules(){
return popoutModule || (popoutModule = [
BDModules.get(e => e.userPopout)[0],
BDModules.get(e => e._horizontal)[0],
BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0],
BDModules.get(e => e.bot)[0],
BDModules.get(e => e.activityUserPopout)[0],
BDModules.get(e => e.muted && e.wrapper && e.base)[0],
BDModules.get(e => e.size32)[0],
BDModules.get(e => e.themeGhostHairlineChannels)[0],
BDModules.get(e => e.note && Object.keys(e).length === 1)[0],
BDModules.get(e => e.pro && e.inline)[0],
BDModules.get(e => e.colorStandard)[0],
BDModules.get(e => e.default && e.default.Messages)[0].default.Messages,
BDModules.get(e => e.pointerEvents)[0],
BDModules.get(e => e.default && e.default.getCurrentUser)[0].default
])
}
render(){
let [
rootModule1,
flexModule1,
stylingModule1,
nameTagModule1,
activityModule1,
textModule1,
sizeModule1,
scrollerModule1,
noteModule1,
protipModule1,
colorModule1,
Messages,
avatarModule1,
userModule1
] = this.modules
let user = userModule1.getCurrentUser()
let avatarURL = user.avatarURL
if(user.avatar && user.avatar.startsWith("a_")){
avatarURL = user.getAvatarURL("gif")
}
let data = Object.assign({}, defaultRPC, this.props.preview.props.settings.state.data)
timestampClass = timestampClass || activityModule1.timestamp
let images = (() => {
if(!data["assets.large"])return null
let images = []
if(data["assets.large"]){
images.push(<img alt="" src={`https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`} class={`${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}`} />)
}
if(data["assets.small"]){
images.push(<img alt="" src={`https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`} class={activityModule1.assetsSmallImageUserPopout} />)
}
if(!images.length)return null
return <div class={activityModule1.assets}>
{images}
</div>
})()
return (<div className="lc-userPopout lc-tab-box-shadow">
<div class={rootModule1.userPopout} role="dialog" tabindex="-1">
<div class={rootModule1.headerPlaying}>
<div class={`${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`} style={{flex: "1 1 auto"}}>
<div class={rootModule1.avatarWrapperNormal} role="button" tabindex="0">
<div class={avatarModule1} role="img" style={{width: "80px", height: "80px"}}>
<svg width="92" height="80" viewBox="0 0 92 80" class={`${avatarModule1.mask} ${avatarModule1.svg}`}>
<foreignObject x="0" y="0" width="80" height="80" mask="url(#svg-mask-avatar-status-round-80)">
<img src={avatarURL} alt=" " class={avatarModule1.avatar} />
</foreignObject>
<Status />
</svg>
</div>
<svg width="80" height="80" class={rootModule1.avatarHint} viewBox="0 0 80 80">
<foreignObject x="0" y="0" width="80" height="80" mask="url(#svg-mask-avatar-status-round-80)">
<div class={rootModule1.avatarHintInner}>{Messages.VIEW_PROFILE}</div>
</foreignObject>
</svg>
</div>
<div class={rootModule1.headerText}>
<div class={`${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`} style={{flex: "1 1 auto"}}>
<div class={`${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`}>
<span class={`${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`}>{user.username}</span>
<span>#{user.discriminator}</span>
</div>
</div>
</div>
</div>
<div class={`${activityModule1.activityUserPopout} ${rootModule1.activity}`}>
<h3 class={`${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`}>{Messages.USER_ACTIVITY_HEADER_PLAYING}</h3>
<div class={activityModule1.bodyNormal}>
{images}
<div class={images ? activityModule1.contentImagesUserPopout : activityModule1.contentNoImagesUserPopout} style={{flex: "1 1 auto"}}>
{(() => {
if(!data.name)return null
return <h3 class={`${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`} title={data.name}>
<span class={activityModule1.activityName}>{data.name}</span>
</h3>
})()}
{(() => {
if(!data.details)return null
return <div title={data.title} class={activityModule1.details}>{data.details}</div>
})()}
{(() => {
if(!data.state)return null
return <div class={activityModule1.state}>
<span title={data.state}>{data.state}</span>
</div>
})()}
{(() => {
if(!data["timestamps.start"])return null
let timeComponent = timestampRender(Timestamp, Messages)
return (<div class={activityModule1.timestamp}>
{React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
})}
</div>)
})()}
</div>
</div>
</div>
</div>
<div class={`${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`}>
<div class={`${scrollerModule1.scroller} ${rootModule1.bodyInner}`}>
<div class={rootModule1.bodyTitle}>{Messages.NOTE}</div>
<div class={`${noteModule1.note} ${rootModule1.note}`}>
<textarea placeholder={Messages.NOTE_PLACEHOLDER} maxlength="256" autocorrect="off" class={BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline} style={{height: "36px"}} disabled></textarea>
</div>
</div>
</div>
<div class={rootModule1.footer}>
<div class={`${rootModule1.protip} ${protipModule1.inline}`}>
<h3 class={`${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`} style={{color: "rgb(67, 181, 129)"}}>{Messages.PINNED_MESSAGES_PRO_TIP}</h3>
<div class={`${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`}>{Messages.CONTEXT_MENU_HINT}</div>
</div>
</div>
</div>
</div>)
}
}
let StatusModules
class Status extends React.Component {
get modules(){
return StatusModules || (StatusModules = [
BDModules.get(e => e.default && e.default.getPresence)[0],
BDModules.get(e => e.pointerEvents)[0].pointerEvents
])
}
render(){
let [
getPresence,
pointerEvents
] = this.modules
let status = getPresence.default.getPresence().status
if(status === "invisible")status = "offline"
return <rect width="16" height="16" x="60" y="60" fill="#ffffff" mask={`url(#svg-mask-status-${status})`} className={pointerEvents}></rect>
}
}
let timestampClass = ""
let ProfileModules
class Profile extends React.Component { // TODO: Probably use internal Components instead of making it from scratch.
get modules(){
return ProfileModules || (ProfileModules = [
BDModules.get(e => e.flex && e._horizontal)[0],
BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0],
BDModules.get(e => e.topSectionStreaming)[0],
BDModules.get(e => e.pointerEvents)[0],
BDModules.get(e => e.bot)[0],
BDModules.get(e => e.activityProfile)[0],
BDModules.get(e => e.muted && e.wrapper && e.base)[0],
BDModules.get(e => e.size32)[0],
BDModules.get(e => e.scrollerFade)[0],
BDModules.get(e => e.note && Object.keys(e).length === 1)[0],
BDModules.get(e => e.default && e.default.Messages)[0].default.Messages
])
}
render(){
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser()
let avatarURL = user.avatarURL
if(user.avatar && user.avatar.startsWith("a_")){
avatarURL = user.getAvatarURL("gif")
}
let [
flexModule1,
stylingModule1,
rootModule1,
avatarModule1,
nameTagModule1,
activityModule1,
textModule1,
sizeModule1,
scrollerModule1,
noteModule1,
Messages
] = this.modules
let data = Object.assign({}, defaultRPC, this.props.preview.props.settings.state.data)
timestampClass = timestampClass || activityModule1.timestamp
let images = (() => {
if(!data["assets.large"])return null
let images = []
if(data["assets.large"]){
images.push(<img alt="" src={`https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`} class={`${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}`} />)
}
if(data["assets.small"]){
images.push(<img alt="" src={`https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`} class={activityModule1.assetsSmallImageProfile} />)
}
if(!images.length)return null
return <div class={activityModule1.assets}>
{images}
</div>
})()
return [
<div className="lc-tab lc-tab-box-shadow">
<div class={`${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`} style={{flex: "1 1 auto"}}>
<div class={rootModule1.topSectionPlaying}>
<header class={rootModule1.header}>
<div class={`${rootModule1.avatar} ${avatarModule1.wrapper}`} role="img" style={{width: "80px", height: "80px"}}>
<svg width="92" height="80" viewBox="0 0 92 80" class={`${avatarModule1.mask} ${avatarModule1.svg}`}>
<foreignObject x="0" y="0" width="80" height="80" mask="url(#svg-mask-avatar-status-round-80)">
<img src={avatarURL} alt=" " class={avatarModule1.avatar} />
</foreignObject>
<Status />
</svg>
</div>
<div class={`${rootModule1.headerInfo}`}>
<div class={`${rootModule1.nameTag} ${nameTagModule1.nameTag}`}>
<span class={`${rootModule1.username} ${rootModule1.username}`}>{user.username}</span>
<span class={rootModule1.discriminator}>#{user.discriminator}</span>
</div>
<div class={`${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`} style={{flex: "1 1 auto"}}>
<Badges />
</div>
</div>
</header>
<div class={rootModule1.headerFill}>
<div class={`${activityModule1.activityProfile} ${rootModule1.activity}`}>
<h3 class={`${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`}>
{Messages.USER_ACTIVITY_HEADER_PLAYING}
</h3>
<div class={activityModule1.bodyNormal}>
{images}
<div class={images ? activityModule1.contentImagesProfile : activityModule1.contentNoImagesUserPopout} style={{flex: "1 1 auto"}}>
{(() => {
if(!data.name)return null
return <h3 class={`${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`} title={data.name}>
<span class={activityModule1.activityName}>{data.name}</span>
</h3>
})()}
{(() => {
if(!data.details)return null
return <div title={data.title} class={activityModule1.details}>{data.details}</div>
})()}
{(() => {
if(!data.state)return null
return <div class={activityModule1.state}>
<span title={data.state}>{data.state}</span>
</div>
})()}
{(() => {
if(!data["timestamps.start"])return null
let timeComponent = timestampRender(Timestamp, Messages)
return (<div class={activityModule1.timestamp}>
{React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
})}
</div>)
})()}
</div>
</div>
</div>
</div>
</div>
<div class={rootModule1.body}>
<div class={`${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`}>
<div class={scrollerModule1.scroller}>
<div class={rootModule1.userInfoSection}>
<div class={rootModule1.userInfoSectionHeader}>{Messages.NOTE}</div>
<div class={`${rootModule1.note} ${noteModule1.note}`}>
<textarea placeholder={Messages.NOTE_PLACEHOLDER} maxlength="256" autocorrect="off"
class={BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline} style={{height: "40px"}} disabled>
</textarea>
</div>
</div>
<ConnectedAccounts />
</div>
</div>
</div>
</div>
</div>
]
}
}
class ConnectedAccounts extends React.Component {
render(){
let accounts = []
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0]
let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default
let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1)
for(let acc of accs){
accounts.push(<ConnectedAccount acc={acc} />)
}
if(accounts.length > 0){
return (<div class={rootModule1.userInfoSection}>
<div class={rootModule1.connectedAccounts}>
{accounts}
</div>
</div>)
}
return null
}
}
class ConnectedAccount extends React.Component {
render(){
let [
flexModule1,
stylingModule1,
rootModule1,
flowerModule1,
anchorModule1,
SocialConstants
] = [
BDModules.get(e => e.flex && e._horizontal)[0],
BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0],
BDModules.get(e => e.topSectionStreaming)[0],
BDModules.get(e => e.flowerStarContainer)[0],
BDModules.get(e => e.anchor)[0],
BDModules.get(e => e.default && e.default.get && e.default.map)[0].default
]
let acc = this.props.acc
let constantsSocial = SocialConstants.get(acc.type)
return (<div class={`${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`} style={{flex: "0 1 auto"}}>
<img alt={`Logo ${constantsSocial.name}`} class={rootModule1.connectedAccountIcon} src={constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey} />
<div class={rootModule1.connectedAccountNameInner}>
<div class={rootModule1.connectedAccountName}>{acc.name}</div>
{acc.verified ? (<span>
<div class={`${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`} style={{width: "16px", height: "16px"}}>
<svg class={flowerModule1.flowerStar} width="16" height="16" viewBox="0 0 16 15.2">
<path fill="#4f545c" fill-rule="evenodd" d="m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"></path>
</svg>
<div class={flowerModule1.childContainer}>
<svg width="16" height="16" viewBox="0 0 16 15.2">
<path d="M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z" fill="#ffffff"></path>
</svg>
</div>
</div>
</span>) : null}
</div>
<a class={`${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`} rel="noreferrer noopener" target="_blank" role="button" tabindex="0">
<svg class={rootModule1.connectedAccountOpenIcon} width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z"></path>
<path fill="currentColor" d="M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z"></path>
</svg>
</a>
</div>)
}
}
class Badges extends React.Component {
render(){
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser()
let rootModule = BDModules.get(e => e.topSectionStreaming)[0]
let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags
let badges = []
let serialized = []
for(let flagName in UserFlags){
if(user.hasFlag(UserFlags[flagName]))serialized.push(flagName)
}
for(let flagName of serialized){
let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase()+e.slice(1)).join("")}`
searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline")
if(!rootModule[searchable])continue
badges.push(<Badge name={searchable}/>)
}
if(user.hasPremiumSubscription){
badges.push(<Badge name="profileBadgePremium" />)
}
return badges
}
}
class Badge extends React.Component {
render(){
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0]
return (<div class={rootModule1.profileBadgeWrapper}>
<div>
<div class="" role="button" tabindex="0">
<div class={`${rootModule1.profileBadge} ${rootModule1[this.props.name]}`}>
</div>
</div>
</div>
</div>)
}
}
class Timestamp extends React.Component {
render(){
return <div className={timestampClass}>
{this.props.message}
</div>
}
}*/
/***/ }),
/***/ "./src/ui/publicservers/layer.js":
/*!***************************************!*\
!*** ./src/ui/publicservers/layer.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js");
class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.keyupListener = this.keyupListener.bind(this);
}
keyupListener(e) {
if (e.which === 27) {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode);
}
}
componentDidMount() {
window.addEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
thisNode.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
thisNode.style.transform = "";
thisNode.style.opacity = "";
});
}
}
});
}
componentWillUnmount() {
window.removeEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
thisNode.style.opacity = 1 - progress;
if (progress == 1) {
setImmediate(() => {
thisNode.remove();
});
}
}
});
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen");
layer.classList.remove("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
layer.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
layer.style.transform = "";
layer.style.opacity = "";
});
}
}
});
}
componentWillMount() {
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]");
layer.classList.add("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
layer.style.opacity = 1 - progress;
}
});
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer,
id: this.props.id,
ref: "root",
style: {
opacity: 0,
transform: "scale(1.1) translateZ(0px)"
}
}, this.props.children);
}
}
/***/ }),
/***/ "./src/ui/publicservers/publicServers.js":
/*!***********************************************!*\
!*** ./src/ui/publicservers/publicServers.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js");
/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js");
/* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js");
class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.close = this.close.bind(this);
this.changeCategory = this.changeCategory.bind(this);
this.search = this.search.bind(this);
this.searchKeyDown = this.searchKeyDown.bind(this);
this.checkConnection = this.checkConnection.bind(this);
this.join = this.join.bind(this);
this.connect = this.connect.bind(this);
this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]);
this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]);
this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
}
componentDidMount() {
this.checkConnection();
}
setInitialState() {
this.state = {
selectedCategory: -1,
title: "Loading...",
loading: true,
servers: [],
next: null,
connection: {
state: 0,
user: null
}
};
}
close() {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
}
search(query, clear) {
const self = this;
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
method: "get"
}).then(async res => {
if (res.status !== 200) throw await res.text();
let data = await res.json();
let servers = data.results.reduce((arr, server) => {
server.joined = false;
arr.push(server); // arr.push(<ServerCard server={server} join={self.join}/>);
return arr;
}, []);
if (!clear) {
servers = self.state.servers.concat(servers);
} else {//servers.unshift(self.bdServer);
}
let end = data.size + data.from;
data.next = `?from=${end}`;
if (self.state.term) data.next += `&term=${self.state.term}`;
if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
if (end >= data.total) {
end = data.total;
data.next = null;
}
let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;
if (self.state.term) title += ` for ${self.state.term}`;
self.setState({
loading: false,
title: title,
servers: servers,
next: data.next
});
if (clear) {
//console.log(self);
self.refs.sbv.refs.contentScroller.scrollTop = 0;
}
}).catch(err => {
console.error(err);
return self.setState({
loading: false,
title: "Failed to load servers. Check console for details"
});
});
}
async join(serverCard) {
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
serverCard.setState({
joined: true
});
}
connect() {
const self = this;
const options = self.windowOptions;
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
self.joinWindow.webContents.on("did-navigate", (event, url) => {
if (url != "https://auth.discordservers.com/info") return;
self.joinWindow.close();
self.checkConnection();
});
self.joinWindow.loadURL(url);
}
get windowOptions() {
return {
width: 500,
height: 550,
backgroundColor: "#282b30",
show: true,
resizable: false,
maximizable: false,
minimizable: false,
alwaysOnTop: true,
frame: false,
center: false,
webPreferences: {
nodeIntegration: false
}
};
}
get bdServer() {
const server = {
name: "BetterDiscord",
online: "7500+",
members: "20000+",
categories: ["community", "programming", "support"],
description: "Official BetterDiscord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
nativejoin: true,
invite_code: "0Tmfo5ZbORCRqbAd",
pinned: true
};
const server2 = {
name: "Lightcord",
online: "30+",
members: "50+",
categories: ["community", "programming", "support"],
description: "Official Lightcord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4",
nativejoin: true,
invite_code: "7eFff2A",
pinned: true
};
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server2,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
})];
}
get endPoint() {
return "https://search.discordservers.com";
}
get joinEndPoint() {
return "https://j.discordservers.com";
}
get connectEndPoint() {
return "https://join.discordservers.com/connect";
}
async checkConnection() {
const self = this;
try {
const response = await fetch(`https://auth.discordservers.com/info`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
const data = await response.json();
self.setState({
selectedCategory: 0,
connection: {
state: 2,
user: data
}
});
self.search("", true);
} catch (error) {
console.error(error);
self.setState({
title: "Not connected to discordservers.com!",
loading: true,
selectedCategory: -1,
connection: {
state: 1,
user: null
}
});
}
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], {
ref: "sbv"
}, this.component);
}
get component() {
return {
sidebar: {
component: this.sidebar
},
content: {
component: this.content
},
tools: {
component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "pt",
ref: "tools",
onClick: this.close
})
}
};
}
get sidebar() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebar",
key: "ps"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar SIDE"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header",
style: {
fontSize: "16px"
}
}, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Categories"
}), this.categoryButtons.map((value, index) => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], {
id: index,
onClick: this.changeCategory,
key: index,
text: value,
selected: this.state.selectedCategory === index
});
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection));
}
get searchInput() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-text-input flex-vertical",
style: {
width: "172px",
marginLeft: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
ref: "searchinput",
onKeyDown: this.searchKeyDown,
onChange: () => {},
type: "text",
className: "input default",
placeholder: "Search...",
maxLength: "50"
})));
}
searchKeyDown(e) {
const self = this;
if (self.state.loading || e.which !== 13) return;
self.setState({
loading: true,
title: "Loading...",
term: e.target.value
});
let query = `?term=${e.target.value}`;
if (self.state.selectedCategory !== 0) {
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
}
self.search(query, true);
}
get categoryButtons() {
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
}
changeCategory(id) {
const self = this;
if (self.state.loading) return;
self.refs.searchinput.value = "";
self.setState({
loading: true,
selectedCategory: id,
title: "Loading...",
term: null
});
if (id === 0) {
self.search("", true);
return;
}
self.search(`?category=${self.categoryButtons[id]}`, true);
}
get content() {
const self = this;
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
if (self.state.connection.state === 1) return self.notConnected;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
ref: "content",
key: "pc",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}), self.bdServer, self.state.servers.map(server => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
key: server.identifier,
server: server,
join: self.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
});
}), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
onClick: () => {
if (self.state.loading) return;
self.setState({
loading: true
});
self.search(self.state.next, false);
},
className: "ui-button filled brand small grow",
style: {
width: "100%",
marginTop: "10px",
marginBottom: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}))];
}
get notConnected() {
const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "ncc",
ref: "content",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
onClick: self.connect,
type: "button",
className: "ui-button filled brand small grow",
style: {
display: "inline-block",
minHeight: "18px",
marginLeft: "10px",
lineHeight: "14px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Connect"))), self.bdServer)];
}
get footer() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", {
href: "https://discordservers.com",
target: "_blank"
}, "Discordservers.com"));
}
get connection() {
const self = this;
const {
connection
} = self.state;
if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null);
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", {
style: {
color: "#b9bbbe",
fontSize: "10px",
marginLeft: "10px"
}
}, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
style: {
padding: "5px 10px 0 10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
style: {
width: "100%",
minHeight: "20px"
},
type: "button",
className: "ui-button filled brand small grow"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents",
onClick: self.connect
}, "Reconnect"))));
}
}
/***/ }),
/***/ "./src/ui/publicservers/serverCard.js":
/*!********************************************!*\
!*** ./src/ui/publicservers/serverCard.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;
this.state = {
imageError: false,
joined: this.props.guildList.includes(this.props.server.identifier)
};
}
render() {
const {
server
} = this.props;
let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0];
let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0];
let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to
{
className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}`
}, // BDV2.react.createElement(
// "div",
// { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" },
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", {
ref: "img",
className: "bd-server-image",
src: server.iconUrl,
onError: this.handleError.bind(this),
draggable: false
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.flexChild + " bd-server-content"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"
}, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"
}, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG scroller bd-server-description"
}, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flexChild-faoVW3 bd-server-tags",
style: {
flex: "1 1 auto"
}
}, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#3ac15c"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#c13a3a"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",
style: {
minHeight: "12px",
marginTop: "4px"
},
onClick: () => {
this.join();
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Join")))) // )
);
}
handleError() {
this.props.server.iconUrl = this.props.fallback;
this.setState({
imageError: true
});
}
join() {
this.props.join(this); //this.setState({joined: true});
}
}
/***/ }),
/***/ "./src/ui/publicservers/sidebarView.js":
/*!*********************************************!*\
!*** ./src/ui/publicservers/sidebarView.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js");
class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
sidebar,
content,
tools
} = this.props.children;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "standardSidebarView-3F1I7i ui-standard-sidebar-view"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebarRegion-VFTUkN sidebar-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "sidebarScroller",
ref: "sidebarScroller",
sidebar: true,
fade: sidebar.fade || true,
dark: sidebar.dark || true
}, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentRegion-3nDuYy content-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentTransitionWrap-3hqOEW content-transition-wrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",
ref: "contentScroller"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"
}, content.component), tools.component)))));
}
}
/***/ }),
/***/ "./src/ui/reloadIcon.js":
/*!******************************!*\
!*** ./src/ui/reloadIcon.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 24 24",
fill: "#dcddde",
className: "bd-reload " + this.props.className,
onClick: this.props.onClick,
style: {
width: this.props.size || "24px",
height: this.props.size || "24px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/scroller.js":
/*!****************************!*\
!*** ./src/ui/scroller.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
//scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y
let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0];
let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0];
let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`;
let scrollerClass = scrollerModule1.scroller + " scroller";
/* fuck */
if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`;
if (this.props.contentColumn) {
scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller";
/* fuck */
wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`;
}
const {
children
} = this.props;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scrollerwrap",
className: wrapperClass
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scroller",
ref: "scroller",
className: scrollerClass
}, children));
}
}
const originalRender = V2C_Scroller.prototype.render;
Object.defineProperty(V2C_Scroller.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/sectionedSettingsPanel.js":
/*!******************************************!*\
!*** ./src/ui/sectionedSettingsPanel.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return this.props.sections.map((section, i) => {
return [i !== 0 ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_margintop__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
onChange: this.props.onChange
}))];
});
}
}
/***/ }),
/***/ "./src/ui/settingsGroup.js":
/*!*********************************!*\
!*** ./src/ui/settingsGroup.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
title,
settings,
button
} = this.props;
const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: button.onClick
}, button.title) : null;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: title
}), buttonComponent, settings.map(setting => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.props.onChange(id, checked);
}
});
})];
}
}
/***/ }),
/***/ "./src/ui/settingsTitle.js":
/*!*********************************!*\
!*** ./src/ui/settingsTitle.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
} //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.text);
}
}
/***/ }),
/***/ "./src/ui/switch.js":
/*!**************************!*\
!*** ./src/ui/switch.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
let classnames = [];
function getClassName(name) {
let className = classnames.find(e => e.startsWith(name + "-"));
if (className) return className;
className = BDModules.get(e => e.name)[0];
classnames.push(className);
return className;
}
class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
}
onChange() {
this.props.checked = !this.props.checked;
this.props.onChange(this.props.id, this.props.checked);
}
render() {
let {
text,
info
} = this.props.data;
if (!classnames.find(e => e.startsWith("beta-"))) {
classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta);
}
if (this.props.data.experimental) {
info = [info, React.createElement("sup", {
className: getClassName("beta")
}, "(EXPERIMENTAL)")];
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", {
className: "ui-form-title h3 margin-reset margin-reset ui-flex-child"
}, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], {
onChange: this.onChange,
checked: this.props.checked
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-text style-description margin-top-4",
style: {
flex: "1 1 auto"
}
}, info));
}
}
/***/ }),
/***/ "./src/ui/tabBarHeader.js":
/*!********************************!*\
!*** ./src/ui/tabBarHeader.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, this.props.text, this.props.button);
}
}
/***/ }),
/***/ "./src/ui/tabBarItem.js":
/*!******************************!*\
!*** ./src/ui/tabBarItem.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.onClick = this.onClick.bind(this);
}
setInitialState() {
this.state = {
selected: this.props.selected || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`,
onClick: this.onClick
}, this.props.text);
}
onClick() {
if (this.props.onClick) {
this.props.onClick(this.props.id);
}
}
}
/***/ }),
/***/ "./src/ui/tabBarSeparator.js":
/*!***********************************!*\
!*** ./src/ui/tabBarSeparator.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-separator margin-top-8 margin-bottom-8"
});
}
}
/***/ }),
/***/ "./src/ui/timestampRender.js":
/*!***********************************!*\
!*** ./src/ui/timestampRender.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
const intervalModule1 = BDModules.get(e => e.Interval)[0];
/* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) {
class TimeRender extends React.PureComponent {
constructor(props) {
super(props);
this._interval = new intervalModule1.Interval();
this.state = Object.assign({}, this.getUpdatedTime());
}
componentDidMount() {
let self = this;
this._interval.start(1e3, function () {
return self.setState(self.getUpdatedTime());
});
}
componentWillUnmount() {
this._interval.stop();
}
componentDidUpdate(activity) {
if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return;
this.setState(this.getUpdatedTime());
}
getUpdatedTime() {
let timestamps = this.props.timestamps;
let now = Date.now() / 1e3;
if (null != timestamps.end) {
return this.getDiff(now, checkUnix(timestamps.end) / 1e3);
}
if (null != timestamps.start) {
return this.getDiff(checkUnix(timestamps.start) / 1e3, now);
}
return {
hours: 0,
minutes: 0,
seconds: 0
};
}
renderTime(number, removeZero) {
if (removeZero === undefined) removeZero = false;
if (removeZero && number <= 0) return -1;
if (number < 10) return "0" + number;
return number;
}
getDiff(timestamp, now) {
let hours = Math.max(now - timestamp, 0);
let seconds = Math.floor(hours) % 60;
let minutes = Math.floor(hours / 60) % 60;
return {
hours: Math.floor(hours / 3600) % 24,
minutes,
seconds
};
}
render() {
let props = this.props;
let timestamps = props.timestamps;
let usedProps = function (props, items) {
if (null == props) return {};
let timestamps = {};
let keys = Object.keys(props);
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
if (!items.indexOf(key) >= 0) {
timestamps[key] = props[key];
}
}
return timestamps;
}(props, ["timestamps"]);
let state = this.state;
let hours = state.hours;
let minutes = state.minutes;
let seconds = state.seconds;
let data = {
hours: this.renderTime(hours, !0),
minutes: this.renderTime(minutes),
seconds: this.renderTime(seconds)
};
if (timestamps.end !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data)
}));
}
if (timestamps.start !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data)
}));
}
return null;
}
}
return TimeRender;
});
;
function checkUnix(e) {
return ("" + e).length < 13 ? 1e3 * e : e;
}
/***/ }),
/***/ "./src/ui/tools.js":
/*!*************************!*\
!*** ./src/ui/tools.js ***!
\*************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
}
render() {
let toolsModule = BDModules.get(e => e.toolsContainer)[0];
let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools-container " + toolsModule.toolsContainer
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools " + toolsModule.tools
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: containerModule.container
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "btn-close " + containerModule.closeButton,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "esc-text " + containerModule.keybind
}, "ESC"))));
}
onClick() {
if (this.props.onClick) {
this.props.onClick();
}
const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]);
if (closeButton) closeButton.click();
}
}
/***/ }),
/***/ "./src/ui/tooltip.js":
/*!***************************!*\
!*** ./src/ui/tooltip.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; });
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/**
* Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.
* Will also remove themselves if the node to watch is removed from DOM through
* a MutationObserver.
*
* Note this is not using Discord's internals but normal DOM manipulation and emulates
* Discord's own tooltips as closely as possible.
*
* @module EmulatedTooltip
* @version 0.0.1
*/
//<div class="layer-v9HyYc disabledPointerEvents-1ptgTB" style="position: absolute; left: 237px; bottom: 51px;">
// <div class="tooltip-2QfLtc tooltipTop-XDDSxx tooltipBlack-PPG47z tooltipDisablePointerEvents-3eaBGN" style="opacity: 1; transform: none;">
// <div class="tooltipPointer-3ZfirK"></div>
// <div class="tooltipContent-bqVLWK">User Settings</div>
// </div>
//</div>
//<div class="layer-v9HyYc" style="top: 860px; left: 632.5px;">
// <div class="tooltip-2QfLtc tooltipBlack-PPG47z tooltipTop-XDDSxx">
// <div class="tooltipPointer-3ZfirK"></div>
// Changelog
// </div>
//</div>
let TooltipClasses;
function getTooltipClasses() {
if (TooltipClasses) return TooltipClasses;
return TooltipClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("tooltip", "tooltipBlack");
}
let TooltipLayers;
function getTooltipLayers() {
if (TooltipLayers) return TooltipLayers;
return TooltipLayers = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("layer", "layerContainer");
}
const getClass = function (sideOrColor) {
const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1);
const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`];
if (tooltipClass) return tooltipClass;
return null;
};
const classExists = function (sideOrColor) {
return getClass(sideOrColor) ? true : false;
};
const toPx = function (value) {
return `${value}px`;
};
/* <div class="layer-v9HyYc da-layer" style="left: 234.5px; bottom: 51px;">
<div class="tooltip-2QfLtc da-tooltip tooltipTop-XDDSxx tooltipBlack-PPG47z">
<div class="tooltipPointer-3ZfirK da-tooltipPointer"></div>
User Settings
</div>
</div> */
class EmulatedTooltip {
/**
*
* @constructor
* @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on
* @param {string} tip - string to show in the tooltip
* @param {object} options - additional options for the tooltip
* @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)
* @param {string} [options.side=top] - can be any of top, right, bottom, left
* @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen
* @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover
*/
constructor(node, text, options = {}) {
const {
style = "black",
side = "top",
preventFlip = false,
disabled = false
} = options;
this.node = node instanceof jQuery ? node[0] : node;
this.label = text;
this.style = style.toLowerCase();
this.side = side.toLowerCase();
this.preventFlip = preventFlip;
this.disabled = disabled;
if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`);
if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`);
this.element = document.createElement("div");
this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents;
this.tooltipElement = document.createElement("div");
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement = document.createElement("div");
this.labelElement.className = getTooltipClasses().tooltipContent;
const pointerElement = document.createElement("div");
pointerElement.className = getTooltipClasses().tooltipPointer;
this.tooltipElement.append(pointerElement);
this.tooltipElement.append(this.labelElement);
this.element.append(this.tooltipElement);
this.node.addEventListener("mouseenter", () => {
if (this.disabled) return;
this.show();
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(this.node) > -1;
const parentMatch = nodes.some(parent => parent.contains(this.node));
if (directMatch || parentMatch) {
this.hide();
observer.disconnect();
}
});
});
observer.observe(document.body, {
subtree: true,
childList: true
});
});
this.node.addEventListener("mouseleave", () => {
this.hide();
});
}
/** Container where the tooltip will be appended. */
get container() {
return document.querySelector("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]);
}
/** Boolean representing if the tooltip will fit on screen above the element */
get canShowAbove() {
return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0;
}
/** Boolean representing if the tooltip will fit on screen below the element */
get canShowBelow() {
return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight;
}
/** Boolean representing if the tooltip will fit on screen to the left of the element */
get canShowLeft() {
return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0;
}
/** Boolean representing if the tooltip will fit on screen to the right of the element */
get canShowRight() {
return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth;
}
/** Hides the tooltip. Automatically called on mouseleave. */
hide() {
this.element.remove();
this.tooltipElement.className = this._className;
}
/** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */
show() {
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement.textContent = this.label;
this.container.append(this.element);
if (this.side == "top") {
if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow();
}
if (this.side == "bottom") {
if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove();
}
if (this.side == "left") {
if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight();
}
if (this.side == "right") {
if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft();
}
}
/** Force showing the tooltip above the node. */
showAbove() {
this.tooltipElement.classList.add(getClass("top"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));
this.centerHorizontally();
}
/** Force showing the tooltip below the node. */
showBelow() {
this.tooltipElement.classList.add(getClass("bottom"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));
this.centerHorizontally();
}
/** Force showing the tooltip to the left of the node. */
showLeft() {
this.tooltipElement.classList.add(getClass("left"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));
this.centerVertically();
}
/** Force showing the tooltip to the right of the node. */
showRight() {
this.tooltipElement.classList.add(getClass("right"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));
this.centerVertically();
}
centerHorizontally() {
const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2;
this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2));
}
centerVertically() {
const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2;
this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2));
}
}
/***/ }),
/***/ "./src/ui/tooltipWrap.js":
/*!*******************************!*\
!*** ./src/ui/tooltipWrap.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js");
/* harmony default export */ __webpack_exports__["default"] = (class extends React.Component {
constructor(props) {
super(props);
}
async componentDidMount() {
const {
style = "black",
side = "top",
text = ""
} = this.props;
this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this);
this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, {
style,
side
});
}
componentWillUnmount() {
this.tooltip.hide();
delete this.tooltip;
}
render() {
return this.props.children;
}
});
/***/ }),
/***/ "./src/ui/xSvg.js":
/*!************************!*\
!*** ./src/ui/xSvg.js ***!
\************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 12 12",
style: {
width: "18px",
height: "18px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", {
className: "background",
fill: "none",
fillRule: "evenodd"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M0 0h12v12H0"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
className: "fill",
fill: "#dcddde",
d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"
})));
}
}
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("crypto");
/***/ }),
/***/ "electron":
/*!***************************!*\
!*** external "electron" ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("electron");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("events");
/***/ }),
/***/ "fs":
/*!*********************!*\
!*** external "fs" ***!
\*********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("fs");
/***/ }),
/***/ "mkdirp":
/*!*************************!*\
!*** external "mkdirp" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("mkdirp");
/***/ }),
/***/ "module":
/*!*************************!*\
!*** external "module" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("module");
/***/ }),
/***/ "node-fetch":
/*!*****************************!*\
!*** external "node-fetch" ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("node-fetch");
/***/ }),
/***/ "path":
/*!***********************!*\
!*** external "path" ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("path");
/***/ }),
/***/ "rimraf":
/*!*************************!*\
!*** external "rimraf" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("rimraf");
/***/ }),
/***/ "yauzl":
/*!************************!*\
!*** external "yauzl" ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("yauzl");
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGltZXN0YW1wUmVuZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1rZGlycFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJpbXJhZlwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJ5YXV6bFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJiYmRDaGFuZ2Vsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsInR5cGUiLCJpdGVtcyIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImV4cGVyaW1lbnRhbCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImRlZmF1bHRDb29raWUiLCJzZXR0aW5nc0Nvb2tpZSIsInNldHRpbmdzUlBDIiwiZGVmYXVsdFJQQyIsIkRhdGUiLCJub3ciLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwibWV0aG9kcyIsInNldENvbmZpZyIsInNldE1ldGhvZHMiLCJpbml0IiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsImZvb3RlciIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwibSIsIkRpc3BhdGNoZXIiLCJkaXNwYXRjaCIsIkFjdGlvblR5cGVzIiwic29ja2V0SWQiLCJwaWQiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0IiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsImNzcyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmlsdGVyIiwiV2VicGFja01vZHVsZXMiLCJmaW5kIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJwcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkJldHRlckRpc2NvcmQiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiZXZlbnROYW1lIiwiYXJncyIsImVtaXQiLCJvZmYiLCJldmVudEFjdGlvbiIsInJlbW92ZUxpc3RlbmVyIiwic2VsZWN0b3JzIiwicmVtb3ZlRGEiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJ1c2VyU2V0dGluZ3NBY2NvdW50IiwiY2hpbGRyZW4iLCJwdXNoIiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ2aWV3Qm9keSIsInVzZXJTZXR0aW5nc1NlY3VyaXR5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwiam9pbiIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInBhdGNoQ2xhc3NNb2R1bGVzIiwibm9ybWFsaXplRWxlbWVudCIsInBhdGNoRE9NTWV0aG9kcyIsIm1vZHVsZXMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsInNwbGl0IiwiY29tcG9uZW50TmFtZSIsImNsYXNzTmFtZXMiLCJjbGFzc0xpc3QiLCJub3JtYWxDbGFzcyIsImNhbWVsQ2FzZSIsInMiLCJpIiwidG9VcHBlckNhc2UiLCJzbGljZSIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInRvUmVtb3ZlIiwicmVtb3ZlIiwiY29udGFpbnMiLCJET01Ub2tlbkxpc3QiLCJ0b2tlbiIsInRva2VucyIsInQiLCJDb2xvcmVkVGV4dCIsImluamVjdENvbG9yZWRUZXh0IiwiY2FuY2VsQ29sb3JlZFRleHQiLCJNZXNzYWdlQ29tcG9uZW50IiwiYmVmb3JlIiwibWV0aG9kQXJndW1lbnRzIiwiY2hpbGRyZW5NZXNzYWdlQ29udGVudCIsIm1lc3NhZ2VDb250ZW50IiwiZGlzcGxheU5hbWUiLCJvcmlnaW5hbFR5cGUiLCJfX29yaWdpbmFsTWV0aG9kIiwicm9sZUNvbG9yIiwiY29sb3JTdHJpbmciLCJzdHlsZSIsImNvbG9yIiwiYXNzaWduIiwicmVtb3ZlQ29sb3JlZFRleHQiLCJjbGFzc05hbWVNYXJrdXAiLCJtYXJrdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsImVsZW0iLCJzZXRQcm9wZXJ0eSIsInBhdGgiLCJmcyIsIk1vZHVsZSIsImdsb2JhbFBhdGhzIiwicmVzb2x2ZSIsInJlbW90ZSIsImFwcCIsImdldEFwcFBhdGgiLCJNZXRhRXJyb3IiLCJvcmlnaW5hbEpTUmVxdWlyZSIsIl9leHRlbnNpb25zIiwib3JpZ2luYWxDU1NSZXF1aXJlIiwic3BsaXRSZWdleCIsImVzY2FwZWRBdFJlZ2V4IiwiYWRkb25DYWNoZSIsInRpbWVDYWNoZSIsIndhdGNoZXJzIiwicGF0Y2hFeHRlbnNpb25zIiwiZ2V0Q29udGVudFJlcXVpcmUiLCJwbHVnaW5zRm9sZGVyIiwiX3BsdWdpbnNGb2xkZXIiLCJyZWFscGF0aFN5bmMiLCJkYXRhUGF0aCIsInRoZW1lc0ZvbGRlciIsIl90aGVtZXNGb2xkZXIiLCJsb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSIsImRhdGFTdG9yZSIsImdldFNldHRpbmdHcm91cCIsInNldFNldHRpbmdHcm91cCIsImVuY3J5cHRTZXR0aW5nc0NhY2hlIiwiSlNPTiIsInBhcnNlIiwiZGVjcnlwdFNldHRpbmdzQ2FjaGUiLCJoYXNoIiwicmVzdWx0Iiwic3VzcGVjdCIsInNhdmVBZGRvbkNhY2hlIiwic3RyaW5naWZ5Iiwid2F0Y2hDb250ZW50IiwiY29udGVudFR5cGUiLCJpc1BsdWdpbiIsImJhc2VGb2xkZXIiLCJmaWxlRW5kaW5nIiwid2F0Y2giLCJwZXJzaXN0ZW50IiwiZXZlbnRUeXBlIiwiZmlsZW5hbWUiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJzdGF0U3luYyIsImVyciIsImNvZGUiLCJ1bmxvYWRQbHVnaW4iLCJ1bmxvYWRUaGVtZSIsImlzRmlsZSIsInN0YXRzIiwibXRpbWUiLCJnZXRUaW1lIiwibG9hZFBsdWdpbiIsImxvYWRUaGVtZSIsInJlbG9hZFBsdWdpbiIsInJlbG9hZFRoZW1lIiwidW53YXRjaENvbnRlbnQiLCJjbG9zZSIsImV4dHJhY3RNZXRhIiwiZmlyc3RMaW5lIiwiaGFzT2xkTWV0YSIsInBhcnNlT2xkTWV0YSIsImhhc05ld01ldGEiLCJwYXJzZU5ld01ldGEiLCJtZXRhIiwicmF3TWV0YSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInBhcnNlZCIsImZvcm1hdCIsImJsb2NrIiwib3V0IiwiZmllbGQiLCJhY2N1bSIsImxpbmUiLCJjaGFyQXQiLCJsIiwic3Vic3RyIiwic2VsZiIsIm9yaWdpbmFsUmVxdWlyZSIsInBvc3NpYmxlUGF0aCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsInN0cmlwQk9NIiwiYWRkZWQiLCJhdGltZU1zIiwibW9kaWZpZWQiLCJtdGltZU1zIiwic2l6ZSIsIl9jb21waWxlIiwiZGlkRXhwb3J0IiwiaXNFbXB0eSIsImV4cG9ydHMiLCJtYWtlUGxhY2Vob2xkZXJQbHVnaW4iLCJnZXROYW1lIiwiZ2V0QXV0aG9yIiwiZ2V0RGVzY3JpcHRpb24iLCJzb3VyY2UiLCJ3ZWJzaXRlIiwibG9hZENvbnRlbnQiLCJwcm9jZXNzRmlsZSIsInRpbWVzdGFtcCIsImZpbGUiLCJoYXJtIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImlwY1JlbmRlcmVyIiwiY29uZmlnIiwiaGFzU3RhcnRlZCIsImZsYXQiLCJ2ZXJzaW9uIiwiRUQiLCJXZWJTb2NrZXQiLCJwYXRjaEF0dHJpYnV0ZXMiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJjb250ZW50TWFuYWdlciIsImF0b2IiLCJhZGRFdmVudExpc3RlbmVyIiwiY2xpY2siLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwicGF0Y2hQb3BvdXRXaW5kb3ciLCJoYXZlSW5zdGFsbGVkRGVmYXVsdCIsIm9uQ2xvc2UiLCJsb2dvIiwidG9wIiwiaW5uZXJIVE1MIiwiY2FuY2VsZWQiLCJjYW5jZWxQYXRjaFBvcG91dFdpbmRvdyIsIkFwaSIsImVuc3VyZUV4cG9ydGVkIiwiZ2V0V2luZG93IiwidGhlbiIsInBvcG91dE1vZHVsZSIsImludGVyY2VwdG9yIiwiX2ludGVyY2VwdG9yIiwic2V0SW50ZXJjZXB0b3IiLCJhY3Rpb24iLCJyZW5kZXIiLCJyZW5kZXIxIiwiY2FsbCIsInR5cGUxIiwicmVuZGVyMiIsInNldEltbWVkaWF0ZSIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJ2MiIsIkFuY2hvciIsIkRpc2NvcmRUYWciLCJEaXNjb3JkVGFnQ29tcCIsInV1aWR2NCIsImJhZGdlRGl2IiwiZGlzcGxheSIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImRpdiIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJzZWN0aW9uIiwicG9wZWQiLCJwb3AiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImxheWVyIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJtb2RhbCIsImlubmVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJ0b1N0cmluZyIsInNvY2lhbE1vZHVsZTEiLCJvcmlnaW5hbCIsIm5ld09uZSIsInJldHVyblZhbCIsImxpbmsiLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImJyYW5jaCIsImFkZGl0aW9uYWwiLCJyZWFjdCIsInNpemUxMiIsImVsZWN0cm9uIiwiZ2V0R2xvYmFsIiwiY29tbWl0Iiwib3JpZ2luYWxWZXJzaW9ucyIsInNwbGljZSIsImdldEd1aWxkQ2xhc3NlcyIsImd1aWxkc1dyYXBwZXIiLCJmaW5kQnlQcm9wcyIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJjaGF0IiwibmV4dFRpY2siLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwicm1yZiIsInlhdXpsIiwibWtkaXJwIiwicmVxdWVzdCIsInBhcmVudFBhdGgiLCJmb2xkZXJOYW1lIiwiemlwTGluayIsInNhdmVkWmlwIiwiZXh0cmFjdGVkRm9sZGVyIiwic3VjY2VzcyIsImVuY29kaW5nIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiYWxyZWFkeUV4aXN0cyIsInJlcyIsImV4aXN0cyIsInJlbmFtZSIsInJvdW5kIiwicGVyZm9ybWFuY2UiLCJ3cml0ZUZpbGUiLCJ6aXBmaWxlIiwibGF6eUVudHJpZXMiLCJ6aXAiLCJvbiIsImVudHJ5IiwiZmlsZU5hbWUiLCJyZWFkRW50cnkiLCJmdWxsUGF0aCIsInN5bmMiLCJkaXJuYW1lIiwib3BlblJlYWRTdHJlYW0iLCJyZWFkU3RyZWFtIiwicGlwZSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwib25jZSIsImJhY2t1cEZvbGRlciIsInVubGluayIsIl9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIiwicmVsZWFzZUNoYW5uZWwiLCJnbG9iYWxzIiwiZ2V0UmVsZWFzZUNoYW5uZWwiLCJlbnYiLCJBUFBEQVRBIiwiSE9NRSIsIlhER19DT05GSUdfSE9NRSIsInN0YWJsZSIsImNhbmFyeSIsInB0YiIsInBsdWdpbkRhdGEiLCJta2RpclN5bmMiLCJCREZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwic2V0dGluZ3NGaWxlIiwidW5saW5rU3luYyIsIl9pbmplY3Rpb25QYXRoIiwiYmFzZSIsInJvYW1pbmdCYXNlIiwiZ2V0UGF0aCIsInJvYW1pbmdMb2NhdGlvbiIsInJlYWxMb2NhdGlvbiIsImNvbmZpZ0ZpbGUiLCJfY29uZmlnRmlsZSIsIl9CREZpbGUiLCJfc2V0dGluZ3NGaWxlIiwiZ2V0UGx1Z2luRmlsZSIsIkRldk1vZGUiLCJkZWJ1Z0xpc3RlbmVyIiwiY29weVNlbGVjdG9yTGlzdGVuZXIiLCJzdGFydERlYnVnTGlzdGVuZXIiLCJzdGFydENvcHlTZWxlY3RvciIsInN0b3BEZWJ1Z0xpc3RlbmVyIiwic3RvcENvcHlTZWxlY3RvciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aGljaCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwic2VsZWN0b3IiLCJnZXRTZWxlY3RvciIsImNsYXNzTGF5ZXIiLCJjbGFzc0l0ZW1zIiwiZGlzYWJsZWRQb2ludGVyRXZlbnRzIiwibWVudSIsImF0dGFjaCIsImNtIiwicXVlcnkiLCJjb250YWluZXIiLCJsYXllckNvbnRhaW5lciIsImNtV3JhcCIsInN0eWxlRmxleGlibGUiLCJhY2NvbW1vZGF0ZVNjcm9sbGJhciIsImFwcGVuZCIsImNsaWVudFkiLCJsZWZ0IiwiY2xpZW50WCIsInNjcm9sbGVyQ2xhc3NlcyIsInNjcm9sbGVyV3JhcCIsInNjcm9sbGVyVGhlbWVkIiwidGhlbWVHaG9zdEhhaXJsaW5lIiwic2Nyb2xsZXIiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJjbWkiLCJpdGVtIiwibGFiZWxDb250YWluZXIiLCJjb2xvckRlZmF1bHQiLCJsYWJlbCIsIk5hdGl2ZU1vZHVsZSIsImNvcHkiLCJlbGVtZW50cyIsInF1ZXJ5QWxsIiwiZm9jdXNlZCIsInNlcGFyYXRvciIsInNjcm9sbEhlaWdodCIsImVsIiwibmFtZXMiLCJwYXJlbnROb2RlIiwidW5zaGlmdCIsIm93bmVyRG9jdW1lbnQiLCJ0YWdOYW1lIiwiZnJvbSIsImVudHJpZXMiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiZ2V0UnVsZXMiLCJzdHlsZVNoZWV0cyIsInNoZWV0cyIsInJ1bGVzIiwiY3NzUnVsZXMiLCJlbGVtZW50UnVsZXMiLCJzZWxlY3RvclRleHQiLCJtYXRjaGVzIiwiRGlzYWJsZVR5cGluZyIsInN0YXJ0VHlwaW5nIiwidHlwaW5nTW9kdWxlIiwiZGlzYWJsZWQiLCJzdG9wVHlwaW5nIiwicmFuZG9tIiwidiIsImF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMiLCJiYWRnZXNUb0ZldGNoIiwiRGlzdGFudFNlcnZlciIsIl9jYWNoZSIsIm5ld1Byb21pc2UiLCJDb25zdGFudHMiLCJkZWZhdWx0VXNlcnMiLCJmZXRjaGVkQmFkZ2VzIiwidXNlcnMiLCJoYW5kbGVSZXF1ZXN0IiwiUm91dGVzIiwic3RhdHVzIiwicmVzcG9uc2VCb2R5IiwianNvbiIsInByb21pc2UiLCJ1c2VyX2lkIiwiY2F0Y2giLCJMaWdodGNvcmRFcnJvciIsInJvdXRlIiwicmVqZWN0Iiwibm9kZUZldGNoIiwiU0VSVkVSX1VSTCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiQnVnSHVudGVyQmFkZ2UiLCJDaXJjdXMiLCJoZWFkIiwic2NyaXB0Iiwic3JjIiwib25sb2FkIiwiYW5pbWF0ZSIsInRpbWluZyIsIl8iLCJ1cGRhdGUiLCJkdXJhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInRpbWUiLCJ0aW1lRnJhY3Rpb24iLCJwcm9ncmVzcyIsIlEiLCJwYXJzZUhUTUwiLCJpc0hUTUwiLCJOb2RlTGlzdCIsInNvbWUiLCJuIiwibm9kZVR5cGUiLCJiYXNlRWxlbWVudCIsImh0bWwiLCJmcmFnbWVudCIsInRlbXBsYXRlIiwiY2xvbmVOb2RlIiwiZXNjYXBlSFRNTCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJzcGFuRWxlbWVudCIsIm5vZGVWYWx1ZSIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVDbGFzcyIsImNsYXNzbmFtZSIsImluZGljYXRvciIsImhhc0NsYXNzIiwiZXZlcnkiLCJyZXBsYWNlQ2xhc3MiLCJvbGROYW1lIiwibmV3TmFtZSIsImFwcGVuZFRvIiwidGhpc05vZGUiLCJ0aGF0Tm9kZSIsInByZXBlbmRUbyIsInByZXBlbmQiLCJpbnNlcnRBZnRlciIsInRhcmdldE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsIm5ld05vZGUiLCJuZXh0IiwibmV4dEFsbCIsIm5leHRVbnRpbCIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsImluZGV4IiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsImV2ZW50IiwiZGVsZWdhdGUiLCJuYW1lc3BhY2UiLCJoYXNEZWxlZ2F0ZSIsImV2ZW50RnVuYyIsImNhbmNlbCIsIm5ld0NhbmNlbCIsImZpbmRJbmRleCIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJFbW9qaVJlZ2V4IiwiQ3VzdG9tRW1vamlNb2R1bGUiLCJDdXN0b21FbW9qaSIsIkVtb2ppTW9kdWxlQXBpIiwiZ2V0Q3VzdG9tRW1vamlCeUlkIiwiQXV0b2NvbXBsZXRlTW9kdWxlIiwiQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMiLCJnZXRBdXRvY29tcGxldGVPcHRpb25zIiwiRW1vamlNb2R1bGVRdWVyeSIsInF1ZXJ5RW1vamlSZXN1bHRzIiwiTWVzc2FnZXMiLCJFTU9KSV9NQVRDSElORyIsImd1aWxkTW9kdWxlIiwiZ2V0R3VpbGQiLCJnZXRHdWlsZHMiLCJpc0ZldGNoaW5nIiwiZW1vamlTZWFyY2giLCJnZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0IiwiTElHSFRDT1JEX0VNT0pJUyIsImFyZzEiLCJhcmcyIiwiY29uZGl0aW9uIiwic2V0RW1vamlVc2FibGUiLCJxdWVyeVJlc3VsdHMiLCJyZXN1bHRzIiwicmVuZGVyUmVzdWx0cyIsIkQiLCJlbW9qaXMiLCJFTU9KSSIsIkVtb2ppIiwiZW1vamkiLCJ1bmlxdWVOYW1lIiwic2VudGluZWwiLCJndWlsZElkIiwiZ2V0UGxhaW5UZXh0IiwiaXNBbmltYXRlZCIsImFuaW1hdGVkIiwibWFuYWdlZCIsIm9yaWdpbmFsTmFtZSIsImdldFJhd1RleHQiLCJjYW5jZWxFbW9qaVJlbmRlciIsImNhbmNlbEVtb3RlUmVuZGVyIiwibmV3Q29udGVudCIsImhhc1BhcnNlZCIsImV4ZWMiLCJyYXciLCJ3b3JkcyIsIndvcmQiLCJhcnIiLCJlbW9qaUlkIiwianVtYm9hYmxlIiwicmVkdWNlIiwiY3VycmVudCIsInNoaWZ0IiwibyIsInUiLCJkIiwib25DbGljayIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsIkJ1ZmZlciIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiZ2VuZXJhdGVLZXkiLCJkZWNpcGhlciIsImRlY3J5cHRlZCIsImZpbmFsIiwiY2lwaGVyIiwiZW5jcnlwdGVkIiwiUGx1Z2luTW9kdWxlIiwibG9hZFBsdWdpbkRhdGEiLCJsb2FkIiwic2F2ZVBsdWdpbkRhdGEiLCJjaGFubmVsU3dpdGNoIiwic3RhcnRQbHVnaW4iLCJzdG9wUGx1Z2luIiwiZW5hYmxlUGx1Z2luIiwiZGlzYWJsZVBsdWdpbiIsInRvZ2dsZVBsdWdpbiIsInAiLCJmaWxlbmFtZU9yTmFtZSIsImJkcGx1Z2luIiwiZGVsZXRlIiwiZWRpdCIsIm9wZW5JdGVtIiwidXBkYXRlUGx1Z2luTGlzdCIsInNhdmVkIiwibmV3TWVzc2FnZSIsIm9uTWVzc2FnZSIsIm9uU3dpdGNoIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJMYXllciIsInJvb3RJZCIsIlYyQ19QdWJsaWNTZXJ2ZXJzIiwicm9vdCIsIl9yb290IiwiaW5qZWN0Um9vdCIsImNsYXNzTmFtZUxheWVycyIsImxheWVycyIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJpc0NsZWFyaW5nQ2FjaGUiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNsYXNzU2lkZWJhciIsImNvbnRlbnRSZWdpb24iLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiY29yZVNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJjYXRlZ29yaWVzIiwiU2V0Iiwic2VjdGlvbnMiLCJsaWdodGNvcmRTZXR0aW5ncyIsIlByZXNlbmNlU2V0dGluZ3MiLCJNc2dMb2dTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImZvcmNlVXBkYXRlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsImRpc2FibGVUeXBpbmciLCJhcHBTZXR0aW5ncyIsInJlbGF1bmNoIiwiZXhpdCIsImNvcmUiLCJOb3RpZmljYXRpb25zVXNlU2hpbSIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJNYXJnaW5Ub3AiLCJpc0NoZWNrZWQiLCJTd2l0Y2giLCJDb21wb25lbnRzIiwiaW5wdXRzIiwiQnV0dG9uIiwibG9vayIsImhvdmVyQ29sb3IiLCJpcGMiLCJzZW5kIiwiYXJndiIsInF1aXQiLCJzZXNzaW9uIiwiY2xlYXJDYWNoZSIsIlYyQ19QcmVzZW5jZVNldHRpbmdzIiwiVjJDX0FjY291bnRJbmZvcyIsIkFwaVByZXZpZXciLCJDc3NFZGl0b3IiLCJDb250ZW50TGlzdCIsIkNvbXBvbmVudCIsIm9yaWdpbmFsUmVuZGVyIiwiZW51bWVyYWJsZSIsIkNhcmRMaXN0IiwiU2V0dGluZ0NvbXBvbmVudCIsInBhbmVscyIsInBhbmVsIiwiZ2V0Q29tcG9uZW50IiwiTENpdGVtcyIsIkxDRGV2SXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJmb3JtYXRTdHJpbmciLCJzdHJpbmciLCJyZXBsYWNlbWVudCIsImVzY2FwZSIsInBhcmFtcyIsImluc3RlYWQiLCJzaWxlbnQiLCJmb3JjZSIsIm9yaWdNZXRob2QiLCJjYW5jZWxQYXRjaCIsIm9yaWdpbmFsTWV0aG9kIiwiY2FsbE9yaWdpbmFsTWV0aG9kIiwidGVtcFJldCIsIl9fbW9ua2V5UGF0Y2hlZCIsImRpc2Nvbm5lY3QiLCJoYXNOb3RpY2UiLCJtZW1iZXJsaXN0IiwibWVtYmVyc1dyYXAiLCJmb3JtIiwicmlnaHQiLCJib3R0b20iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiTW9kYWxTdGFjayIsIkNoYW5nZWxvZ0NsYXNzZXMiLCJUZXh0RWxlbWVudCIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImltYWdlIiwic3VidGl0bGUiLCJjZSIsImNoYW5nZWxvZ0l0ZW1zIiwibWFyZ2luIiwicmVuZGVySGVhZGVyIiwiQ2hpbGQiLCJncm93Iiwic2hyaW5rIiwidGFnIiwiVGFncyIsIkg0IiwiU2l6ZXMiLCJTTUFMTCIsIkNvbG9ycyIsIlNUQU5EQVJEIiwiZGF0ZSIsInJlbmRlckZvb3RlciIsIkFuY2hvckNsYXNzZXMiLCJhbmNob3IiLCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyIiwiam9pblN1cHBvcnRTZXJ2ZXIiLCJqb2luQkQyIiwic3VwcG9ydExpbmsiLCJkZWZhdWx0Rm9vdGVyIiwib25TY3JvbGwiLCJNb2RhbEFjdGlvbnMiLCJNYXJrZG93biIsIkNvbmZpcm1hdGlvbk1vZGFsIiwiZW1wdHlGdW5jdGlvbiIsIm9wZW5Nb2RhbCIsInJlZCIsIm1vZGFsS2V5IiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsImlzRGVmYXVsdCIsIm1vZCIsInByb3h5IiwiZnVuYyIsIl9fcHJvdG9fXyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwiam9pbkxDIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXJVUkwiLCJhdmF0YXIiLCJnZXRBdmF0YXJVUkwiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204Iiwic2V0dGluZ1RpdGxlIiwiZm9ybU1vZHVsZSIsInN0YXRlcyIsIkZvcm1TZWN0aW9uIiwiYWxsQ29tcG9uZW50cyIsImNvbXAiLCJBbGxQcmV2aWV3cyIsInRhYiIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJjb21wUGF0aCIsImxhbmciLCJTdHJpbmciLCIkJHR5cGVvZiIsIlN5bWJvbCIsImZvciIsImNvbXBOYW1lIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJoZWxwIiwibWFyZ2luQm90dG9tIiwicmVuZGVycyIsIlYyQ19QbHVnaW5DYXJkIiwic2hvd1NldHRpbmdzIiwic2V0SW5pdGlhbFN0YXRlIiwiaGFzU2V0dGluZ3MiLCJhZGRvbiIsImdldFNldHRpbmdzUGFuZWwiLCJyZWxvYWRzIiwidHJ1c3RlZCIsImNsb3NlU2V0dGluZ3MiLCJwYW5lbFJlZiIsInNldHRpbmdzT3BlbiIsImNvbXBvbmVudERpZFVwZGF0ZSIsInJlZnMiLCJzZXR0aW5nc3BhbmVsIiwiaXNIaWRkZW4iLCJjVG9wIiwic2Nyb2xsVG9wIiwiY0JvdHRvbSIsImVUb3AiLCJvZmZzZXRUb3AiLCJlQm90dG9tIiwiY2FyZE5vZGUiLCJ0aGlzTm9kZU9mZnNldCIsImNvbnRhaW5lck9mZnNldCIsImVuZFBvaW50IiwiZ2V0U3RyaW5nIiwic2V0dGluZ3NDb21wb25lbnQiLCJyZWYiLCJYU3ZnIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJidWlsZFRpdGxlIiwibmFtZUluZGV4IiwidmVyc2lvbkluZGV4IiwiYXV0aG9ySW5kZXgiLCJwb3BMYXllciIsIm1ha2VMaW5rIiwibWFrZUJ1dHRvbiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib25BZGRvbkNoYW5nZXMiLCJjb21wb25lbnREaWRNb3VudCIsImJkRXZlbnRzIiwib3BlbkZvbGRlciIsIm9wZW5QYXRoIiwic2hvdWxkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsInNvcnRPcHRpb25zIiwiZGlyZWN0aW9ucyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0QWRkb25zIiwic29ydGVkQWRkb25zIiwiYiIsImNhcCIsImZpcnN0Iiwic2Vjb25kIiwibG9jYWxlQ29tcGFyZSIsInJlbmRlckNoZWNrVXBkYXRlcyIsIlplcmVzUGx1Z2luTGlicmFyeSIsIlBsdWdpblVwZGF0ZXMiLCJjaGVja0FsbCIsIm1hcmdpbkxlZnQiLCJyZWZyZXNoSWNvbiIsImFkZG9uQ2FyZHMiLCJmaWxsUnVsZSIsImNsaXBSdWxlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwib3BhY2l0eSIsIlYyQ19DaGVja2JveCIsImNoZWNrYm94RWxlbWVudCIsImNoZWNrYm94IiwiY2hlY2tib3hJbm5lciIsIlNlbGVjdCIsImRyb3Bkb3duIiwiY3JlYXRlUmVmIiwic2hvd01lbnUiLCJoaWRlTWVudSIsIm9wdCIsImlzT3BlbiIsIlNlYXJjaCIsIm9uS2V5RG93biIsInBsYWNlaG9sZGVyIiwiVjJDX0NvbnRlbnRDb2x1bW4iLCJjb250ZW50TW9kdWxlIiwiY29udGVudENvbHVtbiIsImNvbnRlbnRDb2x1bW5EZWZhdWx0IiwiVjJDX0Nzc0VkaXRvciIsImxpbmVzIiwiZGV0YWNoZWRFZGl0b3IiLCJWMkNfQ3NzRWRpdG9yRGV0YWNoZWQiLCJ1cGRhdGVDc3MiLCJzYXZlQ3NzIiwiZGV0YWNoIiwiZGV0YWNoZWQiLCJlZGl0b3IiLCJhY2UiLCJzZXRUaGVtZSIsInNldE1vZGUiLCJzZXRTaG93UHJpbnRNYXJnaW4iLCJzZXRGb250U2l6ZSIsImRlc3Ryb3kiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJhcmciLCJnZXRWYWx1ZSIsImRyb290IiwiaW5qZWN0RGV0YWNoZWRSb290IiwiQkRFcnJvckJvdW5kYXJ5IiwiaGFzRXJyb3IiLCJjb21wb25lbnREaWRDYXRjaCIsIkRlbGV0ZSIsIkRvd25BcnJvdyIsIkVkaXQiLCJtYXJnaW5Nb2R1bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyIsInByZXZpZXciLCJpc2ZldGNoaW5nIiwiYXNzZXRDb21wb25lbnRzIiwidXBkYXRlV2hlbkZldGNoZWQiLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3Iiwib3B0aW9uc0NvbXBvbmVudHMiLCJvaGdvZG9oZnVjayIsIl9vcHRpb25zQ29tcG9uZW50cyIsImFycmF5IiwiaW5wdXRUZXh0TW9kdWxlcyIsIklucHV0VGV4dCIsInJlbW92ZUtleWJpbmQiLCJfaG9yaXpvbnRhbCIsImlucHV0TWluaSIsInNpemUxNiIsInNpemUyMCIsImlucHV0IiwibGFzdEVkaXRlZCIsImlzVGltaW5nIiwicm93TW9kdWxlIiwiZmxleE1vZHVsZSIsImlucHV0TW9kdWxlIiwic2l6ZU1vZHVsZTIiLCJyb3ciLCJmbGV4Q2hpbGQiLCJJbnB1dE51bWJlck1vZHVsZXMiLCJJbnB1dE51bWJlciIsImNvbG9yVHJhbnNwYXJlbnQiLCJzZXRWYWx1ZSIsImNsaXBib2FyZCIsIklucHV0Q2hvaWNlTW9kdWxlcyIsIklucHV0Q2hvaWNlIiwiRGl2aWRlck1vZHVsZXMiLCJEaXZpZGVyIiwiZGl2aWRlciIsImRpdmlkZXJEZWZhdWx0IiwiRGlzY29yZEJ1dHRvbiIsIlJwY1ByZXZpZXciLCJhY3RpdmUiLCJjaGFuZ2VUYWIiLCJhbmNpZW50VGFiIiwic2V0QWN0aXZlIiwiZmxleCIsInJwYyIsImlzQWN0aXZlIiwiUHJvZmlsZSIsIlBvcG91dCIsIlRhYiIsImVtcHR5Q2xhc3NlcyIsIlByZXNlbmNlRXJyb3JDYXRjaGVyIiwiZXJySW5mbyIsImVtcHR5U3RhdGVJbWFnZSIsImVtcHR5U3RhdGUiLCJlbXB0eVN0YXRlSGVhZGVyIiwiZW1wdHlTdGF0ZVN1YnRleHQiLCJwb3BvdXRNb2R1bGVzIiwiVXNlclBvcG91dENvbXBvbmVudCIsIlBvcG91dFByb3BzIiwiVXNlclBvcG91dCIsImNoYW5uZWxJZCIsImRpc2FibGVVc2VyUHJvZmlsZUxpbmsiLCJyZW5kZXIzIiwicG9wb3V0IiwiZXhjbHVkZVByb3BlcnRpZXMiLCJwcm9maWxlTW9kdWxlcyIsIlVzZXJQcm9maWxlQ29tcG9uZW50IiwiUHJvZmlsZVByb3BzIiwiY29ubmVjdGVkUHJvZmlsZVN0b3JlIiwiVXNlclByb2ZpbGUiLCJyZW5kZXI0IiwicHJvZmlsZSIsIlYyQ19MYXllciIsImtleXVwTGlzdGVuZXIiLCJ0cmFuc2Zvcm0iLCJjb21wb25lbnRXaWxsTW91bnQiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJzY3JlZW5YIiwic2NyZWVuWSIsImpvaW5XaW5kb3ciLCJCcm93c2VyV2luZG93Iiwid2ViQ29udGVudHMiLCJsb2FkVVJMIiwicmVzaXphYmxlIiwibWF4aW1pemFibGUiLCJtaW5pbWl6YWJsZSIsImFsd2F5c09uVG9wIiwiY2VudGVyIiwid2ViUHJlZmVyZW5jZXMiLCJub2RlSW50ZWdyYXRpb24iLCJiZFNlcnZlciIsIm9ubGluZSIsIm1lbWJlcnMiLCJpY29uVXJsIiwibmF0aXZlam9pbiIsInNlcnZlcjIiLCJndWlsZExpc3QiLCJnZXRGbGF0dGVuZWRHdWlsZElkcyIsImRlZmF1bHRMaXN0IiwiREVGQVVMVF9BVkFUQVJTIiwiU2VydmVyQ2FyZCIsImZhbGxiYWNrIiwiZmxvb3IiLCJjb25uZWN0RW5kUG9pbnQiLCJTaWRlYmFyVmlldyIsInRvb2xzIiwiVG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsIm5vV3JhcCIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJkcmFnZ2FibGUiLCJob3Jpem9udGFsIiwiVjJDX1NpZGViYXJWaWV3IiwiU2Nyb2xsZXIiLCJmYWRlIiwiZGFyayIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2Nyb2xsZXIiLCJzY3JvbGxlck1vZHVsZTEiLCJzY3JvbGxlckhvcml6b250YWwiLCJzY3JvbGxlck1vZHVsZTIiLCJzaWRlYmFyUmVnaW9uU2Nyb2xsZXIiLCJ3cmFwcGVyQ2xhc3MiLCJzY3JvbGxlckZhZGUiLCJzY3JvbGxlckNsYXNzIiwiY29udGVudFJlZ2lvblNjcm9sbGVyIiwiY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcCIsInRoZW1lR2hvc3QiLCJzY3JvbGxlclRyYWNrIiwiVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJTZXR0aW5nc0dyb3VwIiwiVjJDX1NldHRpbmdzR3JvdXAiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NUaXRsZSIsImNsYXNzbmFtZXMiLCJnZXRDbGFzc05hbWUiLCJTd2l0Y2hJdGVtIiwiYmV0YSIsInVzZXJTZXR0aW5nc1ZvaWNlIiwiVjJDX1RhYkJhckhlYWRlciIsIlYyQ19UYWJCYXJJdGVtIiwiVjJDX1RhYkJhclNlcGFyYXRvciIsImludGVydmFsTW9kdWxlMSIsIkludGVydmFsIiwiVGltZVJlbmRlciIsIl9pbnRlcnZhbCIsImdldFVwZGF0ZWRUaW1lIiwiZ2V0RGlmZiIsImNoZWNrVW5peCIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJyZW5kZXJUaW1lIiwibnVtYmVyIiwicmVtb3ZlWmVybyIsInVzZWRQcm9wcyIsIlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORCIsIlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX1NUQVJUIiwiVjJDX1Rvb2xzIiwidG9vbHNNb2R1bGUiLCJ0b29sc0NvbnRhaW5lciIsImNvbnRhaW5lck1vZHVsZSIsImNsb3NlQnV0dG9uIiwiY2xvc2VCdXR0b25Cb2xkIiwia2V5YmluZCIsImtleWJpbmRCb2xkIiwiVG9vbHRpcENsYXNzZXMiLCJnZXRUb29sdGlwQ2xhc3NlcyIsIlRvb2x0aXBMYXllcnMiLCJnZXRUb29sdGlwTGF5ZXJzIiwiZ2V0Q2xhc3MiLCJzaWRlT3JDb2xvciIsInVwcGVyQ2FzZSIsInRvb2x0aXBDbGFzcyIsImNsYXNzRXhpc3RzIiwidG9QeCIsIkVtdWxhdGVkVG9vbHRpcCIsInByZXZlbnRGbGlwIiwidG9vbHRpcEVsZW1lbnQiLCJ0b29sdGlwIiwibGFiZWxFbGVtZW50IiwidG9vbHRpcENvbnRlbnQiLCJwb2ludGVyRWxlbWVudCIsInRvb2x0aXBQb2ludGVyIiwicG9wb3V0cyIsImNhblNob3dBYm92ZSIsImNhblNob3dCZWxvdyIsImNhblNob3dMZWZ0IiwiY2FuU2hvd1JpZ2h0IiwiX2NsYXNzTmFtZSIsInNob3dBYm92ZSIsInNob3dCZWxvdyIsInNob3dMZWZ0Iiwic2hvd1JpZ2h0IiwiY2VudGVySG9yaXpvbnRhbGx5IiwiY2VudGVyVmVydGljYWxseSIsIm5vZGVjZW50ZXIiLCJmaW5kRE9NTm9kZSIsIlYyQ19YU3ZnIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7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QUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdIMzNCLG1EQUFJLENBQUNtbEIsS0FBTCxDQUFXamtCLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEIyL0IsVUFBSSxFQUFFLE1BQWhDO0FBQXdDNmUsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSTMvQyxtREFBSSxDQUFDbWxCLEtBQUwsQ0FBV2prQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUNvOEIsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJdDlCLG1EQUFJLENBQUNtbEIsS0FBTCxDQUFXamtCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0IyL0IsVUFBSSxFQUFFLFNBQTFCO0FBQXFDeEQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxrQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgY3VycmVudERpc2NvcmRWZXJzaW9uID0gKHdpbmRvdy5EaXNjb3JkTmF0aXZlICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcCAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbiAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbigpKSB8fCBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IG1pblN1cHBvcnRlZFZlcnNpb24gPSBcIjAuMy4wXCI7XHJcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNVwiO1xyXG4vKlxyXG5leHBvcnQgY29uc3QgTENDaGFuZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkxpZ2h0Y29yZCdzIGNoYW5nZWxvZ1wiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiV2hhdCdzIE5ldz9cIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIGlzIG5vdyBhdmFpbGFibGUgIVwiLFxyXG4gICAgICAgICAgICAgICAgXCJXZSByZW1vdmVkIGVtb3Rlcy4gVGhhdCdzIHNhZCBmb3IgcGVvcGxlIHdobyB3ZXJlIGFjdHVhbGx5IHVzaW5nIGl0LCBidXQgaXQgd2FzIGxlYWRpbmcgdG8gbW9yZSBsb2FkaW5nIHRpbWUgYW5kIHNvbWUgYmFzaWMgd29yZHMgd2VyZSBlbW90ZS5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXSxcclxuICAgIGltYWdlOiBcImh0dHBzOi8vaS5pbWd1ci5jb20vc2ZOaHF3UC5wbmdcIixcclxuICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgc3VidGl0bGU6IFwidlwiK3JlbW90ZS5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbixcclxuICAgIGZvb3RlcjogKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgaWYoIVRleHRFbGVtZW50IHx8ICFNb2RhbFN0YWNrKXJldHVybiBudWxsXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07XHJcbiAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcclxuICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgIEJEVjIuam9pbkxDKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7Y2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCwgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKTtcclxuICAgICAgICByZXR1cm4gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRleHRFbGVtZW50LCB7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcclxuICAgIH0pKClcclxufSovXHJcbmV4cG9ydCBjb25zdCBiYmRDaGFuZ2Vsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJCQkQncyBjaGFuZ2Vsb2cuXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJCdWcgRml4ZXNcIixcclxuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJTb21lIGZpeGVzIHJlbGF0ZWQgdG8gc2hvd2luZyBtb2RhbHMgaW4gdGhlIGBCZEFwaWAuXCIsXHJcbiAgICAgICAgICAgICAgICBcIkZpeGVkIHRoZSBvcGVuIGZvbGRlciBidXR0b25zIGZvciBwbHVnaW5zIGFuZCB0aGVtZXNcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xyXG4gICAgXCJDdXN0b20gY3NzIGxpdmUgdXBkYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0wXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcclxuXHJcbiAgICAvKiBDb3JlICovXHJcbiAgICAvKiA9PT09PT0gKi9cclxuICAgIFwiUHVibGljIFNlcnZlcnNcIjogICAgICAgICAgICAge2lkOiBcImJkYS1ncy0xXCIsICBpbmZvOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiSGlkZSBDaGFubmVsc1wiOiAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0zXCIsICBpbmZvOiBcIkhpZGUgY2hhbm5lbHMgaW4gbWluaW1hbCBtb2RlXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiMjQgSG91ciBUaW1lc3RhbXBzXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy02XCIsICBpbmZvOiBcIlJlcGxhY2UgMTJociB0aW1lc3RhbXBzIHdpdGggcHJvcGVyIG9uZXNcIiwgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcblxyXG4gICAgLyogQ29udGVudCAqL1xyXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2NhbiBQbHVnaW5zXCI6ICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtNlwiLCBpbmZvOiBcIlNjYW4gcGx1Z2lucyBmb3IgYW55IHRocmVhdCB0aGF0IGNhbiBiZSBoaWRkZW4gaW5zaWRlLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTaG93IFRvYXN0c1wiOiAgICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy0yXCIsIGluZm86IFwiU2hvd3MgYSBzbWFsbCBub3RpZmljYXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvblwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkF1dG9tYXRpYyBMb2FkaW5nXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTVcIiwgaW5mbzogXCJBdXRvbWF0aWNhbGx5IGxvYWRzLCByZWxvYWRzLCBhbmQgdW5sb2FkcyBwbHVnaW5zIGFuZCB0aGVtZXNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiRW5hYmxlIEVkaXQgQnV0dG9uXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtN1wiLCBpbmZvOiBcIkVuYWJsZSBhbiBFZGl0IEJ1dHRvbiBvbiB0aGUgcGx1Z2luIGFuZCB0aGVtZSBwYW5lbC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiVGhlbWVzIGluIFBvcG91dCBXaW5kb3dcIjogICAge2lkOiBcImxpZ2h0Y29yZC05XCIsIGluZm86IFwiRW5hYmxlIHRoZW1lcyBpbiBQb3BvdXQgV2luZG93LiAoRm9yIGV4YW1wbGUsIHdoZW4gZGV0YWNoaW5nIHNjcmVlbnNoYXJlLilcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG5cclxuICAgIC8qIERldmVsb3BlciAqL1xyXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiQ29weSBTZWxlY3RvclwiOlx0XHRcdCAge2lkOiBcImZvcmstZG0tMVwiLCBpbmZvOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiUmVhY3QgRGV2VG9vbHNcIjpcdFx0XHQgIHtpZDogXCJyZWFjdERldlRvb2xzXCIsIGluZm86IFwiQWRkcyByZWFjdCBkZXZlbG9wZXIgdG9vbHMgdG8gdGhlIGRldnRvb2xzLiBNdXN0IGJlIGluc3RhbGxlZCBpbiBHb29nbGUgQ2hyb21lIG9uIHlvdXIgcGMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25hbCBJbmZvcm1hdGlvblwiOiAge2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiTGlnaHRjb3JkIEFwaVxcXCIgc2VjdGlvbi5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJBZCBCbG9ja1wiOiAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTRcIiwgaW5mbzogXCJCbG9jayBhbnkgQk9UIHRoYXQgZG1zIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiTGlnaHRjb3JkIFRhYnNcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC04XCIsIGluZm86IFwiQWxsb3dzIHlvdSB0byBsYXVuY2ggbXVsdGlwbGUgaW5zdGFuY2VzIG9mIExpZ2h0Y29yZCBpbiB0aGUgc2FtZSB3aW5kb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG4gICAgXCJVc2UgTm90aWZpY2F0aW9uIFNoaW1cIjogICAgICB7aWQ6IFwibGlnaHRjb3JkLTEwXCIsIGluZm86IFwiQmFzaWNhbGx5IGRvbid0IHVzZSBXaW5kb3dzJ3MgTm90aWZpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IGZhbHNlfSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkIFdpbmRvdyAqL1xyXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiTm8gV2luZG93IEJvdW5kc1wiOiAgICAgICAgICAge2lkOiBcIm5vX3dpbmRvd19ib3VuZFwiLCBpbmZvOiBcIkRpc2FibGUgV2luZG93IEJvdW5kcy4gQ2FuIGJlIHVzZWZ1bCBpZiB5b3UgdXNlIGEgd2luZG93IG1hbmFnZXIuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IHByb2Nlc3MucGxhdGZvcm0gIT09IFwibGludXhcIiwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcIkVuYWJsZSBHbGFzc3Ryb25cIjogICAgICAgICAgIHtpZDogXCJlbmFibGVfZ2xhc3N0cm9uXCIsIGluZm86IFwiRW5hYmxlIEdsYXNzdHJvbi4gSWYgeW91J3JlIG5vdCB1c2luZyB0cmFuc3BhcmVudCB0aGVtZXMsIHRoaXMgY2FuIHJlZHVjZSBsYWcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFxyXG4gICAgLyoqIFJpY2hQcmVzZW5jZSAqL1xyXG4gICAgXCJFbmFibGVcIjogICAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIiwgaW5mbzogXCJFbmFibGUgUmljaFByZXNlbmNlIGJlbG93LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcInN0YXR1c1wifVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb29raWUgPSB7XHJcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy0yXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtM1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy01XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy02XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTJcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy02XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy03XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZGMtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTFcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy05XCI6IHRydWUsXHJcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1wcy0xXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtMlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy00XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy03XCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC05XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMTBcIjogZmFsc2UsXHJcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XHJcbiAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgYFwiJHtrZXl9XCIgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIG9ubHkgdXNlIEJkQXBpLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7ICBcclxufTtcclxuXHJcblxyXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBnbG9iYWxLZXlzID0gT2JqZWN0LmtleXMoR2xvYmFscyk7XHJcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XHJcblxyXG5cclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9tb2R1bGVzL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcclxuXHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJEVjJcIiwgQkRWMik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJ0aGVtZU1vZHVsZVwiLCB0aGVtZU1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIlV0aWxzXCIsIFV0aWxzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJzZXR0aW5nc1BhbmVsXCIsIHNldHRpbmdzUGFuZWwpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJEYXRhU3RvcmVcIiwgRGF0YVN0b3JlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDbGFzc05vcm1hbGl6ZXJcIiwgQ2xhc3NOb3JtYWxpemVyKTtcclxuXHJcbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xyXG5cclxuaW1wb3J0IENvcmUgZnJvbSBcIi4vbW9kdWxlcy9jb3JlXCI7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xyXG5cclxuLy8gVE9ETzogQ2hhbmdlIEluaXQgbW9kZSBhbmQgc3RvcCB1c2luZyBDb3JlV3JhcHBlci5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcsIG1ldGhvZHMpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKSB7XHJcbiAgICAgICAgLy8gZGVwcmVjYXRlR2xvYmFsKFwibWFpbkNvcmVcIiwgdGhpcy5tYWluQ29yZSk7XHJcbiAgICAgICAgQ29yZS5pbml0KCk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzIHx8IFtdXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmZpZWxkcyB8fCBbXSkubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXHJcbiAgICAgICAgfSkuaW5jbHVkZXModHJ1ZSkpcmV0dXJuIHRydWVcclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuXHJcbiAgICB9KS5pbmNsdWRlcyh0cnVlKVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc1JQQywgZGVmYXVsdFJQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gQkRNb2R1bGVzLmdldChtPT5tLkRpc3BhdGNoZXImJm0uZGVmYXVsdCYmbS5kZWZhdWx0LmRpc3BhdGNoKVswXS5kZWZhdWx0XHJcbmNvbnN0IEFjdGlvblR5cGVzID0gQkRNb2R1bGVzLmdldChtPT5tLkFjdGlvblR5cGVzKVswXS5BY3Rpb25UeXBlc1xyXG5cclxuY29uc3Qgc29ja2V0SWQgPSBcImxpZ2h0Y29yZC1zcG9vZi1zb2NrZXRcIlxyXG5jb25zdCBwaWQgPSBwcm9jZXNzLnBpZFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEN1c3RvbVJpY2hQcmVzZW5jZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIHRoaXMuZ2FtZSA9IHNldHRpbmdzUlBDXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBmb3JtYXRlZEdhbWUoKXtcclxuICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkID09PSBmYWxzZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgIH1cclxuXHJcbiAgICBzZW5kR2FtZSgpe1xyXG4gICAgICAgIGRpc3BhdGNoZXIuZGlzcGF0Y2goe1xyXG4gICAgICAgICAgICB0eXBlOiBBY3Rpb25UeXBlcy5MT0NBTF9BQ1RJVklUWV9VUERBVEUsXHJcbiAgICAgICAgICAgIHNvY2tldElkLFxyXG4gICAgICAgICAgICBwaWQsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiB0aGlzLmZvcm1hdGVkR2FtZVxyXG4gICAgICAgIH0pICAgXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCkge1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFbmFibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0KHNldHRpbmdzUlBDIHx8IE9iamVjdC5jcmVhdGUoZGVmYXVsdFJQQykpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRGlzYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmV0Y2hBc3NldHMoYXBwbGljYXRpb25JZCl7XHJcbiAgICAgICAgbGV0IGFzc2V0cyA9IGF3YWl0IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEFzc2V0cylbMF0uZ2V0QXNzZXRzKGFwcGxpY2F0aW9uSWQpXHJcbiAgICAgICAgaWYoYXNzZXRzLnVuZGVmaW5lZCAmJiB0eXBlb2YgYXNzZXRzLnVuZGVmaW5lZCA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXBwbGljYXRpb25cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0c1xyXG4gICAgfVxyXG5cclxuICAgIHNldChhY3Rpdml0eSl7XHJcbiAgICAgICAgdGhpcy5nYW1lID0gYWN0aXZpdHlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3BsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBtYWluQ29yZSBmcm9tIFwiLi9jb3JlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jb25zdCBCZEFwaSA9IHtcclxuICAgIGdldCBSZWFjdCgpIHsgcmV0dXJuIEJEVjIuUmVhY3Q7IH0sXHJcbiAgICBnZXQgUmVhY3RET00oKSB7IHJldHVybiBCRFYyLlJlYWN0RG9tOyB9LFxyXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiBCRFYyLlJlYWN0Q29tcG9uZW50O30sXHJcbiAgICBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtyZXR1cm4gVXRpbHMuV2luZG93Q29uZmlnRmlsZTt9LFxyXG4gICAgZ2V0IHNldHRpbmdzKCkge3JldHVybiBzZXR0aW5nczt9LFxyXG4gICAgZ2V0IGVtb3RlcygpIHtyZXR1cm4ge319LCAvLyBkZXByZWNhdGVkLCBkZWxldGVkIGFsbCBlbW90ZXMgZnJvbSBiZXR0ZXJkaXNjb3JkLlxyXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcclxuICAgIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxufTtcclxuXHJcbkJkQXBpLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKTtcclxufTtcclxuXHJcbkJkQXBpLmdldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkuaW5qZWN0Q1NTID0gZnVuY3Rpb24gKGlkLCBjc3MpIHtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQoaWQpLCBjc3MpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLmNsZWFyQ1NTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkubGlua0pTID0gZnVuY3Rpb24gKGlkLCB1cmwpIHtcclxuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS51bmxpbmtKUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vR2V0IGFub3RoZXIgcGx1Z2luXHJcbi8vbmFtZSA9IG5hbWUgb2YgcGx1Z2luXHJcbkJkQXBpLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGJkcGx1Z2luc1tuYW1lXS5wbHVnaW47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxyXG5CZEFwaS5nZXRDb3JlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgVXRpbHMud2FybihcIkRlcHJlY2F0aW9uIE5vdGljZVwiLCBgQmRBcGkuZ2V0Q29yZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuYCk7XHJcbiAgICByZXR1cm4gbWFpbkNvcmU7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBtb2RhbC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxyXG4gKi9cclxuQmRBcGkuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICovXHJcbkJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vU2hvdyB0b2FzdCBhbGVydFxyXG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIFV0aWxzLnNob3dUb2FzdChjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZEFsbE1vZHVsZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRBbGwoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKHByb3BzKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3RvdHlwZXMgPSBmdW5jdGlvbiguLi5wcm90b3MpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3RvdHlwZXMocHJvdG9zKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeURpc3BsYXlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXHJcbkJkQXBpLmdldEludGVybmFsSW5zdGFuY2UgPSBmdW5jdGlvbihub2RlKSB7XHJcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygd2luZG93LmpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XHJcbiAgICByZXR1cm4gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKG5vZGUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmxvYWREYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXREYXRhID0gQmRBcGkuc2F2ZURhdGE7XHJcblxyXG4vLyBEZWxldGVzIGRhdGFcclxuQmRBcGkuZGVsZXRlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5kZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG4vLyBQYXRjaGVzIG90aGVyIGZ1bmN0aW9uc1xyXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBVdGlscy5tb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEV2ZW50IHdoZW4gZWxlbWVudCBpcyByZW1vdmVkXHJcbkJkQXBpLm9uUmVtb3ZlZCA9IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcclxufTtcclxuXHJcbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcclxuQmRBcGkuc3VwcHJlc3NFcnJvcnMgPSBmdW5jdGlvbihtZXRob2QsIG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBVdGlscy5zdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpO1xyXG59O1xyXG5cclxuLy8gVGVzdHMgZm9yIHZhbGlkIEpTT05cclxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICByZXR1cm4gVXRpbHMudGVzdEpTT04oZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5pc1BsdWdpbkVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISFwbHVnaW5Db29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1RoZW1lRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gISFzZXR0aW5nc0Nvb2tpZVtpZF07XHJcbn07XHJcblxyXG5CZEFwaS5lbmFibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCB0cnVlKTtcclxufTtcclxuXHJcbkJkQXBpLmRpc2FibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XHJcbn07XHJcblxyXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCAhc2V0dGluZ3NDb29raWVbaWRdKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5nZXRCRERhdGEgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XHJcbn07XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2V0QkREYXRhID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldEJERGF0YShrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuXHJcblxyXG5jb25zdCBtYWtlQWRkb25BUEkgPSAoY29va2llLCBsaXN0LCBtYW5hZ2VyKSA9PiBuZXcgY2xhc3MgQWRkb25BUEkge1xyXG5cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cclxuXHJcbiAgICBpc0VuYWJsZWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5kaXNhYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZShuYW1lKSB7XHJcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5yZWxvYWQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KG5hbWUpIHtcclxuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgICAgICBpZiAobGlzdFtuYW1lXS5wbHVnaW4pIHJldHVybiBsaXN0W25hbWVdLnBsdWdpbjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKGsgPT4gdGhpcy5nZXQoaykpLmZpbHRlcihhID0+IGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcclxuQmRBcGkuVGhlbWVzID0gbWFrZUFkZG9uQVBJKHRoZW1lQ29va2llLCBiZHRoZW1lcywgdGhlbWVNb2R1bGUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQmRBcGkgPSBCZEFwaSIsIi8qIEJERXZlbnRzICovXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgbGV0IHVzZXJTZXR0aW5nc0FjY291bnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXVxyXG4gICAgY29uc3QgY2hpbGRyZW4gPSBCRE1vZHVsZXMuZ2V0KGUgPT4gdHlwZW9mIGUuY2hpbGRyZW4gPT09IFwic3RyaW5nXCIpWzBdXHJcbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLnBheW1lbnQtaW5mbyAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZXNjcmlwdGlvbiAmJiB0eXBlb2YgZS5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiAmJiBlLmRlc2NyaXB0aW9uLmluY2x1ZGVzKFwiZm9ybVRleHRcIikpWzBdLmRlc2NyaXB0aW9uKX1gKVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnBheW1lbnRTb3VyY2VSb3cpWzBdLnBheW1lbnRTb3VyY2VSb3cpfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdWJUZXh0ICYmIGUuZGVzY3JpcHRpb25XcmFwcGVyKVswXS5zdWJUZXh0KX1gKVxyXG4gICAgaWYodXNlclNldHRpbmdzQWNjb3VudCl7XHJcbiAgICAgICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKHVzZXJTZXR0aW5nc0FjY291bnQudXNlclNldHRpbmdzQWNjb3VudCl9IGRpdjpudGgtY2hpbGQoMik+ZGl2Om50aC1jaGlsZCgyKT4uJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS52aWV3Qm9keSlbMF0udmlld0JvZHkpfWApXHJcbiAgICAgICAgc2VsZWN0cy5wdXNoKGAuJHtyZW1vdmVEYSh1c2VyU2V0dGluZ3NBY2NvdW50LnVzZXJTZXR0aW5nc1NlY3VyaXR5KX0gLiR7cmVtb3ZlRGEoY2hpbGRyZW4uY2hpbGRyZW4pfSA+IGRpdjpudGgtY2hpbGQoMilgKVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coc2VsZWN0cylcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzLmpvaW4oXCIsIFwiKX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzLm1hcChlID0+IGUrXCI6aG92ZXJcIikuam9pbihcIiwgXCIpfSAge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5DbGFzc05vcm1hbGl6ZXIgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy51bnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJ0RWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5ub3JtYWxpemVFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGF0Y2hET01NZXRob2RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgdGhpcy51bnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkSWdub3JlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5lbmRzV2l0aChcInB4XCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiY2hcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJlbVwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcIm1zXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcImxheWVyQ29udGFpbmVyLVwiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpICYmICh2YWx1ZS5sZW5ndGggPT0gNyB8fCB2YWx1ZS5sZW5ndGggPT0gNCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcImNhbGMoXCIpIHx8IHZhbHVlLmluY2x1ZGVzKFwicmdiYVwiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZHVsZUZpbHRlcihtb2R1bGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG1vZHVsZSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAobW9kdWxlLl9fZXNNb2R1bGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG1vZHVsZSkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIG1vZHVsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZHVsZVtiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLnNwbGl0KFwiLVwiKS5sZW5ndGggPT09IDEpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdCh2YWx1ZS5zcGxpdChcIiBcIilbMF0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5vcm1hbENsYXNzLm1hdGNoKHJhbmRDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5sZW5ndGggfHwgbWF0Y2gubGVuZ3RoIDwgMikgY29udGludWU7IC8vIFNob3VsZG4ndCBldmVyIGhhcHBlbiBzaW5jZSB0aGV5IHBhc3NlZCB0aGUgbW9kdWxlRmlsdGVyLCBidXQgeW91IG5ldmVyIGtub3dcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVsQ2FzZSA9IG1hdGNoWzFdLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gKz0gYCAke2NvbXBvbmVudE5hbWV9LSR7Y2FtZWxDYXNlfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBsZXQgbmV3U3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbENsYXNzLnN0YXJ0c1dpdGgoYCR7Y29tcG9uZW50TmFtZX0tYCkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nICs9IGAgJHtub3JtYWxDbGFzc31gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gPSBuZXdTdHJpbmcudHJpbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3JtYWxpemVFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNsZW4gPSBjbGFzc2VzLmxlbmd0aDsgYyA8IGNsZW47IGMrKykge1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KGNsYXNzZXNbY10pKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbGFzc2VzW2NdLm1hdGNoKHJhbmRDbGFzcylbMV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzID0gbWF0Y2guc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYCR7bm9ybWFsaXplZFByZWZpeH0tJHtuZXdDbGFzc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVuKSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoY2hpbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldmVydEVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5jaGlsZHJlblswXSk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBpZiAoY2xhc3Nlc1tjXS5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWRQcmVmaXh9LWApKSB0b1JlbW92ZS5wdXNoKGNsYXNzZXNbY10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4udG9SZW1vdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoRE9NTWV0aG9kcygpIHtcclxuICAgICAgICBjb25zdCBjb250YWlucyA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnM7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHRva2VuKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHRva2VucyA9IHRva2VuLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoY29udGFpbnMsIHRoaXMsIFt0b2tlbi5zcGxpdChcIiBcIilbMF1dKTtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRva2Vucy5ldmVyeSh0ID0+IGNvbnRhaW5zLmNhbGwodGhpcywgdCkpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGFkZCwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCByZW1vdmUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZTtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShyZW1vdmUsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbG9yZWRUZXh0IHtcclxuICAgIGluamVjdENvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbENvbG9yZWRUZXh0KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jYW5jZWxDb2xvcmVkVGV4dCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgICAgIGlmICghcHJvcHMgfHwgIXByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUNvbnRlbnQgPSBwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlQ29udGVudC50eXBlIHx8ICFtZXNzYWdlQ29udGVudC50eXBlLnR5cGUgfHwgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLmRpc3BsYXlOYW1lICE9IFwiTWVzc2FnZUNvbnRlbnRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFR5cGUgPSBtZXNzYWdlQ29udGVudC50eXBlLnR5cGU7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFR5cGUuX19vcmlnaW5hbE1ldGhvZCkgcmV0dXJuOyAvLyBEb24ndCBwYXRjaCBhZ2FpblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUgPSBmdW5jdGlvbihwcm9wcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBvcmlnaW5hbFR5cGUocHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZUNvbG9yID0gc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSA/IHByb3BzLm1lc3NhZ2UuY29sb3JTdHJpbmcgfHwgXCJcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5zdHlsZSA9IHtjb2xvcjogcm9sZUNvbG9yfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ2luYWxUeXBlO1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSwgb3JpZ2luYWxUeXBlKTtcclxuICAgICAgICB9fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZU1hcmt1cCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF0ubWFya3VwXHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitjbGFzc05hbWVNYXJrdXAuc3BsaXQoXCIgXCIpWzBdKS5mb3JFYWNoKGVsZW0gPT4ge1xyXG4gICAgICAgICAgICBlbGVtLnN0eWxlLnNldFByb3BlcnR5KFwiY29sb3JcIiwgXCJcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtiZENvbmZpZywgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbkNlcnRpZmllciwgeyBlbmNyeXB0U2V0dGluZ3NDYWNoZSwgZGVjcnlwdFNldHRpbmdzQ2FjaGUsIHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCB7IGNhcHR1cmVSZWplY3Rpb25TeW1ib2wgfSBmcm9tIFwiZXZlbnRzXCI7XHJcblxyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpLk1vZHVsZTtcclxuTW9kdWxlLmdsb2JhbFBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwLmdldEFwcFBhdGgoKSwgXCJub2RlX21vZHVsZXNcIikpO1xyXG5jbGFzcyBNZXRhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJNZXRhRXJyb3JcIjtcclxuICAgIH1cclxufVxyXG5jb25zdCBvcmlnaW5hbEpTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXTtcclxuY29uc3Qgb3JpZ2luYWxDU1NSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA/IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gOiAoKSA9PiB7cmV0dXJuIG51bGw7fTtcclxuY29uc3Qgc3BsaXRSZWdleCA9IC9bXlxcU1xcclxcbl0qPyg/OlxcclxcbnxcXG4pW15cXFNcXHJcXG5dKj9cXCpbXlxcU1xcclxcbl0/LztcclxuY29uc3QgZXNjYXBlZEF0UmVnZXggPSAvXlxcXFxALztcclxuXHJcbmV4cG9ydCBsZXQgYWRkb25DYWNoZSA9IHt9XHJcblxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hFeHRlbnNpb25zKCl7XHJcbiAgICAgICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgICAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJ0aGVtZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGx1Z2luc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fcGx1Z2luc0ZvbGRlciB8fCAodGhpcy5fcGx1Z2luc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInBsdWdpbnMvXCIpKSk7fVxyXG4gICAgZ2V0IHRoZW1lc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fdGhlbWVzRm9sZGVyIHx8ICh0aGlzLl90aGVtZXNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJ0aGVtZXMvXCIpKSk7fVxyXG5cclxuICAgIGxvYWRBZGRvbkNlcnRpZmllckNhY2hlKCl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikgIT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSBKU09OLnBhcnNlKGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikpKVxyXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0ge31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyhhZGRvbkNhY2hlKVxyXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICBpZighdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKXJldHVybiBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcblxyXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSBbe1xyXG4gICAgICAgICAgICAgICAga2V5OiBcInRpbWVzdGFtcFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVzdWx0XCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJoYXNoXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgIGZvcihsZXQgcHJvcCBvZiBwcm9wcyl7XHJcbiAgICAgICAgICAgICAgICBpZighKHByb3Aua2V5IGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcC5rZXldICE9PSBwcm9wLnR5cGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2YWx1ZS5oYXNoICE9PSBrZXkpe1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodmFsdWUucmVzdWx0LnN1c3BlY3QpeyAvLyByZWZldGNoIGZyb20gcmVtb3RlIHRvIGJlIHN1cmUgeW91J3JlIHVwIHRvIGRhdGUuXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUFkZG9uQ2FjaGUoKXtcclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcclxuICAgIH1cclxuXHJcbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSBcIkVOT0VOVFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVNb2R1bGUudW5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9PSBzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0uY2xvc2UoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgaGFzT2xkTWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8vTUVUQVwiKTtcclxuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XHJcbiAgICAgICAgaWYgKGhhc05ld01ldGEpIHJldHVybiB0aGlzLnBhcnNlTmV3TWV0YShjb250ZW50KTtcclxuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IHJhd01ldGEgPSBtZXRhLnN1YnN0cmluZyhtZXRhLmxhc3RJbmRleE9mKFwiLy9NRVRBXCIpICsgNiwgbWV0YS5sYXN0SW5kZXhPZihcIiovL1wiKSk7XHJcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcclxuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgY291bGQgbm90IGJlIHBhcnNlZC5cIik7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xyXG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcclxuICAgICAgICByZXR1cm4gcGFyc2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlTmV3TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XHJcbiAgICAgICAgbGV0IGZpZWxkID0gXCJcIjtcclxuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xyXG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGxpbmUuaW5kZXhPZihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcclxuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcclxuICAgICAgICBkZWxldGUgb3V0W1wiXCJdO1xyXG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwb3NzaWJsZVBhdGgpIHx8IGZpbGVuYW1lICE9PSBmcy5yZWFscGF0aFN5bmMocG9zc2libGVQYXRoKSkgcmV0dXJuIFJlZmxlY3QuYXBwbHkob3JpZ2luYWxSZXF1aXJlLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLnNpemUgPSBzdGF0cy5zaXplO1xyXG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YS5mb3JtYXQgPT0gXCJqc29uXCIpIG1ldGEuY3NzID0gbWV0YS5jc3Muc3BsaXQoXCJcXG5cIikuc2xpY2UoMSkuam9pbihcIlxcblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlkRXhwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMud2FybihcIk1vZHVsZSBOb3QgRXhwb3J0ZWRcIiwgYCR7bWV0YS5uYW1lfSwgcGxlYXNlIHN0YXJ0IHNldHRpbmcgbW9kdWxlLmV4cG9ydHNgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwbHVnaW46IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcclxuICAgICAgICAgICAgICAgIGdldEF1dGhvcjogKCkgPT4ge3JldHVybiBcIj8/P1wiO30sXHJcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGEuc291cmNlID8gZGF0YS5zb3VyY2UgOiBcIlwiLFxyXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuXHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgfSwgKGhhc2gpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGVbcmVzdWx0Lmhhc2hdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiByZXN1bHQuaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICBpZighY29udGVudC5uYW1lKXJldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNhbm5vdCBlc2NhcGUgdGhlIElELlwiLCBlcnJvcjoge21lc3NhZ2U6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwiLCBzdGFjazogXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCJ9fVxyXG4gICAgICAgIGNvbnRlbnQuaWQgPSBVdGlscy5lc2NhcGVJRChjb250ZW50Lm5hbWUpO1xyXG4gICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQudHlwZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbnN0cnVjdGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBiZHRoZW1lc1tjb250ZW50Lm5hbWVdO1xyXG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICB9ICAgXHJcblxyXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgd2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgdW5sb2FkZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fTt9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMb2FkZWQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbnRVbmxvYWQgPSB0aGlzLnVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYmFzZWRpcik7XHJcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcclxuICAgICAgICBjb25zdCBhZGRlZCA9IGZpbGVzLmZpbHRlcihmID0+ICFjb250ZW50TGlzdC5maW5kKHQgPT4gdC5maWxlbmFtZSA9PSBmKSAmJiBmLmVuZHNXaXRoKGZpbGVFbmRpbmcpICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmKSkuaXNGaWxlKCkpO1xyXG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcclxuICAgICAgICB0aGlzLnBhdGNoRXh0ZW5zaW9ucygpXHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb250ZW50TWFuYWdlciAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XHJcbiAqLyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3Qge2lwY1JlbmRlcmVyfSA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTtcclxuXHJcbmZ1bmN0aW9uIENvcmUoKSB7XHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhEYXRhU3RvcmUuY29uZmlnRmlsZSkpO1xyXG4gICAgLy8gdGhpcy5pbml0KCk7XHJcbn1cclxuXHJcbmxldCBtZXRob2RzXHJcblxyXG5Db3JlLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbihjb25maWcpIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XHJcbn07XHJcblxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XHJcbiAgICBnZXQoKXtcclxuICAgICAgICByZXR1cm4gbWV0aG9kc1xyXG4gICAgfVxyXG59KVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcclxuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWQpIHJldHVybjtcclxuICAgIG1ldGhvZHMgPSBtXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0ID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICB0aGlzLmhhc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZENvbmZpZy52ZXJzaW9uIDwgbWluU3VwcG9ydGVkVmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LkVEKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggRW5oYW5jZWREaXNjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoQXR0cmlidXRlcy5iaW5kKHRoaXMpLCBcIkxDIFBsdWdpbiBDZXJ0aWZpZXIgUGF0Y2hcIikoKTtcclxuXHJcbiAgICAvKlxyXG4gICAgY29uc3QgbGF0ZXN0TG9jYWxWZXJzaW9uID0gYmRDb25maWcudXBkYXRlciA/IGJkQ29uZmlnLnVwZGF0ZXIuTGF0ZXN0VmVyc2lvbiA6IGJkQ29uZmlnLmxhdGVzdFZlcnNpb247XHJcbiAgICBpZiAobGF0ZXN0TG9jYWxWZXJzaW9uID4gYmRDb25maWcudmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcIlVwZGF0ZSBBdmFpbGFibGVcIiwgW2BUaGVyZSBpcyBhbiB1cGRhdGUgYXZhaWxhYmxlIGZvciBCYW5kYWdlZEJEJ3MgSW5qZWN0b3IgKCR7bGF0ZXN0TG9jYWxWZXJzaW9ufSkuYCwgXCJZb3UgY2FuIGVpdGhlciB1cGRhdGUgYW5kIHJlc3RhcnQgbm93LCBvciBsYXRlci5cIl0sIHtcclxuICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiVXBkYXRlIE5vd1wiLFxyXG4gICAgICAgICAgICBjYW5jZWxUZXh0OiBcIk1heWJlIExhdGVyXCIsXHJcbiAgICAgICAgICAgIG9uQ29uZmlybTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb25VcGRhdGVGYWlsZWQgPSAoKSA9PiB7VXRpbHMuYWxlcnQoXCJDb3VsZCBOb3QgVXBkYXRlXCIsIGBVbmFibGUgdG8gdXBkYXRlIGF1dG9tYXRpY2FsbHksIHBsZWFzZSBkb3dubG9hZCB0aGUgaW5zdGFsbGVyIGFuZCByZWluc3RhbGwgbm9ybWFsbHkuPGJyIC8+PGJyIC8+PGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5Eb3dubG9hZCBJbnN0YWxsZXI8L2E+YCk7fTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlkVXBkYXRlID0gYXdhaXQgdGhpcy51cGRhdGVJbmplY3RvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZGlkVXBkYXRlKSByZXR1cm4gb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHAgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICAgICAgICAgICAgICBhcHAucmVsYXVuY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBhcHAuZXhpdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlRmFpbGVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0qL1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgU2V0dGluZ3NcIik7XHJcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY2hlY2tGb3JHdWlsZHMoKTtcclxuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlVwZGF0aW5nIFNldHRpbmdzXCIpO1xyXG4gICAgc2V0dGluZ3NQYW5lbC5pbml0aWFsaXplU2V0dGluZ3MoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBBZGRvbnMgQ2FjaGVcIilcclxuICAgIGF3YWl0IGNvbnRlbnRNYW5hZ2VyLmxvYWRBZGRvbkNlcnRpZmllckNhY2hlKClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBQbHVnaW5zXCIpO1xyXG4gICAgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW5zKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgVGhlbWVzXCIpO1xyXG4gICAgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lcygpO1xyXG5cclxuICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCBhdG9iKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSkpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiUmVtb3ZpbmcgTG9hZGluZyBJY29uXCIpO1xyXG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgTWFpbiBPYnNlcnZlclwiKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmVyKCk7XHJcblxyXG4gICAgLy8gU2hvdyBsb2FkaW5nIGVycm9yc1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XHJcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IGJkcGx1Z2luRXJyb3JzLCB0aGVtZXM6IGJkdGhlbWVFcnJvcnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwidmVyc2lvblwiKTtcclxuICAgIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XHJcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBFbW9qaU1vZHVsZS5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkTGlzdEl0ZW1zLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgTGlzdCBJdGVtcyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZW1iZXJMaXN0LmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgTWVtYmVyIExpc3QgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFBvcG91dFdpbmRvdy5iaW5kKHRoaXMpLCBcIkJEIFBvcG91dCBXaW5kb3cgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBpZihiZENvbmZpZy5oYXZlSW5zdGFsbGVkRGVmYXVsdCl7XHJcbiAgICAgICAgbGV0IGFsZXJ0ID0gVXRpbHMuYWxlcnQoXCJGaXJzdCBJbnN0YWxsYXRpb25cIiwgXCJBcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaW5zdGFsbCBMaWdodGNvcmQsIFdlIGFkZGVkIHR3byBkZWZhdWx0IHRoZW1lcyBhbmQgb25lIGRlZmF1bHQgcGx1Z2luIGluIHlvdXIgcGx1Z2luL3RoZW1lIGZvbGRlci4gQ2hlY2sgaXQgaW4gdGhlIFBsdWdpbi9UaGVtZSBzZXR0aW5ncy5cIilcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBhbGVydC5vbkNsb3NlKHJlc29sdmUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudCA+IGRpdi50eXBlV2luZG93cy0xemEtbjcud2l0aEZyYW1lLWhhWWx0SS50aXRsZUJhci1BQzRwR1YuaG9yaXpvbnRhbFJldmVyc2UtM3RSalk3LmZsZXgtMU8xR0tZLmRpcmVjdGlvblJvd1JldmVyc2UtbThJaklxLmp1c3RpZnlTdGFydC0yTkRGemkuYWxpZ25TdHJldGNoLURwR1BmMy5kYS10eXBlV2luZG93cy5kYS13aXRoRnJhbWUuZGEtdGl0bGVCYXIuZGEtaG9yaXpvbnRhbFJldmVyc2UuZGEtZmxleC5kYS1kaXJlY3Rpb25Sb3dSZXZlcnNlLmRhLWp1c3RpZnlTdGFydC5kYS1hbGlnblN0cmV0Y2ggPiBkaXYud29yZG1hcmtXaW5kb3dzLTF2MGxZRC53b3JkbWFyay0yaUREZm0uZGEtd29yZG1hcmtXaW5kb3dzLmRhLXdvcmRtYXJrXCIpXHJcbiAgICBpZihsb2dvKXtcclxuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcclxuICAgICAgICBsb2dvLmlubmVySFRNTCA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIxMFwiIHdpZHRoPVwiNzBcIiB2aWV3Qm94PVwiMCAwIDcyLjU0IDEwXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTVweCwgbWFyZ2luLXRvcDogMTBweFwiPlxyXG4gICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNDQuODEsOS42N1Y2LjMzYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFBMy41MywzLjUzLDAsMCwwLDQ2LjIsM2MtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS42N2MwLDIuMjEsMS44OSwzLjMzLDMuNzcsMy4zM2EzLjg3LDMuODcsMCwwLDAsMy40NS0yLjE4bC0yLjEyLTFDNDcsMTEuMTcsNDQuODEsMTAuODUsNDQuODEsOS42N1pNMTAuNjgsMTIuODloMi40MVYzLjE3SDEwLjY4Wk03MS43NiwzLjE0SDY4LjE5VjcuMjNMNzAuNTcsOS40di00aDEuMjdjLjgxLDAsMS4yMS40MSwxLjIxLDF2M2MwLC42My0uMzgsMS4wNS0xLjIxLDEuMDVINjguMTh2Mi4zMWgzLjU3YzEuOTIsMCwzLjcyLTEsMy43Mi0zLjJWNi4zOUM3NS40OCw0LjEzLDczLjY4LDMuMTQsNzEuNzYsMy4xNFpNNTQuMjIsM2MtMiwwLTQsMS4xLTQsMy4zNFY5LjY2YzAsMi4yMywyLDMuMzQsNCwzLjM0czMuOTUtMS4xMSwzLjk1LTMuMzRWNi4zNEM1OC4xOSw0LjExLDU2LjIsMyw1NC4yMiwzWm0xLjU1LDYuNjZjMCwuNy0uNzgsMS4wNi0xLjU0LDEuMDZzLTEuNTUtLjM1LTEuNTUtMS4wNlY2LjM0YzAtLjcyLjc1LTEuMSwxLjUtMS4xczEuNTkuMzUsMS41OSwxLjFaTTY2Ljg0LDYuMzRjMC0yLjI5LTEuNTgtMy4yLTMuNTUtMy4ySDU5LjQ2djkuNzNoMi40NVY5Ljc3aC40M2wyLjIyLDMuMDloM0w2NSw5LjUyQzY2LjEzLDkuMTUsNjYuODQsOC4xNCw2Ni44NCw2LjM0Wk02My4zMyw3LjY1SDYxLjkxVjUuNDNoMS40MkExLjExLDEuMTEsMCwxLDEsNjMuMzMsNy42NVpNMjkuODMsMTNoMi40MlYzLjA2SDI5LjgzVjYuNzNsLTMsMFYzLjA5SDI0Ljd2OS43OGgyLjE0VjguNjhsMywwWk0xNy4xNiw5Ljc2VjYuNDJjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MWEzLjU1LDMuNTUsMCwwLDAtMy4zNi0yLjI0Yy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5Ljc2YzAsMi4yMSwyLDMuMTUsMy45LDMuMTVzMy41OC0xLDMuNTgtM1Y3LjU4SDE4Ljc5bDAsMS4zNkgyMC4zdi43N0MyMC4zLDEwLjkyLDE3LjE2LDEwLjk0LDE3LjE2LDkuNzZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjkzIC0zKVwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIwIDkuOTcgNi41IDEwIDYuNSA3LjYzIDIuNDEgNy42MyAyLjQxIDAuMjYgMCAyLjI2IDAgOS45N1wiLz5cclxuPC9zdmc+YFxyXG4gICAgfVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hQb3BvdXRXaW5kb3cgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlXHJcbiAgICB0aGlzLmNhbmNlbFBhdGNoUG9wb3V0V2luZG93ID0gKCkgPT4ge1xyXG4gICAgICAgIGNhbmNlbGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRXaW5kb3cpXHJcbiAgICAudGhlbihwb3BvdXRNb2R1bGUgPT4ge1xyXG4gICAgICAgIGlmKGNhbmNlbGVkKXJldHVyblxyXG5cclxuICAgICAgICAvLyBOb3QgYSBnb29kIGlkZWEgdG8gZG8gaXQgbGlrZSB0aGF0LlxyXG4gICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLl9pbnRlcmNlcHRvclxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlci5zZXRJbnRlcmNlcHRvcihmdW5jdGlvbihhY3Rpb24pe1xyXG4gICAgICAgICAgICBpZihhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IFwiUE9QT1VUX1dJTkRPV19PUEVOXCIpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyID0gYWN0aW9uLnJlbmRlclxyXG4gICAgICAgICAgICAgICAgYWN0aW9uLnJlbmRlciA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyMSA9IHJlbmRlci5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlMSA9IHJlbmRlcjEudHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcjEudHlwZSA9IGZ1bmN0aW9uKHByb3BzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyMiA9IHR5cGUxKHByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwcm9wcywgcmVuZGVyMilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcjJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVuZGVyMSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBpbnRlcmNlcHRvci5jYWxsKHRoaXMsIGFjdGlvbilcclxuICAgICAgICB9KVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJQT1BPVVRfV0lORE9XX09QRU5cIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC05XCJdKXJldHVyblxyXG4gICAgICAgICAgICBpZihjYW5jZWxlZClyZXR1cm5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiUE9QT1VUIFRIRU1FXCIsIFwiUG9wb3V0IG9wZW5lZCwgQWRkaW5nIHRoZW1lXCIpXHJcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhldilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHBvcG91dE1vZHVsZS5kZWZhdWx0LmdldFdpbmRvdyhldi5rZXkpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh3aW5kb3cpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dHJpYnV0ZXMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGxldCBhdHRyaWJzUGF0Y2hzID0gW11cclxuICAgIHRoaXMuY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgYXR0cmlic1BhdGNocy5mb3JFYWNoKGUgPT4gZSgpKVxyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlKCF2Mi5NZXNzYWdlQ29tcG9uZW50KWF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKVxyXG4gICAgXHJcbiAgICAvLyBUT0RPOiB0cnkgdG8gcGF0Y2ggY29ycmVjdGx5IHRoZSB1c2VyIHBvcG91dCBvbiBhIG5leHQgdXBkYXRlXHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJEaXNjb3JkVGFnXCIpXHJcbiAgICAudGhlbihEaXNjb3JkVGFnID0+IHtcclxuICAgICAgICBsZXQgRGlzY29yZFRhZ0NvbXAgPSBEaXNjb3JkVGFnLmRlZmF1bHRcclxuICAgICAgICBEaXNjb3JkVGFnLmRlZmF1bHQgPSBmdW5jdGlvbihwcm9wcyl7XHJcbiAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IERpc2NvcmRUYWdDb21wKHByb3BzKVxyXG5cclxuICAgICAgICAgICAgbGV0IGlkID0gdXVpZHY0KClcclxuXHJcbiAgICAgICAgICAgIGxldCBiYWRnZURpdiA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBcIjVweFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAga2V5OiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmhlcml0XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpXHJcblxyXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBbcmV0dXJuVmFsdWVdXHJcblxyXG4gICAgICAgICAgICBpZiAocHJvcHMudXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgcHJvcHMudXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChiYWRnZURpdilcclxuICAgICAgICAgICAgbGV0IGRpdiA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBjaGlsZHJlbilcclxuICAgICAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHByb3BzLnVzZXIsIGZhbHNlKVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRpdlxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlKXsgLy8gdGhpcyBjYW4gYmUgYSBibG9ja2VkIG1lc3NhZ2UgKG5vdCBvcGVuZWQpXHJcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgICAgICB9XHJcbiAgICB9fSkpXHJcbiAgICAgICAgLypcclxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJtZXNzYWdlLWlkXCJdID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlLmlkXHJcbiAgICB9fSkpKi9cclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB0aW1lc0NoZWNrZWQgPSAwO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBCRFYyLmd1aWxkQ2xhc3Nlcy53cmFwcGVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9YCkubGVuZ3RoID4gMCkgdGltZXNDaGVja2VkKys7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBjb25zdCBibG9iID0gQkRWMi5ndWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfSAuJHtndWlsZH0gLiR7YmxvYn1gKS5sZW5ndGggPiAwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiB7c2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTt9KTtcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5qZWN0RXh0ZXJuYWxzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyBObyBleHRlcm5hbHNcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXHJcbiAgICAudGhlbihzZXR0aW5nTW9kdWxlID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xyXG4gICAgICAgIHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcblxyXG4gICAgICAgICAgICBpZighcmVzdWx0WzFdKXJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgaWYocmVzdWx0WzFdLnNlY3Rpb24gPT09IFwiTXkgQWNjb3VudFwiKXsgLy8gdXNlciBzZXR0aW5ncywgbm90IGd1aWxkIHNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICBsZXQgcG9wZWQgPSBbXVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5zZXR0aW5nc1BhbmVsLnJlbmRlclNpZGViYXIodGhpcykpXHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUocG9wZWRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvcGVkLnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG59O1xyXG5cclxuXHJcbmxldCBjbGFzc05hbWVMYXllclxyXG5sZXQgY2xhc3NOYW1lU29jaWFsTGlua3NcclxubGV0IGNsYXNzTmFtZU1vZGFsXHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkLCBza2lwXHJcbiAgICAgICAgICAgIGlmICghbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggfHwgIShtdXRhdGlvbi5hZGRlZE5vZGVzWzBdIGluc3RhbmNlb2YgRWxlbWVudCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lTGF5ZXIpY2xhc3NOYW1lTGF5ZXIgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuYW5pbWF0aW5nKVswXS5sYXllclxyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lU29jaWFsTGlua3MpY2xhc3NOYW1lU29jaWFsTGlua3MgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc1xyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lTW9kYWwpY2xhc3NOYW1lTW9kYWwgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1vZGFsICYmIHR5cGVvZiBlLm1vZGFsID09PSBcInN0cmluZ1wiICYmIGUuaW5uZXIgJiYgdHlwZW9mIGUuaW5uZXIgPT09IFwic3RyaW5nXCIgJiYgIWUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlKVswXS5tb2RhbFxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSA9PT0gXCJHVUlMRF9TRVRUSU5HU1wiKXtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjtcclxuXHJcbiAgICAgICAgICAgIC8vIEVtb2ppIFBpY2tlclxyXG4gICAgICAgICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXHJcbiAgICAgICAgICAgIC8vaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyMikgJiYgbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZUVtb2ppUGlja2VyKS5sZW5ndGggICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrY2xhc3NOYW1lRW1vamlQaWNrZXIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUFuaW1hdG9yTGVmdCkpIHF1aWNrRW1vdGVNZW51Lm9ic0NhbGxiYWNrKG5vZGUpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xyXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICB9KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnNob3dDaGFuZ2Vsb2dNb2RhbCA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmFsZXJ0ID0gZnVuY3Rpb24odGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5hbGVydCh0aXRsZSwgY29udGVudCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaFNvY2lhbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuc29jaWFsUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IFRhYkJhciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiVGFiQmFyXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIVRhYkJhcikgcmV0dXJuO1xyXG4gICAgdGhpcy5zb2NpYWxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKFRhYkJhci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcclxuICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gM10udHlwZS5kaXNwbGF5TmFtZSAhPT0gXCJTZXBhcmF0b3JcIikgcmV0dXJuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZS50b1N0cmluZygpLmluY2x1ZGVzKFwic29jaWFsTGlua3NcIikpIHJldHVybjtcclxuICAgICAgICBpZiAoQW5jaG9yKSB7XHJcbiAgICAgICAgICAgIGxldCBzb2NpYWxNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc29jaWFsTGlua3MpWzBdXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZTtcclxuICAgICAgICAgICAgY29uc3QgbmV3T25lID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBvcmlnaW5hbCguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlID0gbmV3T25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lQ29sb3JNdXRlZCxcclxuICAgICAgICAgICAgc2l6ZXMsXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZVZlcnNpb25IYXNoXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JNdXRlZClbMF0uY29sb3JNdXRlZCxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVyc2lvbkhhc2gpWzBdLnZlcnNpb25IYXNoXHJcbiAgICAgICAgXVxyXG5cclxuICAgICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGAoJHtiZENvbmZpZy5oYXNoID8gYmRDb25maWcuaGFzaC5zdWJzdHJpbmcoMCwgNykgOiBiZENvbmZpZy5icmFuY2h9KWA7XHJcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbCA9IFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgTGlnaHRjb3JkICR7ZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIGAoJHsoZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLmNvbW1pdCB8fCBcIlVua25vd25cIikuc2xpY2UoMCwgNyl9KWApKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgQkJEICR7YmJkVmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgdmVyc2lvbkhhc2gpKVxyXG4gICAgICAgIF1cclxuICAgICAgICBcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzaW9ucyA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGU7XHJcbiAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBvcmlnaW5hbFZlcnNpb25zKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5zcGxpY2UoMSwgMCwgYWRkaXRpb25hbCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgfTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbmNvbnN0IGdldEd1aWxkQ2xhc3NlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgZ3VpbGRzV3JhcHBlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwid3JhcHBlclwiLCBcInVucmVhZE1lbnRpb25zQmFyXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJndWlsZHNFcnJvclwiLCBcInNlbGVjdGVkXCIpO1xyXG4gICAgY29uc3QgcGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYmxvYkNvbnRhaW5lclwiKTtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZExpc3RJdGVtcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRDbGFzc2VzID0gZ2V0R3VpbGRDbGFzc2VzKCk7XHJcbiAgICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcclxuICAgIGNvbnN0IGJsb2JDbGFzcyA9IEd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgIGNvbnN0IHJlYWN0SW5zdGFuY2UgPSBCRFYyLmdldEludGVybmFsSW5zdGFuY2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7bGlzdEl0ZW1DbGFzc30gLiR7YmxvYkNsYXNzfWApLnBhcmVudEVsZW1lbnQpO1xyXG4gICAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xyXG4gICAgaWYgKCFHdWlsZENvbXBvbmVudCkgcmV0dXJuO1xyXG4gICAgdGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRDb21wb25lbnQucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEucmV0dXJuVmFsdWUgJiYgZGF0YS50aGlzT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGREYXRhID0gZGF0YS50aGlzT2JqZWN0LnByb3BzO1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnVucmVhZCkgY2xhc3NOYW1lICs9IFwiIGJkLXVucmVhZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSBjbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hdWRpbykgY2xhc3NOYW1lICs9IFwiIGJkLWF1ZGlvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudmlkZW8pIGNsYXNzTmFtZSArPSBcIiBiZC12aWRlb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSBjbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5hbmltYXRhYmxlKSBjbGFzc05hbWUgKz0gXCIgYmQtYW5pbWF0YWJsZVwiO1xyXG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRQaWxscyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRQaWxsUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IGd1aWxkUGlsbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgIW0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQudG9TdHJpbmcgJiYgbS5kZWZhdWx0LnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJ0cmFuc2xhdGUzZFwiKSk7XHJcbiAgICBpZiAoIWd1aWxkUGlsbCkgcmV0dXJuO1xyXG4gICAgdGhpcy5ndWlsZFBpbGxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKGd1aWxkUGlsbCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgIGlmIChwcm9wcy51bnJlYWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXVucmVhZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuaG92ZXJlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtaG92ZXJlZFwiO1xyXG4gICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICBjb25zdCBndWlsZENvbXBvbmVudHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInJlbmRlckxpc3RJdGVtXCIpO1xyXG4gICAgaWYgKCFndWlsZENvbXBvbmVudHMgfHwgIUd1aWxkcykgcmV0dXJuO1xyXG4gICAgY29uc3QgR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGd1aWxkQ29tcG9uZW50cy5TZXBhcmF0b3IoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGQtc2VwYXJhdG9yXCI7XHJcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZ3VpbGRTZXBhcmF0b3JQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkcy5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNoaWxkcmVuWzNdLnR5cGUgPSBHdWlsZFNlcGFyYXRvcjtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuQXR0YWNobWVudFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBBdHRhY2htZW50ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXR0YWNobWVudFwiKVswXSAvLyB0ZW1wb3JhcnlcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIUF0dGFjaG1lbnQgfHwgIUF0dGFjaG1lbnQuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5BdHRhY2htZW50UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChBdHRhY2htZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSlyZXR1cm5cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0gfHwgbnVsbFxyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdHRhY2htZW50IHx8ICFhdHRhY2htZW50LnVybClyZXR1cm5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xyXG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcclxuICAgICAgICB9KSlcclxuICAgICAgICBQbHVnaW5DZXJ0aWZpZXIucGF0Y2goYXR0YWNobWVudCwgXCJjZXJ0aWZpZWQtXCIraWQpXHJcbiAgICB9fSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lc3NhZ2VIZWFkZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIk1lc3NhZ2VUaW1lc3RhbXBcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZXNzYWdlSGVhZGVyIHx8ICFNZXNzYWdlSGVhZGVyLmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMubWVzc2FnZUhlYWRlclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVzc2FnZUhlYWRlciwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xyXG4gICAgICAgIC8vIGNvbnN0IGhlYWRlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhdXRob3IuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgYXV0aG9yLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBhdXRob3IsIHRydWUpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XHJcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhZGdlcy1cIitpZClcclxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXHJcbiAgICAgICAgaWYoZGl2LmNoaWxkTm9kZXMubGVuZ3RoKXJldHVyblxyXG4gICAgICAgIGxldCBibG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYmxvY2tEaXYpXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG5cclxuICAgICAgICBkaXN0YW50LmdldEJhZGdlcyh1c2VyLmlkKVxyXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XHJcbiAgICAgICAgICAgIGJhZGdlcy5mb3JFYWNoKGJhZGdlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlID09PSBcInVzZXJcIil7Ly8gcmVxdWlyZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnVzZXIgPSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICAgICAgICBpZighYmFkZ2UuaHJlZil7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaHJlZiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogYmFkZ2UubmFtZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgYmFkZ2UuaHJlZiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcykpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoZWxlbWVudCwgZGl2MilcclxuICAgICAgICAgICAgICAgIGRpdjIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZW1iZXJMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZW1iZXJMaXN0UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lbWJlckxpc3RJdGVtIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUgfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZS5yZW5kZXJEZWNvcmF0b3JzKSByZXR1cm47XHJcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgdXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiYWRnZXMtXCIraWR9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS51cGRhdGVJbmplY3RvciA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgaW5qZWN0aW9uUGF0aCA9IERhdGFTdG9yZS5pbmplY3Rpb25QYXRoO1xyXG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbiAgICBjb25zdCBybXJmID0gcmVxdWlyZShcInJpbXJhZlwiKTtcclxuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xyXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZShcIm1rZGlycFwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSAvKnJlcXVpcmUoXCJyZXF1ZXN0XCIpOyovIG51bGxcclxuXHJcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGluamVjdGlvblBhdGgsIFwiLi5cIik7XHJcbiAgICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcclxuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcclxuICAgIGNvbnN0IHNhdmVkWmlwID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiaW5qZWN0b3IuemlwXCIpO1xyXG4gICAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTtcclxuXHJcbiAgICAvLyBEb3dubG9hZCB0aGUgaW5qZWN0b3IgemlwIGZpbGVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRG93bmxvYWRpbmcgXCIgKyB6aXBMaW5rKTtcclxuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5nZXQoe3VybDogemlwTGluaywgZW5jb2Rpbmc6IG51bGx9LCBhc3luYyAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XHJcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKHNhdmVkWmlwLCByZXMpKTtcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGUoc2F2ZWRaaXAsIGJvZHksIGVyciA9PiByZXNvbHZlKCFlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gc3VjY2VzcztcclxuXHJcbiAgICAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXHJcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhleHRyYWN0ZWRGb2xkZXIsIHJlcykpO1xyXG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcbiAgICBcclxuICAgIC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXHJcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcclxuICAgIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbihlbnRyeSkge1xyXG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMsIHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBta2RpcnBcclxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcclxuXHJcbiAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24oKSB7emlwZmlsZS5yZWFkRW50cnkoKTt9KTsgLy8gR28gdG8gbmV4dCBmaWxlIGFmdGVyIHRoaXNcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcclxuXHJcbiAgICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGZpbmFsIHN0ZXBcclxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoaW5qZWN0aW9uUGF0aCwgYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBgUmVuYW1pbmcgJHtwYXRoLmJhc2VuYW1lKGV4dHJhY3RlZEZvbGRlcil9IHRvICR7Zm9sZGVyTmFtZX1gKTtcclxuICAgIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIkZhaWxlZCB0byByZW5hbWUgdGhlIGZpbmFsIGRpcmVjdG9yeVwiKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZW5hbWUgaGFkIGlzc3VlcywgZGVsZXRlIHdoYXQgd2UgdHJpZWQgdG8gcmVuYW1lIGFuZCByZXN0b3JlIGJhY2t1cFxyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uLiByZXN0b3JpbmcgYmFja3Vwcy5cIik7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGV4dHJhY3RlZEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCBldmVyeXRoaW5nIHNob3VsZCBoYXZlIGdvbmUgc21vb3RobHkuXHJcbiAgICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMudW5saW5rKHNhdmVkWmlwLCByZXNvbHZlKSk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTtcclxuXHJcbi8qKlxyXG4gKiBEb24ndCBleHBvc2UgY29yZSAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XHJcbiAqLyIsImNvbnN0IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fID0gd2luZG93LnJlcXVpcmVcclxuXHJcbmltcG9ydCB7YmRDb25maWd9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcblxyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCByZWxlYXNlQ2hhbm5lbCA9IERpc2NvcmROYXRpdmUuZ2xvYmFscyA/IERpc2NvcmROYXRpdmUuZ2xvYmFscy5yZWxlYXNlQ2hhbm5lbCA6IERpc2NvcmROYXRpdmUuYXBwID8gRGlzY29yZE5hdGl2ZS5hcHAuZ2V0UmVsZWFzZUNoYW5uZWwoKSA6IFwic3RhYmxlXCI7XHJcblxyXG5sZXQgZGF0YVBhdGggPSBcIlwiO1xyXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSBkYXRhUGF0aCA9IHByb2Nlc3MuZW52LkFQUERBVEE7XHJcbmVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIGRhdGFQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiTGlicmFyeVwiLCBcIlByZWZlcmVuY2VzXCIpO1xyXG5lbHNlIGRhdGFQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA/IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA6IHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZ1wiKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EYXRhU3RvcmUgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGF0YVBhdGgpKSBmcy5ta2RpclN5bmMoZGF0YVBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRhdGFQYXRoLCBcInBsdWdpbnNcIikpKSBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRhdGFQYXRoLCBcInBsdWdpbnNcIikpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRhdGFQYXRoLCBcInRoZW1lc1wiKSkpIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGF0YVBhdGgsIFwidGhlbWVzXCIpKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuQkRGaWxlKSkgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLkJERmlsZSwgXCJiaW5hcnlcIikpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnNldHRpbmdzRmlsZSkpIHJldHVybjtcclxuICAgICAgICAgICAgbGV0IHNldHRpbmdzID0gX19ub25fd2VicGFja19yZXF1aXJlX18odGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHtbcmVsZWFzZUNoYW5uZWxdOiBzZXR0aW5nc30pO1xyXG4gICAgICAgICAgICBlbHNlIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRCRERhdGEoXCJzZXR0aW5nc1wiLCBzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICBVdGlscy5hbGVydChcIkNvcnJ1cHQgU3RvcmFnZVwiLCBcIlRoZSBiZCBzdG9yYWdlIGhhcyBzb21laG93IGJlY29tZSBjb3JydXB0LiBZb3UgbWF5IGVpdGhlciB0cnkgdG8gc2FsdmFnZSB0aGUgZmlsZSBvciBkZWxldGUgaXQgdGhlbiByZWxvYWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW5qZWN0aW9uUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdGlvblBhdGgpIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoO1xyXG4gICAgICAgIGNvbnN0IGVsZWN0cm9uID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHA7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IGVsZWN0cm9uLmdldEFwcFBhdGgoKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nQmFzZSA9IGVsZWN0cm9uLmdldFBhdGgoXCJ1c2VyRGF0YVwiKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nTG9jYXRpb24gPSBwYXRoLnJlc29sdmUocm9hbWluZ0Jhc2UsIGVsZWN0cm9uLmdldFZlcnNpb24oKSwgXCJtb2R1bGVzXCIsIFwiZGlzY29yZF9kZXNrdG9wX2NvcmVcIiwgXCJpbmplY3RvclwiKTtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShiYXNlLCBcIi4uXCIsIFwiYXBwXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlYWxMb2NhdGlvbiA9IGZzLmV4aXN0c1N5bmMobG9jYXRpb24pID8gbG9jYXRpb24gOiBmcy5leGlzdHNTeW5jKHJvYW1pbmdMb2NhdGlvbikgPyByb2FtaW5nTG9jYXRpb24gOiBudWxsO1xyXG4gICAgICAgIGlmICghcmVhbExvY2F0aW9uKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSByZWFsTG9jYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ0ZpbGUoKSB7cmV0dXJuIHRoaXMuX2NvbmZpZ0ZpbGUgfHwgKHRoaXMuX2NvbmZpZ0ZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5pbmplY3Rpb25QYXRoLCBcImJldHRlcmRpc2NvcmRcIiwgXCJjb25maWcuanNvblwiKSk7fVxyXG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoZGF0YVBhdGgsIFwiYmRzdG9yYWdlLmpzb25cIikpO31cclxuICAgIGdldCBzZXR0aW5nc0ZpbGUoKSB7cmV0dXJuIHRoaXMuX3NldHRpbmdzRmlsZSB8fCAodGhpcy5fc2V0dGluZ3NGaWxlID0gcGF0aC5yZXNvbHZlKGRhdGFQYXRoLCBcImJkc2V0dGluZ3MuanNvblwiKSk7fVxyXG4gICAgZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSB7cmV0dXJuIHBhdGgucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBwbHVnaW5OYW1lICsgXCIuY29uZmlnLmpzb25cIik7fVxyXG5cclxuICAgIGdldFNldHRpbmdHcm91cChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2V0dGluZ0dyb3VwKGtleSwgZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSA9IGRhdGE7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XSB8fCBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJERGF0YShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0Q29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0xpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlclxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3B5U2VsZWN0b3JMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoZS50YXJnZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xheWVyLCBcclxuICAgICAgICAgICAgICAgIGNsYXNzSXRlbXNcclxuICAgICAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5kaXNhYmxlZFBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tZW51KVswXVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XHJcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5tZW51KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudCA+IC5cIitVdGlscy5yZW1vdmVEYShjbGFzc0xheWVyLmxheWVyQ29udGFpbmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTGF5ZXIubGF5ZXJ9XCI+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5hcHBlbmQoY20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWVudVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmlkID0gXCJiZC1jb3B5LXNlbGVjdG9yLWNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ29weSBTZWxlY3RvciBBY3Rpb25zXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ2xhc3NlcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc2Nyb2xsZXJXcmFwKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlckNsYXNzZXMudGhlbWVHaG9zdEhhaXJsaW5lfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlcldyYXAuYXBwZW5kKHNjcm9sbGVyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtLmFwcGVuZChzY3JvbGxlcldyYXApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNNID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSAhPT0gMjcpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gY20uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWkgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5pdGVtfSAke2NsYXNzSXRlbXMubGFiZWxDb250YWluZXJ9ICR7Y2xhc3NJdGVtcy5jb2xvckRlZmF1bHR9XCIgcm9sZT1cIm1lbnVpdGVtXCIgaWQ9XCJiZC1jb3B5LXNlbGVjdG9yLWl0ZW0tY21cIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuTmF0aXZlTW9kdWxlLmNvcHkoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBET00ucXVlcnlBbGwoXCJkaXZbcm9sZT1tZW51aXRlbV0uXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5hZGQoY2xhc3NJdGVtcy5mb2N1c2VkKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xyXG4gICAgICAgICAgICAgICAgaWYoc2Nyb2xsZXIuY2hpbGROb2Rlcy5sZW5ndGgpeyAvLyBhcGVuZCBhIHNlcGFyYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5zZXBhcmF0b3J9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKGNtZyk7XHJcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZyBcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dChhdHRhY2gsIDEpO1xyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RvcihlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGxQYXRoKGVsKXtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcclxuICAgICAgICAgICAgICBpZiAoZWwuaWQpe1xyXG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0xLGU9ZWw7ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2U9ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLGMrKyk7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKygodHlwZW9mIGVsLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbC5jbGFzc05hbWUpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhIWUpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWw9ZWwucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzLmpvaW4oXCIgPiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLmdldFJ1bGVzKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdFJ1bGUgPSBydWxlc1tydWxlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICBpZiAobGF0ZXN0UnVsZSkgcmV0dXJuIGxhdGVzdFJ1bGUuc2VsZWN0b3JUZXh0O1xyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCkgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gO1xyXG4gICAgICAgIHJldHVybiBgLiR7QXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gOyovXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UnVsZXMoZWxlbWVudCwgY3NzID0gZWxlbWVudC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzKSB7XHJcbiAgICAgICAgLy9pZiAod2luZG93LmdldE1hdGNoZWRDU1NSdWxlcykgcmV0dXJuIHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzID0gWy4uLmNzc10uZmlsdGVyKHMgPT4gIXMuaHJlZiB8fCAhcy5ocmVmLmluY2x1ZGVzKFwiQmV0dGVyRGlzY29yZEFwcFwiKSk7XHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSBzaGVldHMubWFwKHMgPT4gWy4uLihzLmNzc1J1bGVzIHx8IFtdKV0pLmZsYXQoKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50UnVsZXMgPSBydWxlcy5maWx0ZXIociA9PiByICYmIHIuc2VsZWN0b3JUZXh0ICYmIGVsZW1lbnQubWF0Y2hlcyhyLnNlbGVjdG9yVGV4dCkgJiYgci5zdHlsZS5sZW5ndGggJiYgci5zZWxlY3RvclRleHQuc3BsaXQoXCIsIFwiKS5sZW5ndGggPCA4ICYmICFyLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRSdWxlcztcclxuICAgIH1cclxufTsiLCJleHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzYWJsZVR5cGluZyB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5zdGFydFR5cGluZylcclxuICAgICAgICAudGhlbih0eXBpbmdNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZ1xyXG4gICAgICAgICAgICB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBpZihzZWxmLmRpc2FibGVkKXJldHVybiBzdGFydFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdG9wVHlwaW5nID0gdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RvcFR5cGluZ1xyXG4gICAgICAgICAgICB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0b3BUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EaXNhYmxlVHlwaW5nID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJ1Z0h1bnRlckJhZGdlIGZyb20gXCIuLi9zdmcvYnVnX2h1bnRlclwiXHJcbmltcG9ydCBMaWdodGNvcmRVc2VyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9MaWdodGNvcmRVc2VyXCI7XHJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgeyBzZXR0aW5nc0Nvb2tpZSB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ2lyY3VzIGZyb20gXCIuLi9zdmcvY2lyY3VzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0KCkgeyAvLyBHZW5lcmF0ZSBVVUlEIChObyBjcnlwdG8gcm5nKVxyXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xyXG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufSAgXHJcblxyXG5jb25zdCBhd2FpdGluZ0JhZGdlc1Byb21pc2VzID0ge31cclxubGV0IGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc3RhbnRTZXJ2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLl9jYWNoZSA9IHtcclxuICAgICAgICAgICAgYmFkZ2VzOiB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EaXN0YW50U2VydmVyID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYWNoZSgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZVxyXG4gICAgfVxyXG5cclxuICAgIHNldCBjYWNoZShkYXRhKXtcclxuICAgICAgICBpZih0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdGhpcy5fY2FjaGUgIT09IFwib2JqZWN0XCIpcmV0dXJuIHRoaXMuX2NhY2hlID0gZGF0YVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fY2FjaGUsIGRhdGEpXHJcbiAgICB9LypcclxuXHJcbiAgICBhc3luYyBkZWxldGUoKXtcclxuICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJEZWxldGluZyBhbGwgaW5mb3MgYWJvdXQgeW91IG9uIExpZ2h0Y29yZCBTZXJ2ZXJzLi4uXCIsIHt0eXBlOiBcIndhcm5cIn0pXHJcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlcXVlc3QoUm91dGVzLmRlbGV0ZSwgXCJkZWxldGVcIilcclxuICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCwgY291bGRuJ3QgZGVsZXRlIGluZm9ybWF0aW9ucy4gU2VlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3NcIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGRlbGV0ZSBhbGwgaW5mb3JtYXRpb25zOiAkeyhyZXMuc3RhdHVzK1wiIFwiK3Jlcy5zdGF0dXNUZXh0K1wiIFwiK2F3YWl0IHJlcy50ZXh0KCkpfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBTdWNjZXNmdWxseSBkZWxldGVkIGluZm9ybWF0aW9ucy5gKVxyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJTdWNjZXNmdWxseSBkZWxldGVkIGluZm9ybWF0aW9uc1wiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxyXG4gICAgICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5BdXRob3JpemF0aW9uID0gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCwgY291bGRuJ3QgZGVsZXRlIGluZm9ybWF0aW9ucy4gU2VlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3NcIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7ZXJyLnN0YWNrfWApXHJcbiAgICAgICAgfSlcclxuICAgIH0qL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSB1c2VyIElEIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Q29uc3RhbnRzW1wiYmFkZ2VzXCJdPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0QmFkZ2VzKHVzZXIpe1xyXG4gICAgICAgIGlmKHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdKXJldHVybiB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuXHJcbiAgICAgICAgbGV0IHJlc29sdmVcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxyXG4gICAgICAgIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0gPSBuZXdQcm9taXNlXHJcblxyXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBDb25zdGFudHMuYmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoYmFkZ2UuZGVmYXVsdFVzZXJzLmluY2x1ZGVzKHVzZXIpKWJhZGdlcy5wdXNoKGJhZGdlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmZXRjaGVkQmFkZ2VzID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pcmV0dXJuIHJlc29sdmUoW10pXHJcbiAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2gucHVzaChbdXNlciwgcmVzb2x2ZV0pXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJzID0gYmFkZ2VzVG9GZXRjaFxyXG4gICAgICAgICAgICAgICAgaWYodXNlcnMubGVuZ3RoID09PSAwKXJldHVyblxyXG4gICAgICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcbiAgICAgICAgICAgICAgICBoYW5kbGVSZXF1ZXN0KFJvdXRlcy5iYWRnZXMsIFwiUE9TVFwiLCBKU09OLnN0cmluZ2lmeSh1c2Vycy5tYXAoZSA9PiBlWzBdKSkpXHJcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7Ly8gQ291bGRuJ3QgZmV0Y2ggYmFkZ2VzOiBzZXJ2ZXIgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHVzZXIgb2YgcmVzcG9uc2VCb2R5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlWzFdKHVzZXIuYmFkZ2VzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgaW5zdGFuY2VvZiBMaWdodGNvcmRFcnJvcikpY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcnMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgMClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgZmV0Y2hlZEJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cclxuICAgICAgICAgICAgaWYoYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gQWxyZWFkeSBpbnNlcnRlZC5cclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IE9iamVjdC5hc3NpZ24odGhpcy5jYWNoZS5iYWRnZXMsIHtbdXNlcl06IGJhZGdlc30pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICB9LCA2MDAwMDApO1xyXG5cclxuICAgICAgICByZXNvbHZlKGJhZGdlcylcclxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlUmVxdWVzdCA9IGZ1bmN0aW9uKHJvdXRlLCBtZXRob2QsIGRhdGEpe1xyXG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgTGlnaHRjb3JkRXJyb3IoXCJUaGUgY3VycmVudCBzZXR0aW5ncyBibG9ja2VkIHRoZSByZXF1ZXN0LlwiKSlcclxuICAgIH1cclxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xyXG4gICAgICAgIG1ldGhvZCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5BdXRob3JpemF0aW9uIHx8IFwiTm9uZTo6QW5vbnltb3VzXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLihkYXRhID8ge1xyXG4gICAgICAgICAgICBib2R5OiBkYXRhXHJcbiAgICAgICAgfSA6IHt9KVxyXG4gICAgfSlcclxufVxyXG5cclxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIFNFUlZFUl9VUkw6IFwiaHR0cHM6Ly9saWdodGNvcmQuZGVyb2t1Lnh5elwiLFxyXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IEFkZCBtb3JlIGJhZGdlcyArIHNlcnZlciBzaWRlIHN2Z1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgQnVnIEh1bnRlclwiLFxyXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiLFxyXG4gICAgICAgICAgICAgICAgXCI2OTYwMDM0NTY2MTEzODUzOTZcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IEJ1Z0h1bnRlckJhZGdlLFxyXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvYmFkZ2VzI2J1Z19odW50ZXJcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJCdWZmb29uXCIsXHJcbiAgICAgICAgICAgIGlkOiBcIjA2OTA0ZDMxLTY1YjQtNDFlYy1hNTBjLTg2NThiYmQxYWY5NlwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0VXNlcnM6IFtcclxuICAgICAgICAgICAgICAgIFwiMzg5MDE2ODk1NTQzNzA1NjAyXCIsXHJcbiAgICAgICAgICAgICAgICBcIjY2NDYwMDEzNDUyODY2MzU2NVwiLFxyXG4gICAgICAgICAgICAgICAgXCI2MjUzNTA2NTc4Mjk4OTYyMjRcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IENpcmN1cyxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL3lvdXR1LmJlL0VKdGI2ei1kbFQ4P3Q9MTQ1XCJcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZXMgPSB7XHJcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYFxyXG59IiwiLyoqXHJcbiAqIENvcHlyaWdodCAyMDE4IFphY2hhcnkgUmF1ZW5cclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXHJcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLFxyXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxyXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkXHJcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCxcclxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcclxuICogUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxyXG4gKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0ZcclxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXHJcbiAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxyXG4gKiBcclxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICogQG5hbWUgT2Zmc2V0XHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIE91dGVyIGhlaWdodCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIE91dGVyIHdpZHRoIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICovXHJcblxyXG4gLyoqXHJcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxyXG4gKiBAY2FsbGJhY2sgbW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyXHJcbiAqL1xyXG4gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVRvb2xzIHtcclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcclxuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBBZGRzIGEgc3R5bGUgdG8gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNzcyAtIGNzcyB0byBhZGQgdG8gdGhlIGRvY3VtZW50XHJcblx0ICovXHJcblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcclxuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKERPTVRvb2xzLmNyZWF0ZUVsZW1lbnQoYDxzdHlsZSBpZD1cIiR7aWR9XCI+JHtjc3N9PC9zdHlsZT5gKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgc3R5bGUgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVN0eWxlKGlkKSB7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzL3JlcXVpcmVzIGEgcmVtb3RlIHNjcmlwdCB0byBiZSBsb2FkZWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgc2NyaXB0XHJcblx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzY3JpcHQgaXMgbG9hZGVkXHJcblx0ICovXHJcblx0c3RhdGljIGFkZFNjcmlwdChpZCwgdXJsKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcblx0XHRcdHNjcmlwdC5pZCA9IGlkO1xyXG5cdFx0XHRzY3JpcHQuc3JjID0gdXJsO1xyXG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XHJcblx0XHRcdHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xyXG5cdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgcmVtb3RlIHNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU2NyaXB0KGlkKSB7XHJcbiAgICAgICAgaWQgPSB0aGlzLmVzY2FwZUlEKGlkKTtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gaHR0cHM6Ly9qYXZhc2NyaXB0LmluZm8vanMtYW5pbWF0aW9uXHJcbiAgICBzdGF0aWMgYW5pbWF0ZSh7dGltaW5nID0gXyA9PiBfLCB1cGRhdGUsIGR1cmF0aW9ufSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIFxyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBhbmltYXRlKHRpbWUpIHtcclxuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXHJcbiAgICAgICAgICBsZXQgdGltZUZyYWN0aW9uID0gKHRpbWUgLSBzdGFydCkgLyBkdXJhdGlvbjtcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPiAxKSB0aW1lRnJhY3Rpb24gPSAxO1xyXG4gICAgICBcclxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGVcclxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGltaW5nKHRpbWVGcmFjdGlvbik7XHJcbiAgICAgIFxyXG4gICAgICAgICAgdXBkYXRlKHByb2dyZXNzKTsgLy8gZHJhdyBpdFxyXG4gICAgICBcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgbXkgc2hpdCB2ZXJzaW9uIG9mIG5vdCBoYXZpbmcgdG8gdXNlIGAkYCBmcm9tIGpRdWVyeS4gTWVhbmluZ1xyXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cclxuICAgICAqIEl0IGFsc28gbWVhbnMgdGhhdCB5b3UgY2FuIHBhc3MgYSBzdHJpbmcgb2YgaHRtbCBhbmQgaXQgd2lsbCBwZXJmb3JtIGFuZCByZXR1cm4gYHBhcnNlSFRNTGAuXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUxcclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeSBvciBIVE1MIHRvIHBhcnNlXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIEVpdGhlciB0aGUgcmVzdWx0IG9mIGBwYXJzZUhUTUxgIG9yIGBxdWVyeWBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFEoc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUhUTUwoc2VsZWN0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcclxuICAgICAgICBpZiAoaXNIVE1MKSByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBmb3VuZCBlbGVtZW50IG9yIG51bGwgaWYgbm90IGZvdW5kXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbGAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gQXJyYXkgb2YgYWxsIGZvdW5kIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeUFsbChzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIHN0cmluZyBvZiBIVE1MIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLFxyXG4gICAgICogdGhlIHBhcnNlZCBIVE1MIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBkb2N1bWVudCBmcmFnbWVudCB7QHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnRGcmFnbWVudH0uXHJcbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgeW91IGhhdmUgYSBsaXN0IG9mIGVsZW1lbnRzIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZXkgY2FuIHRoZW4gYmUgYXBwZW5kZWQgYWxsIGF0IG9uY2UgdG8gYW5vdGhlciBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcGFyc2VkXHJcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcmFnbWVudD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuIHNob3VsZCBiZSB0aGUgcmF3IGBEb2N1bWVudEZyYWdtZW50YFxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcclxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xyXG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWx0ZXJuYXRlIG5hbWUgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MfSAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge3JldHVybiB0aGlzLnBhcnNlSFRNTChodG1sLCBmcmFnbWVudCk7fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGVzY2FwZXMgaXQgdXNpbmcgdGhlIGJyb3dlcidzIG93biBlc2NhcGluZyBtZWNoYW5pc20uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgZXNjYXBlZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZXNjYXBlSFRNTChodG1sKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgICAgICBjb25zdCBzcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgIHNwYW5FbGVtZW50LmFwcGVuZCh0ZXh0Tm9kZSk7XHJcbiAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gaHRtbDtcclxuICAgICAgICByZXR1cm4gc3BhbkVsZW1lbnQuaW5uZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIHJlbW92ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudDogVG9nZ2xlIGNsYXNzIHZhbHVlO1xyXG4gICAgICogaS5lLiwgaWYgY2xhc3MgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0IGFuZCByZXR1cm4gZmFsc2UsIGlmIG5vdCwgdGhlbiBhZGQgaXQgYW5kIHJldHVybiB0cnVlLlxyXG4gICAgICogV2hlbiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50OlxyXG4gICAgICogSWYgdGhlIHNlY29uZCBhcmd1bWVudCBldmFsdWF0ZXMgdG8gdHJ1ZSwgYWRkIHNwZWNpZmllZCBjbGFzcyB2YWx1ZSwgYW5kIGlmIGl0IGV2YWx1YXRlcyB0byBmYWxzZSwgcmVtb3ZlIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHRvZ2dsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5kaWNhdG9yXSAtIE9wdGlvbmFsIGluZGljYXRvciBmb3IgaWYgdGhlIGNsYXNzIHNob3VsZCBiZSB0b2dnbGVkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUsIGluZGljYXRvcikge1xyXG4gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBpZiAodHlwZW9mKGluZGljYXRvcikgIT09IFwidW5kZWZpbmVkXCIpIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMsIGluZGljYXRvcikpO1xyXG4gICAgICAgIGVsc2UgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYykpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGEgc3BlY2lmaWMgY2xhc3NcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKS5ldmVyeShjID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIG9uZSBjbGFzcyB3aXRoIGFub3RoZXJcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkTmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gcmVwbGFjZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld05hbWUgLSBOZXcgbmFtZSBmb3IgdGhlIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXBsYWNlQ2xhc3MoZWxlbWVudCwgb2xkTmFtZSwgbmV3TmFtZSkge1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2Uob2xkTmFtZSwgbmV3TmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBhcHBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFwcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUuYXBwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIHByZXBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIHByZXBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLnByZXBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50Lmluc2VydEFmdGVyKG90aGVyRWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXROb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbnNlcnRBZnRlcih0aGlzTm9kZSwgdGFyZ2V0Tm9kZSkge1xyXG4gICAgICAgIHRhcmdldE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc05vZGUsIHRhcmdldE5vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50LmFmdGVyKG5ld0VsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWZ0ZXIodGhpc05vZGUsIG5ld05vZGUpIHtcclxuICAgICAgICB0aGlzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCB0aGlzTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0b3IgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIrIFwiICsgc2VsZWN0b3IpIDogZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzdWJzZXF1ZW50IHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgbmV4dCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0QWxsKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwifiAqXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc3Vic2VxdWVudCBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGZvbGxvd2luZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0VW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIG5leHQucHVzaChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJldmlvdXMgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHJldHVybiBwcmV2aW91cyAmJiBwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSA/IHByZXZpb3VzIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBwcmVjZWVkaW5nIHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c0FsbChlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZWNlZWRpbmcgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCB3aGljaCBpbmRleCBpbiBjaGlsZHJlbiBhIGNlcnRhaW4gbm9kZSBpcy4gU2ltaWxhciB0byBqUXVlcnkncyBgJC5pbmRleCgpYFxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHRvIGZpbmQgaXRzIGluZGV4IGluIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIG5vZGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluZGV4SW5QYXJlbnQobm9kZSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgbGV0IG51bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09IDEpIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5pbmRleEluUGFyZW50fSAqL1xyXG4gICAgc3RhdGljIGluZGV4KG5vZGUpIHtyZXR1cm4gdGhpcy5pbmRleEluUGFyZW50KG5vZGUpO31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudCBpZiBpdCBtYXRjaGVzIHRoZSBzZWxlY3RvcixcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwYXJlbnQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgc2libGluZyBlbGVtZW50IG9yIG51bGxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdG9yIHx8IGVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGFuY2VzdG9ycyBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHBhcmVudHMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgcGFyZW50cyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIGlmIChzZWxlY3Rvcikgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKTtcclxuICAgICAgICBlbHNlIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFuY2VzdG9ycyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGFuY2VzdG9ycyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmICFlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHNpYmxpbmdzIG9mIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiKlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBzaWJsaW5ncyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaWJsaW5ncyhlbGVtZW50LCBzZWxlY3RvciA9IFwiKlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoZSA9PiBlICE9IGVsZW1lbnQgJiYgZS5tYXRjaGVzKHNlbGVjdG9yKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgY3NzIHN0eWxlcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdHlsZS4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFZhbHVlIHRvIHNldCBmb3IgYXR0cmlidXRlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3NzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClbYXR0cmlidXRlXTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgd2lkdGggZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSB3aWR0aCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgd2lkdGguICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gV2lkdGggdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd2lkdGgoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS53aWR0aCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBoZWlnaHQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBoZWlnaHQgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGhlaWdodC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBIZWlnaHQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGVpZ2h0KGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0KTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW5uZXIgdGV4dCBvZiBhbiBlbGVtZW50IGlmIGdpdmVuIGEgdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIHRleHQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dF0gLSBDb250ZW50IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBFaXRoZXIgdGhlIHN0cmluZyBzZXQgYnkgdGhpcyBjYWxsIG9yIHRoZSBjdXJyZW50IHRleHQgY29udGVudCBvZiB0aGUgbm9kZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRleHQoZWxlbWVudCwgdGV4dCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGV4dCkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHBhZ2UuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBvZmZzZXQgb2ZcclxuICAgICAqIEByZXR1cm4ge09mZnNldH0gLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmZzZXQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkgeyByZXR1cm4gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb25gIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyBvbmNlLlxyXG4gICAgICogYGNvbnN0IGNhbmNlbCA9IERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiZmlyZWQhXCIpOyBjYW5jZWwoKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbmFsaXR5IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub259IGJ1dCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmXHJcbiAgICAgKiBhbmQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgdXBvbiB0aGUgZmlyc3QgZmlyaW5nIG9mIHRoZSBkZXNpcmVkIGV2ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbmNlKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9IDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IG1hdGNoRmlsdGVyID0gbGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgPT0gdHlwZSwgZGVmYXVsdEZpbHRlciA9IF8gPT4gXztcclxuICAgICAgICBpZiAoZWxlbWVudCkgbWF0Y2hGaWx0ZXIgPSBsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCwgZGVmYXVsdEZpbHRlciA9IGwgPT4gbC5lbGVtZW50ID09IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSB8fCBbXTtcclxuICAgICAgICBjb25zdCBsaXN0ID0gdHlwZSA/IGxpc3RlbmVycy5maWx0ZXIobWF0Y2hGaWx0ZXIpIDogbGlzdGVuZXJzLmZpbHRlcihkZWZhdWx0RmlsdGVyKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGxpc3QubGVuZ3RoOyBjKyspIGxpc3RbY10uY2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvZmZgIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVkIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGlja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBjbGljayBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCJjbGljay5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8c3RyaW5nKX0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmVtb3ZlIGxpc3RlbmVyIGZyb21cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRdIC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gW2RlbGVnYXRlXSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2ZmKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAodHlwZW9mKGVsZW1lbnQpID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHdoZW4gdGhlIG5vZGUgaXMgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCBib2R5LlxyXG4gICAgICogVGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB1cG9uIGZpcmluZy5cclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIHdhaXQgZm9yXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBjYWxsYmFjayAtIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBldmVudFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbk1vdW50IC0gZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgZmlyZSBvbiBNb3VudCBvciBvbiBVbm1vdW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBvbk1vdW50ID0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci51bnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlci5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrLCBtdXRhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShvbk1vdW50ID8gbXV0YXRpb24uYWRkZWROb2RlcyA6IG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGB0cnVlYCAqL1xyXG4gICAgc3RhdGljIG9uTW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGBmYWxzZWAgKi9cclxuICAgIHN0YXRpYyBvblVubW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25BZGRlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50KG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vblVubW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uVW5tb3VudChub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggY29tYmluZXMgbXVsdGlwbGUgZWxlbWVudHMgaW50byBvbmUgcGFyZW50IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIGFycmF5IG9mIGVsZW1lbnRzIHRvIHB1dCBpbnRvIGEgc2luZ2xlIHBhcmVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd3JhcChlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGRvbVdyYXBwZXIgPSB0aGlzLnBhcnNlSFRNTChgPGRpdiBjbGFzcz1cImRvbS13cmFwcGVyXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgZG9tV3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50c1tlXSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbVdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNvbHZlcyB0aGUgbm9kZSB0byBhbiBIVE1MRWxlbWVudC4gVGhpcyBpcyBtYWlubHkgdXNlZCBieSBsaWJyYXJ5IG1vZHVsZXMuXHJcbiAgICAgKiBAcGFyYW0geyhqUXVlcnl8RWxlbWVudCl9IG5vZGUgLSBub2RlIHRvIHJlc29sdmVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlc29sdmVFbGVtZW50KG5vZGUpIHtcclxuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRE9NID0gRE9NVG9vbHMiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIEVtb2ppUmVnZXg6IC88YT9cXC4oXFx3KylcXC4oXFxkKyk+L2dcclxufVxyXG5cclxubGV0IEN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbmxldCBFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cclxubGV0IEF1dG9jb21wbGV0ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVswXVxyXG5sZXQgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVswXVxyXG5sZXQgRW1vamlNb2R1bGVRdWVyeSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKVswXVxyXG5sZXQgTWVzc2FnZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpWzBdXHJcbmxldCBndWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVswXVxyXG5sZXQgZW1vamlTZWFyY2ggPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb2ppTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5pbml0KCkuY2F0Y2goZXJyID0+IFV0aWxzLmVycihcIkVtb2ppTW9kdWxlXCIsIFwiQW4gZXJyb3Igb2NjdXJlZFwiLCBlcnIpKSAvLyBiZXR0ZXIgbG9nZ2luZ1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXHJcbiAgICAgICAgaWYoIUF1dG9jb21wbGV0ZU1vZHVsZSlBdXRvY29tcGxldGVNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXHJcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcclxuICAgICAgICBpZighTWVzc2FnZXMpTWVzc2FnZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVxyXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcclxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbiAgICAgICAgaWYoQXV0b2NvbXBsZXRlTW9kdWxlICYmIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzICYmIEVtb2ppTW9kdWxlUXVlcnkgJiYgTWVzc2FnZXMgJiYgZ3VpbGRNb2R1bGUgJiYgZW1vamlTZWFyY2gpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2hpbmcgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyBvZiBBdXRvQ29tcGxldGlvblRlbXBsYXRlc2AsIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKVxyXG4gICAgICAgICAgICBjb25zdCBnZXRBdXRvY29tcGxldGVPcHRpb25zID0gQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9uc1xyXG4gICAgICAgICAgICBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zID0gZnVuY3Rpb24oZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5MSUdIVENPUkRfRU1PSklTID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMoYXJnMSwgYXJnMil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBhcmcyLmxlbmd0aCA+IDEgJiYgXCIuXCIgPT09IGFyZzFcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW1vamlVc2FibGUoY29uZGl0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdHModCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCB0LCBhLmVtb2ppcywgbiwgciwgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORywgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSSwgQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuRW1vamksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCB8fCBlLnVuaXF1ZU5hbWUgfHwgZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsOiBcIi5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsZDogbnVsbCAhPSBlLmd1aWxkSWQgPyBndWlsZE1vZHVsZS5kZWZhdWx0LmdldEd1aWxkKGUuZ3VpbGRJZCkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgZSArIFwiLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJhd1RleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXHJcbiAgICAgICAgd2hpbGUgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXsgLy8gVE9ETzogUHJvcGVyIGVtb2ppIGZvcm1hdHRpbmcgLyByZW5kZXJpbmdcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2VcIilcclxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50XCIpXHJcbiAgICAgICAgICAgICAgICBpZighY29udGVudCB8fCAhY29udGVudC5sZW5ndGgpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge3tcclxuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgICogfVtdfVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJzZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVtb2ppKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW1vamkubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBwYXJzZWRbMF0uc3RhcnRzV2l0aChcIjxhXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNQYXJzZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzLmZpbmQoZSA9PiBlLnJhdyA9PSB3b3JkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUVtb2ppTW9kdWxlLkN1c3RvbUVtb2ppLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYC4ke2Vtb2ppLm5hbWV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppSWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZpb3VzLmxlbmd0aCA9PT0gMClyZXR1cm4gW2N1cnJlbnRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gKz0gYCAke2N1cnJlbnR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIitjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIiwgY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKC4uLndvcmRzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQucHVzaChuZXdDb250ZW50LnNoaWZ0KCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9LypcclxuICAgICAgICBsZXQgdXNlck1vZHVsZVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJFbW9qaVBpY2tlckxpc3RSb3dcIilcclxuICAgICAgICAudGhlbihFbW9qaVBpY2tlckxpc3RSb3cgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NzID0gRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHRcclxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQgPSBjbGFzcyBFbW9qaVBpY2tlckxpc3RSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSlyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIHRoaXMucHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlEZXNjcmlwdG9yczogdGhpcy5wcm9wcy5lbW9qaURlc2NyaXB0b3JzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaXNEaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IFwiRW1vamlQaWNrZXJMaXN0Um93XCJcclxuICAgICAgICB9KSovXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBEKGUsIHQsIG4sIHIsIG8sIGksIHMsIHUsIGwsIGMpIHtcclxuICAgIGlmIChudWxsID09IG4gfHwgMCA9PT0gbi5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgdmFyIGQgPSBuLm1hcCgoZnVuY3Rpb24oZSwgbikge1xyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHUsIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBvbkNsaWNrOiBvLFxyXG4gICAgICAgICAgICBvbkhvdmVyOiByLFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogdCA9PT0gbixcclxuICAgICAgICAgICAgaW5kZXg6IG5cclxuICAgICAgICB9LCBsKGUsIG4pKSlcclxuICAgIH0pKTtcclxuICAgIHJldHVybiBbUihpLCBzLCBlLCBjKSwgZF1cclxufVxyXG5cclxuZnVuY3Rpb24gUihlLCB0LCBuLCByKSB7XHJcbiAgICB2YXIgYSA9IChuLmxlbmd0aCA+IDAgPyBlLmZvcm1hdCh7XHJcbiAgICAgICAgcHJlZml4OiByKG4pXHJcbiAgICB9KSA6IHQpXHJcbiAgICBpZihBcnJheS5pc0FycmF5KGEpKXtcclxuICAgICAgICBhLnVuc2hpZnQoUmVhY3QuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCB7fSwgXCJbTGlnaHRjb3JkXSBcIikpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBhID0gXCJbTElHSFRDT1JEXSBcIithXHJcbiAgICB9XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5UaXRsZSwge1xyXG4gICAgICAgIHRpdGxlOiBhXHJcbiAgICB9LCBhKVxyXG59XHJcblIuZGlzcGxheU5hbWUgPSBcInJlbmRlckhlYWRlclwiO1xyXG5cclxubGV0IEVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG5sZXQgaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUgJiYgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxubGV0IGlzVXNhYmxlID0gZmFsc2VcclxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxyXG5cclxuZnVuY3Rpb24gc2V0RW1vamlVc2FibGUodXNhYmxlKXtcclxuICAgIGlzVXNhYmxlID0gdXNhYmxlXHJcbiAgICBpZihoYXNQYXRjaGVkKXJldHVyblxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKUVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKXJldHVyblxyXG4gICAgaWYoIWlzRW1vamlEaXNhYmxlZClpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5cclxuICAgIGhhc1BhdGNoZWQgPSB0cnVlXHJcbiAgICBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZCA9IGZ1bmN0aW9uKGVtb2ppKXtcclxuICAgICAgICBpZihpc1VzYWJsZSl7XHJcbiAgICAgICAgICAgIGlmKGVtb2ppLnN1cnJvZ2F0ZXMgfHwgZW1vamkuZGl2ZXJzaXR5KXJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNFbW9qaURpc2FibGVkLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCAqIGFzIGVsZWN0cm9uIGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCJcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIlxyXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5pbXBvcnQgeyBhZGRvbkNhY2hlIH0gZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5cclxuY29uc3QgY2FjaGUgPSB7fVxyXG5jb25zdCBjYWNoZTIgPSB7fVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFBsdWdpbkNlcnRpZmllciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5DZXJ0aWZpZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2goYXR0YWNobWVudCwgaWQpe1xyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlzVHJ1c3RlZChoYXNoKXtcclxuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcclxuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgbGV0IGlzSGFybWZ1bCA9IGZhbHNlXHJcbiAgICBmb3IobGV0IGtleXdvcmQgb2YgZGF0YS5zcGxpdCgvW15cXHdcXGRdKy9nKSl7XHJcbiAgICAgICAgZm9yKGxldCBvb2Ygb2YgW1xyXG4gICAgICAgICAgICBcInRva2VuXCIsXHJcbiAgICAgICAgICAgIFwiZW1haWxcIixcclxuICAgICAgICAgICAgXCJwaG9uZVwiLFxyXG4gICAgICAgICAgICBcIk1GQVwiLFxyXG4gICAgICAgICAgICBcIjJmYVwiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkgJiYgIWtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gXCJkb210b2tlbmxpc3RcIil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvb2YsIGtleXdvcmQpXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSBcInRva2VuIHN0ZWFsZXIvdmlydXNcIlxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBub19jb21tZW50cyA9IGRhdGEucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3woW15cXFxcOl18XilcXC9cXC8uKiQvZ20sIFwiXCIpLnRyaW0oKS8vIHJlbW92aW5nIHRoZSBNRVRBIGNvbW1lbnQgZnJvbSBwbHVnaW5zXHJcbiAgICAgICAgaWYoKC92YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2kpLnRlc3Qobm9fY29tbWVudHMpKXtcclxuICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXhwcyA9IFtcclxuICAgICAgICAgICAgICAgIC8qKiBoZXhhZGVjaW1hbCAqL1xyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydcXCkvZyxcclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gXzB4OGRiNygnMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICAgICAgLyoqIG1hbmdsZWQgKi9cclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLCAvLyBiKCcweDAnKVxyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gYignMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIGZvcihsZXQgcmVnZXggb2YgcmVnZXhwcyl7XHJcbiAgICAgICAgICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgICAgICAgICAgICAgIGlmKHJlZ2V4LnRlc3Qobm9fY29tbWVudHMpKWlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICBjYWNoZVtoYXNoXSA9IHtcclxuICAgICAgICBzdXNwZWN0OiB0cnVlLFxyXG4gICAgICAgIG5hbWU6IGhhc2hUb1VybFtoYXNoXS5zcGxpdChcIi9cIikucG9wKCksXHJcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIixcclxuICAgICAgICBoYXJtOiBpc0hhcm1mdWwsXHJcbiAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICBmaWxlbmFtZVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXHJcblxyXG4gICAgcmVzdWx0Q2FsbGJhY2soY2FjaGVbaGFzaF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhc2hUb1VybCA9IHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tIYXNoKGhhc2gsIGRhdGEsIGZpbGVuYW1lLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xyXG4gICAgY29uc29sZS5sb2coYEZpbGU6ICR7ZmlsZW5hbWV9IGhhc2g6ICR7aGFzaH1gKVxyXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcclxuICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIHJlc3VsdC5oYXNoID0gaGFzaFxyXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxyXG5cclxuICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHJlc3VsdClcclxuICAgICAgICB9KS5jYXRjaChjb25zb2xlLmVycm9yKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoX19wYXRoLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2sgPSAoaGFzaCkgPT4ge30sIGlzRnJvbUxvYWRlciA9IGZhbHNlKXsgICAgXHJcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXHJcblxyXG4gICAgY3JlYXRlUmVhZFN0cmVhbShfX3BhdGgpLm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcclxuICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgIH0pLm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gX19wYXRoXHJcblxyXG4gICAgICAgIGlmKGlzRnJvbUxvYWRlciAmJiBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdKXtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICAgICAgY29udGVudE1hbmFnZXIuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHZhbHVlLnJlc3VsdClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcclxuICAgICAgICAgICAgICAgIGlmKGVsZW0pZWxlbS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoKT0+e30pXHJcbn1cclxuXHJcbmxldCBmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxubGV0IGNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXHJcbiAqIEBwYXJhbSB7e3R5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIG9mZmljaWFsPzogYm9vbGVhbn18e3N1c3BlY3Q6dHJ1ZSwgdHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgaGFybTogc3RyaW5nfX0gcmVzdWx0XHJcbiAqL1xyXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcclxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVybiAvLyBhbHJlYWR5IGNlcnRpZmllZC9kaXYgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cclxuXHJcbiAgICBpZighZmxvd2VyU3Rhck1vZHVsZSlmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxuICAgIGlmKCFjaGlsZE1vZHVsZSljaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxyXG4gICAgXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBcclxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09IFwiQVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBBbnl3YXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXh0Tm9kZShkaXYucGFyZW50Tm9kZSlcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuc3ZnKVswXS5zdmcsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgNDAgMzJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC0zMilcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOkJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwiLCBmbG9hdDogXCJsZWZ0XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbGF1bmNoIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIi4gWW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8uXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGZXRjaChsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCByZXMuYnVmZmVyKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhpbnN0YWxsUGF0aCwgY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMjQgMjRcIixzdHlsZTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiZmlsbFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdKVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNwYW4sIGRpdilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICBsZXQgc3BhbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZGlzcGxheTogXCJpbmhlcml0XCJ9fSwgW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsIHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwiLHN0cm9rZTpcIiMzNjM5M2ZcIixzdHlsZTp7Y29sb3I6XCIjNDA4N2VkXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcImN1cnJlbnRDb2xvclwiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGdldEtleWVkQXJyYXkoY2FjaGUyKS5maW5kKGUgPT4gZVsxXSA9PT0gcmVzdWx0Lmhhc2gpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRLZXllZEFycmF5KG9iail7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaywgb2JqW2tdXSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gYXJyXHJcbn1cclxuXHJcbmxldCBrZXkgPSBudWxsXHJcbmxldCBzYXZlID0gbnVsbFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxyXG4udGhlbihsb2NhbFN0b3JhZ2VNb2R1bGUgPT4ge1xyXG4gICAgbGV0IGxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZU1vZHVsZS5pbXBsXHJcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoa2V5KSkpXHJcbiAgICB9XHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9LCAxMDAwMDApO1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCB2YWwgPSBzYWZlSlNPTlBhcnNlKGF0b2IobG9jYWxTdG9yYWdlLmdldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiKSkpXHJcbiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoICE9PSAyIHx8IHZhbC5maW5kKGUgPT4gdHlwZW9mIGUgIT09IFwic3RyaW5nXCIpIHx8IEJ1ZmZlci5mcm9tKHZhbFswXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAxNiB8fCBCdWZmZXIuZnJvbSh2YWxbMV0sIFwiYmFzZTY0XCIpLmxlbmd0aCAhPT0gMzIpe1xyXG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgICAgIHNhdmUoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gdmFsXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxyXG4gICAgICAgIHNhdmUoKVxyXG4gICAgfVxyXG59KVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoKXtcclxuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxyXG59XHJcblxyXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IG5ldyBFcnJvcihlKSA6IGVcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KFwiYWVzLTI1Ni1jYmNcIiwgQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKSlcclxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpKTtcclxuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgfWNhdGNoKGUpe1xyXG4gICAgICAgIHJldHVybiBcInt9XCJcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICBsZXQgYXJncyA9IFtCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpXVxyXG4gICAgXHJcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xyXG4gICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJ1dGY4XCIpKTtcclxuICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRlZCwgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcclxufSIsImltcG9ydCB7YmRwbHVnaW5FcnJvcnMsIHBsdWdpbkNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5jbGFzcyBQbHVnaW5Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5Nb2R1bGUgPSB0aGlzXG4gICAgfVxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXI7fVxufVxuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcbiAgICBiZHBsdWdpbkVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRQbHVnaW5zKCkpKTtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHBsdWdpbiwgbmFtZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcbiAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJsb2FkKCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtuYW1lXSkgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBsdWdpbkNvb2tpZVtuYW1lXSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xuICAgICAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJzdGFydCgpIGNvdWxkIG5vdCBiZSBmaXJlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcbiAgICB9XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RhcnRQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RhcnRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBwbHVnaW4gKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0b3AoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcbiAgICBlbHNlIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IChjb25zb2xlLmxvZyhwLmZpbGVuYW1lLCBmaWxlbmFtZSkpIHx8IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcbiAgICB0cnkgeyBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7fVxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi11bmxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICB0aGlzLnVubG9hZFBsdWdpbihiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcbiAgICBjb25zdCBlbmFibGVkID0gcGx1Z2luQ29va2llW3BsdWdpbl07XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1yZWxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZnVsbFBhdGgpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiLCBwbHVnaW5Db29raWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5uZXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25NZXNzYWdlKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuY2hhbm5lbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25Td2l0Y2goKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJhd09ic2VydmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vYnNlcnZlcihlKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGx1Z2luTW9kdWxlKCk7IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IExheWVyIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL2xheWVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfUHVibGljU2VydmVycyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uID0gdGhpcy5fYXBwZW5kQnV0dG9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgaWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1B1YmxpY1NlcnZlcnMsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwifSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwdWJzbGF5ZXJyb290XCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyc1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVycyAmJiBlLmxheWVyKVswXS5sYXllcnMuc3BsaXQoXCIgXCIpWzBdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGNvbnN0IGxheWVycyA9IERPTS5xdWVyeShcIi5sYXllcnMsIC5cIitjbGFzc05hbWVMYXllcnMpO1xyXG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbGF5ZXJzLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChcIjxkaXYgaWQ9J3B1YnNsYXllcnJvb3QnPlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXJzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMuY29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnV0dG9uKCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgYnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWJ1dHRvblwiIGNsYXNzPVwiJHtcIndyYXBwZXItMjVlVkluIFwiICsgQkRWMi5ndWlsZENsYXNzZXMuY2lyY2xlQnV0dG9uTWFza31cIj5wdWJsaWM8L2Rpdj5gKTtcclxuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XHJcbiAgICAgICAgYnRuLmFwcGVuZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGJ0bjtcclxuICAgIH1cclxuXHJcbiAgICBfYXBwZW5kQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcclxuICAgICAgICBdXHJcbiAgICAgICAgaWYgKERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikpIHJldHVybjtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xyXG4gICAgICAgIERPTS5hZnRlcihndWlsZHMsIHRoaXMuYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpbGRQYXRjaCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdE9sZCA9IHdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgICAgIGlmICghR3VpbGRMaXN0ICYmICFHdWlsZExpc3RPbGQpIFV0aWxzLndhcm4oXCJQdWJsaWNTZXJ2ZXJcIiwgXCJDYW4ndCBmaW5kIEd1aWxkTGlzdCBjb21wb25lbnRcIik7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUJ1dHRvbigpIHtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2goKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikucmVtb3ZlKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5ncywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsU2lkZWJhclwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xyXG5pbXBvcnQgdGZIb3VyIGZyb20gXCIuLzI0aG91clwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgcHVibGljU2VydmVyc01vZHVsZSBmcm9tIFwiLi9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCB2b2ljZU1vZGUgZnJvbSBcIi4vdm9pY2VNb2RlXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XHJcbmltcG9ydCBkTW9kZSBmcm9tIFwiLi9kZXZNb2RlXCI7XHJcblxyXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQ3NzRWRpdG9yIGZyb20gXCIuLi91aS9jc3NFZGl0b3JcIjtcclxuaW1wb3J0IENhcmRMaXN0IGZyb20gXCIuLi91aS9hZGRvbmxpc3RcIjtcclxuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4vQ3VzdG9tUmljaFByZXNlbmNlXCI7XHJcbmltcG9ydCBWMkNfQWNjb3VudEluZm9zIGZyb20gXCIuLi91aS9BY2NvdW50SW5mb3NcIjtcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBBbnRpQWRETSBmcm9tIFwiLi9BbnRpQWRETVwiO1xyXG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcclxuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xyXG5pbXBvcnQgQXBpUHJldmlldyBmcm9tIFwiLi4vdWkvQXBpUHJldmlld1wiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuLi91aS9zd2l0Y2hcIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XHJcbmltcG9ydCBjb3JlIGZyb20gXCIuL2NvcmVcIjtcclxuXHJcbmNsYXNzIEJEU2lkZWJhckhlYWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcclxuXHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlbmRlcmVkID0gbmV3IHNpZGViYXJDb21wb25lbnRzLkhlYWRlcih7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBcIkJhbmRhZ2VkIEJEXCIsIGNoYW5nZWxvZ0J1dHRvbiksXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRcclxuICAgIH1cclxufVxyXG5cclxubGV0IGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcIkJEQ2hhbmdlbG9nVGl0bGVcIiwgbWFrZUNvbXBvbmVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcclxuICAgICAgICB9KSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjb3JlXCIsIG1ha2VDb21wb25lbnQodGhpcy5jb3JlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInRoZW1lc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwidGhlbWVzXCIpKSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyLFxyXG4gICAgICAgICAgICBjbGFzc1NpZGViYXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIuc3BsaXQoXCIgXCIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBzaWRlYmFyID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzTmFtZUxheWVyK1wiIC5cIitjbGFzc1NpZGViYXIuc3RhbmRhcmRTaWRlYmFyVmlldy5zcGxpdChcIiBcIilbMF0rXCIsIC5cIitjbGFzc05hbWVMYXllcitcIiAudWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCIpO1xyXG4gICAgICAgIGlmICghc2lkZWJhcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIiBjbGFzcz1cIiR7Y2xhc3NTaWRlYmFyLmNvbnRlbnRSZWdpb259IGNvbnRlbnQtcmVnaW9uXCI+YCk7XHJcbiAgICAgICAgc2lkZWJhci5hcHBlbmQocm9vdCk7XHJcblxyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImNvcmVcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaWdodGNvcmRTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJsaWdodGNvcmRcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IE1zZ0xvZ1NldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwibXNnbG9nXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7fVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCwgc2lkZWJhcik7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQsIHNpZGViYXIpIHtcclxuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCIsIFwibGlnaHRjb3JkLTEwXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKmlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNpZGViYXIuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLThcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJpc1RhYnNcIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpe1xyXG4gICAgICAgICAgICBjb3JlLm1ldGhvZHMuTm90aWZpY2F0aW9uc1VzZVNoaW0oZW5hYmxlZClcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJub193aW5kb3dfYm91bmRcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGVuYWJsZWQpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJHTEFTU1RST05cIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgLy9pZiAoc2V0dGluZ3NDb29raWUucmVhY3REZXZUb29scykgcmVhY3REZXZUb29scy5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0yXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0zXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTRcIl0pIHZvaWNlTW9kZS5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy01XCJdKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNFwiXSkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMlwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLXByZXNlbmNlLTFcIl0pIEN1c3RvbVJpY2hQcmVzZW5jZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTRcIl0pIEFudGlBZERNLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTZcIl0pIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSB7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVTZXR0aW5ncygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIiwgc2V0dGluZ3NDb29raWUpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRTZXR0aW5ncygpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNpZGViYXIoc2lkZWJhcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXIucmVuZGVyKHNpZGViYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXHJcbiAgICB9XHJcblxyXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IDAgPyBudWxsIDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0NoZWNrZWQgPSBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJub193aW5kb3dfYm91bmRcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJHTEFTU1RST05cIiwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtMTBcIilpc0NoZWNrZWQgPSAhYXBwU2V0dGluZ3MuZ2V0KFwiREVGQVVMVF9OT1RJRklDQVRJT05TXCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBpc0NoZWNrZWQsIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoaWQsIGNoZWNrZWQsIHNpZGViYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PSBcImxpZ2h0Y29yZC04XCIgJiYgaXNDaGVja2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJncmVlblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwic21hbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJicmFuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmlwYy5zZW5kKFwiTkVXX1RBQlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXCJPcGVuIGEgbmV3IFRhYlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiByZW1vdGUucHJvY2Vzcy5hcmd2LnNsaWNlKDEpLmNvbmNhdChbXCItLWRpc2FibGUtYmV0dGVyZGlzY29yZFwiXSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucXVpdCgpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxyXG4gICAgICAgICAgICB9LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihpc0NsZWFyaW5nQ2FjaGUpcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNsZWFyaW5nIGNhY2hlLi4uXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkuc2Vzc2lvbi5jbGVhckNhY2hlKClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNhY2hlIGlzIGNsZWFyZWQgIVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIENoZWNrIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0NsZWFyaW5nQ2FjaGVcclxuICAgICAgICAgICAgfSwgXCJDbGVhciBjYWNoZVwiKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFwaVByZXZpZXdDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsIG9uIHdpbmRvd1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xyXG4gICAgY2xhc3MgU2V0dGluZ0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihzaWRlYmFyLCAoKSA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHNpZGViYXJcclxuICAgIHJldHVybiAocykgPT4ge1xyXG4gICAgICAgIHNpZGViYXIgPSBzXHJcbiAgICAgICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcclxuICAgIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xyXG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudChwYW5lbCwgc2lkZWJhcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxzW3BhbmVsXShzaWRlYmFyKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjb3JlXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwicGx1Z2luc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwidGhlbWVzXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY3VzdG9tY3NzXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENpdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gaXRlbXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENEZXZJdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdXHJcbiAgICAgICAgaWYoIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlyZXR1cm4gaXRlbXNcclxuICAgICAgICBpdGVtcy5wdXNoKC4uLltcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZCBBcGlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkNvbXBvbmVudHMgUHJldmlld1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwibGNhcGlwcmV2aWV3XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ2l0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAuLi50aGlzLkxDRGV2SXRlbXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZS5zZWN0aW9uKXJldHVybiBlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XHJcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlRoZW1lTW9kdWxlID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyO31cclxufVxyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmxvYWRUaGVtZURhdGEoKTtcclxuICAgIGJkdGhlbWVFcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkVGhlbWVzKCkpKTtcclxuICAgIGNvbnN0IHRoZW1lcyA9IE9iamVjdC5rZXlzKGJkdGhlbWVzKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoZW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbdGhlbWVzW2ldXTtcclxuICAgICAgICBpZiAoIXRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSB0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHRoZW1lIGluIHRoZW1lQ29va2llKSB7XHJcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkVGhlbWUoYmR0aGVtZS5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHRoZW1lLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKSwgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1yZWxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuc2F2ZVRoZW1lRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIiwgdGhlbWVDb29raWUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFRoZW1lTW9kdWxlKCk7IiwiaW1wb3J0IHtiYmRWZXJzaW9uLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IHdpZHRoICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xuICAgIHN0YXRpYyBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XG5cbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aW5kb3dDb25maWdGaWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIERPTS5xdWVyeShcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYS5zcGxpdChcIiBcIilbMF0rXCIgdGV4dGFyZWFcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGluc2VydFRleHQodGV4dGFyZWEsIHRleHQpIHtcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogIzNhNzFjMTsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogIzNhNzFjMTtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHdhcm4obW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgc3RyaW5ncyB3aXRoIHBsYWNlaG9sZGVycyAoYHt7cGxhY2Vob2xkZXJ9fWApIGludG8gZnVsbCBzdHJpbmdzLlxuICAgICAqIFF1aWNrIGV4YW1wbGU6IGBQbHVnaW5VdGlsaXRpZXMuZm9ybWF0U3RyaW5nKFwiSGVsbG8sIHt7dXNlcn19XCIsIHt1c2VyOiBcIlplcmVib3NcIn0pYFxuICAgICAqIHdvdWxkIHJldHVybiBcIkhlbGxvLCBaZXJlYm9zXCIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHN0cmluZyB0byBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIC0gb2JqZWN0IGxpdGVyYWwgb2YgcGxhY2Vob2xkZXJzIHRvIHJlcGxhY2VtZW50c1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgICovXG4gICAgc3RhdGljIGZvcm1hdFN0cmluZyhzdHJpbmcsIHZhbHVlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHZhbHVlc1t2YWxdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZW1lbnQpKSByZXBsYWNlbWVudCA9IEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YocmVwbGFjZW1lbnQpID09PSBcIm9iamVjdFwiICYmIHJlcGxhY2VtZW50ICE9PSBudWxsKSByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShuZXcgUmVnRXhwKGB7eyR7dmFsfX19YCwgXCJnXCIpLCByZXBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xuICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqID09IHVuZGVmaW5lZCB8fCBvYmogPT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTsgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSB8fCB3aGF0LmRpc3BsYXlOYW1lIHx8IHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgfHwgd2hhdC5uYW1lIHx8IHdoYXQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgaWYgKGZvcmNlKSB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcbiAgICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAvL3doYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlIC8vIHRoaXMgYWxsb3cgdG8gbW9ua2V5cGF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lLlxuICAgICAgICB9O1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZihjYW5jZWxlZCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdNZXRob2QuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluc3RlYWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25jZSkgY2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsO1xuICAgIH1cblxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11dGF0aW9ucy5sZW5ndGg7IG0rKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE5lc3RlZFByb3Aob2JqLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xuICAgICAgICB9LCBvYmopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCBUaGUgc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvYXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmljb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBzaG93IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUuIEEgdG9hc3Qgd2l0aG91dCB0eXBlIHdpbGwgYWx3YXlzIGhhdmUgbm8gaWNvbi4gRGVmYXVsdDogdHJ1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhci5zcGxpdChcIiBcIilbOV0rXCIgKyBkaXZcIikgfHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcmxpc3QgPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZW1iZXJzV3JhcClbMF0ubWVtYmVyc1dyYXApIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMzEwO1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBtZW1iZXJsaXN0ID8gbWVtYmVybGlzdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgPyByaWdodCAtIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogVXRpbHMuc2NyZWVuV2lkdGggLSBsZWZ0IC0gMjQwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XG4gICAgICAgICAgICBjb25zdCB0b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGxlZnQgKyBcInB4XCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwid2lkdGhcIiwgd2lkdGggKyBcInB4XCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwiYm90dG9tXCIsIGJvdHRvbSArIFwicHhcIik7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RcIik7XG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcbiAgICAgICAgdG9hc3RFbGVtLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5iZC10b2FzdHMgLmJkLXRvYXN0XCIpLmxlbmd0aCkgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYWxlcnQodGl0bGUsIGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aXRsZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICAgICAgICBjb25zdCBjbG9zaW5nTGlzdGVuZXJzID0gW11cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbG9zZTogKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSwgdGhlbWVzOiB0aGVtZUVycm9ycyA9IFtdfSkge1xuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycyB8fCAhdGhlbWVFcnJvcnMpIHJldHVybjtcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+PGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGVudCBFcnJvcnM8L2Rpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyIFRPUFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+TmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICBcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yc1wiPmApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+JHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYEVycm9yIGRldGFpbHMgZm9yICR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfS5gLCBlcnIuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0YWJzID0gW2dlbmVyYXRlVGFiKHBsdWdpbkVycm9ycyksIGdlbmVyYXRlVGFiKHRoZW1lRXJyb3JzKV07XG4gICAgXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MoZS50YXJnZXQsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XG4gICAgICAgICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKHRhYnNbRE9NLmluZGV4KGUudGFyZ2V0KV0pO1xuICAgICAgICB9KSk7XG4gICAgXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcbiAgICAgICAgaWYgKHBsdWdpbkVycm9ycy5sZW5ndGgpIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtXCIpLmNsaWNrKCk7XG4gICAgICAgIGVsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZml4ZWRcIiwgXCJpbXByb3ZlZFwiKTtcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XG4gICAgICAgIGNvbnN0IEZsZXhDaGlsZCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiQ2hpbGRcIik7XG4gICAgICAgIGNvbnN0IFRpdGxlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiVGFnc1wiLCBcImRlZmF1bHRcIik7XG4gICAgICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcbiAgICAgICAgY29uc3QgTWFya2Rvd25QYXJzZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImRlZmF1bHRSdWxlc1wiLCBcInBhcnNlXCIpO1xuICAgICAgICBpZiAoIUNoYW5nZWxvZyB8fCAhTW9kYWxTdGFjayB8fCAhQ2hhbmdlbG9nQ2xhc3NlcyB8fCAhVGV4dEVsZW1lbnQgfHwgIUZsZXhDaGlsZCB8fCAhVGl0bGVzIHx8ICFNYXJrZG93blBhcnNlcikgcmV0dXJuO1xuICAgIFxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbWFnZSA9IFwiaHR0cHM6Ly9yZXBvc2l0b3J5LWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA1NDczNTM3Lzk1N2I1NDgwLTdjMjYtMTFlOS04NDAxLTUwZmE4MjBjYmFlNVwiLCBcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIiwgXG4gICAgICAgICAgICBjaGFuZ2VzID0gW10sIFxuICAgICAgICAgICAgdGl0bGUgPSBcIkJhbmRhZ2VkQkRcIiwgXG4gICAgICAgICAgICBzdWJ0aXRsZSA9IGB2JHtiYmRWZXJzaW9ufWAsIFxuICAgICAgICAgICAgZm9vdGVyXG4gICAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBjZSA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge3NyYzogaW1hZ2V9KV07XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcInBcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoZGVzY3JpcHRpb24pKSk7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gPyBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdIDogQ2hhbmdlbG9nQ2xhc3Nlcy5hZGRlZDtcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7Y2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gLH0sIGVudHJ5LnRpdGxlKSk7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gY2UoXCJ1bFwiLCBudWxsLCBlbnRyeS5pdGVtcy5tYXAoaSA9PiBjZShcImxpXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGkpKSkpO1xuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZW5kZXJIZWFkZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LFxuICAgICAgICAgICAgICAgIGNlKFRpdGxlcy5kZWZhdWx0LCB7dGFnOiBUaXRsZXMuVGFncy5INH0sIHRpdGxlKSxcbiAgICAgICAgICAgICAgICBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkQsIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5kYXRlfSwgc3VidGl0bGUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgIFxuICAgICAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07XG4gICAgICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBCRFYyLmpvaW5CRDIoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSwgZm9vdGVyID8gZm9vdGVyIDogZGVmYXVsdEZvb3Rlcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChmdW5jdGlvbihwcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXG4gICAgICAgICAgICAgICAgb25DbG9zZTogXyA9PiBfLFxuICAgICAgICAgICAgICAgIHJlbmRlckhlYWRlcjogcmVuZGVySGVhZGVyLFxuICAgICAgICAgICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGFuZ2Vsb2dJdGVtc1xuICAgICAgICAgICAgfSwgcHJvcHMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBNb2RhbEFjdGlvbnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIm9wZW5Nb2RhbFwiLCBcInVwZGF0ZU1vZGFsXCIpO1xuICAgICAgICBjb25zdCBNYXJrZG93biA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWFya2Rvd25cIik7XG4gICAgICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJDb25maXJtTW9kYWxcIik7XG4gICAgICAgIGlmICghTW9kYWxBY3Rpb25zIHx8ICFDb25maXJtYXRpb25Nb2RhbCB8fCAhTWFya2Rvd24pIHJldHVybiBVdGlscy5hbGVydCh0aXRsZSwgY29udGVudCk7XG5cbiAgICAgICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xuICAgICAgICBjb25zdCB7b25Db25maXJtID0gZW1wdHlGdW5jdGlvbiwgb25DYW5jZWwgPSBlbXB0eUZ1bmN0aW9uLCBjb25maXJtVGV4dCA9IFwiT2theVwiLCBjYW5jZWxUZXh0ID0gXCJDYW5jZWxcIiwgZGFuZ2VyID0gZmFsc2UsIGtleSA9IHVuZGVmaW5lZH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQubWFwKGMgPT4gdHlwZW9mKGMpID09PSBcInN0cmluZ1wiID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtkb3duLCBudWxsLCBjKSA6IGMpO1xuICAgICAgICByZXR1cm4gTW9kYWxBY3Rpb25zLm9wZW5Nb2RhbChwcm9wcyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KENvbmZpcm1hdGlvbk1vZGFsLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHJlZDogZGFuZ2VyLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcbiAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxuICAgICAgICAgICAgfSwgcHJvcHMpLCBjb250ZW50KTtcbiAgICAgICAgfSwge21vZGFsS2V5OiBrZXl9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlRGEoY2xhc3NOYW1lKXtcbiAgICAgICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXG4gICAgICAgIHJldHVybiBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICFlLnN0YXJ0c1dpdGgoXCJkYS1cIikpLmpvaW4oXCIgXCIpXG4gICAgfVxufVxuXG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpO1xuXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVXRpbHMgPSBVdGlscyIsImltcG9ydCB7c2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMiB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuV2VicGFja01vZHVsZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUHJvdGVjdCA9IHRoZU1vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLnJlbW92ZSAmJiB0aGVNb2R1bGUuc2V0ICYmIHRoZU1vZHVsZS5jbGVhciAmJiB0aGVNb2R1bGUuZ2V0ICYmICF0aGVNb2R1bGUuc29ydCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RlY3QgPSAodGhlTW9kdWxlLCBpc0RlZmF1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBtb2QgPSAhaXNEZWZhdWx0ID8gdGhlTW9kdWxlLmRlZmF1bHQgOiB0aGVNb2R1bGVcclxuICAgICAgICAgICAgICAgIGlmKCFtb2QpcmV0dXJuIHRoZU1vZHVsZVxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZC5yZW1vdmUgJiYgbW9kLnNldCAmJiBtb2QuY2xlYXIgJiYgbW9kLmdldCAmJiAhbW9kLnNvcnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtb2QuZ2V0VG9rZW4gJiYgIW1vZC5nZXRFbWFpbCAmJiAhbW9kLnNob3dUb2tlbilyZXR1cm4gdGhlTW9kdWxlXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkobW9kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VG9rZW5cIiB8fCBwcm9wID09PSBcImdldEVtYWlsXCIgfHwgcHJvcCA9PT0gXCJzaG93VG9rZW5cIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0VG9rZW5cIiAmJiBvYmouZ2V0VG9rZW4pIHJldHVybiAoKSA9PiBcIm1mYS5YQ25iS3pvMENMSXFkSnpCbkwwRDhQZkRydXFrSk5IandIWHRyMzlVVTNGOGhIeDQzam9qSVN5aTVqZGpPNTJlOV9lOU1qbWFmWkZGcGMtc2VPTWFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRFbWFpbFwiICYmIG9iai5nZXRFbWFpbCkgcmV0dXJuICgpID0+IFwicHVwcGV0MTExMTJAZ21haWwuY29tXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIgJiYgb2JqLnNob3dUb2tlbikgcmV0dXJuICgpID0+IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiX19wcm90b19fXCIgJiYgb2JqLl9fcHJvdG9fXykgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZighaXNEZWZhdWx0KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhlTW9kdWxlLCB7ZGVmYXVsdDogcHJveHl9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBwcm90ZWN0KG0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtLmRlZmF1bHQsIHRydWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0sIGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXM7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzID0gKHByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9IChwcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7ZmluZCwgZmluZEFsbCwgZmluZEJ5VW5pcXVlUHJvcGVydGllcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB7XHJcbiAgICAgICAgICAgIHJlYWN0OiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiQ29tcG9uZW50XCIsIFwiUHVyZUNvbXBvbmVudFwiLCBcIkNoaWxkcmVuXCIsIFwiY3JlYXRlRWxlbWVudFwiLCBcImNsb25lRWxlbWVudFwiXSksXHJcbiAgICAgICAgICAgIHJlYWN0RG9tOiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZmluZERPTU5vZGVcIl0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdldEludGVybmFsSW5zdGFuY2UgPSBlID0+IGVbT2JqZWN0LmtleXMoZSkuZmluZChrID0+IGsuc3RhcnRzV2l0aChcIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlXCIpKV07XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cclxuICAgIGxlYXZlQkQxKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI4NjAwNDc0NDk2NjkxNDA0OFwiKTt9XHJcblxyXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxyXG4gICAgbGVhdmVCRDIoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjI4MDgwNjQ3MjkyODE5ODY1NlwiKTt9XHJcblxyXG4gICAgam9pbkxDKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiN2VGZmYyQVwiKTt9XHJcbiAgICBsZWF2ZUxDKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI3MDU5MDgzNTAyMTg2NjYxMTdcIik7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3QtZG9tXCIpfVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0LkNvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0Q29tcG9uZW50KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0LkNvbXBvbmVudDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuXHJcbiAgICBnZXQgYW5jaG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIl0pIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O31cclxuICAgIGdldCBzbGF0ZUVkaXRvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzbGF0ZVRleHRBcmVhXCJdKTt9XHJcbiAgICBnZXQgbWVzc2FnZUNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJtZXNzYWdlXCIsIFwiY29udGFpbmVyQ296eVwiXSk7fVxyXG4gICAgZ2V0IGd1aWxkQ2xhc3NlcygpIHtcclxuXHRcdGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS53cmFwcGVyICYmIGUudW5yZWFkTWVudGlvbnNCYXIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmd1aWxkc0Vycm9yICYmIGUuc2VsZWN0ZWQpWzBdXHJcbiAgICAgICAgY29uc3QgcGlsbCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmJsb2JDb250YWluZXIpWzBdXHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcblx0fVxyXG5cclxuICAgIGdldCBNZXNzYWdlQ29udGVudENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuaGFzT3duUHJvcGVydHkoXCJkaXNhYmxlQnV0dG9uc1wiKSk7fVxyXG4gICAgZ2V0IE1lc3NhZ2VDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XHJcbiAgICBnZXQgVGltZUZvcm1hdHRlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImRhdGVGb3JtYXRcIl0pO31cclxuICAgIGdldCBUb29sdGlwV3JhcHBlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7fVxyXG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XHJcbiAgICBnZXQgSW52aXRlQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7fVxyXG4gICAgZ2V0IEd1aWxkQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImxlYXZlR3VpbGRcIl0pO31cclxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cclxuICAgIGdldCBLZXlHZW5lcmF0b3IoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0udG9TdHJpbmcgJiYgL1wiYmluYXJ5XCIvLnRlc3QobS50b1N0cmluZygpKSk7fVxyXG4gICAgZ2V0IExheWVyU3RhY2soKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJwb3BMYXllclwiXSk7fVxyXG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbFN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q2hhbm5lbFwiXSk7fVxyXG4gICAgZ2V0IENoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wib3BlblByaXZhdGVDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuXHJcbiAgICBvcGVuRE0odXNlcklkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcclxuICAgICAgICBpZiAoc2VsZklkID09IHVzZXJJZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHByaXZhdGVDaGFubmVsSWQgPSB0aGlzLkNoYW5uZWxTdG9yZS5nZXRETUZyb21Vc2VySWQodXNlcklkKTtcclxuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xyXG4gICAgICAgIHRoaXMuQ2hhbm5lbEFjdGlvbnMub3BlblByaXZhdGVDaGFubmVsKHNlbGZJZCwgdXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZVNldHRpbmdzKGNhdCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXQgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9IHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jb25zdCBzdHlsZSA9IGBcclxuICAgIC5jb250YWluZXItMlJsMDF1IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuY2hhdC0zYlJ4eHUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5zaWRlYmFyLTJLOHBGaCB7XHJcbiAgICAgICAgZmxleC1ncm93OiAxIWltcG9ydGFudDtcclxuICAgIH1cclxuYDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiVm9pY2VNb2RlXCIsIHN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcclxuICAgIH1cclxufTsiLCJjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG5kZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5jb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xyXG4gICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gobS5kZWZhdWx0KTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kdWxlcztcclxufTtcclxuXHJcbmNvbnN0IGZpbmRCeVByb3BzID0gKC4uLnByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbmNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbmxldCBtb2QgPSAge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbmV4cG9ydCBkZWZhdWx0IG1vZFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLldlYnBhY2tNb2R1bGVzID0gbW9kIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5cclxubGV0IHByb2ZpbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lm9wZW4gJiYgZS5kZWZhdWx0LmZldGNoTXV0dWFsRnJpZW5kcylbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZFVzZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgZGVsZXRlIHByb3BzLmhyZWYudGFyZ2V0XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKHByb3BzKVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8cHJvcHMuQW5jaG9yIGhyZWY9e1wiL3VzZXJzL1wiK3Byb3BzLnVzZXIuaWR9IHsuLi5wcm9wcy5ocmVmfSBvbkNsaWNrPXsoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGlmKCFwcm9maWxNb2R1bGUpcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG4gICAgICAgICAgICAgICAgcHJvZmlsTW9kdWxlLmRlZmF1bHQub3Blbihwcm9wcy51c2VyLmlkKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvcHJvcHMuQW5jaG9yPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCdWdIdW50ZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiAoPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzNiAzNlwiICB7Li4udGhpcy5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNERDJFNDRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMzMgMzNhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0ybDEtMTJoMjhsMSAxMnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQTU5NkVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MjggMjQuMjYzQTIuNSAyLjUgMCAwMDggMjIuNWMwLS41NjUtLjE5NS0xLjA4MS0uNTExLTEuNUg0bC0uMjcyIDMuMjYzem0yOC41NDQgMEwzMiAyMWgtMy40ODlBMi40ODIgMi40ODIgMCAwMDI4IDIyLjVhMi41IDIuNSAwIDAwNC4yNzIgMS43NjN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIyXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMyAzNUgxM3MyLTYgMi0xM2g2YzAgNyAyIDEzIDIgMTN6TTE3IDJoMnY3aC0yelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTguODM4LjIwNkMxNy42NjcuMDQyIDE3IC4zMTggMTcgMS40MTh2MWMwIDEuMS44NjUgMS43NTMgMS45MjMgMS40NTFsNS4xNTQtLjkwMWMxLjcxNS0uMzQzIDEuNTQ4LTEuNTkzLjA4NS0xLjg4NEwxOC44MzguMjA2elwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0NDRDZERFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2bC0uMDgxLjEyM0MxMC45MzggMTYuOTgxIDMgMTUuMDE1IDMgMTl2Mi41YTIuNSAyLjUgMCAwMDQuOTUuNUgxMmEyIDIgMCAwMDQgMGg0YTIgMiAwIDAwNCAwaDQuMDVhMi41IDIuNSAwIDAwNC45NS0uNVYxOWMwLTQtOC0yLTE1LTEzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGcgZmlsbD1cIiNGNUY4RkFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk0OCA2LjA3OGwtLjAzLjA0NUMxNy4xMzIgMTEuNjE5IDEwLjgxMSAxNi4xMjYgOCAxOHY0YTIgMiAwIDAwNCAwdi00Yy45ODItLjk4MiA1LjgxMy02Ljc4NyA1Ljk4NC0xMS43MzItLjAxLS4wNjQtLjAyNy0uMTI2LS4wMzYtLjE5em0uMDguMzk4QzE4LjMyNCAxMS4zNzQgMjMuMDMxIDE3LjAzMSAyNCAxOHY0YTIgMiAwIDAwNCAwdi00Yy0yLjc1LTEuODMzLTguOTUzLTYuMTktOS45NzItMTEuNTI0elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRMb2dvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNjggMTY4LjY5XCIgey4uLnByb3BzfSBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9e3Byb3BzLnNpemV9PlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19hXCIgeDE9ezY2Ljd9IHkxPXstNDg3Ljd9IHgyPXs2Ni43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19iXCIgeDE9ezEwMS43fSB5MT17LTQ4Ny43fSB4Mj17MTAxLjd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNC45IDM1LjNoMTM5LjJWMTMzSDE0Ljl6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMS43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2IpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwdjE2OGwxNjggLjY5VjB6bTExMS4zIDEyNC4xcy0zLjQtNC4xLTYuMy03LjdjMTIuNi0zLjUgMTcuNC0xMS4zIDE3LjQtMTEuM2E1Mi41MiA1Mi41MiAwIDAxLTExLjEgNS42IDY4LjYzIDY4LjYzIDAgMDEtMzguOSA0IDcwLjEyIDcwLjEyIDAgMDEtMTQuMS00LjEgNDguODggNDguODggMCAwMS03LjEtMy4zYy0uMy0uMi0uNi0uMy0uOS0uNWEuNzYuNzYgMCAwMC0uNC0uMmMtMS43LTEtMi42LTEuNi0yLjYtMS42czQuNiA3LjYgMTYuOCAxMS4yYy0yLjkgMy42LTYuNCA3LjktNi40IDcuOS0yMS4yLS42LTI5LjMtMTQuNS0yOS4zLTE0LjUgMC0zMC42IDEzLjgtNTUuNCAxMy44LTU1LjQgMTMuOC0xMC4zIDI2LjktMTAgMjYuOS0xMGwxIDEuMUM1Mi44IDUwLjMgNDUgNTcuOSA0NSA1Ny45YTU2LjIgNTYuMiAwIDAxNS43LTIuNyA3Mi4xOSA3Mi4xOSAwIDAxMjEuOC02IDguNzUgOC43NSAwIDAxMS42LS4yIDg5LjEgODkuMSAwIDAxMTkuNC0uMiA3OC40NSA3OC40NSAwIDAxMjguOSA5LjFzLTcuNS03LjItMjMuOS0xMi4xbDEuMy0xLjVzMTMuMS0uMyAyNi45IDEwYzAgMCAxMy44IDI0LjggMTMuOCA1NS40LjEtLjEtOCAxMy44LTI5LjIgMTQuNHpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2MpXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbmxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbmxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG5sZXQgc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbmNvbnN0IEd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFJlbGF0aW9uc2hpcHMpWzBdLmRlZmF1bHRcclxuY29uc3Qgc2Vzc2lvbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFNlc3Npb25zKVswXS5kZWZhdWx0XHJcbmNvbnN0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0FjY291bnRJbmZvcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZTIpbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxuICAgICAgICBpZighY29sb3JNb2R1bGUpY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG4gICAgICAgIGlmKCFzaXplTW9kdWxlKXNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFByb2ZpbGVWYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U3RhdGlzdGljcygpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgU2Vzc2lvbnNcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTZXNzaW9uVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2Vzc2lvblZhbHVlKCl7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnNSYXcgPSBzZXNzaW9uTW9kdWxlLmdldFNlc3Npb25zKClcclxuICAgICAgICBjb25zdCBzZXNzaW9ucyA9IE9iamVjdC5rZXlzKHNlc3Npb25zUmF3KS5maWx0ZXIoZSA9PiBlICE9PSBcImFsbFwiKS5tYXAoZSA9PiBzZXNzaW9uc1Jhd1tlXSlcclxuXHJcbiAgICAgICAgaWYoc2Vzc2lvbnMubGVuZ3RoID09PSAwKXJldHVybiBcIi0gTm8gc2Vzc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHRyeSBpbiBhIGZldyBzZWNvbmRzXCJcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gc2Vzc2lvbnMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYCsgaWQ6ICR7ZS5zZXNzaW9uSWR9XHJcbisgb3M6ICR7ZS5jbGllbnRJbmZvLm9zWzBdLnRvVXBwZXJDYXNlKCkrZS5jbGllbnRJbmZvLm9zLnNsaWNlKDEpfVxyXG4rIGNsaWVudDogJHtlLmNsaWVudEluZm8uY2xpZW50fVxyXG4rIHN0YXR1czogJHtlLnN0YXR1c31cclxuKyBBY3Rpdml0aWVzOiAke2UuYWN0aXZpdGllcy5sZW5ndGh9YFxyXG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIitcIi1cIi5yZXBlYXQoMzgpK1wiXFxuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZmlsZVZhbHVlKCl7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtEYXRlfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHVzZXIuY3JlYXRlZEF0XHJcblxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxyXG4gICAgICAgIGlmKHVzZXIuYXZhdGFyICYmIHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IHVzZXIuZ2V0QXZhdGFyVVJMKFwiZ2lmXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihhdmF0YXJVUkwuc3RhcnRzV2l0aChcIi9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBcImh0dHBzOi8vZGlzY29yZC5jb21cIithdmF0YXJVUkxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYXZhdGFyVVJMLmVuZHNXaXRoKFwiP3NpemU9MTI4XCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gYXZhdGFyVVJMLnJlcGxhY2UoXCI/c2l6ZT0xMjhcIiwgXCI/c2l6ZT00MDk2XCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cclxuKyBEaXNjcmltaW5hdG9yOiAke3VzZXIuZGlzY3JpbWluYXRvcn1cclxuKyBUYWc6ICR7dXNlci50YWd9XHJcbisgSUQ6ICR7dXNlci5pZH1cclxuKyBBdmF0YXI6ICR7dXNlci5hdmF0YXJ9XHJcbisgQXZhdGFyIFVSTDogJHthdmF0YXJVUkx9XHJcbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXHJcbisgRmxhZ3M6ICR7dXNlci5mbGFnc31cclxuKyBIYXMgTml0cm86ICR7dXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxyXG4tIDJGQTogJHt1c2VyLm1mYUVuYWJsZWQgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEhhcyBCZWVuIE9uIE1vYmlsZTogJHt1c2VyLm1vYmlsZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cclxuLSBWZXJpZmllZDogJHt1c2VyLnZlcmlmaWVkfWBcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0aXN0aWNzKCl7XHJcblxyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IE9iamVjdC52YWx1ZXMoR3VpbGRNb2R1bGUuZ2V0R3VpbGRzKCkpXHJcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcclxuICAgICAgICBjb25zdCBmcmllbmRzID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0ZyaWVuZChlKSlcclxuICAgICAgICBjb25zdCBibG9ja2VkID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0Jsb2NrZWQoZSkpXHJcblxyXG4gICAgICAgIHJldHVybiBgKyBTZXJ2ZXIgQ291bnQ6ICR7Z3VpbGRzLmxlbmd0aH0gc2VydmVyc1xyXG4rIFJlbGF0aW9uczogJHtyZWxhdGlvbnMubGVuZ3RofSByZWxhdGlvbnNcclxuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXHJcbi0gQmxvY2tlZCBVc2VycyBDb3VudDogJHtibG9ja2VkLmxlbmd0aH0gYmxvY2tlZCB1c2Vyc2BcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcblxyXG5jbGFzcyBDb2RlQ29udGVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUyKW1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcbiAgICAgICAgaWYoIXNjcm9sbGJhck1vZHVsZTEpc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCIvLyBHb29kIGx1Y2sgdG8gcmVhZCBteSBjb2RlLCBFdmVuIG1lIGNhbid0IHJlYWQgaXQgcHJvcGVybHkuXHJcblxyXG5pbXBvcnQgeyBzdGF0IH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4uL21vZHVsZXMvZGlzdGFudFwiXHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCJcclxuXHJcbmNvbnN0IGtleXMgPSB7XHJcbiAgICBzZXR0aW5nVGl0bGU6IHV1aWR2NCgpXHJcbn1cclxubGV0IGZvcm1Nb2R1bGVcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpUHJldmlldyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc3RhdGVzOiBbXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighZm9ybU1vZHVsZSlmb3JtTW9kdWxlID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuRm9ybVNlY3Rpb24pXHJcbiAgICAgICAgLyoqIFxyXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbltdfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGFsbENvbXBvbmVudHMgPSBbLi4ubmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKS5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdKS5tYXAoayA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2tdKVxyXG4gICAgICAgIH0pLmZsYXQoKSldXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPGZvcm1Nb2R1bGUuRm9ybVNlY3Rpb24gdGFnPVwiaDJcIiB0aXRsZT1cIkxpZ2h0Y29yZCdzIEFwaSBBdmFpbGxhYmxlIGNvbXBvbmVudHNcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1UZXh0IHR5cGU9XCJkZXNjcmlwdGlvblwiIGNsYXNzTmFtZT1cIlwiIHNlbGVjdGFibGU9e2ZhbHNlfT5cclxuICAgICAgICAgICAgICAgICAgICBUaGVzZSBjb21wb25lbnRzIGFyZSBoZXJlIGZvciB0aGUgcGx1Z2luIGRldnMuIFRoZXkgY2FuIHF1aWNrbHkgZW1iZWQgYW55IGNvbXBvbmVudCBiZWxvdyB3aXRoIHRoaXMgcGFuZWwuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpblRvcDogXCIyMHB4XCJ9fT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImluZm9cIj5BbGwgdGhlc2UgY29tcG9uZW50cyBoYXZlIGVycm9yIGhhbmRsaW5nLiBJZiB5b3Ugd2FudCBub25lLCBhZGQgYC5vcmlnaW5hbGAgYWZ0ZXIgdGhlIGNvbXBvbmVudCBwYXRoLjwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJ3YXJuXCI+V2UgZG8gbm90IHJlY29tbWVuZCBtb2RpZnlpbmcgdGhlc2UgY29tcG9uZW50IGJ5IGEgcGx1Z2luLiBPbmx5IGRvIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLjwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVRleHQ+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wPjwvTWFyZ2luVG9wPlxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIGNvbG9yPVwiYnJhbmRcIiBsb29rPVwib3V0bGluZWRcIiBzaXplPVwibWVkaXVtXCIgaG92ZXJDb2xvcj1cImdyZWVuXCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6L0xpZ2h0Y29yZEFwaS9kb2NzXCIpXHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPixcclxuICAgICAgICAgICAgYWxsQ29tcG9uZW50cy5tYXAoY29tcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgQWxsUHJldmlld3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgaWYoY29tcC5BbGxQcmV2aWV3cylBbGxQcmV2aWV3cyA9IGNvbXAuQWxsUHJldmlld3NcclxuICAgICAgICAgICAgICAgIGxldCBvbkNoYW5nZSA9ICh0YWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0U3RhdGUgPSAobmV3U3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOiBbT2JqZWN0LmFzc2lnbihzdGF0ZSwgbmV3U3RhdGUpXS5jb25jYXQodGhpcy5zdGF0ZS5zdGF0ZXMuZmlsdGVyKGUgPT4gZS5lbGVtICE9PSBjb21wKSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZS5zdGF0ZXMuZmluZChlID0+IGUuZWxlbSA9PT0gY29tcClcclxuICAgICAgICAgICAgICAgIGlmKCFzdGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW06IGNvbXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhdGVzLnB1c2goc3RhdGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cclxuICAgICAgICAgICAgICAgICAgICBBbGxQcmV2aWV3cy5mb3JFYWNoKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLm9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcCwgZ2V0UHJvcHMoKSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlckNvZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNYXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUuJCR0eXBlb2YgJiYgKHZhbHVlLiQkdHlwZW9mID09PSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCB2YWx1ZS4kJHR5cGVvZiA9PT0gMHhlYWM3KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcclxuICAgIG1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcclxufX0sXHJcbiAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIixcclxuICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLFxyXG4gICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgfSwgY2xhc3NOYW1lOiBcImxjLXRhYi1ib3gtc2hhZG93XCIgfSxcclxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4gICAgKVxyXG4pYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcclxuICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbiAgICB9fT5cclxuICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+UHJldmlldyB0YWJzPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJZb3VyIGNvbXBvbmVudHMgaGVyZS5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgXCIgICAgXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0ZUNvZGUgPSBmdW5jdGlvbihsYW5nKXsgLy8gY29kZSBmb3JtYXR0aW5nIGlzIGhhcmRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wTmFtZSA9IGNvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBDYXRlZ29yeSA9IGNhdGVnb3JpZXMuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBQYXRoID0gYExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy4ke2NvbXBDYXRlZ29yeX0uJHtjb21wTmFtZX1gXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZXRQcm9wcygpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5Qcm9wID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoa2V5ID09IFwiY2hpbGRyZW5cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Qcm9wID0gZ2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSBrZXkrXCI9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvcHNba2V5XSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYHske2dldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpfX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLnB1c2goc3RyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblRhZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjaGlsZHJlblByb3Ape1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlVGFnID0gYDwvJHtjb21wUGF0aH0+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke29wZW5UYWd9XFxuICAgICR7Y2hpbGRyZW5Qcm9wfVxcbiR7Y2xvc2VUYWd9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5UYWcgPSBgPCR7Y29tcFBhdGh9ICR7cHJvcFN0cmluZ3Muam9pbihcIiBcIil9Lz5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlblRhZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4gfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGRyZW4gJiYgY2hpbGRyZW4uJCR0eXBlb2YgJiYgKGNoaWxkcmVuLiQkdHlwZW9mID09PSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gMHhlYWM3KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGdldFN0ckZvclByb3AoY2hpbGRyZW4sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IHZpc2libGVLZXkrXCI6IFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgcHJvcHNba2V5XSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZ2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZykuc3BsaXQoXCJcXG5cIikubWFwKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiAgICBcIiArIHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCJcXG5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLnB1c2goc3RyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb3BTdHJpbmdzLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5mb3JFYWNoKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0ZpcnN0ID0gaSA9PT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0ZpcnN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwiXFxuICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc0xhc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9XCJcXG59XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5EYXRhID0gdHlwZW9mIGNoaWxkcmVuID09PSBcInN0cmluZ1wiICYmIGNoaWxkcmVuLnN0YXJ0c1dpdGgoXCJSZWFjdC5jcmVhdGVFbGVtZW50XCIpID8gY2hpbGRyZW4gOiBKU09OLnN0cmluZ2lmeShjaGlsZHJlbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IGhlbHAuaW5mbyA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICB7aGVscC5pbmZvfVxyXG4gICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgICAgICAgICAgbGV0IHdhcm4gPSBoZWxwLndhcm4gPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJ3YXJuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2hlbHAud2Fybn1cclxuICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICAgICAgICAgIGxldCBkYW5nZXIgPSBoZWxwLmRhbmdlciA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtoZWxwLmRhbmdlcn1cclxuICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IGhlbHAuZXJyb3IgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJlcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtoZWxwLmVycm9yfVxyXG4gICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3MgPSBoZWxwLnN1Y2Nlc3MgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJzdWNjZXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2hlbHAuc3VjY2Vzc31cclxuICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpbmZvfVxyXG4gICAgICAgICAgICAgICAgICAgIHtzdWNjZXNzfVxyXG4gICAgICAgICAgICAgICAgICAgIHt3YXJufVxyXG4gICAgICAgICAgICAgICAgICAgIHtlcnJvcn1cclxuICAgICAgICAgICAgICAgICAgICB7ZGFuZ2VyfVxyXG4gICAgICAgICAgICAgICAgICAgIHtBbGxQcmV2aWV3cy5tYXAoY2F0ZWdvcnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5vbkNsaWNrKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0uY2hpbGRyZW4pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnkubGVuZ3RoID09PSAxKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7a2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwib3B0LVwiK2luZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9IHZhbHVlPXtcIm9wdC1cIisoc3RhdGUub3B0aW9uc1trZXldIHx8IFwiMFwiKX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUub3B0aW9ucywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV06ICh2YWx1ZS52YWx1ZSB8fCBcIjBcIikucmVwbGFjZShcIm9wdC1cIiwgXCJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0gc2VhcmNoYWJsZT17dHJ1ZX0vPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Cb3R0b206IFwiOHB4XCJ9fT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGFicyB0YWJzPXtbe2xhYmVsOiBcIlByZXZpZXdcIiwgaWQ6IFwicHJldmlld1wifSwge2xhYmVsOiBcIkNvZGVcIiwgaWQ6IFwiY29kZVwifV19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU9e3N0YXRlLnRhYn0gY2hpbGRyZW49e3N0YXRlLnRhYiA9PT0gXCJwcmV2aWV3XCIgPyByZW5kZXJQcmV2aWV3KCkgOiByZW5kZXJDb2RlKCl9IG9uQ2hhbmdlPXtvbkNoYW5nZX0vPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcmVuZGVycygpe1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tIFwiLi9pY29ucy9lZGl0XCI7XHJcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuL2ljb25zL2RlbGV0ZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgeyBwcm9jZXNzRmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcbmNvbnN0IGFuY2hvckNsYXNzZXMgPSBCRFYyLmFuY2hvckNsYXNzZXM7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUGx1Z2luQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luICYmIHR5cGVvZih0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKSA9PT0gXCJmdW5jdGlvblwiO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRoaXMuZWRpdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbG9hZCA9IHRoaXMucmVsb2FkLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGZhbHNlLFxyXG4gICAgICAgICAgICByZWxvYWRzOiAwLFxyXG4gICAgICAgICAgICB0cnVzdGVkOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1NldHRpbmdzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNTZXR0aW5ncykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VTZXR0aW5ncygpIHtcclxuICAgICAgICB0aGlzLnBhbmVsUmVmLmN1cnJlbnQuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nc09wZW46IGZhbHNlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NQYW5lbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiZm9yay1wcy0zXCJdKSByZXR1cm47XHJcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW4gPSAoY29udGFpbmVyLCBlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighY29udGFpbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ29udGFpbmVyIGlzIHVuZGVmaW5lZC5gKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZVRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5yZWZzLmNhcmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzTm9kZS5jbG9zZXN0KFwiZGl2W2NsYXNzKj1cXFwiY29udGVudFJlZ2lvblNjcm9sbGVyLVxcXCJdXCIpXHJcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGVPZmZzZXQgPSBET00ub2Zmc2V0KHRoaXNOb2RlKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyT2Zmc2V0ID0gRE9NLm9mZnNldChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpc05vZGVPZmZzZXQudG9wIC0gY29udGFpbmVyT2Zmc2V0LnRvcCArIGNvbnRhaW5lci5zY3JvbGxUb3AgLSAzMDtcclxuICAgICAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUG9pbnQgPiBvcmlnaW5hbCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsICsgKHByb2dyZXNzICogKGVuZFBvaW50IC0gb3JpZ2luYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHRyeSB7IHRoaXMuc2V0dGluZ3NQYW5lbCA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwoKTsgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBnZXQgc2V0dGluZ3MgcGFuZWwgZm9yIFwiICsgdGhpcy5uYW1lICsgXCIuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1vcGVuIHVpLXN3aXRjaC1pdGVtXCIsIHJlZjogXCJjYXJkTm9kZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcImZsb2F0XCI6IFwicmlnaHRcIiwgXCJjdXJzb3JcIjogXCJwb2ludGVyXCJ9LCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCJ9KSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRUaXRsZShuYW1lLCB2ZXJzaW9uLCBhdXRob3IpIHtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IFwie3tuYW1lfX0gdnt7dmVyc2lvbn19IGJ5IHt7YXV0aG9yfX1cIi5zcGxpdCgvKHt7W0EtWmEtel0rfX0pLyk7XHJcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW25hbWVJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcIm5hbWUgYmRhLW5hbWVcIn0sIG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb25JbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e3ZlcnNpb259fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcclxuICAgICAgICBjb25zdCBhdXRob3JJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e2F1dGhvcn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xyXG4gICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5jbGFzc05hbWUgKz0gYCAke2FuY2hvckNsYXNzZXMuYW5jaG9yfSAke2FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmspIHByb3BzLmhyZWYgPSBhdXRob3IubGluaztcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aXRsZVthdXRob3JJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCA/IFwiYVwiIDogXCJzcGFuXCIsIHByb3BzLCBhdXRob3IubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aXRsZS5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUxpbmsodGl0bGUsIHVybCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJiZGEtbGluayBiZGEtbGluay13ZWJzaXRlXCIsIHRhcmdldDogXCJfYmxhbmtcIn07XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwiZnVuY3Rpb25cIikgcHJvcHMub25DbGljayA9IChldmVudCkgPT4ge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB1cmwoKTt9O1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHByb3BzLCB0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUJ1dHRvbih0aXRsZSwgY2hpbGRyZW4sIGFjdGlvbikge1xyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tYnV0dG9uXCIgb25DbGljaz17YWN0aW9ufT57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD47XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlua3MoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBbXTtcclxuICAgICAgICBjb25zdCBhZGRvbiA9IHRoaXMucHJvcHMuYWRkb247XHJcbiAgICAgICAgaWYgKGFkZG9uLndlYnNpdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIldlYnNpdGVcIiwgYWRkb24ud2Vic2l0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5zb3VyY2UpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlNvdXJjZVwiLCBhZGRvbi5zb3VyY2UpKTtcclxuICAgICAgICBpZiAoYWRkb24uaW52aXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlN1cHBvcnQgU2VydmVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RlciA9IC9cXC5nZ1xcLyguKikkLztcclxuICAgICAgICAgICAgICAgIGxldCBjb2RlID0gYWRkb24uaW52aXRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3Rlci50ZXN0KGNvZGUpKSBjb2RlID0gY29kZS5tYXRjaCh0ZXN0ZXIpWzFdO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChjb2RlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWRkb24uZG9uYXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJEb25hdGVcIiwgYWRkb24uZG9uYXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnBhdHJlb24pIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlBhdHJlb25cIiwgYWRkb24ucGF0cmVvbikpO1xyXG4gICAgICAgIHJldHVybiBsaW5rcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gdGhpcy5saW5rcztcclxuICAgICAgICByZXR1cm4gKGxpbmtzLmxlbmd0aCB8fCB0aGlzLmhhc1NldHRpbmdzKSAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLWZvb3RlciBiZGEtZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tbGlua3MgYmRhLWxpbmtzXCJ9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGxpbmtzLm1hcCgoZWxlbWVudCwgaW5kZXgpID0+IGluZGV4IDwgbGlua3MubGVuZ3RoIC0gMSA/IFtlbGVtZW50LCBcIiB8IFwiXSA6IGVsZW1lbnQpLmZsYXQoKSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge29uQ2xpY2s6IHRoaXMuc2hvd1NldHRpbmdzLCBjbGFzc05hbWU6IFwiYmQtYnV0dG9uIGJkYS1zZXR0aW5ncy1idXR0b25cIiwgZGlzYWJsZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9LCBcIlNldHRpbmdzXCIpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZSAmJiB0aGlzLnByb3BzLnRvZ2dsZSh0aGlzLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KCkge3RoaXMucHJvcHMuZWRpdCh0aGlzLm5hbWUpO31cclxuICAgIGRlbGV0ZSgpIHt0aGlzLnByb3BzLnJlbW92ZSh0aGlzLm5hbWUpO31cclxuICAgIHJlbG9hZCgpIHt0aGlzLnByb3BzLnJlbG9hZCh0aGlzLm5hbWUpO31cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiB0aGlzLnByb3BzLmFkZG9uLm5hbWUpO31cclxuICAgIGdldCBhdXRob3IoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiB0aGlzLnByb3BzLmFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXQgdmVyc2lvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybiB0aGlzLnNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IHthdXRob3JJZCwgYXV0aG9yTGlua30gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG5cclxuICAgICAgICBjb25zdCBzdHlsZSA9IHt9XHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBpZighdGhpcy5pc1NjYW5uaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNTY2FubmluZyA9IHRydWVcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHJlc29sdmUodGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgPyBjb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCB0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMudW5tb3VudGVkKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJ1c3RlZDogcmVzdWx0LnN1c3BlY3QgPyBcInN1c3BlY3RcIiA6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge30pXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuaXNUcnVzdGVkID09PSBcInN1c3BlY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcInJnYigyNDAsIDcxLCA3MSlcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3MtY2xvc2VkIHVpLXN3aXRjaC1pdGVtXCIsIHN0eWxlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24taGVhZGVyIGJkYS1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC10aXRsZSBiZGEtaGVhZGVyLXRpdGxlXCJ9LCB0aGlzLmJ1aWxkVGl0bGUodGhpcy5uYW1lLCB0aGlzLnZlcnNpb24sIHtuYW1lOiB0aGlzLmF1dGhvciwgaWQ6IGF1dGhvcklkLCBsaW5rOiBhdXRob3JMaW5rfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWNvbnRyb2xzIGJkYS1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5lZGl0ICYmIHRoaXMubWFrZUJ1dHRvbihcIkVkaXRcIiwgPEVkaXRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5lZGl0KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRGVsZXRlXCIsIDxEZWxldGVJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5kZWxldGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbG9hZCAmJiB0aGlzLm1ha2VCdXR0b24oXCJSZWxvYWRcIiwgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLnJlbG9hZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlci13cmFwIGJkYS1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyIGJkLWFkZG9uLWRlc2NyaXB0aW9uIGJkYS1kZXNjcmlwdGlvbiBzY3JvbGxlclwifSwgdGhpcy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5mb290ZXJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyIsImltcG9ydCBFcnJvckJvdW5kYXJ5IGZyb20gXCIuL2Vycm9yQm91bmRhcnlcIjtcclxuaW1wb3J0IENvbnRlbnRDb2x1bW4gZnJvbSBcIi4vY29udGVudENvbHVtblwiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBBZGRvbkNhcmQgZnJvbSBcIi4vYWRkb25jYXJkXCI7XHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vY29tcG9uZW50cy9zZWFyY2hcIjtcclxuXHJcbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4uL21vZHVsZXMvYmRFdmVudHNcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFkZG9uQ2hhbmdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gdGhpcy5vbkFkZG9uQ2hhbmdlcy5iaW5kKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxyXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXVubG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAodGhpcy5pc1BsdWdpbnMgPyBcInBsdWdpblwiIDogXCJ0aGVtZVwiKSArIFwiLVwiXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9cmVsb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlbGwgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGw7XHJcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xyXG4gICAgICAgIG9wZW4odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIGVkaXQ6IHNldHRpbmdzQ29va2llW1wiZm9yay1wcy03XCJdID8gdGhpcy5lZGl0LmJpbmQodGhpcykgOiBudWxsLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaXN0KCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA9PT0gXCJwbHVnaW5zXCIgPyBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykgOiBPYmplY3QudmFsdWVzKGJkdGhlbWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IGFbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gYi5wbHVnaW4gJiYgYi5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYi5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpICA6IGJbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdCA+IHNlY29uZCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPiBmaXJzdCkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuYXNjZW5kaW5nKSBzb3J0ZWRBZGRvbnMucmV2ZXJzZSgpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBzb3J0ZWRBZGRvbnMubGVuZ3RoOyBhKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYWRkb24gPSBzb3J0ZWRBZGRvbnNbYV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5nZXREZXNjcmlwdGlvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRWZXJzaW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvcikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgYXV0aG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGRlc2NyaXB0aW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xyXG4gICAgICAgICAgICByZW5kZXJlZC5wdXNoKDxFcnJvckJvdW5kYXJ5PjxBZGRvbkNhcmQgey4uLnByb3BzfSByZWxvYWQ9eyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiB0aGlzLm1hbmFnZXIucmVsb2FkLmJpbmQodGhpcy5tYW5hZ2VyKX0gLz48L0Vycm9yQm91bmRhcnk+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cclxuICAgIGdldEF1dGhvcihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiBhZGRvbi5hdXRob3IpO31cclxuICAgIGdldERlc2NyaXB0aW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXJDaGVja1VwZGF0ZXMoKXtcclxuICAgICAgICBpZighd2luZG93LlplcmVzUGx1Z2luTGlicmFyeSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKCF3aW5kb3cuUGx1Z2luVXBkYXRlcylyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHR5cGVvZiB3aW5kb3cuUGx1Z2luVXBkYXRlcy5jaGVja0FsbCAhPT0gXCJmdW5jdGlvblwiKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXRoaXMuaXNQbHVnaW5zKXJldHVybiBudWxsXHJcblxyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgdGV4dD1cIkNoZWNrcyBmb3IgdXBkYXRlcyBvZiBwbHVnaW5zIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuIFJpZ2h0LWNsaWNrIGZvciBhIGxpc3QuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7bWFyZ2luTGVmdDogXCIxMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIlBsdWdpbiB1cGRhdGUgY2hlY2sgaW4gcHJvZ3Jlc3MuXCIsIHt0eXBlOiBcImluZm9cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBjb21wbGV0ZS5cIiwge3R5cGU6IFwic3VjY2Vzc1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjaGVja2luZyB1cGRhdGUuXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9IGRpc2FibGVkPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIFVwZGF0ZXNcclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoSWNvbiA9IDxUb29sdGlwIGNvbG9yPVwiYmxhY2tcIiBwb3NpdGlvbj1cInRvcFwiIHRleHQ9XCJSZWxvYWQgTGlzdFwiPlxyXG4gICAgICAgICAgICB7KHByb3BzKSA9PiBcclxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsdWdpbnMpIHBsdWdpbk1vZHVsZS51cGRhdGVQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoZW1lTW9kdWxlLnVwZGF0ZVRoZW1lTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICB9PC9Ub29sdGlwPjtcclxuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxDb250ZW50Q29sdW1uIHRpdGxlPXtgJHt0aGlzLnByb3BzLnR5cGUudG9VcHBlckNhc2UoKX3igJQke2FkZG9uQ2FyZHMubGVuZ3RofWB9PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjbGFzc05hbWU9XCJiZC1idXR0b24gYmQtcGZidG5cIiBvbkNsaWNrPXt0aGlzLm9wZW5Gb2xkZXIuYmluZCh0aGlzKX0+T3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAge3RoaXMucmVuZGVyQ2hlY2tVcGRhdGVzKCl9XHJcbiAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtY29udHJvbHMgYmQtYWRkb24tY29udHJvbHNcIj5cclxuICAgICAgICAgICAgICAgIDxTZWFyY2ggb25DaGFuZ2U9e3RoaXMuc2VhcmNofSBwbGFjZWhvbGRlcj17YFNlYXJjaCAke3RoaXMucHJvcHMudHlwZX0uLi5gfSAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPlNvcnQgYnk6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuZGlyZWN0aW9uc30gb25DaGFuZ2U9e3RoaXMucmV2ZXJzZX0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cclxuICAgICAgICA8L0NvbnRlbnRDb2x1bW4+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ2FyZExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7aGVpZ2h0OiBcIjEwMCVcIiwgd2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ28gXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSwgc3R5bGU6IHtmaWxsUnVsZTogXCJldmVub2RkXCIsIGNsaXBSdWxlOiBcImV2ZW5vZGRcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwifSwgdmlld0JveDogXCIwIDAgMjAwMCAyMDAwXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJtZXRhZGF0YVwiLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cxXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIyMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjE1XCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMjU1LDI1NSwyNTUsMC4xNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cyKVwifSwgZDogXCJNMTY5NS41NCs2MzEuNDQyQzE2ODUuODQrMjc4LjA0MisxNDA5LjM0KzEzNS40NDIrMTA1Mi45NCsxMzUuNDQyTDM2MS43NCsxMzYuNDQyTDgwMy43NCs0OTAuNDQyTDEwNjAuNzQrNDkwLjQ0MkMxMzM1LjI0KzQ5MC40NDIrMTMzNS4yNCs4MzUuMzQyKzEwNjAuNzQrODM1LjM0MkwxMDYwLjc0KzExNjQuODRDMTE1MC4yMisxMTY0Ljg0KzEyMTAuNTMrMTIwMS40OCsxMjQxLjY4KzEyNTAuODdDMTMwNi4wNysxMzUzKzEyNDUuNzYrMTUwOS42NCsxMDYwLjc0KzE1MDkuNjRMMzYxLjc0KzE4NjMuNTRMMTA1Mi45NCsxODY0LjU0QzE0MDkuMjQrMTg2NC41NCsxNjg1Ljc0KzE3MjEuOTQrMTY5NS41NCsxMzY4LjU0QzE2OTUuNTQrMTIwNS45NCsxNjUxLjA0KzEwODQuNDQrMTU3Mi42NCs5OTkuOTQyQzE2NTEuMDQrOTE1LjU0MisxNjk1LjU0Kzc5NC4wNDIrMTY5NS41NCs2MzEuNDQyWlwiLCBmaWxsOiBcIiMzRTgyRTVcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MSlcIn0sIGQ6IFwiTTE0NjkuMjUrNjMxLjQ0MkMxNDU5LjU1KzI3OC4wNDIrMTE4My4wNSsxMzUuNDQyKzgyNi42NSsxMzUuNDQyTDEzNS40NSsxMzUuNDQyTDEzNS40NSsxMDA0QzEzNS40NSsxMDA0KzEzNS40MjcrMTI1NS4yMSszNTUuNjI2KzEyNTUuMjFDNTc1LjgyNSsxMjU1LjIxKzU3NS44NDgrMTAwNCs1NzUuODQ4KzEwMDRMNTc3LjQ1KzQ5MC40NDJMODM0LjQ1KzQ5MC40NDJDMTEwOC45NSs0OTAuNDQyKzExMDguOTUrODM1LjM0Mis4MzQuNDUrODM1LjM0Mkw2NjQuNjUrODM1LjM0Mkw2NjQuNjUrMTE2NC44NEw4MzQuNDUrMTE2NC44NEM5MjMuOTMyKzExNjQuODQrOTg0LjI0NCsxMjAxLjQ4KzEwMTUuMzkrMTI1MC44N0MxMDc5Ljc4KzEzNTMrMTAxOS40NysxNTA5LjY0KzgzNC40NSsxNTA5LjY0TDEzNS40NSsxNTA5LjY0TDEzNS40NSsxODY0LjU0TDgyNi42NSsxODY0LjU0QzExODIuOTUrMTg2NC41NCsxNDU5LjQ1KzE3MjEuOTQrMTQ2OS4yNSsxMzY4LjU0QzE0NjkuMjUrMTIwNS45NCsxNDI0Ljc1KzEwODQuNDQrMTM0Ni4zNSs5OTkuOTQyQzE0MjQuNzUrOTE1LjU0MisxNDY5LjI1Kzc5NC4wNDIrMTQ2OS4yNSs2MzEuNDQyWlwiLCBmaWxsOiBcIiNGRkZGRkZcIiwgb3BhY2l0eTogXCIxXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ2hlY2tib3ggZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwibGlcIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveEVsZW1lbnQsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZCwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcImNoZWNrYm94XCJ9KSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCAhdGhpcy5zdGF0ZS5jaGVja2VkKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgY2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IEFycm93IGZyb20gXCIuLi9pY29ucy9kb3duYXJyb3dcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlY3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtvcGVuOiBmYWxzZSwgdmFsdWU6IHRoaXMucHJvcHMudmFsdWUgfHwgdGhpcy5wcm9wcy5vcHRpb25zWzBdLnZhbHVlfTtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duID0gUmVhY3QuY3JlYXRlUmVmKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dNZW51ID0gdGhpcy5zaG93TWVudS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGlkZU1lbnUgPSB0aGlzLmhpZGVNZW51LmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lbnUoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IHRydWV9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlTWVudSgpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiBmYWxzZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7dmFsdWV9KTtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZSkgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGVkKCkge3JldHVybiB0aGlzLnByb3BzLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT0gdGhpcy5zdGF0ZS52YWx1ZSk7fVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcChvcHQgPT4gXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdC1vcHRpb24ke3NlbGVjdGVkLnZhbHVlID09IG9wdC52YWx1ZSA/IFwiIHNlbGVjdGVkXCIgOiBcIlwifWB9IG9uQ2xpY2s9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzLCBvcHQudmFsdWUpfT57b3B0LmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnByb3BzLnN0eWxlID09IFwidHJhbnNwYXJlbnRcIiA/IFwiIGJkLXNlbGVjdC10cmFuc3BhcmVudFwiIDogXCJcIjtcclxuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XHJcbiAgICAgICAgcmV0dXJuICA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxyXG4vLyA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj57dGhpcy5wcm9wcy5sYWJlbH08L2xhYmVsPlxyXG4vLyA8ZGl2IGNsYXNzTmFtZT17YGJkLXNlbGVjdCR7c3R5bGV9JHtpc09wZW59YH0gb25DbGljaz17dGhpcy5zaG93TWVudX0gcmVmPXt0aGlzLmRyb3Bkb3dufT5cclxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XHJcbi8vICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuLy8gICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuLy8gICAgIDwvZGl2PlxyXG4vLyA8L2Rpdj5cclxuLy8ge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU2VhcmNoSWNvbiBmcm9tIFwiLi4vaWNvbnMvc2VhcmNoXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlYXJjaC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIGNsYXNzTmFtZT1cImJkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLnBsYWNlaG9sZGVyfSBtYXhMZW5ndGg9XCI1MFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlYXJjaEljb24gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Td2l0Y2ggb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnN0YXRlLmNoZWNrZWR9IC8+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NvbnRlbnRDb2x1bW4gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbiAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5wcm9wcy50aXRsZSA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgdGhpcy5wcm9wcy50aXRsZSkgOiBudWxsXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uICsgXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsIHN0eWxlOiB7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcbmltcG9ydCBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZnJvbSBcIi4vY3NzRWRpdG9yRGV0YWNoZWRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnByb3BzLmxpbmVzID0gMDtcclxuICAgICAgICBzZWxmLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHNlbGYuYXR0YWNoID0gc2VsZi5hdHRhY2guYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaGVkRWRpdG9yID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCwge2F0dGFjaDogc2VsZi5hdHRhY2h9KTtcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2ggPSBzZWxmLmRldGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogdGhpcy5wcm9wcy5kZXRhY2hlZCB8fCBCRFYyLmVkaXRvckRldGFjaGVkXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5kZXRhY2hlZCAmJiAhc2VsZi5zdGF0ZS5kZXRhY2hlZCkge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5kZXRhY2hlZFJvb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb2RlTWlycm9yKCkge1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxyXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxyXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNzcygpIHtcclxuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcclxuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjc3MgPSBhdG9iKF9jY3NzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgY29uc3Qge2RldGFjaGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiRWRpdG9yIERldGFjaGVkXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3JcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImRldGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImhlbHAtdGV4dFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIitcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGFyZykge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoYXJnKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBidG9hKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBkcm9vdCA9IHNlbGYuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIGlmICghZHJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gSU5KRUNUIFJPT1Q6IC5hcHBcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc2VsZi5kZXRhY2hlZEVkaXRvciwgZHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0RGV0YWNoZWRSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3REZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5vbkNoYW5nZSA9IHNlbGYub25DaGFuZ2UuYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gYXRvYihfY2Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiBzZWxmLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiYXR0YWNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImF0dGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5yb290KTtcclxuICAgICAgICAgICAgICAgIHNlbGYucm9vdC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIGJ0b2EodGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSB7aGFzRXJyb3I6IGZhbHNlfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRDYXRjaCgpIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmhhc0Vycm9yKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwicmVhY3QtZXJyb3JcIn0sIFwiQ29tcG9uZW50IEVycm9yXCIpOyAgXHJcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuOyBcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVsZXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIiAvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJ7LyogPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiIHdpZHRoPVwiMThweFwiIGhlaWdodD1cIjE4cHhcIj5cclxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbjwvc3ZnPiAqL31cclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMThweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XHJcbiAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZSltYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiXHJcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi4vbW9kdWxlcy9kaXN0YW50XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpIHx8IGRlZmF1bHRSUEMsXHJcbiAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlldyA9IG51bGxcclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMgPSBuZXcgU2V0KClcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVXaGVuRmV0Y2hlZChjb21wKXtcclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5hZGQoY29tcClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhbmdlKHNldHRpbmcsIHZhbHVlKXtcclxuICAgICAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZClcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLnN0YXRlLmFzc2V0c1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYoc2V0dGluZy5wcm9wcy5pZCA9PT0gXCJhcHBsaWNhdGlvbl9pZFwiKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5zZXQoc2V0dGluZ3NSUEMpXHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2hBc3NldHMoKXtcclxuICAgICAgICBpZih0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpe1xyXG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkICE9PSBhcHApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gdHJ1ZVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXHJcbiAgICAgICAgLnRoZW4oYXNzZXRzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXNzZXQudHlwZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIHx8IChWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz4sXHJcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUmljaFByZXNlbmNlXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cclxuICAgICAgICAgICAgICAgIHt0aGlzLm9wdGlvbnNDb21wb25lbnRzfVxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wIC8+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XHJcbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICA8UnBjUHJldmlldyBzZXR0aW5ncz17dGhpc30vPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXt3aW5kb3cub2hnb2RvaGZ1Y2t9PlxyXG4gICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcclxuICAgICAgICAgICAgPC9idXR0b24+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ29tcG9uZW50cyB8fCAodGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgPSBSUENQcm9wcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcclxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKX0vPlxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IFJQQ1Byb3BzID0gW1xyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXHJcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcclxuICAgICAgICBpZDogXCJuYW1lXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJCcm93c2luZyBEaXNjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcclxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZCBDbGllbnRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcclxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMuc21hbGxcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG5dXHJcblxyXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xyXG5jbGFzcyBJbnB1dFRleHQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIGlucHV0VGV4dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICAgICAgaW5wdXRNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xyXG5jbGFzcyBJbnB1dE51bWJlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSB0eXBlPVwibnVtYmVyXCIgb25DaGFuZ2U9eyh2YWx1ZSwgbmFtZSwgaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXHJcbiAgICAgICAgICAgIGlmKHZhbHVlID09IHRoaXMuc3RhdGUuZGF0YSl7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCI+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+IDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dENob2ljZU1vZHVsZXNcclxuY2xhc3MgSW5wdXRDaG9pY2UgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci51cGRhdGVXaGVuRmV0Y2hlZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGRhdGEpe1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcclxuXHJcbiAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhID09PSBcIm5vbmVcIiA/IG51bGwgOiB0aGlzLnN0YXRlLmRhdGEucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0Q2hvaWNlTW9kdWxlcyB8fCAoSW5wdXRDaG9pY2VNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICB2YWx1ZTogXCJub25lXCIsXHJcbiAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvcHRpb25zPXtvcHRpb25zfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSAvPlxyXG4gICAgICAgICAgICAgICAgey8qPFNlbGVjdCB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSBvcHRpb25zPXtvcHRpb25zfS8+Ki99XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxyXG5jbGFzcyBEaXZpZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlciAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGRpdmlkZXIsXHJcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBEaXNjb3JkQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUnBjUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFicyA9IFtdXHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuc2V0dGluZ3MucHJldmlldyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUYWIodGFiKXtcclxuICAgICAgICBsZXQgYW5jaWVudFRhYiA9IHRoaXMuc3RhdGUuYWN0aXZlXHJcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0YWIuc2V0QWN0aXZlKHRydWUpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogdGFiLnByb3BzLmlkXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYm5hdlwiIHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8UHJlc2VuY2VFcnJvckNhdGNoZXIgcHJldmlldz17dGhpcy5wcmV2aWV3fSBzdGF0ZT17dGhpcy5zdGF0ZS5ycGN9IHByb3BzPXt7cHJldmlldzogdGhpc319IGtleT17dGhpcy5zdGF0ZS5hY3RpdmV9IC8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfSAgIFxyXG5cclxuICAgIGlzQWN0aXZlKHRhYil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlID09PSB0YWJcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJldmlldygpe1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlID09PSBcInByb2ZpbGVcIilyZXR1cm4gUHJvZmlsZVxyXG4gICAgICAgIHJldHVybiBQb3BvdXRcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGFiIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wcy5wcmV2aWV3LnRhYnMucHVzaCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlKXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUFjdGl2ZWBcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUluYWN0aXZlYFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMucHJldmlldy5jaGFuZ2VUYWIodGhpcylcclxuICAgICAgICB9fT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgZW1wdHlDbGFzc2VzXHJcbmNsYXNzIFByZXNlbmNlRXJyb3JDYXRjaGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbXBvbmVudERpZENhdGNoKGVyciwgZXJySW5mbyl7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyckluZm8pXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGVycm9yOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlKXtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmVycm9yKXtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlldyA9IG5ldyB0aGlzLnByb3BzLnByZXZpZXcodGhpcy5wcm9wcy5wcm9wcylcclxuICAgICAgICAgICAgICAgIHByZXZpZXcuc2V0U3RhdGUodGhpcy5wcm9wcy5zdGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aWV3LnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBlbXB0eUNsYXNzZXMgPSBlbXB0eUNsYXNzZXMgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5lbXB0eVN0YXRlSW1hZ2UgJiYgZS5lbXB0eVN0YXRlKVxyXG4gICAgICAgICAgICBpZighZW1wdHlDbGFzc2VzKXtcclxuICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuXCIpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMjBweFwiXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPXtgbGMtdGFiLWJveC1zaGFkb3cgJHtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVJbWFnZX0gc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBcIjIwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVIZWFkZXJ9PkFuIGVycm9yIG9jY3VyZWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlU3VidGV4dH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuIEpvaW4gb3VyIMKtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT17YCR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtCRFYyLmFuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9ezB9IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuam9pbkxDKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNlcnZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIMKtIGZvciBoZWxwLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwb3BvdXRNb2R1bGVzXHJcbmxldCBVc2VyUG9wb3V0Q29tcG9uZW50XHJcbmxldCBQb3BvdXRQcm9wc1xyXG5jbGFzcyBQb3BvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlcyB8fCAocG9wb3V0TW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJGbHV4Q29udGFpbmVyKEZvcndhcmRSZWYoU3Vic2NyaWJlR3VpbGRNZW1iZXJzQ29udGFpbmVyKFVzZXJQb3BvdXQpKSlcIiksXHJcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBVc2VyUG9wb3V0LFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBpZighVXNlclBvcG91dENvbXBvbmVudCl7XHJcbiAgICAgICAgICAgIGlmKCFVc2VyUG9wb3V0KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclBvcG91dCBjb21wb25lbnQuYClcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMSA9IG5ldyBVc2VyUG9wb3V0LmRlZmF1bHQoe3VzZXJJZDogdXNlci5pZCwgZ3VpbGRJZDogbnVsbCwgY2hhbm5lbElkOiBudWxsLCBkaXNhYmxlVXNlclByb2ZpbGVMaW5rOiB0cnVlfSkucmVuZGVyKClcclxuICAgICAgICAgICAgUG9wb3V0UHJvcHMgPSByZW5kZXIxLnByb3BzXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjIgPSByZW5kZXIxLnR5cGUucmVuZGVyKFBvcG91dFByb3BzLCBudWxsKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIzID0gbmV3IHJlbmRlcjIudHlwZShyZW5kZXIyLnByb3BzKS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBVc2VyUG9wb3V0Q29tcG9uZW50ID0gcmVuZGVyMy50eXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCFVc2VyUG9wb3V0Q29tcG9uZW50KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclBvcG91dENvbXBvbmVudCBjb21wb25lbnQuYClcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICBjb25zdCBhY3Rpdml0eSA9IChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgICAgIH0pLmNhbGwoe1xyXG4gICAgICAgICAgICBnYW1lOiBkYXRhXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgUG9wb3V0UHJvcHMgPSBuZXcgVXNlclBvcG91dC5kZWZhdWx0KHt1c2VySWQ6IHVzZXIuaWQsIGd1aWxkSWQ6IG51bGwsIGNoYW5uZWxJZDogbnVsbCwgZGlzYWJsZVVzZXJQcm9maWxlTGluazogdHJ1ZX0pLnJlbmRlcigpLnByb3BzXHJcbiAgICAgICAgY29uc3QgcG9wb3V0ID0gbmV3IFVzZXJQb3BvdXRDb21wb25lbnQoT2JqZWN0LmFzc2lnbih7fSwgUG9wb3V0UHJvcHMsIHtcclxuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5XHJcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgdGhlIHN0b3AgcHJvcGFnYXRpb24gc2hpdC5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSA8ZGl2IHsuLi53aW5kb3cuTGlnaHRjb3JkLkFwaS5fLmV4Y2x1ZGVQcm9wZXJ0aWVzKHBvcG91dC5wcm9wcywgW1wib25DbGlja1wiLCBcIm9uQ29udGV4dE1lbnVcIl0pfSAvPlxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0IGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIHtjb250YWluZXJ9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwcm9maWxlTW9kdWxlc1xyXG5sZXQgVXNlclByb2ZpbGVDb21wb25lbnRcclxubGV0IFByb2ZpbGVQcm9wc1xyXG5sZXQgY29ubmVjdGVkUHJvZmlsZVN0b3JlXHJcbmNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcHJvZmlsZU1vZHVsZXMgfHwgKHByb2ZpbGVNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlVzZXJQcm9maWxlXCIpLFxyXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgVXNlclByb2ZpbGUsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjEgPSBuZXcgVXNlclByb2ZpbGUuZGVmYXVsdCh7XHJcbiAgICAgICAgICAgICAgICB1c2VyOiB1c2VyXHJcbiAgICAgICAgICAgIH0pLnJlbmRlcigpXHJcbiAgICAgICAgICAgIGNvbm5lY3RlZFByb2ZpbGVTdG9yZSA9IHJlbmRlcjEudHlwZVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIyID0gbmV3IHJlbmRlcjEudHlwZShyZW5kZXIxLnByb3BzKS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIzID0gcmVuZGVyMi50eXBlLnJlbmRlcihyZW5kZXIyLnByb3BzLCBudWxsKVxyXG4gICAgICAgICAgICBjb25zdCByZW5kZXI0ID0gbmV3IHJlbmRlcjMudHlwZShyZW5kZXIzLnByb3BzKS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBVc2VyUHJvZmlsZUNvbXBvbmVudCA9IHJlbmRlcjQudHlwZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZighVXNlclByb2ZpbGVDb21wb25lbnQpdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRoZSBVc2VyUHJvZmlsZUNvbXBvbmVudCBjb21wb25lbnQuYClcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICBjb25zdCBhY3Rpdml0eSA9IChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcclxuICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgICAgIH0pLmNhbGwoe1xyXG4gICAgICAgICAgICBnYW1lOiBkYXRhXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgUHJvZmlsZVByb3BzID0gbmV3IGNvbm5lY3RlZFByb2ZpbGVTdG9yZSh7XHJcbiAgICAgICAgICAgIHVzZXI6IHVzZXIsXHJcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7fVxyXG4gICAgICAgIH0pLnJlbmRlcigpLnByb3BzXHJcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IG5ldyBVc2VyUHJvZmlsZUNvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQcm9maWxlUHJvcHMsIHtcclxuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5XHJcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xyXG5cclxuICAgICAgICBwcm9maWxlLnByb3BzLnN0eWxlID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogXCJhdXRvXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYiBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICB7cHJvZmlsZX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4vKlxyXG5sZXQgcG9wb3V0TW9kdWxlXHJcbmNsYXNzIFBvcG91dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIFRPRE86IFByb2JhYmx5IHVzZSBpbnRlcm5hbCBDb21wb25lbnRzIGluc3RlYWQgb2YgbWFraW5nIGl0IGZyb20gc2NyYXRjaC5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZSB8fCAocG9wb3V0TW9kdWxlID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlVc2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wcm8gJiYgZS5pbmxpbmUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBwcm90aXBNb2R1bGUxLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlMVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBsZXQgdXNlciA9IHVzZXJNb2R1bGUxLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5hdmF0YXJVUkxcclxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuXHJcbiAgICAgICAgbGV0IGltYWdlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5sYXJnZVwiXX0ucG5nYH0gY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlVXNlclBvcG91dH0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1VzZXJQb3BvdXQgOiBcIlwifWB9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdfS5wbmdgfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VVc2VyUG9wb3V0fSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighaW1hZ2VzLmxlbmd0aClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c30+XHJcbiAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9KSgpXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXVzZXJQb3BvdXQgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlclBvcG91dH0gcm9sZT1cImRpYWxvZ1wiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlclBsYXlpbmd9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEudmVydGljYWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeUNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEuaGVhZGVyVG9wfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhcldyYXBwZXJOb3JtYWx9IHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2F2YXRhck1vZHVsZTF9IHJvbGU9XCJpbWdcIiBzdHlsZT17e3dpZHRoOiBcIjgwcHhcIiwgaGVpZ2h0OiBcIjgwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA5MiA4MFwiIGNsYXNzPXtgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9e2F2YXRhclVSTH0gYWx0PVwiIFwiIGNsYXNzPXthdmF0YXJNb2R1bGUxLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdHVzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhckhpbnR9IHZpZXdCb3g9XCIwIDAgODAgODBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFySGludElubmVyfT57TWVzc2FnZXMuVklFV19QUk9GSUxFfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyVGV4dH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLmhvcml6b250YWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmhlYWRlclRhZ05vTmlja25hbWV9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2Ake25hbWVUYWdNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZX1gfT57dXNlci51c2VybmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiN7dXNlci5kaXNjcmltaW5hdG9yfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlVc2VyUG9wb3V0fSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5oZWFkZXJUZXh0Tm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9PntNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HfTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5ib2R5Tm9ybWFsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtpbWFnZXMgPyBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1VzZXJQb3BvdXQgOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudE5vSW1hZ2VzVXNlclBvcG91dH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEubmFtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gfSB0aXRsZT17ZGF0YS5uYW1lfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlOYW1lfT57ZGF0YS5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5kZXRhaWxzKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHRpdGxlPXtkYXRhLnRpdGxlfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmRldGFpbHN9PntkYXRhLmRldGFpbHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuc3RhdGUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5zdGF0ZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT17ZGF0YS5zdGF0ZX0+e2RhdGEuc3RhdGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVDb21wb25lbnQgPSB0aW1lc3RhbXBSZW5kZXIoVGltZXN0YW1wLCBNZXNzYWdlcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtyb290TW9kdWxlMS5ib2R5fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyfSAke3Jvb3RNb2R1bGUxLmJvZHlJbm5lcn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYm9keVRpdGxlfT57TWVzc2FnZXMuTk9URX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7bm90ZU1vZHVsZTEubm90ZX0gJHtyb290TW9kdWxlMS5ub3RlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPXtNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSfSBtYXhsZW5ndGg9XCIyNTZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGNsYXNzPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBzdHlsZT17e2hlaWdodDogXCIzNnB4XCJ9fSBkaXNhYmxlZD48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuZm9vdGVyfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5wcm90aXB9ICR7cHJvdGlwTW9kdWxlMS5pbmxpbmV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7cHJvdGlwTW9kdWxlMS5wcm99ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0gc3R5bGU9e3tjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwifX0+e01lc3NhZ2VzLlBJTk5FRF9NRVNTQUdFU19QUk9fVElQfTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2NvbG9yTW9kdWxlMS5jb2xvclN0YW5kYXJkfSAke3NpemVNb2R1bGUxLnNpemUxNH0gJHtwcm90aXBNb2R1bGUxLnRpcH1gfT57TWVzc2FnZXMuQ09OVEVYVF9NRU5VX0hJTlR9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgU3RhdHVzTW9kdWxlc1xyXG5jbGFzcyBTdGF0dXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gU3RhdHVzTW9kdWxlcyB8fCAoU3RhdHVzTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UHJlc2VuY2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBnZXRQcmVzZW5jZSxcclxuICAgICAgICAgICAgcG9pbnRlckV2ZW50c1xyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0UHJlc2VuY2UuZGVmYXVsdC5nZXRQcmVzZW5jZSgpLnN0YXR1c1xyXG4gICAgICAgIGlmKHN0YXR1cyA9PT0gXCJpbnZpc2libGVcIilzdGF0dXMgPSBcIm9mZmxpbmVcIlxyXG4gICAgICAgIHJldHVybiA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB4PVwiNjBcIiB5PVwiNjBcIiBmaWxsPVwiI2ZmZmZmZlwiIG1hc2s9e2B1cmwoI3N2Zy1tYXNrLXN0YXR1cy0ke3N0YXR1c30pYH0gY2xhc3NOYW1lPXtwb2ludGVyRXZlbnRzfT48L3JlY3Q+XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCB0aW1lc3RhbXBDbGFzcyA9IFwiXCJcclxuXHJcbmxldCBQcm9maWxlTW9kdWxlc1xyXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHsgLy8gVE9ETzogUHJvYmFibHkgdXNlIGludGVybmFsIENvbXBvbmVudHMgaW5zdGVhZCBvZiBtYWtpbmcgaXQgZnJvbSBzY3JhdGNoLlxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gUHJvZmlsZU1vZHVsZXMgfHwgKFByb2ZpbGVNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4ICYmIGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ib3QpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hY3Rpdml0eVByb2ZpbGUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tdXRlZCAmJiBlLndyYXBwZXIgJiYgZS5iYXNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJGYWRlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcylbMF0uZGVmYXVsdC5NZXNzYWdlc1xyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHVzZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgbGV0IGF2YXRhclVSTCA9IHVzZXIuYXZhdGFyVVJMXHJcbiAgICAgICAgaWYodXNlci5hdmF0YXIgJiYgdXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwoXCJnaWZcIilcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgYXZhdGFyTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBNZXNzYWdlc1xyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuXHJcbiAgICAgICAgbGV0IGltYWdlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5sYXJnZVwiXX0ucG5nYH0gY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlUHJvZmlsZX0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1Byb2ZpbGUgOiBcIlwifWB9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdfS5wbmdgfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighaW1hZ2VzLmxlbmd0aClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c30+XHJcbiAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9KSgpXHJcblxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiIGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnJvb3R9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS50b3BTZWN0aW9uUGxheWluZ30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5hdmF0YXJ9ICR7YXZhdGFyTW9kdWxlMS53cmFwcGVyfWB9IHJvbGU9XCJpbWdcIiBzdHlsZT17e3dpZHRoOiBcIjgwcHhcIiwgaGVpZ2h0OiBcIjgwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA5MiA4MFwiIGNsYXNzPXtgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9e2F2YXRhclVSTH0gYWx0PVwiIFwiIGNsYXNzPXthdmF0YXJNb2R1bGUxLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdHVzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmhlYWRlckluZm99YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubmFtZVRhZ30gJHtuYW1lVGFnTW9kdWxlMS5uYW1lVGFnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YCR7cm9vdE1vZHVsZTEudXNlcm5hbWV9ICR7cm9vdE1vZHVsZTEudXNlcm5hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17cm9vdE1vZHVsZTEuZGlzY3JpbWluYXRvcn0+I3t1c2VyLmRpc2NyaW1pbmF0b3J9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VzfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyRmlsbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlQcm9maWxlfSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmhlYWRlclRleHROb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtpbWFnZXMgPyBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1Byb2ZpbGUgOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudE5vSW1hZ2VzVXNlclBvcG91dH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gfSB0aXRsZT17ZGF0YS5uYW1lfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eU5hbWV9PntkYXRhLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHRpdGxlPXtkYXRhLnRpdGxlfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmRldGFpbHN9PntkYXRhLmRldGFpbHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuc3RhdGUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnN0YXRlfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZUNvbXBvbmVudCA9IHRpbWVzdGFtcFJlbmRlcihUaW1lc3RhbXAsIE1lc3NhZ2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYm9keX0+XHJcblx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG5cdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyfT5cclxuXHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuXHRcdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb25IZWFkZXJ9PntNZXNzYWdlcy5OT1RFfTwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLm5vdGV9ICR7bm90ZU1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBzdHlsZT17e2hlaWdodDogXCI0MHB4XCJ9fSBkaXNhYmxlZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29ubmVjdGVkQWNjb3VudHMgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb25uZWN0ZWRBY2NvdW50cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgYWNjb3VudHMgPSBbXVxyXG4gICAgICAgIGxldCByb290TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcbiAgICAgICAgbGV0IEFjY291bnRNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0QWNjb3VudHMpWzBdLmRlZmF1bHRcclxuXHJcbiAgICAgICAgbGV0IGFjY3MgPSBBY2NvdW50TW9kdWxlMS5nZXRBY2NvdW50cygpLmZpbHRlcihlID0+IGUudmlzaWJpbGl0eSA9PT0gMSlcclxuICAgICAgICBmb3IobGV0IGFjYyBvZiBhY2NzKXtcclxuICAgICAgICAgICAgYWNjb3VudHMucHVzaCg8Q29ubmVjdGVkQWNjb3VudCBhY2M9e2FjY30gLz4pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihhY2NvdW50cy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb259PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudHN9PlxyXG4gICAgICAgICAgICAgICAgICAgIHthY2NvdW50c31cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbm5lY3RlZEFjY291bnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgZmxvd2VyTW9kdWxlMSxcclxuICAgICAgICAgICAgYW5jaG9yTW9kdWxlMSxcclxuICAgICAgICAgICAgU29jaWFsQ29uc3RhbnRzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYW5jaG9yKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0ICYmIGUuZGVmYXVsdC5tYXApWzBdLmRlZmF1bHRcclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGFjYyA9IHRoaXMucHJvcHMuYWNjXHJcbiAgICAgICAgbGV0IGNvbnN0YW50c1NvY2lhbCA9IFNvY2lhbENvbnN0YW50cy5nZXQoYWNjLnR5cGUpXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke2ZsZXhNb2R1bGUxLmhvcml6b250YWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50fWB9IHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgIDxpbWcgYWx0PXtgTG9nbyAke2NvbnN0YW50c1NvY2lhbC5uYW1lfWB9IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50SWNvbn0gc3JjPXtjb25zdGFudHNTb2NpYWwuaWNvbi5jb2xvciB8fCBjb25zdGFudHNTb2NpYWwuaWNvbi53aGl0ZSB8fCBjb25zdGFudHNTb2NpYWwuaWNvbi5ncmV5fSAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50TmFtZUlubmVyfT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lfT57YWNjLm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7YWNjLnZlcmlmaWVkID8gKDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2Zsb3dlck1vZHVsZTEuZmxvd2VyU3RhckNvbnRhaW5lcn0gJHtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50VmVyaWZpZWRJY29ufWB9IHN0eWxlPXt7d2lkdGg6IFwiMTZweFwiLCBoZWlnaHQ6IFwiMTZweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9e2Zsb3dlck1vZHVsZTEuZmxvd2VyU3Rhcn0gd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNS4yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiIzRmNTQ1Y1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Zsb3dlck1vZHVsZTEuY2hpbGRDb250YWluZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE1LjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIiBmaWxsPVwiI2ZmZmZmZlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj4pIDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPXtgJHthbmNob3JNb2R1bGUxLmFuY2hvcn0gJHthbmNob3JNb2R1bGUxLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YH0gcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRPcGVuSWNvbn0gd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTEwIDVWM0g1LjM3NUM0LjA2NTE5IDMgMyA0LjA2NTE5IDMgNS4zNzVWMTguNjI1QzMgMTkuOTM2IDQuMDY1MTkgMjEgNS4zNzUgMjFIMTguNjI1QzE5LjkzNiAyMSAyMSAxOS45MzYgMjEgMTguNjI1VjE0SDE5VjE5SDVWNUgxMFpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMjEgMi45OTkwMkgxNFY0Ljk5OTAySDE3LjU4Nkw5LjI5Mjk3IDEzLjI5MkwxMC43MDcgMTQuNzA2TDE5IDYuNDEzMDJWOS45OTkwMkgyMVYyLjk5OTAyWlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBCYWRnZXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHVzZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG4gICAgICAgIGxldCBVc2VyRmxhZ3MgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5Vc2VyRmxhZ3MpWzBdLlVzZXJGbGFnc1xyXG4gICAgICAgIGxldCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gW11cclxuXHJcbiAgICAgICAgZm9yKGxldCBmbGFnTmFtZSBpbiBVc2VyRmxhZ3Mpe1xyXG4gICAgICAgICAgICBpZih1c2VyLmhhc0ZsYWcoVXNlckZsYWdzW2ZsYWdOYW1lXSkpc2VyaWFsaXplZC5wdXNoKGZsYWdOYW1lKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yKGxldCBmbGFnTmFtZSBvZiBzZXJpYWxpemVkKXtcclxuICAgICAgICAgICAgbGV0IHNlYXJjaGFibGUgPSBgcHJvZmlsZUJhZGdlJHtmbGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCIgXCIpLnNwbGl0KFwiIFwiKS5tYXAoZSA9PiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSkuam9pbihcIlwiKX1gXHJcbiAgICAgICAgICAgIHNlYXJjaGFibGUgPSBzZWFyY2hhYmxlLnJlcGxhY2UoXCJIeXBlc3F1YWRPbmxpbmVcIiwgXCJIeXBlU3F1YWRPbmxpbmVcIilcclxuICAgICAgICAgICAgaWYoIXJvb3RNb2R1bGVbc2VhcmNoYWJsZV0pY29udGludWVcclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goPEJhZGdlIG5hbWU9e3NlYXJjaGFibGV9Lz4pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pe1xyXG4gICAgICAgICAgICBiYWRnZXMucHVzaCg8QmFkZ2UgbmFtZT1cInByb2ZpbGVCYWRnZVByZW1pdW1cIiAvPilcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm9vdE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZVdyYXBwZXJ9PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2V9ICR7cm9vdE1vZHVsZTFbdGhpcy5wcm9wcy5uYW1lXX1gfT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUaW1lc3RhbXAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aW1lc3RhbXBDbGFzc30+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn0qLyIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uLy4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19MYXllciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMua2V5dXBMaXN0ZW5lciA9IHRoaXMua2V5dXBMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGtleXVwTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAyNykge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5yZWZzLnJvb3QucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5rZXl1cExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhpc05vZGUgPSBET00ucXVlcnkoYCMke3RoaXMucHJvcHMuaWR9YCk7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxLjEgLSAwLjEgKiBwcm9ncmVzc30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqICgxIC0gcHJvZ3Jlc3MpfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSAxIC0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiLnB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5yZW1vdmUoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiBwcm9ncmVzcyArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsYXllciA9IERPTS5xdWVyeShcIltjbGFzcyo9XFxcImxheWVyLVxcXCJdXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5hZGQoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiAoMSAtIHByb2dyZXNzKSArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImxheWVyIGJkLWxheWVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyICYmIGUuYW5pbWF0aW5nKVswXS5sYXllciwgaWQ6IHRoaXMucHJvcHMuaWQsIHJlZjogXCJyb290XCIsIHN0eWxlOiB7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiBcInNjYWxlKDEuMSkgdHJhbnNsYXRlWigwcHgpXCJ9fSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuLi90b29sc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuLi90YWJCYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IFRhYkJhckhlYWRlciBmcm9tIFwiLi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuLi90YWJCYXJJdGVtXCI7XHJcblxyXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XHJcbmltcG9ydCBTaWRlYmFyVmlldyBmcm9tIFwiLi9zaWRlYmFyVmlld1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1B1YmxpY1NlcnZlcnMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeSA9IHRoaXMuY2hhbmdlQ2F0ZWdvcnkuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24gPSB0aGlzLmNoZWNrQ29ubmVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuam9pbiA9IHRoaXMuam9pbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLkd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0R3VpbGRzXCJdKTtcclxuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xyXG4gICAgICAgIHRoaXMuSW52aXRlQWN0aW9ucyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO1xyXG4gICAgICAgIHRoaXMuU29ydGVkR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRTb3J0ZWRHdWlsZHNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZXJ2ZXJzOiBbXSxcclxuICAgICAgICAgICAgbmV4dDogbnVsbCxcclxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhdGU6IDAsXHJcbiAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnByb3BzLnJvb3RJZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChxdWVyeSwgY2xlYXIpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBmZXRjaChgJHtzZWxmLmVuZFBvaW50fSR7cXVlcnl9JHtxdWVyeSA/IFwiJnNjaGVtYT1uZXdcIiA6IFwiP3NjaGVtYT1uZXdcIn1gLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IGF3YWl0IHJlcy50ZXh0KClcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgc2VydmVycyA9IGRhdGEucmVzdWx0cy5yZWR1Y2UoKGFyciwgc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgLy8gYXJyLnB1c2goPFNlcnZlckNhcmQgc2VydmVyPXtzZXJ2ZXJ9IGpvaW49e3NlbGYuam9pbn0vPik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xyXG4gICAgICAgICAgICBkYXRhLm5leHQgPSBgP2Zyb209JHtlbmR9YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgZGF0YS5uZXh0ICs9IGAmdGVybT0ke3NlbGYuc3RhdGUudGVybX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKGVuZCA+PSBkYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSB0aXRsZSArPSBgIGZvciAke3NlbGYuc3RhdGUudGVybX1gO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXHJcbiAgICAgICAgICAgICAgICBuZXh0OiBkYXRhLm5leHRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlZnMuc2J2LnJlZnMuY29udGVudFNjcm9sbGVyLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkZhaWxlZCB0byBsb2FkIHNlcnZlcnMuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHNcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGpvaW4oc2VydmVyQ2FyZCkge1xyXG4gICAgICAgIGlmIChzZXJ2ZXJDYXJkLnByb3BzLnBpbm5lZCkgcmV0dXJuIHRoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGUoc2VydmVyQ2FyZC5wcm9wcy5pbnZpdGVfY29kZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMuam9pbkVuZFBvaW50fS8ke3NlcnZlckNhcmQucHJvcHMuc2VydmVyLmlkZW50aWZpZXJ9YCx7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZlckNhcmQuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGYud2luZG93T3B0aW9ucztcclxuICAgICAgICBvcHRpb25zLnggPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5YICsgd2luZG93LmlubmVyV2lkdGggLyAyIC0gb3B0aW9ucy53aWR0aCAvIDIpO1xyXG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93ID0gbmV3ICh3aW5kb3cucmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5Ccm93c2VyV2luZG93KShvcHRpb25zKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LndlYkNvbnRlbnRzLm9uKFwiZGlkLW5hdmlnYXRlXCIsIChldmVudCwgdXJsKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBzZWxmLmpvaW5XaW5kb3cuY2xvc2UoKTtcclxuICAgICAgICAgICAgc2VsZi5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cubG9hZFVSTCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3aW5kb3dPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogNTUwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxyXG4gICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgYWx3YXlzT25Ub3A6IHRydWUsXHJcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZSxcclxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgd2ViUHJlZmVyZW5jZXM6IHtcclxuICAgICAgICAgICAgICAgIG5vZGVJbnRlZ3JhdGlvbjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJkU2VydmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCI3NTAwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjIwMDAwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIEJldHRlckRpc2NvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvODYwMDQ3NDQ5NjY5MTQwNDgvMjkyZTdmNmJmZmYyYjcxZGZkMTNlNTA4YTg1OWFlZGQud2VicFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjMwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjUwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIExpZ2h0Y29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2F2YXRhcnMzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY1NjkwMDU4P3M9MjAwJnY9NFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vai5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdEVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vam9pbi5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrQ29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9gLHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGViYXJWaWV3LCB7cmVmOiBcInNidlwifSwgdGhpcy5jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2lkZWJhcjoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLnNpZGViYXJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbnRlbnRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdG9vbHM6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInB0XCIsIHJlZjogXCJ0b29sc1wiLCBvbkNsaWNrOiB0aGlzLmNsb3NlfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZGViYXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyXCIsIGtleTogXCJwc1wifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhciBTSURFXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiLCBzdHlsZToge2ZvbnRTaXplOiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIFwiUHVibGljIFNlcnZlcnNcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckhlYWRlciwge3RleHQ6IFwiQ2F0ZWdvcmllc1wifSksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySXRlbSwge2lkOiBpbmRleCwgb25DbGljazogdGhpcy5jaGFuZ2VDYXRlZ29yeSwga2V5OiBpbmRleCwgdGV4dDogdmFsdWUsIHNlbGVjdGVkOiB0aGlzLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgPT09IGluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb290ZXIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlYXJjaElucHV0KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge3JlZjogXCJzZWFyY2hpbnB1dFwiLCBvbktleURvd246IHRoaXMuc2VhcmNoS2V5RG93biwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcInRleHRcIiwgY2xhc3NOYW1lOiBcImlucHV0IGRlZmF1bHRcIiwgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIG1heExlbmd0aDogXCI1MFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoS2V5RG93bihlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZyB8fCBlLndoaWNoICE9PSAxMykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYD90ZXJtPSR7ZS50YXJnZXQudmFsdWV9YDtcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKHF1ZXJ5LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2F0ZWdvcnlCdXR0b25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXCJBbGxcIiwgXCJGUFMgR2FtZXNcIiwgXCJNTU8gR2FtZXNcIiwgXCJTdHJhdGVneSBHYW1lc1wiLCBcIk1PQkEgR2FtZXNcIiwgXCJSUEcgR2FtZXNcIiwgXCJUYWJsZXRvcCBHYW1lc1wiLCBcIlNhbmRib3ggR2FtZXNcIiwgXCJTaW11bGF0aW9uIEdhbWVzXCIsIFwiTXVzaWNcIiwgXCJDb21tdW5pdHlcIiwgXCJMYW5ndWFnZVwiLCBcIlByb2dyYW1taW5nXCIsIFwiT3RoZXJcIl07XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ2F0ZWdvcnkoaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5yZWZzLnNlYXJjaGlucHV0LnZhbHVlID0gXCJcIjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChgP2NhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbaWRdfWAsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIHNlbGYubm90Q29ubmVjdGVkO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge3JlZjogXCJjb250ZW50XCIsIGtleTogXCJwY1wiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxyXG4gICAgICAgICAgICBzZWxmLmJkU2VydmVyLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubWFwKChzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLm5leHQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtzZWxmLnNldFN0YXRlKHtsb2FkaW5nOiB0cnVlfSk7IHNlbGYuc2VhcmNoKHNlbGYuc3RhdGUubmV4dCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUubG9hZGluZyA/IFwiTG9hZGluZ1wiIDogXCJMb2FkIE1vcmVcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubGVuZ3RoID4gMCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KVxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RDb25uZWN0ZWQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwibmNjXCIsIHJlZjogXCJjb250ZW50XCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogc2VsZi5jb25uZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBcIjE4cHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiMTBweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYVwiLFxyXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgIFwiRGlzY29yZHNlcnZlcnMuY29tXCJcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gMikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIFwiQ29ubmVjdGVkIGFzOiBcIixcclxuICAgICAgICAgICAgICAgIGAke2Nvbm5lY3Rpb24udXNlci51c2VybmFtZX0jJHtjb25uZWN0aW9uLnVzZXIuZGlzY3JpbWluYXRvcn1gXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJSZWNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbn1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VydmVyQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsKSB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBpbWFnZUVycm9yOiBmYWxzZSxcclxuICAgICAgICAgICAgam9pbmVkOiB0aGlzLnByb3BzLmd1aWxkTGlzdC5pbmNsdWRlcyh0aGlzLnByb3BzLnNlcnZlci5pZGVudGlmaWVyKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzZXJ2ZXJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBsZXQgY2FyZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNhcmQgJiYgZS5jYXJkUHJpbWFyeSlbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXhDaGlsZCAmJiBlLl9ob3Jpem9udGFsUmV2ZXJzZSlbMF1cclxuICAgICAgICBsZXQgd3JhcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vV3JhcCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsIC8vIGNhcmRQcmltYXJ5LTFIdi10b1xyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgJHtjYXJkTW9kdWxlLmNhcmR9ICR7Y2FyZE1vZHVsZS5jYXJkUHJpbWFyeX0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fSBiZC1zZXJ2ZXItY2FyZCR7c2VydmVyLnBpbm5lZCA/IFwiIGJkLXNlcnZlci1jYXJkLXBpbm5lZFwiIDogXCJcIn1gfSxcclxuICAgICAgICAgICAgLy8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgLy8gXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIC8vIHsgY2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGZsZXgtMU8xR0tZIGRpcmVjdGlvblJvdy0zdjN0ZkcganVzdGlmeVN0YXJ0LTJ5SVpvMCBhbGlnblN0cmV0Y2gtMWh3eE1hIG5vV3JhcC0zanludjZcIiB9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtyZWY6IFwiaW1nXCIsIGNsYXNzTmFtZTogXCJiZC1zZXJ2ZXItaW1hZ2VcIiwgc3JjOiBzZXJ2ZXIuaWNvblVybCwgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpLCBkcmFnZ2FibGU6IGZhbHNlfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmZsZXhDaGlsZCtcIiBiZC1zZXJ2ZXItY29udGVudFwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcCtcIiBiZC1zZXJ2ZXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbmFtZVwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1tZW1iZXItY291bnRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubWVtYmVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIE1lbWJlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eSBiZC1zZXJ2ZXItZGVzY3JpcHRpb24tY29udGFpbmVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgc2Nyb2xsZXIgYmQtc2VydmVyLWRlc2NyaXB0aW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGRpcmVjdGlvblJvdy0zdjN0Zkcgbm9XcmFwLTNqeW52NiBiZC1zZXJ2ZXItZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4Q2hpbGQtZmFvVlczIGJkLXNlcnZlci10YWdzXCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2F0ZWdvcmllcy5qb2luKFwiLCBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBjb2xvckdyZWVuLTI5aUFLWVwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiMzYWMxNWNcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZXJyb3IgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBkaXNhYmxlZC05YUYydWdcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjYzEzYTNhXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VydmVyLmVycm9yICYmICF0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwifSwgb25DbGljazogKCkgPT4ge3RoaXMuam9pbigpO319LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLy8gKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGpvaW4oKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5qb2luKHRoaXMpO1xyXG4gICAgICAgIC8vdGhpcy5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi9zY3JvbGxlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NpZGViYXJWaWV3IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzaWRlYmFyLCBjb250ZW50LCB0b29sc30gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2kgdWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyUmVnaW9uLVZGVFVrTiBzaWRlYmFyLXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwge2tleTogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgcmVmOiBcInNpZGViYXJTY3JvbGxlclwiLCBzaWRlYmFyOiB0cnVlLCBmYWRlOiBzaWRlYmFyLmZhZGUgfHwgdHJ1ZSwgZGFyazogc2lkZWJhci5kYXJrIHx8IHRydWV9LCBzaWRlYmFyLmNvbXBvbmVudClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFJlZ2lvbi0zbkR1WXkgY29udGVudC1yZWdpb25cIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50VHJhbnNpdGlvbldyYXAtM2hxT0VXIGNvbnRlbnQtdHJhbnNpdGlvbi13cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2QgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAtM1laWGRtIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3QtMjhNU24wIHNjcm9sbGVyVHJhY2stMVpJcHN2XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlci0yNm5jMWUgY29udGVudC1yZWdpb24tc2Nyb2xsZXIgc2Nyb2xsZXJcIiwgcmVmOiBcImNvbnRlbnRTY3JvbGxlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRDb2x1bW4tMmhySVlIIGNvbnRlbnRDb2x1bW5EZWZhdWx0LTFWUWtHTSBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LCBjb250ZW50LmNvbXBvbmVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29scy5jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1JlbG9hZEljb24gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcclxuICAgICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxyXG4gICAgICAgICAgICAgICAgZmlsbDogXCIjZGNkZGRlXCIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtcmVsb2FkIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge3dpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCIsIGhlaWdodDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwifVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXpcIn0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOiBcIm5vbmVcIiwgZDogXCJNMCAwaDI0djI0SDB6XCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Njcm9sbGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vc2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5XHJcbiAgICAgICAgbGV0IHNjcm9sbGVyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVySG9yaXpvbnRhbClbMF1cclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhclJlZ2lvblNjcm9sbGVyKVswXVxyXG4gICAgICAgIGxldCB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSR7dGhpcy5wcm9wcy5mYWRlID8gXCIgXCIrc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZSA6IFwiXCJ9YDtcclxuICAgICAgICBsZXQgc2Nyb2xsZXJDbGFzcyA9IHNjcm9sbGVyTW9kdWxlMS5zY3JvbGxlcitcIiBzY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1Y2sgKi9cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaWRlYmFyKSBzY3JvbGxlckNsYXNzICs9IGAgJHtzY3JvbGxlck1vZHVsZTIuc2lkZWJhclJlZ2lvblNjcm9sbGVyfSBzaWRlYmFyLXJlZ2lvbi1zY3JvbGxlcmBcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5jb250ZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyQ2xhc3MgKz0gXCIgXCIrc2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcitcIiBjb250ZW50LXJlZ2lvbi1zY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMi5jb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwfSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlci13cmFwICAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUcmFja31gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7Y2hpbGRyZW59ID0gdGhpcy5wcm9wcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyd3JhcFwiLCBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc30sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyXCIsIHJlZjogXCJzY3JvbGxlclwiLCBjbGFzc05hbWU6IHNjcm9sbGVyQ2xhc3N9LFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1Njcm9sbGVyLnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfU2Nyb2xsZXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlY3Rpb25zLm1hcCgoc2VjdGlvbiwgaSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgaSAhPT0gMCA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChNYXJnaW5Ub3AsIHt9KSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NHcm91cCwgT2JqZWN0LmFzc2lnbih7fSwgc2VjdGlvbiwge29uQ2hhbmdlOiB0aGlzLnByb3BzLm9uQ2hhbmdlfSkpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vc3dpdGNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGl0bGUsIHNldHRpbmdzLCBidXR0b259ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBidXR0b25Db21wb25lbnQgPSBidXR0b24gPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge2tleTogXCJ0aXRsZS1idXR0b25cIiwgY2xhc3NOYW1lOiBcImJkLXBmYnRuXCIsIG9uQ2xpY2s6IGJ1dHRvbi5vbkNsaWNrfSwgYnV0dG9uLnRpdGxlKSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHRpdGxlfSksXHJcbiAgICAgICAgICAgICAgICBidXR0b25Db21wb25lbnQsXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXSwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgICAgICAgICB9KV07XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzVGl0bGUgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XHJcblxyXG5sZXQgY2xhc3NuYW1lcyA9IFtdXHJcbmZ1bmN0aW9uIGdldENsYXNzTmFtZShuYW1lKXtcclxuICAgIGxldCBjbGFzc05hbWUgPSBjbGFzc25hbWVzLmZpbmQoZSA9PiBlLnN0YXJ0c1dpdGgobmFtZStcIi1cIikpXHJcbiAgICBpZihjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxyXG4gICAgY2xhc3NOYW1lID0gQkRNb2R1bGVzLmdldChlID0+IGUubmFtZSlbMF1cclxuICAgIGNsYXNzbmFtZXMucHVzaChjbGFzc05hbWUpXHJcbiAgICByZXR1cm4gY2xhc3NOYW1lXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQge3RleHQsIGluZm99ID0gdGhpcy5wcm9wcy5kYXRhO1xyXG4gICAgICAgIGlmKCFjbGFzc25hbWVzLmZpbmQoZSA9PiBlLnN0YXJ0c1dpdGgoXCJiZXRhLVwiKSkpe1xyXG4gICAgICAgICAgICBjbGFzc25hbWVzLnB1c2goQkRNb2R1bGVzLmdldChlID0+IGUuYmV0YSAmJiAoIWUuY29udGFpbmVyICYmICFlLnVzZXJTZXR0aW5nc1ZvaWNlKSlbMF0uYmV0YSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5wcm9wcy5kYXRhLmV4cGVyaW1lbnRhbCl7XHJcbiAgICAgICAgICAgIGluZm8gPSBbXHJcbiAgICAgICAgICAgICAgICBpbmZvLFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInN1cFwiLCB7Y2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoXCJiZXRhXCIpfSwgXCIoRVhQRVJJTUVOVEFMKVwiKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtdmVydGljYWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcCB1aS1zd2l0Y2gtaXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIn0sIHRleHQpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge29uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRleHQgc3R5bGUtZGVzY3JpcHRpb24gbWFyZ2luLXRvcC00XCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sIGluZm8pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySGVhZGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sIHRoaXMucHJvcHMudGV4dCwgdGhpcy5wcm9wcy5idXR0b24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgdWktdGFiLWJhci1pdGVtJHt0aGlzLnByb3BzLnNlbGVjdGVkID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKHRoaXMucHJvcHMuaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xyXG4gICAgfVxyXG59IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCJcclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0XHJcblxyXG5jb25zdCBpbnRlcnZhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5JbnRlcnZhbClbMF1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wb25lbnQsIE1lc3NhZ2VzKSB7XHJcbiAgICBjbGFzcyBUaW1lUmVuZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBuZXcgaW50ZXJ2YWxNb2R1bGUxLkludGVydmFsKClcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRNb3VudCgpe1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsLnN0YXJ0KDFlMywgKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0U3RhdGUoc2VsZi5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsLnN0b3AoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50RGlkVXBkYXRlKGFjdGl2aXR5KXtcclxuICAgICAgICAgICAgaWYoYWN0aXZpdHkudGltZXN0YW1wcy5lbmQgPT09IHRoaXMucHJvcHMudGltZXN0YW1wcy5lbmQgJiYgYWN0aXZpdHkudGltZXN0YW1wcy5zdGFydCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLnN0YXJ0KXJldHVyblxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldFVwZGF0ZWRUaW1lKCl7XHJcbiAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5wcm9wcy50aW1lc3RhbXBzXHJcbiAgICAgICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpIC8gMWUzO1xyXG4gICAgICAgICAgICBpZihudWxsICE9IHRpbWVzdGFtcHMuZW5kKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYobm93LCBjaGVja1VuaXgodGltZXN0YW1wcy5lbmQpIC8gMWUzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5zdGFydCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREaWZmKGNoZWNrVW5peCh0aW1lc3RhbXBzLnN0YXJ0KSAvIDFlMywgbm93KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogMCxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IDAsXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzOiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlclRpbWUobnVtYmVyLCByZW1vdmVaZXJvKXtcclxuICAgICAgICAgICAgaWYocmVtb3ZlWmVybyA9PT0gdW5kZWZpbmVkKXJlbW92ZVplcm8gPSBmYWxzZVxyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvICYmIG51bWJlciA8PSAwKXJldHVybiAtMVxyXG4gICAgICAgICAgICBpZihudW1iZXIgPCAxMClyZXR1cm4gXCIwXCIrbnVtYmVyXHJcbiAgICAgICAgICAgIHJldHVybiBudW1iZXJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldERpZmYodGltZXN0YW1wLCBub3cpe1xyXG4gICAgICAgICAgICBsZXQgaG91cnMgPSBNYXRoLm1heChub3cgLSB0aW1lc3RhbXAsIDApXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gTWF0aC5mbG9vcihob3VycykgJSA2MFxyXG4gICAgICAgICAgICBsZXQgbWludXRlcyA9IE1hdGguZmxvb3IoaG91cnMgLyA2MCkgJSA2MFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IE1hdGguZmxvb3IoaG91cnMgLyAzNjAwKSAlIDI0LFxyXG4gICAgICAgICAgICAgICAgbWludXRlcyxcclxuICAgICAgICAgICAgICAgIHNlY29uZHNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IHRoaXMucHJvcHNcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSBwcm9wcy50aW1lc3RhbXBzXHJcblxyXG4gICAgICAgICAgICBsZXQgdXNlZFByb3BzID0gZnVuY3Rpb24ocHJvcHMsIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wcykgcmV0dXJuIHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0ge31cclxuICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV1cclxuICAgICAgICAgICAgICAgICAgICBpZighaXRlbXMuaW5kZXhPZihrZXkpID49IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzW2tleV0gPSBwcm9wc1trZXldXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzXHJcbiAgICAgICAgICAgIH0ocHJvcHMsIFtcInRpbWVzdGFtcHNcIl0pXHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlXHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IHN0YXRlLmhvdXJzXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gc3RhdGUubWludXRlc1xyXG4gICAgICAgICAgICBsZXQgc2Vjb25kcyA9IHN0YXRlLnNlY29uZHNcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogdGhpcy5yZW5kZXJUaW1lKGhvdXJzLCAhMCksXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzOiB0aGlzLnJlbmRlclRpbWUobWludXRlcyksXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzOiB0aGlzLnJlbmRlclRpbWUoc2Vjb25kcylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYodGltZXN0YW1wcy5lbmQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9FTkQuZm9ybWF0KGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLnN0YXJ0ICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdXNlZFByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQuZm9ybWF0KGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBUaW1lUmVuZGVyXHJcbn07XHJcblxyXG5mdW5jdGlvbiBjaGVja1VuaXgoZSkge1xyXG4gICAgcmV0dXJuIChcIlwiICsgZSkubGVuZ3RoIDwgMTMgPyAxZTMgKiBlIDogZVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Ub29scyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgdG9vbHNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b29sc0NvbnRhaW5lcilbMF1cclxuICAgICAgICBsZXQgY29udGFpbmVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGFpbmVyICYmIGUuY2xvc2VCdXR0b24gJiYgZS5jbG9zZUJ1dHRvbkJvbGQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzLWNvbnRhaW5lciBcIit0b29sc01vZHVsZS50b29sc0NvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzIFwiK3Rvb2xzTW9kdWxlLnRvb2xzfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjb250YWluZXJNb2R1bGUuY29udGFpbmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4tY2xvc2UgXCIrY29udGFpbmVyTW9kdWxlLmNsb3NlQnV0dG9uLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJlc2MtdGV4dCBcIitjb250YWluZXJNb2R1bGUua2V5YmluZH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRVNDXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNsb3NlQnV0dG9uICYmIGUua2V5YmluZEJvbGQpWzBdLmNsb3NlQnV0dG9uLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSBjbG9zZUJ1dHRvbi5jbGljaygpO1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuICogV2lsbCBhbHNvIHJlbW92ZSB0aGVtc2VsdmVzIGlmIHRoZSBub2RlIHRvIHdhdGNoIGlzIHJlbW92ZWQgZnJvbSBET00gdGhyb3VnaFxyXG4gKiBhIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhpcyBpcyBub3QgdXNpbmcgRGlzY29yZCdzIGludGVybmFscyBidXQgbm9ybWFsIERPTSBtYW5pcHVsYXRpb24gYW5kIGVtdWxhdGVzXHJcbiAqIERpc2NvcmQncyBvd24gdG9vbHRpcHMgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cclxuICpcclxuICogQG1vZHVsZSBFbXVsYXRlZFRvb2x0aXBcclxuICogQHZlcnNpb24gMC4wLjFcclxuICovXHJcblxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcblxyXG4vLzxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGlzYWJsZWRQb2ludGVyRXZlbnRzLTFwdGdUQlwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAyMzdweDsgYm90dG9tOiA1MXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcERpc2FibGVQb2ludGVyRXZlbnRzLTNlYUJHTlwiIHN0eWxlPVwib3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lO1wiPlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLXCI+PC9kaXY+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwQ29udGVudC1icVZMV0tcIj5Vc2VyIFNldHRpbmdzPC9kaXY+XHJcbi8vXHQ8L2Rpdj5cclxuLy88L2Rpdj5cclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZY1wiIHN0eWxlPVwidG9wOiA4NjBweDsgbGVmdDogNjMyLjVweDtcIj5cclxuLy9cdDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyB0b29sdGlwQmxhY2stUFBHNDd6IHRvb2x0aXBUb3AtWEREU3h4XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0Q2hhbmdlbG9nXHJcbi8vXHQ8L2Rpdj5cclxuLy88L2Rpdj5cclxubGV0IFRvb2x0aXBDbGFzc2VzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XHJcblx0aWYoVG9vbHRpcENsYXNzZXMpcmV0dXJuIFRvb2x0aXBDbGFzc2VzXHJcblx0cmV0dXJuIFRvb2x0aXBDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ0b29sdGlwXCIsIFwidG9vbHRpcEJsYWNrXCIpO1xyXG59XHJcbmxldCBUb29sdGlwTGF5ZXJzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBMYXllcnMoKXtcclxuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXHJcblx0cmV0dXJuIFRvb2x0aXBMYXllcnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImxheWVyXCIsIFwibGF5ZXJDb250YWluZXJcIik7XHJcbn1cclxuXHJcbmNvbnN0IGdldENsYXNzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIGNvbnN0IHVwcGVyQ2FzZSA9IHNpZGVPckNvbG9yWzBdLnRvVXBwZXJDYXNlKCkgKyBzaWRlT3JDb2xvci5zbGljZSgxKTtcclxuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcclxuICAgIGlmICh0b29sdGlwQ2xhc3MpIHJldHVybiB0b29sdGlwQ2xhc3M7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGNsYXNzRXhpc3RzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XHJcbn07XHJcblxyXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbn07XHJcblxyXG4vKiA8ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljIGRhLWxheWVyXCIgc3R5bGU9XCJsZWZ0OiAyMzQuNXB4OyBib3R0b206IDUxcHg7XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgZGEtdG9vbHRpcCB0b29sdGlwVG9wLVhERFN4eCB0b29sdGlwQmxhY2stUFBHNDd6XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlySyBkYS10b29sdGlwUG9pbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIFVzZXIgU2V0dGluZ3NcclxuICAgIDwvZGl2PlxyXG48L2Rpdj4gKi9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtdWxhdGVkVG9vbHRpcCB7XHJcblx0LyoqXHJcblx0ICpcclxuXHQgKiBAY29uc3RydWN0b3JcclxuXHQgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxqUXVlcnkpfSBub2RlIC0gRE9NIG5vZGUgdG8gbW9uaXRvciBhbmQgc2hvdyB0aGUgdG9vbHRpcCBvblxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aXAgLSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9vbHRpcFxyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdG9vbHRpcFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1ibGFja10gLSBjb3JyZWxhdGVzIHRvIHRoZSBkaXNjb3JkIHN0eWxpbmcvY29sb3JzIChibGFjaywgYnJhbmQsIGdyZWVuLCBncmV5LCByZWQsIHllbGxvdylcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2lkZT10b3BdIC0gY2FuIGJlIGFueSBvZiB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnByZXZlbnRGbGlwPWZhbHNlXSAtIHByZXZlbnRzIG1vdmluZyB0aGUgdG9vbHRpcCB0byB0aGUgb3Bwb3NpdGUgc2lkZSBpZiBpdCBpcyB0b28gYmlnIG9yIGdvZXMgb2Zmc2NyZWVuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIGZyb20gc2hvd2luZyBvbiBob3ZlclxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKG5vZGUsIHRleHQsIG9wdGlvbnMgPSB7fSkge1xyXG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZX0gPSBvcHRpb25zO1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgICAgIHRoaXMubGFiZWwgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5zaWRlID0gc2lkZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEZsaXAgPSBwcmV2ZW50RmxpcDtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmICghY2xhc3NFeGlzdHModGhpcy5zaWRlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU2lkZSAke3RoaXMuc2lkZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblxyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxyXG5cclxuXHRcdGNvbnN0IHBvaW50ZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQocG9pbnRlckVsZW1lbnQpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLnRvb2x0aXBFbGVtZW50KTtcclxuXHJcblx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuXHJcblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG5cdFx0XHRcdG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcblx0XHRcdFx0XHRjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2YodGhpcy5ub2RlKSA+IC0xO1xyXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnModGhpcy5ub2RlKSk7XHJcblx0XHRcdFx0XHRpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdFx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0fSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbnRhaW5lciB3aGVyZSB0aGUgdG9vbHRpcCB3aWxsIGJlIGFwcGVuZGVkLiAqL1xyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cy5zcGxpdChcIiBcIilbMF0rXCIgfiAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXSk7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYWJvdmUgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGJlbG93IHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0JlbG93KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IFV0aWxzLnNjcmVlbkhlaWdodDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dMZWZ0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgcmlnaHQgb2YgdGhlIGVsZW1lbnQgKi9cclxuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cclxuXHJcbiAgICAvKiogSGlkZXMgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlbGVhdmUuICovXHJcblx0aGlkZSgpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XHJcblx0fVxyXG5cclxuICAgIC8qKiBTaG93cyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VlbnRlci4gV2lsbCBhdHRlbXB0IHRvIGZsaXAgaWYgcG9zaXRpb24gd2FzIHdyb25nLiAqL1xyXG5cdHNob3coKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5sYWJlbDtcclxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJ0b3BcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJib3R0b21cIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QmVsb3cgfHwgKCF0aGlzLmNhblNob3dCZWxvdyAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0xlZnQgfHwgKCF0aGlzLmNhblNob3dMZWZ0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwicmlnaHRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGFib3ZlIHRoZSBub2RlLiAqL1xyXG5cdHNob3dBYm92ZSgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInRvcFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cclxuXHRzaG93QmVsb3coKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJib3R0b21cIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIGxlZnQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd0xlZnQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIHJpZ2h0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dSaWdodCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInJpZ2h0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcclxuICAgICAgICBjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAodGhpcy5ub2RlLm9mZnNldFdpZHRoIC8gMik7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC8gMikpKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlclZlcnRpY2FsbHkoKSB7XHJcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyKSkpO1xyXG5cdH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJta2RpcnBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9kdWxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyaW1yYWZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwieWF1emxcIik7Il0sInNvdXJjZVJvb3QiOiIifQ==